diff --git a/.bra.toml b/.bra.toml index 3a7357ce64a..e9be6c13c66 100644 --- a/.bra.toml +++ b/.bra.toml @@ -13,8 +13,10 @@ watch_dirs = [ "$WORKDIR/conf", ] watch_exts = [".go", ".ini", ".toml", ".template.html"] +ignore_files = ["wire_gen.go"] build_delay = 1500 cmds = [ + ["make", "gen-go"], ["go", "run", "build.go", "-dev", "build-server"], ["./bin/grafana-server", "-packaging=dev", "cfg:app_mode=development"] ] diff --git a/.dockerignore b/.dockerignore index c535fa427b5..7ed8d01615e 100644 --- a/.dockerignore +++ b/.dockerignore @@ -12,7 +12,14 @@ Dockerfile docs dump.rdb node_modules -/local +**/node_modules /tmp *.yml +!.yarnrc.yml *.md +.yarn/* +!.yarn/patches +!.yarn/releases +!.yarn/plugins +!.yarn/versions +!.yarn/cache diff --git a/.drone.star b/.drone.star index 171a65a15b2..a90a3027b23 100644 --- a/.drone.star +++ b/.drone.star @@ -6,7 +6,7 @@ load('scripts/drone/pipelines/pr.star', 'pr_pipelines') load('scripts/drone/pipelines/main.star', 'main_pipelines') -load('scripts/drone/pipelines/release.star', 'release_pipelines', 'test_release_pipelines') +load('scripts/drone/pipelines/release.star', 'release_pipelines', 'test_release_pipelines', 'publish_image_pipelines', 'publish_artifacts_pipelines', 'publish_npm_pipelines', 'publish_packages_pipeline') load('scripts/drone/version.star', 'version_branch_pipelines') load('scripts/drone/pipelines/cron.star', 'cronjobs') load('scripts/drone/vault.star', 'secrets') @@ -14,4 +14,7 @@ load('scripts/drone/vault.star', 'secrets') def main(ctx): edition = 'oss' return pr_pipelines(edition=edition) + main_pipelines(edition=edition) + release_pipelines() + \ + publish_image_pipelines('public') + publish_image_pipelines('security') + \ + publish_artifacts_pipelines('security') + publish_artifacts_pipelines('public') + \ + publish_npm_pipelines('public') + publish_packages_pipeline() + \ test_release_pipelines() + version_branch_pipelines() + cronjobs(edition=edition) + secrets() diff --git a/.drone.yml b/.drone.yml index d026d45679c..50d442ab33c 100644 --- a/.drone.yml +++ b/.drone.yml @@ -1,41 +1,36 @@ --- depends_on: [] kind: pipeline -name: test-pr +name: pr-test node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} - yarn install --immutable - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: initialize +- commands: + - ./bin/grabpl verify-drone + depends_on: + - grabpl + image: byrnedo/alpine-curl:0.1.8 + name: lint-drone - commands: - |- echo -e "unknwon @@ -48,13 +43,13 @@ steps: - rm words_to_ignore.txt depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: codespell - commands: - ./bin/grabpl shellcheck depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: shellcheck - commands: - ./bin/grabpl lint-backend --edition oss @@ -62,31 +57,30 @@ steps: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend - commands: - yarn run prettier:check - yarn run lint + - yarn run i18n:compile - yarn run typecheck - - yarn run check-strict depends_on: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-frontend - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition oss depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend - commands: - ./bin/grabpl integration-tests --edition oss depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration - commands: - yarn run ci:test-frontend @@ -94,35 +88,72 @@ steps: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: test-frontend +trigger: + event: + - pull_request +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: pr-build-e2e +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize - commands: - ./bin/grabpl build-backend --jobs 8 --edition oss --build-id ${DRONE_BUILD_NUMBER} --variants linux-x64,linux-x64-musl,osx64,win64,armv6 --no-pull-enterprise depends_on: - - test-backend + - initialize environment: {} - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-backend - commands: - ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise depends_on: - - test-frontend - image: grafana/build-container:1.4.3 + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 name: build-frontend - commands: - ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps depends_on: - - lint-backend + - initialize environment: null - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-plugins - commands: - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . depends_on: - build-backend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: validate-scuemata - commands: - '# Make sure the git tree is clean.' @@ -135,7 +166,7 @@ steps: - '# It is required that the generated Typescript be in sync with the input CUE files.' - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix + - yarn run eslint . --ext .gen.ts --fix - '# If any filenames are emitted by the below script, run the generator command `grafana-cli cue gen-ts` locally and commit the result.' - ./scripts/clean-git-or-error.sh @@ -143,7 +174,7 @@ steps: - git stash pop depends_on: - validate-scuemata - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: ensure-cuetsified - commands: - . scripts/build/gpg-test-vars.sh && ./bin/grabpl package --jobs 8 --edition oss @@ -153,7 +184,7 @@ steps: - build-backend - build-frontend environment: null - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: package - commands: - ./e2e/start-server @@ -162,17 +193,76 @@ steps: detach: true environment: PORT: 3001 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: end-to-end-tests-server - commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite depends_on: - - end-to-end-tests-server + - package environment: HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure - commands: - yarn storybook:build - ./bin/grabpl verify-storybook @@ -180,11 +270,11 @@ steps: - build-frontend environment: NODE_OPTIONS: --max_old_space_size=4096 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-storybook - commands: - yarn wait-on http://$HOST:$PORT - - yarn run test:accessibility-pr + - pa11y-ci --config .pa11yci-pr.conf.js depends_on: - end-to-end-tests-server environment: @@ -192,14 +282,14 @@ steps: from_secret: grafana_misc_stats_api_key HOST: end-to-end-tests-server PORT: 3001 - failure: ignore - image: buildkite/puppeteer - name: test-a11y-frontend-pr + failure: always + image: hugohaggmark/docker-puppeteer + name: test-a11y-frontend - commands: - ./scripts/ci-reference-docs-lint.sh ci depends_on: - build-frontend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-frontend-docs - commands: - mkdir -p /hugo/content/docs/grafana @@ -214,7 +304,7 @@ steps: - cp dist/*.tar.gz* packaging/docker/ depends_on: - package - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: copy-packages-for-docker - depends_on: - copy-packages-for-docker @@ -225,6 +315,51 @@ steps: dry_run: true edition: oss ubuntu: false +trigger: + event: + - pull_request +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: pr-integration-tests +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - apt-get update - apt-get install -yq postgresql-client @@ -233,13 +368,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -250,54 +384,153 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests trigger: event: - pull_request type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- depends_on: [] kind: pipeline -name: build-main +name: main-test node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} - yarn install --immutable - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - ./bin/grabpl verify-drone + depends_on: + - grabpl + image: byrnedo/alpine-curl:0.1.8 + name: lint-drone +- commands: + - |- + echo -e "unknwon + referer + errorstring + eror + iam + wan" > words_to_ignore.txt + - codespell -I words_to_ignore.txt docs/ + - rm words_to_ignore.txt + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: codespell +- commands: + - ./bin/grabpl shellcheck + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: shellcheck +- commands: + - ./bin/grabpl lint-backend --edition oss + depends_on: + - initialize + environment: + CGO_ENABLED: "1" + image: grafana/build-container:1.4.9 + name: lint-backend +- commands: + - yarn run prettier:check + - yarn run lint + - yarn run i18n:compile + - yarn run typecheck + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: lint-frontend +- commands: + - ./bin/grabpl test-backend --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend +- commands: + - ./bin/grabpl integration-tests --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend-integration +- commands: + - yarn run ci:test-frontend + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: test-frontend +trigger: + branch: main + event: + - push +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: main-build-e2e-publish +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} + - yarn install --immutable + image: grafana/build-container:1.4.9 name: initialize - image: grafana/drone-downstream name: trigger-enterprise-downstream @@ -310,95 +543,37 @@ steps: server: https://drone.grafana.net token: from_secret: drone_token -- commands: - - |- - echo -e "unknwon - referer - errorstring - eror - iam - wan" > words_to_ignore.txt - - codespell -I words_to_ignore.txt docs/ - - rm words_to_ignore.txt - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: codespell -- commands: - - ./bin/grabpl shellcheck - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: shellcheck -- commands: - - ./bin/grabpl lint-backend --edition oss - depends_on: - - initialize - environment: - CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 - name: lint-backend -- commands: - - yarn run prettier:check - - yarn run lint - - yarn run typecheck - - yarn run check-strict - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: lint-frontend -- commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - - ./bin/grabpl test-backend --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend -- commands: - - ./bin/grabpl integration-tests --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend-integration -- commands: - - yarn run ci:test-frontend - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: test-frontend - commands: - ./bin/grabpl build-backend --jobs 8 --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise depends_on: - - test-backend + - initialize environment: {} - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-backend - commands: - ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise depends_on: - - test-frontend - image: grafana/build-container:1.4.3 + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 name: build-frontend - commands: - ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps --sign --signing-admin depends_on: - - lint-backend + - initialize environment: GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-plugins - commands: - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . depends_on: - build-backend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: validate-scuemata - commands: - '# Make sure the git tree is clean.' @@ -411,7 +586,7 @@ steps: - '# It is required that the generated Typescript be in sync with the input CUE files.' - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix + - yarn run eslint . --ext .gen.ts --fix - '# If any filenames are emitted by the below script, run the generator command `grafana-cli cue gen-ts` locally and commit the result.' - ./scripts/clean-git-or-error.sh @@ -419,7 +594,7 @@ steps: - git stash pop depends_on: - validate-scuemata - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: ensure-cuetsified - commands: - ./bin/grabpl package --jobs 8 --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise @@ -439,7 +614,7 @@ steps: from_secret: gpg_pub_key GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: package - commands: - ./e2e/start-server @@ -448,17 +623,76 @@ steps: detach: true environment: PORT: 3001 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: end-to-end-tests-server - commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite depends_on: - - end-to-end-tests-server + - package environment: HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure - commands: - yarn storybook:build - ./bin/grabpl verify-storybook @@ -466,23 +700,28 @@ steps: - build-frontend environment: NODE_OPTIONS: --max_old_space_size=4096 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-storybook - commands: - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json - - gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://grafana-storybook/canary + - gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://$${PRERELEASE_BUCKET}/artifacts/storybook/canary depends_on: - build-storybook - - end-to-end-tests + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite environment: GCP_KEY: from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/grafana-ci-deploy:1.3.1 - name: publish-storybook + name: store-storybook - commands: - yarn wait-on http://$HOST:$PORT - - yarn run test:accessibility --json > pa11y-ci-results.json + - pa11y-ci --config .pa11yci.conf.js --json > pa11y-ci-results.json depends_on: - end-to-end-tests-server environment: @@ -491,7 +730,7 @@ steps: HOST: end-to-end-tests-server PORT: 3001 failure: ignore - image: buildkite/puppeteer + image: hugohaggmark/docker-puppeteer name: test-a11y-frontend - commands: - ./scripts/ci-frontend-metrics.sh | ./bin/grabpl publish-metrics $${GRAFANA_MISC_STATS_API_KEY} @@ -501,20 +740,20 @@ steps: GRAFANA_MISC_STATS_API_KEY: from_secret: grafana_misc_stats_api_key failure: ignore - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: publish-frontend-metrics - commands: - ./scripts/ci-reference-docs-lint.sh ci depends_on: - build-frontend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-frontend-docs - commands: - ls dist/*.tar.gz* - cp dist/*.tar.gz* packaging/docker/ depends_on: - package - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: copy-packages-for-docker - depends_on: - copy-packages-for-docker @@ -540,6 +779,95 @@ steps: ubuntu: true username: from_secret: docker_user +- commands: + - ./scripts/circle-release-canary-packages.sh + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + NPM_TOKEN: + from_secret: npm_token + image: grafana/build-container:1.4.9 + name: release-canary-npm-packages +- commands: + - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +- commands: + - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" + depends_on: + - end-to-end-tests-server + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets +trigger: + branch: main + event: + - push +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +depends_on: [] +kind: pipeline +name: main-integration-tests +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - apt-get update - apt-get install -yq postgresql-client @@ -548,13 +876,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -565,50 +892,32 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests -- commands: - - ./scripts/circle-release-canary-packages.sh - depends_on: - - end-to-end-tests - environment: - GITHUB_PACKAGE_TOKEN: - from_secret: github_package_token - image: grafana/build-container:1.4.3 - name: release-canary-npm-packages -- commands: - - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages -- commands: - - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets trigger: branch: main event: - push type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- depends_on: -- build-main +- main-test +- main-build-e2e-publish +- main-integration-tests kind: pipeline name: windows-main platform: @@ -623,7 +932,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe image: grafana/ci-wix:0.1.1 name: initialize @@ -635,7 +944,8 @@ steps: - gcloud auth activate-service-account --key-file=gcpkey.json - rm gcpkey.json - cp C:\App\nssm-2.24.zip . - - .\grabpl.exe windows-installer --edition oss --build-id $$env:DRONE_BUILD_NUMBER + - .\grabpl.exe windows-installer --edition oss --packages-bucket grafana-downloads + --build-id $$env:DRONE_BUILD_NUMBER - $$fname = ((Get-Childitem grafana*.msi -name) -split "`n")[0] - gsutil cp $$fname gs://grafana-downloads/oss/main/ - gsutil cp "$$fname.sha256" gs://grafana-downloads/oss/main/ @@ -644,6 +954,10 @@ steps: environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: @@ -651,9 +965,43 @@ trigger: event: - push type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: notify-drone-changes +platform: + arch: amd64 + os: linux +steps: +- image: plugins/slack + name: slack + settings: + channel: slack-webhooks-test + template: "`.drone.yml` and `starlark` files have been changed on the OSS repo, + by: {{build.author}}. \nBranch: \nCommit hash: " + webhook: + from_secret: drone-changes-webhook +trigger: + branch: main + event: + - push + paths: + exclude: + - exclude + include: + - .drone.yml +type: docker --- depends_on: -- build-main +- main-test +- main-build-e2e-publish +- main-integration-tests - windows-main kind: pipeline name: publish-main @@ -664,24 +1012,26 @@ platform: os: linux services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: initialize - commands: - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - - ./bin/grabpl publish-packages --edition oss --gcp-key /tmp/gcpkey.json --build-id + - ./bin/grabpl store-packages --edition oss --gcp-key /tmp/gcpkey.json --build-id ${DRONE_BUILD_NUMBER} depends_on: - - initialize + - grabpl environment: GCP_KEY: from_secret: gcp_key @@ -694,15 +1044,21 @@ steps: GRAFANA_COM_API_KEY: from_secret: grafana_api_key image: grafana/grafana-ci-deploy:1.3.1 - name: publish-packages-oss + name: store-packages-oss trigger: branch: main event: - push type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- depends_on: -- build-main +- main-test +- main-build-e2e-publish +- main-integration-tests - windows-main - publish-main kind: pipeline @@ -731,133 +1087,64 @@ type: docker --- depends_on: [] kind: pipeline -name: oss-build-release +name: oss-build-publish-e2e-release node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl verify-version ${DRONE_TAG} - ./bin/grabpl gen-version ${DRONE_TAG} - yarn install --immutable - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: initialize -- commands: - - |- - echo -e "unknwon - referer - errorstring - eror - iam - wan" > words_to_ignore.txt - - codespell -I words_to_ignore.txt docs/ - - rm words_to_ignore.txt - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: codespell -- commands: - - ./bin/grabpl shellcheck - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: shellcheck -- commands: - - ./bin/grabpl lint-backend --edition oss - depends_on: - - initialize - environment: - CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 - name: lint-backend -- commands: - - yarn run prettier:check - - yarn run lint - - yarn run typecheck - - yarn run check-strict - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: lint-frontend -- commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - - ./bin/grabpl test-backend --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend -- commands: - - ./bin/grabpl integration-tests --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend-integration -- commands: - - yarn run ci:test-frontend - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: test-frontend - commands: - ./bin/grabpl build-backend --jobs 8 --edition oss --github-token $${GITHUB_TOKEN} --no-pull-enterprise ${DRONE_TAG} depends_on: - - test-backend + - initialize environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-backend - commands: - ./bin/grabpl build-frontend --jobs 8 --github-token $${GITHUB_TOKEN} --no-install-deps --edition oss --no-pull-enterprise ${DRONE_TAG} depends_on: - - test-frontend - image: grafana/build-container:1.4.3 + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 name: build-frontend - commands: - ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps --sign --signing-admin depends_on: - - lint-backend + - initialize environment: GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-plugins - commands: - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . depends_on: - build-backend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: validate-scuemata - commands: - '# Make sure the git tree is clean.' @@ -870,7 +1157,7 @@ steps: - '# It is required that the generated Typescript be in sync with the input CUE files.' - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix + - yarn run eslint . --ext .gen.ts --fix - '# If any filenames are emitted by the below script, run the generator command `grafana-cli cue gen-ts` locally and commit the result.' - ./scripts/clean-git-or-error.sh @@ -878,7 +1165,7 @@ steps: - git stash pop depends_on: - validate-scuemata - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: ensure-cuetsified - commands: - ./bin/grabpl package --jobs 8 --edition oss --github-token $${GITHUB_TOKEN} --no-pull-enterprise @@ -898,8 +1185,43 @@ steps: from_secret: gpg_pub_key GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: package +- commands: + - ls dist/*.tar.gz* + - cp dist/*.tar.gz* packaging/docker/ + depends_on: + - package + image: grafana/build-container:1.4.9 + name: copy-packages-for-docker +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition oss --shouldSave + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition oss --shouldSave --ubuntu + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images-ubuntu + volumes: + - name: docker + path: /var/run/docker.sock - commands: - ./e2e/start-server depends_on: @@ -907,48 +1229,314 @@ steps: detach: true environment: PORT: 3001 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: end-to-end-tests-server - commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 --tries 3 + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure +- commands: + - yarn storybook:build + - ./bin/grabpl verify-storybook + depends_on: + - build-frontend + environment: + NODE_OPTIONS: --max_old_space_size=4096 + image: grafana/build-container:1.4.9 + name: build-storybook +- commands: + - ./bin/grabpl upload-cdn --edition oss --bucket "$${PRERELEASE_BUCKET}/artifacts/static-assets" depends_on: - end-to-end-tests-server environment: - HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets - commands: - - ls dist/*.tar.gz* - - cp dist/*.tar.gz* packaging/docker/ + - ./bin/grabpl upload-packages --edition oss --packages-bucket $${PRERELEASE_BUCKET}/artifacts/downloads/${DRONE_TAG} depends_on: - - package - image: grafana/build-container:1.4.3 - name: copy-packages-for-docker -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images - settings: - dry_run: false - edition: oss - password: - from_secret: docker_password - ubuntu: false - username: - from_secret: docker_user -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images-ubuntu - settings: - dry_run: false - edition: oss - password: - from_secret: docker_password - ubuntu: true - username: - from_secret: docker_user + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://$${PRERELEASE_BUCKET}/artifacts/storybook/latest + - gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://$${PRERELEASE_BUCKET}/artifacts/storybook/${DRONE_TAG} + depends_on: + - build-storybook + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + GCP_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: store-storybook +- commands: + - ./scripts/build/build-npm-packages.sh ${DRONE_TAG} + depends_on: + - store-storybook + image: grafana/build-container:1.4.9 + name: build-npm-packages +- commands: + - ./bin/grabpl artifacts npm store --tag ${DRONE_TAG} + depends_on: + - build-npm-packages + environment: + GCP_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: store-npm-packages +trigger: + event: + exclude: + - promote + ref: + - refs/tags/v* + repo: + exclude: + - grafana/grafana +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +depends_on: [] +kind: pipeline +name: oss-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl verify-version ${DRONE_TAG} + - ./bin/grabpl gen-version ${DRONE_TAG} + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - |- + echo -e "unknwon + referer + errorstring + eror + iam + wan" > words_to_ignore.txt + - codespell -I words_to_ignore.txt docs/ + - rm words_to_ignore.txt + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: codespell +- commands: + - ./bin/grabpl shellcheck + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: shellcheck +- commands: + - ./bin/grabpl lint-backend --edition oss + depends_on: + - initialize + environment: + CGO_ENABLED: "1" + image: grafana/build-container:1.4.9 + name: lint-backend +- commands: + - yarn run prettier:check + - yarn run lint + - yarn run i18n:compile + - yarn run typecheck + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: lint-frontend +- commands: + - ./bin/grabpl test-backend --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend +- commands: + - ./bin/grabpl integration-tests --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend-integration +- commands: + - yarn run ci:test-frontend + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: test-frontend +trigger: + event: + exclude: + - promote + ref: + - refs/tags/v* + repo: + exclude: + - grafana/grafana +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: oss-integration-tests-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl verify-version ${DRONE_TAG} + - ./bin/grabpl gen-version ${DRONE_TAG} + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize - commands: - apt-get update - apt-get install -yq postgresql-client @@ -957,13 +1545,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -974,73 +1561,37 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests -- commands: - - yarn storybook:build - - ./bin/grabpl verify-storybook - depends_on: - - build-frontend - environment: - NODE_OPTIONS: --max_old_space_size=4096 - image: grafana/build-container:1.4.3 - name: build-storybook -- commands: - - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets -- commands: - - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages -- commands: - - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json - - gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://grafana-storybook/latest - - gsutil -m rsync -d -r ./packages/grafana-ui/dist/storybook gs://grafana-storybook/${DRONE_TAG} - depends_on: - - build-storybook - - end-to-end-tests - environment: - GCP_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: publish-storybook -- commands: - - ./scripts/build/release-packages.sh ${DRONE_TAG} - depends_on: - - publish-storybook - environment: - GITHUB_PACKAGE_TOKEN: - from_secret: github_package_token - NPM_TOKEN: - from_secret: npm_token - image: grafana/build-container:1.4.3 - name: release-npm-packages trigger: + event: + exclude: + - promote ref: - refs/tags/v* + repo: + exclude: + - grafana/grafana type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- depends_on: -- oss-build-release +- oss-build-publish-e2e-release +- oss-test-release +- oss-integration-tests-release kind: pipeline name: oss-windows-release platform: @@ -1055,7 +1606,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe image: grafana/ci-wix:0.1.1 name: initialize @@ -1069,19 +1620,33 @@ steps: - cp C:\App\nssm-2.24.zip . - .\grabpl.exe windows-installer --edition oss ${DRONE_TAG} - $$fname = ((Get-Childitem grafana*.msi -name) -split "`n")[0] - - gsutil cp $$fname gs://grafana-downloads/oss/release/ - - gsutil cp "$$fname.sha256" gs://grafana-downloads/oss/release/ + - gsutil cp $$fname gs://%PRERELEASE_BUCKET%/artifacts/downloads/oss/release/ + - gsutil cp "$$fname.sha256" gs://%PRERELEASE_BUCKET%/artifacts/downloads/oss/release/ depends_on: - initialize environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: + event: + exclude: + - promote ref: - refs/tags/v* + repo: + exclude: + - grafana/grafana type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- clone: disable: true @@ -1089,65 +1654,392 @@ depends_on: [] image_pull_secrets: - dockerconfigjson kind: pipeline -name: enterprise-build-release +name: enterprise-build-e2e-publish-release node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql -- environment: {} - image: redis:6.2.1-alpine - name: redis -- environment: {} - image: memcached:1.6.9-alpine - name: memcached +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" - cd grafana-enterprise - git checkout ${DRONE_TAG} environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 - name: clone + image: grafana/build-container:1.4.9 + name: clone-enterprise - commands: - mv bin/grabpl /tmp/ - rmdir bin - mv grafana-enterprise /tmp/ - - /tmp/grabpl init-enterprise /tmp/grafana-enterprise ${DRONE_TAG} + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + ${DRONE_TAG} - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json - mkdir bin - mv /tmp/grabpl bin/ - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl verify-version ${DRONE_TAG} - ./bin/grabpl gen-version ${DRONE_TAG} - yarn install --immutable depends_on: - - clone - image: grafana/build-container:1.4.3 + - clone-enterprise + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - ./bin/grabpl build-backend --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} + --no-pull-enterprise ${DRONE_TAG} + depends_on: + - initialize + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: build-backend +- commands: + - ./bin/grabpl build-frontend --jobs 8 --github-token $${GITHUB_TOKEN} --no-install-deps + --edition enterprise --no-pull-enterprise ${DRONE_TAG} + depends_on: + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 + name: build-frontend +- commands: + - ./bin/grabpl build-plugins --jobs 8 --edition enterprise --no-install-deps --sign + --signing-admin + depends_on: + - initialize + environment: + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: build-plugins +- commands: + - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . + depends_on: + - build-backend + image: grafana/build-container:1.4.9 + name: validate-scuemata +- commands: + - '# Make sure the git tree is clean.' + - '# Stashing changes, since packages that were produced in build-backend step are + needed.' + - git stash + - ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . + - '# The above command generates Typescript files (*.gen.ts) from all appropriate + .cue files.' + - '# It is required that the generated Typescript be in sync with the input CUE + files.' + - '# ...Modulo eslint auto-fixes...:' + - yarn run eslint . --ext .gen.ts --fix + - '# If any filenames are emitted by the below script, run the generator command + `grafana-cli cue gen-ts` locally and commit the result.' + - ./scripts/clean-git-or-error.sh + - '# Un-stash changes.' + - git stash pop + depends_on: + - validate-scuemata + image: grafana/build-container:1.4.9 + name: ensure-cuetsified +- commands: + - ./bin/grabpl build-backend --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} + --no-pull-enterprise ${DRONE_TAG} + depends_on: + - initialize + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: build-backend-enterprise2 +- commands: + - ./bin/grabpl package --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} + --no-pull-enterprise --sign ${DRONE_TAG} + depends_on: + - build-plugins + - build-backend + - build-frontend + - build-backend-enterprise2 + environment: + GITHUB_TOKEN: + from_secret: github_token + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: package +- commands: + - ls dist/*.tar.gz* + - cp dist/*.tar.gz* packaging/docker/ + depends_on: + - package + image: grafana/build-container:1.4.9 + name: copy-packages-for-docker +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition enterprise --shouldSave + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition enterprise --shouldSave --ubuntu + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images-ubuntu + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./e2e/start-server + depends_on: + - package + detach: true + environment: + PACKAGE_FILE: dist/grafana-enterprise-*linux-amd64.tar.gz + PORT: 3001 + RUNDIR: e2e/tmp-grafana-enterprise + image: grafana/build-container:1.4.9 + name: end-to-end-tests-server +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure +- commands: + - ./bin/grabpl upload-cdn --edition enterprise --bucket "$${PRERELEASE_BUCKET}/artifacts/static-assets" + depends_on: + - package + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets +- commands: + - ./bin/grabpl upload-packages --edition enterprise --packages-bucket $${PRERELEASE_BUCKET}/artifacts/downloads/${DRONE_TAG} + depends_on: + - package + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +- commands: + - ./bin/grabpl package --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} + --no-pull-enterprise --sign ${DRONE_TAG} + depends_on: + - build-plugins + - build-backend + - build-frontend + - build-backend-enterprise2 + environment: + GITHUB_TOKEN: + from_secret: github_token + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: package-enterprise2 +- commands: + - ./bin/grabpl upload-cdn --edition enterprise2 --bucket "$${PRERELEASE_BUCKET}/artifacts/static-assets" + depends_on: + - package-enterprise2 + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets-enterprise2 +- commands: + - ./bin/grabpl upload-packages --edition enterprise2 --packages-bucket $${PRERELEASE_BUCKET}/artifacts/downloads-enterprise2/${DRONE_TAG} + depends_on: + - package-enterprise2 + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages-enterprise2 +trigger: + event: + exclude: + - promote + ref: + - refs/tags/v* + repo: + exclude: + - grafana/grafana +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +clone: + disable: true +depends_on: [] +image_pull_secrets: +- dockerconfigjson +kind: pipeline +name: enterprise-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" + - cd grafana-enterprise + - git checkout ${DRONE_TAG} + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: clone-enterprise +- commands: + - mv bin/grabpl /tmp/ + - rmdir bin + - mv grafana-enterprise /tmp/ + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + ${DRONE_TAG} + - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json + - mkdir bin + - mv /tmp/grabpl bin/ + - make gen-go + - ./bin/grabpl verify-version ${DRONE_TAG} + - ./bin/grabpl gen-version ${DRONE_TAG} + - yarn install --immutable + depends_on: + - clone-enterprise + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 name: initialize - commands: - |- @@ -1161,13 +2053,13 @@ steps: - rm words_to_ignore.txt depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: codespell - commands: - ./bin/grabpl shellcheck depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: shellcheck - commands: - ./bin/grabpl lint-backend --edition enterprise @@ -1175,31 +2067,30 @@ steps: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend - commands: - yarn run prettier:check - yarn run lint + - yarn run i18n:compile - yarn run typecheck - - yarn run check-strict depends_on: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-frontend - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition enterprise depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend - commands: - ./bin/grabpl integration-tests --edition enterprise depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration - commands: - yarn run ci:test-frontend @@ -1207,166 +2098,122 @@ steps: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: test-frontend -- commands: - - ./bin/grabpl build-backend --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} - --no-pull-enterprise ${DRONE_TAG} - depends_on: - - test-backend - environment: - GITHUB_TOKEN: - from_secret: github_token - image: grafana/build-container:1.4.3 - name: build-backend -- commands: - - ./bin/grabpl build-frontend --jobs 8 --github-token $${GITHUB_TOKEN} --no-install-deps - --edition enterprise --no-pull-enterprise ${DRONE_TAG} - depends_on: - - test-frontend - image: grafana/build-container:1.4.3 - name: build-frontend -- commands: - - ./bin/grabpl build-plugins --jobs 8 --edition enterprise --no-install-deps --sign - --signing-admin - depends_on: - - lint-backend - environment: - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: build-plugins -- commands: - - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . - depends_on: - - build-backend - image: grafana/build-container:1.4.3 - name: validate-scuemata -- commands: - - '# Make sure the git tree is clean.' - - '# Stashing changes, since packages that were produced in build-backend step are - needed.' - - git stash - - ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . - - '# The above command generates Typescript files (*.gen.ts) from all appropriate - .cue files.' - - '# It is required that the generated Typescript be in sync with the input CUE - files.' - - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix - - '# If any filenames are emitted by the below script, run the generator command - `grafana-cli cue gen-ts` locally and commit the result.' - - ./scripts/clean-git-or-error.sh - - '# Un-stash changes.' - - git stash pop - depends_on: - - validate-scuemata - image: grafana/build-container:1.4.3 - name: ensure-cuetsified - commands: - ./bin/grabpl lint-backend --edition enterprise2 depends_on: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend-enterprise2 - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition enterprise2 depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-enterprise2 - commands: - ./bin/grabpl integration-tests --edition enterprise2 depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration-enterprise2 +trigger: + event: + exclude: + - promote + ref: + - refs/tags/v* + repo: + exclude: + - grafana/grafana +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +clone: + disable: true +depends_on: [] +image_pull_secrets: +- dockerconfigjson +kind: pipeline +name: enterprise-integration-tests-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +- environment: {} + image: redis:6.2.1-alpine + name: redis +- environment: {} + image: memcached:1.6.9-alpine + name: memcached +steps: - commands: - - ./bin/grabpl build-backend --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} - --no-pull-enterprise ${DRONE_TAG} - depends_on: - - test-backend-enterprise2 + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" + - cd grafana-enterprise + - git checkout ${DRONE_TAG} environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 - name: build-backend-enterprise2 + image: grafana/build-container:1.4.9 + name: clone-enterprise - commands: - - ./bin/grabpl package --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} - --no-pull-enterprise --sign ${DRONE_TAG} + - mv bin/grabpl /tmp/ + - rmdir bin + - mv grafana-enterprise /tmp/ + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + ${DRONE_TAG} + - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json + - mkdir bin + - mv /tmp/grabpl bin/ + - make gen-go + - ./bin/grabpl verify-version ${DRONE_TAG} + - ./bin/grabpl gen-version ${DRONE_TAG} + - yarn install --immutable depends_on: - - build-plugins - - build-backend - - build-frontend - - build-backend-enterprise2 - - test-backend-enterprise2 + - clone-enterprise environment: GITHUB_TOKEN: from_secret: github_token - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: package -- commands: - - ./e2e/start-server - depends_on: - - package - detach: true - environment: - PACKAGE_FILE: dist/grafana-enterprise-*linux-amd64.tar.gz - PORT: 3001 - RUNDIR: e2e/tmp-grafana-enterprise - image: grafana/build-container:1.4.3 - name: end-to-end-tests-server -- commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 --tries 3 - depends_on: - - end-to-end-tests-server - environment: - HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests -- commands: - - ls dist/*.tar.gz* - - cp dist/*.tar.gz* packaging/docker/ - depends_on: - - package - image: grafana/build-container:1.4.3 - name: copy-packages-for-docker -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images - settings: - dry_run: false - edition: enterprise - password: - from_secret: docker_password - ubuntu: false - username: - from_secret: docker_user -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images-ubuntu - settings: - dry_run: false - edition: enterprise - password: - from_secret: docker_password - ubuntu: true - username: - from_secret: docker_user + image: grafana/build-container:1.4.9 + name: initialize - commands: - apt-get update - apt-get install -yq postgresql-client @@ -1375,13 +2222,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - initialize environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -1392,128 +2238,57 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - initialize environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests - commands: - dockerize -wait tcp://redis:6379/0 -timeout 120s - ./bin/grabpl integration-tests depends_on: - - test-backend - - test-frontend + - initialize environment: REDIS_URL: redis://redis:6379/0 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: redis-integration-tests - commands: - dockerize -wait tcp://memcached:11211 -timeout 120s - ./bin/grabpl integration-tests depends_on: - - test-backend - - test-frontend + - initialize environment: MEMCACHED_HOSTS: memcached:11211 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: memcached-integration-tests -- commands: - - ./bin/grabpl upload-cdn --edition enterprise --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets -- commands: - - ./bin/grabpl upload-packages --edition enterprise --packages-bucket grafana-downloads - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - - redis-integration-tests - - memcached-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages -- commands: - - ./bin/grabpl package --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} - --no-pull-enterprise --sign ${DRONE_TAG} - depends_on: - - build-plugins - - build-backend - - build-frontend - - build-backend-enterprise2 - - test-backend-enterprise2 - environment: - GITHUB_TOKEN: - from_secret: github_token - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: package-enterprise2 -- commands: - - ./e2e/start-server - depends_on: - - package-enterprise2 - detach: true - environment: - PACKAGE_FILE: dist/grafana-enterprise2-*linux-amd64.tar.gz - PORT: 3002 - RUNDIR: e2e/tmp-grafana-enterprise2 - image: grafana/build-container:1.4.3 - name: end-to-end-tests-server-enterprise2 -- commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3002 --tries 3 - depends_on: - - end-to-end-tests-server-enterprise2 - environment: - HOST: end-to-end-tests-server-enterprise2 - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests-enterprise2 -- commands: - - ./bin/grabpl upload-cdn --edition enterprise2 --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server-enterprise2 - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets-enterprise2 -- commands: - - ./bin/grabpl upload-packages --edition enterprise2 --packages-bucket grafana-downloads-enterprise2 - depends_on: - - end-to-end-tests-enterprise2 - - mysql-integration-tests - - postgres-integration-tests - - redis-integration-tests - - memcached-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages-enterprise2 trigger: + event: + exclude: + - promote ref: - refs/tags/v* + repo: + exclude: + - grafana/grafana type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- clone: disable: true depends_on: -- enterprise-build-release +- enterprise-build-e2e-publish-release +- enterprise-test-release +- enterprise-integration-tests-release image_pull_secrets: - dockerconfigjson kind: pipeline @@ -1530,7 +2305,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe - git clone "https://$$env:GITHUB_TOKEN@github.com/grafana/grafana-enterprise.git" - cd grafana-enterprise @@ -1545,10 +2320,13 @@ steps: - rm -r -force grafana-enterprise - cp grabpl.exe C:\App\grabpl.exe - rm -force grabpl.exe - - C:\App\grabpl.exe init-enterprise C:\App\grafana-enterprise + - C:\App\grabpl.exe init-enterprise --github-token $$env:GITHUB_TOKEN C:\App\grafana-enterprise - cp C:\App\grabpl.exe grabpl.exe depends_on: - clone + environment: + GITHUB_TOKEN: + from_secret: github_token image: grafana/ci-wix:0.1.1 name: initialize - commands: @@ -1561,27 +2339,388 @@ steps: - cp C:\App\nssm-2.24.zip . - .\grabpl.exe windows-installer --edition enterprise ${DRONE_TAG} - $$fname = ((Get-Childitem grafana*.msi -name) -split "`n")[0] - - gsutil cp $$fname gs://grafana-downloads/enterprise/release/ - - gsutil cp "$$fname.sha256" gs://grafana-downloads/enterprise/release/ + - gsutil cp $$fname gs://%PRERELEASE_BUCKET%/artifacts/downloads/enterprise/release/ + - gsutil cp "$$fname.sha256" gs://%PRERELEASE_BUCKET%/artifacts/downloads/enterprise/release/ depends_on: - initialize environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: + event: + exclude: + - promote ref: - refs/tags/v* + repo: + exclude: + - grafana/grafana type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- -depends_on: -- oss-build-release -- oss-windows-release -- enterprise-build-release -- enterprise-windows-release +depends_on: [] kind: pipeline -name: publish-release +name: publish-docker-oss-public +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - ./bin/grabpl artifacts docker fetch --version-tag ${TAG} --edition oss --base + alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - grabpl + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: fetch-images-oss + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./bin/grabpl artifacts docker publish --version-tag ${TAG} --dockerhub-repo grafana + --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - fetch-images-oss + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: publish-images-grafana + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./bin/grabpl artifacts docker publish --version-tag ${TAG} --dockerhub-repo grafana-oss + --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - fetch-images-oss + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: publish-images-grafana-oss + volumes: + - name: docker + path: /var/run/docker.sock +trigger: + event: + - promote + target: + - public +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: publish-docker-enterprise-public +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - ./bin/grabpl artifacts docker fetch --version-tag ${TAG} --edition enterprise + --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - grabpl + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: fetch-images-enterprise + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./bin/grabpl artifacts docker publish --version-tag ${TAG} --dockerhub-repo grafana-enterprise + --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - fetch-images-enterprise + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: publish-images-grafana-enterprise + volumes: + - name: docker + path: /var/run/docker.sock +trigger: + event: + - promote + target: + - public +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: publish-docker-oss-security +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - ./bin/grabpl artifacts docker fetch --version-tag ${TAG} --edition oss --base + alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - grabpl + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: fetch-images-oss + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./bin/grabpl artifacts docker publish --security --version-tag ${TAG} --dockerhub-repo + grafana --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - fetch-images-oss + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: publish-images-grafana + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./bin/grabpl artifacts docker publish --security --version-tag ${TAG} --dockerhub-repo + grafana-oss --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - fetch-images-oss + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: publish-images-grafana-oss + volumes: + - name: docker + path: /var/run/docker.sock +trigger: + event: + - promote + target: + - security +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: publish-docker-enterprise-security +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - ./bin/grabpl artifacts docker fetch --version-tag ${TAG} --edition enterprise + --base alpine --base ubuntu --arch amd64 --arch arm64 --arch armv7 + depends_on: + - grabpl + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: fetch-images-enterprise + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./bin/grabpl artifacts docker publish --security --version-tag ${TAG} --dockerhub-repo + grafana-enterprise --base alpine --base ubuntu --arch amd64 --arch arm64 --arch + armv7 + depends_on: + - fetch-images-enterprise + environment: + DOCKER_PASSWORD: + from_secret: docker_password + DOCKER_USER: + from_secret: docker_username + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: publish-images-grafana-enterprise + volumes: + - name: docker + path: /var/run/docker.sock +trigger: + event: + - promote + target: + - security +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: publish-artifacts-security +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - ./bin/grabpl artifacts publish --security --tag ${TAG} --src-bucket grafana-prerelease + depends_on: + - grabpl + environment: + GCP_KEY: + from_secret: gcp_key + image: grafana/grafana-ci-deploy:1.3.1 + name: publish-artifacts +trigger: + event: + - promote + target: + - security +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: publish-artifacts-public +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - ./bin/grabpl artifacts publish --tag ${TAG} --src-bucket grafana-prerelease + depends_on: + - grabpl + environment: + GCP_KEY: + from_secret: gcp_key + image: grafana/grafana-ci-deploy:1.3.1 + name: publish-artifacts +trigger: + event: + - promote + target: + - public +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: publish-npm-packages-public node: type: no-parallel platform: @@ -1591,217 +2730,175 @@ services: [] steps: - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl verify-version ${DRONE_TAG} - image: grafana/build-container:1.4.3 + - ./bin/grabpl gen-version ${DRONE_TAG} + - yarn install --immutable + image: grafana/build-container:1.4.9 name: initialize - commands: - - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - - ./bin/grabpl publish-packages --edition oss --gcp-key /tmp/gcpkey.json ${DRONE_TAG} - depends_on: - - initialize - environment: - GCP_KEY: - from_secret: gcp_key - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_COM_API_KEY: - from_secret: grafana_api_key - image: grafana/grafana-ci-deploy:1.3.1 - name: publish-packages-oss + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - - ./bin/grabpl publish-packages --edition enterprise --gcp-key /tmp/gcpkey.json - ${DRONE_TAG} + - ./bin/grabpl artifacts npm retrieve --tag v${TAG} depends_on: - initialize environment: GCP_KEY: from_secret: gcp_key - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_COM_API_KEY: - from_secret: grafana_api_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/grafana-ci-deploy:1.3.1 - name: publish-packages-enterprise + name: retrieve-npm-packages +- commands: + - ./bin/grabpl artifacts npm release --tag v${TAG} + depends_on: + - retrieve-npm-packages + environment: + NPM_TOKEN: + from_secret: npm_token + image: grafana/build-container:1.4.9 + name: release-npm-packages trigger: - ref: - - refs/tags/v* -type: docker ---- -depends_on: -- oss-build-release -- oss-windows-release -- enterprise-build-release -- enterprise-windows-release -- publish-release -kind: pipeline -name: notify-release -platform: - arch: amd64 - os: linux -steps: -- image: plugins/slack - name: slack - settings: - channel: grafana-ci-notifications - template: |- - Build {{build.number}} failed for commit: : {{build.link}} - Branch: - Author: {{build.author}} - webhook: - from_secret: slack_webhook -trigger: - ref: - - refs/tags/v* - status: - - failure + event: + - promote + target: + - public type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- depends_on: [] kind: pipeline -name: oss-build-test-release +name: publish-packages node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql +services: [] steps: - commands: - - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 - name: identify-runner + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - ./bin/grabpl store-packages --edition oss --gcp-key /tmp/gcpkey.json ${DRONE_TAG} + depends_on: + - grabpl + environment: + GCP_KEY: + from_secret: gcp_key + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_COM_API_KEY: + from_secret: grafana_api_key + image: grafana/grafana-ci-deploy:1.3.1 + name: store-packages-oss +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - ./bin/grabpl store-packages --edition enterprise --gcp-key /tmp/gcpkey.json ${DRONE_TAG} + depends_on: + - grabpl + environment: + GCP_KEY: + from_secret: gcp_key + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_COM_API_KEY: + from_secret: grafana_api_key + image: grafana/grafana-ci-deploy:1.3.1 + name: store-packages-enterprise +trigger: + event: + - promote + target: + - public +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: oss-build-publish-e2e-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: - commands: - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl - chmod +x bin/grabpl - - ./bin/grabpl verify-drone + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: - make gen-go - ./bin/grabpl verify-version v7.3.0-test - ./bin/grabpl gen-version v7.3.0-test - yarn install --immutable - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: initialize -- commands: - - |- - echo -e "unknwon - referer - errorstring - eror - iam - wan" > words_to_ignore.txt - - codespell -I words_to_ignore.txt docs/ - - rm words_to_ignore.txt - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: codespell -- commands: - - ./bin/grabpl shellcheck - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: shellcheck -- commands: - - ./bin/grabpl lint-backend --edition oss - depends_on: - - initialize - environment: - CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 - name: lint-backend -- commands: - - yarn run prettier:check - - yarn run lint - - yarn run typecheck - - yarn run check-strict - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: lint-frontend -- commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - - ./bin/grabpl test-backend --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend -- commands: - - ./bin/grabpl integration-tests --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend-integration -- commands: - - yarn run ci:test-frontend - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: test-frontend - commands: - ./bin/grabpl build-backend --jobs 8 --edition oss --github-token $${GITHUB_TOKEN} --no-pull-enterprise v7.3.0-test depends_on: - - test-backend + - initialize environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-backend - commands: - ./bin/grabpl build-frontend --jobs 8 --github-token $${GITHUB_TOKEN} --no-install-deps --edition oss --no-pull-enterprise v7.3.0-test depends_on: - - test-frontend - image: grafana/build-container:1.4.3 + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 name: build-frontend - commands: - ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps --sign --signing-admin depends_on: - - lint-backend + - initialize environment: GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-plugins - commands: - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . depends_on: - build-backend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: validate-scuemata - commands: - '# Make sure the git tree is clean.' @@ -1814,7 +2911,7 @@ steps: - '# It is required that the generated Typescript be in sync with the input CUE files.' - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix + - yarn run eslint . --ext .gen.ts --fix - '# If any filenames are emitted by the below script, run the generator command `grafana-cli cue gen-ts` locally and commit the result.' - ./scripts/clean-git-or-error.sh @@ -1822,7 +2919,7 @@ steps: - git stash pop depends_on: - validate-scuemata - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: ensure-cuetsified - commands: - ./bin/grabpl package --jobs 8 --edition oss --github-token $${GITHUB_TOKEN} --no-pull-enterprise @@ -1842,8 +2939,43 @@ steps: from_secret: gpg_pub_key GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: package +- commands: + - ls dist/*.tar.gz* + - cp dist/*.tar.gz* packaging/docker/ + depends_on: + - package + image: grafana/build-container:1.4.9 + name: copy-packages-for-docker +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition oss --shouldSave + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition oss --shouldSave --ubuntu + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images-ubuntu + volumes: + - name: docker + path: /var/run/docker.sock - commands: - ./e2e/start-server depends_on: @@ -1851,40 +2983,282 @@ steps: detach: true environment: PORT: 3001 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: end-to-end-tests-server - commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 --tries 3 + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure +- commands: + - yarn storybook:build + - ./bin/grabpl verify-storybook + depends_on: + - build-frontend + environment: + NODE_OPTIONS: --max_old_space_size=4096 + image: grafana/build-container:1.4.9 + name: build-storybook +- commands: + - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" depends_on: - end-to-end-tests-server environment: - HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets - commands: - - ls dist/*.tar.gz* - - cp dist/*.tar.gz* packaging/docker/ + - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads-test depends_on: - - package - image: grafana/build-container:1.4.3 - name: copy-packages-for-docker -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images - settings: - dry_run: true - edition: oss - ubuntu: false -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images-ubuntu - settings: - dry_run: true - edition: oss - ubuntu: true + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +- commands: + - echo Testing release + depends_on: + - build-storybook + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + GCP_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: store-storybook +trigger: + event: + - custom +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +depends_on: [] +kind: pipeline +name: oss-test-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl verify-version v7.3.0-test + - ./bin/grabpl gen-version v7.3.0-test + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - |- + echo -e "unknwon + referer + errorstring + eror + iam + wan" > words_to_ignore.txt + - codespell -I words_to_ignore.txt docs/ + - rm words_to_ignore.txt + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: codespell +- commands: + - ./bin/grabpl shellcheck + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: shellcheck +- commands: + - ./bin/grabpl lint-backend --edition oss + depends_on: + - initialize + environment: + CGO_ENABLED: "1" + image: grafana/build-container:1.4.9 + name: lint-backend +- commands: + - yarn run prettier:check + - yarn run lint + - yarn run i18n:compile + - yarn run typecheck + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: lint-frontend +- commands: + - ./bin/grabpl test-backend --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend +- commands: + - ./bin/grabpl integration-tests --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend-integration +- commands: + - yarn run ci:test-frontend + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: test-frontend +trigger: + event: + - custom +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: oss-integration-tests-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl verify-version v7.3.0-test + - ./bin/grabpl gen-version v7.3.0-test + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize - commands: - apt-get update - apt-get install -yq postgresql-client @@ -1893,13 +3267,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -1910,69 +3283,31 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests -- commands: - - yarn storybook:build - - ./bin/grabpl verify-storybook - depends_on: - - build-frontend - environment: - NODE_OPTIONS: --max_old_space_size=4096 - image: grafana/build-container:1.4.3 - name: build-storybook -- commands: - - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets -- commands: - - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads-test - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages -- commands: - - echo Testing release - depends_on: - - build-storybook - - end-to-end-tests - environment: - GCP_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: publish-storybook -- commands: [] - depends_on: - - publish-storybook - environment: - GITHUB_PACKAGE_TOKEN: - from_secret: github_package_token - NPM_TOKEN: - from_secret: npm_token - image: grafana/build-container:1.4.3 - name: release-npm-packages trigger: event: - custom type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- depends_on: -- oss-build-test-release +- oss-build-publish-e2e-test-release +- oss-test-test-release +- oss-integration-tests-test-release kind: pipeline name: oss-windows-test-release platform: @@ -1987,7 +3322,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe image: grafana/ci-wix:0.1.1 name: initialize @@ -2009,12 +3344,20 @@ steps: environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: event: - custom type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- clone: disable: true @@ -2022,65 +3365,384 @@ depends_on: [] image_pull_secrets: - dockerconfigjson kind: pipeline -name: enterprise-build-test-release +name: enterprise-build-e2e-publish-test-release node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql -- environment: {} - image: redis:6.2.1-alpine - name: redis -- environment: {} - image: memcached:1.6.9-alpine - name: memcached +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" - cd grafana-enterprise - git checkout main environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 - name: clone + image: grafana/build-container:1.4.9 + name: clone-enterprise - commands: - mv bin/grabpl /tmp/ - rmdir bin - mv grafana-enterprise /tmp/ - - /tmp/grabpl init-enterprise /tmp/grafana-enterprise + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json - mkdir bin - mv /tmp/grabpl bin/ - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl verify-version v7.3.0-test - ./bin/grabpl gen-version v7.3.0-test - yarn install --immutable depends_on: - - clone - image: grafana/build-container:1.4.3 + - clone-enterprise + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - ./bin/grabpl build-backend --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} + --no-pull-enterprise v7.3.0-test + depends_on: + - initialize + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: build-backend +- commands: + - ./bin/grabpl build-frontend --jobs 8 --github-token $${GITHUB_TOKEN} --no-install-deps + --edition enterprise --no-pull-enterprise v7.3.0-test + depends_on: + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 + name: build-frontend +- commands: + - ./bin/grabpl build-plugins --jobs 8 --edition enterprise --no-install-deps --sign + --signing-admin + depends_on: + - initialize + environment: + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: build-plugins +- commands: + - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . + depends_on: + - build-backend + image: grafana/build-container:1.4.9 + name: validate-scuemata +- commands: + - '# Make sure the git tree is clean.' + - '# Stashing changes, since packages that were produced in build-backend step are + needed.' + - git stash + - ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . + - '# The above command generates Typescript files (*.gen.ts) from all appropriate + .cue files.' + - '# It is required that the generated Typescript be in sync with the input CUE + files.' + - '# ...Modulo eslint auto-fixes...:' + - yarn run eslint . --ext .gen.ts --fix + - '# If any filenames are emitted by the below script, run the generator command + `grafana-cli cue gen-ts` locally and commit the result.' + - ./scripts/clean-git-or-error.sh + - '# Un-stash changes.' + - git stash pop + depends_on: + - validate-scuemata + image: grafana/build-container:1.4.9 + name: ensure-cuetsified +- commands: + - ./bin/grabpl build-backend --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} + --no-pull-enterprise v7.3.0-test + depends_on: + - initialize + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: build-backend-enterprise2 +- commands: + - ./bin/grabpl package --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} + --no-pull-enterprise --sign v7.3.0-test + depends_on: + - build-plugins + - build-backend + - build-frontend + - build-backend-enterprise2 + environment: + GITHUB_TOKEN: + from_secret: github_token + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: package +- commands: + - ls dist/*.tar.gz* + - cp dist/*.tar.gz* packaging/docker/ + depends_on: + - package + image: grafana/build-container:1.4.9 + name: copy-packages-for-docker +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition enterprise --shouldSave + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition enterprise --shouldSave --ubuntu + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images-ubuntu + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./e2e/start-server + depends_on: + - package + detach: true + environment: + PACKAGE_FILE: dist/grafana-enterprise-*linux-amd64.tar.gz + PORT: 3001 + RUNDIR: e2e/tmp-grafana-enterprise + image: grafana/build-container:1.4.9 + name: end-to-end-tests-server +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure +- commands: + - ./bin/grabpl upload-cdn --edition enterprise --bucket "grafana-static-assets" + depends_on: + - package + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets +- commands: + - ./bin/grabpl upload-packages --edition enterprise --packages-bucket grafana-downloads-test + depends_on: + - package + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +- commands: + - ./bin/grabpl package --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} + --no-pull-enterprise --sign v7.3.0-test + depends_on: + - build-plugins + - build-backend + - build-frontend + - build-backend-enterprise2 + environment: + GITHUB_TOKEN: + from_secret: github_token + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: package-enterprise2 +- commands: + - ./bin/grabpl upload-cdn --edition enterprise2 --bucket "grafana-static-assets" + depends_on: + - package-enterprise2 + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets-enterprise2 +- commands: + - ./bin/grabpl upload-packages --edition enterprise2 --packages-bucket grafana-downloads-test + depends_on: + - package-enterprise2 + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages-enterprise2 +trigger: + event: + - custom +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +clone: + disable: true +depends_on: [] +image_pull_secrets: +- dockerconfigjson +kind: pipeline +name: enterprise-test-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" + - cd grafana-enterprise + - git checkout main + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: clone-enterprise +- commands: + - mv bin/grabpl /tmp/ + - rmdir bin + - mv grafana-enterprise /tmp/ + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json + - mkdir bin + - mv /tmp/grabpl bin/ + - make gen-go + - ./bin/grabpl verify-version v7.3.0-test + - ./bin/grabpl gen-version v7.3.0-test + - yarn install --immutable + depends_on: + - clone-enterprise + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 name: initialize - commands: - |- @@ -2094,13 +3756,13 @@ steps: - rm words_to_ignore.txt depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: codespell - commands: - ./bin/grabpl shellcheck depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: shellcheck - commands: - ./bin/grabpl lint-backend --edition enterprise @@ -2108,31 +3770,30 @@ steps: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend - commands: - yarn run prettier:check - yarn run lint + - yarn run i18n:compile - yarn run typecheck - - yarn run check-strict depends_on: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-frontend - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition enterprise depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend - commands: - ./bin/grabpl integration-tests --edition enterprise depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration - commands: - yarn run ci:test-frontend @@ -2140,158 +3801,115 @@ steps: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: test-frontend -- commands: - - ./bin/grabpl build-backend --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} - --no-pull-enterprise v7.3.0-test - depends_on: - - test-backend - environment: - GITHUB_TOKEN: - from_secret: github_token - image: grafana/build-container:1.4.3 - name: build-backend -- commands: - - ./bin/grabpl build-frontend --jobs 8 --github-token $${GITHUB_TOKEN} --no-install-deps - --edition enterprise --no-pull-enterprise v7.3.0-test - depends_on: - - test-frontend - image: grafana/build-container:1.4.3 - name: build-frontend -- commands: - - ./bin/grabpl build-plugins --jobs 8 --edition enterprise --no-install-deps --sign - --signing-admin - depends_on: - - lint-backend - environment: - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: build-plugins -- commands: - - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . - depends_on: - - build-backend - image: grafana/build-container:1.4.3 - name: validate-scuemata -- commands: - - '# Make sure the git tree is clean.' - - '# Stashing changes, since packages that were produced in build-backend step are - needed.' - - git stash - - ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . - - '# The above command generates Typescript files (*.gen.ts) from all appropriate - .cue files.' - - '# It is required that the generated Typescript be in sync with the input CUE - files.' - - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix - - '# If any filenames are emitted by the below script, run the generator command - `grafana-cli cue gen-ts` locally and commit the result.' - - ./scripts/clean-git-or-error.sh - - '# Un-stash changes.' - - git stash pop - depends_on: - - validate-scuemata - image: grafana/build-container:1.4.3 - name: ensure-cuetsified - commands: - ./bin/grabpl lint-backend --edition enterprise2 depends_on: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend-enterprise2 - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition enterprise2 depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-enterprise2 - commands: - ./bin/grabpl integration-tests --edition enterprise2 depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration-enterprise2 +trigger: + event: + - custom +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +clone: + disable: true +depends_on: [] +image_pull_secrets: +- dockerconfigjson +kind: pipeline +name: enterprise-integration-tests-test-release +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +- environment: {} + image: redis:6.2.1-alpine + name: redis +- environment: {} + image: memcached:1.6.9-alpine + name: memcached +steps: - commands: - - ./bin/grabpl build-backend --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} - --no-pull-enterprise v7.3.0-test - depends_on: - - test-backend-enterprise2 + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" + - cd grafana-enterprise + - git checkout main environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 - name: build-backend-enterprise2 + image: grafana/build-container:1.4.9 + name: clone-enterprise - commands: - - ./bin/grabpl package --jobs 8 --edition enterprise --github-token $${GITHUB_TOKEN} - --no-pull-enterprise --sign v7.3.0-test + - mv bin/grabpl /tmp/ + - rmdir bin + - mv grafana-enterprise /tmp/ + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json + - mkdir bin + - mv /tmp/grabpl bin/ + - make gen-go + - ./bin/grabpl verify-version v7.3.0-test + - ./bin/grabpl gen-version v7.3.0-test + - yarn install --immutable depends_on: - - build-plugins - - build-backend - - build-frontend - - build-backend-enterprise2 - - test-backend-enterprise2 + - clone-enterprise environment: GITHUB_TOKEN: from_secret: github_token - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: package -- commands: - - ./e2e/start-server - depends_on: - - package - detach: true - environment: - PACKAGE_FILE: dist/grafana-enterprise-*linux-amd64.tar.gz - PORT: 3001 - RUNDIR: e2e/tmp-grafana-enterprise - image: grafana/build-container:1.4.3 - name: end-to-end-tests-server -- commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 --tries 3 - depends_on: - - end-to-end-tests-server - environment: - HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests -- commands: - - ls dist/*.tar.gz* - - cp dist/*.tar.gz* packaging/docker/ - depends_on: - - package - image: grafana/build-container:1.4.3 - name: copy-packages-for-docker -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images - settings: - dry_run: true - edition: enterprise - ubuntu: false -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images-ubuntu - settings: - dry_run: true - edition: enterprise - ubuntu: true + image: grafana/build-container:1.4.9 + name: initialize - commands: - apt-get update - apt-get install -yq postgresql-client @@ -2300,13 +3918,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -2317,128 +3934,51 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests - commands: - dockerize -wait tcp://redis:6379/0 -timeout 120s - ./bin/grabpl integration-tests depends_on: - - test-backend - - test-frontend + - grabpl environment: REDIS_URL: redis://redis:6379/0 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: redis-integration-tests - commands: - dockerize -wait tcp://memcached:11211 -timeout 120s - ./bin/grabpl integration-tests depends_on: - - test-backend - - test-frontend + - grabpl environment: MEMCACHED_HOSTS: memcached:11211 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: memcached-integration-tests -- commands: - - ./bin/grabpl upload-cdn --edition enterprise --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets -- commands: - - ./bin/grabpl upload-packages --edition enterprise --packages-bucket grafana-downloads-test - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - - redis-integration-tests - - memcached-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages -- commands: - - ./bin/grabpl package --jobs 8 --edition enterprise2 --github-token $${GITHUB_TOKEN} - --no-pull-enterprise --sign v7.3.0-test - depends_on: - - build-plugins - - build-backend - - build-frontend - - build-backend-enterprise2 - - test-backend-enterprise2 - environment: - GITHUB_TOKEN: - from_secret: github_token - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: package-enterprise2 -- commands: - - ./e2e/start-server - depends_on: - - package-enterprise2 - detach: true - environment: - PACKAGE_FILE: dist/grafana-enterprise2-*linux-amd64.tar.gz - PORT: 3002 - RUNDIR: e2e/tmp-grafana-enterprise2 - image: grafana/build-container:1.4.3 - name: end-to-end-tests-server-enterprise2 -- commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3002 --tries 3 - depends_on: - - end-to-end-tests-server-enterprise2 - environment: - HOST: end-to-end-tests-server-enterprise2 - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests-enterprise2 -- commands: - - ./bin/grabpl upload-cdn --edition enterprise2 --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server-enterprise2 - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets-enterprise2 -- commands: - - ./bin/grabpl upload-packages --edition enterprise2 --packages-bucket grafana-downloads-test - depends_on: - - end-to-end-tests-enterprise2 - - mysql-integration-tests - - postgres-integration-tests - - redis-integration-tests - - memcached-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages-enterprise2 trigger: event: - custom type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- clone: disable: true depends_on: -- enterprise-build-test-release +- enterprise-build-e2e-publish-test-release +- enterprise-test-test-release +- enterprise-integration-tests-test-release image_pull_secrets: - dockerconfigjson kind: pipeline @@ -2455,7 +3995,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe - git clone "https://$$env:GITHUB_TOKEN@github.com/grafana/grafana-enterprise.git" - cd grafana-enterprise @@ -2470,10 +4010,13 @@ steps: - rm -r -force grafana-enterprise - cp grabpl.exe C:\App\grabpl.exe - rm -force grabpl.exe - - C:\App\grabpl.exe init-enterprise C:\App\grafana-enterprise + - C:\App\grabpl.exe init-enterprise --github-token $$env:GITHUB_TOKEN C:\App\grafana-enterprise - cp C:\App\grabpl.exe grabpl.exe depends_on: - clone + environment: + GITHUB_TOKEN: + from_secret: github_token image: grafana/ci-wix:0.1.1 name: initialize - commands: @@ -2494,17 +4037,29 @@ steps: environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: event: - custom type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- depends_on: -- oss-build-test-release +- oss-build-publish-e2e-test-release +- oss-test-test-release +- oss-integration-tests-test-release - oss-windows-test-release -- enterprise-build-test-release +- enterprise-build-e2e-publish-test-release +- enterprise-test-test-release +- enterprise-integration-tests-test-release - enterprise-windows-test-release kind: pipeline name: publish-test-release @@ -2515,27 +4070,29 @@ platform: os: linux services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl verify-version v7.3.0-test - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: initialize - commands: - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - - ./bin/grabpl publish-packages --edition oss --gcp-key /tmp/gcpkey.json --deb-db-bucket + - ./bin/grabpl store-packages --edition oss --gcp-key /tmp/gcpkey.json --deb-db-bucket grafana-testing-aptly-db --deb-repo-bucket grafana-testing-repo --packages-bucket grafana-downloads-test --rpm-repo-bucket grafana-testing-repo --simulate-release v7.3.0-test depends_on: - - initialize + - grabpl environment: GCP_KEY: from_secret: gcp_key @@ -2548,15 +4105,15 @@ steps: GRAFANA_COM_API_KEY: from_secret: grafana_api_key image: grafana/grafana-ci-deploy:1.3.1 - name: publish-packages-oss + name: store-packages-oss - commands: - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json - - ./bin/grabpl publish-packages --edition enterprise --gcp-key /tmp/gcpkey.json - --deb-db-bucket grafana-testing-aptly-db --deb-repo-bucket grafana-testing-repo - --packages-bucket grafana-downloads-test --rpm-repo-bucket grafana-testing-repo - --simulate-release v7.3.0-test + - ./bin/grabpl store-packages --edition enterprise --gcp-key /tmp/gcpkey.json --deb-db-bucket + grafana-testing-aptly-db --deb-repo-bucket grafana-testing-repo --packages-bucket + grafana-downloads-test --rpm-repo-bucket grafana-testing-repo --simulate-release + v7.3.0-test depends_on: - - initialize + - grabpl environment: GCP_KEY: from_secret: gcp_key @@ -2569,16 +4126,24 @@ steps: GRAFANA_COM_API_KEY: from_secret: grafana_api_key image: grafana/grafana-ci-deploy:1.3.1 - name: publish-packages-enterprise + name: store-packages-enterprise trigger: event: - custom type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- depends_on: -- oss-build-test-release +- oss-build-publish-e2e-test-release +- oss-test-test-release +- oss-integration-tests-test-release - oss-windows-test-release -- enterprise-build-test-release +- enterprise-build-e2e-publish-test-release +- enterprise-test-test-release +- enterprise-integration-tests-test-release - enterprise-windows-test-release - publish-test-release kind: pipeline @@ -2606,130 +4171,61 @@ type: docker --- depends_on: [] kind: pipeline -name: oss-build-release-branch +name: oss-build-publish-e2e-release-branch node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} - yarn install --immutable - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: initialize -- commands: - - |- - echo -e "unknwon - referer - errorstring - eror - iam - wan" > words_to_ignore.txt - - codespell -I words_to_ignore.txt docs/ - - rm words_to_ignore.txt - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: codespell -- commands: - - ./bin/grabpl shellcheck - depends_on: - - initialize - image: grafana/build-container:1.4.3 - name: shellcheck -- commands: - - ./bin/grabpl lint-backend --edition oss - depends_on: - - initialize - environment: - CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 - name: lint-backend -- commands: - - yarn run prettier:check - - yarn run lint - - yarn run typecheck - - yarn run check-strict - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: lint-frontend -- commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - - ./bin/grabpl test-backend --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend -- commands: - - ./bin/grabpl integration-tests --edition oss - depends_on: - - lint-backend - image: grafana/build-container:1.4.3 - name: test-backend-integration -- commands: - - yarn run ci:test-frontend - depends_on: - - initialize - environment: - TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 - name: test-frontend - commands: - ./bin/grabpl build-backend --jobs 8 --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise depends_on: - - test-backend + - initialize environment: {} - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-backend - commands: - ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise depends_on: - - test-frontend - image: grafana/build-container:1.4.3 + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 name: build-frontend - commands: - ./bin/grabpl build-plugins --jobs 8 --edition oss --no-install-deps --sign --signing-admin depends_on: - - lint-backend + - initialize environment: GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: build-plugins - commands: - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . depends_on: - build-backend - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: validate-scuemata - commands: - '# Make sure the git tree is clean.' @@ -2742,7 +4238,7 @@ steps: - '# It is required that the generated Typescript be in sync with the input CUE files.' - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix + - yarn run eslint . --ext .gen.ts --fix - '# If any filenames are emitted by the below script, run the generator command `grafana-cli cue gen-ts` locally and commit the result.' - ./scripts/clean-git-or-error.sh @@ -2750,7 +4246,7 @@ steps: - git stash pop depends_on: - validate-scuemata - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: ensure-cuetsified - commands: - ./bin/grabpl package --jobs 8 --edition oss --build-id ${DRONE_BUILD_NUMBER} --no-pull-enterprise @@ -2770,8 +4266,43 @@ steps: from_secret: gpg_pub_key GRAFANA_API_KEY: from_secret: grafana_api_key - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: package +- commands: + - ls dist/*.tar.gz* + - cp dist/*.tar.gz* packaging/docker/ + depends_on: + - package + image: grafana/build-container:1.4.9 + name: copy-packages-for-docker +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition oss --shouldSave + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition oss --shouldSave --ubuntu + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images-ubuntu + volumes: + - name: docker + path: /var/run/docker.sock - commands: - ./e2e/start-server depends_on: @@ -2779,40 +4310,265 @@ steps: detach: true environment: PORT: 3001 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: end-to-end-tests-server - commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 --tries 3 + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure +- commands: + - yarn storybook:build + - ./bin/grabpl verify-storybook + depends_on: + - build-frontend + environment: + NODE_OPTIONS: --max_old_space_size=4096 + image: grafana/build-container:1.4.9 + name: build-storybook +- commands: + - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" depends_on: - end-to-end-tests-server environment: - HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets - commands: - - ls dist/*.tar.gz* - - cp dist/*.tar.gz* packaging/docker/ + - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads depends_on: - - package - image: grafana/build-container:1.4.3 - name: copy-packages-for-docker -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images - settings: - dry_run: true - edition: oss - ubuntu: false -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images-ubuntu - settings: - dry_run: true - edition: oss - ubuntu: true + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +trigger: + ref: + - refs/heads/v[0-9]* +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +depends_on: [] +kind: pipeline +name: oss-test-release-branch +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - |- + echo -e "unknwon + referer + errorstring + eror + iam + wan" > words_to_ignore.txt + - codespell -I words_to_ignore.txt docs/ + - rm words_to_ignore.txt + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: codespell +- commands: + - ./bin/grabpl shellcheck + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: shellcheck +- commands: + - ./bin/grabpl lint-backend --edition oss + depends_on: + - initialize + environment: + CGO_ENABLED: "1" + image: grafana/build-container:1.4.9 + name: lint-backend +- commands: + - yarn run prettier:check + - yarn run lint + - yarn run i18n:compile + - yarn run typecheck + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: lint-frontend +- commands: + - ./bin/grabpl test-backend --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend +- commands: + - ./bin/grabpl integration-tests --edition oss + depends_on: + - initialize + image: grafana/build-container:1.4.9 + name: test-backend-integration +- commands: + - yarn run ci:test-frontend + depends_on: + - initialize + environment: + TEST_MAX_WORKERS: 50% + image: grafana/build-container:1.4.9 + name: test-frontend +trigger: + ref: + - refs/heads/v[0-9]* +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +depends_on: [] +kind: pipeline +name: oss-integration-tests-release-branch +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - make gen-go + - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} + - yarn install --immutable + image: grafana/build-container:1.4.9 + name: initialize - commands: - apt-get update - apt-get install -yq postgresql-client @@ -2821,13 +4577,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -2838,49 +4593,31 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - grabpl environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests -- commands: - - yarn storybook:build - - ./bin/grabpl verify-storybook - depends_on: - - build-frontend - environment: - NODE_OPTIONS: --max_old_space_size=4096 - image: grafana/build-container:1.4.3 - name: build-storybook -- commands: - - ./bin/grabpl upload-cdn --edition oss --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets -- commands: - - ./bin/grabpl upload-packages --edition oss --packages-bucket grafana-downloads - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages trigger: ref: - refs/heads/v[0-9]* type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- depends_on: -- oss-build-release-branch +- oss-build-publish-e2e-release-branch +- oss-test-release-branch +- oss-integration-tests-release-branch kind: pipeline name: oss-windows-release-branch platform: @@ -2895,7 +4632,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe image: grafana/ci-wix:0.1.1 name: initialize @@ -2912,12 +4649,20 @@ steps: environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: ref: - refs/heads/v[0-9]* type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- clone: disable: true @@ -2925,64 +4670,387 @@ depends_on: [] image_pull_secrets: - dockerconfigjson kind: pipeline -name: enterprise-build-release-branch +name: enterprise-build-e2e-publish-release-branch node: type: no-parallel platform: arch: amd64 os: linux -services: -- environment: - POSTGRES_DB: grafanatest - POSTGRES_PASSWORD: grafanatest - POSTGRES_USER: grafanatest - image: postgres:12.3-alpine - name: postgres -- environment: - MYSQL_DATABASE: grafana_tests - MYSQL_PASSWORD: password - MYSQL_ROOT_PASSWORD: rootpass - MYSQL_USER: grafana - image: mysql:5.6.48 - name: mysql -- environment: {} - image: redis:6.2.1-alpine - name: redis -- environment: {} - image: memcached:1.6.9-alpine - name: memcached +services: [] steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - echo $DRONE_RUNNER_NAME - image: alpine:3.14.2 + image: alpine:3.15 name: identify-runner - commands: - - mkdir -p bin - - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/grabpl - - chmod +x bin/grabpl - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" - cd grafana-enterprise - git checkout ${DRONE_BRANCH} environment: GITHUB_TOKEN: from_secret: github_token - image: grafana/build-container:1.4.3 - name: clone + image: grafana/build-container:1.4.9 + name: clone-enterprise - commands: - mv bin/grabpl /tmp/ - rmdir bin - mv grafana-enterprise /tmp/ - - /tmp/grabpl init-enterprise /tmp/grafana-enterprise + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json - mkdir bin - mv /tmp/grabpl bin/ - - ./bin/grabpl verify-drone - make gen-go - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} - yarn install --immutable depends_on: - - clone - image: grafana/build-container:1.4.3 + - clone-enterprise + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: initialize +- commands: + - ./bin/grabpl build-backend --jobs 8 --edition enterprise --build-id ${DRONE_BUILD_NUMBER} + --no-pull-enterprise + depends_on: + - initialize + environment: {} + image: grafana/build-container:1.4.9 + name: build-backend +- commands: + - ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition enterprise --build-id + ${DRONE_BUILD_NUMBER} --no-pull-enterprise + depends_on: + - initialize + environment: + NODE_OPTIONS: --max_old_space_size=8192 + image: grafana/build-container:1.4.9 + name: build-frontend +- commands: + - ./bin/grabpl build-plugins --jobs 8 --edition enterprise --no-install-deps --sign + --signing-admin + depends_on: + - initialize + environment: + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: build-plugins +- commands: + - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . + depends_on: + - build-backend + image: grafana/build-container:1.4.9 + name: validate-scuemata +- commands: + - '# Make sure the git tree is clean.' + - '# Stashing changes, since packages that were produced in build-backend step are + needed.' + - git stash + - ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . + - '# The above command generates Typescript files (*.gen.ts) from all appropriate + .cue files.' + - '# It is required that the generated Typescript be in sync with the input CUE + files.' + - '# ...Modulo eslint auto-fixes...:' + - yarn run eslint . --ext .gen.ts --fix + - '# If any filenames are emitted by the below script, run the generator command + `grafana-cli cue gen-ts` locally and commit the result.' + - ./scripts/clean-git-or-error.sh + - '# Un-stash changes.' + - git stash pop + depends_on: + - validate-scuemata + image: grafana/build-container:1.4.9 + name: ensure-cuetsified +- commands: + - ./bin/grabpl build-backend --jobs 8 --edition enterprise2 --build-id ${DRONE_BUILD_NUMBER} + --variants linux-x64 --no-pull-enterprise + depends_on: + - initialize + environment: {} + image: grafana/build-container:1.4.9 + name: build-backend-enterprise2 +- commands: + - ./bin/grabpl package --jobs 8 --edition enterprise --build-id ${DRONE_BUILD_NUMBER} + --no-pull-enterprise --sign + depends_on: + - build-plugins + - build-backend + - build-frontend + - build-backend-enterprise2 + environment: + GITHUB_TOKEN: + from_secret: github_token + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: package +- commands: + - ls dist/*.tar.gz* + - cp dist/*.tar.gz* packaging/docker/ + depends_on: + - package + image: grafana/build-container:1.4.9 + name: copy-packages-for-docker +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition enterprise --shouldSave + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - printenv GCP_KEY | base64 -d > /tmp/gcpkey.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey.json + - ./bin/grabpl build-docker --edition enterprise --shouldSave --ubuntu + depends_on: + - copy-packages-for-docker + environment: + GCP_KEY: + from_secret: gcp_key + image: google/cloud-sdk + name: package-docker-images-ubuntu + volumes: + - name: docker + path: /var/run/docker.sock +- commands: + - ./e2e/start-server + depends_on: + - package + detach: true + environment: + PACKAGE_FILE: dist/grafana-enterprise-*linux-amd64.tar.gz + PORT: 3001 + RUNDIR: e2e/tmp-grafana-enterprise + image: grafana/build-container:1.4.9 + name: end-to-end-tests-server +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite dashboards-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-dashboards-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite smoke-tests-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-smoke-tests-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite panels-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-panels-suite +- commands: + - apt-get install -y netcat + - ./bin/grabpl e2e-tests --port 3001 --suite various-suite --tries 3 + depends_on: + - package + environment: + HOST: end-to-end-tests-server + image: cypress/included:9.2.0 + name: end-to-end-tests-various-suite +- commands: + - apt-get update + - apt-get install -yq zip + - ls -lah ./e2e + - find ./e2e -type f -name "*.mp4" + - printenv GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY > /tmp/gcpkey_upload_artifacts.json + - gcloud auth activate-service-account --key-file=/tmp/gcpkey_upload_artifacts.json + - find ./e2e -type f -name "*spec.ts.mp4" | zip e2e/videos.zip -@ + - gsutil cp e2e/videos.zip gs://$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - export E2E_ARTIFACTS_VIDEO_ZIP=https://storage.googleapis.com/$${E2E_TEST_ARTIFACTS_BUCKET}/${DRONE_BUILD_NUMBER}/artifacts/videos/videos.zip + - 'echo "E2E Test artifacts uploaded to: $${E2E_ARTIFACTS_VIDEO_ZIP}"' + - 'curl -X POST https://api.github.com/repos/${DRONE_REPO}/statuses/${DRONE_COMMIT_SHA} + -H "Authorization: token $${GITHUB_TOKEN}" -d "{\"state\":\"success\",\"target_url\":\"$${E2E_ARTIFACTS_VIDEO_ZIP}\", + \"description\": \"Click on the details to download e2e recording videos\", \"context\": + \"e2e_artifacts\"}"' + depends_on: + - end-to-end-tests-dashboards-suite + - end-to-end-tests-panels-suite + - end-to-end-tests-smoke-tests-suite + - end-to-end-tests-various-suite + environment: + E2E_TEST_ARTIFACTS_BUCKET: releng-pipeline-artifacts-dev + GCP_GRAFANA_UPLOAD_ARTIFACTS_KEY: + from_secret: gcp_upload_artifacts_key + GITHUB_TOKEN: + from_secret: github_token + image: google/cloud-sdk:367.0.0 + name: e2e-tests-artifacts-upload + when: + status: + - success + - failure +- commands: + - yarn storybook:build + - ./bin/grabpl verify-storybook + depends_on: + - build-frontend + environment: + NODE_OPTIONS: --max_old_space_size=4096 + image: grafana/build-container:1.4.9 + name: build-storybook +- commands: + - ./bin/grabpl upload-cdn --edition enterprise --bucket "grafana-static-assets" + depends_on: + - package + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets +- commands: + - ./bin/grabpl upload-packages --edition enterprise --packages-bucket grafana-downloads + depends_on: + - package + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages +- commands: + - ./bin/grabpl package --jobs 8 --edition enterprise2 --build-id ${DRONE_BUILD_NUMBER} + --no-pull-enterprise --variants linux-x64 --sign + depends_on: + - build-plugins + - build-backend + - build-frontend + - build-backend-enterprise2 + environment: + GITHUB_TOKEN: + from_secret: github_token + GPG_KEY_PASSWORD: + from_secret: gpg_key_password + GPG_PRIV_KEY: + from_secret: gpg_priv_key + GPG_PUB_KEY: + from_secret: gpg_pub_key + GRAFANA_API_KEY: + from_secret: grafana_api_key + image: grafana/build-container:1.4.9 + name: package-enterprise2 +- commands: + - ./bin/grabpl upload-cdn --edition enterprise2 --bucket "grafana-static-assets" + depends_on: + - package-enterprise2 + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-cdn-assets-enterprise2 +- commands: + - ./bin/grabpl upload-packages --edition enterprise2 --packages-bucket grafana-downloads-enterprise2 + depends_on: + - package-enterprise2 + environment: + GCP_GRAFANA_UPLOAD_KEY: + from_secret: gcp_key + PRERELEASE_BUCKET: + from_secret: prerelease_bucket + image: grafana/grafana-ci-deploy:1.3.1 + name: upload-packages-enterprise2 +trigger: + ref: + - refs/heads/v[0-9]* +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory +--- +clone: + disable: true +depends_on: [] +image_pull_secrets: +- dockerconfigjson +kind: pipeline +name: enterprise-test-release-branch +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: [] +steps: +- commands: + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl +- commands: + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" + - cd grafana-enterprise + - git checkout ${DRONE_BRANCH} + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: clone-enterprise +- commands: + - mv bin/grabpl /tmp/ + - rmdir bin + - mv grafana-enterprise /tmp/ + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json + - mkdir bin + - mv /tmp/grabpl bin/ + - make gen-go + - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} + - yarn install --immutable + depends_on: + - clone-enterprise + environment: + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 name: initialize - commands: - |- @@ -2996,13 +5064,13 @@ steps: - rm words_to_ignore.txt depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: codespell - commands: - ./bin/grabpl shellcheck depends_on: - initialize - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: shellcheck - commands: - ./bin/grabpl lint-backend --edition enterprise @@ -3010,31 +5078,30 @@ steps: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend - commands: - yarn run prettier:check - yarn run lint + - yarn run i18n:compile - yarn run typecheck - - yarn run check-strict depends_on: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-frontend - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition enterprise depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend - commands: - ./bin/grabpl integration-tests --edition enterprise depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration - commands: - yarn run ci:test-frontend @@ -3042,154 +5109,114 @@ steps: - initialize environment: TEST_MAX_WORKERS: 50% - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: test-frontend -- commands: - - ./bin/grabpl build-backend --jobs 8 --edition enterprise --build-id ${DRONE_BUILD_NUMBER} - --no-pull-enterprise - depends_on: - - test-backend - environment: {} - image: grafana/build-container:1.4.3 - name: build-backend -- commands: - - ./bin/grabpl build-frontend --jobs 8 --no-install-deps --edition enterprise --build-id - ${DRONE_BUILD_NUMBER} --no-pull-enterprise - depends_on: - - test-frontend - image: grafana/build-container:1.4.3 - name: build-frontend -- commands: - - ./bin/grabpl build-plugins --jobs 8 --edition enterprise --no-install-deps --sign - --signing-admin - depends_on: - - lint-backend - environment: - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: build-plugins -- commands: - - ./bin/linux-amd64/grafana-cli cue validate-schema --grafana-root . - depends_on: - - build-backend - image: grafana/build-container:1.4.3 - name: validate-scuemata -- commands: - - '# Make sure the git tree is clean.' - - '# Stashing changes, since packages that were produced in build-backend step are - needed.' - - git stash - - ./bin/linux-amd64/grafana-cli cue gen-ts --grafana-root . - - '# The above command generates Typescript files (*.gen.ts) from all appropriate - .cue files.' - - '# It is required that the generated Typescript be in sync with the input CUE - files.' - - '# ...Modulo eslint auto-fixes...:' - - ./node_modules/.bin/eslint . --ext .gen.ts --fix - - '# If any filenames are emitted by the below script, run the generator command - `grafana-cli cue gen-ts` locally and commit the result.' - - ./scripts/clean-git-or-error.sh - - '# Un-stash changes.' - - git stash pop - depends_on: - - validate-scuemata - image: grafana/build-container:1.4.3 - name: ensure-cuetsified - commands: - ./bin/grabpl lint-backend --edition enterprise2 depends_on: - initialize environment: CGO_ENABLED: "1" - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: lint-backend-enterprise2 - commands: - - '[ $(grep FocusConvey -R pkg | wc -l) -eq "0" ] || exit 1' - ./bin/grabpl test-backend --edition enterprise2 depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-enterprise2 - commands: - ./bin/grabpl integration-tests --edition enterprise2 depends_on: - - lint-backend - image: grafana/build-container:1.4.3 + - initialize + image: grafana/build-container:1.4.9 name: test-backend-integration-enterprise2 +trigger: + ref: + - refs/heads/v[0-9]* +type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +--- +clone: + disable: true +depends_on: [] +image_pull_secrets: +- dockerconfigjson +kind: pipeline +name: enterprise-integration-tests-release-branch +node: + type: no-parallel +platform: + arch: amd64 + os: linux +services: +- environment: + PGDATA: /var/lib/postgresql/data/pgdata + POSTGRES_DB: grafanatest + POSTGRES_PASSWORD: grafanatest + POSTGRES_USER: grafanatest + image: postgres:12.3-alpine + name: postgres + volumes: + - name: postgres + path: /var/lib/postgresql/data/pgdata +- environment: + MYSQL_DATABASE: grafana_tests + MYSQL_PASSWORD: password + MYSQL_ROOT_PASSWORD: rootpass + MYSQL_USER: grafana + image: mysql:5.6.48 + name: mysql + volumes: + - name: mysql + path: /var/lib/mysql +- environment: {} + image: redis:6.2.1-alpine + name: redis +- environment: {} + image: memcached:1.6.9-alpine + name: memcached +steps: - commands: - - ./bin/grabpl build-backend --jobs 8 --edition enterprise2 --build-id ${DRONE_BUILD_NUMBER} - --variants linux-x64 --no-pull-enterprise - depends_on: - - test-backend-enterprise2 - environment: {} - image: grafana/build-container:1.4.3 - name: build-backend-enterprise2 + - mkdir -p bin + - curl -fL -o bin/grabpl https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/grabpl + - chmod +x bin/grabpl + image: byrnedo/alpine-curl:0.1.8 + name: grabpl - commands: - - ./bin/grabpl package --jobs 8 --edition enterprise --build-id ${DRONE_BUILD_NUMBER} - --no-pull-enterprise --sign - depends_on: - - build-plugins - - build-backend - - build-frontend - - build-backend-enterprise2 - - test-backend-enterprise2 + - echo $DRONE_RUNNER_NAME + image: alpine:3.15 + name: identify-runner +- commands: + - git clone "https://$${GITHUB_TOKEN}@github.com/grafana/grafana-enterprise.git" + - cd grafana-enterprise + - git checkout ${DRONE_BRANCH} environment: GITHUB_TOKEN: from_secret: github_token - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: package + image: grafana/build-container:1.4.9 + name: clone-enterprise - commands: - - ./e2e/start-server + - mv bin/grabpl /tmp/ + - rmdir bin + - mv grafana-enterprise /tmp/ + - /tmp/grabpl init-enterprise --github-token $${GITHUB_TOKEN} /tmp/grafana-enterprise + - mv /tmp/grafana-enterprise/deployment_tools_config.json deployment_tools_config.json + - mkdir bin + - mv /tmp/grabpl bin/ + - make gen-go + - ./bin/grabpl gen-version --build-id ${DRONE_BUILD_NUMBER} + - yarn install --immutable depends_on: - - package - detach: true + - clone-enterprise environment: - PACKAGE_FILE: dist/grafana-enterprise-*linux-amd64.tar.gz - PORT: 3001 - RUNDIR: e2e/tmp-grafana-enterprise - image: grafana/build-container:1.4.3 - name: end-to-end-tests-server -- commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3001 --tries 3 - depends_on: - - end-to-end-tests-server - environment: - HOST: end-to-end-tests-server - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests -- commands: - - ls dist/*.tar.gz* - - cp dist/*.tar.gz* packaging/docker/ - depends_on: - - package - image: grafana/build-container:1.4.3 - name: copy-packages-for-docker -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images - settings: - dry_run: true - edition: enterprise - ubuntu: false -- depends_on: - - copy-packages-for-docker - image: grafana/drone-grafana-docker:0.3.2 - name: build-docker-images-ubuntu - settings: - dry_run: true - edition: enterprise - ubuntu: true + GITHUB_TOKEN: + from_secret: github_token + image: grafana/build-container:1.4.9 + name: initialize - commands: - apt-get update - apt-get install -yq postgresql-client @@ -3198,13 +5225,12 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database postgres depends_on: - - test-backend - - test-frontend + - initialize environment: GRAFANA_TEST_DB: postgres PGPASSWORD: grafanatest POSTGRES_HOST: postgres - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: postgres-integration-tests - commands: - apt-get update @@ -3215,137 +5241,51 @@ steps: - go clean -testcache - ./bin/grabpl integration-tests --database mysql depends_on: - - test-backend - - test-frontend + - initialize environment: GRAFANA_TEST_DB: mysql MYSQL_HOST: mysql - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: mysql-integration-tests -- commands: - - yarn storybook:build - - ./bin/grabpl verify-storybook - depends_on: - - build-frontend - environment: - NODE_OPTIONS: --max_old_space_size=4096 - image: grafana/build-container:1.4.3 - name: build-storybook - commands: - dockerize -wait tcp://redis:6379/0 -timeout 120s - ./bin/grabpl integration-tests depends_on: - - test-backend - - test-frontend + - initialize environment: REDIS_URL: redis://redis:6379/0 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: redis-integration-tests - commands: - dockerize -wait tcp://memcached:11211 -timeout 120s - ./bin/grabpl integration-tests depends_on: - - test-backend - - test-frontend + - initialize environment: MEMCACHED_HOSTS: memcached:11211 - image: grafana/build-container:1.4.3 + image: grafana/build-container:1.4.9 name: memcached-integration-tests -- commands: - - ./bin/grabpl upload-cdn --edition enterprise --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets -- commands: - - ./bin/grabpl upload-packages --edition enterprise --packages-bucket grafana-downloads - depends_on: - - end-to-end-tests - - mysql-integration-tests - - postgres-integration-tests - - redis-integration-tests - - memcached-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages -- commands: - - ./bin/grabpl package --jobs 8 --edition enterprise2 --build-id ${DRONE_BUILD_NUMBER} - --no-pull-enterprise --variants linux-x64 --sign - depends_on: - - build-plugins - - build-backend - - build-frontend - - build-backend-enterprise2 - - test-backend-enterprise2 - environment: - GITHUB_TOKEN: - from_secret: github_token - GPG_KEY_PASSWORD: - from_secret: gpg_key_password - GPG_PRIV_KEY: - from_secret: gpg_priv_key - GPG_PUB_KEY: - from_secret: gpg_pub_key - GRAFANA_API_KEY: - from_secret: grafana_api_key - image: grafana/build-container:1.4.3 - name: package-enterprise2 -- commands: - - ./e2e/start-server - depends_on: - - package-enterprise2 - detach: true - environment: - PACKAGE_FILE: dist/grafana-enterprise2-*linux-amd64.tar.gz - PORT: 3002 - RUNDIR: e2e/tmp-grafana-enterprise2 - image: grafana/build-container:1.4.3 - name: end-to-end-tests-server-enterprise2 -- commands: - - yarn run cypress install - - ./bin/grabpl e2e-tests --port 3002 --tries 3 - depends_on: - - end-to-end-tests-server-enterprise2 - environment: - HOST: end-to-end-tests-server-enterprise2 - image: grafana/ci-e2e:12.19.0-1 - name: end-to-end-tests-enterprise2 -- commands: - - ./bin/grabpl upload-cdn --edition enterprise2 --bucket "grafana-static-assets" - depends_on: - - end-to-end-tests-server-enterprise2 - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-cdn-assets-enterprise2 -- commands: - - ./bin/grabpl upload-packages --edition enterprise2 --packages-bucket grafana-downloads-enterprise2 - depends_on: - - end-to-end-tests-enterprise2 - - mysql-integration-tests - - postgres-integration-tests - - redis-integration-tests - - memcached-integration-tests - environment: - GCP_GRAFANA_UPLOAD_KEY: - from_secret: gcp_key - image: grafana/grafana-ci-deploy:1.3.1 - name: upload-packages-enterprise2 trigger: ref: - refs/heads/v[0-9]* type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker +- name: postgres + temp: + medium: memory +- name: mysql + temp: + medium: memory --- clone: disable: true depends_on: -- enterprise-build-release-branch +- enterprise-build-e2e-publish-release-branch +- enterprise-test-release-branch +- enterprise-integration-tests-release-branch image_pull_secrets: - dockerconfigjson kind: pipeline @@ -3362,7 +5302,7 @@ steps: name: identify-runner - commands: - $$ProgressPreference = "SilentlyContinue" - - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.5.5/windows/grabpl.exe + - Invoke-WebRequest https://grafana-downloads.storage.googleapis.com/grafana-build-pipeline/v2.8.2/windows/grabpl.exe -OutFile grabpl.exe - git clone "https://$$env:GITHUB_TOKEN@github.com/grafana/grafana-enterprise.git" - cd grafana-enterprise @@ -3377,10 +5317,13 @@ steps: - rm -r -force grafana-enterprise - cp grabpl.exe C:\App\grabpl.exe - rm -force grabpl.exe - - C:\App\grabpl.exe init-enterprise C:\App\grafana-enterprise + - C:\App\grabpl.exe init-enterprise --github-token $$env:GITHUB_TOKEN C:\App\grafana-enterprise - cp C:\App\grabpl.exe grabpl.exe depends_on: - clone + environment: + GITHUB_TOKEN: + from_secret: github_token image: grafana/ci-wix:0.1.1 name: initialize - commands: @@ -3396,67 +5339,126 @@ steps: environment: GCP_KEY: from_secret: gcp_key + GITHUB_TOKEN: + from_secret: github_token + PRERELEASE_BUCKET: + from_secret: prerelease_bucket image: grafana/ci-wix:0.1.1 name: build-windows-installer trigger: ref: - refs/heads/v[0-9]* type: docker +volumes: +- host: + path: /var/run/docker.sock + name: docker --- -depends_on: -- oss-build-release-branch -- oss-windows-release-branch -- enterprise-build-release-branch -- enterprise-windows-release-branch kind: pipeline -name: notify-release-branch +name: scan-grafana/grafana:latest-image platform: arch: amd64 os: linux steps: -- image: plugins/slack - name: slack - settings: - channel: grafana-ci-notifications - template: |- - Build {{build.number}} failed for commit: : {{build.link}} - Branch: - Author: {{build.author}} - webhook: - from_secret: slack_webhook -trigger: - ref: - - refs/heads/v[0-9]* - status: - - failure -type: docker ---- -kind: pipeline -name: scan-docker-images -platform: - arch: amd64 - os: linux -services: [] -steps: - commands: - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:latest - - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:main - - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:latest-ubuntu - - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:main-ubuntu - image: aquasec/trivy:0.18.3 - name: scan-docker-images-unkown-low-medium-vulnerabilities + image: aquasec/trivy:0.21.0 + name: scan-unkown-low-medium-vulnerabilities - commands: - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:latest - - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:main - - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:latest-ubuntu - - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:main-ubuntu - image: aquasec/trivy:0.18.3 - name: scan-docker-images-high-critical-vulnerabilities + image: aquasec/trivy:0.21.0 + name: scan-high-critical-vulnerabilities - image: plugins/slack name: slack-notify-failure settings: channel: grafana-backend-ops - template: 'Nightly docker image scan job for {{repo.name}} failed: {{build.link}}' + template: 'Nightly docker image scan job for grafana/grafana:latest failed: {{build.link}}' + webhook: + from_secret: slack_webhook_backend + when: + status: failure +trigger: + cron: nightly + event: cron +type: docker +--- +kind: pipeline +name: scan-grafana/grafana:main-image +platform: + arch: amd64 + os: linux +steps: +- commands: + - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:main + image: aquasec/trivy:0.21.0 + name: scan-unkown-low-medium-vulnerabilities +- commands: + - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:main + image: aquasec/trivy:0.21.0 + name: scan-high-critical-vulnerabilities +- image: plugins/slack + name: slack-notify-failure + settings: + channel: grafana-backend-ops + template: 'Nightly docker image scan job for grafana/grafana:main failed: {{build.link}}' + webhook: + from_secret: slack_webhook_backend + when: + status: failure +trigger: + cron: nightly + event: cron +type: docker +--- +kind: pipeline +name: scan-grafana/grafana:latest-ubuntu-image +platform: + arch: amd64 + os: linux +steps: +- commands: + - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:latest-ubuntu + image: aquasec/trivy:0.21.0 + name: scan-unkown-low-medium-vulnerabilities +- commands: + - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:latest-ubuntu + image: aquasec/trivy:0.21.0 + name: scan-high-critical-vulnerabilities +- image: plugins/slack + name: slack-notify-failure + settings: + channel: grafana-backend-ops + template: 'Nightly docker image scan job for grafana/grafana:latest-ubuntu failed: + {{build.link}}' + webhook: + from_secret: slack_webhook_backend + when: + status: failure +trigger: + cron: nightly + event: cron +type: docker +--- +kind: pipeline +name: scan-grafana/grafana:main-ubuntu-image +platform: + arch: amd64 + os: linux +steps: +- commands: + - trivy --exit-code 0 --severity UNKNOWN,LOW,MEDIUM grafana/grafana:main-ubuntu + image: aquasec/trivy:0.21.0 + name: scan-unkown-low-medium-vulnerabilities +- commands: + - trivy --exit-code 1 --severity HIGH,CRITICAL grafana/grafana:main-ubuntu + image: aquasec/trivy:0.21.0 + name: scan-high-critical-vulnerabilities +- image: plugins/slack + name: slack-notify-failure + settings: + channel: grafana-backend-ops + template: 'Nightly docker image scan job for grafana/grafana:main-ubuntu failed: + {{build.link}}' webhook: from_secret: slack_webhook_backend when: @@ -3484,7 +5486,19 @@ get: kind: secret name: drone_token --- +get: + name: bucket + path: infra/data/ci/grafana/prerelease +kind: secret +name: prerelease_bucket +--- +get: + name: credentials.json + path: infra/data/ci/grafana/releng/artifacts-uploader-service-account +kind: secret +name: gcp_upload_artifacts_key +--- kind: signature -hmac: 0d26eda19dc6e530d02c734704c8a9d01beb5082c7e14b2609577b8695ed06f5 +hmac: 81173294ad474a12cbb622d9e963e208ddd2a2ac42a30dde6396794923b158a0 ... diff --git a/.eslintignore b/.eslintignore index 7e7361a556f..4608870d6e9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -7,3 +7,8 @@ data dist e2e/tmp public/lib/monaco +deployment_tools_config.json + +# Auto-generated localisation files +public/locales/_build/ +public/locales/**/*.js diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index ad210108d6c..e0ffc40fc45 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -14,7 +14,7 @@ # Documentation owner: Jita Chatterjee /docs/ @grafana/docs-squad @pkolyvas /contribute/ @marcusolsson @grafana/docs-squad @pkolyvas -/docs/sources/developers/plugins/ @marcusolsson @grafana/docs-squad @grafana/plugins-platform +/docs/sources/developers/plugins/ @marcusolsson @grafana/docs-squad @grafana/plugins-platform-frontend @grafana/plugins-platform-backend /docs/sources/developers/plugins/backend @marcusolsson @grafana/docs-squad @grafana/plugins-platform-backend /docs/sources/enterprise/ @osg-grafana @grafana/docs-squad @@ -43,12 +43,17 @@ go.sum @grafana/backend-platform /pkg/tsdb/zipkin @grafana/observability-squad /pkg/tsdb/tempo @grafana/observability-squad +# BI backend code +/pkg/tsdb/mysql @grafana/grafana-bi-squad +/pkg/tsdb/postgres @grafana/grafana-bi-squad +/pkg/tsdb/mssql @grafana/grafana-bi-squad + # Database migrations /pkg/services/sqlstore/migrations @grafana/backend-platform @grafana/hosted-grafana-team *_mig.go @grafana/backend-platform @grafana/hosted-grafana-team # Grafana live -/pkg/service/live/ @grafana/grafana-edge-squad +/pkg/services/live/ @grafana/grafana-edge-squad # Unified Alerting /pkg/services/ngalert @grafana/alerting-squad @@ -64,6 +69,9 @@ go.sum @grafana/backend-platform /pkg/services/datasourceproxy @grafana/plugins-platform-backend /pkg/services/datasources @grafana/plugins-platform-backend +# Dashboard previews / crawler (behind feature flag) +/pkg/services/thumbs @grafana/grafana-edge-squad + # Backend code docs /contribute/style-guides/backend.md @grafana/backend-platform /contribute/architecture/backend @grafana/backend-platform @@ -83,16 +91,19 @@ go.sum @grafana/backend-platform /packages/grafana-ui/src/utils/storybook @grafana/plugins-platform-frontend /packages/jaeger-ui-components/ @grafana/observability-squad /plugins-bundled @grafana/plugins-platform-frontend -/public @grafana/user-essentials +# public folder /public/app/core/components/TimePicker @grafana/grafana-bi-squad +/public/app/core/components/Layers @grafana/grafana-edge-squad /public/app/features/canvas/ @grafana/grafana-edge-squad /public/app/features/dimensions/ @grafana/grafana-edge-squad /public/app/features/live/ @grafana/grafana-edge-squad /public/app/features/explore/ @grafana/observability-squad +/public/app/features/plugins @grafana/plugins-platform-frontend /public/app/plugins/panel/alertlist @grafana/alerting-squad /public/app/plugins/panel/barchart @grafana/grafana-bi-squad /public/app/plugins/panel/heatmap @grafana/grafana-bi-squad /public/app/plugins/panel/histogram @grafana/grafana-bi-squad +/public/app/plugins/panel/nodeGraph @grafana/observability-squad /public/app/plugins/panel/piechart @grafana/grafana-bi-squad /public/app/plugins/panel/state-timeline @grafana/grafana-bi-squad /public/app/plugins/panel/status-history @grafana/grafana-bi-squad @@ -100,6 +111,7 @@ go.sum @grafana/backend-platform /public/app/plugins/panel/timeseries @grafana/grafana-bi-squad /public/app/plugins/panel/geomap @grafana/grafana-edge-squad /public/app/plugins/panel/canvas @grafana/grafana-edge-squad +/public/app/plugins/panel/candlestick @grafana/grafana-edge-squad /public/app/plugins/panel/icon @grafana/grafana-edge-squad /scripts/build/release-packages.sh @grafana/plugins-platform-frontend /scripts/circle-release-next-packages.sh @grafana/plugins-platform-frontend @@ -129,10 +141,10 @@ lerna.json @grafana/frontend-ops /public/app/plugins/datasource/influxdb @grafana/observability-squad /public/app/plugins/datasource/jaeger @grafana/observability-squad /public/app/plugins/datasource/loki @grafana/observability-squad -/public/app/plugins/datasource/mssql @grafana/backend-platform -/public/app/plugins/datasource/mysql @grafana/backend-platform +/public/app/plugins/datasource/mssql @grafana/grafana-bi-squad +/public/app/plugins/datasource/mysql @grafana/grafana-bi-squad /public/app/plugins/datasource/opentsdb @grafana/backend-platform -/public/app/plugins/datasource/postgres @grafana/backend-platform +/public/app/plugins/datasource/postgres @grafana/grafana-bi-squad /public/app/plugins/datasource/prometheus @grafana/observability-squad /public/app/plugins/datasource/cloud-monitoring @grafana/cloud-datasources /public/app/plugins/datasource/zipkin @grafana/observability-squad @@ -140,4 +152,4 @@ lerna.json @grafana/frontend-ops /public/app/plugins/datasource/alertmanager @grafana/alerting-squad # Cloud middleware -/grafana-mixin/ @grafana/cloud-middleware +/grafana-mixin/ @grafana/hosted-grafana-team diff --git a/.github/commands.json b/.github/commands.json index b86ea867538..27e7bf31375 100644 --- a/.github/commands.json +++ b/.github/commands.json @@ -1,53 +1,181 @@ [ { - "type": "label", - "name": "bot/question", - "addLabel": "type/question", - "removeLabel": "bot/question", - "action": "close", - "comment": "Please ask your question on [community.grafana.com/](https://community.grafana.com/). To avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" + "type":"label", + "name":"bot/question", + "addLabel":"type/question", + "removeLabel":"bot/question", + "action":"close", + "comment":"Please ask your question on [community.grafana.com/](https://community.grafana.com/). To avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" }, { - "type": "comment", - "name": "duplicate", - "allowUsers": [], - "action": "updateLabels", - "addLabel": "type/duplicate" + "type":"comment", + "name":"duplicate", + "allowUsers":[], + "action":"updateLabels", + "addLabel":"type/duplicate" }, { - "type": "label", - "name": "bot/duplicate", - "addLabel": "type/duplicate", - "removeLabel": "bot/duplicate", - "action": "close", - "comment": "Thanks for creating this issue! It looks like this has already been reported by another user. We’ve closed this in favor of the existing one. Please consider adding any details you think is missing to that issue.\n\nTo avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" + "type":"label", + "name":"bot/duplicate", + "addLabel":"type/duplicate", + "removeLabel":"bot/duplicate", + "action":"close", + "comment":"Thanks for creating this issue! It looks like this has already been reported by another user. We’ve closed this in favor of the existing one. Please consider adding any details you think is missing to that issue.\n\nTo avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" }, { - "type": "comment", - "name": "needsMoreInfo", - "allowUsers": [], - "action": "updateLabels", - "addLabel": "bot/needs more info" + "type":"comment", + "name":"needsMoreInfo", + "allowUsers":[], + "action":"updateLabels", + "addLabel":"bot/needs more info" }, { - "type": "label", - "name": "bot/needs more info", - "action": "updateLabels", - "addLabel": "needs more info", - "removeLabel": "bot/needs more info", - "comment": "Thanks for creating this issue! We think it's missing some basic information. \r\n\r\nFollow the issue template and add additional information that will help us replicate the problem. \r\nFor data visualization issues: \r\n- Query results from the inspect drawer (data tab & query inspector)\r\n- Panel settings can be extracted in the panel inspect drawer JSON tab\r\n\r\nFor dashboard related issues: \r\n- Dashboard JSON can be found in the dashboard settings JSON model view\r\n\r\nFor authentication, provisioning and alerting issues, Grafana server logs are useful. \r\n\r\nHappy graphing!" + "type":"label", + "name":"bot/needs more info", + "action":"updateLabels", + "addLabel":"needs more info", + "removeLabel":"bot/needs more info", + "comment":"Thanks for creating this issue! We think it's missing some basic information. \r\n\r\nFollow the issue template and add additional information that will help us replicate the problem. \r\nFor data visualization issues: \r\n- Query results from the inspect drawer (data tab & query inspector)\r\n- Panel settings can be extracted in the panel inspect drawer JSON tab\r\n\r\nFor dashboard related issues: \r\n- Dashboard JSON can be found in the dashboard settings JSON model view\r\n\r\nFor authentication, provisioning and alerting issues, Grafana server logs are useful. \r\n\r\nHappy graphing!" }, { - "type": "label", - "name": "bot/no new info", - "action": "close", - "comment": "We've closed this issue since it needs more information and hasn't had any activity recently. We can re-open it after you you add more information. To avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" + "type":"label", + "name":"bot/no new info", + "action":"close", + "comment":"We've closed this issue since it needs more information and hasn't had any activity recently. We can re-open it after you you add more information. To avoid having your issue closed in the future, please read our [CONTRIBUTING](https://github.com/grafana/grafana/blob/main/CONTRIBUTING.md) guidelines.\n\nHappy graphing!" }, { - "type": "label", - "name": "bot/close feature request", - "action": "close", - "addLabel": "not implemented", - "comment": "This feature request has been open for a long time with few received upvotes or comments, so we are closing it. We're trying to limit open GitHub issues in order to better track planned work and features. \r\n\r\nThis doesn't mean that we'll never ever implement it or that we will never accept a PR for it. A closed issue can still attract upvotes and act as a ticket to track feature demand\/interest. \r\n\r\nThank You to you for taking the time to create this issue!" + "type":"label", + "name":"bot/close feature request", + "action":"close", + "addLabel":"not implemented", + "comment":"This feature request has been open for a long time with few received upvotes or comments, so we are closing it. We're trying to limit open GitHub issues in order to better track planned work and features. \r\n\r\nThis doesn't mean that we'll never ever implement it or that we will never accept a PR for it. A closed issue can still attract upvotes and act as a ticket to track feature demand\/interest. \r\n\r\nThank You to you for taking the time to create this issue!" + }, + { + "type":"label", + "name":"oss-user-essentials", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/78" + } + }, + { + "type":"label", + "name":"area/plugins-catalog", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/76" + } + }, + { + "type":"label", + "name":"type/docs", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/69" + } + }, + { + "type":"label", + "name":"datasource/Azure", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/97" + } + }, + { + "type":"label", + "name":"datasource/CloudWatch", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/97" + } + }, + { + "type":"label", + "name":"datasource/GoogleCloudMonitoring", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/97" + } + }, + { + "type":"label", + "name":"oss-observability", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"datasource/Prometheus", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"datasource/InfluxDB", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"datasource/OpenSearch", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"datasource/Loki", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"datasource/Tempo", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"datasource/Elasticsearch", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"area/explore", + "action":"addToProject", + "addToProject":{ + "url":"https://github.com/orgs/grafana/projects/54" + } + }, + { + "type":"label", + "name":"oss-user-essentials", + "action":"removeFromProject", + "removeFromProject":{ + "url":"https://github.com/orgs/grafana/projects/78" + } + }, + { + "type":"label", + "name":"oss-user-essentials", + "action":"removeFromProject", + "removeFromProject":{ + "url":"https://github.com/grafana/grafana/projects/33" + } } ] diff --git a/.github/pr-checks.json b/.github/pr-checks.json new file mode 100644 index 00000000000..de313e7b313 --- /dev/null +++ b/.github/pr-checks.json @@ -0,0 +1,18 @@ +[ + { + "type": "check-milestone", + "title": "Milestone Check", + "targetUrl": "https://github.com/grafana/grafana/blob/main/contribute/merge-pull-request.md#assign-a-milestone", + "success": "Milestone set", + "failure": "Milestone not set" + }, + { + "type": "check-backport", + "title": "Backport Check", + "backportEnabled": "Backport enabled", + "backportSkipped": "Backport skipped", + "failure": "Backport decision needed", + "targetUrl": "https://github.com/grafana/grafana/blob/main/contribute/merge-pull-request.md#should-the-pull-request-be-backported", + "skipLabels": [ "backport", "no-backport"] + } +] \ No newline at end of file diff --git a/.github/pr-commands.json b/.github/pr-commands.json index 6c5b9687410..86532bdab6c 100644 --- a/.github/pr-commands.json +++ b/.github/pr-commands.json @@ -183,6 +183,7 @@ "type": "author", "name": "pr/external", "notMemberOf": { "org": "grafana" }, + "ignoreList": ["renovate[bot]"], "action": "updateLabel", "addLabel": "pr/external" } diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 8886041e644..faeff874218 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -4,22 +4,35 @@ ], "enabledManagers": ["npm"], "ignoreDeps": [ + "@types/systemjs", + "@types/d3-force", // we should bump this once we move to esm modules + "@types/d3-interpolate", // we should bump this once we move to esm modules + "@types/d3-scale-chromatic", // we should bump this once we move to esm modules + "@types/react-icons", // jaeger-ui-components is being refactored to use @grafana/ui icons instead "d3", - "husky", + "d3-force", // we should bump this once we move to esm modules + "d3-interpolate", // we should bump this once we move to esm modules + "d3-scale-chromatic", // we should bump this once we move to esm modules + "eslint", // wait until `eslint-plugin-react-hooks>4.2.0` is released + "execa", // we should bump this once we move to esm modules + "history", // we should bump this together with react-router-dom + "react-icons", // jaeger-ui-components is being refactored to use @grafana/ui icons instead + "react-router-dom", // we should bump this together with history "slate", "slate-plain-serializer", "systemjs", "ts-loader", // we should remove ts-loader and use babel-loader instead "ora" // we should bump this once we move to esm modules ], - "ignorePaths": ["emails/**", "plugins-bundled/**", "**/mocks/**"], + "ignorePaths": ["packages/grafana-toolkit/package.json", "emails/**", "plugins-bundled/**", "**/mocks/**"], "labels": ["area/frontend", "dependencies"], - "minor": { - "enabled": false - }, - "patch": { - "enabled": false - }, + "packageRules": [ + { + "matchUpdateTypes": ["patch"], + "extends": ["schedule:monthly"], + "groupName": "Monthly patch updates" + } + ], "pin": { "enabled": false }, diff --git a/.github/workflows/bump-version.yml b/.github/workflows/bump-version.yml index 9214e4c5241..bb0f40ea205 100644 --- a/.github/workflows/bump-version.yml +++ b/.github/workflows/bump-version.yml @@ -5,24 +5,49 @@ on: version: required: true default: '7.x.x' + workflow_call: + inputs: + version_call: + description: Needs to match, exactly, the name of a version + required: true + type: string + secrets: + token: + required: true + metricsWriteAPIKey: + required: true jobs: main: runs-on: ubuntu-latest steps: # This is a basic workflow to help you get started with Actions - uses: actions-ecosystem/action-regex-match@v2.0.2 + if: ${{ github.event.inputs.version != '' }} id: regex-match with: text: ${{ github.event.inputs.version }} regex: '^(\d+.\d+).\d+(?:-beta.\d+)?$' - + - uses: actions-ecosystem/action-regex-match@v2.0.2 + if: ${{ inputs.version_call != '' }} + id: regex-match-version-call + with: + text: ${{ inputs.version_call }} + regex: '^(\d+.\d+).\d+(?:-beta\d+)?$' - name: Validate input version - if: ${{ steps.regex-match.outputs.match == '' }} + if: ${{ steps.regex-match.outputs.match == '' && github.event.inputs.version != '' }} run: | echo "The input version format is not correct, please respect:\ major.minor.patch or major.minor.patch-beta.number format. \ example: 7.4.3 or 7.4.3-beta.1" exit 1 + - name: Validate input version call + if: ${{ inputs.version_call != '' && steps.regex-match-version-call.outputs.match == '' }} + run: | + echo "The input version format is not correct, please respect:\ + major.minor.patch or major.minor.patch-beta format. \ + example: 7.4.3 or 7.4.3-beta1" + exit 1 + - uses: actions/checkout@v2 - name: Set intermedia variables @@ -34,13 +59,13 @@ jobs: echo "::set-output name=branch_exist::$(git ls-remote --heads https://github.com/grafana/grafana.git v${{ steps.regex-match.outputs.group1 }}.x | wc -l)" - name: Check input version is aligned with branch(not main) - if: steps.intermedia.outputs.branch_exist != '0' && !contains(steps.intermedia.outputs.short_ref, steps.intermedia.outputs.branch_name) + if: ${{ github.event.inputs.version != '' && steps.intermedia.outputs.branch_exist != '0' && !contains(steps.intermedia.outputs.short_ref, steps.intermedia.outputs.branch_name) }} run: | echo " You need to run the workflow on branch v${{steps.regex-match.outputs.group1}}.x exit 1 - name: Check input version is aligned with branch(main) - if: steps.intermedia.outputs.branch_exist == '0' && !contains(steps.intermedia.outputs.short_ref, 'main') + if: ${{ github.event.inputs.version != '' && steps.intermedia.outputs.branch_exist == '0' && !contains(steps.intermedia.outputs.short_ref, 'main') }} run: | echo "When you want to deliver a new new minor version, you might want to create a new branch first \ with naming convention v[major].[minor].x, and just run the workflow on that branch. \ @@ -53,13 +78,21 @@ jobs: repository: "grafana/grafana-github-actions" path: ./actions ref: main - - uses: actions/setup-node@v2.4.1 + - uses: actions/setup-node@v2.5.1 with: node-version: '14' - name: Install Actions run: npm install --production --prefix ./actions - - name: Run bump version + - name: Run bump version (manually invoked) + if: ${{ github.event.inputs.version != '' }} uses: ./actions/bump-version with: - token: ${{secrets.GH_BOT_ACCESS_TOKEN}} - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} + - name: Run bump version (workflow invoked) + if: ${{ inputs.version_call != '' }} + uses: ./actions/bump-version + with: + version_call: ${{ inputs.version_call }} + token: ${{ secrets.token }} + metricsWriteAPIKey: ${{ secrets.metricsWriteAPIKey }} diff --git a/.github/workflows/close-milestone.yml b/.github/workflows/close-milestone.yml new file mode 100644 index 00000000000..a495eab7a8b --- /dev/null +++ b/.github/workflows/close-milestone.yml @@ -0,0 +1,39 @@ +name: Close milestone +on: + workflow_dispatch: + inputs: + version: + required: true + description: Needs to match, exactly, the name of a milestone + workflow_call: + inputs: + version_call: + description: Needs to match, exactly, the name of a milestone + required: true + type: string + secrets: + token: + required: true +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: "grafana/grafana-github-actions" + path: ./actions + ref: main + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Close milestone (manually invoked) + if: ${{ github.event.inputs.version != '' }} + uses: ./actions/close-milestone + with: + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + - name: Close milestone (workflow invoked) + if: ${{ inputs.version_call != '' }} + uses: ./actions/close-milestone + with: + version_call: ${{ inputs.version_call }} + token: ${{ secrets.token }} diff --git a/.github/workflows/commands.yml b/.github/workflows/commands.yml index 91af6976fbf..969c4869134 100644 --- a/.github/workflows/commands.yml +++ b/.github/workflows/commands.yml @@ -1,7 +1,7 @@ name: Run commands when issues are labeled or comments added on: issues: - types: [labeled] + types: [labeled, unlabeled] issue_comment: types: [created] diff --git a/.github/workflows/detect-breaking-changes-build.yml b/.github/workflows/detect-breaking-changes-build.yml new file mode 100644 index 00000000000..33e9f66519b --- /dev/null +++ b/.github/workflows/detect-breaking-changes-build.yml @@ -0,0 +1,54 @@ +name: Levitate / Detect breaking changes + +on: pull_request + +jobs: + build: + name: Detect + runs-on: ubuntu-latest + env: + GITHUB_STEP_NUMBER: 7 + + steps: + - uses: actions/checkout@v2 + + - name: Setup environment + uses: actions/setup-node@v2.5.1 + with: + node-version: '16' + + - name: Get link for the Github Action job + id: job + uses: actions/github-script@v5 + with: + script: | + const script = require('./.github/workflows/scripts/pr-get-job-link.js') + await script({github, context, core}) + + - name: Install dependencies + run: yarn install --immutable + + - name: Build packages + run: yarn packages:build + + - name: Detect breaking changes + id: breaking-changes + run: ./scripts/check-breaking-changes.sh + env: + FORCE_COLOR: 3 + GITHUB_JOB_LINK: ${{ steps.job.outputs.link }} + + - name: Persisting the check output + run: | + mkdir -p ./levitate + echo "{ \"exit_code\": ${{ steps.breaking-changes.outputs.is_breaking }}, \"message\": \"${{ steps.breaking-changes.outputs.message }}\", \"job_link\": \"${{ steps.job.outputs.link }}#step:${GITHUB_STEP_NUMBER}:1\" }" > ./levitate/result.json + + - name: Upload check output as artifact + uses: actions/upload-artifact@v2 + with: + name: levitate + path: levitate/ + + - name: Exit + run: exit ${{ steps.breaking-changes.outputs.is_breaking }} + shell: bash diff --git a/.github/workflows/detect-breaking-changes-report.yml b/.github/workflows/detect-breaking-changes-report.yml new file mode 100644 index 00000000000..94a64eb5aeb --- /dev/null +++ b/.github/workflows/detect-breaking-changes-report.yml @@ -0,0 +1,163 @@ +name: Levitate / Report breaking changes + +on: + workflow_run: + workflows: ["Levitate / Detect breaking changes"] + types: [completed] + +jobs: + notify: + name: Report + runs-on: ubuntu-latest + env: + ARTIFACT_FOLDER: '${{ github.workspace }}/tmp' + ARTIFACT_NAME: 'levitate' + + steps: + - uses: actions/checkout@v2 + + - name: 'Download artifact' + uses: actions/github-script@v5 + env: + RUN_ID: ${{ github.event.workflow_run.id }} + with: + script: | + const fs = require('fs'); + + const { owner, repo } = context.repo; + const runId = process.env.RUN_ID; + const artifactName = process.env.ARTIFACT_NAME; + const artifactFolder = process.env.ARTIFACT_FOLDER; + const artifacts = await github.rest.actions.listWorkflowRunArtifacts({ + owner, + repo, + run_id: runId, + }); + const artifact = artifacts.data.artifacts.find(a => a.name === artifactName); + + if (!artifact) { + throw new Error(`Could not find artifact ${ artifactName } in workflow (${ runId })`); + } + + const download = await github.rest.actions.downloadArtifact({ + owner, + repo, + artifact_id: artifact.id, + archive_format: 'zip', + }); + + fs.mkdirSync(artifactFolder, { recursive: true }); + fs.writeFileSync(`${ artifactFolder }/${ artifactName }.zip`, Buffer.from(download.data)); + + - name: Unzip artifact + run: unzip "${ARTIFACT_FOLDER}/${ARTIFACT_NAME}.zip" -d "${ARTIFACT_FOLDER}" + + - name: Parsing levitate result + uses: actions/github-script@v5 + id: levitate-run + with: + script: | + const filePath = `${ process.env.ARTIFACT_FOLDER }/result.json`; + const script = require('./.github/workflows/scripts/json-file-to-job-output.js'); + await script({ core, filePath }); + + - name: Check if "breaking change" label exists + id: does-label-exist + uses: actions/github-script@v5 + env: + PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }} + with: + script: | + const { data } = await github.rest.issues.listLabelsOnIssue({ + issue_number: process.env.PR_NUMBER, + owner: context.repo.owner, + repo: context.repo.repo, + }); + const labels = data.map(({ name }) => name); + const doesExist = labels.includes('breaking change'); + + return doesExist ? 1 : 0; + + - name: Comment on PR + if: ${{ steps.levitate-run.outputs.exit_code == 1 }} + uses: marocchino/sticky-pull-request-comment@v2 + with: + number: ${{ github.event.workflow_run.pull_requests[0].number }} + message: | + ⚠️   **Possible breaking changes** + + _(Open the links below in a new tab to go to the correct steps)_ + + ${{ steps.levitate-run.outputs.message }} + + [Check console output](${{ steps.levitate-run.outputs.job_link }}) + + - name: Remove comment on PR + if: ${{ steps.levitate-run.outputs.exit_code == 0 }} + uses: marocchino/sticky-pull-request-comment@v2 + with: + number: ${{ github.event.workflow_run.pull_requests[0].number }} + delete: true + + + - name: Add "breaking change" label + if: ${{ steps.levitate-run.outputs.exit_code == 1 && steps.does-label-exist.outputs.result == 0 }} + uses: actions/github-script@v5 + env: + PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }} + with: + script: | + await github.rest.issues.addLabels({ + issue_number: process.env.PR_NUMBER, + owner: context.repo.owner, + repo: context.repo.repo, + labels: ['breaking change'] + }) + + - name: Remove "breaking change" label + if: ${{ steps.levitate-run.outputs.exit_code == 0 && steps.does-label-exist.outputs.result == 1 }} + uses: actions/github-script@v5 + env: + PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }} + with: + script: | + await github.rest.issues.removeLabel({ + issue_number: process.env.PR_NUMBER, + owner: context.repo.owner, + repo: context.repo.repo, + name: 'breaking change' + }) + + # This is very weird, the actual request goes through (comes back with a 201), but does not assign the team. + # Related issue: https://github.com/renovatebot/renovate/issues/1908 + - name: Add "grafana/plugins-platform-frontend" as a reviewer + if: ${{ steps.levitate-run.outputs.exit_code == 1 }} + uses: actions/github-script@v5 + env: + PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }} + with: + script: | + await github.rest.pulls.requestReviewers({ + pull_number: process.env.PR_NUMBER, + owner: context.repo.owner, + repo: context.repo.repo, + reviewers: [], + team_reviewers: ['grafana/plugins-platform-frontend'] + }); + + - name: Remove "grafana/plugins-platform-frontend" from the list of reviewers + if: ${{ steps.levitate-run.outputs.exit_code == 0 }} + uses: actions/github-script@v5 + env: + PR_NUMBER: ${{ github.event.workflow_run.pull_requests[0].number }} + with: + script: | + await github.rest.pulls.removeRequestedReviewers({ + pull_number: process.env.PR_NUMBER, + owner: context.repo.owner, + repo: context.repo.repo, + reviewers: [], + team_reviewers: ['grafana/plugins-platform-frontend'] + }); + + diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml new file mode 100644 index 00000000000..69252f7167a --- /dev/null +++ b/.github/workflows/pr-checks.yml @@ -0,0 +1,30 @@ +name: PR Checks +on: + pull_request_target: + types: + - opened + - synchronize + - labeled + - unlabeled + issues: + types: + - milestoned + - demilestoned + +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: "grafana/grafana-github-actions" + path: ./actions + ref: main + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Run PR Checks + uses: ./actions/pr-checks + with: + token: ${{secrets.GITHUB_TOKEN}} + configPath: pr-checks diff --git a/.github/workflows/pr-commands-closed.yml b/.github/workflows/pr-commands-closed.yml new file mode 100644 index 00000000000..bc179127c0b --- /dev/null +++ b/.github/workflows/pr-commands-closed.yml @@ -0,0 +1,17 @@ +name: Run when PRs are closed +on: + pull_request: + types: + - closed + +jobs: + close_job: + # this job will only run if the PR has been closed without being merged + if: github.event.pull_request.merged == false + runs-on: ubuntu-latest + steps: + - run: | + echo PR #${{ github.event.number }} has been closed without being merged, removing milestone. + gh pr edit ${{ github.event.number }} --milestone "" --repo $GITHUB_REPOSITORY + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/prepare-release.yml b/.github/workflows/prepare-release.yml new file mode 100644 index 00000000000..ed4c15a2076 --- /dev/null +++ b/.github/workflows/prepare-release.yml @@ -0,0 +1,37 @@ +name: Prepare release +on: + workflow_dispatch: + inputs: + version_input: + description: 'The version to be released please respect: major.minor.patch or major.minor.patch-beta format. example: 7.4.3 or 7.4.3-beta1' + required: true +jobs: + call-remove-milestone: + uses: grafana/grafana/.github/workflows/remove-milestone.yml@main + with: + version_call: ${{ github.event.inputs.version_input }} + secrets: + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + call-close-milestone: + uses: grafana/grafana/.github/workflows/close-milestone.yml@main + with: + version_call: ${{ github.event.inputs.version_input }} + secrets: + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + needs: call-remove-milestone + call-bump-version: + uses: grafana/grafana/.github/workflows/bump-version.yml@main + with: + version_call: ${{ github.event.inputs.version_input }} + secrets: + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} + needs: call-close-milestone + call-update-changelog: + uses: grafana/grafana/.github/workflows/update-changelog.yml@main + with: + version_call: ${{ github.event.inputs.version_input }} + secrets: + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} + needs: call-bump-version diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 1bf64485e25..848c10e8755 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -17,14 +17,14 @@ jobs: - uses: actions/checkout@v1 - run: git clone --single-branch --no-tags --depth 1 -b master https://grafanabot:${{ secrets.GH_BOT_ACCESS_TOKEN }}@github.com/grafana/website-sync ./.github/actions/website-sync - name: generate-packages-docs - uses: actions/setup-node@v2.4.1 + uses: actions/setup-node@v2.5.1 id: generate-docs with: node-version: '14' - name: Get yarn cache directory path id: yarn-cache-dir-path run: echo "::set-output name=dir::$(yarn config get cacheFolder)" - - uses: actions/cache@v2.1.6 + - uses: actions/cache@v2.1.7 with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} key: yarn-${{ hashFiles('**/yarn.lock') }} diff --git a/.github/workflows/remove-milestone.yml b/.github/workflows/remove-milestone.yml new file mode 100644 index 00000000000..ac2504a45f8 --- /dev/null +++ b/.github/workflows/remove-milestone.yml @@ -0,0 +1,39 @@ +name: Remove milestone +on: + workflow_dispatch: + inputs: + version: + required: true + description: Needs to match, exactly, the name of a milestone + workflow_call: + inputs: + version_call: + description: Needs to match, exactly, the name of a milestone + required: true + type: string + secrets: + token: + required: true +jobs: + main: + runs-on: ubuntu-latest + steps: + - name: Checkout Actions + uses: actions/checkout@v2 + with: + repository: "grafana/grafana-github-actions" + path: ./actions + ref: main + - name: Install Actions + run: npm install --production --prefix ./actions + - name: Remove milestone from open issues (manually invoked) + if: ${{ github.event.inputs.version != '' }} + uses: ./actions/remove-milestone + with: + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + - name: Remove milestone from open issues (workflow invoked) + if: ${{ inputs.version_call != '' }} + uses: ./actions/remove-milestone + with: + version_call: ${{ inputs.version_call }} + token: ${{ secrets.token }} diff --git a/.github/workflows/scripts/json-file-to-job-output.js b/.github/workflows/scripts/json-file-to-job-output.js new file mode 100644 index 00000000000..0f6dd1e65ff --- /dev/null +++ b/.github/workflows/scripts/json-file-to-job-output.js @@ -0,0 +1,27 @@ +module.exports = async ({ core, filePath }) => { + try { + const fs = require('fs'); + const content = await readFile(fs, filePath); + const result = JSON.parse(content); + + core.startGroup('Parsing json file...'); + + for (const property in result) { + core.info(`${property} <- ${result[property]}`); + core.setOutput(property, result[property]); + } + + core.endGroup(); + } catch (error) { + core.restFailed(error.message); + } +} + +async function readFile(fs, path) { + return new Promise((resolve, reject) => { + fs.readFile(path, (error, data) => { + if (error) return reject(error); + return resolve(data); + }); + }); +} \ No newline at end of file diff --git a/.github/workflows/scripts/pr-get-job-link.js b/.github/workflows/scripts/pr-get-job-link.js new file mode 100644 index 00000000000..a4e6bc2f645 --- /dev/null +++ b/.github/workflows/scripts/pr-get-job-link.js @@ -0,0 +1,9 @@ + +module.exports = async ({ github, context, core }) => { + const { owner, repo } = context.repo; + const url = `https://api.github.com/repos/${owner}/${repo}/actions/runs/${context.runId}/jobs` + const result = await github.request(url) + const link = `https://github.com/grafana/grafana/runs/${result.data.jobs[0].id}?check_suite_focus=true`; + + core.setOutput('link', link); +} \ No newline at end of file diff --git a/.github/workflows/update-changelog.yml b/.github/workflows/update-changelog.yml index ecc7ff92015..9ea0da2388e 100644 --- a/.github/workflows/update-changelog.yml +++ b/.github/workflows/update-changelog.yml @@ -3,8 +3,19 @@ on: workflow_dispatch: inputs: version: - required: true + required: true description: Needs to match, exactly, the name of a milestone + workflow_call: + inputs: + version_call: + description: Needs to match, exactly, the name of a milestone + required: true + type: string + secrets: + token: + required: true + metricsWriteAPIKey: + required: true jobs: main: runs-on: ubuntu-latest @@ -14,11 +25,19 @@ jobs: with: repository: "grafana/grafana-github-actions" path: ./actions - ref: main + ref: main - name: Install Actions run: npm install --production --prefix ./actions - - name: Run update changelog + - name: Run update changelog (manually invoked) + if: ${{ github.event.inputs.version != '' }} uses: ./actions/update-changelog with: - token: ${{secrets.GH_BOT_ACCESS_TOKEN}} - metricsWriteAPIKey: ${{secrets.GRAFANA_MISC_STATS_API_KEY}} + token: ${{ secrets.GH_BOT_ACCESS_TOKEN }} + metricsWriteAPIKey: ${{ secrets.GRAFANA_MISC_STATS_API_KEY }} + - name: Run update changelog (workflow invoked) + if: ${{ inputs.version_call != '' }} + uses: ./actions/update-changelog + with: + version_call: ${{ inputs.version_call }} + token: ${{ secrets.token }} + metricsWriteAPIKey: ${{ secrets.metricsWriteAPIKey }} diff --git a/.gitignore b/.gitignore index b0f2c0dc90a..3201f07be2a 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ awsconfig /.awcache /dist /public/build +public/dist/tsconfig.tsbuildinfo /public/views/index.html /public/views/error.html /emails/dist @@ -87,6 +88,7 @@ profile.cov /pkg/cmd/grafana-server/debug /pkg/extensions/* /pkg/server/wireexts_enterprise.go +/pkg/cmd/grafana-cli/runner/wireexts_enterprise.go !/pkg/extensions/main.go /public/app/extensions debug.test @@ -134,6 +136,8 @@ compilation-stats.json /e2e/**/screenshots !/e2e/**/screenshots/expected/* /e2e/**/videos/* +/e2e/benchmarks/**/results/* +/e2e/benchmarks/**/results # a11y tests /pa11y-ci-results.json @@ -147,3 +151,10 @@ compilation-stats.json # auto generated Go files *_gen.go + +# Auto-generated localisation files +public/locales/_build/ +public/locales/**/*.js + +deployment_tools_config.json + diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000000..aad24318db4 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +yarn run precommit diff --git a/.linguirc b/.linguirc new file mode 100644 index 00000000000..383d2faee3b --- /dev/null +++ b/.linguirc @@ -0,0 +1,27 @@ +{ + "locales": [ + "en", + "fr", + "es" + ], + "catalogs": [ + { + "path": "public/locales/{locale}/messages", + "include": [ + "public/app" + ], + "exclude": [ + "**/node_modules/**", + "public/app/plugins" + ] + } + ], + "fallbackLocales": { + "default": "en" + }, + "sourceLocale": "en", + "format": "po", + "formatOptions": { + "lineNumbers": false + } +} diff --git a/.pa11yci-pr.conf.js b/.pa11yci-pr.conf.js index 160107b4a31..dc01c7857c2 100644 --- a/.pa11yci-pr.conf.js +++ b/.pa11yci-pr.conf.js @@ -6,6 +6,9 @@ var config = { chromeLaunchConfig: { args: ['--no-sandbox'], }, + // see https://github.com/grafana/grafana/pull/41693#issuecomment-979921463 for context + // on why we're ignoring singleValue/react-select-*-placeholder elements + hideElements: '#updateVersion, [class*="-singleValue"], [id^="react-select-"][id$="-placeholder"]', }, urls: [ @@ -13,6 +16,7 @@ var config = { url: '${HOST}/login', wait: 500, rootElement: '.main-view', + threshold: 12, }, { url: '${HOST}/login', @@ -24,37 +28,39 @@ var config = { "click element button[aria-label='Login button']", "wait for element [aria-label='Skip change password button'] to be visible", ], - threshold: 1, + threshold: 13, rootElement: '.main-view', }, { url: '${HOST}/?orgId=1', wait: 500, - threshold: 7, + threshold: 0, }, { url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge', wait: 500, rootElement: '.main-view', - threshold: 2, + threshold: 0, }, { url: '${HOST}/d/O6f11TZWk/panel-tests-bar-gauge?orgId=1&editview=settings', wait: 500, rootElement: '.main-view', - threshold: 10, + threshold: 0, }, { url: '${HOST}/?orgId=1&search=open', wait: 500, rootElement: '.main-view', - threshold: 14, + threshold: 0, }, { url: '${HOST}/alerting/list', wait: 500, rootElement: '.main-view', - threshold: 6, + // the unified alerting promotion alert's content contrast is too low + // see https://github.com/grafana/grafana/pull/41829 + threshold: 5, }, { url: '${HOST}/datasources', @@ -66,13 +72,13 @@ var config = { url: '${HOST}/org/users', wait: 500, rootElement: '.main-view', - threshold: 3, + threshold: 0, }, { url: '${HOST}/org/teams', wait: 500, rootElement: '.main-view', - threshold: 1, + threshold: 0, }, { url: '${HOST}/plugins', @@ -84,19 +90,19 @@ var config = { url: '${HOST}/org', wait: 500, rootElement: '.main-view', - threshold: 2, + threshold: 0, }, { url: '${HOST}/org/apikeys', wait: 500, rootElement: '.main-view', - threshold: 3, + threshold: 0, }, { url: '${HOST}/dashboards', wait: 500, rootElement: '.main-view', - threshold: 7, + threshold: 0, }, ], }; diff --git a/.pa11yci.conf.js b/.pa11yci.conf.js index 6b872fcf390..b2fbf4274f7 100644 --- a/.pa11yci.conf.js +++ b/.pa11yci.conf.js @@ -6,6 +6,9 @@ var config = { chromeLaunchConfig: { args: ['--no-sandbox'], }, + // see https://github.com/grafana/grafana/pull/41693#issuecomment-979921463 for context + // on why we're ignoring singleValue/react-select-*-placeholder elements + hideElements: '#updateVersion, [class*="-singleValue"], [id^="react-select-"][id$="-placeholder"]', }, urls: [ diff --git a/.vim/coc-settings.json b/.vim/coc-settings.json new file mode 100644 index 00000000000..28b790db66e --- /dev/null +++ b/.vim/coc-settings.json @@ -0,0 +1,6 @@ +{ + "eslint.packageManager": "yarn", + "eslint.nodePath": ".yarn/sdks", + "workspace.workspaceFolderCheckCwd": false, + "tsserver.tsdk": ".yarn/sdks/typescript/lib" +} diff --git a/.yarn/cache/pa11y-ci-https-1e9675e9e1-668c9119bd.zip b/.yarn/cache/pa11y-ci-https-1e9675e9e1-668c9119bd.zip deleted file mode 100644 index c2b3415857f..00000000000 Binary files a/.yarn/cache/pa11y-ci-https-1e9675e9e1-668c9119bd.zip and /dev/null differ diff --git a/.yarn/releases/yarn-3.1.0-rc.5.cjs b/.yarn/releases/yarn-3.1.0-rc.5.cjs deleted file mode 100755 index 41dc29584d9..00000000000 --- a/.yarn/releases/yarn-3.1.0-rc.5.cjs +++ /dev/null @@ -1,632 +0,0 @@ -#!/usr/bin/env node -/* eslint-disable */ -//prettier-ignore -(()=>{var Pae=Object.create,mg=Object.defineProperty,Fae=Object.defineProperties,Rae=Object.getOwnPropertyDescriptor,Nae=Object.getOwnPropertyDescriptors,Mae=Object.getOwnPropertyNames,DC=Object.getOwnPropertySymbols,Lae=Object.getPrototypeOf,Sw=Object.prototype.hasOwnProperty,XN=Object.prototype.propertyIsEnumerable;var ZN=(t,e,r)=>e in t?mg(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,v=(t,e)=>{for(var r in e||(e={}))Sw.call(e,r)&&ZN(t,r,e[r]);if(DC)for(var r of DC(e))XN.call(e,r)&&ZN(t,r,e[r]);return t},W=(t,e)=>Fae(t,Nae(e)),Tae=t=>mg(t,"__esModule",{value:!0});var Kr=(t,e)=>{var r={};for(var i in t)Sw.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&DC)for(var i of DC(t))e.indexOf(i)<0&&XN.call(t,i)&&(r[i]=t[i]);return r},Oae=(t,e)=>()=>(t&&(e=t(t=0)),e),C=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),$e=(t,e)=>{for(var r in e)mg(t,r,{get:e[r],enumerable:!0})},Kae=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Mae(e))!Sw.call(t,i)&&i!=="default"&&mg(t,i,{get:()=>e[i],enumerable:!(r=Rae(e,i))||r.enumerable});return t},ne=t=>Kae(Tae(mg(t!=null?Pae(Lae(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var QM=C(($We,EM)=>{EM.exports=yM;yM.sync=rAe;var BM=require("fs");function iAe(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var i=0;i{bM.exports=DM;DM.sync=nAe;var SM=require("fs");function DM(t,e,r){SM.stat(t,function(i,n){r(i,i?!1:xM(n,e))})}function nAe(t,e){return xM(SM.statSync(t),e)}function xM(t,e){return t.isFile()&&sAe(t,e)}function sAe(t,e){var r=t.mode,i=t.uid,n=t.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=r&c||r&l&&n===o||r&a&&i===s||r&u&&s===0;return g}});var PM=C((rze,vM)=>{var tze=require("fs"),UC;process.platform==="win32"||global.TESTING_WINDOWS?UC=QM():UC=kM();vM.exports=Yw;Yw.sync=oAe;function Yw(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){Yw(t,e||{},function(s,o){s?n(s):i(o)})})}UC(t,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),r(i,n)})}function oAe(t,e){try{return UC.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var OM=C((ize,FM)=>{var Rl=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",RM=require("path"),aAe=Rl?";":":",NM=PM(),MM=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),LM=(t,e)=>{let r=e.colon||aAe,i=t.match(/\//)||Rl&&t.match(/\\/)?[""]:[...Rl?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=Rl?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=Rl?n.split(r):[""];return Rl&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},TM=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=LM(t,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(MM(t));let h=i[c],f=/^".*"$/.test(h)?h.slice(1,-1):h,p=RM.join(f,t),m=!f&&/^\.[\\\/]/.test(t)?t.slice(0,2)+p:p;u(l(m,c,0))}),l=(c,u,g)=>new Promise((h,f)=>{if(g===n.length)return h(a(u+1));let p=n[g];NM(c+p,{pathExt:s},(m,I)=>{if(!m&&I)if(e.all)o.push(c+p);else return h(c+p);return h(l(c,u,g+1))})});return r?a(0).then(c=>r(null,c),r):a(0)},AAe=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:i,pathExtExe:n}=LM(t,e),s=[];for(let o=0;o{"use strict";var KM=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};qw.exports=KM;qw.exports.default=KM});var qM=C((sze,HM)=>{"use strict";var GM=require("path"),lAe=OM(),cAe=UM();function YM(t,e){let r=t.options.env||process.env,i=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch(a){}let o;try{o=lAe.sync(t.command,{path:r[cAe({env:r})],pathExt:e?GM.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=GM.resolve(n?t.options.cwd:"",o)),o}function uAe(t){return YM(t)||YM(t,!0)}HM.exports=uAe});var jM=C((oze,jw)=>{"use strict";var Jw=/([()\][%!^"`<>&|;, *?])/g;function gAe(t){return t=t.replace(Jw,"^$1"),t}function hAe(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(Jw,"^$1"),e&&(t=t.replace(Jw,"^$1")),t}jw.exports.command=gAe;jw.exports.argument=hAe});var WM=C((aze,JM)=>{"use strict";JM.exports=/^#!(.*)/});var VM=C((Aze,zM)=>{"use strict";var fAe=WM();zM.exports=(t="")=>{let e=t.match(fAe);if(!e)return null;let[r,i]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var ZM=C((lze,XM)=>{"use strict";var Ww=require("fs"),pAe=VM();function dAe(t){let e=150,r=Buffer.alloc(e),i;try{i=Ww.openSync(t,"r"),Ww.readSync(i,r,0,e,0),Ww.closeSync(i)}catch(n){}return pAe(r.toString())}XM.exports=dAe});var tL=C((cze,_M)=>{"use strict";var CAe=require("path"),$M=qM(),eL=jM(),mAe=ZM(),IAe=process.platform==="win32",EAe=/\.(?:com|exe)$/i,yAe=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function BAe(t){t.file=$M(t);let e=t.file&&mAe(t.file);return e?(t.args.unshift(t.file),t.command=e,$M(t)):t.file}function wAe(t){if(!IAe)return t;let e=BAe(t),r=!EAe.test(e);if(t.options.forceShell||r){let i=yAe.test(e);t.command=CAe.normalize(t.command),t.command=eL.command(t.command),t.args=t.args.map(s=>eL.argument(s,i));let n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function QAe(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let i={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?i:wAe(i)}_M.exports=QAe});var nL=C((uze,rL)=>{"use strict";var zw=process.platform==="win32";function Vw(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function bAe(t,e){if(!zw)return;let r=t.emit;t.emit=function(i,n){if(i==="exit"){let s=iL(n,e,"spawn");if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function iL(t,e){return zw&&t===1&&!e.file?Vw(e.original,"spawn"):null}function DAe(t,e){return zw&&t===1&&!e.file?Vw(e.original,"spawnSync"):null}rL.exports={hookChildProcess:bAe,verifyENOENT:iL,verifyENOENTSync:DAe,notFoundError:Vw}});var _w=C((gze,Nl)=>{"use strict";var sL=require("child_process"),Xw=tL(),Zw=nL();function oL(t,e,r){let i=Xw(t,e,r),n=sL.spawn(i.command,i.args,i.options);return Zw.hookChildProcess(n,i),n}function SAe(t,e,r){let i=Xw(t,e,r),n=sL.spawnSync(i.command,i.args,i.options);return n.error=n.error||Zw.verifyENOENTSync(n.status,i),n}Nl.exports=oL;Nl.exports.spawn=oL;Nl.exports.sync=SAe;Nl.exports._parse=Xw;Nl.exports._enoent=Zw});var AL=C((Cze,aL)=>{"use strict";aL.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var aQ=C((mze,lL)=>{var Mg=AL(),cL={};for(let t of Object.keys(Mg))cL[Mg[t]]=t;var We={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};lL.exports=We;for(let t of Object.keys(We)){if(!("channels"in We[t]))throw new Error("missing channels property: "+t);if(!("labels"in We[t]))throw new Error("missing channel labels property: "+t);if(We[t].labels.length!==We[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=We[t];delete We[t].channels,delete We[t].labels,Object.defineProperty(We[t],"channels",{value:e}),Object.defineProperty(We[t],"labels",{value:r})}We.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(e,r,i),s=Math.max(e,r,i),o=s-n,a,l;s===n?a=0:e===s?a=(r-i)/o:r===s?a=2+(i-e)/o:i===s&&(a=4+(e-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};We.rgb.hsv=function(t){let e,r,i,n,s,o=t[0]/255,a=t[1]/255,l=t[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(h){return(c-h)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),r=g(a),i=g(l),o===c?n=i-r:a===c?n=1/3+e-i:l===c&&(n=2/3+r-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};We.rgb.hwb=function(t){let e=t[0],r=t[1],i=t[2],n=We.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(r,i));return i=1-1/255*Math.max(e,Math.max(r,i)),[n,s*100,i*100]};We.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(1-e,1-r,1-i),s=(1-e-n)/(1-n)||0,o=(1-r-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function vAe(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}We.rgb.keyword=function(t){let e=cL[t];if(e)return e;let r=Infinity,i;for(let n of Object.keys(Mg)){let s=Mg[n],o=vAe(t,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+r*.3576+i*.1805,s=e*.2126+r*.7152+i*.0722,o=e*.0193+r*.1192+i*.9505;return[n*100,s*100,o*100]};We.rgb.lab=function(t){let e=We.rgb.xyz(t),r=e[0],i=e[1],n=e[2];r/=95.047,i/=100,n/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(r-i),a=200*(i-n);return[s,o,a]};We.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n,s,o;if(r===0)return o=i*255,[o,o,o];i<.5?n=i*(1+r):n=i+r-i*r;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};We.hsl.hsv=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=r,s=Math.max(i,.01);i*=2,r*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+r)/2,a=i===0?2*n/(s+n):2*r/(i+r);return[e,a*100,o*100]};We.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-r),a=255*i*(1-r*s),l=255*i*(1-r*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};We.hsv.hsl=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=Math.max(i,.01),s,o;o=(2-r)*i;let a=(2-r)*n;return s=r*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};We.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n=r+i,s;n>1&&(r/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=r+s*(a-r),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=r;break;case 1:c=l,u=a,g=r;break;case 2:c=r,u=a,g=l;break;case 3:c=r,u=l,g=a;break;case 4:c=l,u=r,g=a;break;case 5:c=a,u=r,g=l;break}return[c*255,u*255,g*255]};We.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n=t[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,r*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};We.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n,s,o;return n=e*3.2406+r*-1.5372+i*-.4986,s=e*-.9689+r*1.8758+i*.0415,o=e*.0557+r*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};We.xyz.lab=function(t){let e=t[0],r=t[1],i=t[2];e/=95.047,r/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*r-16,s=500*(e-r),o=200*(r-i);return[n,s,o]};We.lab.xyz=function(t){let e=t[0],r=t[1],i=t[2],n,s,o;s=(e+16)/116,n=r/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};We.lab.lch=function(t){let e=t[0],r=t[1],i=t[2],n;n=Math.atan2(i,r)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(r*r+i*i);return[e,o,n]};We.lch.lab=function(t){let e=t[0],r=t[1],n=t[2]/360*2*Math.PI,s=r*Math.cos(n),o=r*Math.sin(n);return[e,s,o]};We.rgb.ansi16=function(t,e=null){let[r,i,n]=t,s=e===null?We.rgb.hsv(t)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};We.hsv.ansi16=function(t){return We.rgb.ansi16(We.hsv.rgb(t),t[2])};We.rgb.ansi256=function(t){let e=t[0],r=t[1],i=t[2];return e===r&&r===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(i/255*5)};We.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,i=(e&1)*r*255,n=(e>>1&1)*r*255,s=(e>>2&1)*r*255;return[i,n,s]};We.ansi256.rgb=function(t){if(t>=232){let s=(t-232)*10+8;return[s,s,s]}t-=16;let e,r=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,n=e%6/5*255;return[r,i,n]};We.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};We.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let i=parseInt(r,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};We.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.max(Math.max(e,r),i),s=Math.min(Math.min(e,r),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(r-i)/o%6:n===r?l=2+(i-e)/o:l=4+(e-r)/o,l/=6,l%=1,[l*360,o*100,a*100]};We.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=r<.5?2*e*r:2*e*(1-r),n=0;return i<1&&(n=(r-.5*i)/(1-i)),[t[0],i*100,n*100]};We.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=e*r,n=0;return i<1&&(n=(r-i)/(1-i)),[t[0],i*100,n*100]};We.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100;if(r===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-r)*i,[(r*n[0]+l)*255,(r*n[1]+l)*255,(r*n[2]+l)*255]};We.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e),n=0;return i>0&&(n=e/i),[t[0],n*100,i*100]};We.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[t[0],n*100,i*100]};We.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e);return[t[0],(i-e)*100,(1-i)*100]};We.hwb.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=1-r,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[t[0],n*100,s*100]};We.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};We.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};We.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};We.gray.hsl=function(t){return[0,0,t[0]]};We.gray.hsv=We.gray.hsl;We.gray.hwb=function(t){return[0,100,t[0]]};We.gray.cmyk=function(t){return[0,0,0,t[0]]};We.gray.lab=function(t){return[t[0],0,0]};We.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};We.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var gL=C((Ize,uL)=>{var HC=aQ();function PAe(){let t={},e=Object.keys(HC);for(let r=e.length,i=0;i{var AQ=aQ(),MAe=gL(),Ml={},LAe=Object.keys(AQ);function TAe(t){let e=function(...r){let i=r[0];return i==null?i:(i.length>1&&(r=i),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function OAe(t){let e=function(...r){let i=r[0];if(i==null)return i;i.length>1&&(r=i);let n=t(r);if(typeof n=="object")for(let s=n.length,o=0;o{Ml[t]={},Object.defineProperty(Ml[t],"channels",{value:AQ[t].channels}),Object.defineProperty(Ml[t],"labels",{value:AQ[t].labels});let e=MAe(t);Object.keys(e).forEach(i=>{let n=e[i];Ml[t][i]=OAe(n),Ml[t][i].raw=TAe(n)})});hL.exports=Ml});var EL=C((yze,pL)=>{"use strict";var dL=(t,e)=>(...r)=>`[${t(...r)+e}m`,CL=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};5;${i}m`},mL=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},GC=t=>t,IL=(t,e,r)=>[t,e,r],Ll=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let i=r();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},lQ,Tl=(t,e,r,i)=>{lQ===void 0&&(lQ=fL());let n=i?10:0,s={};for(let[o,a]of Object.entries(lQ)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=t(r,n):typeof a=="object"&&(s[l]=t(a[e],n))}return s};function KAe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],t.set(s[0],s[1]);Object.defineProperty(e,r,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="",e.bgColor.close="",Ll(e.color,"ansi",()=>Tl(dL,"ansi16",GC,!1)),Ll(e.color,"ansi256",()=>Tl(CL,"ansi256",GC,!1)),Ll(e.color,"ansi16m",()=>Tl(mL,"rgb",IL,!1)),Ll(e.bgColor,"ansi",()=>Tl(dL,"ansi16",GC,!0)),Ll(e.bgColor,"ansi256",()=>Tl(CL,"ansi256",GC,!0)),Ll(e.bgColor,"ansi16m",()=>Tl(mL,"rgb",IL,!0)),e}Object.defineProperty(pL,"exports",{enumerable:!0,get:KAe})});var BL=C((Bze,yL)=>{"use strict";yL.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",i=e.indexOf(r+t),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var UAe=require("os"),QL=require("tty"),an=BL(),{env:Er}=process,Ho;an("no-color")||an("no-colors")||an("color=false")||an("color=never")?Ho=0:(an("color")||an("colors")||an("color=true")||an("color=always"))&&(Ho=1);"FORCE_COLOR"in Er&&(Er.FORCE_COLOR==="true"?Ho=1:Er.FORCE_COLOR==="false"?Ho=0:Ho=Er.FORCE_COLOR.length===0?1:Math.min(parseInt(Er.FORCE_COLOR,10),3));function cQ(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function uQ(t,e){if(Ho===0)return 0;if(an("color=16m")||an("color=full")||an("color=truecolor"))return 3;if(an("color=256"))return 2;if(t&&!e&&Ho===void 0)return 0;let r=Ho||0;if(Er.TERM==="dumb")return r;if(process.platform==="win32"){let i=UAe.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in Er)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in Er)||Er.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in Er)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Er.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Er)return 1;if(Er.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Er){let i=parseInt((Er.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Er.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Er.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Er.TERM)||"COLORTERM"in Er?1:r}function HAe(t){let e=uQ(t,t&&t.isTTY);return cQ(e)}wL.exports={supportsColor:HAe,stdout:cQ(uQ(!0,QL.isatty(1))),stderr:cQ(uQ(!0,QL.isatty(2)))}});var SL=C((Qze,DL)=>{"use strict";var GAe=(t,e,r)=>{let i=t.indexOf(e);if(i===-1)return t;let n=e.length,s=0,o="";do o+=t.substr(s,i-s)+e+r,s=i+n,i=t.indexOf(e,s);while(i!==-1);return o+=t.substr(s),o},YAe=(t,e,r,i)=>{let n=0,s="";do{let o=t[i-1]==="\r";s+=t.substr(n,(o?i-1:i)-n)+e+(o?`\r -`:` -`)+r,n=i+1,i=t.indexOf(` -`,n)}while(i!==-1);return s+=t.substr(n),s};DL.exports={stringReplaceAll:GAe,stringEncaseCRLFWithFirstIndex:YAe}});var FL=C((bze,xL)=>{"use strict";var qAe=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,kL=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,jAe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,JAe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,WAe=new Map([["n",` -`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function vL(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):WAe.get(t)||t}function zAe(t,e){let r=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))r.push(o);else if(n=s.match(jAe))r.push(n[2].replace(JAe,(a,l,c)=>l?vL(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${t}')`)}return r}function VAe(t){kL.lastIndex=0;let e=[],r;for(;(r=kL.exec(t))!==null;){let i=r[1];if(r[2]){let n=zAe(i,r[2]);e.push([i].concat(n))}else e.push([i])}return e}function PL(t,e){let r={};for(let n of e)for(let s of n.styles)r[s[0]]=n.inverse?null:s.slice(1);let i=t;for(let[n,s]of Object.entries(r))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}xL.exports=(t,e)=>{let r=[],i=[],n=[];if(e.replace(qAe,(s,o,a,l,c,u)=>{if(o)n.push(vL(o));else if(l){let g=n.join("");n=[],i.push(r.length===0?g:PL(t,r)(g)),r.push({inverse:a,styles:VAe(l)})}else if(c){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(PL(t,r)(n.join(""))),n=[],r.pop()}else n.push(u)}),i.push(n.join("")),r.length>0){let s=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var dQ=C((Dze,RL)=>{"use strict";var Lg=EL(),{stdout:gQ,stderr:hQ}=bL(),{stringReplaceAll:XAe,stringEncaseCRLFWithFirstIndex:ZAe}=SL(),NL=["ansi","ansi","ansi256","ansi16m"],Ol=Object.create(null),_Ae=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=gQ?gQ.level:0;t.level=e.level===void 0?r:e.level},ML=class{constructor(e){return LL(e)}},LL=t=>{let e={};return _Ae(e,t),e.template=(...r)=>$Ae(e.template,...r),Object.setPrototypeOf(e,YC.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=ML,e.template};function YC(t){return LL(t)}for(let[t,e]of Object.entries(Lg))Ol[t]={get(){let r=qC(this,fQ(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};Ol.visible={get(){let t=qC(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var TL=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of TL)Ol[t]={get(){let{level:e}=this;return function(...r){let i=fQ(Lg.color[NL[e]][t](...r),Lg.color.close,this._styler);return qC(this,i,this._isEmpty)}}};for(let t of TL){let e="bg"+t[0].toUpperCase()+t.slice(1);Ol[e]={get(){let{level:r}=this;return function(...i){let n=fQ(Lg.bgColor[NL[r]][t](...i),Lg.bgColor.close,this._styler);return qC(this,n,this._isEmpty)}}}}var ele=Object.defineProperties(()=>{},W(v({},Ol),{level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}})),fQ=(t,e,r)=>{let i,n;return r===void 0?(i=t,n=e):(i=r.openAll+t,n=e+r.closeAll),{open:t,close:e,openAll:i,closeAll:n,parent:r}},qC=(t,e,r)=>{let i=(...n)=>tle(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=ele,i._generator=t,i._styler=e,i._isEmpty=r,i},tle=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:i,closeAll:n}=r;if(e.indexOf("")!==-1)for(;r!==void 0;)e=XAe(e,r.close,r.open),r=r.parent;let s=e.indexOf(` -`);return s!==-1&&(e=ZAe(e,n,i,s)),i+e+n},pQ,$Ae=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let i=e.slice(1),n=[r.raw[0]];for(let s=1;s{OL.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY_BUILD_BASE",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}}]});var Og=C(Yi=>{"use strict";var UL=KL(),rs=process.env;Object.defineProperty(Yi,"_vendors",{value:UL.map(function(t){return t.constant})});Yi.name=null;Yi.isPR=null;UL.forEach(function(t){var e=Array.isArray(t.env)?t.env:[t.env],r=e.every(function(i){return HL(i)});if(Yi[t.constant]=r,r)switch(Yi.name=t.name,typeof t.pr){case"string":Yi.isPR=!!rs[t.pr];break;case"object":"env"in t.pr?Yi.isPR=t.pr.env in rs&&rs[t.pr.env]!==t.pr.ne:"any"in t.pr?Yi.isPR=t.pr.any.some(function(i){return!!rs[i]}):Yi.isPR=HL(t.pr);break;default:Yi.isPR=null}});Yi.isCI=!!(rs.CI||rs.CONTINUOUS_INTEGRATION||rs.BUILD_NUMBER||rs.RUN_ID||Yi.name);function HL(t){return typeof t=="string"?!!rs[t]:Object.keys(t).every(function(e){return rs[e]===t[e]})}});var jC=C(An=>{"use strict";An.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;An.find=(t,e)=>t.nodes.find(r=>r.type===e);An.exceedsLimit=(t,e,r=1,i)=>i===!1||!An.isInteger(t)||!An.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=i;An.escapeNode=(t,e=0,r)=>{let i=t.nodes[e];!i||(r&&i.type===r||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};An.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0==0?(t.invalid=!0,!0):!1;An.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0==0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;An.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;An.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);An.flatten=(...t)=>{let e=[],r=i=>{for(let n=0;n{"use strict";var YL=jC();GL.exports=(t,e={})=>{let r=(i,n={})=>{let s=e.escapeInvalid&&YL.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&YL.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=r(l);return a};return r(t)}});var jL=C((Pze,qL)=>{"use strict";qL.exports=function(t){return typeof t=="number"?t-t==0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var eT=C((Fze,JL)=>{"use strict";var WL=jL(),iA=(t,e,r)=>{if(WL(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(WL(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=v({relaxZeros:!0},r);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=t+":"+e+"="+n+s+o+a;if(iA.cache.hasOwnProperty(l))return iA.cache[l].result;let c=Math.min(t,e),u=Math.max(t,e);if(Math.abs(c-u)===1){let m=t+"|"+e;return i.capture?`(${m})`:i.wrap===!1?m:`(?:${m})`}let g=VL(t)||VL(e),h={min:t,max:e,a:c,b:u},f=[],p=[];if(g&&(h.isPadded=g,h.maxLen=String(h.max).length),c<0){let m=u<0?Math.abs(u):1;p=zL(m,Math.abs(c),h,i),c=h.a=0}return u>=0&&(f=zL(c,u,h,i)),h.negatives=p,h.positives=f,h.result=rle(p,f,i),i.capture===!0?h.result=`(${h.result})`:i.wrap!==!1&&f.length+p.length>1&&(h.result=`(?:${h.result})`),iA.cache[l]=h,h.result};function rle(t,e,r){let i=CQ(t,e,"-",!1,r)||[],n=CQ(e,t,"",!1,r)||[],s=CQ(t,e,"-?",!0,r)||[];return i.concat(s).concat(n).join("|")}function nle(t,e){let r=1,i=1,n=XL(t,r),s=new Set([e]);for(;t<=n&&n<=e;)s.add(n),r+=1,n=XL(t,r);for(n=ZL(e+1,i)-1;t1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+_L(a.count),o=c+1;continue}r.isPadded&&(g=Ale(c,r,i)),u.string=g+u.pattern+_L(u.count),s.push(u),o=c+1,a=u}return s}function CQ(t,e,r,i,n){let s=[];for(let o of t){let{string:a}=o;!i&&!$L(e,"string",a)&&s.push(r+a),i&&$L(e,"string",a)&&s.push(r+a)}return s}function sle(t,e){let r=[];for(let i=0;ie?1:e>t?-1:0}function $L(t,e,r){return t.some(i=>i[e]===r)}function XL(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function ZL(t,e){return t-t%Math.pow(10,e)}function _L(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function ole(t,e,r){return`[${t}${e-t==1?"":"-"}${e}]`}function VL(t){return/^-?(0+)\d/.test(t)}function Ale(t,e,r){if(!e.isPadded)return t;let i=Math.abs(e.maxLen-String(t).length),n=r.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}iA.cache={};iA.clearCache=()=>iA.cache={};JL.exports=iA});var EQ=C((Rze,tT)=>{"use strict";var lle=require("util"),rT=eT(),iT=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),cle=t=>e=>t===!0?Number(e):String(e),mQ=t=>typeof t=="number"||typeof t=="string"&&t!=="",Kg=t=>Number.isInteger(+t),IQ=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},ule=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,gle=(t,e,r)=>{if(e>0){let i=t[0]==="-"?"-":"";i&&(t=t.slice(1)),t=i+t.padStart(i?e-1:e,"0")}return r===!1?String(t):t},nT=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((o,a)=>oa?1:0),t.positives.sort((o,a)=>oa?1:0);let r=e.capture?"":"?:",i="",n="",s;return t.positives.length&&(i=t.positives.join("|")),t.negatives.length&&(n=`-(${r}${t.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${r}${s})`:s},sT=(t,e,r,i)=>{if(r)return rT(t,e,v({wrap:!1},i));let n=String.fromCharCode(t);if(t===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},oT=(t,e,r)=>{if(Array.isArray(t)){let i=r.wrap===!0,n=r.capture?"":"?:";return i?`(${n}${t.join("|")})`:t.join("|")}return rT(t,e,r)},aT=(...t)=>new RangeError("Invalid range arguments: "+lle.inspect(...t)),AT=(t,e,r)=>{if(r.strictRanges===!0)throw aT([t,e]);return[]},fle=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},ple=(t,e,r=1,i={})=>{let n=Number(t),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw aT([t,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(t),l=String(e),c=String(r);r=Math.max(Math.abs(r),1);let u=IQ(a)||IQ(l)||IQ(c),g=u?Math.max(a.length,l.length,c.length):0,h=u===!1&&ule(t,e,i)===!1,f=i.transform||cle(h);if(i.toRegex&&r===1)return sT(nT(t,g),nT(e,g),!0,i);let p={negatives:[],positives:[]},m=w=>p[w<0?"negatives":"positives"].push(Math.abs(w)),I=[],Q=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&r>1?m(n):I.push(gle(f(n,Q),g,h)),n=o?n-r:n+r,Q++;return i.toRegex===!0?r>1?hle(p,i):oT(I,null,v({wrap:!1},i)):I},dle=(t,e,r=1,i={})=>{if(!Kg(t)&&t.length>1||!Kg(e)&&e.length>1)return AT(t,e,i);let n=i.transform||(h=>String.fromCharCode(h)),s=`${t}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&r===1)return sT(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-r:s+r,g++;return i.toRegex===!0?oT(u,null,{wrap:!1,options:i}):u},WC=(t,e,r,i={})=>{if(e==null&&mQ(t))return[t];if(!mQ(t)||!mQ(e))return AT(t,e,i);if(typeof r=="function")return WC(t,e,1,{transform:r});if(iT(r))return WC(t,e,0,r);let n=v({},i);return n.capture===!0&&(n.wrap=!0),r=r||n.step||1,Kg(r)?Kg(t)&&Kg(e)?ple(t,e,r,n):dle(t,e,Math.max(Math.abs(r),1),n):r!=null&&!iT(r)?fle(r,n):WC(t,e,1,r)};tT.exports=WC});var uT=C((Nze,lT)=>{"use strict";var Cle=EQ(),cT=jC(),mle=(t,e={})=>{let r=(i,n={})=>{let s=cT.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=cT.reduce(i.nodes),g=Cle(...u,W(v({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=r(u,i);return c};return r(t)};lT.exports=mle});var fT=C((Mze,gT)=>{"use strict";var Ile=EQ(),hT=JC(),Kl=jC(),nA=(t="",e="",r=!1)=>{let i=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?Kl.flatten(e).map(n=>`{${n}}`):e;for(let n of t)if(Array.isArray(n))for(let s of n)i.push(nA(s,e,r));else for(let s of e)r===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?nA(n,s,r):n+s);return Kl.flatten(i)},Ele=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(nA(a.pop(),hT(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(nA(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=Kl.reduce(n.nodes);if(Kl.exceedsLimit(...g,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let h=Ile(...g,e);h.length===0&&(h=hT(n,e)),a.push(nA(a.pop(),h)),n.nodes=[];return}let l=Kl.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";pT.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` -`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var yT=C((Tze,CT)=>{"use strict";var yle=JC(),{MAX_LENGTH:mT,CHAR_BACKSLASH:yQ,CHAR_BACKTICK:Ble,CHAR_COMMA:wle,CHAR_DOT:Qle,CHAR_LEFT_PARENTHESES:ble,CHAR_RIGHT_PARENTHESES:Dle,CHAR_LEFT_CURLY_BRACE:Sle,CHAR_RIGHT_CURLY_BRACE:xle,CHAR_LEFT_SQUARE_BRACKET:IT,CHAR_RIGHT_SQUARE_BRACKET:ET,CHAR_DOUBLE_QUOTE:kle,CHAR_SINGLE_QUOTE:vle,CHAR_NO_BREAK_SPACE:Ple,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Fle}=dT(),Rle=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},i=typeof r.maxLength=="number"?Math.min(mT,r.maxLength):mT;if(t.length>i)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${i})`);let n={type:"root",input:t,nodes:[]},s=[n],o=n,a=n,l=0,c=t.length,u=0,g=0,h,f={},p=()=>t[u++],m=I=>{if(I.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&I.type==="text"){a.value+=I.value;return}return o.nodes.push(I),I.parent=o,I.prev=a,a=I,I};for(m({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let I=o.nodes.shift();o.nodes=[I,{type:"text",value:yle(o)}]}m({type:"comma",value:h}),o.commas++;continue}if(h===Qle&&g>0&&o.commas===0){let I=o.nodes;if(g===0||I.length===0){m({type:"text",value:h});continue}if(a.type==="dot"){if(o.range=[],a.value+=h,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){I.pop();let Q=I[I.length-1];Q.value+=a.value+h,a=Q,o.ranges--;continue}m({type:"dot",value:h});continue}m({type:"text",value:h})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(w=>{w.nodes||(w.type==="open"&&(w.isOpen=!0),w.type==="close"&&(w.isClose=!0),w.nodes||(w.type="text"),w.invalid=!0)});let I=s[s.length-1],Q=I.nodes.indexOf(o);I.nodes.splice(Q,1,...o.nodes)}while(s.length>0);return m({type:"eos"}),n};CT.exports=Rle});var QT=C((Oze,BT)=>{"use strict";var wT=JC(),Nle=uT(),Mle=fT(),Lle=yT(),qi=(t,e={})=>{let r=[];if(Array.isArray(t))for(let i of t){let n=qi.create(i,e);Array.isArray(n)?r.push(...n):r.push(n)}else r=[].concat(qi.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};qi.parse=(t,e={})=>Lle(t,e);qi.stringify=(t,e={})=>typeof t=="string"?wT(qi.parse(t,e),e):wT(t,e);qi.compile=(t,e={})=>(typeof t=="string"&&(t=qi.parse(t,e)),Nle(t,e));qi.expand=(t,e={})=>{typeof t=="string"&&(t=qi.parse(t,e));let r=Mle(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};qi.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?qi.compile(t,e):qi.expand(t,e);BT.exports=qi});var Ug=C((Kze,bT)=>{"use strict";var Tle=require("path"),is="\\\\/",DT=`[^${is}]`,Js="\\.",Ole="\\+",Kle="\\?",zC="\\/",Ule="(?=.)",ST="[^/]",BQ=`(?:${zC}|$)`,xT=`(?:^|${zC})`,wQ=`${Js}{1,2}${BQ}`,Hle=`(?!${Js})`,Gle=`(?!${xT}${wQ})`,Yle=`(?!${Js}{0,1}${BQ})`,qle=`(?!${wQ})`,jle=`[^.${zC}]`,Jle=`${ST}*?`,kT={DOT_LITERAL:Js,PLUS_LITERAL:Ole,QMARK_LITERAL:Kle,SLASH_LITERAL:zC,ONE_CHAR:Ule,QMARK:ST,END_ANCHOR:BQ,DOTS_SLASH:wQ,NO_DOT:Hle,NO_DOTS:Gle,NO_DOT_SLASH:Yle,NO_DOTS_SLASH:qle,QMARK_NO_DOT:jle,STAR:Jle,START_ANCHOR:xT},Wle=W(v({},kT),{SLASH_LITERAL:`[${is}]`,QMARK:DT,STAR:`${DT}*?`,DOTS_SLASH:`${Js}{1,2}(?:[${is}]|$)`,NO_DOT:`(?!${Js})`,NO_DOTS:`(?!(?:^|[${is}])${Js}{1,2}(?:[${is}]|$))`,NO_DOT_SLASH:`(?!${Js}{0,1}(?:[${is}]|$))`,NO_DOTS_SLASH:`(?!${Js}{1,2}(?:[${is}]|$))`,QMARK_NO_DOT:`[^.${is}]`,START_ANCHOR:`(?:^|[${is}])`,END_ANCHOR:`(?:[${is}]|$)`}),zle={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};bT.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:zle,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:Tle.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?Wle:kT}}});var Hg=C(Di=>{"use strict";var Vle=require("path"),Xle=process.platform==="win32",{REGEX_BACKSLASH:Zle,REGEX_REMOVE_BACKSLASH:_le,REGEX_SPECIAL_CHARS:$le,REGEX_SPECIAL_CHARS_GLOBAL:ece}=Ug();Di.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);Di.hasRegexChars=t=>$le.test(t);Di.isRegexChar=t=>t.length===1&&Di.hasRegexChars(t);Di.escapeRegex=t=>t.replace(ece,"\\$1");Di.toPosixSlashes=t=>t.replace(Zle,"/");Di.removeBackslashes=t=>t.replace(_le,e=>e==="\\"?"":e);Di.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};Di.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:Xle===!0||Vle.sep==="\\";Di.escapeLast=(t,e,r)=>{let i=t.lastIndexOf(e,r);return i===-1?t:t[i-1]==="\\"?Di.escapeLast(t,e,i-1):`${t.slice(0,i)}\\${t.slice(i)}`};Di.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};Di.wrapOutput=(t,e={},r={})=>{let i=r.contains?"":"^",n=r.contains?"":"$",s=`${i}(?:${t})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var OT=C((Hze,vT)=>{"use strict";var PT=Hg(),{CHAR_ASTERISK:QQ,CHAR_AT:tce,CHAR_BACKWARD_SLASH:Gg,CHAR_COMMA:rce,CHAR_DOT:bQ,CHAR_EXCLAMATION_MARK:FT,CHAR_FORWARD_SLASH:RT,CHAR_LEFT_CURLY_BRACE:DQ,CHAR_LEFT_PARENTHESES:SQ,CHAR_LEFT_SQUARE_BRACKET:ice,CHAR_PLUS:nce,CHAR_QUESTION_MARK:NT,CHAR_RIGHT_CURLY_BRACE:sce,CHAR_RIGHT_PARENTHESES:MT,CHAR_RIGHT_SQUARE_BRACKET:oce}=Ug(),LT=t=>t===RT||t===Gg,TT=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?Infinity:1)},ace=(t,e)=>{let r=e||{},i=t.length-1,n=r.parts===!0||r.scanToEnd===!0,s=[],o=[],a=[],l=t,c=-1,u=0,g=0,h=!1,f=!1,p=!1,m=!1,I=!1,Q=!1,w=!1,x=!1,N=!1,H=0,T,P,G={value:"",depth:0,isGlob:!1},te=()=>c>=i,j=()=>l.charCodeAt(c+1),A=()=>(T=P,l.charCodeAt(++c));for(;c0&&($=l.slice(0,u),l=l.slice(u),g-=u),ee&&p===!0&&g>0?(ee=l.slice(0,g),_=l.slice(g)):p===!0?(ee="",_=l):ee=l,ee&&ee!==""&&ee!=="/"&&ee!==l&<(ee.charCodeAt(ee.length-1))&&(ee=ee.slice(0,-1)),r.unescape===!0&&(_&&(_=PT.removeBackslashes(_)),ee&&w===!0&&(ee=PT.removeBackslashes(ee)));let U={prefix:$,input:t,start:u,base:ee,glob:_,isBrace:h,isBracket:f,isGlob:p,isExtglob:m,isGlobstar:I,negated:x};if(r.tokens===!0&&(U.maxDepth=0,LT(P)||o.push(G),U.tokens=o),r.parts===!0||r.tokens===!0){let F;for(let Re=0;Re{"use strict";var VC=Ug(),ji=Hg(),{MAX_LENGTH:XC,POSIX_REGEX_SOURCE:Ace,REGEX_NON_SPECIAL_CHARS:lce,REGEX_SPECIAL_CHARS_BACKREF:cce,REPLACEMENTS:UT}=VC,uce=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch(i){return t.map(n=>ji.escapeRegex(n)).join("..")}return r},Ul=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,HT=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=UT[t]||t;let r=v({},e),i=typeof r.maxLength=="number"?Math.min(XC,r.maxLength):XC,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:r.prepend||""},o=[s],a=r.capture?"":"?:",l=ji.isWindows(e),c=VC.globChars(l),u=VC.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:h,SLASH_LITERAL:f,ONE_CHAR:p,DOTS_SLASH:m,NO_DOT:I,NO_DOT_SLASH:Q,NO_DOTS_SLASH:w,QMARK:x,QMARK_NO_DOT:N,STAR:H,START_ANCHOR:T}=c,P=z=>`(${a}(?:(?!${T}${z.dot?m:g}).)*?)`,G=r.dot?"":I,te=r.dot?x:N,j=r.bash===!0?P(r):H;r.capture&&(j=`(${j})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let A={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};t=ji.removePrefix(t,A),n=t.length;let ee=[],$=[],_=[],U=s,F,Re=()=>A.index===n-1,xe=A.peek=(z=1)=>t[A.index+z],Ke=A.advance=()=>t[++A.index],Me=()=>t.slice(A.index+1),X=(z="",ae=0)=>{A.consumed+=z,A.index+=ae},ie=z=>{A.output+=z.output!=null?z.output:z.value,X(z.value)},we=()=>{let z=1;for(;xe()==="!"&&(xe(2)!=="("||xe(3)==="?");)Ke(),A.start++,z++;return z%2==0?!1:(A.negated=!0,A.start++,!0)},he=z=>{A[z]++,_.push(z)},Ie=z=>{A[z]--,_.pop()},pe=z=>{if(U.type==="globstar"){let ae=A.braces>0&&(z.type==="comma"||z.type==="brace"),ue=z.extglob===!0||ee.length&&(z.type==="pipe"||z.type==="paren");z.type!=="slash"&&z.type!=="paren"&&!ae&&!ue&&(A.output=A.output.slice(0,-U.output.length),U.type="star",U.value="*",U.output=j,A.output+=U.output)}if(ee.length&&z.type!=="paren"&&!u[z.value]&&(ee[ee.length-1].inner+=z.value),(z.value||z.output)&&ie(z),U&&U.type==="text"&&z.type==="text"){U.value+=z.value,U.output=(U.output||"")+z.value;return}z.prev=U,o.push(z),U=z},Fe=(z,ae)=>{let ue=W(v({},u[ae]),{conditions:1,inner:""});ue.prev=U,ue.parens=A.parens,ue.output=A.output;let be=(r.capture?"(":"")+ue.open;he("parens"),pe({type:z,value:ae,output:A.output?"":p}),pe({type:"paren",extglob:!0,value:Ke(),output:be}),ee.push(ue)},Z=z=>{let ae=z.close+(r.capture?")":"");if(z.type==="negate"){let ue=j;z.inner&&z.inner.length>1&&z.inner.includes("/")&&(ue=P(r)),(ue!==j||Re()||/^\)+$/.test(Me()))&&(ae=z.close=`)$))${ue}`),z.prev.type==="bos"&&(A.negatedExtglob=!0)}pe({type:"paren",extglob:!0,value:F,output:ae}),Ie("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let z=!1,ae=t.replace(cce,(ue,be,nt,dt,wt,kn)=>dt==="\\"?(z=!0,ue):dt==="?"?be?be+dt+(wt?x.repeat(wt.length):""):kn===0?te+(wt?x.repeat(wt.length):""):x.repeat(nt.length):dt==="."?g.repeat(nt.length):dt==="*"?be?be+dt+(wt?j:""):j:be?ue:`\\${ue}`);return z===!0&&(r.unescape===!0?ae=ae.replace(/\\/g,""):ae=ae.replace(/\\+/g,ue=>ue.length%2==0?"\\\\":ue?"\\":"")),ae===t&&r.contains===!0?(A.output=t,A):(A.output=ji.wrapOutput(ae,A,e),A)}for(;!Re();){if(F=Ke(),F==="\0")continue;if(F==="\\"){let ue=xe();if(ue==="/"&&r.bash!==!0||ue==="."||ue===";")continue;if(!ue){F+="\\",pe({type:"text",value:F});continue}let be=/^\\+/.exec(Me()),nt=0;if(be&&be[0].length>2&&(nt=be[0].length,A.index+=nt,nt%2!=0&&(F+="\\")),r.unescape===!0?F=Ke()||"":F+=Ke()||"",A.brackets===0){pe({type:"text",value:F});continue}}if(A.brackets>0&&(F!=="]"||U.value==="["||U.value==="[^")){if(r.posix!==!1&&F===":"){let ue=U.value.slice(1);if(ue.includes("[")&&(U.posix=!0,ue.includes(":"))){let be=U.value.lastIndexOf("["),nt=U.value.slice(0,be),dt=U.value.slice(be+2),wt=Ace[dt];if(wt){U.value=nt+wt,A.backtrack=!0,Ke(),!s.output&&o.indexOf(U)===1&&(s.output=p);continue}}}(F==="["&&xe()!==":"||F==="-"&&xe()==="]")&&(F=`\\${F}`),F==="]"&&(U.value==="["||U.value==="[^")&&(F=`\\${F}`),r.posix===!0&&F==="!"&&U.value==="["&&(F="^"),U.value+=F,ie({value:F});continue}if(A.quotes===1&&F!=='"'){F=ji.escapeRegex(F),U.value+=F,ie({value:F});continue}if(F==='"'){A.quotes=A.quotes===1?0:1,r.keepQuotes===!0&&pe({type:"text",value:F});continue}if(F==="("){he("parens"),pe({type:"paren",value:F});continue}if(F===")"){if(A.parens===0&&r.strictBrackets===!0)throw new SyntaxError(Ul("opening","("));let ue=ee[ee.length-1];if(ue&&A.parens===ue.parens+1){Z(ee.pop());continue}pe({type:"paren",value:F,output:A.parens?")":"\\)"}),Ie("parens");continue}if(F==="["){if(r.nobracket===!0||!Me().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(Ul("closing","]"));F=`\\${F}`}else he("brackets");pe({type:"bracket",value:F});continue}if(F==="]"){if(r.nobracket===!0||U&&U.type==="bracket"&&U.value.length===1){pe({type:"text",value:F,output:`\\${F}`});continue}if(A.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(Ul("opening","["));pe({type:"text",value:F,output:`\\${F}`});continue}Ie("brackets");let ue=U.value.slice(1);if(U.posix!==!0&&ue[0]==="^"&&!ue.includes("/")&&(F=`/${F}`),U.value+=F,ie({value:F}),r.literalBrackets===!1||ji.hasRegexChars(ue))continue;let be=ji.escapeRegex(U.value);if(A.output=A.output.slice(0,-U.value.length),r.literalBrackets===!0){A.output+=be,U.value=be;continue}U.value=`(${a}${be}|${U.value})`,A.output+=U.value;continue}if(F==="{"&&r.nobrace!==!0){he("braces");let ue={type:"brace",value:F,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};$.push(ue),pe(ue);continue}if(F==="}"){let ue=$[$.length-1];if(r.nobrace===!0||!ue){pe({type:"text",value:F,output:F});continue}let be=")";if(ue.dots===!0){let nt=o.slice(),dt=[];for(let wt=nt.length-1;wt>=0&&(o.pop(),nt[wt].type!=="brace");wt--)nt[wt].type!=="dots"&&dt.unshift(nt[wt].value);be=uce(dt,r),A.backtrack=!0}if(ue.comma!==!0&&ue.dots!==!0){let nt=A.output.slice(0,ue.outputIndex),dt=A.tokens.slice(ue.tokensIndex);ue.value=ue.output="\\{",F=be="\\}",A.output=nt;for(let wt of dt)A.output+=wt.output||wt.value}pe({type:"brace",value:F,output:be}),Ie("braces"),$.pop();continue}if(F==="|"){ee.length>0&&ee[ee.length-1].conditions++,pe({type:"text",value:F});continue}if(F===","){let ue=F,be=$[$.length-1];be&&_[_.length-1]==="braces"&&(be.comma=!0,ue="|"),pe({type:"comma",value:F,output:ue});continue}if(F==="/"){if(U.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),U=s;continue}pe({type:"slash",value:F,output:f});continue}if(F==="."){if(A.braces>0&&U.type==="dot"){U.value==="."&&(U.output=g);let ue=$[$.length-1];U.type="dots",U.output+=F,U.value+=F,ue.dots=!0;continue}if(A.braces+A.parens===0&&U.type!=="bos"&&U.type!=="slash"){pe({type:"text",value:F,output:g});continue}pe({type:"dot",value:F,output:g});continue}if(F==="?"){if(!(U&&U.value==="(")&&r.noextglob!==!0&&xe()==="("&&xe(2)!=="?"){Fe("qmark",F);continue}if(U&&U.type==="paren"){let be=xe(),nt=F;if(be==="<"&&!ji.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(U.value==="("&&!/[!=<:]/.test(be)||be==="<"&&!/<([!=]|\w+>)/.test(Me()))&&(nt=`\\${F}`),pe({type:"text",value:F,output:nt});continue}if(r.dot!==!0&&(U.type==="slash"||U.type==="bos")){pe({type:"qmark",value:F,output:N});continue}pe({type:"qmark",value:F,output:x});continue}if(F==="!"){if(r.noextglob!==!0&&xe()==="("&&(xe(2)!=="?"||!/[!=<:]/.test(xe(3)))){Fe("negate",F);continue}if(r.nonegate!==!0&&A.index===0){we();continue}}if(F==="+"){if(r.noextglob!==!0&&xe()==="("&&xe(2)!=="?"){Fe("plus",F);continue}if(U&&U.value==="("||r.regex===!1){pe({type:"plus",value:F,output:h});continue}if(U&&(U.type==="bracket"||U.type==="paren"||U.type==="brace")||A.parens>0){pe({type:"plus",value:F});continue}pe({type:"plus",value:h});continue}if(F==="@"){if(r.noextglob!==!0&&xe()==="("&&xe(2)!=="?"){pe({type:"at",extglob:!0,value:F,output:""});continue}pe({type:"text",value:F});continue}if(F!=="*"){(F==="$"||F==="^")&&(F=`\\${F}`);let ue=lce.exec(Me());ue&&(F+=ue[0],A.index+=ue[0].length),pe({type:"text",value:F});continue}if(U&&(U.type==="globstar"||U.star===!0)){U.type="star",U.star=!0,U.value+=F,U.output=j,A.backtrack=!0,A.globstar=!0,X(F);continue}let z=Me();if(r.noextglob!==!0&&/^\([^?]/.test(z)){Fe("star",F);continue}if(U.type==="star"){if(r.noglobstar===!0){X(F);continue}let ue=U.prev,be=ue.prev,nt=ue.type==="slash"||ue.type==="bos",dt=be&&(be.type==="star"||be.type==="globstar");if(r.bash===!0&&(!nt||z[0]&&z[0]!=="/")){pe({type:"star",value:F,output:""});continue}let wt=A.braces>0&&(ue.type==="comma"||ue.type==="brace"),kn=ee.length&&(ue.type==="pipe"||ue.type==="paren");if(!nt&&ue.type!=="paren"&&!wt&&!kn){pe({type:"star",value:F,output:""});continue}for(;z.slice(0,3)==="/**";){let wi=t[A.index+4];if(wi&&wi!=="/")break;z=z.slice(3),X("/**",3)}if(ue.type==="bos"&&Re()){U.type="globstar",U.value+=F,U.output=P(r),A.output=U.output,A.globstar=!0,X(F);continue}if(ue.type==="slash"&&ue.prev.type!=="bos"&&!dt&&Re()){A.output=A.output.slice(0,-(ue.output+U.output).length),ue.output=`(?:${ue.output}`,U.type="globstar",U.output=P(r)+(r.strictSlashes?")":"|$)"),U.value+=F,A.globstar=!0,A.output+=ue.output+U.output,X(F);continue}if(ue.type==="slash"&&ue.prev.type!=="bos"&&z[0]==="/"){let wi=z[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(ue.output+U.output).length),ue.output=`(?:${ue.output}`,U.type="globstar",U.output=`${P(r)}${f}|${f}${wi})`,U.value+=F,A.output+=ue.output+U.output,A.globstar=!0,X(F+Ke()),pe({type:"slash",value:"/",output:""});continue}if(ue.type==="bos"&&z[0]==="/"){U.type="globstar",U.value+=F,U.output=`(?:^|${f}|${P(r)}${f})`,A.output=U.output,A.globstar=!0,X(F+Ke()),pe({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-U.output.length),U.type="globstar",U.output=P(r),U.value+=F,A.output+=U.output,A.globstar=!0,X(F);continue}let ae={type:"star",value:F,output:j};if(r.bash===!0){ae.output=".*?",(U.type==="bos"||U.type==="slash")&&(ae.output=G+ae.output),pe(ae);continue}if(U&&(U.type==="bracket"||U.type==="paren")&&r.regex===!0){ae.output=F,pe(ae);continue}(A.index===A.start||U.type==="slash"||U.type==="dot")&&(U.type==="dot"?(A.output+=Q,U.output+=Q):r.dot===!0?(A.output+=w,U.output+=w):(A.output+=G,U.output+=G),xe()!=="*"&&(A.output+=p,U.output+=p)),pe(ae)}for(;A.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ul("closing","]"));A.output=ji.escapeLast(A.output,"["),Ie("brackets")}for(;A.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ul("closing",")"));A.output=ji.escapeLast(A.output,"("),Ie("parens")}for(;A.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(Ul("closing","}"));A.output=ji.escapeLast(A.output,"{"),Ie("braces")}if(r.strictSlashes!==!0&&(U.type==="star"||U.type==="bracket")&&pe({type:"maybe_slash",value:"",output:`${f}?`}),A.backtrack===!0){A.output="";for(let z of A.tokens)A.output+=z.output!=null?z.output:z.value,z.suffix&&(A.output+=z.suffix)}return A};HT.fastpaths=(t,e)=>{let r=v({},e),i=typeof r.maxLength=="number"?Math.min(XC,r.maxLength):XC,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);t=UT[t]||t;let s=ji.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:h,STAR:f,START_ANCHOR:p}=VC.globChars(s),m=r.dot?g:u,I=r.dot?h:u,Q=r.capture?"":"?:",w={negated:!1,prefix:""},x=r.bash===!0?".*?":f;r.capture&&(x=`(${x})`);let N=G=>G.noglobstar===!0?x:`(${Q}(?:(?!${p}${G.dot?c:o}).)*?)`,H=G=>{switch(G){case"*":return`${m}${l}${x}`;case".*":return`${o}${l}${x}`;case"*.*":return`${m}${x}${o}${l}${x}`;case"*/*":return`${m}${x}${a}${l}${I}${x}`;case"**":return m+N(r);case"**/*":return`(?:${m}${N(r)}${a})?${I}${l}${x}`;case"**/*.*":return`(?:${m}${N(r)}${a})?${I}${x}${o}${l}${x}`;case"**/.*":return`(?:${m}${N(r)}${a})?${o}${l}${x}`;default:{let te=/^(.*?)\.(\w+)$/.exec(G);if(!te)return;let j=H(te[1]);return j?j+o+te[2]:void 0}}},T=ji.removePrefix(t,w),P=H(T);return P&&r.strictSlashes!==!0&&(P+=`${a}?`),P};KT.exports=HT});var qT=C((Yze,YT)=>{"use strict";var gce=require("path"),hce=OT(),xQ=GT(),kQ=Hg(),fce=Ug(),pce=t=>t&&typeof t=="object"&&!Array.isArray(t),Ar=(t,e,r=!1)=>{if(Array.isArray(t)){let u=t.map(h=>Ar(h,e,r));return h=>{for(let f of u){let p=f(h);if(p)return p}return!1}}let i=pce(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=kQ.isWindows(e),o=i?Ar.compileRe(t,e):Ar.makeRe(t,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=W(v({},e),{ignore:null,onMatch:null,onResult:null});l=Ar(n.ignore,u,r)}let c=(u,g=!1)=>{let{isMatch:h,match:f,output:p}=Ar.test(u,o,e,{glob:t,posix:s}),m={glob:t,state:a,regex:o,posix:s,input:u,output:p,match:f,isMatch:h};return typeof n.onResult=="function"&&n.onResult(m),h===!1?(m.isMatch=!1,g?m:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(m),m.isMatch=!1,g?m:!1):(typeof n.onMatch=="function"&&n.onMatch(m),g?m:!0)};return r&&(c.state=a),c};Ar.test=(t,e,r,{glob:i,posix:n}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let s=r||{},o=s.format||(n?kQ.toPosixSlashes:null),a=t===i,l=a&&o?o(t):t;return a===!1&&(l=o?o(t):t,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=Ar.matchBase(t,e,r,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Ar.matchBase=(t,e,r,i=kQ.isWindows(r))=>(e instanceof RegExp?e:Ar.makeRe(e,r)).test(gce.basename(t));Ar.isMatch=(t,e,r)=>Ar(e,r)(t);Ar.parse=(t,e)=>Array.isArray(t)?t.map(r=>Ar.parse(r,e)):xQ(t,W(v({},e),{fastpaths:!1}));Ar.scan=(t,e)=>hce(t,e);Ar.compileRe=(t,e,r=!1,i=!1)=>{if(r===!0)return t.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${t.output})${o}`;t&&t.negated===!0&&(a=`^(?!${a}).*$`);let l=Ar.toRegex(a,e);return i===!0&&(l.state=t),l};Ar.makeRe=(t,e,r=!1,i=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let n=e||{},s={negated:!1,fastpaths:!0},o="",a;return t.startsWith("./")&&(t=t.slice(2),o=s.prefix="./"),n.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a=xQ.fastpaths(t,e)),a===void 0?(s=xQ(t,e),s.prefix=o+(s.prefix||"")):s.output=a,Ar.compileRe(s,e,r,i)};Ar.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Ar.constants=fce;YT.exports=Ar});var vQ=C((qze,jT)=>{"use strict";jT.exports=qT()});var Ji=C((jze,JT)=>{"use strict";var WT=require("util"),zT=QT(),ns=vQ(),PQ=Hg(),VT=t=>typeof t=="string"&&(t===""||t==="./"),Vt=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),r&&r.onResult&&r.onResult(u)};for(let u=0;u!i.has(u));if(r&&c.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};Vt.match=Vt;Vt.matcher=(t,e)=>ns(t,e);Vt.isMatch=(t,e,r)=>ns(e,r)(t);Vt.any=Vt.isMatch;Vt.not=(t,e,r={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{r.onResult&&r.onResult(a),n.push(a.output)},o=Vt(t,e,W(v({},r),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};Vt.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${WT.inspect(t)}"`);if(Array.isArray(e))return e.some(i=>Vt.contains(t,i,r));if(typeof e=="string"){if(VT(t)||VT(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return Vt.isMatch(t,e,W(v({},r),{contains:!0}))};Vt.matchKeys=(t,e,r)=>{if(!PQ.isObject(t))throw new TypeError("Expected the first argument to be an object");let i=Vt(Object.keys(t),e,r),n={};for(let s of i)n[s]=t[s];return n};Vt.some=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=ns(String(n),r);if(i.some(o=>s(o)))return!0}return!1};Vt.every=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=ns(String(n),r);if(!i.every(o=>s(o)))return!1}return!0};Vt.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${WT.inspect(t)}"`);return[].concat(e).every(i=>ns(i,r)(t))};Vt.capture=(t,e,r)=>{let i=PQ.isWindows(r),s=ns.makeRe(String(t),W(v({},r),{capture:!0})).exec(i?PQ.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};Vt.makeRe=(...t)=>ns.makeRe(...t);Vt.scan=(...t)=>ns.scan(...t);Vt.parse=(t,e)=>{let r=[];for(let i of[].concat(t||[]))for(let n of zT(String(i),e))r.push(ns.parse(n,e));return r};Vt.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:zT(t,e)};Vt.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return Vt.braces(t,W(v({},e),{expand:!0}))};JT.exports=Vt});var ZT=C((Jze,XT)=>{"use strict";XT.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var $T=C((Wze,_T)=>{"use strict";var dce=ZT();_T.exports=t=>typeof t=="string"?t.replace(dce(),""):t});var Gl={};$e(Gl,{KeyRelationship:()=>aA,applyCascade:()=>UQ,base64RegExp:()=>nO,colorStringAlphaRegExp:()=>iO,colorStringRegExp:()=>rO,computeKey:()=>Go,getPrintable:()=>fr,hasExactLength:()=>lO,hasForbiddenKeys:()=>zce,hasKeyRelationship:()=>GQ,hasMaxLength:()=>Pce,hasMinLength:()=>vce,hasMutuallyExclusiveKeys:()=>Vce,hasRequiredKeys:()=>Wce,hasUniqueItems:()=>Fce,isArray:()=>Bce,isAtLeast:()=>Mce,isAtMost:()=>Lce,isBase64:()=>jce,isBoolean:()=>Ice,isDate:()=>yce,isDict:()=>Qce,isEnum:()=>li,isHexColor:()=>qce,isISO8601:()=>Yce,isInExclusiveRange:()=>Oce,isInInclusiveRange:()=>Tce,isInstanceOf:()=>Dce,isInteger:()=>Kce,isJSON:()=>Jce,isLiteral:()=>Cce,isLowerCase:()=>Uce,isNegative:()=>Rce,isNullable:()=>kce,isNumber:()=>Ece,isObject:()=>bce,isOneOf:()=>Sce,isOptional:()=>xce,isPositive:()=>Nce,isString:()=>KQ,isTuple:()=>wce,isUUID4:()=>Gce,isUnknown:()=>AO,isUpperCase:()=>Hce,iso8601RegExp:()=>OQ,makeCoercionFn:()=>oA,makeSetter:()=>aO,makeTrait:()=>oO,makeValidator:()=>ht,matchesRegExp:()=>HQ,plural:()=>em,pushError:()=>it,simpleKeyRegExp:()=>tO,uuid4RegExp:()=>sO});function ht({test:t}){return oO(t)()}function fr(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":JSON.stringify(t)}function Go(t,e){var r,i,n;return typeof e=="number"?`${(r=t==null?void 0:t.p)!==null&&r!==void 0?r:"."}[${e}]`:tO.test(e)?`${(i=t==null?void 0:t.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=t==null?void 0:t.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function oA(t,e){return r=>{let i=t[e];return t[e]=r,oA(t,e).bind(null,i)}}function aO(t,e){return r=>{t[e]=r}}function em(t,e,r){return t===1?e:r}function it({errors:t,p:e}={},r){return t==null||t.push(`${e!=null?e:"."}: ${r}`),!1}function Cce(t){return ht({test:(e,r)=>e!==t?it(r,`Expected a literal (got ${fr(t)})`):!0})}function li(t){let e=Array.isArray(t)?t:Object.values(t),r=new Set(e);return ht({test:(i,n)=>r.has(i)?!0:it(n,`Expected a valid enumeration value (got ${fr(i)})`)})}var tO,rO,iO,nO,sO,OQ,oO,AO,KQ,mce,Ice,Ece,yce,Bce,wce,Qce,bce,Dce,Sce,UQ,xce,kce,vce,Pce,lO,Fce,Rce,Nce,Mce,Lce,Tce,Oce,Kce,HQ,Uce,Hce,Gce,Yce,qce,jce,Jce,Wce,zce,Vce,aA,Xce,GQ,Nn=Oae(()=>{tO=/^[a-zA-Z_][a-zA-Z0-9_]*$/,rO=/^#[0-9a-f]{6}$/i,iO=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,nO=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,sO=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,OQ=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,oO=t=>()=>t;AO=()=>ht({test:(t,e)=>!0});KQ=()=>ht({test:(t,e)=>typeof t!="string"?it(e,`Expected a string (got ${fr(t)})`):!0});mce=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),Ice=()=>ht({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return it(e,"Unbound coercion result");let i=mce.get(t);if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return it(e,`Expected a boolean (got ${fr(t)})`)}return!0}}),Ece=()=>ht({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return it(e,"Unbound coercion result");let i;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===t)i=n;else return it(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return it(e,`Expected a number (got ${fr(t)})`)}return!0}}),yce=()=>ht({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return it(e,"Unbound coercion result");let i;if(typeof t=="string"&&OQ.test(t))i=new Date(t);else{let n;if(typeof t=="string"){let s;try{s=JSON.parse(t)}catch(o){}typeof s=="number"&&(n=s)}else typeof t=="number"&&(n=t);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return it(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return it(e,`Expected a date (got ${fr(t)})`)}return!0}}),Bce=(t,{delimiter:e}={})=>ht({test:(r,i)=>{var n;if(typeof r=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return it(i,"Unbound coercion result");r=r.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,r)])}if(!Array.isArray(r))return it(i,`Expected an array (got ${fr(r)})`);let s=!0;for(let o=0,a=r.length;o{let r=lO(t.length);return ht({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return it(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return it(n,`Expected a tuple (got ${fr(i)})`);let o=r(i,Object.assign({},n));for(let a=0,l=i.length;aht({test:(r,i)=>{if(typeof r!="object"||r===null)return it(i,`Expected an object (got ${fr(r)})`);let n=Object.keys(r),s=!0;for(let o=0,a=n.length;o{let r=Object.keys(t);return ht({test:(i,n)=>{if(typeof i!="object"||i===null)return it(n,`Expected an object (got ${fr(i)})`);let s=new Set([...r,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=it(Object.assign(Object.assign({},n),{p:Go(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(t,l)?t[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:Go(n,l),coercion:oA(i,l)}))&&a:e===null?a=it(Object.assign(Object.assign({},n),{p:Go(n,l)}),`Extraneous property (got ${fr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:aO(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Dce=t=>ht({test:(e,r)=>e instanceof t?!0:it(r,`Expected an instance of ${t.name} (got ${fr(e)})`)}),Sce=(t,{exclusive:e=!1}={})=>ht({test:(r,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=t.length;c1?it(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),UQ=(t,e)=>ht({test:(r,i)=>{var n,s;let o={value:r},a=typeof(i==null?void 0:i.coercions)!="undefined"?oA(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!t(r,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==r){if(typeof(i==null?void 0:i.coercion)=="undefined")return it(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),xce=t=>ht({test:(e,r)=>typeof e=="undefined"?!0:t(e,r)}),kce=t=>ht({test:(e,r)=>e===null?!0:t(e,r)}),vce=t=>ht({test:(e,r)=>e.length>=t?!0:it(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)}),Pce=t=>ht({test:(e,r)=>e.length<=t?!0:it(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)}),lO=t=>ht({test:(e,r)=>e.length!==t?it(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0}),Fce=({map:t}={})=>ht({test:(e,r)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sht({test:(t,e)=>t<=0?!0:it(e,`Expected to be negative (got ${t})`)}),Nce=()=>ht({test:(t,e)=>t>=0?!0:it(e,`Expected to be positive (got ${t})`)}),Mce=t=>ht({test:(e,r)=>e>=t?!0:it(r,`Expected to be at least ${t} (got ${e})`)}),Lce=t=>ht({test:(e,r)=>e<=t?!0:it(r,`Expected to be at most ${t} (got ${e})`)}),Tce=(t,e)=>ht({test:(r,i)=>r>=t&&r<=e?!0:it(i,`Expected to be in the [${t}; ${e}] range (got ${r})`)}),Oce=(t,e)=>ht({test:(r,i)=>r>=t&&rht({test:(e,r)=>e!==Math.round(e)?it(r,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:it(r,`Expected to be a safe integer (got ${e})`)}),HQ=t=>ht({test:(e,r)=>t.test(e)?!0:it(r,`Expected to match the pattern ${t.toString()} (got ${fr(e)})`)}),Uce=()=>ht({test:(t,e)=>t!==t.toLowerCase()?it(e,`Expected to be all-lowercase (got ${t})`):!0}),Hce=()=>ht({test:(t,e)=>t!==t.toUpperCase()?it(e,`Expected to be all-uppercase (got ${t})`):!0}),Gce=()=>ht({test:(t,e)=>sO.test(t)?!0:it(e,`Expected to be a valid UUID v4 (got ${fr(t)})`)}),Yce=()=>ht({test:(t,e)=>OQ.test(t)?!1:it(e,`Expected to be a valid ISO 8601 date string (got ${fr(t)})`)}),qce=({alpha:t=!1})=>ht({test:(e,r)=>(t?rO.test(e):iO.test(e))?!0:it(r,`Expected to be a valid hexadecimal color string (got ${fr(e)})`)}),jce=()=>ht({test:(t,e)=>nO.test(t)?!0:it(e,`Expected to be a valid base 64 string (got ${fr(t)})`)}),Jce=(t=AO())=>ht({test:(e,r)=>{let i;try{i=JSON.parse(e)}catch(n){return it(r,`Expected to be a valid JSON string (got ${fr(e)})`)}return t(i,r)}}),Wce=t=>{let e=new Set(t);return ht({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?it(i,`Missing required ${em(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},zce=t=>{let e=new Set(t);return ht({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?it(i,`Forbidden ${em(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},Vce=t=>{let e=new Set(t);return ht({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?it(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(aA||(aA={}));Xce={[aA.Forbids]:{expect:!1,message:"forbids using"},[aA.Requires]:{expect:!0,message:"requires using"}},GQ=(t,e,r,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(r),o=Xce[e];return ht({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(t)||n.has(a[t]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?it(l,`Property "${t}" ${o.message} ${em(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var Zg=C((W5e,bO)=>{var gue="2.0.0",hue=256,fue=Number.MAX_SAFE_INTEGER||9007199254740991,pue=16;bO.exports={SEMVER_SPEC_VERSION:gue,MAX_LENGTH:hue,MAX_SAFE_INTEGER:fue,MAX_SAFE_COMPONENT_LENGTH:pue}});var _g=C((z5e,DO)=>{var due=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};DO.exports=due});var AA=C((Yo,SO)=>{var{MAX_SAFE_COMPONENT_LENGTH:zQ}=Zg(),Cue=_g();Yo=SO.exports={};var mue=Yo.re=[],Ge=Yo.src=[],Ye=Yo.t={},Iue=0,ft=(t,e,r)=>{let i=Iue++;Cue(i,e),Ye[t]=i,Ge[i]=e,mue[i]=new RegExp(e,r?"g":void 0)};ft("NUMERICIDENTIFIER","0|[1-9]\\d*");ft("NUMERICIDENTIFIERLOOSE","[0-9]+");ft("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");ft("MAINVERSION",`(${Ge[Ye.NUMERICIDENTIFIER]})\\.(${Ge[Ye.NUMERICIDENTIFIER]})\\.(${Ge[Ye.NUMERICIDENTIFIER]})`);ft("MAINVERSIONLOOSE",`(${Ge[Ye.NUMERICIDENTIFIERLOOSE]})\\.(${Ge[Ye.NUMERICIDENTIFIERLOOSE]})\\.(${Ge[Ye.NUMERICIDENTIFIERLOOSE]})`);ft("PRERELEASEIDENTIFIER",`(?:${Ge[Ye.NUMERICIDENTIFIER]}|${Ge[Ye.NONNUMERICIDENTIFIER]})`);ft("PRERELEASEIDENTIFIERLOOSE",`(?:${Ge[Ye.NUMERICIDENTIFIERLOOSE]}|${Ge[Ye.NONNUMERICIDENTIFIER]})`);ft("PRERELEASE",`(?:-(${Ge[Ye.PRERELEASEIDENTIFIER]}(?:\\.${Ge[Ye.PRERELEASEIDENTIFIER]})*))`);ft("PRERELEASELOOSE",`(?:-?(${Ge[Ye.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${Ge[Ye.PRERELEASEIDENTIFIERLOOSE]})*))`);ft("BUILDIDENTIFIER","[0-9A-Za-z-]+");ft("BUILD",`(?:\\+(${Ge[Ye.BUILDIDENTIFIER]}(?:\\.${Ge[Ye.BUILDIDENTIFIER]})*))`);ft("FULLPLAIN",`v?${Ge[Ye.MAINVERSION]}${Ge[Ye.PRERELEASE]}?${Ge[Ye.BUILD]}?`);ft("FULL",`^${Ge[Ye.FULLPLAIN]}$`);ft("LOOSEPLAIN",`[v=\\s]*${Ge[Ye.MAINVERSIONLOOSE]}${Ge[Ye.PRERELEASELOOSE]}?${Ge[Ye.BUILD]}?`);ft("LOOSE",`^${Ge[Ye.LOOSEPLAIN]}$`);ft("GTLT","((?:<|>)?=?)");ft("XRANGEIDENTIFIERLOOSE",`${Ge[Ye.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);ft("XRANGEIDENTIFIER",`${Ge[Ye.NUMERICIDENTIFIER]}|x|X|\\*`);ft("XRANGEPLAIN",`[v=\\s]*(${Ge[Ye.XRANGEIDENTIFIER]})(?:\\.(${Ge[Ye.XRANGEIDENTIFIER]})(?:\\.(${Ge[Ye.XRANGEIDENTIFIER]})(?:${Ge[Ye.PRERELEASE]})?${Ge[Ye.BUILD]}?)?)?`);ft("XRANGEPLAINLOOSE",`[v=\\s]*(${Ge[Ye.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Ge[Ye.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Ge[Ye.XRANGEIDENTIFIERLOOSE]})(?:${Ge[Ye.PRERELEASELOOSE]})?${Ge[Ye.BUILD]}?)?)?`);ft("XRANGE",`^${Ge[Ye.GTLT]}\\s*${Ge[Ye.XRANGEPLAIN]}$`);ft("XRANGELOOSE",`^${Ge[Ye.GTLT]}\\s*${Ge[Ye.XRANGEPLAINLOOSE]}$`);ft("COERCE",`(^|[^\\d])(\\d{1,${zQ}})(?:\\.(\\d{1,${zQ}}))?(?:\\.(\\d{1,${zQ}}))?(?:$|[^\\d])`);ft("COERCERTL",Ge[Ye.COERCE],!0);ft("LONETILDE","(?:~>?)");ft("TILDETRIM",`(\\s*)${Ge[Ye.LONETILDE]}\\s+`,!0);Yo.tildeTrimReplace="$1~";ft("TILDE",`^${Ge[Ye.LONETILDE]}${Ge[Ye.XRANGEPLAIN]}$`);ft("TILDELOOSE",`^${Ge[Ye.LONETILDE]}${Ge[Ye.XRANGEPLAINLOOSE]}$`);ft("LONECARET","(?:\\^)");ft("CARETTRIM",`(\\s*)${Ge[Ye.LONECARET]}\\s+`,!0);Yo.caretTrimReplace="$1^";ft("CARET",`^${Ge[Ye.LONECARET]}${Ge[Ye.XRANGEPLAIN]}$`);ft("CARETLOOSE",`^${Ge[Ye.LONECARET]}${Ge[Ye.XRANGEPLAINLOOSE]}$`);ft("COMPARATORLOOSE",`^${Ge[Ye.GTLT]}\\s*(${Ge[Ye.LOOSEPLAIN]})$|^$`);ft("COMPARATOR",`^${Ge[Ye.GTLT]}\\s*(${Ge[Ye.FULLPLAIN]})$|^$`);ft("COMPARATORTRIM",`(\\s*)${Ge[Ye.GTLT]}\\s*(${Ge[Ye.LOOSEPLAIN]}|${Ge[Ye.XRANGEPLAIN]})`,!0);Yo.comparatorTrimReplace="$1$2$3";ft("HYPHENRANGE",`^\\s*(${Ge[Ye.XRANGEPLAIN]})\\s+-\\s+(${Ge[Ye.XRANGEPLAIN]})\\s*$`);ft("HYPHENRANGELOOSE",`^\\s*(${Ge[Ye.XRANGEPLAINLOOSE]})\\s+-\\s+(${Ge[Ye.XRANGEPLAINLOOSE]})\\s*$`);ft("STAR","(<|>)?=?\\s*\\*");ft("GTE0","^\\s*>=\\s*0.0.0\\s*$");ft("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var $g=C((V5e,xO)=>{var Eue=["includePrerelease","loose","rtl"],yue=t=>t?typeof t!="object"?{loose:!0}:Eue.filter(e=>t[e]).reduce((e,r)=>(e[r]=!0,e),{}):{};xO.exports=yue});var om=C((X5e,kO)=>{var vO=/^[0-9]+$/,PO=(t,e)=>{let r=vO.test(t),i=vO.test(e);return r&&i&&(t=+t,e=+e),t===e?0:r&&!i?-1:i&&!r?1:tPO(e,t);kO.exports={compareIdentifiers:PO,rcompareIdentifiers:Bue}});var zr=C((Z5e,FO)=>{var am=_g(),{MAX_LENGTH:RO,MAX_SAFE_INTEGER:Am}=Zg(),{re:NO,t:MO}=AA(),wue=$g(),{compareIdentifiers:eh}=om(),cn=class{constructor(e,r){if(r=wue(r),e instanceof cn){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>RO)throw new TypeError(`version is longer than ${RO} characters`);am("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let i=e.trim().match(r.loose?NO[MO.LOOSE]:NO[MO.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>Am||this.major<0)throw new TypeError("Invalid major version");if(this.minor>Am||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>Am||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}r&&(this.prerelease[0]===r?isNaN(this.prerelease[1])&&(this.prerelease=[r,0]):this.prerelease=[r,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};FO.exports=cn});var lA=C((_5e,LO)=>{var{MAX_LENGTH:Que}=Zg(),{re:TO,t:OO}=AA(),KO=zr(),bue=$g(),Due=(t,e)=>{if(e=bue(e),t instanceof KO)return t;if(typeof t!="string"||t.length>Que||!(e.loose?TO[OO.LOOSE]:TO[OO.FULL]).test(t))return null;try{return new KO(t,e)}catch(i){return null}};LO.exports=Due});var HO=C(($5e,UO)=>{var Sue=lA(),xue=(t,e)=>{let r=Sue(t,e);return r?r.version:null};UO.exports=xue});var YO=C((e9e,GO)=>{var kue=lA(),vue=(t,e)=>{let r=kue(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};GO.exports=vue});var jO=C((t9e,qO)=>{var Pue=zr(),Fue=(t,e,r,i)=>{typeof r=="string"&&(i=r,r=void 0);try{return new Pue(t,r).inc(e,i).version}catch(n){return null}};qO.exports=Fue});var un=C((r9e,JO)=>{var WO=zr(),Rue=(t,e,r)=>new WO(t,r).compare(new WO(e,r));JO.exports=Rue});var lm=C((i9e,zO)=>{var Nue=un(),Mue=(t,e,r)=>Nue(t,e,r)===0;zO.exports=Mue});var ZO=C((n9e,VO)=>{var XO=lA(),Lue=lm(),Tue=(t,e)=>{if(Lue(t,e))return null;{let r=XO(t),i=XO(e),n=r.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in r)if((a==="major"||a==="minor"||a==="patch")&&r[a]!==i[a])return s+a;return o}};VO.exports=Tue});var $O=C((s9e,_O)=>{var Oue=zr(),Kue=(t,e)=>new Oue(t,e).major;_O.exports=Kue});var tK=C((o9e,eK)=>{var Uue=zr(),Hue=(t,e)=>new Uue(t,e).minor;eK.exports=Hue});var iK=C((a9e,rK)=>{var Gue=zr(),Yue=(t,e)=>new Gue(t,e).patch;rK.exports=Yue});var sK=C((A9e,nK)=>{var que=lA(),jue=(t,e)=>{let r=que(t,e);return r&&r.prerelease.length?r.prerelease:null};nK.exports=jue});var aK=C((l9e,oK)=>{var Jue=un(),Wue=(t,e,r)=>Jue(e,t,r);oK.exports=Wue});var lK=C((c9e,AK)=>{var zue=un(),Vue=(t,e)=>zue(t,e,!0);AK.exports=Vue});var cm=C((u9e,cK)=>{var uK=zr(),Xue=(t,e,r)=>{let i=new uK(t,r),n=new uK(e,r);return i.compare(n)||i.compareBuild(n)};cK.exports=Xue});var hK=C((g9e,gK)=>{var Zue=cm(),_ue=(t,e)=>t.sort((r,i)=>Zue(r,i,e));gK.exports=_ue});var pK=C((h9e,fK)=>{var $ue=cm(),ege=(t,e)=>t.sort((r,i)=>$ue(i,r,e));fK.exports=ege});var th=C((f9e,dK)=>{var tge=un(),rge=(t,e,r)=>tge(t,e,r)>0;dK.exports=rge});var um=C((p9e,CK)=>{var ige=un(),nge=(t,e,r)=>ige(t,e,r)<0;CK.exports=nge});var VQ=C((d9e,mK)=>{var sge=un(),oge=(t,e,r)=>sge(t,e,r)!==0;mK.exports=oge});var gm=C((C9e,IK)=>{var age=un(),Age=(t,e,r)=>age(t,e,r)>=0;IK.exports=Age});var hm=C((m9e,EK)=>{var lge=un(),cge=(t,e,r)=>lge(t,e,r)<=0;EK.exports=cge});var XQ=C((I9e,yK)=>{var uge=lm(),gge=VQ(),hge=th(),fge=gm(),pge=um(),dge=hm(),Cge=(t,e,r,i)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return uge(t,r,i);case"!=":return gge(t,r,i);case">":return hge(t,r,i);case">=":return fge(t,r,i);case"<":return pge(t,r,i);case"<=":return dge(t,r,i);default:throw new TypeError(`Invalid operator: ${e}`)}};yK.exports=Cge});var wK=C((E9e,BK)=>{var mge=zr(),Ige=lA(),{re:fm,t:pm}=AA(),Ege=(t,e)=>{if(t instanceof mge)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(fm[pm.COERCE]);else{let i;for(;(i=fm[pm.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||i.index+i[0].length!==r.index+r[0].length)&&(r=i),fm[pm.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;fm[pm.COERCERTL].lastIndex=-1}return r===null?null:Ige(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};BK.exports=Ege});var bK=C((y9e,QK)=>{"use strict";QK.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var rh=C((B9e,DK)=>{"use strict";DK.exports=Qt;Qt.Node=cA;Qt.create=Qt;function Qt(t){var e=this;if(e instanceof Qt||(e=new Qt),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var r=0,i=arguments.length;r1)r=e;else if(this.head)i=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)r=t(r,i.value,n),i=i.next;return r};Qt.prototype.reduceReverse=function(t,e){var r,i=this.tail;if(arguments.length>1)r=e;else if(this.tail)i=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)r=t(r,i.value,n),i=i.prev;return r};Qt.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Qt.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Qt.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Qt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>t;i--,n=n.prev)r.push(n.value);return r};Qt.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var i=0,n=this.head;n!==null&&i{"use strict";var Qge=rh(),uA=Symbol("max"),zs=Symbol("length"),ql=Symbol("lengthCalculator"),ih=Symbol("allowStale"),gA=Symbol("maxAge"),Vs=Symbol("dispose"),xK=Symbol("noDisposeOnSet"),vr=Symbol("lruList"),Ln=Symbol("cache"),kK=Symbol("updateAgeOnGet"),ZQ=()=>1,vK=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[uA]=e.max||Infinity,i=e.length||ZQ;if(this[ql]=typeof i!="function"?ZQ:i,this[ih]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[gA]=e.maxAge||0,this[Vs]=e.dispose,this[xK]=e.noDisposeOnSet||!1,this[kK]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[uA]=e||Infinity,nh(this)}get max(){return this[uA]}set allowStale(e){this[ih]=!!e}get allowStale(){return this[ih]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[gA]=e,nh(this)}get maxAge(){return this[gA]}set lengthCalculator(e){typeof e!="function"&&(e=ZQ),e!==this[ql]&&(this[ql]=e,this[zs]=0,this[vr].forEach(r=>{r.length=this[ql](r.value,r.key),this[zs]+=r.length})),nh(this)}get lengthCalculator(){return this[ql]}get length(){return this[zs]}get itemCount(){return this[vr].length}rforEach(e,r){r=r||this;for(let i=this[vr].tail;i!==null;){let n=i.prev;FK(this,e,i,r),i=n}}forEach(e,r){r=r||this;for(let i=this[vr].head;i!==null;){let n=i.next;FK(this,e,i,r),i=n}}keys(){return this[vr].toArray().map(e=>e.key)}values(){return this[vr].toArray().map(e=>e.value)}reset(){this[Vs]&&this[vr]&&this[vr].length&&this[vr].forEach(e=>this[Vs](e.key,e.value)),this[Ln]=new Map,this[vr]=new Qge,this[zs]=0}dump(){return this[vr].map(e=>dm(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[vr]}set(e,r,i){if(i=i||this[gA],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[ql](r,e);if(this[Ln].has(e)){if(s>this[uA])return jl(this,this[Ln].get(e)),!1;let l=this[Ln].get(e).value;return this[Vs]&&(this[xK]||this[Vs](e,l.value)),l.now=n,l.maxAge=i,l.value=r,this[zs]+=s-l.length,l.length=s,this.get(e),nh(this),!0}let o=new PK(e,r,s,n,i);return o.length>this[uA]?(this[Vs]&&this[Vs](e,r),!1):(this[zs]+=o.length,this[vr].unshift(o),this[Ln].set(e,this[vr].head),nh(this),!0)}has(e){if(!this[Ln].has(e))return!1;let r=this[Ln].get(e).value;return!dm(this,r)}get(e){return _Q(this,e,!0)}peek(e){return _Q(this,e,!1)}pop(){let e=this[vr].tail;return e?(jl(this,e),e.value):null}del(e){jl(this,this[Ln].get(e))}load(e){this.reset();let r=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-r;o>0&&this.set(n.k,n.v,o)}}}prune(){this[Ln].forEach((e,r)=>_Q(this,r,!1))}},_Q=(t,e,r)=>{let i=t[Ln].get(e);if(i){let n=i.value;if(dm(t,n)){if(jl(t,i),!t[ih])return}else r&&(t[kK]&&(i.value.now=Date.now()),t[vr].unshiftNode(i));return n.value}},dm=(t,e)=>{if(!e||!e.maxAge&&!t[gA])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[gA]&&r>t[gA]},nh=t=>{if(t[zs]>t[uA])for(let e=t[vr].tail;t[zs]>t[uA]&&e!==null;){let r=e.prev;jl(t,e),e=r}},jl=(t,e)=>{if(e){let r=e.value;t[Vs]&&t[Vs](r.key,r.value),t[zs]-=r.length,t[Ln].delete(r.key),t[vr].removeNode(e)}},PK=class{constructor(e,r,i,n,s){this.key=e,this.value=r,this.length=i,this.now=n,this.maxAge=s||0}},FK=(t,e,r,i)=>{let n=r.value;dm(t,n)&&(jl(t,r),t[ih]||(n=void 0)),n&&e.call(i,n.value,n.key,t)};SK.exports=vK});var gn=C((Q9e,NK)=>{var Jl=class{constructor(e,r){if(r=bge(r),e instanceof Jl)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new Jl(e.raw,r);if(e instanceof $Q)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!LK(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&vge(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=MK.get(i);if(n)return n;let s=this.options.loose,o=s?Vr[qr.HYPHENRANGELOOSE]:Vr[qr.HYPHENRANGE];e=e.replace(o,Rge(this.options.includePrerelease)),lr("hyphen replace",e),e=e.replace(Vr[qr.COMPARATORTRIM],Sge),lr("comparator trim",e,Vr[qr.COMPARATORTRIM]),e=e.replace(Vr[qr.TILDETRIM],xge),e=e.replace(Vr[qr.CARETTRIM],kge),e=e.split(/\s+/).join(" ");let a=s?Vr[qr.COMPARATORLOOSE]:Vr[qr.COMPARATOR],l=e.split(" ").map(h=>Pge(h,this.options)).join(" ").split(/\s+/).map(h=>Fge(h,this.options)).filter(this.options.loose?h=>!!h.match(a):()=>!0).map(h=>new $Q(h,this.options)),c=l.length,u=new Map;for(let h of l){if(LK(h))return[h];u.set(h.value,h)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return MK.set(i,g),g}intersects(e,r){if(!(e instanceof Jl))throw new TypeError("a Range is required");return this.set.some(i=>TK(i,r)&&e.set.some(n=>TK(n,r)&&i.every(s=>n.every(o=>s.intersects(o,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Dge(e,this.options)}catch(r){return!1}for(let r=0;rt.value==="<0.0.0-0",vge=t=>t.value==="",TK=(t,e)=>{let r=!0,i=t.slice(),n=i.pop();for(;r&&i.length;)r=i.every(s=>n.intersects(s,e)),n=i.pop();return r},Pge=(t,e)=>(lr("comp",t,e),t=Tge(t,e),lr("caret",t),t=Lge(t,e),lr("tildes",t),t=Oge(t,e),lr("xrange",t),t=Kge(t,e),lr("stars",t),t),ui=t=>!t||t.toLowerCase()==="x"||t==="*",Lge=(t,e)=>t.trim().split(/\s+/).map(r=>Uge(r,e)).join(" "),Uge=(t,e)=>{let r=e.loose?Vr[qr.TILDELOOSE]:Vr[qr.TILDE];return t.replace(r,(i,n,s,o,a)=>{lr("tilde",t,i,n,s,o,a);let l;return ui(n)?l="":ui(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:ui(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(lr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,lr("tilde return",l),l})},Tge=(t,e)=>t.trim().split(/\s+/).map(r=>Hge(r,e)).join(" "),Hge=(t,e)=>{lr("caret",t,e);let r=e.loose?Vr[qr.CARETLOOSE]:Vr[qr.CARET],i=e.includePrerelease?"-0":"";return t.replace(r,(n,s,o,a,l)=>{lr("caret",t,n,s,o,a,l);let c;return ui(s)?c="":ui(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:ui(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(lr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(lr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),lr("caret return",c),c})},Oge=(t,e)=>(lr("replaceXRanges",t,e),t.split(/\s+/).map(r=>Gge(r,e)).join(" ")),Gge=(t,e)=>{t=t.trim();let r=e.loose?Vr[qr.XRANGELOOSE]:Vr[qr.XRANGE];return t.replace(r,(i,n,s,o,a,l)=>{lr("xRange",t,i,n,s,o,a,l);let c=ui(s),u=c||ui(o),g=u||ui(a),h=g;return n==="="&&h&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&h?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),lr("xRange return",i),i})},Kge=(t,e)=>(lr("replaceStars",t,e),t.trim().replace(Vr[qr.STAR],"")),Fge=(t,e)=>(lr("replaceGTE0",t,e),t.trim().replace(Vr[e.includePrerelease?qr.GTE0PRE:qr.GTE0],"")),Rge=t=>(e,r,i,n,s,o,a,l,c,u,g,h,f)=>(ui(i)?r="":ui(n)?r=`>=${i}.0.0${t?"-0":""}`:ui(s)?r=`>=${i}.${n}.0${t?"-0":""}`:o?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,ui(c)?l="":ui(u)?l=`<${+c+1}.0.0-0`:ui(g)?l=`<${c}.${+u+1}.0-0`:h?l=`<=${c}.${u}.${g}-${h}`:t?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${r} ${l}`.trim()),Nge=(t,e,r)=>{for(let i=0;i0){let n=t[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var sh=C((b9e,OK)=>{var oh=Symbol("SemVer ANY"),ah=class{static get ANY(){return oh}constructor(e,r){if(r=Yge(r),e instanceof ah){if(e.loose===!!r.loose)return e;e=e.value}t0("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===oh?this.value="":this.value=this.operator+this.semver.version,t0("comp",this)}parse(e){let r=this.options.loose?KK[UK.COMPARATORLOOSE]:KK[UK.COMPARATOR],i=e.match(r);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new HK(i[2],this.options.loose):this.semver=oh}toString(){return this.value}test(e){if(t0("Comparator.test",e,this.options.loose),this.semver===oh||e===oh)return!0;if(typeof e=="string")try{e=new HK(e,this.options)}catch(r){return!1}return e0(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof ah))throw new TypeError("a Comparator is required");if((!r||typeof r!="object")&&(r={loose:!!r,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new GK(e.value,r).test(this.value);if(e.operator==="")return e.value===""?!0:new GK(this.value,r).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=e0(this.semver,"<",e.semver,r)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=e0(this.semver,">",e.semver,r)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};OK.exports=ah;var Yge=$g(),{re:KK,t:UK}=AA(),e0=XQ(),t0=_g(),HK=zr(),GK=gn()});var Ah=C((D9e,YK)=>{var qge=gn(),jge=(t,e,r)=>{try{e=new qge(e,r)}catch(i){return!1}return e.test(t)};YK.exports=jge});var jK=C((S9e,qK)=>{var Jge=gn(),Wge=(t,e)=>new Jge(t,e).set.map(r=>r.map(i=>i.value).join(" ").trim().split(" "));qK.exports=Wge});var WK=C((x9e,JK)=>{var zge=zr(),Vge=gn(),Xge=(t,e,r)=>{let i=null,n=null,s=null;try{s=new Vge(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new zge(i,r))}),i};JK.exports=Xge});var VK=C((k9e,zK)=>{var Zge=zr(),_ge=gn(),$ge=(t,e,r)=>{let i=null,n=null,s=null;try{s=new _ge(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new Zge(i,r))}),i};zK.exports=$ge});var _K=C((v9e,XK)=>{var r0=zr(),ehe=gn(),ZK=th(),the=(t,e)=>{t=new ehe(t,e);let r=new r0("0.0.0");if(t.test(r)||(r=new r0("0.0.0-0"),t.test(r)))return r;r=null;for(let i=0;i{let a=new r0(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||ZK(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!r||ZK(r,s))&&(r=s)}return r&&t.test(r)?r:null};XK.exports=the});var eU=C((P9e,$K)=>{var rhe=gn(),ihe=(t,e)=>{try{return new rhe(t,e).range||"*"}catch(r){return null}};$K.exports=ihe});var Cm=C((F9e,tU)=>{var nhe=zr(),rU=sh(),{ANY:she}=rU,ohe=gn(),ahe=Ah(),iU=th(),nU=um(),Ahe=hm(),lhe=gm(),che=(t,e,r,i)=>{t=new nhe(t,i),e=new ohe(e,i);let n,s,o,a,l;switch(r){case">":n=iU,s=Ahe,o=nU,a=">",l=">=";break;case"<":n=nU,s=lhe,o=iU,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(ahe(t,e,i))return!1;for(let c=0;c{f.semver===she&&(f=new rU(">=0.0.0")),g=g||f,h=h||f,n(f.semver,g.semver,i)?g=f:o(f.semver,h.semver,i)&&(h=f)}),g.operator===a||g.operator===l||(!h.operator||h.operator===a)&&s(t,h.semver))return!1;if(h.operator===l&&o(t,h.semver))return!1}return!0};tU.exports=che});var oU=C((R9e,sU)=>{var uhe=Cm(),ghe=(t,e,r)=>uhe(t,e,">",r);sU.exports=ghe});var AU=C((N9e,aU)=>{var hhe=Cm(),fhe=(t,e,r)=>hhe(t,e,"<",r);aU.exports=fhe});var uU=C((M9e,lU)=>{var cU=gn(),phe=(t,e,r)=>(t=new cU(t,r),e=new cU(e,r),t.intersects(e));lU.exports=phe});var hU=C((L9e,gU)=>{var dhe=Ah(),Che=un();gU.exports=(t,e,r)=>{let i=[],n=null,s=null,o=t.sort((u,g)=>Che(u,g,r));for(let u of o)dhe(u,e,r)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var pU=gn(),mm=sh(),{ANY:i0}=mm,lh=Ah(),n0=un(),Ihe=(t,e,r={})=>{if(t===e)return!0;t=new pU(t,r),e=new pU(e,r);let i=!1;e:for(let n of t.set){for(let s of e.set){let o=mhe(n,s,r);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},mhe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===i0){if(e.length===1&&e[0].semver===i0)return!0;r.includePrerelease?t=[new mm(">=0.0.0-0")]:t=[new mm(">=0.0.0")]}if(e.length===1&&e[0].semver===i0){if(r.includePrerelease)return!0;e=[new mm(">=0.0.0")]}let i=new Set,n,s;for(let f of t)f.operator===">"||f.operator===">="?n=dU(n,f,r):f.operator==="<"||f.operator==="<="?s=CU(s,f,r):i.add(f.semver);if(i.size>1)return null;let o;if(n&&s){if(o=n0(n.semver,s.semver,r),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let f of i){if(n&&!lh(f,String(n),r)||s&&!lh(f,String(s),r))return null;for(let p of e)if(!lh(f,String(p),r))return!1;return!0}let a,l,c,u,g=s&&!r.includePrerelease&&s.semver.prerelease.length?s.semver:!1,h=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let f of e){if(u=u||f.operator===">"||f.operator===">=",c=c||f.operator==="<"||f.operator==="<=",n){if(h&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===h.major&&f.semver.minor===h.minor&&f.semver.patch===h.patch&&(h=!1),f.operator===">"||f.operator===">="){if(a=dU(n,f,r),a===f&&a!==n)return!1}else if(n.operator===">="&&!lh(n.semver,String(f),r))return!1}if(s){if(g&&f.semver.prerelease&&f.semver.prerelease.length&&f.semver.major===g.major&&f.semver.minor===g.minor&&f.semver.patch===g.patch&&(g=!1),f.operator==="<"||f.operator==="<="){if(l=CU(s,f,r),l===f&&l!==s)return!1}else if(s.operator==="<="&&!lh(s.semver,String(f),r))return!1}if(!f.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||h||g)},dU=(t,e,r)=>{if(!t)return e;let i=n0(t.semver,e.semver,r);return i>0?t:i<0||e.operator===">"&&t.operator===">="?e:t},CU=(t,e,r)=>{if(!t)return e;let i=n0(t.semver,e.semver,r);return i<0?t:i>0||e.operator==="<"&&t.operator==="<="?e:t};fU.exports=Ihe});var pr=C((O9e,IU)=>{var s0=AA();IU.exports={re:s0.re,src:s0.src,tokens:s0.t,SEMVER_SPEC_VERSION:Zg().SEMVER_SPEC_VERSION,SemVer:zr(),compareIdentifiers:om().compareIdentifiers,rcompareIdentifiers:om().rcompareIdentifiers,parse:lA(),valid:HO(),clean:YO(),inc:jO(),diff:ZO(),major:$O(),minor:tK(),patch:iK(),prerelease:sK(),compare:un(),rcompare:aK(),compareLoose:lK(),compareBuild:cm(),sort:hK(),rsort:pK(),gt:th(),lt:um(),eq:lm(),neq:VQ(),gte:gm(),lte:hm(),cmp:XQ(),coerce:wK(),Comparator:sh(),Range:gn(),satisfies:Ah(),toComparators:jK(),maxSatisfying:WK(),minSatisfying:VK(),minVersion:_K(),validRange:eU(),outside:Cm(),gtr:oU(),ltr:AU(),intersects:uU(),simplifyRange:hU(),subset:mU()}});var FU=C((Y9e,PU)=>{"use strict";PU.exports=(...t)=>[...new Set([].concat(...t))]});var h0=C((q9e,RU)=>{"use strict";var She=require("stream"),NU=She.PassThrough,xhe=Array.prototype.slice;RU.exports=khe;function khe(){let t=[],e=!1,r=xhe.call(arguments),i=r[r.length-1];i&&!Array.isArray(i)&&i.pipe==null?r.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=NU(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function h(f){function p(){f.removeListener("merge2UnpipeEnd",p),f.removeListener("end",p),g()}if(f._readableState.endEmitted)return g();f.on("merge2UnpipeEnd",p),f.on("end",p),f.pipe(s,{end:!1}),f.resume()}for(let f=0;f{"use strict";Object.defineProperty(Em,"__esModule",{value:!0});function vhe(t){return t.reduce((e,r)=>[].concat(e,r),[])}Em.flatten=vhe;function Phe(t,e){let r=[[]],i=0;for(let n of t)e(n)?(i++,r[i]=[]):r[i].push(n);return r}Em.splitWhen=Phe});var TU=C(f0=>{"use strict";Object.defineProperty(f0,"__esModule",{value:!0});function Fhe(t){return t.code==="ENOENT"}f0.isEnoentCodeError=Fhe});var KU=C(p0=>{"use strict";Object.defineProperty(p0,"__esModule",{value:!0});var OU=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Rhe(t,e){return new OU(t,e)}p0.createDirentFromStats=Rhe});var UU=C(Zl=>{"use strict";Object.defineProperty(Zl,"__esModule",{value:!0});var Nhe=require("path"),Mhe=2,Lhe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function The(t){return t.replace(/\\/g,"/")}Zl.unixify=The;function Ohe(t,e){return Nhe.resolve(t,e)}Zl.makeAbsolute=Ohe;function Khe(t){return t.replace(Lhe,"\\$2")}Zl.escape=Khe;function Uhe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(Mhe)}return t}Zl.removeLeadingDotSegment=Uhe});var GU=C((V9e,HU)=>{HU.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var qU=C((X9e,YU)=>{var Hhe=GU(),Ghe={"{":"}","(":")","[":"]"},Yhe=/\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/,qhe=/\\(.)|(^!|[*?{}()[\]]|\(\?)/;YU.exports=function(e,r){if(typeof e!="string"||e==="")return!1;if(Hhe(e))return!0;var i=Yhe,n;for(r&&r.strict===!1&&(i=qhe);n=i.exec(e);){if(n[2])return!0;var s=n.index+n[0].length,o=n[1],a=o?Ghe[o]:null;if(o&&a){var l=e.indexOf(a,s);l!==-1&&(s=l+1)}e=e.slice(s)}return!1}});var JU=C((Z9e,jU)=>{"use strict";var jhe=qU(),Jhe=require("path").posix.dirname,Whe=require("os").platform()==="win32",d0="/",zhe=/\\/g,Vhe=/[\{\[].*[\}\]]$/,Xhe=/(^|[^\\])([\{\[]|\([^\)]+$)/,Zhe=/\\([\!\*\?\|\[\]\(\)\{\}])/g;jU.exports=function(e,r){var i=Object.assign({flipBackslashes:!0},r);i.flipBackslashes&&Whe&&e.indexOf(d0)<0&&(e=e.replace(zhe,d0)),Vhe.test(e)&&(e+=d0),e+="a";do e=Jhe(e);while(jhe(e)||Xhe.test(e));return e.replace(Zhe,"$1")}});var t1=C(dr=>{"use strict";Object.defineProperty(dr,"__esModule",{value:!0});var _he=require("path"),$he=JU(),WU=Ji(),efe=vQ(),zU="**",tfe="\\",rfe=/[*?]|^!/,ife=/\[.*]/,nfe=/(?:^|[^!*+?@])\(.*\|.*\)/,sfe=/[!*+?@]\(.*\)/,ofe=/{.*(?:,|\.\.).*}/;function XU(t,e={}){return!VU(t,e)}dr.isStaticPattern=XU;function VU(t,e={}){return!!(e.caseSensitiveMatch===!1||t.includes(tfe)||rfe.test(t)||ife.test(t)||nfe.test(t)||e.extglob!==!1&&sfe.test(t)||e.braceExpansion!==!1&&ofe.test(t))}dr.isDynamicPattern=VU;function afe(t){return ym(t)?t.slice(1):t}dr.convertToPositivePattern=afe;function Afe(t){return"!"+t}dr.convertToNegativePattern=Afe;function ym(t){return t.startsWith("!")&&t[1]!=="("}dr.isNegativePattern=ym;function ZU(t){return!ym(t)}dr.isPositivePattern=ZU;function lfe(t){return t.filter(ym)}dr.getNegativePatterns=lfe;function cfe(t){return t.filter(ZU)}dr.getPositivePatterns=cfe;function ufe(t){return $he(t,{flipBackslashes:!1})}dr.getBaseDirectory=ufe;function gfe(t){return t.includes(zU)}dr.hasGlobStar=gfe;function _U(t){return t.endsWith("/"+zU)}dr.endsWithSlashGlobStar=_U;function hfe(t){let e=_he.basename(t);return _U(t)||XU(e)}dr.isAffectDepthOfReadingPattern=hfe;function ffe(t){return t.reduce((e,r)=>e.concat($U(r)),[])}dr.expandPatternsWithBraceExpansion=ffe;function $U(t){return WU.braces(t,{expand:!0,nodupes:!0})}dr.expandBraceExpansion=$U;function pfe(t,e){let r=efe.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.parts.length===0?[t]:r.parts}dr.getPatternParts=pfe;function e1(t,e){return WU.makeRe(t,e)}dr.makeRe=e1;function dfe(t,e){return t.map(r=>e1(r,e))}dr.convertPatternsToRe=dfe;function Cfe(t,e){return e.some(r=>r.test(t))}dr.matchAny=Cfe});var i1=C(C0=>{"use strict";Object.defineProperty(C0,"__esModule",{value:!0});var mfe=h0();function Ife(t){let e=mfe(t);return t.forEach(r=>{r.once("error",i=>e.emit("error",i))}),e.once("close",()=>r1(t)),e.once("end",()=>r1(t)),e}C0.merge=Ife;function r1(t){t.forEach(e=>e.emit("close"))}});var n1=C(Bm=>{"use strict";Object.defineProperty(Bm,"__esModule",{value:!0});function Efe(t){return typeof t=="string"}Bm.isString=Efe;function yfe(t){return t===""}Bm.isEmpty=yfe});var _s=C(Zs=>{"use strict";Object.defineProperty(Zs,"__esModule",{value:!0});var Bfe=LU();Zs.array=Bfe;var wfe=TU();Zs.errno=wfe;var Qfe=KU();Zs.fs=Qfe;var bfe=UU();Zs.path=bfe;var Dfe=t1();Zs.pattern=Dfe;var Sfe=i1();Zs.stream=Sfe;var xfe=n1();Zs.string=xfe});var l1=C($s=>{"use strict";Object.defineProperty($s,"__esModule",{value:!0});var dA=_s();function kfe(t,e){let r=s1(t),i=o1(t,e.ignore),n=r.filter(l=>dA.pattern.isStaticPattern(l,e)),s=r.filter(l=>dA.pattern.isDynamicPattern(l,e)),o=m0(n,i,!1),a=m0(s,i,!0);return o.concat(a)}$s.generate=kfe;function m0(t,e,r){let i=a1(t);return"."in i?[I0(".",t,e,r)]:A1(i,e,r)}$s.convertPatternsToTasks=m0;function s1(t){return dA.pattern.getPositivePatterns(t)}$s.getPositivePatterns=s1;function o1(t,e){return dA.pattern.getNegativePatterns(t).concat(e).map(dA.pattern.convertToPositivePattern)}$s.getNegativePatternsAsPositive=o1;function a1(t){let e={};return t.reduce((r,i)=>{let n=dA.pattern.getBaseDirectory(i);return n in r?r[n].push(i):r[n]=[i],r},e)}$s.groupPatternsByBaseDirectory=a1;function A1(t,e,r){return Object.keys(t).map(i=>I0(i,t[i],e,r))}$s.convertPatternGroupsToTasks=A1;function I0(t,e,r,i){return{dynamic:i,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(dA.pattern.convertToNegativePattern))}}$s.convertPatternGroupToTask=I0});var u1=C(wm=>{"use strict";Object.defineProperty(wm,"__esModule",{value:!0});wm.read=void 0;function vfe(t,e,r){e.fs.lstat(t,(i,n)=>{if(i!==null){c1(r,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){E0(r,n);return}e.fs.stat(t,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){c1(r,s);return}E0(r,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),E0(r,o)})})}wm.read=vfe;function c1(t,e){t(e)}function E0(t,e){t(null,e)}});var g1=C(Qm=>{"use strict";Object.defineProperty(Qm,"__esModule",{value:!0});Qm.read=void 0;function Pfe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let i=e.fs.statSync(t);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw i}}Qm.read=Pfe});var h1=C(qo=>{"use strict";Object.defineProperty(qo,"__esModule",{value:!0});qo.createFileSystemAdapter=qo.FILE_SYSTEM_ADAPTER=void 0;var bm=require("fs");qo.FILE_SYSTEM_ADAPTER={lstat:bm.lstat,stat:bm.stat,lstatSync:bm.lstatSync,statSync:bm.statSync};function Ffe(t){return t===void 0?qo.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},qo.FILE_SYSTEM_ADAPTER),t)}qo.createFileSystemAdapter=Ffe});var p1=C(y0=>{"use strict";Object.defineProperty(y0,"__esModule",{value:!0});var Rfe=h1(),f1=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=Rfe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e!=null?e:r}};y0.default=f1});var CA=C(jo=>{"use strict";Object.defineProperty(jo,"__esModule",{value:!0});jo.statSync=jo.stat=jo.Settings=void 0;var d1=u1(),Nfe=g1(),B0=p1();jo.Settings=B0.default;function Mfe(t,e,r){if(typeof e=="function"){d1.read(t,w0(),e);return}d1.read(t,w0(e),r)}jo.stat=Mfe;function Lfe(t,e){let r=w0(e);return Nfe.read(t,r)}jo.statSync=Lfe;function w0(t={}){return t instanceof B0.default?t:new B0.default(t)}});var m1=C((A6e,C1)=>{C1.exports=Tfe;function Tfe(t,e){var r,i,n,s=!0;Array.isArray(t)?(r=[],i=t.length):(n=Object.keys(t),r={},i=n.length);function o(l){function c(){e&&e(l,r),e=null}s?process.nextTick(c):c()}function a(l,c,u){r[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){t[l](function(c,u){a(l,c,u)})}):t.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var Q0=C(Dm=>{"use strict";Object.defineProperty(Dm,"__esModule",{value:!0});Dm.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var Sm=process.versions.node.split(".");if(Sm[0]===void 0||Sm[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var I1=Number.parseInt(Sm[0],10),Ofe=Number.parseInt(Sm[1],10),E1=10,Kfe=10,Ufe=I1>E1,Hfe=I1===E1&&Ofe>=Kfe;Dm.IS_SUPPORT_READDIR_WITH_FILE_TYPES=Ufe||Hfe});var B1=C(xm=>{"use strict";Object.defineProperty(xm,"__esModule",{value:!0});xm.createDirentFromStats=void 0;var y1=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Gfe(t,e){return new y1(t,e)}xm.createDirentFromStats=Gfe});var b0=C(km=>{"use strict";Object.defineProperty(km,"__esModule",{value:!0});km.fs=void 0;var Yfe=B1();km.fs=Yfe});var D0=C(vm=>{"use strict";Object.defineProperty(vm,"__esModule",{value:!0});vm.joinPathSegments=void 0;function qfe(t,e,r){return t.endsWith(r)?t+e:t+r+e}vm.joinPathSegments=qfe});var x1=C(Jo=>{"use strict";Object.defineProperty(Jo,"__esModule",{value:!0});Jo.readdir=Jo.readdirWithFileTypes=Jo.read=void 0;var jfe=CA(),w1=m1(),Jfe=Q0(),Q1=b0(),b1=D0();function Wfe(t,e,r){if(!e.stats&&Jfe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){D1(t,e,r);return}S1(t,e,r)}Jo.read=Wfe;function D1(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(i,n)=>{if(i!==null){Pm(r,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:b1.joinPathSegments(t,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){S0(r,s);return}let o=s.map(a=>zfe(a,e));w1(o,(a,l)=>{if(a!==null){Pm(r,a);return}S0(r,l)})})}Jo.readdirWithFileTypes=D1;function zfe(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){r(i);return}r(null,t);return}t.dirent=Q1.fs.createDirentFromStats(t.name,n),r(null,t)})}}function S1(t,e,r){e.fs.readdir(t,(i,n)=>{if(i!==null){Pm(r,i);return}let s=n.map(o=>{let a=b1.joinPathSegments(t,o,e.pathSegmentSeparator);return l=>{jfe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:Q1.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});w1(s,(o,a)=>{if(o!==null){Pm(r,o);return}S0(r,a)})})}Jo.readdir=S1;function Pm(t,e){t(e)}function S0(t,e){t(null,e)}});var R1=C(Wo=>{"use strict";Object.defineProperty(Wo,"__esModule",{value:!0});Wo.readdir=Wo.readdirWithFileTypes=Wo.read=void 0;var Vfe=CA(),Xfe=Q0(),k1=b0(),v1=D0();function Zfe(t,e){return!e.stats&&Xfe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?P1(t,e):F1(t,e)}Wo.read=Zfe;function P1(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:v1.joinPathSegments(t,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=k1.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}Wo.readdirWithFileTypes=P1;function F1(t,e){return e.fs.readdirSync(t).map(i=>{let n=v1.joinPathSegments(t,i,e.pathSegmentSeparator),s=Vfe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:k1.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}Wo.readdir=F1});var N1=C(zo=>{"use strict";Object.defineProperty(zo,"__esModule",{value:!0});zo.createFileSystemAdapter=zo.FILE_SYSTEM_ADAPTER=void 0;var _l=require("fs");zo.FILE_SYSTEM_ADAPTER={lstat:_l.lstat,stat:_l.stat,lstatSync:_l.lstatSync,statSync:_l.statSync,readdir:_l.readdir,readdirSync:_l.readdirSync};function _fe(t){return t===void 0?zo.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},zo.FILE_SYSTEM_ADAPTER),t)}zo.createFileSystemAdapter=_fe});var L1=C(x0=>{"use strict";Object.defineProperty(x0,"__esModule",{value:!0});var $fe=require("path"),epe=CA(),tpe=N1(),M1=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=tpe.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,$fe.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new epe.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};x0.default=M1});var Fm=C(Vo=>{"use strict";Object.defineProperty(Vo,"__esModule",{value:!0});Vo.Settings=Vo.scandirSync=Vo.scandir=void 0;var T1=x1(),rpe=R1(),k0=L1();Vo.Settings=k0.default;function ipe(t,e,r){if(typeof e=="function"){T1.read(t,v0(),e);return}T1.read(t,v0(e),r)}Vo.scandir=ipe;function npe(t,e){let r=v0(e);return rpe.read(t,r)}Vo.scandirSync=npe;function v0(t={}){return t instanceof k0.default?t:new k0.default(t)}});var K1=C((m6e,O1)=>{"use strict";function spe(t){var e=new t,r=e;function i(){var s=e;return s.next?e=s.next:(e=new t,r=e),s.next=null,s}function n(s){r.next=s,r=s}return{get:i,release:n}}O1.exports=spe});var H1=C((I6e,P0)=>{"use strict";var ope=K1();function U1(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var i=ope(ape),n=null,s=null,o=0,a=null,l={push:m,drain:as,saturated:as,pause:u,paused:!1,concurrency:r,running:c,resume:f,idle:p,length:g,getQueue:h,unshift:I,empty:as,kill:w,killAndDrain:x,error:N};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var H=n,T=0;H;)H=H.next,T++;return T}function h(){for(var H=n,T=[];H;)T.push(H.value),H=H.next;return T}function f(){if(!!l.paused){l.paused=!1;for(var H=0;H{"use strict";Object.defineProperty(As,"__esModule",{value:!0});As.joinPathSegments=As.replacePathSegmentSeparator=As.isAppliedFilter=As.isFatalError=void 0;function lpe(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}As.isFatalError=lpe;function cpe(t,e){return t===null||t(e)}As.isAppliedFilter=cpe;function upe(t,e){return t.split(/[/\\]/).join(e)}As.replacePathSegmentSeparator=upe;function gpe(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}As.joinPathSegments=gpe});var R0=C(F0=>{"use strict";Object.defineProperty(F0,"__esModule",{value:!0});var hpe=Rm(),G1=class{constructor(e,r){this._root=e,this._settings=r,this._root=hpe.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};F0.default=G1});var M0=C(N0=>{"use strict";Object.defineProperty(N0,"__esModule",{value:!0});var fpe=require("events"),ppe=Fm(),dpe=H1(),Nm=Rm(),Cpe=R0(),Y1=class extends Cpe.default{constructor(e,r){super(e,r);this._settings=r,this._scandir=ppe.scandir,this._emitter=new fpe.EventEmitter,this._queue=dpe(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let i={directory:e,base:r};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){r(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!Nm.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let i=e.path;r!==void 0&&(e.path=Nm.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Nm.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&Nm.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};N0.default=Y1});var j1=C(L0=>{"use strict";Object.defineProperty(L0,"__esModule",{value:!0});var mpe=M0(),q1=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new mpe.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(r=>{Ipe(e,r)}),this._reader.onEntry(r=>{this._storage.add(r)}),this._reader.onEnd(()=>{Epe(e,[...this._storage])}),this._reader.read()}};L0.default=q1;function Ipe(t,e){t(e)}function Epe(t,e){t(null,e)}});var W1=C(T0=>{"use strict";Object.defineProperty(T0,"__esModule",{value:!0});var ype=require("stream"),Bpe=M0(),J1=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Bpe.default(this._root,this._settings),this._stream=new ype.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};T0.default=J1});var V1=C(O0=>{"use strict";Object.defineProperty(O0,"__esModule",{value:!0});var wpe=Fm(),Mm=Rm(),Qpe=R0(),z1=class extends Qpe.default{constructor(){super(...arguments);this._scandir=wpe.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,r)}catch(i){this._handleError(i)}}_handleError(e){if(!!Mm.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let i=e.path;r!==void 0&&(e.path=Mm.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Mm.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&Mm.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};O0.default=z1});var Z1=C(K0=>{"use strict";Object.defineProperty(K0,"__esModule",{value:!0});var bpe=V1(),X1=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new bpe.default(this._root,this._settings)}read(){return this._reader.read()}};K0.default=X1});var $1=C(U0=>{"use strict";Object.defineProperty(U0,"__esModule",{value:!0});var Dpe=require("path"),Spe=Fm(),_1=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,Dpe.sep),this.fsScandirSettings=new Spe.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};U0.default=_1});var G0=C(ls=>{"use strict";Object.defineProperty(ls,"__esModule",{value:!0});ls.Settings=ls.walkStream=ls.walkSync=ls.walk=void 0;var e2=j1(),xpe=W1(),kpe=Z1(),H0=$1();ls.Settings=H0.default;function vpe(t,e,r){if(typeof e=="function"){new e2.default(t,Lm()).read(e);return}new e2.default(t,Lm(e)).read(r)}ls.walk=vpe;function Ppe(t,e){let r=Lm(e);return new kpe.default(t,r).read()}ls.walkSync=Ppe;function Fpe(t,e){let r=Lm(e);return new xpe.default(t,r).read()}ls.walkStream=Fpe;function Lm(t={}){return t instanceof H0.default?t:new H0.default(t)}});var q0=C(Y0=>{"use strict";Object.defineProperty(Y0,"__esModule",{value:!0});var Rpe=require("path"),Npe=CA(),t2=_s(),r2=class{constructor(e){this._settings=e,this._fsStatSettings=new Npe.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return Rpe.resolve(this._settings.cwd,e)}_makeEntry(e,r){let i={name:r,path:r,dirent:t2.fs.createDirentFromStats(r,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!t2.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};Y0.default=r2});var J0=C(j0=>{"use strict";Object.defineProperty(j0,"__esModule",{value:!0});var Mpe=require("stream"),Lpe=CA(),Tpe=G0(),Ope=q0(),i2=class extends Ope.default{constructor(){super(...arguments);this._walkStream=Tpe.walkStream,this._stat=Lpe.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let i=e.map(this._getFullEntryPath,this),n=new Mpe.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],r).then(l=>{l!==null&&r.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,r)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((r,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?r(s):i(n))})}};j0.default=i2});var s2=C(W0=>{"use strict";Object.defineProperty(W0,"__esModule",{value:!0});var $l=_s(),n2=class{constructor(e,r,i){this._patterns=e,this._settings=r,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=$l.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let i=this._getPatternSegments(r),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:r,segments:i,sections:n})}}_getPatternSegments(e){return $l.pattern.getPatternParts(e,this._micromatchOptions).map(i=>$l.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:$l.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return $l.array.splitWhen(e,r=>r.dynamic&&$l.pattern.hasGlobStar(r.pattern))}};W0.default=n2});var a2=C(z0=>{"use strict";Object.defineProperty(z0,"__esModule",{value:!0});var Kpe=s2(),o2=class extends Kpe.default{match(e){let r=e.split("/"),i=r.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||r.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};z0.default=o2});var l2=C(V0=>{"use strict";Object.defineProperty(V0,"__esModule",{value:!0});var Tm=_s(),Upe=a2(),A2=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,i){let n=this._getMatcher(r),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new Upe.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(Tm.pattern.isAffectDepthOfReadingPattern);return Tm.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,i,n){let s=this._getEntryLevel(e,r.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(r))return!1;let o=Tm.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,r){let i=e.split("/").length;return r.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!Tm.pattern.matchAny(e,r)}};V0.default=A2});var u2=C(X0=>{"use strict";Object.defineProperty(X0,"__esModule",{value:!0});var hh=_s(),c2=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let i=hh.pattern.convertPatternsToRe(e,this._micromatchOptions),n=hh.pattern.convertPatternsToRe(r,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,r,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,r)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let i=hh.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,r)}_isMatchToPatterns(e,r){let i=hh.path.removeLeadingDotSegment(e);return hh.pattern.matchAny(i,r)}};X0.default=c2});var h2=C(Z0=>{"use strict";Object.defineProperty(Z0,"__esModule",{value:!0});var Hpe=_s(),g2=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return Hpe.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};Z0.default=g2});var d2=C(_0=>{"use strict";Object.defineProperty(_0,"__esModule",{value:!0});var f2=_s(),p2=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=f2.path.makeAbsolute(this._settings.cwd,r),r=f2.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};_0.default=p2});var Om=C($0=>{"use strict";Object.defineProperty($0,"__esModule",{value:!0});var Gpe=require("path"),Ype=l2(),qpe=u2(),jpe=h2(),Jpe=d2(),C2=class{constructor(e){this._settings=e,this.errorFilter=new jpe.default(this._settings),this.entryFilter=new qpe.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new Ype.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new Jpe.default(this._settings)}_getRootDirectory(e){return Gpe.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};$0.default=C2});var I2=C(eb=>{"use strict";Object.defineProperty(eb,"__esModule",{value:!0});var Wpe=J0(),zpe=Om(),m2=class extends zpe.default{constructor(){super(...arguments);this._reader=new Wpe.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(r,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};eb.default=m2});var y2=C(tb=>{"use strict";Object.defineProperty(tb,"__esModule",{value:!0});var Vpe=require("stream"),Xpe=J0(),Zpe=Om(),E2=class extends Zpe.default{constructor(){super(...arguments);this._reader=new Xpe.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(r,e,i),s=new Vpe.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};tb.default=E2});var w2=C(rb=>{"use strict";Object.defineProperty(rb,"__esModule",{value:!0});var _pe=CA(),$pe=G0(),ede=q0(),B2=class extends ede.default{constructor(){super(...arguments);this._walkSync=$pe.walkSync,this._statSync=_pe.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,r);o===null||!r.entryFilter(o)||i.push(o)}return i}_getEntry(e,r,i){try{let n=this._getStat(e);return this._makeEntry(n,r)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};rb.default=B2});var b2=C(ib=>{"use strict";Object.defineProperty(ib,"__esModule",{value:!0});var tde=w2(),rde=Om(),Q2=class extends rde.default{constructor(){super(...arguments);this._reader=new tde.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(r,e,i).map(i.transform)}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};ib.default=Q2});var S2=C(fh=>{"use strict";Object.defineProperty(fh,"__esModule",{value:!0});var ec=require("fs"),ide=require("os"),nde=ide.cpus().length;fh.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:ec.lstat,lstatSync:ec.lstatSync,stat:ec.stat,statSync:ec.statSync,readdir:ec.readdir,readdirSync:ec.readdirSync};var D2=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,nde),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},fh.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};fh.default=D2});var Km=C((Y6e,x2)=>{"use strict";var k2=l1(),sde=I2(),ode=y2(),ade=b2(),nb=S2(),mA=_s();async function ob(t,e){tc(t);let r=sb(t,sde.default,e),i=await Promise.all(r);return mA.array.flatten(i)}(function(t){function e(o,a){tc(o);let l=sb(o,ade.default,a);return mA.array.flatten(l)}t.sync=e;function r(o,a){tc(o);let l=sb(o,ode.default,a);return mA.stream.merge(l)}t.stream=r;function i(o,a){tc(o);let l=[].concat(o),c=new nb.default(a);return k2.generate(l,c)}t.generateTasks=i;function n(o,a){tc(o);let l=new nb.default(a);return mA.pattern.isDynamicPattern(o,l)}t.isDynamicPattern=n;function s(o){return tc(o),mA.path.escape(o)}t.escapePath=s})(ob||(ob={}));function sb(t,e,r){let i=[].concat(t),n=new nb.default(r),s=k2.generate(i,n),o=new e(n);return s.map(o.read,o)}function tc(t){if(![].concat(t).every(i=>mA.string.isString(i)&&!mA.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}x2.exports=ob});var P2=C(IA=>{"use strict";var{promisify:Ade}=require("util"),v2=require("fs");async function ab(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return(await Ade(v2[t])(r))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Ab(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return v2[t](r)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}IA.isFile=ab.bind(null,"stat","isFile");IA.isDirectory=ab.bind(null,"stat","isDirectory");IA.isSymlink=ab.bind(null,"lstat","isSymbolicLink");IA.isFileSync=Ab.bind(null,"statSync","isFile");IA.isDirectorySync=Ab.bind(null,"statSync","isDirectory");IA.isSymlinkSync=Ab.bind(null,"lstatSync","isSymbolicLink")});var L2=C((j6e,lb)=>{"use strict";var EA=require("path"),F2=P2(),R2=t=>t.length>1?`{${t.join(",")}}`:t[0],N2=(t,e)=>{let r=t[0]==="!"?t.slice(1):t;return EA.isAbsolute(r)?r:EA.join(e,r)},lde=(t,e)=>EA.extname(t)?`**/${t}`:`**/${t}.${R2(e)}`,M2=(t,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(r=>EA.posix.join(t,lde(r,e.extensions))):e.files?e.files.map(r=>EA.posix.join(t,`**/${r}`)):e.extensions?[EA.posix.join(t,`**/*.${R2(e.extensions)}`)]:[EA.posix.join(t,"**")]};lb.exports=async(t,e)=>{if(e=v({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=await Promise.all([].concat(t).map(async i=>await F2.isDirectory(N2(i,e.cwd))?M2(i,e):i));return[].concat.apply([],r)};lb.exports.sync=(t,e)=>{if(e=v({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=[].concat(t).map(i=>F2.isDirectorySync(N2(i,e.cwd))?M2(i,e):i);return[].concat.apply([],r)}});var q2=C((J6e,T2)=>{function O2(t){return Array.isArray(t)?t:[t]}var cde=/^\s+$/,ude=/^\\!/,gde=/^\\#/,hde=/\r?\n/g,fde=/^\.*\/|^\.+$/,cb="/",K2=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",pde=(t,e,r)=>Object.defineProperty(t,e,{value:r}),dde=/([0-z])-([0-z])/g,Cde=t=>t.replace(dde,(e,r,i)=>r.charCodeAt(0)<=i.charCodeAt(0)?e:""),mde=[[/\\?\s+$/,t=>t.indexOf("\\")===0?" ":""],[/\\\s/g,()=>" "],[/[\\^$.|*+(){]/g,t=>`\\${t}`],[/\[([^\]/]*)($|\])/g,(t,e,r)=>r==="]"?`[${Cde(e)}]`:`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,r)=>e+6`${e}[^\\/]*`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`],[/\\\\\\/g,()=>"\\"]],U2=Object.create(null),Ide=(t,e,r)=>{let i=U2[t];if(i)return i;let n=mde.reduce((s,o)=>s.replace(o[0],o[1].bind(t)),t);return U2[t]=r?new RegExp(n,"i"):new RegExp(n)},ub=t=>typeof t=="string",Ede=t=>t&&ub(t)&&!cde.test(t)&&t.indexOf("#")!==0,yde=t=>t.split(hde),H2=class{constructor(e,r,i,n){this.origin=e,this.pattern=r,this.negative=i,this.regex=n}},Bde=(t,e)=>{let r=t,i=!1;t.indexOf("!")===0&&(i=!0,t=t.substr(1)),t=t.replace(ude,"!").replace(gde,"#");let n=Ide(t,i,e);return new H2(r,t,i,n)},wde=(t,e)=>{throw new e(t)},eo=(t,e,r)=>ub(t)?t?eo.isNotRelative(t)?r(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${e}\``,TypeError),G2=t=>fde.test(t);eo.isNotRelative=G2;eo.convert=t=>t;var Y2=class{constructor({ignorecase:e=!0}={}){this._rules=[],this._ignorecase=e,pde(this,K2,!0),this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[K2]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(Ede(e)){let r=Bde(e,this._ignorecase);this._added=!0,this._rules.push(r)}}add(e){return this._added=!1,O2(ub(e)?yde(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,r){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!r)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,r,i,n){let s=e&&eo.convert(e);return eo(s,e,wde),this._t(s,r,i,n)}_t(e,r,i,n){if(e in r)return r[e];if(n||(n=e.split(cb)),n.pop(),!n.length)return r[e]=this._testOne(e,i);let s=this._t(n.join(cb)+cb,r,i,n);return r[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return O2(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},Um=t=>new Y2(t),Qde=()=>!1,bde=t=>eo(t&&eo.convert(t),t,Qde);Um.isPathValid=bde;Um.default=Um;T2.exports=Um;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");eo.convert=t;let e=/^[a-z]:\//i;eo.isNotRelative=r=>e.test(r)||G2(r)}});var J2=C((W6e,j2)=>{"use strict";j2.exports=t=>{let e=/^\\\\\?\\/.test(t),r=/[^\u0000-\u0080]+/.test(t);return e||r?t:t.replace(/\\/g,"/")}});var $2=C((z6e,gb)=>{"use strict";var{promisify:Dde}=require("util"),W2=require("fs"),to=require("path"),z2=Km(),Sde=q2(),ph=J2(),V2=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],xde=Dde(W2.readFile),kde=t=>e=>e.startsWith("!")?"!"+to.posix.join(t,e.slice(1)):to.posix.join(t,e),vde=(t,e)=>{let r=ph(to.relative(e.cwd,to.dirname(e.fileName)));return t.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(kde(r))},X2=t=>{let e=Sde();for(let r of t)e.add(vde(r.content,{cwd:r.cwd,fileName:r.filePath}));return e},Pde=(t,e)=>{if(t=ph(t),to.isAbsolute(e)){if(ph(e).startsWith(t))return e;throw new Error(`Path ${e} is not in cwd ${t}`)}return to.join(t,e)},Z2=(t,e)=>r=>t.ignores(ph(to.relative(e,Pde(e,r.path||r)))),Fde=async(t,e)=>{let r=to.join(e,t),i=await xde(r,"utf8");return{cwd:e,filePath:r,content:i}},Rde=(t,e)=>{let r=to.join(e,t),i=W2.readFileSync(r,"utf8");return{cwd:e,filePath:r,content:i}},_2=({ignore:t=[],cwd:e=ph(process.cwd())}={})=>({ignore:t,cwd:e});gb.exports=async t=>{t=_2(t);let e=await z2("**/.gitignore",{ignore:V2.concat(t.ignore),cwd:t.cwd}),r=await Promise.all(e.map(n=>Fde(n,t.cwd))),i=X2(r);return Z2(i,t.cwd)};gb.exports.sync=t=>{t=_2(t);let r=z2.sync("**/.gitignore",{ignore:V2.concat(t.ignore),cwd:t.cwd}).map(n=>Rde(n,t.cwd)),i=X2(r);return Z2(i,t.cwd)}});var iH=C((V6e,eH)=>{"use strict";var{Transform:Nde}=require("stream"),hb=class extends Nde{constructor(){super({objectMode:!0})}},tH=class extends hb{constructor(e){super();this._filter=e}_transform(e,r,i){this._filter(e)&&this.push(e),i()}},rH=class extends hb{constructor(){super();this._pushed=new Set}_transform(e,r,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};eH.exports={FilterStream:tH,UniqueStream:rH}});var Cb=C((X6e,yA)=>{"use strict";var nH=require("fs"),Hm=FU(),Mde=h0(),Gm=Km(),Ym=L2(),fb=$2(),{FilterStream:Lde,UniqueStream:Tde}=iH(),sH=()=>!1,oH=t=>t[0]==="!",Ode=t=>{if(!t.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},Kde=(t={})=>{if(!t.cwd)return;let e;try{e=nH.statSync(t.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},Ude=t=>t.stats instanceof nH.Stats?t.path:t,qm=(t,e)=>{t=Hm([].concat(t)),Ode(t),Kde(e);let r=[];e=v({ignore:[],expandDirectories:!0},e);for(let[i,n]of t.entries()){if(oH(n))continue;let s=t.slice(i).filter(a=>oH(a)).map(a=>a.slice(1)),o=W(v({},e),{ignore:e.ignore.concat(s)});r.push({pattern:n,options:o})}return r},Hde=(t,e)=>{let r={};return t.options.cwd&&(r.cwd=t.options.cwd),Array.isArray(t.options.expandDirectories)?r=W(v({},r),{files:t.options.expandDirectories}):typeof t.options.expandDirectories=="object"&&(r=v(v({},r),t.options.expandDirectories)),e(t.pattern,r)},pb=(t,e)=>t.options.expandDirectories?Hde(t,e):[t.pattern],aH=t=>t&&t.gitignore?fb.sync({cwd:t.cwd,ignore:t.ignore}):sH,db=t=>e=>{let{options:r}=t;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=Ym.sync(r.ignore)),{pattern:e,options:r}};yA.exports=async(t,e)=>{let r=qm(t,e),i=async()=>e&&e.gitignore?fb({cwd:e.cwd,ignore:e.ignore}):sH,n=async()=>{let l=await Promise.all(r.map(async c=>{let u=await pb(c,Ym);return Promise.all(u.map(db(c)))}));return Hm(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>Gm(l.pattern,l.options)));return Hm(...a).filter(l=>!s(Ude(l)))};yA.exports.sync=(t,e)=>{let r=qm(t,e),i=[];for(let o of r){let a=pb(o,Ym.sync).map(db(o));i.push(...a)}let n=aH(e),s=[];for(let o of i)s=Hm(s,Gm.sync(o.pattern,o.options));return s.filter(o=>!n(o))};yA.exports.stream=(t,e)=>{let r=qm(t,e),i=[];for(let a of r){let l=pb(a,Ym.sync).map(db(a));i.push(...l)}let n=aH(e),s=new Lde(a=>!n(a)),o=new Tde;return Mde(i.map(a=>Gm.stream(a.pattern,a.options))).pipe(s).pipe(o)};yA.exports.generateGlobTasks=qm;yA.exports.hasMagic=(t,e)=>[].concat(t).some(r=>Gm.isDynamicPattern(r,e));yA.exports.gitignore=fb});var io=C((ro,iI)=>{"use strict";Object.defineProperty(ro,"__esModule",{value:!0});var dH=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function eCe(t){return dH.includes(t)}var tCe=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","HTMLElement",...dH];function rCe(t){return tCe.includes(t)}var iCe=["null","undefined","string","number","bigint","boolean","symbol"];function nCe(t){return iCe.includes(t)}function Ac(t){return e=>typeof e===t}var{toString:CH}=Object.prototype,Dh=t=>{let e=CH.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&q.domElement(t))return"HTMLElement";if(rCe(e))return e},Zt=t=>e=>Dh(e)===t;function q(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(q.observable(t))return"Observable";if(q.array(t))return"Array";if(q.buffer(t))return"Buffer";let e=Dh(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}q.undefined=Ac("undefined");q.string=Ac("string");var sCe=Ac("number");q.number=t=>sCe(t)&&!q.nan(t);q.bigint=Ac("bigint");q.function_=Ac("function");q.null_=t=>t===null;q.class_=t=>q.function_(t)&&t.toString().startsWith("class ");q.boolean=t=>t===!0||t===!1;q.symbol=Ac("symbol");q.numericString=t=>q.string(t)&&!q.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));q.array=(t,e)=>Array.isArray(t)?q.function_(e)?t.every(e):!0:!1;q.buffer=t=>{var e,r,i,n;return(n=(i=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||i===void 0?void 0:i.call(r,t))!==null&&n!==void 0?n:!1};q.nullOrUndefined=t=>q.null_(t)||q.undefined(t);q.object=t=>!q.null_(t)&&(typeof t=="object"||q.function_(t));q.iterable=t=>{var e;return q.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};q.asyncIterable=t=>{var e;return q.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};q.generator=t=>q.iterable(t)&&q.function_(t.next)&&q.function_(t.throw);q.asyncGenerator=t=>q.asyncIterable(t)&&q.function_(t.next)&&q.function_(t.throw);q.nativePromise=t=>Zt("Promise")(t);var oCe=t=>{var e,r;return q.function_((e=t)===null||e===void 0?void 0:e.then)&&q.function_((r=t)===null||r===void 0?void 0:r.catch)};q.promise=t=>q.nativePromise(t)||oCe(t);q.generatorFunction=Zt("GeneratorFunction");q.asyncGeneratorFunction=t=>Dh(t)==="AsyncGeneratorFunction";q.asyncFunction=t=>Dh(t)==="AsyncFunction";q.boundFunction=t=>q.function_(t)&&!t.hasOwnProperty("prototype");q.regExp=Zt("RegExp");q.date=Zt("Date");q.error=Zt("Error");q.map=t=>Zt("Map")(t);q.set=t=>Zt("Set")(t);q.weakMap=t=>Zt("WeakMap")(t);q.weakSet=t=>Zt("WeakSet")(t);q.int8Array=Zt("Int8Array");q.uint8Array=Zt("Uint8Array");q.uint8ClampedArray=Zt("Uint8ClampedArray");q.int16Array=Zt("Int16Array");q.uint16Array=Zt("Uint16Array");q.int32Array=Zt("Int32Array");q.uint32Array=Zt("Uint32Array");q.float32Array=Zt("Float32Array");q.float64Array=Zt("Float64Array");q.bigInt64Array=Zt("BigInt64Array");q.bigUint64Array=Zt("BigUint64Array");q.arrayBuffer=Zt("ArrayBuffer");q.sharedArrayBuffer=Zt("SharedArrayBuffer");q.dataView=Zt("DataView");q.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;q.urlInstance=t=>Zt("URL")(t);q.urlString=t=>{if(!q.string(t))return!1;try{return new URL(t),!0}catch(e){return!1}};q.truthy=t=>Boolean(t);q.falsy=t=>!t;q.nan=t=>Number.isNaN(t);q.primitive=t=>q.null_(t)||nCe(typeof t);q.integer=t=>Number.isInteger(t);q.safeInteger=t=>Number.isSafeInteger(t);q.plainObject=t=>{if(CH.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};q.typedArray=t=>eCe(Dh(t));var aCe=t=>q.safeInteger(t)&&t>=0;q.arrayLike=t=>!q.nullOrUndefined(t)&&!q.function_(t)&&aCe(t.length);q.inRange=(t,e)=>{if(q.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(q.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var ACe=1,lCe=["innerHTML","ownerDocument","style","attributes","nodeValue"];q.domElement=t=>q.object(t)&&t.nodeType===ACe&&q.string(t.nodeName)&&!q.plainObject(t)&&lCe.every(e=>e in t);q.observable=t=>{var e,r,i,n;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((n=(i=t)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};q.nodeStream=t=>q.object(t)&&q.function_(t.pipe)&&!q.observable(t);q.infinite=t=>t===Infinity||t===-Infinity;var mH=t=>e=>q.integer(e)&&Math.abs(e%2)===t;q.evenInteger=mH(0);q.oddInteger=mH(1);q.emptyArray=t=>q.array(t)&&t.length===0;q.nonEmptyArray=t=>q.array(t)&&t.length>0;q.emptyString=t=>q.string(t)&&t.length===0;q.nonEmptyString=t=>q.string(t)&&t.length>0;var cCe=t=>q.string(t)&&!/\S/.test(t);q.emptyStringOrWhitespace=t=>q.emptyString(t)||cCe(t);q.emptyObject=t=>q.object(t)&&!q.map(t)&&!q.set(t)&&Object.keys(t).length===0;q.nonEmptyObject=t=>q.object(t)&&!q.map(t)&&!q.set(t)&&Object.keys(t).length>0;q.emptySet=t=>q.set(t)&&t.size===0;q.nonEmptySet=t=>q.set(t)&&t.size>0;q.emptyMap=t=>q.map(t)&&t.size===0;q.nonEmptyMap=t=>q.map(t)&&t.size>0;var IH=(t,e,r)=>{if(!q.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};q.any=(t,...e)=>(q.array(t)?t:[t]).some(i=>IH(Array.prototype.some,i,e));q.all=(t,...e)=>IH(Array.prototype.every,t,e);var Te=(t,e,r)=>{if(!t)throw new TypeError(`Expected value which is \`${e}\`, received value of type \`${q(r)}\`.`)};ro.assert={undefined:t=>Te(q.undefined(t),"undefined",t),string:t=>Te(q.string(t),"string",t),number:t=>Te(q.number(t),"number",t),bigint:t=>Te(q.bigint(t),"bigint",t),function_:t=>Te(q.function_(t),"Function",t),null_:t=>Te(q.null_(t),"null",t),class_:t=>Te(q.class_(t),"Class",t),boolean:t=>Te(q.boolean(t),"boolean",t),symbol:t=>Te(q.symbol(t),"symbol",t),numericString:t=>Te(q.numericString(t),"string with a number",t),array:(t,e)=>{Te(q.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Te(q.buffer(t),"Buffer",t),nullOrUndefined:t=>Te(q.nullOrUndefined(t),"null or undefined",t),object:t=>Te(q.object(t),"Object",t),iterable:t=>Te(q.iterable(t),"Iterable",t),asyncIterable:t=>Te(q.asyncIterable(t),"AsyncIterable",t),generator:t=>Te(q.generator(t),"Generator",t),asyncGenerator:t=>Te(q.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Te(q.nativePromise(t),"native Promise",t),promise:t=>Te(q.promise(t),"Promise",t),generatorFunction:t=>Te(q.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Te(q.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Te(q.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Te(q.boundFunction(t),"Function",t),regExp:t=>Te(q.regExp(t),"RegExp",t),date:t=>Te(q.date(t),"Date",t),error:t=>Te(q.error(t),"Error",t),map:t=>Te(q.map(t),"Map",t),set:t=>Te(q.set(t),"Set",t),weakMap:t=>Te(q.weakMap(t),"WeakMap",t),weakSet:t=>Te(q.weakSet(t),"WeakSet",t),int8Array:t=>Te(q.int8Array(t),"Int8Array",t),uint8Array:t=>Te(q.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Te(q.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Te(q.int16Array(t),"Int16Array",t),uint16Array:t=>Te(q.uint16Array(t),"Uint16Array",t),int32Array:t=>Te(q.int32Array(t),"Int32Array",t),uint32Array:t=>Te(q.uint32Array(t),"Uint32Array",t),float32Array:t=>Te(q.float32Array(t),"Float32Array",t),float64Array:t=>Te(q.float64Array(t),"Float64Array",t),bigInt64Array:t=>Te(q.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Te(q.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Te(q.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Te(q.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Te(q.dataView(t),"DataView",t),urlInstance:t=>Te(q.urlInstance(t),"URL",t),urlString:t=>Te(q.urlString(t),"string with a URL",t),truthy:t=>Te(q.truthy(t),"truthy",t),falsy:t=>Te(q.falsy(t),"falsy",t),nan:t=>Te(q.nan(t),"NaN",t),primitive:t=>Te(q.primitive(t),"primitive",t),integer:t=>Te(q.integer(t),"integer",t),safeInteger:t=>Te(q.safeInteger(t),"integer",t),plainObject:t=>Te(q.plainObject(t),"plain object",t),typedArray:t=>Te(q.typedArray(t),"TypedArray",t),arrayLike:t=>Te(q.arrayLike(t),"array-like",t),domElement:t=>Te(q.domElement(t),"HTMLElement",t),observable:t=>Te(q.observable(t),"Observable",t),nodeStream:t=>Te(q.nodeStream(t),"Node.js Stream",t),infinite:t=>Te(q.infinite(t),"infinite number",t),emptyArray:t=>Te(q.emptyArray(t),"empty array",t),nonEmptyArray:t=>Te(q.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Te(q.emptyString(t),"empty string",t),nonEmptyString:t=>Te(q.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>Te(q.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>Te(q.emptyObject(t),"empty object",t),nonEmptyObject:t=>Te(q.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Te(q.emptySet(t),"empty set",t),nonEmptySet:t=>Te(q.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Te(q.emptyMap(t),"empty map",t),nonEmptyMap:t=>Te(q.nonEmptyMap(t),"non-empty map",t),evenInteger:t=>Te(q.evenInteger(t),"even integer",t),oddInteger:t=>Te(q.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Te(q.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Te(q.inRange(t,e),"in range",t),any:(t,...e)=>Te(q.any(t,...e),"predicate returns truthy for any value",e),all:(t,...e)=>Te(q.all(t,...e),"predicate returns truthy for all values",e)};Object.defineProperties(q,{class:{value:q.class_},function:{value:q.function_},null:{value:q.null_}});Object.defineProperties(ro.assert,{class:{value:ro.assert.class_},function:{value:ro.assert.function_},null:{value:ro.assert.null_}});ro.default=q;iI.exports=q;iI.exports.default=q;iI.exports.assert=ro.assert});var EH=C((CVe,Pb)=>{"use strict";var Fb=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},Sh=class{static fn(e){return(...r)=>new Sh((i,n,s)=>{r.push(s),e(...r).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,i)=>{this._reject=i;let n=a=>{this._isPending=!1,r(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Fb(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Sh.prototype,Promise.prototype);Pb.exports=Sh;Pb.exports.CancelError=Fb});var yH=C((Rb,Nb)=>{"use strict";Object.defineProperty(Rb,"__esModule",{value:!0});var uCe=require("tls"),Mb=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let i=typeof r.connect=="function",n=typeof r.secureConnect=="function",s=typeof r.close=="function",o=()=>{i&&r.connect(),t instanceof uCe.TLSSocket&&n&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),s&&t.once("close",r.close)};t.writable&&!t.connecting?o():t.connecting?t.once("connect",o):t.destroyed&&s&&r.close(t._hadError)};Rb.default=Mb;Nb.exports=Mb;Nb.exports.default=Mb});var BH=C((Lb,Tb)=>{"use strict";Object.defineProperty(Lb,"__esModule",{value:!0});var gCe=yH(),hCe=Number(process.versions.node.split(".")[0]),Ob=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||hCe>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),gCe.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?i(t.socket):t.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?n():t.prependOnceListener("finish",n),t.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,r(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};Lb.default=Ob;Tb.exports=Ob;Tb.exports.default=Ob});var kH=C((mVe,Kb)=>{"use strict";var{V4MAPPED:fCe,ADDRCONFIG:pCe,ALL:wH,promises:{Resolver:QH},lookup:dCe}=require("dns"),{promisify:Ub}=require("util"),CCe=require("os"),lc=Symbol("cacheableLookupCreateConnection"),Hb=Symbol("cacheableLookupInstance"),bH=Symbol("expires"),mCe=typeof wH=="number",DH=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},ICe=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},SH=()=>{let t=!1,e=!1;for(let r of Object.values(CCe.networkInterfaces()))for(let i of r)if(!i.internal&&(i.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},ECe=t=>Symbol.iterator in t,xH={ttl:!0},yCe={all:!0},Gb=class{constructor({cache:e=new Map,maxTtl:r=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new QH,lookup:o=dCe}={}){if(this.maxTtl=r,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Ub(o),this._resolver instanceof QH?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Ub(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Ub(this._resolver.resolve6.bind(this._resolver))),this._iface=SH(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,i){if(typeof r=="function"?(i=r,r={}):typeof r=="number"&&(r={family:r}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(n=>{r.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let i=await this.query(e);if(r.family===6){let n=i.filter(s=>s.family===6);r.hints&fCe&&(mCe&&r.hints&wH||n.length===0)?ICe(i):i=n}else r.family===4&&(i=i.filter(n=>n.family===4));if(r.hints&pCe){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return r.all?i:i[0]}async query(e){let r=await this._cache.get(e);if(!r){let i=this._pending[e];if(i)r=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,r=await n}}return r=r.map(i=>v({},i)),r}async _resolve(e){let r=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,xH),this._resolve6(e,xH)].map(c=>r(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(r){return{entries:[],cacheTtl:0}}}async _set(e,r,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,r[bH]=Date.now()+i;try{await this._cache.set(e,r,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}ECe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,yCe);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let i=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,i),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[bH];n>=a?this._cache.delete(s):a("lookup"in r||(r.lookup=this.lookup),e[lc](r,i))}uninstall(e){if(DH(e),e[lc]){if(e[Hb]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[lc],delete e[lc],delete e[Hb]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=SH(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};Kb.exports=Gb;Kb.exports.default=Gb});var FH=C((IVe,Yb)=>{"use strict";var BCe=typeof URL=="undefined"?require("url").URL:URL,wCe="text/plain",QCe="us-ascii",vH=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),bCe=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let i=r[1].split(";"),n=r[2],s=e?"":r[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,h=""]=u.split("=").map(f=>f.trim());return g==="charset"&&(h=h.toLowerCase(),h===QCe)?"":`${g}${h?`=${h}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==wCe)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},PH=(t,e)=>{if(e=v({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return bCe(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new BCe(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];vH(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])vH(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};Yb.exports=PH;Yb.exports.default=PH});var MH=C((EVe,RH)=>{RH.exports=NH;function NH(t,e){if(t&&e)return NH(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(i){r[i]=t[i]}),r;function r(){for(var i=new Array(arguments.length),n=0;n{var LH=MH();qb.exports=LH(nI);qb.exports.strict=LH(TH);nI.proto=nI(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return nI(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return TH(this)},configurable:!0})});function nI(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function TH(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var Jb=C((BVe,OH)=>{var DCe=jb(),SCe=function(){},xCe=function(t){return t.setHeader&&typeof t.abort=="function"},kCe=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},KH=function(t,e,r){if(typeof e=="function")return KH(t,null,e);e||(e={}),r=DCe(r||SCe);var i=t._writableState,n=t._readableState,s=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,a=function(){t.writable||l()},l=function(){o=!1,s||r.call(t)},c=function(){s=!1,o||r.call(t)},u=function(p){r.call(t,p?new Error("exited with error code: "+p):null)},g=function(p){r.call(t,p)},h=function(){if(s&&!(n&&n.ended))return r.call(t,new Error("premature close"));if(o&&!(i&&i.ended))return r.call(t,new Error("premature close"))},f=function(){t.req.on("finish",l)};return xCe(t)?(t.on("complete",l),t.on("abort",h),t.req?f():t.on("request",f)):o&&!i&&(t.on("end",a),t.on("close",a)),kCe(t)&&t.on("exit",u),t.on("end",c),t.on("finish",l),e.error!==!1&&t.on("error",g),t.on("close",h),function(){t.removeListener("complete",l),t.removeListener("abort",h),t.removeListener("request",f),t.req&&t.req.removeListener("finish",l),t.removeListener("end",a),t.removeListener("close",a),t.removeListener("finish",l),t.removeListener("exit",u),t.removeListener("end",c),t.removeListener("error",g),t.removeListener("close",h)}};OH.exports=KH});var GH=C((wVe,UH)=>{var vCe=jb(),PCe=Jb(),Wb=require("fs"),xh=function(){},FCe=/^v?\.0/.test(process.version),sI=function(t){return typeof t=="function"},RCe=function(t){return!FCe||!Wb?!1:(t instanceof(Wb.ReadStream||xh)||t instanceof(Wb.WriteStream||xh))&&sI(t.close)},NCe=function(t){return t.setHeader&&sI(t.abort)},MCe=function(t,e,r,i){i=vCe(i);var n=!1;t.on("close",function(){n=!0}),PCe(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,RCe(t))return t.close(xh);if(NCe(t))return t.abort();if(sI(t.destroy))return t.destroy();i(o||new Error("stream was destroyed"))}}},HH=function(t){t()},LCe=function(t,e){return t.pipe(e)},TCe=function(){var t=Array.prototype.slice.call(arguments),e=sI(t[t.length-1]||xh)&&t.pop()||xh;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,i=t.map(function(n,s){var o=s0;return MCe(n,o,a,function(l){r||(r=l),l&&i.forEach(HH),!o&&(i.forEach(HH),e(r))})});return t.reduce(LCe)};UH.exports=TCe});var qH=C((QVe,YH)=>{"use strict";var{PassThrough:OCe}=require("stream");YH.exports=t=>{t=v({},t);let{array:e}=t,{encoding:r}=t,i=r==="buffer",n=!1;e?n=!(r||i):r=r||"utf8",i&&(r=null);let s=new OCe({objectMode:n});r&&s.setEncoding(r);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var jH=C((bVe,cc)=>{"use strict";var KCe=GH(),UCe=qH(),zb=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function oI(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=v({maxBuffer:Infinity},e);let{maxBuffer:r}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=KCe(t,UCe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>r&&o(new zb)})}),i.getBufferedValue()}cc.exports=oI;cc.exports.default=oI;cc.exports.buffer=(t,e)=>oI(t,W(v({},e),{encoding:"buffer"}));cc.exports.array=(t,e)=>oI(t,W(v({},e),{array:!0}));cc.exports.MaxBufferError=zb});var WH=C((SVe,JH)=>{"use strict";var HCe=[200,203,204,206,300,301,404,405,410,414,501],GCe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],YCe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},qCe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function Vb(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let i of r){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function jCe(t){let e=[];for(let r in t){let i=t[r];e.push(i===!0?r:r+"="+i)}if(!!e.length)return e.join(", ")}JH.exports=class{constructor(e,r,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=Vb(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=Vb(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":jCe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!r.headers["cache-control"]&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&GCe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||HCe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=Vb(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of r)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let i in e)YCe[i]||(r[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete r[n]}if(r.warning){let i=r.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?r.warning=i.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let r=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(r-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let n=r["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?r["if-none-match"]=n.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),!r||!r.headers)throw Error("Response headers missing");let i=!1;if(r.status!==void 0&&r.status!=304?i=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in r.headers&&!qCe[o]?r.headers[o]:this._resHeaders[o];let s=Object.assign({},r,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var aI=C((xVe,zH)=>{"use strict";zH.exports=t=>{let e={};for(let[r,i]of Object.entries(t))e[r.toLowerCase()]=i;return e}});var ZH=C((kVe,VH)=>{"use strict";var JCe=require("stream").Readable,WCe=aI(),XH=class extends JCe{constructor(e,r,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=WCe(r),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};VH.exports=XH});var $H=C((vVe,_H)=>{"use strict";var zCe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];_H.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(zCe));for(let i of r)i in e||(e[i]=typeof t[i]=="function"?t[i].bind(t):t[i])}});var tG=C((PVe,eG)=>{"use strict";var VCe=require("stream").PassThrough,XCe=$H(),ZCe=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new VCe;return XCe(t,e),t.pipe(e)};eG.exports=ZCe});var rG=C(Xb=>{Xb.stringify=function t(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",i=Array.isArray(e);r=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(r+=","),n=!1,i?e[s]==null?r+="null":r+=t(e[s]):e[s]!==void 0&&(r+=t(s)+":"+t(e[s])))}return r+=i?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};Xb.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var oG=C((RVe,iG)=>{"use strict";var _Ce=require("events"),nG=rG(),$Ce=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(require(e[r]))(t)}return new Map},sG=class extends _Ce{constructor(e,r){super();if(this.opts=Object.assign({namespace:"keyv",serialize:nG.stringify,deserialize:nG.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=$Ce(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return r&&r.raw?n:n.value}})}set(e,r,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return r={value:r,expires:s},this.opts.serialize(r)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};iG.exports=sG});var lG=C((NVe,aG)=>{"use strict";var eme=require("events"),AI=require("url"),tme=FH(),rme=jH(),Zb=WH(),AG=ZH(),ime=aI(),nme=tG(),sme=oG(),us=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new sme({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,i)=>{let n;if(typeof r=="string")n=_b(AI.parse(r)),r={};else if(r instanceof AI.URL)n=_b(AI.parse(r.toString())),r={};else{let[g,...h]=(r.path||"").split("?"),f=h.length>0?`?${h.join("?")}`:"";n=_b(W(v({},r),{pathname:g,search:f}))}r=v(v({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},r),ome(n)),r.headers=ime(r.headers);let s=new eme,o=tme(AI.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${r.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let h=!1,f,p=new Promise(I=>{f=()=>{h||(h=!0,I())}}),m=I=>{if(l&&!g.forceRefresh){I.status=I.statusCode;let w=Zb.fromObject(l.cachePolicy).revalidatedPolicy(g,I);if(!w.modified){let x=w.policy.responseHeaders();I=new AG(l.statusCode,x,l.body,l.url),I.cachePolicy=w.policy,I.fromCache=!0}}I.fromCache||(I.cachePolicy=new Zb(g,I,g),I.fromCache=!1);let Q;g.cache&&I.cachePolicy.storable()?(Q=nme(I),(async()=>{try{let w=rme.buffer(I);if(await Promise.race([p,new Promise(T=>I.once("end",T))]),h)return;let x=await w,N={cachePolicy:I.cachePolicy.toObject(),url:I.url,statusCode:I.fromCache?l.statusCode:I.statusCode,body:x},H=g.strictTtl?I.cachePolicy.timeToLive():void 0;g.maxTtl&&(H=H?Math.min(H,g.maxTtl):g.maxTtl),await this.cache.set(a,N,H)}catch(w){s.emit("error",new us.CacheError(w))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(w){s.emit("error",new us.CacheError(w))}})(),s.emit("response",Q||I),typeof i=="function"&&i(Q||I)};try{let I=e(g,m);I.once("error",f),I.once("abort",f),s.emit("request",I)}catch(I){s.emit("error",new us.RequestError(I))}};return(async()=>{let g=async f=>{await Promise.resolve();let p=f.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(f);let m=Zb.fromObject(p.cachePolicy);if(m.satisfiesWithoutRevalidation(f)&&!f.forceRefresh){let I=m.responseHeaders(),Q=new AG(p.statusCode,I,p.body,p.url);Q.cachePolicy=m,Q.fromCache=!0,s.emit("response",Q),typeof i=="function"&&i(Q)}else l=p,f.headers=m.revalidationHeaders(f),u(f)},h=f=>s.emit("error",new us.CacheError(f));this.cache.once("error",h),s.on("response",()=>this.cache.removeListener("error",h));try{await g(r)}catch(f){r.automaticFailover&&!c&&u(r),s.emit("error",new us.CacheError(f))}})(),s}}};function ome(t){let e=v({},t);return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function _b(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}us.RequestError=class extends Error{constructor(t){super(t.message);this.name="RequestError",Object.assign(this,t)}};us.CacheError=class extends Error{constructor(t){super(t.message);this.name="CacheError",Object.assign(this,t)}};aG.exports=us});var uG=C((MVe,cG)=>{"use strict";var ame=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];cG.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(ame)),i={};for(let n of r)n in e||(i[n]={get(){let s=t[n];return typeof s=="function"?s.bind(t):s},set(s){t[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var hG=C((LVe,gG)=>{"use strict";var{Transform:Ame,PassThrough:lme}=require("stream"),$b=require("zlib"),cme=uG();gG.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof $b.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let i=!0,n=new Ame({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new lme({autoDestroy:!1,destroy(a,l){t.destroy(),l(a)}}),o=r?$b.createBrotliDecompress():$b.createUnzip();return o.once("error",a=>{if(i&&!t.readable){s.end();return}s.destroy(a)}),cme(t,s),t.pipe(n).pipe(o).pipe(s),s}});var eD=C((TVe,fG)=>{"use strict";var pG=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};fG.exports=pG});var rD=C((OVe,dG)=>{"use strict";var ume=require("events"),gme=require("tls"),hme=require("http2"),fme=eD(),fi=Symbol("currentStreamsCount"),CG=Symbol("request"),fn=Symbol("cachedOriginSet"),uc=Symbol("gracefullyClosing"),pme=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],dme=(t,e,r)=>{let i=0,n=t.length;for(;i>>1;r(t[s],e)?i=s+1:n=s}return i},Cme=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,tD=(t,e)=>{for(let r of t)r[fn].lengthe[fn].includes(i))&&r[fi]+e[fi]<=e.remoteSettings.maxConcurrentStreams&&mG(r)},mme=(t,e)=>{for(let r of t)e[fn].lengthr[fn].includes(i))&&e[fi]+r[fi]<=r.remoteSettings.maxConcurrentStreams&&mG(e)},IG=({agent:t,isFree:e})=>{let r={};for(let i in t.sessions){let s=t.sessions[i].filter(o=>{let a=o[no.kCurrentStreamsCount]{t[uc]=!0,t[fi]===0&&t.close()},no=class extends ume{constructor({timeout:e=6e4,maxSessions:r=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new fme({maxSize:n})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let i of pme)e[i]&&(r+=`:${e[i]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let i=this.queue[e][r];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(r),a=no.normalizeOrigin(e,r&&r.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,h=-1,f;for(let p of u){let m=p.remoteSettings.maxConcurrentStreams;if(m=m||p[uc]||p.destroyed)continue;f||(g=m),I>h&&(f=p,h=I)}}if(f){if(i.length!==1){for(let{reject:p}of i){let m=new Error(`Expected the length of listeners to be 1, got ${i.length}. -Please report this to https://github.com/szmarczak/http2-wrapper/`);p(m)}return}i[0].resolve(f);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let h=hme.connect(e,v({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},r));h[fi]=0,h[uc]=!1;let f=()=>h[fi]{this.tlsSessionCache.set(u,I)}),h.once("error",I=>{for(let{reject:Q}of i)Q(I);this.tlsSessionCache.delete(u)}),h.setTimeout(this.timeout,()=>{h.destroy()}),h.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let I=this.sessions[o];I.splice(I.indexOf(h),1),I.length===0&&delete this.sessions[o]}else{let I=new Error("Session closed without receiving a SETTINGS frame");I.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:Q}of i)Q(I);l()}this._tryToCreateNewSession(o,a)});let m=()=>{if(!(!(o in this.queue)||!f())){for(let I of h[fn])if(I in this.queue[o]){let{listeners:Q}=this.queue[o][I];for(;Q.length!==0&&f();)Q.shift().resolve(h);let w=this.queue[o];if(w[I].listeners.length===0&&(delete w[I],Object.keys(w).length===0)){delete this.queue[o];break}if(!f())break}}};h.on("origin",()=>{h[fn]=h.originSet,!!f()&&(m(),tD(this.sessions[o],h))}),h.once("remoteSettings",()=>{if(h.ref(),h.unref(),this._sessionsCount++,c.destroyed){let I=new Error("Agent has been destroyed");for(let Q of i)Q.reject(I);h.destroy();return}h[fn]=h.originSet;{let I=this.sessions;if(o in I){let Q=I[o];Q.splice(dme(Q,h,Cme),0,h)}else I[o]=[h]}this._freeSessionsCount+=1,g=!0,this.emit("session",h),m(),l(),h[fi]===0&&this._freeSessionsCount>this.maxFreeSessions&&h.close(),i.length!==0&&(this.getSession(a,r,i),i.length=0),h.on("remoteSettings",()=>{m(),tD(this.sessions[o],h)})}),h[CG]=h.request,h.request=(I,Q)=>{if(h[uc])throw new Error("The session is gracefully closing. No new streams are allowed.");let w=h[CG](I,Q);return h.ref(),++h[fi],h[fi]===h.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,w.once("close",()=>{if(p=f(),--h[fi],!h.destroyed&&!h.closed&&(mme(this.sessions[o],h),f()&&!h.closed)){p||(this._freeSessionsCount++,p=!0);let x=h[fi]===0;x&&h.unref(),x&&(this._freeSessionsCount>this.maxFreeSessions||h[uc])?h.close():(tD(this.sessions[o],h),m())}}),w}}catch(h){for(let f of i)f.reject(h);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,r,i,n){return new Promise((s,o)=>{this.getSession(e,r,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,r){return no.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof r.servername=="undefined"&&(r.servername=n),gme.connect(i,n,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[fi]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let i of r)i.destroy(e);for(let r of Object.values(this.queue))for(let i of Object.values(r))i.destroyed=!0;this.queue={}}get freeSessions(){return IG({agent:this,isFree:!0})}get busySessions(){return IG({agent:this,isFree:!1})}};no.kCurrentStreamsCount=fi;no.kGracefullyClosing=uc;dG.exports={Agent:no,globalAgent:new no}});var iD=C((KVe,EG)=>{"use strict";var{Readable:Ime}=require("stream"),yG=class extends Ime{constructor(e,r){super({highWaterMark:r,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};EG.exports=yG});var nD=C((UVe,BG)=>{"use strict";BG.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var QG=C((HVe,wG)=>{"use strict";wG.exports=(t,e,r)=>{for(let i of r)t.on(i,(...n)=>e.emit(i,...n))}});var DG=C((GVe,bG)=>{"use strict";bG.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var xG=C((qVe,SG)=>{"use strict";var gc=(t,e,r)=>{SG.exports[e]=class extends t{constructor(...n){super(typeof r=="string"?r:r(n));this.name=`${super.name} [${e}]`,this.code=e}}};gc(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],i=Array.isArray(r);return i&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${i?"one of":"of"} type ${r}. Received ${typeof t[2]}`});gc(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);gc(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);gc(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);gc(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);gc(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var AD=C((jVe,kG)=>{"use strict";var Eme=require("http2"),{Writable:yme}=require("stream"),{Agent:vG,globalAgent:Bme}=rD(),wme=iD(),Qme=nD(),bme=QG(),Dme=DG(),{ERR_INVALID_ARG_TYPE:sD,ERR_INVALID_PROTOCOL:Sme,ERR_HTTP_HEADERS_SENT:PG,ERR_INVALID_HTTP_TOKEN:xme,ERR_HTTP_INVALID_HEADER_VALUE:kme,ERR_INVALID_CHAR:vme}=xG(),{HTTP2_HEADER_STATUS:FG,HTTP2_HEADER_METHOD:RG,HTTP2_HEADER_PATH:NG,HTTP2_METHOD_CONNECT:Pme}=Eme.constants,Zr=Symbol("headers"),oD=Symbol("origin"),aD=Symbol("session"),MG=Symbol("options"),lI=Symbol("flushedHeaders"),kh=Symbol("jobs"),Fme=/^[\^`\-\w!#$%&*+.|~]+$/,Rme=/[^\t\u0020-\u007E\u0080-\u00FF]/,LG=class extends yme{constructor(e,r,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Qme(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(i=r,r=n?e:v({},e)):r=v(v({},e),r),r.h2session)this[aD]=r.h2session;else if(r.agent===!1)this.agent=new vG({maxFreeSessions:0});else if(typeof r.agent=="undefined"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new vG({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=Bme;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new sD("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Sme(r.protocol,"https:");let s=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,o=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:a}=r;if(r.timeout=void 0,this[Zr]=Object.create(null),this[kh]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[l,c]of Object.entries(r.headers))this.setHeader(l,c);r.auth&&!("authorization"in this[Zr])&&(this[Zr].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[MG]=r,s===443?(this[oD]=`https://${o}`,":authority"in this[Zr]||(this[Zr][":authority"]=o)):(this[oD]=`https://${o}:${s}`,":authority"in this[Zr]||(this[Zr][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[lI]=!1}get method(){return this[Zr][RG]}set method(e){e&&(this[Zr][RG]=e.toUpperCase())}get path(){return this[Zr][NG]}set path(e){e&&(this[Zr][NG]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,r,i);this._request?n():this[kh].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[kh].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[lI]||this.destroyed)return;this[lI]=!0;let e=this.method===Pme,r=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||bme(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new wme(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[FG],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[FG]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[kh])o();this.emit("socket",this.socket)};if(this[aD])try{r(this[aD].request(this[Zr]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[oD],this[MG],this[Zr]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new sD("name","string",e);return this[Zr][e.toLowerCase()]}get headersSent(){return this[lI]}removeHeader(e){if(typeof e!="string")throw new sD("name","string",e);if(this.headersSent)throw new PG("remove");delete this[Zr][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new PG("set");if(typeof e!="string"||!Fme.test(e)&&!Dme(e))throw new xme("Header name",e);if(typeof r=="undefined")throw new kme(r,e);if(Rme.test(r))throw new vme("header content",e);this[Zr][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let i=()=>this._request.setTimeout(e,r);return this._request?i():this[kh].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};kG.exports=LG});var OG=C((JVe,TG)=>{"use strict";var Nme=require("tls");TG.exports=(t={})=>new Promise((e,r)=>{let i=Nme.connect(t,()=>{t.resolveSocket?(i.off("error",r),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",r)})});var UG=C((WVe,KG)=>{"use strict";var Mme=require("net");KG.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Mme.isIP(e)?"":e}});var YG=C((zVe,lD)=>{"use strict";var HG=require("http"),cD=require("https"),Lme=OG(),Tme=eD(),Ome=AD(),Kme=UG(),Ume=nD(),cI=new Tme({maxSize:100}),vh=new Map,GG=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{t.emit("free",e,r)};e.on("free",i);let n=()=>{t.removeSocket(e,r)};e.on("close",n);let s=()=>{t.removeSocket(e,r),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),t.emit("free",e,r)},Hme=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!cI.has(e)){if(vh.has(e))return(await vh.get(e)).alpnProtocol;let{path:r,agent:i}=t;t.path=t.socketPath;let n=Lme(t);vh.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(cI.set(e,o),t.path=r,o==="h2")s.destroy();else{let{globalAgent:a}=cD,l=cD.Agent.prototype.createConnection;i?i.createConnection===l?GG(i,s,t):s.destroy():a.createConnection===l?GG(a,s,t):s.destroy()}return vh.delete(e),o}catch(s){throw vh.delete(e),s}}return cI.get(e)};lD.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=Ume(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e=W(v(v({ALPNProtocols:["h2","http/1.1"]},t),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||Kme(e),e.port=e.port||(i?443:80),e._defaultAgent=i?cD.globalAgent:HG.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await Hme(e)==="h2"?(n&&(e.agent=n.http2),new Ome(e,r)):HG.request(e,r)};lD.exports.protocolCache=cI});var jG=C((VVe,qG)=>{"use strict";var Gme=require("http2"),Yme=rD(),uD=AD(),qme=iD(),jme=YG(),Jme=(t,e,r)=>new uD(t,e,r),Wme=(t,e,r)=>{let i=new uD(t,e,r);return i.end(),i};qG.exports=W(v(W(v({},Gme),{ClientRequest:uD,IncomingMessage:qme}),Yme),{request:Jme,get:Wme,auto:jme})});var hD=C(gD=>{"use strict";Object.defineProperty(gD,"__esModule",{value:!0});var JG=io();gD.default=t=>JG.default.nodeStream(t)&&JG.default.function_(t.getBoundary)});var XG=C(fD=>{"use strict";Object.defineProperty(fD,"__esModule",{value:!0});var WG=require("fs"),zG=require("util"),VG=io(),zme=hD(),Vme=zG.promisify(WG.stat);fD.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(VG.default.string(t))return Buffer.byteLength(t);if(VG.default.buffer(t))return t.length;if(zme.default(t))return zG.promisify(t.getLength.bind(t))();if(t instanceof WG.ReadStream){let{size:r}=await Vme(t.path);return r}}});var dD=C(pD=>{"use strict";Object.defineProperty(pD,"__esModule",{value:!0});function Xme(t,e,r){let i={};for(let n of r)i[n]=(...s)=>{e.emit(n,...s)},t.on(n,i[n]);return()=>{for(let n of r)t.off(n,i[n])}}pD.default=Xme});var ZG=C(CD=>{"use strict";Object.defineProperty(CD,"__esModule",{value:!0});CD.default=()=>{let t=[];return{once(e,r,i){e.once(r,i),t.push({origin:e,event:r,fn:i})},unhandleAll(){for(let e of t){let{origin:r,event:i,fn:n}=e;r.removeListener(i,n)}t.length=0}}}});var $G=C(Ph=>{"use strict";Object.defineProperty(Ph,"__esModule",{value:!0});Ph.TimeoutError=void 0;var Zme=require("net"),_me=ZG(),_G=Symbol("reentry"),$me=()=>{},mD=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`);this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};Ph.TimeoutError=mD;Ph.default=(t,e,r)=>{if(_G in t)return $me;t[_G]=!0;let i=[],{once:n,unhandleAll:s}=_me.default(),o=(g,h,f)=>{var p;let m=setTimeout(h,g,g,f);(p=m.unref)===null||p===void 0||p.call(m);let I=()=>{clearTimeout(m)};return i.push(I),I},{host:a,hostname:l}=r,c=(g,h)=>{t.destroy(new mD(g,h))},u=()=>{for(let g of i)g();s()};if(t.once("error",g=>{if(u(),t.listenerCount("error")===0)throw g}),t.once("close",u),n(t,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};t.setTimeout(e.socket,g),i.push(()=>{t.removeListener("timeout",g)})}return n(t,"socket",g=>{var h;let{socketPath:f}=t;if(g.connecting){let p=Boolean(f!=null?f:Zme.isIP((h=l!=null?l:a)!==null&&h!==void 0?h:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let m=o(e.lookup,c,"lookup");n(g,"lookup",m)}if(typeof e.connect!="undefined"){let m=()=>o(e.connect,c,"connect");p?n(g,"connect",m()):n(g,"lookup",I=>{I===null&&n(g,"connect",m())})}typeof e.secureConnect!="undefined"&&r.protocol==="https:"&&n(g,"connect",()=>{let m=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",m)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(t,"upload-complete",p())}):n(t,"upload-complete",p())}}),typeof e.response!="undefined"&&n(t,"upload-complete",()=>{let g=o(e.response,c,"response");n(t,"response",g)}),u}});var tY=C(ID=>{"use strict";Object.defineProperty(ID,"__esModule",{value:!0});var eY=io();ID.default=t=>{t=t;let e={protocol:t.protocol,hostname:eY.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return eY.default.string(t.port)&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var rY=C(ED=>{"use strict";Object.defineProperty(ED,"__esModule",{value:!0});var eIe=require("url"),tIe=["protocol","host","hostname","port","pathname","search"];ED.default=(t,e)=>{var r,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(i=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&i!==void 0?i:""}`}let n=new eIe.URL(t);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of tIe)e[s]&&(n[s]=e[s].toString());return n}});var nY=C(yD=>{"use strict";Object.defineProperty(yD,"__esModule",{value:!0});var iY=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};yD.default=iY});var wD=C(BD=>{"use strict";Object.defineProperty(BD,"__esModule",{value:!0});var rIe=async t=>{let e=[],r=0;for await(let i of t)e.push(i),r+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};BD.default=rIe});var oY=C(DA=>{"use strict";Object.defineProperty(DA,"__esModule",{value:!0});DA.dnsLookupIpVersionToFamily=DA.isDnsLookupIpVersion=void 0;var sY={auto:0,ipv4:4,ipv6:6};DA.isDnsLookupIpVersion=t=>t in sY;DA.dnsLookupIpVersionToFamily=t=>{if(DA.isDnsLookupIpVersion(t))return sY[t];throw new Error("Invalid DNS lookup IP version")}});var QD=C(uI=>{"use strict";Object.defineProperty(uI,"__esModule",{value:!0});uI.isResponseOk=void 0;uI.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var AY=C(bD=>{"use strict";Object.defineProperty(bD,"__esModule",{value:!0});var aY=new Set;bD.default=t=>{aY.has(t)||(aY.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var lY=C(DD=>{"use strict";Object.defineProperty(DD,"__esModule",{value:!0});var Gt=io(),iIe=(t,e)=>{if(Gt.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");Gt.assert.any([Gt.default.string,Gt.default.undefined],t.encoding),Gt.assert.any([Gt.default.boolean,Gt.default.undefined],t.resolveBodyOnly),Gt.assert.any([Gt.default.boolean,Gt.default.undefined],t.methodRewriting),Gt.assert.any([Gt.default.boolean,Gt.default.undefined],t.isStream),Gt.assert.any([Gt.default.string,Gt.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry=v({},e.retry):t.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},Gt.default.object(r)?(t.retry=v(v({},t.retry),r),t.retry.methods=[...new Set(t.retry.methods.map(i=>i.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):Gt.default.number(r)&&(t.retry.limit=r),Gt.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(Gt.default.number))),Gt.default.object(t.pagination)){e&&(t.pagination=v(v({},e.pagination),t.pagination));let{pagination:i}=t;if(!Gt.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!Gt.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!Gt.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!Gt.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};DD.default=iIe});var cY=C(Fh=>{"use strict";Object.defineProperty(Fh,"__esModule",{value:!0});Fh.retryAfterStatusCodes=void 0;Fh.retryAfterStatusCodes=new Set([413,429,503]);var nIe=({attemptCount:t,retryOptions:e,error:r,retryAfter:i})=>{if(t>e.limit)return 0;let n=e.methods.includes(r.options.method),s=e.errorCodes.includes(r.code),o=r.response&&e.statusCodes.includes(r.response.statusCode);if(!n||!s&&!o)return 0;if(r.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(r.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(t-1)*1e3+a};Fh.default=nIe});var Nh=C(bt=>{"use strict";Object.defineProperty(bt,"__esModule",{value:!0});bt.UnsupportedProtocolError=bt.ReadError=bt.TimeoutError=bt.UploadError=bt.CacheError=bt.HTTPError=bt.MaxRedirectsError=bt.RequestError=bt.setNonEnumerableProperties=bt.knownHookEvents=bt.withoutBody=bt.kIsNormalizedAlready=void 0;var uY=require("util"),gY=require("stream"),sIe=require("fs"),$o=require("url"),hY=require("http"),SD=require("http"),oIe=require("https"),aIe=BH(),AIe=kH(),fY=lG(),lIe=hG(),cIe=jG(),uIe=aI(),le=io(),gIe=XG(),pY=hD(),hIe=dD(),dY=$G(),fIe=tY(),CY=rY(),pIe=nY(),dIe=wD(),mY=oY(),CIe=QD(),ea=AY(),mIe=lY(),IIe=cY(),EIe=new AIe.default,Fr=Symbol("request"),gI=Symbol("response"),hc=Symbol("responseSize"),fc=Symbol("downloadedSize"),pc=Symbol("bodySize"),dc=Symbol("uploadedSize"),hI=Symbol("serverResponsesPiped"),IY=Symbol("unproxyEvents"),EY=Symbol("isFromCache"),xD=Symbol("cancelTimeouts"),yY=Symbol("startedReading"),Cc=Symbol("stopReading"),fI=Symbol("triggerRead"),ta=Symbol("body"),Rh=Symbol("jobs"),BY=Symbol("originalResponse"),wY=Symbol("retryTimeout");bt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var yIe=le.default.string(process.versions.brotli);bt.withoutBody=new Set(["GET","HEAD"]);bt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function BIe(t){for(let e in t){let r=t[e];if(!le.default.string(r)&&!le.default.number(r)&&!le.default.boolean(r)&&!le.default.null_(r)&&!le.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function wIe(t){return le.default.object(t)&&!("statusCode"in t)}var kD=new pIe.default,QIe=async t=>new Promise((e,r)=>{let i=n=>{r(n)};t.pending||e(),t.once("error",i),t.once("ready",()=>{t.off("error",i),e()})}),bIe=new Set([300,301,302,303,304,307,308]),DIe=["context","body","json","form"];bt.setNonEnumerableProperties=(t,e)=>{let r={};for(let i of t)if(!!i)for(let n of DIe)n in i&&(r[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,r)};var Br=class extends Error{constructor(e,r,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,i instanceof vD?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[gI]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,!le.default.undefined(r.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` -`).reverse(),a=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` -`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` -`)}${a.reverse().join(` -`)}`}}};bt.RequestError=Br;var PD=class extends Br{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};bt.MaxRedirectsError=PD;var FD=class extends Br{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};bt.HTTPError=FD;var RD=class extends Br{constructor(e,r){super(e.message,e,r);this.name="CacheError"}};bt.CacheError=RD;var ND=class extends Br{constructor(e,r){super(e.message,e,r);this.name="UploadError"}};bt.UploadError=ND;var MD=class extends Br{constructor(e,r,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=r}};bt.TimeoutError=MD;var pI=class extends Br{constructor(e,r){super(e.message,e,r);this.name="ReadError"}};bt.ReadError=pI;var LD=class extends Br{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};bt.UnsupportedProtocolError=LD;var SIe=["socket","connect","continue","information","upgrade","timeout"],vD=class extends gY.Duplex{constructor(e,r={},i){super({autoDestroy:!1,highWaterMark:0});this[fc]=0,this[dc]=0,this.requestInitialized=!1,this[hI]=new Set,this.redirects=[],this[Cc]=!1,this[fI]=!1,this[Rh]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof SD.IncomingMessage&&(this.options.headers=v(v({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=r;if((o||a||l)&&this._lockWrite(),bt.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,i)}catch(c){le.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof sIe.ReadStream&&await QIe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Fr])===null||c===void 0||c.destroy();return}for(let g of this[Rh])g();this[Rh].length=0,this.requestInitialized=!0}catch(u){if(u instanceof Br){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,r,i){var n,s,o,a,l;let c=r;if(le.default.object(e)&&!le.default.urlInstance(e))r=v(v(v({},i),e),r);else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r=v(v({},i),r),e!==void 0&&(r.url=e),le.default.urlInstance(r.url)&&(r.url=new $o.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),le.assert.any([le.default.string,le.default.undefined],r.method),le.assert.any([le.default.object,le.default.undefined],r.headers),le.assert.any([le.default.string,le.default.urlInstance,le.default.undefined],r.prefixUrl),le.assert.any([le.default.object,le.default.undefined],r.cookieJar),le.assert.any([le.default.object,le.default.string,le.default.undefined],r.searchParams),le.assert.any([le.default.object,le.default.string,le.default.undefined],r.cache),le.assert.any([le.default.object,le.default.number,le.default.undefined],r.timeout),le.assert.any([le.default.object,le.default.undefined],r.context),le.assert.any([le.default.object,le.default.undefined],r.hooks),le.assert.any([le.default.boolean,le.default.undefined],r.decompress),le.assert.any([le.default.boolean,le.default.undefined],r.ignoreInvalidCookies),le.assert.any([le.default.boolean,le.default.undefined],r.followRedirect),le.assert.any([le.default.number,le.default.undefined],r.maxRedirects),le.assert.any([le.default.boolean,le.default.undefined],r.throwHttpErrors),le.assert.any([le.default.boolean,le.default.undefined],r.http2),le.assert.any([le.default.boolean,le.default.undefined],r.allowGetBody),le.assert.any([le.default.string,le.default.undefined],r.localAddress),le.assert.any([mY.isDnsLookupIpVersion,le.default.undefined],r.dnsLookupIpVersion),le.assert.any([le.default.object,le.default.undefined],r.https),le.assert.any([le.default.boolean,le.default.undefined],r.rejectUnauthorized),r.https&&(le.assert.any([le.default.boolean,le.default.undefined],r.https.rejectUnauthorized),le.assert.any([le.default.function_,le.default.undefined],r.https.checkServerIdentity),le.assert.any([le.default.string,le.default.object,le.default.array,le.default.undefined],r.https.certificateAuthority),le.assert.any([le.default.string,le.default.object,le.default.array,le.default.undefined],r.https.key),le.assert.any([le.default.string,le.default.object,le.default.array,le.default.undefined],r.https.certificate),le.assert.any([le.default.string,le.default.undefined],r.https.passphrase),le.assert.any([le.default.string,le.default.buffer,le.default.array,le.default.undefined],r.https.pfx)),le.assert.any([le.default.object,le.default.undefined],r.cacheOptions),le.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(i==null?void 0:i.headers)?r.headers=v({},r.headers):r.headers=uIe(v(v({},i==null?void 0:i.headers),r.headers)),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(i==null?void 0:i.searchParams)){let f;if(le.default.string(r.searchParams)||r.searchParams instanceof $o.URLSearchParams)f=new $o.URLSearchParams(r.searchParams);else{BIe(r.searchParams),f=new $o.URLSearchParams;for(let p in r.searchParams){let m=r.searchParams[p];m===null?f.append(p,""):m!==void 0&&f.append(p,m)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,m)=>{f.has(m)||f.append(m,p)}),r.searchParams=f}if(r.username=(s=r.username)!==null&&s!==void 0?s:"",r.password=(o=r.password)!==null&&o!==void 0?o:"",le.default.undefined(r.prefixUrl)?r.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),le.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=CY.default(r.prefixUrl+r.url,r)}else(le.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=CY.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:f}=r;Object.defineProperty(r,"prefixUrl",{set:m=>{let I=r.url;if(!I.href.startsWith(m))throw new Error(`Cannot change \`prefixUrl\` from ${f} to ${m}: ${I.href}`);r.url=new $o.URL(m+I.href.slice(f.length)),f=m},get:()=>f});let{protocol:p}=r.url;if(p==="unix:"&&(p="http:",r.url=new $o.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),p!=="http:"&&p!=="https:")throw new LD(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:u}=r;if(u){let{setCookie:f,getCookieString:p}=u;le.assert.function_(f),le.assert.function_(p),f.length===4&&p.length===0&&(f=uY.promisify(f.bind(r.cookieJar)),p=uY.promisify(p.bind(r.cookieJar)),r.cookieJar={setCookie:f,getCookieString:p})}let{cache:g}=r;if(g&&(kD.has(g)||kD.set(g,new fY((f,p)=>{let m=f[Fr](f,p);return le.default.promise(m)&&(m.once=(I,Q)=>{if(I==="error")m.catch(Q);else if(I==="abort")(async()=>{try{(await m).once("abort",Q)}catch(w){}})();else throw new Error(`Unknown HTTP2 promise event: ${I}`);return m}),m},g))),r.cacheOptions=v({},r.cacheOptions),r.dnsCache===!0)r.dnsCache=EIe;else if(!le.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${le.default(r.dnsCache)}`);le.default.number(r.timeout)?r.timeout={request:r.timeout}:i&&r.timeout!==i.timeout?r.timeout=v(v({},i.timeout),r.timeout):r.timeout=v({},r.timeout),r.context||(r.context={});let h=r.hooks===(i==null?void 0:i.hooks);r.hooks=v({},r.hooks);for(let f of bt.knownHookEvents)if(f in r.hooks)if(le.default.array(r.hooks[f]))r.hooks[f]=[...r.hooks[f]];else throw new TypeError(`Parameter \`${f}\` must be an Array, got ${le.default(r.hooks[f])}`);else r.hooks[f]=[];if(i&&!h)for(let f of bt.knownHookEvents)i.hooks[f].length!==0&&(r.hooks[f]=[...i.hooks[f],...r.hooks[f]]);if("family"in r&&ea.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(r.https=v(v({},i.https),r.https)),"rejectUnauthorized"in r&&ea.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&ea.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&ea.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&ea.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&ea.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&ea.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&ea.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let f in r.agent)if(f!=="http"&&f!=="https"&&f!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${f}\``)}return r.maxRedirects=(l=r.maxRedirects)!==null&&l!==void 0?l:0,bt.setNonEnumerableProperties([i,c],r),mIe.default(r,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,i=!le.default.undefined(e.form),n=!le.default.undefined(e.json),s=!le.default.undefined(e.body),o=i||n||s,a=bt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof gY.Readable)&&!le.default.string(e.body)&&!le.default.buffer(e.body)&&!pY.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!le.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!le.default.string(r["content-type"]);s?(pY.default(e.body)&&l&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[ta]=e.body):i?(l&&(r["content-type"]="application/x-www-form-urlencoded"),this[ta]=new $o.URLSearchParams(e.form).toString()):(l&&(r["content-type"]="application/json"),this[ta]=e.stringifyJson(e.json));let c=await gIe.default(this[ta],e.headers);le.default.undefined(r["content-length"])&&le.default.undefined(r["transfer-encoding"])&&!a&&!le.default.undefined(c)&&(r["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[pc]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:i}=r;this[BY]=e,r.decompress&&(e=lIe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:hY.STATUS_CODES[n],s.url=r.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[EY]=s.isFromCache,this[hc]=Number(e.headers["content-length"])||void 0,this[gI]=e,e.once("end",()=>{this[hc]=this[fc],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new pI(a,this))}),e.once("aborted",()=>{this._beforeError(new pI({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(le.default.object(r.cookieJar)&&o){let a=o.map(async l=>r.cookieJar.setCookie(l,i.toString()));r.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(r.followRedirect&&e.headers.location&&bIe.has(n)){if(e.resume(),this[Fr]&&(this[xD](),delete this[Fr],this[IY]()),(n===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[ta]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new PD(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new $o.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(c.username=r.username,c.password=r.password),this.redirects.push(u),r.url=c;for(let g of r.hooks.beforeRedirect)await g(r,s);this.emit("redirect",s,r),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(r.isStream&&r.throwHttpErrors&&!CIe.isResponseOk(s)){this._beforeError(new FD(s));return}e.on("readable",()=>{this[fI]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[hI])if(!a.headersSent){for(let l in e.headers){let c=r.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:i,url:n}=r;aIe.default(e),this[xD]=dY.default(e,i,n);let s=r.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l instanceof dY.TimeoutError?l=new MD(l,this.timings,this):l=new Br(l.message,l,this),this._beforeError(l)}),this[IY]=hIe.default(e,this,SIe),this[Fr]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[ta],a=this.redirects.length===0?this:e;le.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new ND(l,this))})):(this._unlockWrite(),le.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((i,n)=>{Object.assign(r,fIe.default(e)),delete r.url;let s,o=kD.get(r.cache)(r,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});r.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,r,i,n,s;let{options:o}=this,{headers:a}=o;for(let Q in a)if(le.default.undefined(a[Q]))delete a[Q];else if(le.default.null_(a[Q]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${Q}\` header`);if(o.decompress&&le.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=yIe?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let Q=await o.cookieJar.getCookieString(o.url.toString());le.default.nonEmptyString(Q)&&(o.headers.cookie=Q)}for(let Q of o.hooks.beforeRequest){let w=await Q(o);if(!le.default.undefined(w)){o.request=()=>w;break}}o.body&&this[ta]!==o.body&&(this[ta]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let Q=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(Q==null?void 0:Q.groups){let{socketPath:w,path:x}=Q.groups;Object.assign(o,{socketPath:w,path:x,host:""})}}let h=g.protocol==="https:",f;o.http2?f=cIe.auto:f=h?oIe.request:hY.request;let p=(e=o.request)!==null&&e!==void 0?e:f,m=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[h?"https":"http"]),o[Fr]=p,delete o.request,delete o.timeout;let I=o;if(I.shared=(r=o.cacheOptions)===null||r===void 0?void 0:r.shared,I.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,I.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,I.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{I.family=mY.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(Q){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(I.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(I.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(I.ca=o.https.certificateAuthority),o.https.certificate&&(I.cert=o.https.certificate),o.https.key&&(I.key=o.https.key),o.https.passphrase&&(I.passphrase=o.https.passphrase),o.https.pfx&&(I.pfx=o.https.pfx));try{let Q=await m(g,I);le.default.undefined(Q)&&(Q=f(g,I)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete I.rejectUnauthorized,o.https.checkServerIdentity&&delete I.checkServerIdentity,o.https.certificateAuthority&&delete I.ca,o.https.certificate&&delete I.cert,o.https.key&&delete I.key,o.https.passphrase&&delete I.passphrase,o.https.pfx&&delete I.pfx),wIe(Q)?this._onRequest(Q):this.writable?(this.once("finish",()=>{this._onResponse(Q)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(Q)}catch(Q){throw Q instanceof fY.CacheError?new RD(Q,this):new Br(Q.message,Q,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new Br(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[Cc])return;let{options:r}=this,i=this.retryCount+1;this[Cc]=!0,e instanceof Br||(e=new Br(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await dIe.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await r.retry.calculateDelay({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:IIe.default({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new Br(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new Br(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[wY]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[fI]=!0;let e=this[gI];if(e&&!this[Cc]){e.readableLength&&(this[fI]=!1);let r;for(;(r=e.read())!==null;){this[fc]+=r.length,this[yY]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(r)}}}_write(e,r,i){let n=()=>{this._writeRequest(e,r,i)};this.requestInitialized?n():this[Rh].push(n)}_writeRequest(e,r,i){this[Fr].destroyed||(this._progressCallbacks.push(()=>{this[dc]+=Buffer.byteLength(e,r);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Fr].write(e,r,n=>{!n&&this._progressCallbacks.length!==0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Fr in this)){e();return}if(this[Fr].destroyed){e();return}this[Fr].end(i=>{i||(this[pc]=this[dc],this.emit("uploadProgress",this.uploadProgress),this[Fr].emit("upload-complete")),e(i)})};this.requestInitialized?r():this[Rh].push(r)}_destroy(e,r){var i;this[Cc]=!0,clearTimeout(this[wY]),Fr in this&&(this[xD](),((i=this[gI])===null||i===void 0?void 0:i.complete)||this[Fr].destroy()),e!==null&&!le.default.undefined(e)&&!(e instanceof Br)&&(e=new Br(e.message,e,this)),r(e)}get _isAboutToError(){return this[Cc]}get ip(){var e;return(e=this[Fr])===null||e===void 0?void 0:e.socket.remoteAddress}get aborted(){var e,r,i;return((r=(e=this[Fr])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!((i=this[BY])===null||i===void 0?void 0:i.complete)}get socket(){var e;return(e=this[Fr])===null||e===void 0?void 0:e.socket}get downloadProgress(){let e;return this[hc]?e=this[fc]/this[hc]:this[hc]===this[fc]?e=1:e=0,{percent:e,transferred:this[fc],total:this[hc]}}get uploadProgress(){let e;return this[pc]?e=this[dc]/this[pc]:this[pc]===this[dc]?e=1:e=0,{percent:e,transferred:this[dc],total:this[pc]}}get timings(){var e;return(e=this[Fr])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[EY]}pipe(e,r){if(this[yY])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof SD.ServerResponse&&this[hI].add(e),super.pipe(e,r)}unpipe(e){return e instanceof SD.ServerResponse&&this[hI].delete(e),super.unpipe(e),this}};bt.default=vD});var Mh=C(Kn=>{"use strict";var xIe=Kn&&Kn.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),kIe=Kn&&Kn.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&xIe(e,t,r)};Object.defineProperty(Kn,"__esModule",{value:!0});Kn.CancelError=Kn.ParseError=void 0;var QY=Nh(),bY=class extends QY.RequestError{constructor(e,r){let{options:i}=r.request;super(`${e.message} in "${i.url.toString()}"`,e,r.request);this.name="ParseError"}};Kn.ParseError=bY;var DY=class extends QY.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Kn.CancelError=DY;kIe(Nh(),Kn)});var xY=C(TD=>{"use strict";Object.defineProperty(TD,"__esModule",{value:!0});var SY=Mh(),vIe=(t,e,r,i)=>{let{rawBody:n}=t;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":r(n.toString());if(e==="buffer")return n;throw new SY.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(s){throw new SY.ParseError(s,t)}};TD.default=vIe});var OD=C(ra=>{"use strict";var PIe=ra&&ra.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),FIe=ra&&ra.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&PIe(e,t,r)};Object.defineProperty(ra,"__esModule",{value:!0});var RIe=require("events"),NIe=io(),MIe=EH(),dI=Mh(),kY=xY(),vY=Nh(),LIe=dD(),TIe=wD(),PY=QD(),OIe=["request","response","redirect","uploadProgress","downloadProgress"];function FY(t){let e,r,i=new RIe.EventEmitter,n=new MIe((o,a,l)=>{let c=u=>{let g=new vY.default(void 0,t);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new dI.CancelError(g))),e=g,g.once("response",async f=>{var p;if(f.retryCount=u,f.request.aborted)return;let m;try{m=await TIe.default(g),f.rawBody=m}catch(x){return}if(g._isAboutToError)return;let I=((p=f.headers["content-encoding"])!==null&&p!==void 0?p:"").toLowerCase(),Q=["gzip","deflate","br"].includes(I),{options:w}=g;if(Q&&!w.decompress)f.body=m;else try{f.body=kY.default(f,w.responseType,w.parseJson,w.encoding)}catch(x){if(f.body=m.toString(),PY.isResponseOk(f)){g._beforeError(x);return}}try{for(let[x,N]of w.hooks.afterResponse.entries())f=await N(f,async H=>{let T=vY.default.normalizeArguments(void 0,W(v({},H),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),w);T.hooks.afterResponse=T.hooks.afterResponse.slice(0,x);for(let G of T.hooks.beforeRetry)await G(T);let P=FY(T);return l(()=>{P.catch(()=>{}),P.cancel()}),P})}catch(x){g._beforeError(new dI.RequestError(x.message,x,g));return}if(!PY.isResponseOk(f)){g._beforeError(new dI.HTTPError(f));return}r=f,o(g.options.resolveBodyOnly?f.body:f)});let h=f=>{if(n.isCanceled)return;let{options:p}=g;if(f instanceof dI.HTTPError&&!p.throwHttpErrors){let{response:m}=f;o(g.options.resolveBodyOnly?m.body:m);return}a(f)};g.once("error",h),g.once("retry",(f,p)=>{var m;if(NIe.default.nodeStream((m=p.request)===null||m===void 0?void 0:m.options.body)){h(p);return}c(f)}),LIe.default(g,i,OIe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=r.request;return kY.default(r,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}ra.default=FY;FIe(Mh(),ra)});var RY=C(KD=>{"use strict";Object.defineProperty(KD,"__esModule",{value:!0});var KIe=Mh();function UIe(t,...e){let r=(async()=>{if(t instanceof KIe.RequestError)try{for(let n of e)if(n)for(let s of n)t=await s(t)}catch(n){t=n}throw t})(),i=()=>r;return r.json=i,r.text=i,r.buffer=i,r.on=i,r}KD.default=UIe});var LY=C(UD=>{"use strict";Object.defineProperty(UD,"__esModule",{value:!0});var NY=io();function MY(t){for(let e of Object.values(t))(NY.default.plainObject(e)||NY.default.array(e))&&MY(e);return Object.freeze(t)}UD.default=MY});var OY=C(TY=>{"use strict";Object.defineProperty(TY,"__esModule",{value:!0})});var HD=C(pn=>{"use strict";var HIe=pn&&pn.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),GIe=pn&&pn.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&HIe(e,t,r)};Object.defineProperty(pn,"__esModule",{value:!0});pn.defaultHandler=void 0;var KY=io(),dn=OD(),YIe=RY(),CI=Nh(),qIe=LY(),jIe={RequestError:dn.RequestError,CacheError:dn.CacheError,ReadError:dn.ReadError,HTTPError:dn.HTTPError,MaxRedirectsError:dn.MaxRedirectsError,TimeoutError:dn.TimeoutError,ParseError:dn.ParseError,CancelError:dn.CancelError,UnsupportedProtocolError:dn.UnsupportedProtocolError,UploadError:dn.UploadError},JIe=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:mI}=CI.default,UY=(...t)=>{let e;for(let r of t)e=mI(void 0,r,e);return e},WIe=t=>t.isStream?new CI.default(void 0,t):dn.default(t),zIe=t=>"defaults"in t&&"options"in t.defaults,VIe=["get","post","put","patch","head","delete"];pn.defaultHandler=(t,e)=>e(t);var HY=(t,e)=>{if(t)for(let r of t)r(e)},GY=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n,s)=>{var o,a;let l=0,c=u=>t.handlers[l++](u,l===t.handlers.length?WIe:c);if(KY.default.plainObject(i)){let u=v(v({},i),n);CI.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{HY(t.options.hooks.init,n),HY((o=n==null?void 0:n.hooks)===null||o===void 0?void 0:o.init,n)}catch(h){u=h}let g=mI(i,n,s!=null?s:t.options);if(g[CI.kIsNormalizedAlready]=!0,u)throw new dn.RequestError(u.message,u,g);return c(g)}catch(u){if(n==null?void 0:n.isStream)throw u;return YIe.default(u,t.options.hooks.beforeError,(a=n==null?void 0:n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[t.options],s=[...t._rawHandlers],o;for(let a of i)zIe(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==pn.defaultHandler),s.length===0&&s.push(pn.defaultHandler),GY({options:UY(...n),handlers:s,mutableDefaults:Boolean(o)})};let r=async function*(i,n){let s=mI(i,n,t.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!KY.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of r(i,n))s.push(o);return s},e.paginate.each=r,e.stream=(i,n)=>e(i,W(v({},n),{isStream:!0}));for(let i of VIe)e[i]=(n,s)=>e(n,W(v({},s),{method:i})),e.stream[i]=(n,s)=>e(n,W(v({},s),{method:i,isStream:!0}));return Object.assign(e,jIe),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:qIe.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=UY,e};pn.default=GY;GIe(OY(),pn)});var EI=C((so,II)=>{"use strict";var XIe=so&&so.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),YY=so&&so.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&XIe(e,t,r)};Object.defineProperty(so,"__esModule",{value:!0});var ZIe=require("url"),qY=HD(),_Ie={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let i of e){let n=i.split(";");if(n[1].includes("next")){r=n[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new ZIe.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[qY.defaultHandler],mutableDefaults:!1},GD=qY.default(_Ie);so.default=GD;II.exports=GD;II.exports.default=GD;II.exports.__esModule=!0;YY(HD(),so);YY(OD(),so)});var zY=C(mc=>{"use strict";var m7e=require("net"),$Ie=require("tls"),YD=require("http"),jY=require("https"),eEe=require("events"),I7e=require("assert"),tEe=require("util");mc.httpOverHttp=rEe;mc.httpsOverHttp=iEe;mc.httpOverHttps=nEe;mc.httpsOverHttps=sEe;function rEe(t){var e=new oo(t);return e.request=YD.request,e}function iEe(t){var e=new oo(t);return e.request=YD.request,e.createSocket=JY,e.defaultPort=443,e}function nEe(t){var e=new oo(t);return e.request=jY.request,e}function sEe(t){var e=new oo(t);return e.request=jY.request,e.createSocket=JY,e.defaultPort=443,e}function oo(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||YD.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=WY(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};oo.prototype.createSocket=function(e,r){var i=this,n={};i.sockets.push(n);var s=qD({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),ia("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,h,f){process.nextTick(function(){c(g,h,f)})}function c(g,h,f){if(o.removeAllListeners(),h.removeAllListeners(),g.statusCode!==200){ia("tunneling socket could not be established, statusCode=%d",g.statusCode),h.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(f.length>0){ia("got illegal response body from proxy"),h.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return ia("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=h,r(h)}function u(g){o.removeAllListeners(),ia(`tunneling socket could not be established, cause=%s -`,g.message,g.stack);var h=new Error("tunneling socket could not be established, cause="+g.message);h.code="ECONNRESET",e.request.emit("error",h),i.removeSocket(n)}};oo.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function JY(t,e){var r=this;oo.prototype.createSocket.call(r,t,function(i){var n=t.request.getHeader("host"),s=qD({},r.options,{socket:i,servername:n?n.replace(/:.*$/,""):t.host}),o=$Ie.connect(0,s);r.sockets[r.sockets.indexOf(i)]=o,e(o)})}function WY(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function qD(t){for(var e=1,r=arguments.length;e{VY.exports=zY()});var Rq=C((RXe,VD)=>{var Aq=Object.assign({},require("fs")),se=typeof se!="undefined"?se:{},Th={},sa;for(sa in se)se.hasOwnProperty(sa)&&(Th[sa]=se[sa]);var XD=[],lq="./this.program",cq=function(t,e){throw e},uq=!1,xA=!0,Oh="";function fEe(t){return se.locateFile?se.locateFile(t,Oh):Oh+t}var wI,ZD,QI,_D;xA&&(uq?Oh=require("path").dirname(Oh)+"/":Oh=__dirname+"/",wI=function(e,r){var i=hq(e);return i?r?i:i.toString():(QI||(QI=Aq),_D||(_D=require("path")),e=_D.normalize(e),QI.readFileSync(e,r?null:"utf8"))},ZD=function(e){var r=wI(e,!0);return r.buffer||(r=new Uint8Array(r)),gq(r.buffer),r},process.argv.length>1&&(lq=process.argv[1].replace(/\\/g,"/")),XD=process.argv.slice(2),typeof VD!="undefined"&&(VD.exports=se),cq=function(t){process.exit(t)},se.inspect=function(){return"[Emscripten Module object]"});var bI=se.print||console.log.bind(console),_r=se.printErr||console.warn.bind(console);for(sa in Th)Th.hasOwnProperty(sa)&&(se[sa]=Th[sa]);Th=null;se.arguments&&(XD=se.arguments);se.thisProgram&&(lq=se.thisProgram);se.quit&&(cq=se.quit);var pEe=16;function dEe(t,e){return e||(e=pEe),Math.ceil(t/e)*e}var CEe=0,mEe=function(t){CEe=t},$D;se.wasmBinary&&($D=se.wasmBinary);var M7e=se.noExitRuntime||!0;typeof WebAssembly!="object"&&Cr("no native wasm support detected");function IEe(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return di[t>>0];case"i8":return di[t>>0];case"i16":return eS[t>>1];case"i32":return je[t>>2];case"i64":return je[t>>2];case"float":return fq[t>>2];case"double":return pq[t>>3];default:Cr("invalid type for getValue: "+e)}return null}var DI,dq=!1,EEe;function gq(t,e){t||Cr("Assertion failed: "+e)}function Cq(t){var e=se["_"+t];return gq(e,"Cannot call unknown function "+t+", make sure it is exported"),e}function QEe(t,e,r,i,n){var s={string:function(f){var p=0;if(f!=null&&f!==0){var m=(f.length<<2)+1;p=Eq(m),Iq(f,p,m)}return p},array:function(f){var p=Eq(f.length);return yEe(f,p),p}};function o(f){return e==="string"?mq(f):e==="boolean"?Boolean(f):f}var a=Cq(t),l=[],c=0;if(i)for(var u=0;u=i);)++n;if(n-e>16&&t.subarray&&yq)return yq.decode(t.subarray(e,n));for(var s="";e>10,56320|c&1023)}}return s}function mq(t,e){return t?Ic(Ec,t,e):""}function SI(t,e,r,i){if(!(i>0))return 0;for(var n=r,s=r+i-1,o=0;o=55296&&a<=57343){var l=t.charCodeAt(++o);a=65536+((a&1023)<<10)|l&1023}if(a<=127){if(r>=s)break;e[r++]=a}else if(a<=2047){if(r+1>=s)break;e[r++]=192|a>>6,e[r++]=128|a&63}else if(a<=65535){if(r+2>=s)break;e[r++]=224|a>>12,e[r++]=128|a>>6&63,e[r++]=128|a&63}else{if(r+3>=s)break;e[r++]=240|a>>18,e[r++]=128|a>>12&63,e[r++]=128|a>>6&63,e[r++]=128|a&63}}return e[r]=0,r-n}function Iq(t,e,r){return SI(t,Ec,e,r)}function xI(t){for(var e=0,r=0;r=55296&&i<=57343&&(i=65536+((i&1023)<<10)|t.charCodeAt(++r)&1023),i<=127?++e:i<=2047?e+=2:i<=65535?e+=3:e+=4}return e}function tS(t){var e=xI(t)+1,r=Bq(e);return r&&SI(t,di,r,e),r}function yEe(t,e){di.set(t,e)}function DEe(t,e){return t%e>0&&(t+=e-t%e),t}var rS,di,Ec,eS,SEe,je,xEe,fq,pq;function wq(t){rS=t,se.HEAP8=di=new Int8Array(t),se.HEAP16=eS=new Int16Array(t),se.HEAP32=je=new Int32Array(t),se.HEAPU8=Ec=new Uint8Array(t),se.HEAPU16=SEe=new Uint16Array(t),se.HEAPU32=xEe=new Uint32Array(t),se.HEAPF32=fq=new Float32Array(t),se.HEAPF64=pq=new Float64Array(t)}var L7e=se.INITIAL_MEMORY||16777216,iS,Qq=[],bq=[],Dq=[],kEe=!1;function PEe(){if(se.preRun)for(typeof se.preRun=="function"&&(se.preRun=[se.preRun]);se.preRun.length;)vEe(se.preRun.shift());nS(Qq)}function FEe(){kEe=!0,!se.noFSInit&&!E.init.initialized&&E.init(),oa.init(),nS(bq)}function NEe(){if(se.postRun)for(typeof se.postRun=="function"&&(se.postRun=[se.postRun]);se.postRun.length;)REe(se.postRun.shift());nS(Dq)}function vEe(t){Qq.unshift(t)}function MEe(t){bq.unshift(t)}function REe(t){Dq.unshift(t)}var kA=0,sS=null,Kh=null;function LEe(t){return t}function Sq(t){kA++,se.monitorRunDependencies&&se.monitorRunDependencies(kA)}function oS(t){if(kA--,se.monitorRunDependencies&&se.monitorRunDependencies(kA),kA==0&&(sS!==null&&(clearInterval(sS),sS=null),Kh)){var e=Kh;Kh=null,e()}}se.preloadedImages={};se.preloadedAudios={};function Cr(t){se.onAbort&&se.onAbort(t),t+="",_r(t),dq=!0,EEe=1,t="abort("+t+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(t);throw e}var xq="data:application/octet-stream;base64,";function kq(t){return t.startsWith(xq)}var Uh="data:application/octet-stream;base64,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AkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC2EBAX8jAEEQayICIAA2AgggAiABNwMAAkAgAikDACACKAIIKQMIVgRAIAIoAghBADoAACACQX82AgwMAQsgAigCCEEBOgAAIAIoAgggAikDADcDECACQQA2AgwLIAIoAgwL7wEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhCCBAeNgIMAkAgAigCDEUEQCACQX82AhwMAQsgAigCDCACKQMQQv8BgzwAACACKAIMIAIpAxBCCIhC/wGDPAABIAIoAgwgAikDEEIQiEL/AYM8AAIgAigCDCACKQMQQhiIQv8BgzwAAyACKAIMIAIpAxBCIIhC/wGDPAAEIAIoAgwgAikDEEIoiEL/AYM8AAUgAigCDCACKQMQQjCIQv8BgzwABiACKAIMIAIpAxBCOIhC/wGDPAAHIAJBADYCHAsgAigCHBogAkEgaiQAC4cDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNwMYAkAgAygCJC0AKEEBcQRAIANCfzcDKAwBCwJAAkAgAygCJCgCIEUNACADKQMYQv///////////wBWDQAgAykDGFANASADKAIgDQELIAMoAiRBDGpBEkEAEBQgA0J/NwMoDAELIAMoAiQtADVBAXEEQCADQn83AygMAQsCfyMAQRBrIgAgAygCJDYCDCAAKAIMLQA0QQFxCwRAIANCADcDKAwBCyADKQMYUARAIANCADcDKAwBCyADQgA3AxADQCADKQMQIAMpAxhUBEAgAyADKAIkIAMoAiAgAykDEKdqIAMpAxggAykDEH1BARAhIgI3AwggAkIAUwRAIAMoAiRBAToANSADKQMQUARAIANCfzcDKAwECyADIAMpAxA3AygMAwsgAykDCFAEQCADKAIkQQE6ADQFIAMgAykDCCADKQMQfDcDEAwCCwsLIAMgAykDEDcDKAsgAykDKCECIANBMGokACACCzYBAX8jAEEQayIBIAA2AgwCfiABKAIMLQAAQQFxBEAgASgCDCkDCCABKAIMKQMQfQwBC0IACwuyAQIBfwF+IwBBEGsiASQAIAEgADYCBCABIAEoAgRC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AkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSwRAIAIoAgwgAigCCGotAABBgAFJDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIYLwEEIAIoAgggAigCAGpNBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILUgECf0GQlwEoAgAiASAAQQNqQXxxIgJqIQACQCACQQAgACABTRsNACAAPwBBEHRLBEAgABATRQ0BC0GQlwEgADYCACABDwtBtJsBQTA2AgBBfwuNBQEDfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAgAEQCABKAIMKAIAEDEaIAEoAgwoAgAQGwsgASgCDCgCHBAVIAEoAgwoAiAQJSABKAIMKAIkECUgASgCDCgCUCECIwBBEGsiACQAIAAgAjYCDCAAKAIMBEAgACgCDCgCEARAIABBADYCCANAIAAoAgggACgCDCgCAEkEQCAAKAIMKAIQIAAoAghBAnRqKAIABEAgACgCDCgC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A3EQHwsgAygCpAEoAhQgA0GeAWogA0GcAWoQgQEgAygCTCADLwGeARAfIAMoAkwgAy8BnAEQHwJAAkAgAy0AhQFBAXFFDQAgAygCpAEpAyhCFFoNACADKAJMQQAQIAwBCyADKAJMIAMoAqQBKAIYECALAkACQCADKAKgAUGAAnFBgAJHDQAgAygCpAEpAyBC/////w9UBEAgAygCpAEpAyhC/////w9UDQELIAMoAkxBfxAgIAMoAkxBfxAgDAELAkAgAygCpAEpAyBC/////w9UBEAgAygCTCADKAKkASkDIKcQIAwBCyADKAJMQX8QIAsCQCADKAKkASkDKEL/////D1QEQCADKAJMIAMoAqQBKQMopxAgDAELIAMoAkxBfxAgCwsgAygCTCADKAKkASgCMBBTQf//A3EQHyADIAMoAqQBKAI0IAMoAqABEIYBQf//A3EgAygCkAFBgAYQhgFB//8DcWo2AogBIAMoAkwgAygCiAFB//8DcRAfIAMoAqABQYACcUUEQCADKAJMIAMoAqQBKAI4EFNB//8DcRAfIAMoAkwgAygCpAEoAjxB//8DcRAfIAMoAkwgAygCpAEvAUAQHyADKAJMIAMoAqQBKAJEECACQCADKAKkASkDSEL/////D1QEQCADKAJMIAMoAqQBKQNIpxAgDAELIAMoAkxBfxAgCwsCfyMAQRBrIgAgAygCTDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAJMEBYgAygCkAEQIyADQX82AqwBDAELIAMoAqgBIANB0ABqAn4jAEEQayIAIAMoAkw2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACwsQNUEASARAIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCTBAWIAMoAqQBKAIwBEAgAygCqAEgAygCpAEoAjAQigFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABBEAgAygCqAEgAygCkAFBgAYQhQFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABECMgAygCpAEoAjQEQCADKAKoASADKAKkASgCNCADKAKgARCFAUEASARAIANBfzYCrAEMAgsLIAMoAqABQYACcUUEQCADKAKkASgCOARAIAMoAqgBIAMoAqQBKAI4EIoB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HCAAIAAoAhRBAWo2AhQMAQsLIAAoAggQR0EBcUUEQCAAKAIgQRRBABAUIAAoAggQFiAAQX82AiwMAQsgACgCCBAWIAAgACgCHDYCLAsgACgCLCECIABBMGokACADIAIiADYCBCAAQQBIBEAgA0IANwMoDAELIAMpAwggAygCBK18Qv///////////wBWBEAgAygCFEEEQRYQFCADQgA3AygMAQsgAyADKQMIIAMoAgStfDcDKAsgAykDKCEBIANBMGokACABC20BAX8jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMAkAgBCgCGEUEQCAEQQA2AhwMAQsgBCAEKAIUIAQoAhAgBCgCDCAEKAIYQQhqEJIBNgIcCyAEKAIcIQAgBEEgaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwCQAJAIAEoAgwoAiRBAUYNACABKAIMKAIkQQJGDQAMAQsgASgCDEEAQgBBChAhGiABKAIMQQA2AiQLIAFBEGokAAumAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIIKAIABEAgAigCCCgCACACKAIEEGhBAEgEQCACKAIIQQxqIAIoAggoAgAQFyACQX82AgwMAgsLIAIoAgggAkEEakIEQRMQIUIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAuNCAIBfwF+IwBBkAFrIgMkACADIAA2AoQBIAMgATYCgAEgAyACNgJ8IAMQTwJAIAMoAoABKQMIQgBSBEAgAyADKAKAASgCACgCACkDSDcDYCADIAMoAoABKAIAKAIAKQNINwNoDAELIANCADcDYCADQgA3A2gLIANCADcDcAJAA0AgAykDcCADKAKAASkDCFQEQCADKAKAASgCACADKQNwp0EEdGooAgApA0ggAykDaFQEQCADIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSDcDaAsgAykDaCADKAKAASkDIFYEQCADKAJ8QRNBABAUIANCfzcDiAEMAwsgAyADKAKAASgCACADKQNwp0EEdGooAgApA0ggAygCgAEoAgAgAykDcKdBBHRqKAIAKQMgfCADKAKAASgCACADKQNwp0EEdGooAgAoAjAQU0H//wNxrXxC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DEECdGooAgBBAnRqLwEASA0AAkAgAygCGCADKAIQQQJ0ai8BACADKAIYIAMoAhxB3BZqIAMoAgxBAnRqKAIAQQJ0ai8BAEcNACADKAIQIAMoAhxB2Chqai0AACADKAIcQdwWaiADKAIMQQJ0aigCACADKAIcQdgoamotAABKDQAMAQsgAygCHEHcFmogAygCFEECdGogAygCHEHcFmogAygCDEECdGooAgA2AgAgAyADKAIMNgIUIAMgAygCDEEBdDYCDAwBCwsgAygCHEHcFmogAygCFEECdGogAygCEDYCAAvXEwEDfyMAQTBrIgIkACACIAA2AiwgAiABNgIoIAIgAigCKCgCADYCJCACIAIoAigoAggoAgA2AiAgAiACKAIoKAIIKAIMNgIcIAJBfzYCECACKAIsQQA2AtAoIAIoAixBvQQ2AtQoIAJBADYCGANAIAIoAhggAigCHEgEQAJAIAIoAiQgAigCGEECdGovAQAEQCACIAIoAhgiATYCECACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohACAEIAA2AtAoIABBAnQgA2ogATYCACACKAIYIAIoAixB2ChqakEAOgAADAELIAIoAiQgAigCGEECdGpBADsBAgsgAiACKAIYQQFqNgIYDAELCwNAIAIoAiwoAtAoQQJIBEACQCACKAIQQQJIBEAgAiACKAIQQQFqIgA2AhAMAQtBACEACyACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohASAEIAE2AtAoIAFBAnQgA2ogADYCACACIAA2AgwgAigCJCACKAIMQQJ0akEBOwEAIAIoAgwgAigCLEHYKGpqQQA6AAAgAigCLCIAIAAoAqgtQQFrNgKoLSACKAIgBEAgAigCLCIAIAAoAqwtIAIoAiAgAigCDEECdGovAQJrNgKsLQsMAQsLIAIoAiggAigCEDYCBCACIAIoAiwoAtAoQQJtNgIYA0AgAigCGEEBTgRAIAIoAiwgAigCJCACKAIYEHogAiACKAIYQQFrNgIYDAELCyACIAIoAhw2AgwDQCACIAIoAiwoAuAWNgIYIAIoAixB3BZqIQEgAigCLCIDKALQKCEAIAMgAEEBazYC0CggAigCLCAAQQJ0IAFqKAIANgLgFiACKAIsIAIoAiRBARB6IAIgAigCLCgC4BY2AhQgAigCGCEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAhQhASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIkIAIoAgxBAnRqIAIoAiQgAigCGEECdGovAQAgAigCJCACKAIUQQJ0ai8BAGo7AQAgAigCDCACKAIsQdgoamoCfyACKAIYIAIoAixB2Chqai0AACACKAIUIAIoAixB2Chqai0AAE4EQCACKAIYIAIoAixB2Chqai0AAAwBCyACKAIUIAIoAixB2Chqai0AAAtBAWo6AAAgAigCJCACKAIUQQJ0aiACKAIMIgA7AQIgAigCJCACKAIYQQJ0aiAAOwECIAIgAigCDCIAQQFqNgIMIAIoAiwgADYC4BYgAigCLCACKAIkQQEQeiACKAIsKALQKEECTg0ACyACKAIsKALgFiEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAighASMAQUBqIgAgAigCLDYCPCAAIAE2AjggACAAKAI4KAIANgI0IAAgACgCOCgCBDYCMCAAIAAoAjgoAggoAgA2AiwgACAAKAI4KAIIKAIENgIoIAAgACgCOCgCCCgCCDYCJCAAIAAoAjgoAggoAhA2AiAgAEEANgIEIABBADYCEANAIAAoAhBBD0wEQCAAKAI8QbwWaiAAKAIQQQF0akEAOwEAIAAgACgCEEEBajYCEAwBCwsgACgCNCAAKAI8QdwWaiAAKAI8KALUKEECdGooAgBBAnRqQQA7AQIgACAAKAI8KALUKEEBajYCHANAIAAoAhxBvQRIBEAgACAAKAI8QdwWaiAAKAIcQQJ0aigCADYCGCAAIAAoAjQgACgCNCAAKAIYQQJ0ai8BAkECdGovAQJBAWo2AhAgACgCECAAKAIgSgRAIAAgACgCIDYCECAAIAAoAgRBAWo2AgQLIAAoAjQgACgCGEECdGogACgCEDsBAiAAKAIYIAAoAjBMBEAgACgCPCAAKAIQQQF0akG8FmoiASABLwEAQQFqOwEAIABBADYCDCAAKAIYIAAoAiROBEAgACAAKAIoIAAoAhggACgCJGtBAnRqKAIANgIMCyAAIAAoAjQgACgCGEECdGovAQA7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EANAIAMpAxAgAykDCFpFBEAgAygCKCgCACADKQMQp0EEdGoQkAEgAyADKQMQQgF8NwMQDAELCyADKAIoIAMpAwgiATcDECADKAIoIAE3AwggA0EBOgAvCyADLQAvQQFxIQAgA0EwaiQAIAALzAEBAX8jAEEgayICJAAgAiAANwMQIAIgATYCDCACQTAQGCIBNgIIAkAgAUUEQCACKAIMQQ5BABAUIAJBADYCHAwBCyACKAIIQQA2AgAgAigCCEIANwMQIAIoAghCADcDCCACKAIIQgA3AyAgAigCCEIANwMYIAIoAghBADYCKCACKAIIQQA6ACwgAigCCCACKQMQIAIoAgwQgwFBAXFFBEAgAigCCBAkIAJBADYCHAwBCyACIAIoAgg2AhwLIAIoAhwhASACQSBqJAAgAQvWAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIANBDGpCBBApNgIIAkAgAygCCEUEQCADQX82AhwMAQsDQCADKAIUBEAgAygCFCgCBCADKAIQcUGABnEEQCADKAIIQgAQLBogAygCCCADKAIULwEIEB8gAygCCCADKAIULwEKEB8CfyMAQRBrIgAgAygCCDYCDCAAKAIMLQAAQQFxRQsEQCADKAIYQQhqQRRBABAUIAMoAggQFiADQX82AhwMBAsgAygCGCADQQxqQgQQNUEASARAIAMoAggQFiADQX82AhwMBAsgAygCFC8BCgRAIAMoAhggAygCFCgCDCADKAIULwEKrRA1QQBIBEAgAygCCBAWIANBfzYCHAwFCwsLIAMgAygCFCgCADYCFAwBCwsgAygCCBAWIANBADYCHAsgAygCHCEAIANBIGokACAAC2gBAX8jAEEQayICIAA2AgwgAiABNgIIIAJBADsBBgNAIAIoAgwEQCACKAIMKAIEIAIoAghxQYAGcQRAIAIgAigCDC8BCiACLwEGQQRqajsBBgsgAiACKAIMKAIANgIMDAELCyACLwEGC/ABAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgw2AgggAUEANgIEA0AgASgCDARAAkACQCABKAIMLwEIQfXGAUYNACABKAIMLwEIQfXgAUYNACABKAIMLwEIQYGyAkYNACABKAIMLwEIQQFHDQELIAEgASgCDCgCADYCACABKAIIIAEoAgxGBEAg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IAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCEASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQL0IWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJIQgQQHhogASgCSBAqBEAgASgCOEEBQQAQFCABQQA2AkwMAQsgASABKAJIEB1B//8Dca03AyggASABKAJIEB1B//8Dca03AyAgASkDICABKQMoUgRAIAEoAjhBE0EAEBQgAUEANgJMDAELIAEgASgCSBAqrTcDGCABIAEoAkgQKq03AxAgASkDECABKQMQIAEpAxh8VgRAIAEoAjhBBEEWEBQgAUEANgJMDAELIAEpAxAgASkDGHwgASkDQCABKQMIfFYEQCABKAI4QRVBABAUIAFBADYCTAwBCwJAIAEoAjxBBHFFDQAgASkDECABKQMYfCABKQNAIAEpAwh8UQ0AIAEoAjhBFUEAEBQgAUEANgJMDAELIAEgASkDICABKAI4EIQBIgU2AjQgBUUEQCABQQA2AkwMAQsgASgCNEEAOgAsIAEoAjQgASkDGDcDGCABKAI0IAEpAxA3AyAgASABKAI0NgJMCyABKAJMIQUgAUHQAGokACAAIAU2AlALIAAoAlBFBEAgAEEANgJsDAELIAAoAmQgACkDMEIUfBAsGiAAIAAoAmQQHTsBTiAAKAJQKQMgIAAoAlApAxh8IAApA1ggACkDMHxWBEAg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IAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEFwgAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQeBogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2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mwFCADcDAEGYmwFCADcDAEGQmwFCADcDAEGImwFCADcDAEGAmwFCADcDAEH4mgFCADcDAEHwmgFCADcDAEHwmgEL1QQBBX8jAEGwAWsiASQAIAEgADYCqAEgASgCqAEQNwJAAkAgASgCqAEoAgBBAE4EQCABKAKoASgCAEGAFCgCAEgNAQsgASABKAKoASgCADYCECABQSBqQY8SIAFBEGoQcCABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGAE2ooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBkBRqKAIAQQFrDgIAAQILIAEoAqgBKAIEIQJBkJkBKAIAIQRBACEAAkACQANAIAIgAEGgiAFqLQAARwRAQdcAIQMgAEEBaiIAQdcARw0BDAILCyAAIgMNAEGAiQEhAgwBC0GAiQEhAANAIAAtAAAhBSAAQQFqIgIhACAFDQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQKwJ/IAEoAqQBBEAgASgCpAEQK0ECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEHAgASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMIQgSGIAgpAwAiA0I8iIQhAiAIKQMQIAgpAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACIVCAFINACACQgGDIAJ8IQILIAhBIGokACACIAZCgICAgICAgICAf4OEvws5AwALrRcDEn8CfgF8IwBBsARrIgkkACAJQQA2AiwCQCABvSIYQn9XBEBBASESQa4IIRMgAZoiAb0hGAwBCyAEQYAQcQRAQQEhEkGxCCETDAELQbQIQa8IIARBAXEiEhshEyASRSEXCwJAIBhCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiASQQNqIg0gBEH//3txECYgACATIBIQIiAAQeQLQbUSIAVBIHEiAxtBjw1BuRIgAxsgASABYhtBAxAiDAELIAlBEGohEAJAAn8CQCABIAlBLGoQqQEiASABoCIBRAAAAAAAAAAAYgRAIAkgCSgCLCIGQQFrNgIsIAVBIHIiFEHhAEcNAQwDCyAFQSByIhRB4QBGDQIgCSgCLCELQQYgAyADQQBIGwwBCyAJIAZBHWsiCzYCLCABRAAAAAAAALBBoiEBQQYgAyADQQBIGwshCiAJQTBqIAlB0AJqIAtBAEgbIg4hBwNAIAcCfyABRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqwwBC0EACyIDNgIAIAdBBGohByABIAO4oUQA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HCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCGCABKAIUSQtBAXENAAsgASgCKEGCAiABKAIUIAEoAhhrazYCYCABKAIoKAJgIAEoAigoAnRLBEAgASgCKCABKAIoKAJ0NgJgCwsLAkAgASgCKCgCYEEDTwRAIAEgASgCKCgCYEEDazoAEyABQQE7ARAgASgCKCICKAKkLSACKAKgLUEBdGogAS8BEDsBACABLQATIQMgASgCKCICKAKYLSEEIAIgAigCoC0iAkEBajYCoC0gAiAEaiADOgAAIAEgAS8BEEEBazsBECABKAIoIAEtABNB0N0Aai0AAEECdGpBmAlqIgIgAi8BAEEBajsBACABKAIoQYgTagJ/IAEvARBBgAJJBEAgAS8BEC0A0FkMAQsgAS8BEEEHdkGAAmotANBZC0ECdGoiAiACLwEAQQFqOwEAIAEgASgCKCgCoC0gASgCKCgCnC1BAWtGNgIgIAEoAigiAiACKAJ0IAEoAigoAmBrNgJ0IAEoAigiAiABKAIoKAJgIAIoAmxqNgJsIAEoAihBADYCYAwBCyABIAEoAigiAigCOCACKAJsai0AADoADyABKAIoIgIoAqQtIAIoAqAtQQF0akEAOwEAIAEtAA8hAyABKAIoIgIoApgtIQQgAiACKAKgLSICQQFqNgKgLSACIARqIAM6AAAgASgCKCABLQAPQQJ0aiICIAIvAZQBQQFqOwGUASABIAEoAigoAqAtIAEoAigoApwtQQFrRjYCICABKAIoIgIgAigCdEEBazYCdCABKAIoIgIgAigCbEEBajYCbAsgASgCIARAIAEoAigCfyABKAIoKAJcQQBOBEAgASgCKCgCOCABKAIoKAJcagwBC0EACyABKAIoKAJsIAEoAigoAlxrQQAQKCABKAIoIAEoAigoAmw2AlwgASgCKCgCABAcIAEoAigo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QCABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiQgASgCLCABKAIccUECdGooAQA2ARACQAJAA0AgASABLQARNgIMIAEgASgCLCABKAIMdjYCLCABIAEoAiggASgCDGs2AiggASABLQAQNgIMIAEoAgxFBEAgAS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgi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ZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AbmFuAC9kZXYvdXJhbmRvbQBpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2sAaW5jb3JyZWN0IGhlYWRlciBjaGVjawBpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrAGluY29ycmVjdCBkYXRhIGNoZWNrAGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrAGhlYWRlciBjcmMgbWlzbWF0Y2gAaW5mAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZABPcGVyYXRpb24gbm90IHN1cHBvcnRlZABFbmNyeXB0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAENvbXByZXNzaW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAEVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQAQ29udGFpbmluZyB6aXAgYXJjaGl2ZSB3YXMgY2xvc2VkAENsb3NpbmcgemlwIGFyY2hpdmUgZmFpbGVkAFJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlIGZhaWxlZABFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkAE5vIHBhc3N3b3JkIHByb3ZpZGVkAFdyb25nIHBhc3N3b3JkIHByb3ZpZGVkAFVua25vd24gZXJyb3IgJWQAcmIAcitiAHJ3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CADcAAgAPAAIALwACAB8AAgA/AAIAAIACACCAAgAQgAIAMIACAAiAAgAogAIAGIACADiAAgAEgAIAJIACABSAAgA0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";kq(Uh)||(Uh=fEe(Uh));function TEe(t){try{if(t==Uh&&$D)return new Uint8Array($D);var e=hq(t);if(e)return e;if(ZD)return ZD(t);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(r){Cr(r)}}function OEe(t,e){var r,i,n;try{n=TEe(t),i=new WebAssembly.Module(n),r=new WebAssembly.Instance(i,e)}catch(o){var s=o.toString();throw _r("failed to compile wasm module: "+s),(s.includes("imported Memory")||s.includes("memory import"))&&_r("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),o}return[r,i]}function UEe(){var t={a:KEe};function e(n,s){var o=n.exports;se.asm=o,DI=se.asm.u,wq(DI.buffer),iS=se.asm.za,MEe(se.asm.v),oS("wasm-instantiate")}if(Sq("wasm-instantiate"),se.instantiateWasm)try{var r=se.instantiateWasm(t,e);return r}catch(n){return _r("Module.instantiateWasm callback failed with error: "+n),!1}var i=OEe(Uh,t);return e(i[0]),se.asm}var Rr,ao;function nS(t){for(;t.length>0;){var e=t.shift();if(typeof e=="function"){e(se);continue}var r=e.func;typeof r=="number"?e.arg===void 0?iS.get(r)():iS.get(r)(e.arg):r(e.arg===void 0?null:e.arg)}}function kI(t,e){var r=new Date(je[t>>2]*1e3);je[e>>2]=r.getUTCSeconds(),je[e+4>>2]=r.getUTCMinutes(),je[e+8>>2]=r.getUTCHours(),je[e+12>>2]=r.getUTCDate(),je[e+16>>2]=r.getUTCMonth(),je[e+20>>2]=r.getUTCFullYear()-1900,je[e+24>>2]=r.getUTCDay(),je[e+36>>2]=0,je[e+32>>2]=0;var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return je[e+28>>2]=n,kI.GMTString||(kI.GMTString=tS("GMT")),je[e+40>>2]=kI.GMTString,e}function HEe(t,e){return kI(t,e)}var Ct={splitPath:function(t){var e=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return e.exec(t).slice(1)},normalizeArray:function(t,e){for(var r=0,i=t.length-1;i>=0;i--){var n=t[i];n==="."?t.splice(i,1):n===".."?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r;r--)t.unshift("..");return t},normalize:function(t){var e=t.charAt(0)==="/",r=t.substr(-1)==="/";return t=Ct.normalizeArray(t.split("/").filter(function(i){return!!i}),!e).join("/"),!t&&!e&&(t="."),t&&r&&(t+="/"),(e?"/":"")+t},dirname:function(t){var e=Ct.splitPath(t),r=e[0],i=e[1];return!r&&!i?".":(i&&(i=i.substr(0,i.length-1)),r+i)},basename:function(t){if(t==="/")return"/";t=Ct.normalize(t),t=t.replace(/\/$/,"");var e=t.lastIndexOf("/");return e===-1?t:t.substr(e+1)},extname:function(t){return Ct.splitPath(t)[3]},join:function(){var t=Array.prototype.slice.call(arguments,0);return Ct.normalize(t.join("/"))},join2:function(t,e){return Ct.normalize(t+"/"+e)}};function GEe(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}else if(xA)try{var e=require("crypto");return function(){return e.randomBytes(1)[0]}}catch(r){}return function(){Cr("randomDevice")}}var Ao={resolve:function(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:E.cwd();if(typeof i!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!i)return"";t=i+"/"+t,e=i.charAt(0)==="/"}return t=Ct.normalizeArray(t.split("/").filter(function(n){return!!n}),!e).join("/"),(e?"/":"")+t||"."},relative:function(t,e){t=Ao.resolve(t).substr(1),e=Ao.resolve(e).substr(1);function r(c){for(var u=0;u=0&&c[g]==="";g--);return u>g?[]:c.slice(u,g-u+1)}for(var i=r(t.split("/")),n=r(e.split("/")),s=Math.min(i.length,n.length),o=s,a=0;a0?e=i.slice(0,n).toString("utf-8"):e=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(e=window.prompt("Input: "),e!==null&&(e+=` -`)):typeof readline=="function"&&(e=readline(),e!==null&&(e+=` -`));if(!e)return null;t.input=aS(e,!0)}return t.input.shift()},put_char:function(t,e){e===null||e===10?(bI(Ic(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(bI(Ic(t.output,0)),t.output=[])}},default_tty1_ops:{put_char:function(t,e){e===null||e===10?(_r(Ic(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(_r(Ic(t.output,0)),t.output=[])}}};function AS(t){for(var e=dEe(t,65536),r=Bq(e);t=e)){var i=1024*1024;e=Math.max(e,r*(r>>0),r!=0&&(e=Math.max(e,256));var n=t.contents;t.contents=new Uint8Array(e),t.usedBytes>0&&t.contents.set(n.subarray(0,t.usedBytes),0)}},resizeFileStorage:function(t,e){if(t.usedBytes!=e)if(e==0)t.contents=null,t.usedBytes=0;else{var r=t.contents;t.contents=new Uint8Array(e),r&&t.contents.set(r.subarray(0,Math.min(e,t.usedBytes))),t.usedBytes=e}},node_ops:{getattr:function(t){var e={};return e.dev=E.isChrdev(t.mode)?t.id:1,e.ino=t.id,e.mode=t.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=t.rdev,E.isDir(t.mode)?e.size=4096:E.isFile(t.mode)?e.size=t.usedBytes:E.isLink(t.mode)?e.size=t.link.length:e.size=0,e.atime=new Date(t.timestamp),e.mtime=new Date(t.timestamp),e.ctime=new Date(t.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(t,e){e.mode!==void 0&&(t.mode=e.mode),e.timestamp!==void 0&&(t.timestamp=e.timestamp),e.size!==void 0&>.resizeFileStorage(t,e.size)},lookup:function(t,e){throw E.genericErrors[44]},mknod:function(t,e,r,i){return gt.createNode(t,e,r,i)},rename:function(t,e,r){if(E.isDir(t.mode)){var i;try{i=E.lookupNode(e,r)}catch(s){}if(i)for(var n in i.contents)throw new E.ErrnoError(55)}delete t.parent.contents[t.name],t.parent.timestamp=Date.now(),t.name=r,e.contents[r]=t,e.timestamp=t.parent.timestamp,t.parent=e},unlink:function(t,e){delete t.contents[e],t.timestamp=Date.now()},rmdir:function(t,e){var r=E.lookupNode(t,e);for(var i in r.contents)throw new E.ErrnoError(55);delete t.contents[e],t.timestamp=Date.now()},readdir:function(t){var e=[".",".."];for(var r in t.contents)!t.contents.hasOwnProperty(r)||e.push(r);return e},symlink:function(t,e,r){var i=gt.createNode(t,e,511|40960,0);return i.link=r,i},readlink:function(t){if(!E.isLink(t.mode))throw new E.ErrnoError(28);return t.link}},stream_ops:{read:function(t,e,r,i,n){var s=t.node.contents;if(n>=t.node.usedBytes)return 0;var o=Math.min(t.node.usedBytes-n,i);if(o>8&&s.subarray)e.set(s.subarray(n,n+o),r);else for(var a=0;a0||i+r>2)}catch(r){throw r.code?new E.ErrnoError(Ze.convertNodeCode(r)):r}return e.mode},realPath:function(t){for(var e=[];t.parent!==t;)e.push(t.name),t=t.parent;return e.push(t.mount.opts.root),e.reverse(),Ct.join.apply(null,e)},flagsForNode:function(t){t&=~2097152,t&=~2048,t&=~32768,t&=~524288;var e=0;for(var r in Ze.flagsForNodeMap)t&r&&(e|=Ze.flagsForNodeMap[r],t^=r);if(t)throw new E.ErrnoError(28);return e},node_ops:{getattr:function(t){var e=Ze.realPath(t),r;try{r=ct.lstatSync(e)}catch(i){throw i.code?new E.ErrnoError(Ze.convertNodeCode(i)):i}return Ze.isWindows&&!r.blksize&&(r.blksize=4096),Ze.isWindows&&!r.blocks&&(r.blocks=(r.size+r.blksize-1)/r.blksize|0),{dev:r.dev,ino:r.ino,mode:r.mode,nlink:r.nlink,uid:r.uid,gid:r.gid,rdev:r.rdev,size:r.size,atime:r.atime,mtime:r.mtime,ctime:r.ctime,blksize:r.blksize,blocks:r.blocks}},setattr:function(t,e){var r=Ze.realPath(t);try{if(e.mode!==void 0&&(ct.chmodSync(r,e.mode),t.mode=e.mode),e.timestamp!==void 0){var i=new Date(e.timestamp);ct.utimesSync(r,i,i)}e.size!==void 0&&ct.truncateSync(r,e.size)}catch(n){throw n.code?new E.ErrnoError(Ze.convertNodeCode(n)):n}},lookup:function(t,e){var r=Ct.join2(Ze.realPath(t),e),i=Ze.getMode(r);return Ze.createNode(t,e,i)},mknod:function(t,e,r,i){var n=Ze.createNode(t,e,r,i),s=Ze.realPath(n);try{E.isDir(n.mode)?ct.mkdirSync(s,n.mode):ct.writeFileSync(s,"",{mode:n.mode})}catch(o){throw o.code?new E.ErrnoError(Ze.convertNodeCode(o)):o}return n},rename:function(t,e,r){var i=Ze.realPath(t),n=Ct.join2(Ze.realPath(e),r);try{ct.renameSync(i,n)}catch(s){throw s.code?new E.ErrnoError(Ze.convertNodeCode(s)):s}t.name=r},unlink:function(t,e){var r=Ct.join2(Ze.realPath(t),e);try{ct.unlinkSync(r)}catch(i){throw i.code?new E.ErrnoError(Ze.convertNodeCode(i)):i}},rmdir:function(t,e){var r=Ct.join2(Ze.realPath(t),e);try{ct.rmdirSync(r)}catch(i){throw i.code?new E.ErrnoError(Ze.convertNodeCode(i)):i}},readdir:function(t){var e=Ze.realPath(t);try{return ct.readdirSync(e)}catch(r){throw r.code?new E.ErrnoError(Ze.convertNodeCode(r)):r}},symlink:function(t,e,r){var i=Ct.join2(Ze.realPath(t),e);try{ct.symlinkSync(r,i)}catch(n){throw n.code?new E.ErrnoError(Ze.convertNodeCode(n)):n}},readlink:function(t){var e=Ze.realPath(t);try{return e=ct.readlinkSync(e),e=lS.relative(lS.resolve(t.mount.opts.root),e),e}catch(r){throw r.code?new E.ErrnoError(Ze.convertNodeCode(r)):r}}},stream_ops:{open:function(t){var e=Ze.realPath(t.node);try{E.isFile(t.node.mode)&&(t.nfd=ct.openSync(e,Ze.flagsForNode(t.flags)))}catch(r){throw r.code?new E.ErrnoError(Ze.convertNodeCode(r)):r}},close:function(t){try{E.isFile(t.node.mode)&&t.nfd&&ct.closeSync(t.nfd)}catch(e){throw e.code?new E.ErrnoError(Ze.convertNodeCode(e)):e}},read:function(t,e,r,i,n){if(i===0)return 0;try{return ct.readSync(t.nfd,Ze.bufferFrom(e.buffer),r,i,n)}catch(s){throw new E.ErrnoError(Ze.convertNodeCode(s))}},write:function(t,e,r,i,n){try{return ct.writeSync(t.nfd,Ze.bufferFrom(e.buffer),r,i,n)}catch(s){throw new E.ErrnoError(Ze.convertNodeCode(s))}},llseek:function(t,e,r){var i=e;if(r===1)i+=t.position;else if(r===2&&E.isFile(t.node.mode))try{var n=ct.fstatSync(t.nfd);i+=n.size}catch(s){throw new E.ErrnoError(Ze.convertNodeCode(s))}if(i<0)throw new E.ErrnoError(28);return i},mmap:function(t,e,r,i,n,s){if(e!==0)throw new E.ErrnoError(28);if(!E.isFile(t.node.mode))throw new E.ErrnoError(43);var o=AS(r);return Ze.stream_ops.read(t,di,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){if(!E.isFile(t.node.mode))throw new E.ErrnoError(43);if(n&2)return 0;var s=Ze.stream_ops.write(t,e,0,i,r,!1);return 0}}},vq={lookupPath:function(t){return{path:t,node:{mode:Ze.getMode(t)}}},createStandardStreams:function(){E.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var t=1;t<3;t++)E.streams[t]={fd:t,nfd:t,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(t,e){E.isDir(t)?ct.mkdirSync(t,e):ct.writeFileSync(t,"",{mode:e})},mkdir:function(){ct.mkdirSync.apply(void 0,arguments)},symlink:function(){ct.symlinkSync.apply(void 0,arguments)},rename:function(){ct.renameSync.apply(void 0,arguments)},rmdir:function(){ct.rmdirSync.apply(void 0,arguments)},readdir:function(){ct.readdirSync.apply(void 0,arguments)},unlink:function(){ct.unlinkSync.apply(void 0,arguments)},readlink:function(){return ct.readlinkSync.apply(void 0,arguments)},stat:function(){return ct.statSync.apply(void 0,arguments)},lstat:function(){return ct.lstatSync.apply(void 0,arguments)},chmod:function(){ct.chmodSync.apply(void 0,arguments)},fchmod:function(){ct.fchmodSync.apply(void 0,arguments)},chown:function(){ct.chownSync.apply(void 0,arguments)},fchown:function(){ct.fchownSync.apply(void 0,arguments)},truncate:function(){ct.truncateSync.apply(void 0,arguments)},ftruncate:function(t,e){if(e<0)throw new E.ErrnoError(28);ct.ftruncateSync.apply(void 0,arguments)},utime:function(){ct.utimesSync.apply(void 0,arguments)},open:function(t,e,r,i){typeof e=="string"&&(e=vA.modeStringToFlags(e));var n=ct.openSync(t,Ze.flagsForNode(e),r),s=i!=null?i:E.nextfd(n),o={fd:s,nfd:n,position:0,path:t,flags:e,seekable:!0};return E.streams[s]=o,o},close:function(t){t.stream_ops||ct.closeSync(t.nfd),E.closeStream(t.fd)},llseek:function(t,e,r){if(t.stream_ops)return vA.llseek(t,e,r);var i=e;if(r===1)i+=t.position;else if(r===2)i+=ct.fstatSync(t.nfd).size;else if(r!==0)throw new E.ErrnoError(yc.EINVAL);if(i<0)throw new E.ErrnoError(yc.EINVAL);return t.position=i,i},read:function(t,e,r,i,n){if(t.stream_ops)return vA.read(t,e,r,i,n);var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ct.readSync(t.nfd,Ze.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},write:function(t,e,r,i,n){if(t.stream_ops)return vA.write(t,e,r,i,n);t.flags&+"1024"&&E.llseek(t,0,+"2");var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ct.writeSync(t.nfd,Ze.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},allocate:function(){throw new E.ErrnoError(yc.EOPNOTSUPP)},mmap:function(t,e,r,i,n,s){if(t.stream_ops)return vA.mmap(t,e,r,i,n,s);if(e!==0)throw new E.ErrnoError(28);var o=AS(r);return E.read(t,di,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){return t.stream_ops?vA.msync(t,e,r,i,n):(n&2||E.write(t,e,0,i,r),0)},munmap:function(){return 0},ioctl:function(){throw new E.ErrnoError(yc.ENOTTY)}},E={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(t,e){if(t=Ao.resolve(E.cwd(),t),e=e||{},!t)return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var i in r)e[i]===void 0&&(e[i]=r[i]);if(e.recurse_count>8)throw new E.ErrnoError(32);for(var n=Ct.normalizeArray(t.split("/").filter(function(h){return!!h}),!1),s=E.root,o="/",a=0;a40)throw new E.ErrnoError(32)}}return{path:o,node:s}},getPath:function(t){for(var e;;){if(E.isRoot(t)){var r=t.mount.mountpoint;return e?r[r.length-1]!=="/"?r+"/"+e:r+e:r}e=e?t.name+"/"+e:t.name,t=t.parent}},hashName:function(t,e){for(var r=0,i=0;i>>0)%E.nameTable.length},hashAddNode:function(t){var e=E.hashName(t.parent.id,t.name);t.name_next=E.nameTable[e],E.nameTable[e]=t},hashRemoveNode:function(t){var e=E.hashName(t.parent.id,t.name);if(E.nameTable[e]===t)E.nameTable[e]=t.name_next;else for(var r=E.nameTable[e];r;){if(r.name_next===t){r.name_next=t.name_next;break}r=r.name_next}},lookupNode:function(t,e){var r=E.mayLookup(t);if(r)throw new E.ErrnoError(r,t);for(var i=E.hashName(t.id,e),n=E.nameTable[i];n;n=n.name_next){var s=n.name;if(n.parent.id===t.id&&s===e)return n}return E.lookup(t,e)},createNode:function(t,e,r,i){var n=new E.FSNode(t,e,r,i);return E.hashAddNode(n),n},destroyNode:function(t){E.hashRemoveNode(t)},isRoot:function(t){return t===t.parent},isMountpoint:function(t){return!!t.mounted},isFile:function(t){return(t&61440)==32768},isDir:function(t){return(t&61440)==16384},isLink:function(t){return(t&61440)==40960},isChrdev:function(t){return(t&61440)==8192},isBlkdev:function(t){return(t&61440)==24576},isFIFO:function(t){return(t&61440)==4096},isSocket:function(t){return(t&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(t){var e=E.flagModes[t];if(typeof e=="undefined")throw new Error("Unknown file open mode: "+t);return e},flagsToPermissionString:function(t){var e=["r","w","rw"][t&3];return t&512&&(e+="w"),e},nodePermissions:function(t,e){return E.ignorePermissions?0:e.includes("r")&&!(t.mode&292)||e.includes("w")&&!(t.mode&146)||e.includes("x")&&!(t.mode&73)?2:0},mayLookup:function(t){var e=E.nodePermissions(t,"x");return e||(t.node_ops.lookup?0:2)},mayCreate:function(t,e){try{var r=E.lookupNode(t,e);return 20}catch(i){}return E.nodePermissions(t,"wx")},mayDelete:function(t,e,r){var i;try{i=E.lookupNode(t,e)}catch(s){return s.errno}var n=E.nodePermissions(t,"wx");if(n)return n;if(r){if(!E.isDir(i.mode))return 54;if(E.isRoot(i)||E.getPath(i)===E.cwd())return 10}else if(E.isDir(i.mode))return 31;return 0},mayOpen:function(t,e){return t?E.isLink(t.mode)?32:E.isDir(t.mode)&&(E.flagsToPermissionString(e)!=="r"||e&512)?31:E.nodePermissions(t,E.flagsToPermissionString(e)):44},MAX_OPEN_FDS:4096,nextfd:function(t,e){t=t||0,e=e||E.MAX_OPEN_FDS;for(var r=t;r<=e;r++)if(!E.streams[r])return r;throw new E.ErrnoError(33)},getStream:function(t){return E.streams[t]},createStream:function(t,e,r){E.FSStream||(E.FSStream=function(){},E.FSStream.prototype={object:{get:function(){return this.node},set:function(o){this.node=o}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var i=new E.FSStream;for(var n in t)i[n]=t[n];t=i;var s=E.nextfd(e,r);return t.fd=s,E.streams[s]=t,t},closeStream:function(t){E.streams[t]=null},chrdev_stream_ops:{open:function(t){var e=E.getDevice(t.node.rdev);t.stream_ops=e.stream_ops,t.stream_ops.open&&t.stream_ops.open(t)},llseek:function(){throw new E.ErrnoError(70)}},major:function(t){return t>>8},minor:function(t){return t&255},makedev:function(t,e){return t<<8|e},registerDevice:function(t,e){E.devices[t]={stream_ops:e}},getDevice:function(t){return E.devices[t]},getMounts:function(t){for(var e=[],r=[t];r.length;){var i=r.pop();e.push(i),r.push.apply(r,i.mounts)}return e},syncfs:function(t,e){typeof t=="function"&&(e=t,t=!1),E.syncFSRequests++,E.syncFSRequests>1&&_r("warning: "+E.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=E.getMounts(E.root.mount),i=0;function n(o){return E.syncFSRequests--,e(o)}function s(o){if(o)return s.errored?void 0:(s.errored=!0,n(o));++i>=r.length&&n(null)}r.forEach(function(o){if(!o.type.syncfs)return s(null);o.type.syncfs(o,t,s)})},mount:function(t,e,r){var i=r==="/",n=!r,s;if(i&&E.root)throw new E.ErrnoError(10);if(!i&&!n){var o=E.lookupPath(r,{follow_mount:!1});if(r=o.path,s=o.node,E.isMountpoint(s))throw new E.ErrnoError(10);if(!E.isDir(s.mode))throw new E.ErrnoError(54)}var a={type:t,opts:e,mountpoint:r,mounts:[]},l=t.mount(a);return l.mount=a,a.root=l,i?E.root=l:s&&(s.mounted=a,s.mount&&s.mount.mounts.push(a)),l},unmount:function(t){var e=E.lookupPath(t,{follow_mount:!1});if(!E.isMountpoint(e.node))throw new E.ErrnoError(28);var r=e.node,i=r.mounted,n=E.getMounts(i);Object.keys(E.nameTable).forEach(function(o){for(var a=E.nameTable[o];a;){var l=a.name_next;n.includes(a.mount)&&E.destroyNode(a),a=l}}),r.mounted=null;var s=r.mount.mounts.indexOf(i);r.mount.mounts.splice(s,1)},lookup:function(t,e){return t.node_ops.lookup(t,e)},mknod:function(t,e,r){var i=E.lookupPath(t,{parent:!0}),n=i.node,s=Ct.basename(t);if(!s||s==="."||s==="..")throw new E.ErrnoError(28);var o=E.mayCreate(n,s);if(o)throw new E.ErrnoError(o);if(!n.node_ops.mknod)throw new E.ErrnoError(63);return n.node_ops.mknod(n,s,e,r)},create:function(t,e){return e=e!==void 0?e:438,e&=4095,e|=32768,E.mknod(t,e,0)},mkdir:function(t,e){return e=e!==void 0?e:511,e&=511|512,e|=16384,E.mknod(t,e,0)},mkdirTree:function(t,e){for(var r=t.split("/"),i="",n=0;nthis.length-1||h<0)){var f=h%this.chunkSize,p=h/this.chunkSize|0;return this.getter(p)[f]}},s.prototype.setDataGetter=function(h){this.getter=h},s.prototype.cacheLength=function(){var h=new XMLHttpRequest;if(h.open("HEAD",r,!1),h.send(null),!(h.status>=200&&h.status<300||h.status===304))throw new Error("Couldn't load "+r+". Status: "+h.status);var f=Number(h.getResponseHeader("Content-length")),p,m=(p=h.getResponseHeader("Accept-Ranges"))&&p==="bytes",I=(p=h.getResponseHeader("Content-Encoding"))&&p==="gzip",Q=1024*1024;m||(Q=f);var w=function(N,H){if(N>H)throw new Error("invalid range ("+N+", "+H+") or no bytes requested!");if(H>f-1)throw new Error("only "+f+" bytes available! programmer error!");var T=new XMLHttpRequest;if(T.open("GET",r,!1),f!==Q&&T.setRequestHeader("Range","bytes="+N+"-"+H),typeof Uint8Array!="undefined"&&(T.responseType="arraybuffer"),T.overrideMimeType&&T.overrideMimeType("text/plain; charset=x-user-defined"),T.send(null),!(T.status>=200&&T.status<300||T.status===304))throw new Error("Couldn't load "+r+". Status: "+T.status);return T.response!==void 0?new Uint8Array(T.response||[]):aS(T.responseText||"",!0)},x=this;x.setDataGetter(function(N){var H=N*Q,T=(N+1)*Q-1;if(T=Math.min(T,f-1),typeof x.chunks[N]=="undefined"&&(x.chunks[N]=w(H,T)),typeof x.chunks[N]=="undefined")throw new Error("doXHR failed!");return x.chunks[N]}),(I||!f)&&(Q=f=1,f=this.getter(0).length,Q=f,bI("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=f,this._chunkSize=Q,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!uq)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var o=new s;Object.defineProperties(o,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var a={isDevice:!1,contents:o}}else var a={isDevice:!1,url:r};var l=E.createFile(t,e,a,i,n);a.contents?l.contents=a.contents:a.url&&(l.contents=null,l.url=a.url),Object.defineProperties(l,{usedBytes:{get:function(){return this.contents.length}}});var c={},u=Object.keys(l.stream_ops);return u.forEach(function(g){var h=l.stream_ops[g];c[g]=function(){return E.forceLoadFile(l),h.apply(null,arguments)}}),c.read=function(h,f,p,m,I){E.forceLoadFile(l);var Q=h.node.contents;if(I>=Q.length)return 0;var w=Math.min(Q.length-I,m);if(Q.slice)for(var x=0;x>2]=i.dev,je[r+4>>2]=0,je[r+8>>2]=i.ino,je[r+12>>2]=i.mode,je[r+16>>2]=i.nlink,je[r+20>>2]=i.uid,je[r+24>>2]=i.gid,je[r+28>>2]=i.rdev,je[r+32>>2]=0,ao=[i.size>>>0,(Rr=i.size,+Math.abs(Rr)>=1?Rr>0?(Math.min(+Math.floor(Rr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Rr-+(~~Rr>>>0))/4294967296)>>>0:0)],je[r+40>>2]=ao[0],je[r+44>>2]=ao[1],je[r+48>>2]=4096,je[r+52>>2]=i.blocks,je[r+56>>2]=i.atime.getTime()/1e3|0,je[r+60>>2]=0,je[r+64>>2]=i.mtime.getTime()/1e3|0,je[r+68>>2]=0,je[r+72>>2]=i.ctime.getTime()/1e3|0,je[r+76>>2]=0,ao=[i.ino>>>0,(Rr=i.ino,+Math.abs(Rr)>=1?Rr>0?(Math.min(+Math.floor(Rr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Rr-+(~~Rr>>>0))/4294967296)>>>0:0)],je[r+80>>2]=ao[0],je[r+84>>2]=ao[1],0},doMsync:function(t,e,r,i,n){var s=Ec.slice(t,t+r);E.msync(e,s,n,r,i)},doMkdir:function(t,e){return t=Ct.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),E.mkdir(t,e,0),0},doMknod:function(t,e,r){switch(e&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return E.mknod(t,e,r),0},doReadlink:function(t,e,r){if(r<=0)return-28;var i=E.readlink(t),n=Math.min(r,xI(i)),s=di[e+n];return Iq(i,e,r+1),di[e+n]=s,n},doAccess:function(t,e){if(e&~7)return-28;var r,i=E.lookupPath(t,{follow:!0});if(r=i.node,!r)return-44;var n="";return e&4&&(n+="r"),e&2&&(n+="w"),e&1&&(n+="x"),n&&E.nodePermissions(r,n)?-2:0},doDup:function(t,e,r){var i=E.getStream(r);return i&&E.close(i),E.open(t,e,0,r,r).fd},doReadv:function(t,e,r,i){for(var n=0,s=0;s>2],a=je[e+(s*8+4)>>2],l=E.read(t,di,o,a,i);if(l<0)return-1;if(n+=l,l>2],a=je[e+(s*8+4)>>2],l=E.write(t,di,o,a,i);if(l<0)return-1;n+=l}return n},varargs:void 0,get:function(){xt.varargs+=4;var t=je[xt.varargs-4>>2];return t},getStr:function(t){var e=mq(t);return e},getStreamFromFD:function(t){var e=E.getStream(t);if(!e)throw new E.ErrnoError(8);return e},get64:function(t,e){return t}};function YEe(t,e){try{return t=xt.getStr(t),E.chmod(t,e),0}catch(r){return(typeof E=="undefined"||!(r instanceof E.ErrnoError))&&Cr(r),-r.errno}}function jEe(t){return je[qEe()>>2]=t,t}function JEe(t,e,r){xt.varargs=r;try{var i=xt.getStreamFromFD(t);switch(e){case 0:{var n=xt.get();if(n<0)return-28;var s;return s=E.open(i.path,i.flags,0,n),s.fd}case 1:case 2:return 0;case 3:return i.flags;case 4:{var n=xt.get();return i.flags|=n,0}case 12:{var n=xt.get(),o=0;return eS[n+o>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return jEe(28),-1;default:return-28}}catch(a){return(typeof E=="undefined"||!(a instanceof E.ErrnoError))&&Cr(a),-a.errno}}function WEe(t,e){try{var r=xt.getStreamFromFD(t);return xt.doStat(E.stat,r.path,e)}catch(i){return(typeof E=="undefined"||!(i instanceof E.ErrnoError))&&Cr(i),-i.errno}}function zEe(t,e,r){xt.varargs=r;try{var i=xt.getStreamFromFD(t);switch(e){case 21509:case 21505:return i.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return i.tty?0:-59;case 21519:{if(!i.tty)return-59;var n=xt.get();return je[n>>2]=0,0}case 21520:return i.tty?-28:-59;case 21531:{var n=xt.get();return E.ioctl(i,e,n)}case 21523:return i.tty?0:-59;case 21524:return i.tty?0:-59;default:Cr("bad ioctl syscall "+e)}}catch(s){return(typeof E=="undefined"||!(s instanceof E.ErrnoError))&&Cr(s),-s.errno}}function VEe(t,e,r){xt.varargs=r;try{var i=xt.getStr(t),n=r?xt.get():0,s=E.open(i,e,n);return s.fd}catch(o){return(typeof E=="undefined"||!(o instanceof E.ErrnoError))&&Cr(o),-o.errno}}function XEe(t,e){try{return t=xt.getStr(t),e=xt.getStr(e),E.rename(t,e),0}catch(r){return(typeof E=="undefined"||!(r instanceof E.ErrnoError))&&Cr(r),-r.errno}}function ZEe(t){try{return t=xt.getStr(t),E.rmdir(t),0}catch(e){return(typeof E=="undefined"||!(e instanceof E.ErrnoError))&&Cr(e),-e.errno}}function _Ee(t,e){try{return t=xt.getStr(t),xt.doStat(E.stat,t,e)}catch(r){return(typeof E=="undefined"||!(r instanceof E.ErrnoError))&&Cr(r),-r.errno}}function $Ee(t){try{return t=xt.getStr(t),E.unlink(t),0}catch(e){return(typeof E=="undefined"||!(e instanceof E.ErrnoError))&&Cr(e),-e.errno}}function eye(t,e,r){Ec.copyWithin(t,e,e+r)}function tye(t){try{return DI.grow(t-rS.byteLength+65535>>>16),wq(DI.buffer),1}catch(e){}}function rye(t){var e=Ec.length;t=t>>>0;var r=2147483648;if(t>r)return!1;for(var i=1;i<=4;i*=2){var n=e*(1+.2/i);n=Math.min(n,t+100663296);var s=Math.min(r,DEe(Math.max(t,n),65536)),o=tye(s);if(o)return!0}return!1}function iye(t){try{var e=xt.getStreamFromFD(t);return E.close(e),0}catch(r){return(typeof E=="undefined"||!(r instanceof E.ErrnoError))&&Cr(r),r.errno}}function nye(t,e){try{var r=xt.getStreamFromFD(t),i=r.tty?2:E.isDir(r.mode)?3:E.isLink(r.mode)?7:4;return di[e>>0]=i,0}catch(n){return(typeof E=="undefined"||!(n instanceof E.ErrnoError))&&Cr(n),n.errno}}function sye(t,e,r,i){try{var n=xt.getStreamFromFD(t),s=xt.doReadv(n,e,r);return je[i>>2]=s,0}catch(o){return(typeof E=="undefined"||!(o instanceof E.ErrnoError))&&Cr(o),o.errno}}function oye(t,e,r,i,n){try{var s=xt.getStreamFromFD(t),o=4294967296,a=r*o+(e>>>0),l=9007199254740992;return a<=-l||a>=l?-61:(E.llseek(s,a,i),ao=[s.position>>>0,(Rr=s.position,+Math.abs(Rr)>=1?Rr>0?(Math.min(+Math.floor(Rr/4294967296),4294967295)|0)>>>0:~~+Math.ceil((Rr-+(~~Rr>>>0))/4294967296)>>>0:0)],je[n>>2]=ao[0],je[n+4>>2]=ao[1],s.getdents&&a===0&&i===0&&(s.getdents=null),0)}catch(c){return(typeof E=="undefined"||!(c instanceof E.ErrnoError))&&Cr(c),c.errno}}function aye(t,e,r,i){try{var n=xt.getStreamFromFD(t),s=xt.doWritev(n,e,r);return je[i>>2]=s,0}catch(o){return(typeof E=="undefined"||!(o instanceof E.ErrnoError))&&Cr(o),o.errno}}function Aye(t){mEe(t)}function lye(t){var e=Date.now()/1e3|0;return t&&(je[t>>2]=e),e}function cS(){if(cS.called)return;cS.called=!0;var t=new Date().getFullYear(),e=new Date(t,0,1),r=new Date(t,6,1),i=e.getTimezoneOffset(),n=r.getTimezoneOffset(),s=Math.max(i,n);je[uye()>>2]=s*60,je[cye()>>2]=Number(i!=n);function o(g){var h=g.toTimeString().match(/\(([A-Za-z ]+)\)$/);return h?h[1]:"GMT"}var a=o(e),l=o(r),c=tS(a),u=tS(l);n>2]=c,je[vI()+4>>2]=u):(je[vI()>>2]=u,je[vI()+4>>2]=c)}function gye(t){cS();var e=Date.UTC(je[t+20>>2]+1900,je[t+16>>2],je[t+12>>2],je[t+8>>2],je[t+4>>2],je[t>>2],0),r=new Date(e);je[t+24>>2]=r.getUTCDay();var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return je[t+28>>2]=n,r.getTime()/1e3|0}var Pq=function(t,e,r,i){t||(t=this),this.parent=t,this.mount=t.mount,this.mounted=null,this.id=E.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=i},PI=292|73,FI=146;Object.defineProperties(Pq.prototype,{read:{get:function(){return(this.mode&PI)===PI},set:function(t){t?this.mode|=PI:this.mode&=~PI}},write:{get:function(){return(this.mode&FI)===FI},set:function(t){t?this.mode|=FI:this.mode&=~FI}},isFolder:{get:function(){return E.isDir(this.mode)}},isDevice:{get:function(){return E.isChrdev(this.mode)}}});E.FSNode=Pq;E.staticInit();xA&&(ct=Aq,lS=require("path"),Ze.staticInit());var ct,lS;if(xA){Fq=function(t){return function(){try{return t.apply(this,arguments)}catch(e){throw e.code?new E.ErrnoError(yc[e.code]):e}}},vA=Object.assign({},E);for(uS in vq)E[uS]=Fq(vq[uS])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");var Fq,vA,uS;function aS(t,e,r){var i=r>0?r:xI(t)+1,n=new Array(i),s=SI(t,n,0,n.length);return e&&(n.length=s),n}var hye=typeof atob=="function"?atob:function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r="",i,n,s,o,a,l,c,u=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(u++)),a=e.indexOf(t.charAt(u++)),l=e.indexOf(t.charAt(u++)),c=e.indexOf(t.charAt(u++)),i=o<<2|a>>4,n=(a&15)<<4|l>>2,s=(l&3)<<6|c,r=r+String.fromCharCode(i),l!==64&&(r=r+String.fromCharCode(n)),c!==64&&(r=r+String.fromCharCode(s));while(u0||(PEe(),kA>0))return;function e(){RI||(RI=!0,se.calledRun=!0,!dq&&(FEe(),se.onRuntimeInitialized&&se.onRuntimeInitialized(),NEe()))}se.setStatus?(se.setStatus("Running..."),setTimeout(function(){setTimeout(function(){se.setStatus("")},1),e()},1)):e()}se.run=gS;if(se.preInit)for(typeof se.preInit=="function"&&(se.preInit=[se.preInit]);se.preInit.length>0;)se.preInit.pop()();gS()});var Lq=C((LXe,Mq)=>{"use strict";function pye(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function PA(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,PA)}pye(PA,Error);PA.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,h=1;g>",ue=st(">>",!1),be=">&",nt=st(">&",!1),dt=">",wt=st(">",!1),kn="<<<",wi=st("<<<",!1),_t="<&",tn=st("<&",!1),_n="<",ng=st("<",!1),Yd=function(d){return{type:"argument",segments:[].concat(...d)}},Ns=function(d){return d},sg="'",qd=st("'",!1),iw=function(d){return[{type:"text",text:d}]},og='"',jd=st('"',!1),Jd=function(d){return d},Wd=function(d){return{type:"arithmetic",arithmetic:d,quoted:!0}},nw=function(d){return{type:"shell",shell:d,quoted:!0}},sw=function(d){return W(v({type:"variable"},d),{quoted:!0})},ag=function(d){return{type:"text",text:d}},ow=function(d){return{type:"arithmetic",arithmetic:d,quoted:!1}},aw=function(d){return{type:"shell",shell:d,quoted:!1}},zd=function(d){return W(v({type:"variable"},d),{quoted:!1})},Aw=function(d){return{type:"glob",pattern:d}},Mo="\\",Ms=st("\\",!1),re=/^[\\']/,Vd=Pn(["\\","'"],!1,!1),Ui=function(d){return d},Xd=/^[^']/,Zd=Pn(["'"],!0,!1),Ga=function(d){return d.join("")},_d=/^[\\$"]/,$d=Pn(["\\","$",'"'],!1,!1),Ag=/^[^$"]/,eC=Pn(["$",'"'],!0,!1),tC="\\0",lw=st("\\0",!1),cw=function(){return"\0"},rC="\\a",iC=st("\\a",!1),nC=function(){return"a"},sC="\\b",oC=st("\\b",!1),aC=function(){return"\b"},lg="\\e",uw=st("\\e",!1),gw=function(){return""},AC="\\f",hw=st("\\f",!1),fw=function(){return"\f"},O="\\n",ut=st("\\n",!1),Sl=function(){return` -`},Hi="\\r",cg=st("\\r",!1),He=function(){return"\r"},Ya="\\t",lC=st("\\t",!1),QN=function(){return" "},pw="\\v",bN=st("\\v",!1),zt=function(){return"\v"},vn="\\x",dw=st("\\x",!1),cC=function(d){return String.fromCharCode(parseInt(d,16))},Ls="\\u",uC=st("\\u",!1),Lo="\\U",Xe=st("\\U",!1),Cw=function(d){return String.fromCodePoint(parseInt(d,16))},gC=/^[0-9a-fA-f]/,hC=Pn([["0","9"],["a","f"],["A","f"]],!1,!1),To=uae(),qa="-",ja=st("-",!1),Ja="+",Ts=st("+",!1),Wa=".",mw=st(".",!1),fC=function(d,B,k){return{type:"number",value:(d==="-"?-1:1)*parseFloat(B.join("")+"."+k.join(""))}},pC=function(d,B){return{type:"number",value:(d==="-"?-1:1)*parseInt(B.join(""))}},Iw=function(d){return v({type:"variable"},d)},za=function(d){return{type:"variable",name:d}},Ew=function(d){return d},dC="*",ug=st("*",!1),xl="/",gg=st("/",!1),CC=function(d,B,k){return{type:B==="*"?"multiplication":"division",right:k}},Va=function(d,B){return B.reduce((k,R)=>v({left:k},R),d)},mC=function(d,B,k){return{type:B==="+"?"addition":"subtraction",right:k}},hg="$((",kl=st("$((",!1),sr="))",DN=st("))",!1),Os=function(d){return d},$n="$(",IC=st("$(",!1),vl=function(d){return d},S="${",K=st("${",!1),oe=":-",De=st(":-",!1),Be=function(d,B){return{name:d,defaultValue:B}},Ue=":-}",ot=st(":-}",!1),Ut=function(d){return{name:d,defaultValue:[]}},Ks=function(d){return{name:d}},rae="$",iae=st("$",!1),nae=function(d){return e.isGlobPattern(d)},sae=function(d){return d},SN=/^[a-zA-Z0-9_]/,xN=Pn([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),kN=function(){return cae()},vN=/^[$@*?#a-zA-Z0-9_\-]/,PN=Pn(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),oae=/^[(){}<>$|&; \t"']/,aae=Pn(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),Aae=/^[<>&; \t"']/,lae=Pn(["<",">","&",";"," "," ",'"',"'"],!1,!1),FN=/^[ \t]/,RN=Pn([" "," "],!1,!1),y=0,ve=0,EC=[{line:1,column:1}],es=0,yw=[],Ee=0,yC;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function cae(){return t.substring(ve,y)}function D4e(){return fg(ve,y)}function S4e(d,B){throw B=B!==void 0?B:fg(ve,y),MN([hae(d)],t.substring(ve,y),B)}function x4e(d,B){throw B=B!==void 0?B:fg(ve,y),fae(d,B)}function st(d,B){return{type:"literal",text:d,ignoreCase:B}}function Pn(d,B,k){return{type:"class",parts:d,inverted:B,ignoreCase:k}}function uae(){return{type:"any"}}function gae(){return{type:"end"}}function hae(d){return{type:"other",description:d}}function NN(d){var B=EC[d],k;if(B)return B;for(k=d-1;!EC[k];)k--;for(B=EC[k],B={line:B.line,column:B.column};kes&&(es=y,yw=[]),yw.push(d))}function fae(d,B){return new PA(d,null,null,B)}function MN(d,B,k){return new PA(PA.buildMessage(d,B),d,B,k)}function LN(){var d,B;return d=y,B=pg(),B===r&&(B=null),B!==r&&(ve=d,B=s(B)),d=B,d}function pg(){var d,B,k,R,V;if(d=y,B=Bw(),B!==r){for(k=[],R=ke();R!==r;)k.push(R),R=ke();k!==r?(R=TN(),R!==r?(V=pae(),V===r&&(V=null),V!==r?(ve=d,B=o(B,R,V),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r)}else y=d,d=r;if(d===r)if(d=y,B=Bw(),B!==r){for(k=[],R=ke();R!==r;)k.push(R),R=ke();k!==r?(R=TN(),R===r&&(R=null),R!==r?(ve=d,B=a(B,R),d=B):(y=d,d=r)):(y=d,d=r)}else y=d,d=r;return d}function pae(){var d,B,k,R,V;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r)if(k=pg(),k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();R!==r?(ve=d,B=l(k),d=B):(y=d,d=r)}else y=d,d=r;else y=d,d=r;return d}function TN(){var d;return t.charCodeAt(y)===59?(d=c,y++):(d=r,Ee===0&&Qe(u)),d===r&&(t.charCodeAt(y)===38?(d=g,y++):(d=r,Ee===0&&Qe(h))),d}function Bw(){var d,B,k;return d=y,B=ON(),B!==r?(k=dae(),k===r&&(k=null),k!==r?(ve=d,B=f(B,k),d=B):(y=d,d=r)):(y=d,d=r),d}function dae(){var d,B,k,R,V,de,rt;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r)if(k=Cae(),k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();if(R!==r)if(V=Bw(),V!==r){for(de=[],rt=ke();rt!==r;)de.push(rt),rt=ke();de!==r?(ve=d,B=p(k,V),d=B):(y=d,d=r)}else y=d,d=r;else y=d,d=r}else y=d,d=r;else y=d,d=r;return d}function Cae(){var d;return t.substr(y,2)===m?(d=m,y+=2):(d=r,Ee===0&&Qe(I)),d===r&&(t.substr(y,2)===Q?(d=Q,y+=2):(d=r,Ee===0&&Qe(w))),d}function ON(){var d,B,k;return d=y,B=Eae(),B!==r?(k=mae(),k===r&&(k=null),k!==r?(ve=d,B=x(B,k),d=B):(y=d,d=r)):(y=d,d=r),d}function mae(){var d,B,k,R,V,de,rt;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r)if(k=Iae(),k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();if(R!==r)if(V=ON(),V!==r){for(de=[],rt=ke();rt!==r;)de.push(rt),rt=ke();de!==r?(ve=d,B=N(k,V),d=B):(y=d,d=r)}else y=d,d=r;else y=d,d=r}else y=d,d=r;else y=d,d=r;return d}function Iae(){var d;return t.substr(y,2)===H?(d=H,y+=2):(d=r,Ee===0&&Qe(T)),d===r&&(t.charCodeAt(y)===124?(d=P,y++):(d=r,Ee===0&&Qe(G))),d}function BC(){var d,B,k,R,V,de;if(d=y,B=WN(),B!==r)if(t.charCodeAt(y)===61?(k=te,y++):(k=r,Ee===0&&Qe(j)),k!==r)if(R=UN(),R!==r){for(V=[],de=ke();de!==r;)V.push(de),de=ke();V!==r?(ve=d,B=A(B,R),d=B):(y=d,d=r)}else y=d,d=r;else y=d,d=r;else y=d,d=r;if(d===r)if(d=y,B=WN(),B!==r)if(t.charCodeAt(y)===61?(k=te,y++):(k=r,Ee===0&&Qe(j)),k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();R!==r?(ve=d,B=ee(B),d=B):(y=d,d=r)}else y=d,d=r;else y=d,d=r;return d}function Eae(){var d,B,k,R,V,de,rt,at,hr,xr,rn;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r)if(t.charCodeAt(y)===40?(k=$,y++):(k=r,Ee===0&&Qe(_)),k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();if(R!==r)if(V=pg(),V!==r){for(de=[],rt=ke();rt!==r;)de.push(rt),rt=ke();if(de!==r)if(t.charCodeAt(y)===41?(rt=U,y++):(rt=r,Ee===0&&Qe(F)),rt!==r){for(at=[],hr=ke();hr!==r;)at.push(hr),hr=ke();if(at!==r){for(hr=[],xr=dg();xr!==r;)hr.push(xr),xr=dg();if(hr!==r){for(xr=[],rn=ke();rn!==r;)xr.push(rn),rn=ke();xr!==r?(ve=d,B=Re(V,hr),d=B):(y=d,d=r)}else y=d,d=r}else y=d,d=r}else y=d,d=r;else y=d,d=r}else y=d,d=r;else y=d,d=r}else y=d,d=r;else y=d,d=r;if(d===r){for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r)if(t.charCodeAt(y)===123?(k=xe,y++):(k=r,Ee===0&&Qe(Ke)),k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();if(R!==r)if(V=pg(),V!==r){for(de=[],rt=ke();rt!==r;)de.push(rt),rt=ke();if(de!==r)if(t.charCodeAt(y)===125?(rt=Me,y++):(rt=r,Ee===0&&Qe(X)),rt!==r){for(at=[],hr=ke();hr!==r;)at.push(hr),hr=ke();if(at!==r){for(hr=[],xr=dg();xr!==r;)hr.push(xr),xr=dg();if(hr!==r){for(xr=[],rn=ke();rn!==r;)xr.push(rn),rn=ke();xr!==r?(ve=d,B=ie(V,hr),d=B):(y=d,d=r)}else y=d,d=r}else y=d,d=r}else y=d,d=r;else y=d,d=r}else y=d,d=r;else y=d,d=r}else y=d,d=r;else y=d,d=r;if(d===r){for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r){for(k=[],R=BC();R!==r;)k.push(R),R=BC();if(k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();if(R!==r){if(V=[],de=KN(),de!==r)for(;de!==r;)V.push(de),de=KN();else V=r;if(V!==r){for(de=[],rt=ke();rt!==r;)de.push(rt),rt=ke();de!==r?(ve=d,B=we(k,V),d=B):(y=d,d=r)}else y=d,d=r}else y=d,d=r}else y=d,d=r}else y=d,d=r;if(d===r){for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r){if(k=[],R=BC(),R!==r)for(;R!==r;)k.push(R),R=BC();else k=r;if(k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();R!==r?(ve=d,B=he(k),d=B):(y=d,d=r)}else y=d,d=r}else y=d,d=r}}}return d}function yae(){var d,B,k,R,V;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r){if(k=[],R=wC(),R!==r)for(;R!==r;)k.push(R),R=wC();else k=r;if(k!==r){for(R=[],V=ke();V!==r;)R.push(V),V=ke();R!==r?(ve=d,B=Ie(k),d=B):(y=d,d=r)}else y=d,d=r}else y=d,d=r;return d}function KN(){var d,B,k;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();if(B!==r?(k=dg(),k!==r?(ve=d,B=pe(k),d=B):(y=d,d=r)):(y=d,d=r),d===r){for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();B!==r?(k=wC(),k!==r?(ve=d,B=pe(k),d=B):(y=d,d=r)):(y=d,d=r)}return d}function dg(){var d,B,k,R,V;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();return B!==r?(Fe.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(Z)),k===r&&(k=null),k!==r?(R=Bae(),R!==r?(V=wC(),V!==r?(ve=d,B=z(k,R,V),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r)):(y=d,d=r),d}function Bae(){var d;return t.substr(y,2)===ae?(d=ae,y+=2):(d=r,Ee===0&&Qe(ue)),d===r&&(t.substr(y,2)===be?(d=be,y+=2):(d=r,Ee===0&&Qe(nt)),d===r&&(t.charCodeAt(y)===62?(d=dt,y++):(d=r,Ee===0&&Qe(wt)),d===r&&(t.substr(y,3)===kn?(d=kn,y+=3):(d=r,Ee===0&&Qe(wi)),d===r&&(t.substr(y,2)===_t?(d=_t,y+=2):(d=r,Ee===0&&Qe(tn)),d===r&&(t.charCodeAt(y)===60?(d=_n,y++):(d=r,Ee===0&&Qe(ng))))))),d}function wC(){var d,B,k;for(d=y,B=[],k=ke();k!==r;)B.push(k),k=ke();return B!==r?(k=UN(),k!==r?(ve=d,B=pe(k),d=B):(y=d,d=r)):(y=d,d=r),d}function UN(){var d,B,k;if(d=y,B=[],k=HN(),k!==r)for(;k!==r;)B.push(k),k=HN();else B=r;return B!==r&&(ve=d,B=Yd(B)),d=B,d}function HN(){var d,B;return d=y,B=wae(),B!==r&&(ve=d,B=Ns(B)),d=B,d===r&&(d=y,B=Qae(),B!==r&&(ve=d,B=Ns(B)),d=B,d===r&&(d=y,B=bae(),B!==r&&(ve=d,B=Ns(B)),d=B)),d}function wae(){var d,B,k,R;return d=y,t.charCodeAt(y)===39?(B=sg,y++):(B=r,Ee===0&&Qe(qd)),B!==r?(k=Dae(),k!==r?(t.charCodeAt(y)===39?(R=sg,y++):(R=r,Ee===0&&Qe(qd)),R!==r?(ve=d,B=iw(k),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r),d}function Qae(){var d,B,k,R;if(d=y,t.charCodeAt(y)===34?(B=og,y++):(B=r,Ee===0&&Qe(jd)),B!==r){for(k=[],R=GN();R!==r;)k.push(R),R=GN();k!==r?(t.charCodeAt(y)===34?(R=og,y++):(R=r,Ee===0&&Qe(jd)),R!==r?(ve=d,B=Jd(k),d=B):(y=d,d=r)):(y=d,d=r)}else y=d,d=r;return d}function bae(){var d,B,k;if(d=y,B=[],k=YN(),k!==r)for(;k!==r;)B.push(k),k=YN();else B=r;return B!==r&&(ve=d,B=Jd(B)),d=B,d}function GN(){var d,B;return d=y,B=jN(),B!==r&&(ve=d,B=Wd(B)),d=B,d===r&&(d=y,B=JN(),B!==r&&(ve=d,B=nw(B)),d=B,d===r&&(d=y,B=bw(),B!==r&&(ve=d,B=sw(B)),d=B,d===r&&(d=y,B=Sae(),B!==r&&(ve=d,B=ag(B)),d=B))),d}function YN(){var d,B;return d=y,B=jN(),B!==r&&(ve=d,B=ow(B)),d=B,d===r&&(d=y,B=JN(),B!==r&&(ve=d,B=aw(B)),d=B,d===r&&(d=y,B=bw(),B!==r&&(ve=d,B=zd(B)),d=B,d===r&&(d=y,B=kae(),B!==r&&(ve=d,B=Aw(B)),d=B,d===r&&(d=y,B=xae(),B!==r&&(ve=d,B=ag(B)),d=B)))),d}function Dae(){var d,B,k,R,V;for(d=y,B=[],k=QC(),k===r&&(k=bC(),k===r&&(k=y,t.charCodeAt(y)===92?(R=Mo,y++):(R=r,Ee===0&&Qe(Ms)),R!==r?(re.test(t.charAt(y))?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(Vd)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k===r&&(Xd.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(Zd)))));k!==r;)B.push(k),k=QC(),k===r&&(k=bC(),k===r&&(k=y,t.charCodeAt(y)===92?(R=Mo,y++):(R=r,Ee===0&&Qe(Ms)),R!==r?(re.test(t.charAt(y))?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(Vd)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k===r&&(Xd.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(Zd)))));return B!==r&&(ve=d,B=Ga(B)),d=B,d}function Sae(){var d,B,k,R,V;if(d=y,B=[],k=QC(),k===r&&(k=bC(),k===r&&(k=y,t.charCodeAt(y)===92?(R=Mo,y++):(R=r,Ee===0&&Qe(Ms)),R!==r?(_d.test(t.charAt(y))?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe($d)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k===r&&(Ag.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(eC))))),k!==r)for(;k!==r;)B.push(k),k=QC(),k===r&&(k=bC(),k===r&&(k=y,t.charCodeAt(y)===92?(R=Mo,y++):(R=r,Ee===0&&Qe(Ms)),R!==r?(_d.test(t.charAt(y))?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe($d)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k===r&&(Ag.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(eC)))));else B=r;return B!==r&&(ve=d,B=Ga(B)),d=B,d}function QC(){var d,B;return d=y,t.substr(y,2)===tC?(B=tC,y+=2):(B=r,Ee===0&&Qe(lw)),B!==r&&(ve=d,B=cw()),d=B,d===r&&(d=y,t.substr(y,2)===rC?(B=rC,y+=2):(B=r,Ee===0&&Qe(iC)),B!==r&&(ve=d,B=nC()),d=B,d===r&&(d=y,t.substr(y,2)===sC?(B=sC,y+=2):(B=r,Ee===0&&Qe(oC)),B!==r&&(ve=d,B=aC()),d=B,d===r&&(d=y,t.substr(y,2)===lg?(B=lg,y+=2):(B=r,Ee===0&&Qe(uw)),B!==r&&(ve=d,B=gw()),d=B,d===r&&(d=y,t.substr(y,2)===AC?(B=AC,y+=2):(B=r,Ee===0&&Qe(hw)),B!==r&&(ve=d,B=fw()),d=B,d===r&&(d=y,t.substr(y,2)===O?(B=O,y+=2):(B=r,Ee===0&&Qe(ut)),B!==r&&(ve=d,B=Sl()),d=B,d===r&&(d=y,t.substr(y,2)===Hi?(B=Hi,y+=2):(B=r,Ee===0&&Qe(cg)),B!==r&&(ve=d,B=He()),d=B,d===r&&(d=y,t.substr(y,2)===Ya?(B=Ya,y+=2):(B=r,Ee===0&&Qe(lC)),B!==r&&(ve=d,B=QN()),d=B,d===r&&(d=y,t.substr(y,2)===pw?(B=pw,y+=2):(B=r,Ee===0&&Qe(bN)),B!==r&&(ve=d,B=zt()),d=B)))))))),d}function bC(){var d,B,k,R,V,de,rt,at,hr,xr,rn,Dw;return d=y,t.substr(y,2)===vn?(B=vn,y+=2):(B=r,Ee===0&&Qe(dw)),B!==r?(k=y,R=y,V=Qi(),V!==r?(de=Qi(),de!==r?(V=[V,de],R=V):(y=R,R=r)):(y=R,R=r),R!==r?k=t.substring(k,y):k=R,k!==r?(ve=d,B=cC(k),d=B):(y=d,d=r)):(y=d,d=r),d===r&&(d=y,t.substr(y,2)===Ls?(B=Ls,y+=2):(B=r,Ee===0&&Qe(uC)),B!==r?(k=y,R=y,V=Qi(),V!==r?(de=Qi(),de!==r?(rt=Qi(),rt!==r?(at=Qi(),at!==r?(V=[V,de,rt,at],R=V):(y=R,R=r)):(y=R,R=r)):(y=R,R=r)):(y=R,R=r),R!==r?k=t.substring(k,y):k=R,k!==r?(ve=d,B=cC(k),d=B):(y=d,d=r)):(y=d,d=r),d===r&&(d=y,t.substr(y,2)===Lo?(B=Lo,y+=2):(B=r,Ee===0&&Qe(Xe)),B!==r?(k=y,R=y,V=Qi(),V!==r?(de=Qi(),de!==r?(rt=Qi(),rt!==r?(at=Qi(),at!==r?(hr=Qi(),hr!==r?(xr=Qi(),xr!==r?(rn=Qi(),rn!==r?(Dw=Qi(),Dw!==r?(V=[V,de,rt,at,hr,xr,rn,Dw],R=V):(y=R,R=r)):(y=R,R=r)):(y=R,R=r)):(y=R,R=r)):(y=R,R=r)):(y=R,R=r)):(y=R,R=r)):(y=R,R=r),R!==r?k=t.substring(k,y):k=R,k!==r?(ve=d,B=Cw(k),d=B):(y=d,d=r)):(y=d,d=r))),d}function Qi(){var d;return gC.test(t.charAt(y))?(d=t.charAt(y),y++):(d=r,Ee===0&&Qe(hC)),d}function xae(){var d,B,k,R,V;if(d=y,B=[],k=y,t.charCodeAt(y)===92?(R=Mo,y++):(R=r,Ee===0&&Qe(Ms)),R!==r?(t.length>y?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(To)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k===r&&(k=y,R=y,Ee++,V=zN(),Ee--,V===r?R=void 0:(y=R,R=r),R!==r?(t.length>y?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(To)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r)),k!==r)for(;k!==r;)B.push(k),k=y,t.charCodeAt(y)===92?(R=Mo,y++):(R=r,Ee===0&&Qe(Ms)),R!==r?(t.length>y?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(To)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k===r&&(k=y,R=y,Ee++,V=zN(),Ee--,V===r?R=void 0:(y=R,R=r),R!==r?(t.length>y?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(To)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r));else B=r;return B!==r&&(ve=d,B=Ga(B)),d=B,d}function ww(){var d,B,k,R,V,de;if(d=y,t.charCodeAt(y)===45?(B=qa,y++):(B=r,Ee===0&&Qe(ja)),B===r&&(t.charCodeAt(y)===43?(B=Ja,y++):(B=r,Ee===0&&Qe(Ts))),B===r&&(B=null),B!==r){if(k=[],Fe.test(t.charAt(y))?(R=t.charAt(y),y++):(R=r,Ee===0&&Qe(Z)),R!==r)for(;R!==r;)k.push(R),Fe.test(t.charAt(y))?(R=t.charAt(y),y++):(R=r,Ee===0&&Qe(Z));else k=r;if(k!==r)if(t.charCodeAt(y)===46?(R=Wa,y++):(R=r,Ee===0&&Qe(mw)),R!==r){if(V=[],Fe.test(t.charAt(y))?(de=t.charAt(y),y++):(de=r,Ee===0&&Qe(Z)),de!==r)for(;de!==r;)V.push(de),Fe.test(t.charAt(y))?(de=t.charAt(y),y++):(de=r,Ee===0&&Qe(Z));else V=r;V!==r?(ve=d,B=fC(B,k,V),d=B):(y=d,d=r)}else y=d,d=r;else y=d,d=r}else y=d,d=r;if(d===r){if(d=y,t.charCodeAt(y)===45?(B=qa,y++):(B=r,Ee===0&&Qe(ja)),B===r&&(t.charCodeAt(y)===43?(B=Ja,y++):(B=r,Ee===0&&Qe(Ts))),B===r&&(B=null),B!==r){if(k=[],Fe.test(t.charAt(y))?(R=t.charAt(y),y++):(R=r,Ee===0&&Qe(Z)),R!==r)for(;R!==r;)k.push(R),Fe.test(t.charAt(y))?(R=t.charAt(y),y++):(R=r,Ee===0&&Qe(Z));else k=r;k!==r?(ve=d,B=pC(B,k),d=B):(y=d,d=r)}else y=d,d=r;if(d===r&&(d=y,B=bw(),B!==r&&(ve=d,B=Iw(B)),d=B,d===r&&(d=y,B=Cg(),B!==r&&(ve=d,B=za(B)),d=B,d===r)))if(d=y,t.charCodeAt(y)===40?(B=$,y++):(B=r,Ee===0&&Qe(_)),B!==r){for(k=[],R=ke();R!==r;)k.push(R),R=ke();if(k!==r)if(R=qN(),R!==r){for(V=[],de=ke();de!==r;)V.push(de),de=ke();V!==r?(t.charCodeAt(y)===41?(de=U,y++):(de=r,Ee===0&&Qe(F)),de!==r?(ve=d,B=Ew(R),d=B):(y=d,d=r)):(y=d,d=r)}else y=d,d=r;else y=d,d=r}else y=d,d=r}return d}function Qw(){var d,B,k,R,V,de,rt,at;if(d=y,B=ww(),B!==r){for(k=[],R=y,V=[],de=ke();de!==r;)V.push(de),de=ke();if(V!==r)if(t.charCodeAt(y)===42?(de=dC,y++):(de=r,Ee===0&&Qe(ug)),de===r&&(t.charCodeAt(y)===47?(de=xl,y++):(de=r,Ee===0&&Qe(gg))),de!==r){for(rt=[],at=ke();at!==r;)rt.push(at),at=ke();rt!==r?(at=ww(),at!==r?(ve=R,V=CC(B,de,at),R=V):(y=R,R=r)):(y=R,R=r)}else y=R,R=r;else y=R,R=r;for(;R!==r;){for(k.push(R),R=y,V=[],de=ke();de!==r;)V.push(de),de=ke();if(V!==r)if(t.charCodeAt(y)===42?(de=dC,y++):(de=r,Ee===0&&Qe(ug)),de===r&&(t.charCodeAt(y)===47?(de=xl,y++):(de=r,Ee===0&&Qe(gg))),de!==r){for(rt=[],at=ke();at!==r;)rt.push(at),at=ke();rt!==r?(at=ww(),at!==r?(ve=R,V=CC(B,de,at),R=V):(y=R,R=r)):(y=R,R=r)}else y=R,R=r;else y=R,R=r}k!==r?(ve=d,B=Va(B,k),d=B):(y=d,d=r)}else y=d,d=r;return d}function qN(){var d,B,k,R,V,de,rt,at;if(d=y,B=Qw(),B!==r){for(k=[],R=y,V=[],de=ke();de!==r;)V.push(de),de=ke();if(V!==r)if(t.charCodeAt(y)===43?(de=Ja,y++):(de=r,Ee===0&&Qe(Ts)),de===r&&(t.charCodeAt(y)===45?(de=qa,y++):(de=r,Ee===0&&Qe(ja))),de!==r){for(rt=[],at=ke();at!==r;)rt.push(at),at=ke();rt!==r?(at=Qw(),at!==r?(ve=R,V=mC(B,de,at),R=V):(y=R,R=r)):(y=R,R=r)}else y=R,R=r;else y=R,R=r;for(;R!==r;){for(k.push(R),R=y,V=[],de=ke();de!==r;)V.push(de),de=ke();if(V!==r)if(t.charCodeAt(y)===43?(de=Ja,y++):(de=r,Ee===0&&Qe(Ts)),de===r&&(t.charCodeAt(y)===45?(de=qa,y++):(de=r,Ee===0&&Qe(ja))),de!==r){for(rt=[],at=ke();at!==r;)rt.push(at),at=ke();rt!==r?(at=Qw(),at!==r?(ve=R,V=mC(B,de,at),R=V):(y=R,R=r)):(y=R,R=r)}else y=R,R=r;else y=R,R=r}k!==r?(ve=d,B=Va(B,k),d=B):(y=d,d=r)}else y=d,d=r;return d}function jN(){var d,B,k,R,V,de;if(d=y,t.substr(y,3)===hg?(B=hg,y+=3):(B=r,Ee===0&&Qe(kl)),B!==r){for(k=[],R=ke();R!==r;)k.push(R),R=ke();if(k!==r)if(R=qN(),R!==r){for(V=[],de=ke();de!==r;)V.push(de),de=ke();V!==r?(t.substr(y,2)===sr?(de=sr,y+=2):(de=r,Ee===0&&Qe(DN)),de!==r?(ve=d,B=Os(R),d=B):(y=d,d=r)):(y=d,d=r)}else y=d,d=r;else y=d,d=r}else y=d,d=r;return d}function JN(){var d,B,k,R;return d=y,t.substr(y,2)===$n?(B=$n,y+=2):(B=r,Ee===0&&Qe(IC)),B!==r?(k=pg(),k!==r?(t.charCodeAt(y)===41?(R=U,y++):(R=r,Ee===0&&Qe(F)),R!==r?(ve=d,B=vl(k),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r),d}function bw(){var d,B,k,R,V,de;return d=y,t.substr(y,2)===S?(B=S,y+=2):(B=r,Ee===0&&Qe(K)),B!==r?(k=Cg(),k!==r?(t.substr(y,2)===oe?(R=oe,y+=2):(R=r,Ee===0&&Qe(De)),R!==r?(V=yae(),V!==r?(t.charCodeAt(y)===125?(de=Me,y++):(de=r,Ee===0&&Qe(X)),de!==r?(ve=d,B=Be(k,V),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r)):(y=d,d=r)):(y=d,d=r),d===r&&(d=y,t.substr(y,2)===S?(B=S,y+=2):(B=r,Ee===0&&Qe(K)),B!==r?(k=Cg(),k!==r?(t.substr(y,3)===Ue?(R=Ue,y+=3):(R=r,Ee===0&&Qe(ot)),R!==r?(ve=d,B=Ut(k),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r),d===r&&(d=y,t.substr(y,2)===S?(B=S,y+=2):(B=r,Ee===0&&Qe(K)),B!==r?(k=Cg(),k!==r?(t.charCodeAt(y)===125?(R=Me,y++):(R=r,Ee===0&&Qe(X)),R!==r?(ve=d,B=Ks(k),d=B):(y=d,d=r)):(y=d,d=r)):(y=d,d=r),d===r&&(d=y,t.charCodeAt(y)===36?(B=rae,y++):(B=r,Ee===0&&Qe(iae)),B!==r?(k=Cg(),k!==r?(ve=d,B=Ks(k),d=B):(y=d,d=r)):(y=d,d=r)))),d}function kae(){var d,B,k;return d=y,B=vae(),B!==r?(ve=y,k=nae(B),k?k=void 0:k=r,k!==r?(ve=d,B=sae(B),d=B):(y=d,d=r)):(y=d,d=r),d}function vae(){var d,B,k,R,V;if(d=y,B=[],k=y,R=y,Ee++,V=VN(),Ee--,V===r?R=void 0:(y=R,R=r),R!==r?(t.length>y?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(To)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r),k!==r)for(;k!==r;)B.push(k),k=y,R=y,Ee++,V=VN(),Ee--,V===r?R=void 0:(y=R,R=r),R!==r?(t.length>y?(V=t.charAt(y),y++):(V=r,Ee===0&&Qe(To)),V!==r?(ve=k,R=Ui(V),k=R):(y=k,k=r)):(y=k,k=r);else B=r;return B!==r&&(ve=d,B=Ga(B)),d=B,d}function WN(){var d,B,k;if(d=y,B=[],SN.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(xN)),k!==r)for(;k!==r;)B.push(k),SN.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(xN));else B=r;return B!==r&&(ve=d,B=kN()),d=B,d}function Cg(){var d,B,k;if(d=y,B=[],vN.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(PN)),k!==r)for(;k!==r;)B.push(k),vN.test(t.charAt(y))?(k=t.charAt(y),y++):(k=r,Ee===0&&Qe(PN));else B=r;return B!==r&&(ve=d,B=kN()),d=B,d}function zN(){var d;return oae.test(t.charAt(y))?(d=t.charAt(y),y++):(d=r,Ee===0&&Qe(aae)),d}function VN(){var d;return Aae.test(t.charAt(y))?(d=t.charAt(y),y++):(d=r,Ee===0&&Qe(lae)),d}function ke(){var d,B;if(d=[],FN.test(t.charAt(y))?(B=t.charAt(y),y++):(B=r,Ee===0&&Qe(RN)),B!==r)for(;B!==r;)d.push(B),FN.test(t.charAt(y))?(B=t.charAt(y),y++):(B=r,Ee===0&&Qe(RN));else d=r;return d}if(yC=n(),yC!==r&&y===t.length)return yC;throw yC!==r&&y{"use strict";function Cye(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function FA(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,FA)}Cye(FA,Error);FA.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,h=1;gH&&(H=w,T=[]),T.push(Z))}function X(Z,z){return new FA(Z,null,null,z)}function ie(Z,z,ae){return new FA(FA.buildMessage(Z,z),Z,z,ae)}function we(){var Z,z,ae,ue;return Z=w,z=he(),z!==r?(t.charCodeAt(w)===47?(ae=s,w++):(ae=r,P===0&&Me(o)),ae!==r?(ue=he(),ue!==r?(x=Z,z=a(z,ue),Z=z):(w=Z,Z=r)):(w=Z,Z=r)):(w=Z,Z=r),Z===r&&(Z=w,z=he(),z!==r&&(x=Z,z=l(z)),Z=z),Z}function he(){var Z,z,ae,ue;return Z=w,z=Ie(),z!==r?(t.charCodeAt(w)===64?(ae=c,w++):(ae=r,P===0&&Me(u)),ae!==r?(ue=Fe(),ue!==r?(x=Z,z=g(z,ue),Z=z):(w=Z,Z=r)):(w=Z,Z=r)):(w=Z,Z=r),Z===r&&(Z=w,z=Ie(),z!==r&&(x=Z,z=h(z)),Z=z),Z}function Ie(){var Z,z,ae,ue,be;return Z=w,t.charCodeAt(w)===64?(z=c,w++):(z=r,P===0&&Me(u)),z!==r?(ae=pe(),ae!==r?(t.charCodeAt(w)===47?(ue=s,w++):(ue=r,P===0&&Me(o)),ue!==r?(be=pe(),be!==r?(x=Z,z=f(),Z=z):(w=Z,Z=r)):(w=Z,Z=r)):(w=Z,Z=r)):(w=Z,Z=r),Z===r&&(Z=w,z=pe(),z!==r&&(x=Z,z=f()),Z=z),Z}function pe(){var Z,z,ae;if(Z=w,z=[],p.test(t.charAt(w))?(ae=t.charAt(w),w++):(ae=r,P===0&&Me(m)),ae!==r)for(;ae!==r;)z.push(ae),p.test(t.charAt(w))?(ae=t.charAt(w),w++):(ae=r,P===0&&Me(m));else z=r;return z!==r&&(x=Z,z=f()),Z=z,Z}function Fe(){var Z,z,ae;if(Z=w,z=[],I.test(t.charAt(w))?(ae=t.charAt(w),w++):(ae=r,P===0&&Me(Q)),ae!==r)for(;ae!==r;)z.push(ae),I.test(t.charAt(w))?(ae=t.charAt(w),w++):(ae=r,P===0&&Me(Q));else z=r;return z!==r&&(x=Z,z=f()),Z=z,Z}if(G=n(),G!==r&&w===t.length)return G;throw G!==r&&w{"use strict";function Hq(t){return typeof t=="undefined"||t===null}function Iye(t){return typeof t=="object"&&t!==null}function Eye(t){return Array.isArray(t)?t:Hq(t)?[]:[t]}function yye(t,e){var r,i,n,s;if(e)for(s=Object.keys(e),r=0,i=s.length;r{"use strict";function Yh(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Yh.prototype=Object.create(Error.prototype);Yh.prototype.constructor=Yh;Yh.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};Gq.exports=Yh});var jq=C((eZe,Yq)=>{"use strict";var qq=NA();function IS(t,e,r,i,n){this.name=t,this.buffer=e,this.position=r,this.line=i,this.column=n}IS.prototype.getSnippet=function(e,r){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,r=r||75,i="",n=this.position;n>0&&`\0\r -\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>r/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;or/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),qq.repeat(" ",e)+i+a+s+` -`+qq.repeat(" ",e+this.position-n+i.length)+"^"};IS.prototype.toString=function(e){var r,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(i+=`: -`+r)),i};Yq.exports=IS});var wr=C((tZe,Jq)=>{"use strict";var Wq=bc(),Qye=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],bye=["scalar","sequence","mapping"];function Dye(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(i){e[String(i)]=r})}),e}function Sye(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(Qye.indexOf(r)===-1)throw new Wq('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=Dye(e.styleAliases||null),bye.indexOf(this.kind)===-1)throw new Wq('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}Jq.exports=Sye});var MA=C((rZe,zq)=>{"use strict";var Vq=NA(),UI=bc(),xye=wr();function ES(t,e,r){var i=[];return t.include.forEach(function(n){r=ES(n,e,r)}),t[e].forEach(function(n){r.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),r.push(n)}),r.filter(function(n,s){return i.indexOf(s)===-1})}function kye(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function i(n){t[n.kind][n.tag]=t.fallback[n.tag]=n}for(e=0,r=arguments.length;e{"use strict";var vye=wr();Xq.exports=new vye("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var $q=C((nZe,_q)=>{"use strict";var Pye=wr();_q.exports=new Pye("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var tj=C((sZe,ej)=>{"use strict";var Fye=wr();ej.exports=new Fye("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var HI=C((oZe,rj)=>{"use strict";var Rye=MA();rj.exports=new Rye({explicit:[Zq(),$q(),tj()]})});var nj=C((aZe,ij)=>{"use strict";var Nye=wr();function Mye(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function Lye(){return null}function Tye(t){return t===null}ij.exports=new Nye("tag:yaml.org,2002:null",{kind:"scalar",resolve:Mye,construct:Lye,predicate:Tye,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var oj=C((AZe,sj)=>{"use strict";var Oye=wr();function Kye(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function Uye(t){return t==="true"||t==="True"||t==="TRUE"}function Hye(t){return Object.prototype.toString.call(t)==="[object Boolean]"}sj.exports=new Oye("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Kye,construct:Uye,predicate:Hye,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var Aj=C((lZe,aj)=>{"use strict";var Gye=NA(),Yye=wr();function qye(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function jye(t){return 48<=t&&t<=55}function Jye(t){return 48<=t&&t<=57}function Wye(t){if(t===null)return!1;var e=t.length,r=0,i=!1,n;if(!e)return!1;if(n=t[r],(n==="-"||n==="+")&&(n=t[++r]),n==="0"){if(r+1===e)return!0;if(n=t[++r],n==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var uj=C((cZe,lj)=>{"use strict";var cj=NA(),Xye=wr(),Zye=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function _ye(t){return!(t===null||!Zye.test(t)||t[t.length-1]==="_")}function $ye(t){var e,r,i,n;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),r*e):r*parseFloat(e,10)}var eBe=/^[-+]?[0-9]+e/;function tBe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(cj.isNegativeZero(t))return"-0.0";return r=t.toString(10),eBe.test(r)?r.replace("e",".e"):r}function rBe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!=0||cj.isNegativeZero(t))}lj.exports=new Xye("tag:yaml.org,2002:float",{kind:"scalar",resolve:_ye,construct:$ye,predicate:rBe,represent:tBe,defaultStyle:"lowercase"})});var yS=C((uZe,gj)=>{"use strict";var iBe=MA();gj.exports=new iBe({include:[HI()],implicit:[nj(),oj(),Aj(),uj()]})});var BS=C((gZe,hj)=>{"use strict";var nBe=MA();hj.exports=new nBe({include:[yS()]})});var Cj=C((hZe,fj)=>{"use strict";var sBe=wr(),pj=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),dj=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function oBe(t){return t===null?!1:pj.exec(t)!==null||dj.exec(t)!==null}function aBe(t){var e,r,i,n,s,o,a,l=0,c=null,u,g,h;if(e=pj.exec(t),e===null&&(e=dj.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(r,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),h=new Date(Date.UTC(r,i,n,s,o,a,l)),c&&h.setTime(h.getTime()-c),h}function ABe(t){return t.toISOString()}fj.exports=new sBe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:oBe,construct:aBe,instanceOf:Date,represent:ABe})});var Ij=C((fZe,mj)=>{"use strict";var lBe=wr();function cBe(t){return t==="<<"||t===null}mj.exports=new lBe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:cBe})});var Bj=C((pZe,Ej)=>{"use strict";var LA;try{yj=require,LA=yj("buffer").Buffer}catch(t){}var yj,uBe=wr(),wS=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= -\r`;function gBe(t){if(t===null)return!1;var e,r,i=0,n=t.length,s=wS;for(r=0;r64)){if(e<0)return!1;i+=6}return i%8==0}function hBe(t){var e,r,i=t.replace(/[\r\n=]/g,""),n=i.length,s=wS,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return r=n%4*6,r===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):r===18?(a.push(o>>10&255),a.push(o>>2&255)):r===12&&a.push(o>>4&255),LA?LA.from?LA.from(a):new LA(a):a}function fBe(t){var e="",r=0,i,n,s=t.length,o=wS;for(i=0;i>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]),r=(r<<8)+t[i];return n=s%3,n===0?(e+=o[r>>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]):n===2?(e+=o[r>>10&63],e+=o[r>>4&63],e+=o[r<<2&63],e+=o[64]):n===1&&(e+=o[r>>2&63],e+=o[r<<4&63],e+=o[64],e+=o[64]),e}function pBe(t){return LA&&LA.isBuffer(t)}Ej.exports=new uBe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:gBe,construct:hBe,predicate:pBe,represent:fBe})});var Qj=C((dZe,wj)=>{"use strict";var dBe=wr(),CBe=Object.prototype.hasOwnProperty,mBe=Object.prototype.toString;function IBe(t){if(t===null)return!0;var e=[],r,i,n,s,o,a=t;for(r=0,i=a.length;r{"use strict";var yBe=wr(),BBe=Object.prototype.toString;function wBe(t){if(t===null)return!0;var e,r,i,n,s,o=t;for(s=new Array(o.length),e=0,r=o.length;e{"use strict";var bBe=wr(),DBe=Object.prototype.hasOwnProperty;function SBe(t){if(t===null)return!0;var e,r=t;for(e in r)if(DBe.call(r,e)&&r[e]!==null)return!1;return!0}function xBe(t){return t!==null?t:{}}Sj.exports=new bBe("tag:yaml.org,2002:set",{kind:"mapping",resolve:SBe,construct:xBe})});var Sc=C((IZe,kj)=>{"use strict";var kBe=MA();kj.exports=new kBe({include:[BS()],implicit:[Cj(),Ij()],explicit:[Bj(),Qj(),Dj(),xj()]})});var Pj=C((EZe,vj)=>{"use strict";var vBe=wr();function PBe(){return!0}function FBe(){}function RBe(){return""}function NBe(t){return typeof t=="undefined"}vj.exports=new vBe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:PBe,construct:FBe,predicate:NBe,represent:RBe})});var Rj=C((yZe,Fj)=>{"use strict";var MBe=wr();function LBe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),i="";return!(e[0]==="/"&&(r&&(i=r[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function TBe(t){var e=t,r=/\/([gim]*)$/.exec(t),i="";return e[0]==="/"&&(r&&(i=r[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function OBe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function KBe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}Fj.exports=new MBe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:LBe,construct:TBe,predicate:KBe,represent:OBe})});var Lj=C((BZe,Nj)=>{"use strict";var GI;try{Mj=require,GI=Mj("esprima")}catch(t){typeof window!="undefined"&&(GI=window.esprima)}var Mj,UBe=wr();function HBe(t){if(t===null)return!1;try{var e="("+t+")",r=GI.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function GBe(t){var e="("+t+")",r=GI.parse(e,{range:!0}),i=[],n;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function YBe(t){return t.toString()}function qBe(t){return Object.prototype.toString.call(t)==="[object Function]"}Nj.exports=new UBe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:HBe,construct:GBe,predicate:qBe,represent:YBe})});var qh=C((wZe,Tj)=>{"use strict";var Oj=MA();Tj.exports=Oj.DEFAULT=new Oj({include:[Sc()],explicit:[Pj(),Rj(),Lj()]})});var iJ=C((QZe,jh)=>{"use strict";var lo=NA(),Kj=bc(),jBe=jq(),Uj=Sc(),JBe=qh(),aa=Object.prototype.hasOwnProperty,YI=1,Hj=2,Gj=3,qI=4,QS=1,WBe=2,Yj=3,zBe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,VBe=/[\x85\u2028\u2029]/,XBe=/[,\[\]\{\}]/,qj=/^(?:!|!!|![a-z\-]+!)$/i,jj=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Jj(t){return Object.prototype.toString.call(t)}function gs(t){return t===10||t===13}function TA(t){return t===9||t===32}function Fi(t){return t===9||t===32||t===10||t===13}function xc(t){return t===44||t===91||t===93||t===123||t===125}function ZBe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function _Be(t){return t===120?2:t===117?4:t===85?8:0}function $Be(t){return 48<=t&&t<=57?t-48:-1}function Wj(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` -`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function ewe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var zj=new Array(256),Vj=new Array(256);for(var kc=0;kc<256;kc++)zj[kc]=Wj(kc)?1:0,Vj[kc]=Wj(kc);function twe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||JBe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function Xj(t,e){return new Kj(e,new jBe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function tt(t,e){throw Xj(t,e)}function jI(t,e){t.onWarning&&t.onWarning.call(null,Xj(t,e))}var Zj={YAML:function(e,r,i){var n,s,o;e.version!==null&&tt(e,"duplication of %YAML directive"),i.length!==1&&tt(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&tt(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&tt(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&jI(e,"unsupported YAML version of the document")},TAG:function(e,r,i){var n,s;i.length!==2&&tt(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],qj.test(n)||tt(e,"ill-formed tag handle (first argument) of the TAG directive"),aa.call(e.tagMap,n)&&tt(e,'there is a previously declared suffix for "'+n+'" tag handle'),jj.test(s)||tt(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function Aa(t,e,r,i){var n,s,o,a;if(e1&&(t.result+=lo.repeat(` -`,e-1))}function rwe(t,e,r){var i,n,s,o,a,l,c,u,g=t.kind,h=t.result,f;if(f=t.input.charCodeAt(t.position),Fi(f)||xc(f)||f===35||f===38||f===42||f===33||f===124||f===62||f===39||f===34||f===37||f===64||f===96||(f===63||f===45)&&(n=t.input.charCodeAt(t.position+1),Fi(n)||r&&xc(n)))return!1;for(t.kind="scalar",t.result="",s=o=t.position,a=!1;f!==0;){if(f===58){if(n=t.input.charCodeAt(t.position+1),Fi(n)||r&&xc(n))break}else if(f===35){if(i=t.input.charCodeAt(t.position-1),Fi(i))break}else{if(t.position===t.lineStart&&JI(t)||r&&xc(f))break;if(gs(f))if(l=t.line,c=t.lineStart,u=t.lineIndent,mr(t,!1,-1),t.lineIndent>=e){a=!0,f=t.input.charCodeAt(t.position);continue}else{t.position=o,t.line=l,t.lineStart=c,t.lineIndent=u;break}}a&&(Aa(t,s,o,!1),DS(t,t.line-l),s=o=t.position,a=!1),TA(f)||(o=t.position+1),f=t.input.charCodeAt(++t.position)}return Aa(t,s,o,!1),t.result?!0:(t.kind=g,t.result=h,!1)}function iwe(t,e){var r,i,n;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,i=n=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(Aa(t,i,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)i=t.position,t.position++,n=t.position;else return!0;else gs(r)?(Aa(t,i,n,!0),DS(t,mr(t,!1,e)),i=n=t.position):t.position===t.lineStart&&JI(t)?tt(t,"unexpected end of the document within a single quoted scalar"):(t.position++,n=t.position);tt(t,"unexpected end of the stream within a single quoted scalar")}function nwe(t,e){var r,i,n,s,o,a;if(a=t.input.charCodeAt(t.position),a!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=i=t.position;(a=t.input.charCodeAt(t.position))!==0;){if(a===34)return Aa(t,r,t.position,!0),t.position++,!0;if(a===92){if(Aa(t,r,t.position,!0),a=t.input.charCodeAt(++t.position),gs(a))mr(t,!1,e);else if(a<256&&zj[a])t.result+=Vj[a],t.position++;else if((o=_Be(a))>0){for(n=o,s=0;n>0;n--)a=t.input.charCodeAt(++t.position),(o=ZBe(a))>=0?s=(s<<4)+o:tt(t,"expected hexadecimal character");t.result+=ewe(s),t.position++}else tt(t,"unknown escape sequence");r=i=t.position}else gs(a)?(Aa(t,r,i,!0),DS(t,mr(t,!1,e)),r=i=t.position):t.position===t.lineStart&&JI(t)?tt(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}tt(t,"unexpected end of the stream within a double quoted scalar")}function swe(t,e){var r=!0,i,n=t.tag,s,o=t.anchor,a,l,c,u,g,h={},f,p,m,I;if(I=t.input.charCodeAt(t.position),I===91)l=93,g=!1,s=[];else if(I===123)l=125,g=!0,s={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=s),I=t.input.charCodeAt(++t.position);I!==0;){if(mr(t,!0,e),I=t.input.charCodeAt(t.position),I===l)return t.position++,t.tag=n,t.anchor=o,t.kind=g?"mapping":"sequence",t.result=s,!0;r||tt(t,"missed comma between flow collection entries"),p=f=m=null,c=u=!1,I===63&&(a=t.input.charCodeAt(t.position+1),Fi(a)&&(c=u=!0,t.position++,mr(t,!0,e))),i=t.line,Pc(t,e,YI,!1,!0),p=t.tag,f=t.result,mr(t,!0,e),I=t.input.charCodeAt(t.position),(u||t.line===i)&&I===58&&(c=!0,I=t.input.charCodeAt(++t.position),mr(t,!0,e),Pc(t,e,YI,!1,!0),m=t.result),g?vc(t,s,h,p,f,m):c?s.push(vc(t,null,h,p,f,m)):s.push(f),mr(t,!0,e),I=t.input.charCodeAt(t.position),I===44?(r=!0,I=t.input.charCodeAt(++t.position)):r=!1}tt(t,"unexpected end of the stream within a flow collection")}function owe(t,e){var r,i,n=QS,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=t.input.charCodeAt(t.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(t.kind="scalar",t.result="";g!==0;)if(g=t.input.charCodeAt(++t.position),g===43||g===45)QS===n?n=g===43?Yj:WBe:tt(t,"repeat of a chomping mode identifier");else if((u=$Be(g))>=0)u===0?tt(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?tt(t,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(TA(g)){do g=t.input.charCodeAt(++t.position);while(TA(g));if(g===35)do g=t.input.charCodeAt(++t.position);while(!gs(g)&&g!==0)}for(;g!==0;){for(bS(t),t.lineIndent=0,g=t.input.charCodeAt(t.position);(!o||t.lineIndenta&&(a=t.lineIndent),gs(g)){l++;continue}if(t.lineIndente)&&l!==0)tt(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(Pc(t,e,qI,!0,n)&&(p?h=t.result:f=t.result),p||(vc(t,c,u,g,h,f,s,o),g=h=f=null),mr(t,!0,-1),I=t.input.charCodeAt(t.position)),t.lineIndent>e&&I!==0)tt(t,"bad indentation of a mapping entry");else if(t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),g=0,h=t.implicitTypes.length;g tag; it should be "'+f.kind+'", not "'+t.kind+'"'),f.resolve(t.result)?(t.result=f.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):tt(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):tt(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||u}function uwe(t){var e=t.position,r,i,n,s=!1,o;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(o=t.input.charCodeAt(t.position))!==0&&(mr(t,!0,-1),o=t.input.charCodeAt(t.position),!(t.lineIndent>0||o!==37));){for(s=!0,o=t.input.charCodeAt(++t.position),r=t.position;o!==0&&!Fi(o);)o=t.input.charCodeAt(++t.position);for(i=t.input.slice(r,t.position),n=[],i.length<1&&tt(t,"directive name must not be less than one character in length");o!==0;){for(;TA(o);)o=t.input.charCodeAt(++t.position);if(o===35){do o=t.input.charCodeAt(++t.position);while(o!==0&&!gs(o));break}if(gs(o))break;for(r=t.position;o!==0&&!Fi(o);)o=t.input.charCodeAt(++t.position);n.push(t.input.slice(r,t.position))}o!==0&&bS(t),aa.call(Zj,i)?Zj[i](t,i,n):jI(t,'unknown document directive "'+i+'"')}if(mr(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,mr(t,!0,-1)):s&&tt(t,"directives end mark is expected"),Pc(t,t.lineIndent-1,qI,!1,!0),mr(t,!0,-1),t.checkLineBreaks&&VBe.test(t.input.slice(e,t.position))&&jI(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&JI(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,mr(t,!0,-1));return}if(t.position{"use strict";var Jh=NA(),Wh=bc(),fwe=qh(),pwe=Sc(),nJ=Object.prototype.toString,sJ=Object.prototype.hasOwnProperty,dwe=9,zh=10,Cwe=13,mwe=32,Iwe=33,Ewe=34,oJ=35,ywe=37,Bwe=38,wwe=39,Qwe=42,aJ=44,bwe=45,AJ=58,Dwe=61,Swe=62,xwe=63,kwe=64,lJ=91,cJ=93,vwe=96,uJ=123,Pwe=124,gJ=125,$r={};$r[0]="\\0";$r[7]="\\a";$r[8]="\\b";$r[9]="\\t";$r[10]="\\n";$r[11]="\\v";$r[12]="\\f";$r[13]="\\r";$r[27]="\\e";$r[34]='\\"';$r[92]="\\\\";$r[133]="\\N";$r[160]="\\_";$r[8232]="\\L";$r[8233]="\\P";var Fwe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function Rwe(t,e){var r,i,n,s,o,a,l;if(e===null)return{};for(r={},i=Object.keys(e),n=0,s=i.length;n0?t.charCodeAt(s-1):null,h=h&&pJ(o,a)}else{for(s=0;si&&t[g+1]!==" ",g=s);else if(!Fc(o))return WI;a=s>0?t.charCodeAt(s-1):null,h=h&&pJ(o,a)}c=c||u&&s-g-1>i&&t[g+1]!==" "}return!l&&!c?h&&!n(t)?CJ:mJ:r>9&&dJ(t)?WI:c?EJ:IJ}function Hwe(t,e,r,i){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&Fwe.indexOf(e)!==-1)return"'"+e+"'";var n=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-n),o=i||t.flowLevel>-1&&r>=t.flowLevel;function a(l){return Mwe(t,l)}switch(Owe(e,o,t.indent,s,a)){case CJ:return e;case mJ:return"'"+e.replace(/'/g,"''")+"'";case IJ:return"|"+yJ(e,t.indent)+BJ(fJ(e,n));case EJ:return">"+yJ(e,t.indent)+BJ(fJ(Kwe(e,s),n));case WI:return'"'+Uwe(e,s)+'"';default:throw new Wh("impossible error: invalid scalar style")}}()}function yJ(t,e){var r=dJ(t)?String(e):"",i=t[t.length-1]===` -`,n=i&&(t[t.length-2]===` -`||t===` -`),s=n?"+":i?"":"-";return r+s+` -`}function BJ(t){return t[t.length-1]===` -`?t.slice(0,-1):t}function Kwe(t,e){for(var r=/(\n+)([^\n]*)/g,i=function(){var c=t.indexOf(` -`);return c=c!==-1?c:t.length,r.lastIndex=c,wJ(t.slice(0,c),e)}(),n=t[0]===` -`||t[0]===" ",s,o;o=r.exec(t);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` -`:"")+wJ(l,e),n=s}return i}function wJ(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=r.exec(t);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` -`+t.slice(n,s),n=s+1),o=a;return l+=` -`,t.length-n>e&&o>n?l+=t.slice(n,o)+` -`+t.slice(o+1):l+=t.slice(n),l.slice(1)}function Uwe(t){for(var e="",r,i,n,s=0;s=55296&&r<=56319&&(i=t.charCodeAt(s+1),i>=56320&&i<=57343)){e+=hJ((r-55296)*1024+i-56320+65536),s++;continue}n=$r[r],e+=!n&&Fc(r)?t[s]:n||hJ(r)}return e}function Gwe(t,e,r){var i="",n=t.tag,s,o;for(s=0,o=r.length;s1024&&(u+="? "),u+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),!!OA(t,e,c,!1,!1)&&(u+=t.dump,i+=u));t.tag=n,t.dump="{"+i+"}"}function jwe(t,e,r,i){var n="",s=t.tag,o=Object.keys(r),a,l,c,u,g,h;if(t.sortKeys===!0)o.sort();else if(typeof t.sortKeys=="function")o.sort(t.sortKeys);else if(t.sortKeys)throw new Wh("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(t.dump&&zh===t.dump.charCodeAt(0)?h+="?":h+="? "),h+=t.dump,g&&(h+=xS(t,e)),!!OA(t,e+1,u,!0,g)&&(t.dump&&zh===t.dump.charCodeAt(0)?h+=":":h+=": ",h+=t.dump,n+=h));t.tag=s,t.dump=n||"{}"}function QJ(t,e,r){var i,n,s,o,a,l;for(n=r?t.explicitTypes:t.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');t.dump=i}return!0}return!1}function OA(t,e,r,i,n,s){t.tag=null,t.dump=r,QJ(t,r,!1)||QJ(t,r,!0);var o=nJ.call(t.dump);i&&(i=t.flowLevel<0||t.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=t.duplicates.indexOf(r),c=l!==-1),(t.tag!==null&&t.tag!=="?"||c||t.indent!==2&&e>0)&&(n=!1),c&&t.usedDuplicates[l])t.dump="*ref_"+l;else{if(a&&c&&!t.usedDuplicates[l]&&(t.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(t.dump).length!==0?(jwe(t,e,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(qwe(t,e,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump));else if(o==="[object Array]"){var u=t.noArrayIndent&&e>0?e-1:e;i&&t.dump.length!==0?(Ywe(t,u,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(Gwe(t,u,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump))}else if(o==="[object String]")t.tag!=="?"&&Hwe(t,t.dump,e,s);else{if(t.skipInvalid)return!1;throw new Wh("unacceptable kind of an object to dump "+o)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function Jwe(t,e){var r=[],i=[],n,s;for(vS(t,r,i),n=0,s=i.length;n{"use strict";var zI=iJ(),SJ=DJ();function VI(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}tr.exports.Type=wr();tr.exports.Schema=MA();tr.exports.FAILSAFE_SCHEMA=HI();tr.exports.JSON_SCHEMA=yS();tr.exports.CORE_SCHEMA=BS();tr.exports.DEFAULT_SAFE_SCHEMA=Sc();tr.exports.DEFAULT_FULL_SCHEMA=qh();tr.exports.load=zI.load;tr.exports.loadAll=zI.loadAll;tr.exports.safeLoad=zI.safeLoad;tr.exports.safeLoadAll=zI.safeLoadAll;tr.exports.dump=SJ.dump;tr.exports.safeDump=SJ.safeDump;tr.exports.YAMLException=bc();tr.exports.MINIMAL_SCHEMA=HI();tr.exports.SAFE_SCHEMA=Sc();tr.exports.DEFAULT_SCHEMA=qh();tr.exports.scan=VI("scan");tr.exports.parse=VI("parse");tr.exports.compose=VI("compose");tr.exports.addConstructor=VI("addConstructor")});var vJ=C((SZe,kJ)=>{"use strict";var zwe=xJ();kJ.exports=zwe});var FJ=C((xZe,PJ)=>{"use strict";function Vwe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function KA(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,KA)}Vwe(KA,Error);KA.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,h=1;g({[De]:oe})))},H=function(S){return S},T=function(S){return S},P=Ls("correct indentation"),G=" ",te=zt(" ",!1),j=function(S){return S.length===vl*IC},A=function(S){return S.length===(vl+1)*IC},ee=function(){return vl++,!0},$=function(){return vl--,!0},_=function(){return lC()},U=Ls("pseudostring"),F=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,Re=vn(["\r",` -`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),xe=/^[^\r\n\t ,\][{}:#"']/,Ke=vn(["\r",` -`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Me=function(){return lC().replace(/^ *| *$/g,"")},X="--",ie=zt("--",!1),we=/^[a-zA-Z\/0-9]/,he=vn([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),Ie=/^[^\r\n\t :,]/,pe=vn(["\r",` -`," "," ",":",","],!0,!1),Fe="null",Z=zt("null",!1),z=function(){return null},ae="true",ue=zt("true",!1),be=function(){return!0},nt="false",dt=zt("false",!1),wt=function(){return!1},kn=Ls("string"),wi='"',_t=zt('"',!1),tn=function(){return""},_n=function(S){return S},ng=function(S){return S.join("")},Yd=/^[^"\\\0-\x1F\x7F]/,Ns=vn(['"',"\\",["\0",""],"\x7F"],!0,!1),sg='\\"',qd=zt('\\"',!1),iw=function(){return'"'},og="\\\\",jd=zt("\\\\",!1),Jd=function(){return"\\"},Wd="\\/",nw=zt("\\/",!1),sw=function(){return"/"},ag="\\b",ow=zt("\\b",!1),aw=function(){return"\b"},zd="\\f",Aw=zt("\\f",!1),Mo=function(){return"\f"},Ms="\\n",re=zt("\\n",!1),Vd=function(){return` -`},Ui="\\r",Xd=zt("\\r",!1),Zd=function(){return"\r"},Ga="\\t",_d=zt("\\t",!1),$d=function(){return" "},Ag="\\u",eC=zt("\\u",!1),tC=function(S,K,oe,De){return String.fromCharCode(parseInt(`0x${S}${K}${oe}${De}`))},lw=/^[0-9a-fA-F]/,cw=vn([["0","9"],["a","f"],["A","F"]],!1,!1),rC=Ls("blank space"),iC=/^[ \t]/,nC=vn([" "," "],!1,!1),sC=Ls("white space"),oC=/^[ \t\n\r]/,aC=vn([" "," ",` -`,"\r"],!1,!1),lg=`\r -`,uw=zt(`\r -`,!1),gw=` -`,AC=zt(` -`,!1),hw="\r",fw=zt("\r",!1),O=0,ut=0,Sl=[{line:1,column:1}],Hi=0,cg=[],He=0,Ya;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function lC(){return t.substring(ut,O)}function QN(){return Lo(ut,O)}function pw(S,K){throw K=K!==void 0?K:Lo(ut,O),gC([Ls(S)],t.substring(ut,O),K)}function bN(S,K){throw K=K!==void 0?K:Lo(ut,O),Cw(S,K)}function zt(S,K){return{type:"literal",text:S,ignoreCase:K}}function vn(S,K,oe){return{type:"class",parts:S,inverted:K,ignoreCase:oe}}function dw(){return{type:"any"}}function cC(){return{type:"end"}}function Ls(S){return{type:"other",description:S}}function uC(S){var K=Sl[S],oe;if(K)return K;for(oe=S-1;!Sl[oe];)oe--;for(K=Sl[oe],K={line:K.line,column:K.column};oeHi&&(Hi=O,cg=[]),cg.push(S))}function Cw(S,K){return new KA(S,null,null,K)}function gC(S,K,oe){return new KA(KA.buildMessage(S,K),S,K,oe)}function hC(){var S;return S=ja(),S}function To(){var S,K,oe;for(S=O,K=[],oe=qa();oe!==r;)K.push(oe),oe=qa();return K!==r&&(ut=S,K=s(K)),S=K,S}function qa(){var S,K,oe,De,Be;return S=O,K=Wa(),K!==r?(t.charCodeAt(O)===45?(oe=o,O++):(oe=r,He===0&&Xe(a)),oe!==r?(De=sr(),De!==r?(Be=Ts(),Be!==r?(ut=S,K=l(Be),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r),S}function ja(){var S,K,oe;for(S=O,K=[],oe=Ja();oe!==r;)K.push(oe),oe=Ja();return K!==r&&(ut=S,K=c(K)),S=K,S}function Ja(){var S,K,oe,De,Be,Ue,ot,Ut,Ks;if(S=O,K=sr(),K===r&&(K=null),K!==r){if(oe=O,t.charCodeAt(O)===35?(De=u,O++):(De=r,He===0&&Xe(g)),De!==r){if(Be=[],Ue=O,ot=O,He++,Ut=$n(),He--,Ut===r?ot=void 0:(O=ot,ot=r),ot!==r?(t.length>O?(Ut=t.charAt(O),O++):(Ut=r,He===0&&Xe(h)),Ut!==r?(ot=[ot,Ut],Ue=ot):(O=Ue,Ue=r)):(O=Ue,Ue=r),Ue!==r)for(;Ue!==r;)Be.push(Ue),Ue=O,ot=O,He++,Ut=$n(),He--,Ut===r?ot=void 0:(O=ot,ot=r),ot!==r?(t.length>O?(Ut=t.charAt(O),O++):(Ut=r,He===0&&Xe(h)),Ut!==r?(ot=[ot,Ut],Ue=ot):(O=Ue,Ue=r)):(O=Ue,Ue=r);else Be=r;Be!==r?(De=[De,Be],oe=De):(O=oe,oe=r)}else O=oe,oe=r;if(oe===r&&(oe=null),oe!==r){if(De=[],Be=Os(),Be!==r)for(;Be!==r;)De.push(Be),Be=Os();else De=r;De!==r?(ut=S,K=f(),S=K):(O=S,S=r)}else O=S,S=r}else O=S,S=r;if(S===r&&(S=O,K=Wa(),K!==r?(oe=Iw(),oe!==r?(De=sr(),De===r&&(De=null),De!==r?(t.charCodeAt(O)===58?(Be=p,O++):(Be=r,He===0&&Xe(m)),Be!==r?(Ue=sr(),Ue===r&&(Ue=null),Ue!==r?(ot=Ts(),ot!==r?(ut=S,K=I(oe,ot),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r),S===r&&(S=O,K=Wa(),K!==r?(oe=za(),oe!==r?(De=sr(),De===r&&(De=null),De!==r?(t.charCodeAt(O)===58?(Be=p,O++):(Be=r,He===0&&Xe(m)),Be!==r?(Ue=sr(),Ue===r&&(Ue=null),Ue!==r?(ot=Ts(),ot!==r?(ut=S,K=I(oe,ot),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r),S===r))){if(S=O,K=Wa(),K!==r)if(oe=za(),oe!==r)if(De=sr(),De!==r)if(Be=dC(),Be!==r){if(Ue=[],ot=Os(),ot!==r)for(;ot!==r;)Ue.push(ot),ot=Os();else Ue=r;Ue!==r?(ut=S,K=I(oe,Be),S=K):(O=S,S=r)}else O=S,S=r;else O=S,S=r;else O=S,S=r;else O=S,S=r;if(S===r)if(S=O,K=Wa(),K!==r)if(oe=za(),oe!==r){if(De=[],Be=O,Ue=sr(),Ue===r&&(Ue=null),Ue!==r?(t.charCodeAt(O)===44?(ot=Q,O++):(ot=r,He===0&&Xe(w)),ot!==r?(Ut=sr(),Ut===r&&(Ut=null),Ut!==r?(Ks=za(),Ks!==r?(ut=Be,Ue=x(oe,Ks),Be=Ue):(O=Be,Be=r)):(O=Be,Be=r)):(O=Be,Be=r)):(O=Be,Be=r),Be!==r)for(;Be!==r;)De.push(Be),Be=O,Ue=sr(),Ue===r&&(Ue=null),Ue!==r?(t.charCodeAt(O)===44?(ot=Q,O++):(ot=r,He===0&&Xe(w)),ot!==r?(Ut=sr(),Ut===r&&(Ut=null),Ut!==r?(Ks=za(),Ks!==r?(ut=Be,Ue=x(oe,Ks),Be=Ue):(O=Be,Be=r)):(O=Be,Be=r)):(O=Be,Be=r)):(O=Be,Be=r);else De=r;De!==r?(Be=sr(),Be===r&&(Be=null),Be!==r?(t.charCodeAt(O)===58?(Ue=p,O++):(Ue=r,He===0&&Xe(m)),Ue!==r?(ot=sr(),ot===r&&(ot=null),ot!==r?(Ut=Ts(),Ut!==r?(ut=S,K=N(oe,De,Ut),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)}else O=S,S=r;else O=S,S=r}return S}function Ts(){var S,K,oe,De,Be,Ue,ot;if(S=O,K=O,He++,oe=O,De=$n(),De!==r?(Be=mw(),Be!==r?(t.charCodeAt(O)===45?(Ue=o,O++):(Ue=r,He===0&&Xe(a)),Ue!==r?(ot=sr(),ot!==r?(De=[De,Be,Ue,ot],oe=De):(O=oe,oe=r)):(O=oe,oe=r)):(O=oe,oe=r)):(O=oe,oe=r),He--,oe!==r?(O=K,K=void 0):K=r,K!==r?(oe=Os(),oe!==r?(De=fC(),De!==r?(Be=To(),Be!==r?(Ue=pC(),Ue!==r?(ut=S,K=H(Be),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r),S===r&&(S=O,K=$n(),K!==r?(oe=fC(),oe!==r?(De=ja(),De!==r?(Be=pC(),Be!==r?(ut=S,K=H(De),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r),S===r))if(S=O,K=Ew(),K!==r){if(oe=[],De=Os(),De!==r)for(;De!==r;)oe.push(De),De=Os();else oe=r;oe!==r?(ut=S,K=T(K),S=K):(O=S,S=r)}else O=S,S=r;return S}function Wa(){var S,K,oe;for(He++,S=O,K=[],t.charCodeAt(O)===32?(oe=G,O++):(oe=r,He===0&&Xe(te));oe!==r;)K.push(oe),t.charCodeAt(O)===32?(oe=G,O++):(oe=r,He===0&&Xe(te));return K!==r?(ut=O,oe=j(K),oe?oe=void 0:oe=r,oe!==r?(K=[K,oe],S=K):(O=S,S=r)):(O=S,S=r),He--,S===r&&(K=r,He===0&&Xe(P)),S}function mw(){var S,K,oe;for(S=O,K=[],t.charCodeAt(O)===32?(oe=G,O++):(oe=r,He===0&&Xe(te));oe!==r;)K.push(oe),t.charCodeAt(O)===32?(oe=G,O++):(oe=r,He===0&&Xe(te));return K!==r?(ut=O,oe=A(K),oe?oe=void 0:oe=r,oe!==r?(K=[K,oe],S=K):(O=S,S=r)):(O=S,S=r),S}function fC(){var S;return ut=O,S=ee(),S?S=void 0:S=r,S}function pC(){var S;return ut=O,S=$(),S?S=void 0:S=r,S}function Iw(){var S;return S=Va(),S===r&&(S=ug()),S}function za(){var S,K,oe;if(S=Va(),S===r){if(S=O,K=[],oe=xl(),oe!==r)for(;oe!==r;)K.push(oe),oe=xl();else K=r;K!==r&&(ut=S,K=_()),S=K}return S}function Ew(){var S;return S=gg(),S===r&&(S=CC(),S===r&&(S=Va(),S===r&&(S=ug()))),S}function dC(){var S;return S=gg(),S===r&&(S=Va(),S===r&&(S=xl())),S}function ug(){var S,K,oe,De,Be,Ue;if(He++,S=O,F.test(t.charAt(O))?(K=t.charAt(O),O++):(K=r,He===0&&Xe(Re)),K!==r){for(oe=[],De=O,Be=sr(),Be===r&&(Be=null),Be!==r?(xe.test(t.charAt(O))?(Ue=t.charAt(O),O++):(Ue=r,He===0&&Xe(Ke)),Ue!==r?(Be=[Be,Ue],De=Be):(O=De,De=r)):(O=De,De=r);De!==r;)oe.push(De),De=O,Be=sr(),Be===r&&(Be=null),Be!==r?(xe.test(t.charAt(O))?(Ue=t.charAt(O),O++):(Ue=r,He===0&&Xe(Ke)),Ue!==r?(Be=[Be,Ue],De=Be):(O=De,De=r)):(O=De,De=r);oe!==r?(ut=S,K=Me(),S=K):(O=S,S=r)}else O=S,S=r;return He--,S===r&&(K=r,He===0&&Xe(U)),S}function xl(){var S,K,oe,De,Be;if(S=O,t.substr(O,2)===X?(K=X,O+=2):(K=r,He===0&&Xe(ie)),K===r&&(K=null),K!==r)if(we.test(t.charAt(O))?(oe=t.charAt(O),O++):(oe=r,He===0&&Xe(he)),oe!==r){for(De=[],Ie.test(t.charAt(O))?(Be=t.charAt(O),O++):(Be=r,He===0&&Xe(pe));Be!==r;)De.push(Be),Ie.test(t.charAt(O))?(Be=t.charAt(O),O++):(Be=r,He===0&&Xe(pe));De!==r?(ut=S,K=Me(),S=K):(O=S,S=r)}else O=S,S=r;else O=S,S=r;return S}function gg(){var S,K;return S=O,t.substr(O,4)===Fe?(K=Fe,O+=4):(K=r,He===0&&Xe(Z)),K!==r&&(ut=S,K=z()),S=K,S}function CC(){var S,K;return S=O,t.substr(O,4)===ae?(K=ae,O+=4):(K=r,He===0&&Xe(ue)),K!==r&&(ut=S,K=be()),S=K,S===r&&(S=O,t.substr(O,5)===nt?(K=nt,O+=5):(K=r,He===0&&Xe(dt)),K!==r&&(ut=S,K=wt()),S=K),S}function Va(){var S,K,oe,De;return He++,S=O,t.charCodeAt(O)===34?(K=wi,O++):(K=r,He===0&&Xe(_t)),K!==r?(t.charCodeAt(O)===34?(oe=wi,O++):(oe=r,He===0&&Xe(_t)),oe!==r?(ut=S,K=tn(),S=K):(O=S,S=r)):(O=S,S=r),S===r&&(S=O,t.charCodeAt(O)===34?(K=wi,O++):(K=r,He===0&&Xe(_t)),K!==r?(oe=mC(),oe!==r?(t.charCodeAt(O)===34?(De=wi,O++):(De=r,He===0&&Xe(_t)),De!==r?(ut=S,K=_n(oe),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)),He--,S===r&&(K=r,He===0&&Xe(kn)),S}function mC(){var S,K,oe;if(S=O,K=[],oe=hg(),oe!==r)for(;oe!==r;)K.push(oe),oe=hg();else K=r;return K!==r&&(ut=S,K=ng(K)),S=K,S}function hg(){var S,K,oe,De,Be,Ue;return Yd.test(t.charAt(O))?(S=t.charAt(O),O++):(S=r,He===0&&Xe(Ns)),S===r&&(S=O,t.substr(O,2)===sg?(K=sg,O+=2):(K=r,He===0&&Xe(qd)),K!==r&&(ut=S,K=iw()),S=K,S===r&&(S=O,t.substr(O,2)===og?(K=og,O+=2):(K=r,He===0&&Xe(jd)),K!==r&&(ut=S,K=Jd()),S=K,S===r&&(S=O,t.substr(O,2)===Wd?(K=Wd,O+=2):(K=r,He===0&&Xe(nw)),K!==r&&(ut=S,K=sw()),S=K,S===r&&(S=O,t.substr(O,2)===ag?(K=ag,O+=2):(K=r,He===0&&Xe(ow)),K!==r&&(ut=S,K=aw()),S=K,S===r&&(S=O,t.substr(O,2)===zd?(K=zd,O+=2):(K=r,He===0&&Xe(Aw)),K!==r&&(ut=S,K=Mo()),S=K,S===r&&(S=O,t.substr(O,2)===Ms?(K=Ms,O+=2):(K=r,He===0&&Xe(re)),K!==r&&(ut=S,K=Vd()),S=K,S===r&&(S=O,t.substr(O,2)===Ui?(K=Ui,O+=2):(K=r,He===0&&Xe(Xd)),K!==r&&(ut=S,K=Zd()),S=K,S===r&&(S=O,t.substr(O,2)===Ga?(K=Ga,O+=2):(K=r,He===0&&Xe(_d)),K!==r&&(ut=S,K=$d()),S=K,S===r&&(S=O,t.substr(O,2)===Ag?(K=Ag,O+=2):(K=r,He===0&&Xe(eC)),K!==r?(oe=kl(),oe!==r?(De=kl(),De!==r?(Be=kl(),Be!==r?(Ue=kl(),Ue!==r?(ut=S,K=tC(oe,De,Be,Ue),S=K):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)):(O=S,S=r)))))))))),S}function kl(){var S;return lw.test(t.charAt(O))?(S=t.charAt(O),O++):(S=r,He===0&&Xe(cw)),S}function sr(){var S,K;if(He++,S=[],iC.test(t.charAt(O))?(K=t.charAt(O),O++):(K=r,He===0&&Xe(nC)),K!==r)for(;K!==r;)S.push(K),iC.test(t.charAt(O))?(K=t.charAt(O),O++):(K=r,He===0&&Xe(nC));else S=r;return He--,S===r&&(K=r,He===0&&Xe(rC)),S}function DN(){var S,K;if(He++,S=[],oC.test(t.charAt(O))?(K=t.charAt(O),O++):(K=r,He===0&&Xe(aC)),K!==r)for(;K!==r;)S.push(K),oC.test(t.charAt(O))?(K=t.charAt(O),O++):(K=r,He===0&&Xe(aC));else S=r;return He--,S===r&&(K=r,He===0&&Xe(sC)),S}function Os(){var S,K,oe,De,Be,Ue;if(S=O,K=$n(),K!==r){for(oe=[],De=O,Be=sr(),Be===r&&(Be=null),Be!==r?(Ue=$n(),Ue!==r?(Be=[Be,Ue],De=Be):(O=De,De=r)):(O=De,De=r);De!==r;)oe.push(De),De=O,Be=sr(),Be===r&&(Be=null),Be!==r?(Ue=$n(),Ue!==r?(Be=[Be,Ue],De=Be):(O=De,De=r)):(O=De,De=r);oe!==r?(K=[K,oe],S=K):(O=S,S=r)}else O=S,S=r;return S}function $n(){var S;return t.substr(O,2)===lg?(S=lg,O+=2):(S=r,He===0&&Xe(uw)),S===r&&(t.charCodeAt(O)===10?(S=gw,O++):(S=r,He===0&&Xe(AC)),S===r&&(t.charCodeAt(O)===13?(S=hw,O++):(S=r,He===0&&Xe(fw)))),S}let IC=2,vl=0;if(Ya=n(),Ya!==r&&O===t.length)return Ya;throw Ya!==r&&O{var uQe=typeof global=="object"&&global&&global.Object===Object&&global;i3.exports=uQe});var Hn=C((i_e,n3)=>{var gQe=TS(),hQe=typeof self=="object"&&self&&self.Object===Object&&self,fQe=gQe||hQe||Function("return this")();n3.exports=fQe});var GA=C((n_e,s3)=>{var pQe=Hn(),dQe=pQe.Symbol;s3.exports=dQe});var a3=C((s_e,o3)=>{function CQe(t,e){for(var r=-1,i=t==null?0:t.length,n=Array(i);++r{var mQe=Array.isArray;A3.exports=mQe});var g3=C((a_e,l3)=>{var c3=GA(),u3=Object.prototype,IQe=u3.hasOwnProperty,EQe=u3.toString,ef=c3?c3.toStringTag:void 0;function yQe(t){var e=IQe.call(t,ef),r=t[ef];try{t[ef]=void 0;var i=!0}catch(s){}var n=EQe.call(t);return i&&(e?t[ef]=r:delete t[ef]),n}l3.exports=yQe});var f3=C((A_e,h3)=>{var BQe=Object.prototype,wQe=BQe.toString;function QQe(t){return wQe.call(t)}h3.exports=QQe});var YA=C((l_e,p3)=>{var d3=GA(),bQe=g3(),DQe=f3(),SQe="[object Null]",xQe="[object Undefined]",C3=d3?d3.toStringTag:void 0;function kQe(t){return t==null?t===void 0?xQe:SQe:C3&&C3 in Object(t)?bQe(t):DQe(t)}p3.exports=kQe});var fs=C((c_e,m3)=>{function vQe(t){return t!=null&&typeof t=="object"}m3.exports=vQe});var oE=C((u_e,I3)=>{var PQe=YA(),FQe=fs(),RQe="[object Symbol]";function NQe(t){return typeof t=="symbol"||FQe(t)&&PQe(t)==RQe}I3.exports=NQe});var b3=C((g_e,E3)=>{var y3=GA(),MQe=a3(),LQe=Cn(),TQe=oE(),OQe=1/0,B3=y3?y3.prototype:void 0,w3=B3?B3.toString:void 0;function Q3(t){if(typeof t=="string")return t;if(LQe(t))return MQe(t,Q3)+"";if(TQe(t))return w3?w3.call(t):"";var e=t+"";return e=="0"&&1/t==-OQe?"-0":e}E3.exports=Q3});var Rc=C((h_e,D3)=>{var KQe=b3();function UQe(t){return t==null?"":KQe(t)}D3.exports=UQe});var OS=C((f_e,S3)=>{function HQe(t,e,r){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),r=r>n?n:r,r<0&&(r+=n),n=e>r?0:r-e>>>0,e>>>=0;for(var s=Array(n);++i{var GQe=OS();function YQe(t,e,r){var i=t.length;return r=r===void 0?i:r,!e&&r>=i?t:GQe(t,e,r)}x3.exports=YQe});var KS=C((d_e,v3)=>{var qQe="\\ud800-\\udfff",jQe="\\u0300-\\u036f",JQe="\\ufe20-\\ufe2f",WQe="\\u20d0-\\u20ff",zQe=jQe+JQe+WQe,VQe="\\ufe0e\\ufe0f",XQe="\\u200d",ZQe=RegExp("["+XQe+qQe+zQe+VQe+"]");function _Qe(t){return ZQe.test(t)}v3.exports=_Qe});var F3=C((C_e,P3)=>{function $Qe(t){return t.split("")}P3.exports=$Qe});var U3=C((m_e,R3)=>{var N3="\\ud800-\\udfff",e0e="\\u0300-\\u036f",t0e="\\ufe20-\\ufe2f",r0e="\\u20d0-\\u20ff",i0e=e0e+t0e+r0e,n0e="\\ufe0e\\ufe0f",s0e="["+N3+"]",US="["+i0e+"]",HS="\\ud83c[\\udffb-\\udfff]",o0e="(?:"+US+"|"+HS+")",M3="[^"+N3+"]",L3="(?:\\ud83c[\\udde6-\\uddff]){2}",T3="[\\ud800-\\udbff][\\udc00-\\udfff]",a0e="\\u200d",O3=o0e+"?",K3="["+n0e+"]?",A0e="(?:"+a0e+"(?:"+[M3,L3,T3].join("|")+")"+K3+O3+")*",l0e=K3+O3+A0e,c0e="(?:"+[M3+US+"?",US,L3,T3,s0e].join("|")+")",u0e=RegExp(HS+"(?="+HS+")|"+c0e+l0e,"g");function g0e(t){return t.match(u0e)||[]}R3.exports=g0e});var G3=C((I_e,H3)=>{var h0e=F3(),f0e=KS(),p0e=U3();function d0e(t){return f0e(t)?p0e(t):h0e(t)}H3.exports=d0e});var q3=C((E_e,Y3)=>{var C0e=k3(),m0e=KS(),I0e=G3(),E0e=Rc();function y0e(t){return function(e){e=E0e(e);var r=m0e(e)?I0e(e):void 0,i=r?r[0]:e.charAt(0),n=r?C0e(r,1).join(""):e.slice(1);return i[t]()+n}}Y3.exports=y0e});var J3=C((y_e,j3)=>{var B0e=q3(),w0e=B0e("toUpperCase");j3.exports=w0e});var GS=C((B_e,W3)=>{var Q0e=Rc(),b0e=J3();function D0e(t){return b0e(Q0e(t).toLowerCase())}W3.exports=D0e});var V3=C((w_e,z3)=>{"use strict";z3.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var tf=C((Q_e,YS)=>{"use strict";var S0e=V3(),X3=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,i=()=>{r--,e.length>0&&e.shift()()},n=(a,l,...c)=>{r++;let u=S0e(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{rnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),o};YS.exports=X3;YS.exports.default=X3});var i4=C((O_e,lE)=>{function x0e(){var t=0,e=1,r=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,h=12,f=13,p=14,m=15,I=16,Q=17,w=0,x=1,N=2,H=3,T=4;function P(A,ee){return 55296<=A.charCodeAt(ee)&&A.charCodeAt(ee)<=56319&&56320<=A.charCodeAt(ee+1)&&A.charCodeAt(ee+1)<=57343}function G(A,ee){ee===void 0&&(ee=0);var $=A.charCodeAt(ee);if(55296<=$&&$<=56319&&ee=1){var _=A.charCodeAt(ee-1),U=$;return 55296<=_&&_<=56319?(_-55296)*1024+(U-56320)+65536:U}return $}function te(A,ee,$){var _=[A].concat(ee).concat([$]),U=_[_.length-2],F=$,Re=_.lastIndexOf(p);if(Re>1&&_.slice(1,Re).every(function(Me){return Me==i})&&[i,f,Q].indexOf(A)==-1)return N;var xe=_.lastIndexOf(n);if(xe>0&&_.slice(1,xe).every(function(Me){return Me==n})&&[h,n].indexOf(U)==-1)return _.filter(function(Me){return Me==n}).length%2==1?H:T;if(U==t&&F==e)return w;if(U==r||U==t||U==e)return F==p&&ee.every(function(Me){return Me==i})?N:x;if(F==r||F==t||F==e)return x;if(U==o&&(F==o||F==a||F==c||F==u))return w;if((U==c||U==a)&&(F==a||F==l))return w;if((U==u||U==l)&&F==l)return w;if(F==i||F==m)return w;if(F==s)return w;if(U==h)return w;var Ke=_.indexOf(i)!=-1?_.lastIndexOf(i)-1:_.length-2;return[f,Q].indexOf(_[Ke])!=-1&&_.slice(Ke+1,-1).every(function(Me){return Me==i})&&F==p||U==m&&[I,Q].indexOf(F)!=-1?w:ee.indexOf(n)!=-1?N:U==n&&F==n?w:x}this.nextBreak=function(A,ee){if(ee===void 0&&(ee=0),ee<0)return 0;if(ee>=A.length-1)return A.length;for(var $=j(G(A,ee)),_=[],U=ee+1;U{var k0e=i4(),v0e=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,P0e=new k0e;n4.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=r-e,n="",s=0,o=0;for(;t.length>0;){let a=t.match(v0e)||[t,t,void 0],l=P0e.splitGraphemes(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),t=t.slice(a[0].length)}return n}});var Mc=C((u$e,m4)=>{"use strict";var I4=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),c$e=m4.exports=t=>t?Object.keys(t).map(e=>[I4.has(e)?I4.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var Lc=C((g$e,E4)=>{"use strict";var j0e=require("events"),y4=require("stream"),of=rh(),B4=require("string_decoder").StringDecoder,go=Symbol("EOF"),af=Symbol("maybeEmitEnd"),ga=Symbol("emittedEnd"),hE=Symbol("emittingEnd"),fE=Symbol("closed"),w4=Symbol("read"),WS=Symbol("flush"),Q4=Symbol("flushChunk"),Ni=Symbol("encoding"),ho=Symbol("decoder"),pE=Symbol("flowing"),Af=Symbol("paused"),lf=Symbol("resume"),Ii=Symbol("bufferLength"),b4=Symbol("bufferPush"),zS=Symbol("bufferShift"),ti=Symbol("objectMode"),ri=Symbol("destroyed"),D4=global._MP_NO_ITERATOR_SYMBOLS_!=="1",J0e=D4&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),W0e=D4&&Symbol.iterator||Symbol("iterator not implemented"),S4=t=>t==="end"||t==="finish"||t==="prefinish",z0e=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,V0e=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t);E4.exports=class x4 extends y4{constructor(e){super();this[pE]=!1,this[Af]=!1,this.pipes=new of,this.buffer=new of,this[ti]=e&&e.objectMode||!1,this[ti]?this[Ni]=null:this[Ni]=e&&e.encoding||null,this[Ni]==="buffer"&&(this[Ni]=null),this[ho]=this[Ni]?new B4(this[Ni]):null,this[go]=!1,this[ga]=!1,this[hE]=!1,this[fE]=!1,this.writable=!0,this.readable=!0,this[Ii]=0,this[ri]=!1}get bufferLength(){return this[Ii]}get encoding(){return this[Ni]}set encoding(e){if(this[ti])throw new Error("cannot set encoding in objectMode");if(this[Ni]&&e!==this[Ni]&&(this[ho]&&this[ho].lastNeed||this[Ii]))throw new Error("cannot change encoding");this[Ni]!==e&&(this[ho]=e?new B4(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[ho].write(r)))),this[Ni]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[ti]}set objectMode(e){this[ti]=this[ti]||!!e}write(e,r,i){if(this[go])throw new Error("write after end");return this[ri]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof r=="function"&&(i=r,r="utf8"),r||(r="utf8"),!this[ti]&&!Buffer.isBuffer(e)&&(V0e(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):z0e(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[Ii]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[ti]&&!(r===this[Ni]&&!this[ho].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Ni]&&(e=this[ho].write(e)),this.flowing?(this[Ii]!==0&&this[WS](!0),this.emit("data",e)):this[b4](e),this[Ii]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[ri])return null;try{return this[Ii]===0||e===0||e>this[Ii]?null:(this[ti]&&(e=null),this.buffer.length>1&&!this[ti]&&(this.encoding?this.buffer=new of([Array.from(this.buffer).join("")]):this.buffer=new of([Buffer.concat(Array.from(this.buffer),this[Ii])])),this[w4](e||null,this.buffer.head.value))}finally{this[af]()}}[w4](e,r){return e===r.length||e===null?this[zS]():(this.buffer.head.value=r.slice(e),r=r.slice(0,e),this[Ii]-=e),this.emit("data",r),!this.buffer.length&&!this[go]&&this.emit("drain"),r}end(e,r,i){return typeof e=="function"&&(i=e,e=null),typeof r=="function"&&(i=r,r="utf8"),e&&this.write(e,r),i&&this.once("end",i),this[go]=!0,this.writable=!1,(this.flowing||!this[Af])&&this[af](),this}[lf](){this[ri]||(this[Af]=!1,this[pE]=!0,this.emit("resume"),this.buffer.length?this[WS]():this[go]?this[af]():this.emit("drain"))}resume(){return this[lf]()}pause(){this[pE]=!1,this[Af]=!0}get destroyed(){return this[ri]}get flowing(){return this[pE]}get paused(){return this[Af]}[b4](e){return this[ti]?this[Ii]+=1:this[Ii]+=e.length,this.buffer.push(e)}[zS](){return this.buffer.length&&(this[ti]?this[Ii]-=1:this[Ii]-=this.buffer.head.value.length),this.buffer.shift()}[WS](e){do;while(this[Q4](this[zS]()));!e&&!this.buffer.length&&!this[go]&&this.emit("drain")}[Q4](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[ri])return;let i=this[ga];r=r||{},e===process.stdout||e===process.stderr?r.end=!1:r.end=r.end!==!1;let n={dest:e,opts:r,ondrain:s=>this[lf]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[lf](),i&&n.opts.end&&n.dest.end(),e}addListener(e,r){return this.on(e,r)}on(e,r){try{return super.on(e,r)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[lf]():S4(e)&&this[ga]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[ga]}[af](){!this[hE]&&!this[ga]&&!this[ri]&&this.buffer.length===0&&this[go]&&(this[hE]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[fE]&&this.emit("close"),this[hE]=!1)}emit(e,r){if(e!=="error"&&e!=="close"&&e!==ri&&this[ri])return;if(e==="data"){if(!r)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(r)===!1&&this.pause())}else if(e==="end"){if(this[ga]===!0)return;this[ga]=!0,this.readable=!1,this[ho]&&(r=this[ho].end(),r&&(this.pipes.forEach(n=>n.dest.write(r)),super.emit("data",r))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[fE]=!0,!this[ga]&&!this[ri]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=r,arguments.length>2)for(let n=2;n{e.push(i),this[ti]||(e.dataLength+=i.length)}),r.then(()=>e)}concat(){return this[ti]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[ti]?Promise.reject(new Error("cannot concat in objectMode")):this[Ni]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(ri,()=>r(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>r(i))})}[J0e](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[go])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[go]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(ri,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[W0e](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[ri]?(e?this.emit("error",e):this.emit(ri),this):(this[ri]=!0,this.buffer=new of,this[Ii]=0,typeof this.close=="function"&&!this[fE]&&this.close(),e?this.emit("error",e):this.emit(ri),this)}static isStream(e){return!!e&&(e instanceof x4||e instanceof y4||e instanceof j0e&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var v4=C((h$e,k4)=>{var X0e=require("zlib").constants||{ZLIB_VERNUM:4736};k4.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},X0e))});var ix=C(Xi=>{"use strict";var VS=require("assert"),ha=require("buffer").Buffer,P4=require("zlib"),qA=Xi.constants=v4(),Z0e=Lc(),F4=ha.concat,jA=Symbol("_superWrite"),cf=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},_0e=Symbol("opts"),uf=Symbol("flushFlag"),R4=Symbol("finishFlushFlag"),XS=Symbol("fullFlushFlag"),Lt=Symbol("handle"),dE=Symbol("onError"),Tc=Symbol("sawError"),ZS=Symbol("level"),_S=Symbol("strategy"),$S=Symbol("ended"),f$e=Symbol("_defaultFullFlush"),ex=class extends Z0e{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[Tc]=!1,this[$S]=!1,this[_0e]=e,this[uf]=e.flush,this[R4]=e.finishFlush;try{this[Lt]=new P4[r](e)}catch(i){throw new cf(i)}this[dE]=i=>{this[Tc]||(this[Tc]=!0,this.close(),this.emit("error",i))},this[Lt].on("error",i=>this[dE](new cf(i))),this.once("end",()=>this.close)}close(){this[Lt]&&(this[Lt].close(),this[Lt]=null,this.emit("close"))}reset(){if(!this[Tc])return VS(this[Lt],"zlib binding closed"),this[Lt].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[XS]),this.write(Object.assign(ha.alloc(0),{[uf]:e})))}end(e,r,i){return e&&this.write(e,r),this.flush(this[R4]),this[$S]=!0,super.end(null,null,i)}get ended(){return this[$S]}write(e,r,i){if(typeof r=="function"&&(i=r,r="utf8"),typeof e=="string"&&(e=ha.from(e,r)),this[Tc])return;VS(this[Lt],"zlib binding closed");let n=this[Lt]._handle,s=n.close;n.close=()=>{};let o=this[Lt].close;this[Lt].close=()=>{},ha.concat=c=>c;let a;try{let c=typeof e[uf]=="number"?e[uf]:this[uf];a=this[Lt]._processChunk(e,c),ha.concat=F4}catch(c){ha.concat=F4,this[dE](new cf(c))}finally{this[Lt]&&(this[Lt]._handle=n,n.close=s,this[Lt].close=o,this[Lt].removeAllListeners("error"))}this[Lt]&&this[Lt].on("error",c=>this[dE](new cf(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[jA](ha.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[Lt].params(e,r)}finally{this[Lt].flush=i}this[Lt]&&(this[ZS]=e,this[_S]=r)}}}},N4=class extends fa{constructor(e){super(e,"Deflate")}},M4=class extends fa{constructor(e){super(e,"Inflate")}},tx=Symbol("_portable"),L4=class extends fa{constructor(e){super(e,"Gzip");this[tx]=e&&!!e.portable}[jA](e){return this[tx]?(this[tx]=!1,e[9]=255,super[jA](e)):super[jA](e)}},T4=class extends fa{constructor(e){super(e,"Gunzip")}},O4=class extends fa{constructor(e){super(e,"DeflateRaw")}},K4=class extends fa{constructor(e){super(e,"InflateRaw")}},U4=class extends fa{constructor(e){super(e,"Unzip")}},rx=class extends ex{constructor(e,r){e=e||{},e.flush=e.flush||qA.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||qA.BROTLI_OPERATION_FINISH,super(e,r),this[XS]=qA.BROTLI_OPERATION_FLUSH}},H4=class extends rx{constructor(e){super(e,"BrotliCompress")}},G4=class extends rx{constructor(e){super(e,"BrotliDecompress")}};Xi.Deflate=N4;Xi.Inflate=M4;Xi.Gzip=L4;Xi.Gunzip=T4;Xi.DeflateRaw=O4;Xi.InflateRaw=K4;Xi.Unzip=U4;typeof P4.BrotliCompress=="function"?(Xi.BrotliCompress=H4,Xi.BrotliDecompress=G4):Xi.BrotliCompress=Xi.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var gf=C(CE=>{"use strict";CE.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);CE.code=new Map(Array.from(CE.name).map(t=>[t[1],t[0]]))});var hf=C((I$e,Y4)=>{"use strict";var C$e=gf(),$0e=Lc(),nx=Symbol("slurp");Y4.exports=class extends $0e{constructor(e,r,i){super();switch(this.pause(),this.extended=r,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,r&&this[nx](r),i&&this[nx](i,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-r),this.blockRemain=Math.max(0,n-r),this.ignore?!0:i>=r?super.write(e):super.write(e.slice(0,i))}[nx](e,r){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(r&&i==="path")&&(this[i]=e[i])}}});var J4=C(sx=>{"use strict";var E$e=sx.encode=(t,e)=>{if(Number.isSafeInteger(t))t<0?tbe(t,e):ebe(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},ebe=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},tbe=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var i=e.length;i>1;i--){var n=t&255;t=Math.floor(t/256),r?e[i-1]=q4(n):n===0?e[i-1]=0:(r=!0,e[i-1]=j4(n))}},y$e=sx.parse=t=>{var e=t[t.length-1],r=t[0],i;if(r===128)i=ibe(t.slice(1,t.length));else if(r===255)i=rbe(t);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},rbe=t=>{for(var e=t.length,r=0,i=!1,n=e-1;n>-1;n--){var s=t[n],o;i?o=q4(s):s===0?o=s:(i=!0,o=j4(s)),o!==0&&(r-=o*Math.pow(256,e-n-1))}return r},ibe=t=>{for(var e=t.length,r=0,i=e-1;i>-1;i--){var n=t[i];n!==0&&(r+=n*Math.pow(256,e-i-1))}return r},q4=t=>(255^t)&255,j4=t=>(255^t)+1&255});var Kc=C((w$e,W4)=>{"use strict";var ox=gf(),Oc=require("path").posix,z4=J4(),ax=Symbol("slurp"),Zi=Symbol("type"),V4=class{constructor(e,r,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[Zi]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,i,n):e&&this.set(e)}decode(e,r,i,n){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=JA(e,r,100),this.mode=pa(e,r+100,8),this.uid=pa(e,r+108,8),this.gid=pa(e,r+116,8),this.size=pa(e,r+124,12),this.mtime=Ax(e,r+136,12),this.cksum=pa(e,r+148,12),this[ax](i),this[ax](n,!0),this[Zi]=JA(e,r+156,1),this[Zi]===""&&(this[Zi]="0"),this[Zi]==="0"&&this.path.substr(-1)==="/"&&(this[Zi]="5"),this[Zi]==="5"&&(this.size=0),this.linkpath=JA(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=JA(e,r+265,32),this.gname=JA(e,r+297,32),this.devmaj=pa(e,r+329,8),this.devmin=pa(e,r+337,8),e[r+475]!==0){let o=JA(e,r+345,155);this.path=o+"/"+this.path}else{let o=JA(e,r+345,130);o&&(this.path=o+"/"+this.path),this.atime=Ax(e,r+476,12),this.ctime=Ax(e,r+488,12)}let s=8*32;for(let o=r;o=r+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=nbe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=WA(e,r,100,s)||this.needPax,this.needPax=da(e,r+100,8,this.mode)||this.needPax,this.needPax=da(e,r+108,8,this.uid)||this.needPax,this.needPax=da(e,r+116,8,this.gid)||this.needPax,this.needPax=da(e,r+124,12,this.size)||this.needPax,this.needPax=lx(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[Zi].charCodeAt(0),this.needPax=WA(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=WA(e,r+265,32,this.uname)||this.needPax,this.needPax=WA(e,r+297,32,this.gname)||this.needPax,this.needPax=da(e,r+329,8,this.devmaj)||this.needPax,this.needPax=da(e,r+337,8,this.devmin)||this.needPax,this.needPax=WA(e,r+345,i,o)||this.needPax,e[r+475]!==0?this.needPax=WA(e,r+345,155,o)||this.needPax:(this.needPax=WA(e,r+345,130,o)||this.needPax,this.needPax=lx(e,r+476,12,this.atime)||this.needPax,this.needPax=lx(e,r+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=r;l{let r=100,i=t,n="",s,o=Oc.parse(t).root||".";if(Buffer.byteLength(i)r&&Buffer.byteLength(n)<=e?s=[i.substr(0,r-1),n,!0]:(i=Oc.join(Oc.basename(n),i),n=Oc.dirname(n));while(n!==o&&!s);s||(s=[t.substr(0,r-1),"",!0])}return s},JA=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),Ax=(t,e,r)=>sbe(pa(t,e,r)),sbe=t=>t===null?null:new Date(t*1e3),pa=(t,e,r)=>t[e]&128?z4.parse(t.slice(e,e+r)):obe(t,e,r),abe=t=>isNaN(t)?null:t,obe=(t,e,r)=>abe(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),Abe={12:8589934591,8:2097151},da=(t,e,r,i)=>i===null?!1:i>Abe[r]||i<0?(z4.encode(i,t.slice(e,e+r)),!0):(lbe(t,e,r,i),!1),lbe=(t,e,r,i)=>t.write(cbe(i,r),e,r,"ascii"),cbe=(t,e)=>ube(Math.floor(t).toString(8),e),ube=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",lx=(t,e,r,i)=>i===null?!1:da(t,e,r,i.getTime()/1e3),gbe=new Array(156).join("\0"),WA=(t,e,r,i)=>i===null?!1:(t.write(i+gbe,e,r,"utf8"),i.length!==Buffer.byteLength(i)||i.length>r);W4.exports=V4});var IE=C((Q$e,X4)=>{"use strict";var hbe=Kc(),fbe=require("path"),mE=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),i=512*Math.ceil(1+r/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new hbe({path:("PaxHeader/"+fbe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,r,"utf8");for(let s=r+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};mE.parse=(t,e,r)=>new mE(pbe(dbe(t),e),r);var pbe=(t,e)=>e?Object.keys(t).reduce((r,i)=>(r[i]=t[i],r),e):t,dbe=t=>t.replace(/\n$/,"").split(` -`).reduce(Cbe,Object.create(null)),Cbe=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return t;let s=i.join("=");return t[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,t};X4.exports=mE});var EE=C((b$e,Z4)=>{"use strict";Z4.exports=t=>class extends t{warn(e,r,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=r instanceof Error&&r.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(r instanceof Error&&(i=Object.assign(r,i),r=r.message),this.emit("warn",i.tarCode,r,i)):r instanceof Error?this.emit("error",Object.assign(r,i)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),i))}}});var ux=C((D$e,_4)=>{"use strict";var yE=["|","<",">","?",":"],cx=yE.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),mbe=new Map(yE.map((t,e)=>[t,cx[e]])),Ibe=new Map(cx.map((t,e)=>[t,yE[e]]));_4.exports={encode:t=>yE.reduce((e,r)=>e.split(r).join(mbe.get(r)),t),decode:t=>cx.reduce((e,r)=>e.split(r).join(Ibe.get(r)),t)}});var e8=C((S$e,$4)=>{"use strict";$4.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&~18),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var mx=C((F$e,t8)=>{"use strict";var r8=Lc(),i8=IE(),n8=Kc(),x$e=hf(),ds=require("fs"),Uc=require("path"),k$e=gf(),Ebe=16*1024*1024,s8=Symbol("process"),o8=Symbol("file"),a8=Symbol("directory"),gx=Symbol("symlink"),A8=Symbol("hardlink"),ff=Symbol("header"),BE=Symbol("read"),hx=Symbol("lstat"),wE=Symbol("onlstat"),fx=Symbol("onread"),px=Symbol("onreadlink"),dx=Symbol("openfile"),Cx=Symbol("onopenfile"),zA=Symbol("close"),QE=Symbol("mode"),l8=EE(),ybe=ux(),c8=e8(),bE=l8(class extends r8{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||Ebe,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=r.cwd||process.cwd(),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(!this.preservePaths&&Uc.win32.isAbsolute(e)){let n=Uc.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=ybe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=r.absolute||Uc.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[wE](this.statCache.get(this.absolute)):this[hx]()}[hx](){ds.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[wE](r)})}[wE](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=Bbe(e),this.emit("stat",e),this[s8]()}[s8](){switch(this.type){case"File":return this[o8]();case"Directory":return this[a8]();case"SymbolicLink":return this[gx]();default:return this.end()}}[QE](e){return c8(e,this.type==="Directory",this.portable)}[ff](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new n8({path:this.path,linkpath:this.linkpath,mode:this[QE](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new i8({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[a8](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[ff](),this.end()}[gx](){ds.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[px](r)})}[px](e){this.linkpath=e.replace(/\\/g,"/"),this[ff](),this.end()}[A8](e){this.type="Link",this.linkpath=Uc.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[ff](),this.end()}[o8](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[A8](r)}this.linkCache.set(e,this.absolute)}if(this[ff](),this.stat.size===0)return this.end();this[dx]()}[dx](){ds.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[Cx](r)})}[Cx](e){let r=512*Math.ceil(this.stat.size/512),i=Math.min(r,this.maxReadSize),n=Buffer.allocUnsafe(i);this[BE](e,n,0,n.length,0,this.stat.size,r)}[BE](e,r,i,n,s,o,a){ds.read(e,r,i,n,s,(l,c)=>{if(l)return this[zA](e,()=>this.emit("error",l));this[fx](e,r,i,n,s,o,a,c)})}[zA](e,r){ds.close(e,r)}[fx](e,r,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[zA](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[zA](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(r=Buffer.allocUnsafe(n),i=0),n=r.length-i,this[BE](e,r,i,n,s,o,a)}}),u8=class extends bE{constructor(e,r){super(e,r)}[hx](){this[wE](ds.lstatSync(this.absolute))}[gx](){this[px](ds.readlinkSync(this.absolute))}[dx](){this[Cx](ds.openSync(this.absolute,"r"))}[BE](e,r,i,n,s,o,a){let l=!0;try{let c=ds.readSync(e,r,i,n,s);this[fx](e,r,i,n,s,o,a,c),l=!1}finally{if(l)try{this[zA](e,()=>{})}catch(c){}}}[zA](e,r){ds.closeSync(e),r()}},wbe=l8(class extends r8{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[QE](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(Uc.isAbsolute(this.path)&&!this.preservePaths){let n=Uc.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new n8({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new i8({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[QE](e){return c8(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});bE.Sync=u8;bE.Tar=wbe;var Bbe=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";t8.exports=bE});var RE=C((N$e,g8)=>{"use strict";var Ix=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},Qbe=Lc(),bbe=ix(),Dbe=hf(),Ex=mx(),Sbe=Ex.Sync,xbe=Ex.Tar,kbe=rh(),h8=Buffer.alloc(1024),DE=Symbol("onStat"),SE=Symbol("ended"),Cs=Symbol("queue"),Hc=Symbol("current"),VA=Symbol("process"),xE=Symbol("processing"),f8=Symbol("processJob"),ms=Symbol("jobs"),yx=Symbol("jobDone"),kE=Symbol("addFSEntry"),p8=Symbol("addTarEntry"),Bx=Symbol("stat"),wx=Symbol("readdir"),vE=Symbol("onreaddir"),PE=Symbol("pipe"),d8=Symbol("entry"),Qx=Symbol("entryOpt"),bx=Symbol("writeEntryClass"),C8=Symbol("write"),Dx=Symbol("ondrain"),FE=require("fs"),m8=require("path"),vbe=EE(),Sx=vbe(class extends Qbe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[bx]=Ex,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new bbe.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[Dx]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[Dx]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[Cs]=new kbe,this[ms]=0,this.jobs=+e.jobs||4,this[xE]=!1,this[SE]=!1}[C8](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[SE]=!0,this[VA](),this}write(e){if(this[SE])throw new Error("write after end");return e instanceof Dbe?this[p8](e):this[kE](e),this.flowing}[p8](e){let r=m8.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new Ix(e.path,r,!1);i.entry=new xbe(e,this[Qx](i)),i.entry.on("end",n=>this[yx](i)),this[ms]+=1,this[Cs].push(i)}this[VA]()}[kE](e){let r=m8.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[Cs].push(new Ix(e,r)),this[VA]()}[Bx](e){e.pending=!0,this[ms]+=1;let r=this.follow?"stat":"lstat";FE[r](e.absolute,(i,n)=>{e.pending=!1,this[ms]-=1,i?this.emit("error",i):this[DE](e,n)})}[DE](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[VA]()}[wx](e){e.pending=!0,this[ms]+=1,FE.readdir(e.absolute,(r,i)=>{if(e.pending=!1,this[ms]-=1,r)return this.emit("error",r);this[vE](e,i)})}[vE](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[VA]()}[VA](){if(!this[xE]){this[xE]=!0;for(let e=this[Cs].head;e!==null&&this[ms]this.warn(r,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[d8](e){this[ms]+=1;try{return new this[bx](e.path,this[Qx](e)).on("end",()=>this[yx](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[Dx](){this[Hc]&&this[Hc].entry&&this[Hc].entry.resume()}[PE](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[kE](o+n)});let r=e.entry,i=this.zip;i?r.on("data",n=>{i.write(n)||r.pause()}):r.on("data",n=>{super.write(n)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),I8=class extends Sx{constructor(e){super(e);this[bx]=Sbe}pause(){}resume(){}[Bx](e){let r=this.follow?"statSync":"lstatSync";this[DE](e,FE[r](e.absolute))}[wx](e,r){this[vE](e,FE.readdirSync(e.absolute))}[PE](e){let r=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[kE](o+n)}),i?r.on("data",n=>{i.write(n)}):r.on("data",n=>{super[C8](n)})}};Sx.Sync=I8;g8.exports=Sx});var Wc=C(pf=>{"use strict";var Pbe=Lc(),Fbe=require("events").EventEmitter,mn=require("fs"),NE=process.binding("fs"),M$e=NE.writeBuffers,Rbe=NE.FSReqWrap||NE.FSReqCallback,Gc=Symbol("_autoClose"),Is=Symbol("_close"),df=Symbol("_ended"),Rt=Symbol("_fd"),E8=Symbol("_finished"),XA=Symbol("_flags"),xx=Symbol("_flush"),kx=Symbol("_handleChunk"),vx=Symbol("_makeBuf"),Px=Symbol("_mode"),ME=Symbol("_needDrain"),Yc=Symbol("_onerror"),qc=Symbol("_onopen"),Fx=Symbol("_onread"),ZA=Symbol("_onwrite"),Ca=Symbol("_open"),ma=Symbol("_path"),_A=Symbol("_pos"),Es=Symbol("_queue"),jc=Symbol("_read"),y8=Symbol("_readSize"),Ia=Symbol("_reading"),LE=Symbol("_remain"),B8=Symbol("_size"),TE=Symbol("_write"),Jc=Symbol("_writing"),OE=Symbol("_defaultFlag"),Rx=class extends Pbe{constructor(e,r){if(r=r||{},super(r),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Rt]=typeof r.fd=="number"?r.fd:null,this[ma]=e,this[y8]=r.readSize||16*1024*1024,this[Ia]=!1,this[B8]=typeof r.size=="number"?r.size:Infinity,this[LE]=this[B8],this[Gc]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[Rt]=="number"?this[jc]():this[Ca]()}get fd(){return this[Rt]}get path(){return this[ma]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[Ca](){mn.open(this[ma],"r",(e,r)=>this[qc](e,r))}[qc](e,r){e?this[Yc](e):(this[Rt]=r,this.emit("open",r),this[jc]())}[vx](){return Buffer.allocUnsafe(Math.min(this[y8],this[LE]))}[jc](){if(!this[Ia]){this[Ia]=!0;let e=this[vx]();if(e.length===0)return process.nextTick(()=>this[Fx](null,0,e));mn.read(this[Rt],e,0,e.length,null,(r,i,n)=>this[Fx](r,i,n))}}[Fx](e,r,i){this[Ia]=!1,e?this[Yc](e):this[kx](r,i)&&this[jc]()}[Is](){this[Gc]&&typeof this[Rt]=="number"&&(mn.close(this[Rt],e=>this.emit("close")),this[Rt]=null)}[Yc](e){this[Ia]=!0,this[Is](),this.emit("error",e)}[kx](e,r){let i=!1;return this[LE]-=e,e>0&&(i=super.write(ethis[qc](e,r))}[qc](e,r){this[OE]&&this[XA]==="r+"&&e&&e.code==="ENOENT"?(this[XA]="w",this[Ca]()):e?this[Yc](e):(this[Rt]=r,this.emit("open",r),this[xx]())}end(e,r){e&&this.write(e,r),this[df]=!0,!this[Jc]&&!this[Es].length&&typeof this[Rt]=="number"&&this[ZA](null,0)}write(e,r){return typeof e=="string"&&(e=new Buffer(e,r)),this[df]?(this.emit("error",new Error("write() after end()")),!1):this[Rt]===null||this[Jc]||this[Es].length?(this[Es].push(e),this[ME]=!0,!1):(this[Jc]=!0,this[TE](e),!0)}[TE](e){mn.write(this[Rt],e,0,e.length,this[_A],(r,i)=>this[ZA](r,i))}[ZA](e,r){e?this[Yc](e):(this[_A]!==null&&(this[_A]+=r),this[Es].length?this[xx]():(this[Jc]=!1,this[df]&&!this[E8]?(this[E8]=!0,this[Is](),this.emit("finish")):this[ME]&&(this[ME]=!1,this.emit("drain"))))}[xx](){if(this[Es].length===0)this[df]&&this[ZA](null,0);else if(this[Es].length===1)this[TE](this[Es].pop());else{let e=this[Es];this[Es]=[],Nbe(this[Rt],e,this[_A],(r,i)=>this[ZA](r,i))}}[Is](){this[Gc]&&typeof this[Rt]=="number"&&(mn.close(this[Rt],e=>this.emit("close")),this[Rt]=null)}},Q8=class extends Nx{[Ca](){let e;try{e=mn.openSync(this[ma],this[XA],this[Px])}catch(r){if(this[OE]&&this[XA]==="r+"&&r&&r.code==="ENOENT")return this[XA]="w",this[Ca]();throw r}this[qc](null,e)}[Is](){if(this[Gc]&&typeof this[Rt]=="number"){try{mn.closeSync(this[Rt])}catch(e){}this[Rt]=null,this.emit("close")}}[TE](e){try{this[ZA](null,mn.writeSync(this[Rt],e,0,e.length,this[_A]))}catch(r){this[ZA](r,0)}}},Nbe=(t,e,r,i)=>{let n=(o,a)=>i(o,a,e),s=new Rbe;s.oncomplete=n,NE.writeBuffers(t,e,r,s)};pf.ReadStream=Rx;pf.ReadStreamSync=w8;pf.WriteStream=Nx;pf.WriteStreamSync=Q8});var If=C((K$e,b8)=>{"use strict";var Mbe=EE(),T$e=require("path"),Lbe=Kc(),Tbe=require("events"),Obe=rh(),Kbe=1024*1024,Ube=hf(),D8=IE(),Hbe=ix(),Mx=Buffer.from([31,139]),In=Symbol("state"),$A=Symbol("writeEntry"),fo=Symbol("readEntry"),Lx=Symbol("nextEntry"),S8=Symbol("processEntry"),En=Symbol("extendedHeader"),Cf=Symbol("globalExtendedHeader"),Ea=Symbol("meta"),x8=Symbol("emitMeta"),Yt=Symbol("buffer"),po=Symbol("queue"),el=Symbol("ended"),k8=Symbol("emittedEnd"),tl=Symbol("emit"),Mi=Symbol("unzip"),KE=Symbol("consumeChunk"),UE=Symbol("consumeChunkSub"),Tx=Symbol("consumeBody"),v8=Symbol("consumeMeta"),P8=Symbol("consumeHeader"),HE=Symbol("consuming"),Ox=Symbol("bufferConcat"),Kx=Symbol("maybeEnd"),mf=Symbol("writing"),ya=Symbol("aborted"),GE=Symbol("onDone"),rl=Symbol("sawValidEntry"),YE=Symbol("sawNullBlock"),qE=Symbol("sawEOF"),Gbe=t=>!0;b8.exports=Mbe(class extends Tbe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[rl]=null,this.on(GE,r=>{(this[In]==="begin"||this[rl]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(GE,e.ondone):this.on(GE,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||Kbe,this.filter=typeof e.filter=="function"?e.filter:Gbe,this.writable=!0,this.readable=!1,this[po]=new Obe,this[Yt]=null,this[fo]=null,this[$A]=null,this[In]="begin",this[Ea]="",this[En]=null,this[Cf]=null,this[el]=!1,this[Mi]=null,this[ya]=!1,this[YE]=!1,this[qE]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[P8](e,r){this[rl]===null&&(this[rl]=!1);let i;try{i=new Lbe(e,r,this[En],this[Cf])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[YE]?(this[qE]=!0,this[In]==="begin"&&(this[In]="header"),this[tl]("eof")):(this[YE]=!0,this[tl]("nullBlock"));else if(this[YE]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[$A]=new Ube(i,this[En],this[Cf]);if(!this[rl])if(s.remain){let o=()=>{s.invalid||(this[rl]=!0)};s.on("end",o)}else this[rl]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[tl]("ignoredEntry",s),this[In]="ignore",s.resume()):s.size>0&&(this[Ea]="",s.on("data",o=>this[Ea]+=o),this[In]="meta"):(this[En]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[tl]("ignoredEntry",s),this[In]=s.remain?"ignore":"header",s.resume()):(s.remain?this[In]="body":(this[In]="header",s.end()),this[fo]?this[po].push(s):(this[po].push(s),this[Lx]())))}}}[S8](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[fo]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[Lx]()),r=!1)):(this[fo]=null,r=!1),r}[Lx](){do;while(this[S8](this[po].shift()));if(!this[po].length){let e=this[fo];!e||e.flowing||e.size===e.remain?this[mf]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[Tx](e,r){let i=this[$A],n=i.blockRemain,s=n>=e.length&&r===0?e:e.slice(r,r+n);return i.write(s),i.blockRemain||(this[In]="header",this[$A]=null,i.end()),s.length}[v8](e,r){let i=this[$A],n=this[Tx](e,r);return this[$A]||this[x8](i),n}[tl](e,r,i){!this[po].length&&!this[fo]?this.emit(e,r,i):this[po].push([e,r,i])}[x8](e){switch(this[tl]("meta",this[Ea]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[En]=D8.parse(this[Ea],this[En],!1);break;case"GlobalExtendedHeader":this[Cf]=D8.parse(this[Ea],this[Cf],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[En]=this[En]||Object.create(null),this[En].path=this[Ea].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[En]=this[En]||Object.create(null),this[En].linkpath=this[Ea].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[ya]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[ya])return;if(this[Mi]===null&&e){if(this[Yt]&&(e=Buffer.concat([this[Yt],e]),this[Yt]=null),e.lengththis[KE](s)),this[Mi].on("error",s=>this.abort(s)),this[Mi].on("end",s=>{this[el]=!0,this[KE]()}),this[mf]=!0;let n=this[Mi][i?"end":"write"](e);return this[mf]=!1,n}}this[mf]=!0,this[Mi]?this[Mi].write(e):this[KE](e),this[mf]=!1;let r=this[po].length?!1:this[fo]?this[fo].flowing:!0;return!r&&!this[po].length&&this[fo].once("drain",i=>this.emit("drain")),r}[Ox](e){e&&!this[ya]&&(this[Yt]=this[Yt]?Buffer.concat([this[Yt],e]):e)}[Kx](){if(this[el]&&!this[k8]&&!this[ya]&&!this[HE]){this[k8]=!0;let e=this[$A];if(e&&e.blockRemain){let r=this[Yt]?this[Yt].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[Yt]&&e.write(this[Yt]),e.end()}this[tl](GE)}}[KE](e){if(this[HE])this[Ox](e);else if(!e&&!this[Yt])this[Kx]();else{if(this[HE]=!0,this[Yt]){this[Ox](e);let r=this[Yt];this[Yt]=null,this[UE](r)}else this[UE](e);for(;this[Yt]&&this[Yt].length>=512&&!this[ya]&&!this[qE];){let r=this[Yt];this[Yt]=null,this[UE](r)}this[HE]=!1}(!this[Yt]||this[el])&&this[Kx]()}[UE](e){let r=0,i=e.length;for(;r+512<=i&&!this[ya]&&!this[qE];)switch(this[In]){case"begin":case"header":this[P8](e,r),r+=512;break;case"ignore":case"body":r+=this[Tx](e,r);break;case"meta":r+=this[v8](e,r);break;default:throw new Error("invalid state: "+this[In])}r{"use strict";var Ybe=Mc(),R8=If(),zc=require("fs"),qbe=Wc(),N8=require("path"),U$e=F8.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=Ybe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&Jbe(i,e),i.noResume||jbe(i),i.file&&i.sync?Wbe(i):i.file?zbe(i,r):M8(i)},jbe=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},Jbe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||N8.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(N8.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},Wbe=t=>{let e=M8(t),r=t.file,i=!0,n;try{let s=zc.statSync(r),o=t.maxReadSize||16*1024*1024;if(s.size{let r=new R8(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("end",o),zc.stat(n,(l,c)=>{if(l)a(l);else{let u=new qbe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},M8=t=>new R8(t)});var H8=C((q$e,L8)=>{"use strict";var Vbe=Mc(),JE=RE(),G$e=require("fs"),T8=Wc(),O8=jE(),K8=require("path"),Y$e=L8.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=Vbe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?Xbe(i,e):i.file?Zbe(i,e,r):i.sync?_be(i,e):$be(i,e)},Xbe=(t,e)=>{let r=new JE.Sync(t),i=new T8.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(i),U8(r,e)},Zbe=(t,e,r)=>{let i=new JE(t),n=new T8.WriteStream(t.file,{mode:t.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return Ux(i,e),r?s.then(r,r):s},U8=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?O8({file:K8.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},Ux=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return O8({file:K8.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>Ux(t,e));t.add(r)}t.end()},_be=(t,e)=>{let r=new JE.Sync(t);return U8(r,e),r},$be=(t,e)=>{let r=new JE(t);return Ux(r,e),r}});var Hx=C((W$e,G8)=>{"use strict";var eDe=Mc(),Y8=RE(),j$e=If(),yn=require("fs"),q8=Wc(),j8=jE(),J8=require("path"),W8=Kc(),J$e=G8.exports=(t,e,r)=>{let i=eDe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?tDe(i,e):rDe(i,e,r)},tDe=(t,e)=>{let r=new Y8.Sync(t),i=!0,n,s;try{try{n=yn.openSync(t.file,"r+")}catch(l){if(l.code==="ENOENT")n=yn.openSync(t.file,"w+");else throw l}let o=yn.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,t.mtimeCache&&t.mtimeCache.set(l.path,l.mtime)}i=!1,iDe(t,r,s,n,e)}finally{if(i)try{yn.closeSync(n)}catch(o){}}},iDe=(t,e,r,i,n)=>{let s=new q8.WriteStreamSync(t.file,{fd:i,start:r});e.pipe(s),nDe(e,n)},rDe=(t,e,r)=>{e=Array.from(e);let i=new Y8(t),n=(o,a,l)=>{let c=(p,m)=>{p?yn.close(o,I=>l(p)):l(null,m)},u=0;if(a===0)return c(null,0);let g=0,h=Buffer.alloc(512),f=(p,m)=>{if(p)return c(p);if(g+=m,g<512&&m)return yn.read(o,h,g,h.length-g,u+g,f);if(u===0&&h[0]===31&&h[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let I=new W8(h);if(!I.cksumValid)return c(null,u);let Q=512*Math.ceil(I.size/512);if(u+Q+512>a||(u+=Q+512,u>=a))return c(null,u);t.mtimeCache&&t.mtimeCache.set(I.path,I.mtime),g=0,yn.read(o,h,0,512,u,f)};yn.read(o,h,0,512,u,f)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",yn.open(t.file,l,c);if(u)return a(u);yn.fstat(g,(h,f)=>{if(h)return a(h);n(g,f.size,(p,m)=>{if(p)return a(p);let I=new q8.WriteStream(t.file,{fd:g,start:m});i.pipe(I),I.on("error",a),I.on("close",o),z8(i,e)})})};yn.open(t.file,l,c)});return r?s.then(r,r):s},nDe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?j8({file:J8.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},z8=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return j8({file:J8.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>z8(t,e));t.add(r)}t.end()}});var X8=C((V$e,V8)=>{"use strict";var sDe=Mc(),oDe=Hx(),z$e=V8.exports=(t,e,r)=>{let i=sDe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),aDe(i),oDe(i,e,r)},aDe=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,i)=>e(r,i)&&!(t.mtimeCache.get(r)>i.mtime):(r,i)=>!(t.mtimeCache.get(r)>i.mtime)}});var $8=C((X$e,Z8)=>{var{promisify:_8}=require("util"),Ba=require("fs"),ADe=t=>{if(!t)t={mode:511,fs:Ba};else if(typeof t=="object")t=v({mode:511,fs:Ba},t);else if(typeof t=="number")t={mode:t,fs:Ba};else if(typeof t=="string")t={mode:parseInt(t,8),fs:Ba};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||Ba.mkdir,t.mkdirAsync=_8(t.mkdir),t.stat=t.stat||t.fs.stat||Ba.stat,t.statAsync=_8(t.stat),t.statSync=t.statSync||t.fs.statSync||Ba.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||Ba.mkdirSync,t};Z8.exports=ADe});var tW=C((Z$e,eW)=>{var lDe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:cDe,parse:uDe}=require("path"),gDe=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=cDe(t),lDe==="win32"){let e=/[*|"<>?:]/,{root:r}=uDe(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};eW.exports=gDe});var oW=C((_$e,rW)=>{var{dirname:iW}=require("path"),nW=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(i=>i.isDirectory()?r:void 0,i=>i.code==="ENOENT"?nW(t,iW(e),e):void 0),sW=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(i){return i.code==="ENOENT"?sW(t,iW(e),e):void 0}};rW.exports={findMade:nW,findMadeSync:sW}});var qx=C(($$e,aW)=>{var{dirname:AW}=require("path"),Gx=(t,e,r)=>{e.recursive=!1;let i=AW(t);return i===t?e.mkdirAsync(t,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(t,e).then(()=>r||t,n=>{if(n.code==="ENOENT")return Gx(i,e).then(s=>Gx(t,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(t).then(s=>{if(s.isDirectory())return r;throw n},()=>{throw n})})},Yx=(t,e,r)=>{let i=AW(t);if(e.recursive=!1,i===t)try{return e.mkdirSync(t,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(t,e),r||t}catch(n){if(n.code==="ENOENT")return Yx(t,e,Yx(i,e,r));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(t).isDirectory())throw n}catch(s){throw n}}};aW.exports={mkdirpManual:Gx,mkdirpManualSync:Yx}});var uW=C((eet,lW)=>{var{dirname:cW}=require("path"),{findMade:hDe,findMadeSync:fDe}=oW(),{mkdirpManual:pDe,mkdirpManualSync:dDe}=qx(),CDe=(t,e)=>(e.recursive=!0,cW(t)===t?e.mkdirAsync(t,e):hDe(e,t).then(i=>e.mkdirAsync(t,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return pDe(t,e);throw n}))),mDe=(t,e)=>{if(e.recursive=!0,cW(t)===t)return e.mkdirSync(t,e);let i=fDe(e,t);try{return e.mkdirSync(t,e),i}catch(n){if(n.code==="ENOENT")return dDe(t,e);throw n}};lW.exports={mkdirpNative:CDe,mkdirpNativeSync:mDe}});var pW=C((tet,gW)=>{var hW=require("fs"),IDe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,jx=IDe.replace(/^v/,"").split("."),fW=+jx[0]>10||+jx[0]==10&&+jx[1]>=12,EDe=fW?t=>t.mkdir===hW.mkdir:()=>!1,yDe=fW?t=>t.mkdirSync===hW.mkdirSync:()=>!1;gW.exports={useNative:EDe,useNativeSync:yDe}});var yW=C((ret,dW)=>{var Vc=$8(),Xc=tW(),{mkdirpNative:CW,mkdirpNativeSync:mW}=uW(),{mkdirpManual:IW,mkdirpManualSync:EW}=qx(),{useNative:BDe,useNativeSync:wDe}=pW(),Zc=(t,e)=>(t=Xc(t),e=Vc(e),BDe(e)?CW(t,e):IW(t,e)),QDe=(t,e)=>(t=Xc(t),e=Vc(e),wDe(e)?mW(t,e):EW(t,e));Zc.sync=QDe;Zc.native=(t,e)=>CW(Xc(t),Vc(e));Zc.manual=(t,e)=>IW(Xc(t),Vc(e));Zc.nativeSync=(t,e)=>mW(Xc(t),Vc(e));Zc.manualSync=(t,e)=>EW(Xc(t),Vc(e));dW.exports=Zc});var xW=C((iet,BW)=>{"use strict";var Bn=require("fs"),il=require("path"),bDe=Bn.lchown?"lchown":"chown",DDe=Bn.lchownSync?"lchownSync":"chownSync",wW=Bn.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),QW=(t,e,r)=>{try{return Bn[DDe](t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},SDe=(t,e,r)=>{try{return Bn.chownSync(t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},xDe=wW?(t,e,r,i)=>n=>{!n||n.code!=="EISDIR"?i(n):Bn.chown(t,e,r,i)}:(t,e,r,i)=>i,Jx=wW?(t,e,r)=>{try{return QW(t,e,r)}catch(i){if(i.code!=="EISDIR")throw i;SDe(t,e,r)}}:(t,e,r)=>QW(t,e,r),kDe=process.version,bW=(t,e,r)=>Bn.readdir(t,e,r),vDe=(t,e)=>Bn.readdirSync(t,e);/^v4\./.test(kDe)&&(bW=(t,e,r)=>Bn.readdir(t,r));var WE=(t,e,r,i)=>{Bn[bDe](t,e,r,xDe(t,e,r,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},DW=(t,e,r,i,n)=>{if(typeof e=="string")return Bn.lstat(il.resolve(t,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,DW(t,o,r,i,n)});if(e.isDirectory())Wx(il.resolve(t,e.name),r,i,s=>{if(s)return n(s);let o=il.resolve(t,e.name);WE(o,r,i,n)});else{let s=il.resolve(t,e.name);WE(s,r,i,n)}},Wx=(t,e,r,i)=>{bW(t,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return WE(t,e,r,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return WE(t,e,r,i)}};s.forEach(c=>DW(t,c,e,r,l))})},PDe=(t,e,r,i)=>{if(typeof e=="string")try{let n=Bn.lstatSync(il.resolve(t,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&SW(il.resolve(t,e.name),r,i),Jx(il.resolve(t,e.name),r,i)},SW=(t,e,r)=>{let i;try{i=vDe(t,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return Jx(t,e,r);throw n}return i&&i.length&&i.forEach(n=>PDe(t,n,e,r)),Jx(t,e,r)};BW.exports=Wx;Wx.sync=SW});var FW=C((oet,zx)=>{"use strict";var kW=yW(),wn=require("fs"),zE=require("path"),vW=xW(),Vx=class extends Error{constructor(e,r){super("Cannot extract through symbolic link");this.path=r,this.symlink=e}get name(){return"SylinkError"}},Ef=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'");this.path=e,this.code=r}get name(){return"CwdError"}},net=zx.exports=(t,e,r)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,h=e.cwd,f=(I,Q)=>{I?r(I):(g.set(t,!0),Q&&l?vW(Q,o,a,w=>f(w)):s?wn.chmod(t,n,r):r())};if(g&&g.get(t)===!0)return f();if(t===h)return wn.stat(t,(I,Q)=>{(I||!Q.isDirectory())&&(I=new Ef(t,I&&I.code||"ENOTDIR")),f(I)});if(c)return kW(t,{mode:n}).then(I=>f(null,I),f);let m=zE.relative(h,t).split(/\/|\\/);VE(h,m,n,g,u,h,null,f)},VE=(t,e,r,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=t+"/"+l;if(i.get(c))return VE(c,e,r,i,n,s,o,a);wn.mkdir(c,r,PW(c,e,r,i,n,s,o,a))},PW=(t,e,r,i,n,s,o,a)=>l=>{if(l){if(l.path&&zE.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new Ef(s,l.code));wn.lstat(t,(c,u)=>{if(c)a(c);else if(u.isDirectory())VE(t,e,r,i,n,s,o,a);else if(n)wn.unlink(t,g=>{if(g)return a(g);wn.mkdir(t,r,PW(t,e,r,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new Vx(t,t+"/"+e.join("/")));a(l)}})}else o=o||t,VE(t,e,r,i,n,s,o,a)},set=zx.exports.sync=(t,e)=>{let r=e.umask,i=e.mode|448,n=(i&r)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,h=I=>{u.set(t,!0),I&&a&&vW.sync(I,s,o),n&&wn.chmodSync(t,i)};if(u&&u.get(t)===!0)return h();if(t===g){let I=!1,Q="ENOTDIR";try{I=wn.statSync(t).isDirectory()}catch(w){Q=w.code}finally{if(!I)throw new Ef(t,Q)}h();return}if(l)return h(kW.sync(t,i));let p=zE.relative(g,t).split(/\/|\\/),m=null;for(let I=p.shift(),Q=g;I&&(Q+="/"+I);I=p.shift())if(!u.get(Q))try{wn.mkdirSync(Q,i),m=m||Q,u.set(Q,!0)}catch(w){if(w.path&&zE.dirname(w.path)===g&&(w.code==="ENOTDIR"||w.code==="ENOENT"))return new Ef(g,w.code);let x=wn.lstatSync(Q);if(x.isDirectory()){u.set(Q,!0);continue}else if(c){wn.unlinkSync(Q),wn.mkdirSync(Q,i),m=m||Q,u.set(Q,!0);continue}else if(x.isSymbolicLink())return new Vx(Q,Q+"/"+p.join("/"))}return h(m)}});var MW=C((aet,RW)=>{var NW=require("assert");RW.exports=()=>{let t=new Map,e=new Map,{join:r}=require("path"),i=u=>r(u).split(/[\\\/]/).slice(0,-1).reduce((g,h)=>g.length?g.concat(r(g[g.length-1],h)):[h],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(h=>t.get(h)),dirs:[...g.dirs].map(h=>t.get(h))}},o=u=>{let{paths:g,dirs:h}=s(u);return g.every(f=>f[0]===u)&&h.every(f=>f[0]instanceof Set&&f[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:h}=e.get(u),f=new Set;return g.forEach(p=>{let m=t.get(p);NW.equal(m[0],u),m.length===1?t.delete(p):(m.shift(),typeof m[0]=="function"?f.add(m[0]):m[0].forEach(I=>f.add(I)))}),h.forEach(p=>{let m=t.get(p);NW(m[0]instanceof Set),m[0].size===1&&m.length===1?t.delete(p):m[0].size===1?(m.shift(),f.add(m[0])):m[0].delete(u)}),n.delete(u),f.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let h=new Set(u.map(f=>i(f)).reduce((f,p)=>f.concat(p)));return e.set(g,{dirs:h,paths:u}),u.forEach(f=>{let p=t.get(f);p?p.push(g):t.set(f,[g])}),h.forEach(f=>{let p=t.get(f);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):t.set(f,[new Set([g])])}),a(g)}}}});var OW=C((Aet,LW)=>{var FDe=process.env.__FAKE_PLATFORM__||process.platform,RDe=FDe==="win32",NDe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:MDe,O_TRUNC:LDe,O_WRONLY:TDe,UV_FS_O_FILEMAP:TW=0}=NDe.constants,ODe=RDe&&!!TW,KDe=512*1024,UDe=TW|LDe|MDe|TDe;LW.exports=ODe?t=>t"w"});var nk=C((het,KW)=>{"use strict";var HDe=require("assert"),cet=require("events").EventEmitter,GDe=If(),vt=require("fs"),YDe=Wc(),Co=require("path"),Xx=FW(),uet=Xx.sync,UW=ux(),qDe=MW(),HW=Symbol("onEntry"),Zx=Symbol("checkFs"),GW=Symbol("checkFs2"),_x=Symbol("isReusable"),mo=Symbol("makeFs"),$x=Symbol("file"),ek=Symbol("directory"),XE=Symbol("link"),YW=Symbol("symlink"),qW=Symbol("hardlink"),jW=Symbol("unsupported"),get=Symbol("unknown"),JW=Symbol("checkPath"),_c=Symbol("mkdir"),Ei=Symbol("onError"),ZE=Symbol("pending"),WW=Symbol("pend"),$c=Symbol("unpend"),tk=Symbol("ended"),rk=Symbol("maybeClose"),ik=Symbol("skip"),yf=Symbol("doChown"),Bf=Symbol("uid"),wf=Symbol("gid"),zW=require("crypto"),VW=OW(),_E=()=>{throw new Error("sync function called cb somehow?!?")},jDe=(t,e)=>{if(process.platform!=="win32")return vt.unlink(t,e);let r=t+".DELETE."+zW.randomBytes(16).toString("hex");vt.rename(t,r,i=>{if(i)return e(i);vt.unlink(r,e)})},JDe=t=>{if(process.platform!=="win32")return vt.unlinkSync(t);let e=t+".DELETE."+zW.randomBytes(16).toString("hex");vt.renameSync(t,e),vt.unlinkSync(e)},XW=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,$E=class extends GDe{constructor(e){if(e||(e={}),e.ondone=r=>{this[tk]=!0,this[rk]()},super(e),this.reservations=qDe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[ZE]=0,this[tk]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=Co.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[HW](r))}warn(e,r,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,r,i)}[rk](){this[tk]&&this[ZE]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[JW](e){if(this.strip){let r=e.path.split(/\/|\\/);if(r.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let r=e.path;if(r.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;if(Co.win32.isAbsolute(r)){let i=Co.win32.parse(r);e.path=r.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:r})}}if(this.win32){let r=Co.win32.parse(e.path);e.path=r.root===""?UW.encode(e.path):r.root+UW.encode(e.path.substr(r.root.length))}return Co.isAbsolute(e.path)?e.absolute=e.path:e.absolute=Co.resolve(this.cwd,e.path),!0}[HW](e){if(!this[JW](e))return e.resume();switch(HDe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[Zx](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[jW](e)}}[Ei](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[$c](),r.resume())}[_c](e,r,i){Xx(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r},i)}[yf](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[Bf](e){return XW(this.uid,e.uid,this.processUid)}[wf](e){return XW(this.gid,e.gid,this.processGid)}[$x](e,r){let i=e.mode&4095||this.fmode,n=new YDe.WriteStream(e.absolute,{flags:VW(e.size),mode:i,autoClose:!1});n.on("error",l=>this[Ei](l,e));let s=1,o=l=>{if(l)return this[Ei](l,e);--s==0&&vt.close(n.fd,c=>{r(),c?this[Ei](c,e):this[$c]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,h=e.mtime;vt.futimes(u,g,h,f=>f?vt.utimes(c,g,h,p=>o(p&&f)):o())}if(this[yf](e)){s++;let g=this[Bf](e),h=this[wf](e);vt.fchown(u,g,h,f=>f?vt.chown(c,g,h,p=>o(p&&f)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[Ei](l,e)),e.pipe(a)),a.pipe(n)}[ek](e,r){let i=e.mode&4095||this.dmode;this[_c](e.absolute,i,n=>{if(n)return r(),this[Ei](n,e);let s=1,o=a=>{--s==0&&(r(),this[$c](),e.resume())};e.mtime&&!this.noMtime&&(s++,vt.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[yf](e)&&(s++,vt.chown(e.absolute,this[Bf](e),this[wf](e),o)),o()})}[jW](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[YW](e,r){this[XE](e,e.linkpath,"symlink",r)}[qW](e,r){this[XE](e,Co.resolve(this.cwd,e.linkpath),"link",r)}[WW](){this[ZE]++}[$c](){this[ZE]--,this[rk]()}[ik](e){this[$c](),e.resume()}[_x](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&process.platform!=="win32"}[Zx](e){this[WW]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,i=>this[GW](e,i))}[GW](e,r){this[_c](Co.dirname(e.absolute),this.dmode,i=>{if(i)return r(),this[Ei](i,e);vt.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[ik](e),r()):n||this[_x](e,s)?this[mo](null,e,r):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[mo](null,e,r):vt.chmod(e.absolute,e.mode,o=>this[mo](o,e,r)):vt.rmdir(e.absolute,o=>this[mo](o,e,r)):jDe(e.absolute,o=>this[mo](o,e,r))})})}[mo](e,r,i){if(e)return this[Ei](e,r);switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[$x](r,i);case"Link":return this[qW](r,i);case"SymbolicLink":return this[YW](r,i);case"Directory":case"GNUDumpDir":return this[ek](r,i)}}[XE](e,r,i,n){vt[i](r,e.absolute,s=>{if(s)return this[Ei](s,e);n(),this[$c](),e.resume()})}},ZW=class extends $E{constructor(e){super(e)}[Zx](e){let r=this[_c](Co.dirname(e.absolute),this.dmode,_E);if(r)return this[Ei](r,e);try{let i=vt.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[ik](e);if(this[_x](e,i))return this[mo](null,e,_E);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&vt.chmodSync(e.absolute,e.mode):vt.rmdirSync(e.absolute):JDe(e.absolute),this[mo](null,e,_E)}catch(n){return this[Ei](n,e)}}catch(i){return this[mo](null,e,_E)}}[$x](e,r){let i=e.mode&4095||this.fmode,n=l=>{let c;try{vt.closeSync(o)}catch(u){c=u}(l||c)&&this[Ei](l||c,e)},s,o;try{o=vt.openSync(e.absolute,VW(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[Ei](l,e)),e.pipe(a)),a.on("data",l=>{try{vt.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{vt.futimesSync(o,u,g)}catch(h){try{vt.utimesSync(e.absolute,u,g)}catch(f){c=h}}}if(this[yf](e)){let u=this[Bf](e),g=this[wf](e);try{vt.fchownSync(o,u,g)}catch(h){try{vt.chownSync(e.absolute,u,g)}catch(f){c=c||h}}}n(c)})}[ek](e,r){let i=e.mode&4095||this.dmode,n=this[_c](e.absolute,i);if(n)return this[Ei](n,e);if(e.mtime&&!this.noMtime)try{vt.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[yf](e))try{vt.chownSync(e.absolute,this[Bf](e),this[wf](e))}catch(s){}e.resume()}[_c](e,r){try{return Xx.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(i){return i}}[XE](e,r,i,n){try{vt[i+"Sync"](r,e.absolute),e.resume()}catch(s){return this[Ei](s,e)}}};$E.Sync=ZW;KW.exports=$E});var rz=C((pet,_W)=>{"use strict";var WDe=Mc(),ey=nk(),$W=require("fs"),ez=Wc(),tz=require("path"),fet=_W.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=WDe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&zDe(i,e),i.file&&i.sync?VDe(i):i.file?XDe(i,r):i.sync?ZDe(i):_De(i)},zDe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||tz.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(tz.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},VDe=t=>{let e=new ey.Sync(t),r=t.file,i=!0,n,s=$W.statSync(r),o=t.maxReadSize||16*1024*1024;new ez.ReadStreamSync(r,{readSize:o,size:s.size}).pipe(e)},XDe=(t,e)=>{let r=new ey(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("close",o),$W.stat(n,(l,c)=>{if(l)a(l);else{let u=new ez.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},ZDe=t=>new ey.Sync(t),_De=t=>new ey(t)});var iz=C(br=>{"use strict";br.c=br.create=H8();br.r=br.replace=Hx();br.t=br.list=jE();br.u=br.update=X8();br.x=br.extract=rz();br.Pack=RE();br.Unpack=nk();br.Parse=If();br.ReadEntry=hf();br.WriteEntry=mx();br.Header=Kc();br.Pax=IE();br.types=gf()});var sz=C((Cet,sk)=>{"use strict";var $De=Object.prototype.hasOwnProperty,yi="~";function Qf(){}Object.create&&(Qf.prototype=Object.create(null),new Qf().__proto__||(yi=!1));function eSe(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function nz(t,e,r,i,n){if(typeof r!="function")throw new TypeError("The listener must be a function");var s=new eSe(r,i||t,n),o=yi?yi+e:e;return t._events[o]?t._events[o].fn?t._events[o]=[t._events[o],s]:t._events[o].push(s):(t._events[o]=s,t._eventsCount++),t}function ty(t,e){--t._eventsCount==0?t._events=new Qf:delete t._events[e]}function ii(){this._events=new Qf,this._eventsCount=0}ii.prototype.eventNames=function(){var e=[],r,i;if(this._eventsCount===0)return e;for(i in r=this._events)$De.call(r,i)&&e.push(yi?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(r)):e};ii.prototype.listeners=function(e){var r=yi?yi+e:e,i=this._events[r];if(!i)return[];if(i.fn)return[i.fn];for(var n=0,s=i.length,o=new Array(s);n{"use strict";oz.exports=(t,e)=>(e=e||(()=>{}),t.then(r=>new Promise(i=>{i(e())}).then(()=>r),r=>new Promise(i=>{i(e())}).then(()=>{throw r})))});var lz=C((Iet,ry)=>{"use strict";var tSe=az(),ok=class extends Error{constructor(e){super(e);this.name="TimeoutError"}},Az=(t,e,r)=>new Promise((i,n)=>{if(typeof e!="number"||e<0)throw new TypeError("Expected `milliseconds` to be a positive number");if(e===Infinity){i(t);return}let s=setTimeout(()=>{if(typeof r=="function"){try{i(r())}catch(l){n(l)}return}let o=typeof r=="string"?r:`Promise timed out after ${e} milliseconds`,a=r instanceof Error?r:new ok(o);typeof t.cancel=="function"&&t.cancel(),n(a)},e);tSe(t.then(i,n),()=>{clearTimeout(s)})});ry.exports=Az;ry.exports.default=Az;ry.exports.TimeoutError=ok});var cz=C(ak=>{"use strict";Object.defineProperty(ak,"__esModule",{value:!0});function rSe(t,e,r){let i=0,n=t.length;for(;n>0;){let s=n/2|0,o=i+s;r(t[o],e)<=0?(i=++o,n-=s+1):n=s}return i}ak.default=rSe});var gz=C(Ak=>{"use strict";Object.defineProperty(Ak,"__esModule",{value:!0});var iSe=cz(),uz=class{constructor(){this._queue=[]}enqueue(e,r){r=Object.assign({priority:0},r);let i={priority:r.priority,run:e};if(this.size&&this._queue[this.size-1].priority>=r.priority){this._queue.push(i);return}let n=iSe.default(this._queue,i,(s,o)=>o.priority-s.priority);this._queue.splice(n,0,i)}dequeue(){let e=this._queue.shift();return e==null?void 0:e.run}filter(e){return this._queue.filter(r=>r.priority===e.priority).map(r=>r.run)}get size(){return this._queue.length}};Ak.default=uz});var pz=C(lk=>{"use strict";Object.defineProperty(lk,"__esModule",{value:!0});var nSe=sz(),hz=lz(),sSe=gz(),iy=()=>{},oSe=new hz.TimeoutError,fz=class extends nSe{constructor(e){var r,i,n,s;super();if(this._intervalCount=0,this._intervalEnd=0,this._pendingCount=0,this._resolveEmpty=iy,this._resolveIdle=iy,e=Object.assign({carryoverConcurrencyCount:!1,intervalCap:Infinity,interval:0,concurrency:Infinity,autoStart:!0,queueClass:sSe.default},e),!(typeof e.intervalCap=="number"&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(i=(r=e.intervalCap)===null||r===void 0?void 0:r.toString())!==null&&i!==void 0?i:""}\` (${typeof e.intervalCap})`);if(e.interval===void 0||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(s=(n=e.interval)===null||n===void 0?void 0:n.toString())!==null&&s!==void 0?s:""}\` (${typeof e.interval})`);this._carryoverConcurrencyCount=e.carryoverConcurrencyCount,this._isIntervalIgnored=e.intervalCap===Infinity||e.interval===0,this._intervalCap=e.intervalCap,this._interval=e.interval,this._queue=new e.queueClass,this._queueClass=e.queueClass,this.concurrency=e.concurrency,this._timeout=e.timeout,this._throwOnTimeout=e.throwOnTimeout===!0,this._isPaused=e.autoStart===!1}get _doesIntervalAllowAnother(){return this._isIntervalIgnored||this._intervalCount{this._onResumeInterval()},r)),!0}return!1}_tryToStartAnother(){if(this._queue.size===0)return this._intervalId&&clearInterval(this._intervalId),this._intervalId=void 0,this._resolvePromises(),!1;if(!this._isPaused){let e=!this._isIntervalPaused();if(this._doesIntervalAllowAnother&&this._doesConcurrentAllowAnother){let r=this._queue.dequeue();return r?(this.emit("active"),r(),e&&this._initializeIntervalIfNeeded(),!0):!1}}return!1}_initializeIntervalIfNeeded(){this._isIntervalIgnored||this._intervalId!==void 0||(this._intervalId=setInterval(()=>{this._onInterval()},this._interval),this._intervalEnd=Date.now()+this._interval)}_onInterval(){this._intervalCount===0&&this._pendingCount===0&&this._intervalId&&(clearInterval(this._intervalId),this._intervalId=void 0),this._intervalCount=this._carryoverConcurrencyCount?this._pendingCount:0,this._processQueue()}_processQueue(){for(;this._tryToStartAnother(););}get concurrency(){return this._concurrency}set concurrency(e){if(!(typeof e=="number"&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this._concurrency=e,this._processQueue()}async add(e,r={}){return new Promise((i,n)=>{let s=async()=>{this._pendingCount++,this._intervalCount++;try{let o=this._timeout===void 0&&r.timeout===void 0?e():hz.default(Promise.resolve(e()),r.timeout===void 0?this._timeout:r.timeout,()=>{(r.throwOnTimeout===void 0?this._throwOnTimeout:r.throwOnTimeout)&&n(oSe)});i(await o)}catch(o){n(o)}this._next()};this._queue.enqueue(s,r),this._tryToStartAnother(),this.emit("add")})}async addAll(e,r){return Promise.all(e.map(async i=>this.add(i,r)))}start(){return this._isPaused?(this._isPaused=!1,this._processQueue(),this):this}pause(){this._isPaused=!0}clear(){this._queue=new this._queueClass}async onEmpty(){if(this._queue.size!==0)return new Promise(e=>{let r=this._resolveEmpty;this._resolveEmpty=()=>{r(),e()}})}async onIdle(){if(!(this._pendingCount===0&&this._queue.size===0))return new Promise(e=>{let r=this._resolveIdle;this._resolveIdle=()=>{r(),e()}})}get size(){return this._queue.size}sizeBy(e){return this._queue.filter(e).length}get pending(){return this._pendingCount}get isPaused(){return this._isPaused}get timeout(){return this._timeout}set timeout(e){this._timeout=e}};lk.default=fz});var Ez=C((Qet,Iz)=>{var uk;Iz.exports.getContent=()=>(typeof uk=="undefined"&&(uk=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),uk)});var Dz=C((gk,bz)=>{(function(t,e){typeof gk=="object"?bz.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(gk,function(){function t(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function r(n,s,o,a,l,c,u){var g="",h=0,f,p,m=a.slice(0);if(m.push([s,o])&&a.length>0&&(a.forEach(function(Q,w){w>0&&(g+=(Q[1]?" ":"\u2502")+" "),!p&&Q[0]===s&&(p=!0)}),g+=t(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var I=e(s,c);I.forEach(function(Q){f=++h===I.length,r(Q,s[Q],f,m,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;r(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return r(".",n,!1,[],s,o,function(l){a+=l+` -`}),a},i})});var Fz=C((zet,pk)=>{"use strict";var fSe=t=>{let e=!1,r=!1,i=!1;for(let n=0;n{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(t)?t=t.map(n=>n.trim()).filter(n=>n.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=fSe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),r(t))};pk.exports=Pz;pk.exports.default=Pz});var yo=C(Dk=>{"use strict";Object.defineProperty(Dk,"__esModule",{value:!0});Dk.default=Kz;function Kz(){}Kz.prototype={diff:function(e,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(m){return n?(setTimeout(function(){n(void 0,m)},0),!0):m}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var a=r.length,l=e.length,c=1,u=a+l,g=[{newPos:-1,components:[]}],h=this.extractCommon(g[0],r,e,0);if(g[0].newPos+1>=a&&h+1>=l)return o([{value:this.join(r),count:r.length}]);function f(){for(var m=-1*c;m<=c;m+=2){var I=void 0,Q=g[m-1],w=g[m+1],x=(w?w.newPos:0)-m;Q&&(g[m-1]=void 0);var N=Q&&Q.newPos+1=a&&x+1>=l)return o(ESe(s,I.components,r,e,s.useLongestToken));g[m]=I}c++}if(n)(function m(){setTimeout(function(){if(c>u)return n();f()||m()},0)})();else for(;c<=u;){var p=f();if(p)return p}},pushComponent:function(e,r,i){var n=e[e.length-1];n&&n.added===r&&n.removed===i?e[e.length-1]={count:n.count+1,added:r,removed:i}:e.push({count:1,added:r,removed:i})},extractCommon:function(e,r,i,n){for(var s=r.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1f.length?m:f}),c.value=t.join(u)}else c.value=t.join(r.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var h=e[o-1];return o>1&&typeof h.value=="string"&&(h.added||h.removed)&&t.equals("",h.value)&&(e[o-2].value+=h.value,e.pop()),e}function ySe(t){return{newPos:t.newPos,components:t.components.slice(0)}}});var Hz=C(Df=>{"use strict";Object.defineProperty(Df,"__esModule",{value:!0});Df.diffChars=BSe;Df.characterDiff=void 0;var QSe=wSe(yo());function wSe(t){return t&&t.__esModule?t:{default:t}}var Uz=new QSe.default;Df.characterDiff=Uz;function BSe(t,e,r){return Uz.diff(t,e,r)}});var xk=C(Sk=>{"use strict";Object.defineProperty(Sk,"__esModule",{value:!0});Sk.generateOptions=bSe;function bSe(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}});var qz=C(iu=>{"use strict";Object.defineProperty(iu,"__esModule",{value:!0});iu.diffWords=DSe;iu.diffWordsWithSpace=SSe;iu.wordDiff=void 0;var kSe=xSe(yo()),vSe=xk();function xSe(t){return t&&t.__esModule?t:{default:t}}var Gz=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,Yz=/\S/,Sf=new kSe.default;iu.wordDiff=Sf;Sf.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!Yz.test(t)&&!Yz.test(e)};Sf.tokenize=function(t){for(var e=t.split(/(\s+|[()[\]{}'"]|\b)/),r=0;r{"use strict";Object.defineProperty(nu,"__esModule",{value:!0});nu.diffLines=PSe;nu.diffTrimmedLines=FSe;nu.lineDiff=void 0;var NSe=RSe(yo()),MSe=xk();function RSe(t){return t&&t.__esModule?t:{default:t}}var ly=new NSe.default;nu.lineDiff=ly;ly.tokenize=function(t){var e=[],r=t.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(var i=0;i{"use strict";Object.defineProperty(xf,"__esModule",{value:!0});xf.diffSentences=LSe;xf.sentenceDiff=void 0;var OSe=TSe(yo());function TSe(t){return t&&t.__esModule?t:{default:t}}var kk=new OSe.default;xf.sentenceDiff=kk;kk.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};function LSe(t,e,r){return kk.diff(t,e,r)}});var Jz=C(kf=>{"use strict";Object.defineProperty(kf,"__esModule",{value:!0});kf.diffCss=KSe;kf.cssDiff=void 0;var HSe=USe(yo());function USe(t){return t&&t.__esModule?t:{default:t}}var vk=new HSe.default;kf.cssDiff=vk;vk.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function KSe(t,e,r){return vk.diff(t,e,r)}});var zz=C(su=>{"use strict";Object.defineProperty(su,"__esModule",{value:!0});su.diffJson=GSe;su.canonicalize=uy;su.jsonDiff=void 0;var Wz=YSe(yo()),qSe=cy();function YSe(t){return t&&t.__esModule?t:{default:t}}function gy(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?gy=function(r){return typeof r}:gy=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},gy(t)}var jSe=Object.prototype.toString,nl=new Wz.default;su.jsonDiff=nl;nl.useLongestToken=!0;nl.tokenize=qSe.lineDiff.tokenize;nl.castInput=function(t){var e=this.options,r=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o=="undefined"?r:o}:i;return typeof t=="string"?t:JSON.stringify(uy(t,null,null,n),n," ")};nl.equals=function(t,e){return Wz.default.prototype.equals.call(nl,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function GSe(t,e,r){return nl.diff(t,e,r)}function uy(t,e,r,i,n){e=e||[],r=r||[],i&&(t=i(n,t));var s;for(s=0;s{"use strict";Object.defineProperty(vf,"__esModule",{value:!0});vf.diffArrays=JSe;vf.arrayDiff=void 0;var zSe=WSe(yo());function WSe(t){return t&&t.__esModule?t:{default:t}}var Pf=new zSe.default;vf.arrayDiff=Pf;Pf.tokenize=function(t){return t.slice()};Pf.join=Pf.removeEmpty=function(t){return t};function JSe(t,e,r){return Pf.diff(t,e,r)}});var hy=C(Pk=>{"use strict";Object.defineProperty(Pk,"__esModule",{value:!0});Pk.parsePatch=VSe;function VSe(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=t.split(/\r\n|[\n\v\f\r\x85]/),i=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],n=[],s=0;function o(){var c={};for(n.push(c);s{"use strict";Object.defineProperty(Fk,"__esModule",{value:!0});Fk.default=XSe;function XSe(t,e,r){var i=!0,n=!1,s=!1,o=1;return function a(){if(i&&!s){if(n?o++:i=!1,t+o<=r)return o;s=!0}if(!n)return s||(i=!0),e<=t-o?-o++:(n=!0,a())}}});var $z=C(fy=>{"use strict";Object.defineProperty(fy,"__esModule",{value:!0});fy.applyPatch=Zz;fy.applyPatches=ZSe;var _z=hy(),$Se=_Se(Xz());function _Se(t){return t&&t.__esModule?t:{default:t}}function Zz(t,e){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof e=="string"&&(e=(0,_z.parsePatch)(e)),Array.isArray(e)){if(e.length>1)throw new Error("applyPatch only works with a single input.");e=e[0]}var i=t.split(/\r\n|[\n\v\f\r\x85]/),n=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],s=e.hunks,o=r.compareLine||function(U,F,Re,xe){return F===xe},a=0,l=r.fuzzFactor||0,c=0,u=0,g,h;function f(U,F){for(var Re=0;Re0?xe[0]:" ",Me=xe.length>0?xe.substr(1):xe;if(Ke===" "||Ke==="-"){if(!o(F+1,i[F],Ke,Me)&&(a++,a>l))return!1;F++}}return!0}for(var p=0;p0?te[0]:" ",A=te.length>0?te.substr(1):te,ee=T.linedelimiters[G];if(j===" ")P++;else if(j==="-")i.splice(P,1),n.splice(P,1);else if(j==="+")i.splice(P,0,A),n.splice(P,0,ee),P++;else if(j==="\\"){var $=T.lines[G-1]?T.lines[G-1][0]:null;$==="+"?g=!0:$==="-"&&(h=!0)}}}if(g)for(;!i[i.length-1];)i.pop(),n.pop();else h&&(i.push(""),n.push(` -`));for(var _=0;_{"use strict";Object.defineProperty(Ff,"__esModule",{value:!0});Ff.structuredPatch=e5;Ff.createTwoFilesPatch=t5;Ff.createPatch=exe;var txe=cy();function Rk(t){return nxe(t)||ixe(t)||rxe()}function rxe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function ixe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function nxe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0?l(T.lines.slice(-o.context)):[],u-=h.length,g-=h.length)}(H=h).push.apply(H,Rk(N.map(function(_){return(x.added?"+":"-")+_}))),x.added?p+=N.length:f+=N.length}else{if(u)if(N.length<=o.context*2&&w=a.length-2&&N.length<=o.context){var A=/\n$/.test(r),ee=/\n$/.test(i),$=N.length==0&&h.length>j.oldLines;!A&&$&&h.splice(j.oldLines,0,"\\ No newline at end of file"),(!A&&!$||!ee)&&h.push("\\ No newline at end of file")}c.push(j),u=0,g=0,h=[]}f+=N.length,p+=N.length}},I=0;I{"use strict";Object.defineProperty(py,"__esModule",{value:!0});py.arrayEqual=sxe;py.arrayStartsWith=r5;function sxe(t,e){return t.length!==e.length?!1:r5(t,e)}function r5(t,e){if(e.length>t.length)return!1;for(var r=0;r{"use strict";Object.defineProperty(dy,"__esModule",{value:!0});dy.calcLineCount=n5;dy.merge=oxe;var axe=Nk(),Axe=hy(),Mk=i5();function ou(t){return uxe(t)||cxe(t)||lxe()}function lxe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function cxe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function uxe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e{"use strict";Object.defineProperty(Ok,"__esModule",{value:!0});Ok.convertChangesToDMP=pxe;function pxe(t){for(var e=[],r,i,n=0;n{"use strict";Object.defineProperty(Kk,"__esModule",{value:!0});Kk.convertChangesToXML=dxe;function dxe(t){for(var e=[],r=0;r"):i.removed&&e.push(""),e.push(Cxe(i.value)),i.added?e.push(""):i.removed&&e.push("")}return e.join("")}function Cxe(t){var e=t;return e=e.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/"/g,"""),e}});var y5=C(rr=>{"use strict";Object.defineProperty(rr,"__esModule",{value:!0});Object.defineProperty(rr,"Diff",{enumerable:!0,get:function(){return mxe.default}});Object.defineProperty(rr,"diffChars",{enumerable:!0,get:function(){return Ixe.diffChars}});Object.defineProperty(rr,"diffWords",{enumerable:!0,get:function(){return C5.diffWords}});Object.defineProperty(rr,"diffWordsWithSpace",{enumerable:!0,get:function(){return C5.diffWordsWithSpace}});Object.defineProperty(rr,"diffLines",{enumerable:!0,get:function(){return m5.diffLines}});Object.defineProperty(rr,"diffTrimmedLines",{enumerable:!0,get:function(){return m5.diffTrimmedLines}});Object.defineProperty(rr,"diffSentences",{enumerable:!0,get:function(){return Exe.diffSentences}});Object.defineProperty(rr,"diffCss",{enumerable:!0,get:function(){return yxe.diffCss}});Object.defineProperty(rr,"diffJson",{enumerable:!0,get:function(){return I5.diffJson}});Object.defineProperty(rr,"canonicalize",{enumerable:!0,get:function(){return I5.canonicalize}});Object.defineProperty(rr,"diffArrays",{enumerable:!0,get:function(){return Bxe.diffArrays}});Object.defineProperty(rr,"applyPatch",{enumerable:!0,get:function(){return E5.applyPatch}});Object.defineProperty(rr,"applyPatches",{enumerable:!0,get:function(){return E5.applyPatches}});Object.defineProperty(rr,"parsePatch",{enumerable:!0,get:function(){return wxe.parsePatch}});Object.defineProperty(rr,"merge",{enumerable:!0,get:function(){return Qxe.merge}});Object.defineProperty(rr,"structuredPatch",{enumerable:!0,get:function(){return Uk.structuredPatch}});Object.defineProperty(rr,"createTwoFilesPatch",{enumerable:!0,get:function(){return Uk.createTwoFilesPatch}});Object.defineProperty(rr,"createPatch",{enumerable:!0,get:function(){return Uk.createPatch}});Object.defineProperty(rr,"convertChangesToDMP",{enumerable:!0,get:function(){return bxe.convertChangesToDMP}});Object.defineProperty(rr,"convertChangesToXML",{enumerable:!0,get:function(){return Dxe.convertChangesToXML}});var mxe=Sxe(yo()),Ixe=Hz(),C5=qz(),m5=cy(),Exe=jz(),yxe=Jz(),I5=zz(),Bxe=Vz(),E5=$z(),wxe=hy(),Qxe=f5(),Uk=Nk(),bxe=p5(),Dxe=d5();function Sxe(t){return t&&t.__esModule?t:{default:t}}});var my=C((prt,B5)=>{var xxe=Cn(),kxe=oE(),vxe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,Pxe=/^\w*$/;function Fxe(t,e){if(xxe(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||kxe(t)?!0:Pxe.test(t)||!vxe.test(t)||e!=null&&t in Object(e)}B5.exports=Fxe});var qn=C((drt,w5)=>{function Rxe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}w5.exports=Rxe});var Iy=C((Crt,Q5)=>{var Nxe=YA(),Mxe=qn(),Lxe="[object AsyncFunction]",Txe="[object Function]",Oxe="[object GeneratorFunction]",Kxe="[object Proxy]";function Uxe(t){if(!Mxe(t))return!1;var e=Nxe(t);return e==Txe||e==Oxe||e==Lxe||e==Kxe}Q5.exports=Uxe});var D5=C((mrt,b5)=>{var Hxe=Hn(),Gxe=Hxe["__core-js_shared__"];b5.exports=Gxe});var k5=C((Irt,S5)=>{var Hk=D5(),x5=function(){var t=/[^.]+$/.exec(Hk&&Hk.keys&&Hk.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function Yxe(t){return!!x5&&x5 in t}S5.exports=Yxe});var Gk=C((Ert,v5)=>{var qxe=Function.prototype,jxe=qxe.toString;function Jxe(t){if(t!=null){try{return jxe.call(t)}catch(e){}try{return t+""}catch(e){}}return""}v5.exports=Jxe});var F5=C((yrt,P5)=>{var Wxe=Iy(),zxe=k5(),Vxe=qn(),Xxe=Gk(),Zxe=/[\\^$.*+?()[\]{}|]/g,_xe=/^\[object .+?Constructor\]$/,$xe=Function.prototype,eke=Object.prototype,tke=$xe.toString,rke=eke.hasOwnProperty,ike=RegExp("^"+tke.call(rke).replace(Zxe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function nke(t){if(!Vxe(t)||zxe(t))return!1;var e=Wxe(t)?ike:_xe;return e.test(Xxe(t))}P5.exports=nke});var N5=C((Brt,R5)=>{function ske(t,e){return t==null?void 0:t[e]}R5.exports=ske});var Qa=C((wrt,M5)=>{var oke=F5(),ake=N5();function Ake(t,e){var r=ake(t,e);return oke(r)?r:void 0}M5.exports=Ake});var Rf=C((Qrt,L5)=>{var lke=Qa(),cke=lke(Object,"create");L5.exports=cke});var K5=C((brt,T5)=>{var O5=Rf();function uke(){this.__data__=O5?O5(null):{},this.size=0}T5.exports=uke});var H5=C((Drt,U5)=>{function gke(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}U5.exports=gke});var Y5=C((Srt,G5)=>{var hke=Rf(),fke="__lodash_hash_undefined__",pke=Object.prototype,dke=pke.hasOwnProperty;function Cke(t){var e=this.__data__;if(hke){var r=e[t];return r===fke?void 0:r}return dke.call(e,t)?e[t]:void 0}G5.exports=Cke});var j5=C((xrt,q5)=>{var mke=Rf(),Ike=Object.prototype,Eke=Ike.hasOwnProperty;function yke(t){var e=this.__data__;return mke?e[t]!==void 0:Eke.call(e,t)}q5.exports=yke});var W5=C((krt,J5)=>{var Bke=Rf(),wke="__lodash_hash_undefined__";function Qke(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=Bke&&e===void 0?wke:e,this}J5.exports=Qke});var V5=C((vrt,z5)=>{var bke=K5(),Dke=H5(),Ske=Y5(),xke=j5(),kke=W5();function au(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{function vke(){this.__data__=[],this.size=0}X5.exports=vke});var Au=C((Frt,_5)=>{function Pke(t,e){return t===e||t!==t&&e!==e}_5.exports=Pke});var Nf=C((Rrt,$5)=>{var Fke=Au();function Rke(t,e){for(var r=t.length;r--;)if(Fke(t[r][0],e))return r;return-1}$5.exports=Rke});var t9=C((Nrt,e9)=>{var Nke=Nf(),Mke=Array.prototype,Lke=Mke.splice;function Tke(t){var e=this.__data__,r=Nke(e,t);if(r<0)return!1;var i=e.length-1;return r==i?e.pop():Lke.call(e,r,1),--this.size,!0}e9.exports=Tke});var i9=C((Mrt,r9)=>{var Oke=Nf();function Kke(t){var e=this.__data__,r=Oke(e,t);return r<0?void 0:e[r][1]}r9.exports=Kke});var s9=C((Lrt,n9)=>{var Uke=Nf();function Hke(t){return Uke(this.__data__,t)>-1}n9.exports=Hke});var a9=C((Trt,o9)=>{var Gke=Nf();function Yke(t,e){var r=this.__data__,i=Gke(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}o9.exports=Yke});var Mf=C((Ort,A9)=>{var qke=Z5(),jke=t9(),Jke=i9(),Wke=s9(),zke=a9();function lu(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var Vke=Qa(),Xke=Hn(),Zke=Vke(Xke,"Map");l9.exports=Zke});var g9=C((Urt,c9)=>{var u9=V5(),_ke=Mf(),$ke=Ey();function eve(){this.size=0,this.__data__={hash:new u9,map:new($ke||_ke),string:new u9}}c9.exports=eve});var f9=C((Hrt,h9)=>{function tve(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}h9.exports=tve});var Lf=C((Grt,p9)=>{var rve=f9();function ive(t,e){var r=t.__data__;return rve(e)?r[typeof e=="string"?"string":"hash"]:r.map}p9.exports=ive});var C9=C((Yrt,d9)=>{var nve=Lf();function sve(t){var e=nve(this,t).delete(t);return this.size-=e?1:0,e}d9.exports=sve});var I9=C((qrt,m9)=>{var ove=Lf();function ave(t){return ove(this,t).get(t)}m9.exports=ave});var y9=C((jrt,E9)=>{var Ave=Lf();function lve(t){return Ave(this,t).has(t)}E9.exports=lve});var w9=C((Jrt,B9)=>{var cve=Lf();function uve(t,e){var r=cve(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}B9.exports=uve});var yy=C((Wrt,Q9)=>{var gve=g9(),hve=C9(),fve=I9(),pve=y9(),dve=w9();function cu(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var D9=yy(),Cve="Expected a function";function Yk(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(Cve);var r=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=r.cache;if(s.has(n))return s.get(n);var o=t.apply(this,i);return r.cache=s.set(n,o)||s,o};return r.cache=new(Yk.Cache||D9),r}Yk.Cache=D9;b9.exports=Yk});var k9=C((Vrt,x9)=>{var mve=S9(),Ive=500;function Eve(t){var e=mve(t,function(i){return r.size===Ive&&r.clear(),i}),r=e.cache;return e}x9.exports=Eve});var P9=C((Xrt,v9)=>{var yve=k9(),Bve=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,wve=/\\(\\)?/g,Qve=yve(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(Bve,function(r,i,n,s){e.push(n?s.replace(wve,"$1"):i||r)}),e});v9.exports=Qve});var uu=C((Zrt,F9)=>{var bve=Cn(),Dve=my(),Sve=P9(),xve=Rc();function kve(t,e){return bve(t)?t:Dve(t,e)?[t]:Sve(xve(t))}F9.exports=kve});var ol=C((_rt,R9)=>{var vve=oE(),Pve=1/0;function Fve(t){if(typeof t=="string"||vve(t))return t;var e=t+"";return e=="0"&&1/t==-Pve?"-0":e}R9.exports=Fve});var Tf=C(($rt,N9)=>{var Rve=uu(),Nve=ol();function Mve(t,e){e=Rve(e,t);for(var r=0,i=e.length;t!=null&&r{var Lve=Qa(),Tve=function(){try{var t=Lve(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();M9.exports=Tve});var gu=C((tit,L9)=>{var T9=qk();function Ove(t,e,r){e=="__proto__"&&T9?T9(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}L9.exports=Ove});var By=C((rit,O9)=>{var Kve=gu(),Uve=Au(),Hve=Object.prototype,Gve=Hve.hasOwnProperty;function Yve(t,e,r){var i=t[e];(!(Gve.call(t,e)&&Uve(i,r))||r===void 0&&!(e in t))&&Kve(t,e,r)}O9.exports=Yve});var Of=C((iit,K9)=>{var qve=9007199254740991,jve=/^(?:0|[1-9]\d*)$/;function Jve(t,e){var r=typeof t;return e=e==null?qve:e,!!e&&(r=="number"||r!="symbol"&&jve.test(t))&&t>-1&&t%1==0&&t{var Wve=By(),zve=uu(),Vve=Of(),H9=qn(),Xve=ol();function Zve(t,e,r,i){if(!H9(t))return t;e=zve(e,t);for(var n=-1,s=e.length,o=s-1,a=t;a!=null&&++n{var _ve=Tf(),$ve=jk(),ePe=uu();function tPe(t,e,r){for(var i=-1,n=e.length,s={};++i{function rPe(t,e){return t!=null&&e in Object(t)}q9.exports=rPe});var W9=C((ait,J9)=>{var iPe=YA(),nPe=fs(),sPe="[object Arguments]";function oPe(t){return nPe(t)&&iPe(t)==sPe}J9.exports=oPe});var Kf=C((Ait,z9)=>{var V9=W9(),aPe=fs(),X9=Object.prototype,APe=X9.hasOwnProperty,lPe=X9.propertyIsEnumerable,cPe=V9(function(){return arguments}())?V9:function(t){return aPe(t)&&APe.call(t,"callee")&&!lPe.call(t,"callee")};z9.exports=cPe});var wy=C((lit,Z9)=>{var uPe=9007199254740991;function gPe(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=uPe}Z9.exports=gPe});var Jk=C((cit,_9)=>{var hPe=uu(),fPe=Kf(),pPe=Cn(),dPe=Of(),CPe=wy(),mPe=ol();function IPe(t,e,r){e=hPe(e,t);for(var i=-1,n=e.length,s=!1;++i{var EPe=j9(),yPe=Jk();function BPe(t,e){return t!=null&&yPe(t,e,EPe)}$9.exports=BPe});var t6=C((git,e6)=>{var wPe=Y9(),QPe=Wk();function bPe(t,e){return wPe(t,e,function(r,i){return QPe(t,i)})}e6.exports=bPe});var Qy=C((hit,r6)=>{function DPe(t,e){for(var r=-1,i=e.length,n=t.length;++r{var n6=GA(),SPe=Kf(),xPe=Cn(),s6=n6?n6.isConcatSpreadable:void 0;function kPe(t){return xPe(t)||SPe(t)||!!(s6&&t&&t[s6])}i6.exports=kPe});var l6=C((pit,a6)=>{var vPe=Qy(),PPe=o6();function A6(t,e,r,i,n){var s=-1,o=t.length;for(r||(r=PPe),n||(n=[]);++s0&&r(a)?e>1?A6(a,e-1,r,i,n):vPe(n,a):i||(n[n.length]=a)}return n}a6.exports=A6});var u6=C((dit,c6)=>{var FPe=l6();function RPe(t){var e=t==null?0:t.length;return e?FPe(t,1):[]}c6.exports=RPe});var h6=C((Cit,g6)=>{function NPe(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}g6.exports=NPe});var zk=C((mit,f6)=>{var MPe=h6(),p6=Math.max;function LPe(t,e,r){return e=p6(e===void 0?t.length-1:e,0),function(){for(var i=arguments,n=-1,s=p6(i.length-e,0),o=Array(s);++n{function TPe(t){return function(){return t}}d6.exports=TPe});var by=C((Eit,m6)=>{function OPe(t){return t}m6.exports=OPe});var y6=C((yit,I6)=>{var KPe=C6(),E6=qk(),UPe=by(),HPe=E6?function(t,e){return E6(t,"toString",{configurable:!0,enumerable:!1,value:KPe(e),writable:!0})}:UPe;I6.exports=HPe});var w6=C((Bit,B6)=>{var GPe=800,YPe=16,qPe=Date.now;function jPe(t){var e=0,r=0;return function(){var i=qPe(),n=YPe-(i-r);if(r=i,n>0){if(++e>=GPe)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}B6.exports=jPe});var Vk=C((wit,Q6)=>{var JPe=y6(),WPe=w6(),zPe=WPe(JPe);Q6.exports=zPe});var D6=C((Qit,b6)=>{var VPe=u6(),XPe=zk(),ZPe=Vk();function _Pe(t){return ZPe(XPe(t,void 0,VPe),t+"")}b6.exports=_Pe});var x6=C((bit,S6)=>{var $Pe=t6(),eFe=D6(),tFe=eFe(function(t,e){return t==null?{}:$Pe(t,e)});S6.exports=tFe});var K6=C((Cst,L6)=>{"use strict";var sv;try{sv=Map}catch(t){}var ov;try{ov=Set}catch(t){}function T6(t,e,r){if(!t||typeof t!="object"||typeof t=="function")return t;if(t.nodeType&&"cloneNode"in t)return t.cloneNode(!0);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t);if(Array.isArray(t))return t.map(O6);if(sv&&t instanceof sv)return new Map(Array.from(t.entries()));if(ov&&t instanceof ov)return new Set(Array.from(t.values()));if(t instanceof Object){e.push(t);var i=Object.create(t);r.push(i);for(var n in t){var s=e.findIndex(function(o){return o===t[n]});i[n]=s>-1?r[s]:T6(t[n],e,r)}return i}return t}function O6(t){return T6(t,[],[])}L6.exports=O6});var Yf=C(av=>{"use strict";Object.defineProperty(av,"__esModule",{value:!0});av.default=cFe;var uFe=Object.prototype.toString,gFe=Error.prototype.toString,hFe=RegExp.prototype.toString,fFe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",pFe=/^Symbol\((.*)\)(.*)$/;function dFe(t){return t!=+t?"NaN":t===0&&1/t<0?"-0":""+t}function U6(t,e=!1){if(t==null||t===!0||t===!1)return""+t;let r=typeof t;if(r==="number")return dFe(t);if(r==="string")return e?`"${t}"`:t;if(r==="function")return"[Function "+(t.name||"anonymous")+"]";if(r==="symbol")return fFe.call(t).replace(pFe,"Symbol($1)");let i=uFe.call(t).slice(8,-1);return i==="Date"?isNaN(t.getTime())?""+t:t.toISOString(t):i==="Error"||t instanceof Error?"["+gFe.call(t)+"]":i==="RegExp"?hFe.call(t):null}function cFe(t,e){let r=U6(t,e);return r!==null?r:JSON.stringify(t,function(i,n){let s=U6(this[i],e);return s!==null?s:n},2)}});var Bo=C(Lr=>{"use strict";Object.defineProperty(Lr,"__esModule",{value:!0});Lr.default=Lr.array=Lr.object=Lr.boolean=Lr.date=Lr.number=Lr.string=Lr.mixed=void 0;var H6=CFe(Yf());function CFe(t){return t&&t.__esModule?t:{default:t}}var G6={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:t,type:e,value:r,originalValue:i})=>{let n=i!=null&&i!==r,s=`${t} must be a \`${e}\` type, but the final value was: \`${(0,H6.default)(r,!0)}\``+(n?` (cast from the value \`${(0,H6.default)(i,!0)}\`).`:".");return r===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};Lr.mixed=G6;var Y6={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};Lr.string=Y6;var q6={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};Lr.number=q6;var j6={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};Lr.date=j6;var J6={isValue:"${path} field must be ${value}"};Lr.boolean=J6;var W6={noUnknown:"${path} field has unspecified keys: ${unknown}"};Lr.object=W6;var z6={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};Lr.array=z6;var mFe=Object.assign(Object.create(null),{mixed:G6,string:Y6,number:q6,date:j6,object:W6,array:z6,boolean:J6});Lr.default=mFe});var X6=C((Est,V6)=>{var IFe=Object.prototype,EFe=IFe.hasOwnProperty;function yFe(t,e){return t!=null&&EFe.call(t,e)}V6.exports=yFe});var qf=C((yst,Z6)=>{var BFe=X6(),wFe=Jk();function QFe(t,e){return t!=null&&wFe(t,e,BFe)}Z6.exports=QFe});var fu=C(vy=>{"use strict";Object.defineProperty(vy,"__esModule",{value:!0});vy.default=void 0;var bFe=t=>t&&t.__isYupSchema__;vy.default=bFe});var eV=C(Py=>{"use strict";Object.defineProperty(Py,"__esModule",{value:!0});Py.default=void 0;var DFe=_6(qf()),SFe=_6(fu());function _6(t){return t&&t.__esModule?t:{default:t}}var $6=class{constructor(e,r){if(this.refs=e,this.refs=e,typeof r=="function"){this.fn=r;return}if(!(0,DFe.default)(r,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!r.then&&!r.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=r,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,r){let i=this.refs.map(s=>s.getValue(r==null?void 0:r.value,r==null?void 0:r.parent,r==null?void 0:r.context)),n=this.fn.apply(e,i.concat(e,r));if(n===void 0||n===e)return e;if(!(0,SFe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(r)}},xFe=$6;Py.default=xFe});var lv=C(Av=>{"use strict";Object.defineProperty(Av,"__esModule",{value:!0});Av.default=kFe;function kFe(t){return t==null?[]:[].concat(t)}});var al=C(Fy=>{"use strict";Object.defineProperty(Fy,"__esModule",{value:!0});Fy.default=void 0;var vFe=tV(Yf()),PFe=tV(lv());function tV(t){return t&&t.__esModule?t:{default:t}}function cv(){return cv=Object.assign||function(t){for(var e=1;e(0,vFe.default)(r[s])):typeof e=="function"?e(r):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,r,i,n){super();this.name="ValidationError",this.value=r,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,PFe.default)(e).forEach(s=>{jf.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,jf)}};Fy.default=jf});var Ry=C(uv=>{"use strict";Object.defineProperty(uv,"__esModule",{value:!0});uv.default=RFe;var gv=NFe(al());function NFe(t){return t&&t.__esModule?t:{default:t}}var MFe=t=>{let e=!1;return(...r)=>{e||(e=!0,t(...r))}};function RFe(t,e){let{endEarly:r,tests:i,args:n,value:s,errors:o,sort:a,path:l}=t,c=MFe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new gv.default(o,s,l)):c(null,s);for(let h=0;h{function LFe(t){return function(e,r,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[t?a:++n];if(r(s[l],l,s)===!1)break}return e}}rV.exports=LFe});var hv=C((xst,nV)=>{var TFe=iV(),OFe=TFe();nV.exports=OFe});var oV=C((kst,sV)=>{function KFe(t,e){for(var r=-1,i=Array(t);++r{function UFe(){return!1}aV.exports=UFe});var Wf=C((Jf,pu)=>{var HFe=Hn(),GFe=AV(),lV=typeof Jf=="object"&&Jf&&!Jf.nodeType&&Jf,cV=lV&&typeof pu=="object"&&pu&&!pu.nodeType&&pu,YFe=cV&&cV.exports===lV,uV=YFe?HFe.Buffer:void 0,qFe=uV?uV.isBuffer:void 0,jFe=qFe||GFe;pu.exports=jFe});var hV=C((Pst,gV)=>{var JFe=YA(),WFe=wy(),zFe=fs(),VFe="[object Arguments]",XFe="[object Array]",ZFe="[object Boolean]",_Fe="[object Date]",$Fe="[object Error]",eRe="[object Function]",tRe="[object Map]",rRe="[object Number]",iRe="[object Object]",nRe="[object RegExp]",sRe="[object Set]",oRe="[object String]",aRe="[object WeakMap]",ARe="[object ArrayBuffer]",lRe="[object DataView]",cRe="[object Float32Array]",uRe="[object Float64Array]",gRe="[object Int8Array]",hRe="[object Int16Array]",fRe="[object Int32Array]",pRe="[object Uint8Array]",dRe="[object Uint8ClampedArray]",CRe="[object Uint16Array]",mRe="[object Uint32Array]",qt={};qt[cRe]=qt[uRe]=qt[gRe]=qt[hRe]=qt[fRe]=qt[pRe]=qt[dRe]=qt[CRe]=qt[mRe]=!0;qt[VFe]=qt[XFe]=qt[ARe]=qt[ZFe]=qt[lRe]=qt[_Fe]=qt[$Fe]=qt[eRe]=qt[tRe]=qt[rRe]=qt[iRe]=qt[nRe]=qt[sRe]=qt[oRe]=qt[aRe]=!1;function IRe(t){return zFe(t)&&WFe(t.length)&&!!qt[JFe(t)]}gV.exports=IRe});var Ny=C((Fst,fV)=>{function ERe(t){return function(e){return t(e)}}fV.exports=ERe});var My=C((zf,du)=>{var yRe=TS(),pV=typeof zf=="object"&&zf&&!zf.nodeType&&zf,Vf=pV&&typeof du=="object"&&du&&!du.nodeType&&du,BRe=Vf&&Vf.exports===pV,fv=BRe&&yRe.process,wRe=function(){try{var t=Vf&&Vf.require&&Vf.require("util").types;return t||fv&&fv.binding&&fv.binding("util")}catch(e){}}();du.exports=wRe});var Ly=C((Rst,dV)=>{var QRe=hV(),bRe=Ny(),CV=My(),mV=CV&&CV.isTypedArray,DRe=mV?bRe(mV):QRe;dV.exports=DRe});var pv=C((Nst,IV)=>{var SRe=oV(),xRe=Kf(),kRe=Cn(),vRe=Wf(),PRe=Of(),FRe=Ly(),RRe=Object.prototype,NRe=RRe.hasOwnProperty;function MRe(t,e){var r=kRe(t),i=!r&&xRe(t),n=!r&&!i&&vRe(t),s=!r&&!i&&!n&&FRe(t),o=r||i||n||s,a=o?SRe(t.length,String):[],l=a.length;for(var c in t)(e||NRe.call(t,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||PRe(c,l)))&&a.push(c);return a}IV.exports=MRe});var Ty=C((Mst,EV)=>{var LRe=Object.prototype;function TRe(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||LRe;return t===r}EV.exports=TRe});var dv=C((Lst,yV)=>{function ORe(t,e){return function(r){return t(e(r))}}yV.exports=ORe});var wV=C((Tst,BV)=>{var KRe=dv(),URe=KRe(Object.keys,Object);BV.exports=URe});var bV=C((Ost,QV)=>{var HRe=Ty(),GRe=wV(),YRe=Object.prototype,qRe=YRe.hasOwnProperty;function jRe(t){if(!HRe(t))return GRe(t);var e=[];for(var r in Object(t))qRe.call(t,r)&&r!="constructor"&&e.push(r);return e}QV.exports=jRe});var Xf=C((Kst,DV)=>{var JRe=Iy(),WRe=wy();function zRe(t){return t!=null&&WRe(t.length)&&!JRe(t)}DV.exports=zRe});var Cu=C((Ust,SV)=>{var VRe=pv(),XRe=bV(),ZRe=Xf();function _Re(t){return ZRe(t)?VRe(t):XRe(t)}SV.exports=_Re});var Cv=C((Hst,xV)=>{var $Re=hv(),eNe=Cu();function tNe(t,e){return t&&$Re(t,e,eNe)}xV.exports=tNe});var vV=C((Gst,kV)=>{var rNe=Mf();function iNe(){this.__data__=new rNe,this.size=0}kV.exports=iNe});var FV=C((Yst,PV)=>{function nNe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}PV.exports=nNe});var NV=C((qst,RV)=>{function sNe(t){return this.__data__.get(t)}RV.exports=sNe});var LV=C((jst,MV)=>{function oNe(t){return this.__data__.has(t)}MV.exports=oNe});var OV=C((Jst,TV)=>{var aNe=Mf(),ANe=Ey(),lNe=yy(),cNe=200;function uNe(t,e){var r=this.__data__;if(r instanceof aNe){var i=r.__data__;if(!ANe||i.length{var gNe=Mf(),hNe=vV(),fNe=FV(),pNe=NV(),dNe=LV(),CNe=OV();function mu(t){var e=this.__data__=new gNe(t);this.size=e.size}mu.prototype.clear=hNe;mu.prototype.delete=fNe;mu.prototype.get=pNe;mu.prototype.has=dNe;mu.prototype.set=CNe;KV.exports=mu});var HV=C((zst,UV)=>{var mNe="__lodash_hash_undefined__";function INe(t){return this.__data__.set(t,mNe),this}UV.exports=INe});var YV=C((Vst,GV)=>{function ENe(t){return this.__data__.has(t)}GV.exports=ENe});var jV=C((Xst,qV)=>{var yNe=yy(),BNe=HV(),wNe=YV();function Oy(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new yNe;++e{function QNe(t,e){for(var r=-1,i=t==null?0:t.length;++r{function bNe(t,e){return t.has(e)}zV.exports=bNe});var mv=C(($st,XV)=>{var DNe=jV(),SNe=WV(),xNe=VV(),kNe=1,vNe=2;function PNe(t,e,r,i,n,s){var o=r&kNe,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(t),u=s.get(e);if(c&&u)return c==e&&u==t;var g=-1,h=!0,f=r&vNe?new DNe:void 0;for(s.set(t,e),s.set(e,t);++g{var FNe=Hn(),RNe=FNe.Uint8Array;ZV.exports=RNe});var $V=C((tot,_V)=>{function NNe(t){var e=-1,r=Array(t.size);return t.forEach(function(i,n){r[++e]=[n,i]}),r}_V.exports=NNe});var t7=C((rot,e7)=>{function MNe(t){var e=-1,r=Array(t.size);return t.forEach(function(i){r[++e]=i}),r}e7.exports=MNe});var o7=C((iot,r7)=>{var i7=GA(),n7=Iv(),LNe=Au(),TNe=mv(),ONe=$V(),KNe=t7(),UNe=1,HNe=2,GNe="[object Boolean]",YNe="[object Date]",qNe="[object Error]",jNe="[object Map]",JNe="[object Number]",WNe="[object RegExp]",zNe="[object Set]",VNe="[object String]",XNe="[object Symbol]",ZNe="[object ArrayBuffer]",_Ne="[object DataView]",s7=i7?i7.prototype:void 0,Ev=s7?s7.valueOf:void 0;function $Ne(t,e,r,i,n,s,o){switch(r){case _Ne:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ZNe:return!(t.byteLength!=e.byteLength||!s(new n7(t),new n7(e)));case GNe:case YNe:case JNe:return LNe(+t,+e);case qNe:return t.name==e.name&&t.message==e.message;case WNe:case VNe:return t==e+"";case jNe:var a=ONe;case zNe:var l=i&UNe;if(a||(a=KNe),t.size!=e.size&&!l)return!1;var c=o.get(t);if(c)return c==e;i|=HNe,o.set(t,e);var u=TNe(a(t),a(e),i,n,s,o);return o.delete(t),u;case XNe:if(Ev)return Ev.call(t)==Ev.call(e)}return!1}r7.exports=$Ne});var yv=C((not,a7)=>{var eMe=Qy(),tMe=Cn();function rMe(t,e,r){var i=e(t);return tMe(t)?i:eMe(i,r(t))}a7.exports=rMe});var l7=C((sot,A7)=>{function iMe(t,e){for(var r=-1,i=t==null?0:t.length,n=0,s=[];++r{function nMe(){return[]}c7.exports=nMe});var Ky=C((aot,u7)=>{var sMe=l7(),oMe=Bv(),aMe=Object.prototype,AMe=aMe.propertyIsEnumerable,g7=Object.getOwnPropertySymbols,lMe=g7?function(t){return t==null?[]:(t=Object(t),sMe(g7(t),function(e){return AMe.call(t,e)}))}:oMe;u7.exports=lMe});var wv=C((Aot,h7)=>{var cMe=yv(),uMe=Ky(),gMe=Cu();function hMe(t){return cMe(t,gMe,uMe)}h7.exports=hMe});var d7=C((lot,f7)=>{var p7=wv(),fMe=1,pMe=Object.prototype,dMe=pMe.hasOwnProperty;function CMe(t,e,r,i,n,s){var o=r&fMe,a=p7(t),l=a.length,c=p7(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var h=a[g];if(!(o?h in e:dMe.call(e,h)))return!1}var f=s.get(t),p=s.get(e);if(f&&p)return f==e&&p==t;var m=!0;s.set(t,e),s.set(e,t);for(var I=o;++g{var mMe=Qa(),IMe=Hn(),EMe=mMe(IMe,"DataView");C7.exports=EMe});var E7=C((uot,I7)=>{var yMe=Qa(),BMe=Hn(),wMe=yMe(BMe,"Promise");I7.exports=wMe});var B7=C((got,y7)=>{var QMe=Qa(),bMe=Hn(),DMe=QMe(bMe,"Set");y7.exports=DMe});var Q7=C((hot,w7)=>{var SMe=Qa(),xMe=Hn(),kMe=SMe(xMe,"WeakMap");w7.exports=kMe});var _f=C((fot,b7)=>{var Qv=m7(),bv=Ey(),Dv=E7(),Sv=B7(),xv=Q7(),D7=YA(),Iu=Gk(),S7="[object Map]",vMe="[object Object]",x7="[object Promise]",k7="[object Set]",v7="[object WeakMap]",P7="[object DataView]",PMe=Iu(Qv),FMe=Iu(bv),RMe=Iu(Dv),NMe=Iu(Sv),MMe=Iu(xv),Al=D7;(Qv&&Al(new Qv(new ArrayBuffer(1)))!=P7||bv&&Al(new bv)!=S7||Dv&&Al(Dv.resolve())!=x7||Sv&&Al(new Sv)!=k7||xv&&Al(new xv)!=v7)&&(Al=function(t){var e=D7(t),r=e==vMe?t.constructor:void 0,i=r?Iu(r):"";if(i)switch(i){case PMe:return P7;case FMe:return S7;case RMe:return x7;case NMe:return k7;case MMe:return v7}return e});b7.exports=Al});var K7=C((pot,F7)=>{var kv=Zf(),LMe=mv(),TMe=o7(),OMe=d7(),R7=_f(),N7=Cn(),M7=Wf(),KMe=Ly(),UMe=1,L7="[object Arguments]",T7="[object Array]",Uy="[object Object]",HMe=Object.prototype,O7=HMe.hasOwnProperty;function GMe(t,e,r,i,n,s){var o=N7(t),a=N7(e),l=o?T7:R7(t),c=a?T7:R7(e);l=l==L7?Uy:l,c=c==L7?Uy:c;var u=l==Uy,g=c==Uy,h=l==c;if(h&&M7(t)){if(!M7(e))return!1;o=!0,u=!1}if(h&&!u)return s||(s=new kv),o||KMe(t)?LMe(t,e,r,i,n,s):TMe(t,e,l,r,i,n,s);if(!(r&UMe)){var f=u&&O7.call(t,"__wrapped__"),p=g&&O7.call(e,"__wrapped__");if(f||p){var m=f?t.value():t,I=p?e.value():e;return s||(s=new kv),n(m,I,r,i,s)}}return h?(s||(s=new kv),OMe(t,e,r,i,n,s)):!1}F7.exports=GMe});var vv=C((dot,U7)=>{var YMe=K7(),H7=fs();function G7(t,e,r,i,n){return t===e?!0:t==null||e==null||!H7(t)&&!H7(e)?t!==t&&e!==e:YMe(t,e,r,i,G7,n)}U7.exports=G7});var q7=C((Cot,Y7)=>{var qMe=Zf(),jMe=vv(),JMe=1,WMe=2;function zMe(t,e,r,i){var n=r.length,s=n,o=!i;if(t==null)return!s;for(t=Object(t);n--;){var a=r[n];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++n{var VMe=qn();function XMe(t){return t===t&&!VMe(t)}j7.exports=XMe});var W7=C((Iot,J7)=>{var ZMe=Pv(),_Me=Cu();function $Me(t){for(var e=_Me(t),r=e.length;r--;){var i=e[r],n=t[i];e[r]=[i,n,ZMe(n)]}return e}J7.exports=$Me});var Fv=C((Eot,z7)=>{function eLe(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}z7.exports=eLe});var X7=C((yot,V7)=>{var tLe=q7(),rLe=W7(),iLe=Fv();function nLe(t){var e=rLe(t);return e.length==1&&e[0][2]?iLe(e[0][0],e[0][1]):function(r){return r===t||tLe(r,t,e)}}V7.exports=nLe});var Hy=C((Bot,Z7)=>{var sLe=Tf();function oLe(t,e,r){var i=t==null?void 0:sLe(t,e);return i===void 0?r:i}Z7.exports=oLe});var $7=C((wot,_7)=>{var aLe=vv(),ALe=Hy(),lLe=Wk(),cLe=my(),uLe=Pv(),gLe=Fv(),hLe=ol(),fLe=1,pLe=2;function dLe(t,e){return cLe(t)&&uLe(e)?gLe(hLe(t),e):function(r){var i=ALe(r,t);return i===void 0&&i===e?lLe(r,t):aLe(e,i,fLe|pLe)}}_7.exports=dLe});var tX=C((Qot,eX)=>{function CLe(t){return function(e){return e==null?void 0:e[t]}}eX.exports=CLe});var iX=C((bot,rX)=>{var mLe=Tf();function ILe(t){return function(e){return mLe(e,t)}}rX.exports=ILe});var sX=C((Dot,nX)=>{var ELe=tX(),yLe=iX(),BLe=my(),wLe=ol();function QLe(t){return BLe(t)?ELe(wLe(t)):yLe(t)}nX.exports=QLe});var Rv=C((Sot,oX)=>{var bLe=X7(),DLe=$7(),SLe=by(),xLe=Cn(),kLe=sX();function vLe(t){return typeof t=="function"?t:t==null?SLe:typeof t=="object"?xLe(t)?DLe(t[0],t[1]):bLe(t):kLe(t)}oX.exports=vLe});var Nv=C((xot,aX)=>{var PLe=gu(),FLe=Cv(),RLe=Rv();function NLe(t,e){var r={};return e=RLe(e,3),FLe(t,function(i,n,s){PLe(r,n,e(i,n,s))}),r}aX.exports=NLe});var $f=C((kot,AX)=>{"use strict";function ll(t){this._maxSize=t,this.clear()}ll.prototype.clear=function(){this._size=0,this._values=Object.create(null)};ll.prototype.get=function(t){return this._values[t]};ll.prototype.set=function(t,e){return this._size>=this._maxSize&&this.clear(),t in this._values||this._size++,this._values[t]=e};var MLe=/[^.^\]^[]+|(?=\[\]|\.\.)/g,lX=/^\d+$/,LLe=/^\d/,TLe=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,OLe=/^\s*(['"]?)(.*?)(\1)\s*$/,Mv=512,cX=new ll(Mv),uX=new ll(Mv),gX=new ll(Mv);AX.exports={Cache:ll,split:Tv,normalizePath:Lv,setter:function(t){var e=Lv(t);return uX.get(t)||uX.set(t,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(ep,"__esModule",{value:!0});ep.create=YLe;ep.default=void 0;var qLe=$f(),Gy={context:"$",value:"."};function YLe(t,e){return new Yy(t,e)}var Yy=class{constructor(e,r={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===Gy.context,this.isValue=this.key[0]===Gy.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?Gy.context:this.isValue?Gy.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,qLe.getter)(this.path,!0),this.map=r.map}getValue(e,r,i){let n=this.isContext?i:this.isValue?e:r;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,r){return this.getValue(e,r==null?void 0:r.parent,r==null?void 0:r.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};ep.default=Yy;Yy.prototype.__isYupRef=!0});var hX=C(Kv=>{"use strict";Object.defineProperty(Kv,"__esModule",{value:!0});Kv.default=jLe;var JLe=Uv(Nv()),qy=Uv(al()),WLe=Uv(cl());function Uv(t){return t&&t.__esModule?t:{default:t}}function jy(){return jy=Object.assign||function(t){for(var e=1;e=0)&&(r[n]=t[n]);return r}function jLe(t){function e(r,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=r,u=zLe(r,["value","path","label","options","originalValue","sync"]),{name:g,test:h,params:f,message:p}=t,{parent:m,context:I}=a;function Q(T){return WLe.default.isRef(T)?T.getValue(n,m,I):T}function w(T={}){let P=(0,JLe.default)(jy({value:n,originalValue:l,label:o,path:T.path||s},f,T.params),Q),G=new qy.default(qy.default.formatError(T.message||p,P),n,P.path,T.type||g);return G.params=P,G}let x=jy({path:s,parent:m,type:g,createError:w,resolve:Q,options:a,originalValue:l},u);if(!c){try{Promise.resolve(h.call(x,n,x)).then(T=>{qy.default.isError(T)?i(T):T?i(null,T):i(w())})}catch(T){i(T)}return}let N;try{var H;if(N=h.call(x,n,x),typeof((H=N)==null?void 0:H.then)=="function")throw new Error(`Validation test of type: "${x.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(T){i(T);return}qy.default.isError(N)?i(N):N?i(null,N):i(w())}return e.OPTIONS=t,e}});var Hv=C(tp=>{"use strict";Object.defineProperty(tp,"__esModule",{value:!0});tp.getIn=fX;tp.default=void 0;var VLe=$f(),XLe=t=>t.substr(0,t.length-1).substr(1);function fX(t,e,r,i=r){let n,s,o;return e?((0,VLe.forEach)(e,(a,l,c)=>{let u=l?XLe(a):a;if(t=t.resolve({context:i,parent:n,value:r}),t.innerType){let g=c?parseInt(u,10):0;if(r&&g>=r.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=r,r=r&&r[g],t=t.innerType}if(!c){if(!t.fields||!t.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${t._type}")`);n=r,r=r&&r[u],t=t.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:t,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:t}}var ZLe=(t,e,r,i)=>fX(t,e,r,i).schema,_Le=ZLe;tp.default=_Le});var dX=C(Jy=>{"use strict";Object.defineProperty(Jy,"__esModule",{value:!0});Jy.default=void 0;var pX=$Le(cl());function $Le(t){return t&&t.__esModule?t:{default:t}}var Wy=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let r of this.list)e.push(r);for(let[,r]of this.refs)e.push(r.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){pX.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){pX.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,r){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(r(i.value)===e)return!0;return!1}clone(){let e=new Wy;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,r){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),r.list.forEach(n=>i.delete(n)),r.refs.forEach(n=>i.delete(n)),i}};Jy.default=Wy});var Qo=C(zy=>{"use strict";Object.defineProperty(zy,"__esModule",{value:!0});zy.default=void 0;var CX=wo(K6()),Eu=Bo(),eTe=wo(eV()),mX=wo(Ry()),Vy=wo(hX()),IX=wo(Yf()),tTe=wo(cl()),rTe=Hv(),iTe=wo(lv()),EX=wo(al()),yX=wo(dX());function wo(t){return t&&t.__esModule?t:{default:t}}function Qn(){return Qn=Object.assign||function(t){for(var e=1;e{this.typeError(Eu.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=Qn({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let r=Object.create(Object.getPrototypeOf(this));return r.type=this.type,r._typeError=this._typeError,r._whitelistError=this._whitelistError,r._blacklistError=this._blacklistError,r._whitelist=this._whitelist.clone(),r._blacklist=this._blacklist.clone(),r.exclusiveTests=Qn({},this.exclusiveTests),r.deps=[...this.deps],r.conditions=[...this.conditions],r.tests=[...this.tests],r.transforms=[...this.transforms],r.spec=(0,CX.default)(Qn({},this.spec,e)),r}label(e){var r=this.clone();return r.spec.label=e,r}meta(...e){if(e.length===0)return this.spec.meta;let r=this.clone();return r.spec.meta=Object.assign(r.spec.meta||{},e[0]),r}withMutation(e){let r=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=r,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let r=this,i=e.clone(),n=Qn({},r.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=r._typeError),i._whitelistError||(i._whitelistError=r._whitelistError),i._blacklistError||(i._blacklistError=r._blacklistError),i._whitelist=r._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=r._blacklist.merge(e._blacklist,e._whitelist),i.tests=r.tests,i.exclusiveTests=r.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let r=this;if(r.conditions.length){let i=r.conditions;r=r.clone(),r.conditions=[],r=i.reduce((n,s)=>s.resolve(n,e),r),r=r.resolve(e)}return r}cast(e,r={}){let i=this.resolve(Qn({value:e},r)),n=i._cast(e,r);if(e!==void 0&&r.assert!==!1&&i.isType(n)!==!0){let s=(0,IX.default)(e),o=(0,IX.default)(n);throw new TypeError(`The value of ${r.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". - -attempted value: ${s} -`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,r){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,r={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=r,u=e;l||(u=this._cast(u,Qn({assert:!1},r)));let g={value:u,path:s,options:r,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},h=[];this._typeError&&h.push(this._typeError),this._whitelistError&&h.push(this._whitelistError),this._blacklistError&&h.push(this._blacklistError),(0,mX.default)({args:g,value:u,path:s,sync:n,tests:h,endEarly:c},f=>{if(f)return void i(f,u);(0,mX.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,r,i){let n=this.resolve(Qn({},r,{value:e}));return typeof i=="function"?n._validate(e,r,i):new Promise((s,o)=>n._validate(e,r,(a,l)=>{a?o(a):s(l)}))}validateSync(e,r){let i=this.resolve(Qn({},r,{value:e})),n;return i._validate(e,Qn({},r,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,r){return this.validate(e,r).then(()=>!0,i=>{if(EX.default.isError(i))return!1;throw i})}isValidSync(e,r){try{return this.validateSync(e,r),!0}catch(i){if(EX.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,CX.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var r=this.clone();return r.spec.strict=e,r}_isPresent(e){return e!=null}defined(e=Eu.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(r){return r!==void 0}})}required(e=Eu.mixed.required){return this.clone({presence:"required"}).withMutation(r=>r.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(r=>r.OPTIONS.name!=="required"),e}nullable(e=!0){var r=this.clone({nullable:e!==!1});return r}transform(e){var r=this.clone();return r.transforms.push(e),r}test(...e){let r;if(e.length===1?typeof e[0]=="function"?r={test:e[0]}:r=e[0]:e.length===2?r={name:e[0],test:e[1]}:r={name:e[0],message:e[1],test:e[2]},r.message===void 0&&(r.message=Eu.mixed.default),typeof r.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,Vy.default)(r),s=r.exclusive||r.name&&i.exclusiveTests[r.name]===!0;if(r.exclusive&&!r.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return r.name&&(i.exclusiveTests[r.name]=!!r.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===r.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,r){!Array.isArray(e)&&typeof e!="string"&&(r=e,e=".");let i=this.clone(),n=(0,iTe.default)(e).map(s=>new tTe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new eTe.default(n,r)),i}typeError(e){var r=this.clone();return r._typeError=(0,Vy.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),r}oneOf(e,r=Eu.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,Vy.default)({message:r,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,r=Eu.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,Vy.default)({message:r,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let r=this.clone();return r.spec.strip=e,r}describe(){let e=this.clone(),{label:r,meta:i}=e.spec;return{meta:i,label:r,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};zy.default=ws;ws.prototype.__isYupSchema__=!0;for(let t of["validate","validateSync"])ws.prototype[`${t}At`]=function(e,r,i={}){let{parent:n,parentPath:s,schema:o}=(0,rTe.getIn)(this,e,r,i.context);return o[t](n&&n[s],Qn({},i,{parent:n,path:e}))};for(let t of["equals","is"])ws.prototype[t]=ws.prototype.oneOf;for(let t of["not","nope"])ws.prototype[t]=ws.prototype.notOneOf;ws.prototype.optional=ws.prototype.notRequired});var wX=C(rp=>{"use strict";Object.defineProperty(rp,"__esModule",{value:!0});rp.create=BX;rp.default=void 0;var sTe=nTe(Qo());function nTe(t){return t&&t.__esModule?t:{default:t}}var Gv=sTe.default,oTe=Gv;rp.default=oTe;function BX(){return new Gv}BX.prototype=Gv.prototype});var yu=C(Xy=>{"use strict";Object.defineProperty(Xy,"__esModule",{value:!0});Xy.default=void 0;var aTe=t=>t==null;Xy.default=aTe});var xX=C(ip=>{"use strict";Object.defineProperty(ip,"__esModule",{value:!0});ip.create=QX;ip.default=void 0;var ATe=bX(Qo()),DX=Bo(),SX=bX(yu());function bX(t){return t&&t.__esModule?t:{default:t}}function QX(){return new Zy}var Zy=class extends ATe.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=DX.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(r){return(0,SX.default)(r)||r===!0}})}isFalse(e=DX.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(r){return(0,SX.default)(r)||r===!1}})}};ip.default=Zy;QX.prototype=Zy.prototype});var PX=C(np=>{"use strict";Object.defineProperty(np,"__esModule",{value:!0});np.create=kX;np.default=void 0;var Qs=Bo(),bo=vX(yu()),lTe=vX(Qo());function vX(t){return t&&t.__esModule?t:{default:t}}var cTe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,uTe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,gTe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,hTe=t=>(0,bo.default)(t)||t===t.trim(),fTe={}.toString();function kX(){return new _y}var _y=class extends lTe.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let r=e!=null&&e.toString?e.toString():e;return r===fTe?e:r})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,r=Qs.string.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,bo.default)(i)||i.length===this.resolve(e)}})}min(e,r=Qs.string.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,bo.default)(i)||i.length>=this.resolve(e)}})}max(e,r=Qs.string.max){return this.test({name:"max",exclusive:!0,message:r,params:{max:e},test(i){return(0,bo.default)(i)||i.length<=this.resolve(e)}})}matches(e,r){let i=!1,n,s;return r&&(typeof r=="object"?{excludeEmptyString:i=!1,message:n,name:s}=r:n=r),this.test({name:s||"matches",message:n||Qs.string.matches,params:{regex:e},test:o=>(0,bo.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=Qs.string.email){return this.matches(cTe,{name:"email",message:e,excludeEmptyString:!0})}url(e=Qs.string.url){return this.matches(uTe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=Qs.string.uuid){return this.matches(gTe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=Qs.string.trim){return this.transform(r=>r!=null?r.trim():r).test({message:e,name:"trim",test:hTe})}lowercase(e=Qs.string.lowercase){return this.transform(r=>(0,bo.default)(r)?r:r.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,bo.default)(r)||r===r.toLowerCase()})}uppercase(e=Qs.string.uppercase){return this.transform(r=>(0,bo.default)(r)?r:r.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,bo.default)(r)||r===r.toUpperCase()})}};np.default=_y;kX.prototype=_y.prototype});var NX=C(sp=>{"use strict";Object.defineProperty(sp,"__esModule",{value:!0});sp.create=FX;sp.default=void 0;var ul=Bo(),gl=RX(yu()),pTe=RX(Qo());function RX(t){return t&&t.__esModule?t:{default:t}}var dTe=t=>t!=+t;function FX(){return new $y}var $y=class extends pTe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let r=e;if(typeof r=="string"){if(r=r.replace(/\s/g,""),r==="")return NaN;r=+r}return this.isType(r)?r:parseFloat(r)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!dTe(e)}min(e,r=ul.number.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,gl.default)(i)||i>=this.resolve(e)}})}max(e,r=ul.number.max){return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,gl.default)(i)||i<=this.resolve(e)}})}lessThan(e,r=ul.number.lessThan){return this.test({message:r,name:"max",exclusive:!0,params:{less:e},test(i){return(0,gl.default)(i)||ithis.resolve(e)}})}positive(e=ul.number.positive){return this.moreThan(0,e)}negative(e=ul.number.negative){return this.lessThan(0,e)}integer(e=ul.number.integer){return this.test({name:"integer",message:e,test:r=>(0,gl.default)(r)||Number.isInteger(r)})}truncate(){return this.transform(e=>(0,gl.default)(e)?e:e|0)}round(e){var r,i=["ceil","floor","round","trunc"];if(e=((r=e)==null?void 0:r.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,gl.default)(n)?n:Math[e](n))}};sp.default=$y;FX.prototype=$y.prototype});var MX=C(Yv=>{"use strict";Object.defineProperty(Yv,"__esModule",{value:!0});Yv.default=CTe;var mTe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function CTe(t){var e=[1,4,5,6,7,10,11],r=0,i,n;if(n=mTe.exec(t)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(r=n[10]*60+n[11],n[9]==="+"&&(r=0-r)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+r,n[6],n[7]))}else i=Date.parse?Date.parse(t):NaN;return i}});var OX=C(op=>{"use strict";Object.defineProperty(op,"__esModule",{value:!0});op.create=qv;op.default=void 0;var ITe=eB(MX()),LX=Bo(),TX=eB(yu()),ETe=eB(cl()),yTe=eB(Qo());function eB(t){return t&&t.__esModule?t:{default:t}}var jv=new Date(""),BTe=t=>Object.prototype.toString.call(t)==="[object Date]";function qv(){return new ap}var ap=class extends yTe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,ITe.default)(e),isNaN(e)?jv:new Date(e))})})}_typeCheck(e){return BTe(e)&&!isNaN(e.getTime())}prepareParam(e,r){let i;if(ETe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${r}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,r=LX.date.min){let i=this.prepareParam(e,"min");return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(n){return(0,TX.default)(n)||n>=this.resolve(i)}})}max(e,r=LX.date.max){var i=this.prepareParam(e,"max");return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(n){return(0,TX.default)(n)||n<=this.resolve(i)}})}};op.default=ap;ap.INVALID_DATE=jv;qv.prototype=ap.prototype;qv.INVALID_DATE=jv});var UX=C((Got,KX)=>{function wTe(t,e,r,i){var n=-1,s=t==null?0:t.length;for(i&&s&&(r=t[++n]);++n{function QTe(t){return function(e){return t==null?void 0:t[e]}}HX.exports=QTe});var qX=C((qot,YX)=>{var bTe=GX(),DTe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},STe=bTe(DTe);YX.exports=STe});var JX=C((jot,jX)=>{var xTe=qX(),kTe=Rc(),vTe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,PTe="\\u0300-\\u036f",FTe="\\ufe20-\\ufe2f",RTe="\\u20d0-\\u20ff",NTe=PTe+FTe+RTe,MTe="["+NTe+"]",LTe=RegExp(MTe,"g");function TTe(t){return t=kTe(t),t&&t.replace(vTe,xTe).replace(LTe,"")}jX.exports=TTe});var zX=C((Jot,WX)=>{var OTe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function KTe(t){return t.match(OTe)||[]}WX.exports=KTe});var XX=C((Wot,VX)=>{var UTe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function HTe(t){return UTe.test(t)}VX.exports=HTe});var pZ=C((zot,ZX)=>{var _X="\\ud800-\\udfff",GTe="\\u0300-\\u036f",YTe="\\ufe20-\\ufe2f",qTe="\\u20d0-\\u20ff",jTe=GTe+YTe+qTe,$X="\\u2700-\\u27bf",eZ="a-z\\xdf-\\xf6\\xf8-\\xff",JTe="\\xac\\xb1\\xd7\\xf7",WTe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",zTe="\\u2000-\\u206f",VTe=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",tZ="A-Z\\xc0-\\xd6\\xd8-\\xde",XTe="\\ufe0e\\ufe0f",rZ=JTe+WTe+zTe+VTe,iZ="['\u2019]",nZ="["+rZ+"]",ZTe="["+jTe+"]",sZ="\\d+",_Te="["+$X+"]",oZ="["+eZ+"]",aZ="[^"+_X+rZ+sZ+$X+eZ+tZ+"]",$Te="\\ud83c[\\udffb-\\udfff]",eOe="(?:"+ZTe+"|"+$Te+")",tOe="[^"+_X+"]",AZ="(?:\\ud83c[\\udde6-\\uddff]){2}",lZ="[\\ud800-\\udbff][\\udc00-\\udfff]",Bu="["+tZ+"]",rOe="\\u200d",cZ="(?:"+oZ+"|"+aZ+")",iOe="(?:"+Bu+"|"+aZ+")",uZ="(?:"+iZ+"(?:d|ll|m|re|s|t|ve))?",gZ="(?:"+iZ+"(?:D|LL|M|RE|S|T|VE))?",hZ=eOe+"?",fZ="["+XTe+"]?",nOe="(?:"+rOe+"(?:"+[tOe,AZ,lZ].join("|")+")"+fZ+hZ+")*",sOe="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",oOe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",aOe=fZ+hZ+nOe,AOe="(?:"+[_Te,AZ,lZ].join("|")+")"+aOe,lOe=RegExp([Bu+"?"+oZ+"+"+uZ+"(?="+[nZ,Bu,"$"].join("|")+")",iOe+"+"+gZ+"(?="+[nZ,Bu+cZ,"$"].join("|")+")",Bu+"?"+cZ+"+"+uZ,Bu+"+"+gZ,oOe,sOe,sZ,AOe].join("|"),"g");function cOe(t){return t.match(lOe)||[]}ZX.exports=cOe});var CZ=C((Vot,dZ)=>{var uOe=zX(),gOe=XX(),hOe=Rc(),fOe=pZ();function pOe(t,e,r){return t=hOe(t),e=r?void 0:e,e===void 0?gOe(t)?fOe(t):uOe(t):t.match(e)||[]}dZ.exports=pOe});var Jv=C((Xot,mZ)=>{var dOe=UX(),COe=JX(),mOe=CZ(),IOe="['\u2019]",EOe=RegExp(IOe,"g");function yOe(t){return function(e){return dOe(mOe(COe(e).replace(EOe,"")),t,"")}}mZ.exports=yOe});var EZ=C((Zot,IZ)=>{var BOe=Jv(),wOe=BOe(function(t,e,r){return t+(r?"_":"")+e.toLowerCase()});IZ.exports=wOe});var BZ=C((_ot,yZ)=>{var QOe=GS(),bOe=Jv(),DOe=bOe(function(t,e,r){return e=e.toLowerCase(),t+(r?QOe(e):e)});yZ.exports=DOe});var QZ=C(($ot,wZ)=>{var SOe=gu(),xOe=Cv(),kOe=Rv();function vOe(t,e){var r={};return e=kOe(e,3),xOe(t,function(i,n,s){SOe(r,e(i,n,s),i)}),r}wZ.exports=vOe});var DZ=C((eat,Wv)=>{Wv.exports=function(t){return bZ(POe(t),t)};Wv.exports.array=bZ;function bZ(t,e){var r=t.length,i=new Array(r),n={},s=r,o=FOe(e),a=ROe(t);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(t[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var h;try{h=", node was:"+JSON.stringify(c)}catch(m){h=""}throw new Error("Cyclic dependency"+h)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var f=o.get(c)||new Set;if(f=Array.from(f),u=f.length){g.add(c);do{var p=f[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--r]=c}}}function POe(t){for(var e=new Set,r=0,i=t.length;r{"use strict";Object.defineProperty(zv,"__esModule",{value:!0});zv.default=NOe;var MOe=tB(qf()),LOe=tB(DZ()),TOe=$f(),OOe=tB(cl()),KOe=tB(fu());function tB(t){return t&&t.__esModule?t:{default:t}}function NOe(t,e=[]){let r=[],i=[];function n(s,o){var a=(0,TOe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||r.push([o,a])}for(let s in t)if((0,MOe.default)(t,s)){let o=t[s];~i.indexOf(s)||i.push(s),OOe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,KOe.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return LOe.default.array(i,r).reverse()}});var kZ=C(Vv=>{"use strict";Object.defineProperty(Vv,"__esModule",{value:!0});Vv.default=UOe;function xZ(t,e){let r=Infinity;return t.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return r=n,!0}),r}function UOe(t){return(e,r)=>xZ(t,e)-xZ(t,r)}});var LZ=C(Ap=>{"use strict";Object.defineProperty(Ap,"__esModule",{value:!0});Ap.create=vZ;Ap.default=void 0;var PZ=bs(qf()),FZ=bs(EZ()),HOe=bs(BZ()),GOe=bs(QZ()),YOe=bs(Nv()),qOe=$f(),RZ=Bo(),jOe=bs(SZ()),NZ=bs(kZ()),JOe=bs(Ry()),WOe=bs(al()),Xv=bs(Qo());function bs(t){return t&&t.__esModule?t:{default:t}}function wu(){return wu=Object.assign||function(t){for(var e=1;eObject.prototype.toString.call(t)==="[object Object]";function zOe(t,e){let r=Object.keys(t.fields);return Object.keys(e).filter(i=>r.indexOf(i)===-1)}var VOe=(0,NZ.default)([]),rB=class extends Xv.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=VOe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return MZ(e)||typeof e=="function"}_cast(e,r={}){var i;let n=super._cast(e,r);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=r.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=wu({},r,{parent:l,__validating:r.__validating||!1}),u=!1;for(let g of a){let h=s[g],f=(0,PZ.default)(n,g);if(h){let p,m=n[g];c.path=(r.path?`${r.path}.`:"")+g,h=h.resolve({value:m,context:r.context,parent:l});let I="spec"in h?h.spec:void 0,Q=I==null?void 0:I.strict;if(I==null?void 0:I.strip){u=u||g in n;continue}p=!r.__validating||!Q?h.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else f&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,r={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=r;o=[{schema:this,value:a},...o],r.__validating=!0,r.originalValue=a,r.from=o,super._validate(e,r,(u,g)=>{if(u){if(!WOe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!MZ(g)){i(n[0]||null,g);return}a=a||g;let h=this._nodes.map(f=>(p,m)=>{let I=f.indexOf(".")===-1?(r.path?`${r.path}.`:"")+f:`${r.path||""}["${f}"]`,Q=this.fields[f];if(Q&&"validate"in Q){Q.validate(g[f],wu({},r,{path:I,from:o,strict:!0,parent:g,originalValue:a[f]}),m);return}m(null)});(0,JOe.default)({sync:s,tests:h,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:r.path},i)})}clone(e){let r=super.clone(e);return r.fields=wu({},this.fields),r._nodes=this._nodes,r._excludedEdges=this._excludedEdges,r._sortErrors=this._sortErrors,r}concat(e){let r=super.concat(e),i=r.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof Xv.default&&s instanceof Xv.default&&(i[n]=s.concat(o))}return r.withMutation(()=>r.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(r=>{let i=this.fields[r];e[r]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,r=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,NZ.default)(Object.keys(n)),r.length){Array.isArray(r[0])||(r=[r]);let s=r.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,jOe.default)(n,i._excludedEdges),i}pick(e){let r={};for(let i of e)this.fields[i]&&(r[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(r)))}omit(e){let r=this.clone(),i=r.fields;r.fields={};for(let n of e)delete i[n];return r.withMutation(()=>r.shape(i))}from(e,r,i){let n=(0,qOe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,PZ.default)(s,e)&&(o=wu({},s),i||delete o[e],o[r]=n(s)),o})}noUnknown(e=!0,r=RZ.object.noUnknown){typeof e=="string"&&(r=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:r,test(n){if(n==null)return!0;let s=zOe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,r=RZ.object.noUnknown){return this.noUnknown(!e,r)}transformKeys(e){return this.transform(r=>r&&(0,GOe.default)(r,(i,n)=>e(n)))}camelCase(){return this.transformKeys(HOe.default)}snakeCase(){return this.transformKeys(FZ.default)}constantCase(){return this.transformKeys(e=>(0,FZ.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,YOe.default)(this.fields,r=>r.describe()),e}};Ap.default=rB;function vZ(t){return new rB(t)}vZ.prototype=rB.prototype});var OZ=C(lp=>{"use strict";Object.defineProperty(lp,"__esModule",{value:!0});lp.create=TZ;lp.default=void 0;var Zv=Qu(yu()),XOe=Qu(fu()),ZOe=Qu(Yf()),_v=Bo(),_Oe=Qu(Ry()),$Oe=Qu(al()),eKe=Qu(Qo());function Qu(t){return t&&t.__esModule?t:{default:t}}function iB(){return iB=Object.assign||function(t){for(var e=1;e{this.transform(function(r){if(typeof r=="string")try{r=JSON.parse(r)}catch(i){r=null}return this.isType(r)?r:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,r){let i=super._cast(e,r);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,iB({},r,{path:`${r.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,r={},i){var n,s;let o=[],a=r.sync,l=r.path,c=this.innerType,u=(n=r.abortEarly)!=null?n:this.spec.abortEarly,g=(s=r.recursive)!=null?s:this.spec.recursive,h=r.originalValue!=null?r.originalValue:e;super._validate(e,r,(f,p)=>{if(f){if(!$Oe.default.isError(f)||u)return void i(f,p);o.push(f)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}h=h||p;let m=new Array(p.length);for(let I=0;Ic.validate(Q,x,H)}(0,_Oe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:m},i)})}clone(e){let r=super.clone(e);return r.innerType=this.innerType,r}concat(e){let r=super.concat(e);return r.innerType=this.innerType,e.innerType&&(r.innerType=r.innerType?r.innerType.concat(e.innerType):e.innerType),r}of(e){let r=this.clone();if(!(0,XOe.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,ZOe.default)(e));return r.innerType=e,r}length(e,r=_v.array.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,Zv.default)(i)||i.length===this.resolve(e)}})}min(e,r){return r=r||_v.array.min,this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Zv.default)(i)||i.length>=this.resolve(e)}})}max(e,r){return r=r||_v.array.max,this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,Zv.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,r)=>this._typeCheck(e)?e:r==null?[]:[].concat(r))}compact(e){let r=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(r):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};lp.default=nB;TZ.prototype=nB.prototype});var KZ=C(cp=>{"use strict";Object.defineProperty(cp,"__esModule",{value:!0});cp.create=tKe;cp.default=void 0;var iKe=rKe(fu());function rKe(t){return t&&t.__esModule?t:{default:t}}function tKe(t){return new $v(t)}var $v=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(r,i={})=>{let n=this.builder(r,i);if(!(0,iKe.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,r){return this._resolve(e,r).cast(e,r)}validate(e,r,i){return this._resolve(e,r).validate(e,r,i)}validateSync(e,r){return this._resolve(e,r).validateSync(e,r)}validateAt(e,r,i){return this._resolve(r,i).validateAt(e,r,i)}validateSyncAt(e,r,i){return this._resolve(r,i).validateSyncAt(e,r,i)}describe(){return null}isValid(e,r){return this._resolve(e,r).isValid(e,r)}isValidSync(e,r){return this._resolve(e,r).isValidSync(e,r)}},nKe=$v;cp.default=nKe});var UZ=C(eP=>{"use strict";Object.defineProperty(eP,"__esModule",{value:!0});eP.default=sKe;var aKe=oKe(Bo());function oKe(t){return t&&t.__esModule?t:{default:t}}function sKe(t){Object.keys(t).forEach(e=>{Object.keys(t[e]).forEach(r=>{aKe.default[e][r]=t[e][r]})})}});var rP=C(jt=>{"use strict";Object.defineProperty(jt,"__esModule",{value:!0});jt.addMethod=AKe;Object.defineProperty(jt,"MixedSchema",{enumerable:!0,get:function(){return HZ.default}});Object.defineProperty(jt,"mixed",{enumerable:!0,get:function(){return HZ.create}});Object.defineProperty(jt,"BooleanSchema",{enumerable:!0,get:function(){return tP.default}});Object.defineProperty(jt,"bool",{enumerable:!0,get:function(){return tP.create}});Object.defineProperty(jt,"boolean",{enumerable:!0,get:function(){return tP.create}});Object.defineProperty(jt,"StringSchema",{enumerable:!0,get:function(){return GZ.default}});Object.defineProperty(jt,"string",{enumerable:!0,get:function(){return GZ.create}});Object.defineProperty(jt,"NumberSchema",{enumerable:!0,get:function(){return YZ.default}});Object.defineProperty(jt,"number",{enumerable:!0,get:function(){return YZ.create}});Object.defineProperty(jt,"DateSchema",{enumerable:!0,get:function(){return qZ.default}});Object.defineProperty(jt,"date",{enumerable:!0,get:function(){return qZ.create}});Object.defineProperty(jt,"ObjectSchema",{enumerable:!0,get:function(){return jZ.default}});Object.defineProperty(jt,"object",{enumerable:!0,get:function(){return jZ.create}});Object.defineProperty(jt,"ArraySchema",{enumerable:!0,get:function(){return JZ.default}});Object.defineProperty(jt,"array",{enumerable:!0,get:function(){return JZ.create}});Object.defineProperty(jt,"ref",{enumerable:!0,get:function(){return lKe.create}});Object.defineProperty(jt,"lazy",{enumerable:!0,get:function(){return cKe.create}});Object.defineProperty(jt,"ValidationError",{enumerable:!0,get:function(){return uKe.default}});Object.defineProperty(jt,"reach",{enumerable:!0,get:function(){return gKe.default}});Object.defineProperty(jt,"isSchema",{enumerable:!0,get:function(){return WZ.default}});Object.defineProperty(jt,"setLocale",{enumerable:!0,get:function(){return hKe.default}});Object.defineProperty(jt,"BaseSchema",{enumerable:!0,get:function(){return fKe.default}});var HZ=hl(wX()),tP=hl(xX()),GZ=hl(PX()),YZ=hl(NX()),qZ=hl(OX()),jZ=hl(LZ()),JZ=hl(OZ()),lKe=cl(),cKe=KZ(),uKe=up(al()),gKe=up(Hv()),WZ=up(fu()),hKe=up(UZ()),fKe=up(Qo());function up(t){return t&&t.__esModule?t:{default:t}}function zZ(){if(typeof WeakMap!="function")return null;var t=new WeakMap;return zZ=function(){return t},t}function hl(t){if(t&&t.__esModule)return t;if(t===null||typeof t!="object"&&typeof t!="function")return{default:t};var e=zZ();if(e&&e.has(t))return e.get(t);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var s=i?Object.getOwnPropertyDescriptor(t,n):null;s&&(s.get||s.set)?Object.defineProperty(r,n,s):r[n]=t[n]}return r.default=t,e&&e.set(t,r),r}function AKe(t,e,r){if(!t||!(0,WZ.default)(t.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof r!="function")throw new TypeError("Method function must be provided");t.prototype[e]=r}});var $Z=C((Eat,hp)=>{"use strict";var CKe=process.env.TERM_PROGRAM==="Hyper",mKe=process.platform==="win32",XZ=process.platform==="linux",iP={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},ZZ=Object.assign({},iP,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),_Z=Object.assign({},iP,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:XZ?"\u25B8":"\u276F",pointerSmall:XZ?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});hp.exports=mKe&&!CKe?ZZ:_Z;Reflect.defineProperty(hp.exports,"common",{enumerable:!1,value:iP});Reflect.defineProperty(hp.exports,"windows",{enumerable:!1,value:ZZ});Reflect.defineProperty(hp.exports,"other",{enumerable:!1,value:_Z})});var jn=C((yat,nP)=>{"use strict";var IKe=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),EKe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,e_=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},r=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(t.enabled===!1)return s;if(t.visible===!1)return"";let a=""+s,l=a.includes(` -`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=r(t.styles[o[c]],a,l);return a},n=(s,o,a)=>{t.styles[s]=e({name:s,codes:o}),(t.keys[a]||(t.keys[a]=[])).push(s),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(c){t.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,t),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=EKe,t.hasColor=t.hasAnsi=s=>(t.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&t.ansiRegex.test(s)),t.alias=(s,o)=>{let a=typeof o=="string"?t[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),t.styles[s]=a,a.stack=[s]),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(l){t.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,t),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},t.theme=s=>{if(!IKe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))t.alias(o,s[o]);return t},t.alias("unstyle",s=>typeof s=="string"&&s!==""?(t.ansiRegex.lastIndex=0,s.replace(t.ansiRegex,"")):""),t.alias("noop",s=>s),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=$Z(),t.define=n,t};nP.exports=e_();nP.exports.create=e_});var ni=C(It=>{"use strict";var yKe=Object.prototype.toString,bn=jn(),t_=!1,sP=[],r_={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};It.longest=(t,e)=>t.reduce((r,i)=>Math.max(r,e?i[e].length:i.length),0);It.hasColor=t=>!!t&&bn.hasColor(t);var oB=It.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);It.nativeType=t=>yKe.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");It.isAsyncFn=t=>It.nativeType(t)==="asyncfunction";It.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";It.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;It.scrollDown=(t=[])=>[...t.slice(1),t[0]];It.scrollUp=(t=[])=>[t.pop(),...t];It.reorder=(t=[])=>{let e=t.slice();return e.sort((r,i)=>r.index>i.index?1:r.index{let i=t.length,n=r===i?0:r<0?i-1:r,s=t[e];t[e]=t[n],t[n]=s};It.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};It.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};It.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:i=` -`+r,width:n=80}=e;n-=((i+r).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=t.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),r+c.join(i)};It.unmute=t=>{let e=t.stack.find(i=>bn.keys.color.includes(i));return e?bn[e]:t.stack.find(i=>i.slice(2)==="bg")?bn[e.slice(2)]:i=>i};It.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";It.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>bn.keys.color.includes(i));if(e){let i=bn["bg"+It.pascal(e)];return i?i.black:t}let r=t.stack.find(i=>i.slice(0,2)==="bg");return r?bn[r.slice(2).toLowerCase()]||t:bn.none};It.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>bn.keys.color.includes(i)),r=t.stack.find(i=>i.slice(0,2)==="bg");if(e&&!r)return bn[r_[e]||e];if(r){let i=r.slice(2).toLowerCase(),n=r_[i];return n&&bn["bg"+It.pascal(n)]||t}return bn.none};It.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=r<10?"0"+r:r;return n+":"+s+" "+i};It.set=(t={},e="",r)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:r;return!It.isObject(a)&&s{let i=t[e]==null?e.split(".").reduce((n,s)=>n&&n[s],t):t[e];return i==null?r:i};It.mixin=(t,e)=>{if(!oB(t))return e;if(!oB(e))return t;for(let r of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,r);if(i.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&oB(i.value)){let n=Object.getOwnPropertyDescriptor(t,r);oB(n.value)?t[r]=It.merge({},t[r],e[r]):Reflect.defineProperty(t,r,i)}else Reflect.defineProperty(t,r,i);else Reflect.defineProperty(t,r,i)}return t};It.merge=(...t)=>{let e={};for(let r of t)It.mixin(e,r);return e};It.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let i of Object.keys(r)){let n=r[i];typeof n=="function"?It.define(t,i,n.bind(e)):It.define(t,i,n)}};It.onExit=t=>{let e=(r,i)=>{t_||(t_=!0,sP.forEach(n=>n()),r===!0&&process.exit(128+i))};sP.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),sP.push(t)};It.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};It.defineExport=(t,e,r)=>{let i;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():r()}})}});var i_=C(Du=>{"use strict";Du.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};Du.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};Du.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};Du.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};Du.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var o_=C((Qat,n_)=>{"use strict";var s_=require("readline"),BKe=i_(),wKe=/^(?:\x1b)([a-zA-Z0-9])$/,QKe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,bKe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function DKe(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function SKe(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var aB=(t="",e={})=>{let r,i=v({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t},e);if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=""+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=i.sequence||""),i.sequence=i.sequence||t||i.name,t==="\r")i.raw=void 0,i.name="return";else if(t===` -`)i.name="enter";else if(t===" ")i.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x7F"||t==="\b")i.name="backspace",i.meta=t.charAt(0)==="";else if(t===""||t==="")i.name="escape",i.meta=t.length===2;else if(t===" "||t===" ")i.name="space",i.meta=t.length===2;else if(t<="")i.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")i.name="number";else if(t.length===1&&t>="a"&&t<="z")i.name=t;else if(t.length===1&&t>="A"&&t<="Z")i.name=t.toLowerCase(),i.shift=!0;else if(r=wKe.exec(t))i.meta=!0,i.shift=/^[A-Z]$/.test(r[1]);else if(r=QKe.exec(t)){let n=[...t];n[0]===""&&n[1]===""&&(i.option=!0);let s=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),o=(r[3]||r[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=bKe[s],i.shift=DKe(s)||i.shift,i.ctrl=SKe(s)||i.ctrl}return i};aB.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let i=s_.createInterface({terminal:!0,input:r});s_.emitKeypressEvents(r,i);let n=(a,l)=>e(a,aB(a,l),i),s=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",n),i.resume(),()=>{r.isTTY&&r.setRawMode(s),r.removeListener("keypress",n),i.pause(),i.close()}};aB.action=(t,e,r)=>{let i=v(v({},BKe),r);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};n_.exports=aB});var A_=C((bat,a_)=>{"use strict";a_.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let i=e[r];typeof i=="number"&&(i={interval:i}),xKe(t,r,i)}};function xKe(t,e,r={}){let i=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=r.interval||120;i.frames=r.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,t.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),t.once("close",()=>i.stop()),i.stop}});var u_=C((Dat,l_)=>{"use strict";var{define:kKe,width:vKe}=ni(),c_=class{constructor(e){let r=e.options;kKe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=vKe(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=v({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};l_.exports=c_});var h_=C((Sat,g_)=>{"use strict";var oP=ni(),Jr=jn(),aP={default:Jr.noop,noop:Jr.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||oP.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||oP.complement(this.primary)},primary:Jr.cyan,success:Jr.green,danger:Jr.magenta,strong:Jr.bold,warning:Jr.yellow,muted:Jr.dim,disabled:Jr.gray,dark:Jr.dim.gray,underline:Jr.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};aP.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(Jr.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(Jr.visible=t.styles.visible);let e=oP.merge({},aP,t.styles);delete e.merge;for(let r of Object.keys(Jr))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Jr[r]});for(let r of Object.keys(Jr.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>Jr[r]});return e};g_.exports=aP});var p_=C((xat,f_)=>{"use strict";var AP=process.platform==="win32",Do=jn(),PKe=ni(),lP=W(v({},Do.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Do.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Do.symbols.question,submitted:Do.symbols.check,cancelled:Do.symbols.cross},separator:{pending:Do.symbols.pointerSmall,submitted:Do.symbols.middot,cancelled:Do.symbols.middot},radio:{off:AP?"( )":"\u25EF",on:AP?"(*)":"\u25C9",disabled:AP?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});lP.merge=t=>{let e=PKe.merge({},Do.symbols,lP,t.symbols);return delete e.merge,e};f_.exports=lP});var C_=C((kat,d_)=>{"use strict";var FKe=h_(),RKe=p_(),NKe=ni();d_.exports=t=>{t.options=NKe.merge({},t.options.theme,t.options),t.symbols=RKe.merge(t.options),t.styles=FKe.merge(t.options)}});var B_=C((m_,I_)=>{"use strict";var E_=process.env.TERM_PROGRAM==="Apple_Terminal",MKe=jn(),cP=ni(),Jn=I_.exports=m_,er="[",y_="\x07",uP=!1,ba=Jn.code={bell:y_,beep:y_,beginning:`${er}G`,down:`${er}J`,esc:er,getPosition:`${er}6n`,hide:`${er}?25l`,line:`${er}2K`,lineEnd:`${er}K`,lineStart:`${er}1K`,restorePosition:er+(E_?"8":"u"),savePosition:er+(E_?"7":"s"),screen:`${er}2J`,show:`${er}?25h`,up:`${er}1J`},fl=Jn.cursor={get hidden(){return uP},hide(){return uP=!0,ba.hide},show(){return uP=!1,ba.show},forward:(t=1)=>`${er}${t}C`,backward:(t=1)=>`${er}${t}D`,nextLine:(t=1)=>`${er}E`.repeat(t),prevLine:(t=1)=>`${er}F`.repeat(t),up:(t=1)=>t?`${er}${t}A`:"",down:(t=1)=>t?`${er}${t}B`:"",right:(t=1)=>t?`${er}${t}C`:"",left:(t=1)=>t?`${er}${t}D`:"",to(t,e){return e?`${er}${e+1};${t+1}H`:`${er}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?fl.left(-t):t>0?fl.right(t):"",r+=e<0?fl.up(-e):e>0?fl.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:i,input:n,prompt:s,size:o,value:a}=t;if(i=cP.isPrimitive(i)?String(i):"",n=cP.isPrimitive(n)?String(n):"",a=cP.isPrimitive(a)?String(a):"",o){let l=Jn.cursor.up(o)+Jn.cursor.to(s.length),c=n.length-r;return c>0&&(l+=Jn.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+r;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Jn.cursor.move(l)}}},gP=Jn.erase={screen:ba.screen,up:ba.up,down:ba.down,line:ba.line,lineEnd:ba.lineEnd,lineStart:ba.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return gP.line+fl.to(0);let r=s=>[...MKe.unstyle(s)].length,i=t.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(r(s)-1,0)/e);return(gP.line+fl.prevLine()).repeat(n-1)+gP.line+fl.to(0)}});var Su=C((vat,w_)=>{"use strict";var LKe=require("events"),Q_=jn(),hP=o_(),TKe=A_(),OKe=u_(),KKe=C_(),Li=ni(),pl=B_(),AB=class extends LKe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,KKe(this),TKe(this),this.state=new OKe(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=HKe(this.options.margin),this.setMaxListeners(0),UKe(this)}async keypress(e,r={}){this.keypressed=!0;let i=hP.action(e,hP(e,r),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(pl.code.beep)}cursorHide(){this.stdout.write(pl.cursor.hide()),Li.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(pl.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(pl.cursor.down(e)+pl.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:r,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=pl.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:r,prompt:i}=this.state;i=Q_.unstyle(i);let n=Q_.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` -`),c=l[0],u=l[l.length-1],h=(i+(r?" "+r:"")).length,f=he.call(this,this.value),this.result=()=>i.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let n=r.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=r&&r[e]!=null?r[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,r,i);return!g&&r&&r[e]?this.resolve(c,s,r,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,i=this.state;return i.timer=r,Li.isObject(e)&&(e=e[i.status]||e.pending),Li.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return Li.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,i=this.state;i.timer=r;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return Li.isObject(s)&&(s=s[i.status]||s.pending),Li.hasColor(s)?s:this.styles.muted(s)}async pointer(e,r){let i=await this.element("pointer",e,r);if(typeof i=="string"&&Li.hasColor(i))return i;if(i){let n=this.styles,s=this.index===r,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=Li.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,r){let i=await this.element("indicator",e,r);if(typeof i=="string"&&Li.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return Li.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return Li.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return Li.resolve(this,e,...r)}get base(){return AB.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||Li.height(this.stdout,25)}get width(){return this.options.columns||Li.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,i=[r,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function UKe(t){let e=n=>t[n]===void 0||typeof t[n]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(t.options)){if(r.includes(n)||/^on[A-Z]/.test(n))continue;let s=t.options[n];typeof s=="function"&&e(n)?i.includes(n)||(t[n]=s.bind(t)):typeof t[n]!="function"&&(t[n]=s)}}function HKe(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=n=>n%2==0?` -`:" ",i=[];for(let n=0;n<4;n++){let s=r(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}w_.exports=AB});var S_=C((Pat,b_)=>{"use strict";var GKe=ni(),D_={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return D_.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};b_.exports=(t,e={})=>{let r=GKe.merge({},D_,e.roles);return r[t]||r.default}});var fp=C((Fat,x_)=>{"use strict";var YKe=jn(),qKe=Su(),jKe=S_(),lB=ni(),{reorder:fP,scrollUp:JKe,scrollDown:WKe,isObject:k_,swap:zKe}=lB,v_=class extends qKe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");k_(r)&&(r=Object.keys(r)),Array.isArray(r)?(i!=null&&(this.index=this.findIndex(i)),r.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(r=i),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,r,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=jKe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,lB.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,YKe.unstyle(e.message).length));let o=v({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,i){let n=await this.toChoice(e,r,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,r,i){let n=v({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,r,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(n=>this.toggle(n,r));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return P_(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=fP(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=r(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=fP(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=fP(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>r&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===r-1?this.alert():e>r&&i===r-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=JKe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=WKe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){zKe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&r.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,r),i),{})}filter(e,r){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return r?o.map(a=>a[r]):o}find(e,r){if(k_(e))return r?e[r]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return r?s[r]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:r,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&r!==!1&&i!==!0&&(s=lB.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(i=>i.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let i=this.find(r);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return P_(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:i}=this,n=e.limit||this._limit||r.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function P_(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(lB.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let i=r.choices.filter(n=>!t.isDisabled(n));r.enabled=i.every(n=>n.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}x_.exports=v_});var Da=C((Rat,F_)=>{"use strict";var VKe=fp(),pP=ni(),R_=class extends VKe{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let i=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!pP.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await this.indicator(e,r)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,r);o&&!pP.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,r),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?(pP.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let i=this.margin[0]+r.join(` -`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` -`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(r),this.write([n,i,u,g].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};F_.exports=R_});var L_=C((Nat,N_)=>{"use strict";var XKe=Da(),ZKe=(t,e)=>{let r=t.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(r),o=e(i.slice(s,s+r.length));return s>=0?i.slice(0,s)+o+i.slice(s+r.length):i}},M_=class extends XKe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:i}=this.state;return this.input=i.slice(0,r)+e+i.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let i=e.toLowerCase();return r.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=ZKe(this.input,e),i=this.choices;this.choices=i.map(n=>W(v({},n),{message:r(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};N_.exports=M_});var CP=C((Mat,T_)=>{"use strict";var dP=ni();T_.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||t.styles.placeholder,l=dP.inverse(t.styles.primary),c=m=>l(t.styles.black(m)),u=r,g=" ",h=c(g);if(t.blink&&t.blink.off===!0&&(c=m=>m,h=""),s&&n===0&&i===""&&r==="")return c(g);if(s&&n===0&&(r===i||r===""))return c(i[0])+a(i.slice(1));i=dP.isPrimitive(i)?`${i}`:"",r=dP.isPrimitive(r)?`${r}`:"";let f=i&&i.startsWith(r)&&i!==r,p=f?c(i[r.length]):h;if(n!==r.length&&s===!0&&(u=r.slice(0,n)+c(r[n])+r.slice(n+1),p=""),s===!1&&(p=""),f){let m=t.styles.unstyle(u+p);return u+p+a(i.slice(m.length))}return u+p}});var cB=C((Lat,O_)=>{"use strict";var _Ke=jn(),$Ke=Da(),eUe=CP(),K_=class extends $Ke{constructor(e){super(W(v({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:i,input:n}=r;return r.value=r.input=n.slice(0,i)+e+n.slice(i),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:i}=e;return e.value=e.input=i.slice(0,r-1)+i.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:i}=e;if(i[r]===void 0)return this.alert();let n=`${i}`.slice(0,r)+`${i}`.slice(r+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:i}=e;return r&&r.startsWith(i)&&i!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let i=await this.resolve(e.separator,this.state,e,r)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:h,danger:f}=n,p=l,m=this.index===r,I=e.validate||(()=>!0),Q=await this.choiceSeparator(e,r),w=e.message;this.align==="right"&&(w=w.padStart(this.longest+1," ")),this.align==="left"&&(w=w.padEnd(this.longest+1," "));let x=this.values[a]=c||o,N=c?"success":"dark";await I.call(e,x,this.state)!==!0&&(N="danger");let T=n[N](await this.indicator(e,r))+(e.pad||""),P=this.indent(e),G=()=>[P,T,w+Q,c,p].filter(Boolean).join(" ");if(i.submitted)return w=_Ke.unstyle(w),c=g(c),p="",G();if(e.format)c=await e.format.call(this,c,e,r);else{let te=this.styles.muted;c=eUe(this,{input:c,initial:o,pos:s,showCursor:m,color:te})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,x,e,r)),m&&(w=h(w)),e.error?c+=(c?" ":"")+f(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),G()}async submit(){return this.value=this.values,super.base.submit.call(this)}};O_.exports=K_});var mP=C((Tat,U_)=>{"use strict";var tUe=cB(),rUe=()=>{throw new Error("expected prompt to have a custom authenticate method")},H_=(t=rUe)=>{class e extends tUe{constructor(i){super(i)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return H_(i)}}return e};U_.exports=H_()});var q_=C((Oat,G_)=>{"use strict";var iUe=mP();function nUe(t,e){return t.username===this.options.username&&t.password===this.options.password}var Y_=(t=nUe)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class r extends iUe.create(t){constructor(n){super(W(v({},n),{choices:e}))}static create(n){return Y_(n)}}return r};G_.exports=Y_()});var uB=C((Kat,j_)=>{"use strict";var sUe=Su(),{isPrimitive:oUe,hasColor:aUe}=ni(),J_=class extends sUe{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:i}=this;return i.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return oUe(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return aUe(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),h=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(r),this.write([l,a,h].filter(Boolean).join(` -`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};j_.exports=J_});var V_=C((Uat,W_)=>{"use strict";var AUe=uB(),z_=class extends AUe{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};W_.exports=z_});var __=C((Hat,X_)=>{"use strict";var lUe=Da(),cUe=cB(),xu=cUe.prototype,Z_=class extends lUe{constructor(e){super(W(v({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():xu.dispatch.call(this,e,r)}append(e,r){return xu.append.call(this,e,r)}delete(e,r){return xu.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?xu.next.call(this):super.next()}prev(){return this.focused.editable?xu.prev.call(this):super.prev()}async indicator(e,r){let i=e.indicator||"",n=e.editable?i:super.indicator(e,r);return await this.resolve(n,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?xu.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let i=r.parent?this.value[r.parent.name]:this.value;if(r.editable?i=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(i=r.enabled===!0),e=await r.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};X_.exports=Z_});var dl=C((Gat,$_)=>{"use strict";var uUe=Su(),gUe=CP(),{isPrimitive:hUe}=ni(),e$=class extends uUe{constructor(e){super(e);this.initial=hUe(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let i=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!i||i.name!=="return")?this.append(` -`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:i}=this.state;this.input=`${i}`.slice(0,r)+e+`${i}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),i=this.input.slice(e),n=r.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):gUe(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),i=await this.separator(),n=await this.message(),s=[r,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` -`)),this.restore()}};$_.exports=e$});var r$=C((Yat,t$)=>{"use strict";var fUe=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),gB=t=>fUe(t).filter(Boolean);t$.exports=(t,e={},r="")=>{let{past:i=[],present:n=""}=e,s,o;switch(t){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:gB([r,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:gB([...s,r]),present:o};case"save":return{past:gB([...i,r]),present:""};case"remove":return o=gB(i.filter(a=>a!==r)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${t}"`)}}});var IP=C((qat,i$)=>{"use strict";var pUe=dl(),n$=r$(),s$=class extends pUe{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let i=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=n$(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=n$("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};i$.exports=s$});var A$=C((jat,o$)=>{"use strict";var dUe=dl(),a$=class extends dUe{format(){return""}};o$.exports=a$});var u$=C((Jat,l$)=>{"use strict";var CUe=dl(),c$=class extends CUe{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};l$.exports=c$});var f$=C((Wat,g$)=>{"use strict";var mUe=Da(),h$=class extends mUe{constructor(e){super(W(v({},e),{multiple:!0}))}};g$.exports=h$});var EP=C((zat,p$)=>{"use strict";var IUe=dl(),d$=class extends IUe{constructor(e={}){super(v({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,i=this.toNumber(this.input);return i>this.max+r?this.alert():(this.input=`${i+r}`,this.render())}down(e){let r=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};p$.exports=d$});var m$=C((Vat,C$)=>{C$.exports=EP()});var y$=C((Xat,I$)=>{"use strict";var EUe=dl(),E$=class extends EUe{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};I$.exports=E$});var b$=C((Zat,B$)=>{"use strict";var yUe=jn(),BUe=fp(),w$=ni(),Q$=class extends BUe{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` - `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` -`)}renderScaleHeading(e){let r=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-r.join("").length,n=Math.round(i/(r.length-1)),o=r.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,r,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,i);let n=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let i=e.scale.map(s=>this.scaleIndicator(e,s,r)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await e.hint;s&&!w$.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,r),u=await this.renderScale(e,r),g=this.margin[1]+this.margin[3];this.scaleLength=yUe.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let f=w$.wordWrap(c,{width:this.widths[0],newline:a}).split(` -`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),f=f.map(p=>this.styles.info(p))),f[0]+=u,this.linebreak&&f.push(""),[l+n,f.join(` -`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),r=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...r.map(n=>n.join(" "))].join(` -`)}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),h=await this.footer(),f=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&f!=null&&(o+=this.styles.danger(f)),this.clear(r),this.write([a,o,c,g,h].filter(Boolean).join(` -`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};B$.exports=Q$});var k$=C((_at,D$)=>{"use strict";var S$=jn(),wUe=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",x$=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=wUe(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},QUe=async(t={},e={},r=i=>i)=>{let i=new Set,n=t.fields||[],s=t.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],h=()=>s[u+1],f=p=>{p.line=c,o.push(p)};for(f({type:"bos",value:""});uN.name===Q.key);Q.field=n.find(N=>N.name===Q.key),x||(x=new x$(Q),a.push(x)),x.lines.push(Q.line-1);continue}let m=o[o.length-1];m.type==="text"&&m.line===c?m.value+=p:f({type:"text",value:p})}return f({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};D$.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),i=v(v({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await QUe(e,i),a=yP("result",t,e),l=yP("format",t,e),c=yP("validate",t,e,!0),u=t.isValue.bind(t);return async(g={},h=!1)=>{let f=0;g.required=r,g.items=s,g.keys=o,g.output="";let p=async(w,x,N,H)=>{let T=await c(w,x,N,H);return T===!1?"Invalid field "+N.name:T};for(let w of n){let x=w.value,N=w.key;if(w.type!=="template"){x&&(g.output+=x);continue}if(w.type==="template"){let H=s.find(j=>j.name===N);e.required===!0&&g.required.add(H.name);let T=[H.input,g.values[H.value],H.value,x].find(u),G=(H.field||{}).message||w.inner;if(h){let j=await p(g.values[N],g,H,f);if(j&&typeof j=="string"||j===!1){g.invalid.set(N,j);continue}g.invalid.delete(N);let A=await a(g.values[N],g,H,f);g.output+=S$.unstyle(A);continue}H.placeholder=!1;let te=x;x=await l(x,g,H,f),T!==x?(g.values[N]=T,x=t.styles.typing(T),g.missing.delete(G)):(g.values[N]=void 0,T=`<${G}>`,x=t.styles.primary(T),H.placeholder=!0,g.required.has(N)&&g.missing.add(G)),g.missing.has(G)&&g.validating&&(x=t.styles.warning(T)),g.invalid.has(N)&&g.validating&&(x=t.styles.danger(T)),f===g.index&&(te!==x?x=t.styles.underline(x):x=t.styles.heading(S$.unstyle(x))),f++}x&&(g.output+=x)}let m=g.output.split(` -`).map(w=>" "+w),I=s.length,Q=0;for(let w of s)g.invalid.has(w.name)&&w.lines.forEach(x=>{m[x][0]===" "&&(m[x]=g.styles.danger(g.symbols.bullet)+m[x].slice(1))}),t.isValue(g.values[w.name])&&Q++;return g.completed=(Q/I*100).toFixed(0),g.output=m.join(` -`),g.output}};function yP(t,e,r,i){return(n,s,o,a)=>typeof o.field[t]=="function"?o.field[t].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var F$=C(($at,v$)=>{"use strict";var bUe=jn(),DUe=k$(),SUe=Su(),P$=class extends SUe{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await DUe(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:i,size:n}=this.state,s=[this.options.newline,` -`].find(w=>w!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",h=await this.hint()||"",f=i?"":await this.interpolate(this.state),p=this.state.key=r[e]||"",m=await this.format(p),I=await this.footer();m&&(c+=" "+m),h&&!m&&this.state.completed===0&&(c+=" "+h),this.clear(n);let Q=[u,c,f,I,g.trim()];this.write(Q.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:r,keys:i,index:n}=this.state,s=r.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} -`;return this.state.error=a,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let o=bUe.unstyle(i).split(` -`).map(a=>a.slice(1)).join(` -`);return this.value={values:n,result:o},super.submit()}};v$.exports=P$});var M$=C((eAt,R$)=>{"use strict";var xUe="(Use + to sort)",kUe=Da(),N$=class extends kUe{constructor(e){super(W(v({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,xUe].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let i=await super.renderChoice(e,r),n=this.symbols.identicalTo+" ",s=this.index===r&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${r+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};R$.exports=N$});var O$=C((tAt,L$)=>{"use strict";var vUe=fp(),T$=class extends vUe{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(i=>this.styles.muted(i)),this.state.header=r.join(` - `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let i of r)i.scale=PUe(5,this.options),i.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],i=r.selected;return e.scale.forEach(n=>n.selected=!1),r.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=x=>(x?this.styles.success("\u25C9"):"\u25EF")+o,u=r+1+".",g=i?this.styles.heading:this.styles.noop,h=await this.resolve(e.message,this.state,e,r),f=this.indent(e),p=f+e.scale.map((x,N)=>c(N===e.scaleIdx)).join(a),m=x=>x===e.scaleIdx?g(x):x,I=f+e.scale.map((x,N)=>m(N)).join(l),Q=()=>[u,h].filter(Boolean).join(" "),w=()=>[Q(),p,I," "].filter(Boolean).join(` -`);return i&&(p=this.styles.cyan(p),I=this.styles.cyan(I)),w()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` -`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([o,a,u,g].filter(Boolean).join(` -`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function PUe(t,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>v({},i));let r=[];for(let i=1;i{K$.exports=IP()});var Y$=C((iAt,H$)=>{"use strict";var FUe=uB(),G$=class extends FUe{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([r,c,l].filter(Boolean).join(` -`)),this.write(this.margin[2]),this.restore()}};H$.exports=G$});var J$=C((nAt,q$)=>{"use strict";var RUe=Da(),j$=class extends RUe{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let i=await super.toChoices(e,r);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};q$.exports=j$});var z$=C(BP=>{"use strict";var W$=ni(),Sr=(t,e)=>{W$.defineExport(BP,t,e),W$.defineExport(BP,t.toLowerCase(),e)};Sr("AutoComplete",()=>L_());Sr("BasicAuth",()=>q_());Sr("Confirm",()=>V_());Sr("Editable",()=>__());Sr("Form",()=>cB());Sr("Input",()=>IP());Sr("Invisible",()=>A$());Sr("List",()=>u$());Sr("MultiSelect",()=>f$());Sr("Numeral",()=>m$());Sr("Password",()=>y$());Sr("Scale",()=>b$());Sr("Select",()=>Da());Sr("Snippet",()=>F$());Sr("Sort",()=>M$());Sr("Survey",()=>O$());Sr("Text",()=>U$());Sr("Toggle",()=>Y$());Sr("Quiz",()=>J$())});var X$=C((oAt,V$)=>{V$.exports={ArrayPrompt:fp(),AuthPrompt:mP(),BooleanPrompt:uB(),NumberPrompt:EP(),StringPrompt:dl()}});var dp=C((aAt,Z$)=>{"use strict";var _$=require("assert"),wP=require("events"),Sa=ni(),Ds=class extends wP{constructor(e,r){super();this.options=Sa.merge({},e),this.answers=v({},r)}register(e,r){if(Sa.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}_$.equal(typeof r,"function","expected a function");let i=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[i]=r:this.prompts[i]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(Sa.merge({},this.options,r))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=Sa.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=Sa;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];_$(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](r),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),r.autofill&&l!=null?(a.value=a.input=l,r.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||Su()}static get prompts(){return z$()}static get types(){return X$()}static get prompt(){let e=(r,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(r)};return Sa.mixinEmitter(e,new wP),e}};Sa.mixinEmitter(Ds,new wP);var QP=Ds.prompts;for(let t of Object.keys(QP)){let e=t.toLowerCase(),r=i=>new QP[t](i).run();Ds.prompt[e]=r,Ds[e]=r,Ds[t]||Reflect.defineProperty(Ds,t,{get:()=>QP[t]})}var pp=t=>{Sa.defineExport(Ds,t,()=>Ds.types[t])};pp("ArrayPrompt");pp("AuthPrompt");pp("BooleanPrompt");pp("NumberPrompt");pp("StringPrompt");Z$.exports=Ds});var uee=C((XAt,cee)=>{function OUe(t,e){for(var r=-1,i=t==null?0:t.length;++r{var KUe=By(),UUe=gu();function HUe(t,e,r,i){var n=!r;r||(r={});for(var s=-1,o=e.length;++s{var GUe=vu(),YUe=Cu();function qUe(t,e){return t&&GUe(e,YUe(e),t)}hee.exports=qUe});var dee=C(($At,pee)=>{function jUe(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}pee.exports=jUe});var mee=C((elt,Cee)=>{var JUe=qn(),WUe=Ty(),zUe=dee(),VUe=Object.prototype,XUe=VUe.hasOwnProperty;function ZUe(t){if(!JUe(t))return zUe(t);var e=WUe(t),r=[];for(var i in t)i=="constructor"&&(e||!XUe.call(t,i))||r.push(i);return r}Cee.exports=ZUe});var Pu=C((tlt,Iee)=>{var _Ue=pv(),$Ue=mee(),e1e=Xf();function t1e(t){return e1e(t)?_Ue(t,!0):$Ue(t)}Iee.exports=t1e});var yee=C((rlt,Eee)=>{var r1e=vu(),i1e=Pu();function n1e(t,e){return t&&r1e(e,i1e(e),t)}Eee.exports=n1e});var vP=C((wp,Fu)=>{var s1e=Hn(),Bee=typeof wp=="object"&&wp&&!wp.nodeType&&wp,wee=Bee&&typeof Fu=="object"&&Fu&&!Fu.nodeType&&Fu,o1e=wee&&wee.exports===Bee,Qee=o1e?s1e.Buffer:void 0,bee=Qee?Qee.allocUnsafe:void 0;function a1e(t,e){if(e)return t.slice();var r=t.length,i=bee?bee(r):new t.constructor(r);return t.copy(i),i}Fu.exports=a1e});var PP=C((ilt,Dee)=>{function A1e(t,e){var r=-1,i=t.length;for(e||(e=Array(i));++r{var l1e=vu(),c1e=Ky();function u1e(t,e){return l1e(t,c1e(t),e)}See.exports=u1e});var hB=C((slt,kee)=>{var g1e=dv(),h1e=g1e(Object.getPrototypeOf,Object);kee.exports=h1e});var FP=C((olt,vee)=>{var f1e=Qy(),p1e=hB(),d1e=Ky(),C1e=Bv(),m1e=Object.getOwnPropertySymbols,I1e=m1e?function(t){for(var e=[];t;)f1e(e,d1e(t)),t=p1e(t);return e}:C1e;vee.exports=I1e});var Fee=C((alt,Pee)=>{var E1e=vu(),y1e=FP();function B1e(t,e){return E1e(t,y1e(t),e)}Pee.exports=B1e});var Nee=C((Alt,Ree)=>{var w1e=yv(),Q1e=FP(),b1e=Pu();function D1e(t){return w1e(t,b1e,Q1e)}Ree.exports=D1e});var Lee=C((llt,Mee)=>{var S1e=Object.prototype,x1e=S1e.hasOwnProperty;function k1e(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&x1e.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Mee.exports=k1e});var fB=C((clt,Tee)=>{var Oee=Iv();function v1e(t){var e=new t.constructor(t.byteLength);return new Oee(e).set(new Oee(t)),e}Tee.exports=v1e});var Uee=C((ult,Kee)=>{var P1e=fB();function F1e(t,e){var r=e?P1e(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Kee.exports=F1e});var Gee=C((glt,Hee)=>{var R1e=/\w*$/;function N1e(t){var e=new t.constructor(t.source,R1e.exec(t));return e.lastIndex=t.lastIndex,e}Hee.exports=N1e});var Wee=C((hlt,Yee)=>{var qee=GA(),jee=qee?qee.prototype:void 0,Jee=jee?jee.valueOf:void 0;function M1e(t){return Jee?Object(Jee.call(t)):{}}Yee.exports=M1e});var RP=C((flt,zee)=>{var L1e=fB();function T1e(t,e){var r=e?L1e(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}zee.exports=T1e});var Xee=C((plt,Vee)=>{var O1e=fB(),K1e=Uee(),U1e=Gee(),H1e=Wee(),G1e=RP(),Y1e="[object Boolean]",q1e="[object Date]",j1e="[object Map]",J1e="[object Number]",W1e="[object RegExp]",z1e="[object Set]",V1e="[object String]",X1e="[object Symbol]",Z1e="[object ArrayBuffer]",_1e="[object DataView]",$1e="[object Float32Array]",e2e="[object Float64Array]",t2e="[object Int8Array]",r2e="[object Int16Array]",i2e="[object Int32Array]",n2e="[object Uint8Array]",s2e="[object Uint8ClampedArray]",o2e="[object Uint16Array]",a2e="[object Uint32Array]";function A2e(t,e,r){var i=t.constructor;switch(e){case Z1e:return O1e(t);case Y1e:case q1e:return new i(+t);case _1e:return K1e(t,r);case $1e:case e2e:case t2e:case r2e:case i2e:case n2e:case s2e:case o2e:case a2e:return G1e(t,r);case j1e:return new i;case J1e:case V1e:return new i(t);case W1e:return U1e(t);case z1e:return new i;case X1e:return H1e(t)}}Vee.exports=A2e});var $ee=C((dlt,Zee)=>{var l2e=qn(),_ee=Object.create,c2e=function(){function t(){}return function(e){if(!l2e(e))return{};if(_ee)return _ee(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();Zee.exports=c2e});var NP=C((Clt,ete)=>{var u2e=$ee(),g2e=hB(),h2e=Ty();function f2e(t){return typeof t.constructor=="function"&&!h2e(t)?u2e(g2e(t)):{}}ete.exports=f2e});var rte=C((mlt,tte)=>{var p2e=_f(),d2e=fs(),C2e="[object Map]";function m2e(t){return d2e(t)&&p2e(t)==C2e}tte.exports=m2e});var ote=C((Ilt,ite)=>{var I2e=rte(),E2e=Ny(),nte=My(),ste=nte&&nte.isMap,y2e=ste?E2e(ste):I2e;ite.exports=y2e});var Ate=C((Elt,ate)=>{var B2e=_f(),w2e=fs(),Q2e="[object Set]";function b2e(t){return w2e(t)&&B2e(t)==Q2e}ate.exports=b2e});var gte=C((ylt,lte)=>{var D2e=Ate(),S2e=Ny(),cte=My(),ute=cte&&cte.isSet,x2e=ute?S2e(ute):D2e;lte.exports=x2e});var Cte=C((Blt,hte)=>{var k2e=Zf(),v2e=uee(),P2e=By(),F2e=fee(),R2e=yee(),N2e=vP(),M2e=PP(),L2e=xee(),T2e=Fee(),O2e=wv(),K2e=Nee(),U2e=_f(),H2e=Lee(),G2e=Xee(),Y2e=NP(),q2e=Cn(),j2e=Wf(),J2e=ote(),W2e=qn(),z2e=gte(),V2e=Cu(),X2e=Pu(),Z2e=1,_2e=2,$2e=4,fte="[object Arguments]",eHe="[object Array]",tHe="[object Boolean]",rHe="[object Date]",iHe="[object Error]",pte="[object Function]",nHe="[object GeneratorFunction]",sHe="[object Map]",oHe="[object Number]",dte="[object Object]",aHe="[object RegExp]",AHe="[object Set]",lHe="[object String]",cHe="[object Symbol]",uHe="[object WeakMap]",gHe="[object ArrayBuffer]",hHe="[object DataView]",fHe="[object Float32Array]",pHe="[object Float64Array]",dHe="[object Int8Array]",CHe="[object Int16Array]",mHe="[object Int32Array]",IHe="[object Uint8Array]",EHe="[object Uint8ClampedArray]",yHe="[object Uint16Array]",BHe="[object Uint32Array]",Tt={};Tt[fte]=Tt[eHe]=Tt[gHe]=Tt[hHe]=Tt[tHe]=Tt[rHe]=Tt[fHe]=Tt[pHe]=Tt[dHe]=Tt[CHe]=Tt[mHe]=Tt[sHe]=Tt[oHe]=Tt[dte]=Tt[aHe]=Tt[AHe]=Tt[lHe]=Tt[cHe]=Tt[IHe]=Tt[EHe]=Tt[yHe]=Tt[BHe]=!0;Tt[iHe]=Tt[pte]=Tt[uHe]=!1;function pB(t,e,r,i,n,s){var o,a=e&Z2e,l=e&_2e,c=e&$2e;if(r&&(o=n?r(t,i,n,s):r(t)),o!==void 0)return o;if(!W2e(t))return t;var u=q2e(t);if(u){if(o=H2e(t),!a)return M2e(t,o)}else{var g=U2e(t),h=g==pte||g==nHe;if(j2e(t))return N2e(t,a);if(g==dte||g==fte||h&&!n){if(o=l||h?{}:Y2e(t),!a)return l?T2e(t,R2e(o,t)):L2e(t,F2e(o,t))}else{if(!Tt[g])return n?t:{};o=G2e(t,g,a)}}s||(s=new k2e);var f=s.get(t);if(f)return f;s.set(t,o),z2e(t)?t.forEach(function(I){o.add(pB(I,e,r,I,t,s))}):J2e(t)&&t.forEach(function(I,Q){o.set(Q,pB(I,e,r,Q,t,s))});var p=c?l?K2e:O2e:l?X2e:V2e,m=u?void 0:p(t);return v2e(m||t,function(I,Q){m&&(Q=I,I=t[Q]),P2e(o,Q,pB(I,e,r,Q,t,s))}),o}hte.exports=pB});var MP=C((wlt,mte)=>{var wHe=Cte(),QHe=1,bHe=4;function DHe(t){return wHe(t,QHe|bHe)}mte.exports=DHe});var Ete=C((Qlt,Ite)=>{var SHe=jk();function xHe(t,e,r){return t==null?t:SHe(t,e,r)}Ite.exports=xHe});var Dte=C((vlt,bte)=>{function kHe(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}bte.exports=kHe});var xte=C((Plt,Ste)=>{var vHe=Tf(),PHe=OS();function FHe(t,e){return e.length<2?t:vHe(t,PHe(e,0,-1))}Ste.exports=FHe});var vte=C((Flt,kte)=>{var RHe=uu(),NHe=Dte(),MHe=xte(),LHe=ol();function THe(t,e){return e=RHe(e,t),t=MHe(t,e),t==null||delete t[LHe(NHe(e))]}kte.exports=THe});var Fte=C((Rlt,Pte)=>{var OHe=vte();function KHe(t,e){return t==null?!0:OHe(t,e)}Pte.exports=KHe});var Hte=C((lct,Ute)=>{Ute.exports={name:"@yarnpkg/cli",version:"3.1.0-rc.5",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^2.0.0",clipanion:"^3.0.1",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/ci-info":"^2","@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2",typescript:"^4.4.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"},stableVersion:"3.0.0"}});var AF=C((Ypt,Tre)=>{"use strict";Tre.exports=function(e,r){r===!0&&(r=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof r=="number"?n[r]:n}});var lF=C((qpt,Ore)=>{"use strict";var hGe=AF();function Kre(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=hGe(t);return t=t.substring(t.indexOf("://")+3),Kre(e)?!0:t.indexOf("@"){"use strict";var fGe=AF(),pGe=lF(),dGe=require("querystring");function CGe(t){t=(t||"").trim();var e={protocols:fGe(t),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:t,query:Object.create(null)},r=t.indexOf("://"),i=-1,n=null,s=null;t.startsWith(".")&&(t.startsWith("./")&&(t=t.substring(2)),e.pathname=t,e.protocol="file");var o=t.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(pGe(t)?e.protocol="ssh":((o==="/"||o==="~")&&(t=t.substring(2)),e.protocol="file"))),r!==-1&&(t=t.substring(r+3)),s=t.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=dGe.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}Ure.exports=CGe});var qre=C((Jpt,Gre)=>{"use strict";var mGe=typeof URL=="undefined"?require("url").URL:URL,Yre=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t);Gre.exports=(t,e)=>{e=Object.assign({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripHash:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps")&&(e.forceHttp=e.normalizeHttps),Reflect.has(e,"normalizeHttp")&&(e.forceHttps=e.normalizeHttp),Reflect.has(e,"stripFragment")&&(e.stripHash=e.stripFragment),t=t.trim();let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new mGe(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?![https?:]).)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];Yre(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z\.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])Yre(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),t}});var Jre=C((Wpt,jre)=>{"use strict";var IGe=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},EGe=Hre(),yGe=qre();function BGe(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof t!="string"||!t.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":IGe(e))!=="object"&&(e={stripFragment:!1}),t=yGe(t,e));var r=EGe(t);return r}jre.exports=BGe});var Vre=C((zpt,Wre)=>{"use strict";var wGe=Jre(),zre=lF();function QGe(t){var e=wGe(t);e.token="";var r=e.user.split(":");return r.length===2&&(r[1]==="x-oauth-basic"?e.token=r[0]:r[0]==="x-token-auth"&&(e.token=r[1])),zre(e.protocols)||zre(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}Wre.exports=QGe});var Zre=C((Vpt,Xre)=>{"use strict";var bGe=Vre();function cF(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=bGe(t),r=e.resource.split("."),i=null;switch(e.toString=function(l){return cF.stringify(this,l)},e.source=r.length>2?r.slice(1-r.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=r[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}cF.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",i=t.user||"git",n=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+i+"@"+t.resource+r+"/"+t.full_name+n:i+"@"+t.resource+":"+t.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+t.resource+r+"/"+t.full_name+n;case"http":case"https":var s=t.token?DGe(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+s+t.resource+r+"/"+t.full_name+n;default:return t.href}};function DGe(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}Xre.exports=cF});var QF=C((Udt,sie)=>{var MGe=gu(),LGe=Au();function TGe(t,e,r){(r!==void 0&&!LGe(t[e],r)||r===void 0&&!(e in t))&&MGe(t,e,r)}sie.exports=TGe});var aie=C((Hdt,oie)=>{var OGe=Xf(),KGe=fs();function UGe(t){return KGe(t)&&OGe(t)}oie.exports=UGe});var cie=C((Gdt,Aie)=>{var HGe=YA(),GGe=hB(),YGe=fs(),qGe="[object Object]",jGe=Function.prototype,JGe=Object.prototype,lie=jGe.toString,WGe=JGe.hasOwnProperty,zGe=lie.call(Object);function VGe(t){if(!YGe(t)||HGe(t)!=qGe)return!1;var e=GGe(t);if(e===null)return!0;var r=WGe.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&lie.call(r)==zGe}Aie.exports=VGe});var bF=C((Ydt,uie)=>{function XGe(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}uie.exports=XGe});var hie=C((qdt,gie)=>{var ZGe=vu(),_Ge=Pu();function $Ge(t){return ZGe(t,_Ge(t))}gie.exports=$Ge});var Iie=C((jdt,fie)=>{var pie=QF(),eYe=vP(),tYe=RP(),rYe=PP(),iYe=NP(),die=Kf(),Cie=Cn(),nYe=aie(),sYe=Wf(),oYe=Iy(),aYe=qn(),AYe=cie(),lYe=Ly(),mie=bF(),cYe=hie();function uYe(t,e,r,i,n,s,o){var a=mie(t,r),l=mie(e,r),c=o.get(l);if(c){pie(t,r,c);return}var u=s?s(a,l,r+"",t,e,o):void 0,g=u===void 0;if(g){var h=Cie(l),f=!h&&sYe(l),p=!h&&!f&&lYe(l);u=l,h||f||p?Cie(a)?u=a:nYe(a)?u=rYe(a):f?(g=!1,u=eYe(l,!0)):p?(g=!1,u=tYe(l,!0)):u=[]:AYe(l)||die(l)?(u=a,die(a)?u=cYe(a):(!aYe(a)||oYe(a))&&(u=iYe(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),pie(t,r,u)}fie.exports=uYe});var Bie=C((Jdt,Eie)=>{var gYe=Zf(),hYe=QF(),fYe=hv(),pYe=Iie(),dYe=qn(),CYe=Pu(),mYe=bF();function yie(t,e,r,i,n){t!==e&&fYe(e,function(s,o){if(n||(n=new gYe),dYe(s))pYe(t,e,o,r,yie,i,n);else{var a=i?i(mYe(t,o),s,o+"",t,e,n):void 0;a===void 0&&(a=s),hYe(t,o,a)}},CYe)}Eie.exports=yie});var Qie=C((Wdt,wie)=>{var IYe=by(),EYe=zk(),yYe=Vk();function BYe(t,e){return yYe(EYe(t,e,IYe),t+"")}wie.exports=BYe});var Die=C((zdt,bie)=>{var wYe=Au(),QYe=Xf(),bYe=Of(),DYe=qn();function SYe(t,e,r){if(!DYe(r))return!1;var i=typeof e;return(i=="number"?QYe(r)&&bYe(e,r.length):i=="string"&&e in r)?wYe(r[e],t):!1}bie.exports=SYe});var xie=C((Vdt,Sie)=>{var xYe=Qie(),kYe=Die();function vYe(t){return xYe(function(e,r){var i=-1,n=r.length,s=n>1?r[n-1]:void 0,o=n>2?r[2]:void 0;for(s=t.length>3&&typeof s=="function"?(n--,s):void 0,o&&kYe(r[0],r[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var PYe=Bie(),FYe=xie(),RYe=FYe(function(t,e,r){PYe(t,e,r)});kie.exports=RYe});var jie=C((tmt,qie)=>{var OF;qie.exports=()=>(typeof OF=="undefined"&&(OF=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),OF)});var Zie=C(UF=>{function Ou(t,e){if(typeof t=="string")return t;if(t){let r,i;if(Array.isArray(t)){for(r=0;r0)return(g=Ou(n[u],c))?g.replace("*",l.substring(u.length-1)):Il(i,l,1)}return Il(i,l)}}function oqe(t,e={}){let r=0,i,n=e.browser,s=e.fields||["module","main"];for(n&&!s.includes("browser")&&s.unshift("browser");r{(function(t){zF&&typeof zF=="object"&&typeof VF!="undefined"?VF.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window!="undefined"?window.isWindows=t():typeof global!="undefined"?global.isWindows=t():typeof self!="undefined"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var une=C((PIt,Ane)=>{"use strict";XF.ifExists=dqe;var Hu=require("util"),Dn=require("path"),lne=ane(),Cqe=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,mqe={createPwshFile:!0,createCmdFile:lne(),fs:require("fs")},Iqe=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function cne(t){let e=v(v({},mqe),t),r=e.fs;return e.fs_={chmod:r.chmod?Hu.promisify(r.chmod):async()=>{},mkdir:Hu.promisify(r.mkdir),readFile:Hu.promisify(r.readFile),stat:Hu.promisify(r.stat),unlink:Hu.promisify(r.unlink),writeFile:Hu.promisify(r.writeFile)},e}async function XF(t,e,r){let i=cne(r);await i.fs_.stat(t),await Eqe(t,e,i)}function dqe(t,e,r){return XF(t,e,r).catch(()=>{})}function yqe(t,e){return e.fs_.unlink(t).catch(()=>{})}async function Eqe(t,e,r){let i=await Qqe(t,r);return await Bqe(e,r),wqe(t,e,i,r)}function Bqe(t,e){return e.fs_.mkdir(Dn.dirname(t),{recursive:!0})}function wqe(t,e,r,i){let n=cne(i),s=[{generator:Sqe,extension:""}];return n.createCmdFile&&s.push({generator:Dqe,extension:".cmd"}),n.createPwshFile&&s.push({generator:xqe,extension:".ps1"}),Promise.all(s.map(o=>bqe(t,e+o.extension,r,o.generator,n)))}function kqe(t,e){return yqe(t,e)}function Pqe(t,e){return vqe(t,e)}async function Qqe(t,e){let n=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(Cqe);if(!n){let s=Dn.extname(t).toLowerCase();return{program:Iqe.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function bqe(t,e,r,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[r.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:r.program,args:o}),await kqe(e,n),await n.fs_.writeFile(e,i(t,e,n),"utf8"),Pqe(e,n)}function Dqe(t,e,r){let n=Dn.relative(Dn.dirname(e),t).split("/").join("\\"),s=Dn.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=r.prog,l=r.args||"",c=ZF(r.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=r.progArgs?`${r.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r -`:"";return o?g+=`@IF EXIST ${o} (\r - ${o} ${l} ${n} ${u}%*\r -) ELSE (\r - @SETLOCAL\r - @SET PATHEXT=%PATHEXT:;.JS;=;%\r - ${a} ${l} ${n} ${u}%*\r -)\r -`:g+=`@${a} ${l} ${n} ${u}%*\r -`,g}function Sqe(t,e,r){let i=Dn.relative(Dn.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=Dn.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=r.args||"",l=ZF(r.nodePath).posix;n?(s=`"$basedir/${r.prog}"`,i=o):(n=o,a="",i="");let c=r.progArgs?`${r.progArgs.join(" ")} `:"",u=`#!/bin/sh -basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") - -case \`uname\` in - *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; -esac - -`,g=r.nodePath?`export NODE_PATH="${l}" -`:"";return s?u+=`${g}if [ -x ${s} ]; then - exec ${s} ${a} ${i} ${c}"$@" -else - exec ${n} ${a} ${i} ${c}"$@" -fi -`:u+=`${g}${n} ${a} ${i} ${c}"$@" -exit $? -`,u}function xqe(t,e,r){let i=Dn.relative(Dn.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=Dn.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=r.args||"",c=ZF(r.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${r.prog}$exe"`,i=a):(s=a,l="",i="");let h=r.progArgs?`${r.progArgs.join(" ")} `:"",f=`#!/usr/bin/env pwsh -$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent - -$exe="" -${r.nodePath?`$env_node_path=$env:NODE_PATH -$env:NODE_PATH="${u}" -`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { - # Fix case when both the Windows and Linux builds of Node - # are installed in the same directory - $exe=".exe" -}`;return r.nodePath&&(f+=` else { - $env:NODE_PATH="${g}" -}`),o?f+=` -$ret=0 -if (Test-Path ${o}) { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${o} ${l} ${i} ${h}$args - } else { - & ${o} ${l} ${i} ${h}$args - } - $ret=$LASTEXITCODE -} else { - # Support pipeline input - if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${h}$args - } else { - & ${s} ${l} ${i} ${h}$args - } - $ret=$LASTEXITCODE -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $ret -`:f+=` -# Support pipeline input -if ($MyInvocation.ExpectingInput) { - $input | & ${s} ${l} ${i} ${h}$args -} else { - & ${s} ${l} ${i} ${h}$args -} -${r.nodePath?`$env:NODE_PATH=$env_node_path -`:""}exit $LASTEXITCODE -`,f}function vqe(t,e){return e.fs_.chmod(t,493)}function ZF(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(Dn.delimiter):Array.from(t),r={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];r.win32=r.win32?`${r.win32};${n}`:n,r.posix=r.posix?`${r.posix}:${s}`:s,r[i]={win32:n,posix:s}}return r}Ane.exports=XF});var CR=C((hyt,xne)=>{xne.exports=require("stream")});var Fne=C((fyt,kne)=>{"use strict";function vne(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function Zqe(t){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(r){var i={data:r,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=r+i.data;return n}},{key:"concat",value:function(r){if(this.length===0)return kB.alloc(0);for(var i=kB.allocUnsafe(r>>>0),n=this.head,s=0;n;)ije(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(r,i){var n;return ro.length?o.length:r;if(a===o.length?s+=o:s+=o.slice(0,r),r-=a,r===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(r){var i=kB.allocUnsafe(r),n=this.head,s=1;for(n.data.copy(i),r-=n.data.length;n=n.next;){var o=n.data,a=r>o.length?o.length:r;if(o.copy(i,i.length-r,0,a),r-=a,r===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:rje,value:function(r,i){return mR(this,Zqe({},i,{depth:0,customInspect:!1}))}}]),t}()});var ER=C((pyt,Rne)=>{"use strict";function nje(t,e){var r=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(IR,this,t)):process.nextTick(IR,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(s){!e&&s?r._writableState?r._writableState.errorEmitted?process.nextTick(vB,r):(r._writableState.errorEmitted=!0,process.nextTick(Nne,r,s)):process.nextTick(Nne,r,s):e?(process.nextTick(vB,r),e(s)):process.nextTick(vB,r)}),this)}function Nne(t,e){IR(t,e),vB(t)}function vB(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function sje(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function IR(t,e){t.emit("error",e)}function oje(t,e){var r=t._readableState,i=t._writableState;r&&r.autoDestroy||i&&i.autoDestroy?t.destroy(e):t.emit("error",e)}Rne.exports={destroy:nje,undestroy:sje,errorOrDestroy:oje}});var Na=C((dyt,Mne)=>{"use strict";var Lne={};function Sn(t,e,r){r||(r=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends r{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=r.name,n.prototype.code=t,Lne[t]=n}function Tne(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(i=>String(i)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function aje(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function Aje(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function lje(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Sn("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Sn("ERR_INVALID_ARG_TYPE",function(t,e,r){let i;typeof e=="string"&&aje(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(Aje(t," argument"))n=`The ${t} ${i} ${Tne(e,"type")}`;else{let s=lje(t,".")?"property":"argument";n=`The "${t}" ${s} ${i} ${Tne(e,"type")}`}return n+=`. Received type ${typeof r}`,n},TypeError);Sn("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Sn("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Sn("ERR_STREAM_PREMATURE_CLOSE","Premature close");Sn("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Sn("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Sn("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Sn("ERR_STREAM_WRITE_AFTER_END","write after end");Sn("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Sn("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Sn("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");Mne.exports.codes=Lne});var yR=C((Cyt,One)=>{"use strict";var cje=Na().codes.ERR_INVALID_OPT_VALUE;function uje(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function gje(t,e,r,i){var n=uje(e,i,r);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?r:"highWaterMark";throw new cje(s,n)}return Math.floor(n)}return t.objectMode?16:16*1024}One.exports={getHighWaterMark:gje}});var Kne=C((myt,BR)=>{typeof Object.create=="function"?BR.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:BR.exports=function(e,r){if(r){e.super_=r;var i=function(){};i.prototype=r.prototype,e.prototype=new i,e.prototype.constructor=e}}});var Ma=C((Iyt,wR)=>{try{if(QR=require("util"),typeof QR.inherits!="function")throw"";wR.exports=QR.inherits}catch(t){wR.exports=Kne()}var QR});var Hne=C((Eyt,Une)=>{Une.exports=require("util").deprecate});var SR=C((yyt,Gne)=>{"use strict";Gne.exports=nr;function Yne(t){var e=this;this.next=null,this.entry=null,this.finish=function(){hje(e,t)}}var Yu;nr.WritableState=cd;var fje={deprecate:Hne()},qne=CR(),PB=require("buffer").Buffer,pje=global.Uint8Array||function(){};function dje(t){return PB.from(t)}function Cje(t){return PB.isBuffer(t)||t instanceof pje}var bR=ER(),mje=yR(),Ije=mje.getHighWaterMark,La=Na().codes,Eje=La.ERR_INVALID_ARG_TYPE,yje=La.ERR_METHOD_NOT_IMPLEMENTED,Bje=La.ERR_MULTIPLE_CALLBACK,wje=La.ERR_STREAM_CANNOT_PIPE,Qje=La.ERR_STREAM_DESTROYED,bje=La.ERR_STREAM_NULL_VALUES,Dje=La.ERR_STREAM_WRITE_AFTER_END,Sje=La.ERR_UNKNOWN_ENCODING,qu=bR.errorOrDestroy;Ma()(nr,qne);function xje(){}function cd(t,e,r){Yu=Yu||Bl(),t=t||{},typeof r!="boolean"&&(r=e instanceof Yu),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=Ije(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=t.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){kje(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Yne(this)}cd.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(cd.prototype,"buffer",{get:fje.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}})();var FB;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(FB=Function.prototype[Symbol.hasInstance],Object.defineProperty(nr,Symbol.hasInstance,{value:function(e){return FB.call(this,e)?!0:this!==nr?!1:e&&e._writableState instanceof cd}})):FB=function(e){return e instanceof this};function nr(t){Yu=Yu||Bl();var e=this instanceof Yu;if(!e&&!FB.call(nr,this))return new nr(t);this._writableState=new cd(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),qne.call(this)}nr.prototype.pipe=function(){qu(this,new wje)};function vje(t,e){var r=new Dje;qu(t,r),process.nextTick(e,r)}function Pje(t,e,r,i){var n;return r===null?n=new bje:typeof r!="string"&&!e.objectMode&&(n=new Eje("chunk",["string","Buffer"],r)),n?(qu(t,n),process.nextTick(i,n),!1):!0}nr.prototype.write=function(t,e,r){var i=this._writableState,n=!1,s=!i.objectMode&&Cje(t);return s&&!PB.isBuffer(t)&&(t=dje(t)),typeof e=="function"&&(r=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof r!="function"&&(r=xje),i.ending?vje(this,r):(s||Pje(this,i,t,r))&&(i.pendingcb++,n=Fje(this,i,s,t,e,r)),n};nr.prototype.cork=function(){this._writableState.corked++};nr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&jne(this,t))};nr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new Sje(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(nr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function Rje(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=PB.from(e,r)),e}Object.defineProperty(nr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function Fje(t,e,r,i,n,s){if(!r){var o=Rje(e,i,n);i!==o&&(r=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var Uje=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};zne.exports=ks;var Vne=xR(),kR=SR();Ma()(ks,Vne);for(vR=Uje(kR.prototype),RB=0;RB{var MB=require("buffer"),Po=MB.Buffer;function Zne(t,e){for(var r in t)e[r]=t[r]}Po.from&&Po.alloc&&Po.allocUnsafe&&Po.allocUnsafeSlow?Xne.exports=MB:(Zne(MB,PR),PR.Buffer=ju);function ju(t,e,r){return Po(t,e,r)}Zne(Po,ju);ju.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return Po(t,e,r)};ju.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=Po(t);return e!==void 0?typeof r=="string"?i.fill(e,r):i.fill(e):i.fill(0),i};ju.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return Po(t)};ju.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return MB.SlowBuffer(t)}});var NR=C($ne=>{"use strict";var FR=_ne().Buffer,ese=FR.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function Yje(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function qje(t){var e=Yje(t);if(typeof e!="string"&&(FR.isEncoding===ese||!ese(t)))throw new Error("Unknown encoding: "+t);return e||t}$ne.StringDecoder=gd;function gd(t){this.encoding=qje(t);var e;switch(this.encoding){case"utf16le":this.text=Jje,this.end=Wje,e=4;break;case"utf8":this.fillLast=jje,e=4;break;case"base64":this.text=zje,this.end=Vje,e=3;break;default:this.write=Xje,this.end=Zje;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=FR.allocUnsafe(e)}gd.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function eJe(t,e,r){var i=e.length-1;if(i=0?(n>0&&(t.lastNeed=n-1),n):--i=0?(n>0&&(t.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:t.lastNeed=n-3),n):0))}function tJe(t,e,r){if((e[0]&192)!=128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return t.lastNeed=2,"\uFFFD"}}function jje(t){var e=this.lastTotal-this.lastNeed,r=tJe(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function $je(t,e){var r=eJe(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var i=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function _je(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function Jje(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var i=r.charCodeAt(r.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function Wje(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function zje(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function Vje(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function Xje(t){return t.toString(this.encoding)}function Zje(t){return t&&t.length?this.write(t):""}});var LB=C((Qyt,tse)=>{"use strict";var rse=Na().codes.ERR_STREAM_PREMATURE_CLOSE;function rJe(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,i=new Array(r),n=0;n{"use strict";var TB;function Ta(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var sJe=LB(),Oa=Symbol("lastResolve"),wl=Symbol("lastReject"),hd=Symbol("error"),OB=Symbol("ended"),Ql=Symbol("lastPromise"),MR=Symbol("handlePromise"),bl=Symbol("stream");function Ka(t,e){return{value:t,done:e}}function oJe(t){var e=t[Oa];if(e!==null){var r=t[bl].read();r!==null&&(t[Ql]=null,t[Oa]=null,t[wl]=null,e(Ka(r,!1)))}}function aJe(t){process.nextTick(oJe,t)}function AJe(t,e){return function(r,i){t.then(function(){if(e[OB]){r(Ka(void 0,!0));return}e[MR](r,i)},i)}}var lJe=Object.getPrototypeOf(function(){}),cJe=Object.setPrototypeOf((TB={get stream(){return this[bl]},next:function(){var e=this,r=this[hd];if(r!==null)return Promise.reject(r);if(this[OB])return Promise.resolve(Ka(void 0,!0));if(this[bl].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[hd]?a(e[hd]):o(Ka(void 0,!0))})});var i=this[Ql],n;if(i)n=new Promise(AJe(i,this));else{var s=this[bl].read();if(s!==null)return Promise.resolve(Ka(s,!1));n=new Promise(this[MR])}return this[Ql]=n,n}},Ta(TB,Symbol.asyncIterator,function(){return this}),Ta(TB,"return",function(){var e=this;return new Promise(function(r,i){e[bl].destroy(null,function(n){if(n){i(n);return}r(Ka(void 0,!0))})})}),TB),lJe),uJe=function(e){var r,i=Object.create(cJe,(r={},Ta(r,bl,{value:e,writable:!0}),Ta(r,Oa,{value:null,writable:!0}),Ta(r,wl,{value:null,writable:!0}),Ta(r,hd,{value:null,writable:!0}),Ta(r,OB,{value:e._readableState.endEmitted,writable:!0}),Ta(r,MR,{value:function(s,o){var a=i[bl].read();a?(i[Ql]=null,i[Oa]=null,i[wl]=null,s(Ka(a,!1))):(i[Oa]=s,i[wl]=o)},writable:!0}),r));return i[Ql]=null,sJe(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[wl];s!==null&&(i[Ql]=null,i[Oa]=null,i[wl]=null,s(n)),i[hd]=n;return}var o=i[Oa];o!==null&&(i[Ql]=null,i[Oa]=null,i[wl]=null,o(Ka(void 0,!0))),i[OB]=!0}),e.on("readable",aJe.bind(null,i)),i};nse.exports=uJe});var lse=C((Dyt,ose)=>{"use strict";function ase(t,e,r,i,n,s,o){try{var a=t[s](o),l=a.value}catch(c){r(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function gJe(t){return function(){var e=this,r=arguments;return new Promise(function(i,n){var s=t.apply(e,r);function o(l){ase(s,i,n,o,a,"next",l)}function a(l){ase(s,i,n,o,a,"throw",l)}o(void 0)})}}function Ase(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function fJe(t){for(var e=1;e{"use strict";cse.exports=Bt;var Ju;Bt.ReadableState=use;var Syt=require("events").EventEmitter,gse=function(e,r){return e.listeners(r).length},fd=CR(),KB=require("buffer").Buffer,CJe=global.Uint8Array||function(){};function mJe(t){return KB.from(t)}function IJe(t){return KB.isBuffer(t)||t instanceof CJe}var LR=require("util"),pt;LR&&LR.debuglog?pt=LR.debuglog("stream"):pt=function(){};var EJe=Fne(),TR=ER(),yJe=yR(),BJe=yJe.getHighWaterMark,UB=Na().codes,wJe=UB.ERR_INVALID_ARG_TYPE,QJe=UB.ERR_STREAM_PUSH_AFTER_EOF,bJe=UB.ERR_METHOD_NOT_IMPLEMENTED,DJe=UB.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Wu,OR,KR;Ma()(Bt,fd);var pd=TR.errorOrDestroy,UR=["error","close","destroy","pause","resume"];function SJe(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function use(t,e,r){Ju=Ju||Bl(),t=t||{},typeof r!="boolean"&&(r=e instanceof Ju),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=BJe(this,t,"readableHighWaterMark",r),this.buffer=new EJe,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Wu||(Wu=NR().StringDecoder),this.decoder=new Wu(t.encoding),this.encoding=t.encoding)}function Bt(t){if(Ju=Ju||Bl(),!(this instanceof Bt))return new Bt(t);var e=this instanceof Ju;this._readableState=new use(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),fd.call(this)}Object.defineProperty(Bt.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});Bt.prototype.destroy=TR.destroy;Bt.prototype._undestroy=TR.undestroy;Bt.prototype._destroy=function(t,e){e(t)};Bt.prototype.push=function(t,e){var r=this._readableState,i;return r.objectMode?i=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=KB.from(t,e),e=""),i=!0),hse(this,t,e,!1,i)};Bt.prototype.unshift=function(t){return hse(this,t,null,!0,!1)};function hse(t,e,r,i,n){pt("readableAddChunk",e);var s=t._readableState;if(e===null)s.reading=!1,kJe(t,s);else{var o;if(n||(o=xJe(s,e)),o)pd(t,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==KB.prototype&&(e=mJe(e)),i)s.endEmitted?pd(t,new DJe):HR(t,s,e,!0);else if(s.ended)pd(t,new QJe);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||e.length!==0?HR(t,s,e,!1):GR(t,s)):HR(t,s,e,!1)}else i||(s.reading=!1,GR(t,s))}return!s.ended&&(s.length=fse?t=fse:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function pse(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=vJe(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}Bt.prototype.read=function(t){pt("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return pt("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?YR(this):HB(this),null;if(t=pse(t,e),t===0&&e.ended)return e.length===0&&YR(this),null;var i=e.needReadable;pt("need readable",i),(e.length===0||e.length-t0?n=dse(t,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&YR(this)),n!==null&&this.emit("data",n),n};function kJe(t,e){if(pt("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?HB(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Cse(t)))}}function HB(t){var e=t._readableState;pt("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(pt("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(Cse,t))}function Cse(t){var e=t._readableState;pt("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,qR(t)}function GR(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(PJe,t,e))}function PJe(t,e){for(;!e.reading&&!e.ended&&(e.length1&&mse(i.pipes,t)!==-1)&&!c&&(pt("false write response, pause",i.awaitDrain),i.awaitDrain++),r.pause())}function h(I){pt("onerror",I),m(),t.removeListener("error",h),gse(t,"error")===0&&pd(t,I)}SJe(t,"error",h);function f(){t.removeListener("finish",p),m()}t.once("close",f);function p(){pt("onfinish"),t.removeListener("close",f),m()}t.once("finish",p);function m(){pt("unpipe"),r.unpipe(t)}return t.emit("pipe",r),i.flowing||(pt("pipe resume"),r.resume()),t};function FJe(t){return function(){var r=t._readableState;pt("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&gse(t,"data")&&(r.flowing=!0,qR(t))}}Bt.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):t==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,pt("on readable",i.length,i.reading),i.length?HB(this):i.reading||process.nextTick(RJe,this)),r};Bt.prototype.addListener=Bt.prototype.on;Bt.prototype.removeListener=function(t,e){var r=fd.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(Ise,this),r};Bt.prototype.removeAllListeners=function(t){var e=fd.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(Ise,this),e};function Ise(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function RJe(t){pt("readable nexttick read 0"),t.read(0)}Bt.prototype.resume=function(){var t=this._readableState;return t.flowing||(pt("resume"),t.flowing=!t.readableListening,NJe(this,t)),t.paused=!1,this};function NJe(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(MJe,t,e))}function MJe(t,e){pt("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),qR(t),e.flowing&&!e.reading&&t.read(0)}Bt.prototype.pause=function(){return pt("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(pt("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function qR(t){var e=t._readableState;for(pt("flow",e.flowing);e.flowing&&t.read()!==null;);}Bt.prototype.wrap=function(t){var e=this,r=this._readableState,i=!1;t.on("end",function(){if(pt("wrapped end"),r.decoder&&!r.ended){var o=r.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),t.on("data",function(o){if(pt("wrapped data"),r.decoder&&(o=r.decoder.write(o)),!(r.objectMode&&o==null)&&!(!r.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,t.pause())}});for(var n in t)this[n]===void 0&&typeof t[n]=="function"&&(this[n]=function(a){return function(){return t[a].apply(t,arguments)}}(n));for(var s=0;s=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function YR(t){var e=t._readableState;pt("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(LJe,e,t))}function LJe(t,e){if(pt("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(Bt.from=function(t,e){return KR===void 0&&(KR=lse()),KR(Bt,t,e)});function mse(t,e){for(var r=0,i=t.length;r{"use strict";Ese.exports=Fo;var GB=Na().codes,TJe=GB.ERR_METHOD_NOT_IMPLEMENTED,OJe=GB.ERR_MULTIPLE_CALLBACK,KJe=GB.ERR_TRANSFORM_ALREADY_TRANSFORMING,UJe=GB.ERR_TRANSFORM_WITH_LENGTH_0,YB=Bl();Ma()(Fo,YB);function HJe(t,e){var r=this._transformState;r.transforming=!1;var i=r.writecb;if(i===null)return this.emit("error",new OJe);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),i(t);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";Bse.exports=dd;var wse=jR();Ma()(dd,wse);function dd(t){if(!(this instanceof dd))return new dd(t);wse.call(this,t)}dd.prototype._transform=function(t,e,r){r(null,t)}});var kse=C((Pyt,bse)=>{"use strict";var JR;function YJe(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var Dse=Na().codes,qJe=Dse.ERR_MISSING_ARGS,jJe=Dse.ERR_STREAM_DESTROYED;function Sse(t){if(t)throw t}function JJe(t){return t.setHeader&&typeof t.abort=="function"}function WJe(t,e,r,i){i=YJe(i);var n=!1;t.on("close",function(){n=!0}),JR===void 0&&(JR=LB()),JR(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,JJe(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();i(o||new jJe("pipe"))}}}function xse(t){t()}function zJe(t,e){return t.pipe(e)}function VJe(t){return!t.length||typeof t[t.length-1]!="function"?Sse:t.pop()}function XJe(){for(var t=arguments.length,e=new Array(t),r=0;r0;return WJe(o,l,c,function(u){n||(n=u),u&&s.forEach(xse),!l&&(s.forEach(xse),i(n))})});return e.reduce(zJe)}bse.exports=XJe});var zu=C((xn,Cd)=>{var md=require("stream");process.env.READABLE_STREAM==="disable"&&md?(Cd.exports=md.Readable,Object.assign(Cd.exports,md),Cd.exports.Stream=md):(xn=Cd.exports=xR(),xn.Stream=md||xn,xn.Readable=xn,xn.Writable=SR(),xn.Duplex=Bl(),xn.Transform=jR(),xn.PassThrough=Qse(),xn.finished=LB(),xn.pipeline=kse())});var Fse=C((Fyt,vse)=>{"use strict";var{Buffer:Xn}=require("buffer"),Pse=Symbol.for("BufferList");function Kt(t){if(!(this instanceof Kt))return new Kt(t);Kt._init.call(this,t)}Kt._init=function(e){Object.defineProperty(this,Pse,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};Kt.prototype._new=function(e){return new Kt(e)};Kt.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let i=0;ithis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};Kt.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};Kt.prototype.copy=function(e,r,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||Xn.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&r||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:Xn.concat(this._bufs,this.length);for(let g=0;gh)this._bufs[g].copy(e,c,u),c+=h;else{this._bufs[g].copy(e,c,u,u+l),c+=h;break}l-=h,u&&(u=0)}return e.length>c?e.slice(0,c):e};Kt.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let i=this._offset(e),n=this._offset(r),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};Kt.prototype.toString=function(e,r,i){return this.slice(r,i).toString(e)};Kt.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};Kt.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=t.length){let l=o.indexOf(t,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-t.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,t))return l;s++}s=0}return-1};Kt.prototype._match=function(t,e){if(this.length-t{"use strict";var WR=zu().Duplex,ZJe=Ma(),Id=Fse();function si(t){if(!(this instanceof si))return new si(t);if(typeof t=="function"){this._callback=t;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),t=null}Id._init.call(this,t),WR.call(this)}ZJe(si,WR);Object.assign(si.prototype,Id.prototype);si.prototype._new=function(e){return new si(e)};si.prototype._write=function(e,r,i){this._appendBuffer(e),typeof i=="function"&&i()};si.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};si.prototype.end=function(e){WR.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};si.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};si.prototype._isBufferList=function(e){return e instanceof si||e instanceof Id||si.isBufferList(e)};si.isBufferList=Id.isBufferList;qB.exports=si;qB.exports.BufferListStream=si;qB.exports.BufferList=Id});var XR=C(Vu=>{var _Je=Buffer.alloc,$Je="0000000000000000000",e3e="7777777777777777777",Nse="0".charCodeAt(0),Mse=Buffer.from("ustar\0","binary"),t3e=Buffer.from("00","binary"),r3e=Buffer.from("ustar ","binary"),i3e=Buffer.from(" \0","binary"),n3e=parseInt("7777",8),Ed=257,zR=263,s3e=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},o3e=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},a3e=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},Lse=function(t,e,r,i){for(;re?e3e.slice(0,e)+" ":$Je.slice(0,e-t.length)+t+" "};function A3e(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],i=t.length-1;i>0;i--){var n=t[i];e?r.push(n):r.push(255-n)}var s=0,o=r.length;for(i=0;i=Math.pow(10,r)&&r++,e+r+t};Vu.decodeLongPath=function(t,e){return Xu(t,0,t.length,e)};Vu.encodePax=function(t){var e="";t.name&&(e+=VR(" path="+t.name+` -`)),t.linkname&&(e+=VR(" linkpath="+t.linkname+` -`));var r=t.pax;if(r)for(var i in r)e+=VR(" "+i+"="+r[i]+` -`);return Buffer.from(e)};Vu.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var n=r.indexOf("/");if(n===-1)return null;i+=i?"/"+r.slice(0,n):r.slice(0,n),r=r.slice(n+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(Ua(t.mode&n3e,6),100),e.write(Ua(t.uid,6),108),e.write(Ua(t.gid,6),116),e.write(Ua(t.size,11),124),e.write(Ua(t.mtime.getTime()/1e3|0,11),136),e[156]=Nse+a3e(t.type),t.linkname&&e.write(t.linkname,157),Mse.copy(e,Ed),t3e.copy(e,zR),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(Ua(t.devmajor||0,6),329),e.write(Ua(t.devminor||0,6),337),i&&e.write(i,345),e.write(Ua(Tse(e),6),148),e)};Vu.decode=function(t,e,r){var i=t[156]===0?0:t[156]-Nse,n=Xu(t,0,100,e),s=Ha(t,100,8),o=Ha(t,108,8),a=Ha(t,116,8),l=Ha(t,124,12),c=Ha(t,136,12),u=o3e(i),g=t[157]===0?null:Xu(t,157,100,e),h=Xu(t,265,32),f=Xu(t,297,32),p=Ha(t,329,8),m=Ha(t,337,8),I=Tse(t);if(I===8*32)return null;if(I!==Ha(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(Mse.compare(t,Ed,Ed+6)===0)t[345]&&(n=Xu(t,345,155,e)+"/"+n);else if(!(r3e.compare(t,Ed,Ed+6)===0&&i3e.compare(t,zR,zR+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:h,gname:f,devmajor:p,devminor:m}}});var qse=C((Myt,Ose)=>{var Kse=require("util"),l3e=Rse(),yd=XR(),Use=zu().Writable,Hse=zu().PassThrough,Gse=function(){},Yse=function(t){return t&=511,t&&512-t},c3e=function(t,e){var r=new jB(t,e);return r.end(),r},u3e=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},jB=function(t,e){this._parent=t,this.offset=e,Hse.call(this,{autoDestroy:!1})};Kse.inherits(jB,Hse);jB.prototype.destroy=function(t){this._parent.destroy(t)};var Ro=function(t){if(!(this instanceof Ro))return new Ro(t);Use.call(this,t),t=t||{},this._offset=0,this._buffer=l3e(),this._missing=0,this._partial=!1,this._onparse=Gse,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,i=function(){e._continue()},n=function(h){if(e._locked=!1,h)return e.destroy(h);e._stream||i()},s=function(){e._stream=null;var h=Yse(e._header.size);h?e._parse(h,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(Yse(e._header.size)),e._parse(512,g),i()},a=function(){var h=e._header.size;e._paxGlobal=yd.decodePax(r.slice(0,h)),r.consume(h),s()},l=function(){var h=e._header.size;e._pax=yd.decodePax(r.slice(0,h)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(h),s()},c=function(){var h=e._header.size;this._gnuLongPath=yd.decodeLongPath(r.slice(0,h),t.filenameEncoding),r.consume(h),s()},u=function(){var h=e._header.size;this._gnuLongLinkPath=yd.decodeLongPath(r.slice(0,h),t.filenameEncoding),r.consume(h),s()},g=function(){var h=e._offset,f;try{f=e._header=yd.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(p){e.emit("error",p)}if(r.consume(512),!f){e._parse(512,g),i();return}if(f.type==="gnu-long-path"){e._parse(f.size,c),i();return}if(f.type==="gnu-long-link-path"){e._parse(f.size,u),i();return}if(f.type==="pax-global-header"){e._parse(f.size,a),i();return}if(f.type==="pax-header"){e._parse(f.size,l),i();return}if(e._gnuLongPath&&(f.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(f.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=f=u3e(f,e._pax),e._pax=null),e._locked=!0,!f.size||f.type==="directory"){e._parse(512,g),e.emit("entry",f,c3e(e,h),n);return}e._stream=new jB(e,h),e.emit("entry",f,e._stream,n),e._parse(f.size,s),i()};this._onheader=g,this._parse(512,g)};Kse.inherits(Ro,Use);Ro.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};Ro.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};Ro.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=Gse,this._overflow?this._write(this._overflow,void 0,t):t()}};Ro.prototype._write=function(t,e,r){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(t.length&&(this._partial=!0),t.lengths&&(o=t.slice(s),t=t.slice(0,s)),i?i.end(t):n.append(t),this._overflow=o,this._onparse()}};Ro.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};Ose.exports=Ro});var Jse=C((Lyt,jse)=>{jse.exports=require("fs").constants||require("constants")});var Zse=C((Tyt,Wse)=>{var Zu=Jse(),zse=Jb(),JB=Ma(),g3e=Buffer.alloc,Vse=zu().Readable,_u=zu().Writable,h3e=require("string_decoder").StringDecoder,WB=XR(),f3e=parseInt("755",8),p3e=parseInt("644",8),Xse=g3e(1024),ZR=function(){},_R=function(t,e){e&=511,e&&t.push(Xse.slice(0,512-e))};function d3e(t){switch(t&Zu.S_IFMT){case Zu.S_IFBLK:return"block-device";case Zu.S_IFCHR:return"character-device";case Zu.S_IFDIR:return"directory";case Zu.S_IFIFO:return"fifo";case Zu.S_IFLNK:return"symlink"}return"file"}var zB=function(t){_u.call(this),this.written=0,this._to=t,this._destroyed=!1};JB(zB,_u);zB.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};zB.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var VB=function(){_u.call(this),this.linkname="",this._decoder=new h3e("utf-8"),this._destroyed=!1};JB(VB,_u);VB.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};VB.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Bd=function(){_u.call(this),this._destroyed=!1};JB(Bd,_u);Bd.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};Bd.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var vs=function(t){if(!(this instanceof vs))return new vs(t);Vse.call(this,t),this._drain=ZR,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};JB(vs,Vse);vs.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=ZR);var i=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=d3e(t.mode)),t.mode||(t.mode=t.type==="directory"?f3e:p3e),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var n=this.push(e);return _R(i,t.size),n?process.nextTick(r):this._drain=r,new Bd}if(t.type==="symlink"&&!t.linkname){var s=new VB;return zse(s,function(a){if(a)return i.destroy(),r(a);t.linkname=s.linkname,i._encode(t),r()}),s}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new Bd;var o=new zB(this);return this._stream=o,zse(o,function(a){if(i._stream=null,a)return i.destroy(),r(a);if(o.written!==t.size)return i.destroy(),r(new Error("size mismatch"));_R(i,t.size),i._finalizing&&i.finalize(),r()}),o}};vs.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(Xse),this.push(null))};vs.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};vs.prototype._encode=function(t){if(!t.pax){var e=WB.encode(t);if(e){this.push(e);return}}this._encodePax(t)};vs.prototype._encodePax=function(t){var e=WB.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(WB.encode(r)),this.push(e),_R(this,e.length),r.size=t.size,r.type=t.type,this.push(WB.encode(r))};vs.prototype._read=function(t){var e=this._drain;this._drain=ZR,e()};Wse.exports=vs});var _se=C($R=>{$R.extract=qse();$R.pack=Zse()});var uoe=C((oBt,aoe)=>{"use strict";var $u=class{constructor(e,r,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=r||{},this.__providers=loe(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return sN(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[i,n]of this.entries())e.call(r,n,i,this)}toJSON(){let e={};return this.forEach((r,i)=>{e[i]=r}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let r=e||this.__opts.other;if(r){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(r):k3e(n);for(let[o,a]of s)r(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new $u(this.__specs,this.__opts,loe(this.__providers).concat(e)),Aoe)}};try{let t=require("util");$u.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch(t){}function v3e(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function sN(t,e,r){let i=t.__specs[e];if(r&&!i&&(!t.__opts.other||!t.__opts.other(e)))v3e(e);else{i||(i={});let n;for(let s of t.__providers){if(n=coe(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=coe(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(t):i.default:n}}function coe(t,e){let r;return e.__isFiggyPudding?r=sN(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var Aoe={has(t,e){return e in t.__specs&&sN(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in $u.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};aoe.exports=P3e;function P3e(t,e){function r(...i){return new Proxy(new $u(t,e,i),Aoe)}return r}function loe(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function k3e(t){return Object.keys(t).map(e=>[e,t[e]])}});var foe=C((aBt,Ps)=>{"use strict";var Qd=require("crypto"),F3e=uoe(),R3e=require("stream").Transform,goe=["sha256","sha384","sha512"],N3e=/^[a-z0-9+/]+(?:=?=?)$/i,M3e=/^([^-]+)-([^?]+)([?\S*]*)$/,L3e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,T3e=/^[\x21-\x7E]+$/,Bi=F3e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>O3e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),Dl=class{get isHash(){return!0}constructor(e,r){r=Bi(r);let i=!!r.strict;this.source=e.trim();let n=this.source.match(i?L3e:M3e);if(!n||i&&!goe.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=Bi(e),e.strict&&!(goe.some(i=>i===this.algorithm)&&this.digest.match(N3e)&&(this.options||[]).every(i=>i.match(T3e))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},eg=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=Bi(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>Dl.prototype.toString.call(n,e)).filter(n=>n.length).join(r)).filter(i=>i.length).join(r)}concat(e,r){r=Bi(r);let i=typeof e=="string"?e:bd(e,r);return Fs(`${this.toString(r)} ${i}`,r)}hexDigest(){return Fs(this,{single:!0}).hexDigest()}match(e,r){r=Bi(r);let i=Fs(e,r),n=i.pickAlgorithm(r);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=Bi(e);let r=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>r(n,s)||n)}};Ps.exports.parse=Fs;function Fs(t,e){if(e=Bi(e),typeof t=="string")return oN(t,e);if(t.algorithm&&t.digest){let r=new eg;return r[t.algorithm]=[t],oN(bd(r,e),e)}else return oN(bd(t,e),e)}function oN(t,e){return e.single?new Dl(t,e):t.trim().split(/\s+/).reduce((r,i)=>{let n=new Dl(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;r[s]||(r[s]=[]),r[s].push(n)}return r},new eg)}Ps.exports.stringify=bd;function bd(t,e){return e=Bi(e),t.algorithm&&t.digest?Dl.prototype.toString.call(t,e):typeof t=="string"?bd(Fs(t,e),e):eg.prototype.toString.call(t,e)}Ps.exports.fromHex=K3e;function K3e(t,e,r){r=Bi(r);let i=r.options&&r.options.length?`?${r.options.join("?")}`:"";return Fs(`${e}-${Buffer.from(t,"hex").toString("base64")}${i}`,r)}Ps.exports.fromData=U3e;function U3e(t,e){e=Bi(e);let r=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((n,s)=>{let o=Qd.createHash(s).update(t).digest("base64"),a=new Dl(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new eg)}Ps.exports.fromStream=H3e;function H3e(t,e){e=Bi(e);let r=e.Promise||Promise,i=aN(e);return new r((n,s)=>{t.pipe(i),t.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}Ps.exports.checkData=G3e;function G3e(t,e,r){if(r=Bi(r),e=Fs(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(r),n=Qd.createHash(i).update(t).digest("base64"),s=Fs({algorithm:i,digest:n}),o=s.match(e,r);if(o||!r.error)return o;if(typeof r.size=="number"&&t.length!==r.size){let a=new Error(`data size mismatch when checking ${e}. - Wanted: ${r.size} - Found: ${t.length}`);throw a.code="EBADSIZE",a.found=t.length,a.expected=r.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${t.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}Ps.exports.checkStream=Y3e;function Y3e(t,e,r){r=Bi(r);let i=r.Promise||Promise,n=aN(r.concat({integrity:e}));return new i((s,o)=>{t.pipe(n),t.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}Ps.exports.integrityStream=aN;function aN(t){t=Bi(t);let e=t.integrity&&Fs(t.integrity,t),r=e&&Object.keys(e).length,i=r&&e.pickAlgorithm(t),n=r&&e[i],s=Array.from(new Set(t.algorithms.concat(i?[i]:[]))),o=s.map(Qd.createHash),a=0,l=new R3e({transform(c,u,g){a+=c.length,o.forEach(h=>h.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=t.options&&t.options.length?`?${t.options.join("?")}`:"",u=Fs(o.map((h,f)=>`${s[f]}-${h.digest("base64")}${c}`).join(" "),t),g=r&&u.match(e,t);if(typeof t.size=="number"&&a!==t.size){let h=new Error(`stream size mismatch when checking ${e}. - Wanted: ${t.size} - Found: ${a}`);h.code="EBADSIZE",h.found=a,h.expected=t.size,h.sri=e,l.emit("error",h)}else if(t.integrity&&!g){let h=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);h.code="EINTEGRITY",h.found=u,h.expected=n,h.algorithm=i,h.sri=e,l.emit("error",h)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}Ps.exports.create=q3e;function q3e(t){t=Bi(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",i=e.map(Qd.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new Dl(`${a}-${l}${r}`,t);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new eg)}}}var j3e=new Set(Qd.getHashes()),hoe=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>j3e.has(t));function O3e(t,e){return hoe.indexOf(t.toLowerCase())>=hoe.indexOf(e.toLowerCase())?t:e}});var Gf={};$e(Gf,{BuildType:()=>_i,Cache:()=>mt,Configuration:()=>ce,DEFAULT_LOCK_FILENAME:()=>yk,DEFAULT_RC_FILENAME:()=>Ek,FormatType:()=>ys,InstallMode:()=>Mr,LightReport:()=>Eo,LinkType:()=>lt,Manifest:()=>Je,MessageName:()=>J,PackageExtensionStatus:()=>Xr,PackageExtensionType:()=>Pr,Project:()=>Le,ProjectLookup:()=>wa,Report:()=>pi,ReportError:()=>et,SettingsType:()=>ge,StreamReport:()=>Pe,TAG_REGEXP:()=>tu,TelemetryManager:()=>Hf,ThrowReport:()=>Dr,VirtualFetcher:()=>bf,Workspace:()=>Uf,WorkspaceResolver:()=>Ir,YarnVersion:()=>Qr,execUtils:()=>Hr,folderUtils:()=>iQ,formatUtils:()=>Ae,hashUtils:()=>ki,httpUtils:()=>Mt,miscUtils:()=>fe,scriptUtils:()=>kt,semverUtils:()=>Ft,structUtils:()=>b,tgzUtils:()=>Nr,treeUtils:()=>Yn});var Hr={};$e(Hr,{EndStrategy:()=>on,execvp:()=>xAe,pipevp:()=>js});var Rg={};$e(Rg,{AliasFS:()=>eA,CwdFS:()=>Dt,DEFAULT_COMPRESSION_LEVEL:()=>$a,FakeFS:()=>Uo,Filename:()=>Et,JailFS:()=>Ys,LazyFS:()=>kg,LinkStrategy:()=>wg,NoFS:()=>TC,NodeFS:()=>Nt,PortablePath:()=>Se,PosixFS:()=>vg,ProxiedFS:()=>Ur,VirtualFS:()=>ar,ZipFS:()=>kr,ZipOpenFS:()=>sn,constants:()=>$t,extendFs:()=>KC,normalizeLineEndings:()=>Pl,npath:()=>L,opendir:()=>NC,patchFs:()=>Gw,ppath:()=>D,statUtils:()=>kw,toFilename:()=>or,xfs:()=>M});var $t={};$e($t,{SAFE_TIME:()=>xw,S_IFDIR:()=>Us,S_IFLNK:()=>Gs,S_IFMT:()=>Gi,S_IFREG:()=>Hs});var Gi=61440,Us=16384,Hs=32768,Gs=40960,xw=456789e3;var kw={};$e(kw,{BigIntStatsEntry:()=>Eg,DEFAULT_MODE:()=>Ig,DirEntry:()=>_N,StatEntry:()=>Oo,areStatsEqual:()=>Pw,clearStats:()=>SC,convertToBigIntStats:()=>xC,makeDefaultStats:()=>yg,makeEmptyStats:()=>Uae});var vw=ne(require("util"));var Ig=Hs|420,_N=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&Gi)===Us}isFIFO(){return!1}isFile(){return(this.mode&Gi)===Hs}isSocket(){return!1}isSymbolicLink(){return(this.mode&Gi)===Gs}},Oo=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=Ig;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&Gi)===Us}isFIFO(){return!1}isFile(){return(this.mode&Gi)===Hs}isSocket(){return!1}isSymbolicLink(){return(this.mode&Gi)===Gs}},Eg=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(Ig);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(Gi))===BigInt(Us)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(Gi))===BigInt(Hs)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(Gi))===BigInt(Gs)}};function yg(){return new Oo}function Uae(){return SC(yg())}function SC(t){for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):vw.types.isDate(r)&&(t[e]=new Date(0))}return t}function xC(t){let e=new Eg;for(let r in t)if(Object.prototype.hasOwnProperty.call(t,r)){let i=t[r];typeof i=="number"?e[r]=BigInt(i):vw.types.isDate(i)&&(e[r]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function Pw(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,i=e;return!(r.atimeNs!==i.atimeNs||r.mtimeNs!==i.mtimeNs||r.ctimeNs!==i.ctimeNs||r.birthtimeNs!==i.birthtimeNs)}var vC=ne(require("fs"));var Bg=ne(require("path")),$N;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})($N||($N={}));var Se={root:"/",dot:"."},Et={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},L=Object.create(Bg.default),D=Object.create(Bg.default.posix);L.cwd=()=>process.cwd();D.cwd=()=>Fw(process.cwd());D.resolve=(...t)=>t.length>0&&D.isAbsolute(t[0])?Bg.default.posix.resolve(...t):Bg.default.posix.resolve(D.cwd(),...t);var eM=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};L.fromPortablePath=tM;L.toPortablePath=Fw;L.contains=(t,e)=>eM(L,t,e);D.contains=(t,e)=>eM(D,t,e);var Hae=/^([a-zA-Z]:.*)$/,Gae=/^\\\\(\.\\)?(.*)$/,Yae=/^\/([a-zA-Z]:.*)$/,qae=/^\/unc\/(\.dot\/)?(.*)$/;function tM(t){if(process.platform!=="win32")return t;let e,r;if(e=t.match(Yae))t=e[1];else if(r=t.match(qae))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function Fw(t){if(process.platform!=="win32")return t;let e,r;return(e=t.match(Hae))?t=`/${e[1]}`:(r=t.match(Gae))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t.replace(/\\/g,"/")}function kC(t,e){return t===L?tM(e):Fw(e)}function or(t){if(L.parse(t).dir!==""||D.parse(t).dir!=="")throw new Error(`Invalid filename: "${t}"`);return t}var PC=new Date(xw*1e3),wg;(function(r){r.Allow="allow",r.ReadOnly="readOnly"})(wg||(wg={}));async function rM(t,e,r,i,n){let s=t.pathUtils.normalize(e),o=r.pathUtils.normalize(i),a=[],l=[],c=n.stableTime?{mtime:PC,atime:PC}:await r.lstatPromise(o);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[c.atime,c.mtime]});let u=typeof t.lutimesPromise=="function"?t.lutimesPromise.bind(t):t.utimesPromise.bind(t);await Rw(a,l,u,t,s,r,o,n);for(let g of a)await g();await Promise.all(l.map(g=>g()))}async function Rw(t,e,r,i,n,s,o,a){var h,f;let l=await jae(i,n),c=await s.lstatPromise(o),u=a.stableTime?{mtime:PC,atime:PC}:c,g;switch(!0){case c.isDirectory():g=await Jae(t,e,r,i,n,l,s,o,c,a);break;case c.isFile():g=await Wae(t,e,r,i,n,l,s,o,c,a);break;case c.isSymbolicLink():g=await zae(t,e,r,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(g||((h=l==null?void 0:l.mtime)==null?void 0:h.getTime())!==u.mtime.getTime()||((f=l==null?void 0:l.atime)==null?void 0:f.getTime())!==u.atime.getTime())&&(e.push(()=>r(n,u.atime,u.mtime)),g=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),g=!0),g}async function jae(t,e){try{return await t.lstatPromise(e)}catch(r){return null}}async function Jae(t,e,r,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(t.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(h){if(h.code!=="EEXIST")throw h}}),u=!0);let g=await o.readdirPromise(a);if(c.stableSort)for(let h of g.sort())await Rw(t,e,r,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),c)&&(u=!0);else(await Promise.all(g.map(async f=>{await Rw(t,e,r,i,i.pathUtils.join(n,f),o,o.pathUtils.join(a,f),c)}))).some(f=>f)&&(u=!0);return u}var Nw=new WeakMap;function Mw(t,e,r,i,n){return async()=>{await t.linkPromise(r,e),n===wg.ReadOnly&&(i.mode&=~146,await t.chmodPromise(e,i.mode))}}function Vae(t,e,r,i,n){let s=Nw.get(t);return typeof s=="undefined"?async()=>{try{await t.copyFilePromise(r,e,vC.default.constants.COPYFILE_FICLONE_FORCE),Nw.set(t,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")Nw.set(t,!1),await Mw(t,e,r,i,n)();else throw o}}:s?async()=>t.copyFilePromise(r,e,vC.default.constants.COPYFILE_FICLONE_FORCE):Mw(t,e,r,i,n)}async function Wae(t,e,r,i,n,s,o,a,l,c){var h;if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(h=c.linkStrategy)!=null?h:null,g=i===o?u!==null?Vae(i,n,a,l,u):async()=>i.copyFilePromise(a,n,vC.default.constants.COPYFILE_FICLONE):u!==null?Mw(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return t.push(async()=>g()),!0}async function zae(t,e,r,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;return t.push(async()=>{await i.symlinkPromise(kC(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function nn(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function FC(t){return nn("EBUSY",t)}function Qg(t,e){return nn("ENOSYS",`${t}, ${e}`)}function Ko(t){return nn("EINVAL",`invalid argument, ${t}`)}function oi(t){return nn("EBADF",`bad file descriptor, ${t}`)}function Fn(t){return nn("ENOENT",`no such file or directory, ${t}`)}function ts(t){return nn("ENOTDIR",`not a directory, ${t}`)}function bg(t){return nn("EISDIR",`illegal operation on a directory, ${t}`)}function RC(t){return nn("EEXIST",`file already exists, ${t}`)}function bi(t){return nn("EROFS",`read-only filesystem, ${t}`)}function iM(t){return nn("ENOTEMPTY",`directory not empty, ${t}`)}function nM(t){return nn("EOPNOTSUPP",`operation not supported, ${t}`)}function sM(){return nn("ERR_DIR_CLOSED","Directory handle was closed")}var Lw=class extends Error{constructor(e,r){super(e);this.name="Libzip Error",this.code=r}};var oM=class{constructor(e,r,i={}){this.path=e;this.nextDirent=r;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw sM()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e!="undefined"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,r;this.throwIfClosed(),(r=(e=this.opts).onClose)==null||r.call(e),this.closed=!0}};function NC(t,e,r,i){let n=()=>{let s=r.shift();return typeof s=="undefined"?null:Object.assign(t.statSync(t.pathUtils.join(e,s)),{name:s})};return new oM(e,n,i)}var aM=ne(require("os"));var Uo=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(r)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:r=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(r){let o=await this.readdirPromise(e);await Promise.all(o.map(a=>this.removePromise(this.pathUtils.resolve(e,a))))}let s=0;do try{await this.rmdirPromise(e);break}catch(o){if(o.code==="EBUSY"||o.code==="ENOTEMPTY"){if(i===0)break;await new Promise(a=>setTimeout(a,s*100));continue}else throw o}while(s++{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,r){return await this.writeFilePromise(e,`${JSON.stringify(r,null,2)} -`)}writeJsonSync(e,r){return this.writeFileSync(e,`${JSON.stringify(r,null,2)} -`)}async preserveTimePromise(e,r){let i=await this.lstatPromise(e),n=await r();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,r){let i=this.lstatSync(e),n=r();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},Xa=class extends Uo{constructor(){super(D)}};function Xae(t){let e=t.match(/\r?\n/g);if(e===null)return aM.EOL;let r=e.filter(n=>n===`\r -`).length,i=e.length-r;return r>i?`\r -`:` -`}function Pl(t,e){return e.replace(/\r?\n/g,Xae(t))}var Fl=ne(require("fs")),Tw=ne(require("stream")),uM=ne(require("util")),Ow=ne(require("zlib"));var AM=ne(require("fs"));var Nt=class extends Xa{constructor(e=AM.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Se.root}resolve(e){return D.resolve(e)}async openPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.open(L.fromPortablePath(e),r,i,this.makeCallback(n,s))})}openSync(e,r,i){return this.realFs.openSync(L.fromPortablePath(e),r,i)}async opendirPromise(e,r){return await new Promise((i,n)=>{typeof r!="undefined"?this.realFs.opendir(L.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.opendir(L.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,r){let i=typeof r!="undefined"?this.realFs.opendirSync(L.fromPortablePath(e),r):this.realFs.opendirSync(L.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,r,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,r,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,r,i,n,s){return this.realFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return await new Promise((o,a)=>typeof r=="string"?this.realFs.write(e,r,i,this.makeCallback(o,a)):this.realFs.write(e,r,i,n,s,this.makeCallback(o,a)))}writeSync(e,r,i,n,s){return typeof r=="string"?this.realFs.writeSync(e,r,i):this.realFs.writeSync(e,r,i,n,s)}async closePromise(e){await new Promise((r,i)=>{this.realFs.close(e,this.makeCallback(r,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let i=e!==null?L.fromPortablePath(e):e;return this.realFs.createReadStream(i,r)}createWriteStream(e,r){let i=e!==null?L.fromPortablePath(e):e;return this.realFs.createWriteStream(i,r)}async realpathPromise(e){return await new Promise((r,i)=>{this.realFs.realpath(L.fromPortablePath(e),{},this.makeCallback(r,i))}).then(r=>L.toPortablePath(r))}realpathSync(e){return L.toPortablePath(this.realFs.realpathSync(L.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(L.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(L.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((i,n)=>{this.realFs.access(L.fromPortablePath(e),r,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(L.fromPortablePath(e))}async statPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.stat(L.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.stat(L.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,r){return r?this.realFs.statSync(L.fromPortablePath(e),r):this.realFs.statSync(L.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.fstat(e,r,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.lstat(L.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.lstat(L.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,r){return r?this.realFs.lstatSync(L.fromPortablePath(e),r):this.realFs.lstatSync(L.fromPortablePath(e))}async chmodPromise(e,r){return await new Promise((i,n)=>{this.realFs.chmod(L.fromPortablePath(e),r,this.makeCallback(i,n))})}chmodSync(e,r){return this.realFs.chmodSync(L.fromPortablePath(e),r)}async chownPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.chown(L.fromPortablePath(e),r,i,this.makeCallback(n,s))})}chownSync(e,r,i){return this.realFs.chownSync(L.fromPortablePath(e),r,i)}async renamePromise(e,r){return await new Promise((i,n)=>{this.realFs.rename(L.fromPortablePath(e),L.fromPortablePath(r),this.makeCallback(i,n))})}renameSync(e,r){return this.realFs.renameSync(L.fromPortablePath(e),L.fromPortablePath(r))}async copyFilePromise(e,r,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(L.fromPortablePath(e),L.fromPortablePath(r),i,this.makeCallback(n,s))})}copyFileSync(e,r,i=0){return this.realFs.copyFileSync(L.fromPortablePath(e),L.fromPortablePath(r),i)}async appendFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?L.fromPortablePath(e):e;i?this.realFs.appendFile(o,r,i,this.makeCallback(n,s)):this.realFs.appendFile(o,r,this.makeCallback(n,s))})}appendFileSync(e,r,i){let n=typeof e=="string"?L.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,r,i):this.realFs.appendFileSync(n,r)}async writeFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?L.fromPortablePath(e):e;i?this.realFs.writeFile(o,r,i,this.makeCallback(n,s)):this.realFs.writeFile(o,r,this.makeCallback(n,s))})}writeFileSync(e,r,i){let n=typeof e=="string"?L.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,r,i):this.realFs.writeFileSync(n,r)}async unlinkPromise(e){return await new Promise((r,i)=>{this.realFs.unlink(L.fromPortablePath(e),this.makeCallback(r,i))})}unlinkSync(e){return this.realFs.unlinkSync(L.fromPortablePath(e))}async utimesPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.utimes(L.fromPortablePath(e),r,i,this.makeCallback(n,s))})}utimesSync(e,r,i){this.realFs.utimesSync(L.fromPortablePath(e),r,i)}async lutimesPromiseImpl(e,r,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw Qg("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,L.fromPortablePath(e),r,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,r,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw Qg("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,L.fromPortablePath(e),r,i)}async mkdirPromise(e,r){return await new Promise((i,n)=>{this.realFs.mkdir(L.fromPortablePath(e),r,this.makeCallback(i,n))})}mkdirSync(e,r){return this.realFs.mkdirSync(L.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.rmdir(L.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.rmdir(L.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,r){return this.realFs.rmdirSync(L.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((i,n)=>{this.realFs.link(L.fromPortablePath(e),L.fromPortablePath(r),this.makeCallback(i,n))})}linkSync(e,r){return this.realFs.linkSync(L.fromPortablePath(e),L.fromPortablePath(r))}async symlinkPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.symlink(L.fromPortablePath(e.replace(/\/+$/,"")),L.fromPortablePath(r),i,this.makeCallback(n,s))})}symlinkSync(e,r,i){return this.realFs.symlinkSync(L.fromPortablePath(e.replace(/\/+$/,"")),L.fromPortablePath(r),i)}async readFilePromise(e,r){return await new Promise((i,n)=>{let s=typeof e=="string"?L.fromPortablePath(e):e;this.realFs.readFile(s,r,this.makeCallback(i,n))})}readFileSync(e,r){let i=typeof e=="string"?L.fromPortablePath(e):e;return this.realFs.readFileSync(i,r)}async readdirPromise(e,r){return await new Promise((i,n)=>{(r==null?void 0:r.withFileTypes)?this.realFs.readdir(L.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(L.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,r){return(r==null?void 0:r.withFileTypes)?this.realFs.readdirSync(L.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(L.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,i)=>{this.realFs.readlink(L.fromPortablePath(e),this.makeCallback(r,i))}).then(r=>L.toPortablePath(r))}readlinkSync(e){return L.toPortablePath(this.realFs.readlinkSync(L.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((i,n)=>{this.realFs.truncate(L.fromPortablePath(e),r,this.makeCallback(i,n))})}truncateSync(e,r){return this.realFs.truncateSync(L.fromPortablePath(e),r)}watch(e,r,i){return this.realFs.watch(L.fromPortablePath(e),r,i)}watchFile(e,r,i){return this.realFs.watchFile(L.fromPortablePath(e),r,i)}unwatchFile(e,r){return this.realFs.unwatchFile(L.fromPortablePath(e),r)}makeCallback(e,r){return(i,n)=>{i?r(i):e(n)}}};var lM=ne(require("events"));var Za;(function(r){r.Change="change",r.Stop="stop"})(Za||(Za={}));var _a;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(_a||(_a={}));function cM(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var Dg=class extends lM.EventEmitter{constructor(e,r,{bigint:i=!1}={}){super();this.status=_a.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=r,this.bigint=i,this.lastStats=this.stat()}static create(e,r,i){let n=new Dg(e,r,i);return n.start(),n}start(){cM(this.status,_a.Ready),this.status=_a.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(Za.Change,this.lastStats,this.lastStats)},3)}stop(){cM(this.status,_a.Running),this.status=_a.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(Za.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){if(e.code==="ENOENT"){let r=this.bigint?new Eg:new Oo;return SC(r)}else throw e}}makeInterval(e){let r=setInterval(()=>{let i=this.stat(),n=this.lastStats;Pw(i,n)||(this.lastStats=i,this.emit(Za.Change,i,n))},e.interval);return e.persistent?r:r.unref()}registerChangeListener(e,r){this.addListener(Za.Change,e),this.changeListeners.set(e,this.makeInterval(r))}unregisterChangeListener(e){this.removeListener(Za.Change,e);let r=this.changeListeners.get(e);typeof r!="undefined"&&clearInterval(r),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var MC=new WeakMap;function LC(t,e,r,i){let n,s,o,a;switch(typeof r){case"function":n=!1,s=!0,o=5007,a=r;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=r),a=i;break}let l=MC.get(t);typeof l=="undefined"&&MC.set(t,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=Dg.create(t,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function Sg(t,e,r){let i=MC.get(t);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof r=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(r),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function xg(t){let e=MC.get(t);if(typeof e!="undefined")for(let r of e.keys())Sg(t,r)}var $a="mixed";function Zae(t){if(typeof t=="string"&&String(+t)===t)return+t;if(Number.isFinite(t))return t<0?Date.now()/1e3:t;if((0,uM.isDate)(t))return t.getTime()/1e3;throw new Error("Invalid time")}function gM(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var kr=class extends Xa{constructor(e,r){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=r.libzip;let i=r;if(this.level=typeof i.level!="undefined"?i.level:$a,e!=null||(e=gM()),typeof e=="string"){let{baseFs:o=new Nt}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(r.stats)this.stats=r.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=yg();else throw o}else this.stats=yg();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),r.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(L.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Se.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(r,r+e);return Buffer.from(n)}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw FC("archive closed, close");xg(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===Ig?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,gM(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return D.resolve(Se.root,e)}async openPromise(e,r,i){return this.openSync(e,r,i)}openSync(e,r,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,r){return this.opendirSync(e,r)}opendirSync(e,r={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw Fn(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw ts(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return NC(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,r,i,n,s){return this.readSync(e,r,i,n,s)}readSync(e,r,i=0,n=0,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw oi("read");let a;s===-1||s===null?a=o.cursor:a=s;let l=this.readFileSync(o.p);l.copy(r,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,r,i,n,s){return typeof r=="string"?this.writeSync(e,r,s):this.writeSync(e,r,i,n,s)}writeSync(e,r,i,n,s){throw typeof this.fds.get(e)=="undefined"?oi("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw oi("read");this.fds.delete(e)}createReadStream(e,{encoding:r}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new Tw.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,r);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:r}={}){if(this.readOnly)throw bi(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new Tw.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),r),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let r=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw Fn(`lstat '${e}'`);return r}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw FC(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=D.resolve(Se.root,e);return this.entries.has(i)||this.listings.has(i)}let r;try{r=this.resolveFilename(`stat '${e}'`,e)}catch(i){return!1}return this.entries.has(r)||this.listings.has(r)}async accessPromise(e,r){return this.accessSync(e,r)}accessSync(e,r=Fl.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw Fn(`access '${e}'`);if(this.readOnly&&r&Fl.constants.W_OK)throw bi(`access '${e}'`)}async statPromise(e,r){return this.statSync(e,r)}statSync(e,r){let i=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw Fn(`stat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw ts(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,r)}async fstatPromise(e,r){return this.fstatSync(e,r)}fstatSync(e,r){let i=this.fds.get(e);if(typeof i=="undefined")throw oi("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw Fn(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw ts(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,r)}async lstatPromise(e,r){return this.lstatSync(e,r)}lstatSync(e,r){let i=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw Fn(`lstat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw ts(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,r)}statImpl(e,r,i={}){let n=this.entries.get(r);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),h=(this.libzip.struct.statMtime(s)>>>0)*1e3,f=h,p=h,m=h,I=new Date(f),Q=new Date(p),w=new Date(m),x=new Date(h),N=this.listings.has(r)?Us:this.isSymbolicLink(n)?Gs:Hs,H=N===Us?493:420,T=N|this.getUnixMode(n,H)&511,P=this.libzip.struct.statCrc(s),G=Object.assign(new Oo,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:I,birthtime:Q,ctime:w,mtime:x,atimeMs:f,birthtimeMs:p,ctimeMs:m,mtimeMs:h,mode:T,crc:P});return i.bigint===!0?xC(G):G}if(this.listings.has(r)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,h=this.stats.mtimeMs,f=this.stats.mtimeMs,p=new Date(u),m=new Date(g),I=new Date(h),Q=new Date(f),w=Us|493,x=0,N=Object.assign(new Oo,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:m,ctime:I,mtime:Q,atimeMs:u,birthtimeMs:g,ctimeMs:h,mtimeMs:f,mode:w,crc:x});return i.bigint===!0?xC(N):N}throw new Error("Unreachable")}getUnixMode(e,r){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?r:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let r=this.listings.get(e);if(r)return r;let i=this.registerListing(D.dirname(e));return r=new Set,i.add(D.basename(e)),this.listings.set(e,r),r}registerEntry(e,r){this.registerListing(D.dirname(e)).add(D.basename(e)),this.entries.set(e,r)}unregisterListing(e){this.listings.delete(e);let r=this.listings.get(D.dirname(e));r==null||r.delete(D.basename(e))}unregisterEntry(e){this.unregisterListing(e);let r=this.entries.get(e);this.entries.delete(e),typeof r!="undefined"&&(this.fileSources.delete(r),this.isSymbolicLink(r)&&this.symlinkCount--)}deleteEntry(e,r){if(this.unregisterEntry(e),this.libzip.delete(this.zip,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,r,i=!0){if(!this.ready)throw FC(`archive closed, ${e}`);let n=D.resolve(Se.root,r);if(n==="/")return Se.root;let s=this.entries.get(n);if(i&&s!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(s)){let o=this.getFileSource(s).toString();return this.resolveFilename(e,D.resolve(D.dirname(n),o),!0)}else return n;for(;;){let o=this.resolveFilename(e,D.dirname(n),!0),a=this.listings.has(o),l=this.entries.has(o);if(!a&&!l)throw Fn(e);if(!a)throw ts(e);if(n=D.resolve(o,D.basename(n)),!i||this.symlinkCount===0)break;let c=this.libzip.name.locate(this.zip,n.slice(1));if(c===-1)break;if(this.isSymbolicLink(c)){let u=this.getFileSource(c).toString();n=D.resolve(D.dirname(n),u)}else break}return n}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,r);if(s===0)throw this.libzip.free(r),this.makeLibzipError(r);return s}allocateSource(e){let{buffer:r,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,r,i,0,!0);if(n===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,r){let i=Buffer.isBuffer(r)?r:Buffer.from(r),n=D.relative(Se.root,e),s=this.allocateSource(r);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a;if(this.level===0?a=this.libzip.ZIP_CM_STORE:a=this.libzip.ZIP_CM_DEFLATE,this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&Gi)===Gs}getFileSource(e,r={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),h=Buffer.from(g);if(a===0)return this.fileSources.set(e,h),h;if(r.asyncDecompress)return new Promise((f,p)=>{Ow.default.inflateRaw(h,(m,I)=>{m?p(m):(this.fileSources.set(e,I),f(I))})});{let f=Ow.default.inflateRawSync(h);return this.fileSources.set(e,f),f}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async chmodPromise(e,r){return this.chmodSync(e,r)}chmodSync(e,r){if(this.readOnly)throw bi(`chmod '${e}'`);r&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Hs|0)&~511|r;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,r,i){return this.chownSync(e,r,i)}chownSync(e,r,i){throw new Error("Unimplemented")}async renamePromise(e,r){return this.renameSync(e,r)}renameSync(e,r){throw new Error("Unimplemented")}async copyFilePromise(e,r,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,r,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,r,i=0){if(this.readOnly)throw bi(`copyfile '${e} -> '${r}'`);if((i&Fl.constants.COPYFILE_FICLONE_FORCE)!=0)throw Qg("unsupported clone operation",`copyfile '${e}' -> ${r}'`);let n=this.resolveFilename(`copyfile '${e} -> ${r}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw Ko(`copyfile '${e}' -> '${r}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${r}'`,r),a=this.entries.get(o);if((i&(Fl.constants.COPYFILE_EXCL|Fl.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw RC(`copyfile '${e}' -> '${r}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,r,i){if(this.readOnly)throw bi(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=v({flag:"a"},i)),this.writeFilePromise(e,r,i)}appendFileSync(e,r,i={}){if(this.readOnly)throw bi(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=v({flag:"a"},i)),this.writeFileSync(e,r,i)}fdToPath(e,r){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw oi(r);return i}async writeFilePromise(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([this.getFileSource(o),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,r){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw bi(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw bg(`open '${e}'`);let n=null,s=null;typeof r=="string"?n=r:typeof r=="object"&&({encoding:n=null,mode:s=null}=r);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw bi(`unlink '${e}'`);let r=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(r))throw bg(`unlink '${e}'`);let i=this.entries.get(r);if(typeof i=="undefined")throw Ko(`unlink '${e}'`);this.deleteEntry(r,i)}async utimesPromise(e,r,i){return this.utimesSync(e,r,i)}utimesSync(e,r,i){if(this.readOnly)throw bi(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,r,i){return this.lutimesSync(e,r,i)}lutimesSync(e,r,i){if(this.readOnly)throw bi(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,r){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,Zae(r),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,r){return this.mkdirSync(e,r)}mkdirSync(e,{mode:r=493,recursive:i=!1}={}){if(i){this.mkdirpSync(e,{chmod:r});return}if(this.readOnly)throw bi(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw RC(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,r)}async rmdirPromise(e,r){return this.rmdirSync(e,r)}rmdirSync(e,{recursive:r=!1}={}){if(this.readOnly)throw bi(`rmdir '${e}'`);if(r){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw ts(`rmdir '${e}'`);if(n.size>0)throw iM(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw Ko(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let r=this.libzip.dir.add(this.zip,D.relative(Se.root,e));if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,r),r}async linkPromise(e,r){return this.linkSync(e,r)}linkSync(e,r){throw nM(`link '${e}' -> '${r}'`)}async symlinkPromise(e,r){return this.symlinkSync(e,r)}symlinkSync(e,r){if(this.readOnly)throw bi(`symlink '${e}' -> '${r}'`);let i=this.resolveFilename(`symlink '${e}' -> '${r}'`,r);if(this.listings.has(i))throw bg(`symlink '${e}' -> '${r}'`);if(this.entries.has(i))throw RC(`symlink '${e}' -> '${r}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(Gs|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return r?i.toString(r):i}readFileSync(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=this.readFileBuffer(e);return r?i.toString(r):i}readFileBuffer(e,r={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw Fn(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw ts(`open '${e}'`);if(this.listings.has(i))throw bg("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,r)}async readdirPromise(e,r){return this.readdirSync(e,r)}readdirSync(e,r){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw Fn(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw ts(`scandir '${e}'`);let s=[...n];return(r==null?void 0:r.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",D.join(e,o)),{name:o})):s}async readlinkPromise(e){let r=this.prepareReadlink(e);return(await this.getFileSource(r,{asyncDecompress:!0})).toString()}readlinkSync(e){let r=this.prepareReadlink(e);return this.getFileSource(r).toString()}prepareReadlink(e){let r=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(r)&&!this.listings.has(r))throw Fn(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(r))throw ts(`open '${e}'`);if(this.listings.has(r))throw Ko(`readlink '${e}'`);let i=this.entries.get(r);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw Ko(`readlink '${e}'`);return i}async truncatePromise(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw Ko(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(r,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw Ko(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(r,0);return s.copy(o),this.writeFileSync(e,o)}watch(e,r,i){let n;switch(typeof r){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=r);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,r,i){let n=this.resolveFilename(`open '${e}'`,e);return LC(this,n,r,i)}unwatchFile(e,r){let i=this.resolveFilename(`open '${e}'`,e);return Sg(this,i,r)}};var Ur=class extends Uo{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,i){return this.baseFs.openPromise(this.mapToBase(e),r,i)}openSync(e,r,i){return this.baseFs.openSync(this.mapToBase(e),r,i)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,i,n,s){return await this.baseFs.readPromise(e,r,i,n,s)}readSync(e,r,i,n,s){return this.baseFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s)}writeSync(e,r,i,n,s){return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}async lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async chownPromise(e,r,i){return this.baseFs.chownPromise(this.mapToBase(e),r,i)}chownSync(e,r,i){return this.baseFs.chownSync(this.mapToBase(e),r,i)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),i)}copyFileSync(e,r,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),i)}async appendFilePromise(e,r,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,i)}appendFileSync(e,r,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,i)}async writeFilePromise(e,r,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,i)}writeFileSync(e,r,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,i){return this.baseFs.utimesPromise(this.mapToBase(e),r,i)}utimesSync(e,r,i){return this.baseFs.utimesSync(this.mapToBase(e),r,i)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,r){return r==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),r):this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return r==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),r):this.baseFs.readFileSync(this.fsMapToBase(e),r)}async readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}watch(e,r,i){return this.baseFs.watch(this.mapToBase(e),r,i)}watchFile(e,r,i){return this.baseFs.watchFile(this.mapToBase(e),r,i)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var eA=class extends Ur{constructor(e,{baseFs:r,pathUtils:i}){super(i);this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var Dt=class extends Ur{constructor(e,{baseFs:r=new Nt}={}){super(D);this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?D.normalize(e):this.baseFs.resolve(D.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var hM=Se.root,Ys=class extends Ur{constructor(e,{baseFs:r=new Nt}={}){super(D);this.target=this.pathUtils.resolve(Se.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Se.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(hM,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(hM,this.pathUtils.relative(this.target,e))}};var kg=class extends Ur{constructor(e,r){super(r);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var qe=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),Kw=class extends Uo{constructor(){super(D)}getExtractHint(){throw qe()}getRealPath(){throw qe()}resolve(){throw qe()}async openPromise(){throw qe()}openSync(){throw qe()}async opendirPromise(){throw qe()}opendirSync(){throw qe()}async readPromise(){throw qe()}readSync(){throw qe()}async writePromise(){throw qe()}writeSync(){throw qe()}async closePromise(){throw qe()}closeSync(){throw qe()}createWriteStream(){throw qe()}createReadStream(){throw qe()}async realpathPromise(){throw qe()}realpathSync(){throw qe()}async readdirPromise(){throw qe()}readdirSync(){throw qe()}async existsPromise(e){throw qe()}existsSync(e){throw qe()}async accessPromise(){throw qe()}accessSync(){throw qe()}async statPromise(){throw qe()}statSync(){throw qe()}async fstatPromise(e){throw qe()}fstatSync(e){throw qe()}async lstatPromise(e){throw qe()}lstatSync(e){throw qe()}async chmodPromise(){throw qe()}chmodSync(){throw qe()}async chownPromise(){throw qe()}chownSync(){throw qe()}async mkdirPromise(){throw qe()}mkdirSync(){throw qe()}async rmdirPromise(){throw qe()}rmdirSync(){throw qe()}async linkPromise(){throw qe()}linkSync(){throw qe()}async symlinkPromise(){throw qe()}symlinkSync(){throw qe()}async renamePromise(){throw qe()}renameSync(){throw qe()}async copyFilePromise(){throw qe()}copyFileSync(){throw qe()}async appendFilePromise(){throw qe()}appendFileSync(){throw qe()}async writeFilePromise(){throw qe()}writeFileSync(){throw qe()}async unlinkPromise(){throw qe()}unlinkSync(){throw qe()}async utimesPromise(){throw qe()}utimesSync(){throw qe()}async readFilePromise(){throw qe()}readFileSync(){throw qe()}async readlinkPromise(){throw qe()}readlinkSync(){throw qe()}async truncatePromise(){throw qe()}truncateSync(){throw qe()}watch(){throw qe()}watchFile(){throw qe()}unwatchFile(){throw qe()}},TC=Kw;TC.instance=new Kw;var vg=class extends Ur{constructor(e){super(L);this.baseFs=e}mapFromBase(e){return L.fromPortablePath(e)}mapToBase(e){return L.toPortablePath(e)}};var _ae=/^[0-9]+$/,Uw=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,$ae=/^([^/]+-)?[a-f0-9]+$/,ar=class extends Ur{static makeVirtualPath(e,r,i){if(D.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!D.basename(r).match($ae))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=D.relative(D.dirname(e),i).split("/"),o=0;for(;o{let r=t.indexOf(e);if(r<=0)return null;let i=r;for(;r>=0&&(i=r+e.length,t[i]!==D.sep);){if(t[r-1]===D.sep)return null;r=t.indexOf(e,i)}return t.length>i&&t[i]!==D.sep?null:t.slice(0,i)},sn=class extends Xa{constructor({libzip:e,baseFs:r=new Nt,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=r,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,r){let i=new sn(r);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(xg(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(xg(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,r){let i=this.nextFd++|qs;return this.fdMap.set(i,[e,r]),i}async openPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,r,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,r,i)))}openSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,r,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,r,i)))}async opendirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,r),async(i,{subPath:n})=>await i.opendirPromise(n,r),{requireSubpath:!1})}opendirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,r),(i,{subPath:n})=>i.opendirSync(n,r),{requireSubpath:!1})}async readPromise(e,r,i,n,s){if((e&qs)==0)return await this.baseFs.readPromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw oi("read");let[a,l]=o;return await a.readPromise(l,r,i,n,s)}readSync(e,r,i,n,s){if((e&qs)==0)return this.baseFs.readSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw oi("readSync");let[a,l]=o;return a.readSync(l,r,i,n,s)}async writePromise(e,r,i,n,s){if((e&qs)==0)return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw oi("write");let[a,l]=o;return typeof r=="string"?await a.writePromise(l,r,i):await a.writePromise(l,r,i,n,s)}writeSync(e,r,i,n,s){if((e&qs)==0)return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw oi("writeSync");let[a,l]=o;return typeof r=="string"?a.writeSync(l,r,i):a.writeSync(l,r,i,n,s)}async closePromise(e){if((e&qs)==0)return await this.baseFs.closePromise(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw oi("close");this.fdMap.delete(e);let[i,n]=r;return await i.closePromise(n)}closeSync(e){if((e&qs)==0)return this.baseFs.closeSync(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw oi("closeSync");this.fdMap.delete(e);let[i,n]=r;return i.closeSync(n)}createReadStream(e,r){return e===null?this.baseFs.createReadStream(e,r):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,r),(i,{subPath:n})=>i.createReadStream(n,r))}createWriteStream(e,r){return e===null?this.baseFs.createWriteStream(e,r):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,r),(i,{subPath:n})=>i.createWriteStream(n,r))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,await r.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,r.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(r,{subPath:i})=>await r.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(r,{subPath:i})=>r.existsSync(i))}async accessPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,r),async(i,{subPath:n})=>await i.accessPromise(n,r))}accessSync(e,r){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,r),(i,{subPath:n})=>i.accessSync(n,r))}async statPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,r),async(i,{subPath:n})=>await i.statPromise(n,r))}statSync(e,r){return this.makeCallSync(e,()=>this.baseFs.statSync(e,r),(i,{subPath:n})=>i.statSync(n,r))}async fstatPromise(e,r){if((e&qs)==0)return this.baseFs.fstatPromise(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw oi("fstat");let[n,s]=i;return n.fstatPromise(s,r)}fstatSync(e,r){if((e&qs)==0)return this.baseFs.fstatSync(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw oi("fstatSync");let[n,s]=i;return n.fstatSync(s,r)}async lstatPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,r),async(i,{subPath:n})=>await i.lstatPromise(n,r))}lstatSync(e,r){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,r),(i,{subPath:n})=>i.lstatSync(n,r))}async chmodPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,r),async(i,{subPath:n})=>await i.chmodPromise(n,r))}chmodSync(e,r){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,r),(i,{subPath:n})=>i.chmodSync(n,r))}async chownPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,r,i),async(n,{subPath:s})=>await n.chownPromise(s,r,i))}chownSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,r,i),(n,{subPath:s})=>n.chownSync(s,r,i))}async renamePromise(e,r){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.renamePromise(e,r),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(r,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,r){return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.renameSync(e,r),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(r,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,r,i=0){let n=async(s,o,a,l)=>{if((i&Pg.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Pg.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.copyFilePromise(e,r,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(r,async()=>await n(s,o,this.baseFs,r),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,r,i=0){let n=(s,o,a,l)=>{if((i&Pg.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Pg.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.copyFileSync(e,r,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(r,()=>n(s,o,this.baseFs,r),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,r,i),async(n,{subPath:s})=>await n.appendFilePromise(s,r,i))}appendFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,r,i),(n,{subPath:s})=>n.appendFileSync(s,r,i))}async writeFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,r,i),async(n,{subPath:s})=>await n.writeFilePromise(s,r,i))}writeFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,r,i),(n,{subPath:s})=>n.writeFileSync(s,r,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(r,{subPath:i})=>await r.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(r,{subPath:i})=>r.unlinkSync(i))}async utimesPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,r,i),async(n,{subPath:s})=>await n.utimesPromise(s,r,i))}utimesSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,r,i),(n,{subPath:s})=>n.utimesSync(s,r,i))}async mkdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,r),async(i,{subPath:n})=>await i.mkdirPromise(n,r))}mkdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,r),(i,{subPath:n})=>i.mkdirSync(n,r))}async rmdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,r),async(i,{subPath:n})=>await i.rmdirPromise(n,r))}rmdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,r),(i,{subPath:n})=>i.rmdirSync(n,r))}async linkPromise(e,r){return await this.makeCallPromise(r,async()=>await this.baseFs.linkPromise(e,r),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,r){return this.makeCallSync(r,()=>this.baseFs.linkSync(e,r),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,r,i){return await this.makeCallPromise(r,async()=>await this.baseFs.symlinkPromise(e,r,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,r,i){return this.makeCallSync(r,()=>this.baseFs.symlinkSync(e,r,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,r){return this.makeCallPromise(e,async()=>{switch(r){case"utf8":return await this.baseFs.readFilePromise(e,r);default:return await this.baseFs.readFilePromise(e,r)}},async(i,{subPath:n})=>await i.readFilePromise(n,r))}readFileSync(e,r){return this.makeCallSync(e,()=>{switch(r){case"utf8":return this.baseFs.readFileSync(e,r);default:return this.baseFs.readFileSync(e,r)}},(i,{subPath:n})=>i.readFileSync(n,r))}async readdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,r),async(i,{subPath:n})=>await i.readdirPromise(n,r),{requireSubpath:!1})}readdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,r),(i,{subPath:n})=>i.readdirSync(n,r),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(r,{subPath:i})=>await r.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(r,{subPath:i})=>r.readlinkSync(i))}async truncatePromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,r),async(i,{subPath:n})=>await i.truncatePromise(n,r))}truncateSync(e,r){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,r),(i,{subPath:n})=>i.truncateSync(n,r))}watch(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,r,i),(n,{subPath:s})=>n.watch(s,r,i))}watchFile(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,r,i),()=>LC(this,e,r,i))}unwatchFile(e,r){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,r),()=>Sg(this,e,r))}async makeCallPromise(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await r();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await r():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await r()}makeCallSync(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return r();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?r():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let r="";for(;;){let i=e.substr(r.length),n;if(!this.fileExtensions)n=fM(i,".zip");else for(let s of this.fileExtensions)if(n=fM(i,s),n)break;if(!n)return null;if(r=this.pathUtils.join(r,n),this.isZip.has(r)===!1){if(this.notZip.has(r))continue;try{if(!this.baseFs.lstatSync(r).isFile()){this.notZip.add(r);continue}}catch{return null}this.isZip.add(r)}return{archivePath:r,subPath:this.pathUtils.join(Se.root,e.substr(r.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let r=Date.now(),i=r+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(r>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-r).unref())}async getZipPromise(e,r){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new kr(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await r(n.zipFs)}finally{n.refCount-=1}}else{let n=new kr(e,await i());try{return await r(n)}finally{n.saveAndClose()}}}getZipSync(e,r){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new kr(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,r(n.zipFs)}else{let n=new kr(e,i());try{return r(n)}finally{n.saveAndClose()}}}};var Fg=ne(require("util"));var OC=ne(require("url"));var Hw=class extends Ur{constructor(e){super(L);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof OC.URL?(0,OC.fileURLToPath)(e):e}};var eAe=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),pM=new Set(["accessPromise","appendFilePromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),tAe=new Set(["appendFilePromise","chmodPromise","chownPromise","closePromise","readPromise","readFilePromise","statPromise","truncatePromise","utimesPromise","writePromise","writeFilePromise"]);function Gw(t,e){e=new Hw(e);let r=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[Fg.promisify.custom])!="undefined"&&(s[Fg.promisify.custom]=o[Fg.promisify.custom])};{r(t,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),r(t,"read",(i,n,...s)=>{let a=typeof s[s.length-1]=="function"?s.pop():()=>{};process.nextTick(()=>{e.readPromise(i,n,...s).then(l=>{a(null,l,n)},l=>{a(l,0,n)})})});for(let i of pM){let n=i.replace(/Promise$/,"");if(typeof t[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;r(t,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}});for(let i of eAe){let n=i;if(typeof t[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&r(t,n,s.bind(e))}t.realpathSync.native=t.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=t.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let o of pM){let a=o.replace(/Promise$/,"");if(typeof n[a]=="undefined")continue;let l=e[o];typeof l!="undefined"&&o!=="open"&&r(n,a,l.bind(e))}class s{constructor(a){this.fd=a}}for(let o of tAe){let a=o.replace(/Promise$/,""),l=e[o];typeof l!="undefined"&&r(s.prototype,a,function(...c){return l.call(e,this.fd,...c)})}r(n,"open",async(...o)=>{let a=await e.openPromise(...o);return new s(a)})}}t.read[Fg.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n})}function KC(t,e){let r=Object.create(t);return Gw(r,e),r}var dM=ne(require("os"));function CM(t){let e=L.toPortablePath(dM.default.tmpdir()),r=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return D.join(e,`${t}${r}`)}var Rn=new Set,mM=!1;function IM(){mM||(mM=!0,process.once("exit",()=>{M.rmtempSync()}))}var M=Object.assign(new Nt,{detachTemp(t){Rn.delete(t)},mktempSync(t){for(IM();;){let e=CM("xfs-");try{this.mkdirSync(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=this.realpathSync(e);if(Rn.add(r),typeof t!="undefined")try{return t(r)}finally{if(Rn.has(r)){Rn.delete(r);try{this.removeSync(r)}catch{}}}else return r}},async mktempPromise(t){for(IM();;){let e=CM("xfs-");try{await this.mkdirPromise(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=await this.realpathPromise(e);if(Rn.add(r),typeof t!="undefined")try{return await t(r)}finally{if(Rn.has(r)){Rn.delete(r);try{await this.removePromise(r)}catch{}}}else return r}},async rmtempPromise(){await Promise.all(Array.from(Rn.values()).map(async t=>{try{await M.removePromise(t,{maxRetries:0}),Rn.delete(t)}catch{}}))},rmtempSync(){for(let t of Rn)try{M.removeSync(t),Rn.delete(t)}catch{}}});var $w=ne(_w()),on;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(on||(on={}));function tA(t){return t!==null&&typeof t.fd=="number"}var rA=new Set;function eQ(){}function tQ(){for(let t of rA)t.kill()}async function js(t,e,{cwd:r,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":tA(s)&&(c[0]=s),tA(o)&&(c[1]=o),tA(a)&&(c[2]=a);let u=(0,$w.default)(t,e,{cwd:L.fromPortablePath(r),env:W(v({},i),{PWD:L.fromPortablePath(r)}),stdio:c});rA.add(u),rA.size===1&&(process.on("SIGINT",eQ),process.on("SIGTERM",tQ)),!tA(s)&&s!==null&&s.pipe(u.stdin),tA(o)||u.stdout.pipe(o,{end:!1}),tA(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let h of new Set([o,a]))tA(h)||h.end()};return new Promise((h,f)=>{u.on("error",p=>{rA.delete(u),rA.size===0&&(process.off("SIGINT",eQ),process.off("SIGTERM",tQ)),(l===2||l===1)&&g(),f(p)}),u.on("close",(p,m)=>{rA.delete(u),rA.size===0&&(process.off("SIGINT",eQ),process.off("SIGTERM",tQ)),(l===2||l===1&&p>0)&&g(),p===0||!n?h({code:rQ(p,m)}):f(p!==null?new Error(`Child "${t}" exited with exit code ${p}`):new Error(`Child "${t}" exited with signal ${m}`))})})}async function xAe(t,e,{cwd:r,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=L.fromPortablePath(r);typeof i.PWD!="undefined"&&(i=W(v({},i),{PWD:c}));let u=(0,$w.default)(t,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,h)=>{u.on("error",()=>{h()}),u.on("close",(f,p)=>{let m=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),I=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);f===0||!s?g({code:rQ(f,p),stdout:m,stderr:I}):h(Object.assign(new Error(`Child "${t}" exited with exit code ${f} - -${I}`),{code:rQ(f,p),stdout:m,stderr:I}))})})}var kAe=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function rQ(t,e){let r=kAe.get(e);return typeof r!="undefined"?128+r:t!=null?t:1}var iQ={};$e(iQ,{getDefaultGlobalFolder:()=>sQ,getHomeFolder:()=>Ng,isFolderInside:()=>oQ});var nQ=ne(require("os"));function sQ(){if(process.platform==="win32"){let t=L.toPortablePath(process.env.LOCALAPPDATA||L.join((0,nQ.homedir)(),"AppData","Local"));return D.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=L.toPortablePath(process.env.XDG_DATA_HOME);return D.resolve(t,"yarn/berry")}return D.resolve(Ng(),".yarn/berry")}function Ng(){return L.toPortablePath((0,nQ.homedir)()||"/usr/local/share")}function oQ(t,e){let r=D.relative(e,t);return r&&!r.startsWith("..")&&!D.isAbsolute(r)}var Ae={};$e(Ae,{LogLevel:()=>On,Style:()=>wA,Type:()=>Ne,addLogFilterSupport:()=>bh,applyColor:()=>zi,applyHyperlink:()=>oc,applyStyle:()=>rI,json:()=>ac,mark:()=>Ib,pretty:()=>ze,prettyField:()=>bA,prettyList:()=>vb,supportsColor:()=>eI,supportsHyperlinks:()=>xb,tuple:()=>QA});var Qh=ne(dQ()),hH=ne(Og()),fH=ne(Ji()),pH=ne($T());var J;(function(re){re[re.UNNAMED=0]="UNNAMED",re[re.EXCEPTION=1]="EXCEPTION",re[re.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",re[re.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",re[re.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",re[re.BUILD_DISABLED=5]="BUILD_DISABLED",re[re.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",re[re.MUST_BUILD=7]="MUST_BUILD",re[re.MUST_REBUILD=8]="MUST_REBUILD",re[re.BUILD_FAILED=9]="BUILD_FAILED",re[re.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",re[re.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",re[re.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",re[re.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",re[re.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",re[re.REMOTE_INVALID=15]="REMOTE_INVALID",re[re.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",re[re.RESOLUTION_PACK=17]="RESOLUTION_PACK",re[re.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",re[re.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",re[re.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",re[re.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",re[re.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",re[re.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",re[re.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",re[re.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",re[re.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",re[re.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",re[re.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",re[re.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",re[re.FETCH_FAILED=30]="FETCH_FAILED",re[re.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",re[re.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",re[re.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",re[re.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",re[re.NETWORK_ERROR=35]="NETWORK_ERROR",re[re.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",re[re.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",re[re.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",re[re.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",re[re.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",re[re.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",re[re.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",re[re.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",re[re.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",re[re.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",re[re.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",re[re.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",re[re.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",re[re.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",re[re.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",re[re.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",re[re.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",re[re.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",re[re.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",re[re.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",re[re.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",re[re.INVALID_MANIFEST=57]="INVALID_MANIFEST",re[re.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",re[re.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",re[re.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",re[re.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",re[re.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",re[re.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",re[re.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",re[re.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",re[re.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",re[re.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",re[re.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",re[re.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",re[re.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",re[re.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",re[re.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",re[re.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",re[re.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",re[re.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR"})(J||(J={}));function ZC(t){return`YN${t.toString(10).padStart(4,"0")}`}var fe={};$e(fe,{BufferStream:()=>bU,CachingStrategy:()=>pA,DefaultStream:()=>DU,assertNever:()=>A0,bufferStream:()=>ch,buildIgnorePattern:()=>bhe,convertMapsToIndexableObjects:()=>Im,dynamicRequire:()=>Xl,escapeRegExp:()=>yhe,getArrayWithDefault:()=>Wl,getFactoryWithDefault:()=>Xs,getMapWithDefault:()=>zl,getSetWithDefault:()=>fA,isIndexableObject:()=>l0,isPathLike:()=>Dhe,isTaggedYarnVersion:()=>Ehe,mapAndFilter:()=>hA,mapAndFind:()=>QU,overrideType:()=>a0,parseBoolean:()=>gh,parseOptionalBoolean:()=>vU,prettifyAsyncErrors:()=>Vl,prettifySyncErrors:()=>c0,releaseAfterUseAsync:()=>whe,replaceEnvVariables:()=>u0,sortMap:()=>xi,tryParseOptionalBoolean:()=>g0,validateEnum:()=>Bhe});var Xg={};$e(Xg,{Builtins:()=>WQ,Cli:()=>os,Command:()=>Ce,Option:()=>Y,UsageError:()=>me});var sA=0,Yg=1,ai=2,FQ="",Gr="\0",Hl=-1,RQ=/^(-h|--help)(?:=([0-9]+))?$/,_C=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,eO=/^-[a-zA-Z]{2,}$/,NQ=/^([^=]+)=([\s\S]*)$/,MQ=process.env.DEBUG_CLI==="1";var me=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},qg=class extends Error{constructor(e,r){super();if(this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===r[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} - -${this.candidates.map(({usage:n})=>`$ ${n}`).join(` -`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: - -$ ${i} -${LQ(e)}`}else this.message=`Command not found; did you mean one of: - -${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${LQ(e)}`}},TQ=class extends Error{constructor(e,r){super();this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: - -${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` -`)} - -${LQ(e)}`}},LQ=t=>`While running ${t.filter(e=>e!==Gr).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`;var jg=Symbol("clipanion/isOption");function Ai(t){return W(v({},t),{[jg]:!0})}function ss(t,e){return typeof t=="undefined"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function $C(t,e=!1){let r=t.replace(/^\.: /,"");return e&&(r=r[0].toLowerCase()+r.slice(1)),r}function Jg(t,e){return e.length===1?new me(`${t}: ${$C(e[0],!0)}`):new me(`${t}: -${e.map(r=>` -- ${$C(r)}`).join("")}`)}function Wg(t,e,r){if(typeof r=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!r(e,{errors:i,coercions:n,coercion:s}))throw Jg(`Invalid value for ${t}`,i);for(let[,a]of n)a();return e}var Ce=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(typeof r!="undefined"){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(Nn(),Gl)),a=o(n(s()),r),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw Jg("Invalid option schema",l);for(let[,g]of c)g()}let i=await this.execute();return typeof i!="undefined"?i:0}};Ce.isOption=jg;Ce.Default=[];function Si(t){MQ&&console.log(t)}var cO={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Hl};function uO(){return{nodes:[ci(),ci(),ci()]}}function _ce(t){let e=uO(),r=[],i=e.nodes.length;for(let n of t){r.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=t.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)r(a);for(let[,{to:o}]of n.dynamics)r(o);for(let{to:o}of n.shortcuts)r(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=t.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:h})=>g.to===h)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};r(sA)}function eue(t,{prefix:e=""}={}){if(MQ){Si(`${e}Nodes are:`);for(let r=0;rl!==ai).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===ai))throw new qg(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=tue(a)}if(i.length>0){Si(" Results:");for(let s of i)Si(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else Si(" No results");return i}function rue(t,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(t.statics,Gr)){for(let{to:r}of t.statics[Gr])if(r===Yg)return!0}return!1}function nue(t,e,r){let i=r&&e.length>0?[""]:[],n=hO(t,e,r),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let f=g;g=[];for(let p of f){let m=t.nodes[p],I=Object.keys(m.statics);for(let Q of Object.keys(m.statics)){let w=I[0];for(let{to:x,reducer:N}of m.statics[w])N==="pushPath"&&(u||l.push(w),g.push(x))}}u=!1}let h=JSON.stringify(l);o.has(h)||(s.push(l),o.add(h))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=t.nodes[l],g=rue(u,c);for(let[h,f]of Object.entries(u.statics))(g&&h!==Gr||!h.startsWith("-")&&f.some(({reducer:p})=>p==="pushPath"))&&a([...i,h],l);if(!!g)for(let[h,{to:f}]of u.dynamics){if(f===ai)continue;let p=iue(h,c);if(p!==null)for(let m of p)a([...i,m],l)}}return[...s].sort()}function oue(t,e){let r=hO(t,[...e,Gr]);return sue(e,r.map(({state:i})=>i))}function tue(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function sue(t,e){let r=e.filter(g=>g.selectedIndex!==null);if(r.length===0)throw new Error;let i=r.filter(g=>g.requiredOptions.every(h=>h.some(f=>g.options.find(p=>p.name===f))));if(i.length===0)throw new qg(t,r.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:h})=>!h).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=aue(c);if(u.length>1)throw new TQ(t,u.map(g=>g.candidateUsage));return u[0]}function aue(t){let e=[],r=[];for(let i of t)i.selectedIndex===Hl?r.push(i):e.push(i);return r.length>0&&e.push(W(v({},cO),{path:fO(...r.map(i=>i.path)),options:r.reduce((i,n)=>i.concat(n.options),[])})),e}function fO(t,e,...r){return e===void 0?Array.from(t):fO(t.filter((i,n)=>i===e[n]),...r)}function ci(){return{dynamics:[],shortcuts:[],statics:{}}}function gO(t){return t===Yg||t===ai}function qQ(t,e=0){return{to:gO(t.to)?t.to:t.to>2?t.to+e-2:t.to+e,reducer:t.reducer}}function Zce(t,e=0){let r=ci();for(let[i,n]of t.dynamics)r.dynamics.push([i,qQ(n,e)]);for(let i of t.shortcuts)r.shortcuts.push(qQ(i,e));for(let[i,n]of Object.entries(t.statics))r.statics[i]=n.map(s=>qQ(s,e));return r}function Yr(t,e,r,i,n){t.nodes[e].dynamics.push([r,{to:i,reducer:n}])}function Yl(t,e,r,i){t.nodes[e].shortcuts.push({to:r,reducer:i})}function Ws(t,e,r,i,n){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:i,reducer:n})}function tm(t,e,r,i){if(Array.isArray(e)){let[n,...s]=e;return t[n](r,i,...s)}else return t[e](r,i)}function iue(t,e){let r=Array.isArray(t)?rm[t[0]]:rm[t];if(typeof r.suggest=="undefined")return null;let i=Array.isArray(t)?t.slice(1):[];return r.suggest(e,...i)}var rm={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,i)=>!t.ignoreOptions&&e===r,isBatchOption:(t,e,r)=>!t.ignoreOptions&&eO.test(e)&&[...e.slice(1)].every(i=>r.includes(`-${i}`)),isBoundOption:(t,e,r,i)=>{let n=e.match(NQ);return!t.ignoreOptions&&!!n&&_C.test(n[1])&&r.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(t,e,r)=>!t.ignoreOptions&&e===`--no-${r.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&RQ.test(e),isUnsupportedOption:(t,e,r)=>!t.ignoreOptions&&e.startsWith("-")&&_C.test(e)&&!r.includes(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!_C.test(e)};rm.isOption.suggest=(t,e,r=!0)=>r?null:[e];var YQ={setCandidateState:(t,e,r)=>v(v({},t),r),setSelectedIndex:(t,e,r)=>W(v({},t),{selectedIndex:r}),pushBatch:(t,e)=>W(v({},t),{options:t.options.concat([...e.slice(1)].map(r=>({name:`-${r}`,value:!0})))}),pushBound:(t,e)=>{let[,r,i]=e.match(NQ);return W(v({},t),{options:t.options.concat({name:r,value:i})})},pushPath:(t,e)=>W(v({},t),{path:t.path.concat(e)}),pushPositional:(t,e)=>W(v({},t),{positionals:t.positionals.concat({value:e,extra:!1})}),pushExtra:(t,e)=>W(v({},t),{positionals:t.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(t,e)=>W(v({},t),{positionals:t.positionals.concat({value:e,extra:Wi})}),pushTrue:(t,e,r=e)=>W(v({},t),{options:t.options.concat({name:e,value:!0})}),pushFalse:(t,e,r=e)=>W(v({},t),{options:t.options.concat({name:r,value:!1})}),pushUndefined:(t,e)=>W(v({},t),{options:t.options.concat({name:e,value:void 0})}),pushStringValue:(t,e)=>{var r;let i=W(v({},t),{options:[...t.options]}),n=t.options[t.options.length-1];return n.value=((r=n.value)!==null&&r!==void 0?r:[]).concat([e]),i},setStringValue:(t,e)=>{let r=W(v({},t),{options:[...t.options]}),i=t.options[t.options.length-1];return i.value=e,r},inhibateOptions:t=>W(v({},t),{ignoreOptions:!0}),useHelp:(t,e,r)=>{let[,,i]=e.match(RQ);return typeof i!="undefined"?W(v({},t),{options:[{name:"-c",value:String(r)},{name:"-i",value:i}]}):W(v({},t),{options:[{name:"-c",value:String(r)}]})},setError:(t,e,r)=>e===Gr?W(v({},t),{errorMessage:`${r}.`}):W(v({},t),{errorMessage:`${r} ("${e}").`}),setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return W(v({},t),{errorMessage:`Not enough arguments to option ${r.name}.`})}},Wi=Symbol(),pO=class{constructor(e,r){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:i,proxy:n})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Wi)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Wi?this.arity.extra.push(e):this.arity.extra!==Wi&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Wi)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:r,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let f=0;f`:`[${h}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Wi?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=uO(),r=sA,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);r=Mn(e,ci()),Ws(e,sA,FQ,r,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=r;if(a.length>0){let h=Mn(e,ci());Yl(e,l,h),this.registerOptions(e,h),l=h}for(let h=0;h0||!this.arity.proxy){let h=Mn(e,ci());Yr(e,l,"isHelp",h,["useHelp",this.cliIndex]),Ws(e,h,Gr,Yg,["setSelectedIndex",Hl]),this.registerOptions(e,l)}this.arity.leading.length>0&&Ws(e,l,Gr,ai,["setError","Not enough positional arguments"]);let c=l;for(let h=0;h0||h+1!==this.arity.leading.length)&&Ws(e,f,Gr,ai,["setError","Not enough positional arguments"]),Yr(e,c,"isNotOptionLike",f,"pushPositional"),c=f}let u=c;if(this.arity.extra===Wi||this.arity.extra.length>0){let h=Mn(e,ci());if(Yl(e,c,h),this.arity.extra===Wi){let f=Mn(e,ci());this.arity.proxy||this.registerOptions(e,f),Yr(e,c,s,f,"pushExtraNoLimits"),Yr(e,f,s,f,"pushExtraNoLimits"),Yl(e,f,h)}else for(let f=0;f0&&Ws(e,u,Gr,ai,["setError","Not enough positional arguments"]);let g=u;for(let h=0;ho.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)Yr(e,r,["isOption",s,i.hidden||s!==n],r,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&Yr(e,r,["isNegatedOption",s],r,["pushFalse",s]);else{let s=Mn(e,ci());for(let o of i.names)Yr(e,r,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&eoue(i,n),suggest:(n,s)=>nue(i,n,s)}}};var dO=80,jQ=Array(dO).fill("\u2501");for(let t=0;t<=24;++t)jQ[jQ.length-t]=`[38;5;${232+t}m\u2501`;var JQ={header:t=>`\u2501\u2501\u2501 ${t}${t.length`${t}`,error:t=>`${t}`,code:t=>`${t}`},CO={header:t=>t,bold:t=>t,error:t=>t,code:t=>t};function Aue(t){let e=t.split(` -`),r=e.filter(n=>n.match(/\S/)),i=r.length>0?r.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` -`)}function ln(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` -`),t=Aue(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 - -`),t=t.replace(/\n(\n)?\n*/g,"$1"),r&&(t=t.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` -`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` -`)}).join(` - -`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),t?`${t} -`:""}var Vg=class extends Ce{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,r){let i=new Vg(r);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: -`),this.context.stdout.write(` -`);let r=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` -`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. -`)}}};var mO=Symbol("clipanion/errorCommand");function lue(){return process.env.FORCE_COLOR==="0"?!1:!!(process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY)}var os=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:i,enableColors:n=lue()}={}){this.registrations=new Map,this.builder=new zg({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=i,this.enableColors=n}static from(e,r={}){let i=new os(r);for(let n of e)i.register(n);return i}register(e){var r;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[Ce.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(r=e.paths)!==null&&r!==void 0?r:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:r,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case Hl:return Vg.from(n,r);default:{let{commandClass:s}=r[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[mO]=a,l}}break}}async run(e,r){let i;if(!Array.isArray(e))i=e;else try{i=this.process(e)}catch(s){return r.stdout.write(this.error(s)),1}if(i.help)return r.stdout.write(this.usage(i,{detailed:!0})),0;i.context=r,i.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(s,o)=>this.error(s,o),process:s=>this.process(s),run:(s,o)=>this.run(s,v(v({},r),o)),usage:(s,o)=>this.usage(s,o)};let n;try{n=await i.validateAndExecute().catch(s=>i.catch(s).then(()=>0))}catch(s){return r.stdout.write(this.error(s,{command:i})),1}return n}async runExit(e,r){process.exitCode=await this.run(e,r)}suggest(e,r){let{suggest:i}=this.builder.compile();return i(e,r)}definitions({colored:e=!1}={}){let r=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?ln(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?ln(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?ln(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([h,f])=>[ln(h,{format:this.format(e),paragraphs:!1}),f.replace(/\$0/g,this.binaryName)]):void 0;r.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return r}usage(e=null,{colored:r,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(f=>f.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof Ce?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=ln(l,{format:this.format(r),paragraphs:!1}).replace(/^./,f=>f.toUpperCase()),a+=` -`),(c!==""||u.length>0)&&(a+=`${this.format(r).header("Usage")} -`,a+=` -`);let{usage:g,options:h}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(r).bold(n)}${g} -`,h.length>0){a+=` -`,a+=`${JQ.header("Options")} -`;let f=h.reduce((p,m)=>Math.max(p,m.definition.length),0);a+=` -`;for(let{definition:p,description:m}of h)a+=` ${this.format(r).bold(p.padEnd(f))} ${ln(m,{format:this.format(r),paragraphs:!1})}`}if(c!==""&&(a+=` -`,a+=`${this.format(r).header("Details")} -`,a+=` -`,a+=ln(c,{format:this.format(r),paragraphs:!0})),u.length>0){a+=` -`,a+=`${this.format(r).header("Examples")} -`;for(let[f,p]of u)a+=` -`,a+=ln(f,{format:this.format(r),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(r).bold(n)}`).replace(/\$0/g,this.binaryName)} -`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(r).bold(n)}${l} -`}else{let l=new Map;for(let[h,{index:f}]of this.registrations.entries()){if(typeof h.usage=="undefined")continue;let p=typeof h.usage.category!="undefined"?ln(h.usage.category,{format:this.format(r),paragraphs:!1}):null,m=l.get(p);typeof m=="undefined"&&l.set(p,m=[]);let{usage:I}=this.getUsageByIndex(f);m.push({commandClass:h,usage:I})}let c=Array.from(l.keys()).sort((h,f)=>h===null?-1:f===null?1:h.localeCompare(f,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} - -`:u?a+=`${this.format(r).header(`${this.binaryLabel}`)} -`:a+=`${this.format(r).header(`${this.binaryVersion}`)} -`,a+=` ${this.format(r).bold(n)}${this.binaryName} -`):a+=`${this.format(r).bold(n)}${this.binaryName} -`;for(let h of c){let f=l.get(h).slice().sort((m,I)=>m.usage.localeCompare(I.usage,"en",{usage:"sort",caseFirst:"upper"})),p=h!==null?h.trim():"General commands";a+=` -`,a+=`${this.format(r).header(`${p}`)} -`;for(let{commandClass:m,usage:I}of f){let Q=m.usage.description||"undocumented";a+=` -`,a+=` ${this.format(r).bold(I)} -`,a+=` ${ln(Q,{format:this.format(r),paragraphs:!1})}`}}a+=` -`,a+=ln("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return a}error(e,r){var i,{colored:n,command:s=(i=e[mO])!==null&&i!==void 0?i:null}=r===void 0?{}:r;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} -`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` -`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} -`),o}getUsageByRegistration(e,r){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}format(e=this.enableColors){return e?JQ:CO}};os.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr};var WQ={};$e(WQ,{DefinitionsCommand:()=>im,HelpCommand:()=>nm,VersionCommand:()=>sm});var im=class extends Ce{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} -`)}};im.paths=[["--clipanion=definitions"]];var nm=class extends Ce{async execute(){this.context.stdout.write(this.cli.usage())}};nm.paths=[["-h"],["--help"]];var sm=class extends Ce{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} -`)}};sm.paths=[["-v"],["--version"]];var Y={};$e(Y,{Array:()=>IO,Boolean:()=>EO,Counter:()=>yO,Proxy:()=>BO,Rest:()=>wO,String:()=>QO,applyValidator:()=>Wg,cleanValidationError:()=>$C,formatError:()=>Jg,isOptionSymbol:()=>jg,makeCommandOption:()=>Ai,rerouteArguments:()=>ss});function IO(t,e,r){let[i,n]=ss(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return Ai({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:h,value:f}of u.options)!a.has(h)||(g=g!=null?g:[],g.push(f));return g}})}function EO(t,e,r){let[i,n]=ss(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return Ai({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:h}of c.options)!o.has(g)||(u=h);return u}})}function yO(t,e,r){let[i,n]=ss(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return Ai({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:h}of c.options)!o.has(g)||(u!=null||(u=0),h?u+=1:u=0);return u}})}function BO(t={}){return Ai({definition(e,r){var i;e.addProxy({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){return i.positionals.map(({value:n})=>n)}})}function wO(t={}){return Ai({definition(e,r){var i;e.addRest({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){let n=o=>{let a=i.positionals[o];return a.extra===Wi||a.extra===!1&&oo)}})}function cue(t,e,r){let[i,n]=ss(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return Ai({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,h=i;for(let{name:f,value:p}of u.options)!a.has(f)||(g=f,h=p);return typeof h=="string"?Wg(g!=null?g:c,h,n.validator):h}})}function uue(t={}){let{required:e=!0}=t;return Ai({definition(r,i){var n;r.addPositional({name:(n=t.name)!==null&&n!==void 0?n:i,required:t.required})},transformer(r,i,n){var s;for(let o=0;oJSON.stringify(i)).join(", ")})`);return e}function hA(t,e){let r=[];for(let i of t){let n=e(i);n!==BU&&r.push(n)}return r}var BU=Symbol();hA.skip=BU;function QU(t,e){for(let r of t){let i=e(r);if(i!==wU)return i}}var wU=Symbol();QU.skip=wU;function l0(t){return typeof t=="object"&&t!==null}function Im(t){if(t instanceof Map&&(t=Object.fromEntries(t)),l0(t))for(let e of Object.keys(t)){let r=t[e];l0(r)&&(t[e]=Im(r))}return t}function Xs(t,e,r){let i=t.get(e);return typeof i=="undefined"&&t.set(e,i=r()),i}function Wl(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=[]),r}function fA(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Set),r}function zl(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Map),r}async function whe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function Vl(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function c0(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function ch(t){return await new Promise((e,r)=>{let i=[];t.on("error",n=>{r(n)}),t.on("data",n=>{i.push(n)}),t.on("end",()=>{e(Buffer.concat(i))})})}var bU=class extends o0.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}},DU=class extends o0.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},uh=eval("require");function SU(t){return uh(L.fromPortablePath(t))}function xU(path){let physicalPath=L.fromPortablePath(path),currentCacheEntry=uh.cache[physicalPath];delete uh.cache[physicalPath];let result;try{result=SU(physicalPath);let freshCacheEntry=uh.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{uh.cache[physicalPath]=currentCacheEntry}return result}var kU=new Map;function Qhe(t){let e=kU.get(t),r=M.statSync(t);if((e==null?void 0:e.mtime)===r.mtimeMs)return e.instance;let i=xU(t);return kU.set(t,{mtime:r.mtimeMs,instance:i}),i}var pA;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(pA||(pA={}));function Xl(t,{cachingStrategy:e=2}={}){switch(e){case 0:return xU(t);case 1:return Qhe(t);case 2:return SU(t);default:throw new Error("Unsupported caching strategy")}}function xi(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(r.map(o=>s(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function bhe(t){return t.length===0?null:t.map(e=>`(${EU.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function u0(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new me(`Environment variable not found (${n})`)})}function gh(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function vU(t){return typeof t=="undefined"?t:gh(t)}function g0(t){try{return vU(t)}catch{return null}}function Dhe(t){return!!(L.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}var b={};$e(b,{areDescriptorsEqual:()=>lH,areIdentsEqual:()=>Eh,areLocatorsEqual:()=>Bb,areVirtualPackagesEquivalent:()=>Wde,bindDescriptor:()=>jde,bindLocator:()=>Jde,convertDescriptorToLocator:()=>Xm,convertLocatorToDescriptor:()=>Zm,convertPackageToLocator:()=>qde,convertToIdent:()=>Yde,convertToManifestRange:()=>Xde,copyPackage:()=>Ch,devirtualizeDescriptor:()=>mh,devirtualizeLocator:()=>Ih,getIdentVendorPath:()=>Zde,isVirtualDescriptor:()=>Zo,isVirtualLocator:()=>cs,makeDescriptor:()=>Xt,makeIdent:()=>Xo,makeLocator:()=>hi,makeRange:()=>_m,parseDescriptor:()=>_o,parseFileStyleRange:()=>zde,parseIdent:()=>vi,parseLocator:()=>BA,parseRange:()=>ic,prettyDependent:()=>Db,prettyDescriptor:()=>Ht,prettyIdent:()=>yr,prettyLocator:()=>At,prettyLocatorNoColors:()=>Qb,prettyRange:()=>zm,prettyReference:()=>Bh,prettyResolution:()=>bb,prettyWorkspace:()=>wh,renamePackage:()=>dh,slugifyIdent:()=>wb,slugifyLocator:()=>nc,sortDescriptors:()=>sc,stringifyDescriptor:()=>Pi,stringifyIdent:()=>yt,stringifyLocator:()=>hn,tryParseDescriptor:()=>yh,tryParseIdent:()=>cH,tryParseLocator:()=>uH,virtualizeDescriptor:()=>Eb,virtualizePackage:()=>yb});var rc=ne(require("querystring")),AH=ne(pr());var ki={};$e(ki,{checksumFile:()=>Jm,checksumPattern:()=>Wm,makeHash:()=>gi});var jm=ne(require("crypto")),mb=ne(Cb());function gi(...t){let e=(0,jm.createHash)("sha512"),r="";for(let i of t)typeof i=="string"?r+=i:i&&(r&&(e.update(r),r=""),e.update(i));return r&&e.update(r),e.digest("hex")}async function Jm(t,{baseFs:e,algorithm:r}={baseFs:M,algorithm:"sha512"}){let i=await e.openPromise(t,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,jm.createHash)(r),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function Wm(t,{cwd:e}){let i=(await(0,mb.default)(t,{cwd:L.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,mb.default)([t,...i],{cwd:L.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=L.toPortablePath(a),u=await M.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await M.readlinkPromise(c))):u.isFile()&&l.push(await M.readFilePromise(c)),l.join("\0")})),o=(0,jm.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var Vm="virtual:",Gde=5;function Xo(t,e){if(t==null?void 0:t.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:gi(t,e),scope:t,name:e}}function Xt(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:gi(t.identHash,e),range:e}}function hi(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:gi(t.identHash,e),reference:e}}function Yde(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function Xm(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function Zm(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function qde(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function dh(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function Ch(t){return dh(t,t)}function Eb(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return Xt(t,`virtual:${e}#${t.range}`)}function yb(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return dh(t,hi(t,`virtual:${e}#${t.reference}`))}function Zo(t){return t.range.startsWith(Vm)}function cs(t){return t.reference.startsWith(Vm)}function mh(t){if(!Zo(t))throw new Error("Not a virtual descriptor");return Xt(t,t.range.replace(/^[^#]*#/,""))}function Ih(t){if(!cs(t))throw new Error("Not a virtual descriptor");return hi(t,t.reference.replace(/^[^#]*#/,""))}function jde(t,e){return t.range.includes("::")?t:Xt(t,`${t.range}::${rc.default.stringify(e)}`)}function Jde(t,e){return t.reference.includes("::")?t:hi(t,`${t.reference}::${rc.default.stringify(e)}`)}function Eh(t,e){return t.identHash===e.identHash}function lH(t,e){return t.descriptorHash===e.descriptorHash}function Bb(t,e){return t.locatorHash===e.locatorHash}function Wde(t,e){if(!cs(t))throw new Error("Invalid package type");if(!cs(e))throw new Error("Invalid package type");if(!Eh(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let i=e.dependencies.get(r.identHash);if(!i||!lH(r,i))return!1}return!0}function vi(t){let e=cH(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function cH(t){let e=t.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,r,i]=e,n=typeof r!="undefined"?r:null;return Xo(n,i)}function _o(t,e=!1){let r=yh(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function yh(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid range (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Xt(Xo(o,n),a)}function BA(t,e=!1){let r=uH(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function uH(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid reference (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return hi(Xo(o,n),a)}function ic(t,e){let r=t.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(r===null)throw new Error(`Invalid range (${t})`);let i=typeof r[1]!="undefined"?r[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof r[3]!="undefined"?decodeURIComponent(r[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${t})`);let s=typeof r[3]!="undefined"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),o=(e==null?void 0:e.parseSelector)?rc.default.parse(s):s,a=typeof r[4]!="undefined"?rc.default.parse(r[4]):null;return{protocol:i,source:n,selector:o,params:a}}function zde(t,{protocol:e}){let{selector:r,params:i}=ic(t,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:BA(i.locator,!0),path:r}}function gH(t){return t=t.replace(/%/g,"%25"),t=t.replace(/:/g,"%3A"),t=t.replace(/#/g,"%23"),t}function Vde(t){return t===null?!1:Object.entries(t).length>0}function _m({protocol:t,source:e,selector:r,params:i}){let n="";return t!==null&&(n+=`${t}`),e!==null&&(n+=`${gH(e)}#`),n+=gH(r),Vde(i)&&(n+=`::${rc.default.stringify(i)}`),n}function Xde(t){let{params:e,protocol:r,source:i,selector:n}=ic(t);for(let s in e)s.startsWith("__")&&delete e[s];return _m({protocol:r,source:i,params:e,selector:n})}function yt(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function Pi(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function hn(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function wb(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function nc(t){let{protocol:e,selector:r}=ic(t.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=AH.default.valid(r),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=t.scope?`${wb(t)}-${s}-${t.locatorHash.slice(0,o)}`:`${wb(t)}-${s}-${t.locatorHash.slice(0,o)}`;return or(a)}function yr(t,e){return e.scope?`${ze(t,`@${e.scope}/`,Ne.SCOPE)}${ze(t,e.name,Ne.NAME)}`:`${ze(t,e.name,Ne.NAME)}`}function $m(t){if(t.startsWith(Vm)){let e=$m(t.substr(t.indexOf("#")+1)),r=t.substr(Vm.length,Gde);return`${e} [${r}]`}else return t.replace(/\?.*/,"?[...]")}function zm(t,e){return`${ze(t,$m(e),Ne.RANGE)}`}function Ht(t,e){return`${yr(t,e)}${ze(t,"@",Ne.RANGE)}${zm(t,e.range)}`}function Bh(t,e){return`${ze(t,$m(e),Ne.REFERENCE)}`}function At(t,e){return`${yr(t,e)}${ze(t,"@",Ne.REFERENCE)}${Bh(t,e.reference)}`}function Qb(t){return`${yt(t)}@${$m(t.reference)}`}function sc(t){return xi(t,[e=>yt(e),e=>e.range])}function wh(t,e){return yr(t,e.locator)}function bb(t,e,r){let i=Zo(e)?mh(e):e;return r===null?`${Ht(t,i)} \u2192 ${Ib(t).Cross}`:i.identHash===r.identHash?`${Ht(t,i)} \u2192 ${Bh(t,r.reference)}`:`${Ht(t,i)} \u2192 ${At(t,r)}`}function Db(t,e,r){return r===null?`${At(t,e)}`:`${At(t,e)} (via ${zm(t,r.range)})`}function Zde(t){return`node_modules/${yt(t)}`}var lt;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(lt||(lt={}));var Pr;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(Pr||(Pr={}));var Xr;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(Xr||(Xr={}));var Ne={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING"},wA;(function(e){e[e.BOLD=2]="BOLD"})(wA||(wA={}));var Sb=process.env.GITHUB_ACTIONS?{level:2}:Qh.default.supportsColor?{level:Qh.default.supportsColor.level}:{level:0},eI=Sb.level!==0,xb=eI&&!process.env.GITHUB_ACTIONS&&!hH.CIRCLE,kb=new Qh.default.Instance(Sb),_de=new Map([[Ne.NO_HINT,null],[Ne.NULL,["#a853b5",129]],[Ne.SCOPE,["#d75f00",166]],[Ne.NAME,["#d7875f",173]],[Ne.RANGE,["#00afaf",37]],[Ne.REFERENCE,["#87afff",111]],[Ne.NUMBER,["#ffd700",220]],[Ne.PATH,["#d75fd7",170]],[Ne.URL,["#d75fd7",170]],[Ne.ADDED,["#5faf00",70]],[Ne.REMOVED,["#d70000",160]],[Ne.CODE,["#87afff",111]],[Ne.SIZE,["#ffd700",220]]]),Tn=t=>t,tI={[Ne.NUMBER]:Tn({pretty:(t,e)=>`${e}`,json:t=>t}),[Ne.IDENT]:Tn({pretty:(t,e)=>yr(t,e),json:t=>yt(t)}),[Ne.LOCATOR]:Tn({pretty:(t,e)=>At(t,e),json:t=>hn(t)}),[Ne.DESCRIPTOR]:Tn({pretty:(t,e)=>Ht(t,e),json:t=>Pi(t)}),[Ne.RESOLUTION]:Tn({pretty:(t,{descriptor:e,locator:r})=>bb(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:Pi(t),locator:e!==null?hn(e):null})}),[Ne.DEPENDENT]:Tn({pretty:(t,{locator:e,descriptor:r})=>Db(t,e,r),json:({locator:t,descriptor:e})=>({locator:hn(t),descriptor:Pi(e)})}),[Ne.PACKAGE_EXTENSION]:Tn({pretty:(t,e)=>{switch(e.type){case Pr.Dependency:return`${yr(t,e.parentDescriptor)} \u27A4 ${zi(t,"dependencies",Ne.CODE)} \u27A4 ${yr(t,e.descriptor)}`;case Pr.PeerDependency:return`${yr(t,e.parentDescriptor)} \u27A4 ${zi(t,"peerDependencies",Ne.CODE)} \u27A4 ${yr(t,e.descriptor)}`;case Pr.PeerDependencyMeta:return`${yr(t,e.parentDescriptor)} \u27A4 ${zi(t,"peerDependenciesMeta",Ne.CODE)} \u27A4 ${yr(t,vi(e.selector))} \u27A4 ${zi(t,e.key,Ne.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case Pr.Dependency:return`${yt(t.parentDescriptor)} > ${yt(t.descriptor)}`;case Pr.PeerDependency:return`${yt(t.parentDescriptor)} >> ${yt(t.descriptor)}`;case Pr.PeerDependencyMeta:return`${yt(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Ne.SETTING]:Tn({pretty:(t,e)=>(t.get(e),oc(t,zi(t,e,Ne.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Ne.DURATION]:Tn({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),i=Math.ceil((e-r*60*1e3)/1e3);return i===0?`${r}m`:`${r}m ${i}s`}else{let r=Math.floor(e/1e3),i=e-r*1e3;return i===0?`${r}s`:`${r}s ${i}ms`}},json:t=>t}),[Ne.SIZE]:Tn({pretty:(t,e)=>{let r=["KB","MB","GB","TB"],i=r.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return zi(t,`${s} ${r[i-1]}`,Ne.NUMBER)},json:t=>t}),[Ne.PATH]:Tn({pretty:(t,e)=>zi(t,L.fromPortablePath(e),Ne.PATH),json:t=>L.fromPortablePath(t)})};function QA(t,e){return[e,t]}function rI(t,e,r){return t.get("enableColors")&&r&2&&(e=Qh.default.bold(e)),e}function zi(t,e,r){if(!t.get("enableColors"))return e;let i=_de.get(r);if(i===null)return e;let n=typeof i=="undefined"?r:Sb.level>=3?i[0]:i[1],s=typeof n=="number"?kb.ansi256(n):n.startsWith("#")?kb.hex(n):kb[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var $de=!!process.env.KONSOLE_VERSION;function oc(t,e,r){return t.get("enableHyperlinks")?$de?`]8;;${r}\\${e}]8;;\\`:`]8;;${r}\x07${e}]8;;\x07`:e}function ze(t,e,r){if(e===null)return zi(t,"null",Ne.NULL);if(Object.prototype.hasOwnProperty.call(tI,r))return tI[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return zi(t,e,r)}function vb(t,e,r,{separator:i=", "}={}){return[...e].map(n=>ze(t,n,r)).join(i)}function ac(t,e){if(t===null)return null;if(Object.prototype.hasOwnProperty.call(tI,e))return a0(e),tI[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function Ib(t){return{Check:zi(t,"\u2713","green"),Cross:zi(t,"\u2718","red"),Question:zi(t,"?","cyan")}}function bA(t,{label:e,value:[r,i]}){return`${ze(t,e,Ne.CODE)}: ${ze(t,r,i)}`}var On;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(On||(On={}));function bh(t,{configuration:e}){let r=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of r){let h=g.get("level");if(typeof h=="undefined")continue;let f=g.get("code");typeof f!="undefined"&&i.set(f,h);let p=g.get("text");typeof p!="undefined"&&n.set(p,h);let m=g.get("pattern");typeof m!="undefined"&&s.push([fH.default.matcher(m),h])}s.reverse();let o=(g,h,f)=>{if(g===null||g===J.UNNAMED)return f;let p=n.size>0||s.length>0?(0,pH.default)(h):h;if(n.size>0){let m=n.get(p);if(typeof m!="undefined")return m!=null?m:f}if(s.length>0){for(let[m,I]of s)if(m(p))return I!=null?I:f}if(i.size>0){let m=i.get(ZC(g));if(typeof m!="undefined")return m!=null?m:f}return f},a=t.reportInfo,l=t.reportWarning,c=t.reportError,u=function(g,h,f,p){switch(o(h,f,p)){case On.Info:a.call(g,h,f);break;case On.Warning:l.call(g,h!=null?h:J.UNNAMED,f);break;case On.Error:c.call(g,h!=null?h:J.UNNAMED,f);break}};t.reportInfo=function(...g){return u(this,...g,On.Info)},t.reportWarning=function(...g){return u(this,...g,On.Warning)},t.reportError=function(...g){return u(this,...g,On.Error)}}var Mt={};$e(Mt,{Method:()=>SA,RequestError:()=>rq.RequestError,del:()=>hEe,get:()=>uEe,getNetworkSettings:()=>oq,post:()=>WD,put:()=>gEe,request:()=>Lh});var $Y=ne(EI()),eq=ne(require("https")),tq=ne(require("http")),jD=ne(Ji()),JD=ne(XY()),yI=ne(require("url"));var ZY=ne(require("stream")),_Y=ne(require("string_decoder"));var et=class extends Error{constructor(e,r,i){super(r);this.reportExtra=i;this.reportCode=e}};function oEe(t){return typeof t.reportCode!="undefined"}var pi=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let r=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),r=l,c()},o=(l=0)=>{s(r+1)},a=async function*(){for(;r{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),r}};var rq=ne(EI()),iq=new Map,nq=new Map,aEe=new tq.Agent({keepAlive:!0}),AEe=new eq.Agent({keepAlive:!0});function sq(t){let e=new yI.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),{proxy:r}}async function lEe(t){return Xs(nq,t,()=>M.readFilePromise(t).then(e=>(nq.set(t,e),e)))}function cEe({statusCode:t,statusMessage:e},r){let i=ze(r,t,Ne.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return oc(r,`${i}${e?` (${e})`:""}`,n)}async function BI(t,{configuration:e,customErrorMessage:r}){var i,n;try{return await t}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=r==null?void 0:r(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof $Y.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${ze(e,"httpTimeout",Ne.SETTING)})`);let a=new et(J.NETWORK_ERROR,o,l=>{s.response&&l.reportError(J.NETWORK_ERROR,` ${bA(e,{label:"Response Code",value:QA(Ne.NO_HINT,cEe(s.response,e))})}`),s.request&&(l.reportError(J.NETWORK_ERROR,` ${bA(e,{label:"Request Method",value:QA(Ne.NO_HINT,s.request.options.method)})}`),l.reportError(J.NETWORK_ERROR,` ${bA(e,{label:"Request URL",value:QA(Ne.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(J.NETWORK_ERROR,` ${bA(e,{label:"Request Redirects",value:QA(Ne.NO_HINT,vb(e,s.request.redirects,Ne.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(J.NETWORK_ERROR,` ${bA(e,{label:"Request Retry Count",value:QA(Ne.NO_HINT,`${ze(e,s.request.retryCount,Ne.NUMBER)} (can be increased via ${ze(e,"httpRetry",Ne.SETTING)})`)})}`)});throw a.originalError=s,a}}function oq(t,e){let r=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0},n=Object.keys(i),s=typeof t=="string"?new yI.URL(t):t;for(let[o,a]of r)if(jD.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var SA;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(SA||(SA={}));async function Lh(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o=SA.GET}){let a=typeof t=="string"?new yI.URL(t):t,l=oq(a,{configuration:r});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!jD.default.isMatch(a.hostname,r.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?JD.default.httpOverHttp(sq(l.httpProxy)):aEe,https:l.httpsProxy?JD.default.httpsOverHttp(sq(l.httpsProxy)):AEe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=r.get("httpTimeout"),h=r.get("httpRetry"),f=r.get("enableStrictSsl"),p=l.caFilePath,{default:m}=await Promise.resolve().then(()=>ne(EI())),I=p?await lEe(p):void 0,Q=m.extend(v({timeout:{socket:g},retry:h,https:{rejectUnauthorized:f,certificateAuthority:I}},u));return r.getLimit("networkConcurrency")(()=>Q(a))}async function uEe(t,n){var s=n,{configuration:e,jsonResponse:r}=s,i=Kr(s,["configuration","jsonResponse"]);let o=Xs(iq,t,()=>BI(Lh(t,null,v({configuration:e},i)),{configuration:e}).then(a=>(iq.set(t,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),r?JSON.parse(o.toString()):o}async function gEe(t,e,n){var s=n,{customErrorMessage:r}=s,i=Kr(s,["customErrorMessage"]);return(await BI(Lh(t,e,W(v({},i),{method:SA.PUT})),i)).body}async function WD(t,e,n){var s=n,{customErrorMessage:r}=s,i=Kr(s,["customErrorMessage"]);return(await BI(Lh(t,e,W(v({},i),{method:SA.POST})),i)).body}async function hEe(t,i){var n=i,{customErrorMessage:e}=n,r=Kr(n,["customErrorMessage"]);return(await BI(Lh(t,null,W(v({},r),{method:SA.DELETE})),r)).body}var kt={};$e(kt,{executePackageAccessibleBinary:()=>C4,executePackageScript:()=>uE,executePackageShellcode:()=>JS,executeWorkspaceAccessibleBinary:()=>q0e,executeWorkspaceLifecycleScript:()=>d4,executeWorkspaceScript:()=>p4,getPackageAccessibleBinaries:()=>gE,getWorkspaceAccessibleBinaries:()=>f4,hasPackageScript:()=>H0e,hasWorkspaceScript:()=>jS,makeScriptEnv:()=>sf,maybeExecuteWorkspaceLifecycleScript:()=>Y0e,prepareExternalProject:()=>U0e});var Hh={};$e(Hh,{getLibzipPromise:()=>Ci,getLibzipSync:()=>Nq});var na=["number","number"],zD;(function(F){F[F.ZIP_ER_OK=0]="ZIP_ER_OK",F[F.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",F[F.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",F[F.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",F[F.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",F[F.ZIP_ER_READ=5]="ZIP_ER_READ",F[F.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",F[F.ZIP_ER_CRC=7]="ZIP_ER_CRC",F[F.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",F[F.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",F[F.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",F[F.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",F[F.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",F[F.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",F[F.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",F[F.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",F[F.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",F[F.ZIP_ER_EOF=17]="ZIP_ER_EOF",F[F.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",F[F.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",F[F.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",F[F.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",F[F.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",F[F.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",F[F.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",F[F.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",F[F.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",F[F.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",F[F.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",F[F.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",F[F.ZIP_ER_TELL=30]="ZIP_ER_TELL",F[F.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(zD||(zD={}));var aq=t=>({get HEAP8(){return t.HEAP8},get HEAPU8(){return t.HEAPU8},errors:zD,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint16S:t._malloc(2),uint32S:t._malloc(4),uint64S:t._malloc(8),malloc:t._malloc,free:t._free,getValue:t.getValue,open:t.cwrap("zip_open","number",["string","number","number"]),openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),stat:t.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...na,"number","number"]),fopen:t.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...na,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...na,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...na,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...na,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...na,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...na,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...na,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"]),setMtime:t.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:t.cwrap("zipstruct_stat","number",[]),statS:t.cwrap("zipstruct_statS","number",[]),statName:t.cwrap("zipstruct_stat_name","string",["number"]),statIndex:t.cwrap("zipstruct_stat_index","number",["number"]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),error:t.cwrap("zipstruct_error","number",[]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}});var hS=null;function Nq(){return hS===null&&(hS=aq(Rq())),hS}async function Ci(){return Nq()}var Zh={};$e(Zh,{ShellError:()=>la,execute:()=>sE,globUtils:()=>ZI});var Vh={};$e(Vh,{parseResolution:()=>OI,parseShell:()=>NI,parseSyml:()=>jr,stringifyArgument:()=>CS,stringifyArgumentSegment:()=>mS,stringifyArithmeticExpression:()=>TI,stringifyCommand:()=>dS,stringifyCommandChain:()=>wc,stringifyCommandChainThen:()=>pS,stringifyCommandLine:()=>MI,stringifyCommandLineThen:()=>fS,stringifyEnvSegment:()=>LI,stringifyRedirectArgument:()=>Gh,stringifyResolution:()=>KI,stringifyShell:()=>Bc,stringifyShellLine:()=>Bc,stringifySyml:()=>co,stringifyValueArgument:()=>Qc});var Tq=ne(Lq());function NI(t,e={isGlobPattern:()=>!1}){try{return(0,Tq.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function Bc(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:i},n)=>`${MI(r)}${i===";"?n!==t.length-1||e?";":"":" &"}`).join(" ")}function MI(t){return`${wc(t.chain)}${t.then?` ${fS(t.then)}`:""}`}function fS(t){return`${t.type} ${MI(t.line)}`}function wc(t){return`${dS(t)}${t.then?` ${pS(t.then)}`:""}`}function pS(t){return`${t.type} ${wc(t.chain)}`}function dS(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>LI(e)).join(" ")} `:""}${t.args.map(e=>CS(e)).join(" ")}`;case"subshell":return`(${Bc(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Gh(e)).join(" ")}`:""}`;case"group":return`{ ${Bc(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Gh(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>LI(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function LI(t){return`${t.name}=${t.args[0]?Qc(t.args[0]):""}`}function CS(t){switch(t.type){case"redirection":return Gh(t);case"argument":return Qc(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function Gh(t){return`${t.subtype} ${t.args.map(e=>Qc(e)).join(" ")}`}function Qc(t){return t.segments.map(e=>mS(e)).join("")}function mS(t){let e=(i,n)=>n?`"${i}"`:i,r=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${Bc(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue=="undefined"?`\${${t.name}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(i=>Qc(i)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${TI(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function TI(t){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},r=(n,s)=>s?`( ${n} )`:n,i=n=>r(TI(n),!["number","variable"].includes(n.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${i(t.left)} ${e(t.type)} ${i(t.right)}`}}var Uq=ne(Kq());function OI(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,Uq.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function KI(t){let e="";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+="/"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var XI=ne(vJ()),RJ=ne(FJ()),Zwe=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,NJ=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],PS=class{constructor(e){this.data=e}};function MJ(t){return t.match(Zwe)?t:JSON.stringify(t)}function LJ(t){return typeof t=="undefined"?!0:typeof t=="object"&&t!==null?Object.keys(t).every(e=>LJ(t[e])):!1}function FS(t,e,r){if(t===null)return`null -`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} -`;if(typeof t=="string")return`${MJ(t)} -`;if(Array.isArray(t)){if(t.length===0)return`[] -`;let i=" ".repeat(e);return` -${t.map(s=>`${i}- ${FS(s,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let i,n;t instanceof PS?(i=t.data,n=!1):(i=t,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=NJ.indexOf(l),g=NJ.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!LJ(i[l])).map((l,c)=>{let u=i[l],g=MJ(l),h=FS(u,e+1,!0),f=c>0||r?s:"";return h.startsWith(` -`)?`${f}${g}:${h}`:`${f}${g}: ${h}`}).join(e===0?` -`:"")||` -`;return r?` -${a}`:`${a}`}throw new Error(`Unsupported value type (${t})`)}function co(t){try{let e=FS(t,0,!1);return e!==` -`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}co.PreserveOrdering=PS;function _we(t){return t.endsWith(` -`)||(t+=` -`),(0,RJ.parse)(t)}var $we=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function eQe(t){if($we.test(t))return _we(t);let e=(0,XI.safeLoad)(t,{schema:XI.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function jr(t){return eQe(t)}var zJ=ne(dQ()),VJ=ne(require("os")),Vi=ne(require("stream")),XJ=ne(require("util"));var la=class extends Error{constructor(e){super(e);this.name="ShellError"}};var ZI={};$e(ZI,{fastGlobOptions:()=>KJ,isBraceExpansion:()=>UJ,isGlobPattern:()=>tQe,match:()=>rQe,micromatchOptions:()=>$I});var TJ=ne(Km()),OJ=ne(require("fs")),_I=ne(Ji()),$I={strictBrackets:!0},KJ={onlyDirectories:!1,onlyFiles:!1};function tQe(t){if(!_I.default.scan(t,$I).isGlob)return!1;try{_I.default.parse(t,$I)}catch{return!1}return!0}function rQe(t,{cwd:e,baseFs:r}){return(0,TJ.default)(t,W(v({},KJ),{cwd:L.fromPortablePath(e),fs:KC(OJ.default,new vg(r))}))}function UJ(t){return _I.default.scan(t,$I).isBrace}var HJ=ne(_w()),hs=ne(require("stream")),GJ=ne(require("string_decoder")),Ri;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(Ri||(Ri={}));var UA=new Set;function RS(){}function NS(){for(let t of UA)t.kill()}function YJ(t,e,r,i){return n=>{let s=n[0]instanceof hs.Transform?"pipe":n[0],o=n[1]instanceof hs.Transform?"pipe":n[1],a=n[2]instanceof hs.Transform?"pipe":n[2],l=(0,HJ.default)(t,e,W(v({},i),{stdio:[s,o,a]}));return UA.add(l),UA.size===1&&(process.on("SIGINT",RS),process.on("SIGTERM",NS)),n[0]instanceof hs.Transform&&n[0].pipe(l.stdin),n[1]instanceof hs.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof hs.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(UA.delete(l),UA.size===0&&(process.off("SIGINT",RS),process.off("SIGTERM",NS)),u.code){case"ENOENT":n[2].write(`command not found: ${t} -`),c(127);break;case"EACCES":n[2].write(`permission denied: ${t} -`),c(128);break;default:n[2].write(`uncaught error: ${u.message} -`),c(1);break}}),l.on("exit",u=>{UA.delete(l),UA.size===0&&(process.off("SIGINT",RS),process.off("SIGTERM",NS)),c(u!==null?u:129)})})}}}function qJ(t){return e=>{let r=e[0]==="pipe"?new hs.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}var Un=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},jJ=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Xh=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:i,stderr:n}){let s=new Xh(null,e);return s.stdin=r,s.stdout=i,s.stderr=n,s}pipeTo(e,r=1){let i=new Xh(this,e),n=new jJ;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(r&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(r.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function eE(t,e){return Xh.start(t,e)}function JJ(t,e=null){let r=new hs.PassThrough,i=new GJ.StringDecoder,n="";return r.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` -`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",t(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&t(e!==null?`${e} ${s}`:s)}),r}function WJ(t,{prefix:e}){return{stdout:JJ(r=>t.stdout.write(`${r} -`),t.stdout.isTTY?e:null),stderr:JJ(r=>t.stderr.write(`${r} -`),t.stderr.isTTY?e:null)}}var iQe=(0,XJ.promisify)(setTimeout);var ei;(function(r){r[r.Readable=1]="Readable",r[r.Writable=2]="Writable"})(ei||(ei={}));function ZJ(t,e,r){let i=new Vi.PassThrough({autoDestroy:!0});switch(t){case Ri.STDIN:(e&1)==1&&r.stdin.pipe(i,{end:!1}),(e&2)==2&&r.stdin instanceof Vi.Writable&&i.pipe(r.stdin,{end:!1});break;case Ri.STDOUT:(e&1)==1&&r.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stdout,{end:!1});break;case Ri.STDERR:(e&1)==1&&r.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stderr,{end:!1});break;default:throw new la(`Bad file descriptor: "${t}"`)}return i}function tE(t,e={}){let r=v(v({},t),e);return r.environment=v(v({},t.environment),e.environment),r.variables=v(v({},t.variables),e.variables),r}var nQe=new Map([["cd",async([t=(0,VJ.homedir)(),...e],r,i)=>{let n=D.resolve(i.cwd,L.toPortablePath(t));return(await r.baseFs.statPromise(n)).isDirectory()?(i.cwd=n,0):(i.stderr.write(`cd: not a directory -`),1)}],["pwd",async(t,e,r)=>(r.stdout.write(`${L.fromPortablePath(r.cwd)} -`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,i)=>i.exitCode=parseInt(t!=null?t:i.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} -`),0)],["sleep",async([t],e,r)=>{if(typeof t=="undefined")return r.stderr.write(`sleep: missing operand -`),1;let i=Number(t);return Number.isNaN(i)?(r.stderr.write(`sleep: invalid time interval '${t}' -`),1):await iQe(1e3*i,0)}],["__ysh_run_procedure",async(t,e,r)=>{let i=r.procedures[t[0]];return await eE(i,{stdin:new Un(r.stdin),stdout:new Un(r.stdout),stderr:new Un(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let i=r.stdin,n=r.stdout,s=r.stderr,o=[],a=[],l=[],c=0;for(;t[c]!=="--";){let g=t[c++],{type:h,fd:f}=JSON.parse(g),p=w=>{switch(f){case null:case 0:o.push(w);break;default:throw new Error(`Unsupported file descriptor: "${f}"`)}},m=w=>{switch(f){case null:case 1:a.push(w);break;case 2:l.push(w);break;default:throw new Error(`Unsupported file descriptor: "${f}"`)}},I=Number(t[c++]),Q=c+I;for(let w=c;we.baseFs.createReadStream(D.resolve(r.cwd,L.toPortablePath(t[w]))));break;case"<<<":p(()=>{let x=new Vi.PassThrough;return process.nextTick(()=>{x.write(`${t[w]} -`),x.end()}),x});break;case"<&":p(()=>ZJ(Number(t[w]),1,r));break;case">":case">>":{let x=D.resolve(r.cwd,L.toPortablePath(t[w]));m(x==="/dev/null"?new Vi.Writable({autoDestroy:!0,emitClose:!0,write(N,H,T){setImmediate(T)}}):e.baseFs.createWriteStream(x,h===">>"?{flags:"a"}:void 0))}break;case">&":m(ZJ(Number(t[w]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${h}"`)}}if(o.length>0){let g=new Vi.PassThrough;i=g;let h=f=>{if(f===o.length)g.end();else{let p=o[f]();p.pipe(g,{end:!1}),p.on("end",()=>{h(f+1)})}};h(0)}if(a.length>0){let g=new Vi.PassThrough;n=g;for(let h of a)g.pipe(h)}if(l.length>0){let g=new Vi.PassThrough;s=g;for(let h of l)g.pipe(h)}let u=await eE(_h(t.slice(c+1),e,r),{stdin:new Un(i),stdout:new Un(n),stderr:new Un(s)}).run();return await Promise.all(a.map(g=>new Promise((h,f)=>{g.on("error",p=>{f(p)}),g.on("close",()=>{h()}),g.end()}))),await Promise.all(l.map(g=>new Promise((h,f)=>{g.on("error",p=>{f(p)}),g.on("close",()=>{h()}),g.end()}))),u}]]);async function sQe(t,e,r){let i=[],n=new Vi.PassThrough;return n.on("data",s=>i.push(s)),await rE(t,e,tE(r,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function _J(t,e,r){let i=t.map(async s=>{let o=await HA(s.args,e,r);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function iE(t){return t.match(/[^ \r\n\t]+/g)||[]}async function $J(t,e,r,i,n=i){switch(t.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(t.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=iE(s);for(let a=0;a=0&&st+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)};async function $h(t,e,r){if(t.type==="number"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: "${t.value}", only integers are allowed`)}else if(t.type==="variable"){let i=[];await $J(W(v({},t),{quoted:!0}),e,r,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?$h({type:"variable",name:i.join(" ")},e,r):$h({type:"number",value:n},e,r)}else return oQe[t.type](await $h(t.left,e,r),await $h(t.right,e,r))}async function HA(t,e,r){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,h)=>{let f=JSON.stringify({type:u,fd:g}),p=i.get(f);typeof p=="undefined"&&i.set(f,p=[]),p.push(h)};for(let u of t){let g=!1;switch(u.type){case"redirection":{let h=await HA(u.args,e,r);for(let f of h)c(u.subtype,u.fd,f)}break;case"argument":for(let h of u.segments)switch(h.type){case"text":o(h.text);break;case"glob":o(h.pattern),g=!0;break;case"shell":{let f=await sQe(h.shell,e,r);if(h.quoted)o(f);else{let p=iE(f);for(let m=0;m0){let u=[];for(let[g,h]of i.entries())u.splice(u.length,0,g,String(h.length),...h);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function _h(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let i=L.fromPortablePath(r.cwd),n=r.environment;typeof n.PWD!="undefined"&&(n=W(v({},n),{PWD:i}));let[s,...o]=t;if(s==="command")return YJ(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return qJ(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:h,stderr:f}=r;r.stdin=l,r.stdout=c,r.stderr=u;try{return await a(o,e,r)}finally{r.stdin=g,r.stdout=h,r.stderr=f}})}function aQe(t,e,r){return i=>{let n=new Vi.PassThrough,s=rE(t,e,tE(r,{stdin:n}));return{stdin:n,promise:s}}}function AQe(t,e,r){return i=>{let n=new Vi.PassThrough,s=rE(t,e,r);return{stdin:n,promise:s}}}function e3(t,e,r,i){if(e.length===0)return t;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=v({},i.procedures),i.procedures[n]=t,_h([...e,"__ysh_run_procedure",n],r,i)}}async function t3(t,e,r){let i=t,n=null,s=null;for(;i;){let o=i.then?v({},r):r,a;switch(i.type){case"command":{let l=await HA(i.args,e,r),c=await _J(i.envs,e,r);a=i.envs.length?_h(l,e,tE(o,{environment:c})):_h(l,e,o)}break;case"subshell":{let l=await HA(i.args,e,r),c=aQe(i.subshell,e,o);a=e3(c,l,e,o)}break;case"group":{let l=await HA(i.args,e,r),c=AQe(i.group,e,o);a=e3(c,l,e,o)}break;case"envs":{let l=await _J(i.envs,e,r);o.environment=v(v({},o.environment),l),a=_h(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=eE(a,{stdin:new Un(o.stdin),stdout:new Un(o.stdout),stderr:new Un(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,Ri.STDOUT);break;case"|&":s=s.pipeTo(a,Ri.STDOUT|Ri.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function lQe(t,e,r,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return zJ.default.hex(a)}if(i){let s=r.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=WJ(r,{prefix:l});return r.backgroundJobs.push(t3(t,e,tE(r,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} -`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${l}, '${o(wc(t))}' has ended -`)})),0}return await t3(t,e,r)}async function cQe(t,e,r,{background:i=!1}={}){let n,s=a=>{n=a,r.variables["?"]=String(a)},o=async a=>{try{return await lQe(a.chain,e,r,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof la))throw l;return r.stderr.write(`${l.message} -`),1}};for(s(await o(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":n===0&&s(await o(t.then.line));break;case"||":n!==0&&s(await o(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return n}async function rE(t,e,r){let i=r.backgroundJobs;r.backgroundJobs=[];let n=0;for(let{command:s,type:o}of t){if(n=await cQe(s,e,r,{background:o==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(n)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=i,n}function r3(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>nE(e));case"arithmetic":return MS(t.arithmetic);case"shell":return LS(t.shell);default:return!1}}function nE(t){switch(t.type){case"redirection":return t.args.some(e=>nE(e));case"argument":return t.segments.some(e=>r3(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function MS(t){switch(t.type){case"variable":return r3(t);case"number":return!1;default:return MS(t.left)||MS(t.right)}}function LS(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let i;switch(r.type){case"subshell":i=LS(r.subshell);break;case"command":i=r.envs.some(n=>n.args.some(s=>nE(s)))||r.args.some(n=>nE(n));break}if(i)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function sE(t,e=[],{baseFs:r=new Nt,builtins:i={},cwd:n=L.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=ZI}={}){let g={};for(let[p,m]of Object.entries(s))typeof m!="undefined"&&(g[p]=m);let h=new Map(nQe);for(let[p,m]of Object.entries(i))h.set(p,m);o===null&&(o=new Vi.PassThrough,o.end());let f=NI(t,u);if(!LS(f)&&f.length>0&&e.length>0){let{command:p}=f[f.length-1];for(;p.then;)p=p.then.line;let m=p.chain;for(;m.then;)m=m.then.chain;m.type==="command"&&(m.args=m.args.concat(e.map(I=>({type:"argument",segments:[{type:"text",text:I}]}))))}return await rE(f,{args:e,baseFs:r,builtins:h,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var u4=ne(GS()),g4=ne(tf()),Nc=ne(require("stream"));var e4=ne(pr());var rf=class{supportsDescriptor(e,r){return!!(e.range.startsWith(rf.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(rf.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.getWorkspaceByCwd(e.reference.slice(rf.protocol.length));return W(v({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:lt.SOFT,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},Ir=rf;Ir.protocol="workspace:";var Ft={};$e(Ft,{SemVer:()=>Z3.SemVer,satisfiesWithPrereleases:()=>nf,validRange:()=>Gn});var aE=ne(pr()),Z3=ne(pr()),_3=new Map;function nf(t,e,r=!1){if(!t)return!1;let i=`${e}${r}`,n=_3.get(i);if(typeof n=="undefined")try{n=new aE.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{_3.set(i,n||null)}else if(n===null)return!1;let s;try{s=new aE.default.SemVer(t,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var $3=new Map;function Gn(t){if(t.indexOf(":")!==-1)return null;let e=$3.get(t);if(typeof e!="undefined")return e;try{e=new aE.default.Range(t)}catch{e=null}return $3.set(t,e),e}var ca=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:r=new Nt}={}){let i=D.join(e,"package.json");return await r.existsPromise(i)?await ca.fromFile(i,{baseFs:r}):null}static async find(e,{baseFs:r}={}){let i=await ca.tryFind(e,{baseFs:r});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:r=new Nt}={}){let i=new ca;return await i.loadFile(e,{baseFs:r}),i}static fromText(e){let r=new ca;return r.loadFromText(e),r}static isManifestFieldCompatible(e,r){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,r===s.slice(1))return!1}else if(i=!1,s===r)return!0;return n&&i}loadFromText(e){let r;try{r=JSON.parse(r4(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(r),this.indent=t4(e)}async loadFile(e,{baseFs:r=new Nt}){let i=await r.readFilePromise(e,"utf8"),n;try{n=JSON.parse(r4(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=t4(i)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=vi(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=mi(e.main):this.main=null,typeof e.module=="string"?this.module=mi(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=mi(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(mi(s),typeof o=="string"?mi(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,mi(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.bin.set(s,mi(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=vi(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Xt(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=vi(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Xt(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=vi(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(Ir.protocol)&&!Gn(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=Xt(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=_o(s),l=this.ensureDependencyMeta(a),c=AE(o.built,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=AE(o.optional,{yamlCompatibilityMode:r});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=AE(o.unplugged,{yamlCompatibilityMode:r});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=_o(s),l=this.ensurePeerDependencyMeta(a),c=AE(o.optional,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:OI(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=mi(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=mi(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=mi(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(mi(s),typeof o=="string"?mi(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,mi(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,mi(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(mi(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=vi(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Xt(a,o);this.dependencies.set(l.identHash,l);let c=Xt(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}isCompatibleWithOS(e){return ca.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return ca.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!e4.default.valid(e.range))throw new Error(`Invalid meta field range for '${Pi(e)}'`);let r=yt(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(r);n||this.dependenciesMeta.set(r,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${Pi(e)}'`);let r=yt(e),i=this.peerDependenciesMeta.get(r);return i||this.peerDependenciesMeta.set(r,i={}),i}setRawField(e,r,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=r;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=r,a=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){if(Object.assign(e,this.raw),this.name!==null?e.name=yt(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let s=this.browser;typeof s=="string"?e.browser=s:s instanceof Map&&(e.browser=Object.assign({},...Array.from(s.keys()).sort().map(o=>({[o]:s.get(o)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(s=>({[s]:this.bin.get(s)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=W(v({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:s})=>s)}):e.workspaces=this.workspaceDefinitions.map(({pattern:s})=>s):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let s of this.dependencies.values()){let o=this.dependenciesMeta.get(yt(s)),a=!1;if(r&&o){let l=o.get(null);l&&l.optional&&(a=!0)}a?n.push(s):i.push(s)}i.length>0?e.dependencies=Object.assign({},...sc(i).map(s=>({[yt(s)]:s.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...sc(n).map(s=>({[yt(s)]:s.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...sc(this.devDependencies.values()).map(s=>({[yt(s)]:s.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...sc(this.peerDependencies.values()).map(s=>({[yt(s)]:s.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[s,o]of xi(this.dependenciesMeta.entries(),([a,l])=>a))for(let[a,l]of xi(o.entries(),([c,u])=>c!==null?`0${c}`:"1")){let c=a!==null?Pi(Xt(vi(s),a)):s,u=v({},l);r&&a===null&&delete u.optional,Object.keys(u).length!==0&&(e.dependenciesMeta[c]=u)}return Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...xi(this.peerDependenciesMeta.entries(),([s,o])=>s).map(([s,o])=>({[s]:o}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:s,reference:o})=>({[KI(s)]:o}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,e}},Je=ca;Je.fileName="package.json",Je.allDependencies=["dependencies","devDependencies","peerDependencies"],Je.hardDependencies=["dependencies","devDependencies"];function t4(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function r4(t){return t.charCodeAt(0)===65279?t.slice(1):t}function mi(t){return t.replace(/\\/g,"/")}function AE(t,{yamlCompatibilityMode:e}){return e?g0(t):typeof t=="undefined"||typeof t=="boolean"?t:null}var o4=ne(s4());var a4=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],A4=80,F0e=new Set([J.FETCH_NOT_CACHED,J.UNUSED_CACHE_ENTRY]),R0e=5,ua=process.env.GITHUB_ACTIONS?{start:t=>`::group::${t} -`,end:t=>`::endgroup:: -`}:process.env.TRAVIS?{start:t=>`travis_fold:start:${t} -`,end:t=>`travis_fold:end:${t} -`}:process.env.GITLAB_CI?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${t} -`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r`}:null,l4=new Date,N0e=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,M0e=t=>t,cE=M0e({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),L0e=N0e&&Object.keys(cE).find(t=>{let e=cE[t];return!(e.date&&(e.date[0]!==l4.getDate()||e.date[1]!==l4.getMonth()+1))})||"default";function c4(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let n=ZC(t===null?0:t);return!r&&t===null?ze(e,n,"grey"):n}function qS(t,{configuration:e,json:r}){let i=c4(t,{configuration:e,json:r});if(!i||t===null||t===J.UNNAMED)return i;let n=J[t],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return oc(e,i,s)}var Pe=class extends pi{constructor({configuration:e,stdout:r,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=R0e,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.forgettableLines=[];bh(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...F0e]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=r;let u=this.configuration.get("progressBarStyle")||L0e;if(!Object.prototype.hasOwnProperty.call(cE,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=cE[u];let g="\u27A4 YN0000: \u250C ".length,h=Math.max(0,Math.min(process.stdout.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*h/80)}static async start(e,r){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(J.UNNAMED,a)};try{await r(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,r){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof r!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(J.FETCH_NOT_CACHED,r)}startTimerSync(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,ua!==null&&!this.json&&this.includeInfos&&this.stdout.write(ua.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,ua!==null&&!this.json&&this.includeInfos&&this.stdout.write(ua.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${ze(this.configuration,l-a,Ne.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startTimerPromise(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,ua!==null&&!this.json&&this.includeInfos&&this.stdout.write(ua.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,ua!==null&&!this.json&&this.includeInfos&&this.stdout.write(ua.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${ze(this.configuration,l-a,Ne.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startCacheReport(e){let r=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{r!==null&&this.reportCacheChanges(r)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,r){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${ze(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${r}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,r){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${ze(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${r}`)}reportError(e,r){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${ze(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${r}`,{truncate:!1})}reportProgress(e){let r=!1,i=Promise.resolve().then(async()=>{let s={progress:0,title:void 0};this.progress.set(e,{definition:s,lastScaledSize:-1}),this.refreshProgress(-1);for await(let{progress:o,title:a}of e)r||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{r||(r=!0,this.progress.delete(e),this.refreshProgress(1))};return W(v({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let r=ze(this.configuration,Date.now()-this.startTime,Ne.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${r}`:e;this.errorCount>0?this.reportError(J.UNNAMED,i):this.warningCount>0?this.reportWarning(J.UNNAMED,i):this.reportInfo(J.UNNAMED,i)}writeLine(e,{truncate:r}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:r})} -`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:r}={}){this.forgettableLines=[],this.writeLine(e,{truncate:r})}writeLines(e,{truncate:r}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:r})} -`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:r}){let i=this.cacheHitCount-e,n=this.cacheMissCount-r;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${At(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${At(this.configuration,this.lastCacheMiss)})`),this.reportInfo(J.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let r of e)r.committed=!0,r.action()}clearProgress({delta:e=0,clear:r=!1}){!this.configuration.get("enableProgressBars")||this.json||this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||r)&&this.stdout.write(""))}writeProgress(){if(!this.configuration.get("enableProgressBars")||this.json||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>A4&&(this.progressFrame=(this.progressFrame+1)%a4.length,this.progressTime=e);let r=a4[this.progressFrame];for(let i of this.progress.values()){let n=this.progressStyle.chars[0].repeat(i.lastScaledSize),s=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize),o=this.formatName(null),a=o?`${o}: `:"";this.stdout.write(`${ze(this.configuration,"\u27A4","blueBright")} ${a}${r} ${n}${s} -`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress()},A4)}refreshProgress(e=0){let r=!1;if(this.progress.size===0)r=!0;else for(let i of this.progress.values()){let n=Math.trunc(this.progressMaxScaledSize*i.definition.progress),s=i.lastScaledSize;if(i.lastScaledSize=n,n!==s){r=!0;break}}r&&(this.clearProgress({delta:e}),this.writeProgress())}truncate(e,{truncate:r}={}){return this.configuration.get("enableProgressBars")||(r=!1),typeof r=="undefined"&&(r=this.configuration.get("preferTruncatedLines")),r&&(e=(0,o4.default)(e,0,process.stdout.columns-1)),e}formatName(e){return c4(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return qS(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Qr="3.1.0-rc.5";var ps;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(ps||(ps={}));async function uo(t,e,r,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await M.writeFilePromise(D.format({dir:t,name:e,ext:".cmd"}),n)}await M.writeFilePromise(D.join(t,e),`#!/bin/sh -exec "${r}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" -`,{mode:493})}async function T0e(t){let e=null;try{e=await M.readFilePromise(D.join(t,Et.lockfile),"utf8")}catch{}return e!==null?e.match(/^__metadata:$/m)?{packageManager:ps.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:ps.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:M.existsSync(D.join(t,"package-lock.json"))?{packageManager:ps.Npm,reason:`found npm's "package-lock.json" lockfile`}:M.existsSync(D.join(t,"pnpm-lock.yaml"))?{packageManager:ps.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function sf({project:t,locator:e,binFolder:r,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=L.fromPortablePath(r);n.BERRY_BIN_FOLDER=L.fromPortablePath(s);let o=process.env.COREPACK_ROOT?L.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([uo(r,"node",process.execPath),...Qr!==null?[uo(r,"run",process.execPath,[o,"run"]),uo(r,"yarn",process.execPath,[o]),uo(r,"yarnpkg",process.execPath,[o]),uo(r,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),t&&(n.INIT_CWD=L.fromPortablePath(t.configuration.startingCwd),n.PROJECT_CWD=L.fromPortablePath(t.cwd)),n.PATH=n.PATH?`${s}${L.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${L.sep}yarn`,n.npm_node_execpath=`${s}${L.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let u=t.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=t.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=yt(e),n.npm_package_version=g}let a=Qr!==null?`yarn/${Qr}`:`yarn/${Xl("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.versions.node} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),t&&await t.configuration.triggerHook(u=>u.setupScriptEnvironment,t,n,async(u,g,h)=>await uo(r,or(u),g,h)),n}var O0e=2,K0e=(0,g4.default)(O0e);async function U0e(t,e,{configuration:r,report:i,workspace:n=null,locator:s=null}){await K0e(async()=>{await M.mktempPromise(async o=>{let a=D.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=r.getSubprocessStreams(a,{prefix:L.fromPortablePath(t),report:i}),g=s&&cs(s)?Ih(s):s,h=g?hn(g):"an external project";c.write(`Packing ${h} from sources -`);let f=await T0e(t),p;f!==null?(c.write(`Using ${f.packageManager} for bootstrap. Reason: ${f.reason} - -`),p=f.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn - -`),p=ps.Yarn2),await M.mktempPromise(async m=>{let I=await sf({binFolder:m}),w=new Map([[ps.Yarn1,async()=>{let N=n!==null?["workspace",n]:[],H=await js("yarn",["set","version","classic","--only-if-needed"],{cwd:t,env:I,stdin:l,stdout:c,stderr:u,end:on.ErrorCode});if(H.code!==0)return H.code;await M.appendFilePromise(D.join(t,".npmignore"),`/.yarn -`),c.write(` -`);let T=await js("yarn",["install"],{cwd:t,env:I,stdin:l,stdout:c,stderr:u,end:on.ErrorCode});if(T.code!==0)return T.code;c.write(` -`);let P=await js("yarn",[...N,"pack","--filename",L.fromPortablePath(e)],{cwd:t,env:I,stdin:l,stdout:c,stderr:u});return P.code!==0?P.code:0}],[ps.Yarn2,async()=>{let N=n!==null?["workspace",n]:[];I.YARN_ENABLE_INLINE_BUILDS="1";let H=D.join(t,Et.lockfile);await M.existsPromise(H)||await M.writeFilePromise(H,"");let T=await js("yarn",[...N,"pack","--install-if-needed","--filename",L.fromPortablePath(e)],{cwd:t,env:I,stdin:l,stdout:c,stderr:u});return T.code!==0?T.code:0}],[ps.Npm,async()=>{if(n!==null)throw new Error(`Workspaces aren't supported by npm, which has been detected as the primary package manager for ${t}`);delete I.npm_config_user_agent;let N=await js("npm",["install"],{cwd:t,env:I,stdin:l,stdout:c,stderr:u,end:on.ErrorCode});if(N.code!==0)return N.code;let H=new Nc.PassThrough,T=ch(H);H.pipe(c);let P=await js("npm",["pack","--silent"],{cwd:t,env:I,stdin:l,stdout:H,stderr:u});if(P.code!==0)return P.code;let G=(await T).toString().trim().replace(/^.*\n/s,""),te=D.resolve(t,L.toPortablePath(G));return await M.renamePromise(te,e),0}]]).get(p);if(typeof w=="undefined")throw new Error("Assertion failed: Unsupported workflow");let x=await w();if(!(x===0||typeof x=="undefined"))throw M.detachTemp(o),new et(J.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${x}, logs can be found here: ${ze(r,a,Ne.PATH)})`)})})})}async function H0e(t,e,{project:r}){let i=r.tryWorkspaceByLocator(t);if(i!==null)return jS(i,e);let n=r.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${At(r.configuration,t)} not found in the project`);return await sn.openPromise(async s=>{let o=r.configuration,a=r.configuration.getLinkers(),l={project:r,report:new Pe({stdout:new Nc.PassThrough,configuration:o})},c=a.find(f=>f.supportsPackage(n,l));if(!c)throw new Error(`The package ${At(r.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new Dt(u,{baseFs:s});return(await Je.find(Se.dot,{baseFs:g})).scripts.has(e)},{libzip:await Ci()})}async function uE(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await M.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await h4(t,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),h=c.scripts.get(e);if(typeof h=="undefined")return 1;let f=async()=>await sE(h,r,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(m=>m.wrapScriptExecution,f,n,t,e,{script:h,args:r,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function JS(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await M.mktempPromise(async l=>{let{env:c,cwd:u}=await h4(t,{project:n,binFolder:l,cwd:i});return await sE(e,r,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function G0e(t,{binFolder:e,cwd:r,lifecycleScript:i}){let n=await sf({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await f4(t),([s,[,o]])=>uo(e,or(s),process.execPath,[o]))),typeof r=="undefined"&&(r=D.dirname(await M.realpathPromise(D.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:n,cwd:r}}async function h4(t,{project:e,binFolder:r,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(t);if(s!==null)return G0e(s,{binFolder:r,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(t.locatorHash);if(!o)throw new Error(`Package for ${At(e.configuration,t)} not found in the project`);return await sn.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Pe({stdout:new Nc.PassThrough,configuration:l})},g=c.find(I=>I.supportsPackage(o,u));if(!g)throw new Error(`The package ${At(e.configuration,o)} isn't supported by any of the available linkers`);let h=await sf({project:e,locator:t,binFolder:r,lifecycleScript:n});await Promise.all(Array.from(await gE(t,{project:e}),([I,[,Q]])=>uo(r,or(I),process.execPath,[Q])));let f=await g.findPackageLocation(o,u),p=new Dt(f,{baseFs:a}),m=await Je.find(Se.dot,{baseFs:p});return typeof i=="undefined"&&(i=f),{manifest:m,binFolder:r,env:h,cwd:i}},{libzip:await Ci()})}async function p4(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o}){return await uE(t.anchoredLocator,e,r,{cwd:i,project:t.project,stdin:n,stdout:s,stderr:o})}function jS(t,e){return t.manifest.scripts.has(e)}async function d4(t,e,{cwd:r,report:i}){let{configuration:n}=t.project,s=null;await M.mktempPromise(async o=>{let a=D.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${L.fromPortablePath(t.cwd)}") -`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:At(n,t.anchoredLocator),header:l});i.reportInfo(J.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await p4(t,e,[],{cwd:r,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw M.detachTemp(o),new et(J.LIFECYCLE_SCRIPT,`${(0,u4.default)(e)} script failed (exit code ${ze(n,g,Ne.NUMBER)}, logs can be found here: ${ze(n,a,Ne.PATH)}); run ${ze(n,`yarn ${e}`,Ne.CODE)} to investigate`)})}async function Y0e(t,e,r){jS(t,e)&&await d4(t,e,r)}async function gE(t,{project:e}){let r=e.configuration,i=new Map,n=e.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${At(r,t)} not found in the project`);let s=new Nc.Writable,o=r.getLinkers(),a={project:e,report:new Pe({configuration:r,stdout:s})},l=new Set([t.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${Ht(r,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return hA.skip;let h=o.find(p=>p.supportsPackage(g,a));if(!h)return hA.skip;let f=null;try{f=await h.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return hA.skip;throw p}return{dependency:g,packageLocation:f}}));for(let u of c){if(u===hA.skip)continue;let{dependency:g,packageLocation:h}=u;for(let[f,p]of g.bin)i.set(f,[g,L.fromPortablePath(D.resolve(h,p))])}return i}async function f4(t){return await gE(t.anchoredLocator,{project:t.project})}async function C4(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await gE(t,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${At(n.configuration,t)}`);return await M.mktempPromise(async g=>{let[,h]=u,f=await sf({project:n,locator:t,binFolder:g});await Promise.all(Array.from(c,([m,[,I]])=>uo(f.BERRY_BIN_FOLDER,or(m),process.execPath,[I])));let p;try{p=await js(process.execPath,[...l,h,...r],{cwd:i,env:f,stdin:s,stdout:o,stderr:a})}finally{await M.removePromise(f.BERRY_BIN_FOLDER)}return p.code})}async function q0e(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await C4(t.anchoredLocator,e,r,{project:t.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Nr={};$e(Nr,{convertToZip:()=>ASe,extractArchiveTo:()=>cSe,makeArchiveFromDirectory:()=>aSe});var yz=ne(require("stream")),Bz=ne(iz());var dz=ne(require("os")),Cz=ne(pz()),mz=ne(require("worker_threads")),ck=class{constructor(e){this.source=e;this.pool=[];this.queue=new Cz.default({concurrency:Math.max(1,(0,dz.cpus)().length)});let r=setTimeout(()=>{if(!(this.queue.size!==0||this.queue.pending!==0)){for(let i of this.pool)i.terminate();this.pool=[]}},1e3).unref();this.queue.on("idle",()=>{r.refresh()})}run(e){return this.queue.add(()=>{var i;let r=(i=this.pool.pop())!=null?i:new mz.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return r.ref(),new Promise((n,s)=>{let o=a=>{a!==0&&s(new Error(`Worker exited with code ${a}`))};r.once("message",a=>{this.pool.push(r),r.unref(),r.off("error",s),r.off("exit",o),n(a)}),r.once("error",s),r.once("exit",o),r.postMessage(e)})})}};var wz=ne(Ez());async function aSe(t,{baseFs:e=new Nt,prefixPath:r=Se.root,compressionLevel:i,inMemory:n=!1}={}){let s=await Ci(),o;if(n)o=new kr(null,{libzip:s,level:i});else{let l=await M.mktempPromise(),c=D.join(l,"archive.zip");o=new kr(c,{create:!0,libzip:s,level:i})}let a=D.resolve(Se.root,r);return await o.copyPromise(a,t,{baseFs:e,stableTime:!0,stableSort:!0}),o}var Qz;async function ASe(t,e){let r=await M.mktempPromise(),i=D.join(r,"archive.zip");return Qz||(Qz=new ck((0,wz.getContent)())),await Qz.run({tmpFile:i,tgz:t,opts:e}),new kr(i,{libzip:await Ci(),level:e.compressionLevel})}async function*lSe(t){let e=new Bz.default.Parse,r=new yz.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{r.write(i)}),e.on("error",i=>{r.destroy(i)}),e.on("close",()=>{r.destroy()}),e.end(t);for await(let i of r){let n=i;yield n,n.resume()}}async function cSe(t,e,{stripComponents:r=0,prefixPath:i=Se.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=r)}for await(let a of lSe(t)){if(n(a))continue;let l=D.normalize(L.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=r)continue;let c=l.slice(r).join("/"),u=D.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(D.dirname(u),{chmod:493,utimes:[$t.SAFE_TIME,$t.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,$t.SAFE_TIME,$t.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(D.dirname(u),{chmod:493,utimes:[$t.SAFE_TIME,$t.SAFE_TIME]}),e.writeFileSync(u,await ch(a),{mode:g}),e.utimesSync(u,$t.SAFE_TIME,$t.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(D.dirname(u),{chmod:493,utimes:[$t.SAFE_TIME,$t.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,$t.SAFE_TIME,$t.SAFE_TIME);break}}return e}var Yn={};$e(Yn,{emitList:()=>uSe,emitTree:()=>vz,treeNodeToJson:()=>kz,treeNodeToTreeify:()=>xz});var Sz=ne(Dz());function xz(t,{configuration:e}){let r={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(rI(e,l,wA.BOLD)),typeof c!="undefined"&&g.push(ze(e,c[0],c[1])),g.length===0&&g.push(rI(e,`${a}`,wA.BOLD));let h=g.join(": "),f=s[h]={};typeof u!="undefined"&&i(u,f)}};if(typeof t.children=="undefined")throw new Error("The root node must only contain children");return i(t.children,r),r}function kz(t){let e=r=>{var s;if(typeof r.children=="undefined"){if(typeof r.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return ac(r.value[0],r.value[1])}let i=Array.isArray(r.children)?r.children.entries():Object.entries((s=r.children)!=null?s:{}),n=Array.isArray(r.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof r.value=="undefined"?n:{value:ac(r.value[0],r.value[1]),children:n}};return e(t)}function uSe(t,{configuration:e,stdout:r,json:i}){let n=t.map(s=>({value:s}));vz({children:n},{configuration:e,stdout:r,json:i})}function vz(t,{configuration:e,stdout:r,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(t.children)?t.children.values():Object.values((o=t.children)!=null?o:{});for(let l of a)r.write(`${JSON.stringify(kz(l))} -`);return}let s=(0,Sz.asTree)(xz(t,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 -$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 -$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(s)}var hk=ne(require("fs"));var gSe=8,mt=class{constructor(e,{configuration:r,immutable:i=r.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.configuration=r,this.cwd=e,this.immutable=i,this.check=n;let s=r.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=r.get("compressionLevel"),a=o!==$a?`c${o}`:"";this.cacheKey=[gSe,a].join("")}}static async find(e,{immutable:r,check:i}={}){let n=new mt(e.get("cacheFolder"),{configuration:e,immutable:r,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${nc(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let n=hSe(r).slice(0,10);return`${nc(e)}-${n}.zip`}getLocatorPath(e,r){return this.mirrorCwd===null?D.resolve(this.cwd,this.getVersionFilename(e)):r===null||fk(r)!==this.cacheKey?null:D.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?D.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await M.existsPromise(this.cwd))throw new et(J.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await M.mkdirPromise(this.cwd,{recursive:!0});let e=D.resolve(this.cwd,".gitignore");await M.changeFilePromise(e,`/.gitignore -*.flock -`)}(this.mirrorCwd||!this.immutable)&&await M.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,{onHit:i,onMiss:n,loader:s,skipIntegrityCheck:o}){let a=this.getLocatorMirrorPath(e),l=new Nt,c=async(H,T=null)=>{let P=!o||!r?`${this.cacheKey}/${await Jm(H)}`:r;if(T!==null){let G=!o||!r?`${this.cacheKey}/${await Jm(T)}`:r;if(P!==G)throw new et(J.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(r!==null&&P!==r){let G;switch(this.check?G="throw":fk(r)!==fk(P)?G="update":G=this.configuration.get("checksumBehavior"),G){case"ignore":return r;case"update":return P;default:case"throw":throw new et(J.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return P},u=async H=>{if(!s)throw new Error(`Cache check required but no loader configured for ${At(this.configuration,e)}`);let T=await s(),P=T.getRealPath();return T.saveAndClose(),await M.chmodPromise(P,420),await c(H,P)},g=async()=>{if(a===null||!await M.existsPromise(a)){let P=await s(),G=P.getRealPath();return P.saveAndClose(),{source:"loader",path:G}}let H=await M.mktempPromise(),T=D.join(H,this.getVersionFilename(e));return await M.copyFilePromise(a,T,hk.default.constants.COPYFILE_FICLONE),{source:"mirror",path:T}},h=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${At(this.configuration,e)}`);if(this.immutable)throw new et(J.IMMUTABLE_CACHE,`Cache entry required but missing for ${At(this.configuration,e)}`);let{path:H,source:T}=await g();await M.chmodPromise(H,420);let P=await c(H),G=this.getLocatorPath(e,P);if(!G)throw new Error("Assertion failed: Expected the cache path to be available");let te=null;if(T!=="mirror"&&a!==null){let j=await M.mktempPromise();te=D.join(j,this.getVersionFilename(e)),await M.copyFilePromise(H,te,hk.default.constants.COPYFILE_FICLONE)}return await this.writeFileWithLock(G,async()=>await this.writeFileWithLock(T==="mirror"?null:a,async()=>(await M.movePromise(H,G),te&&a&&await M.movePromise(te,a),[G,P])))},f=async()=>{let T=(async()=>{let P=this.getLocatorPath(e,r),G=P!==null?await l.existsPromise(P):!1,te=G?i:n;if(te&&te(),G){let j=null,A=P;return this.check?j=await u(A):j=await c(A),[A,j]}else return h()})();this.mutexes.set(e.locatorHash,T);try{return await T}finally{this.mutexes.delete(e.locatorHash)}};for(let H;H=this.mutexes.get(e.locatorHash);)await H;let[p,m]=await f();this.markedFiles.add(p);let I=null,Q=await Ci(),w=new kg(()=>c0(()=>I=new kr(p,{baseFs:l,libzip:Q,readOnly:!0}),H=>`Failed to open the cache entry for ${At(this.configuration,e)}: ${H}`),D);return[new eA(p,{baseFs:w,pathUtils:D}),()=>{I!==null&&I.discardAndClose()},m]}async writeFileWithLock(e,r){return e===null?await r():await M.lockPromise(e,async()=>await r())}};function fk(t){let e=t.indexOf("/");return e!==-1?t.slice(0,e):null}function hSe(t){let e=t.indexOf("/");return e!==-1?t.slice(e+1):t}var Tz=ne(Fz()),sy=ne(Og());var Oz=ne(tf()),Ik=ne(require("stream"));var Rz={hooks:{reduceDependency:(t,e,r,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==yt(r)||o.from&&o.from.description&&o.from.description!==r.reference||o.descriptor.fullName!==yt(t)||o.descriptor.description&&o.descriptor.description!==t.range)continue;return n.bindDescriptor(Xt(t,a),e.topLevelWorkspace.anchoredLocator,s)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let i=wh(t.configuration,r);await t.configuration.triggerHook(n=>n.validateWorkspace,r,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let i of r.errors)e.reportWarning(J.INVALID_MANIFEST,i.message)}}};var dk=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));return i||null}getFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));if(!i)throw new et(J.FETCHER_NOT_FOUND,`${At(r.project.configuration,e)} isn't supported by any available fetcher`);return i}};var eu=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,r,i)}async getSatisfying(e,r,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,r,i)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));return i||null}getResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));if(!i)throw new Error(`${Ht(r.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));return i||null}getResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));if(!i)throw new Error(`${At(r.project.configuration,e)} isn't supported by any available resolver`);return i}};var Nz=ne(pr());var tu=/^(?!v)[a-z0-9._-]+$/i,Ck=class{supportsDescriptor(e,r){return!!(Gn(e.range)||tu.test(e.range))}supportsLocator(e,r){return!!(Nz.default.valid(e.reference)||tu.test(e.reference))}shouldPersistResolution(e,r){return r.resolver.shouldPersistResolution(this.forwardLocator(e,r),r)}bindDescriptor(e,r,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),r,i)}getResolutionDependencies(e,r){return r.resolver.getResolutionDependencies(this.forwardDescriptor(e,r),r)}async getCandidates(e,r,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),r,i)}async getSatisfying(e,r,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),r,i)}async resolve(e,r){let i=await r.resolver.resolve(this.forwardLocator(e,r),r);return dh(i,e)}forwardDescriptor(e,r){return Xt(e,`${r.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,r){return hi(e,`${r.project.configuration.get("defaultProtocol")}${e.reference}`)}};var bf=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=hi(e,n);return r.fetcher.getLocalPath(s,r)}async fetch(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=hi(e,n),o=await r.fetcher.fetch(s,r);return await this.ensureVirtualLink(e,o,r)}getLocatorFilename(e){return nc(e)}async ensureVirtualLink(e,r,i){let n=r.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=ar.makeVirtualPath(s,o,n),l=new eA(a,{baseFs:r.packageFs,pathUtils:D});return W(v({},r),{packageFs:l})}};var ru=class{static isVirtualDescriptor(e){return!!e.range.startsWith(ru.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(ru.protocol)}supportsDescriptor(e,r){return ru.isVirtualDescriptor(e)}supportsLocator(e,r){return ru.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},ny=ru;ny.protocol="virtual:";var mk=class{supports(e){return!!e.reference.startsWith(Ir.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let i=this.getWorkspace(e,r).cwd;return{packageFs:new Dt(i),prefixPath:Se.dot,localPath:i}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Ir.protocol.length))}};var Mz=ne(require("module"));function Lz(){return new Set(Mz.default.builtinModules||Object.keys(process.binding("natives")))}var pSe=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),oy="yarn_",Ek=".yarnrc.yml",yk="yarn.lock",dSe="********",ge;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(ge||(ge={}));var ys=Ne,Bk={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:ge.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:ge.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:ge.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:ge.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:ge.STRING,default:null},globalFolder:{description:"Folder where are stored the system-wide settings",type:ge.ABSOLUTE_PATH,default:sQ()},cacheFolder:{description:"Folder where the cache files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:ge.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:$a},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:ge.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:ge.STRING,default:yk},installStatePath:{description:"Path of the file where the install state will be persisted",type:ge.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:ge.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:ge.STRING,default:ay()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:ge.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:ge.BOOLEAN,default:eI,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:ge.BOOLEAN,default:xb,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:ge.BOOLEAN,default:sy.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:ge.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:ge.BOOLEAN,default:!sy.isCI&&process.stdout.isTTY&&process.stdout.columns>22,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:ge.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:ge.BOOLEAN,default:sy.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:ge.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:ge.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:ge.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:ge.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:ge.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:ge.BOOLEAN,default:!0},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:ge.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:ge.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:ge.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:ge.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:ge.NUMBER,default:Infinity},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:ge.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:ge.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:ge.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:ge.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:ge.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:ge.STRING,values:Object.values(On),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:ge.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:ge.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:ge.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:ge.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:ge.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:ge.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:ge.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:ge.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:ge.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:ge.MAP,valueDefinition:{description:"A range",type:ge.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:ge.MAP,valueDefinition:{description:"A semver range",type:ge.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:ge.MAP,valueDefinition:{description:"The peerDependency meta",type:ge.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:ge.BOOLEAN,default:!1}}}}}}}};function Qk(t,e,r,i,n){if(i.isArray||i.type===ge.ANY&&Array.isArray(r))return Array.isArray(r)?r.map((s,o)=>wk(t,`${e}[${o}]`,s,i,n)):String(r).split(/,/).map(s=>wk(t,e,s,i,n));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return wk(t,e,r,i,n)}function wk(t,e,r,i,n){var a;switch(i.type){case ge.ANY:return r;case ge.SHAPE:return CSe(t,e,r,i,n);case ge.MAP:return mSe(t,e,r,i,n)}if(r===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(r))return r;let o=(()=>{if(i.type===ge.BOOLEAN&&typeof r!="string")return gh(r);if(typeof r!="string")throw new Error(`Expected value (${r}) to be a string`);let l=u0(r,{env:process.env});switch(i.type){case ge.ABSOLUTE_PATH:return D.resolve(n,L.toPortablePath(l));case ge.LOCATOR_LOOSE:return BA(l,!1);case ge.NUMBER:return parseInt(l);case ge.LOCATOR:return BA(l);case ge.BOOLEAN:return gh(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function CSe(t,e,r,i,n){if(typeof r!="object"||Array.isArray(r))throw new me(`Object configuration settings "${e}" must be an object`);let s=bk(t,i,{ignoreArrays:!0});if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=`${e}.${o}`;if(!i.properties[o])throw new me(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,Qk(t,l,a,i.properties[o],n))}return s}function mSe(t,e,r,i,n){let s=new Map;if(typeof r!="object"||Array.isArray(r))throw new me(`Map configuration settings "${e}" must be an object`);if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,Qk(t,c,a,u,n))}return s}function bk(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case ge.SHAPE:{if(e.isArray&&!r)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,bk(t,s));return i}break;case ge.MAP:return e.isArray&&!r?[]:new Map;case ge.ABSOLUTE_PATH:return e.default===null?null:t.projectCwd===null?D.isAbsolute(e.default)?D.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>D.resolve(t.projectCwd,i)):D.resolve(t.projectCwd,e.default);default:return e.default}}function Ay(t,e,r){if(e.type===ge.SECRET&&typeof t=="string"&&r.hideSecrets)return dSe;if(e.type===ge.ABSOLUTE_PATH&&typeof t=="string"&&r.getNativePaths)return L.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let i=[];for(let n of t)i.push(Ay(n,e,r));return i}if(e.type===ge.MAP&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries())i.set(n,Ay(s,e.valueDefinition,r));return i}if(e.type===ge.SHAPE&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries()){let o=e.properties[n];i.set(n,Ay(s,o,r))}return i}return t}function ISe(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(oy)&&(e=(0,Tz.default)(e.slice(oy.length)),t[e]=r);return t}function ay(){let t=`${oy}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return Ek}var wa;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(wa||(wa={}));var Io=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,r,i){let n=new Io(e);typeof r!="undefined"&&!(r instanceof Map)&&(n.projectCwd=r),n.importSettings(Bk);let s=typeof i!="undefined"?i:r instanceof Map?r:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,r,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=ISe();delete a.rcFilename;let l=await Io.findRcFiles(e),c=await Io.findHomeRcFile();if(c){let Q=l.find(w=>w.path===c.path);Q?Q.strict=!1:l.push(W(v({},c),{strict:!1}))}let u=({ignoreCwd:Q,yarnPath:w,ignorePath:x,lockfileFilename:N})=>({ignoreCwd:Q,yarnPath:w,ignorePath:x,lockfileFilename:N}),g=T=>{var P=T,{ignoreCwd:Q,yarnPath:w,ignorePath:x,lockfileFilename:N}=P,H=Kr(P,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return H},h=new Io(e);h.importSettings(u(Bk)),h.useWithSource("",u(a),e,{strict:!1});for(let{path:Q,cwd:w,data:x}of l)h.useWithSource(Q,u(x),w,{strict:!1});if(s){let Q=h.get("yarnPath"),w=h.get("ignorePath");if(Q!==null&&!w)return h}let f=h.get("lockfileFilename"),p;switch(i){case 0:p=await Io.findProjectCwd(e,f);break;case 1:p=await Io.findProjectCwd(e,null);break;case 2:M.existsSync(D.join(e,"package.json"))?p=D.resolve(e):p=null;break}h.startingCwd=e,h.projectCwd=p,h.importSettings(g(Bk));let m=new Map([["@@core",Rz]]),I=Q=>"default"in Q?Q.default:Q;if(r!==null){for(let N of r.plugins.keys())m.set(N,I(r.modules.get(N)));let Q=new Map;for(let N of Lz())Q.set(N,()=>Xl(N));for(let[N,H]of r.modules)Q.set(N,()=>H);let w=new Set,x=async(N,H)=>{let{factory:T,name:P}=Xl(N);if(w.has(P))return;let G=new Map(Q),te=A=>{if(G.has(A))return G.get(A)();throw new me(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},j=await Vl(async()=>I(await T(te)),A=>`${A} (when initializing ${P}, defined in ${H})`);Q.set(P,()=>j),w.add(P),m.set(P,j)};if(a.plugins)for(let N of a.plugins.split(";")){let H=D.resolve(e,L.toPortablePath(N));await x(H,"")}for(let{path:N,cwd:H,data:T}of l)if(!!o&&!!Array.isArray(T.plugins))for(let P of T.plugins){let G=typeof P!="string"?P.path:P,te=D.resolve(H,L.toPortablePath(G));await x(te,N)}}for(let[Q,w]of m)h.activatePlugin(Q,w);h.useWithSource("",g(a),e,{strict:n});for(let{path:Q,cwd:w,data:x,strict:N}of l)h.useWithSource(Q,g(x),w,{strict:N!=null?N:n});return h.get("enableGlobalCache")&&(h.values.set("cacheFolder",`${h.get("globalFolder")}/cache`),h.sources.set("cacheFolder","")),await h.refreshPackageExtensions(),h}static async findRcFiles(e){let r=ay(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=D.join(s,r);if(M.existsSync(o)){let a=await M.readFilePromise(o,"utf8"),l;try{l=jr(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new me(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=D.dirname(s)}return i}static async findHomeRcFile(){let e=ay(),r=Ng(),i=D.join(r,e);if(M.existsSync(i)){let n=await M.readFilePromise(i,"utf8"),s=jr(n);return{path:i,cwd:r,data:s}}return null}static async findProjectCwd(e,r){let i=null,n=e,s=null;for(;n!==s;){if(s=n,M.existsSync(D.join(s,"package.json"))&&(i=s),r!==null){if(M.existsSync(D.join(s,r))){i=s;break}}else if(i!==null)break;n=D.dirname(s)}return i}static async updateConfiguration(e,r){let i=ay(),n=D.join(e,i),s=M.existsSync(n)?jr(await M.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof r=="function"){try{a=r(s)}catch{a=r({})}if(a===s)return}else{a=s;for(let l of Object.keys(r)){let c=s[l],u=r[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await M.changeFilePromise(n,co(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let r=Ng();return await Io.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration!="undefined"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,i]of Object.entries(e))if(i!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,i),this.values.set(r,bk(this,i))}}useWithSource(e,r,i,n){try{this.use(e,r,i,n)}catch(s){throw s.message+=` (in ${ze(this,e,Ne.PATH)})`,s}}use(e,r,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(r)]){if(typeof r[o]=="undefined"||o==="plugins"||e===""&&pSe.has(o))continue;if(o==="rcFilename")throw new me(`The rcFilename settings can only be set via ${`${oy}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new me(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===ge.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=Qk(this,o,r[o],l,i)}catch(u){throw u.message+=` in ${ze(this,e,Ne.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===ge.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new me(`Couldn't find a configuration settings named "${e}"`);return Ay(n,s,{hideSecrets:r,getNativePaths:i})}getSubprocessStreams(e,{header:r,prefix:i,report:n}){let s,o,a=M.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${ze(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${ze(this,"STDERR","red")}`);s=new Ik.PassThrough,s.pipe(l),s.pipe(a),o=new Ik.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof r!="undefined"&&s.write(`${r} -`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let i of r.resolvers||[])e.push(new i);return new eu([new ny,new Ir,new Ck,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let i of r.fetchers||[])e.push(new i);return new dk([new bf,new mk,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let i of r.linkers||[])e.push(new i);return e}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,r=(i,n,{userProvided:s=!1}={})=>{if(!Gn(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new Je;o.load(n,{yamlCompatibilityMode:!0});let a=Wl(e,i.identHash),l=[];a.push([i.range,l]);let c={status:Xr.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(W(v({},c),{type:Pr.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(W(v({},c),{type:Pr.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[h,f]of Object.entries(g))l.push(W(v({},c),{type:Pr.PeerDependencyMeta,selector:u,key:h,value:f}))};await this.triggerHook(i=>i.registerPackageExtensions,this,r);for(let[i,n]of this.get("packageExtensions"))r(_o(i,!0),Im(n),{userProvided:!0})}normalizePackage(e){let r=Ch(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!nf(s,o))for(let l of a)switch(l.status===Xr.Inactive&&(l.status=Xr.Redundant),l.type){case Pr.Dependency:typeof r.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=Xr.Active,r.dependencies.set(l.descriptor.identHash,l.descriptor));break;case Pr.PeerDependency:typeof r.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=Xr.Active,r.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case Pr.PeerDependencyMeta:{let c=r.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=Xr.Active,Xs(r.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:A0(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of r.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=Xo("types",o),l=yt(a);r.peerDependencies.has(a.identHash)||r.peerDependenciesMeta.has(l)||r.peerDependenciesMeta.set(l,{optional:!0})}for(let s of r.peerDependenciesMeta.keys()){let o=vi(s);r.peerDependencies.has(o.identHash)||r.peerDependencies.set(o.identHash,Xt(o,"*"))}return r.dependencies=new Map(xi(r.dependencies,([,s])=>Pi(s))),r.peerDependencies=new Map(xi(r.peerDependencies,([,s])=>Pi(s))),r}getLimit(e){return Xs(this.limits,e,()=>(0,Oz.default)(this.get(e)))}async triggerHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...r)}}async triggerMultipleHooks(e,r){for(let i of r)await this.triggerHook(e,...i)}async reduceHook(e,r,...i){let n=r;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...r);if(typeof o!="undefined")return o}return null}},ce=Io;ce.telemetry=null;var _i;(function(r){r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE"})(_i||(_i={}));var Eo=class extends pi{constructor({configuration:e,stdout:r,suggestInstall:i=!0}){super();this.errorCount=0;bh(this,{configuration:e}),this.configuration=e,this.stdout=r,this.suggestInstall=i}static async start(e,r){let i=new this(e);try{await r(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){this.errorCount+=1,this.stdout.write(`${ze(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${r} -`)}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return W(v({},r),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` -`),this.stdout.write(`${ze(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. -`),this.suggestInstall&&this.stdout.write(`${ze(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. -`))}formatNameWithHyperlink(e){return qS(e,{configuration:this.configuration,json:!1})}};var Sy=ne(require("crypto")),v6=ne(y5()),xy=ne(x6()),P6=ne(tf()),F6=ne(pr()),_k=ne(require("util")),$k=ne(require("v8")),ev=ne(require("zlib"));var rFe=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,i)=>`${r}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>_m({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],Xk=class{constructor(){this.resolutions=null}async setup(e,{report:r}){let i=D.join(e.cwd,e.configuration.get("lockfileFilename"));if(!M.existsSync(i))return;let n=await M.readFilePromise(i,"utf8"),s=jr(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=yh(a);if(!l){r.reportWarning(J.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}Gn(l.range)&&(l=Xt(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[f,p]of rFe){let m=u.match(f);if(m){g=p(c,...m);break}}if(!g){r.reportWarning(J.YARN_IMPORT_FAILED,`${Ht(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let h=l;try{let f=ic(l.range),p=yh(f.selector,!0);p&&(h=p)}catch{}o.set(l.descriptorHash,hi(h,g))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var Dy=class{supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(Xm(e).locatorHash))}supportsLocator(e,r){return!!r.project.originalPackages.has(e.locatorHash)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=i.project.originalPackages.get(Xm(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var Zk=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.resolver.bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){throw new et(J.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,i){throw new et(J.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new et(J.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var Dr=class extends pi{reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return W(v({},r),{stop:i})}reportJson(e){}async finalize(){}};var k6=ne(Cb());var Uf=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=r,this.cwd=e}async setup(){this.manifest=M.existsSync(D.join(this.cwd,Je.fileName))?await Je.find(this.cwd):new Je,this.relativeCwd=D.relative(this.project.cwd,this.cwd)||Se.dot;let e=this.manifest.name?this.manifest.name:Xo(null,`${this.computeCandidateName()}-${gi(this.relativeCwd).substr(0,6)}`),r=this.manifest.version?this.manifest.version:"0.0.0";this.locator=hi(e,r),this.anchoredDescriptor=Xt(this.locator,`${Ir.protocol}${this.relativeCwd}`),this.anchoredLocator=hi(this.locator,`${Ir.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:s})=>s),n=await(0,k6.default)(i,{cwd:L.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let s of n){let o=D.resolve(this.cwd,L.toPortablePath(s));M.existsSync(D.join(o,"package.json"))&&this.workspacesCwds.add(o)}}accepts(e){var o;let r=e.indexOf(":"),i=r!==-1?e.slice(0,r+1):null,n=r!==-1?e.slice(r+1):e;if(i===Ir.protocol&&D.normalize(n)===this.relativeCwd||i===Ir.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=Gn(n);return s?i===Ir.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${D.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Je.hardDependencies}={}){let r=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||r.has(a)||(r.add(a),i(a))}};return i(this),r}getRecursiveWorkspaceChildren(){let e=[];for(let r of this.workspacesCwds){let i=this.project.workspacesByCwd.get(r);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let r=D.join(this.cwd,Je.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} -`;await M.changeFilePromise(r,i,{automaticNewlines:!0}),this.manifest.raw=e}};var tv=4,iFe=1,nFe=/ *, */g,R6=/\/$/,sFe=32,oFe=(0,_k.promisify)(ev.default.gzip),aFe=(0,_k.promisify)(ev.default.gunzip),Mr;(function(r){r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build"})(Mr||(Mr={}));var rv={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},Le=class{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){var c,u,g;if(!e.projectCwd)throw new me(`No project found in ${r}`);let i=e.projectCwd,n=r,s=null;for(;s!==e.projectCwd;){if(s=n,M.existsSync(D.join(s,Et.manifest))){i=s;break}n=D.dirname(s)}let o=new Le(e.projectCwd,{configuration:e});(c=ce.telemetry)==null||c.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(u=ce.telemetry)==null||u.reportWorkspaceCount(o.workspaces.length),(g=ce.telemetry)==null||g.reportDependencyCount(o.workspaces.reduce((h,f)=>h+f.manifest.dependencies.size+f.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};throw new me(`The nearest package directory (${ze(e,i,Ne.PATH)}) doesn't seem to be part of the project declared in ${ze(e,o.cwd,Ne.PATH)}. - -- If the project directory is right, it might be that you forgot to list ${ze(e,D.relative(o.cwd,i),Ne.PATH)} as a workspace. -- If it isn't, it's likely because you have a yarn.lock or package.json file there, confusing the project root detection.`)}async setupResolutions(){this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=D.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.configuration.get("defaultLanguageName");if(M.existsSync(e)){let i=await M.readFilePromise(e,"utf8");this.lockFileChecksum=gi(`${iFe}`,i);let n=jr(i);if(n.__metadata){let s=n.__metadata.version,o=n.__metadata.cacheKey;for(let a of Object.keys(n)){if(a==="__metadata")continue;let l=n[a];if(typeof l.resolution=="undefined")throw new Error(`Assertion failed: Expected the lockfile entry to have a resolution field (${a})`);let c=BA(l.resolution,!0),u=new Je;u.load(l,{yamlCompatibilityMode:!0});let g=u.version,h=u.languageName||r,f=l.linkType.toUpperCase(),p=u.dependencies,m=u.peerDependencies,I=u.dependenciesMeta,Q=u.peerDependenciesMeta,w=u.bin;if(l.checksum!=null){let x=typeof o!="undefined"&&!l.checksum.includes("/")?`${o}/${l.checksum}`:l.checksum;this.storedChecksums.set(c.locatorHash,x)}if(s>=tv){let x=W(v({},c),{version:g,languageName:h,linkType:f,dependencies:p,peerDependencies:m,dependenciesMeta:I,peerDependenciesMeta:Q,bin:w});this.originalPackages.set(x.locatorHash,x)}for(let x of a.split(nFe)){let N=_o(x);if(this.storedDescriptors.set(N.descriptorHash,N),s>=tv)this.storedResolutions.set(N.descriptorHash,c.locatorHash);else{let H=Zm(c);H.descriptorHash!==N.descriptorHash&&(this.storedDescriptors.set(H.descriptorHash,H),this.resolutionAliases.set(N.descriptorHash,H.descriptorHash))}}}}}}async setupWorkspaces(){this.workspaces=[],this.workspacesByCwd=new Map,this.workspacesByIdent=new Map;let e=[this.cwd];for(;e.length>0;){let r=e;e=[];for(let i of r){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let r=new Uf(e,{project:this});await r.setup();let i=this.workspacesByIdent.get(r.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${yr(this.configuration,r.locator)}: ${L.fromPortablePath(e)} conflicts with ${L.fromPortablePath(i.cwd)}`);return this.workspaces.push(r),this.workspacesByCwd.set(e,r),this.workspacesByIdent.set(r.locator.identHash,r),r}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){D.isAbsolute(e)||(e=D.resolve(this.cwd,e)),e=D.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let i of this.workspaces)D.relative(i.cwd,e).startsWith("../")||r&&r.cwd.length>=i.cwd.length||(r=i);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r=="undefined"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${yr(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Zo(e)&&(e=mh(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Ht(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(cs(e)&&(e=Ih(e)),r.locator.locatorHash!==e.locatorHash&&r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${At(this.configuration,e)})`);return r}refreshWorkspaceDependencies(){for(let e of this.workspaces){let r=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!r)throw new Error(`Assertion failed: Expected workspace ${wh(this.configuration,e)} (${ze(this.configuration,D.join(e.cwd,Et.manifest),Ne.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(r.dependencies)}}forgetResolution(e){let r=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);r(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&r(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let r of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(r,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(r)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,i]of e.dependencies)Zo(i)&&e.dependencies.set(r,mh(i))}getDependencyMeta(e,r){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(yt(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),r===null||!F6.default.valid(r))return i;for(let[a,l]of s)a!==null&&a===r&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:r=!1}={}){let i=new Dr,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(r&&(await o.findPackageLocation(a,s)).replace(R6,"")!==e.replace(R6,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let r=e.resolver||this.configuration.makeResolver(),i=new Xk;await i.setup(this,{report:e.report});let n=e.lockfileOnly?new eu([new Dy,new Zk(r)]):new eu([new Dy,i,r]),s=this.configuration.makeFetcher(),o=e.lockfileOnly?{project:this,report:e.report,resolver:n}:{project:this,report:e.report,resolver:n,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:s}},a=new Map,l=new Map,c=new Map,u=new Map,g=new Map,h=new Map,f=[],p=async P=>{let G=await Vl(async()=>await n.resolve(P,o),j=>`${At(this.configuration,P)}: ${j}`);if(!Bb(P,G))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${At(this.configuration,P)} to ${At(this.configuration,G)})`);u.set(G.locatorHash,G);let te=this.configuration.normalizePackage(G);for(let[j,A]of te.dependencies){let ee=await this.configuration.reduceHook(_=>_.reduceDependency,A,this,te,A,{resolver:n,resolveOptions:o});if(!Eh(A,ee))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let $=n.bindDescriptor(ee,P,o);te.dependencies.set(j,$)}return f.push(Promise.all([...te.dependencies.values()].map(j=>w(j)))),l.set(te.locatorHash,te),te},m=async P=>{let G=g.get(P.locatorHash);if(typeof G!="undefined")return G;let te=Promise.resolve().then(()=>p(P));return g.set(P.locatorHash,te),te},I=async(P,G)=>{let te=await w(G);return a.set(P.descriptorHash,P),c.set(P.descriptorHash,te.locatorHash),te},Q=async P=>{let G=this.resolutionAliases.get(P.descriptorHash);if(typeof G!="undefined")return I(P,this.storedDescriptors.get(G));let te=n.getResolutionDependencies(P,o),j=new Map(await Promise.all(te.map(async $=>[$.descriptorHash,await w($)]))),ee=(await Vl(async()=>await n.getCandidates(P,j,o),$=>`${Ht(this.configuration,P)}: ${$}`))[0];if(typeof ee=="undefined")throw new Error(`${Ht(this.configuration,P)}: No candidates found`);return a.set(P.descriptorHash,P),c.set(P.descriptorHash,ee.locatorHash),m(ee)},w=P=>{let G=h.get(P.descriptorHash);if(typeof G!="undefined")return G;a.set(P.descriptorHash,P);let te=Promise.resolve().then(()=>Q(P));return h.set(P.descriptorHash,te),te};for(let P of this.workspaces){let G=P.anchoredDescriptor;f.push(w(G))}for(;f.length>0;){let P=[...f];f.length=0,await Promise.all(P)}let x=new Set(this.resolutionAliases.values()),N=new Set(l.keys()),H=new Set,T=new Map;AFe({project:this,report:e.report,accessibleLocators:H,volatileDescriptors:x,optionalBuilds:N,peerRequirements:T,allDescriptors:a,allResolutions:c,allPackages:l});for(let P of x)a.delete(P),c.delete(P);this.storedResolutions=c,this.storedDescriptors=a,this.storedPackages=l,this.accessibleLocators=H,this.originalPackages=u,this.optionalBuilds=N,this.peerRequirements=T,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:r,fetcher:i,mode:n}){let s=i||this.configuration.makeFetcher(),o={checksums:this.storedChecksums,project:this,cache:e,fetcher:s,report:r},a=Array.from(new Set(xi(this.storedResolutions.values(),[g=>{let h=this.storedPackages.get(g);if(!h)throw new Error("Assertion failed: The locator should have been registered");return hn(h)}])));n===Mr.UpdateLockfile&&(a=a.filter(g=>!this.storedChecksums.has(g)));let l=!1,c=pi.progressViaCounter(a.length);r.reportProgress(c);let u=(0,P6.default)(sFe);if(await r.startCacheReport(async()=>{await Promise.all(a.map(g=>u(async()=>{let h=this.storedPackages.get(g);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(cs(h))return;let f;try{f=await s.fetch(h,o)}catch(p){p.message=`${At(this.configuration,h)}: ${p.message}`,r.reportExceptionOnce(p),l=p;return}f.checksum?this.storedChecksums.set(h.locatorHash,f.checksum):this.storedChecksums.delete(h.locatorHash),f.releaseFs&&f.releaseFs()}).finally(()=>{c.tick()})))}),l)throw l}async linkEverything({cache:e,report:r,fetcher:i,mode:n}){var j,A,ee;let s=i||this.configuration.makeFetcher(),o={checksums:this.storedChecksums,project:this,cache:e,fetcher:s,report:r,skipIntegrityCheck:!0},a=this.configuration.getLinkers(),l={project:this,report:r},c=new Map(a.map($=>{let _=$.makeInstaller(l),U=_.getCustomDataKey(),F=this.installersCustomData.get(U);return typeof F!="undefined"&&_.attachCustomData(F),[$,_]})),u=new Map,g=new Map,h=new Map,f=new Map(await Promise.all([...this.accessibleLocators].map(async $=>{let _=this.storedPackages.get($);if(!_)throw new Error("Assertion failed: The locator should have been registered");return[$,await s.fetch(_,o)]}))),p=[];for(let $ of this.accessibleLocators){let _=this.storedPackages.get($);if(typeof _=="undefined")throw new Error("Assertion failed: The locator should have been registered");let U=f.get(_.locatorHash);if(typeof U=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let F=[],Re=Ke=>{F.push(Ke)},xe=this.tryWorkspaceByLocator(_);if(xe!==null){let Ke=[],{scripts:Me}=xe.manifest;for(let ie of["preinstall","install","postinstall"])Me.has(ie)&&Ke.push([_i.SCRIPT,ie]);try{for(let[ie,we]of c)if(ie.supportsPackage(_,l)&&(await we.installPackage(_,U,{holdFetchResult:Re})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{F.length===0?(j=U.releaseFs)==null||j.call(U):p.push(Promise.all(F).catch(()=>{}).then(()=>{var ie;(ie=U.releaseFs)==null||ie.call(U)}))}let X=D.join(U.packageFs.getRealPath(),U.prefixPath);g.set(_.locatorHash,X),!cs(_)&&Ke.length>0&&h.set(_.locatorHash,{directives:Ke,buildLocations:[X]})}else{let Ke=a.find(ie=>ie.supportsPackage(_,l));if(!Ke)throw new et(J.LINKER_NOT_FOUND,`${At(this.configuration,_)} isn't supported by any available linker`);let Me=c.get(Ke);if(!Me)throw new Error("Assertion failed: The installer should have been registered");let X;try{X=await Me.installPackage(_,U,{holdFetchResult:Re})}finally{F.length===0?(A=U.releaseFs)==null||A.call(U):p.push(Promise.all(F).then(()=>{}).then(()=>{var ie;(ie=U.releaseFs)==null||ie.call(U)}))}u.set(_.locatorHash,Ke),g.set(_.locatorHash,X.packageLocation),X.buildDirective&&X.buildDirective.length>0&&X.packageLocation&&h.set(_.locatorHash,{directives:X.buildDirective,buildLocations:[X.packageLocation]})}}let m=new Map;for(let $ of this.accessibleLocators){let _=this.storedPackages.get($);if(!_)throw new Error("Assertion failed: The locator should have been registered");let U=this.tryWorkspaceByLocator(_)!==null,F=async(Re,xe)=>{let Ke=g.get(_.locatorHash);if(typeof Ke=="undefined")throw new Error(`Assertion failed: The package (${At(this.configuration,_)}) should have been registered`);let Me=[];for(let X of _.dependencies.values()){let ie=this.storedResolutions.get(X.descriptorHash);if(typeof ie=="undefined")throw new Error(`Assertion failed: The resolution (${Ht(this.configuration,X)}, from ${At(this.configuration,_)})should have been registered`);let we=this.storedPackages.get(ie);if(typeof we=="undefined")throw new Error(`Assertion failed: The package (${ie}, resolved from ${Ht(this.configuration,X)}) should have been registered`);let he=this.tryWorkspaceByLocator(we)===null?u.get(ie):null;if(typeof he=="undefined")throw new Error(`Assertion failed: The package (${ie}, resolved from ${Ht(this.configuration,X)}) should have been registered`);he===Re||he===null?g.get(we.locatorHash)!==null&&Me.push([X,we]):!U&&Ke!==null&&Wl(m,ie).push(Ke)}Ke!==null&&await xe.attachInternalDependencies(_,Me)};if(U)for(let[Re,xe]of c)Re.supportsPackage(_,l)&&await F(Re,xe);else{let Re=u.get(_.locatorHash);if(!Re)throw new Error("Assertion failed: The linker should have been found");let xe=c.get(Re);if(!xe)throw new Error("Assertion failed: The installer should have been registered");await F(Re,xe)}}for(let[$,_]of m){let U=this.storedPackages.get($);if(!U)throw new Error("Assertion failed: The package should have been registered");let F=u.get(U.locatorHash);if(!F)throw new Error("Assertion failed: The linker should have been found");let Re=c.get(F);if(!Re)throw new Error("Assertion failed: The installer should have been registered");await Re.attachExternalDependents(U,_)}let I=new Map;for(let $ of c.values()){let _=await $.finalizeInstall();for(let U of(ee=_==null?void 0:_.records)!=null?ee:[])h.set(U.locatorHash,{directives:U.buildDirective,buildLocations:U.buildLocations});typeof(_==null?void 0:_.customData)!="undefined"&&I.set($.getCustomDataKey(),_.customData)}if(this.installersCustomData=I,await Promise.all(p),n===Mr.SkipBuild)return;let Q=new Set(this.storedPackages.keys()),w=new Set(h.keys());for(let $ of w)Q.delete($);let x=(0,Sy.createHash)("sha512");x.update(process.versions.node),await this.configuration.triggerHook($=>$.globalHashGeneration,this,$=>{x.update("\0"),x.update($)});let N=x.digest("hex"),H=new Map,T=$=>{let _=H.get($.locatorHash);if(typeof _!="undefined")return _;let U=this.storedPackages.get($.locatorHash);if(typeof U=="undefined")throw new Error("Assertion failed: The package should have been registered");let F=(0,Sy.createHash)("sha512");F.update($.locatorHash),H.set($.locatorHash,"");for(let Re of U.dependencies.values()){let xe=this.storedResolutions.get(Re.descriptorHash);if(typeof xe=="undefined")throw new Error(`Assertion failed: The resolution (${Ht(this.configuration,Re)}) should have been registered`);let Ke=this.storedPackages.get(xe);if(typeof Ke=="undefined")throw new Error("Assertion failed: The package should have been registered");F.update(T(Ke))}return _=F.digest("hex"),H.set($.locatorHash,_),_},P=($,_)=>{let U=(0,Sy.createHash)("sha512");U.update(N),U.update(T($));for(let F of _)U.update(F);return U.digest("hex")},G=new Map,te=!1;for(;w.size>0;){let $=w.size,_=[];for(let U of w){let F=this.storedPackages.get(U);if(!F)throw new Error("Assertion failed: The package should have been registered");let Re=!0;for(let Me of F.dependencies.values()){let X=this.storedResolutions.get(Me.descriptorHash);if(!X)throw new Error(`Assertion failed: The resolution (${Ht(this.configuration,Me)}) should have been registered`);if(w.has(X)){Re=!1;break}}if(!Re)continue;w.delete(U);let xe=h.get(F.locatorHash);if(!xe)throw new Error("Assertion failed: The build directive should have been registered");let Ke=P(F,xe.buildLocations);if(this.storedBuildState.get(F.locatorHash)===Ke){G.set(F.locatorHash,Ke);continue}te||(await this.persistInstallStateFile(),te=!0),this.storedBuildState.has(F.locatorHash)?r.reportInfo(J.MUST_REBUILD,`${At(this.configuration,F)} must be rebuilt because its dependency tree changed`):r.reportInfo(J.MUST_BUILD,`${At(this.configuration,F)} must be built because it never has been before or the last one failed`);for(let Me of xe.buildLocations){if(!D.isAbsolute(Me))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${Me})`);_.push((async()=>{for(let[X,ie]of xe.directives){let we=`# This file contains the result of Yarn building a package (${hn(F)}) -`;switch(X){case _i.SCRIPT:we+=`# Script name: ${ie} -`;break;case _i.SHELLCODE:we+=`# Script code: ${ie} -`;break}let he=null;if(!await M.mktempPromise(async pe=>{let Fe=D.join(pe,"build.log"),{stdout:Z,stderr:z}=this.configuration.getSubprocessStreams(Fe,{header:we,prefix:At(this.configuration,F),report:r}),ae;try{switch(X){case _i.SCRIPT:ae=await uE(F,ie,[],{cwd:Me,project:this,stdin:he,stdout:Z,stderr:z});break;case _i.SHELLCODE:ae=await JS(F,ie,[],{cwd:Me,project:this,stdin:he,stdout:Z,stderr:z});break}}catch(be){z.write(be.stack),ae=1}if(Z.end(),z.end(),ae===0)return G.set(F.locatorHash,Ke),!0;M.detachTemp(pe);let ue=`${At(this.configuration,F)} couldn't be built successfully (exit code ${ze(this.configuration,ae,Ne.NUMBER)}, logs can be found here: ${ze(this.configuration,Fe,Ne.PATH)})`;return this.optionalBuilds.has(F.locatorHash)?(r.reportInfo(J.BUILD_FAILED,ue),G.set(F.locatorHash,Ke),!0):(r.reportError(J.BUILD_FAILED,ue),!1)}))return}})())}}if(await Promise.all(_),$===w.size){let U=Array.from(w).map(F=>{let Re=this.storedPackages.get(F);if(!Re)throw new Error("Assertion failed: The package should have been registered");return At(this.configuration,Re)}).join(", ");r.reportError(J.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${U})`);break}}this.storedBuildState=G}async install(e){var a,l;let r=this.configuration.get("nodeLinker");(a=ce.telemetry)==null||a.reportInstall(r),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=Xr.Inactive;let i=D.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await M.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new et(J.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let h=ze(this.configuration,g,Ne.PACKAGE_EXTENSION);switch(g.status){case Xr.Inactive:e.report.reportWarning(J.UNUSED_PACKAGE_EXTENSION,`${h}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case Xr.Redundant:e.report.reportWarning(J.REDUNDANT_PACKAGE_EXTENSION,`${h}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=Pl(n,this.generateLockfile());if(c!==n){let u=(0,v6.structuredPatch)(i,i,n,c);e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let h of g.lines)h.startsWith("+")?e.report.reportError(J.FROZEN_LOCKFILE_EXCEPTION,ze(this.configuration,h,Ne.ADDED)):h.startsWith("-")?e.report.reportError(J.FROZEN_LOCKFILE_EXCEPTION,ze(this.configuration,h,Ne.REMOVED)):e.report.reportInfo(null,ze(this.configuration,h,"grey"))}throw e.report.reportSeparator(),new et(J.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===Xr.Active&&((l=ce.telemetry)==null||l.reportPackageExtension(ac(g,Ne.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==Mr.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>Wm(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===Mr.UpdateLockfile){e.report.reportWarning(J.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${ze(this.configuration,"mode=update-lockfile",Ne.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>Wm(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let r={};r.__metadata={version:tv};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let h of s){let f=this.storedDescriptors.get(h);if(!f)throw new Error("Assertion failed: The descriptor should have been registered");a.push(f)}let l=a.map(h=>Pi(h)).sort().join(", "),c=new Je;c.version=o.linkType===lt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let h=g.indexOf("/");if(h===-1)throw new Error("Assertion failed: Expecte the checksum to reference its cache key");let f=g.slice(0,h),p=g.slice(h+1);typeof r.__metadata.cacheKey=="undefined"&&(r.__metadata.cacheKey=f),f===r.__metadata.cacheKey?u=p:u=g}r[l]=W(v({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:hn(o),checksum:u})}return`${[`# This file is generated by running "yarn install" inside your project. -`,`# Manual changes might be lost - proceed with caution! -`].join("")} -`+co(r)}async persistLockfile(){let e=D.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.generateLockfile();await M.changeFilePromise(e,r,{automaticNewlines:!0})}async persistInstallStateFile(){let e=[];for(let o of Object.values(rv))e.push(...o);let r=(0,xy.default)(this,e),i=$k.default.serialize(r),n=gi(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await M.mkdirPromise(D.dirname(s),{recursive:!0}),await M.writeFilePromise(s,await oFe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath");if(!M.existsSync(n)){r&&await this.applyLightResolution();return}let s=await aFe(await M.readFilePromise(n));this.installStateChecksum=gi(s);let o=$k.default.deserialize(s);e&&typeof o.installersCustomData!="undefined"&&(this.installersCustomData=o.installersCustomData),i&&Object.assign(this,(0,xy.default)(o,rv.restoreBuildState)),r&&(o.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,xy.default)(o,rv.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new Dr}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:r}){let i=new Set([".gitignore"]);if(!oQ(e.cwd,this.cwd)||!await M.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await M.readdirPromise(e.cwd)){if(i.has(a))continue;let l=D.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?r.reportError(J.IMMUTABLE_CACHE,`${ze(this.configuration,D.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:r.reportInfo(J.UNUSED_CACHE_ENTRY,`${ze(this.configuration,D.basename(l),"magenta")} appears to be unused - removing`),await M.removePromise(l)))}n&&s!==0&&r.reportInfo(J.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function AFe({project:t,allDescriptors:e,allResolutions:r,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,volatileDescriptors:o=new Set,peerRequirements:a=new Map,report:l,tolerateMissingPackages:c=!1}){var te;let u=new Map,g=[],h=new Map,f=new Map,p=new Map,m=new Map,I=new Map,Q=new Map(t.workspaces.map(j=>{let A=j.anchoredLocator.locatorHash,ee=i.get(A);if(typeof ee=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,Ch(ee)]})),w=()=>{let j=M.mktempSync(),A=D.join(j,"stacktrace.log"),ee=String(g.length+1).length,$=g.map((_,U)=>`${`${U+1}.`.padStart(ee," ")} ${hn(_)} -`).join("");throw M.writeFileSync(A,$),M.detachTemp(j),new et(J.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${L.fromPortablePath(A)}`)},x=j=>{let A=r.get(j.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let ee=i.get(A);if(!ee)throw new Error("Assertion failed: The package could not be found");return ee},N=(j,A,{top:ee,optional:$})=>{g.length>1e3&&w(),g.push(j);let _=H(j,A,{top:ee,optional:$});return g.pop(),_},H=(j,A,{top:ee,optional:$})=>{if(n.has(j.locatorHash))return;n.add(j.locatorHash),$||s.delete(j.locatorHash);let _=i.get(j.locatorHash);if(!_){if(c)return;throw new Error(`Assertion failed: The package (${At(t.configuration,j)}) should have been registered`)}let U=[],F=[],Re=[],xe=[],Ke=[];for(let X of Array.from(_.dependencies.values())){if(_.peerDependencies.has(X.identHash)&&_.locatorHash!==ee)continue;if(Zo(X))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");o.delete(X.descriptorHash);let ie=$;if(!ie){let ae=_.dependenciesMeta.get(yt(X));if(typeof ae!="undefined"){let ue=ae.get(null);typeof ue!="undefined"&&ue.optional&&(ie=!0)}}let we=r.get(X.descriptorHash);if(!we){if(c)continue;throw new Error(`Assertion failed: The resolution (${Ht(t.configuration,X)}) should have been registered`)}let he=Q.get(we)||i.get(we);if(!he)throw new Error(`Assertion failed: The package (${we}, resolved from ${Ht(t.configuration,X)}) should have been registered`);if(he.peerDependencies.size===0){N(he,new Map,{top:ee,optional:ie});continue}let Ie=u.get(he.locatorHash);typeof Ie=="number"&&Ie>=2&&w();let pe,Fe,Z=new Set,z;F.push(()=>{pe=Eb(X,j.locatorHash),Fe=yb(he,j.locatorHash),_.dependencies.delete(X.identHash),_.dependencies.set(pe.identHash,pe),r.set(pe.descriptorHash,Fe.locatorHash),e.set(pe.descriptorHash,pe),i.set(Fe.locatorHash,Fe),U.push([he,pe,Fe])}),Re.push(()=>{var ae;z=new Map;for(let ue of Fe.peerDependencies.values()){let be=_.dependencies.get(ue.identHash);if(!be&&Eh(j,ue)&&(be=Zm(j),e.set(be.descriptorHash,be),r.set(be.descriptorHash,j.locatorHash),o.delete(be.descriptorHash)),(!be||be.range==="missing:")&&Fe.dependencies.has(ue.identHash)){Fe.peerDependencies.delete(ue.identHash);continue}be||(be=Xt(ue,"missing:")),Fe.dependencies.set(be.identHash,be),Zo(be)&&fA(p,be.descriptorHash).add(Fe.locatorHash),h.set(be.identHash,be),be.range==="missing:"&&Z.add(be.identHash),z.set(ue.identHash,(ae=A.get(ue.identHash))!=null?ae:Fe.locatorHash)}Fe.dependencies=new Map(xi(Fe.dependencies,([ue,be])=>yt(be)))}),xe.push(()=>{if(!i.has(Fe.locatorHash))return;let ae=u.get(he.locatorHash),ue=typeof ae!="undefined"?ae+1:1;u.set(he.locatorHash,ue),N(Fe,z,{top:ee,optional:ie}),u.set(he.locatorHash,ue-1)}),Ke.push(()=>{let ae=_.dependencies.get(X.identHash);if(typeof ae=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let ue=r.get(ae.descriptorHash);if(typeof ue=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(fA(I,ue).add(j.locatorHash),!!i.has(Fe.locatorHash)){for(let be of Fe.peerDependencies.values()){let nt=z.get(be.identHash);if(typeof nt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");Wl(zl(m,nt),yt(be)).push(Fe.locatorHash)}for(let be of Z)Fe.dependencies.delete(be)}})}for(let X of[...F,...Re])X();let Me;do{Me=!0;for(let[X,ie,we]of U){if(!i.has(we.locatorHash))continue;let he=zl(f,X.locatorHash),Ie=gi(...[...we.dependencies.values()].map(z=>{let ae=z.range!=="missing:"?r.get(z.descriptorHash):"missing:";if(typeof ae=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${Ht(t.configuration,z)} to have been registered`);return ae===ee?`${ae} (top)`:ae}),ie.identHash),pe=he.get(Ie);if(typeof pe=="undefined"){he.set(Ie,ie);continue}if(pe===ie)continue;Me=!1,i.delete(we.locatorHash),e.delete(ie.descriptorHash),r.delete(ie.descriptorHash),n.delete(we.locatorHash);let Fe=p.get(ie.descriptorHash)||[],Z=[_.locatorHash,...Fe];p.delete(ie.descriptorHash);for(let z of Z){let ae=i.get(z);typeof ae!="undefined"&&ae.dependencies.set(ie.identHash,pe)}}}while(!Me);for(let X of[...xe,...Ke])X()};for(let j of t.workspaces){let A=j.anchoredLocator;o.delete(j.anchoredDescriptor.descriptorHash),N(A,new Map,{top:A.locatorHash,optional:!1})}var T;(function($){$[$.NotProvided=0]="NotProvided",$[$.NotCompatible=1]="NotCompatible",$[$.NotWorkspace=2]="NotWorkspace"})(T||(T={}));let P=[];for(let[j,A]of I){let ee=i.get(j);if(typeof ee=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let $=m.get(j);if(typeof $!="undefined")for(let _ of A){let U=i.get(_);if(typeof U!="undefined")for(let[F,Re]of $){let xe=vi(F);if(U.peerDependencies.has(xe.identHash))continue;let Ke=`p${gi(_,F,j).slice(0,5)}`;a.set(Ke,{subject:_,requested:xe,rootRequester:j,allRequesters:Re});let Me=ee.dependencies.get(xe.identHash);if(typeof Me!="undefined"){let X=x(Me),ie=(te=X.version)!=null?te:"0.0.0",we=new Set;for(let Ie of Re){let pe=i.get(Ie);if(typeof pe=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let Fe=pe.peerDependencies.get(xe.identHash);if(typeof Fe=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");we.add(Fe.range)}[...we].every(Ie=>{if(Ie.startsWith(Ir.protocol)){if(!t.tryWorkspaceByLocator(X))return!1;Ie=Ie.slice(Ir.protocol.length),(Ie==="^"||Ie==="~")&&(Ie="*")}return nf(ie,Ie)})||P.push({type:1,subject:U,requested:xe,requester:ee,version:ie,hash:Ke,requirementCount:Re.length})}else{let X=ee.peerDependenciesMeta.get(F);(X==null?void 0:X.optional)||P.push({type:0,subject:U,requested:xe,requester:ee,hash:Ke})}}}}let G=[j=>Qb(j.subject),j=>yt(j.requested),j=>`${j.type}`];for(let j of xi(P,G))switch(j.type){case 0:l==null||l.reportWarning(J.MISSING_PEER_DEPENDENCY,`${At(t.configuration,j.subject)} doesn't provide ${yr(t.configuration,j.requested)} (${ze(t.configuration,j.hash,Ne.CODE)}), requested by ${yr(t.configuration,j.requester)}`);break;case 1:{let A=j.requirementCount>1?"and some of its descendants request":"requests";l==null||l.reportWarning(J.INCOMPATIBLE_PEER_DEPENDENCY,`${At(t.configuration,j.subject)} provides ${yr(t.configuration,j.requested)} (${ze(t.configuration,j.hash,Ne.CODE)}) with version ${Bh(t.configuration,j.version)}, which doesn't satisfy what ${yr(t.configuration,j.requester)} ${A}`)}break}P.length>0&&(l==null||l.reportWarning(J.UNNAMED,`Some peer dependencies are incorrectly met; run ${ze(t.configuration,"yarn explain peer-requirements ",Ne.CODE)} for details, where ${ze(t.configuration,"",Ne.CODE)} is the six-letter p-prefixed code`))}var Bs;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(Bs||(Bs={}));var Hf=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!M.existsSync(i),this.sendReport(r),this.startBuffer()}reportVersion(e){this.reportValue(Bs.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(Bs.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(Bs.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(Bs.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(Bs.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(Bs.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(Bs.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(Bs.DEPENDENCY_COUNT,String(e))}reportValue(e,r){fA(this.values,e).add(r)}reportEnumerator(e,r){fA(this.enumerators,e).add(gi(r))}reportHit(e,r="*"){let i=zl(this.hits,e),n=Xs(i,r,()=>0);i.set(r,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return D.join(e,"telemetry.json")}sendReport(e){var u,g,h;let r=this.getRegistryPath(),i;try{i=M.readJsonSync(r)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{M.mkdirSync(D.dirname(r),{recursive:!0}),M.writeJsonSync(r,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=f=>WD(l,f,{configuration:this.configuration}).catch(()=>{});for(let[f,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let m=p;m.userId=f,m.reportType="primary";for(let w of Object.keys((h=m.enumerators)!=null?h:{}))m.enumerators[w]=m.enumerators[w].length;c(m);let I=new Map,Q=20;for(let[w,x]of Object.entries(m.values))x.length>0&&I.set(w,x.slice(0,Q));for(;I.size>0;){let w={};w.userId=f,w.reportType="secondary",w.metrics={};for(let[x,N]of I)w.metrics[x]=N.shift(),N.length===0&&I.delete(x);c(w)}}}applyChanges(){var o,a,l,c,u,g,h,f,p;let e=this.getRegistryPath(),r;try{r=M.readJsonSync(e)}catch{r={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=r.blocks=(a=r.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let m of this.hits.keys()){let I=s.hits=(c=s.hits)!=null?c:{},Q=I[m]=(u=I[m])!=null?u:{};for(let[w,x]of this.hits.get(m))Q[w]=((g=Q[w])!=null?g:0)+x}for(let m of["values","enumerators"])for(let I of this[m].keys()){let Q=s[m]=(h=s[m])!=null?h:{};Q[I]=[...new Set([...(f=Q[I])!=null?f:[],...(p=this[m].get(I))!=null?p:[]])]}M.mkdirSync(D.dirname(e),{recursive:!0}),M.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var iv=ne(require("child_process")),N6=ne(Og());var nv=ne(require("fs"));var hu=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function lFe(t){let e=L.fromPortablePath(t);process.on("SIGINT",()=>{}),e?(0,iv.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:W(v({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,iv.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:W(v({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function ky({binaryVersion:t,pluginConfiguration:e}){async function r(){let n=new os({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:t});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var p,m,I,Q,w;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(process.env.YARN_IGNORE_NODE!=="1"&&!Ft.satisfiesWithPrereleases(s,o))throw new me(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let a=await ce.find(L.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),l=a.get("yarnPath"),c=a.get("ignorePath"),u=a.get("ignoreCwd"),g=L.toPortablePath(L.resolve(process.argv[1])),h=x=>M.readFilePromise(x).catch(()=>Buffer.of());if(!c&&!u&&await(async()=>l===g||Buffer.compare(...await Promise.all([h(l),h(g)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(l!==null&&!c)if(!M.existsSync(l))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${a.sources.get("yarnPath")}), but the specified location doesn't exist (${l}).`))),process.exitCode=1;else try{lFe(l)}catch(x){process.exitCode=x.code||1}else{c&&delete process.env.YARN_IGNORE_PATH,a.get("enableTelemetry")&&!N6.isCI&&process.stdout.isTTY&&(ce.telemetry=new Hf(a,"puba9cdc10ec5790a2cf4969dd413a47270")),(p=ce.telemetry)==null||p.reportVersion(t);for(let[T,P]of a.plugins.entries()){hu.has((I=(m=T.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:m[1])!=null?I:"")&&((Q=ce.telemetry)==null||Q.reportPluginName(T));for(let G of P.commands||[])n.register(G)}let N=n.process(process.argv.slice(2));N.help||(w=ce.telemetry)==null||w.reportCommandName(N.path.join(" "));let H=N.cwd;if(typeof H!="undefined"&&!u){let T=(0,nv.realpathSync)(process.cwd()),P=(0,nv.realpathSync)(H);if(T!==P){process.chdir(H),await r();return}}await n.runExit(N,{cwd:L.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return r().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>M.rmtempPromise())}function M6(t){t.Command.Path=(...e)=>r=>{r.paths=r.paths||[],r.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])t.Command[e]=(...r)=>(i,n)=>{let s=t.Option[e](...r);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return t}var gp={};$e(gp,{BaseCommand:()=>ye,WorkspaceRequiredError:()=>_e,getDynamicLibs:()=>VZ,getPluginConfiguration:()=>sB,main:()=>ky,openWorkspace:()=>bu,pluginCommands:()=>hu});var ye=class extends Ce{constructor(){super(...arguments);this.cwd=Y.String("--cwd",{hidden:!0})}};var _e=class extends me{constructor(e,r){let i=D.relative(e,r),n=D.join(e,Je.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var pKe=ne(pr());Nn();var dKe=ne(rP()),VZ=()=>new Map([["@yarnpkg/cli",gp],["@yarnpkg/core",Gf],["@yarnpkg/fslib",Rg],["@yarnpkg/libzip",Hh],["@yarnpkg/parsers",Vh],["@yarnpkg/shell",Zh],["clipanion",Xg],["semver",pKe],["typanion",Gl],["yup",dKe]]);async function bu(t,e){let{project:r,workspace:i}=await Le.find(t,e);if(!i)throw new _e(r.cwd,e);return i}var Q4e=ne(pr());Nn();var b4e=ne(rP());var WP={};$e(WP,{dedupeUtils:()=>OP,default:()=>sGe,suggestUtils:()=>bP});var xre=ne(Og());var nee=ne(dp());Nn();var bP={};$e(bP,{Modifier:()=>Ss,Strategy:()=>cr,Target:()=>ir,WorkspaceModifier:()=>ku,applyModifier:()=>eee,extractDescriptorFromPath:()=>xP,extractRangeModifier:()=>$$,fetchDescriptorFrom:()=>SP,findProjectDescriptors:()=>iee,getModifier:()=>Cp,getSuggestedDescriptors:()=>mp,makeWorkspaceDescriptor:()=>ree,toWorkspaceModifier:()=>tee});var DP=ne(pr()),NUe="workspace:",ir;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(ir||(ir={}));var Ss;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(Ss||(Ss={}));var ku;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(ku||(ku={}));var cr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(cr||(cr={}));function Cp(t,e){return t.exact?Ss.EXACT:t.caret?Ss.CARET:t.tilde?Ss.TILDE:e.configuration.get("defaultSemverRangePrefix")}var MUe=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function $$(t,{project:e}){let r=t.match(MUe);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function eee(t,e){let{protocol:r,source:i,params:n,selector:s}=b.parseRange(t.range);return DP.default.valid(s)&&(s=`${e}${t.range}`),b.makeDescriptor(t,b.makeRange({protocol:r,source:i,params:n,selector:s}))}function tee(t){switch(t){case Ss.CARET:return ku.CARET;case Ss.TILDE:return ku.TILDE;case Ss.EXACT:return ku.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function ree(t,e){return b.makeDescriptor(t.anchoredDescriptor,`${NUe}${tee(e)}`)}async function iee(t,{project:e,target:r}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(r===ir.PEER){let o=s.manifest.peerDependencies.get(t.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(t.identHash),a=s.manifest.devDependencies.get(t.identHash);r===ir.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function xP(t,{cwd:e,workspace:r}){return await LUe(async i=>{D.isAbsolute(t)||(t=D.relative(r.cwd,D.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:n}=r,s=await SP(b.makeIdent(null,"archive"),t,{project:r.project,cache:i,workspace:r});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new Dr,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,r.anchoredLocator,c),g=b.convertDescriptorToLocator(u),h=await l.fetch(g,c),f=await Je.find(h.prefixPath,{baseFs:h.packageFs});if(!f.name)throw new Error("Target path doesn't have a name");return b.makeDescriptor(f.name,t)})}async function mp(t,{project:e,workspace:r,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(t.range!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${b.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof r!="undefined"&&r!==null&&r.manifest[n].get(t.identHash)||null,c=[],u=[],g=async h=>{try{await h()}catch(f){u.push(f)}};for(let h of o){if(c.length>=a)break;switch(h){case cr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${b.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case cr.REUSE:await g(async()=>{for(let{descriptor:f,locators:p}of(await iee(t,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===r.anchoredLocator.locatorHash&&o.includes(cr.KEEP))continue;let m=`(originally used by ${b.prettyLocator(e.configuration,p[0])}`;m+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:f,name:`Reuse ${b.prettyDescriptor(e.configuration,f)}`,reason:m})}});break;case cr.CACHE:await g(async()=>{for(let f of e.storedDescriptors.values())f.identHash===t.identHash&&c.push({descriptor:f,name:`Reuse ${b.prettyDescriptor(e.configuration,f)}`,reason:"(already used somewhere in the lockfile)"})});break;case cr.PROJECT:await g(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let f=e.tryWorkspaceByIdent(t);if(f===null)return;let p=ree(f,s);c.push({descriptor:p,name:`Attach ${b.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${Ae.pretty(e.configuration,f.relativeCwd,Ae.Type.PATH)})`})});break;case cr.LATEST:await g(async()=>{if(t.range!=="unknown")c.push({descriptor:t,name:`Use ${b.prettyRange(e.configuration,t.range)}`,reason:"(explicit range requested)"});else if(n===ir.PEER)c.push({descriptor:b.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:Ae.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let f=await SP(t,"latest",{project:e,cache:i,workspace:r,preserveModifier:!1});f&&(f=eee(f,s),c.push({descriptor:f,name:`Use ${b.prettyDescriptor(e.configuration,f)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function SP(t,e,{project:r,cache:i,workspace:n,preserveModifier:s=!0}){let o=b.makeDescriptor(t,e),a=new Dr,l=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),u={project:r,fetcher:l,cache:i,checksums:r.storedChecksums,report:a,skipIntegrityCheck:!0},g=W(v({},u),{resolver:c,fetchOptions:u}),h=c.bindDescriptor(o,n.anchoredLocator,g),f=await c.getCandidates(h,new Map,g);if(f.length===0)return null;let p=f[0],{protocol:m,source:I,params:Q,selector:w}=b.parseRange(b.convertToManifestRange(p.reference));if(m===r.configuration.get("defaultProtocol")&&(m=null),DP.default.valid(w)&&s!==!1){let x=typeof s=="string"?s:o.range;w=$$(x,{project:r})+w}return b.makeDescriptor(p,b.makeRange({protocol:m,source:I,params:Q,selector:w}))}async function LUe(t){return await M.mktempPromise(async e=>{let r=ce.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new mt(e,{configuration:r,check:!1,immutable:!1}))})}var Ip=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=Y.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=Y.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=Y.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=Y.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=Y.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=Y.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:li(Mr)});this.silent=Y.Boolean("--silent",{hidden:!0});this.packages=Y.Rest()}async execute(){var m;let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=Cp(this,r),a=[...s?[cr.REUSE]:[],cr.PROJECT,...this.cached?[cr.CACHE]:[],cr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async I=>{let Q=I.match(/^\.{0,2}\//)?await xP(I,{cwd:this.context.cwd,workspace:i}):b.parseDescriptor(I),w=TUe(i,Q,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),x=await mp(Q,{project:r,workspace:i,cache:n,target:w,modifier:o,strategies:a,maxResults:l});return[Q,x,w]})),u=await Eo.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async I=>{for(let[Q,{suggestions:w,rejections:x}]of c)if(w.filter(H=>H.descriptor!==null).length===0){let[H]=x;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");r.configuration.get("enableNetwork")?I.reportError(J.CANT_SUGGEST_RESOLUTIONS,`${b.prettyDescriptor(e,Q)} can't be resolved to a satisfying range`):I.reportError(J.CANT_SUGGEST_RESOLUTIONS,`${b.prettyDescriptor(e,Q)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),I.reportSeparator(),I.reportExceptionOnce(H)}});if(u.hasErrors())return u.exitCode();let g=!1,h=[],f=[];for(let[,{suggestions:I},Q]of c){let w,x=I.filter(P=>P.descriptor!==null),N=x[0].descriptor,H=x.every(P=>b.areDescriptorsEqual(P.descriptor,N));x.length===1||H?w=N:(g=!0,{answer:w}=await(0,nee.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:I.map(({descriptor:P,name:G,reason:te})=>P?{name:G,hint:te,descriptor:P}:{name:G,hint:te,disabled:!0}),onCancel:()=>process.exit(130),result(P){return this.find(P,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let T=i.manifest[Q].get(w.identHash);(typeof T=="undefined"||T.descriptorHash!==w.descriptorHash)&&(i.manifest[Q].set(w.identHash,w),this.optional&&(Q==="dependencies"?i.manifest.ensureDependencyMeta(W(v({},w),{range:"unknown"})).optional=!0:Q==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(W(v({},w),{range:"unknown"})).optional=!0)),typeof T=="undefined"?h.push([i,Q,w,a]):f.push([i,Q,T,w]))}return await e.triggerMultipleHooks(I=>I.afterWorkspaceDependencyAddition,h),await e.triggerMultipleHooks(I=>I.afterWorkspaceDependencyReplacement,f),g&&this.context.stdout.write(` -`),(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async I=>{await r.install({cache:n,report:I,mode:this.mode})})).exitCode()}};Ip.paths=[["add"]],Ip.usage=Ce.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var see=Ip;function TUe(t,e,{dev:r,peer:i,preferDev:n,optional:s}){let o=t.manifest[ir.REGULAR].has(e.identHash),a=t.manifest[ir.DEVELOPMENT].has(e.identHash),l=t.manifest[ir.PEER].has(e.identHash);if((r||i)&&o)throw new me(`Package "${b.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!i&&l)throw new me(`Package "${b.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new me(`Package "${b.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new me(`Package "${b.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||n)&&s)throw new me(`Package "${b.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?ir.PEER:r||n?ir.DEVELOPMENT:o?ir.REGULAR:a?ir.DEVELOPMENT:ir.REGULAR}var Ep=class extends ye{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=Y.String({required:!1})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Le.find(e,this.context.cwd);if(await r.restoreInstallState(),this.name){let o=(await kt.getPackageAccessibleBinaries(i,{project:r})).get(this.name);if(!o)throw new me(`Couldn't find a binary named "${this.name}" for package "${b.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} -`),0}return(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await kt.getPackageAccessibleBinaries(i,{project:r}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:b.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${b.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};Ep.paths=[["bin"]],Ep.usage=Ce.Usage({description:"get the path to a binary script",details:` - When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. - - When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. - `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var oee=Ep;var yp=class extends ye{constructor(){super(...arguments);this.mirror=Y.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=Y.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=await mt.find(e);return(await Pe.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&r.mirrorCwd!==null,s=!this.mirror;n&&(await M.removePromise(r.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await M.removePromise(r.cwd)})).exitCode()}};yp.paths=[["cache","clean"],["cache","clear"]],yp.usage=Ce.Usage({description:"remove the shared cache files",details:` - This command will remove all the files from the cache. - `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var aee=yp;var Aee=ne(Hy()),kP=ne(require("util")),Bp=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=Y.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(r)=="undefined")throw new me(`Couldn't find a configuration settings named "${r}"`);let s=e.getSpecial(r,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=fe.convertMapsToIndexableObjects(s),a=i?(0,Aee.default)(o,i):o,l=await Pe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} -`),l.exitCode();kP.inspect.styles.name="cyan",this.context.stdout.write(`${(0,kP.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} -`)}return l.exitCode()}};Bp.paths=[["config","get"]],Bp.usage=Ce.Usage({description:"read a configuration settings",details:` - This command will print a configuration setting. - - Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. - `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var lee=Bp;var yte=ne(MP()),Bte=ne(Hy()),wte=ne(Ete()),LP=ne(require("util")),Qp=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String();this.value=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new me("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?f=>ce.updateHomeConfiguration(f):f=>ce.updateConfiguration(r(),f))(f=>{if(n){let p=(0,yte.default)(f);return(0,wte.default)(p,this.name,o),p}else return W(v({},f),{[i]:o})});let c=(await ce.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=fe.convertMapsToIndexableObjects(c),g=n?(0,Bte.default)(u,n):u;return(await Pe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async f=>{LP.inspect.styles.name="cyan",f.reportInfo(J.UNNAMED,`Successfully set ${this.name} to ${(0,LP.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};Qp.paths=[["config","set"]],Qp.usage=Ce.Usage({description:"change a configuration settings",details:` - This command will set a configuration setting. - - When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). - - When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. - `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var Qte=Qp;var Rte=ne(MP()),Nte=ne(qf()),Mte=ne(Fte()),bp=class extends ye{constructor(){super(...arguments);this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>ce.updateHomeConfiguration(l):l=>ce.updateConfiguration(r(),l);return(await Pe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,Nte.default)(u,this.name))return l.reportWarning(J.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Rte.default)(u):v({},u);return(0,Mte.default)(g,this.name),g}),c||l.reportInfo(J.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};bp.paths=[["config","unset"]],bp.usage=Ce.Usage({description:"unset a configuration setting",details:` - This command will unset a configuration setting. - `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var Lte=bp;var TP=ne(require("util")),Dp=class extends ye{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=Y.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(J.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=fe.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(v({key:s,effective:a,source:l},o))}}else{let n=fe.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,TP.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,TP.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};Dp.paths=[["config"]],Dp.usage=Ce.Usage({description:"display the current configuration",details:` - This command prints the current active configuration settings. - `,examples:[["Print the active configuration settings","$0 config"]]});var Tte=Dp;Nn();var OP={};$e(OP,{Strategy:()=>Cl,acceptedStrategies:()=>UHe,dedupe:()=>KP});var Ote=ne(Ji()),Cl;(function(e){e.HIGHEST="highest"})(Cl||(Cl={}));var UHe=new Set(Object.values(Cl)),HHe={highest:async(t,e,{resolver:r,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of t.storedResolutions){let c=t.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);fe.getSetWithDefault(o,c.identHash).add(l)}return Array.from(t.storedDescriptors.values(),async a=>{if(e.length&&!Ote.default.isMatch(b.stringifyIdent(a),e))return null;let l=t.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=t.originalPackages.get(l);if(typeof c=="undefined"||!r.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(I=>{let Q=t.originalPackages.get(I);if(typeof Q=="undefined")throw new Error(`Assertion failed: The package (${I}) should have been registered`);return Q.reference}),h=await r.getSatisfying(a,g,n),f=h==null?void 0:h[0];if(typeof f=="undefined")return null;let p=f.locatorHash,m=t.originalPackages.get(p);if(typeof m=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:m}})}};async function KP(t,{strategy:e,patterns:r,cache:i,report:n}){let{configuration:s}=t,o=new Dr,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:t.storedChecksums,fetcher:l,project:t,report:o,skipIntegrityCheck:!0},u={project:t,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let h=await HHe[e](t,r,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),f=pi.progressViaCounter(h.length);n.reportProgress(f);let p=0;await Promise.all(h.map(Q=>Q.then(w=>{if(w===null)return;p++;let{descriptor:x,currentPackage:N,updatedPackage:H}=w;n.reportInfo(J.UNNAMED,`${b.prettyDescriptor(s,x)} can be deduped from ${b.prettyLocator(s,N)} to ${b.prettyLocator(s,H)}`),n.reportJson({descriptor:b.stringifyDescriptor(x),currentResolution:b.stringifyLocator(N),updatedResolution:b.stringifyLocator(H)}),t.storedResolutions.set(x.descriptorHash,H.locatorHash)}).finally(()=>f.tick())));let m;switch(p){case 0:m="No packages";break;case 1:m="One package";break;default:m=`${p} packages`}let I=Ae.pretty(s,e,Ae.Type.CODE);return n.reportInfo(J.UNNAMED,`${m} can be deduped using the ${I} strategy`),p})}var Sp=class extends ye{constructor(){super(...arguments);this.strategy=Y.String("-s,--strategy",Cl.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:li(Cl)});this.check=Y.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:li(Mr)});this.patterns=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r}=await Le.find(e,this.context.cwd),i=await mt.find(e);await r.restoreInstallState({restoreResolutions:!1});let n=0,s=await Pe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await KP(r,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Pe.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await r.install({cache:i,report:a,mode:this.mode})})).exitCode()}};Sp.paths=[["dedupe"]],Sp.usage=Ce.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var Kte=Sp;var dB=class extends ye{async execute(){let{plugins:e}=await ce.find(this.context.cwd,this.context.plugins),r=[];for(let o of e){let{commands:a}=o[1];if(a){let c=os.from(a).definitions();r.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=Hte()["@yarnpkg/builder"].bundles.standard;for(let o of r){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} -`)}};dB.paths=[["--clipanion=definitions"]];var Gte=dB;var CB=class extends ye{async execute(){this.context.stdout.write(this.cli.usage(null))}};CB.paths=[["help"],["--help"],["-h"]];var Yte=CB;var UP=class extends ye{constructor(){super(...arguments);this.leadingArgument=Y.String();this.args=Y.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!b.tryParseIdent(this.leadingArgument)){let e=D.resolve(this.context.cwd,L.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},qte=UP;var mB=class extends ye{async execute(){this.context.stdout.write(`${Qr||""} -`)}};mB.paths=[["-v"],["--version"]];var jte=mB;var xp=class extends ye{constructor(){super(...arguments);this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Le.find(e,this.context.cwd);return await r.restoreInstallState(),await kt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:r})}};xp.paths=[["exec"]],xp.usage=Ce.Usage({description:"execute a shell script",details:` - This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. - - It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var Jte=xp;Nn();var kp=class extends ye{constructor(){super(...arguments);this.hash=Y.String({required:!1,validator:UQ(KQ(),[HQ(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r}=await Le.find(e,this.context.cwd);return await r.restoreInstallState({restoreResolutions:!1}),await r.applyLightResolution(),typeof this.hash!="undefined"?await GHe(this.hash,r,{stdout:this.context.stdout}):(await Pe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>b.stringifyLocator(r.storedPackages.get(a.subject)),([,a])=>b.stringifyIdent(a.requested)];for(let[a,l]of fe.sortMap(r.peerRequirements,s)){let c=r.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=r.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,h=Ae.pretty(e,a,Ae.Type.CODE),f=b.prettyLocator(e,c),p=b.prettyIdent(e,l.requested),m=b.prettyIdent(e,u),I=l.allRequesters.length-1,Q=`descendant${I===1?"":"s"}`,w=I>0?` and ${I} ${Q}`:"",x=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${h} \u2192 ${f} ${x} ${p} to ${m}${w}`)}})).exitCode()}};kp.paths=[["explain","peer-requirements"]],kp.usage=Ce.Usage({description:"explain a set of peer requirements",details:` - A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. - - When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. - - When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. - - **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). - `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var Wte=kp;async function GHe(t,e,r){let{configuration:i}=e,n=e.peerRequirements.get(t);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Pe.start({configuration:i,stdout:r.stdout,includeFooter:!1},async o=>{var Q,w;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(Q=a.dependencies.get(n.requested.identHash))!=null?Q:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let h=[...n.allRequesters.values()].map(x=>{let N=e.storedPackages.get(x);if(typeof N=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let H=b.devirtualizeLocator(N),T=e.storedPackages.get(H.locatorHash);if(typeof T=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let P=T.peerDependencies.get(n.requested.identHash);if(typeof P=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:N,peerDependency:P}});if(g!==null){let x=h.every(({peerDependency:N})=>Ft.satisfiesWithPrereleases(g.version,N.range));o.reportInfo(J.UNNAMED,`${b.prettyLocator(i,a)} provides ${b.prettyLocator(i,g)} with version ${b.prettyReference(i,(w=g.version)!=null?w:"")}, which ${x?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(J.UNNAMED,`${b.prettyLocator(i,a)} doesn't provide ${b.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let f=Ae.mark(i),p=[];for(let{pkg:x,peerDependency:N}of fe.sortMap(h,H=>b.stringifyLocator(H.pkg))){let T=(g!==null?Ft.satisfiesWithPrereleases(g.version,N.range):!1)?f.Check:f.Cross;p.push({stringifiedLocator:b.stringifyLocator(x),prettyLocator:b.prettyLocator(i,x),prettyRange:b.prettyRange(i,N.range),mark:T})}let m=Math.max(...p.map(({stringifiedLocator:x})=>x.length)),I=Math.max(...p.map(({prettyRange:x})=>x.length));for(let{stringifiedLocator:x,prettyLocator:N,prettyRange:H,mark:T}of fe.sortMap(p,({stringifiedLocator:P})=>P))o.reportInfo(null,`${N.padEnd(m+(N.length-x.length)," ")} \u2192 ${H.padEnd(I," ")} ${T}`);p.length>1&&(o.reportSeparator(),o.reportInfo(J.UNNAMED,`Note: these requirements start with ${b.prettyLocator(e.configuration,l)}`))})).exitCode()}var zte=ne(Ji()),vp=class extends ye{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=Y.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=Y.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=Y.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=Y.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=Y.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=Y.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i&&!this.all)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(x,{recursive:N})=>{let H=x.anchoredLocator.locatorHash,T=new Map,P=[H];for(;P.length>0;){let G=P.shift();if(T.has(G))continue;let te=r.storedPackages.get(G);if(typeof te=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(T.set(G,te),b.isVirtualLocator(te)&&P.push(b.devirtualizeLocator(te).locatorHash),!(!N&&G!==H))for(let j of te.dependencies.values()){let A=r.storedResolutions.get(j.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");P.push(A)}}return T.values()},a=({recursive:x})=>{let N=new Map;for(let H of r.workspaces)for(let T of o(H,{recursive:x}))N.set(T.locatorHash,T);return N.values()},l=({all:x,recursive:N})=>x&&N?r.storedPackages.values():x?a({recursive:N}):o(i,{recursive:N}),c=({all:x,recursive:N})=>{let H=l({all:x,recursive:N}),T=this.patterns.map(te=>{let j=b.parseLocator(te),A=zte.default.makeRe(b.stringifyIdent(j)),ee=b.isVirtualLocator(j),$=ee?b.devirtualizeLocator(j):j;return _=>{let U=b.stringifyIdent(_);if(!A.test(U))return!1;if(j.reference==="unknown")return!0;let F=b.isVirtualLocator(_),Re=F?b.devirtualizeLocator(_):_;return!(ee&&F&&j.reference!==_.reference||$.reference!==Re.reference)}}),P=fe.sortMap([...H],te=>b.stringifyLocator(te));return{selection:P.filter(te=>T.length===0||T.some(j=>j(te))),sortedLookup:P}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new me("No package matched your request");let h=new Map;if(this.dependents)for(let x of g)for(let N of x.dependencies.values()){let H=r.storedResolutions.get(N.descriptorHash);if(typeof H=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");fe.getArrayWithDefault(h,H).push(x)}let f=new Map;for(let x of g){if(!b.isVirtualLocator(x))continue;let N=b.devirtualizeLocator(x);fe.getArrayWithDefault(f,N.locatorHash).push(x)}let p={},m={children:p},I=e.makeFetcher(),Q={project:r,fetcher:I,cache:n,checksums:r.storedChecksums,report:new Dr,skipIntegrityCheck:!0},w=[async(x,N,H)=>{var G,te;if(!N.has("manifest"))return;let T=await I.fetch(x,Q),P;try{P=await Je.find(T.prefixPath,{baseFs:T.packageFs})}finally{(G=T.releaseFs)==null||G.call(T)}H("Manifest",{License:Ae.tuple(Ae.Type.NO_HINT,P.license),Homepage:Ae.tuple(Ae.Type.URL,(te=P.raw.homepage)!=null?te:null)})},async(x,N,H)=>{var j;if(!N.has("cache"))return;let T=(j=r.storedChecksums.get(x.locatorHash))!=null?j:null,P=n.getLocatorPath(x,T),G;if(P!==null)try{G=M.statSync(P)}catch{}let te=typeof G!="undefined"?[G.size,Ae.Type.SIZE]:void 0;H("Cache",{Checksum:Ae.tuple(Ae.Type.NO_HINT,T),Path:Ae.tuple(Ae.Type.PATH,P),Size:te})}];for(let x of u){let N=b.isVirtualLocator(x);if(!this.virtuals&&N)continue;let H={},T={value:[x,Ae.Type.LOCATOR],children:H};if(p[b.stringifyLocator(x)]=T,this.nameOnly){delete T.children;continue}let P=f.get(x.locatorHash);typeof P!="undefined"&&(H.Instances={label:"Instances",value:Ae.tuple(Ae.Type.NUMBER,P.length)}),H.Version={label:"Version",value:Ae.tuple(Ae.Type.NO_HINT,x.version)};let G=(j,A)=>{let ee={};if(H[j]=ee,Array.isArray(A))ee.children=A.map($=>({value:$}));else{let $={};ee.children=$;for(let[_,U]of Object.entries(A))typeof U!="undefined"&&($[_]={label:_,value:U})}};if(!N){for(let j of w)await j(x,s,G);await e.triggerHook(j=>j.fetchPackageInfo,x,s,G)}x.bin.size>0&&!N&&G("Exported Binaries",[...x.bin.keys()].map(j=>Ae.tuple(Ae.Type.PATH,j)));let te=h.get(x.locatorHash);typeof te!="undefined"&&te.length>0&&G("Dependents",te.map(j=>Ae.tuple(Ae.Type.LOCATOR,j))),x.dependencies.size>0&&!N&&G("Dependencies",[...x.dependencies.values()].map(j=>{var $;let A=r.storedResolutions.get(j.descriptorHash),ee=typeof A!="undefined"&&($=r.storedPackages.get(A))!=null?$:null;return Ae.tuple(Ae.Type.RESOLUTION,{descriptor:j,locator:ee})})),x.peerDependencies.size>0&&N&&G("Peer dependencies",[...x.peerDependencies.values()].map(j=>{var _,U;let A=x.dependencies.get(j.identHash),ee=typeof A!="undefined"&&(_=r.storedResolutions.get(A.descriptorHash))!=null?_:null,$=ee!==null&&(U=r.storedPackages.get(ee))!=null?U:null;return Ae.tuple(Ae.Type.RESOLUTION,{descriptor:j,locator:$})}))}Yn.emitTree(m,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};vp.paths=[["info"]],vp.usage=Ce.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var Vte=vp;Nn();var Pp=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=Y.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=Y.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=Y.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=Y.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:li(Mr)});this.cacheFolder=Y.String("--cache-folder",{hidden:!0});this.frozenLockfile=Y.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=Y.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=Y.Boolean("--non-interactive",{hidden:!0});this.preferOffline=Y.Boolean("--prefer-offline",{hidden:!0});this.production=Y.Boolean("--production",{hidden:!0});this.registry=Y.String("--registry",{hidden:!0});this.silent=Y.Boolean("--silent",{hidden:!0})}async execute(){var g;let e=await ce.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let r=!!process.env.NOW_BUILDER,i=!!process.env.NETLIFY,n=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,s=async(h,{error:f})=>{let p=await Pe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async m=>{f?m.reportError(J.DEPRECATED_CLI_SETTINGS,h):m.reportWarning(J.DEPRECATED_CLI_SETTINGS,h)});return p.hasErrors()?p.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let h=await s("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!r});if(h!==null)return h}if(typeof this.registry!="undefined"){let h=await s("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(h!==null)return h}if(typeof this.preferOffline!="undefined"){let h=await s("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!r});if(h!==null)return h}if(typeof this.production!="undefined"){let h=await s("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(h!==null)return h}if(typeof this.nonInteractive!="undefined"){let h=await s("The --non-interactive option is deprecated",{error:!n});if(h!==null)return h}if(typeof this.frozenLockfile!="undefined"&&(await s("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let h=await s("The cache-folder option has been deprecated; use rc settings instead",{error:!i});if(h!==null)return h}let o=(g=this.immutable)!=null?g:e.get("enableImmutableInstalls");if(e.projectCwd!==null){let h=await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async f=>{await YHe(e,o)&&(f.reportInfo(J.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),f.reportSeparator())});if(h.hasErrors())return h.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let h=e.projectCwd,f;try{f=await M.readFilePromise(D.join(h,Et.lockfile),"utf8")}catch{}if(f==null?void 0:f.includes("yarn lockfile v1")){let p=await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async m=>{m.reportInfo(J.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),m.reportSeparator(),e.use("",{nodeLinker:"node-modules"},h,{overwrite:!0}),await ce.updateConfiguration(h,{nodeLinker:"node-modules"})});if(p.hasErrors())return p.exitCode()}}if(e.projectCwd!==null){let h=await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async f=>{var p;((p=ce.telemetry)==null?void 0:p.isNew)&&(f.reportInfo(J.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),f.reportInfo(J.TELEMETRY_NOTICE,`Run ${Ae.pretty(e,"yarn config set --home enableTelemetry 0",Ae.Type.CODE)} to disable`),f.reportSeparator())});if(h.hasErrors())return h.exitCode()}let{project:a,workspace:l}=await Le.find(e,this.context.cwd),c=await mt.find(e,{immutable:this.immutableCache,check:this.checkCache});if(!l)throw new _e(a.cwd,this.context.cwd);return await a.restoreInstallState({restoreResolutions:!1}),(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async h=>{await a.install({cache:c,report:h,immutable:o,mode:this.mode})})).exitCode()}};Pp.paths=[["install"],Ce.Default],Pp.usage=Ce.Usage({description:"install the project dependencies",details:` - This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: - - - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). - - - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). - - - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). - - - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. - - Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. - - If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. - - If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). - - If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. - - If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var Xte=Pp,qHe="|||||||",jHe=">>>>>>>",JHe="=======",Zte="<<<<<<<";async function YHe(t,e){if(!t.projectCwd)return!1;let r=D.join(t.projectCwd,t.get("lockfileFilename"));if(!await M.existsPromise(r))return!1;let i=await M.readFilePromise(r,"utf8");if(!i.includes(Zte))return!1;if(e)throw new et(J.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=WHe(i),o,a;try{o=jr(n),a=jr(s)}catch(c){throw new et(J.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=v(v({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await M.changeFilePromise(r,co(l),{automaticNewlines:!0}),!0}function WHe(t){let e=[[],[]],r=t.split(/\r?\n/g),i=!1;for(;r.length>0;){let n=r.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Zte)){for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===JHe){i=!1;break}else if(i||s.startsWith(qHe)){i=!0;continue}else e[0].push(s)}for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(jHe))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` -`),e[1].join(` -`)]}var Fp=class extends ye{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=Y.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=Y.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=D.resolve(this.context.cwd,L.toPortablePath(this.destination)),o=await ce.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await Le.find(o,s);if(r.cwd===a.cwd)throw new me("Invalid destination; Can't link the project to itself");if(!l)throw new _e(a.cwd,s);let c=r.topLevelWorkspace,u=[];if(this.all){for(let h of a.workspaces)h.manifest.name&&(!h.manifest.private||this.private)&&u.push(h);if(u.length===0)throw new me("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new me("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let h of u){let f=b.stringifyIdent(h.locator),p=this.relative?D.relative(r.cwd,h.cwd):h.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:f}},reference:`portal:${p}`})}return(await Pe.start({configuration:e,stdout:this.context.stdout},async h=>{await r.install({cache:n,report:h})})).exitCode()}};Fp.paths=[["link"]],Fp.usage=Ce.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var _te=Fp;var Rp=class extends ye{constructor(){super(...arguments);this.args=Y.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};Rp.paths=[["node"]],Rp.usage=Ce.Usage({description:"run node with the hook already setup",details:` - This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). - - The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. - `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var $te=Rp;var ure=ne(require("os"));var nre=ne(require("os"));var zHe="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function ml(t){let e=await Mt.get(zHe,{configuration:t});return jr(e.toString())}var Np=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins);return(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await ml(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=Kr(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(v({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};Np.paths=[["plugin","list"]],Np.usage=Ce.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var ere=Np;var tre=ne(pr()),Mp=class extends ye{constructor(){super(...arguments);this.onlyIfNeeded=Y.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let r=()=>{if(typeof Qr=="undefined")throw new me("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=r();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await rre(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await rre(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^\.{0,2}[\\/]/)||L.isAbsolute(this.version))i=`file://${L.resolve(this.version)}`;else if(Ft.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(Ft.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(Ft.validRange(this.version))i=`https://repo.yarnpkg.com/${await VHe(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new me(`Invalid version descriptor "${this.version}"`);return(await Pe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(J.UNNAMED,`Downloading ${Ae.pretty(e,i,ys.URL)}`),a=await M.readFilePromise(L.toPortablePath(i.slice(o.length)))):(s.reportInfo(J.UNNAMED,`Retrieving ${Ae.pretty(e,i,ys.PATH)}`),a=await Mt.get(i,{configuration:e})),await HP(e,null,a,{report:s})})).exitCode()}};Mp.paths=[["set","version"]],Mp.usage=Ce.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Download the version used to invoke the command","$0 set version self"]]});var ire=Mp;async function VHe(t,e){let i=(await Mt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(n=>Ft.satisfiesWithPrereleases(n,e));if(i.length===0)throw new me(`No matching release found for range ${Ae.pretty(t,e,Ae.Type.RANGE)}.`);return i[0]}async function rre(t,e){let r=await Mt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new me(`Tag ${Ae.pretty(t,e,Ae.Type.RANGE)} not found`);return r.latest[e]}async function HP(t,e,r,{report:i}){var g;e===null&&await M.mktempPromise(async h=>{let f=D.join(h,"yarn.cjs");await M.writeFilePromise(f,r);let{stdout:p}=await Hr.execvp(process.execPath,[L.fromPortablePath(f),"--version"],{cwd:h,env:W(v({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!tre.default.valid(e))throw new Error(`Invalid semver version. ${Ae.pretty(t,"yarn --version",Ae.Type.CODE)} returned: -${e}`)});let n=(g=t.projectCwd)!=null?g:t.startingCwd,s=D.resolve(n,".yarn/releases"),o=D.resolve(s,`yarn-${e}.cjs`),a=D.relative(t.startingCwd,o),l=D.relative(n,o),c=t.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(J.UNNAMED,`Saving the new release in ${Ae.pretty(t,a,"magenta")}`),await M.removePromise(D.dirname(o)),await M.mkdirPromise(D.dirname(o),{recursive:!0}),await M.writeFilePromise(o,r,{mode:493}),u){await ce.updateConfiguration(n,{yarnPath:l});let h=await Je.tryFind(n)||new Je;e&&fe.isTaggedYarnVersion(e)&&(h.packageManager=`yarn@${e}`);let f={};h.exportTo(f);let p=D.join(n,Je.fileName),m=`${JSON.stringify(f,null,h.indent)} -`;await M.changeFilePromise(p,m,{automaticNewlines:!0})}}var XHe=/^[0-9]+$/;function sre(t){return XHe.test(t)?`pull/${t}/head`:t}var ZHe=({repository:t,branch:e},r)=>[["git","init",L.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin",sre(e)],["git","reset","--hard","FETCH_HEAD"]],_He=({branch:t})=>[["git","fetch","origin",sre(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],$He=({plugins:t,noMinify:e},r)=>[["yarn","build:cli",...new Array().concat(...t.map(i=>["--plugin",D.resolve(r,i)])),...e?["--no-minify"]:[],"|"]],Lp=class extends ye{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=Y.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=Y.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r}=await Le.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?D.resolve(this.context.cwd,L.toPortablePath(this.installPath)):D.resolve(L.toPortablePath((0,nre.tmpdir)()),"yarnpkg-sources",ki.makeHash(this.repository).slice(0,6));return(await Pe.start({configuration:e,stdout:this.context.stdout},async s=>{await YP(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(J.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await Tp($He(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=D.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await M.readFilePromise(o);await HP(e,"sources",a,{report:s}),this.skipPlugins||await eGe(this,{project:r,report:s,target:i})})).exitCode()}};Lp.paths=[["set","version","from","sources"]],Lp.usage=Ce.Usage({description:"build Yarn from master",details:` - This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. - - By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. - `,examples:[["Build Yarn from master","$0 set version from sources"]]});var ore=Lp;async function Tp(t,{configuration:e,context:r,target:i}){for(let[n,...s]of t){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await Hr.pipevp(n,s,{cwd:i,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${Ae.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} -`);try{await Hr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw r.stdout.write(a.stdout||a.stack),a}}}}async function YP(t,{configuration:e,report:r,target:i}){let n=!1;if(!t.force&&M.existsSync(D.join(i,".git"))){r.reportInfo(J.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await Tp(_He(t),{configuration:e,context:t.context,target:i}),n=!0}catch(s){r.reportSeparator(),r.reportWarning(J.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(r.reportInfo(J.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await M.removePromise(i),await M.mkdirPromise(i,{recursive:!0}),await Tp(ZHe(t,i),{configuration:e,context:t.context,target:i}))}async function eGe(t,{project:e,report:r,target:i}){let n=await ml(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await GP(o,t,{project:e,report:r,target:i})}var are=ne(pr()),Are=ne(require("url")),lre=ne(require("vm"));var Op=class extends ye{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins);return(await Pe.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await Le.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||L.isAbsolute(this.name)){let a=D.resolve(this.context.cwd,L.toPortablePath(this.name));i.reportInfo(J.UNNAMED,`Reading ${Ae.pretty(e,a,Ae.Type.PATH)}`),s=D.relative(n.cwd,a),o=await M.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new Are.URL(this.name)}catch{throw new et(J.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=b.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!are.default.valid(l.reference))throw new et(J.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=b.stringifyIdent(l),u=await ml(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new et(J.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Qr!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Qr}/`))}i.reportInfo(J.UNNAMED,`Downloading ${Ae.pretty(e,a,"green")}`),o=await Mt.get(a,{configuration:e})}await qP(s,o,{project:n,report:i})})).exitCode()}};Op.paths=[["plugin","import"]],Op.usage=Ce.Usage({category:"Plugin-related commands",description:"download a plugin",details:` - This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. - - Three types of plugin references are accepted: - - - If the plugin is stored within the Yarn repository, it can be referenced by name. - - Third-party plugins can be referenced directly through their public urls. - - Local plugins can be referenced by their path on the disk. - - Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). - `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var cre=Op;async function qP(t,e,{project:r,report:i}){let{configuration:n}=r,s={},o={exports:s};(0,lre.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=D.resolve(r.cwd,l);i.reportInfo(J.UNNAMED,`Saving the new plugin in ${Ae.pretty(n,l,"magenta")}`),await M.mkdirPromise(D.dirname(c),{recursive:!0}),await M.writeFilePromise(c,e);let u={path:l,spec:t};await ce.updateConfiguration(r.cwd,g=>{let h=[],f=!1;for(let p of g.plugins||[]){let m=typeof p!="string"?p.path:p,I=D.resolve(r.cwd,L.toPortablePath(m)),{name:Q}=fe.dynamicRequire(I);Q!==a?h.push(p):(h.push(u),f=!0)}return f||h.push(u),W(v({},g),{plugins:h})})}var tGe=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],Kp=class extends ye{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=typeof this.installPath!="undefined"?D.resolve(this.context.cwd,L.toPortablePath(this.installPath)):D.resolve(L.toPortablePath((0,ure.tmpdir)()),"yarnpkg-sources",ki.makeHash(this.repository).slice(0,6));return(await Pe.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await Le.find(e,this.context.cwd),o=b.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=b.stringifyIdent(o),l=await ml(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new et(J.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await YP(this,{configuration:e,report:n,target:r}),await GP(c,this,{project:s,report:n,target:r})})).exitCode()}};Kp.paths=[["plugin","import","from","sources"]],Kp.usage=Ce.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` - This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. - - The plugins can be referenced by their short name if sourced from the official Yarn repository. - `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var gre=Kp;async function GP(t,{context:e,noMinify:r},{project:i,report:n,target:s}){let o=t.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(J.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await Tp(tGe({pluginName:o,noMinify:r},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=D.resolve(s,`packages/${o}/bundles/${t}.js`),c=await M.readFilePromise(l);await qP(t,c,{project:i,report:n})}var Up=class extends ye{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r}=await Le.find(e,this.context.cwd);return(await Pe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=b.parseIdent(s);if(!e.plugins.has(s))throw new me(`${b.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=D.resolve(r.cwd,a);M.existsSync(l)&&(n.reportInfo(J.UNNAMED,`Removing ${Ae.pretty(e,a,Ae.Type.PATH)}...`),await M.removePromise(l)),n.reportInfo(J.UNNAMED,"Updating the configuration..."),await ce.updateConfiguration(r.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:W(v({},c),{plugins:u})})})).exitCode()}};Up.paths=[["plugin","remove"]],Up.usage=Ce.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` - This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. - - **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. - `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var hre=Up;var Hp=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins);return(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};Hp.paths=[["plugin","runtime"]],Hp.usage=Ce.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` - This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. - `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var fre=Hp;var Gp=class extends ye{constructor(){super(...arguments);this.idents=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(b.parseIdent(a).identHash);if(await r.restoreInstallState({restoreResolutions:!1}),await r.resolveEverything({cache:n,report:new Dr}),s.size>0)for(let a of r.storedPackages.values())s.has(a.identHash)&&r.storedBuildState.delete(a.locatorHash);else r.storedBuildState.clear();return(await Pe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await r.install({cache:n,report:a})})).exitCode()}};Gp.paths=[["rebuild"]],Gp.usage=Ce.Usage({description:"rebuild the project's native packages",details:` - This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. - - Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). - - By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. - `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var pre=Gp;var jP=ne(Ji());Nn();var Yp=class extends ye{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:li(Mr)});this.patterns=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=this.all?r.workspaces:[i],o=[ir.REGULAR,ir.DEVELOPMENT,ir.PEER],a=[],l=!1,c=[];for(let f of this.patterns){let p=!1,m=b.parseIdent(f);for(let I of s){let Q=[...I.manifest.peerDependenciesMeta.keys()];for(let w of(0,jP.default)(Q,f))I.manifest.peerDependenciesMeta.delete(w),l=!0,p=!0;for(let w of o){let x=I.manifest.getForScope(w),N=[...x.values()].map(H=>b.stringifyIdent(H));for(let H of(0,jP.default)(N,b.stringifyIdent(m))){let{identHash:T}=b.parseIdent(H),P=x.get(T);if(typeof P=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");I.manifest[w].delete(T),c.push([I,w,P]),l=!0,p=!0}}}p||a.push(f)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",h=this.all?"any":"this";if(a.length>0)throw new me(`${u} ${Ae.prettyList(e,a,ys.CODE)} ${g} match any packages referenced by ${h} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Pe.start({configuration:e,stdout:this.context.stdout},async p=>{await r.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};Yp.paths=[["remove"]],Yp.usage=Ce.Usage({description:"remove dependencies from the project",details:` - This command will remove the packages matching the specified patterns from the current workspace. - - If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: - - - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. - - - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. - - This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. - `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var dre=Yp;var Cre=ne(require("util")),IB=class extends ye{async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);return(await Pe.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=fe.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,Cre.inspect)(g,l)}`)})).exitCode()}};IB.paths=[["run"]];var mre=IB;var qp=class extends ye{constructor(){super(...arguments);this.inspect=Y.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=Y.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=Y.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=Y.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=Y.Boolean("--silent",{hidden:!0});this.scriptName=Y.String();this.args=Y.Proxy()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i,locator:n}=await Le.find(e,this.context.cwd);await r.restoreInstallState();let s=this.topLevel?r.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await kt.hasPackageScript(s,this.scriptName,{project:r}))return await kt.executePackageScript(s,this.scriptName,this.args,{project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await kt.getPackageAccessibleBinaries(s,{project:r});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await kt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(r.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await kt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${b.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${b.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new me("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of hu)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new me(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new me(`Couldn't find a script named "${this.scriptName}".`)}}};qp.paths=[["run"]],qp.usage=Ce.Usage({description:"run a script defined in the package.json",details:` - This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: - - - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. - - - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. - - - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. - - Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). - `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var Ire=qp;var jp=class extends ye{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=Y.String();this.resolution=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(await r.restoreInstallState({restoreResolutions:!1}),!i)throw new _e(r.cwd,this.context.cwd);let s=b.parseDescriptor(this.descriptor,!0),o=b.makeDescriptor(s,this.resolution);return r.storedDescriptors.set(s.descriptorHash,s),r.storedDescriptors.set(o.descriptorHash,o),r.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Pe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};jp.paths=[["set","resolution"]],jp.usage=Ce.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var Ere=jp;var yre=ne(Ji()),Jp=class extends ye{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);let s=r.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=D.resolve(this.context.cwd,L.toPortablePath(l));if(fe.isPathLike(l)){let u=await ce.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:h}=await Le.find(u,c);if(!h)throw new _e(g.cwd,c);if(this.all){for(let f of g.workspaces)f.manifest.name&&o.add(b.stringifyIdent(f.locator));if(o.size===0)throw new me("No workspace found to be unlinked in the target project")}else{if(!h.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be unlinked");o.add(b.stringifyIdent(h.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,yre.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Pe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};Jp.paths=[["unlink"]],Jp.usage=Ce.Usage({description:"disconnect the local project from another one",details:` - This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. - `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var Bre=Jp;var wre=ne(dp()),JP=ne(Ji());Nn();var Ru=class extends ye{constructor(){super(...arguments);this.interactive=Y.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:li(Mr)});this.patterns=Y.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=[...r.storedDescriptors.values()],o=s.map(u=>b.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(b.parseDescriptor(u).range!=="unknown")throw new me("Ranges aren't allowed when using --recursive");for(let g of(0,JP.default)(o,u)){let h=b.parseIdent(g);a.add(h.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)r.storedDescriptors.delete(u.descriptorHash),r.storedResolutions.delete(u.descriptorHash);return(await Pe.start({configuration:e,stdout:this.context.stdout},async u=>{await r.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var m;let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(m=this.interactive)!=null?m:e.get("preferInteractive"),o=Cp(this,r),a=s?[cr.KEEP,cr.REUSE,cr.PROJECT,cr.LATEST]:[cr.PROJECT,cr.LATEST],l=[],c=[];for(let I of this.patterns){let Q=!1,w=b.parseDescriptor(I);for(let x of r.workspaces)for(let N of[ir.REGULAR,ir.DEVELOPMENT]){let T=[...x.manifest.getForScope(N).values()].map(P=>b.stringifyIdent(P));for(let P of(0,JP.default)(T,b.stringifyIdent(w))){let G=b.parseIdent(P),te=x.manifest[N].get(G.identHash);if(typeof te=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let j=b.makeDescriptor(G,w.range);l.push(Promise.resolve().then(async()=>[x,N,te,await mp(j,{project:r,workspace:x,cache:n,target:N,modifier:o,strategies:a})])),Q=!0}}Q||c.push(I)}if(c.length>1)throw new me(`Patterns ${Ae.prettyList(e,c,ys.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new me(`Pattern ${Ae.prettyList(e,c,ys.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await Eo.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async I=>{for(let[,,Q,{suggestions:w,rejections:x}]of u){let N=w.filter(H=>H.descriptor!==null);if(N.length===0){let[H]=x;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let T=this.cli.error(H);r.configuration.get("enableNetwork")?I.reportError(J.CANT_SUGGEST_RESOLUTIONS,`${b.prettyDescriptor(e,Q)} can't be resolved to a satisfying range - -${T}`):I.reportError(J.CANT_SUGGEST_RESOLUTIONS,`${b.prettyDescriptor(e,Q)} can't be resolved to a satisfying range (note: network resolution has been disabled) - -${T}`)}else N.length>1&&!s&&I.reportError(J.CANT_SUGGEST_RESOLUTIONS,`${b.prettyDescriptor(e,Q)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let h=!1,f=[];for(let[I,Q,,{suggestions:w}]of u){let x,N=w.filter(G=>G.descriptor!==null),H=N[0].descriptor,T=N.every(G=>b.areDescriptorsEqual(G.descriptor,H));N.length===1||T?x=H:(h=!0,{answer:x}=await(0,wre.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${b.prettyWorkspace(e,I)} \u276F ${Q}?`,choices:w.map(({descriptor:G,name:te,reason:j})=>G?{name:te,hint:j,descriptor:G}:{name:te,hint:j,disabled:!0}),onCancel:()=>process.exit(130),result(G){return this.find(G,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let P=I.manifest[Q].get(x.identHash);if(typeof P=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if(P.descriptorHash!==x.descriptorHash)I.manifest[Q].set(x.identHash,x),f.push([I,Q,P,x]);else{let G=e.makeResolver(),te={project:r,resolver:G},j=G.bindDescriptor(P,I.anchoredLocator,te);r.forgetResolution(j)}}return await e.triggerMultipleHooks(I=>I.afterWorkspaceDependencyReplacement,f),h&&this.context.stdout.write(` -`),(await Pe.start({configuration:e,stdout:this.context.stdout},async I=>{await r.install({cache:n,report:I,mode:this.mode})})).exitCode()}};Ru.paths=[["up"]],Ru.usage=Ce.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),Ru.schema=[GQ("recursive",aA.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var Qre=Ru;var Wp=class extends ye{constructor(){super(...arguments);this.recursive=Y.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=Y.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState();let n=b.parseIdent(this.package).identHash,s=this.recursive?iGe(r,n,{configuration:e,peers:this.peers}):rGe(r,n,{configuration:e,peers:this.peers});Yn.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};Wp.paths=[["why"]],Wp.usage=Ce.Usage({description:"display the reason why a package is needed",details:` - This command prints the exact reasons why a package appears in the dependency tree. - - If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. - `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var bre=Wp;function rGe(t,e,{configuration:r,peers:i}){let n=fe.sortMap(t.storedPackages.values(),a=>b.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=t.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let h=t.storedPackages.get(g);if(!h)throw new Error("Assertion failed: The package should have been registered");if(h.identHash!==e)continue;if(c===null){let p=b.stringifyLocator(a);s[p]={value:[a,Ae.Type.LOCATOR],children:l}}let f=b.stringifyLocator(h);l[f]={value:[{descriptor:u,locator:h},Ae.Type.DEPENDENT]}}}return o}function iGe(t,e,{configuration:r,peers:i}){let n=fe.sortMap(t.workspaces,h=>b.stringifyLocator(h.anchoredLocator)),s=new Set,o=new Set,a=h=>{if(s.has(h.locatorHash))return o.has(h.locatorHash);if(s.add(h.locatorHash),h.identHash===e)return o.add(h.locatorHash),!0;let f=!1;h.identHash===e&&(f=!0);for(let p of h.dependencies.values()){if(!i&&h.peerDependencies.has(p.identHash))continue;let m=t.storedResolutions.get(p.descriptorHash);if(!m)throw new Error("Assertion failed: The resolution should have been registered");let I=t.storedPackages.get(m);if(!I)throw new Error("Assertion failed: The package should have been registered");a(I)&&(f=!0)}return f&&o.add(h.locatorHash),f};for(let h of n){let f=t.storedPackages.get(h.anchoredLocator.locatorHash);if(!f)throw new Error("Assertion failed: The package should have been registered");a(f)}let l=new Set,c={},u={children:c},g=(h,f,p)=>{if(!o.has(h.locatorHash))return;let m=p!==null?Ae.tuple(Ae.Type.DEPENDENT,{locator:h,descriptor:p}):Ae.tuple(Ae.Type.LOCATOR,h),I={},Q={value:m,children:I},w=b.stringifyLocator(h);if(f[w]=Q,!l.has(h.locatorHash)&&(l.add(h.locatorHash),!(p!==null&&t.tryWorkspaceByLocator(h))))for(let x of h.dependencies.values()){if(!i&&h.peerDependencies.has(x.identHash))continue;let N=t.storedResolutions.get(x.descriptorHash);if(!N)throw new Error("Assertion failed: The resolution should have been registered");let H=t.storedPackages.get(N);if(!H)throw new Error("Assertion failed: The package should have been registered");g(H,I,x)}};for(let h of n){let f=t.storedPackages.get(h.anchoredLocator.locatorHash);if(!f)throw new Error("Assertion failed: The package should have been registered");g(f,c,null)}return u}var zp=class extends ye{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r}=await Le.find(e,this.context.cwd);return(await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{for(let s of r.workspaces){let{manifest:o}=s,a;if(this.verbose){let l=new Set,c=new Set;for(let u of Je.hardDependencies)for(let[g,h]of o.getForScope(u)){let f=r.tryWorkspaceByDescriptor(h);f===null?r.workspacesByIdent.has(g)&&c.add(h):l.add(f)}a={workspaceDependencies:Array.from(l).map(u=>u.relativeCwd),mismatchedWorkspaceDependencies:Array.from(c).map(u=>b.stringifyDescriptor(u))}}n.reportInfo(null,`${s.relativeCwd}`),n.reportJson(v({location:s.relativeCwd,name:o.name?b.stringifyIdent(o.name):null},a))}})).exitCode()}};zp.paths=[["workspaces","list"]],zp.usage=Ce.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project. If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var Dre=zp;var Vp=class extends ye{constructor(){super(...arguments);this.workspaceName=Y.String();this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);let n=r.workspaces,s=new Map(n.map(a=>{let l=b.convertToIdent(a.locator);return[b.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new me(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: - - ${a.join(` - - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};Vp.paths=[["workspace"]],Vp.usage=Ce.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` - This command will run a given sub-command on a single workspace. - `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var Sre=Vp;var nGe={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:ge.BOOLEAN,default:xre.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:ge.STRING,values:["^","~",""],default:Ss.CARET}},commands:[aee,lee,Qte,Lte,Ere,ore,ire,Dre,Gte,Yte,qte,jte,see,oee,Tte,Kte,Jte,Wte,Vte,Xte,_te,Bre,$te,gre,cre,hre,ere,fre,pre,dre,mre,Ire,Qre,bre,Sre]},sGe=nGe;var ZP={};$e(ZP,{default:()=>aGe});var Oe={optional:!0},kre=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Oe,zenObservable:Oe}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Oe,zenObservable:Oe}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Oe}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Oe,["postcss-jsx"]:Oe,["postcss-less"]:Oe,["postcss-markdown"]:Oe,["postcss-scss"]:Oe}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Oe}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Oe}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@*",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@*",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Oe,"vue-template-compiler":Oe}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Oe,"utf-8-validate":Oe}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@*",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@*",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Oe,"vuetify-loader":Oe}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Oe}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Oe}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Oe}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Oe,tinyliquid:Oe,"liquid-node":Oe,jade:Oe,"then-jade":Oe,dust:Oe,"dustjs-helpers":Oe,"dustjs-linkedin":Oe,swig:Oe,"swig-templates":Oe,"razor-tmpl":Oe,atpl:Oe,liquor:Oe,twig:Oe,ejs:Oe,eco:Oe,jazz:Oe,jqtpl:Oe,hamljs:Oe,hamlet:Oe,whiskers:Oe,"haml-coffee":Oe,"hogan.js":Oe,templayed:Oe,handlebars:Oe,underscore:Oe,lodash:Oe,pug:Oe,"then-pug":Oe,qejs:Oe,walrus:Oe,mustache:Oe,just:Oe,ect:Oe,mote:Oe,toffee:Oe,dot:Oe,"bracket-template":Oe,ractive:Oe,nunjucks:Oe,htmling:Oe,"babel-core":Oe,plates:Oe,"react-dom":Oe,react:Oe,"arc-templates":Oe,vash:Oe,slm:Oe,marko:Oe,teacup:Oe,"coffee-script":Oe,squirrelly:Oe,twing:Oe}}],["vue-loader@<=16.3.1",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@*",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@*",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@*",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@*",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}]];var zP;function vre(){return typeof zP=="undefined"&&(zP=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),zP}var VP;function Pre(){return typeof VP=="undefined"&&(VP=require("zlib").brotliDecompressSync(Buffer.from("G1ETIIzURnVBnGa0VPvr81orV8AFIqdU0sqrdcVgCdukgAZwi8a50gLk1+99ZzEOlGB8s4acvWeXuS+tdEXZvf/9FpWJoilc6Q6J6jJSoh3LcLpdtPu9FIgS8MvfSzMYoNMZmgjFv02fu1wzv7rjy/uxz4D+3ipRSL9d7a+tby2vMqZ1NtjYWGeIH62vriZB/0y0R4+Ef9fEOfZExraSTqcT5mDirXa43/kAnaydLcMnp7tr+CAJ0D7GarF32/VAZm24KgaKOgkAeLP5OIMmuAqLtyepZZpJ0I8kOM9wGf8HzBcrFKs69DQvA+vDlgPikZ4AzdsRfmwR7y3H88Z+6iJCvkUW7YI0r0/qjTkJMknPjKnGEtM3/GVPblOGKzvGVEG/3ry219D+GFBi/0V5y/Y+5J+ne0oNjKAkqNsJziEsC9uIaCu3BAhKSXzNKKb2ShbfglceIpXKp7QPDEfjYfOEXhVZaj9YuqbW5CqJUFQbEv61vK5cMNH5OUskCmdDBLpP/M8uZ/mtaUl33NTlnzt6OwBXbRE12AV9hIeKySVaULr2d3Db1xA/XQjF17HKVjSBbnrYs/kyPyQJCKSajrMGvhyY9lPrV46lMsFLN32MA1/pnNPPjoMmjNgMYcaCM+fj74qymaJ4WTHxf1gdaYWmRcIe0tH90alG6ez/yA7jwYYtxuHWZdR+2HlMcddaHAV6QC/gXYHV0wnNv47I+5FGevzJFMqWSO/6U4mw3Jh2u4MkhB9O6113OiIlXLWd7bxkBpnsNDHsrPP4nXc3JK/9AofIZqMAJ+ZaM3/p2laHlVlwZHqJ7kVh9GyeneYEyMyukj7fZjyF2EM9xvkSAUqJJ5Em+VH+ebjmSCb2Sof38a6wa4FSMqqKkYiI+kAb54/8g5D97YO3D5633jnd/3yQkvtB1rzPHKhRQEyqhh/0tRF5dw5D0B7W9DcC0hE6cqQ8l0/Yh6X9oGZMOUBXzxTgQ9OXx8jQRaR/akDmFinFPLGIwnXMEE5UZyy86XMK4VuFEWh0dZ4VI+UP43fUdprpIOvgeSAguQRfPa4EorHKDz20artlpBT7n1GVgQD/qPuAYXE2LQTMOIZlKsYsGw+smX1uQLjUWwLjjnVGuctsONqUCJhFJPkeOkpBvP5bR7RKRPtlxlVsw3TVjbthCDj7GJnX7t2DnejrpNElkX9q7nnjLcsXPCoLsg3E9dcmrTSWvmFoOvYt0MT6qzWivVfqfsO1uhU0EbExmorhlrExlJbLj4mFSdXbmYKWU2JkNfxObx+IAmvmu/rtcAUKMT9g/F4NjNXAQdwpYJDrpkvj5SKCGIM8dxijKkar3I08QWINlCGbKR8eO8aUZARY/pBgH+3m0mEs2i+R27kvHB6CgfaxRoaubQgJhFG2qz68GCGk4a8OLPTuyJWtFQzqV7SN3yTPlgnTu8xGcmdZPuQm9QALLSj3YtClAOfeTM7KZM1ub2WI8FuopnrsyXDiX83HzgXnl4WijCPNNOFpJUBgm2EmfNpJ0vFnsI9vvIltvOVela4apm+5zd3uh8iGlwH1zrybDveunndO4O34b+escLZQkcQZeGwFEUj8+KBBBdVLng7eFS5FfRzh6iNyV6ZsPXVuMZFUeKQi2viy2BMZjEfDqF9JqVh0vIVzEdvul0uQ9SgEnZXGmYUX/wdkKgPXRloVdDlvJK8udQZBbR986wgb/oVh8wT0+q1GciF1GSEYAJCM2QBPwahTg+7BrYJVO05+bwN285fIX4hp39NCDVFsIrUmrIlZmer/Prd8kdQWj0k4D+viGB3JQyxr+iqYqgEUkvhczkrGtlr5hvDdkWwtaqLJe8Mgzhqots10eb6qcfs1vV74MtV1FE3zNszshCxmS3SeKfJy1FiSjodoYEVWLEWiFQG7FIItT5zv9ZBUTlcS2eUmpAgBES1TLR013xZj0TIpjlLasjhELo75d+wA","base64")).toString()),VP}var XP;function Fre(){return typeof XP=="undefined"&&(XP=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),XP}var Rre=new Map([[b.makeIdent(null,"fsevents").identHash,vre],[b.makeIdent(null,"resolve").identHash,Pre],[b.makeIdent(null,"typescript").identHash,Fre]]),oGe={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,i]of kre)e(b.parseDescriptor(r,!0),i)},getBuiltinPatch:async(t,e)=>{var s;let r="compat/";if(!e.startsWith(r))return;let i=b.parseIdent(e.slice(r.length)),n=(s=Rre.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(t,e,r,i)=>typeof Rre.get(t.identHash)=="undefined"?t:b.makeDescriptor(t,b.makeRange({protocol:"patch:",source:b.stringifyDescriptor(t),selector:`~builtin`,params:null}))}},aGe=oGe;var _P={};$e(_P,{default:()=>lGe});var EB=class extends ye{constructor(){super(...arguments);this.pkg=Y.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let r=b.parseIdent(this.command),i=b.makeIdent(r.scope,`create-${r.name}`);return this.cli.run(["dlx",...e,b.stringifyIdent(i),...this.args])}};EB.paths=[["create"]];var Nre=EB;var Xp=class extends ye{constructor(){super(...arguments);this.packages=Y.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){return ce.telemetry=null,await M.mktempPromise(async e=>{var p;let r=D.join(e,`dlx-${process.pid}`);await M.mkdirPromise(r),await M.writeFilePromise(D.join(r,"package.json"),`{} -`),await M.writeFilePromise(D.join(r,"yarn.lock"),"");let i=D.join(r,".yarnrc.yml"),n=await ce.findProjectCwd(this.context.cwd,Et.lockfile),s=!(await ce.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?D.join(n,".yarnrc.yml"):null;o!==null&&M.existsSync(o)?(await M.copyFilePromise(o,i),await ce.updateConfiguration(r,m=>{let I=W(v({},m),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(m.plugins)&&(I.plugins=m.plugins.map(Q=>{let w=typeof Q=="string"?Q:Q.path,x=L.isAbsolute(w)?w:L.resolve(L.fromPortablePath(n),w);return typeof Q=="string"?x:{path:x,spec:Q.spec}})),I})):await M.writeFilePromise(i,`enableGlobalCache: ${s} -enableTelemetry: false -`);let a=(p=this.packages)!=null?p:[this.command],l=b.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:r,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` -`);let u=await ce.find(r,this.context.plugins),{project:g,workspace:h}=await Le.find(u,r);if(h===null)throw new _e(g.cwd,r);await g.restoreInstallState();let f=await kt.getWorkspaceAccessibleBinaries(h);return f.has(l)===!1&&f.size===1&&typeof this.packages=="undefined"&&(l=Array.from(f)[0][0]),await kt.executeWorkspaceAccessibleBinary(h,l,this.args,{packageAccessibleBinaries:f,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};Xp.paths=[["dlx"]],Xp.usage=Ce.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var Mre=Xp;var AGe={commands:[Nre,Mre]},lGe=AGe;var aF={};$e(aF,{default:()=>gGe,fileUtils:()=>$P});var Nu=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,Zp=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,ur="file:";var $P={};$e($P,{makeArchiveFromLocator:()=>yB,makeBufferFromLocator:()=>rF,makeLocator:()=>tF,makeSpec:()=>Lre,parseSpec:()=>eF});function eF(t){let{params:e,selector:r}=b.parseRange(t),i=L.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?b.parseLocator(e.locator):null,path:i}}function Lre({parentLocator:t,path:e,folderHash:r,protocol:i}){let n=t!==null?{locator:b.stringifyLocator(t)}:{},s=typeof r!="undefined"?{hash:r}:{};return b.makeRange({protocol:i,source:e,selector:e,params:v(v({},s),n)})}function tF(t,{parentLocator:e,path:r,folderHash:i,protocol:n}){return b.makeLocator(t,Lre({parentLocator:e,path:r,folderHash:i,protocol:n}))}async function yB(t,{protocol:e,fetchOptions:r,inMemory:i=!1}){let{parentLocator:n,path:s}=b.parseFileStyleRange(t.reference,{protocol:e}),o=D.isAbsolute(s)?{packageFs:new Dt(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(n,r),a=o.localPath?{packageFs:new Dt(Se.root),prefixPath:D.relative(Se.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=D.join(a.prefixPath,s);return await fe.releaseAfterUseAsync(async()=>await Nr.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:b.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function rF(t,{protocol:e,fetchOptions:r}){return(await yB(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var iF=class{supports(e,r){return!!e.reference.startsWith(ur)}getLocalPath(e,r){let{parentLocator:i,path:n}=b.parseFileStyleRange(e.reference,{protocol:ur});if(D.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:D.resolve(s,n)}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async fetchFromDisk(e,r){return yB(e,{protocol:ur,fetchOptions:r})}};var cGe=2,nF=class{supportsDescriptor(e,r){return e.range.match(Nu)?!0:!!e.range.startsWith(ur)}supportsLocator(e,r){return!!e.reference.startsWith(ur)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return Nu.test(e.range)&&(e=b.makeDescriptor(e,`${ur}${e.range}`)),b.bindDescriptor(e,{locator:b.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=eF(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await rF(b.makeLocator(e,b.makeRange({protocol:ur,source:n,selector:n,params:{locator:b.stringifyLocator(s)}})),{protocol:ur,fetchOptions:i.fetchOptions}),a=ki.makeHash(`${cGe}`,o).slice(0,6);return[tF(e,{parentLocator:s,path:n,folderHash:a,protocol:ur})]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await fe.releaseAfterUseAsync(async()=>await Je.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return W(v({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:lt.HARD,dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var sF=class{supports(e,r){return Zp.test(e.reference)?!!e.reference.startsWith(ur):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,r){let{parentLocator:i,path:n}=b.parseFileStyleRange(e.reference,{protocol:ur}),s=D.isAbsolute(n)?{packageFs:new Dt(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Dt(Se.root),prefixPath:D.relative(Se.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=D.join(o.prefixPath,n),c=await a.readFilePromise(l);return await fe.releaseAfterUseAsync(async()=>await Nr.convertToZip(c,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:b.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var oF=class{supportsDescriptor(e,r){return Zp.test(e.range)?!!(e.range.startsWith(ur)||Nu.test(e.range)):!1}supportsLocator(e,r){return Zp.test(e.reference)?!!e.reference.startsWith(ur):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return Nu.test(e.range)&&(e=b.makeDescriptor(e,`${ur}${e.range}`)),b.bindDescriptor(e,{locator:b.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range;return n.startsWith(ur)&&(n=n.slice(ur.length)),[b.makeLocator(e,`${ur}${L.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await fe.releaseAfterUseAsync(async()=>await Je.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return W(v({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:lt.HARD,dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var uGe={fetchers:[sF,iF],resolvers:[oF,nF]},gGe=uGe;var mF={};$e(mF,{default:()=>kGe,gitUtils:()=>_p});var _p={};$e(_p,{TreeishProtocols:()=>Ti,clone:()=>pF,isGitUrl:()=>Lu,lsRemote:()=>eie,normalizeLocator:()=>hF,normalizeRepoUrl:()=>$p,resolveUrl:()=>fF,splitRepoUrl:()=>ed});var uF=ne(Zre()),Mu=ne(require("querystring")),gF=ne(pr()),_re=ne(require("url"));function $re(){return W(v({},process.env),{GIT_SSH_COMMAND:"ssh -o BatchMode=yes"})}var SGe=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],Ti;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(Ti||(Ti={}));function Lu(t){return t?SGe.some(e=>!!t.match(e)):!1}function ed(t){t=$p(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:Ti.Head,request:"HEAD"},extra:{}};let r=t.slice(0,e),i=t.slice(e+1);if(i.match(/^[a-z]+=/)){let n=Mu.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(Ti).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=Ti.Head,a="HEAD");for(let l of Object.values(Ti))delete n[l];return{repo:r,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:r,treeish:{protocol:s,request:o},extra:{}}}}function $p(t,{git:e=!1}={}){var r;if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){t=t.replace(/^git\+([^:]+):/,"$1:");let i;try{i=_re.default.parse(t)}catch{i=null}i&&i.protocol==="ssh:"&&((r=i.path)==null?void 0:r.startsWith("/:"))&&(t=t.replace(/^ssh:\/\//,""))}return t}function hF(t){return b.makeLocator(t,$p(t.reference))}async function eie(t,e){let r=$p(t,{git:!0});if(!Mt.getNetworkSettings(`https://${(0,uF.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${r}' has been blocked because of your configuration settings`);let n;try{n=await Hr.execvp("git",["ls-remote",r],{cwd:e.startingCwd,env:$re(),strict:!0})}catch(l){throw l.message=`Listing the refs for ${t} failed`,l}let s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function fF(t,e){let{repo:r,treeish:{protocol:i,request:n},extra:s}=ed(t),o=await eie(r,e),a=(c,u)=>{switch(c){case Ti.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return Mu.default.stringify(W(v({},s),{commit:u}))}case Ti.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return Mu.default.stringify(W(v({},s),{commit:g}))}case Ti.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return Mu.default.stringify(W(v({},s),{commit:g}))}case Ti.Semver:{let g=Ft.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let h=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,m])=>[gF.default.parse(p.slice(10)),m]).filter(p=>p[0]!==null)),f=gF.default.maxSatisfying([...h.keys()],g);if(f===null)throw new Error(`No matching range ("${u}")`);return Mu.default.stringify(W(v({},s),{commit:h.get(f)}))}case null:{let g;if((g=l(Ti.Commit,u))!==null||(g=l(Ti.Tag,u))!==null||(g=l(Ti.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${r}#${a(i,n)}`}async function pF(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:i,request:n}}=ed(t);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=$p(r,{git:!0});if(Mt.getNetworkSettings(`https://${(0,uF.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await M.mktempPromise(),a={cwd:o,env:$re(),strict:!0};try{await Hr.execvp("git",["clone","-c core.autocrlf=false",s,L.fromPortablePath(o)],a),await Hr.execvp("git",["checkout",`${n}`],a)}catch(l){throw l.message=`Repository clone failed: ${l.message}`,l}return o})}var dF=class{supports(e,r){return Lu(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,n=hF(e),s=new Map(r.checksums);s.set(n.locatorHash,i);let o=W(v({},r),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:l,releaseFs:c,prefixPath:b.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,r){return r.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let i=await pF(e.reference,r.project.configuration),n=ed(e.reference),s=D.join(i,"package.tgz");await kt.prepareExternalProject(i,s,{configuration:r.project.configuration,report:r.report,workspace:n.extra.workspace,locator:e});let o=await M.readFilePromise(s);return await fe.releaseAfterUseAsync(async()=>await Nr.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:b.getIdentVendorPath(e),stripComponents:1}))}};var CF=class{supportsDescriptor(e,r){return Lu(e.range)}supportsLocator(e,r){return Lu(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=await fF(e.range,i.project.configuration);return[b.makeLocator(e,n)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await fe.releaseAfterUseAsync(async()=>await Je.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return W(v({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:lt.HARD,dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var xGe={configuration:{cloneConcurrency:{description:"Maximal number of concurrent clones",type:ge.NUMBER,default:2}},fetchers:[dF],resolvers:[CF]};var kGe=xGe;var EF={};$e(EF,{default:()=>FGe});var tie=ne(require("querystring")),rie=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function iie(t){return t?rie.some(e=>!!t.match(e)):!1}function nie(t){let e;for(let a of rie)if(e=t.match(a),e)break;if(!e)throw new Error(vGe(t));let[,r,i,n,s="master"]=e,{commit:o}=tie.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:r,username:i,reponame:n,treeish:s}}function vGe(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var IF=class{supports(e,r){return!!iie(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Mt.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await M.mktempPromise(async n=>{let s=new Dt(n);await Nr.extractArchiveTo(i,s,{stripComponents:1});let o=_p.splitRepoUrl(e.reference),a=D.join(n,"package.tgz");await kt.prepareExternalProject(n,a,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let l=await M.readFilePromise(a);return await Nr.convertToZip(l,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:b.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:i,username:n,reponame:s,treeish:o}=nie(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var PGe={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let i=new IF;if(!i.supports(e,r))return null;try{return await i.fetch(e,r)}catch(n){return null}}}},FGe=PGe;var wF={};$e(wF,{default:()=>NGe});var td=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,rd=/^https?:/;var yF=class{supports(e,r){return td.test(e.reference)?!!rd.test(e.reference):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Mt.get(e.reference,{configuration:r.project.configuration});return await Nr.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:b.getIdentVendorPath(e),stripComponents:1})}};var BF=class{supportsDescriptor(e,r){return td.test(e.range)?!!rd.test(e.range):!1}supportsLocator(e,r){return td.test(e.reference)?!!rd.test(e.reference):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[b.convertDescriptorToLocator(e)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await fe.releaseAfterUseAsync(async()=>await Je.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return W(v({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:lt.HARD,dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var RGe={fetchers:[yF],resolvers:[BF]},NGe=RGe;var SF={};$e(SF,{default:()=>MYe});var Pie=ne(vie()),DF=ne(require("util")),id=class extends ye{constructor(){super(...arguments);this.private=Y.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=Y.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=Y.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=Y.Boolean("-2",!1,{hidden:!0});this.yes=Y.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=Y.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return r!==null?await this.executeProxy(e,r):await this.executeRegular(e)}async executeProxy(e,r){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new me("Cannot use the --install flag from within a project subdirectory");M.existsSync(this.context.cwd)||await M.mkdirPromise(this.context.cwd,{recursive:!0});let i=D.join(this.context.cwd,e.get("lockfileFilename"));M.existsSync(i)||await M.writeFilePromise(i,"");let n=await this.cli.run(["set","version",r],{quiet:!0});if(n!==0)return n;this.context.stdout.write(` -`);let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await M.mktempPromise(async o=>{let{code:a}=await Hr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await kt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let r=null;try{r=(await Le.find(e,this.context.cwd)).project}catch{r=null}M.existsSync(this.context.cwd)||await M.mkdirPromise(this.context.cwd,{recursive:!0});let i=await Je.tryFind(this.context.cwd)||new Je,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:b.makeIdent(e.get("initScope"),D.basename(this.context.cwd)),i.packageManager=Qr&&fe.isTaggedYarnVersion(Qr)?`yarn@${Qr}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await M.mkdirPromise(D.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),DF.inspect.styles.name="cyan",this.context.stdout.write(`${(0,DF.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} -`);let o=D.join(this.context.cwd,Je.fileName);await M.changeFilePromise(o,`${JSON.stringify(s,null,2)} -`,{automaticNewlines:!0});let a=D.join(this.context.cwd,"README.md");if(M.existsSync(a)||await M.writeFilePromise(a,`# ${b.stringifyIdent(i.name)} -`),!r||r.cwd===this.context.cwd){let c=D.join(this.context.cwd,Et.lockfile);M.existsSync(c)||await M.writeFilePromise(c,"");let g=["/.yarn/*","!/.yarn/patches","!/.yarn/plugins","!/.yarn/releases","!/.yarn/sdks","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!/.yarn/cache","#/.pnp.*"].map(I=>`${I} -`).join(""),h=D.join(this.context.cwd,".gitignore");M.existsSync(h)||await M.writeFilePromise(h,g);let f={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,Pie.default)(f,e.get("initEditorConfig"));let p=`root = true -`;for(let[I,Q]of Object.entries(f)){p+=` -[${I}] -`;for(let[w,x]of Object.entries(Q))p+=`${w.replace(/[A-Z]/g,H=>`_${H.toLowerCase()}`)} = ${x} -`}let m=D.join(this.context.cwd,".editorconfig");M.existsSync(m)||await M.writeFilePromise(m,p),M.existsSync(D.join(this.context.cwd,".git"))||await Hr.execvp("git",["init"],{cwd:this.context.cwd})}}};id.paths=[["init"]],id.usage=Ce.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var Fie=id;var NYe={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:ge.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}}},commands:[Fie]},MYe=NYe;var FF={};$e(FF,{default:()=>TYe});var So="portal:",xo="link:";var xF=class{supports(e,r){return!!e.reference.startsWith(So)}getLocalPath(e,r){let{parentLocator:i,path:n}=b.parseFileStyleRange(e.reference,{protocol:So});if(D.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:D.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=b.parseFileStyleRange(e.reference,{protocol:So}),s=D.isAbsolute(n)?{packageFs:new Dt(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Dt(Se.root),prefixPath:D.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=D.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Dt(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,localPath:l}:{packageFs:new Ys(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot}}};var kF=class{supportsDescriptor(e,r){return!!e.range.startsWith(So)}supportsLocator(e,r){return!!e.reference.startsWith(So)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return b.bindDescriptor(e,{locator:b.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(So.length);return[b.makeLocator(e,`${So}${L.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await fe.releaseAfterUseAsync(async()=>await Je.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return W(v({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:lt.SOFT,dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var vF=class{supports(e,r){return!!e.reference.startsWith(xo)}getLocalPath(e,r){let{parentLocator:i,path:n}=b.parseFileStyleRange(e.reference,{protocol:xo});if(D.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:D.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=b.parseFileStyleRange(e.reference,{protocol:xo}),s=D.isAbsolute(n)?{packageFs:new Dt(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Dt(Se.root),prefixPath:D.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=D.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Dt(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0,localPath:l}:{packageFs:new Ys(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0}}};var PF=class{supportsDescriptor(e,r){return!!e.range.startsWith(xo)}supportsLocator(e,r){return!!e.reference.startsWith(xo)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return b.bindDescriptor(e,{locator:b.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(xo.length);return[b.makeLocator(e,`${xo}${L.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){return W(v({},e),{version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:lt.SOFT,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var LYe={fetchers:[vF,xF],resolvers:[PF,kF]},TYe=LYe;var sR={};$e(sR,{default:()=>Hqe});var ko;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(ko||(ko={}));var RF=(t,e)=>`${t}@${e}`,Rie=(t,e)=>{let r=e.indexOf("#"),i=r>=0?e.substring(r+1):e;return RF(t,i)},$i;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})($i||($i={}));var Mie=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||r>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:r,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=OYe(t,s),l=!1,c=0;do l=NF(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=nd(a);if(NF(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: -${u}, next tree: -${nd(a)}`);let h=Nie(a);if(h)throw new Error(`${h}, after hoisting finished: -${nd(a)}`)}return s.debugLevel>=2&&console.log(nd(a)),KYe(a)},UYe=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())r.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),r},HYe=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of t)u=g.dependencies.get(c.name),u&&r.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),r},Lie=(t,e)=>{if(e.decoupled)return e;let{name:r,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:h}=e,f={name:r,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:h,hoistedFrom:[]},p=f.dependencies.get(r);return p&&p.ident==f.ident&&f.dependencies.set(r,f),t.dependencies.set(f.name,f),f},GYe=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let n of t.dependencies.values())t.peerNames.has(n.name)||r.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!t.peerNames.has(s)){let a=r.get(s);a||(a=[],r.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return r},MF=t=>{let e=new Set,r=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!t.peerNames.has(s)){let o=t.dependencies.get(s);o&&!e.has(o)&&r(o,n)}e.add(i)}};for(let i of t.dependencies.values())t.peerNames.has(i.name)||r(i);return e},NF=(t,e,r,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=qYe(o),l=GYe(o,a),c=t==o?new Map:n.fastLookupPossible?UYe(e):HYe(e),u,g=!1,h=!1,f=new Map(Array.from(l.entries()).map(([m,I])=>[m,I[0]])),p=new Map;do{let m=YYe(t,e,r,c,f,l,i,p,n);m.isGraphChanged&&(h=!0),m.anotherRoundNeeded&&(g=!0),u=!1;for(let[I,Q]of l)Q.length>1&&!o.dependencies.has(I)&&(f.delete(I),Q.shift(),f.set(I,Q[0]),u=!0)}while(u);for(let m of o.dependencies.values())if(!o.peerNames.has(m.name)&&!r.has(m.locator)){r.add(m.locator);let I=NF(t,[...e,m],r,p,n);I.isGraphChanged&&(h=!0),I.anotherRoundNeeded&&(g=!0),r.delete(m.locator)}return{anotherRoundNeeded:g,isGraphChanged:h}},jYe=(t,e,r,i,n,s,o,a,{outputReason:l})=>{let c,u=null,g=new Set;l&&(c=`${Array.from(e).map(m=>Oi(m)).join("\u2192")}`);let h=r[r.length-1],p=!(i.ident===h.ident);if(l&&!p&&(u="- self-reference"),p&&(p=!t.peerNames.has(i.name),l&&!p&&(u=`- cannot shadow peer: ${Oi(t.originalDependencies.get(i.name).locator)} at ${c}`)),p){let m=!1,I=n.get(i.name);if(m=!I||I.ident===i.ident,l&&!m&&(u=`- filled by: ${Oi(I.locator)} at ${c}`),m)for(let Q=r.length-1;Q>=1;Q--){let x=r[Q].dependencies.get(i.name);if(x&&x.ident!==i.ident){m=!1;let N=a.get(h);N||(N=new Set,a.set(h,N)),N.add(i.name),l&&(u=`- filled by ${Oi(x.locator)} at ${r.slice(0,Q).map(H=>Oi(H.locator)).join("\u2192")}`);break}}p=m}if(p&&(p=s.get(i.name)===i.ident,l&&!p&&(u=`- filled by: ${Oi(o.get(i.name)[0])} at ${c}`)),p){let m=!0,I=new Set(i.peerNames);for(let Q=r.length-1;Q>=1;Q--){let w=r[Q];for(let x of I){if(w.peerNames.has(x)&&w.originalDependencies.has(x))continue;let N=w.dependencies.get(x);N&&t.dependencies.get(x)!==N&&(Q===r.length-1?g.add(N):(g=null,m=!1,l&&(u=`- peer dependency ${Oi(N.locator)} from parent ${Oi(w.locator)} was not hoisted to ${c}`))),I.delete(x)}if(!m)break}p=m}return g!==null&&g.size>0?{isHoistable:2,dependsOn:g,reason:u}:{isHoistable:p?0:1,reason:u}},YYe=(t,e,r,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,h=!1,f=(I,Q,w,x)=>{if(u.has(w))return;let N=[...Q,w.locator],H=new Map,T=new Map;for(let j of MF(w)){let A=jYe(c,r,[c,...I,w],j,i,n,s,a,{outputReason:l.debugLevel>=2});if(T.set(j,A),A.isHoistable===2)for(let ee of A.dependsOn){let $=H.get(ee.name)||new Set;$.add(j.name),H.set(ee.name,$)}}let P=new Set,G=(j,A,ee)=>{if(!P.has(j)){P.add(j),T.set(j,{isHoistable:1,reason:ee});for(let $ of H.get(j.name)||[])G(w.dependencies.get($),A,l.debugLevel>=2?`- peer dependency ${Oi(j.locator)} from parent ${Oi(w.locator)} was not hoisted`:"")}};for(let[j,A]of T)A.isHoistable===1&&G(j,A,A.reason);for(let j of T.keys())if(!P.has(j)){h=!0;let A=o.get(w);A&&A.has(j.name)&&(g=!0),w.dependencies.delete(j.name),w.hoistedDependencies.set(j.name,j),w.reasons.delete(j.name);let ee=c.dependencies.get(j.name),$=null;if(l.debugLevel>=2&&($=Array.from(Q).concat([w.locator]).map(_=>Oi(_)).join("\u2192")),!ee)c.ident!==j.ident&&(c.dependencies.set(j.name,j),l.debugLevel>=2&&j.hoistedFrom.push($),x.add(j));else for(let _ of j.references)ee.references.add(_),l.debugLevel>=2&&ee.hoistedFrom.push($)}if(l.check){let j=Nie(t);if(j)throw new Error(`${j}, after hoisting dependencies of ${[c,...I,w].map(A=>Oi(A.locator)).join("\u2192")}: -${nd(t)}`)}let te=MF(w);for(let j of te)if(P.has(j)){let A=T.get(j);if((n.get(j.name)===j.ident||!w.reasons.has(j.name))&&A.isHoistable!==0&&w.reasons.set(j.name,A.reason),!j.isHoistBorder&&N.indexOf(j.locator)<0){u.add(w);let $=Lie(w,j);f([...I,w],[...Q,w.locator],$,m),u.delete(w)}}},p,m=new Set(MF(c));do{p=m,m=new Set;for(let I of p){if(I.locator===c.locator||I.isHoistBorder)continue;let Q=Lie(c,I);f([],Array.from(r),Q,m)}}while(m.size>0);return{anotherRoundNeeded:g,isGraphChanged:h}},Nie=t=>{let e=[],r=new Set,i=new Set,n=(s,o)=>{if(r.has(s)||(r.add(s),i.has(s)))return;let a=new Map(o);for(let l of s.dependencies.values())s.peerNames.has(l.name)||a.set(l.name,l);for(let l of s.originalDependencies.values()){let c=a.get(l.name),u=()=>`${Array.from(i).concat([s]).map(g=>Oi(g.locator)).join("\u2192")}`;if(s.peerNames.has(l.name)){let g=o.get(l.name);(g!==c||!g||g.ident!==l.ident)&&e.push(`${u()} - broken peer promise: expected ${l.ident} but found ${g&&g.ident}`)}else c?c.ident!==l.ident&&e.push(`${u()} - broken require promise for ${l.name}: expected ${l.ident}, but found: ${c.ident}`):e.push(`${u()} - broken require promise: no required dependency ${l.locator} found`)}i.add(s);for(let l of s.dependencies.values())s.peerNames.has(l.name)||n(l,a);i.delete(s)};return n(t,t.dependencies),e.join(` -`)},OYe=(t,e)=>{let{identName:r,name:i,reference:n,peerNames:s}=t,o={name:i,references:new Set([n]),locator:RF(r,n),ident:Rie(r,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,hoistedFrom:[]},a=new Map([[t,o]]),l=(c,u)=>{let g=a.get(c),h=!!g;if(!g){let{name:f,identName:p,reference:m,peerNames:I,hoistPriority:Q}=c,w=e.hoistingLimits.get(u.locator);g={name:f,references:new Set([m]),locator:RF(p,m),ident:Rie(p,m),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(I),reasons:new Map,decoupled:!0,isHoistBorder:w?w.has(f):!1,hoistPriority:Q||0,hoistedFrom:[]},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),h){let f=new Set,p=m=>{if(!f.has(m)){f.add(m),m.decoupled=!1;for(let I of m.dependencies.values())m.peerNames.has(I.name)||p(I)}};p(g)}else for(let f of c.dependencies)l(f,g)};for(let c of t.dependencies)l(c,o);return o},LF=t=>t.substring(0,t.indexOf("@",1)),KYe=t=>{let e={name:t.name,identName:LF(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),i=(n,s,o)=>{let a=r.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:LF(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){r.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);r.delete(n)}};for(let n of t.dependencies.values())i(n,t,e);return e},qYe=t=>{let e=new Map,r=new Set([t]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!r.has(a);if(n(a).dependents.add(o.ident),!l){r.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||s(t,o);return e},Oi=t=>{let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let i=t.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(r=`v:${r}`),n.startsWith("workspace")&&(r=`w:${r}`,n=""),`${r}${n?`@${n}`:""}`}else return`${r}`},Tie=5e4,nd=t=>{let e=0,r=(n,s,o="")=>{if(e>Tie||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name.localeCompare(u.name)),l="";s.add(n);for(let c=0;c":"")+(h!==u.name?`a:${u.name}:`:"")+Oi(u.locator)+(g?` ${g}`:"")+(u!==n&&u.hoistedFrom.length>0?`, hoisted from: ${u.hoistedFrom.join(", ")}`:"")} -`,l+=r(u,s,`${o}${cTie?` -Tree is too large, part of the tree has been dunped -`:"")};var Tu;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Tu||(Tu={}));var Ki;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Ki||(Ki={}));var Oie="node_modules",BB="$wsroot$";var sd=(t,e)=>{let{packageTree:r,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=JYe(t,e),o=null;if(n.length===0){let a=Mie(r,{hoistingLimits:i});o=WYe(t,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},xs=t=>`${t.name}@${t.reference}`,TF=t=>{let e=new Map;for(let[r,i]of t.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((i,n)=>{let s=i.split(D.delimiter).length,o=n.split(D.delimiter).length;return s!==o?o-s:n.localeCompare(i)});return e},Kie=(t,e)=>{let r=b.isVirtualLocator(t)?b.devirtualizeLocator(t):t,i=b.isVirtualLocator(e)?b.devirtualizeLocator(e):e;return b.areLocatorsEqual(r,i)},JYe=(t,e)=>{let r=t.getDependencyTreeRoots(),i=[],n=!1,s=new Map,o=new Map,a=t.getPackageInformation(t.topLevel);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let l=t.findPackageLocator(a.packageLocation);if(l===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let c=L.toPortablePath(a.packageLocation),u=xs(l);if(e.project){let I={children:new Map},Q=e.project.cwd.split(D.sep);for(let[x,N]of e.project.workspacesByCwd){let H=x.split(D.sep).slice(Q.length),T=I;for(let P of H){let G=T.children.get(P);G||(G={children:new Map},T.children.set(P,G)),T=G}T.workspaceLocator={name:b.stringifyIdent(N.anchoredLocator),reference:N.anchoredLocator.reference}}let w=(x,N)=>{if(x.workspaceLocator){let H=xs(N),T=o.get(H);T||(T=new Set,o.set(H,T)),T.add(x.workspaceLocator)}for(let H of x.children.values())w(H,x.workspaceLocator||N)};for(let x of I.children.values())w(x,I.workspaceLocator)}else for(let I of r)if(I.name!==l.name||I.reference!==l.reference){let Q=o.get(u);Q||(Q=new Set,o.set(u,Q)),Q.add(I)}let g={name:l.name,identName:l.name,reference:l.reference,peerNames:a.packagePeers,dependencies:new Set},h=new Map,f=(I,Q)=>`${xs(Q)}:${I}`,p=(I,Q)=>{if(I.linkType!==Tu.SOFT||!e.project)return!1;let w=L.toPortablePath(t.resolveVirtual&&Q.reference&&Q.reference.startsWith("virtual:")?t.resolveVirtual(I.packageLocation):I.packageLocation);return D.contains(e.project.cwd,w)===null},m=(I,Q,w,x,N,H,T,P)=>{var F,Re;let G=f(I,w),te=h.get(G),j=!!te;!j&&w.name===l.name&&w.reference===l.reference&&(te=g,h.set(G,g)),te||(te={name:I,identName:w.name,reference:w.reference,dependencies:new Set,peerNames:Q.packagePeers},h.set(G,te));let A,ee=p(Q,w);if(ee?A=2:N.linkType===Tu.SOFT?A=1:A=0,te.hoistPriority=Math.max(te.hoistPriority||0,A),P&&!ee){let xe=xs({name:x.identName,reference:x.reference}),Ke=s.get(xe)||new Set;s.set(xe,Ke),Ke.add(te.name)}let $=new Map(Q.packageDependencies);if(e.project){let xe=e.project.workspacesByCwd.get(L.toPortablePath(Q.packageLocation.slice(0,-1)));if(xe){let Ke=new Set([...Array.from(xe.manifest.peerDependencies.values(),Me=>b.stringifyIdent(Me)),...Array.from(xe.manifest.peerDependenciesMeta.keys())]);for(let Me of Ke)$.has(Me)||($.set(Me,H.get(Me)||null),te.peerNames.add(Me))}}let _=xs(w),U=o.get(_);if(U)for(let xe of U)$.set(`${xe.name}${BB}`,xe.reference);if(x.dependencies.add(te),!j){let xe=new Map;for(let[Ke,Me]of $)if(Me!==null){let X=t.getLocator(Ke,Me),ie=t.getLocator(Ke.replace(BB,""),Me),we=t.getPackageInformation(ie);if(we===null)throw new Error("Assertion failed: Expected the package to have been registered");let he=p(we,X);if(e.validateExternalSoftLinks&&e.project&&he){we.packageDependencies.size>0&&(n=!0);for(let[z,ae]of we.packageDependencies)if(ae!==null){let ue=b.parseLocator(Array.isArray(ae)?`${ae[0]}@${ae[1]}`:`${z}@${ae}`);if(xs(ue)!==xs(X)){let be=$.get(z);if(be){let nt=b.parseLocator(Array.isArray(be)?`${be[0]}@${be[1]}`:`${z}@${be}`);Kie(nt,ue)||i.push({messageName:J.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${b.prettyIdent(e.project.configuration,b.parseIdent(X.name))} into ${b.prettyLocator(e.project.configuration,b.parseLocator(`${w.name}@${w.reference}`))} dependency ${b.prettyLocator(e.project.configuration,ue)} conflicts with parent dependency ${b.prettyLocator(e.project.configuration,nt)}`})}else{let nt=xe.get(z);if(nt){let dt=nt.target,wt=b.parseLocator(Array.isArray(dt)?`${dt[0]}@${dt[1]}`:`${z}@${dt}`);Kie(wt,ue)||i.push({messageName:J.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${b.prettyIdent(e.project.configuration,b.parseIdent(X.name))} into ${b.prettyLocator(e.project.configuration,b.parseLocator(`${w.name}@${w.reference}`))} dependency ${b.prettyLocator(e.project.configuration,ue)} conflicts with dependency ${b.prettyLocator(e.project.configuration,wt)} from sibling portal ${b.prettyIdent(e.project.configuration,b.parseIdent(nt.portal.name))}`})}else xe.set(z,{target:ue.reference,portal:X})}}}}let Ie=(F=e.hoistingLimitsByCwd)==null?void 0:F.get(T),pe=he?T:D.relative(c,L.toPortablePath(we.packageLocation))||Se.dot,Fe=(Re=e.hoistingLimitsByCwd)==null?void 0:Re.get(pe),Z=Ie===Ki.DEPENDENCIES||Fe===Ki.DEPENDENCIES||Fe===Ki.WORKSPACES;m(xs(X)===xs(w)?I:Ke,we,X,te,Q,$,pe,Z)}}};return m(l.name,a,l,g,a,a.packageDependencies,Se.dot,!1),{packageTree:g,hoistingLimits:s,errors:i,preserveSymlinksRequired:n}};function zYe(t,e,r){let i=e.getLocator(t.name.replace(BB,""),t.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;if(r.pnpifyFs)o=L.toPortablePath(n.packageLocation),s=Tu.SOFT;else{let a=e.resolveVirtual&&t.reference&&t.reference.startsWith("virtual:")?e.resolveVirtual(n.packageLocation):n.packageLocation;o=L.toPortablePath(a||n.packageLocation),s=n.linkType}return{linkType:s,target:o}}var WYe=(t,e,r)=>{let i=new Map,n=(u,g,h)=>{let{linkType:f,target:p}=zYe(u,t,r);return{locator:xs(u),nodePath:g,target:p,linkType:f,aliases:h}},s=u=>{let[g,h]=u.split("/");return h?{scope:or(g),name:or(h)}:{scope:null,name:or(g)}},o=new Set,a=(u,g,h)=>{if(!o.has(u)){o.add(u);for(let f of u.dependencies){if(f===u)continue;let p=Array.from(f.references).sort(),m={name:f.identName,reference:p[0]},{name:I,scope:Q}=s(f.name),w=Q?[Q,I]:[I],x=D.join(g,Oie),N=D.join(x,...w),H=`${h}/${m.name}`,T=n(m,h,p.slice(1));if(!f.name.endsWith(BB)){let P=i.get(N);if(P){if(P.dirList)throw new Error(`Assertion failed: ${N} cannot merge dir node with leaf node`);{let A=b.parseLocator(P.locator),ee=b.parseLocator(T.locator);if(P.linkType!==T.linkType)throw new Error(`Assertion failed: ${N} cannot merge nodes with different link types ${P.nodePath}/${b.stringifyLocator(A)} and ${h}/${b.stringifyLocator(ee)}`);if(A.identHash!==ee.identHash)throw new Error(`Assertion failed: ${N} cannot merge nodes with different idents ${P.nodePath}/${b.stringifyLocator(A)} and ${h}/s${b.stringifyLocator(ee)}`);T.aliases=[...T.aliases,...P.aliases,b.parseLocator(P.locator).reference]}}i.set(N,T);let G=N.split("/"),te=G.indexOf(Oie),j=G.length-1;for(;te>=0&&j>te;){let A=L.toPortablePath(G.slice(0,j).join(D.sep)),ee=or(G[j]),$=i.get(A);if(!$)i.set(A,{dirList:new Set([ee])});else if($.dirList){if($.dirList.has(ee))break;$.dirList.add(ee)}j--}}a(f,T.linkType===Tu.SOFT?T.target:N,H)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var WF={};$e(WF,{PnpInstaller:()=>Uu,PnpLinker:()=>El,default:()=>pqe,getPnpPath:()=>ka,jsInstallUtils:()=>Wn,pnpUtils:()=>jF,quotePathIfNeeded:()=>one});var sne=ne(pr());var Uie;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Uie||(Uie={}));var Pt;(function(h){h.DEFAULT="DEFAULT",h.TOP_LEVEL="TOP_LEVEL",h.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",h.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",h.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",h.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",h.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",h.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",h.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",h.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",h.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",h.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(Pt||(Pt={}));var Hie={[Pt.DEFAULT]:{collapsed:!1,next:{["*"]:Pt.DEFAULT}},[Pt.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:Pt.FALLBACK_EXCLUSION_LIST,packageRegistryData:Pt.PACKAGE_REGISTRY_DATA,["*"]:Pt.DEFAULT}},[Pt.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:Pt.FALLBACK_EXCLUSION_ENTRIES}},[Pt.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:Pt.FALLBACK_EXCLUSION_DATA}},[Pt.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:Pt.DEFAULT}},[Pt.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:Pt.PACKAGE_REGISTRY_ENTRIES}},[Pt.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:Pt.PACKAGE_STORE_DATA}},[Pt.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:Pt.PACKAGE_STORE_ENTRIES}},[Pt.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:Pt.PACKAGE_INFORMATION_DATA}},[Pt.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:Pt.PACKAGE_DEPENDENCIES,["*"]:Pt.DEFAULT}},[Pt.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:Pt.PACKAGE_DEPENDENCY}},[Pt.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:Pt.DEFAULT}}};function VYe(t,e,r){let i="";i+="[";for(let n=0,s=t.length;ns(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function $Ye(t){let e=new Map,r=od(t.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of r){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function eqe(t){return od(t.fallbackPool||[],([e])=>e)}function tqe(t){let e=[];for(let[r,i]of od(t.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([r,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of od(i,([g])=>g===null?"0":`1${g}`)){let g=[];r!==null&&s!==null&&!a.has(r)&&g.push([r,s]);for(let[p,m]of od(a.entries(),([I])=>I))g.push([p,m]);let h=l&&l.size>0?Array.from(l):void 0,f=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:h,linkType:c,discardFromLookup:f}])}}return e}function ad(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:$Ye(t),fallbackPool:eqe(t),packageRegistryData:tqe(t)}}var Jie=ne(jie());function Wie(t,e){return[t?`${t} -`:"",`/* eslint-disable */ - -`,`try { -`,` Object.freeze({}).detectStrictMode = true; -`,`} catch (error) { -`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} -`,` -`,`var __non_webpack_module__ = module; -`,` -`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { -`,e.replace(/^/gm," "),`} -`,` -`,(0,Jie.default)()].join("")}function rqe(t){return JSON.stringify(t,null,2)}function iqe(t){return[`return hydrateRuntimeState(${Yie(t)}, {basePath: basePath || __dirname}); -`].join("")}function nqe(t){return[`var path = require('path'); -`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(t)}); -`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); -`].join("")}function zie(t){let e=ad(t),r=iqe(e);return Wie(t.shebang,r)}function Vie(t){let e=ad(t),r=nqe(t.dataLocation),i=Wie(t.shebang,r);return{dataFile:rqe(e),loaderFile:i}}var $ie=ne(require("fs")),Aqe=ne(require("path")),ene=ne(require("util"));function KF(t,{basePath:e}){let r=L.toPortablePath(e),i=D.resolve(r),n=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,s=new Map,o=new Map(t.packageRegistryData.map(([g,h])=>[g,new Map(h.map(([f,p])=>{var x;if(g===null!=(f===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let m=(x=p.discardFromLookup)!=null?x:!1,I={name:g,reference:f},Q=s.get(p.packageLocation);Q?(Q.discardFromLookup=Q.discardFromLookup&&m,m||(Q.locator=I)):s.set(p.packageLocation,{locator:I,discardFromLookup:m});let w=null;return[f,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:m,get packageLocation(){return w||(w=D.join(i,p.packageLocation))}}]}))])),a=new Map(t.fallbackExclusionList.map(([g,h])=>[g,new Set(h)])),l=new Map(t.fallbackPool),c=t.dependencyTreeRoots,u=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var Ku=ne(require("module")),_ie=ne(Zie()),HF=ne(require("util"));var Jt;(function(l){l.API_ERROR="API_ERROR",l.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",l.MISSING_DEPENDENCY="MISSING_DEPENDENCY",l.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",l.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",l.INTERNAL="INTERNAL",l.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",l.UNSUPPORTED="UNSUPPORTED"})(Jt||(Jt={}));var aqe=new Set([Jt.BUILTIN_NODE_RESOLUTION_FAILED,Jt.MISSING_DEPENDENCY,Jt.MISSING_PEER_DEPENDENCY,Jt.QUALIFIED_PATH_RESOLUTION_FAILED,Jt.UNDECLARED_DEPENDENCY]);function Tr(t,e,r={}){let i=aqe.has(t)?"MODULE_NOT_FOUND":t,n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:W(v({},n),{value:i}),pnpCode:W(v({},n),{value:t}),data:W(v({},n),{value:r})})}function xa(t){return L.normalize(L.fromPortablePath(t))}function GF(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=new Set(Ku.Module.builtinModules||Object.keys(process.binding("natives"))),s=X=>n.has(X)||X.startsWith("node:"),o=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,a=/^(\/|\.{1,2}(\/|$))/,l=/\/$/,c=/^\.{0,2}\//,u={name:null,reference:null},g=[],h=new Set;if(t.enableTopLevelFallback===!0&&g.push(u),e.compatibilityMode!==!1)for(let X of["react-scripts","gatsby"]){let ie=t.packageRegistry.get(X);if(ie)for(let we of ie.keys()){if(we===null)throw new Error("Assertion failed: This reference shouldn't be null");g.push({name:X,reference:we})}}let{ignorePattern:f,packageRegistry:p,packageLocatorsByLocations:m}=t;function I(X,ie){return{fn:X,args:ie,error:null,result:null}}function Q(X){var pe,Fe,Z,z,ae,ue;let ie=(Z=(Fe=(pe=process.stderr)==null?void 0:pe.hasColors)==null?void 0:Fe.call(pe))!=null?Z:process.stdout.isTTY,we=(be,nt)=>`[${be}m${nt}`,he=X.error;console.error(he?we("31;1",`\u2716 ${(z=X.error)==null?void 0:z.message.replace(/\n.*/s,"")}`):we("33;1","\u203C Resolution")),X.args.length>0&&console.error();for(let be of X.args)console.error(` ${we("37;1","In \u2190")} ${(0,HF.inspect)(be,{colors:ie,compact:!0})}`);X.result&&(console.error(),console.error(` ${we("37;1","Out \u2192")} ${(0,HF.inspect)(X.result,{colors:ie,compact:!0})}`));let Ie=(ue=(ae=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:ae.slice(2))!=null?ue:[];if(Ie.length>0){console.error();for(let be of Ie)console.error(` ${we("38;5;244",be)}`)}console.error()}function w(X,ie){if(e.allowDebug===!1)return ie;if(Number.isFinite(i)){if(i>=2)return(...we)=>{let he=I(X,we);try{return he.result=ie(...we)}catch(Ie){throw he.error=Ie}finally{Q(he)}};if(i>=1)return(...we)=>{try{return ie(...we)}catch(he){let Ie=I(X,we);throw Ie.error=he,Q(Ie),he}}}return ie}function x(X){let ie=ee(X);if(!ie)throw Tr(Jt.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return ie}function N(X){if(X.name===null)return!0;for(let ie of t.dependencyTreeRoots)if(ie.name===X.name&&ie.reference===X.reference)return!0;return!1}function H(X){let ie=U(D.join(X,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(ie===null)throw Tr(Jt.INTERNAL,`The locator that owns the "${X}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:we}=x(ie),he=D.join(we,Et.manifest);if(!e.fakeFs.existsSync(he))return null;let Ie=JSON.parse(e.fakeFs.readFileSync(he,"utf8")),pe=D.contains(we,X);if(pe===null)throw Tr(Jt.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");c.test(pe)||(pe=`./${pe}`);let Fe=(0,_ie.resolve)(Ie,D.normalize(pe),{browser:!1,require:!0,conditions:[]});return typeof Fe=="string"?D.join(we,Fe):null}function T(X,ie,{extensions:we}){let he;try{ie.push(X),he=e.fakeFs.statSync(X)}catch(Ie){}if(he&&!he.isDirectory())return e.fakeFs.realpathSync(X);if(he&&he.isDirectory()){let Ie;try{Ie=JSON.parse(e.fakeFs.readFileSync(D.join(X,Et.manifest),"utf8"))}catch(Fe){}let pe;if(Ie&&Ie.main&&(pe=D.resolve(X,Ie.main)),pe&&pe!==X){let Fe=T(pe,ie,{extensions:we});if(Fe!==null)return Fe}}for(let Ie=0,pe=we.length;Ie{let Z=JSON.stringify(Fe.name);if(he.has(Z))return;he.add(Z);let z=$(Fe);for(let ae of z)if(x(ae).packagePeers.has(X))Ie(ae);else{let be=we.get(ae.name);typeof be=="undefined"&&we.set(ae.name,be=new Set),be.add(ae.reference)}};Ie(ie);let pe=[];for(let Fe of[...we.keys()].sort())for(let Z of[...we.get(Fe)].sort())pe.push({name:Fe,reference:Z});return pe}function U(X,{resolveIgnored:ie=!1,includeDiscardFromLookup:we=!1}={}){if(te(X)&&!ie)return null;let he=D.relative(t.basePath,X);he.match(a)||(he=`./${he}`),he.endsWith("/")||(he=`${he}/`);do{let Ie=m.get(he);if(typeof Ie=="undefined"||Ie.discardFromLookup&&!we){he=he.substring(0,he.lastIndexOf("/",he.length-2)+1);continue}return Ie.locator}while(he!=="");return null}function F(X,ie,{considerBuiltins:we=!0}={}){if(X==="pnpapi")return L.toPortablePath(e.pnpapiResolution);if(we&&s(X))return null;let he=xa(X),Ie=ie&&xa(ie);if(ie&&te(ie)&&(!D.isAbsolute(X)||U(X)===null)){let Z=G(X,ie);if(Z===!1)throw Tr(Jt.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) - -Require request: "${he}" -Required by: ${Ie} -`,{request:he,issuer:Ie});return L.toPortablePath(Z)}let pe,Fe=X.match(o);if(Fe){if(!ie)throw Tr(Jt.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Ie});let[,Z,z]=Fe,ae=U(ie);if(!ae){let _t=G(X,ie);if(_t===!1)throw Tr(Jt.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). - -Require path: "${he}" -Required by: ${Ie} -`,{request:he,issuer:Ie});return L.toPortablePath(_t)}let be=x(ae).packageDependencies.get(Z),nt=null;if(be==null&&ae.name!==null){let _t=t.fallbackExclusionList.get(ae.name);if(!_t||!_t.has(ae.reference)){for(let _n=0,ng=g.length;_nN(tn))?dt=Tr(Jt.MISSING_PEER_DEPENDENCY,`${ae.name} tried to access ${Z} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. - -Required package: ${Z}${Z!==he?` (via "${he}")`:""} -Required by: ${ae.name}@${ae.reference} (via ${Ie}) -${_t.map(tn=>`Ancestor breaking the chain: ${tn.name}@${tn.reference} -`).join("")} -`,{request:he,issuer:Ie,issuerLocator:Object.assign({},ae),dependencyName:Z,brokenAncestors:_t}):dt=Tr(Jt.MISSING_PEER_DEPENDENCY,`${ae.name} tried to access ${Z} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. - -Required package: ${Z}${Z!==he?` (via "${he}")`:""} -Required by: ${ae.name}@${ae.reference} (via ${Ie}) - -${_t.map(tn=>`Ancestor breaking the chain: ${tn.name}@${tn.reference} -`).join("")} -`,{request:he,issuer:Ie,issuerLocator:Object.assign({},ae),dependencyName:Z,brokenAncestors:_t})}else be===void 0&&(!we&&s(X)?N(ae)?dt=Tr(Jt.UNDECLARED_DEPENDENCY,`Your application tried to access ${Z}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Z} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. - -Required package: ${Z}${Z!==he?` (via "${he}")`:""} -Required by: ${Ie} -`,{request:he,issuer:Ie,dependencyName:Z}):dt=Tr(Jt.UNDECLARED_DEPENDENCY,`${ae.name} tried to access ${Z}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${Z} isn't otherwise declared in ${ae.name}'s dependencies, this makes the require call ambiguous and unsound. - -Required package: ${Z}${Z!==he?` (via "${he}")`:""} -Required by: ${Ie} -`,{request:he,issuer:Ie,issuerLocator:Object.assign({},ae),dependencyName:Z}):N(ae)?dt=Tr(Jt.UNDECLARED_DEPENDENCY,`Your application tried to access ${Z}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. - -Required package: ${Z}${Z!==he?` (via "${he}")`:""} -Required by: ${Ie} -`,{request:he,issuer:Ie,dependencyName:Z}):dt=Tr(Jt.UNDECLARED_DEPENDENCY,`${ae.name} tried to access ${Z}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. - -Required package: ${Z}${Z!==he?` (via "${he}")`:""} -Required by: ${ae.name}@${ae.reference} (via ${Ie}) -`,{request:he,issuer:Ie,issuerLocator:Object.assign({},ae),dependencyName:Z}));if(be==null){if(nt===null||dt===null)throw dt||new Error("Assertion failed: Expected an error to have been set");be=nt;let _t=dt.message.replace(/\n.*/g,"");dt.message=_t,!h.has(_t)&&i!==0&&(h.add(_t),process.emitWarning(dt))}let wt=Array.isArray(be)?{name:be[0],reference:be[1]}:{name:Z,reference:be},kn=x(wt);if(!kn.packageLocation)throw Tr(Jt.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. - -Required package: ${wt.name}@${wt.reference}${wt.name!==he?` (via "${he}")`:""} -Required by: ${ae.name}@${ae.reference} (via ${Ie}) -`,{request:he,issuer:Ie,dependencyLocator:Object.assign({},wt)});let wi=kn.packageLocation;z?pe=D.join(wi,z):pe=wi}else if(D.isAbsolute(X))pe=D.normalize(X);else{if(!ie)throw Tr(Jt.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:he,issuer:Ie});let Z=D.resolve(ie);ie.match(l)?pe=D.normalize(D.join(Z,X)):pe=D.normalize(D.join(D.dirname(Z),X))}return D.normalize(pe)}function Re(X,ie){if(a.test(X))return ie;let we=H(ie);return we?D.normalize(we):ie}function xe(X,{extensions:ie=Object.keys(Ku.Module._extensions)}={}){let we=[],he=T(X,we,{extensions:ie});if(he)return D.normalize(he);{let Ie=xa(X),pe=U(X);if(pe){let{packageLocation:Fe}=x(pe);if(!e.fakeFs.existsSync(Fe)){let Z=Fe.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw Tr(Jt.QUALIFIED_PATH_RESOLUTION_FAILED,`${Z} - -Missing package: ${pe.name}@${pe.reference} -Expected package location: ${xa(Fe)} -`,{unqualifiedPath:Ie})}}throw Tr(Jt.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed - none of those files can be found on the disk. - -Source path: ${Ie} -${we.map(Fe=>`Not found: ${xa(Fe)} -`).join("")}`,{unqualifiedPath:Ie})}}function Ke(X,ie,{considerBuiltins:we,extensions:he}={}){let Ie=F(X,ie,{considerBuiltins:we});if(Ie===null)return null;let pe=()=>ie!==null?te(ie):!1,Fe=(!we||!s(X))&&!pe()?Re(X,Ie):Ie;try{return xe(Fe,{extensions:he})}catch(Z){throw Z.pnpCode==="QUALIFIED_PATH_RESOLUTION_FAILED"&&Object.assign(Z.data,{request:xa(X),issuer:ie&&xa(ie)}),Z}}function Me(X){let ie=D.normalize(X),we=ar.resolveVirtual(ie);return we!==ie?we:null}return{VERSIONS:j,topLevel:A,getLocator:(X,ie)=>Array.isArray(ie)?{name:ie[0],reference:ie[1]}:{name:X,reference:ie},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let X=[];for(let[ie,we]of p)for(let he of we.keys())ie!==null&&he!==null&&X.push({name:ie,reference:he});return X},getPackageInformation:X=>{let ie=ee(X);if(ie===null)return null;let we=L.fromPortablePath(ie.packageLocation);return W(v({},ie),{packageLocation:we})},findPackageLocator:X=>U(L.toPortablePath(X)),resolveToUnqualified:w("resolveToUnqualified",(X,ie,we)=>{let he=ie!==null?L.toPortablePath(ie):null,Ie=F(L.toPortablePath(X),he,we);return Ie===null?null:L.fromPortablePath(Ie)}),resolveUnqualified:w("resolveUnqualified",(X,ie)=>L.fromPortablePath(xe(L.toPortablePath(X),ie))),resolveRequest:w("resolveRequest",(X,ie,we)=>{let he=ie!==null?L.toPortablePath(ie):null,Ie=Ke(L.toPortablePath(X),he,we);return Ie===null?null:L.fromPortablePath(Ie)}),resolveVirtual:w("resolveVirtual",X=>{let ie=Me(L.toPortablePath(X));return ie!==null?L.fromPortablePath(ie):null})}}var Bmt=(0,ene.promisify)($ie.readFile);var tne=(t,e,r)=>{let i=ad(t),n=KF(i,{basePath:e}),s=L.join(e,Et.pnpCjs);return GF(n,{fakeFs:r,pnpapiResolution:s})};var Wn={};$e(Wn,{checkAndReportManifestCompatibility:()=>rne,extractBuildScripts:()=>QB,getExtractHint:()=>YF,hasBindingGyp:()=>qF});function rne(t,e,r,{configuration:i,report:n}){return Je.isManifestFieldCompatible(e.manifest.os,process.platform)?Je.isManifestFieldCompatible(e.manifest.cpu,process.arch)?!0:(n==null||n.reportWarningOnce(J.INCOMPATIBLE_CPU,`${b.prettyLocator(i,t)} The CPU architecture ${process.arch} is incompatible with this module, ${r} skipped.`),!1):(n==null||n.reportWarningOnce(J.INCOMPATIBLE_OS,`${b.prettyLocator(i,t)} The platform ${process.platform} is incompatible with this module, ${r} skipped.`),!1)}function QB(t,e,r,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([_i.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([_i.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:t.linkType!==lt.HARD?(n==null||n.reportWarningOnce(J.SOFT_LINK_BUILD,`${b.prettyLocator(i,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):r&&r.built===!1?(n==null||n.reportInfoOnce(J.BUILD_DISABLED,`${b.prettyLocator(i,t)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!r.built?(n==null||n.reportWarningOnce(J.DISABLED_BUILD_SCRIPTS,`${b.prettyLocator(i,t)} lists build scripts, but all build scripts have been disabled.`),[]):rne(t,e,"build",{configuration:i,report:n})?s:[]}var lqe=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function YF(t){return t.packageFs.getExtractHint({relevantExtensions:lqe})}function qF(t){let e=D.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var jF={};$e(jF,{getUnpluggedPath:()=>Ad});function Ad(t,{configuration:e}){return D.resolve(e.get("pnpUnpluggedFolder"),b.slugifyLocator(t))}var cqe=new Set([b.makeIdent(null,"nan").identHash,b.makeIdent(null,"node-gyp").identHash,b.makeIdent(null,"node-pre-gyp").identHash,b.makeIdent(null,"node-addon-api").identHash,b.makeIdent(null,"fsevents").identHash]),El=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,r){return!(r.project.configuration.get("nodeLinker")!=="pnp"||r.project.configuration.get("pnpMode")!==this.mode)}async findPackageLocation(e,r){let i=ka(r.project).cjs;if(!M.existsSync(i))throw new me(`The project in ${Ae.pretty(r.project.configuration,`${r.project.cwd}/package.json`,Ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=fe.getFactoryWithDefault(this.pnpCache,i,()=>fe.dynamicRequire(i,{cachingStrategy:fe.CachingStrategy.FsTime})),s={name:b.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new me(`Couldn't find ${b.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return L.toPortablePath(o.packageLocation)}async findPackageLocator(e,r){let i=ka(r.project).cjs;if(!M.existsSync(i))return null;let s=fe.getFactoryWithDefault(this.pnpCache,i,()=>fe.dynamicRequire(i,{cachingStrategy:fe.CachingStrategy.FsTime})).findPackageLocator(L.fromPortablePath(e));return s?b.makeLocator(b.parseIdent(s.name),s.reference):null}makeInstaller(e){return new Uu(e)}},Uu=class{constructor(e){this.opts=e;this.mode="strict";this.packageRegistry=new Map;this.virtualTemplates=new Map;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,r){let i=b.stringifyIdent(e),n=e.reference,s=!!this.opts.project.tryWorkspaceByLocator(e),o=b.isVirtualLocator(e),a=e.peerDependencies.size>0&&!o,l=!a&&!s,c=!a&&e.linkType!==lt.SOFT,u,g;if(l||c){let w=o?b.devirtualizeLocator(e):e;u=this.customData.store.get(w.locatorHash),typeof u=="undefined"&&(u=await uqe(r),e.linkType===lt.HARD&&this.customData.store.set(w.locatorHash,u)),g=this.opts.project.getDependencyMeta(w,e.version)}let h=l?QB(e,u,g,{configuration:this.opts.project.configuration,report:this.opts.report}):[],f=c?await this.unplugPackageIfNeeded(e,u,r,g):r.packageFs;if(D.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let p=D.resolve(f.getRealPath(),r.prefixPath),m=JF(this.opts.project.cwd,p),I=new Map,Q=new Set;if(o){for(let w of e.peerDependencies.values())I.set(b.stringifyIdent(w),null),Q.add(b.stringifyIdent(w));if(!s){let w=b.devirtualizeLocator(e);this.virtualTemplates.set(w.locatorHash,{location:JF(this.opts.project.cwd,ar.resolveVirtual(p)),locator:w})}}return fe.getMapWithDefault(this.packageRegistry,i).set(n,{packageLocation:m,packageDependencies:I,packagePeers:Q,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:p,buildDirective:h.length>0?h:null}}async attachInternalDependencies(e,r){let i=this.getPackageInformation(e);for(let[n,s]of r){let o=b.areIdentsEqual(n,s)?s.reference:[b.stringifyIdent(s),s.reference];i.packageDependencies.set(b.stringifyIdent(n),o)}}async attachExternalDependents(e,r){for(let i of r)this.getDiskInformation(i).packageDependencies.set(b.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=ka(this.opts.project);if(M.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(J.UNNAMED,`Removing the old ${Ae.pretty(this.opts.project.configuration,Et.pnpJs,Ae.Type.PATH)} file. You might need to manually update existing references to reference the new ${Ae.pretty(this.opts.project.configuration,Et.pnpCjs,Ae.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${Ae.pretty(this.opts.project.configuration,"yarn sdks",Ae.Type.CODE)}.`),await M.removePromise(e.cjsLegacy)),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await M.removePromise(e.cjs),await M.removePromise(this.opts.project.configuration.get("pnpDataPath"));return}for(let{locator:u,location:g}of this.virtualTemplates.values())fe.getMapWithDefault(this.packageRegistry,b.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:lt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:b.stringifyIdent(u),reference:u.reference})),n=r!=="none",s=[],o=new Map,a=fe.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:b.stringifyIdent(u),reference:u.reference});return await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}async finalizeInstallWithPnp(e){let r=ka(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(J.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await M.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=zie(e);await M.changeFilePromise(r.cjs,o,{automaticNewlines:!0,mode:493}),await M.removePromise(i)}else{let o=D.relative(D.dirname(r.cjs),i),{dataFile:a,loaderFile:l}=Vie(W(v({},e),{dataLocation:o}));await M.changeFilePromise(r.cjs,l,{automaticNewlines:!0,mode:493}),await M.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await M.removePromise(s);else for(let o of await M.readdirPromise(s)){let a=D.resolve(s,o);this.unpluggedPaths.has(a)||await M.removePromise(a)}}async locateNodeModules(e){let r=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=D.join(n.cwd,"node_modules");if(i&&i.test(D.relative(this.opts.project.cwd,n.cwd))||!M.existsSync(s))continue;let o=await M.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)r.push(s);else for(let l of a)r.push(D.join(s,l.name))}return r}async unplugPackageIfNeeded(e,r,i,n){return this.shouldBeUnplugged(e,r,n)?this.unplugPackage(e,i):i.packageFs}shouldBeUnplugged(e,r,i){return typeof i.unplugged!="undefined"?i.unplugged:cqe.has(e.identHash)?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(QB(e,r,i,{configuration:this.opts.project.configuration}).length>0||r.misc.extractHint)}async unplugPackage(e,r){let i=Ad(e,{configuration:this.opts.project.configuration});this.unpluggedPaths.add(i);let n=D.join(i,r.prefixPath,".ready");return await M.existsPromise(n)?new Dt(i):(this.opts.project.storedBuildState.delete(e.locatorHash),await M.mkdirPromise(i,{recursive:!0}),await M.copyPromise(i,Se.dot,{baseFs:r.packageFs,overwrite:!1}),await M.writeFilePromise(n,""),new Dt(i))}getPackageInformation(e){let r=b.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(r);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${b.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${b.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let r=fe.getMapWithDefault(this.packageRegistry,"@@disk"),i=JF(this.opts.project.cwd,e);return fe.getFactoryWithDefault(r,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:lt.SOFT,discardFromLookup:!1}))}};function JF(t,e){let r=D.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function uqe(t){var i;let e=(i=await Je.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?i:new Je,r=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())r.has(n)||e.scripts.delete(n);return{manifest:{os:e.os,cpu:e.cpu,scripts:e.scripts,preferUnplugged:e.preferUnplugged},misc:{extractHint:YF(t),hasBindingGyp:qF(t)}}}var ine=ne(Ji());var ld=class extends ye{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new me("This command can only be used if the `nodeLinker` option is set to `pnp`");await r.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(h=>{let f=b.parseDescriptor(h),p=f.range!=="unknown"?f:b.makeDescriptor(f,"*");if(!Ft.validRange(p.range))throw new me(`The range of the descriptor patterns must be a valid semver range (${b.prettyDescriptor(e,p)})`);return m=>{let I=b.stringifyIdent(m);return!ine.default.isMatch(I,b.stringifyIdent(p))||m.version&&!Ft.satisfiesWithPrereleases(m.version,p.range)?!1:(s.delete(h),!0)}}),a=()=>{let h=[];for(let f of r.storedPackages.values())!r.tryWorkspaceByLocator(f)&&!b.isVirtualLocator(f)&&o.some(p=>p(f))&&h.push(f);return h},l=h=>{let f=new Set,p=[],m=(I,Q)=>{if(!f.has(I.locatorHash)&&(f.add(I.locatorHash),!r.tryWorkspaceByLocator(I)&&o.some(w=>w(I))&&p.push(I),!(Q>0&&!this.recursive)))for(let w of I.dependencies.values()){let x=r.storedResolutions.get(w.descriptorHash);if(!x)throw new Error("Assertion failed: The resolution should have been registered");let N=r.storedPackages.get(x);if(!N)throw new Error("Assertion failed: The package should have been registered");m(N,Q+1)}};for(let I of h){let Q=r.storedPackages.get(I.anchoredLocator.locatorHash);if(!Q)throw new Error("Assertion failed: The package should have been registered");m(Q,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(r.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new me(`Patterns ${Ae.prettyList(e,s,Ae.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new me(`Pattern ${Ae.prettyList(e,s,Ae.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=fe.sortMap(c,h=>b.stringifyLocator(h)),(await Pe.start({configuration:e,stdout:this.context.stdout,json:this.json},async h=>{var f;for(let p of c){let m=(f=p.version)!=null?f:"unknown",I=r.topLevelWorkspace.manifest.ensureDependencyMeta(b.makeDescriptor(p,m));I.unplugged=!0,h.reportInfo(J.UNNAMED,`Will unpack ${b.prettyLocator(e,p)} to ${Ae.pretty(e,Ad(p,{configuration:e}),Ae.Type.PATH)}`),h.reportJson({locator:b.stringifyLocator(p),version:m})}await r.topLevelWorkspace.persistManifest(),h.reportSeparator(),await r.install({cache:n,report:h})})).exitCode()}};ld.paths=[["unplug"]],ld.usage=Ce.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var nne=ld;var ka=t=>({cjs:D.join(t.cwd,Et.pnpCjs),cjsLegacy:D.join(t.cwd,Et.pnpJs)}),one=t=>/\s/.test(t)?JSON.stringify(t):t;async function gqe(t,e,r){let i=ka(t).cjs,n=`--require ${one(L.fromPortablePath(i))}`;if(i.includes(" ")&&sne.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(M.existsSync(i)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g;s=s.replace(o," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function hqe(t,e){e(ka(t).cjs),e(t.configuration.get("pnpDataPath")),e(t.configuration.get("pnpUnpluggedFolder"))}var fqe={hooks:{populateYarnPaths:hqe,setupScriptEnvironment:gqe},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:ge.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:ge.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:ge.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:ge.STRING,default:[],isArray:!0},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:ge.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:ge.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:ge.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:ge.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[El],commands:[nne]},pqe=fqe;var gne=ne(une());var _F=ne(require("crypto")),hne=ne(require("fs")),fne=1,Or="node_modules",$F=".bin",pne=".yarn-state.yml",Wr;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Wr||(Wr={}));var eR=class{constructor(){this.installStateCache=new Map}supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="node-modules"}async findPackageLocation(e,r){let i=r.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await fe.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await tR(r.project,{unrollAliases:!0}));if(n===null)throw new me("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(b.stringifyLocator(e));if(!s){let a=new me(`Couldn't find ${b.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=r.project.configuration.startingCwd;return s.locations.find(a=>D.contains(o,a))||s.locations[0]}async findPackageLocator(e,r){let i=await fe.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await tR(r.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=bB(D.resolve(e),{skipPrefix:r.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return b.parseLocator(a)}makeInstaller(e){return new dne(e)}},dne=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,r){var u;let i=D.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await Fqe(e,r),e.linkType===lt.HARD&&this.customData.store.set(e.locatorHash,n)),!Wn.checkAndReportManifestCompatibility(e,n,"link",{configuration:this.opts.project.configuration,report:this.opts.report}))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(b.stringifyIdent(e))||s.set(b.stringifyIdent(e),e.reference);let a=e;if(b.isVirtualLocator(e)){a=b.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(b.stringifyIdent(g),null),o.add(b.stringifyIdent(g))}let l={packageLocation:`${L.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=r.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,r){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of r){let o=b.areIdentsEqual(n,s)?s.reference:[b.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(b.stringifyIdent(n),o)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new ar({baseFs:new sn({libzip:await Ci(),maxOpenFiles:80,readOnlyArchives:!0})}),r=await tR(this.opts.project),i=this.opts.project.configuration.get("nmMode");(r===null||i!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i});let n=new Map(this.opts.project.workspaces.map(g=>{var f,p;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=fe.validateEnum(Ki,(p=(f=g.manifest.installConfig)==null?void 0:f.hoistingLimits)!=null?p:h)}catch(m){let I=b.prettyWorkspace(this.opts.project.configuration,g);this.opts.report.reportWarning(J.INVALID_MANIFEST,`${I}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Ki).join(", ")}, using default: "${h}"`)}return[g.relativeCwd,h]})),s={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(g,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:g,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(g=>{let h=g.anchoredLocator;return{name:b.stringifyIdent(g.locator),reference:h.reference}}),getPackageInformation:g=>{let h=g.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:b.makeLocator(b.parseIdent(g.name),g.reference),f=this.localStore.get(h.locatorHash);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return f.pnpNode},findPackageLocator:g=>{let h=this.opts.project.tryWorkspaceByCwd(L.toPortablePath(g));if(h!==null){let f=h.anchoredLocator;return{name:b.stringifyIdent(f),reference:f.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:g=>L.fromPortablePath(ar.resolveVirtual(L.toPortablePath(g)))},{tree:o,errors:a,preserveSymlinksRequired:l}=sd(s,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project});if(!o){for(let{messageName:g,text:h}of a)this.opts.report.reportError(g,h);return}let c=TF(o);await Rqe(r,c,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async g=>{let h=b.parseLocator(g),f=this.localStore.get(h.locatorHash);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return f.customPackageData.manifest}});let u=[];for(let[g,h]of c.entries()){if(Cne(g))continue;let f=b.parseLocator(g),p=this.localStore.get(f.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(p.pkg))continue;let m=Wn.extractBuildScripts(p.pkg,p.customPackageData,p.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});m.length!==0&&u.push({buildLocations:h.locations,locatorHash:f.locatorHash,buildDirective:m})}return l&&this.opts.report.reportWarning(J.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${Ae.pretty(this.opts.project.configuration,"--preserve-symlinks",Ae.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:u}}};async function Fqe(t,e){var n;let r=(n=await Je.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new Je,i=new Set(["preinstall","install","postinstall"]);for(let s of r.scripts.keys())i.has(s)||r.scripts.delete(s);return{manifest:{bin:r.bin,os:r.os,cpu:r.cpu,scripts:r.scripts},misc:{extractHint:Wn.getExtractHint(e),hasBindingGyp:Wn.hasBindingGyp(e)}}}async function Nqe(t,e,r,i){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will -`,n+=`# cause your node_modules installation to become invalidated. -`,n+=` -`,n+=`__metadata: -`,n+=` version: ${fne} -`,n+=` nmMode: ${i.value} -`;let s=Array.from(e.keys()).sort(),o=b.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let c of s){let u=e.get(c);n+=` -`,n+=`${JSON.stringify(c)}: -`,n+=` locations: -`;for(let g of u.locations){let h=D.contains(t.cwd,g);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` - ${JSON.stringify(h)} -`}if(u.aliases.length>0){n+=` aliases: -`;for(let g of u.aliases)n+=` - ${JSON.stringify(g)} -`}if(c===o&&r.size>0){n+=` bin: -`;for(let[g,h]of r){let f=D.contains(t.cwd,g);if(f===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` ${JSON.stringify(f)}: -`;for(let[p,m]of h){let I=D.relative(D.join(g,Or),m);n+=` ${JSON.stringify(p)}: ${JSON.stringify(I)} -`}}}}let a=t.cwd,l=D.join(a,Or,pne);await M.changeFilePromise(l,n,{automaticNewlines:!0})}async function tR(t,{unrollAliases:e=!1}={}){let r=t.cwd,i=D.join(r,Or,pne);if(!M.existsSync(i))return null;let n=jr(await M.readFilePromise(i,"utf8"));if(n.__metadata.version>fne)return null;let s=n.__metadata.nmMode||Wr.CLASSIC,o=new Map,a=new Map;delete n.__metadata;for(let[l,c]of Object.entries(n)){let u=c.locations.map(h=>D.join(r,h)),g=c.bin;if(g)for(let[h,f]of Object.entries(g)){let p=D.join(r,L.toPortablePath(h)),m=fe.getMapWithDefault(a,p);for(let[I,Q]of Object.entries(f))m.set(or(I),L.toPortablePath([p,Or,Q].join(D.delimiter)))}if(o.set(l,{target:Se.dot,linkType:lt.HARD,locations:u,aliases:c.aliases||[]}),e&&c.aliases)for(let h of c.aliases){let{scope:f,name:p}=b.parseLocator(l),m=b.makeLocator(b.makeIdent(f,p),h),I=b.stringifyLocator(m);o.set(I,{target:Se.dot,linkType:lt.HARD,locations:u,aliases:[]})}}return{locatorMap:o,binSymlinks:a,locationTree:mne(o,{skipPrefix:t.cwd}),nmMode:s}}var Gu=async(t,e)=>{if(t.split(D.sep).indexOf(Or)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop&&(await M.lstatPromise(t)).isSymbolicLink()){await M.unlinkPromise(t);return}let r=await M.readdirPromise(t,{withFileTypes:!0});for(let i of r){let n=D.join(t,or(i.name));i.isDirectory()?(i.name!==Or||e&&e.innerLoop)&&await Gu(n,{innerLoop:!0,contentsOnly:!1}):await M.unlinkPromise(n)}e.contentsOnly||await M.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},Ine=4,bB=(t,{skipPrefix:e})=>{let r=D.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let i=r.split(D.sep).filter(l=>l!==""),n=i.indexOf(Or),s=i.slice(0,n).join(D.sep),o=D.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},mne=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let i=()=>({children:new Map,linkType:lt.HARD});for(let[n,s]of t.entries()){if(s.linkType===lt.SOFT&&D.contains(e,s.target)!==null){let a=fe.getFactoryWithDefault(r,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=bB(o,{skipPrefix:e}),c=fe.getFactoryWithDefault(r,a,i);for(let u=0;u{let r;try{process.platform==="win32"&&(r=await M.lstatPromise(t))}catch(i){}process.platform=="win32"&&(!r||r.isDirectory())?await M.symlinkPromise(t,e,"junction"):await M.symlinkPromise(D.relative(D.dirname(e),t),e)};async function Ene(t,e,r){let i=D.join(t,or(`${_F.default.randomBytes(16).toString("hex")}.tmp`));try{await M.writeFilePromise(i,r);try{await M.linkPromise(i,e)}catch(n){}}finally{await M.unlinkPromise(i)}}async function Mqe({srcPath:t,dstPath:e,srcMode:r,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Wr.HARDLINKS_GLOBAL&&i&&o){let l=D.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await ki.checksumFile(l,{baseFs:M,algorithm:"sha1"})!==o){let g=D.join(i,or(`${_F.default.randomBytes(16).toString("hex")}.tmp`));await M.renamePromise(l,g);let h=await n.readFilePromise(t);await M.writeFilePromise(g,h);try{await M.linkPromise(g,l),await M.unlinkPromise(g)}catch(f){}}await M.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(t);await Ene(i,l,u);try{await M.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Wr.HARDLINKS_LOCAL,await n.copyFilePromise(t,e))}}}else await n.copyFilePromise(t,e);let a=r&511;a!==420&&await M.chmodPromise(e,a)}var va;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(va||(va={}));var Lqe=async(t,e,{baseFs:r,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await M.mkdirPromise(t,{recursive:!0});let o=async(l=Se.dot)=>{let c=D.join(e,l),u=await r.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let h of u){let f=D.join(l,h.name),p,m=D.join(c,h.name);if(h.isFile()){if(p={kind:va.FILE,mode:(await r.lstatPromise(m)).mode},n.value===Wr.HARDLINKS_GLOBAL){let I=await ki.checksumFile(m,{baseFs:r,algorithm:"sha1"});p.digest=I}}else if(h.isDirectory())p={kind:va.DIRECTORY};else if(h.isSymbolicLink())p={kind:va.SYMLINK,symlinkTo:await r.readlinkPromise(m)};else throw new Error(`Unsupported file type (file: ${m}, mode: 0o${await r.statSync(m).mode.toString(8).padStart(6,"0")})`);if(g.set(f,p),h.isDirectory()&&f!==Or){let I=await o(f);for(let[Q,w]of I)g.set(Q,w)}}return g},a;if(n.value===Wr.HARDLINKS_GLOBAL&&i&&s){let l=D.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await M.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await Ene(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=D.join(e,l),g=D.join(t,l);c.kind===va.DIRECTORY?await M.mkdirPromise(g,{recursive:!0}):c.kind===va.FILE?await Mqe({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:r,globalHardlinksStore:i}):c.kind===va.SYMLINK&&await rR(D.resolve(D.dirname(g),c.symlinkTo),g)}};function Tqe(t,e){let r=new Map([...t]),i=new Map([...e]);for(let[n,s]of t){let o=D.join(n,Or);if(!M.existsSync(o)){s.children.delete(Or);for(let a of i.keys())D.contains(o,a)!==null&&i.delete(a)}}return{locationTree:r,binSymlinks:i}}function Cne(t){let e=b.parseDescriptor(t);return b.isVirtualDescriptor(e)&&(e=b.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function Oqe(t,e,r,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of t){let c=Cne(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,h]of c.bin){let f=D.join(l[0],h);h!==""&&M.existsSync(f)&&u.set(g,h)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=D.contains(r,a);if(c.locator&&g!==null){let h=n.get(c.locator);for(let[f,p]of h){let m=D.join(a,L.toPortablePath(p));u.set(or(f),m)}for(let[f,p]of c.children){let m=D.join(a,f),I=o(m,m,p);I.size>0&&s.set(a,new Map([...s.get(a)||new Map,...I]))}}else for(let[h,f]of c.children){let p=o(D.join(a,h),l,f);for(let[m,I]of p)u.set(m,I)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var yne=(t,e)=>{if(!t||!e)return t===e;let r=b.parseLocator(t);b.isVirtualLocator(r)&&(r=b.devirtualizeLocator(r));let i=b.parseLocator(e);return b.isVirtualLocator(i)&&(i=b.devirtualizeLocator(i)),b.areLocatorsEqual(r,i)};function iR(t){return D.join(t.get("globalFolder"),"store")}async function Rqe(t,e,{baseFs:r,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=D.join(i.cwd,Or),{locationTree:l,binSymlinks:c}=Tqe(t.locationTree,t.binSymlinks),u=mne(e,{skipPrefix:i.cwd}),g=[],h=async({srcDir:T,dstDir:P,linkType:G,globalHardlinksStore:te,nmMode:j,packageChecksum:A})=>{let ee=(async()=>{try{G===lt.SOFT?(await M.mkdirPromise(D.dirname(P),{recursive:!0}),await rR(D.resolve(T),P)):await Lqe(P,T,{baseFs:r,globalHardlinksStore:te,nmMode:j,packageChecksum:A})}catch($){throw $.message=`While persisting ${T} -> ${P} ${$.message}`,$}finally{w.tick()}})().then(()=>g.splice(g.indexOf(ee),1));g.push(ee),g.length>Ine&&await Promise.race(g)},f=async(T,P,G)=>{let te=(async()=>{let j=async(A,ee,$)=>{try{$.innerLoop||await M.mkdirPromise(ee,{recursive:!0});let _=await M.readdirPromise(A,{withFileTypes:!0});for(let U of _){if(!$.innerLoop&&U.name===$F)continue;let F=D.join(A,U.name),Re=D.join(ee,U.name);U.isDirectory()?(U.name!==Or||$&&$.innerLoop)&&(await M.mkdirPromise(Re,{recursive:!0}),await j(F,Re,W(v({},$),{innerLoop:!0}))):H.value===Wr.HARDLINKS_LOCAL||H.value===Wr.HARDLINKS_GLOBAL?await M.linkPromise(F,Re):await M.copyFilePromise(F,Re,hne.default.constants.COPYFILE_FICLONE)}}catch(_){throw $.innerLoop||(_.message=`While cloning ${A} -> ${ee} ${_.message}`),_}finally{$.innerLoop||w.tick()}};await j(T,P,G)})().then(()=>g.splice(g.indexOf(te),1));g.push(te),g.length>Ine&&await Promise.race(g)},p=async(T,P,G)=>{if(!G)P.children.has(Or)&&await Gu(D.join(T,Or),{contentsOnly:!1}),await Gu(T,{contentsOnly:T===a});else for(let[te,j]of P.children){let A=G.children.get(te);await p(D.join(T,te),j,A)}};for(let[T,P]of l){let G=u.get(T);for(let[te,j]of P.children){if(te===".")continue;let A=G&&G.children.get(te);await p(D.join(T,te),j,A)}}let m=async(T,P,G)=>{if(!G)P.children.has(Or)&&await Gu(D.join(T,Or),{contentsOnly:!0}),await Gu(T,{contentsOnly:P.linkType===lt.HARD});else{yne(P.locator,G.locator)||await Gu(T,{contentsOnly:P.linkType===lt.HARD});for(let[te,j]of P.children){let A=G.children.get(te);await m(D.join(T,te),j,A)}}};for(let[T,P]of u){let G=l.get(T);for(let[te,j]of P.children){if(te===".")continue;let A=G&&G.children.get(te);await m(D.join(T,te),j,A)}}let I=new Map,Q=[];for(let[T,{locations:P}]of t.locatorMap.entries())for(let G of P){let{locationRoot:te,segments:j}=bB(G,{skipPrefix:i.cwd}),A=u.get(te),ee=te;if(A){for(let $ of j)if(ee=D.join(ee,$),A=A.children.get($),!A)break;if(A){let $=yne(A.locator,T),_=e.get(A.locator),U=_.target,F=ee,Re=_.linkType;if($)I.has(U)||I.set(U,F);else if(U!==F){let xe=b.parseLocator(A.locator);b.isVirtualLocator(xe)&&(xe=b.devirtualizeLocator(xe)),Q.push({srcDir:U,dstDir:F,linkType:Re,realLocatorHash:xe.locatorHash})}}}}for(let[T,{locations:P}]of e.entries())for(let G of P){let{locationRoot:te,segments:j}=bB(G,{skipPrefix:i.cwd}),A=l.get(te),ee=u.get(te),$=te,_=e.get(T),U=b.parseLocator(T);b.isVirtualLocator(U)&&(U=b.devirtualizeLocator(U));let F=U.locatorHash,Re=_.target,xe=G;if(Re===xe)continue;let Ke=_.linkType;for(let Me of j)ee=ee.children.get(Me);if(!A)Q.push({srcDir:Re,dstDir:xe,linkType:Ke,realLocatorHash:F});else for(let Me of j)if($=D.join($,Me),A=A.children.get(Me),!A){Q.push({srcDir:Re,dstDir:xe,linkType:Ke,realLocatorHash:F});break}}let w=pi.progressViaCounter(Q.length),x=n.reportProgress(w),N=i.configuration.get("nmMode"),H={value:N};try{let T=H.value===Wr.HARDLINKS_GLOBAL?`${iR(i.configuration)}/v1`:null;if(T&&!await M.existsPromise(T)){await M.mkdirpPromise(T);for(let G=0;G<256;G++)await M.mkdirPromise(D.join(T,G.toString(16).padStart(2,"0")))}for(let G of Q)(G.linkType===lt.SOFT||!I.has(G.srcDir))&&(I.set(G.srcDir,G.dstDir),await h(W(v({},G),{globalHardlinksStore:T,nmMode:H,packageChecksum:o.get(G.realLocatorHash)||null})));await Promise.all(g),g.length=0;for(let G of Q){let te=I.get(G.srcDir);G.linkType!==lt.SOFT&&G.dstDir!==te&&await f(te,G.dstDir,{nmMode:H})}await Promise.all(g),await M.mkdirPromise(a,{recursive:!0});let P=await Oqe(e,u,i.cwd,{loadManifest:s});await Kqe(c,P,i.cwd),await Nqe(i,e,P,H),N==Wr.HARDLINKS_GLOBAL&&H.value==Wr.HARDLINKS_LOCAL&&n.reportWarningOnce(J.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{x.stop()}}async function Kqe(t,e,r){for(let i of t.keys()){if(D.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=D.join(i,Or,$F);await M.removePromise(n)}}for(let[i,n]of e){if(D.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=D.join(i,Or,$F),o=t.get(i)||new Map;await M.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await M.removePromise(D.join(s,a)),process.platform==="win32"&&await M.removePromise(D.join(s,or(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=D.join(s,a);c!==l&&(process.platform==="win32"?await(0,gne.default)(L.fromPortablePath(l),L.fromPortablePath(u),{createPwshFile:!1}):(await M.removePromise(u),await rR(l,u),D.contains(r,await M.realpathPromise(l))!==null&&await M.chmodPromise(l,493)))}}}var nR=class extends El{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new Bne(e)}},Bne=class extends Uu{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let r=new ar({baseFs:new sn({libzip:await Ci(),maxOpenFiles:80,readOnlyArchives:!0})}),i=tne(e,this.opts.project.cwd,r),{tree:n,errors:s}=sd(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let h=b.parseLocator(g.locator),f=b.stringifyIdent(h);f===u?o.set(u,h.reference):o.set(u,[f,h.reference])},l=D.join(this.opts.project.cwd,Et.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=D.join(l,u),h=n.get(g);if(typeof h=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in h)a(u,h);else for(let f of h.dirList){let p=D.join(g,f),m=n.get(p);if(typeof m=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in m)a(`${u}/${f}`,m);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var Uqe={hooks:{cleanGlobalArtifacts:async t=>{let e=iR(t);await M.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:ge.STRING,values:[Ki.WORKSPACES,Ki.DEPENDENCIES,Ki.NONE],default:Ki.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:ge.STRING,values:[Wr.CLASSIC,Wr.HARDLINKS_LOCAL,Wr.HARDLINKS_GLOBAL],default:Wr.CLASSIC}},linkers:[eR,nR]},Hqe=Uqe;var AN={};$e(AN,{default:()=>z3e,npmConfigUtils:()=>Wt,npmHttpUtils:()=>St,npmPublishUtils:()=>Dd});var Dne=ne(pr());var Ot="npm:";var St={};$e(St,{AuthType:()=>en,customPackageError:()=>qqe,del:()=>Wqe,get:()=>zn,getIdentUrl:()=>Ra,handleInvalidAuthenticationError:()=>Fa,post:()=>jqe,put:()=>Jqe});var Qne=ne(dp()),bne=ne(require("url"));var Wt={};$e(Wt,{RegistryType:()=>Pa,getAuthConfiguration:()=>aR,getDefaultRegistry:()=>DB,getPublishRegistry:()=>Gqe,getRegistryConfiguration:()=>wne,getScopeConfiguration:()=>oR,getScopeRegistry:()=>vo,normalizeRegistry:()=>yl});var Pa;(function(r){r.FETCH_REGISTRY="npmRegistryServer",r.PUBLISH_REGISTRY="npmPublishRegistry"})(Pa||(Pa={}));function yl(t){return t.replace(/\/$/,"")}function Gqe(t,{configuration:e}){return t.publishConfig&&t.publishConfig.registry?yl(t.publishConfig.registry):t.name?vo(t.name.scope,{configuration:e,type:Pa.PUBLISH_REGISTRY}):DB({configuration:e,type:Pa.PUBLISH_REGISTRY})}function vo(t,{configuration:e,type:r=Pa.FETCH_REGISTRY}){let i=oR(t,{configuration:e});if(i===null)return DB({configuration:e,type:r});let n=i.get(r);return n===null?DB({configuration:e,type:r}):yl(n)}function DB({configuration:t,type:e=Pa.FETCH_REGISTRY}){let r=t.get(e);return yl(r!==null?r:t.get(Pa.FETCH_REGISTRY))}function wne(t,{configuration:e}){let r=e.get("npmRegistries"),i=yl(t),n=r.get(i);if(typeof n!="undefined")return n;let s=r.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function oR(t,{configuration:e}){if(t===null)return null;let i=e.get("npmScopes").get(t);return i||null}function aR(t,{configuration:e,ident:r}){let i=r&&oR(r.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:wne(t,{configuration:e})||e}var en;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(en||(en={}));async function Fa(t,{attemptedAs:e,registry:r,headers:i,configuration:n}){var s,o;if(((s=t.originalError)==null?void 0:s.name)==="HTTPError"&&((o=t.originalError)==null?void 0:o.response.statusCode)===401)throw new et(J.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await Yqe(r,i,{configuration:n})}`:`attempted as ${e}`})`)}function qqe(t){var e;return((e=t.response)==null?void 0:e.statusCode)===404?"Package not found":null}function Ra(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}async function zn(t,a){var l=a,{configuration:e,headers:r,ident:i,authType:n,registry:s}=l,o=Kr(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=vo(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await SB(s,{authType:n,configuration:e,ident:i});c&&(r=W(v({},r),{authorization:c}));try{return await Mt.get(t.charAt(0)==="/"?`${s}${t}`:t,v({configuration:e,headers:r},o))}catch(u){throw await Fa(u,{registry:s,configuration:e,headers:r}),u}}async function jqe(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=Kr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=vo(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await SB(a,{authType:o,configuration:i,ident:s});g&&(n=W(v({},n),{authorization:g}));try{return await Mt.post(a+t,e,v({configuration:i,headers:n},l))}catch(h){if(!lR(h))throw await Fa(h,{attemptedAs:r,registry:a,configuration:i,headers:n}),h;let f=await AR(),p=v(v({},n),cR(f));try{return await Mt.post(`${a}${t}`,e,v({configuration:i,headers:p},l))}catch(m){throw await Fa(m,{attemptedAs:r,registry:a,configuration:i,headers:n}),m}}}async function Jqe(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=Kr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=vo(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await SB(a,{authType:o,configuration:i,ident:s});g&&(n=W(v({},n),{authorization:g}));try{return await Mt.put(a+t,e,v({configuration:i,headers:n},l))}catch(h){if(!lR(h))throw await Fa(h,{attemptedAs:r,registry:a,configuration:i,headers:n}),h;let f=await AR(),p=v(v({},n),cR(f));try{return await Mt.put(`${a}${t}`,e,v({configuration:i,headers:p},l))}catch(m){throw await Fa(m,{attemptedAs:r,registry:a,configuration:i,headers:n}),m}}}async function Wqe(t,l){var c=l,{attemptedAs:e,configuration:r,headers:i,ident:n,authType:s=3,registry:o}=c,a=Kr(c,["attemptedAs","configuration","headers","ident","authType","registry"]);if(n&&typeof o=="undefined"&&(o=vo(n.scope,{configuration:r})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let u=await SB(o,{authType:s,configuration:r,ident:n});u&&(i=W(v({},i),{authorization:u}));try{return await Mt.del(o+t,v({configuration:r,headers:i},a))}catch(g){if(!lR(g))throw await Fa(g,{attemptedAs:e,registry:o,configuration:r,headers:i}),g;let h=await AR(),f=v(v({},i),cR(h));try{return await Mt.del(`${o}${t}`,v({configuration:r,headers:f},a))}catch(p){throw await Fa(p,{attemptedAs:e,registry:o,configuration:r,headers:i}),p}}}async function SB(t,{authType:e=2,configuration:r,ident:i}){let n=aR(t,{configuration:r,ident:i}),s=zqe(n,e);if(!s)return null;let o=await r.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new et(J.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function zqe(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function Yqe(t,e,{configuration:r}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await Mt.get(new bne.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function AR(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:t}=await(0,Qne.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return t}function lR(t){var e,r;if(((e=t.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((r=t.originalError)==null?void 0:r.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function cR(t){return{["npm-otp"]:t}}var uR=class{supports(e,r){if(!e.reference.startsWith(Ot))return!1;let{selector:i,params:n}=b.parseRange(e.reference);return!(!Dne.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let{params:i}=b.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await zn(i.__archiveUrl,{configuration:r.project.configuration,ident:e});return await Nr.convertToZip(n,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:b.getIdentVendorPath(e),stripComponents:1})}};var gR=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Ot)||!b.tryParseDescriptor(e.range.slice(Ot.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){let i=b.parseDescriptor(e.range.slice(Ot.length),!0);return r.resolver.getResolutionDependencies(i,r)}async getCandidates(e,r,i){let n=b.parseDescriptor(e.range.slice(Ot.length),!0);return await i.resolver.getCandidates(n,r,i)}async getSatisfying(e,r,i){let n=b.parseDescriptor(e.range.slice(Ot.length),!0);return i.resolver.getSatisfying(n,r,i)}resolve(e,r){throw new Error("Unreachable")}};var hR=ne(pr()),Sne=ne(require("url"));var Vn=class{supports(e,r){if(!e.reference.startsWith(Ot))return!1;let i=new Sne.URL(e.reference);return!(!hR.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i;try{i=await zn(Vn.getLocatorUrl(e),{configuration:r.project.configuration,ident:e})}catch(n){i=await zn(Vn.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:r.project.configuration,ident:e})}return await Nr.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:b.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:i}){let n=vo(e.scope,{configuration:i}),s=Vn.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===n+s||r===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=hR.default.clean(e.reference.slice(Ot.length));if(r===null)throw new et(J.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${Ra(e)}/-/${e.name}-${r}.tgz`}};var fR=ne(pr());var xB=b.makeIdent(null,"node-gyp"),Vqe=/\b(node-gyp|prebuild-install)\b/,pR=class{supportsDescriptor(e,r){return e.range.startsWith(Ot)?!!Ft.validRange(e.range.slice(Ot.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(Ot))return!1;let{selector:i}=b.parseRange(e.reference);return!!fR.default.valid(i)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=Ft.validRange(e.range.slice(Ot.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Ot.length)}`);let s=await zn(Ra(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=fe.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new Ft.SemVer(c);if(n.test(u))return u}catch{}return fe.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=b.makeLocator(e,`${Ot}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Vn.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:b.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,r,i){let n=Ft.validRange(e.range.slice(Ot.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(Ot.length)}`);return fe.mapAndFilter(r,s=>{try{let{selector:o}=b.parseRange(s,{requireProtocol:Ot}),a=new Ft.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return fe.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>b.makeLocator(e,s))}async resolve(e,r){let{selector:i}=b.parseRange(e.reference),n=fR.default.clean(i);if(n===null)throw new et(J.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await zn(Ra(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new et(J.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new et(J.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new Je;if(o.load(s.versions[n]),!o.dependencies.has(xB.identHash)&&!o.peerDependencies.has(xB.identHash)){for(let a of o.scripts.values())if(a.match(Vqe)){o.dependencies.set(xB.identHash,b.makeDescriptor(xB,"latest")),r.report.reportWarningOnce(J.NODE_GYP_INJECTED,`${b.prettyLocator(r.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}return typeof o.raw.deprecated=="string"&&r.report.reportWarningOnce(J.DEPRECATED_PACKAGE,`${b.prettyLocator(r.project.configuration,e)} is deprecated: ${o.raw.deprecated}`),W(v({},e),{version:n,languageName:"node",linkType:lt.HARD,dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var dR=class{supportsDescriptor(e,r){return!(!e.range.startsWith(Ot)||!tu.test(e.range.slice(Ot.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ot.length),s=await zn(Ra(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new et(J.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new et(J.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=b.makeLocator(e,`${Ot}${a}`),c=s.versions[a].dist.tarball;return Vn.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[b.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Unreachable")}};var Dd={};$e(Dd,{makePublishBody:()=>J3e});var nN={};$e(nN,{default:()=>x3e,packUtils:()=>No});var No={};$e(No,{genPackList:()=>XB,genPackStream:()=>iN,genPackageManifest:()=>toe,hasPackScripts:()=>tN,prepareForPack:()=>rN});var eN=ne(Ji()),$se=ne(_se()),eoe=ne(require("zlib")),C3e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],m3e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function tN(t){return!!(kt.hasWorkspaceScript(t,"prepack")||kt.hasWorkspaceScript(t,"postpack"))}async function rN(t,{report:e},r){await kt.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let i=D.join(t.cwd,Je.fileName);await M.existsPromise(i)&&await t.manifest.loadFile(i,{baseFs:M}),await r()}finally{await kt.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function iN(t,e){var s,o;typeof e=="undefined"&&(e=await XB(t));let r=new Set;for(let a of(o=(s=t.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)r.add(D.normalize(a));for(let a of t.manifest.bin.values())r.add(D.normalize(a));let i=$se.default.pack();process.nextTick(async()=>{for(let a of e){let l=D.normalize(a),c=D.resolve(t.cwd,l),u=D.join("package",l),g=await M.lstatPromise(c),h={name:u,mtime:new Date($t.SAFE_TIME*1e3)},f=r.has(l)?493:420,p,m,I=new Promise((w,x)=>{p=w,m=x}),Q=w=>{w?m(w):p()};if(g.isFile()){let w;l==="package.json"?w=Buffer.from(JSON.stringify(await toe(t),null,2)):w=await M.readFilePromise(c),i.entry(W(v({},h),{mode:f,type:"file"}),w,Q)}else g.isSymbolicLink()?i.entry(W(v({},h),{mode:f,type:"symlink",linkname:await M.readlinkPromise(c)}),Q):Q(new Error(`Unsupported file type ${g.mode} for ${L.fromPortablePath(l)}`));await I}i.finalize()});let n=(0,eoe.createGzip)();return i.pipe(n),n}async function toe(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function XB(t){var g,h,f,p,m,I,Q,w;let e=t.project,r=e.configuration,i={accept:[],reject:[]};for(let x of m3e)i.reject.push(x);for(let x of C3e)i.accept.push(x);i.reject.push(r.get("rcFilename"));let n=x=>{if(x===null||!x.startsWith(`${t.cwd}/`))return;let N=D.relative(t.cwd,x),H=D.resolve(Se.root,N);i.reject.push(H)};n(D.resolve(e.cwd,r.get("lockfileFilename"))),n(r.get("cacheFolder")),n(r.get("globalFolder")),n(r.get("installStatePath")),n(r.get("virtualFolder")),n(r.get("yarnPath")),await r.triggerHook(x=>x.populateYarnPaths,e,x=>{n(x)});for(let x of e.workspaces){let N=D.relative(t.cwd,x.cwd);N!==""&&!N.match(/^(\.\.)?\//)&&i.reject.push(`/${N}`)}let s={accept:[],reject:[]},o=(h=(g=t.manifest.publishConfig)==null?void 0:g.main)!=null?h:t.manifest.main,a=(p=(f=t.manifest.publishConfig)==null?void 0:f.module)!=null?p:t.manifest.module,l=(I=(m=t.manifest.publishConfig)==null?void 0:m.browser)!=null?I:t.manifest.browser,c=(w=(Q=t.manifest.publishConfig)==null?void 0:Q.bin)!=null?w:t.manifest.bin;o!=null&&s.accept.push(D.resolve(Se.root,o)),a!=null&&s.accept.push(D.resolve(Se.root,a)),typeof l=="string"&&s.accept.push(D.resolve(Se.root,l));for(let x of c.values())s.accept.push(D.resolve(Se.root,x));if(l instanceof Map)for(let[x,N]of l.entries())s.accept.push(D.resolve(Se.root,x)),typeof N=="string"&&s.accept.push(D.resolve(Se.root,N));let u=t.manifest.files!==null;if(u){s.reject.push("/*");for(let x of t.manifest.files)roe(s.accept,x,{cwd:Se.root})}return await I3e(t.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function I3e(t,{hasExplicitFileList:e,globalList:r,ignoreList:i}){let n=[],s=new Ys(t),o=[[Se.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!noe(a,{globalList:r,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,h=!1;if(!e||a!==Se.root)for(let m of u)g=g||m===".gitignore",h=h||m===".npmignore";let f=h?await ioe(s,a,".npmignore"):g?await ioe(s,a,".gitignore"):null,p=f!==null?[f].concat(l):l;noe(a,{globalList:r,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let m of u)o.push([D.resolve(a,m),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(D.relative(Se.root,a))}return n.sort()}async function ioe(t,e,r){let i={accept:[],reject:[]},n=await t.readFilePromise(D.join(e,r),"utf8");for(let s of n.split(/\n/g))roe(i.reject,s,{cwd:e});return i}function E3e(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=D.resolve(e,t)),r&&(t=`!${t}`),t}function roe(t,e,{cwd:r}){let i=e.trim();i===""||i[0]==="#"||t.push(E3e(i,{cwd:r}))}function noe(t,{globalList:e,ignoreLists:r}){if(ZB(t,e.accept))return!1;if(ZB(t,e.reject))return!0;if(r!==null)for(let i of r){if(ZB(t,i.accept))return!1;if(ZB(t,i.reject))return!0}return!1}function ZB(t,e){let r=e,i=[];for(let n=0;n{await rN(i,{report:l},async()=>{l.reportJson({base:L.fromPortablePath(i.cwd)});let c=await XB(i);for(let u of c)l.reportInfo(null,L.fromPortablePath(u)),l.reportJson({location:L.fromPortablePath(u)});if(!this.dryRun){let u=await iN(i,c),g=M.createWriteStream(s);u.pipe(g),await new Promise(h=>{g.on("finish",h)})}}),this.dryRun||(l.reportInfo(J.UNNAMED,`Package archive generated in ${Ae.pretty(e,s,Ae.Type.PATH)}`),l.reportJson({output:L.fromPortablePath(s)}))})).exitCode()}};wd.paths=[["pack"]],wd.usage=Ce.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var ooe=wd;function y3e(t,{workspace:e}){let r=t.replace("%s",B3e(e)).replace("%v",w3e(e));return L.toPortablePath(r)}function B3e(t){return t.manifest.name!==null?b.slugifyIdent(t.manifest.name):"package"}function w3e(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var Q3e=["dependencies","devDependencies","peerDependencies"],b3e="workspace:",D3e=(t,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of Q3e)for(let o of t.manifest.getForScope(s).values()){let a=r.tryWorkspaceByDescriptor(o),l=b.parseRange(o.range);if(l.protocol===b3e)if(a===null){if(r.tryWorkspaceByIdent(o)===null)throw new et(J.WORKSPACE_NOT_FOUND,`${b.prettyDescriptor(r.configuration,o)}: No local workspace found for this range`)}else{let c;b.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector,e[s][b.stringifyIdent(o)]=c}}},S3e={hooks:{beforeWorkspacePacking:D3e},commands:[ooe]},x3e=S3e;var poe=ne(require("crypto")),doe=ne(foe()),Coe=ne(require("url"));async function J3e(t,e,{access:r,tag:i,registry:n}){let s=t.project.configuration,o=t.manifest.name,a=t.manifest.version,l=b.stringifyIdent(o),c=(0,poe.createHash)("sha1").update(e).digest("hex"),u=doe.default.fromData(e).toString();typeof r=="undefined"&&(t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?r=t.manifest.publishConfig.access:s.get("npmPublishAccess")!==null?r=s.get("npmPublishAccess"):o.scope?r="restricted":r="public");let g=await No.genPackageManifest(t),h=`${l}-${a}.tgz`,f=new Coe.URL(`${l}/-/${h}`,n);return{_id:l,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:l,access:r,["dist-tags"]:{[i]:a},versions:{[a]:W(v({},g),{_id:`${l}@${a}`,name:l,version:a,dist:{shasum:c,integrity:u,tarball:f.toString()}})}}}var lN={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:ge.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:ge.SECRET,default:null}},moe={npmPublishRegistry:{description:"Registry to push packages to",type:ge.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.STRING,default:"https://registry.yarnpkg.com"}},W3e={configuration:W(v(v({},lN),moe),{npmScopes:{description:"Settings per package scope",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:v(v({},lN),moe)}},npmRegistries:{description:"Settings per registry",type:ge.MAP,normalizeKeys:yl,valueDefinition:{description:"",type:ge.SHAPE,properties:v({},lN)}}}),fetchers:[uR,Vn],resolvers:[gR,pR,dR]},z3e=W3e;var hN={};$e(hN,{default:()=>i4e});Nn();var Rs;(function(i){i.All="all",i.Production="production",i.Development="development"})(Rs||(Rs={}));var Zn;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(Zn||(Zn={}));var _B=[Zn.Info,Zn.Low,Zn.Moderate,Zn.High,Zn.Critical];function Ioe(t,e){let r=[],i=new Set,n=o=>{i.has(o)||(i.add(o),r.push(o))};for(let o of e)n(o);let s=new Set;for(;r.length>0;){let o=r.shift(),a=t.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=t.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function V3e(t,e){return new Set([...t].filter(r=>!e.has(r)))}function X3e(t,e,{all:r}){let i=r?t.workspaces:[e],n=i.map(h=>h.manifest),s=new Set(n.map(h=>[...h.dependencies].map(([f,p])=>f)).flat()),o=new Set(n.map(h=>[...h.devDependencies].map(([f,p])=>f)).flat()),a=i.map(h=>[...h.dependencies.values()]).flat(),l=a.filter(h=>s.has(h.identHash)).map(h=>h.descriptorHash),c=a.filter(h=>o.has(h.identHash)).map(h=>h.descriptorHash),u=Ioe(t,l),g=Ioe(t,c);return V3e(g,u)}function Eoe(t){let e={};for(let r of t)e[b.stringifyIdent(r)]=b.parseRange(r.range).selector;return e}function yoe(t){if(typeof t=="undefined")return new Set;let e=_B.indexOf(t),r=_B.slice(e);return new Set(r)}function Z3e(t,e){let r=yoe(e),i={};for(let n of r)i[n]=t[n];return i}function Boe(t,e){var i;let r=Z3e(t,e);for(let n of Object.keys(r))if((i=r[n])!=null?i:0>0)return!0;return!1}function woe(t,e){let r={},i={children:r},n=Object.values(t.advisories);if(e!=null){let s=yoe(e);n=n.filter(o=>s.has(o.severity))}for(let s of fe.sortMap(n,o=>o.module_name))r[s.module_name]={label:s.module_name,value:Ae.tuple(Ae.Type.RANGE,s.findings.map(o=>o.version).join(", ")),children:{Issue:{label:"Issue",value:Ae.tuple(Ae.Type.NO_HINT,s.title)},URL:{label:"URL",value:Ae.tuple(Ae.Type.URL,s.url)},Severity:{label:"Severity",value:Ae.tuple(Ae.Type.NO_HINT,s.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:Ae.tuple(Ae.Type.RANGE,s.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:Ae.tuple(Ae.Type.RANGE,s.patched_versions)},Via:{label:"Via",value:Ae.tuple(Ae.Type.NO_HINT,Array.from(new Set(s.findings.map(o=>o.paths).flat().map(o=>o.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:Ae.tuple(Ae.Type.NO_HINT,s.recommendation.replace(/\n/g," "))}}};return i}function Qoe(t,e,{all:r,environment:i}){let n=r?t.workspaces:[e],s=[Rs.All,Rs.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Rs.All,Rs.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return Eoe([...o,...l].filter(c=>b.parseRange(c.range).protocol===null))}function boe(t,e,{all:r}){var s;let i=X3e(t,e,{all:r}),n={};for(let o of t.storedPackages.values())n[b.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:Eoe(o.dependencies.values()),dev:i.has(b.convertLocatorToDescriptor(o).descriptorHash)};return n}var Sd=class extends ye{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=Y.String("--environment",Rs.All,{description:"Which environments to cover",validator:li(Rs)});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=Y.String("--severity",Zn.Info,{description:"Minimal severity requested for packages to be displayed",validator:li(Zn)})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState();let n=Qoe(r,i,{all:this.all,environment:this.environment}),s=boe(r,i,{all:this.all});if(!this.recursive)for(let h of Object.keys(s))Object.prototype.hasOwnProperty.call(n,h)?s[h].requires={}:delete s[h];let o={requires:n,dependencies:s},a=Wt.getPublishRegistry(i.manifest,{configuration:e}),l,c=await Eo.start({configuration:e,stdout:this.context.stdout},async()=>{l=await St.post("/-/npm/v1/security/audits/quick",o,{authType:St.AuthType.NO_AUTH,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=Boe(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(Yn.emitTree(woe(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Pe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async h=>{h.reportJson(l),u||h.reportInfo(J.EXCEPTION,"No audit suggestions")})).exitCode()}};Sd.paths=[["npm","audit"]],Sd.usage=Ce.Usage({description:"perform a vulnerability audit against the installed packages",details:` - This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). - - For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. - - Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${_B.map(e=>`\`${e}\``).join(", ")}. - - If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. - - To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. - `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var Doe=Sd;var cN=ne(pr()),uN=ne(require("util")),xd=class extends ye{constructor(){super(...arguments);this.fields=Y.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=Y.Rest()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r}=await Le.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Pe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let x=r.topLevelWorkspace;if(!x.manifest.name)throw new me(`Missing 'name' field in ${L.fromPortablePath(D.join(x.cwd,Et.manifest))}`);c=b.makeDescriptor(x.manifest.name,"unknown")}else c=b.parseDescriptor(l);let u=St.getIdentUrl(c),g=gN(await St.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:St.customPackageError})),h=Object.keys(g.versions).sort(cN.default.compareLoose),p=g["dist-tags"].latest||h[h.length-1],m=Ft.validRange(c.range);if(m){let x=cN.default.maxSatisfying(h,m);x!==null?p=x:(a.reportWarning(J.UNNAMED,`Unmet range ${b.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else c.range!=="unknown"&&(a.reportWarning(J.UNNAMED,`Invalid range ${b.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let I=g.versions[p],Q=W(v(v({},g),I),{version:p,versions:h}),w;if(i!==null){w={};for(let x of i){let N=Q[x];if(typeof N!="undefined")w[x]=N;else{a.reportWarning(J.EXCEPTION,`The '${x}' field doesn't exist inside ${b.prettyIdent(e,c)}'s informations`),s=!0;continue}}}else this.json||(delete Q.dist,delete Q.readme,delete Q.users),w=Q;a.reportJson(w),this.json||n.push(w)}});uN.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` -`),this.context.stdout.write(`${(0,uN.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} -`);return o.exitCode()}};xd.paths=[["npm","info"]],xd.usage=Ce.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command will fetch information about a package from the npm registry, and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package informations.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react 16.12.0","yarn npm info react@16.12.0"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var Soe=xd;function gN(t){if(Array.isArray(t)){let e=[];for(let r of t)r=gN(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let i=gN(t[r]);i&&(e[r]=i)}return e}else return t||null}var xoe=ne(dp()),kd=class extends ye{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=await $B({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Pe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await $3e({registry:r,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await St.put(o,s,{attemptedAs:s.name,configuration:e,registry:r,jsonResponse:!0,authType:St.AuthType.NO_AUTH});return await _3e(r,a.token,{configuration:e,scope:this.scope}),n.reportInfo(J.UNNAMED,"Successfully logged in")})).exitCode()}};kd.paths=[["npm","login"]],kd.usage=Ce.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var koe=kd;async function $B({scope:t,publish:e,configuration:r,cwd:i}){return t&&e?Wt.getScopeRegistry(t,{configuration:r,type:Wt.RegistryType.PUBLISH_REGISTRY}):t?Wt.getScopeRegistry(t,{configuration:r}):e?Wt.getPublishRegistry((await bu(r,i)).manifest,{configuration:r}):Wt.getDefaultRegistry({configuration:r})}async function _3e(t,e,{configuration:r,scope:i}){let n=o=>a=>{let l=fe.isIndexableObject(a)?a:{},c=l[o],u=fe.isIndexableObject(c)?c:{};return W(v({},l),{[o]:W(v({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(t)};return await ce.updateHomeConfiguration(s)}async function $3e({registry:t,report:e,stdin:r,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(J.UNNAMED,`Logging in to ${t}`);let n=!1;t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(J.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,xoe.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var tg=new Set(["npmAuthIdent","npmAuthToken"]),vd=class extends ye{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=Y.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r=async()=>{var l;let n=await $B({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await ce.find(this.context.cwd,this.context.plugins),o=b.makeIdent((l=this.scope)!=null?l:null,"pkg");return!Wt.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Pe.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await e4e(),n.reportInfo(J.UNNAMED,"Successfully logged out from everything")),this.scope){await voe("npmScopes",this.scope),await r()?n.reportInfo(J.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(J.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await $B({configuration:e,cwd:this.context.cwd,publish:this.publish});await voe("npmRegistries",s),await r()?n.reportInfo(J.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(J.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};vd.paths=[["npm","logout"]],vd.usage=Ce.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Poe=vd;function t4e(t,e){let r=t[e];if(!fe.isIndexableObject(r))return!1;let i=new Set(Object.keys(r));if([...tg].every(s=>!i.has(s)))return!1;for(let s of tg)i.delete(s);if(i.size===0)return t[e]=void 0,!0;let n=v({},r);for(let s of tg)delete n[s];return t[e]=n,!0}async function e4e(){let t=e=>{let r=!1,i=fe.isIndexableObject(e)?v({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,r=!0);for(let n of Object.keys(i))t4e(i,n)&&(r=!0);if(Object.keys(i).length!==0)return r?i:e};return await ce.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function voe(t,e){return await ce.updateHomeConfiguration({[t]:r=>{let i=fe.isIndexableObject(r)?r:{};if(!Object.prototype.hasOwnProperty.call(i,e))return r;let n=i[e],s=fe.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...tg].every(l=>!o.has(l)))return r;for(let l of tg)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:W(v({},i),{[e]:void 0});let a={};for(let l of tg)a[l]=void 0;return W(v({},i),{[e]:v(v({},s),a)})}})}var Pd=class extends ye{constructor(){super(...arguments);this.access=Y.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=Y.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=Y.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);if(i.manifest.private)throw new me("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new me("Workspaces must have valid names and versions to be published on an external registry");await r.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=Wt.getPublishRegistry(i.manifest,{configuration:e});return(await Pe.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await St.get(St.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new et(J.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(J.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await kt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await No.prepareForPack(i,{report:l},async()=>{let g=await No.genPackList(i);for(let m of g)l.reportInfo(null,m);let h=await No.genPackStream(i,g),f=await fe.bufferStream(h),p=await Dd.makePublishBody(i,f,{access:this.access,tag:this.tag,registry:o});await St.put(St.getIdentUrl(n),p,{configuration:e,registry:o,ident:n,jsonResponse:!0})}),l.reportInfo(J.UNNAMED,"Package archive published")})).exitCode()}};Pd.paths=[["npm","publish"]],Pd.usage=Ce.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var Foe=Pd;var Noe=ne(pr());var Fd=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String({required:!1})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=b.parseIdent(this.package);else{if(!i)throw new _e(r.cwd,this.context.cwd);if(!i.manifest.name)throw new me(`Missing 'name' field in ${L.fromPortablePath(D.join(i.cwd,Et.manifest))}`);n=i.manifest.name}let s=await Rd(n,e),a={children:fe.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:Ae.tuple(Ae.Type.RESOLUTION,{descriptor:b.makeDescriptor(n,l),locator:b.makeLocator(n,c)})}))};return Yn.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};Fd.paths=[["npm","tag","list"]],Fd.usage=Ce.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` - This command will list all tags of a package from the npm registry. - - If the package is not specified, Yarn will default to the current workspace. - `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Roe=Fd;async function Rd(t,e){let r=`/-/package${St.getIdentUrl(t)}/dist-tags`;return St.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:St.customPackageError})}var Nd=class extends ye{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);let n=b.parseDescriptor(this.package,!0),s=n.range;if(!Noe.default.valid(s))throw new me(`The range ${Ae.pretty(e,n.range,Ae.Type.RANGE)} must be a valid semver version`);let o=Wt.getPublishRegistry(i.manifest,{configuration:e}),a=Ae.pretty(e,n,Ae.Type.IDENT),l=Ae.pretty(e,s,Ae.Type.RANGE),c=Ae.pretty(e,this.tag,Ae.Type.CODE);return(await Pe.start({configuration:e,stdout:this.context.stdout},async g=>{let h=await Rd(n,e);Object.prototype.hasOwnProperty.call(h,this.tag)&&h[this.tag]===s&&g.reportWarning(J.UNNAMED,`Tag ${c} is already set to version ${l}`);let f=`/-/package${St.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await St.put(f,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(J.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};Nd.paths=[["npm","tag","add"]],Nd.usage=Ce.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` - This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. - `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var Moe=Nd;var Md=class extends ye{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){if(this.tag==="latest")throw new me("The 'latest' tag cannot be removed.");let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);let n=b.parseIdent(this.package),s=Wt.getPublishRegistry(i.manifest,{configuration:e}),o=Ae.pretty(e,this.tag,Ae.Type.CODE),a=Ae.pretty(e,n,Ae.Type.IDENT),l=await Rd(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new me(`${o} is not a tag of package ${a}`);return(await Pe.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${St.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await St.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(J.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};Md.paths=[["npm","tag","remove"]],Md.usage=Ce.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` - This command will remove a tag from a package from the npm registry. - `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var Loe=Md;var Ld=class extends ye{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),r;return this.scope&&this.publish?r=Wt.getScopeRegistry(this.scope,{configuration:e,type:Wt.RegistryType.PUBLISH_REGISTRY}):this.scope?r=Wt.getScopeRegistry(this.scope,{configuration:e}):this.publish?r=Wt.getPublishRegistry((await bu(e,this.context.cwd)).manifest,{configuration:e}):r=Wt.getDefaultRegistry({configuration:e}),(await Pe.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await St.get("/-/whoami",{configuration:e,registry:r,authType:St.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?b.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(J.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(J.UNNAMED,s.username)})).exitCode()}};Ld.paths=[["npm","whoami"]],Ld.usage=Ce.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var Toe=Ld;var r4e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:ge.STRING,default:null}},commands:[Doe,Soe,koe,Poe,Foe,Moe,Roe,Loe,Toe]},i4e=r4e;var yN={};$e(yN,{default:()=>I4e,patchUtils:()=>fN});var fN={};$e(fN,{applyPatchFile:()=>rw,diffFolders:()=>mN,extractPackageToDisk:()=>CN,extractPatchFlags:()=>joe,isParentRequired:()=>dN,loadPatchFiles:()=>Ud,makeDescriptor:()=>d4e,makeLocator:()=>pN,parseDescriptor:()=>Od,parseLocator:()=>Kd,parsePatchFile:()=>tw});var Td=class extends Error{constructor(e,r){super(`Cannot apply hunk #${e+1}`);this.hunk=r}};var n4e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function rg(t){return D.relative(Se.root,D.resolve(Se.root,L.toPortablePath(t)))}function s4e(t){let e=t.trim().match(n4e);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var o4e=420,a4e=493,gr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(gr||(gr={}));var Ooe=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),A4e=t=>({header:s4e(t),parts:[]}),l4e={["@"]:"header",["-"]:gr.Deletion,["+"]:gr.Insertion,[" "]:gr.Context,["\\"]:"pragma",undefined:gr.Context};function u4e(t){let e=[],r=Ooe(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),r.hunks.push(n),n=null)}function a(){o(),e.push(r),r=Ooe()}for(let l=0;l0?"patch":"mode change",w=null;switch(Q){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:rg(u),toPath:rg(g)}),w=g}break;case"file deletion":{let x=n||p;if(!x)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:I&&I[0]||null,path:rg(x),mode:ew(l),hash:h})}break;case"file creation":{let x=s||m;if(!x)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:I&&I[0]||null,path:rg(x),mode:ew(c),hash:f})}break;case"patch":case"mode change":w=m||s;break;default:fe.assertNever(Q);break}w&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:rg(w),oldMode:ew(o),newMode:ew(a)}),w&&I&&I.length&&e.push({type:"patch",semverExclusivity:i,path:rg(w),hunks:I,beforeHash:h,afterHash:f})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function ew(t){let e=parseInt(t,8)&511;if(e!==o4e&&e!==a4e)throw new Error(`Unexpected file mode string: ${t}`);return e}function tw(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),g4e(u4e(e))}function c4e(t){let e=0,r=0;for(let{type:i,lines:n}of t.parts)switch(i){case gr.Context:r+=n.length,e+=n.length;break;case gr.Deletion:e+=n.length;break;case gr.Insertion:r+=n.length;break;default:fe.assertNever(i);break}if(e!==t.header.original.length||r!==t.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(t.header.original.length)} ${i(t.header.patched.length)} @@, got @@ ${i(e)} ${i(r)} @@)`)}}async function ig(t,e,r){let i=await t.lstatPromise(e),n=await r();if(typeof n!="undefined"&&(e=n),t.lutimesPromise)await t.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await t.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function rw(t,{baseFs:e=new Nt,dryRun:r=!1,version:i=null}={}){for(let n of t)if(!(n.semverExclusivity!==null&&i!==null&&!Ft.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(r){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await ig(e,D.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(r){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await ig(e,D.dirname(n.fromPath),async()=>{await ig(e,D.dirname(n.toPath),async()=>{await ig(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(r){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` -`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` -`):"";await e.mkdirpPromise(D.dirname(n.path),{chmod:493,utimes:[$t.SAFE_TIME,$t.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,$t.SAFE_TIME,$t.SAFE_TIME)}break;case"patch":await ig(e,n.path,async()=>{await h4e(n,{baseFs:e,dryRun:r})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(Koe(n.newMode)!==Koe(o))continue;await ig(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:fe.assertNever(n);break}}function Koe(t){return(t&64)>0}function Uoe(t){return t.replace(/\s+$/,"")}function f4e(t,e){return Uoe(t)===Uoe(e)}async function h4e({hunks:t,path:e},{baseFs:r,dryRun:i=!1}){let n=await r.statSync(e).mode,o=(await r.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of t){let h=Math.max(c,g.header.patched.start+l),f=Math.max(0,h-c),p=Math.max(0,o.length-h-g.header.original.length),m=Math.max(f,p),I=0,Q=0,w=null;for(;I<=m;){if(I<=f&&(Q=h-I,w=Hoe(g,o,Q),w!==null)){I=-I;break}if(I<=p&&(Q=h+I,w=Hoe(g,o,Q),w!==null))break;I+=1}if(w===null)throw new Td(t.indexOf(g),g);a.push(w),l+=I,c=Q+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let h of g)switch(h.type){case"splice":{let f=h.index+u;o.splice(f,h.numToDelete,...h.linesToInsert),u+=h.linesToInsert.length-h.numToDelete}break;case"pop":o.pop();break;case"push":o.push(h.line);break;default:fe.assertNever(h);break}await r.writeFilePromise(e,o.join(` -`),{mode:n})}function Hoe(t,e,r){let i=[];for(let n of t.parts)switch(n.type){case gr.Context:case gr.Deletion:{for(let s of n.lines){let o=e[r];if(o==null||!f4e(o,s))return null;r+=1}n.type===gr.Deletion&&(i.push({type:"splice",index:r-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case gr.Insertion:i.push({type:"splice",index:r,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:fe.assertNever(n.type);break}return i}var p4e=/^builtin<([^>]+)>$/;function Goe(t,e){let{source:r,selector:i,params:n}=b.parseRange(t);if(r===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>L.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?b.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(r);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function Od(t){let i=Goe(t.range,b.parseDescriptor),{sourceItem:e}=i,r=Kr(i,["sourceItem"]);return W(v({},r),{sourceDescriptor:e})}function Kd(t){let i=Goe(t.reference,b.parseLocator),{sourceItem:e}=i,r=Kr(i,["sourceItem"]);return W(v({},r),{sourceLocator:e})}function Yoe({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:i,patchHash:n},s){let o=t!==null?{locator:b.stringifyLocator(t)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return b.makeRange({protocol:"patch:",source:s(e),selector:r.join("&"),params:v(v(v({},a),l),o)})}function d4e(t,{parentLocator:e,sourceDescriptor:r,patchPaths:i}){return b.makeLocator(t,Yoe({parentLocator:e,sourceItem:r,patchPaths:i},b.stringifyDescriptor))}function pN(t,{parentLocator:e,sourcePackage:r,patchPaths:i,patchHash:n}){return b.makeLocator(t,Yoe({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:i,patchHash:n},b.stringifyLocator))}function qoe({onAbsolute:t,onRelative:e,onBuiltin:r},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(p4e);return s!==null?r(s[1]):D.isAbsolute(i)?t(i):e(i)}function joe(t){let e=t.startsWith("~");return e&&(t=t.slice(1)),{optional:e}}function dN(t){return qoe({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},t)}async function Ud(t,e,r){let i=t!==null?await r.fetcher.fetch(t,r):null,n=i&&i.localPath?{packageFs:new Dt(Se.root),prefixPath:D.relative(Se.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await fe.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=joe(o),l=await qoe({onAbsolute:async()=>await M.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(D.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await r.project.configuration.firstHook(u=>u.getBuiltinPatch,r.project,c)},o);return W(v({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` -`));return s}async function CN(t,{cache:e,project:r}){let i=r.storedPackages.get(t.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=r.storedChecksums,s=new Dr,o=r.configuration.makeFetcher(),a=await o.fetch(t,{cache:e,project:r,fetcher:o,checksums:n,report:s}),l=await M.mktempPromise(),c=D.join(l,"source"),u=D.join(l,"user"),g=D.join(l,".yarn-patch.json");return await Promise.all([M.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),M.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),M.writeJsonPromise(g,{locator:b.stringifyLocator(t),version:i.version})]),M.detachTemp(l),u}async function mN(t,e){let r=L.fromPortablePath(t).replace(/\\/g,"/"),i=L.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await Hr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--text",r,i],{cwd:L.toPortablePath(process.cwd()),env:W(v({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. -The following error was reported by 'git': -${s}`);let o=r.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${fe.escapeRegExp(`/${o(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${fe.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(fe.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(fe.escapeRegExp(`${i}/`),"g"),"")}function Joe(t,{configuration:e,report:r}){for(let i of t.parts)for(let n of i.lines)switch(i.type){case gr.Context:r.reportInfo(null,` ${Ae.pretty(e,n,"grey")}`);break;case gr.Deletion:r.reportError(J.FROZEN_LOCKFILE_EXCEPTION,`- ${Ae.pretty(e,n,Ae.Type.REMOVED)}`);break;case gr.Insertion:r.reportError(J.FROZEN_LOCKFILE_EXCEPTION,`+ ${Ae.pretty(e,n,Ae.Type.ADDED)}`);break;default:fe.assertNever(i.type)}}var IN=class{supports(e,r){return!!e.reference.startsWith("patch:")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,{onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${b.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),skipIntegrityCheck:r.skipIntegrityCheck});return{packageFs:n,releaseFs:s,prefixPath:b.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async patchPackage(e,r){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=Kd(e),a=await Ud(i,o,r),l=await M.mktempPromise(),c=D.join(l,"current.zip"),u=await r.fetcher.fetch(n,r),g=b.getIdentVendorPath(e),h=await Ci(),f=new kr(c,{libzip:h,create:!0,level:r.project.configuration.get("compressionLevel")});await fe.releaseAfterUseAsync(async()=>{await f.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),f.saveAndClose();for(let{source:p,optional:m}of a){if(p===null)continue;let I=new kr(c,{libzip:h,level:r.project.configuration.get("compressionLevel")}),Q=new Dt(D.resolve(Se.root,g),{baseFs:I});try{await rw(tw(p),{baseFs:Q,version:s})}catch(w){if(!(w instanceof Td))throw w;let x=r.project.configuration.get("enableInlineHunks"),N=!x&&!m?" (set enableInlineHunks for details)":"",H=`${b.prettyLocator(r.project.configuration,e)}: ${w.message}${N}`,T=P=>{!x||Joe(w.hunk,{configuration:r.project.configuration,report:P})};if(I.discardAndClose(),m){r.report.reportWarningOnce(J.PATCH_HUNK_FAILED,H,{reportExtra:T});continue}else throw new et(J.PATCH_HUNK_FAILED,H,T)}I.saveAndClose()}return new kr(c,{libzip:h,level:r.project.configuration.get("compressionLevel")})}};var C4e=3,EN=class{supportsDescriptor(e,r){return!!e.range.startsWith("patch:")}supportsLocator(e,r){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){let{patchPaths:n}=Od(e);return n.every(s=>!dN(s))?e:b.bindDescriptor(e,{locator:b.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:i}=Od(e);return[i]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=Od(e),a=await Ud(n,o,i.fetchOptions),l=r.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=ki.makeHash(`${C4e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[pN(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){let{sourceLocator:i}=Kd(e),n=await r.resolver.resolve(i,r);return v(v({},n),e)}};var Hd=class extends ye{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState();let n=D.resolve(this.context.cwd,L.toPortablePath(this.patchFolder)),s=D.join(n,"../source"),o=D.join(n,"../.yarn-patch.json");if(!M.existsSync(s))throw new me("The argument folder didn't get created by 'yarn patch'");let a=await mN(s,n),l=await M.readJsonPromise(o),c=b.parseLocator(l.locator,!0);if(!r.storedPackages.has(c.locatorHash))throw new me("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=D.join(u,b.slugifyLocator(c));await M.mkdirPromise(u,{recursive:!0}),await M.writeFilePromise(g,a);let h=D.relative(r.cwd,g);r.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:b.stringifyIdent(c),description:l.version}},reference:`patch:${b.stringifyLocator(c)}#${h}`}),await r.persist()}};Hd.paths=[["patch-commit"]],Hd.usage=Ce.Usage({description:"generate a patch out of a directory",details:"\n This will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n Only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var Woe=Hd;var Gd=class extends ye{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String()}async execute(){let e=await ce.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Le.find(e,this.context.cwd),n=await mt.find(e);if(!i)throw new _e(r.cwd,this.context.cwd);await r.restoreInstallState();let s=b.parseLocator(this.package);if(s.reference==="unknown"){let o=fe.mapAndFilter([...r.storedPackages.values()],a=>a.identHash!==s.identHash?fe.mapAndFilter.skip:b.isVirtualLocator(a)?fe.mapAndFilter.skip:a);if(o.length===0)throw new me("No package found in the project for the given locator");if(o.length>1)throw new me(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): -${o.map(a=>` -- ${b.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!r.storedPackages.has(s.locatorHash))throw new me("No package found in the project for the given locator");await Pe.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await CN(s,{cache:n,project:r});o.reportJson({locator:b.stringifyLocator(s),path:L.fromPortablePath(a)}),o.reportInfo(J.UNNAMED,`Package ${b.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(J.UNNAMED,`You can now edit the following folder: ${Ae.pretty(e,L.fromPortablePath(a),"magenta")}`),o.reportInfo(J.UNNAMED,`Once you are done run ${Ae.pretty(e,`yarn patch-commit ${process.platform==="win32"?'"':""}${L.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};Gd.paths=[["patch"]],Gd.usage=Ce.Usage({description:"prepare a package for patching",details:'\n This command will cause a package to be extracted in a temporary directory (under a folder named "patch-workdir"). This folder will be editable at will; running `yarn patch` inside it will then cause Yarn to generate a patchfile and register it into your top-level manifest (cf the `patch:` protocol).\n '});var zoe=Gd;var m4e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:ge.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[Woe,zoe],fetchers:[IN],resolvers:[EN]},I4e=m4e;var wN={};$e(wN,{default:()=>w4e});var Voe=ne(tf()),BN=class{supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="pnpm"}async findPackageLocation(e,r){return _oe(e,{project:r.project})}async findPackageLocator(e,r){let i=Zoe(),n=r.project.installersCustomData.get(i);if(!n)throw new me(`The project in ${Ae.pretty(r.project.configuration,`${r.project.cwd}/package.json`,Ae.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=D.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new Xoe(e)}},Xoe=class{constructor(e){this.opts=e;this.asyncActions=new tae;this.packageLocations=new Map;this.customData={locatorByPath:new Map}}getCustomDataKey(){return Zoe()}attachCustomData(e){this.customData=e}async installPackage(e,r,i){switch(e.linkType){case lt.SOFT:return this.installPackageSoft(e,r,i);case lt.HARD:return this.installPackageHard(e,r,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,i){let n=D.resolve(r.packageFs.getRealPath(),r.prefixPath);return this.packageLocations.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,r,i){var u;let n=_oe(e,{project:this.opts.project});this.customData.locatorByPath.set(n,b.stringifyLocator(e)),this.packageLocations.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await M.mkdirPromise(n,{recursive:!0}),await M.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1})}));let o=b.isVirtualLocator(e)?b.devirtualizeLocator(e):e,a={manifest:(u=await Je.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?u:new Je,misc:{hasBindingGyp:Wn.hasBindingGyp(r)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Wn.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,r){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!eae(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.packageLocations.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${b.stringifyLocator(e)})`);let s=D.join(n,Et.nodeModules);r.length>0&&await M.mkdirpPromise(s);let o=await E4e(s),a=[];for(let[l,c]of r){let u=c;eae(c,{project:this.opts.project})||(this.opts.report.reportWarning(J.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=b.devirtualizeLocator(c));let g=this.packageLocations.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${b.stringifyLocator(c)})`);let h=b.stringifyIdent(l),f=D.join(s,h),p=D.relative(D.dirname(f),g),m=o.get(h);o.delete(h),a.push(Promise.resolve().then(async()=>{if(m){if(m.isSymbolicLink()&&await M.readlinkPromise(f)===p)return;await M.removePromise(f)}await M.mkdirpPromise(D.dirname(f)),process.platform=="win32"?await M.symlinkPromise(g,f,"junction"):await M.symlinkPromise(p,f)}))}for(let l of o.keys())a.push(M.removePromise(D.join(s,l)));await Promise.all(a)}))}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=$oe(this.opts.project),r=new Set;for(let s of this.packageLocations.values())r.add(D.basename(s));let i;try{i=await M.readdirPromise(e)}catch{i=[]}let n=[];for(let s of i)r.has(s)||n.push(M.removePromise(D.join(e,s)));await Promise.all(n),await this.asyncActions.wait()}};function Zoe(){return JSON.stringify({name:"PnpmInstaller",version:1})}function $oe(t){return D.join(t.cwd,Et.nodeModules,".store")}function _oe(t,{project:e}){let r=b.slugifyLocator(t);return D.join($oe(e),r)}function eae(t,{project:e}){return!b.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function E4e(t){let e=new Map,r=[];try{r=await M.readdirPromise(t,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of r)if(!i.name.startsWith("."))if(i.name.startsWith("@"))for(let n of await M.readdirPromise(D.join(t,i.name),{withFileTypes:!0}))e.set(`${i.name}/${n.name}`,n);else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}function y4e(){let t,e;return{promise:new Promise((i,n)=>{t=i,e=n}),resolve:t,reject:e}}var tae=class{constructor(){this.deferred=new Map;this.promises=new Map;this.limit=(0,Voe.default)(10)}set(e,r){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=y4e());let n=this.limit(()=>r());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,r){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>r(i))}async wait(){await Promise.all(this.promises.values())}};var B4e={linkers:[BN]},w4e=B4e;var sB=()=>({modules:new Map([["@yarnpkg/cli",gp],["@yarnpkg/core",Gf],["@yarnpkg/fslib",Rg],["@yarnpkg/libzip",Hh],["@yarnpkg/parsers",Vh],["@yarnpkg/shell",Zh],["clipanion",M6(Xg)],["semver",Q4e],["typanion",Gl],["yup",b4e],["@yarnpkg/plugin-essentials",WP],["@yarnpkg/plugin-compat",ZP],["@yarnpkg/plugin-dlx",_P],["@yarnpkg/plugin-file",aF],["@yarnpkg/plugin-git",mF],["@yarnpkg/plugin-github",EF],["@yarnpkg/plugin-http",wF],["@yarnpkg/plugin-init",SF],["@yarnpkg/plugin-link",FF],["@yarnpkg/plugin-nm",sR],["@yarnpkg/plugin-npm",AN],["@yarnpkg/plugin-npm-cli",hN],["@yarnpkg/plugin-pack",nN],["@yarnpkg/plugin-patch",yN],["@yarnpkg/plugin-pnp",WF],["@yarnpkg/plugin-pnpm",wN]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});ky({binaryVersion:Qr||"",pluginConfiguration:sB()});})(); -/*! - * buildToken - * Builds OAuth token prefix (helper function) - * - * @name buildToken - * @function - * @param {GitUrl} obj The parsed Git url object. - * @return {String} token prefix - */ -/*! - * fill-range - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-extglob - * - * Copyright (c) 2014-2016, Jon Schlinkert. - * Licensed under the MIT License. - */ -/*! - * is-glob - * - * Copyright (c) 2014-2017, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-number - * - * Copyright (c) 2014-present, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * is-windows - * - * Copyright © 2015-2018, Jon Schlinkert. - * Released under the MIT License. - */ -/*! - * to-regex-range - * - * Copyright (c) 2015-present, Jon Schlinkert. - * Released under the MIT License. - */ diff --git a/.yarn/releases/yarn-3.1.1.cjs b/.yarn/releases/yarn-3.1.1.cjs new file mode 100755 index 00000000000..f5f2adca83b --- /dev/null +++ b/.yarn/releases/yarn-3.1.1.cjs @@ -0,0 +1,768 @@ +#!/usr/bin/env node +/* eslint-disable */ +//prettier-ignore +(()=>{var Mfe=Object.create,Vf=Object.defineProperty,Ofe=Object.defineProperties,Kfe=Object.getOwnPropertyDescriptor,Ufe=Object.getOwnPropertyDescriptors,Hfe=Object.getOwnPropertyNames,hE=Object.getOwnPropertySymbols,Gfe=Object.getPrototypeOf,eb=Object.prototype.hasOwnProperty,lO=Object.prototype.propertyIsEnumerable;var cO=(t,e,r)=>e in t?Vf(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r,P=(t,e)=>{for(var r in e||(e={}))eb.call(e,r)&&cO(t,r,e[r]);if(hE)for(var r of hE(e))lO.call(e,r)&&cO(t,r,e[r]);return t},_=(t,e)=>Ofe(t,Ufe(e)),jfe=t=>Vf(t,"__esModule",{value:!0});var qr=(t,e)=>{var r={};for(var i in t)eb.call(t,i)&&e.indexOf(i)<0&&(r[i]=t[i]);if(t!=null&&hE)for(var i of hE(t))e.indexOf(i)<0&&lO.call(t,i)&&(r[i]=t[i]);return r},Yfe=(t,e)=>()=>(t&&(e=t(t=0)),e),E=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),it=(t,e)=>{for(var r in e)Vf(t,r,{get:e[r],enumerable:!0})},qfe=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Hfe(e))!eb.call(t,i)&&i!=="default"&&Vf(t,i,{get:()=>e[i],enumerable:!(r=Kfe(e,i))||r.enumerable});return t},ie=t=>qfe(jfe(Vf(t!=null?Mfe(Gfe(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var MO=E((i$e,FO)=>{FO.exports=NO;NO.sync=Ahe;var LO=require("fs");function lhe(t,e){var r=e.pathExt!==void 0?e.pathExt:process.env.PATHEXT;if(!r||(r=r.split(";"),r.indexOf("")!==-1))return!0;for(var i=0;i{OO.exports=KO;KO.sync=che;var UO=require("fs");function KO(t,e,r){UO.stat(t,function(i,n){r(i,i?!1:HO(n,e))})}function che(t,e){return HO(UO.statSync(t),e)}function HO(t,e){return t.isFile()&&uhe(t,e)}function uhe(t,e){var r=t.mode,i=t.uid,n=t.gid,s=e.uid!==void 0?e.uid:process.getuid&&process.getuid(),o=e.gid!==void 0?e.gid:process.getgid&&process.getgid(),a=parseInt("100",8),l=parseInt("010",8),c=parseInt("001",8),u=a|l,g=r&c||r&l&&n===o||r&a&&i===s||r&u&&s===0;return g}});var YO=E((o$e,jO)=>{var s$e=require("fs"),xE;process.platform==="win32"||global.TESTING_WINDOWS?xE=MO():xE=GO();jO.exports=db;db.sync=ghe;function db(t,e,r){if(typeof e=="function"&&(r=e,e={}),!r){if(typeof Promise!="function")throw new TypeError("callback not provided");return new Promise(function(i,n){db(t,e||{},function(s,o){s?n(s):i(o)})})}xE(t,e||{},function(i,n){i&&(i.code==="EACCES"||e&&e.ignoreErrors)&&(i=null,n=!1),r(i,n)})}function ghe(t,e){try{return xE.sync(t,e||{})}catch(r){if(e&&e.ignoreErrors||r.code==="EACCES")return!1;throw r}}});var XO=E((a$e,qO)=>{var eu=process.platform==="win32"||process.env.OSTYPE==="cygwin"||process.env.OSTYPE==="msys",JO=require("path"),fhe=eu?";":":",WO=YO(),zO=t=>Object.assign(new Error(`not found: ${t}`),{code:"ENOENT"}),VO=(t,e)=>{let r=e.colon||fhe,i=t.match(/\//)||eu&&t.match(/\\/)?[""]:[...eu?[process.cwd()]:[],...(e.path||process.env.PATH||"").split(r)],n=eu?e.pathExt||process.env.PATHEXT||".EXE;.CMD;.BAT;.COM":"",s=eu?n.split(r):[""];return eu&&t.indexOf(".")!==-1&&s[0]!==""&&s.unshift(""),{pathEnv:i,pathExt:s,pathExtExe:n}},_O=(t,e,r)=>{typeof e=="function"&&(r=e,e={}),e||(e={});let{pathEnv:i,pathExt:n,pathExtExe:s}=VO(t,e),o=[],a=c=>new Promise((u,g)=>{if(c===i.length)return e.all&&o.length?u(o):g(zO(t));let f=i[c],h=/^".*"$/.test(f)?f.slice(1,-1):f,p=JO.join(h,t),d=!h&&/^\.[\\\/]/.test(t)?t.slice(0,2)+p:p;u(l(d,c,0))}),l=(c,u,g)=>new Promise((f,h)=>{if(g===n.length)return f(a(u+1));let p=n[g];WO(c+p,{pathExt:s},(d,m)=>{if(!d&&m)if(e.all)o.push(c+p);else return f(c+p);return f(l(c,u,g+1))})});return r?a(0).then(c=>r(null,c),r):a(0)},hhe=(t,e)=>{e=e||{};let{pathEnv:r,pathExt:i,pathExtExe:n}=VO(t,e),s=[];for(let o=0;o{"use strict";var ZO=(t={})=>{let e=t.env||process.env;return(t.platform||process.platform)!=="win32"?"PATH":Object.keys(e).reverse().find(i=>i.toUpperCase()==="PATH")||"Path"};Cb.exports=ZO;Cb.exports.default=ZO});var iK=E((l$e,eK)=>{"use strict";var tK=require("path"),phe=XO(),dhe=$O();function rK(t,e){let r=t.options.env||process.env,i=process.cwd(),n=t.options.cwd!=null,s=n&&process.chdir!==void 0&&!process.chdir.disabled;if(s)try{process.chdir(t.options.cwd)}catch(a){}let o;try{o=phe.sync(t.command,{path:r[dhe({env:r})],pathExt:e?tK.delimiter:void 0})}catch(a){}finally{s&&process.chdir(i)}return o&&(o=tK.resolve(n?t.options.cwd:"",o)),o}function Che(t){return rK(t)||rK(t,!0)}eK.exports=Che});var nK=E((c$e,mb)=>{"use strict";var Eb=/([()\][%!^"`<>&|;, *?])/g;function mhe(t){return t=t.replace(Eb,"^$1"),t}function Ehe(t,e){return t=`${t}`,t=t.replace(/(\\*)"/g,'$1$1\\"'),t=t.replace(/(\\*)$/,"$1$1"),t=`"${t}"`,t=t.replace(Eb,"^$1"),e&&(t=t.replace(Eb,"^$1")),t}mb.exports.command=mhe;mb.exports.argument=Ehe});var oK=E((u$e,sK)=>{"use strict";sK.exports=/^#!(.*)/});var AK=E((g$e,aK)=>{"use strict";var Ihe=oK();aK.exports=(t="")=>{let e=t.match(Ihe);if(!e)return null;let[r,i]=e[0].replace(/#! ?/,"").split(" "),n=r.split("/").pop();return n==="env"?i:i?`${n} ${i}`:n}});var cK=E((f$e,lK)=>{"use strict";var Ib=require("fs"),yhe=AK();function whe(t){let e=150,r=Buffer.alloc(e),i;try{i=Ib.openSync(t,"r"),Ib.readSync(i,r,0,e,0),Ib.closeSync(i)}catch(n){}return yhe(r.toString())}lK.exports=whe});var hK=E((h$e,uK)=>{"use strict";var Bhe=require("path"),gK=iK(),fK=nK(),Qhe=cK(),bhe=process.platform==="win32",vhe=/\.(?:com|exe)$/i,She=/node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i;function xhe(t){t.file=gK(t);let e=t.file&&Qhe(t.file);return e?(t.args.unshift(t.file),t.command=e,gK(t)):t.file}function khe(t){if(!bhe)return t;let e=xhe(t),r=!vhe.test(e);if(t.options.forceShell||r){let i=She.test(e);t.command=Bhe.normalize(t.command),t.command=fK.command(t.command),t.args=t.args.map(s=>fK.argument(s,i));let n=[t.command].concat(t.args).join(" ");t.args=["/d","/s","/c",`"${n}"`],t.command=process.env.comspec||"cmd.exe",t.options.windowsVerbatimArguments=!0}return t}function Phe(t,e,r){e&&!Array.isArray(e)&&(r=e,e=null),e=e?e.slice(0):[],r=Object.assign({},r);let i={command:t,args:e,options:r,file:void 0,original:{command:t,args:e}};return r.shell?i:khe(i)}uK.exports=Phe});var CK=E((p$e,pK)=>{"use strict";var yb=process.platform==="win32";function wb(t,e){return Object.assign(new Error(`${e} ${t.command} ENOENT`),{code:"ENOENT",errno:"ENOENT",syscall:`${e} ${t.command}`,path:t.command,spawnargs:t.args})}function Dhe(t,e){if(!yb)return;let r=t.emit;t.emit=function(i,n){if(i==="exit"){let s=dK(n,e,"spawn");if(s)return r.call(t,"error",s)}return r.apply(t,arguments)}}function dK(t,e){return yb&&t===1&&!e.file?wb(e.original,"spawn"):null}function Rhe(t,e){return yb&&t===1&&!e.file?wb(e.original,"spawnSync"):null}pK.exports={hookChildProcess:Dhe,verifyENOENT:dK,verifyENOENTSync:Rhe,notFoundError:wb}});var bb=E((d$e,tu)=>{"use strict";var mK=require("child_process"),Bb=hK(),Qb=CK();function EK(t,e,r){let i=Bb(t,e,r),n=mK.spawn(i.command,i.args,i.options);return Qb.hookChildProcess(n,i),n}function Fhe(t,e,r){let i=Bb(t,e,r),n=mK.spawnSync(i.command,i.args,i.options);return n.error=n.error||Qb.verifyENOENTSync(n.status,i),n}tu.exports=EK;tu.exports.spawn=EK;tu.exports.sync=Fhe;tu.exports._parse=Bb;tu.exports._enoent=Qb});var yK=E((y$e,IK)=>{"use strict";IK.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}});var Nb=E((w$e,wK)=>{var gh=yK(),BK={};for(let t of Object.keys(gh))BK[gh[t]]=t;var Xe={rgb:{channels:3,labels:"rgb"},hsl:{channels:3,labels:"hsl"},hsv:{channels:3,labels:"hsv"},hwb:{channels:3,labels:"hwb"},cmyk:{channels:4,labels:"cmyk"},xyz:{channels:3,labels:"xyz"},lab:{channels:3,labels:"lab"},lch:{channels:3,labels:"lch"},hex:{channels:1,labels:["hex"]},keyword:{channels:1,labels:["keyword"]},ansi16:{channels:1,labels:["ansi16"]},ansi256:{channels:1,labels:["ansi256"]},hcg:{channels:3,labels:["h","c","g"]},apple:{channels:3,labels:["r16","g16","b16"]},gray:{channels:1,labels:["gray"]}};wK.exports=Xe;for(let t of Object.keys(Xe)){if(!("channels"in Xe[t]))throw new Error("missing channels property: "+t);if(!("labels"in Xe[t]))throw new Error("missing channel labels property: "+t);if(Xe[t].labels.length!==Xe[t].channels)throw new Error("channel and label counts mismatch: "+t);let{channels:e,labels:r}=Xe[t];delete Xe[t].channels,delete Xe[t].labels,Object.defineProperty(Xe[t],"channels",{value:e}),Object.defineProperty(Xe[t],"labels",{value:r})}Xe.rgb.hsl=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(e,r,i),s=Math.max(e,r,i),o=s-n,a,l;s===n?a=0:e===s?a=(r-i)/o:r===s?a=2+(i-e)/o:i===s&&(a=4+(e-r)/o),a=Math.min(a*60,360),a<0&&(a+=360);let c=(n+s)/2;return s===n?l=0:c<=.5?l=o/(s+n):l=o/(2-s-n),[a,l*100,c*100]};Xe.rgb.hsv=function(t){let e,r,i,n,s,o=t[0]/255,a=t[1]/255,l=t[2]/255,c=Math.max(o,a,l),u=c-Math.min(o,a,l),g=function(f){return(c-f)/6/u+1/2};return u===0?(n=0,s=0):(s=u/c,e=g(o),r=g(a),i=g(l),o===c?n=i-r:a===c?n=1/3+e-i:l===c&&(n=2/3+r-e),n<0?n+=1:n>1&&(n-=1)),[n*360,s*100,c*100]};Xe.rgb.hwb=function(t){let e=t[0],r=t[1],i=t[2],n=Xe.rgb.hsl(t)[0],s=1/255*Math.min(e,Math.min(r,i));return i=1-1/255*Math.max(e,Math.max(r,i)),[n,s*100,i*100]};Xe.rgb.cmyk=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.min(1-e,1-r,1-i),s=(1-e-n)/(1-n)||0,o=(1-r-n)/(1-n)||0,a=(1-i-n)/(1-n)||0;return[s*100,o*100,a*100,n*100]};function The(t,e){return(t[0]-e[0])**2+(t[1]-e[1])**2+(t[2]-e[2])**2}Xe.rgb.keyword=function(t){let e=BK[t];if(e)return e;let r=Infinity,i;for(let n of Object.keys(gh)){let s=gh[n],o=The(t,s);o.04045?((e+.055)/1.055)**2.4:e/12.92,r=r>.04045?((r+.055)/1.055)**2.4:r/12.92,i=i>.04045?((i+.055)/1.055)**2.4:i/12.92;let n=e*.4124+r*.3576+i*.1805,s=e*.2126+r*.7152+i*.0722,o=e*.0193+r*.1192+i*.9505;return[n*100,s*100,o*100]};Xe.rgb.lab=function(t){let e=Xe.rgb.xyz(t),r=e[0],i=e[1],n=e[2];r/=95.047,i/=100,n/=108.883,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116,n=n>.008856?n**(1/3):7.787*n+16/116;let s=116*i-16,o=500*(r-i),a=200*(i-n);return[s,o,a]};Xe.hsl.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n,s,o;if(r===0)return o=i*255,[o,o,o];i<.5?n=i*(1+r):n=i+r-i*r;let a=2*i-n,l=[0,0,0];for(let c=0;c<3;c++)s=e+1/3*-(c-1),s<0&&s++,s>1&&s--,6*s<1?o=a+(n-a)*6*s:2*s<1?o=n:3*s<2?o=a+(n-a)*(2/3-s)*6:o=a,l[c]=o*255;return l};Xe.hsl.hsv=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=r,s=Math.max(i,.01);i*=2,r*=i<=1?i:2-i,n*=s<=1?s:2-s;let o=(i+r)/2,a=i===0?2*n/(s+n):2*r/(i+r);return[e,a*100,o*100]};Xe.hsv.rgb=function(t){let e=t[0]/60,r=t[1]/100,i=t[2]/100,n=Math.floor(e)%6,s=e-Math.floor(e),o=255*i*(1-r),a=255*i*(1-r*s),l=255*i*(1-r*(1-s));switch(i*=255,n){case 0:return[i,l,o];case 1:return[a,i,o];case 2:return[o,i,l];case 3:return[o,a,i];case 4:return[l,o,i];case 5:return[i,o,a]}};Xe.hsv.hsl=function(t){let e=t[0],r=t[1]/100,i=t[2]/100,n=Math.max(i,.01),s,o;o=(2-r)*i;let a=(2-r)*n;return s=r*n,s/=a<=1?a:2-a,s=s||0,o/=2,[e,s*100,o*100]};Xe.hwb.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100,n=r+i,s;n>1&&(r/=n,i/=n);let o=Math.floor(6*e),a=1-i;s=6*e-o,(o&1)!=0&&(s=1-s);let l=r+s*(a-r),c,u,g;switch(o){default:case 6:case 0:c=a,u=l,g=r;break;case 1:c=l,u=a,g=r;break;case 2:c=r,u=a,g=l;break;case 3:c=r,u=l,g=a;break;case 4:c=l,u=r,g=a;break;case 5:c=a,u=r,g=l;break}return[c*255,u*255,g*255]};Xe.cmyk.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n=t[3]/100,s=1-Math.min(1,e*(1-n)+n),o=1-Math.min(1,r*(1-n)+n),a=1-Math.min(1,i*(1-n)+n);return[s*255,o*255,a*255]};Xe.xyz.rgb=function(t){let e=t[0]/100,r=t[1]/100,i=t[2]/100,n,s,o;return n=e*3.2406+r*-1.5372+i*-.4986,s=e*-.9689+r*1.8758+i*.0415,o=e*.0557+r*-.204+i*1.057,n=n>.0031308?1.055*n**(1/2.4)-.055:n*12.92,s=s>.0031308?1.055*s**(1/2.4)-.055:s*12.92,o=o>.0031308?1.055*o**(1/2.4)-.055:o*12.92,n=Math.min(Math.max(0,n),1),s=Math.min(Math.max(0,s),1),o=Math.min(Math.max(0,o),1),[n*255,s*255,o*255]};Xe.xyz.lab=function(t){let e=t[0],r=t[1],i=t[2];e/=95.047,r/=100,i/=108.883,e=e>.008856?e**(1/3):7.787*e+16/116,r=r>.008856?r**(1/3):7.787*r+16/116,i=i>.008856?i**(1/3):7.787*i+16/116;let n=116*r-16,s=500*(e-r),o=200*(r-i);return[n,s,o]};Xe.lab.xyz=function(t){let e=t[0],r=t[1],i=t[2],n,s,o;s=(e+16)/116,n=r/500+s,o=s-i/200;let a=s**3,l=n**3,c=o**3;return s=a>.008856?a:(s-16/116)/7.787,n=l>.008856?l:(n-16/116)/7.787,o=c>.008856?c:(o-16/116)/7.787,n*=95.047,s*=100,o*=108.883,[n,s,o]};Xe.lab.lch=function(t){let e=t[0],r=t[1],i=t[2],n;n=Math.atan2(i,r)*360/2/Math.PI,n<0&&(n+=360);let o=Math.sqrt(r*r+i*i);return[e,o,n]};Xe.lch.lab=function(t){let e=t[0],r=t[1],n=t[2]/360*2*Math.PI,s=r*Math.cos(n),o=r*Math.sin(n);return[e,s,o]};Xe.rgb.ansi16=function(t,e=null){let[r,i,n]=t,s=e===null?Xe.rgb.hsv(t)[2]:e;if(s=Math.round(s/50),s===0)return 30;let o=30+(Math.round(n/255)<<2|Math.round(i/255)<<1|Math.round(r/255));return s===2&&(o+=60),o};Xe.hsv.ansi16=function(t){return Xe.rgb.ansi16(Xe.hsv.rgb(t),t[2])};Xe.rgb.ansi256=function(t){let e=t[0],r=t[1],i=t[2];return e===r&&r===i?e<8?16:e>248?231:Math.round((e-8)/247*24)+232:16+36*Math.round(e/255*5)+6*Math.round(r/255*5)+Math.round(i/255*5)};Xe.ansi16.rgb=function(t){let e=t%10;if(e===0||e===7)return t>50&&(e+=3.5),e=e/10.5*255,[e,e,e];let r=(~~(t>50)+1)*.5,i=(e&1)*r*255,n=(e>>1&1)*r*255,s=(e>>2&1)*r*255;return[i,n,s]};Xe.ansi256.rgb=function(t){if(t>=232){let s=(t-232)*10+8;return[s,s,s]}t-=16;let e,r=Math.floor(t/36)/5*255,i=Math.floor((e=t%36)/6)/5*255,n=e%6/5*255;return[r,i,n]};Xe.rgb.hex=function(t){let r=(((Math.round(t[0])&255)<<16)+((Math.round(t[1])&255)<<8)+(Math.round(t[2])&255)).toString(16).toUpperCase();return"000000".substring(r.length)+r};Xe.hex.rgb=function(t){let e=t.toString(16).match(/[a-f0-9]{6}|[a-f0-9]{3}/i);if(!e)return[0,0,0];let r=e[0];e[0].length===3&&(r=r.split("").map(a=>a+a).join(""));let i=parseInt(r,16),n=i>>16&255,s=i>>8&255,o=i&255;return[n,s,o]};Xe.rgb.hcg=function(t){let e=t[0]/255,r=t[1]/255,i=t[2]/255,n=Math.max(Math.max(e,r),i),s=Math.min(Math.min(e,r),i),o=n-s,a,l;return o<1?a=s/(1-o):a=0,o<=0?l=0:n===e?l=(r-i)/o%6:n===r?l=2+(i-e)/o:l=4+(e-r)/o,l/=6,l%=1,[l*360,o*100,a*100]};Xe.hsl.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=r<.5?2*e*r:2*e*(1-r),n=0;return i<1&&(n=(r-.5*i)/(1-i)),[t[0],i*100,n*100]};Xe.hsv.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=e*r,n=0;return i<1&&(n=(r-i)/(1-i)),[t[0],i*100,n*100]};Xe.hcg.rgb=function(t){let e=t[0]/360,r=t[1]/100,i=t[2]/100;if(r===0)return[i*255,i*255,i*255];let n=[0,0,0],s=e%1*6,o=s%1,a=1-o,l=0;switch(Math.floor(s)){case 0:n[0]=1,n[1]=o,n[2]=0;break;case 1:n[0]=a,n[1]=1,n[2]=0;break;case 2:n[0]=0,n[1]=1,n[2]=o;break;case 3:n[0]=0,n[1]=a,n[2]=1;break;case 4:n[0]=o,n[1]=0,n[2]=1;break;default:n[0]=1,n[1]=0,n[2]=a}return l=(1-r)*i,[(r*n[0]+l)*255,(r*n[1]+l)*255,(r*n[2]+l)*255]};Xe.hcg.hsv=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e),n=0;return i>0&&(n=e/i),[t[0],n*100,i*100]};Xe.hcg.hsl=function(t){let e=t[1]/100,i=t[2]/100*(1-e)+.5*e,n=0;return i>0&&i<.5?n=e/(2*i):i>=.5&&i<1&&(n=e/(2*(1-i))),[t[0],n*100,i*100]};Xe.hcg.hwb=function(t){let e=t[1]/100,r=t[2]/100,i=e+r*(1-e);return[t[0],(i-e)*100,(1-i)*100]};Xe.hwb.hcg=function(t){let e=t[1]/100,r=t[2]/100,i=1-r,n=i-e,s=0;return n<1&&(s=(i-n)/(1-n)),[t[0],n*100,s*100]};Xe.apple.rgb=function(t){return[t[0]/65535*255,t[1]/65535*255,t[2]/65535*255]};Xe.rgb.apple=function(t){return[t[0]/255*65535,t[1]/255*65535,t[2]/255*65535]};Xe.gray.rgb=function(t){return[t[0]/100*255,t[0]/100*255,t[0]/100*255]};Xe.gray.hsl=function(t){return[0,0,t[0]]};Xe.gray.hsv=Xe.gray.hsl;Xe.gray.hwb=function(t){return[0,100,t[0]]};Xe.gray.cmyk=function(t){return[0,0,0,t[0]]};Xe.gray.lab=function(t){return[t[0],0,0]};Xe.gray.hex=function(t){let e=Math.round(t[0]/100*255)&255,i=((e<<16)+(e<<8)+e).toString(16).toUpperCase();return"000000".substring(i.length)+i};Xe.rgb.gray=function(t){return[(t[0]+t[1]+t[2])/3/255*100]}});var bK=E((B$e,QK)=>{var kE=Nb();function Mhe(){let t={},e=Object.keys(kE);for(let r=e.length,i=0;i{var Lb=Nb(),Hhe=bK(),ru={},Ghe=Object.keys(Lb);function jhe(t){let e=function(...r){let i=r[0];return i==null?i:(i.length>1&&(r=i),t(r))};return"conversion"in t&&(e.conversion=t.conversion),e}function Yhe(t){let e=function(...r){let i=r[0];if(i==null)return i;i.length>1&&(r=i);let n=t(r);if(typeof n=="object")for(let s=n.length,o=0;o{ru[t]={},Object.defineProperty(ru[t],"channels",{value:Lb[t].channels}),Object.defineProperty(ru[t],"labels",{value:Lb[t].labels});let e=Hhe(t);Object.keys(e).forEach(i=>{let n=e[i];ru[t][i]=Yhe(n),ru[t][i].raw=jhe(n)})});vK.exports=ru});var FK=E((b$e,xK)=>{"use strict";var kK=(t,e)=>(...r)=>`[${t(...r)+e}m`,PK=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};5;${i}m`},DK=(t,e)=>(...r)=>{let i=t(...r);return`[${38+e};2;${i[0]};${i[1]};${i[2]}m`},PE=t=>t,RK=(t,e,r)=>[t,e,r],iu=(t,e,r)=>{Object.defineProperty(t,e,{get:()=>{let i=r();return Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0}),i},enumerable:!0,configurable:!0})},Tb,nu=(t,e,r,i)=>{Tb===void 0&&(Tb=SK());let n=i?10:0,s={};for(let[o,a]of Object.entries(Tb)){let l=o==="ansi16"?"ansi":o;o===e?s[l]=t(r,n):typeof a=="object"&&(s[l]=t(a[e],n))}return s};function qhe(){let t=new Map,e={modifier:{reset:[0,0],bold:[1,22],dim:[2,22],italic:[3,23],underline:[4,24],inverse:[7,27],hidden:[8,28],strikethrough:[9,29]},color:{black:[30,39],red:[31,39],green:[32,39],yellow:[33,39],blue:[34,39],magenta:[35,39],cyan:[36,39],white:[37,39],blackBright:[90,39],redBright:[91,39],greenBright:[92,39],yellowBright:[93,39],blueBright:[94,39],magentaBright:[95,39],cyanBright:[96,39],whiteBright:[97,39]},bgColor:{bgBlack:[40,49],bgRed:[41,49],bgGreen:[42,49],bgYellow:[43,49],bgBlue:[44,49],bgMagenta:[45,49],bgCyan:[46,49],bgWhite:[47,49],bgBlackBright:[100,49],bgRedBright:[101,49],bgGreenBright:[102,49],bgYellowBright:[103,49],bgBlueBright:[104,49],bgMagentaBright:[105,49],bgCyanBright:[106,49],bgWhiteBright:[107,49]}};e.color.gray=e.color.blackBright,e.bgColor.bgGray=e.bgColor.bgBlackBright,e.color.grey=e.color.blackBright,e.bgColor.bgGrey=e.bgColor.bgBlackBright;for(let[r,i]of Object.entries(e)){for(let[n,s]of Object.entries(i))e[n]={open:`[${s[0]}m`,close:`[${s[1]}m`},i[n]=e[n],t.set(s[0],s[1]);Object.defineProperty(e,r,{value:i,enumerable:!1})}return Object.defineProperty(e,"codes",{value:t,enumerable:!1}),e.color.close="",e.bgColor.close="",iu(e.color,"ansi",()=>nu(kK,"ansi16",PE,!1)),iu(e.color,"ansi256",()=>nu(PK,"ansi256",PE,!1)),iu(e.color,"ansi16m",()=>nu(DK,"rgb",RK,!1)),iu(e.bgColor,"ansi",()=>nu(kK,"ansi16",PE,!0)),iu(e.bgColor,"ansi256",()=>nu(PK,"ansi256",PE,!0)),iu(e.bgColor,"ansi16m",()=>nu(DK,"rgb",RK,!0)),e}Object.defineProperty(xK,"exports",{enumerable:!0,get:qhe})});var LK=E((v$e,NK)=>{"use strict";NK.exports=(t,e=process.argv)=>{let r=t.startsWith("-")?"":t.length===1?"-":"--",i=e.indexOf(r+t),n=e.indexOf("--");return i!==-1&&(n===-1||i{"use strict";var Jhe=require("os"),MK=require("tty"),Wn=LK(),{env:Wr}=process,tA;Wn("no-color")||Wn("no-colors")||Wn("color=false")||Wn("color=never")?tA=0:(Wn("color")||Wn("colors")||Wn("color=true")||Wn("color=always"))&&(tA=1);"FORCE_COLOR"in Wr&&(Wr.FORCE_COLOR==="true"?tA=1:Wr.FORCE_COLOR==="false"?tA=0:tA=Wr.FORCE_COLOR.length===0?1:Math.min(parseInt(Wr.FORCE_COLOR,10),3));function Mb(t){return t===0?!1:{level:t,hasBasic:!0,has256:t>=2,has16m:t>=3}}function Ob(t,e){if(tA===0)return 0;if(Wn("color=16m")||Wn("color=full")||Wn("color=truecolor"))return 3;if(Wn("color=256"))return 2;if(t&&!e&&tA===void 0)return 0;let r=tA||0;if(Wr.TERM==="dumb")return r;if(process.platform==="win32"){let i=Jhe.release().split(".");return Number(i[0])>=10&&Number(i[2])>=10586?Number(i[2])>=14931?3:2:1}if("CI"in Wr)return["TRAVIS","CIRCLECI","APPVEYOR","GITLAB_CI"].some(i=>i in Wr)||Wr.CI_NAME==="codeship"?1:r;if("TEAMCITY_VERSION"in Wr)return/^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(Wr.TEAMCITY_VERSION)?1:0;if("GITHUB_ACTIONS"in Wr)return 1;if(Wr.COLORTERM==="truecolor")return 3;if("TERM_PROGRAM"in Wr){let i=parseInt((Wr.TERM_PROGRAM_VERSION||"").split(".")[0],10);switch(Wr.TERM_PROGRAM){case"iTerm.app":return i>=3?3:2;case"Apple_Terminal":return 2}}return/-256(color)?$/i.test(Wr.TERM)?2:/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(Wr.TERM)||"COLORTERM"in Wr?1:r}function Whe(t){let e=Ob(t,t&&t.isTTY);return Mb(e)}TK.exports={supportsColor:Whe,stdout:Mb(Ob(!0,MK.isatty(1))),stderr:Mb(Ob(!0,MK.isatty(2)))}});var UK=E((x$e,KK)=>{"use strict";var zhe=(t,e,r)=>{let i=t.indexOf(e);if(i===-1)return t;let n=e.length,s=0,o="";do o+=t.substr(s,i-s)+e+r,s=i+n,i=t.indexOf(e,s);while(i!==-1);return o+=t.substr(s),o},Vhe=(t,e,r,i)=>{let n=0,s="";do{let o=t[i-1]==="\r";s+=t.substr(n,(o?i-1:i)-n)+e+(o?`\r +`:` +`)+r,n=i+1,i=t.indexOf(` +`,n)}while(i!==-1);return s+=t.substr(n),s};KK.exports={stringReplaceAll:zhe,stringEncaseCRLFWithFirstIndex:Vhe}});var qK=E((k$e,HK)=>{"use strict";var _he=/(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi,GK=/(?:^|\.)(\w+)(?:\(([^)]*)\))?/g,Xhe=/^(['"])((?:\\.|(?!\1)[^\\])*)\1$/,Zhe=/\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.)|([^\\])/gi,$he=new Map([["n",` +`],["r","\r"],["t"," "],["b","\b"],["f","\f"],["v","\v"],["0","\0"],["\\","\\"],["e",""],["a","\x07"]]);function jK(t){let e=t[0]==="u",r=t[1]==="{";return e&&!r&&t.length===5||t[0]==="x"&&t.length===3?String.fromCharCode(parseInt(t.slice(1),16)):e&&r?String.fromCodePoint(parseInt(t.slice(2,-1),16)):$he.get(t)||t}function epe(t,e){let r=[],i=e.trim().split(/\s*,\s*/g),n;for(let s of i){let o=Number(s);if(!Number.isNaN(o))r.push(o);else if(n=s.match(Xhe))r.push(n[2].replace(Zhe,(a,l,c)=>l?jK(l):c));else throw new Error(`Invalid Chalk template style argument: ${s} (in style '${t}')`)}return r}function tpe(t){GK.lastIndex=0;let e=[],r;for(;(r=GK.exec(t))!==null;){let i=r[1];if(r[2]){let n=epe(i,r[2]);e.push([i].concat(n))}else e.push([i])}return e}function YK(t,e){let r={};for(let n of e)for(let s of n.styles)r[s[0]]=n.inverse?null:s.slice(1);let i=t;for(let[n,s]of Object.entries(r))if(!!Array.isArray(s)){if(!(n in i))throw new Error(`Unknown Chalk style: ${n}`);i=s.length>0?i[n](...s):i[n]}return i}HK.exports=(t,e)=>{let r=[],i=[],n=[];if(e.replace(_he,(s,o,a,l,c,u)=>{if(o)n.push(jK(o));else if(l){let g=n.join("");n=[],i.push(r.length===0?g:YK(t,r)(g)),r.push({inverse:a,styles:tpe(l)})}else if(c){if(r.length===0)throw new Error("Found extraneous } in Chalk template literal");i.push(YK(t,r)(n.join(""))),n=[],r.pop()}else n.push(u)}),i.push(n.join("")),r.length>0){let s=`Chalk template literal is missing ${r.length} closing bracket${r.length===1?"":"s"} (\`}\`)`;throw new Error(s)}return i.join("")}});var jb=E((P$e,JK)=>{"use strict";var fh=FK(),{stdout:Kb,stderr:Ub}=OK(),{stringReplaceAll:rpe,stringEncaseCRLFWithFirstIndex:ipe}=UK(),WK=["ansi","ansi","ansi256","ansi16m"],su=Object.create(null),npe=(t,e={})=>{if(e.level>3||e.level<0)throw new Error("The `level` option should be an integer from 0 to 3");let r=Kb?Kb.level:0;t.level=e.level===void 0?r:e.level},zK=class{constructor(e){return VK(e)}},VK=t=>{let e={};return npe(e,t),e.template=(...r)=>spe(e.template,...r),Object.setPrototypeOf(e,DE.prototype),Object.setPrototypeOf(e.template,e),e.template.constructor=()=>{throw new Error("`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.")},e.template.Instance=zK,e.template};function DE(t){return VK(t)}for(let[t,e]of Object.entries(fh))su[t]={get(){let r=RE(this,Hb(e.open,e.close,this._styler),this._isEmpty);return Object.defineProperty(this,t,{value:r}),r}};su.visible={get(){let t=RE(this,this._styler,!0);return Object.defineProperty(this,"visible",{value:t}),t}};var _K=["rgb","hex","keyword","hsl","hsv","hwb","ansi","ansi256"];for(let t of _K)su[t]={get(){let{level:e}=this;return function(...r){let i=Hb(fh.color[WK[e]][t](...r),fh.color.close,this._styler);return RE(this,i,this._isEmpty)}}};for(let t of _K){let e="bg"+t[0].toUpperCase()+t.slice(1);su[e]={get(){let{level:r}=this;return function(...i){let n=Hb(fh.bgColor[WK[r]][t](...i),fh.bgColor.close,this._styler);return RE(this,n,this._isEmpty)}}}}var ope=Object.defineProperties(()=>{},_(P({},su),{level:{enumerable:!0,get(){return this._generator.level},set(t){this._generator.level=t}}})),Hb=(t,e,r)=>{let i,n;return r===void 0?(i=t,n=e):(i=r.openAll+t,n=e+r.closeAll),{open:t,close:e,openAll:i,closeAll:n,parent:r}},RE=(t,e,r)=>{let i=(...n)=>ape(i,n.length===1?""+n[0]:n.join(" "));return i.__proto__=ope,i._generator=t,i._styler=e,i._isEmpty=r,i},ape=(t,e)=>{if(t.level<=0||!e)return t._isEmpty?"":e;let r=t._styler;if(r===void 0)return e;let{openAll:i,closeAll:n}=r;if(e.indexOf("")!==-1)for(;r!==void 0;)e=rpe(e,r.close,r.open),r=r.parent;let s=e.indexOf(` +`);return s!==-1&&(e=ipe(e,n,i,s)),i+e+n},Gb,spe=(t,...e)=>{let[r]=e;if(!Array.isArray(r))return e.join(" ");let i=e.slice(1),n=[r.raw[0]];for(let s=1;s{XK.exports=[{name:"AppVeyor",constant:"APPVEYOR",env:"APPVEYOR",pr:"APPVEYOR_PULL_REQUEST_NUMBER"},{name:"Azure Pipelines",constant:"AZURE_PIPELINES",env:"SYSTEM_TEAMFOUNDATIONCOLLECTIONURI",pr:"SYSTEM_PULLREQUEST_PULLREQUESTID"},{name:"Appcircle",constant:"APPCIRCLE",env:"AC_APPCIRCLE"},{name:"Bamboo",constant:"BAMBOO",env:"bamboo_planKey"},{name:"Bitbucket Pipelines",constant:"BITBUCKET",env:"BITBUCKET_COMMIT",pr:"BITBUCKET_PR_ID"},{name:"Bitrise",constant:"BITRISE",env:"BITRISE_IO",pr:"BITRISE_PULL_REQUEST"},{name:"Buddy",constant:"BUDDY",env:"BUDDY_WORKSPACE_ID",pr:"BUDDY_EXECUTION_PULL_REQUEST_ID"},{name:"Buildkite",constant:"BUILDKITE",env:"BUILDKITE",pr:{env:"BUILDKITE_PULL_REQUEST",ne:"false"}},{name:"CircleCI",constant:"CIRCLE",env:"CIRCLECI",pr:"CIRCLE_PULL_REQUEST"},{name:"Cirrus CI",constant:"CIRRUS",env:"CIRRUS_CI",pr:"CIRRUS_PR"},{name:"AWS CodeBuild",constant:"CODEBUILD",env:"CODEBUILD_BUILD_ARN"},{name:"Codefresh",constant:"CODEFRESH",env:"CF_BUILD_ID",pr:{any:["CF_PULL_REQUEST_NUMBER","CF_PULL_REQUEST_ID"]}},{name:"Codeship",constant:"CODESHIP",env:{CI_NAME:"codeship"}},{name:"Drone",constant:"DRONE",env:"DRONE",pr:{DRONE_BUILD_EVENT:"pull_request"}},{name:"dsari",constant:"DSARI",env:"DSARI"},{name:"GitHub Actions",constant:"GITHUB_ACTIONS",env:"GITHUB_ACTIONS",pr:{GITHUB_EVENT_NAME:"pull_request"}},{name:"GitLab CI",constant:"GITLAB",env:"GITLAB_CI",pr:"CI_MERGE_REQUEST_ID"},{name:"GoCD",constant:"GOCD",env:"GO_PIPELINE_LABEL"},{name:"LayerCI",constant:"LAYERCI",env:"LAYERCI",pr:"LAYERCI_PULL_REQUEST"},{name:"Hudson",constant:"HUDSON",env:"HUDSON_URL"},{name:"Jenkins",constant:"JENKINS",env:["JENKINS_URL","BUILD_ID"],pr:{any:["ghprbPullId","CHANGE_ID"]}},{name:"Magnum CI",constant:"MAGNUM",env:"MAGNUM"},{name:"Netlify CI",constant:"NETLIFY",env:"NETLIFY",pr:{env:"PULL_REQUEST",ne:"false"}},{name:"Nevercode",constant:"NEVERCODE",env:"NEVERCODE",pr:{env:"NEVERCODE_PULL_REQUEST",ne:"false"}},{name:"Render",constant:"RENDER",env:"RENDER",pr:{IS_PULL_REQUEST:"true"}},{name:"Sail CI",constant:"SAIL",env:"SAILCI",pr:"SAIL_PULL_REQUEST_NUMBER"},{name:"Semaphore",constant:"SEMAPHORE",env:"SEMAPHORE",pr:"PULL_REQUEST_NUMBER"},{name:"Screwdriver",constant:"SCREWDRIVER",env:"SCREWDRIVER",pr:{env:"SD_PULL_REQUEST",ne:"false"}},{name:"Shippable",constant:"SHIPPABLE",env:"SHIPPABLE",pr:{IS_PULL_REQUEST:"true"}},{name:"Solano CI",constant:"SOLANO",env:"TDDIUM",pr:"TDDIUM_PR_ID"},{name:"Strider CD",constant:"STRIDER",env:"STRIDER"},{name:"TaskCluster",constant:"TASKCLUSTER",env:["TASK_ID","RUN_ID"]},{name:"TeamCity",constant:"TEAMCITY",env:"TEAMCITY_VERSION"},{name:"Travis CI",constant:"TRAVIS",env:"TRAVIS",pr:{env:"TRAVIS_PULL_REQUEST",ne:"false"}},{name:"Vercel",constant:"VERCEL",env:"NOW_BUILDER"},{name:"Visual Studio App Center",constant:"APPCENTER",env:"APPCENTER_BUILD_ID"}]});var ml=E(Dn=>{"use strict";var $K=ZK(),ro=process.env;Object.defineProperty(Dn,"_vendors",{value:$K.map(function(t){return t.constant})});Dn.name=null;Dn.isPR=null;$K.forEach(function(t){let r=(Array.isArray(t.env)?t.env:[t.env]).every(function(i){return e1(i)});if(Dn[t.constant]=r,r)switch(Dn.name=t.name,typeof t.pr){case"string":Dn.isPR=!!ro[t.pr];break;case"object":"env"in t.pr?Dn.isPR=t.pr.env in ro&&ro[t.pr.env]!==t.pr.ne:"any"in t.pr?Dn.isPR=t.pr.any.some(function(i){return!!ro[i]}):Dn.isPR=e1(t.pr);break;default:Dn.isPR=null}});Dn.isCI=!!(ro.CI||ro.CONTINUOUS_INTEGRATION||ro.BUILD_NUMBER||ro.RUN_ID||Dn.name);function e1(t){return typeof t=="string"?!!ro[t]:Object.keys(t).every(function(e){return ro[e]===t[e]})}});var FE=E(zn=>{"use strict";zn.isInteger=t=>typeof t=="number"?Number.isInteger(t):typeof t=="string"&&t.trim()!==""?Number.isInteger(Number(t)):!1;zn.find=(t,e)=>t.nodes.find(r=>r.type===e);zn.exceedsLimit=(t,e,r=1,i)=>i===!1||!zn.isInteger(t)||!zn.isInteger(e)?!1:(Number(e)-Number(t))/Number(r)>=i;zn.escapeNode=(t,e=0,r)=>{let i=t.nodes[e];!i||(r&&i.type===r||i.type==="open"||i.type==="close")&&i.escaped!==!0&&(i.value="\\"+i.value,i.escaped=!0)};zn.encloseBrace=t=>t.type!=="brace"?!1:t.commas>>0+t.ranges>>0==0?(t.invalid=!0,!0):!1;zn.isInvalidBrace=t=>t.type!=="brace"?!1:t.invalid===!0||t.dollar?!0:t.commas>>0+t.ranges>>0==0||t.open!==!0||t.close!==!0?(t.invalid=!0,!0):!1;zn.isOpenOrClose=t=>t.type==="open"||t.type==="close"?!0:t.open===!0||t.close===!0;zn.reduce=t=>t.reduce((e,r)=>(r.type==="text"&&e.push(r.value),r.type==="range"&&(r.type="text"),e),[]);zn.flatten=(...t)=>{let e=[],r=i=>{for(let n=0;n{"use strict";var r1=FE();t1.exports=(t,e={})=>{let r=(i,n={})=>{let s=e.escapeInvalid&&r1.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a="";if(i.value)return(s||o)&&r1.isOpenOrClose(i)?"\\"+i.value:i.value;if(i.value)return i.value;if(i.nodes)for(let l of i.nodes)a+=r(l);return a};return r(t)}});var n1=E((L$e,i1)=>{"use strict";i1.exports=function(t){return typeof t=="number"?t-t==0:typeof t=="string"&&t.trim()!==""?Number.isFinite?Number.isFinite(+t):isFinite(+t):!1}});var f1=E((T$e,s1)=>{"use strict";var o1=n1(),El=(t,e,r)=>{if(o1(t)===!1)throw new TypeError("toRegexRange: expected the first argument to be a number");if(e===void 0||t===e)return String(t);if(o1(e)===!1)throw new TypeError("toRegexRange: expected the second argument to be a number.");let i=P({relaxZeros:!0},r);typeof i.strictZeros=="boolean"&&(i.relaxZeros=i.strictZeros===!1);let n=String(i.relaxZeros),s=String(i.shorthand),o=String(i.capture),a=String(i.wrap),l=t+":"+e+"="+n+s+o+a;if(El.cache.hasOwnProperty(l))return El.cache[l].result;let c=Math.min(t,e),u=Math.max(t,e);if(Math.abs(c-u)===1){let d=t+"|"+e;return i.capture?`(${d})`:i.wrap===!1?d:`(?:${d})`}let g=A1(t)||A1(e),f={min:t,max:e,a:c,b:u},h=[],p=[];if(g&&(f.isPadded=g,f.maxLen=String(f.max).length),c<0){let d=u<0?Math.abs(u):1;p=a1(d,Math.abs(c),f,i),c=f.a=0}return u>=0&&(h=a1(c,u,f,i)),f.negatives=p,f.positives=h,f.result=Ape(p,h,i),i.capture===!0?f.result=`(${f.result})`:i.wrap!==!1&&h.length+p.length>1&&(f.result=`(?:${f.result})`),El.cache[l]=f,f.result};function Ape(t,e,r){let i=Yb(t,e,"-",!1,r)||[],n=Yb(e,t,"",!1,r)||[],s=Yb(t,e,"-?",!0,r)||[];return i.concat(s).concat(n).join("|")}function cpe(t,e){let r=1,i=1,n=l1(t,r),s=new Set([e]);for(;t<=n&&n<=e;)s.add(n),r+=1,n=l1(t,r);for(n=c1(e+1,i)-1;t1&&a.count.pop(),a.count.push(u.count[0]),a.string=a.pattern+u1(a.count),o=c+1;continue}r.isPadded&&(g=hpe(c,r,i)),u.string=g+u.pattern+u1(u.count),s.push(u),o=c+1,a=u}return s}function Yb(t,e,r,i,n){let s=[];for(let o of t){let{string:a}=o;!i&&!g1(e,"string",a)&&s.push(r+a),i&&g1(e,"string",a)&&s.push(r+a)}return s}function upe(t,e){let r=[];for(let i=0;ie?1:e>t?-1:0}function g1(t,e,r){return t.some(i=>i[e]===r)}function l1(t,e){return Number(String(t).slice(0,-e)+"9".repeat(e))}function c1(t,e){return t-t%Math.pow(10,e)}function u1(t){let[e=0,r=""]=t;return r||e>1?`{${e+(r?","+r:"")}}`:""}function gpe(t,e,r){return`[${t}${e-t==1?"":"-"}${e}]`}function A1(t){return/^-?(0+)\d/.test(t)}function hpe(t,e,r){if(!e.isPadded)return t;let i=Math.abs(e.maxLen-String(t).length),n=r.relaxZeros!==!1;switch(i){case 0:return"";case 1:return n?"0?":"0";case 2:return n?"0{0,2}":"00";default:return n?`0{0,${i}}`:`0{${i}}`}}El.cache={};El.clearCache=()=>El.cache={};s1.exports=El});var Wb=E((M$e,h1)=>{"use strict";var ppe=require("util"),p1=f1(),d1=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),dpe=t=>e=>t===!0?Number(e):String(e),qb=t=>typeof t=="number"||typeof t=="string"&&t!=="",ph=t=>Number.isInteger(+t),Jb=t=>{let e=`${t}`,r=-1;if(e[0]==="-"&&(e=e.slice(1)),e==="0")return!1;for(;e[++r]==="0";);return r>0},Cpe=(t,e,r)=>typeof t=="string"||typeof e=="string"?!0:r.stringify===!0,mpe=(t,e,r)=>{if(e>0){let i=t[0]==="-"?"-":"";i&&(t=t.slice(1)),t=i+t.padStart(i?e-1:e,"0")}return r===!1?String(t):t},C1=(t,e)=>{let r=t[0]==="-"?"-":"";for(r&&(t=t.slice(1),e--);t.length{t.negatives.sort((o,a)=>oa?1:0),t.positives.sort((o,a)=>oa?1:0);let r=e.capture?"":"?:",i="",n="",s;return t.positives.length&&(i=t.positives.join("|")),t.negatives.length&&(n=`-(${r}${t.negatives.join("|")})`),i&&n?s=`${i}|${n}`:s=i||n,e.wrap?`(${r}${s})`:s},m1=(t,e,r,i)=>{if(r)return p1(t,e,P({wrap:!1},i));let n=String.fromCharCode(t);if(t===e)return n;let s=String.fromCharCode(e);return`[${n}-${s}]`},E1=(t,e,r)=>{if(Array.isArray(t)){let i=r.wrap===!0,n=r.capture?"":"?:";return i?`(${n}${t.join("|")})`:t.join("|")}return p1(t,e,r)},I1=(...t)=>new RangeError("Invalid range arguments: "+ppe.inspect(...t)),y1=(t,e,r)=>{if(r.strictRanges===!0)throw I1([t,e]);return[]},Ipe=(t,e)=>{if(e.strictRanges===!0)throw new TypeError(`Expected step "${t}" to be a number`);return[]},ype=(t,e,r=1,i={})=>{let n=Number(t),s=Number(e);if(!Number.isInteger(n)||!Number.isInteger(s)){if(i.strictRanges===!0)throw I1([t,e]);return[]}n===0&&(n=0),s===0&&(s=0);let o=n>s,a=String(t),l=String(e),c=String(r);r=Math.max(Math.abs(r),1);let u=Jb(a)||Jb(l)||Jb(c),g=u?Math.max(a.length,l.length,c.length):0,f=u===!1&&Cpe(t,e,i)===!1,h=i.transform||dpe(f);if(i.toRegex&&r===1)return m1(C1(t,g),C1(e,g),!0,i);let p={negatives:[],positives:[]},d=B=>p[B<0?"negatives":"positives"].push(Math.abs(B)),m=[],I=0;for(;o?n>=s:n<=s;)i.toRegex===!0&&r>1?d(n):m.push(mpe(h(n,I),g,f)),n=o?n-r:n+r,I++;return i.toRegex===!0?r>1?Epe(p,i):E1(m,null,P({wrap:!1},i)):m},wpe=(t,e,r=1,i={})=>{if(!ph(t)&&t.length>1||!ph(e)&&e.length>1)return y1(t,e,i);let n=i.transform||(f=>String.fromCharCode(f)),s=`${t}`.charCodeAt(0),o=`${e}`.charCodeAt(0),a=s>o,l=Math.min(s,o),c=Math.max(s,o);if(i.toRegex&&r===1)return m1(l,c,!1,i);let u=[],g=0;for(;a?s>=o:s<=o;)u.push(n(s,g)),s=a?s-r:s+r,g++;return i.toRegex===!0?E1(u,null,{wrap:!1,options:i}):u},LE=(t,e,r,i={})=>{if(e==null&&qb(t))return[t];if(!qb(t)||!qb(e))return y1(t,e,i);if(typeof r=="function")return LE(t,e,1,{transform:r});if(d1(r))return LE(t,e,0,r);let n=P({},i);return n.capture===!0&&(n.wrap=!0),r=r||n.step||1,ph(r)?ph(t)&&ph(e)?ype(t,e,r,n):wpe(t,e,Math.max(Math.abs(r),1),n):r!=null&&!d1(r)?Ipe(r,n):LE(t,e,1,r)};h1.exports=LE});var Q1=E((O$e,w1)=>{"use strict";var Bpe=Wb(),B1=FE(),Qpe=(t,e={})=>{let r=(i,n={})=>{let s=B1.isInvalidBrace(n),o=i.invalid===!0&&e.escapeInvalid===!0,a=s===!0||o===!0,l=e.escapeInvalid===!0?"\\":"",c="";if(i.isOpen===!0||i.isClose===!0)return l+i.value;if(i.type==="open")return a?l+i.value:"(";if(i.type==="close")return a?l+i.value:")";if(i.type==="comma")return i.prev.type==="comma"?"":a?i.value:"|";if(i.value)return i.value;if(i.nodes&&i.ranges>0){let u=B1.reduce(i.nodes),g=Bpe(...u,_(P({},e),{wrap:!1,toRegex:!0}));if(g.length!==0)return u.length>1&&g.length>1?`(${g})`:g}if(i.nodes)for(let u of i.nodes)c+=r(u,i);return c};return r(t)};w1.exports=Qpe});var S1=E((K$e,b1)=>{"use strict";var bpe=Wb(),v1=NE(),ou=FE(),Il=(t="",e="",r=!1)=>{let i=[];if(t=[].concat(t),e=[].concat(e),!e.length)return t;if(!t.length)return r?ou.flatten(e).map(n=>`{${n}}`):e;for(let n of t)if(Array.isArray(n))for(let s of n)i.push(Il(s,e,r));else for(let s of e)r===!0&&typeof s=="string"&&(s=`{${s}}`),i.push(Array.isArray(s)?Il(n,s,r):n+s);return ou.flatten(i)},vpe=(t,e={})=>{let r=e.rangeLimit===void 0?1e3:e.rangeLimit,i=(n,s={})=>{n.queue=[];let o=s,a=s.queue;for(;o.type!=="brace"&&o.type!=="root"&&o.parent;)o=o.parent,a=o.queue;if(n.invalid||n.dollar){a.push(Il(a.pop(),v1(n,e)));return}if(n.type==="brace"&&n.invalid!==!0&&n.nodes.length===2){a.push(Il(a.pop(),["{}"]));return}if(n.nodes&&n.ranges>0){let g=ou.reduce(n.nodes);if(ou.exceedsLimit(...g,e.step,r))throw new RangeError("expanded array length exceeds range limit. Use options.rangeLimit to increase or disable the limit.");let f=bpe(...g,e);f.length===0&&(f=v1(n,e)),a.push(Il(a.pop(),f)),n.nodes=[];return}let l=ou.encloseBrace(n),c=n.queue,u=n;for(;u.type!=="brace"&&u.type!=="root"&&u.parent;)u=u.parent,c=u.queue;for(let g=0;g{"use strict";x1.exports={MAX_LENGTH:1024*64,CHAR_0:"0",CHAR_9:"9",CHAR_UPPERCASE_A:"A",CHAR_LOWERCASE_A:"a",CHAR_UPPERCASE_Z:"Z",CHAR_LOWERCASE_Z:"z",CHAR_LEFT_PARENTHESES:"(",CHAR_RIGHT_PARENTHESES:")",CHAR_ASTERISK:"*",CHAR_AMPERSAND:"&",CHAR_AT:"@",CHAR_BACKSLASH:"\\",CHAR_BACKTICK:"`",CHAR_CARRIAGE_RETURN:"\r",CHAR_CIRCUMFLEX_ACCENT:"^",CHAR_COLON:":",CHAR_COMMA:",",CHAR_DOLLAR:"$",CHAR_DOT:".",CHAR_DOUBLE_QUOTE:'"',CHAR_EQUAL:"=",CHAR_EXCLAMATION_MARK:"!",CHAR_FORM_FEED:"\f",CHAR_FORWARD_SLASH:"/",CHAR_HASH:"#",CHAR_HYPHEN_MINUS:"-",CHAR_LEFT_ANGLE_BRACKET:"<",CHAR_LEFT_CURLY_BRACE:"{",CHAR_LEFT_SQUARE_BRACKET:"[",CHAR_LINE_FEED:` +`,CHAR_NO_BREAK_SPACE:"\xA0",CHAR_PERCENT:"%",CHAR_PLUS:"+",CHAR_QUESTION_MARK:"?",CHAR_RIGHT_ANGLE_BRACKET:">",CHAR_RIGHT_CURLY_BRACE:"}",CHAR_RIGHT_SQUARE_BRACKET:"]",CHAR_SEMICOLON:";",CHAR_SINGLE_QUOTE:"'",CHAR_SPACE:" ",CHAR_TAB:" ",CHAR_UNDERSCORE:"_",CHAR_VERTICAL_LINE:"|",CHAR_ZERO_WIDTH_NOBREAK_SPACE:"\uFEFF"}});var N1=E((H$e,P1)=>{"use strict";var Spe=NE(),{MAX_LENGTH:D1,CHAR_BACKSLASH:zb,CHAR_BACKTICK:xpe,CHAR_COMMA:kpe,CHAR_DOT:Ppe,CHAR_LEFT_PARENTHESES:Dpe,CHAR_RIGHT_PARENTHESES:Rpe,CHAR_LEFT_CURLY_BRACE:Fpe,CHAR_RIGHT_CURLY_BRACE:Npe,CHAR_LEFT_SQUARE_BRACKET:R1,CHAR_RIGHT_SQUARE_BRACKET:F1,CHAR_DOUBLE_QUOTE:Lpe,CHAR_SINGLE_QUOTE:Tpe,CHAR_NO_BREAK_SPACE:Mpe,CHAR_ZERO_WIDTH_NOBREAK_SPACE:Ope}=k1(),Kpe=(t,e={})=>{if(typeof t!="string")throw new TypeError("Expected a string");let r=e||{},i=typeof r.maxLength=="number"?Math.min(D1,r.maxLength):D1;if(t.length>i)throw new SyntaxError(`Input length (${t.length}), exceeds max characters (${i})`);let n={type:"root",input:t,nodes:[]},s=[n],o=n,a=n,l=0,c=t.length,u=0,g=0,f,h={},p=()=>t[u++],d=m=>{if(m.type==="text"&&a.type==="dot"&&(a.type="text"),a&&a.type==="text"&&m.type==="text"){a.value+=m.value;return}return o.nodes.push(m),m.parent=o,m.prev=a,a=m,m};for(d({type:"bos"});u0){if(o.ranges>0){o.ranges=0;let m=o.nodes.shift();o.nodes=[m,{type:"text",value:Spe(o)}]}d({type:"comma",value:f}),o.commas++;continue}if(f===Ppe&&g>0&&o.commas===0){let m=o.nodes;if(g===0||m.length===0){d({type:"text",value:f});continue}if(a.type==="dot"){if(o.range=[],a.value+=f,a.type="range",o.nodes.length!==3&&o.nodes.length!==5){o.invalid=!0,o.ranges=0,a.type="text";continue}o.ranges++,o.args=[];continue}if(a.type==="range"){m.pop();let I=m[m.length-1];I.value+=a.value+f,a=I,o.ranges--;continue}d({type:"dot",value:f});continue}d({type:"text",value:f})}do if(o=s.pop(),o.type!=="root"){o.nodes.forEach(B=>{B.nodes||(B.type==="open"&&(B.isOpen=!0),B.type==="close"&&(B.isClose=!0),B.nodes||(B.type="text"),B.invalid=!0)});let m=s[s.length-1],I=m.nodes.indexOf(o);m.nodes.splice(I,1,...o.nodes)}while(s.length>0);return d({type:"eos"}),n};P1.exports=Kpe});var M1=E((G$e,L1)=>{"use strict";var T1=NE(),Upe=Q1(),Hpe=S1(),Gpe=N1(),Rn=(t,e={})=>{let r=[];if(Array.isArray(t))for(let i of t){let n=Rn.create(i,e);Array.isArray(n)?r.push(...n):r.push(n)}else r=[].concat(Rn.create(t,e));return e&&e.expand===!0&&e.nodupes===!0&&(r=[...new Set(r)]),r};Rn.parse=(t,e={})=>Gpe(t,e);Rn.stringify=(t,e={})=>typeof t=="string"?T1(Rn.parse(t,e),e):T1(t,e);Rn.compile=(t,e={})=>(typeof t=="string"&&(t=Rn.parse(t,e)),Upe(t,e));Rn.expand=(t,e={})=>{typeof t=="string"&&(t=Rn.parse(t,e));let r=Hpe(t,e);return e.noempty===!0&&(r=r.filter(Boolean)),e.nodupes===!0&&(r=[...new Set(r)]),r};Rn.create=(t,e={})=>t===""||t.length<3?[t]:e.expand!==!0?Rn.compile(t,e):Rn.expand(t,e);L1.exports=Rn});var dh=E((j$e,O1)=>{"use strict";var jpe=require("path"),io="\\\\/",K1=`[^${io}]`,ea="\\.",Ype="\\+",qpe="\\?",TE="\\/",Jpe="(?=.)",U1="[^/]",Vb=`(?:${TE}|$)`,H1=`(?:^|${TE})`,_b=`${ea}{1,2}${Vb}`,Wpe=`(?!${ea})`,zpe=`(?!${H1}${_b})`,Vpe=`(?!${ea}{0,1}${Vb})`,_pe=`(?!${_b})`,Xpe=`[^.${TE}]`,Zpe=`${U1}*?`,G1={DOT_LITERAL:ea,PLUS_LITERAL:Ype,QMARK_LITERAL:qpe,SLASH_LITERAL:TE,ONE_CHAR:Jpe,QMARK:U1,END_ANCHOR:Vb,DOTS_SLASH:_b,NO_DOT:Wpe,NO_DOTS:zpe,NO_DOT_SLASH:Vpe,NO_DOTS_SLASH:_pe,QMARK_NO_DOT:Xpe,STAR:Zpe,START_ANCHOR:H1},$pe=_(P({},G1),{SLASH_LITERAL:`[${io}]`,QMARK:K1,STAR:`${K1}*?`,DOTS_SLASH:`${ea}{1,2}(?:[${io}]|$)`,NO_DOT:`(?!${ea})`,NO_DOTS:`(?!(?:^|[${io}])${ea}{1,2}(?:[${io}]|$))`,NO_DOT_SLASH:`(?!${ea}{0,1}(?:[${io}]|$))`,NO_DOTS_SLASH:`(?!${ea}{1,2}(?:[${io}]|$))`,QMARK_NO_DOT:`[^.${io}]`,START_ANCHOR:`(?:^|[${io}])`,END_ANCHOR:`(?:[${io}]|$)`}),ede={alnum:"a-zA-Z0-9",alpha:"a-zA-Z",ascii:"\\x00-\\x7F",blank:" \\t",cntrl:"\\x00-\\x1F\\x7F",digit:"0-9",graph:"\\x21-\\x7E",lower:"a-z",print:"\\x20-\\x7E ",punct:"\\-!\"#$%&'()\\*+,./:;<=>?@[\\]^_`{|}~",space:" \\t\\r\\n\\v\\f",upper:"A-Z",word:"A-Za-z0-9_",xdigit:"A-Fa-f0-9"};O1.exports={MAX_LENGTH:1024*64,POSIX_REGEX_SOURCE:ede,REGEX_BACKSLASH:/\\(?![*+?^${}(|)[\]])/g,REGEX_NON_SPECIAL_CHARS:/^[^@![\].,$*+?^{}()|\\/]+/,REGEX_SPECIAL_CHARS:/[-*+?.^${}(|)[\]]/,REGEX_SPECIAL_CHARS_BACKREF:/(\\?)((\W)(\3*))/g,REGEX_SPECIAL_CHARS_GLOBAL:/([-*+?.^${}(|)[\]])/g,REGEX_REMOVE_BACKSLASH:/(?:\[.*?[^\\]\]|\\(?=.))/g,REPLACEMENTS:{"***":"*","**/**":"**","**/**/**":"**"},CHAR_0:48,CHAR_9:57,CHAR_UPPERCASE_A:65,CHAR_LOWERCASE_A:97,CHAR_UPPERCASE_Z:90,CHAR_LOWERCASE_Z:122,CHAR_LEFT_PARENTHESES:40,CHAR_RIGHT_PARENTHESES:41,CHAR_ASTERISK:42,CHAR_AMPERSAND:38,CHAR_AT:64,CHAR_BACKWARD_SLASH:92,CHAR_CARRIAGE_RETURN:13,CHAR_CIRCUMFLEX_ACCENT:94,CHAR_COLON:58,CHAR_COMMA:44,CHAR_DOT:46,CHAR_DOUBLE_QUOTE:34,CHAR_EQUAL:61,CHAR_EXCLAMATION_MARK:33,CHAR_FORM_FEED:12,CHAR_FORWARD_SLASH:47,CHAR_GRAVE_ACCENT:96,CHAR_HASH:35,CHAR_HYPHEN_MINUS:45,CHAR_LEFT_ANGLE_BRACKET:60,CHAR_LEFT_CURLY_BRACE:123,CHAR_LEFT_SQUARE_BRACKET:91,CHAR_LINE_FEED:10,CHAR_NO_BREAK_SPACE:160,CHAR_PERCENT:37,CHAR_PLUS:43,CHAR_QUESTION_MARK:63,CHAR_RIGHT_ANGLE_BRACKET:62,CHAR_RIGHT_CURLY_BRACE:125,CHAR_RIGHT_SQUARE_BRACKET:93,CHAR_SEMICOLON:59,CHAR_SINGLE_QUOTE:39,CHAR_SPACE:32,CHAR_TAB:9,CHAR_UNDERSCORE:95,CHAR_VERTICAL_LINE:124,CHAR_ZERO_WIDTH_NOBREAK_SPACE:65279,SEP:jpe.sep,extglobChars(t){return{"!":{type:"negate",open:"(?:(?!(?:",close:`))${t.STAR})`},"?":{type:"qmark",open:"(?:",close:")?"},"+":{type:"plus",open:"(?:",close:")+"},"*":{type:"star",open:"(?:",close:")*"},"@":{type:"at",open:"(?:",close:")"}}},globChars(t){return t===!0?$pe:G1}}});var Ch=E(cn=>{"use strict";var tde=require("path"),rde=process.platform==="win32",{REGEX_BACKSLASH:ide,REGEX_REMOVE_BACKSLASH:nde,REGEX_SPECIAL_CHARS:sde,REGEX_SPECIAL_CHARS_GLOBAL:ode}=dh();cn.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);cn.hasRegexChars=t=>sde.test(t);cn.isRegexChar=t=>t.length===1&&cn.hasRegexChars(t);cn.escapeRegex=t=>t.replace(ode,"\\$1");cn.toPosixSlashes=t=>t.replace(ide,"/");cn.removeBackslashes=t=>t.replace(nde,e=>e==="\\"?"":e);cn.supportsLookbehinds=()=>{let t=process.version.slice(1).split(".").map(Number);return t.length===3&&t[0]>=9||t[0]===8&&t[1]>=10};cn.isWindows=t=>t&&typeof t.windows=="boolean"?t.windows:rde===!0||tde.sep==="\\";cn.escapeLast=(t,e,r)=>{let i=t.lastIndexOf(e,r);return i===-1?t:t[i-1]==="\\"?cn.escapeLast(t,e,i-1):`${t.slice(0,i)}\\${t.slice(i)}`};cn.removePrefix=(t,e={})=>{let r=t;return r.startsWith("./")&&(r=r.slice(2),e.prefix="./"),r};cn.wrapOutput=(t,e={},r={})=>{let i=r.contains?"":"^",n=r.contains?"":"$",s=`${i}(?:${t})${n}`;return e.negated===!0&&(s=`(?:^(?!${s}).*$)`),s}});var X1=E((q$e,j1)=>{"use strict";var Y1=Ch(),{CHAR_ASTERISK:Xb,CHAR_AT:ade,CHAR_BACKWARD_SLASH:mh,CHAR_COMMA:Ade,CHAR_DOT:Zb,CHAR_EXCLAMATION_MARK:q1,CHAR_FORWARD_SLASH:J1,CHAR_LEFT_CURLY_BRACE:$b,CHAR_LEFT_PARENTHESES:ev,CHAR_LEFT_SQUARE_BRACKET:lde,CHAR_PLUS:cde,CHAR_QUESTION_MARK:W1,CHAR_RIGHT_CURLY_BRACE:ude,CHAR_RIGHT_PARENTHESES:z1,CHAR_RIGHT_SQUARE_BRACKET:gde}=dh(),V1=t=>t===J1||t===mh,_1=t=>{t.isPrefix!==!0&&(t.depth=t.isGlobstar?Infinity:1)},fde=(t,e)=>{let r=e||{},i=t.length-1,n=r.parts===!0||r.scanToEnd===!0,s=[],o=[],a=[],l=t,c=-1,u=0,g=0,f=!1,h=!1,p=!1,d=!1,m=!1,I=!1,B=!1,b=!1,R=!1,H=0,L,K,J={value:"",depth:0,isGlob:!1},ne=()=>c>=i,q=()=>l.charCodeAt(c+1),A=()=>(L=K,l.charCodeAt(++c));for(;c0&&(W=l.slice(0,u),l=l.slice(u),g-=u),V&&p===!0&&g>0?(V=l.slice(0,g),X=l.slice(g)):p===!0?(V="",X=l):V=l,V&&V!==""&&V!=="/"&&V!==l&&V1(V.charCodeAt(V.length-1))&&(V=V.slice(0,-1)),r.unescape===!0&&(X&&(X=Y1.removeBackslashes(X)),V&&B===!0&&(V=Y1.removeBackslashes(V)));let F={prefix:W,input:t,start:u,base:V,glob:X,isBrace:f,isBracket:h,isGlob:p,isExtglob:d,isGlobstar:m,negated:b};if(r.tokens===!0&&(F.maxDepth=0,V1(K)||o.push(J),F.tokens=o),r.parts===!0||r.tokens===!0){let D;for(let he=0;he{"use strict";var ME=dh(),Fn=Ch(),{MAX_LENGTH:OE,POSIX_REGEX_SOURCE:hde,REGEX_NON_SPECIAL_CHARS:pde,REGEX_SPECIAL_CHARS_BACKREF:dde,REPLACEMENTS:$1}=ME,Cde=(t,e)=>{if(typeof e.expandRange=="function")return e.expandRange(...t,e);t.sort();let r=`[${t.join("-")}]`;try{new RegExp(r)}catch(i){return t.map(n=>Fn.escapeRegex(n)).join("..")}return r},au=(t,e)=>`Missing ${t}: "${e}" - use "\\\\${e}" to match literal characters`,eU=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");t=$1[t]||t;let r=P({},e),i=typeof r.maxLength=="number"?Math.min(OE,r.maxLength):OE,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);let s={type:"bos",value:"",output:r.prepend||""},o=[s],a=r.capture?"":"?:",l=Fn.isWindows(e),c=ME.globChars(l),u=ME.extglobChars(c),{DOT_LITERAL:g,PLUS_LITERAL:f,SLASH_LITERAL:h,ONE_CHAR:p,DOTS_SLASH:d,NO_DOT:m,NO_DOT_SLASH:I,NO_DOTS_SLASH:B,QMARK:b,QMARK_NO_DOT:R,STAR:H,START_ANCHOR:L}=c,K=G=>`(${a}(?:(?!${L}${G.dot?d:g}).)*?)`,J=r.dot?"":m,ne=r.dot?b:R,q=r.bash===!0?K(r):H;r.capture&&(q=`(${q})`),typeof r.noext=="boolean"&&(r.noextglob=r.noext);let A={input:t,index:-1,start:0,dot:r.dot===!0,consumed:"",output:"",prefix:"",backtrack:!1,negated:!1,brackets:0,braces:0,parens:0,quotes:0,globstar:!1,tokens:o};t=Fn.removePrefix(t,A),n=t.length;let V=[],W=[],X=[],F=s,D,he=()=>A.index===n-1,pe=A.peek=(G=1)=>t[A.index+G],Ne=A.advance=()=>t[++A.index],Pe=()=>t.slice(A.index+1),qe=(G="",Ce=0)=>{A.consumed+=G,A.index+=Ce},re=G=>{A.output+=G.output!=null?G.output:G.value,qe(G.value)},se=()=>{let G=1;for(;pe()==="!"&&(pe(2)!=="("||pe(3)==="?");)Ne(),A.start++,G++;return G%2==0?!1:(A.negated=!0,A.start++,!0)},be=G=>{A[G]++,X.push(G)},ae=G=>{A[G]--,X.pop()},Ae=G=>{if(F.type==="globstar"){let Ce=A.braces>0&&(G.type==="comma"||G.type==="brace"),ee=G.extglob===!0||V.length&&(G.type==="pipe"||G.type==="paren");G.type!=="slash"&&G.type!=="paren"&&!Ce&&!ee&&(A.output=A.output.slice(0,-F.output.length),F.type="star",F.value="*",F.output=q,A.output+=F.output)}if(V.length&&G.type!=="paren"&&!u[G.value]&&(V[V.length-1].inner+=G.value),(G.value||G.output)&&re(G),F&&F.type==="text"&&G.type==="text"){F.value+=G.value,F.output=(F.output||"")+G.value;return}G.prev=F,o.push(G),F=G},De=(G,Ce)=>{let ee=_(P({},u[Ce]),{conditions:1,inner:""});ee.prev=F,ee.parens=A.parens,ee.output=A.output;let Ue=(r.capture?"(":"")+ee.open;be("parens"),Ae({type:G,value:Ce,output:A.output?"":p}),Ae({type:"paren",extglob:!0,value:Ne(),output:Ue}),V.push(ee)},$=G=>{let Ce=G.close+(r.capture?")":"");if(G.type==="negate"){let ee=q;G.inner&&G.inner.length>1&&G.inner.includes("/")&&(ee=K(r)),(ee!==q||he()||/^\)+$/.test(Pe()))&&(Ce=G.close=`)$))${ee}`),G.prev.type==="bos"&&(A.negatedExtglob=!0)}Ae({type:"paren",extglob:!0,value:D,output:Ce}),ae("parens")};if(r.fastpaths!==!1&&!/(^[*!]|[/()[\]{}"])/.test(t)){let G=!1,Ce=t.replace(dde,(ee,Ue,Oe,vt,dt,ri)=>vt==="\\"?(G=!0,ee):vt==="?"?Ue?Ue+vt+(dt?b.repeat(dt.length):""):ri===0?ne+(dt?b.repeat(dt.length):""):b.repeat(Oe.length):vt==="."?g.repeat(Oe.length):vt==="*"?Ue?Ue+vt+(dt?q:""):q:Ue?ee:`\\${ee}`);return G===!0&&(r.unescape===!0?Ce=Ce.replace(/\\/g,""):Ce=Ce.replace(/\\+/g,ee=>ee.length%2==0?"\\\\":ee?"\\":"")),Ce===t&&r.contains===!0?(A.output=t,A):(A.output=Fn.wrapOutput(Ce,A,e),A)}for(;!he();){if(D=Ne(),D==="\0")continue;if(D==="\\"){let ee=pe();if(ee==="/"&&r.bash!==!0||ee==="."||ee===";")continue;if(!ee){D+="\\",Ae({type:"text",value:D});continue}let Ue=/^\\+/.exec(Pe()),Oe=0;if(Ue&&Ue[0].length>2&&(Oe=Ue[0].length,A.index+=Oe,Oe%2!=0&&(D+="\\")),r.unescape===!0?D=Ne()||"":D+=Ne()||"",A.brackets===0){Ae({type:"text",value:D});continue}}if(A.brackets>0&&(D!=="]"||F.value==="["||F.value==="[^")){if(r.posix!==!1&&D===":"){let ee=F.value.slice(1);if(ee.includes("[")&&(F.posix=!0,ee.includes(":"))){let Ue=F.value.lastIndexOf("["),Oe=F.value.slice(0,Ue),vt=F.value.slice(Ue+2),dt=hde[vt];if(dt){F.value=Oe+dt,A.backtrack=!0,Ne(),!s.output&&o.indexOf(F)===1&&(s.output=p);continue}}}(D==="["&&pe()!==":"||D==="-"&&pe()==="]")&&(D=`\\${D}`),D==="]"&&(F.value==="["||F.value==="[^")&&(D=`\\${D}`),r.posix===!0&&D==="!"&&F.value==="["&&(D="^"),F.value+=D,re({value:D});continue}if(A.quotes===1&&D!=='"'){D=Fn.escapeRegex(D),F.value+=D,re({value:D});continue}if(D==='"'){A.quotes=A.quotes===1?0:1,r.keepQuotes===!0&&Ae({type:"text",value:D});continue}if(D==="("){be("parens"),Ae({type:"paren",value:D});continue}if(D===")"){if(A.parens===0&&r.strictBrackets===!0)throw new SyntaxError(au("opening","("));let ee=V[V.length-1];if(ee&&A.parens===ee.parens+1){$(V.pop());continue}Ae({type:"paren",value:D,output:A.parens?")":"\\)"}),ae("parens");continue}if(D==="["){if(r.nobracket===!0||!Pe().includes("]")){if(r.nobracket!==!0&&r.strictBrackets===!0)throw new SyntaxError(au("closing","]"));D=`\\${D}`}else be("brackets");Ae({type:"bracket",value:D});continue}if(D==="]"){if(r.nobracket===!0||F&&F.type==="bracket"&&F.value.length===1){Ae({type:"text",value:D,output:`\\${D}`});continue}if(A.brackets===0){if(r.strictBrackets===!0)throw new SyntaxError(au("opening","["));Ae({type:"text",value:D,output:`\\${D}`});continue}ae("brackets");let ee=F.value.slice(1);if(F.posix!==!0&&ee[0]==="^"&&!ee.includes("/")&&(D=`/${D}`),F.value+=D,re({value:D}),r.literalBrackets===!1||Fn.hasRegexChars(ee))continue;let Ue=Fn.escapeRegex(F.value);if(A.output=A.output.slice(0,-F.value.length),r.literalBrackets===!0){A.output+=Ue,F.value=Ue;continue}F.value=`(${a}${Ue}|${F.value})`,A.output+=F.value;continue}if(D==="{"&&r.nobrace!==!0){be("braces");let ee={type:"brace",value:D,output:"(",outputIndex:A.output.length,tokensIndex:A.tokens.length};W.push(ee),Ae(ee);continue}if(D==="}"){let ee=W[W.length-1];if(r.nobrace===!0||!ee){Ae({type:"text",value:D,output:D});continue}let Ue=")";if(ee.dots===!0){let Oe=o.slice(),vt=[];for(let dt=Oe.length-1;dt>=0&&(o.pop(),Oe[dt].type!=="brace");dt--)Oe[dt].type!=="dots"&&vt.unshift(Oe[dt].value);Ue=Cde(vt,r),A.backtrack=!0}if(ee.comma!==!0&&ee.dots!==!0){let Oe=A.output.slice(0,ee.outputIndex),vt=A.tokens.slice(ee.tokensIndex);ee.value=ee.output="\\{",D=Ue="\\}",A.output=Oe;for(let dt of vt)A.output+=dt.output||dt.value}Ae({type:"brace",value:D,output:Ue}),ae("braces"),W.pop();continue}if(D==="|"){V.length>0&&V[V.length-1].conditions++,Ae({type:"text",value:D});continue}if(D===","){let ee=D,Ue=W[W.length-1];Ue&&X[X.length-1]==="braces"&&(Ue.comma=!0,ee="|"),Ae({type:"comma",value:D,output:ee});continue}if(D==="/"){if(F.type==="dot"&&A.index===A.start+1){A.start=A.index+1,A.consumed="",A.output="",o.pop(),F=s;continue}Ae({type:"slash",value:D,output:h});continue}if(D==="."){if(A.braces>0&&F.type==="dot"){F.value==="."&&(F.output=g);let ee=W[W.length-1];F.type="dots",F.output+=D,F.value+=D,ee.dots=!0;continue}if(A.braces+A.parens===0&&F.type!=="bos"&&F.type!=="slash"){Ae({type:"text",value:D,output:g});continue}Ae({type:"dot",value:D,output:g});continue}if(D==="?"){if(!(F&&F.value==="(")&&r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){De("qmark",D);continue}if(F&&F.type==="paren"){let Ue=pe(),Oe=D;if(Ue==="<"&&!Fn.supportsLookbehinds())throw new Error("Node.js v10 or higher is required for regex lookbehinds");(F.value==="("&&!/[!=<:]/.test(Ue)||Ue==="<"&&!/<([!=]|\w+>)/.test(Pe()))&&(Oe=`\\${D}`),Ae({type:"text",value:D,output:Oe});continue}if(r.dot!==!0&&(F.type==="slash"||F.type==="bos")){Ae({type:"qmark",value:D,output:R});continue}Ae({type:"qmark",value:D,output:b});continue}if(D==="!"){if(r.noextglob!==!0&&pe()==="("&&(pe(2)!=="?"||!/[!=<:]/.test(pe(3)))){De("negate",D);continue}if(r.nonegate!==!0&&A.index===0){se();continue}}if(D==="+"){if(r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){De("plus",D);continue}if(F&&F.value==="("||r.regex===!1){Ae({type:"plus",value:D,output:f});continue}if(F&&(F.type==="bracket"||F.type==="paren"||F.type==="brace")||A.parens>0){Ae({type:"plus",value:D});continue}Ae({type:"plus",value:f});continue}if(D==="@"){if(r.noextglob!==!0&&pe()==="("&&pe(2)!=="?"){Ae({type:"at",extglob:!0,value:D,output:""});continue}Ae({type:"text",value:D});continue}if(D!=="*"){(D==="$"||D==="^")&&(D=`\\${D}`);let ee=pde.exec(Pe());ee&&(D+=ee[0],A.index+=ee[0].length),Ae({type:"text",value:D});continue}if(F&&(F.type==="globstar"||F.star===!0)){F.type="star",F.star=!0,F.value+=D,F.output=q,A.backtrack=!0,A.globstar=!0,qe(D);continue}let G=Pe();if(r.noextglob!==!0&&/^\([^?]/.test(G)){De("star",D);continue}if(F.type==="star"){if(r.noglobstar===!0){qe(D);continue}let ee=F.prev,Ue=ee.prev,Oe=ee.type==="slash"||ee.type==="bos",vt=Ue&&(Ue.type==="star"||Ue.type==="globstar");if(r.bash===!0&&(!Oe||G[0]&&G[0]!=="/")){Ae({type:"star",value:D,output:""});continue}let dt=A.braces>0&&(ee.type==="comma"||ee.type==="brace"),ri=V.length&&(ee.type==="pipe"||ee.type==="paren");if(!Oe&&ee.type!=="paren"&&!dt&&!ri){Ae({type:"star",value:D,output:""});continue}for(;G.slice(0,3)==="/**";){let ii=t[A.index+4];if(ii&&ii!=="/")break;G=G.slice(3),qe("/**",3)}if(ee.type==="bos"&&he()){F.type="globstar",F.value+=D,F.output=K(r),A.output=F.output,A.globstar=!0,qe(D);continue}if(ee.type==="slash"&&ee.prev.type!=="bos"&&!vt&&he()){A.output=A.output.slice(0,-(ee.output+F.output).length),ee.output=`(?:${ee.output}`,F.type="globstar",F.output=K(r)+(r.strictSlashes?")":"|$)"),F.value+=D,A.globstar=!0,A.output+=ee.output+F.output,qe(D);continue}if(ee.type==="slash"&&ee.prev.type!=="bos"&&G[0]==="/"){let ii=G[1]!==void 0?"|$":"";A.output=A.output.slice(0,-(ee.output+F.output).length),ee.output=`(?:${ee.output}`,F.type="globstar",F.output=`${K(r)}${h}|${h}${ii})`,F.value+=D,A.output+=ee.output+F.output,A.globstar=!0,qe(D+Ne()),Ae({type:"slash",value:"/",output:""});continue}if(ee.type==="bos"&&G[0]==="/"){F.type="globstar",F.value+=D,F.output=`(?:^|${h}|${K(r)}${h})`,A.output=F.output,A.globstar=!0,qe(D+Ne()),Ae({type:"slash",value:"/",output:""});continue}A.output=A.output.slice(0,-F.output.length),F.type="globstar",F.output=K(r),F.value+=D,A.output+=F.output,A.globstar=!0,qe(D);continue}let Ce={type:"star",value:D,output:q};if(r.bash===!0){Ce.output=".*?",(F.type==="bos"||F.type==="slash")&&(Ce.output=J+Ce.output),Ae(Ce);continue}if(F&&(F.type==="bracket"||F.type==="paren")&&r.regex===!0){Ce.output=D,Ae(Ce);continue}(A.index===A.start||F.type==="slash"||F.type==="dot")&&(F.type==="dot"?(A.output+=I,F.output+=I):r.dot===!0?(A.output+=B,F.output+=B):(A.output+=J,F.output+=J),pe()!=="*"&&(A.output+=p,F.output+=p)),Ae(Ce)}for(;A.brackets>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing","]"));A.output=Fn.escapeLast(A.output,"["),ae("brackets")}for(;A.parens>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing",")"));A.output=Fn.escapeLast(A.output,"("),ae("parens")}for(;A.braces>0;){if(r.strictBrackets===!0)throw new SyntaxError(au("closing","}"));A.output=Fn.escapeLast(A.output,"{"),ae("braces")}if(r.strictSlashes!==!0&&(F.type==="star"||F.type==="bracket")&&Ae({type:"maybe_slash",value:"",output:`${h}?`}),A.backtrack===!0){A.output="";for(let G of A.tokens)A.output+=G.output!=null?G.output:G.value,G.suffix&&(A.output+=G.suffix)}return A};eU.fastpaths=(t,e)=>{let r=P({},e),i=typeof r.maxLength=="number"?Math.min(OE,r.maxLength):OE,n=t.length;if(n>i)throw new SyntaxError(`Input length: ${n}, exceeds maximum allowed length: ${i}`);t=$1[t]||t;let s=Fn.isWindows(e),{DOT_LITERAL:o,SLASH_LITERAL:a,ONE_CHAR:l,DOTS_SLASH:c,NO_DOT:u,NO_DOTS:g,NO_DOTS_SLASH:f,STAR:h,START_ANCHOR:p}=ME.globChars(s),d=r.dot?g:u,m=r.dot?f:u,I=r.capture?"":"?:",B={negated:!1,prefix:""},b=r.bash===!0?".*?":h;r.capture&&(b=`(${b})`);let R=J=>J.noglobstar===!0?b:`(${I}(?:(?!${p}${J.dot?c:o}).)*?)`,H=J=>{switch(J){case"*":return`${d}${l}${b}`;case".*":return`${o}${l}${b}`;case"*.*":return`${d}${b}${o}${l}${b}`;case"*/*":return`${d}${b}${a}${l}${m}${b}`;case"**":return d+R(r);case"**/*":return`(?:${d}${R(r)}${a})?${m}${l}${b}`;case"**/*.*":return`(?:${d}${R(r)}${a})?${m}${b}${o}${l}${b}`;case"**/.*":return`(?:${d}${R(r)}${a})?${o}${l}${b}`;default:{let ne=/^(.*?)\.(\w+)$/.exec(J);if(!ne)return;let q=H(ne[1]);return q?q+o+ne[2]:void 0}}},L=Fn.removePrefix(t,B),K=H(L);return K&&r.strictSlashes!==!0&&(K+=`${a}?`),K};Z1.exports=eU});var iU=E((W$e,rU)=>{"use strict";var mde=require("path"),Ede=X1(),tv=tU(),rv=Ch(),Ide=dh(),yde=t=>t&&typeof t=="object"&&!Array.isArray(t),Dr=(t,e,r=!1)=>{if(Array.isArray(t)){let u=t.map(f=>Dr(f,e,r));return f=>{for(let h of u){let p=h(f);if(p)return p}return!1}}let i=yde(t)&&t.tokens&&t.input;if(t===""||typeof t!="string"&&!i)throw new TypeError("Expected pattern to be a non-empty string");let n=e||{},s=rv.isWindows(e),o=i?Dr.compileRe(t,e):Dr.makeRe(t,e,!1,!0),a=o.state;delete o.state;let l=()=>!1;if(n.ignore){let u=_(P({},e),{ignore:null,onMatch:null,onResult:null});l=Dr(n.ignore,u,r)}let c=(u,g=!1)=>{let{isMatch:f,match:h,output:p}=Dr.test(u,o,e,{glob:t,posix:s}),d={glob:t,state:a,regex:o,posix:s,input:u,output:p,match:h,isMatch:f};return typeof n.onResult=="function"&&n.onResult(d),f===!1?(d.isMatch=!1,g?d:!1):l(u)?(typeof n.onIgnore=="function"&&n.onIgnore(d),d.isMatch=!1,g?d:!1):(typeof n.onMatch=="function"&&n.onMatch(d),g?d:!0)};return r&&(c.state=a),c};Dr.test=(t,e,r,{glob:i,posix:n}={})=>{if(typeof t!="string")throw new TypeError("Expected input to be a string");if(t==="")return{isMatch:!1,output:""};let s=r||{},o=s.format||(n?rv.toPosixSlashes:null),a=t===i,l=a&&o?o(t):t;return a===!1&&(l=o?o(t):t,a=l===i),(a===!1||s.capture===!0)&&(s.matchBase===!0||s.basename===!0?a=Dr.matchBase(t,e,r,n):a=e.exec(l)),{isMatch:Boolean(a),match:a,output:l}};Dr.matchBase=(t,e,r,i=rv.isWindows(r))=>(e instanceof RegExp?e:Dr.makeRe(e,r)).test(mde.basename(t));Dr.isMatch=(t,e,r)=>Dr(e,r)(t);Dr.parse=(t,e)=>Array.isArray(t)?t.map(r=>Dr.parse(r,e)):tv(t,_(P({},e),{fastpaths:!1}));Dr.scan=(t,e)=>Ede(t,e);Dr.compileRe=(t,e,r=!1,i=!1)=>{if(r===!0)return t.output;let n=e||{},s=n.contains?"":"^",o=n.contains?"":"$",a=`${s}(?:${t.output})${o}`;t&&t.negated===!0&&(a=`^(?!${a}).*$`);let l=Dr.toRegex(a,e);return i===!0&&(l.state=t),l};Dr.makeRe=(t,e,r=!1,i=!1)=>{if(!t||typeof t!="string")throw new TypeError("Expected a non-empty string");let n=e||{},s={negated:!1,fastpaths:!0},o="",a;return t.startsWith("./")&&(t=t.slice(2),o=s.prefix="./"),n.fastpaths!==!1&&(t[0]==="."||t[0]==="*")&&(a=tv.fastpaths(t,e)),a===void 0?(s=tv(t,e),s.prefix=o+(s.prefix||"")):s.output=a,Dr.compileRe(s,e,r,i)};Dr.toRegex=(t,e)=>{try{let r=e||{};return new RegExp(t,r.flags||(r.nocase?"i":""))}catch(r){if(e&&e.debug===!0)throw r;return/$^/}};Dr.constants=Ide;rU.exports=Dr});var iv=E((z$e,nU)=>{"use strict";nU.exports=iU()});var Nn=E((V$e,sU)=>{"use strict";var oU=require("util"),aU=M1(),no=iv(),nv=Ch(),AU=t=>typeof t=="string"&&(t===""||t==="./"),pr=(t,e,r)=>{e=[].concat(e),t=[].concat(t);let i=new Set,n=new Set,s=new Set,o=0,a=u=>{s.add(u.output),r&&r.onResult&&r.onResult(u)};for(let u=0;u!i.has(u));if(r&&c.length===0){if(r.failglob===!0)throw new Error(`No matches found for "${e.join(", ")}"`);if(r.nonull===!0||r.nullglob===!0)return r.unescape?e.map(u=>u.replace(/\\/g,"")):e}return c};pr.match=pr;pr.matcher=(t,e)=>no(t,e);pr.isMatch=(t,e,r)=>no(e,r)(t);pr.any=pr.isMatch;pr.not=(t,e,r={})=>{e=[].concat(e).map(String);let i=new Set,n=[],s=a=>{r.onResult&&r.onResult(a),n.push(a.output)},o=pr(t,e,_(P({},r),{onResult:s}));for(let a of n)o.includes(a)||i.add(a);return[...i]};pr.contains=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${oU.inspect(t)}"`);if(Array.isArray(e))return e.some(i=>pr.contains(t,i,r));if(typeof e=="string"){if(AU(t)||AU(e))return!1;if(t.includes(e)||t.startsWith("./")&&t.slice(2).includes(e))return!0}return pr.isMatch(t,e,_(P({},r),{contains:!0}))};pr.matchKeys=(t,e,r)=>{if(!nv.isObject(t))throw new TypeError("Expected the first argument to be an object");let i=pr(Object.keys(t),e,r),n={};for(let s of i)n[s]=t[s];return n};pr.some=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=no(String(n),r);if(i.some(o=>s(o)))return!0}return!1};pr.every=(t,e,r)=>{let i=[].concat(t);for(let n of[].concat(e)){let s=no(String(n),r);if(!i.every(o=>s(o)))return!1}return!0};pr.all=(t,e,r)=>{if(typeof t!="string")throw new TypeError(`Expected a string: "${oU.inspect(t)}"`);return[].concat(e).every(i=>no(i,r)(t))};pr.capture=(t,e,r)=>{let i=nv.isWindows(r),s=no.makeRe(String(t),_(P({},r),{capture:!0})).exec(i?nv.toPosixSlashes(e):e);if(s)return s.slice(1).map(o=>o===void 0?"":o)};pr.makeRe=(...t)=>no.makeRe(...t);pr.scan=(...t)=>no.scan(...t);pr.parse=(t,e)=>{let r=[];for(let i of[].concat(t||[]))for(let n of aU(String(i),e))r.push(no.parse(n,e));return r};pr.braces=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return e&&e.nobrace===!0||!/\{.*\}/.test(t)?[t]:aU(t,e)};pr.braceExpand=(t,e)=>{if(typeof t!="string")throw new TypeError("Expected a string");return pr.braces(t,_(P({},e),{expand:!0}))};sU.exports=pr});var cU=E((_$e,lU)=>{"use strict";lU.exports=({onlyFirst:t=!1}={})=>{let e=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(e,t?void 0:"g")}});var gU=E((X$e,uU)=>{"use strict";var wde=cU();uU.exports=t=>typeof t=="string"?t.replace(wde(),""):t});var lu={};it(lu,{KeyRelationship:()=>Bl,applyCascade:()=>fv,base64RegExp:()=>CU,colorStringAlphaRegExp:()=>dU,colorStringRegExp:()=>pU,computeKey:()=>rA,getPrintable:()=>Mr,hasExactLength:()=>wU,hasForbiddenKeys:()=>eCe,hasKeyRelationship:()=>pv,hasMaxLength:()=>Mde,hasMinLength:()=>Tde,hasMutuallyExclusiveKeys:()=>tCe,hasRequiredKeys:()=>$de,hasUniqueItems:()=>Ode,isArray:()=>xde,isAtLeast:()=>Hde,isAtMost:()=>Gde,isBase64:()=>Xde,isBoolean:()=>bde,isDate:()=>Sde,isDict:()=>Pde,isEnum:()=>Yi,isHexColor:()=>_de,isISO8601:()=>Vde,isInExclusiveRange:()=>Yde,isInInclusiveRange:()=>jde,isInstanceOf:()=>Rde,isInteger:()=>qde,isJSON:()=>Zde,isLiteral:()=>Bde,isLowerCase:()=>Jde,isNegative:()=>Kde,isNullable:()=>Lde,isNumber:()=>vde,isObject:()=>Dde,isOneOf:()=>Fde,isOptional:()=>Nde,isPositive:()=>Ude,isString:()=>gv,isTuple:()=>kde,isUUID4:()=>zde,isUnknown:()=>yU,isUpperCase:()=>Wde,iso8601RegExp:()=>uv,makeCoercionFn:()=>wl,makeSetter:()=>IU,makeTrait:()=>EU,makeValidator:()=>Ct,matchesRegExp:()=>hv,plural:()=>GE,pushError:()=>at,simpleKeyRegExp:()=>hU,uuid4RegExp:()=>mU});function Ct({test:t}){return EU(t)()}function Mr(t){return t===null?"null":t===void 0?"undefined":t===""?"an empty string":JSON.stringify(t)}function rA(t,e){var r,i,n;return typeof e=="number"?`${(r=t==null?void 0:t.p)!==null&&r!==void 0?r:"."}[${e}]`:hU.test(e)?`${(i=t==null?void 0:t.p)!==null&&i!==void 0?i:""}.${e}`:`${(n=t==null?void 0:t.p)!==null&&n!==void 0?n:"."}[${JSON.stringify(e)}]`}function wl(t,e){return r=>{let i=t[e];return t[e]=r,wl(t,e).bind(null,i)}}function IU(t,e){return r=>{t[e]=r}}function GE(t,e,r){return t===1?e:r}function at({errors:t,p:e}={},r){return t==null||t.push(`${e!=null?e:"."}: ${r}`),!1}function Bde(t){return Ct({test:(e,r)=>e!==t?at(r,`Expected a literal (got ${Mr(t)})`):!0})}function Yi(t){let e=Array.isArray(t)?t:Object.values(t),r=new Set(e);return Ct({test:(i,n)=>r.has(i)?!0:at(n,`Expected a valid enumeration value (got ${Mr(i)})`)})}var hU,pU,dU,CU,mU,uv,EU,yU,gv,Qde,bde,vde,Sde,xde,kde,Pde,Dde,Rde,Fde,fv,Nde,Lde,Tde,Mde,wU,Ode,Kde,Ude,Hde,Gde,jde,Yde,qde,hv,Jde,Wde,zde,Vde,_de,Xde,Zde,$de,eCe,tCe,Bl,rCe,pv,Ss=Yfe(()=>{hU=/^[a-zA-Z_][a-zA-Z0-9_]*$/,pU=/^#[0-9a-f]{6}$/i,dU=/^#[0-9a-f]{6}([0-9a-f]{2})?$/i,CU=/^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$/,mU=/^[a-f0-9]{8}-[a-f0-9]{4}-4[a-f0-9]{3}-[89aAbB][a-f0-9]{3}-[a-f0-9]{12}$/i,uv=/^(?:[1-9]\d{3}(-?)(?:(?:0[1-9]|1[0-2])\1(?:0[1-9]|1\d|2[0-8])|(?:0[13-9]|1[0-2])\1(?:29|30)|(?:0[13578]|1[02])(?:\1)31|00[1-9]|0[1-9]\d|[12]\d{2}|3(?:[0-5]\d|6[0-5]))|(?:[1-9]\d(?:0[48]|[2468][048]|[13579][26])|(?:[2468][048]|[13579][26])00)(?:(-?)02(?:\2)29|-?366))T(?:[01]\d|2[0-3])(:?)[0-5]\d(?:\3[0-5]\d)?(?:Z|[+-][01]\d(?:\3[0-5]\d)?)$/,EU=t=>()=>t;yU=()=>Ct({test:(t,e)=>!0});gv=()=>Ct({test:(t,e)=>typeof t!="string"?at(e,`Expected a string (got ${Mr(t)})`):!0});Qde=new Map([["true",!0],["True",!0],["1",!0],[1,!0],["false",!1],["False",!1],["0",!1],[0,!1]]),bde=()=>Ct({test:(t,e)=>{var r;if(typeof t!="boolean"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i=Qde.get(t);if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a boolean (got ${Mr(t)})`)}return!0}}),vde=()=>Ct({test:(t,e)=>{var r;if(typeof t!="number"){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i;if(typeof t=="string"){let n;try{n=JSON.parse(t)}catch(s){}if(typeof n=="number")if(JSON.stringify(n)===t)i=n;else return at(e,`Received a number that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a number (got ${Mr(t)})`)}return!0}}),Sde=()=>Ct({test:(t,e)=>{var r;if(!(t instanceof Date)){if(typeof(e==null?void 0:e.coercions)!="undefined"){if(typeof(e==null?void 0:e.coercion)=="undefined")return at(e,"Unbound coercion result");let i;if(typeof t=="string"&&uv.test(t))i=new Date(t);else{let n;if(typeof t=="string"){let s;try{s=JSON.parse(t)}catch(o){}typeof s=="number"&&(n=s)}else typeof t=="number"&&(n=t);if(typeof n!="undefined")if(Number.isSafeInteger(n)||!Number.isSafeInteger(n*1e3))i=new Date(n*1e3);else return at(e,`Received a timestamp that can't be safely represented by the runtime (${t})`)}if(typeof i!="undefined")return e.coercions.push([(r=e.p)!==null&&r!==void 0?r:".",e.coercion.bind(null,i)]),!0}return at(e,`Expected a date (got ${Mr(t)})`)}return!0}}),xde=(t,{delimiter:e}={})=>Ct({test:(r,i)=>{var n;if(typeof r=="string"&&typeof e!="undefined"&&typeof(i==null?void 0:i.coercions)!="undefined"){if(typeof(i==null?void 0:i.coercion)=="undefined")return at(i,"Unbound coercion result");r=r.split(e),i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,r)])}if(!Array.isArray(r))return at(i,`Expected an array (got ${Mr(r)})`);let s=!0;for(let o=0,a=r.length;o{let r=wU(t.length);return Ct({test:(i,n)=>{var s;if(typeof i=="string"&&typeof e!="undefined"&&typeof(n==null?void 0:n.coercions)!="undefined"){if(typeof(n==null?void 0:n.coercion)=="undefined")return at(n,"Unbound coercion result");i=i.split(e),n.coercions.push([(s=n.p)!==null&&s!==void 0?s:".",n.coercion.bind(null,i)])}if(!Array.isArray(i))return at(n,`Expected a tuple (got ${Mr(i)})`);let o=r(i,Object.assign({},n));for(let a=0,l=i.length;aCt({test:(r,i)=>{if(typeof r!="object"||r===null)return at(i,`Expected an object (got ${Mr(r)})`);let n=Object.keys(r),s=!0;for(let o=0,a=n.length;o{let r=Object.keys(t);return Ct({test:(i,n)=>{if(typeof i!="object"||i===null)return at(n,`Expected an object (got ${Mr(i)})`);let s=new Set([...r,...Object.keys(i)]),o={},a=!0;for(let l of s){if(l==="constructor"||l==="__proto__")a=at(Object.assign(Object.assign({},n),{p:rA(n,l)}),"Unsafe property name");else{let c=Object.prototype.hasOwnProperty.call(t,l)?t[l]:void 0,u=Object.prototype.hasOwnProperty.call(i,l)?i[l]:void 0;typeof c!="undefined"?a=c(u,Object.assign(Object.assign({},n),{p:rA(n,l),coercion:wl(i,l)}))&&a:e===null?a=at(Object.assign(Object.assign({},n),{p:rA(n,l)}),`Extraneous property (got ${Mr(u)})`):Object.defineProperty(o,l,{enumerable:!0,get:()=>u,set:IU(i,l)})}if(!a&&(n==null?void 0:n.errors)==null)break}return e!==null&&(a||(n==null?void 0:n.errors)!=null)&&(a=e(o,n)&&a),a}})},Rde=t=>Ct({test:(e,r)=>e instanceof t?!0:at(r,`Expected an instance of ${t.name} (got ${Mr(e)})`)}),Fde=(t,{exclusive:e=!1}={})=>Ct({test:(r,i)=>{var n,s,o;let a=[],l=typeof(i==null?void 0:i.errors)!="undefined"?[]:void 0;for(let c=0,u=t.length;c1?at(i,`Expected to match exactly a single predicate (matched ${a.join(", ")})`):(o=i==null?void 0:i.errors)===null||o===void 0||o.push(...l),!1}}),fv=(t,e)=>Ct({test:(r,i)=>{var n,s;let o={value:r},a=typeof(i==null?void 0:i.coercions)!="undefined"?wl(o,"value"):void 0,l=typeof(i==null?void 0:i.coercions)!="undefined"?[]:void 0;if(!t(r,Object.assign(Object.assign({},i),{coercion:a,coercions:l})))return!1;let c=[];if(typeof l!="undefined")for(let[,u]of l)c.push(u());try{if(typeof(i==null?void 0:i.coercions)!="undefined"){if(o.value!==r){if(typeof(i==null?void 0:i.coercion)=="undefined")return at(i,"Unbound coercion result");i.coercions.push([(n=i.p)!==null&&n!==void 0?n:".",i.coercion.bind(null,o.value)])}(s=i==null?void 0:i.coercions)===null||s===void 0||s.push(...l)}return e.every(u=>u(o.value,i))}finally{for(let u of c)u()}}}),Nde=t=>Ct({test:(e,r)=>typeof e=="undefined"?!0:t(e,r)}),Lde=t=>Ct({test:(e,r)=>e===null?!0:t(e,r)}),Tde=t=>Ct({test:(e,r)=>e.length>=t?!0:at(r,`Expected to have a length of at least ${t} elements (got ${e.length})`)}),Mde=t=>Ct({test:(e,r)=>e.length<=t?!0:at(r,`Expected to have a length of at most ${t} elements (got ${e.length})`)}),wU=t=>Ct({test:(e,r)=>e.length!==t?at(r,`Expected to have a length of exactly ${t} elements (got ${e.length})`):!0}),Ode=({map:t}={})=>Ct({test:(e,r)=>{let i=new Set,n=new Set;for(let s=0,o=e.length;sCt({test:(t,e)=>t<=0?!0:at(e,`Expected to be negative (got ${t})`)}),Ude=()=>Ct({test:(t,e)=>t>=0?!0:at(e,`Expected to be positive (got ${t})`)}),Hde=t=>Ct({test:(e,r)=>e>=t?!0:at(r,`Expected to be at least ${t} (got ${e})`)}),Gde=t=>Ct({test:(e,r)=>e<=t?!0:at(r,`Expected to be at most ${t} (got ${e})`)}),jde=(t,e)=>Ct({test:(r,i)=>r>=t&&r<=e?!0:at(i,`Expected to be in the [${t}; ${e}] range (got ${r})`)}),Yde=(t,e)=>Ct({test:(r,i)=>r>=t&&rCt({test:(e,r)=>e!==Math.round(e)?at(r,`Expected to be an integer (got ${e})`):Number.isSafeInteger(e)?!0:at(r,`Expected to be a safe integer (got ${e})`)}),hv=t=>Ct({test:(e,r)=>t.test(e)?!0:at(r,`Expected to match the pattern ${t.toString()} (got ${Mr(e)})`)}),Jde=()=>Ct({test:(t,e)=>t!==t.toLowerCase()?at(e,`Expected to be all-lowercase (got ${t})`):!0}),Wde=()=>Ct({test:(t,e)=>t!==t.toUpperCase()?at(e,`Expected to be all-uppercase (got ${t})`):!0}),zde=()=>Ct({test:(t,e)=>mU.test(t)?!0:at(e,`Expected to be a valid UUID v4 (got ${Mr(t)})`)}),Vde=()=>Ct({test:(t,e)=>uv.test(t)?!1:at(e,`Expected to be a valid ISO 8601 date string (got ${Mr(t)})`)}),_de=({alpha:t=!1})=>Ct({test:(e,r)=>(t?pU.test(e):dU.test(e))?!0:at(r,`Expected to be a valid hexadecimal color string (got ${Mr(e)})`)}),Xde=()=>Ct({test:(t,e)=>CU.test(t)?!0:at(e,`Expected to be a valid base 64 string (got ${Mr(t)})`)}),Zde=(t=yU())=>Ct({test:(e,r)=>{let i;try{i=JSON.parse(e)}catch(n){return at(r,`Expected to be a valid JSON string (got ${Mr(e)})`)}return t(i,r)}}),$de=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)||s.push(o);return s.length>0?at(i,`Missing required ${GE(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},eCe=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>0?at(i,`Forbidden ${GE(s.length,"property","properties")} ${s.map(o=>`"${o}"`).join(", ")}`):!0}})},tCe=t=>{let e=new Set(t);return Ct({test:(r,i)=>{let n=new Set(Object.keys(r)),s=[];for(let o of e)n.has(o)&&s.push(o);return s.length>1?at(i,`Mutually exclusive properties ${s.map(o=>`"${o}"`).join(", ")}`):!0}})};(function(t){t.Forbids="Forbids",t.Requires="Requires"})(Bl||(Bl={}));rCe={[Bl.Forbids]:{expect:!1,message:"forbids using"},[Bl.Requires]:{expect:!0,message:"requires using"}},pv=(t,e,r,{ignore:i=[]}={})=>{let n=new Set(i),s=new Set(r),o=rCe[e];return Ct({test:(a,l)=>{let c=new Set(Object.keys(a));if(!c.has(t)||n.has(a[t]))return!0;let u=[];for(let g of s)(c.has(g)&&!n.has(a[g]))!==o.expect&&u.push(g);return u.length>=1?at(l,`Property "${t}" ${o.message} ${GE(u.length,"property","properties")} ${u.map(g=>`"${g}"`).join(", ")}`):!0}})}});var Sh=E(($et,OU)=>{var mCe="2.0.0",ECe=256,ICe=Number.MAX_SAFE_INTEGER||9007199254740991,yCe=16;OU.exports={SEMVER_SPEC_VERSION:mCe,MAX_LENGTH:ECe,MAX_SAFE_INTEGER:ICe,MAX_SAFE_COMPONENT_LENGTH:yCe}});var xh=E((ett,KU)=>{var wCe=typeof process=="object"&&process.env&&process.env.NODE_DEBUG&&/\bsemver\b/i.test(process.env.NODE_DEBUG)?(...t)=>console.error("SEMVER",...t):()=>{};KU.exports=wCe});var Ql=E((iA,UU)=>{var{MAX_SAFE_COMPONENT_LENGTH:yv}=Sh(),BCe=xh();iA=UU.exports={};var QCe=iA.re=[],Je=iA.src=[],We=iA.t={},bCe=0,mt=(t,e,r)=>{let i=bCe++;BCe(i,e),We[t]=i,Je[i]=e,QCe[i]=new RegExp(e,r?"g":void 0)};mt("NUMERICIDENTIFIER","0|[1-9]\\d*");mt("NUMERICIDENTIFIERLOOSE","[0-9]+");mt("NONNUMERICIDENTIFIER","\\d*[a-zA-Z-][a-zA-Z0-9-]*");mt("MAINVERSION",`(${Je[We.NUMERICIDENTIFIER]})\\.(${Je[We.NUMERICIDENTIFIER]})\\.(${Je[We.NUMERICIDENTIFIER]})`);mt("MAINVERSIONLOOSE",`(${Je[We.NUMERICIDENTIFIERLOOSE]})\\.(${Je[We.NUMERICIDENTIFIERLOOSE]})\\.(${Je[We.NUMERICIDENTIFIERLOOSE]})`);mt("PRERELEASEIDENTIFIER",`(?:${Je[We.NUMERICIDENTIFIER]}|${Je[We.NONNUMERICIDENTIFIER]})`);mt("PRERELEASEIDENTIFIERLOOSE",`(?:${Je[We.NUMERICIDENTIFIERLOOSE]}|${Je[We.NONNUMERICIDENTIFIER]})`);mt("PRERELEASE",`(?:-(${Je[We.PRERELEASEIDENTIFIER]}(?:\\.${Je[We.PRERELEASEIDENTIFIER]})*))`);mt("PRERELEASELOOSE",`(?:-?(${Je[We.PRERELEASEIDENTIFIERLOOSE]}(?:\\.${Je[We.PRERELEASEIDENTIFIERLOOSE]})*))`);mt("BUILDIDENTIFIER","[0-9A-Za-z-]+");mt("BUILD",`(?:\\+(${Je[We.BUILDIDENTIFIER]}(?:\\.${Je[We.BUILDIDENTIFIER]})*))`);mt("FULLPLAIN",`v?${Je[We.MAINVERSION]}${Je[We.PRERELEASE]}?${Je[We.BUILD]}?`);mt("FULL",`^${Je[We.FULLPLAIN]}$`);mt("LOOSEPLAIN",`[v=\\s]*${Je[We.MAINVERSIONLOOSE]}${Je[We.PRERELEASELOOSE]}?${Je[We.BUILD]}?`);mt("LOOSE",`^${Je[We.LOOSEPLAIN]}$`);mt("GTLT","((?:<|>)?=?)");mt("XRANGEIDENTIFIERLOOSE",`${Je[We.NUMERICIDENTIFIERLOOSE]}|x|X|\\*`);mt("XRANGEIDENTIFIER",`${Je[We.NUMERICIDENTIFIER]}|x|X|\\*`);mt("XRANGEPLAIN",`[v=\\s]*(${Je[We.XRANGEIDENTIFIER]})(?:\\.(${Je[We.XRANGEIDENTIFIER]})(?:\\.(${Je[We.XRANGEIDENTIFIER]})(?:${Je[We.PRERELEASE]})?${Je[We.BUILD]}?)?)?`);mt("XRANGEPLAINLOOSE",`[v=\\s]*(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:\\.(${Je[We.XRANGEIDENTIFIERLOOSE]})(?:${Je[We.PRERELEASELOOSE]})?${Je[We.BUILD]}?)?)?`);mt("XRANGE",`^${Je[We.GTLT]}\\s*${Je[We.XRANGEPLAIN]}$`);mt("XRANGELOOSE",`^${Je[We.GTLT]}\\s*${Je[We.XRANGEPLAINLOOSE]}$`);mt("COERCE",`(^|[^\\d])(\\d{1,${yv}})(?:\\.(\\d{1,${yv}}))?(?:\\.(\\d{1,${yv}}))?(?:$|[^\\d])`);mt("COERCERTL",Je[We.COERCE],!0);mt("LONETILDE","(?:~>?)");mt("TILDETRIM",`(\\s*)${Je[We.LONETILDE]}\\s+`,!0);iA.tildeTrimReplace="$1~";mt("TILDE",`^${Je[We.LONETILDE]}${Je[We.XRANGEPLAIN]}$`);mt("TILDELOOSE",`^${Je[We.LONETILDE]}${Je[We.XRANGEPLAINLOOSE]}$`);mt("LONECARET","(?:\\^)");mt("CARETTRIM",`(\\s*)${Je[We.LONECARET]}\\s+`,!0);iA.caretTrimReplace="$1^";mt("CARET",`^${Je[We.LONECARET]}${Je[We.XRANGEPLAIN]}$`);mt("CARETLOOSE",`^${Je[We.LONECARET]}${Je[We.XRANGEPLAINLOOSE]}$`);mt("COMPARATORLOOSE",`^${Je[We.GTLT]}\\s*(${Je[We.LOOSEPLAIN]})$|^$`);mt("COMPARATOR",`^${Je[We.GTLT]}\\s*(${Je[We.FULLPLAIN]})$|^$`);mt("COMPARATORTRIM",`(\\s*)${Je[We.GTLT]}\\s*(${Je[We.LOOSEPLAIN]}|${Je[We.XRANGEPLAIN]})`,!0);iA.comparatorTrimReplace="$1$2$3";mt("HYPHENRANGE",`^\\s*(${Je[We.XRANGEPLAIN]})\\s+-\\s+(${Je[We.XRANGEPLAIN]})\\s*$`);mt("HYPHENRANGELOOSE",`^\\s*(${Je[We.XRANGEPLAINLOOSE]})\\s+-\\s+(${Je[We.XRANGEPLAINLOOSE]})\\s*$`);mt("STAR","(<|>)?=?\\s*\\*");mt("GTE0","^\\s*>=\\s*0.0.0\\s*$");mt("GTE0PRE","^\\s*>=\\s*0.0.0-0\\s*$")});var kh=E((ttt,HU)=>{var vCe=["includePrerelease","loose","rtl"],SCe=t=>t?typeof t!="object"?{loose:!0}:vCe.filter(e=>t[e]).reduce((e,r)=>(e[r]=!0,e),{}):{};HU.exports=SCe});var zE=E((rtt,GU)=>{var jU=/^[0-9]+$/,YU=(t,e)=>{let r=jU.test(t),i=jU.test(e);return r&&i&&(t=+t,e=+e),t===e?0:r&&!i?-1:i&&!r?1:tYU(e,t);GU.exports={compareIdentifiers:YU,rcompareIdentifiers:xCe}});var bi=E((itt,qU)=>{var VE=xh(),{MAX_LENGTH:JU,MAX_SAFE_INTEGER:_E}=Sh(),{re:WU,t:zU}=Ql(),kCe=kh(),{compareIdentifiers:Ph}=zE(),_n=class{constructor(e,r){if(r=kCe(r),e instanceof _n){if(e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease)return e;e=e.version}else if(typeof e!="string")throw new TypeError(`Invalid Version: ${e}`);if(e.length>JU)throw new TypeError(`version is longer than ${JU} characters`);VE("SemVer",e,r),this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease;let i=e.trim().match(r.loose?WU[zU.LOOSE]:WU[zU.FULL]);if(!i)throw new TypeError(`Invalid Version: ${e}`);if(this.raw=e,this.major=+i[1],this.minor=+i[2],this.patch=+i[3],this.major>_E||this.major<0)throw new TypeError("Invalid major version");if(this.minor>_E||this.minor<0)throw new TypeError("Invalid minor version");if(this.patch>_E||this.patch<0)throw new TypeError("Invalid patch version");i[4]?this.prerelease=i[4].split(".").map(n=>{if(/^[0-9]+$/.test(n)){let s=+n;if(s>=0&&s<_E)return s}return n}):this.prerelease=[],this.build=i[5]?i[5].split("."):[],this.format()}format(){return this.version=`${this.major}.${this.minor}.${this.patch}`,this.prerelease.length&&(this.version+=`-${this.prerelease.join(".")}`),this.version}toString(){return this.version}compare(e){if(VE("SemVer.compare",this.version,this.options,e),!(e instanceof _n)){if(typeof e=="string"&&e===this.version)return 0;e=new _n(e,this.options)}return e.version===this.version?0:this.compareMain(e)||this.comparePre(e)}compareMain(e){return e instanceof _n||(e=new _n(e,this.options)),Ph(this.major,e.major)||Ph(this.minor,e.minor)||Ph(this.patch,e.patch)}comparePre(e){if(e instanceof _n||(e=new _n(e,this.options)),this.prerelease.length&&!e.prerelease.length)return-1;if(!this.prerelease.length&&e.prerelease.length)return 1;if(!this.prerelease.length&&!e.prerelease.length)return 0;let r=0;do{let i=this.prerelease[r],n=e.prerelease[r];if(VE("prerelease compare",r,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return Ph(i,n)}while(++r)}compareBuild(e){e instanceof _n||(e=new _n(e,this.options));let r=0;do{let i=this.build[r],n=e.build[r];if(VE("prerelease compare",r,i,n),i===void 0&&n===void 0)return 0;if(n===void 0)return 1;if(i===void 0)return-1;if(i===n)continue;return Ph(i,n)}while(++r)}inc(e,r){switch(e){case"premajor":this.prerelease.length=0,this.patch=0,this.minor=0,this.major++,this.inc("pre",r);break;case"preminor":this.prerelease.length=0,this.patch=0,this.minor++,this.inc("pre",r);break;case"prepatch":this.prerelease.length=0,this.inc("patch",r),this.inc("pre",r);break;case"prerelease":this.prerelease.length===0&&this.inc("patch",r),this.inc("pre",r);break;case"major":(this.minor!==0||this.patch!==0||this.prerelease.length===0)&&this.major++,this.minor=0,this.patch=0,this.prerelease=[];break;case"minor":(this.patch!==0||this.prerelease.length===0)&&this.minor++,this.patch=0,this.prerelease=[];break;case"patch":this.prerelease.length===0&&this.patch++,this.prerelease=[];break;case"pre":if(this.prerelease.length===0)this.prerelease=[0];else{let i=this.prerelease.length;for(;--i>=0;)typeof this.prerelease[i]=="number"&&(this.prerelease[i]++,i=-2);i===-1&&this.prerelease.push(0)}r&&(this.prerelease[0]===r?isNaN(this.prerelease[1])&&(this.prerelease=[r,0]):this.prerelease=[r,0]);break;default:throw new Error(`invalid increment argument: ${e}`)}return this.format(),this.raw=this.version,this}};qU.exports=_n});var bl=E((ntt,VU)=>{var{MAX_LENGTH:PCe}=Sh(),{re:_U,t:XU}=Ql(),ZU=bi(),DCe=kh(),RCe=(t,e)=>{if(e=DCe(e),t instanceof ZU)return t;if(typeof t!="string"||t.length>PCe||!(e.loose?_U[XU.LOOSE]:_U[XU.FULL]).test(t))return null;try{return new ZU(t,e)}catch(i){return null}};VU.exports=RCe});var e2=E((stt,$U)=>{var FCe=bl(),NCe=(t,e)=>{let r=FCe(t,e);return r?r.version:null};$U.exports=NCe});var r2=E((ott,t2)=>{var LCe=bl(),TCe=(t,e)=>{let r=LCe(t.trim().replace(/^[=v]+/,""),e);return r?r.version:null};t2.exports=TCe});var n2=E((att,i2)=>{var MCe=bi(),OCe=(t,e,r,i)=>{typeof r=="string"&&(i=r,r=void 0);try{return new MCe(t,r).inc(e,i).version}catch(n){return null}};i2.exports=OCe});var Xn=E((Att,s2)=>{var o2=bi(),KCe=(t,e,r)=>new o2(t,r).compare(new o2(e,r));s2.exports=KCe});var XE=E((ltt,a2)=>{var UCe=Xn(),HCe=(t,e,r)=>UCe(t,e,r)===0;a2.exports=HCe});var c2=E((ctt,A2)=>{var l2=bl(),GCe=XE(),jCe=(t,e)=>{if(GCe(t,e))return null;{let r=l2(t),i=l2(e),n=r.prerelease.length||i.prerelease.length,s=n?"pre":"",o=n?"prerelease":"";for(let a in r)if((a==="major"||a==="minor"||a==="patch")&&r[a]!==i[a])return s+a;return o}};A2.exports=jCe});var g2=E((utt,u2)=>{var YCe=bi(),qCe=(t,e)=>new YCe(t,e).major;u2.exports=qCe});var h2=E((gtt,f2)=>{var JCe=bi(),WCe=(t,e)=>new JCe(t,e).minor;f2.exports=WCe});var d2=E((ftt,p2)=>{var zCe=bi(),VCe=(t,e)=>new zCe(t,e).patch;p2.exports=VCe});var m2=E((htt,C2)=>{var _Ce=bl(),XCe=(t,e)=>{let r=_Ce(t,e);return r&&r.prerelease.length?r.prerelease:null};C2.exports=XCe});var I2=E((ptt,E2)=>{var ZCe=Xn(),$Ce=(t,e,r)=>ZCe(e,t,r);E2.exports=$Ce});var w2=E((dtt,y2)=>{var eme=Xn(),tme=(t,e)=>eme(t,e,!0);y2.exports=tme});var ZE=E((Ctt,B2)=>{var Q2=bi(),rme=(t,e,r)=>{let i=new Q2(t,r),n=new Q2(e,r);return i.compare(n)||i.compareBuild(n)};B2.exports=rme});var v2=E((mtt,b2)=>{var ime=ZE(),nme=(t,e)=>t.sort((r,i)=>ime(r,i,e));b2.exports=nme});var x2=E((Ett,S2)=>{var sme=ZE(),ome=(t,e)=>t.sort((r,i)=>sme(i,r,e));S2.exports=ome});var Dh=E((Itt,k2)=>{var ame=Xn(),Ame=(t,e,r)=>ame(t,e,r)>0;k2.exports=Ame});var $E=E((ytt,P2)=>{var lme=Xn(),cme=(t,e,r)=>lme(t,e,r)<0;P2.exports=cme});var wv=E((wtt,D2)=>{var ume=Xn(),gme=(t,e,r)=>ume(t,e,r)!==0;D2.exports=gme});var eI=E((Btt,R2)=>{var fme=Xn(),hme=(t,e,r)=>fme(t,e,r)>=0;R2.exports=hme});var tI=E((Qtt,F2)=>{var pme=Xn(),dme=(t,e,r)=>pme(t,e,r)<=0;F2.exports=dme});var Bv=E((btt,N2)=>{var Cme=XE(),mme=wv(),Eme=Dh(),Ime=eI(),yme=$E(),wme=tI(),Bme=(t,e,r,i)=>{switch(e){case"===":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t===r;case"!==":return typeof t=="object"&&(t=t.version),typeof r=="object"&&(r=r.version),t!==r;case"":case"=":case"==":return Cme(t,r,i);case"!=":return mme(t,r,i);case">":return Eme(t,r,i);case">=":return Ime(t,r,i);case"<":return yme(t,r,i);case"<=":return wme(t,r,i);default:throw new TypeError(`Invalid operator: ${e}`)}};N2.exports=Bme});var T2=E((vtt,L2)=>{var Qme=bi(),bme=bl(),{re:rI,t:iI}=Ql(),vme=(t,e)=>{if(t instanceof Qme)return t;if(typeof t=="number"&&(t=String(t)),typeof t!="string")return null;e=e||{};let r=null;if(!e.rtl)r=t.match(rI[iI.COERCE]);else{let i;for(;(i=rI[iI.COERCERTL].exec(t))&&(!r||r.index+r[0].length!==t.length);)(!r||i.index+i[0].length!==r.index+r[0].length)&&(r=i),rI[iI.COERCERTL].lastIndex=i.index+i[1].length+i[2].length;rI[iI.COERCERTL].lastIndex=-1}return r===null?null:bme(`${r[2]}.${r[3]||"0"}.${r[4]||"0"}`,e)};L2.exports=vme});var O2=E((Stt,M2)=>{"use strict";M2.exports=function(t){t.prototype[Symbol.iterator]=function*(){for(let e=this.head;e;e=e.next)yield e.value}}});var Rh=E((xtt,K2)=>{"use strict";K2.exports=Pt;Pt.Node=vl;Pt.create=Pt;function Pt(t){var e=this;if(e instanceof Pt||(e=new Pt),e.tail=null,e.head=null,e.length=0,t&&typeof t.forEach=="function")t.forEach(function(n){e.push(n)});else if(arguments.length>0)for(var r=0,i=arguments.length;r1)r=e;else if(this.head)i=this.head.next,r=this.head.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=0;i!==null;n++)r=t(r,i.value,n),i=i.next;return r};Pt.prototype.reduceReverse=function(t,e){var r,i=this.tail;if(arguments.length>1)r=e;else if(this.tail)i=this.tail.prev,r=this.tail.value;else throw new TypeError("Reduce of empty list with no initial value");for(var n=this.length-1;i!==null;n--)r=t(r,i.value,n),i=i.prev;return r};Pt.prototype.toArray=function(){for(var t=new Array(this.length),e=0,r=this.head;r!==null;e++)t[e]=r.value,r=r.next;return t};Pt.prototype.toArrayReverse=function(){for(var t=new Array(this.length),e=0,r=this.tail;r!==null;e++)t[e]=r.value,r=r.prev;return t};Pt.prototype.slice=function(t,e){e=e||this.length,e<0&&(e+=this.length),t=t||0,t<0&&(t+=this.length);var r=new Pt;if(ethis.length&&(e=this.length);for(var i=0,n=this.head;n!==null&&ithis.length&&(e=this.length);for(var i=this.length,n=this.tail;n!==null&&i>e;i--)n=n.prev;for(;n!==null&&i>t;i--,n=n.prev)r.push(n.value);return r};Pt.prototype.splice=function(t,e,...r){t>this.length&&(t=this.length-1),t<0&&(t=this.length+t);for(var i=0,n=this.head;n!==null&&i{"use strict";var Pme=Rh(),Sl=Symbol("max"),ra=Symbol("length"),uu=Symbol("lengthCalculator"),Fh=Symbol("allowStale"),xl=Symbol("maxAge"),ia=Symbol("dispose"),H2=Symbol("noDisposeOnSet"),si=Symbol("lruList"),ks=Symbol("cache"),G2=Symbol("updateAgeOnGet"),Qv=()=>1,j2=class{constructor(e){if(typeof e=="number"&&(e={max:e}),e||(e={}),e.max&&(typeof e.max!="number"||e.max<0))throw new TypeError("max must be a non-negative number");let r=this[Sl]=e.max||Infinity,i=e.length||Qv;if(this[uu]=typeof i!="function"?Qv:i,this[Fh]=e.stale||!1,e.maxAge&&typeof e.maxAge!="number")throw new TypeError("maxAge must be a number");this[xl]=e.maxAge||0,this[ia]=e.dispose,this[H2]=e.noDisposeOnSet||!1,this[G2]=e.updateAgeOnGet||!1,this.reset()}set max(e){if(typeof e!="number"||e<0)throw new TypeError("max must be a non-negative number");this[Sl]=e||Infinity,Nh(this)}get max(){return this[Sl]}set allowStale(e){this[Fh]=!!e}get allowStale(){return this[Fh]}set maxAge(e){if(typeof e!="number")throw new TypeError("maxAge must be a non-negative number");this[xl]=e,Nh(this)}get maxAge(){return this[xl]}set lengthCalculator(e){typeof e!="function"&&(e=Qv),e!==this[uu]&&(this[uu]=e,this[ra]=0,this[si].forEach(r=>{r.length=this[uu](r.value,r.key),this[ra]+=r.length})),Nh(this)}get lengthCalculator(){return this[uu]}get length(){return this[ra]}get itemCount(){return this[si].length}rforEach(e,r){r=r||this;for(let i=this[si].tail;i!==null;){let n=i.prev;q2(this,e,i,r),i=n}}forEach(e,r){r=r||this;for(let i=this[si].head;i!==null;){let n=i.next;q2(this,e,i,r),i=n}}keys(){return this[si].toArray().map(e=>e.key)}values(){return this[si].toArray().map(e=>e.value)}reset(){this[ia]&&this[si]&&this[si].length&&this[si].forEach(e=>this[ia](e.key,e.value)),this[ks]=new Map,this[si]=new Pme,this[ra]=0}dump(){return this[si].map(e=>nI(this,e)?!1:{k:e.key,v:e.value,e:e.now+(e.maxAge||0)}).toArray().filter(e=>e)}dumpLru(){return this[si]}set(e,r,i){if(i=i||this[xl],i&&typeof i!="number")throw new TypeError("maxAge must be a number");let n=i?Date.now():0,s=this[uu](r,e);if(this[ks].has(e)){if(s>this[Sl])return gu(this,this[ks].get(e)),!1;let l=this[ks].get(e).value;return this[ia]&&(this[H2]||this[ia](e,l.value)),l.now=n,l.maxAge=i,l.value=r,this[ra]+=s-l.length,l.length=s,this.get(e),Nh(this),!0}let o=new Y2(e,r,s,n,i);return o.length>this[Sl]?(this[ia]&&this[ia](e,r),!1):(this[ra]+=o.length,this[si].unshift(o),this[ks].set(e,this[si].head),Nh(this),!0)}has(e){if(!this[ks].has(e))return!1;let r=this[ks].get(e).value;return!nI(this,r)}get(e){return bv(this,e,!0)}peek(e){return bv(this,e,!1)}pop(){let e=this[si].tail;return e?(gu(this,e),e.value):null}del(e){gu(this,this[ks].get(e))}load(e){this.reset();let r=Date.now();for(let i=e.length-1;i>=0;i--){let n=e[i],s=n.e||0;if(s===0)this.set(n.k,n.v);else{let o=s-r;o>0&&this.set(n.k,n.v,o)}}}prune(){this[ks].forEach((e,r)=>bv(this,r,!1))}},bv=(t,e,r)=>{let i=t[ks].get(e);if(i){let n=i.value;if(nI(t,n)){if(gu(t,i),!t[Fh])return}else r&&(t[G2]&&(i.value.now=Date.now()),t[si].unshiftNode(i));return n.value}},nI=(t,e)=>{if(!e||!e.maxAge&&!t[xl])return!1;let r=Date.now()-e.now;return e.maxAge?r>e.maxAge:t[xl]&&r>t[xl]},Nh=t=>{if(t[ra]>t[Sl])for(let e=t[si].tail;t[ra]>t[Sl]&&e!==null;){let r=e.prev;gu(t,e),e=r}},gu=(t,e)=>{if(e){let r=e.value;t[ia]&&t[ia](r.key,r.value),t[ra]-=r.length,t[ks].delete(r.key),t[si].removeNode(e)}},Y2=class{constructor(e,r,i,n,s){this.key=e,this.value=r,this.length=i,this.now=n,this.maxAge=s||0}},q2=(t,e,r,i)=>{let n=r.value;nI(t,n)&&(gu(t,r),t[Fh]||(n=void 0)),n&&e.call(i,n.value,n.key,t)};U2.exports=j2});var Zn=E((Ptt,W2)=>{var fu=class{constructor(e,r){if(r=Dme(r),e instanceof fu)return e.loose===!!r.loose&&e.includePrerelease===!!r.includePrerelease?e:new fu(e.raw,r);if(e instanceof vv)return this.raw=e.value,this.set=[[e]],this.format(),this;if(this.options=r,this.loose=!!r.loose,this.includePrerelease=!!r.includePrerelease,this.raw=e,this.set=e.split(/\s*\|\|\s*/).map(i=>this.parseRange(i.trim())).filter(i=>i.length),!this.set.length)throw new TypeError(`Invalid SemVer Range: ${e}`);if(this.set.length>1){let i=this.set[0];if(this.set=this.set.filter(n=>!V2(n[0])),this.set.length===0)this.set=[i];else if(this.set.length>1){for(let n of this.set)if(n.length===1&&Tme(n[0])){this.set=[n];break}}}this.format()}format(){return this.range=this.set.map(e=>e.join(" ").trim()).join("||").trim(),this.range}toString(){return this.range}parseRange(e){e=e.trim();let i=`parseRange:${Object.keys(this.options).join(",")}:${e}`,n=z2.get(i);if(n)return n;let s=this.options.loose,o=s?vi[di.HYPHENRANGELOOSE]:vi[di.HYPHENRANGE];e=e.replace(o,Kme(this.options.includePrerelease)),Rr("hyphen replace",e),e=e.replace(vi[di.COMPARATORTRIM],Fme),Rr("comparator trim",e,vi[di.COMPARATORTRIM]),e=e.replace(vi[di.TILDETRIM],Nme),e=e.replace(vi[di.CARETTRIM],Lme),e=e.split(/\s+/).join(" ");let a=s?vi[di.COMPARATORLOOSE]:vi[di.COMPARATOR],l=e.split(" ").map(f=>Mme(f,this.options)).join(" ").split(/\s+/).map(f=>Ome(f,this.options)).filter(this.options.loose?f=>!!f.match(a):()=>!0).map(f=>new vv(f,this.options)),c=l.length,u=new Map;for(let f of l){if(V2(f))return[f];u.set(f.value,f)}u.size>1&&u.has("")&&u.delete("");let g=[...u.values()];return z2.set(i,g),g}intersects(e,r){if(!(e instanceof fu))throw new TypeError("a Range is required");return this.set.some(i=>_2(i,r)&&e.set.some(n=>_2(n,r)&&i.every(s=>n.every(o=>s.intersects(o,r)))))}test(e){if(!e)return!1;if(typeof e=="string")try{e=new Rme(e,this.options)}catch(r){return!1}for(let r=0;rt.value==="<0.0.0-0",Tme=t=>t.value==="",_2=(t,e)=>{let r=!0,i=t.slice(),n=i.pop();for(;r&&i.length;)r=i.every(s=>n.intersects(s,e)),n=i.pop();return r},Mme=(t,e)=>(Rr("comp",t,e),t=jme(t,e),Rr("caret",t),t=Gme(t,e),Rr("tildes",t),t=Yme(t,e),Rr("xrange",t),t=qme(t,e),Rr("stars",t),t),Ji=t=>!t||t.toLowerCase()==="x"||t==="*",Gme=(t,e)=>t.trim().split(/\s+/).map(r=>Jme(r,e)).join(" "),Jme=(t,e)=>{let r=e.loose?vi[di.TILDELOOSE]:vi[di.TILDE];return t.replace(r,(i,n,s,o,a)=>{Rr("tilde",t,i,n,s,o,a);let l;return Ji(n)?l="":Ji(s)?l=`>=${n}.0.0 <${+n+1}.0.0-0`:Ji(o)?l=`>=${n}.${s}.0 <${n}.${+s+1}.0-0`:a?(Rr("replaceTilde pr",a),l=`>=${n}.${s}.${o}-${a} <${n}.${+s+1}.0-0`):l=`>=${n}.${s}.${o} <${n}.${+s+1}.0-0`,Rr("tilde return",l),l})},jme=(t,e)=>t.trim().split(/\s+/).map(r=>Wme(r,e)).join(" "),Wme=(t,e)=>{Rr("caret",t,e);let r=e.loose?vi[di.CARETLOOSE]:vi[di.CARET],i=e.includePrerelease?"-0":"";return t.replace(r,(n,s,o,a,l)=>{Rr("caret",t,n,s,o,a,l);let c;return Ji(s)?c="":Ji(o)?c=`>=${s}.0.0${i} <${+s+1}.0.0-0`:Ji(a)?s==="0"?c=`>=${s}.${o}.0${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.0${i} <${+s+1}.0.0-0`:l?(Rr("replaceCaret pr",l),s==="0"?o==="0"?c=`>=${s}.${o}.${a}-${l} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}-${l} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a}-${l} <${+s+1}.0.0-0`):(Rr("no pr"),s==="0"?o==="0"?c=`>=${s}.${o}.${a}${i} <${s}.${o}.${+a+1}-0`:c=`>=${s}.${o}.${a}${i} <${s}.${+o+1}.0-0`:c=`>=${s}.${o}.${a} <${+s+1}.0.0-0`),Rr("caret return",c),c})},Yme=(t,e)=>(Rr("replaceXRanges",t,e),t.split(/\s+/).map(r=>zme(r,e)).join(" ")),zme=(t,e)=>{t=t.trim();let r=e.loose?vi[di.XRANGELOOSE]:vi[di.XRANGE];return t.replace(r,(i,n,s,o,a,l)=>{Rr("xRange",t,i,n,s,o,a,l);let c=Ji(s),u=c||Ji(o),g=u||Ji(a),f=g;return n==="="&&f&&(n=""),l=e.includePrerelease?"-0":"",c?n===">"||n==="<"?i="<0.0.0-0":i="*":n&&f?(u&&(o=0),a=0,n===">"?(n=">=",u?(s=+s+1,o=0,a=0):(o=+o+1,a=0)):n==="<="&&(n="<",u?s=+s+1:o=+o+1),n==="<"&&(l="-0"),i=`${n+s}.${o}.${a}${l}`):u?i=`>=${s}.0.0${l} <${+s+1}.0.0-0`:g&&(i=`>=${s}.${o}.0${l} <${s}.${+o+1}.0-0`),Rr("xRange return",i),i})},qme=(t,e)=>(Rr("replaceStars",t,e),t.trim().replace(vi[di.STAR],"")),Ome=(t,e)=>(Rr("replaceGTE0",t,e),t.trim().replace(vi[e.includePrerelease?di.GTE0PRE:di.GTE0],"")),Kme=t=>(e,r,i,n,s,o,a,l,c,u,g,f,h)=>(Ji(i)?r="":Ji(n)?r=`>=${i}.0.0${t?"-0":""}`:Ji(s)?r=`>=${i}.${n}.0${t?"-0":""}`:o?r=`>=${r}`:r=`>=${r}${t?"-0":""}`,Ji(c)?l="":Ji(u)?l=`<${+c+1}.0.0-0`:Ji(g)?l=`<${c}.${+u+1}.0-0`:f?l=`<=${c}.${u}.${g}-${f}`:t?l=`<${c}.${u}.${+g+1}-0`:l=`<=${l}`,`${r} ${l}`.trim()),Ume=(t,e,r)=>{for(let i=0;i0){let n=t[i].semver;if(n.major===e.major&&n.minor===e.minor&&n.patch===e.patch)return!0}return!1}return!0}});var Lh=E((Dtt,X2)=>{var Th=Symbol("SemVer ANY"),Mh=class{static get ANY(){return Th}constructor(e,r){if(r=Vme(r),e instanceof Mh){if(e.loose===!!r.loose)return e;e=e.value}xv("comparator",e,r),this.options=r,this.loose=!!r.loose,this.parse(e),this.semver===Th?this.value="":this.value=this.operator+this.semver.version,xv("comp",this)}parse(e){let r=this.options.loose?Z2[$2.COMPARATORLOOSE]:Z2[$2.COMPARATOR],i=e.match(r);if(!i)throw new TypeError(`Invalid comparator: ${e}`);this.operator=i[1]!==void 0?i[1]:"",this.operator==="="&&(this.operator=""),i[2]?this.semver=new eH(i[2],this.options.loose):this.semver=Th}toString(){return this.value}test(e){if(xv("Comparator.test",e,this.options.loose),this.semver===Th||e===Th)return!0;if(typeof e=="string")try{e=new eH(e,this.options)}catch(r){return!1}return Sv(e,this.operator,this.semver,this.options)}intersects(e,r){if(!(e instanceof Mh))throw new TypeError("a Comparator is required");if((!r||typeof r!="object")&&(r={loose:!!r,includePrerelease:!1}),this.operator==="")return this.value===""?!0:new tH(e.value,r).test(this.value);if(e.operator==="")return e.value===""?!0:new tH(this.value,r).test(e.semver);let i=(this.operator===">="||this.operator===">")&&(e.operator===">="||e.operator===">"),n=(this.operator==="<="||this.operator==="<")&&(e.operator==="<="||e.operator==="<"),s=this.semver.version===e.semver.version,o=(this.operator===">="||this.operator==="<=")&&(e.operator===">="||e.operator==="<="),a=Sv(this.semver,"<",e.semver,r)&&(this.operator===">="||this.operator===">")&&(e.operator==="<="||e.operator==="<"),l=Sv(this.semver,">",e.semver,r)&&(this.operator==="<="||this.operator==="<")&&(e.operator===">="||e.operator===">");return i||n||s&&o||a||l}};X2.exports=Mh;var Vme=kh(),{re:Z2,t:$2}=Ql(),Sv=Bv(),xv=xh(),eH=bi(),tH=Zn()});var Oh=E((Rtt,rH)=>{var _me=Zn(),Xme=(t,e,r)=>{try{e=new _me(e,r)}catch(i){return!1}return e.test(t)};rH.exports=Xme});var nH=E((Ftt,iH)=>{var Zme=Zn(),$me=(t,e)=>new Zme(t,e).set.map(r=>r.map(i=>i.value).join(" ").trim().split(" "));iH.exports=$me});var oH=E((Ntt,sH)=>{var eEe=bi(),tEe=Zn(),rEe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new tEe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===-1)&&(i=o,n=new eEe(i,r))}),i};sH.exports=rEe});var AH=E((Ltt,aH)=>{var iEe=bi(),nEe=Zn(),sEe=(t,e,r)=>{let i=null,n=null,s=null;try{s=new nEe(e,r)}catch(o){return null}return t.forEach(o=>{s.test(o)&&(!i||n.compare(o)===1)&&(i=o,n=new iEe(i,r))}),i};aH.exports=sEe});var uH=E((Ttt,lH)=>{var kv=bi(),oEe=Zn(),cH=Dh(),aEe=(t,e)=>{t=new oEe(t,e);let r=new kv("0.0.0");if(t.test(r)||(r=new kv("0.0.0-0"),t.test(r)))return r;r=null;for(let i=0;i{let a=new kv(o.semver.version);switch(o.operator){case">":a.prerelease.length===0?a.patch++:a.prerelease.push(0),a.raw=a.format();case"":case">=":(!s||cH(a,s))&&(s=a);break;case"<":case"<=":break;default:throw new Error(`Unexpected operation: ${o.operator}`)}}),s&&(!r||cH(r,s))&&(r=s)}return r&&t.test(r)?r:null};lH.exports=aEe});var fH=E((Mtt,gH)=>{var AEe=Zn(),lEe=(t,e)=>{try{return new AEe(t,e).range||"*"}catch(r){return null}};gH.exports=lEe});var sI=E((Ott,hH)=>{var cEe=bi(),pH=Lh(),{ANY:uEe}=pH,gEe=Zn(),fEe=Oh(),dH=Dh(),CH=$E(),hEe=tI(),pEe=eI(),dEe=(t,e,r,i)=>{t=new cEe(t,i),e=new gEe(e,i);let n,s,o,a,l;switch(r){case">":n=dH,s=hEe,o=CH,a=">",l=">=";break;case"<":n=CH,s=pEe,o=dH,a="<",l="<=";break;default:throw new TypeError('Must provide a hilo val of "<" or ">"')}if(fEe(t,e,i))return!1;for(let c=0;c{h.semver===uEe&&(h=new pH(">=0.0.0")),g=g||h,f=f||h,n(h.semver,g.semver,i)?g=h:o(h.semver,f.semver,i)&&(f=h)}),g.operator===a||g.operator===l||(!f.operator||f.operator===a)&&s(t,f.semver))return!1;if(f.operator===l&&o(t,f.semver))return!1}return!0};hH.exports=dEe});var EH=E((Ktt,mH)=>{var CEe=sI(),mEe=(t,e,r)=>CEe(t,e,">",r);mH.exports=mEe});var yH=E((Utt,IH)=>{var EEe=sI(),IEe=(t,e,r)=>EEe(t,e,"<",r);IH.exports=IEe});var QH=E((Htt,wH)=>{var BH=Zn(),yEe=(t,e,r)=>(t=new BH(t,r),e=new BH(e,r),t.intersects(e));wH.exports=yEe});var vH=E((Gtt,bH)=>{var wEe=Oh(),BEe=Xn();bH.exports=(t,e,r)=>{let i=[],n=null,s=null,o=t.sort((u,g)=>BEe(u,g,r));for(let u of o)wEe(u,e,r)?(s=u,n||(n=u)):(s&&i.push([n,s]),s=null,n=null);n&&i.push([n,null]);let a=[];for(let[u,g]of i)u===g?a.push(u):!g&&u===o[0]?a.push("*"):g?u===o[0]?a.push(`<=${g}`):a.push(`${u} - ${g}`):a.push(`>=${u}`);let l=a.join(" || "),c=typeof e.raw=="string"?e.raw:String(e);return l.length{var xH=Zn(),oI=Lh(),{ANY:Pv}=oI,Kh=Oh(),Dv=Xn(),bEe=(t,e,r={})=>{if(t===e)return!0;t=new xH(t,r),e=new xH(e,r);let i=!1;e:for(let n of t.set){for(let s of e.set){let o=QEe(n,s,r);if(i=i||o!==null,o)continue e}if(i)return!1}return!0},QEe=(t,e,r)=>{if(t===e)return!0;if(t.length===1&&t[0].semver===Pv){if(e.length===1&&e[0].semver===Pv)return!0;r.includePrerelease?t=[new oI(">=0.0.0-0")]:t=[new oI(">=0.0.0")]}if(e.length===1&&e[0].semver===Pv){if(r.includePrerelease)return!0;e=[new oI(">=0.0.0")]}let i=new Set,n,s;for(let h of t)h.operator===">"||h.operator===">="?n=kH(n,h,r):h.operator==="<"||h.operator==="<="?s=PH(s,h,r):i.add(h.semver);if(i.size>1)return null;let o;if(n&&s){if(o=Dv(n.semver,s.semver,r),o>0)return null;if(o===0&&(n.operator!==">="||s.operator!=="<="))return null}for(let h of i){if(n&&!Kh(h,String(n),r)||s&&!Kh(h,String(s),r))return null;for(let p of e)if(!Kh(h,String(p),r))return!1;return!0}let a,l,c,u,g=s&&!r.includePrerelease&&s.semver.prerelease.length?s.semver:!1,f=n&&!r.includePrerelease&&n.semver.prerelease.length?n.semver:!1;g&&g.prerelease.length===1&&s.operator==="<"&&g.prerelease[0]===0&&(g=!1);for(let h of e){if(u=u||h.operator===">"||h.operator===">=",c=c||h.operator==="<"||h.operator==="<=",n){if(f&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===f.major&&h.semver.minor===f.minor&&h.semver.patch===f.patch&&(f=!1),h.operator===">"||h.operator===">="){if(a=kH(n,h,r),a===h&&a!==n)return!1}else if(n.operator===">="&&!Kh(n.semver,String(h),r))return!1}if(s){if(g&&h.semver.prerelease&&h.semver.prerelease.length&&h.semver.major===g.major&&h.semver.minor===g.minor&&h.semver.patch===g.patch&&(g=!1),h.operator==="<"||h.operator==="<="){if(l=PH(s,h,r),l===h&&l!==s)return!1}else if(s.operator==="<="&&!Kh(s.semver,String(h),r))return!1}if(!h.operator&&(s||n)&&o!==0)return!1}return!(n&&c&&!s&&o!==0||s&&u&&!n&&o!==0||f||g)},kH=(t,e,r)=>{if(!t)return e;let i=Dv(t.semver,e.semver,r);return i>0?t:i<0||e.operator===">"&&t.operator===">="?e:t},PH=(t,e,r)=>{if(!t)return e;let i=Dv(t.semver,e.semver,r);return i<0?t:i>0||e.operator==="<"&&t.operator==="<="?e:t};SH.exports=bEe});var Or=E((Ytt,RH)=>{var Rv=Ql();RH.exports={re:Rv.re,src:Rv.src,tokens:Rv.t,SEMVER_SPEC_VERSION:Sh().SEMVER_SPEC_VERSION,SemVer:bi(),compareIdentifiers:zE().compareIdentifiers,rcompareIdentifiers:zE().rcompareIdentifiers,parse:bl(),valid:e2(),clean:r2(),inc:n2(),diff:c2(),major:g2(),minor:h2(),patch:d2(),prerelease:m2(),compare:Xn(),rcompare:I2(),compareLoose:w2(),compareBuild:ZE(),sort:v2(),rsort:x2(),gt:Dh(),lt:$E(),eq:XE(),neq:wv(),gte:eI(),lte:tI(),cmp:Bv(),coerce:T2(),Comparator:Lh(),Range:Zn(),satisfies:Oh(),toComparators:nH(),maxSatisfying:oH(),minSatisfying:AH(),minVersion:uH(),validRange:fH(),outside:sI(),gtr:EH(),ltr:yH(),intersects:QH(),simplifyRange:vH(),subset:DH()}});var Uv=E(AI=>{"use strict";Object.defineProperty(AI,"__esModule",{value:!0});AI.VERSION=void 0;AI.VERSION="9.1.0"});var Dt=E((exports,module)=>{"use strict";var __spreadArray=exports&&exports.__spreadArray||function(t,e,r){if(r||arguments.length===2)for(var i=0,n=e.length,s;i{(function(t,e){typeof define=="function"&&define.amd?define([],e):typeof lI=="object"&&lI.exports?lI.exports=e():t.regexpToAst=e()})(typeof self!="undefined"?self:YH,function(){function t(){}t.prototype.saveState=function(){return{idx:this.idx,input:this.input,groupIdx:this.groupIdx}},t.prototype.restoreState=function(p){this.idx=p.idx,this.input=p.input,this.groupIdx=p.groupIdx},t.prototype.pattern=function(p){this.idx=0,this.input=p,this.groupIdx=0,this.consumeChar("/");var d=this.disjunction();this.consumeChar("/");for(var m={type:"Flags",loc:{begin:this.idx,end:p.length},global:!1,ignoreCase:!1,multiLine:!1,unicode:!1,sticky:!1};this.isRegExpFlag();)switch(this.popChar()){case"g":o(m,"global");break;case"i":o(m,"ignoreCase");break;case"m":o(m,"multiLine");break;case"u":o(m,"unicode");break;case"y":o(m,"sticky");break}if(this.idx!==this.input.length)throw Error("Redundant input: "+this.input.substring(this.idx));return{type:"Pattern",flags:m,value:d,loc:this.loc(0)}},t.prototype.disjunction=function(){var p=[],d=this.idx;for(p.push(this.alternative());this.peekChar()==="|";)this.consumeChar("|"),p.push(this.alternative());return{type:"Disjunction",value:p,loc:this.loc(d)}},t.prototype.alternative=function(){for(var p=[],d=this.idx;this.isTerm();)p.push(this.term());return{type:"Alternative",value:p,loc:this.loc(d)}},t.prototype.term=function(){return this.isAssertion()?this.assertion():this.atom()},t.prototype.assertion=function(){var p=this.idx;switch(this.popChar()){case"^":return{type:"StartAnchor",loc:this.loc(p)};case"$":return{type:"EndAnchor",loc:this.loc(p)};case"\\":switch(this.popChar()){case"b":return{type:"WordBoundary",loc:this.loc(p)};case"B":return{type:"NonWordBoundary",loc:this.loc(p)}}throw Error("Invalid Assertion Escape");case"(":this.consumeChar("?");var d;switch(this.popChar()){case"=":d="Lookahead";break;case"!":d="NegativeLookahead";break}a(d);var m=this.disjunction();return this.consumeChar(")"),{type:d,value:m,loc:this.loc(p)}}l()},t.prototype.quantifier=function(p){var d,m=this.idx;switch(this.popChar()){case"*":d={atLeast:0,atMost:Infinity};break;case"+":d={atLeast:1,atMost:Infinity};break;case"?":d={atLeast:0,atMost:1};break;case"{":var I=this.integerIncludingZero();switch(this.popChar()){case"}":d={atLeast:I,atMost:I};break;case",":var B;this.isDigit()?(B=this.integerIncludingZero(),d={atLeast:I,atMost:B}):d={atLeast:I,atMost:Infinity},this.consumeChar("}");break}if(p===!0&&d===void 0)return;a(d);break}if(!(p===!0&&d===void 0))return a(d),this.peekChar(0)==="?"?(this.consumeChar("?"),d.greedy=!1):d.greedy=!0,d.type="Quantifier",d.loc=this.loc(m),d},t.prototype.atom=function(){var p,d=this.idx;switch(this.peekChar()){case".":p=this.dotAll();break;case"\\":p=this.atomEscape();break;case"[":p=this.characterClass();break;case"(":p=this.group();break}return p===void 0&&this.isPatternCharacter()&&(p=this.patternCharacter()),a(p),p.loc=this.loc(d),this.isQuantifier()&&(p.quantifier=this.quantifier()),p},t.prototype.dotAll=function(){return this.consumeChar("."),{type:"Set",complement:!0,value:[n(` +`),n("\r"),n("\u2028"),n("\u2029")]}},t.prototype.atomEscape=function(){switch(this.consumeChar("\\"),this.peekChar()){case"1":case"2":case"3":case"4":case"5":case"6":case"7":case"8":case"9":return this.decimalEscapeAtom();case"d":case"D":case"s":case"S":case"w":case"W":return this.characterClassEscape();case"f":case"n":case"r":case"t":case"v":return this.controlEscapeAtom();case"c":return this.controlLetterEscapeAtom();case"0":return this.nulCharacterAtom();case"x":return this.hexEscapeSequenceAtom();case"u":return this.regExpUnicodeEscapeSequenceAtom();default:return this.identityEscapeAtom()}},t.prototype.decimalEscapeAtom=function(){var p=this.positiveInteger();return{type:"GroupBackReference",value:p}},t.prototype.characterClassEscape=function(){var p,d=!1;switch(this.popChar()){case"d":p=u;break;case"D":p=u,d=!0;break;case"s":p=f;break;case"S":p=f,d=!0;break;case"w":p=g;break;case"W":p=g,d=!0;break}return a(p),{type:"Set",value:p,complement:d}},t.prototype.controlEscapeAtom=function(){var p;switch(this.popChar()){case"f":p=n("\f");break;case"n":p=n(` +`);break;case"r":p=n("\r");break;case"t":p=n(" ");break;case"v":p=n("\v");break}return a(p),{type:"Character",value:p}},t.prototype.controlLetterEscapeAtom=function(){this.consumeChar("c");var p=this.popChar();if(/[a-zA-Z]/.test(p)===!1)throw Error("Invalid ");var d=p.toUpperCase().charCodeAt(0)-64;return{type:"Character",value:d}},t.prototype.nulCharacterAtom=function(){return this.consumeChar("0"),{type:"Character",value:n("\0")}},t.prototype.hexEscapeSequenceAtom=function(){return this.consumeChar("x"),this.parseHexDigits(2)},t.prototype.regExpUnicodeEscapeSequenceAtom=function(){return this.consumeChar("u"),this.parseHexDigits(4)},t.prototype.identityEscapeAtom=function(){var p=this.popChar();return{type:"Character",value:n(p)}},t.prototype.classPatternCharacterAtom=function(){switch(this.peekChar()){case` +`:case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:var p=this.popChar();return{type:"Character",value:n(p)}}},t.prototype.characterClass=function(){var p=[],d=!1;for(this.consumeChar("["),this.peekChar(0)==="^"&&(this.consumeChar("^"),d=!0);this.isClassAtom();){var m=this.classAtom(),I=m.type==="Character";if(I&&this.isRangeDash()){this.consumeChar("-");var B=this.classAtom(),b=B.type==="Character";if(b){if(B.value=this.input.length)throw Error("Unexpected end of input");this.idx++},t.prototype.loc=function(p){return{begin:p,end:this.idx}};var e=/[0-9a-fA-F]/,r=/[0-9]/,i=/[1-9]/;function n(p){return p.charCodeAt(0)}function s(p,d){p.length!==void 0?p.forEach(function(m){d.push(m)}):d.push(p)}function o(p,d){if(p[d]===!0)throw"duplicate flag "+d;p[d]=!0}function a(p){if(p===void 0)throw Error("Internal Error - Should never get here!")}function l(){throw Error("Internal Error - Should never get here!")}var c,u=[];for(c=n("0");c<=n("9");c++)u.push(c);var g=[n("_")].concat(u);for(c=n("a");c<=n("z");c++)g.push(c);for(c=n("A");c<=n("Z");c++)g.push(c);var f=[n(" "),n("\f"),n(` +`),n("\r"),n(" "),n("\v"),n(" "),n("\xA0"),n("\u1680"),n("\u2000"),n("\u2001"),n("\u2002"),n("\u2003"),n("\u2004"),n("\u2005"),n("\u2006"),n("\u2007"),n("\u2008"),n("\u2009"),n("\u200A"),n("\u2028"),n("\u2029"),n("\u202F"),n("\u205F"),n("\u3000"),n("\uFEFF")];function h(){}return h.prototype.visitChildren=function(p){for(var d in p){var m=p[d];p.hasOwnProperty(d)&&(m.type!==void 0?this.visit(m):Array.isArray(m)&&m.forEach(function(I){this.visit(I)},this))}},h.prototype.visit=function(p){switch(p.type){case"Pattern":this.visitPattern(p);break;case"Flags":this.visitFlags(p);break;case"Disjunction":this.visitDisjunction(p);break;case"Alternative":this.visitAlternative(p);break;case"StartAnchor":this.visitStartAnchor(p);break;case"EndAnchor":this.visitEndAnchor(p);break;case"WordBoundary":this.visitWordBoundary(p);break;case"NonWordBoundary":this.visitNonWordBoundary(p);break;case"Lookahead":this.visitLookahead(p);break;case"NegativeLookahead":this.visitNegativeLookahead(p);break;case"Character":this.visitCharacter(p);break;case"Set":this.visitSet(p);break;case"Group":this.visitGroup(p);break;case"GroupBackReference":this.visitGroupBackReference(p);break;case"Quantifier":this.visitQuantifier(p);break}this.visitChildren(p)},h.prototype.visitPattern=function(p){},h.prototype.visitFlags=function(p){},h.prototype.visitDisjunction=function(p){},h.prototype.visitAlternative=function(p){},h.prototype.visitStartAnchor=function(p){},h.prototype.visitEndAnchor=function(p){},h.prototype.visitWordBoundary=function(p){},h.prototype.visitNonWordBoundary=function(p){},h.prototype.visitLookahead=function(p){},h.prototype.visitNegativeLookahead=function(p){},h.prototype.visitCharacter=function(p){},h.prototype.visitSet=function(p){},h.prototype.visitGroup=function(p){},h.prototype.visitGroupBackReference=function(p){},h.prototype.visitQuantifier=function(p){},{RegExpParser:t,BaseRegExpVisitor:h,VERSION:"0.5.0"}})});var gI=E(Eu=>{"use strict";Object.defineProperty(Eu,"__esModule",{value:!0});Eu.clearRegExpParserCache=Eu.getRegExpAst=void 0;var FEe=cI(),uI={},NEe=new FEe.RegExpParser;function LEe(t){var e=t.toString();if(uI.hasOwnProperty(e))return uI[e];var r=NEe.pattern(e);return uI[e]=r,r}Eu.getRegExpAst=LEe;function TEe(){uI={}}Eu.clearRegExpParserCache=TEe});var VH=E(fn=>{"use strict";var MEe=fn&&fn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(fn,"__esModule",{value:!0});fn.canMatchCharCode=fn.firstCharOptimizedIndices=fn.getOptimizedStartCodesIndices=fn.failedOptimizationPrefixMsg=void 0;var qH=cI(),$n=Dt(),JH=gI(),sa=Hv(),WH="Complement Sets are not supported for first char optimization";fn.failedOptimizationPrefixMsg=`Unable to use "first char" lexer optimizations: +`;function OEe(t,e){e===void 0&&(e=!1);try{var r=(0,JH.getRegExpAst)(t),i=fI(r.value,{},r.flags.ignoreCase);return i}catch(s){if(s.message===WH)e&&(0,$n.PRINT_WARNING)(""+fn.failedOptimizationPrefixMsg+(" Unable to optimize: < "+t.toString()+` > +`)+` Complement Sets cannot be automatically optimized. + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{var n="";e&&(n=` + This will disable the lexer's first char optimizations. + See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details.`),(0,$n.PRINT_ERROR)(fn.failedOptimizationPrefixMsg+` +`+(" Failed parsing: < "+t.toString()+` > +`)+(" Using the regexp-to-ast library version: "+qH.VERSION+` +`)+" Please open an issue at: https://github.com/bd82/regexp-to-ast/issues"+n)}}return[]}fn.getOptimizedStartCodesIndices=OEe;function fI(t,e,r){switch(t.type){case"Disjunction":for(var i=0;i=sa.minOptimizationVal)for(var f=u.from>=sa.minOptimizationVal?u.from:sa.minOptimizationVal,h=u.to,p=(0,sa.charCodeToOptimizedIndex)(f),d=(0,sa.charCodeToOptimizedIndex)(h),m=p;m<=d;m++)e[m]=m}}});break;case"Group":fI(o.value,e,r);break;default:throw Error("Non Exhaustive Match")}var a=o.quantifier!==void 0&&o.quantifier.atLeast===0;if(o.type==="Group"&&Gv(o)===!1||o.type!=="Group"&&a===!1)break}break;default:throw Error("non exhaustive match!")}return(0,$n.values)(e)}fn.firstCharOptimizedIndices=fI;function hI(t,e,r){var i=(0,sa.charCodeToOptimizedIndex)(t);e[i]=i,r===!0&&KEe(t,e)}function KEe(t,e){var r=String.fromCharCode(t),i=r.toUpperCase();if(i!==r){var n=(0,sa.charCodeToOptimizedIndex)(i.charCodeAt(0));e[n]=n}else{var s=r.toLowerCase();if(s!==r){var n=(0,sa.charCodeToOptimizedIndex)(s.charCodeAt(0));e[n]=n}}}function zH(t,e){return(0,$n.find)(t.value,function(r){if(typeof r=="number")return(0,$n.contains)(e,r);var i=r;return(0,$n.find)(e,function(n){return i.from<=n&&n<=i.to})!==void 0})}function Gv(t){return t.quantifier&&t.quantifier.atLeast===0?!0:t.value?(0,$n.isArray)(t.value)?(0,$n.every)(t.value,Gv):Gv(t.value):!1}var UEe=function(t){MEe(e,t);function e(r){var i=t.call(this)||this;return i.targetCharCodes=r,i.found=!1,i}return e.prototype.visitChildren=function(r){if(this.found!==!0){switch(r.type){case"Lookahead":this.visitLookahead(r);return;case"NegativeLookahead":this.visitNegativeLookahead(r);return}t.prototype.visitChildren.call(this,r)}},e.prototype.visitCharacter=function(r){(0,$n.contains)(this.targetCharCodes,r.value)&&(this.found=!0)},e.prototype.visitSet=function(r){r.complement?zH(r,this.targetCharCodes)===void 0&&(this.found=!0):zH(r,this.targetCharCodes)!==void 0&&(this.found=!0)},e}(qH.BaseRegExpVisitor);function HEe(t,e){if(e instanceof RegExp){var r=(0,JH.getRegExpAst)(e),i=new UEe(t);return i.visit(r),i.found}else return(0,$n.find)(e,function(n){return(0,$n.contains)(t,n.charCodeAt(0))})!==void 0}fn.canMatchCharCode=HEe});var Hv=E(je=>{"use strict";var _H=je&&je.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(je,"__esModule",{value:!0});je.charCodeToOptimizedIndex=je.minOptimizationVal=je.buildLineBreakIssueMessage=je.LineTerminatorOptimizedTester=je.isShortPattern=je.isCustomPattern=je.cloneEmptyGroups=je.performWarningRuntimeChecks=je.performRuntimeChecks=je.addStickyFlag=je.addStartOfInput=je.findUnreachablePatterns=je.findModesThatDoNotExist=je.findInvalidGroupType=je.findDuplicatePatterns=je.findUnsupportedFlags=je.findStartOfInputAnchor=je.findEmptyMatchRegExps=je.findEndOfInputAnchor=je.findInvalidPatterns=je.findMissingPatterns=je.validatePatterns=je.analyzeTokenTypes=je.enableSticky=je.disableSticky=je.SUPPORT_STICKY=je.MODES=je.DEFAULT_MODE=void 0;var XH=cI(),zt=Gh(),Ie=Dt(),Iu=VH(),ZH=gI(),ao="PATTERN";je.DEFAULT_MODE="defaultMode";je.MODES="modes";je.SUPPORT_STICKY=typeof new RegExp("(?:)").sticky=="boolean";function GEe(){je.SUPPORT_STICKY=!1}je.disableSticky=GEe;function jEe(){je.SUPPORT_STICKY=!0}je.enableSticky=jEe;function qEe(t,e){e=(0,Ie.defaults)(e,{useSticky:je.SUPPORT_STICKY,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r",` +`],tracer:function(B,b){return b()}});var r=e.tracer;r("initCharCodeToOptimizedIndexMap",function(){YEe()});var i;r("Reject Lexer.NA",function(){i=(0,Ie.reject)(t,function(B){return B[ao]===zt.Lexer.NA})});var n=!1,s;r("Transform Patterns",function(){n=!1,s=(0,Ie.map)(i,function(B){var b=B[ao];if((0,Ie.isRegExp)(b)){var R=b.source;return R.length===1&&R!=="^"&&R!=="$"&&R!=="."&&!b.ignoreCase?R:R.length===2&&R[0]==="\\"&&!(0,Ie.contains)(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],R[1])?R[1]:e.useSticky?Yv(b):jv(b)}else{if((0,Ie.isFunction)(b))return n=!0,{exec:b};if((0,Ie.has)(b,"exec"))return n=!0,b;if(typeof b=="string"){if(b.length===1)return b;var H=b.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),L=new RegExp(H);return e.useSticky?Yv(L):jv(L)}else throw Error("non exhaustive match")}})});var o,a,l,c,u;r("misc mapping",function(){o=(0,Ie.map)(i,function(B){return B.tokenTypeIdx}),a=(0,Ie.map)(i,function(B){var b=B.GROUP;if(b!==zt.Lexer.SKIPPED){if((0,Ie.isString)(b))return b;if((0,Ie.isUndefined)(b))return!1;throw Error("non exhaustive match")}}),l=(0,Ie.map)(i,function(B){var b=B.LONGER_ALT;if(b){var R=(0,Ie.isArray)(b)?(0,Ie.map)(b,function(H){return(0,Ie.indexOf)(i,H)}):[(0,Ie.indexOf)(i,b)];return R}}),c=(0,Ie.map)(i,function(B){return B.PUSH_MODE}),u=(0,Ie.map)(i,function(B){return(0,Ie.has)(B,"POP_MODE")})});var g;r("Line Terminator Handling",function(){var B=tG(e.lineTerminatorCharacters);g=(0,Ie.map)(i,function(b){return!1}),e.positionTracking!=="onlyOffset"&&(g=(0,Ie.map)(i,function(b){if((0,Ie.has)(b,"LINE_BREAKS"))return b.LINE_BREAKS;if(eG(b,B)===!1)return(0,Iu.canMatchCharCode)(B,b.PATTERN)}))});var f,h,p,d;r("Misc Mapping #2",function(){f=(0,Ie.map)(i,qv),h=(0,Ie.map)(s,$H),p=(0,Ie.reduce)(i,function(B,b){var R=b.GROUP;return(0,Ie.isString)(R)&&R!==zt.Lexer.SKIPPED&&(B[R]=[]),B},{}),d=(0,Ie.map)(s,function(B,b){return{pattern:s[b],longerAlt:l[b],canLineTerminator:g[b],isCustom:f[b],short:h[b],group:a[b],push:c[b],pop:u[b],tokenTypeIdx:o[b],tokenType:i[b]}})});var m=!0,I=[];return e.safeMode||r("First Char Optimization",function(){I=(0,Ie.reduce)(i,function(B,b,R){if(typeof b.PATTERN=="string"){var H=b.PATTERN.charCodeAt(0),L=Wv(H);Jv(B,L,d[R])}else if((0,Ie.isArray)(b.START_CHARS_HINT)){var K;(0,Ie.forEach)(b.START_CHARS_HINT,function(ne){var q=typeof ne=="string"?ne.charCodeAt(0):ne,A=Wv(q);K!==A&&(K=A,Jv(B,A,d[R]))})}else if((0,Ie.isRegExp)(b.PATTERN))if(b.PATTERN.unicode)m=!1,e.ensureOptimizations&&(0,Ie.PRINT_ERROR)(""+Iu.failedOptimizationPrefixMsg+(" Unable to analyze < "+b.PATTERN.toString()+` > pattern. +`)+` The regexp unicode flag is not currently supported by the regexp-to-ast library. + This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{var J=(0,Iu.getOptimizedStartCodesIndices)(b.PATTERN,e.ensureOptimizations);(0,Ie.isEmpty)(J)&&(m=!1),(0,Ie.forEach)(J,function(ne){Jv(B,ne,d[R])})}else e.ensureOptimizations&&(0,Ie.PRINT_ERROR)(""+Iu.failedOptimizationPrefixMsg+(" TokenType: <"+b.name+`> is using a custom token pattern without providing parameter. +`)+` This will disable the lexer's first char optimizations. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),m=!1;return B},[])}),r("ArrayPacking",function(){I=(0,Ie.packArray)(I)}),{emptyGroups:p,patternIdxToConfig:d,charCodeToPatternIdxToConfig:I,hasCustom:n,canBeOptimized:m}}je.analyzeTokenTypes=qEe;function WEe(t,e){var r=[],i=rG(t);r=r.concat(i.errors);var n=iG(i.valid),s=n.valid;return r=r.concat(n.errors),r=r.concat(JEe(s)),r=r.concat(nG(s)),r=r.concat(sG(s,e)),r=r.concat(oG(s)),r}je.validatePatterns=WEe;function JEe(t){var e=[],r=(0,Ie.filter)(t,function(i){return(0,Ie.isRegExp)(i[ao])});return e=e.concat(aG(r)),e=e.concat(lG(r)),e=e.concat(cG(r)),e=e.concat(uG(r)),e=e.concat(AG(r)),e}function rG(t){var e=(0,Ie.filter)(t,function(n){return!(0,Ie.has)(n,ao)}),r=(0,Ie.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- missing static 'PATTERN' property",type:zt.LexerDefinitionErrorType.MISSING_PATTERN,tokenTypes:[n]}}),i=(0,Ie.difference)(t,e);return{errors:r,valid:i}}je.findMissingPatterns=rG;function iG(t){var e=(0,Ie.filter)(t,function(n){var s=n[ao];return!(0,Ie.isRegExp)(s)&&!(0,Ie.isFunction)(s)&&!(0,Ie.has)(s,"exec")&&!(0,Ie.isString)(s)}),r=(0,Ie.map)(e,function(n){return{message:"Token Type: ->"+n.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:zt.LexerDefinitionErrorType.INVALID_PATTERN,tokenTypes:[n]}}),i=(0,Ie.difference)(t,e);return{errors:r,valid:i}}je.findInvalidPatterns=iG;var zEe=/[^\\][\$]/;function aG(t){var e=function(n){_H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitEndAnchor=function(o){this.found=!0},s}(XH.BaseRegExpVisitor),r=(0,Ie.filter)(t,function(n){var s=n[ao];try{var o=(0,ZH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return zEe.test(s.source)}}),i=(0,Ie.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain end of input anchor '$' + See chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:zt.LexerDefinitionErrorType.EOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}je.findEndOfInputAnchor=aG;function AG(t){var e=(0,Ie.filter)(t,function(i){var n=i[ao];return n.test("")}),r=(0,Ie.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' must not match an empty string",type:zt.LexerDefinitionErrorType.EMPTY_MATCH_PATTERN,tokenTypes:[i]}});return r}je.findEmptyMatchRegExps=AG;var VEe=/[^\\[][\^]|^\^/;function lG(t){var e=function(n){_H(s,n);function s(){var o=n!==null&&n.apply(this,arguments)||this;return o.found=!1,o}return s.prototype.visitStartAnchor=function(o){this.found=!0},s}(XH.BaseRegExpVisitor),r=(0,Ie.filter)(t,function(n){var s=n[ao];try{var o=(0,ZH.getRegExpAst)(s),a=new e;return a.visit(o),a.found}catch(l){return VEe.test(s.source)}}),i=(0,Ie.map)(r,function(n){return{message:`Unexpected RegExp Anchor Error: + Token Type: ->`+n.name+`<- static 'PATTERN' cannot contain start of input anchor '^' + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS for details.`,type:zt.LexerDefinitionErrorType.SOI_ANCHOR_FOUND,tokenTypes:[n]}});return i}je.findStartOfInputAnchor=lG;function cG(t){var e=(0,Ie.filter)(t,function(i){var n=i[ao];return n instanceof RegExp&&(n.multiline||n.global)}),r=(0,Ie.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:zt.LexerDefinitionErrorType.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[i]}});return r}je.findUnsupportedFlags=cG;function uG(t){var e=[],r=(0,Ie.map)(t,function(s){return(0,Ie.reduce)(t,function(o,a){return s.PATTERN.source===a.PATTERN.source&&!(0,Ie.contains)(e,a)&&a.PATTERN!==zt.Lexer.NA&&(e.push(a),o.push(a)),o},[])});r=(0,Ie.compact)(r);var i=(0,Ie.filter)(r,function(s){return s.length>1}),n=(0,Ie.map)(i,function(s){var o=(0,Ie.map)(s,function(l){return l.name}),a=(0,Ie.first)(s).PATTERN;return{message:"The same RegExp pattern ->"+a+"<-"+("has been used in all of the following Token Types: "+o.join(", ")+" <-"),type:zt.LexerDefinitionErrorType.DUPLICATE_PATTERNS_FOUND,tokenTypes:s}});return n}je.findDuplicatePatterns=uG;function nG(t){var e=(0,Ie.filter)(t,function(i){if(!(0,Ie.has)(i,"GROUP"))return!1;var n=i.GROUP;return n!==zt.Lexer.SKIPPED&&n!==zt.Lexer.NA&&!(0,Ie.isString)(n)}),r=(0,Ie.map)(e,function(i){return{message:"Token Type: ->"+i.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:zt.LexerDefinitionErrorType.INVALID_GROUP_TYPE_FOUND,tokenTypes:[i]}});return r}je.findInvalidGroupType=nG;function sG(t,e){var r=(0,Ie.filter)(t,function(n){return n.PUSH_MODE!==void 0&&!(0,Ie.contains)(e,n.PUSH_MODE)}),i=(0,Ie.map)(r,function(n){var s="Token Type: ->"+n.name+"<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->"+n.PUSH_MODE+"<-which does not exist";return{message:s,type:zt.LexerDefinitionErrorType.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[n]}});return i}je.findModesThatDoNotExist=sG;function oG(t){var e=[],r=(0,Ie.reduce)(t,function(i,n,s){var o=n.PATTERN;return o===zt.Lexer.NA||((0,Ie.isString)(o)?i.push({str:o,idx:s,tokenType:n}):(0,Ie.isRegExp)(o)&&XEe(o)&&i.push({str:o.source,idx:s,tokenType:n})),i},[]);return(0,Ie.forEach)(t,function(i,n){(0,Ie.forEach)(r,function(s){var o=s.str,a=s.idx,l=s.tokenType;if(n"+i.name+"<-")+`in the lexer's definition. +See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;e.push({message:c,type:zt.LexerDefinitionErrorType.UNREACHABLE_PATTERN,tokenTypes:[i,l]})}})}),e}je.findUnreachablePatterns=oG;function _Ee(t,e){if((0,Ie.isRegExp)(e)){var r=e.exec(t);return r!==null&&r.index===0}else{if((0,Ie.isFunction)(e))return e(t,0,[],{});if((0,Ie.has)(e,"exec"))return e.exec(t,0,[],{});if(typeof e=="string")return e===t;throw Error("non exhaustive match")}}function XEe(t){var e=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return(0,Ie.find)(e,function(r){return t.source.indexOf(r)!==-1})===void 0}function jv(t){var e=t.ignoreCase?"i":"";return new RegExp("^(?:"+t.source+")",e)}je.addStartOfInput=jv;function Yv(t){var e=t.ignoreCase?"iy":"y";return new RegExp(""+t.source,e)}je.addStickyFlag=Yv;function ZEe(t,e,r){var i=[];return(0,Ie.has)(t,je.DEFAULT_MODE)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+je.DEFAULT_MODE+`> property in its definition +`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,Ie.has)(t,je.MODES)||i.push({message:"A MultiMode Lexer cannot be initialized without a <"+je.MODES+`> property in its definition +`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,Ie.has)(t,je.MODES)&&(0,Ie.has)(t,je.DEFAULT_MODE)&&!(0,Ie.has)(t.modes,t.defaultMode)&&i.push({message:"A MultiMode Lexer cannot be initialized with a "+je.DEFAULT_MODE+": <"+t.defaultMode+`>which does not exist +`,type:zt.LexerDefinitionErrorType.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,Ie.has)(t,je.MODES)&&(0,Ie.forEach)(t.modes,function(n,s){(0,Ie.forEach)(n,function(o,a){(0,Ie.isUndefined)(o)&&i.push({message:"A Lexer cannot be initialized using an undefined Token Type. Mode:"+("<"+s+"> at index: <"+a+`> +`),type:zt.LexerDefinitionErrorType.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED})})}),i}je.performRuntimeChecks=ZEe;function $Ee(t,e,r){var i=[],n=!1,s=(0,Ie.compact)((0,Ie.flatten)((0,Ie.mapValues)(t.modes,function(l){return l}))),o=(0,Ie.reject)(s,function(l){return l[ao]===zt.Lexer.NA}),a=tG(r);return e&&(0,Ie.forEach)(o,function(l){var c=eG(l,a);if(c!==!1){var u=gG(l,c),g={message:u,type:c.issue,tokenType:l};i.push(g)}else(0,Ie.has)(l,"LINE_BREAKS")?l.LINE_BREAKS===!0&&(n=!0):(0,Iu.canMatchCharCode)(a,l.PATTERN)&&(n=!0)}),e&&!n&&i.push({message:`Warning: No LINE_BREAKS Found. + This Lexer has been defined to track line and column information, + But none of the Token Types can be identified as matching a line terminator. + See https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS + for details.`,type:zt.LexerDefinitionErrorType.NO_LINE_BREAKS_FLAGS}),i}je.performWarningRuntimeChecks=$Ee;function eIe(t){var e={},r=(0,Ie.keys)(t);return(0,Ie.forEach)(r,function(i){var n=t[i];if((0,Ie.isArray)(n))e[i]=[];else throw Error("non exhaustive match")}),e}je.cloneEmptyGroups=eIe;function qv(t){var e=t.PATTERN;if((0,Ie.isRegExp)(e))return!1;if((0,Ie.isFunction)(e))return!0;if((0,Ie.has)(e,"exec"))return!0;if((0,Ie.isString)(e))return!1;throw Error("non exhaustive match")}je.isCustomPattern=qv;function $H(t){return(0,Ie.isString)(t)&&t.length===1?t.charCodeAt(0):!1}je.isShortPattern=$H;je.LineTerminatorOptimizedTester={test:function(t){for(var e=t.length,r=this.lastIndex;r Token Type +`)+(" Root cause: "+e.errMsg+`. +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR";if(e.issue===zt.LexerDefinitionErrorType.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option. +`+(" The problem is in the <"+t.name+`> Token Type +`)+" For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK";throw Error("non exhaustive match")}je.buildLineBreakIssueMessage=gG;function tG(t){var e=(0,Ie.map)(t,function(r){return(0,Ie.isString)(r)&&r.length>0?r.charCodeAt(0):r});return e}function Jv(t,e,r){t[e]===void 0?t[e]=[r]:t[e].push(r)}je.minOptimizationVal=256;var pI=[];function Wv(t){return t255?255+~~(t/255):t}}});var yu=E(Bt=>{"use strict";Object.defineProperty(Bt,"__esModule",{value:!0});Bt.isTokenType=Bt.hasExtendingTokensTypesMapProperty=Bt.hasExtendingTokensTypesProperty=Bt.hasCategoriesProperty=Bt.hasShortKeyProperty=Bt.singleAssignCategoriesToksMap=Bt.assignCategoriesMapProp=Bt.assignCategoriesTokensProp=Bt.assignTokenDefaultProps=Bt.expandCategories=Bt.augmentTokenTypes=Bt.tokenIdxToClass=Bt.tokenShortNameIdx=Bt.tokenStructuredMatcherNoCategories=Bt.tokenStructuredMatcher=void 0;var Kr=Dt();function tIe(t,e){var r=t.tokenTypeIdx;return r===e.tokenTypeIdx?!0:e.isParent===!0&&e.categoryMatchesMap[r]===!0}Bt.tokenStructuredMatcher=tIe;function rIe(t,e){return t.tokenTypeIdx===e.tokenTypeIdx}Bt.tokenStructuredMatcherNoCategories=rIe;Bt.tokenShortNameIdx=1;Bt.tokenIdxToClass={};function iIe(t){var e=fG(t);hG(e),dG(e),pG(e),(0,Kr.forEach)(e,function(r){r.isParent=r.categoryMatches.length>0})}Bt.augmentTokenTypes=iIe;function fG(t){for(var e=(0,Kr.cloneArr)(t),r=t,i=!0;i;){r=(0,Kr.compact)((0,Kr.flatten)((0,Kr.map)(r,function(s){return s.CATEGORIES})));var n=(0,Kr.difference)(r,e);e=e.concat(n),(0,Kr.isEmpty)(n)?i=!1:r=n}return e}Bt.expandCategories=fG;function hG(t){(0,Kr.forEach)(t,function(e){CG(e)||(Bt.tokenIdxToClass[Bt.tokenShortNameIdx]=e,e.tokenTypeIdx=Bt.tokenShortNameIdx++),zv(e)&&!(0,Kr.isArray)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),zv(e)||(e.CATEGORIES=[]),mG(e)||(e.categoryMatches=[]),EG(e)||(e.categoryMatchesMap={})})}Bt.assignTokenDefaultProps=hG;function pG(t){(0,Kr.forEach)(t,function(e){e.categoryMatches=[],(0,Kr.forEach)(e.categoryMatchesMap,function(r,i){e.categoryMatches.push(Bt.tokenIdxToClass[i].tokenTypeIdx)})})}Bt.assignCategoriesTokensProp=pG;function dG(t){(0,Kr.forEach)(t,function(e){Vv([],e)})}Bt.assignCategoriesMapProp=dG;function Vv(t,e){(0,Kr.forEach)(t,function(r){e.categoryMatchesMap[r.tokenTypeIdx]=!0}),(0,Kr.forEach)(e.CATEGORIES,function(r){var i=t.concat(e);(0,Kr.contains)(i,r)||Vv(i,r)})}Bt.singleAssignCategoriesToksMap=Vv;function CG(t){return(0,Kr.has)(t,"tokenTypeIdx")}Bt.hasShortKeyProperty=CG;function zv(t){return(0,Kr.has)(t,"CATEGORIES")}Bt.hasCategoriesProperty=zv;function mG(t){return(0,Kr.has)(t,"categoryMatches")}Bt.hasExtendingTokensTypesProperty=mG;function EG(t){return(0,Kr.has)(t,"categoryMatchesMap")}Bt.hasExtendingTokensTypesMapProperty=EG;function nIe(t){return(0,Kr.has)(t,"tokenTypeIdx")}Bt.isTokenType=nIe});var _v=E(dI=>{"use strict";Object.defineProperty(dI,"__esModule",{value:!0});dI.defaultLexerErrorProvider=void 0;dI.defaultLexerErrorProvider={buildUnableToPopLexerModeMessage:function(t){return"Unable to pop Lexer Mode after encountering Token ->"+t.image+"<- The Mode Stack is empty"},buildUnexpectedCharactersMessage:function(t,e,r,i,n){return"unexpected character: ->"+t.charAt(e)+"<- at offset: "+e+","+(" skipped "+r+" characters.")}}});var Gh=E(Rl=>{"use strict";Object.defineProperty(Rl,"__esModule",{value:!0});Rl.Lexer=Rl.LexerDefinitionErrorType=void 0;var Ps=Hv(),Vt=Dt(),sIe=yu(),oIe=_v(),aIe=gI(),AIe;(function(t){t[t.MISSING_PATTERN=0]="MISSING_PATTERN",t[t.INVALID_PATTERN=1]="INVALID_PATTERN",t[t.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",t[t.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",t[t.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",t[t.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",t[t.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",t[t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",t[t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",t[t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",t[t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",t[t.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",t[t.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",t[t.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",t[t.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",t[t.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",t[t.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK"})(AIe=Rl.LexerDefinitionErrorType||(Rl.LexerDefinitionErrorType={}));var jh={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:[` +`,"\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:oIe.defaultLexerErrorProvider,traceInitPerf:!1,skipValidations:!1};Object.freeze(jh);var lIe=function(){function t(e,r){var i=this;if(r===void 0&&(r=jh),this.lexerDefinition=e,this.lexerDefinitionErrors=[],this.lexerDefinitionWarning=[],this.patternIdxToConfig={},this.charCodeToPatternIdxToConfig={},this.modes=[],this.emptyGroups={},this.config=void 0,this.trackStartLines=!0,this.trackEndLines=!0,this.hasCustom=!1,this.canModeBeOptimized={},typeof r=="boolean")throw Error(`The second argument to the Lexer constructor is now an ILexerConfig Object. +a boolean 2nd argument is no longer supported`);this.config=(0,Vt.merge)(jh,r);var n=this.config.traceInitPerf;n===!0?(this.traceInitMaxIdent=Infinity,this.traceInitPerf=!0):typeof n=="number"&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",function(){var s,o=!0;i.TRACE_INIT("Lexer Config handling",function(){if(i.config.lineTerminatorsPattern===jh.lineTerminatorsPattern)i.config.lineTerminatorsPattern=Ps.LineTerminatorOptimizedTester;else if(i.config.lineTerminatorCharacters===jh.lineTerminatorCharacters)throw Error(`Error: Missing property on the Lexer config. + For details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#MISSING_LINE_TERM_CHARS`);if(r.safeMode&&r.ensureOptimizations)throw Error('"safeMode" and "ensureOptimizations" flags are mutually exclusive.');i.trackStartLines=/full|onlyStart/i.test(i.config.positionTracking),i.trackEndLines=/full/i.test(i.config.positionTracking),(0,Vt.isArray)(e)?(s={modes:{}},s.modes[Ps.DEFAULT_MODE]=(0,Vt.cloneArr)(e),s[Ps.DEFAULT_MODE]=Ps.DEFAULT_MODE):(o=!1,s=(0,Vt.cloneObj)(e))}),i.config.skipValidations===!1&&(i.TRACE_INIT("performRuntimeChecks",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Ps.performRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))}),i.TRACE_INIT("performWarningRuntimeChecks",function(){i.lexerDefinitionWarning=i.lexerDefinitionWarning.concat((0,Ps.performWarningRuntimeChecks)(s,i.trackStartLines,i.config.lineTerminatorCharacters))})),s.modes=s.modes?s.modes:{},(0,Vt.forEach)(s.modes,function(u,g){s.modes[g]=(0,Vt.reject)(u,function(f){return(0,Vt.isUndefined)(f)})});var a=(0,Vt.keys)(s.modes);if((0,Vt.forEach)(s.modes,function(u,g){i.TRACE_INIT("Mode: <"+g+"> processing",function(){if(i.modes.push(g),i.config.skipValidations===!1&&i.TRACE_INIT("validatePatterns",function(){i.lexerDefinitionErrors=i.lexerDefinitionErrors.concat((0,Ps.validatePatterns)(u,a))}),(0,Vt.isEmpty)(i.lexerDefinitionErrors)){(0,sIe.augmentTokenTypes)(u);var f;i.TRACE_INIT("analyzeTokenTypes",function(){f=(0,Ps.analyzeTokenTypes)(u,{lineTerminatorCharacters:i.config.lineTerminatorCharacters,positionTracking:r.positionTracking,ensureOptimizations:r.ensureOptimizations,safeMode:r.safeMode,tracer:i.TRACE_INIT.bind(i)})}),i.patternIdxToConfig[g]=f.patternIdxToConfig,i.charCodeToPatternIdxToConfig[g]=f.charCodeToPatternIdxToConfig,i.emptyGroups=(0,Vt.merge)(i.emptyGroups,f.emptyGroups),i.hasCustom=f.hasCustom||i.hasCustom,i.canModeBeOptimized[g]=f.canBeOptimized}})}),i.defaultMode=s.defaultMode,!(0,Vt.isEmpty)(i.lexerDefinitionErrors)&&!i.config.deferDefinitionErrorsHandling){var l=(0,Vt.map)(i.lexerDefinitionErrors,function(u){return u.message}),c=l.join(`----------------------- +`);throw new Error(`Errors detected in definition of Lexer: +`+c)}(0,Vt.forEach)(i.lexerDefinitionWarning,function(u){(0,Vt.PRINT_WARNING)(u.message)}),i.TRACE_INIT("Choosing sub-methods implementations",function(){if(Ps.SUPPORT_STICKY?(i.chopInput=Vt.IDENTITY,i.match=i.matchWithTest):(i.updateLastIndex=Vt.NOOP,i.match=i.matchWithExec),o&&(i.handleModes=Vt.NOOP),i.trackStartLines===!1&&(i.computeNewColumn=Vt.IDENTITY),i.trackEndLines===!1&&(i.updateTokenEndLineColumnLocation=Vt.NOOP),/full/i.test(i.config.positionTracking))i.createTokenInstance=i.createFullToken;else if(/onlyStart/i.test(i.config.positionTracking))i.createTokenInstance=i.createStartOnlyToken;else if(/onlyOffset/i.test(i.config.positionTracking))i.createTokenInstance=i.createOffsetOnlyToken;else throw Error('Invalid config option: "'+i.config.positionTracking+'"');i.hasCustom?(i.addToken=i.addTokenUsingPush,i.handlePayload=i.handlePayloadWithCustom):(i.addToken=i.addTokenUsingMemberAccess,i.handlePayload=i.handlePayloadNoCustom)}),i.TRACE_INIT("Failed Optimization Warnings",function(){var u=(0,Vt.reduce)(i.canModeBeOptimized,function(g,f,h){return f===!1&&g.push(h),g},[]);if(r.ensureOptimizations&&!(0,Vt.isEmpty)(u))throw Error("Lexer Modes: < "+u.join(", ")+` > cannot be optimized. + Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode. + Or inspect the console log for details on how to resolve these issues.`)}),i.TRACE_INIT("clearRegExpParserCache",function(){(0,aIe.clearRegExpParserCache)()}),i.TRACE_INIT("toFastProperties",function(){(0,Vt.toFastProperties)(i)})})}return t.prototype.tokenize=function(e,r){if(r===void 0&&(r=this.defaultMode),!(0,Vt.isEmpty)(this.lexerDefinitionErrors)){var i=(0,Vt.map)(this.lexerDefinitionErrors,function(o){return o.message}),n=i.join(`----------------------- +`);throw new Error(`Unable to Tokenize because Errors detected in definition of Lexer: +`+n)}var s=this.tokenizeInternal(e,r);return s},t.prototype.tokenizeInternal=function(e,r){var i=this,n,s,o,a,l,c,u,g,f,h,p,d,m,I,B,b,R=e,H=R.length,L=0,K=0,J=this.hasCustom?0:Math.floor(e.length/10),ne=new Array(J),q=[],A=this.trackStartLines?1:void 0,V=this.trackStartLines?1:void 0,W=(0,Ps.cloneEmptyGroups)(this.emptyGroups),X=this.trackStartLines,F=this.config.lineTerminatorsPattern,D=0,he=[],pe=[],Ne=[],Pe=[];Object.freeze(Pe);var qe=void 0;function re(){return he}function se(wr){var Ui=(0,Ps.charCodeToOptimizedIndex)(wr),ws=pe[Ui];return ws===void 0?Pe:ws}var be=function(wr){if(Ne.length===1&&wr.tokenType.PUSH_MODE===void 0){var Ui=i.config.errorMessageProvider.buildUnableToPopLexerModeMessage(wr);q.push({offset:wr.startOffset,line:wr.startLine!==void 0?wr.startLine:void 0,column:wr.startColumn!==void 0?wr.startColumn:void 0,length:wr.image.length,message:Ui})}else{Ne.pop();var ws=(0,Vt.last)(Ne);he=i.patternIdxToConfig[ws],pe=i.charCodeToPatternIdxToConfig[ws],D=he.length;var Tf=i.canModeBeOptimized[ws]&&i.config.safeMode===!1;pe&&Tf?qe=se:qe=re}};function ae(wr){Ne.push(wr),pe=this.charCodeToPatternIdxToConfig[wr],he=this.patternIdxToConfig[wr],D=he.length,D=he.length;var Ui=this.canModeBeOptimized[wr]&&this.config.safeMode===!1;pe&&Ui?qe=se:qe=re}ae.call(this,r);for(var Ae;Lc.length){c=a,u=g,Ae=Oe;break}}}break}}if(c!==null){if(f=c.length,h=Ae.group,h!==void 0&&(p=Ae.tokenTypeIdx,d=this.createTokenInstance(c,L,p,Ae.tokenType,A,V,f),this.handlePayload(d,u),h===!1?K=this.addToken(ne,K,d):W[h].push(d)),e=this.chopInput(e,f),L=L+f,V=this.computeNewColumn(V,f),X===!0&&Ae.canLineTerminator===!0){var dt=0,ri=void 0,ii=void 0;F.lastIndex=0;do ri=F.test(c),ri===!0&&(ii=F.lastIndex-1,dt++);while(ri===!0);dt!==0&&(A=A+dt,V=f-ii,this.updateTokenEndLineColumnLocation(d,h,ii,dt,A,V,f))}this.handleModes(Ae,be,ae,d)}else{for(var an=L,yr=A,Ki=V,Qi=!1;!Qi&&L <"+e+">");var n=(0,Vt.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t.SKIPPED="This marks a skipped Token pattern, this means each token identified by it willbe consumed and then thrown into oblivion, this can be used to for example to completely ignore whitespace.",t.NA=/NOT_APPLICABLE/,t}();Rl.Lexer=lIe});var nA=E(Ci=>{"use strict";Object.defineProperty(Ci,"__esModule",{value:!0});Ci.tokenMatcher=Ci.createTokenInstance=Ci.EOF=Ci.createToken=Ci.hasTokenLabel=Ci.tokenName=Ci.tokenLabel=void 0;var Ds=Dt(),cIe=Gh(),Xv=yu();function uIe(t){return IG(t)?t.LABEL:t.name}Ci.tokenLabel=uIe;function gIe(t){return t.name}Ci.tokenName=gIe;function IG(t){return(0,Ds.isString)(t.LABEL)&&t.LABEL!==""}Ci.hasTokenLabel=IG;var fIe="parent",yG="categories",wG="label",BG="group",QG="push_mode",bG="pop_mode",vG="longer_alt",SG="line_breaks",xG="start_chars_hint";function kG(t){return hIe(t)}Ci.createToken=kG;function hIe(t){var e=t.pattern,r={};if(r.name=t.name,(0,Ds.isUndefined)(e)||(r.PATTERN=e),(0,Ds.has)(t,fIe))throw`The parent property is no longer supported. +See: https://github.com/chevrotain/chevrotain/issues/564#issuecomment-349062346 for details.`;return(0,Ds.has)(t,yG)&&(r.CATEGORIES=t[yG]),(0,Xv.augmentTokenTypes)([r]),(0,Ds.has)(t,wG)&&(r.LABEL=t[wG]),(0,Ds.has)(t,BG)&&(r.GROUP=t[BG]),(0,Ds.has)(t,bG)&&(r.POP_MODE=t[bG]),(0,Ds.has)(t,QG)&&(r.PUSH_MODE=t[QG]),(0,Ds.has)(t,vG)&&(r.LONGER_ALT=t[vG]),(0,Ds.has)(t,SG)&&(r.LINE_BREAKS=t[SG]),(0,Ds.has)(t,xG)&&(r.START_CHARS_HINT=t[xG]),r}Ci.EOF=kG({name:"EOF",pattern:cIe.Lexer.NA});(0,Xv.augmentTokenTypes)([Ci.EOF]);function pIe(t,e,r,i,n,s,o,a){return{image:e,startOffset:r,endOffset:i,startLine:n,endLine:s,startColumn:o,endColumn:a,tokenTypeIdx:t.tokenTypeIdx,tokenType:t}}Ci.createTokenInstance=pIe;function dIe(t,e){return(0,Xv.tokenStructuredMatcher)(t,e)}Ci.tokenMatcher=dIe});var hn=E(Tt=>{"use strict";var oa=Tt&&Tt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Tt,"__esModule",{value:!0});Tt.serializeProduction=Tt.serializeGrammar=Tt.Terminal=Tt.Alternation=Tt.RepetitionWithSeparator=Tt.Repetition=Tt.RepetitionMandatoryWithSeparator=Tt.RepetitionMandatory=Tt.Option=Tt.Alternative=Tt.Rule=Tt.NonTerminal=Tt.AbstractProduction=void 0;var $t=Dt(),CIe=nA(),Ao=function(){function t(e){this._definition=e}return Object.defineProperty(t.prototype,"definition",{get:function(){return this._definition},set:function(e){this._definition=e},enumerable:!1,configurable:!0}),t.prototype.accept=function(e){e.visit(this),(0,$t.forEach)(this.definition,function(r){r.accept(e)})},t}();Tt.AbstractProduction=Ao;var PG=function(t){oa(e,t);function e(r){var i=t.call(this,[])||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this.referencedRule!==void 0?this.referencedRule.definition:[]},set:function(r){},enumerable:!1,configurable:!0}),e.prototype.accept=function(r){r.visit(this)},e}(Ao);Tt.NonTerminal=PG;var DG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.orgText="",(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Rule=DG;var RG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.ignoreAmbiguities=!1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Alternative=RG;var FG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Option=FG;var NG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionMandatory=NG;var LG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionMandatoryWithSeparator=LG;var TG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.Repetition=TG;var MG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return e}(Ao);Tt.RepetitionWithSeparator=MG;var OG=function(t){oa(e,t);function e(r){var i=t.call(this,r.definition)||this;return i.idx=1,i.ignoreAmbiguities=!1,i.hasPredicates=!1,(0,$t.assign)(i,(0,$t.pick)(r,function(n){return n!==void 0})),i}return Object.defineProperty(e.prototype,"definition",{get:function(){return this._definition},set:function(r){this._definition=r},enumerable:!1,configurable:!0}),e}(Ao);Tt.Alternation=OG;var CI=function(){function t(e){this.idx=1,(0,$t.assign)(this,(0,$t.pick)(e,function(r){return r!==void 0}))}return t.prototype.accept=function(e){e.visit(this)},t}();Tt.Terminal=CI;function mIe(t){return(0,$t.map)(t,Yh)}Tt.serializeGrammar=mIe;function Yh(t){function e(s){return(0,$t.map)(s,Yh)}if(t instanceof PG){var r={type:"NonTerminal",name:t.nonTerminalName,idx:t.idx};return(0,$t.isString)(t.label)&&(r.label=t.label),r}else{if(t instanceof RG)return{type:"Alternative",definition:e(t.definition)};if(t instanceof FG)return{type:"Option",idx:t.idx,definition:e(t.definition)};if(t instanceof NG)return{type:"RepetitionMandatory",idx:t.idx,definition:e(t.definition)};if(t instanceof LG)return{type:"RepetitionMandatoryWithSeparator",idx:t.idx,separator:Yh(new CI({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof MG)return{type:"RepetitionWithSeparator",idx:t.idx,separator:Yh(new CI({terminalType:t.separator})),definition:e(t.definition)};if(t instanceof TG)return{type:"Repetition",idx:t.idx,definition:e(t.definition)};if(t instanceof OG)return{type:"Alternation",idx:t.idx,definition:e(t.definition)};if(t instanceof CI){var i={type:"Terminal",name:t.terminalType.name,label:(0,CIe.tokenLabel)(t.terminalType),idx:t.idx};(0,$t.isString)(t.label)&&(i.terminalLabel=t.label);var n=t.terminalType.PATTERN;return t.terminalType.PATTERN&&(i.pattern=(0,$t.isRegExp)(n)?n.source:n),i}else{if(t instanceof DG)return{type:"Rule",name:t.name,orgText:t.orgText,definition:e(t.definition)};throw Error("non exhaustive match")}}}Tt.serializeProduction=Yh});var EI=E(mI=>{"use strict";Object.defineProperty(mI,"__esModule",{value:!0});mI.RestWalker=void 0;var Zv=Dt(),pn=hn(),EIe=function(){function t(){}return t.prototype.walk=function(e,r){var i=this;r===void 0&&(r=[]),(0,Zv.forEach)(e.definition,function(n,s){var o=(0,Zv.drop)(e.definition,s+1);if(n instanceof pn.NonTerminal)i.walkProdRef(n,o,r);else if(n instanceof pn.Terminal)i.walkTerminal(n,o,r);else if(n instanceof pn.Alternative)i.walkFlat(n,o,r);else if(n instanceof pn.Option)i.walkOption(n,o,r);else if(n instanceof pn.RepetitionMandatory)i.walkAtLeastOne(n,o,r);else if(n instanceof pn.RepetitionMandatoryWithSeparator)i.walkAtLeastOneSep(n,o,r);else if(n instanceof pn.RepetitionWithSeparator)i.walkManySep(n,o,r);else if(n instanceof pn.Repetition)i.walkMany(n,o,r);else if(n instanceof pn.Alternation)i.walkOr(n,o,r);else throw Error("non exhaustive match")})},t.prototype.walkTerminal=function(e,r,i){},t.prototype.walkProdRef=function(e,r,i){},t.prototype.walkFlat=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkOption=function(e,r,i){var n=r.concat(i);this.walk(e,n)},t.prototype.walkAtLeastOne=function(e,r,i){var n=[new pn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkAtLeastOneSep=function(e,r,i){var n=KG(e,r,i);this.walk(e,n)},t.prototype.walkMany=function(e,r,i){var n=[new pn.Option({definition:e.definition})].concat(r,i);this.walk(e,n)},t.prototype.walkManySep=function(e,r,i){var n=KG(e,r,i);this.walk(e,n)},t.prototype.walkOr=function(e,r,i){var n=this,s=r.concat(i);(0,Zv.forEach)(e.definition,function(o){var a=new pn.Alternative({definition:[o]});n.walk(a,s)})},t}();mI.RestWalker=EIe;function KG(t,e,r){var i=[new pn.Option({definition:[new pn.Terminal({terminalType:t.separator})].concat(t.definition)})],n=i.concat(e,r);return n}});var wu=E(II=>{"use strict";Object.defineProperty(II,"__esModule",{value:!0});II.GAstVisitor=void 0;var lo=hn(),IIe=function(){function t(){}return t.prototype.visit=function(e){var r=e;switch(r.constructor){case lo.NonTerminal:return this.visitNonTerminal(r);case lo.Alternative:return this.visitAlternative(r);case lo.Option:return this.visitOption(r);case lo.RepetitionMandatory:return this.visitRepetitionMandatory(r);case lo.RepetitionMandatoryWithSeparator:return this.visitRepetitionMandatoryWithSeparator(r);case lo.RepetitionWithSeparator:return this.visitRepetitionWithSeparator(r);case lo.Repetition:return this.visitRepetition(r);case lo.Alternation:return this.visitAlternation(r);case lo.Terminal:return this.visitTerminal(r);case lo.Rule:return this.visitRule(r);default:throw Error("non exhaustive match")}},t.prototype.visitNonTerminal=function(e){},t.prototype.visitAlternative=function(e){},t.prototype.visitOption=function(e){},t.prototype.visitRepetition=function(e){},t.prototype.visitRepetitionMandatory=function(e){},t.prototype.visitRepetitionMandatoryWithSeparator=function(e){},t.prototype.visitRepetitionWithSeparator=function(e){},t.prototype.visitAlternation=function(e){},t.prototype.visitTerminal=function(e){},t.prototype.visitRule=function(e){},t}();II.GAstVisitor=IIe});var Jh=E(Si=>{"use strict";var yIe=Si&&Si.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Si,"__esModule",{value:!0});Si.collectMethods=Si.DslMethodsCollectorVisitor=Si.getProductionDslName=Si.isBranchingProd=Si.isOptionalProd=Si.isSequenceProd=void 0;var qh=Dt(),dr=hn(),wIe=wu();function BIe(t){return t instanceof dr.Alternative||t instanceof dr.Option||t instanceof dr.Repetition||t instanceof dr.RepetitionMandatory||t instanceof dr.RepetitionMandatoryWithSeparator||t instanceof dr.RepetitionWithSeparator||t instanceof dr.Terminal||t instanceof dr.Rule}Si.isSequenceProd=BIe;function $v(t,e){e===void 0&&(e=[]);var r=t instanceof dr.Option||t instanceof dr.Repetition||t instanceof dr.RepetitionWithSeparator;return r?!0:t instanceof dr.Alternation?(0,qh.some)(t.definition,function(i){return $v(i,e)}):t instanceof dr.NonTerminal&&(0,qh.contains)(e,t)?!1:t instanceof dr.AbstractProduction?(t instanceof dr.NonTerminal&&e.push(t),(0,qh.every)(t.definition,function(i){return $v(i,e)})):!1}Si.isOptionalProd=$v;function QIe(t){return t instanceof dr.Alternation}Si.isBranchingProd=QIe;function bIe(t){if(t instanceof dr.NonTerminal)return"SUBRULE";if(t instanceof dr.Option)return"OPTION";if(t instanceof dr.Alternation)return"OR";if(t instanceof dr.RepetitionMandatory)return"AT_LEAST_ONE";if(t instanceof dr.RepetitionMandatoryWithSeparator)return"AT_LEAST_ONE_SEP";if(t instanceof dr.RepetitionWithSeparator)return"MANY_SEP";if(t instanceof dr.Repetition)return"MANY";if(t instanceof dr.Terminal)return"CONSUME";throw Error("non exhaustive match")}Si.getProductionDslName=bIe;var UG=function(t){yIe(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.separator="-",r.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]},r}return e.prototype.reset=function(){this.dslMethods={option:[],alternation:[],repetition:[],repetitionWithSeparator:[],repetitionMandatory:[],repetitionMandatoryWithSeparator:[]}},e.prototype.visitTerminal=function(r){var i=r.terminalType.name+this.separator+"Terminal";(0,qh.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitNonTerminal=function(r){var i=r.nonTerminalName+this.separator+"Terminal";(0,qh.has)(this.dslMethods,i)||(this.dslMethods[i]=[]),this.dslMethods[i].push(r)},e.prototype.visitOption=function(r){this.dslMethods.option.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.dslMethods.repetitionWithSeparator.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.dslMethods.repetitionMandatory.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.dslMethods.repetitionMandatoryWithSeparator.push(r)},e.prototype.visitRepetition=function(r){this.dslMethods.repetition.push(r)},e.prototype.visitAlternation=function(r){this.dslMethods.alternation.push(r)},e}(wIe.GAstVisitor);Si.DslMethodsCollectorVisitor=UG;var yI=new UG;function vIe(t){yI.reset(),t.accept(yI);var e=yI.dslMethods;return yI.reset(),e}Si.collectMethods=vIe});var tS=E(co=>{"use strict";Object.defineProperty(co,"__esModule",{value:!0});co.firstForTerminal=co.firstForBranching=co.firstForSequence=co.first=void 0;var wI=Dt(),HG=hn(),eS=Jh();function BI(t){if(t instanceof HG.NonTerminal)return BI(t.referencedRule);if(t instanceof HG.Terminal)return YG(t);if((0,eS.isSequenceProd)(t))return GG(t);if((0,eS.isBranchingProd)(t))return jG(t);throw Error("non exhaustive match")}co.first=BI;function GG(t){for(var e=[],r=t.definition,i=0,n=r.length>i,s,o=!0;n&&o;)s=r[i],o=(0,eS.isOptionalProd)(s),e=e.concat(BI(s)),i=i+1,n=r.length>i;return(0,wI.uniq)(e)}co.firstForSequence=GG;function jG(t){var e=(0,wI.map)(t.definition,function(r){return BI(r)});return(0,wI.uniq)((0,wI.flatten)(e))}co.firstForBranching=jG;function YG(t){return[t.terminalType]}co.firstForTerminal=YG});var rS=E(QI=>{"use strict";Object.defineProperty(QI,"__esModule",{value:!0});QI.IN=void 0;QI.IN="_~IN~_"});var VG=E(es=>{"use strict";var SIe=es&&es.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(es,"__esModule",{value:!0});es.buildInProdFollowPrefix=es.buildBetweenProdsFollowPrefix=es.computeAllProdsFollows=es.ResyncFollowsWalker=void 0;var xIe=EI(),kIe=tS(),qG=Dt(),JG=rS(),PIe=hn(),zG=function(t){SIe(e,t);function e(r){var i=t.call(this)||this;return i.topProd=r,i.follows={},i}return e.prototype.startWalking=function(){return this.walk(this.topProd),this.follows},e.prototype.walkTerminal=function(r,i,n){},e.prototype.walkProdRef=function(r,i,n){var s=WG(r.referencedRule,r.idx)+this.topProd.name,o=i.concat(n),a=new PIe.Alternative({definition:o}),l=(0,kIe.first)(a);this.follows[s]=l},e}(xIe.RestWalker);es.ResyncFollowsWalker=zG;function DIe(t){var e={};return(0,qG.forEach)(t,function(r){var i=new zG(r).startWalking();(0,qG.assign)(e,i)}),e}es.computeAllProdsFollows=DIe;function WG(t,e){return t.name+e+JG.IN}es.buildBetweenProdsFollowPrefix=WG;function RIe(t){var e=t.terminalType.name;return e+t.idx+JG.IN}es.buildInProdFollowPrefix=RIe});var Wh=E(aa=>{"use strict";Object.defineProperty(aa,"__esModule",{value:!0});aa.defaultGrammarValidatorErrorProvider=aa.defaultGrammarResolverErrorProvider=aa.defaultParserErrorProvider=void 0;var Bu=nA(),FIe=Dt(),Rs=Dt(),iS=hn(),_G=Jh();aa.defaultParserErrorProvider={buildMismatchTokenMessage:function(t){var e=t.expected,r=t.actual,i=t.previous,n=t.ruleName,s=(0,Bu.hasTokenLabel)(e),o=s?"--> "+(0,Bu.tokenLabel)(e)+" <--":"token of type --> "+e.name+" <--",a="Expecting "+o+" but found --> '"+r.image+"' <--";return a},buildNotAllInputParsedMessage:function(t){var e=t.firstRedundant,r=t.ruleName;return"Redundant input, expecting EOF but found: "+e.image},buildNoViableAltMessage:function(t){var e=t.expectedPathsPerAlt,r=t.actual,i=t.previous,n=t.customUserDescription,s=t.ruleName,o="Expecting: ",a=(0,Rs.first)(r).image,l=` +but found: '`+a+"'";if(n)return o+n+l;var c=(0,Rs.reduce)(e,function(h,p){return h.concat(p)},[]),u=(0,Rs.map)(c,function(h){return"["+(0,Rs.map)(h,function(p){return(0,Bu.tokenLabel)(p)}).join(", ")+"]"}),g=(0,Rs.map)(u,function(h,p){return" "+(p+1)+". "+h}),f=`one of these possible Token sequences: +`+g.join(` +`);return o+f+l},buildEarlyExitMessage:function(t){var e=t.expectedIterationPaths,r=t.actual,i=t.customUserDescription,n=t.ruleName,s="Expecting: ",o=(0,Rs.first)(r).image,a=` +but found: '`+o+"'";if(i)return s+i+a;var l=(0,Rs.map)(e,function(u){return"["+(0,Rs.map)(u,function(g){return(0,Bu.tokenLabel)(g)}).join(",")+"]"}),c=`expecting at least one iteration which starts with one of these possible Token sequences:: + `+("<"+l.join(" ,")+">");return s+c+a}};Object.freeze(aa.defaultParserErrorProvider);aa.defaultGrammarResolverErrorProvider={buildRuleNotFoundError:function(t,e){var r="Invalid grammar, reference to a rule which is not defined: ->"+e.nonTerminalName+`<- +inside top level rule: ->`+t.name+"<-";return r}};aa.defaultGrammarValidatorErrorProvider={buildDuplicateFoundError:function(t,e){function r(u){return u instanceof iS.Terminal?u.terminalType.name:u instanceof iS.NonTerminal?u.nonTerminalName:""}var i=t.name,n=(0,Rs.first)(e),s=n.idx,o=(0,_G.getProductionDslName)(n),a=r(n),l=s>0,c="->"+o+(l?s:"")+"<- "+(a?"with argument: ->"+a+"<-":"")+` + appears more than once (`+e.length+" times) in the top level rule: ->"+i+`<-. + For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES + `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,` +`),c},buildNamespaceConflictError:function(t){var e=`Namespace conflict found in grammar. +`+("The grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <"+t.name+`>. +`)+`To resolve this make sure each Terminal and Non-Terminal names are unique +This is easy to accomplish by using the convention that Terminal names start with an uppercase letter +and Non-Terminal names start with a lower case letter.`;return e},buildAlternationPrefixAmbiguityError:function(t){var e=(0,Rs.map)(t.prefixPath,function(n){return(0,Bu.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous alternatives: <"+t.ambiguityIndices.join(" ,")+`> due to common lookahead prefix +`+("in inside <"+t.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`)+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX +For Further details.`;return i},buildAlternationAmbiguityError:function(t){var e=(0,Rs.map)(t.prefixPath,function(n){return(0,Bu.tokenLabel)(n)}).join(", "),r=t.alternation.idx===0?"":t.alternation.idx,i="Ambiguous Alternatives Detected: <"+t.ambiguityIndices.join(" ,")+"> in "+(" inside <"+t.topLevelRule.name+`> Rule, +`)+("<"+e+`> may appears as a prefix path in all these alternatives. +`);return i=i+`See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES +For Further details.`,i},buildEmptyRepetitionError:function(t){var e=(0,_G.getProductionDslName)(t.repetition);t.repetition.idx!==0&&(e+=t.repetition.idx);var r="The repetition <"+e+"> within Rule <"+t.topLevelRule.name+`> can never consume any tokens. +This could lead to an infinite loop.`;return r},buildTokenNameError:function(t){return"deprecated"},buildEmptyAlternationError:function(t){var e="Ambiguous empty alternative: <"+(t.emptyChoiceIdx+1)+">"+(" in inside <"+t.topLevelRule.name+`> Rule. +`)+"Only the last alternative may be an empty alternative.";return e},buildTooManyAlternativesError:function(t){var e=`An Alternation cannot have more than 256 alternatives: +`+(" inside <"+t.topLevelRule.name+`> Rule. + has `+(t.alternation.definition.length+1)+" alternatives.");return e},buildLeftRecursionError:function(t){var e=t.topLevelRule.name,r=FIe.map(t.leftRecursionPath,function(s){return s.name}),i=e+" --> "+r.concat([e]).join(" --> "),n=`Left Recursion found in grammar. +`+("rule: <"+e+`> can be invoked from itself (directly or indirectly) +`)+(`without consuming any Tokens. The grammar path that causes this is: + `+i+` +`)+` To fix this refactor your grammar to remove the left recursion. +see: https://en.wikipedia.org/wiki/LL_parser#Left_Factoring.`;return n},buildInvalidRuleNameError:function(t){return"deprecated"},buildDuplicateRuleNameError:function(t){var e;t.topLevelRule instanceof iS.Rule?e=t.topLevelRule.name:e=t.topLevelRule;var r="Duplicate definition, rule: ->"+e+"<- is already defined in the grammar: ->"+t.grammarName+"<-";return r}}});var $G=E(sA=>{"use strict";var NIe=sA&&sA.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(sA,"__esModule",{value:!0});sA.GastRefResolverVisitor=sA.resolveGrammar=void 0;var LIe=Tn(),XG=Dt(),TIe=wu();function MIe(t,e){var r=new ZG(t,e);return r.resolveRefs(),r.errors}sA.resolveGrammar=MIe;var ZG=function(t){NIe(e,t);function e(r,i){var n=t.call(this)||this;return n.nameToTopRule=r,n.errMsgProvider=i,n.errors=[],n}return e.prototype.resolveRefs=function(){var r=this;(0,XG.forEach)((0,XG.values)(this.nameToTopRule),function(i){r.currTopLevel=i,i.accept(r)})},e.prototype.visitNonTerminal=function(r){var i=this.nameToTopRule[r.nonTerminalName];if(i)r.referencedRule=i;else{var n=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,r);this.errors.push({message:n,type:LIe.ParserDefinitionErrorType.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:r.nonTerminalName})}},e}(TIe.GAstVisitor);sA.GastRefResolverVisitor=ZG});var Vh=E(Br=>{"use strict";var Fl=Br&&Br.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Br,"__esModule",{value:!0});Br.nextPossibleTokensAfter=Br.possiblePathsFrom=Br.NextTerminalAfterAtLeastOneSepWalker=Br.NextTerminalAfterAtLeastOneWalker=Br.NextTerminalAfterManySepWalker=Br.NextTerminalAfterManyWalker=Br.AbstractNextTerminalAfterProductionWalker=Br.NextAfterTokenWalker=Br.AbstractNextPossibleTokensWalker=void 0;var ej=EI(),xt=Dt(),OIe=tS(),It=hn(),tj=function(t){Fl(e,t);function e(r,i){var n=t.call(this)||this;return n.topProd=r,n.path=i,n.possibleTokTypes=[],n.nextProductionName="",n.nextProductionOccurrence=0,n.found=!1,n.isAtEndOfPath=!1,n}return e.prototype.startWalking=function(){if(this.found=!1,this.path.ruleStack[0]!==this.topProd.name)throw Error("The path does not start with the walker's top Rule!");return this.ruleStack=(0,xt.cloneArr)(this.path.ruleStack).reverse(),this.occurrenceStack=(0,xt.cloneArr)(this.path.occurrenceStack).reverse(),this.ruleStack.pop(),this.occurrenceStack.pop(),this.updateExpectedNext(),this.walk(this.topProd),this.possibleTokTypes},e.prototype.walk=function(r,i){i===void 0&&(i=[]),this.found||t.prototype.walk.call(this,r,i)},e.prototype.walkProdRef=function(r,i,n){if(r.referencedRule.name===this.nextProductionName&&r.idx===this.nextProductionOccurrence){var s=i.concat(n);this.updateExpectedNext(),this.walk(r.referencedRule,s)}},e.prototype.updateExpectedNext=function(){(0,xt.isEmpty)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())},e}(ej.RestWalker);Br.AbstractNextPossibleTokensWalker=tj;var KIe=function(t){Fl(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.path=i,n.nextTerminalName="",n.nextTerminalOccurrence=0,n.nextTerminalName=n.path.lastTok.name,n.nextTerminalOccurrence=n.path.lastTokOccurrence,n}return e.prototype.walkTerminal=function(r,i,n){if(this.isAtEndOfPath&&r.terminalType.name===this.nextTerminalName&&r.idx===this.nextTerminalOccurrence&&!this.found){var s=i.concat(n),o=new It.Alternative({definition:s});this.possibleTokTypes=(0,OIe.first)(o),this.found=!0}},e}(tj);Br.NextAfterTokenWalker=KIe;var zh=function(t){Fl(e,t);function e(r,i){var n=t.call(this)||this;return n.topRule=r,n.occurrence=i,n.result={token:void 0,occurrence:void 0,isEndOfRule:void 0},n}return e.prototype.startWalking=function(){return this.walk(this.topRule),this.result},e}(ej.RestWalker);Br.AbstractNextTerminalAfterProductionWalker=zh;var UIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkMany=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkMany.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterManyWalker=UIe;var HIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkManySep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkManySep.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterManySepWalker=HIe;var GIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOne=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOne.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterAtLeastOneWalker=GIe;var jIe=function(t){Fl(e,t);function e(){return t!==null&&t.apply(this,arguments)||this}return e.prototype.walkAtLeastOneSep=function(r,i,n){if(r.idx===this.occurrence){var s=(0,xt.first)(i.concat(n));this.result.isEndOfRule=s===void 0,s instanceof It.Terminal&&(this.result.token=s.terminalType,this.result.occurrence=s.idx)}else t.prototype.walkAtLeastOneSep.call(this,r,i,n)},e}(zh);Br.NextTerminalAfterAtLeastOneSepWalker=jIe;function rj(t,e,r){r===void 0&&(r=[]),r=(0,xt.cloneArr)(r);var i=[],n=0;function s(c){return c.concat((0,xt.drop)(t,n+1))}function o(c){var u=rj(s(c),e,r);return i.concat(u)}for(;r.length=0;W--){var X=I.definition[W],F={idx:p,def:X.definition.concat((0,xt.drop)(h)),ruleStack:d,occurrenceStack:m};g.push(F),g.push(o)}else if(I instanceof It.Alternative)g.push({idx:p,def:I.definition.concat((0,xt.drop)(h)),ruleStack:d,occurrenceStack:m});else if(I instanceof It.Rule)g.push(YIe(I,p,d,m));else throw Error("non exhaustive match")}}return u}Br.nextPossibleTokensAfter=qIe;function YIe(t,e,r,i){var n=(0,xt.cloneArr)(r);n.push(t.name);var s=(0,xt.cloneArr)(i);return s.push(1),{idx:e,def:t.definition,ruleStack:n,occurrenceStack:s}}});var _h=E(Gt=>{"use strict";var ij=Gt&&Gt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Gt,"__esModule",{value:!0});Gt.areTokenCategoriesNotUsed=Gt.isStrictPrefixOfPath=Gt.containsPath=Gt.getLookaheadPathsForOptionalProd=Gt.getLookaheadPathsForOr=Gt.lookAheadSequenceFromAlternatives=Gt.buildSingleAlternativeLookaheadFunction=Gt.buildAlternativesLookAheadFunc=Gt.buildLookaheadFuncForOptionalProd=Gt.buildLookaheadFuncForOr=Gt.getProdType=Gt.PROD_TYPE=void 0;var _t=Dt(),nj=Vh(),JIe=EI(),bI=yu(),oA=hn(),WIe=wu(),zr;(function(t){t[t.OPTION=0]="OPTION",t[t.REPETITION=1]="REPETITION",t[t.REPETITION_MANDATORY=2]="REPETITION_MANDATORY",t[t.REPETITION_MANDATORY_WITH_SEPARATOR=3]="REPETITION_MANDATORY_WITH_SEPARATOR",t[t.REPETITION_WITH_SEPARATOR=4]="REPETITION_WITH_SEPARATOR",t[t.ALTERNATION=5]="ALTERNATION"})(zr=Gt.PROD_TYPE||(Gt.PROD_TYPE={}));function zIe(t){if(t instanceof oA.Option)return zr.OPTION;if(t instanceof oA.Repetition)return zr.REPETITION;if(t instanceof oA.RepetitionMandatory)return zr.REPETITION_MANDATORY;if(t instanceof oA.RepetitionMandatoryWithSeparator)return zr.REPETITION_MANDATORY_WITH_SEPARATOR;if(t instanceof oA.RepetitionWithSeparator)return zr.REPETITION_WITH_SEPARATOR;if(t instanceof oA.Alternation)return zr.ALTERNATION;throw Error("non exhaustive match")}Gt.getProdType=zIe;function VIe(t,e,r,i,n,s){var o=sj(t,e,r),a=nS(o)?bI.tokenStructuredMatcherNoCategories:bI.tokenStructuredMatcher;return s(o,i,a,n)}Gt.buildLookaheadFuncForOr=VIe;function _Ie(t,e,r,i,n,s){var o=oj(t,e,n,r),a=nS(o)?bI.tokenStructuredMatcherNoCategories:bI.tokenStructuredMatcher;return s(o[0],a,i)}Gt.buildLookaheadFuncForOptionalProd=_Ie;function XIe(t,e,r,i){var n=t.length,s=(0,_t.every)(t,function(l){return(0,_t.every)(l,function(c){return c.length===1})});if(e)return function(l){for(var c=(0,_t.map)(l,function(b){return b.GATE}),u=0;u{"use strict";var aS=Mt&&Mt.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(Mt,"__esModule",{value:!0});Mt.checkPrefixAlternativesAmbiguities=Mt.validateSomeNonEmptyLookaheadPath=Mt.validateTooManyAlts=Mt.RepetionCollector=Mt.validateAmbiguousAlternationAlternatives=Mt.validateEmptyOrAlternative=Mt.getFirstNoneTerminal=Mt.validateNoLeftRecursion=Mt.validateRuleIsOverridden=Mt.validateRuleDoesNotAlreadyExist=Mt.OccurrenceValidationCollector=Mt.identifyProductionForDuplicates=Mt.validateGrammar=void 0;var jt=Dt(),Cr=Dt(),uo=Tn(),AS=Jh(),Qu=_h(),rye=Vh(),Fs=hn(),lS=wu();function sye(t,e,r,i,n){var s=jt.map(t,function(h){return iye(h,i)}),o=jt.map(t,function(h){return cS(h,h,i)}),a=[],l=[],c=[];(0,Cr.every)(o,Cr.isEmpty)&&(a=(0,Cr.map)(t,function(h){return uj(h,i)}),l=(0,Cr.map)(t,function(h){return gj(h,e,i)}),c=hj(t,e,i));var u=nye(t,r,i),g=(0,Cr.map)(t,function(h){return fj(h,i)}),f=(0,Cr.map)(t,function(h){return cj(h,t,n,i)});return jt.flatten(s.concat(c,o,a,l,u,g,f))}Mt.validateGrammar=sye;function iye(t,e){var r=new Cj;t.accept(r);var i=r.allProductions,n=jt.groupBy(i,pj),s=jt.pick(n,function(a){return a.length>1}),o=jt.map(jt.values(s),function(a){var l=jt.first(a),c=e.buildDuplicateFoundError(t,a),u=(0,AS.getProductionDslName)(l),g={message:c,type:uo.ParserDefinitionErrorType.DUPLICATE_PRODUCTIONS,ruleName:t.name,dslName:u,occurrence:l.idx},f=dj(l);return f&&(g.parameter=f),g});return o}function pj(t){return(0,AS.getProductionDslName)(t)+"_#_"+t.idx+"_#_"+dj(t)}Mt.identifyProductionForDuplicates=pj;function dj(t){return t instanceof Fs.Terminal?t.terminalType.name:t instanceof Fs.NonTerminal?t.nonTerminalName:""}var Cj=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitNonTerminal=function(r){this.allProductions.push(r)},e.prototype.visitOption=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e.prototype.visitAlternation=function(r){this.allProductions.push(r)},e.prototype.visitTerminal=function(r){this.allProductions.push(r)},e}(lS.GAstVisitor);Mt.OccurrenceValidationCollector=Cj;function cj(t,e,r,i){var n=[],s=(0,Cr.reduce)(e,function(a,l){return l.name===t.name?a+1:a},0);if(s>1){var o=i.buildDuplicateRuleNameError({topLevelRule:t,grammarName:r});n.push({message:o,type:uo.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:t.name})}return n}Mt.validateRuleDoesNotAlreadyExist=cj;function oye(t,e,r){var i=[],n;return jt.contains(e,t)||(n="Invalid rule override, rule: ->"+t+"<- cannot be overridden in the grammar: ->"+r+"<-as it is not defined in any of the super grammars ",i.push({message:n,type:uo.ParserDefinitionErrorType.INVALID_RULE_OVERRIDE,ruleName:t})),i}Mt.validateRuleIsOverridden=oye;function cS(t,e,r,i){i===void 0&&(i=[]);var n=[],s=Xh(e.definition);if(jt.isEmpty(s))return[];var o=t.name,a=jt.contains(s,t);a&&n.push({message:r.buildLeftRecursionError({topLevelRule:t,leftRecursionPath:i}),type:uo.ParserDefinitionErrorType.LEFT_RECURSION,ruleName:o});var l=jt.difference(s,i.concat([t])),c=jt.map(l,function(u){var g=jt.cloneArr(i);return g.push(u),cS(t,u,r,g)});return n.concat(jt.flatten(c))}Mt.validateNoLeftRecursion=cS;function Xh(t){var e=[];if(jt.isEmpty(t))return e;var r=jt.first(t);if(r instanceof Fs.NonTerminal)e.push(r.referencedRule);else if(r instanceof Fs.Alternative||r instanceof Fs.Option||r instanceof Fs.RepetitionMandatory||r instanceof Fs.RepetitionMandatoryWithSeparator||r instanceof Fs.RepetitionWithSeparator||r instanceof Fs.Repetition)e=e.concat(Xh(r.definition));else if(r instanceof Fs.Alternation)e=jt.flatten(jt.map(r.definition,function(o){return Xh(o.definition)}));else if(!(r instanceof Fs.Terminal))throw Error("non exhaustive match");var i=(0,AS.isOptionalProd)(r),n=t.length>1;if(i&&n){var s=jt.drop(t);return e.concat(Xh(s))}else return e}Mt.getFirstNoneTerminal=Xh;var uS=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.alternations=[],r}return e.prototype.visitAlternation=function(r){this.alternations.push(r)},e}(lS.GAstVisitor);function uj(t,e){var r=new uS;t.accept(r);var i=r.alternations,n=jt.reduce(i,function(s,o){var a=jt.dropRight(o.definition),l=jt.map(a,function(c,u){var g=(0,rye.nextPossibleTokensAfter)([c],[],null,1);return jt.isEmpty(g)?{message:e.buildEmptyAlternationError({topLevelRule:t,alternation:o,emptyChoiceIdx:u}),type:uo.ParserDefinitionErrorType.NONE_LAST_EMPTY_ALT,ruleName:t.name,occurrence:o.idx,alternative:u+1}:null});return s.concat(jt.compact(l))},[]);return n}Mt.validateEmptyOrAlternative=uj;function gj(t,e,r){var i=new uS;t.accept(i);var n=i.alternations;n=(0,Cr.reject)(n,function(o){return o.ignoreAmbiguities===!0});var s=jt.reduce(n,function(o,a){var l=a.idx,c=a.maxLookahead||e,u=(0,Qu.getLookaheadPathsForOr)(l,t,c,a),g=aye(u,a,t,r),f=mj(u,a,t,r);return o.concat(g,f)},[]);return s}Mt.validateAmbiguousAlternationAlternatives=gj;var Ej=function(t){aS(e,t);function e(){var r=t!==null&&t.apply(this,arguments)||this;return r.allProductions=[],r}return e.prototype.visitRepetitionWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatory=function(r){this.allProductions.push(r)},e.prototype.visitRepetitionMandatoryWithSeparator=function(r){this.allProductions.push(r)},e.prototype.visitRepetition=function(r){this.allProductions.push(r)},e}(lS.GAstVisitor);Mt.RepetionCollector=Ej;function fj(t,e){var r=new uS;t.accept(r);var i=r.alternations,n=jt.reduce(i,function(s,o){return o.definition.length>255&&s.push({message:e.buildTooManyAlternativesError({topLevelRule:t,alternation:o}),type:uo.ParserDefinitionErrorType.TOO_MANY_ALTS,ruleName:t.name,occurrence:o.idx}),s},[]);return n}Mt.validateTooManyAlts=fj;function hj(t,e,r){var i=[];return(0,Cr.forEach)(t,function(n){var s=new Ej;n.accept(s);var o=s.allProductions;(0,Cr.forEach)(o,function(a){var l=(0,Qu.getProdType)(a),c=a.maxLookahead||e,u=a.idx,g=(0,Qu.getLookaheadPathsForOptionalProd)(u,n,l,c),f=g[0];if((0,Cr.isEmpty)((0,Cr.flatten)(f))){var h=r.buildEmptyRepetitionError({topLevelRule:n,repetition:a});i.push({message:h,type:uo.ParserDefinitionErrorType.NO_NON_EMPTY_LOOKAHEAD,ruleName:n.name})}})}),i}Mt.validateSomeNonEmptyLookaheadPath=hj;function aye(t,e,r,i){var n=[],s=(0,Cr.reduce)(t,function(a,l,c){return e.definition[c].ignoreAmbiguities===!0||(0,Cr.forEach)(l,function(u){var g=[c];(0,Cr.forEach)(t,function(f,h){c!==h&&(0,Qu.containsPath)(f,u)&&e.definition[h].ignoreAmbiguities!==!0&&g.push(h)}),g.length>1&&!(0,Qu.containsPath)(n,u)&&(n.push(u),a.push({alts:g,path:u}))}),a},[]),o=jt.map(s,function(a){var l=(0,Cr.map)(a.alts,function(u){return u+1}),c=i.buildAlternationAmbiguityError({topLevelRule:r,alternation:e,ambiguityIndices:l,prefixPath:a.path});return{message:c,type:uo.ParserDefinitionErrorType.AMBIGUOUS_ALTS,ruleName:r.name,occurrence:e.idx,alternatives:[a.alts]}});return o}function mj(t,e,r,i){var n=[],s=(0,Cr.reduce)(t,function(o,a,l){var c=(0,Cr.map)(a,function(u){return{idx:l,path:u}});return o.concat(c)},[]);return(0,Cr.forEach)(s,function(o){var a=e.definition[o.idx];if(a.ignoreAmbiguities!==!0){var l=o.idx,c=o.path,u=(0,Cr.findAll)(s,function(f){return e.definition[f.idx].ignoreAmbiguities!==!0&&f.idx{"use strict";Object.defineProperty(bu,"__esModule",{value:!0});bu.validateGrammar=bu.resolveGrammar=void 0;var fS=Dt(),Aye=$G(),lye=gS(),Ij=Wh();function cye(t){t=(0,fS.defaults)(t,{errMsgProvider:Ij.defaultGrammarResolverErrorProvider});var e={};return(0,fS.forEach)(t.rules,function(r){e[r.name]=r}),(0,Aye.resolveGrammar)(e,t.errMsgProvider)}bu.resolveGrammar=cye;function uye(t){return t=(0,fS.defaults)(t,{errMsgProvider:Ij.defaultGrammarValidatorErrorProvider}),(0,lye.validateGrammar)(t.rules,t.maxLookahead,t.tokenTypes,t.errMsgProvider,t.grammarName)}bu.validateGrammar=uye});var vu=E(dn=>{"use strict";var Zh=dn&&dn.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(dn,"__esModule",{value:!0});dn.EarlyExitException=dn.NotAllInputParsedException=dn.NoViableAltException=dn.MismatchedTokenException=dn.isRecognitionException=void 0;var gye=Dt(),wj="MismatchedTokenException",Bj="NoViableAltException",Qj="EarlyExitException",bj="NotAllInputParsedException",vj=[wj,Bj,Qj,bj];Object.freeze(vj);function fye(t){return(0,gye.contains)(vj,t.name)}dn.isRecognitionException=fye;var vI=function(t){Zh(e,t);function e(r,i){var n=this.constructor,s=t.call(this,r)||this;return s.token=i,s.resyncedTokens=[],Object.setPrototypeOf(s,n.prototype),Error.captureStackTrace&&Error.captureStackTrace(s,s.constructor),s}return e}(Error),hye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=wj,s}return e}(vI);dn.MismatchedTokenException=hye;var pye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Bj,s}return e}(vI);dn.NoViableAltException=pye;var dye=function(t){Zh(e,t);function e(r,i){var n=t.call(this,r,i)||this;return n.name=bj,n}return e}(vI);dn.NotAllInputParsedException=dye;var Cye=function(t){Zh(e,t);function e(r,i,n){var s=t.call(this,r,i)||this;return s.previousToken=n,s.name=Qj,s}return e}(vI);dn.EarlyExitException=Cye});var pS=E(xi=>{"use strict";Object.defineProperty(xi,"__esModule",{value:!0});xi.attemptInRepetitionRecovery=xi.Recoverable=xi.InRuleRecoveryException=xi.IN_RULE_RECOVERY_EXCEPTION=xi.EOF_FOLLOW_KEY=void 0;var SI=nA(),ts=Dt(),mye=vu(),Eye=rS(),Iye=Tn();xi.EOF_FOLLOW_KEY={};xi.IN_RULE_RECOVERY_EXCEPTION="InRuleRecoveryException";function hS(t){this.name=xi.IN_RULE_RECOVERY_EXCEPTION,this.message=t}xi.InRuleRecoveryException=hS;hS.prototype=Error.prototype;var yye=function(){function t(){}return t.prototype.initRecoverable=function(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,ts.has)(e,"recoveryEnabled")?e.recoveryEnabled:Iye.DEFAULT_PARSER_CONFIG.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=Sj)},t.prototype.getTokenToInsert=function(e){var r=(0,SI.createTokenInstance)(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return r.isInsertedInRecovery=!0,r},t.prototype.canTokenTypeBeInsertedInRecovery=function(e){return!0},t.prototype.tryInRepetitionRecovery=function(e,r,i,n){for(var s=this,o=this.findReSyncTokenType(),a=this.exportLexerState(),l=[],c=!1,u=this.LA(1),g=this.LA(1),f=function(){var h=s.LA(0),p=s.errorMessageProvider.buildMismatchTokenMessage({expected:n,actual:u,previous:h,ruleName:s.getCurrRuleFullName()}),d=new mye.MismatchedTokenException(p,u,s.LA(0));d.resyncedTokens=(0,ts.dropRight)(l),s.SAVE_ERROR(d)};!c;)if(this.tokenMatcher(g,n)){f();return}else if(i.call(this)){f(),e.apply(this,r);return}else this.tokenMatcher(g,o)?c=!0:(g=this.SKIP_TOKEN(),this.addToResyncTokens(g,l));this.importLexerState(a)},t.prototype.shouldInRepetitionRecoveryBeTried=function(e,r,i){return!(i===!1||e===void 0||r===void 0||this.tokenMatcher(this.LA(1),e)||this.isBackTracking()||this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,r)))},t.prototype.getFollowsForInRuleRecovery=function(e,r){var i=this.getCurrentGrammarPath(e,r),n=this.getNextPossibleTokenTypes(i);return n},t.prototype.tryInRuleRecovery=function(e,r){if(this.canRecoverWithSingleTokenInsertion(e,r)){var i=this.getTokenToInsert(e);return i}if(this.canRecoverWithSingleTokenDeletion(e)){var n=this.SKIP_TOKEN();return this.consumeToken(),n}throw new hS("sad sad panda")},t.prototype.canPerformInRuleRecovery=function(e,r){return this.canRecoverWithSingleTokenInsertion(e,r)||this.canRecoverWithSingleTokenDeletion(e)},t.prototype.canRecoverWithSingleTokenInsertion=function(e,r){var i=this;if(!this.canTokenTypeBeInsertedInRecovery(e)||(0,ts.isEmpty)(r))return!1;var n=this.LA(1),s=(0,ts.find)(r,function(o){return i.tokenMatcher(n,o)})!==void 0;return s},t.prototype.canRecoverWithSingleTokenDeletion=function(e){var r=this.tokenMatcher(this.LA(2),e);return r},t.prototype.isInCurrentRuleReSyncSet=function(e){var r=this.getCurrFollowKey(),i=this.getFollowSetFromFollowKey(r);return(0,ts.contains)(i,e)},t.prototype.findReSyncTokenType=function(){for(var e=this.flattenFollowSet(),r=this.LA(1),i=2;;){var n=r.tokenType;if((0,ts.contains)(e,n))return n;r=this.LA(i),i++}},t.prototype.getCurrFollowKey=function(){if(this.RULE_STACK.length===1)return xi.EOF_FOLLOW_KEY;var e=this.getLastExplicitRuleShortName(),r=this.getLastExplicitRuleOccurrenceIndex(),i=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:r,inRule:this.shortRuleNameToFullName(i)}},t.prototype.buildFullFollowKeyStack=function(){var e=this,r=this.RULE_STACK,i=this.RULE_OCCURRENCE_STACK;return(0,ts.map)(r,function(n,s){return s===0?xi.EOF_FOLLOW_KEY:{ruleName:e.shortRuleNameToFullName(n),idxInCallingRule:i[s],inRule:e.shortRuleNameToFullName(r[s-1])}})},t.prototype.flattenFollowSet=function(){var e=this,r=(0,ts.map)(this.buildFullFollowKeyStack(),function(i){return e.getFollowSetFromFollowKey(i)});return(0,ts.flatten)(r)},t.prototype.getFollowSetFromFollowKey=function(e){if(e===xi.EOF_FOLLOW_KEY)return[SI.EOF];var r=e.ruleName+e.idxInCallingRule+Eye.IN+e.inRule;return this.resyncFollows[r]},t.prototype.addToResyncTokens=function(e,r){return this.tokenMatcher(e,SI.EOF)||r.push(e),r},t.prototype.reSyncTo=function(e){for(var r=[],i=this.LA(1);this.tokenMatcher(i,e)===!1;)i=this.SKIP_TOKEN(),this.addToResyncTokens(i,r);return(0,ts.dropRight)(r)},t.prototype.attemptInRepetitionRecovery=function(e,r,i,n,s,o,a){},t.prototype.getCurrentGrammarPath=function(e,r){var i=this.getHumanReadableRuleStack(),n=(0,ts.cloneArr)(this.RULE_OCCURRENCE_STACK),s={ruleStack:i,occurrenceStack:n,lastTok:e,lastTokOccurrence:r};return s},t.prototype.getHumanReadableRuleStack=function(){var e=this;return(0,ts.map)(this.RULE_STACK,function(r){return e.shortRuleNameToFullName(r)})},t}();xi.Recoverable=yye;function Sj(t,e,r,i,n,s,o){var a=this.getKeyForAutomaticLookahead(i,n),l=this.firstAfterRepMap[a];if(l===void 0){var c=this.getCurrRuleFullName(),u=this.getGAstProductions()[c],g=new s(u,n);l=g.startWalking(),this.firstAfterRepMap[a]=l}var f=l.token,h=l.occurrence,p=l.isEndOfRule;this.RULE_STACK.length===1&&p&&f===void 0&&(f=SI.EOF,h=1),this.shouldInRepetitionRecoveryBeTried(f,h,o)&&this.tryInRepetitionRecovery(t,e,r,f)}xi.attemptInRepetitionRecovery=Sj});var xI=E(Nt=>{"use strict";Object.defineProperty(Nt,"__esModule",{value:!0});Nt.getKeyForAutomaticLookahead=Nt.AT_LEAST_ONE_SEP_IDX=Nt.MANY_SEP_IDX=Nt.AT_LEAST_ONE_IDX=Nt.MANY_IDX=Nt.OPTION_IDX=Nt.OR_IDX=Nt.BITS_FOR_ALT_IDX=Nt.BITS_FOR_RULE_IDX=Nt.BITS_FOR_OCCURRENCE_IDX=Nt.BITS_FOR_METHOD_TYPE=void 0;Nt.BITS_FOR_METHOD_TYPE=4;Nt.BITS_FOR_OCCURRENCE_IDX=8;Nt.BITS_FOR_RULE_IDX=12;Nt.BITS_FOR_ALT_IDX=8;Nt.OR_IDX=1<{"use strict";Object.defineProperty(kI,"__esModule",{value:!0});kI.LooksAhead=void 0;var Aa=_h(),Ns=Dt(),xj=Tn(),la=xI(),Nl=Jh(),Bye=function(){function t(){}return t.prototype.initLooksAhead=function(e){this.dynamicTokensEnabled=(0,Ns.has)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:xj.DEFAULT_PARSER_CONFIG.dynamicTokensEnabled,this.maxLookahead=(0,Ns.has)(e,"maxLookahead")?e.maxLookahead:xj.DEFAULT_PARSER_CONFIG.maxLookahead,this.lookAheadFuncsCache=(0,Ns.isES2015MapSupported)()?new Map:[],(0,Ns.isES2015MapSupported)()?(this.getLaFuncFromCache=this.getLaFuncFromMap,this.setLaFuncCache=this.setLaFuncCacheUsingMap):(this.getLaFuncFromCache=this.getLaFuncFromObj,this.setLaFuncCache=this.setLaFuncUsingObj)},t.prototype.preComputeLookaheadFunctions=function(e){var r=this;(0,Ns.forEach)(e,function(i){r.TRACE_INIT(i.name+" Rule Lookahead",function(){var n=(0,Nl.collectMethods)(i),s=n.alternation,o=n.repetition,a=n.option,l=n.repetitionMandatory,c=n.repetitionMandatoryWithSeparator,u=n.repetitionWithSeparator;(0,Ns.forEach)(s,function(g){var f=g.idx===0?"":g.idx;r.TRACE_INIT(""+(0,Nl.getProductionDslName)(g)+f,function(){var h=(0,Aa.buildLookaheadFuncForOr)(g.idx,i,g.maxLookahead||r.maxLookahead,g.hasPredicates,r.dynamicTokensEnabled,r.lookAheadBuilderForAlternatives),p=(0,la.getKeyForAutomaticLookahead)(r.fullRuleNameToShort[i.name],la.OR_IDX,g.idx);r.setLaFuncCache(p,h)})}),(0,Ns.forEach)(o,function(g){r.computeLookaheadFunc(i,g.idx,la.MANY_IDX,Aa.PROD_TYPE.REPETITION,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(a,function(g){r.computeLookaheadFunc(i,g.idx,la.OPTION_IDX,Aa.PROD_TYPE.OPTION,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(l,function(g){r.computeLookaheadFunc(i,g.idx,la.AT_LEAST_ONE_IDX,Aa.PROD_TYPE.REPETITION_MANDATORY,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(c,function(g){r.computeLookaheadFunc(i,g.idx,la.AT_LEAST_ONE_SEP_IDX,Aa.PROD_TYPE.REPETITION_MANDATORY_WITH_SEPARATOR,g.maxLookahead,(0,Nl.getProductionDslName)(g))}),(0,Ns.forEach)(u,function(g){r.computeLookaheadFunc(i,g.idx,la.MANY_SEP_IDX,Aa.PROD_TYPE.REPETITION_WITH_SEPARATOR,g.maxLookahead,(0,Nl.getProductionDslName)(g))})})})},t.prototype.computeLookaheadFunc=function(e,r,i,n,s,o){var a=this;this.TRACE_INIT(""+o+(r===0?"":r),function(){var l=(0,Aa.buildLookaheadFuncForOptionalProd)(r,e,s||a.maxLookahead,a.dynamicTokensEnabled,n,a.lookAheadBuilderForOptional),c=(0,la.getKeyForAutomaticLookahead)(a.fullRuleNameToShort[e.name],i,r);a.setLaFuncCache(c,l)})},t.prototype.lookAheadBuilderForOptional=function(e,r,i){return(0,Aa.buildSingleAlternativeLookaheadFunction)(e,r,i)},t.prototype.lookAheadBuilderForAlternatives=function(e,r,i,n){return(0,Aa.buildAlternativesLookAheadFunc)(e,r,i,n)},t.prototype.getKeyForAutomaticLookahead=function(e,r){var i=this.getLastExplicitRuleShortName();return(0,la.getKeyForAutomaticLookahead)(i,e,r)},t.prototype.getLaFuncFromCache=function(e){},t.prototype.getLaFuncFromMap=function(e){return this.lookAheadFuncsCache.get(e)},t.prototype.getLaFuncFromObj=function(e){return this.lookAheadFuncsCache[e]},t.prototype.setLaFuncCache=function(e,r){},t.prototype.setLaFuncCacheUsingMap=function(e,r){this.lookAheadFuncsCache.set(e,r)},t.prototype.setLaFuncUsingObj=function(e,r){this.lookAheadFuncsCache[e]=r},t}();kI.LooksAhead=Bye});var Pj=E(go=>{"use strict";Object.defineProperty(go,"__esModule",{value:!0});go.addNoneTerminalToCst=go.addTerminalToCst=go.setNodeLocationFull=go.setNodeLocationOnlyOffset=void 0;function Qye(t,e){isNaN(t.startOffset)===!0?(t.startOffset=e.startOffset,t.endOffset=e.endOffset):t.endOffset{"use strict";Object.defineProperty(aA,"__esModule",{value:!0});aA.defineNameProp=aA.functionName=aA.classNameFromInstance=void 0;var xye=Dt();function kye(t){return Dj(t.constructor)}aA.classNameFromInstance=kye;var Rj="name";function Dj(t){var e=t.name;return e||"anonymous"}aA.functionName=Dj;function Pye(t,e){var r=Object.getOwnPropertyDescriptor(t,Rj);return(0,xye.isUndefined)(r)||r.configurable?(Object.defineProperty(t,Rj,{enumerable:!1,configurable:!0,writable:!1,value:e}),!0):!1}aA.defineNameProp=Pye});var Mj=E(mi=>{"use strict";Object.defineProperty(mi,"__esModule",{value:!0});mi.validateRedundantMethods=mi.validateMissingCstMethods=mi.validateVisitor=mi.CstVisitorDefinitionError=mi.createBaseVisitorConstructorWithDefaults=mi.createBaseSemanticVisitorConstructor=mi.defaultVisit=void 0;var rs=Dt(),$h=dS();function Fj(t,e){for(var r=(0,rs.keys)(t),i=r.length,n=0;n: + `+(""+s.join(` + +`).replace(/\n/g,` + `)))}}};return r.prototype=i,r.prototype.constructor=r,r._RULE_NAMES=e,r}mi.createBaseSemanticVisitorConstructor=Dye;function Rye(t,e,r){var i=function(){};(0,$h.defineNameProp)(i,t+"BaseSemanticsWithDefaults");var n=Object.create(r.prototype);return(0,rs.forEach)(e,function(s){n[s]=Fj}),i.prototype=n,i.prototype.constructor=i,i}mi.createBaseVisitorConstructorWithDefaults=Rye;var CS;(function(t){t[t.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",t[t.MISSING_METHOD=1]="MISSING_METHOD"})(CS=mi.CstVisitorDefinitionError||(mi.CstVisitorDefinitionError={}));function Nj(t,e){var r=Lj(t,e),i=Tj(t,e);return r.concat(i)}mi.validateVisitor=Nj;function Lj(t,e){var r=(0,rs.map)(e,function(i){if(!(0,rs.isFunction)(t[i]))return{msg:"Missing visitor method: <"+i+"> on "+(0,$h.functionName)(t.constructor)+" CST Visitor.",type:CS.MISSING_METHOD,methodName:i}});return(0,rs.compact)(r)}mi.validateMissingCstMethods=Lj;var Fye=["constructor","visit","validateVisitor"];function Tj(t,e){var r=[];for(var i in t)(0,rs.isFunction)(t[i])&&!(0,rs.contains)(Fye,i)&&!(0,rs.contains)(e,i)&&r.push({msg:"Redundant visitor method: <"+i+"> on "+(0,$h.functionName)(t.constructor)+` CST Visitor +There is no Grammar Rule corresponding to this method's name. +`,type:CS.REDUNDANT_METHOD,methodName:i});return r}mi.validateRedundantMethods=Tj});var Kj=E(PI=>{"use strict";Object.defineProperty(PI,"__esModule",{value:!0});PI.TreeBuilder=void 0;var Su=Pj(),Ur=Dt(),Oj=Mj(),Nye=Tn(),Lye=function(){function t(){}return t.prototype.initTreeBuilder=function(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,Ur.has)(e,"nodeLocationTracking")?e.nodeLocationTracking:Nye.DEFAULT_PARSER_CONFIG.nodeLocationTracking,!this.outputCst)this.cstInvocationStateUpdate=Ur.NOOP,this.cstFinallyStateUpdate=Ur.NOOP,this.cstPostTerminal=Ur.NOOP,this.cstPostNonTerminal=Ur.NOOP,this.cstPostRule=Ur.NOOP;else if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Su.setNodeLocationFull,this.setNodeLocationFromNode=Su.setNodeLocationFull,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=Su.setNodeLocationOnlyOffset,this.setNodeLocationFromNode=Su.setNodeLocationOnlyOffset,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else if(/none/i.test(this.nodeLocationTracking))this.setNodeLocationFromToken=Ur.NOOP,this.setNodeLocationFromNode=Ur.NOOP,this.cstPostRule=Ur.NOOP,this.setInitialNodeLocation=Ur.NOOP;else throw Error('Invalid config option: "'+e.nodeLocationTracking+'"')},t.prototype.setInitialNodeLocationOnlyOffsetRecovery=function(e){e.location={startOffset:NaN,endOffset:NaN}},t.prototype.setInitialNodeLocationOnlyOffsetRegular=function(e){e.location={startOffset:this.LA(1).startOffset,endOffset:NaN}},t.prototype.setInitialNodeLocationFullRecovery=function(e){e.location={startOffset:NaN,startLine:NaN,startColumn:NaN,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.setInitialNodeLocationFullRegular=function(e){var r=this.LA(1);e.location={startOffset:r.startOffset,startLine:r.startLine,startColumn:r.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}},t.prototype.cstInvocationStateUpdate=function(e,r){var i={name:e,children:{}};this.setInitialNodeLocation(i),this.CST_STACK.push(i)},t.prototype.cstFinallyStateUpdate=function(){this.CST_STACK.pop()},t.prototype.cstPostRuleFull=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?(i.endOffset=r.endOffset,i.endLine=r.endLine,i.endColumn=r.endColumn):(i.startOffset=NaN,i.startLine=NaN,i.startColumn=NaN)},t.prototype.cstPostRuleOnlyOffset=function(e){var r=this.LA(0),i=e.location;i.startOffset<=r.startOffset?i.endOffset=r.endOffset:i.startOffset=NaN},t.prototype.cstPostTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,Su.addTerminalToCst)(i,r,e),this.setNodeLocationFromToken(i.location,r)},t.prototype.cstPostNonTerminal=function(e,r){var i=this.CST_STACK[this.CST_STACK.length-1];(0,Su.addNoneTerminalToCst)(i,r,e),this.setNodeLocationFromNode(i.location,e.location)},t.prototype.getBaseCstVisitorConstructor=function(){if((0,Ur.isUndefined)(this.baseCstVisitorConstructor)){var e=(0,Oj.createBaseSemanticVisitorConstructor)(this.className,(0,Ur.keys)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor},t.prototype.getBaseCstVisitorConstructorWithDefaults=function(){if((0,Ur.isUndefined)(this.baseCstVisitorWithDefaultsConstructor)){var e=(0,Oj.createBaseVisitorConstructorWithDefaults)(this.className,(0,Ur.keys)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor},t.prototype.getLastExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-1]},t.prototype.getPreviousExplicitRuleShortName=function(){var e=this.RULE_STACK;return e[e.length-2]},t.prototype.getLastExplicitRuleOccurrenceIndex=function(){var e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]},t}();PI.TreeBuilder=Lye});var Hj=E(DI=>{"use strict";Object.defineProperty(DI,"__esModule",{value:!0});DI.LexerAdapter=void 0;var Uj=Tn(),Tye=function(){function t(){}return t.prototype.initLexerAdapter=function(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1},Object.defineProperty(t.prototype,"input",{get:function(){return this.tokVector},set:function(e){if(this.selfAnalysisDone!==!0)throw Error("Missing invocation at the end of the Parser's constructor.");this.reset(),this.tokVector=e,this.tokVectorLength=e.length},enumerable:!1,configurable:!0}),t.prototype.SKIP_TOKEN=function(){return this.currIdx<=this.tokVector.length-2?(this.consumeToken(),this.LA(1)):Uj.END_OF_FILE},t.prototype.LA=function(e){var r=this.currIdx+e;return r<0||this.tokVectorLength<=r?Uj.END_OF_FILE:this.tokVector[r]},t.prototype.consumeToken=function(){this.currIdx++},t.prototype.exportLexerState=function(){return this.currIdx},t.prototype.importLexerState=function(e){this.currIdx=e},t.prototype.resetLexerState=function(){this.currIdx=-1},t.prototype.moveToTerminatedState=function(){this.currIdx=this.tokVector.length-1},t.prototype.getLexerPosition=function(){return this.exportLexerState()},t}();DI.LexerAdapter=Tye});var jj=E(RI=>{"use strict";Object.defineProperty(RI,"__esModule",{value:!0});RI.RecognizerApi=void 0;var Gj=Dt(),Mye=vu(),mS=Tn(),Oye=Wh(),Kye=gS(),Uye=hn(),Hye=function(){function t(){}return t.prototype.ACTION=function(e){return e.call(this)},t.prototype.consume=function(e,r,i){return this.consumeInternal(r,e,i)},t.prototype.subrule=function(e,r,i){return this.subruleInternal(r,e,i)},t.prototype.option=function(e,r){return this.optionInternal(r,e)},t.prototype.or=function(e,r){return this.orInternal(r,e)},t.prototype.many=function(e,r){return this.manyInternal(e,r)},t.prototype.atLeastOne=function(e,r){return this.atLeastOneInternal(e,r)},t.prototype.CONSUME=function(e,r){return this.consumeInternal(e,0,r)},t.prototype.CONSUME1=function(e,r){return this.consumeInternal(e,1,r)},t.prototype.CONSUME2=function(e,r){return this.consumeInternal(e,2,r)},t.prototype.CONSUME3=function(e,r){return this.consumeInternal(e,3,r)},t.prototype.CONSUME4=function(e,r){return this.consumeInternal(e,4,r)},t.prototype.CONSUME5=function(e,r){return this.consumeInternal(e,5,r)},t.prototype.CONSUME6=function(e,r){return this.consumeInternal(e,6,r)},t.prototype.CONSUME7=function(e,r){return this.consumeInternal(e,7,r)},t.prototype.CONSUME8=function(e,r){return this.consumeInternal(e,8,r)},t.prototype.CONSUME9=function(e,r){return this.consumeInternal(e,9,r)},t.prototype.SUBRULE=function(e,r){return this.subruleInternal(e,0,r)},t.prototype.SUBRULE1=function(e,r){return this.subruleInternal(e,1,r)},t.prototype.SUBRULE2=function(e,r){return this.subruleInternal(e,2,r)},t.prototype.SUBRULE3=function(e,r){return this.subruleInternal(e,3,r)},t.prototype.SUBRULE4=function(e,r){return this.subruleInternal(e,4,r)},t.prototype.SUBRULE5=function(e,r){return this.subruleInternal(e,5,r)},t.prototype.SUBRULE6=function(e,r){return this.subruleInternal(e,6,r)},t.prototype.SUBRULE7=function(e,r){return this.subruleInternal(e,7,r)},t.prototype.SUBRULE8=function(e,r){return this.subruleInternal(e,8,r)},t.prototype.SUBRULE9=function(e,r){return this.subruleInternal(e,9,r)},t.prototype.OPTION=function(e){return this.optionInternal(e,0)},t.prototype.OPTION1=function(e){return this.optionInternal(e,1)},t.prototype.OPTION2=function(e){return this.optionInternal(e,2)},t.prototype.OPTION3=function(e){return this.optionInternal(e,3)},t.prototype.OPTION4=function(e){return this.optionInternal(e,4)},t.prototype.OPTION5=function(e){return this.optionInternal(e,5)},t.prototype.OPTION6=function(e){return this.optionInternal(e,6)},t.prototype.OPTION7=function(e){return this.optionInternal(e,7)},t.prototype.OPTION8=function(e){return this.optionInternal(e,8)},t.prototype.OPTION9=function(e){return this.optionInternal(e,9)},t.prototype.OR=function(e){return this.orInternal(e,0)},t.prototype.OR1=function(e){return this.orInternal(e,1)},t.prototype.OR2=function(e){return this.orInternal(e,2)},t.prototype.OR3=function(e){return this.orInternal(e,3)},t.prototype.OR4=function(e){return this.orInternal(e,4)},t.prototype.OR5=function(e){return this.orInternal(e,5)},t.prototype.OR6=function(e){return this.orInternal(e,6)},t.prototype.OR7=function(e){return this.orInternal(e,7)},t.prototype.OR8=function(e){return this.orInternal(e,8)},t.prototype.OR9=function(e){return this.orInternal(e,9)},t.prototype.MANY=function(e){this.manyInternal(0,e)},t.prototype.MANY1=function(e){this.manyInternal(1,e)},t.prototype.MANY2=function(e){this.manyInternal(2,e)},t.prototype.MANY3=function(e){this.manyInternal(3,e)},t.prototype.MANY4=function(e){this.manyInternal(4,e)},t.prototype.MANY5=function(e){this.manyInternal(5,e)},t.prototype.MANY6=function(e){this.manyInternal(6,e)},t.prototype.MANY7=function(e){this.manyInternal(7,e)},t.prototype.MANY8=function(e){this.manyInternal(8,e)},t.prototype.MANY9=function(e){this.manyInternal(9,e)},t.prototype.MANY_SEP=function(e){this.manySepFirstInternal(0,e)},t.prototype.MANY_SEP1=function(e){this.manySepFirstInternal(1,e)},t.prototype.MANY_SEP2=function(e){this.manySepFirstInternal(2,e)},t.prototype.MANY_SEP3=function(e){this.manySepFirstInternal(3,e)},t.prototype.MANY_SEP4=function(e){this.manySepFirstInternal(4,e)},t.prototype.MANY_SEP5=function(e){this.manySepFirstInternal(5,e)},t.prototype.MANY_SEP6=function(e){this.manySepFirstInternal(6,e)},t.prototype.MANY_SEP7=function(e){this.manySepFirstInternal(7,e)},t.prototype.MANY_SEP8=function(e){this.manySepFirstInternal(8,e)},t.prototype.MANY_SEP9=function(e){this.manySepFirstInternal(9,e)},t.prototype.AT_LEAST_ONE=function(e){this.atLeastOneInternal(0,e)},t.prototype.AT_LEAST_ONE1=function(e){return this.atLeastOneInternal(1,e)},t.prototype.AT_LEAST_ONE2=function(e){this.atLeastOneInternal(2,e)},t.prototype.AT_LEAST_ONE3=function(e){this.atLeastOneInternal(3,e)},t.prototype.AT_LEAST_ONE4=function(e){this.atLeastOneInternal(4,e)},t.prototype.AT_LEAST_ONE5=function(e){this.atLeastOneInternal(5,e)},t.prototype.AT_LEAST_ONE6=function(e){this.atLeastOneInternal(6,e)},t.prototype.AT_LEAST_ONE7=function(e){this.atLeastOneInternal(7,e)},t.prototype.AT_LEAST_ONE8=function(e){this.atLeastOneInternal(8,e)},t.prototype.AT_LEAST_ONE9=function(e){this.atLeastOneInternal(9,e)},t.prototype.AT_LEAST_ONE_SEP=function(e){this.atLeastOneSepFirstInternal(0,e)},t.prototype.AT_LEAST_ONE_SEP1=function(e){this.atLeastOneSepFirstInternal(1,e)},t.prototype.AT_LEAST_ONE_SEP2=function(e){this.atLeastOneSepFirstInternal(2,e)},t.prototype.AT_LEAST_ONE_SEP3=function(e){this.atLeastOneSepFirstInternal(3,e)},t.prototype.AT_LEAST_ONE_SEP4=function(e){this.atLeastOneSepFirstInternal(4,e)},t.prototype.AT_LEAST_ONE_SEP5=function(e){this.atLeastOneSepFirstInternal(5,e)},t.prototype.AT_LEAST_ONE_SEP6=function(e){this.atLeastOneSepFirstInternal(6,e)},t.prototype.AT_LEAST_ONE_SEP7=function(e){this.atLeastOneSepFirstInternal(7,e)},t.prototype.AT_LEAST_ONE_SEP8=function(e){this.atLeastOneSepFirstInternal(8,e)},t.prototype.AT_LEAST_ONE_SEP9=function(e){this.atLeastOneSepFirstInternal(9,e)},t.prototype.RULE=function(e,r,i){if(i===void 0&&(i=mS.DEFAULT_RULE_CONFIG),(0,Gj.contains)(this.definedRulesNames,e)){var n=Oye.defaultGrammarValidatorErrorProvider.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),s={message:n,type:mS.ParserDefinitionErrorType.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(s)}this.definedRulesNames.push(e);var o=this.defineRule(e,r,i);return this[e]=o,o},t.prototype.OVERRIDE_RULE=function(e,r,i){i===void 0&&(i=mS.DEFAULT_RULE_CONFIG);var n=[];n=n.concat((0,Kye.validateRuleIsOverridden)(e,this.definedRulesNames,this.className)),this.definitionErrors=this.definitionErrors.concat(n);var s=this.defineRule(e,r,i);return this[e]=s,s},t.prototype.BACKTRACK=function(e,r){return function(){this.isBackTrackingStack.push(1);var i=this.saveRecogState();try{return e.apply(this,r),!0}catch(n){if((0,Mye.isRecognitionException)(n))return!1;throw n}finally{this.reloadRecogState(i),this.isBackTrackingStack.pop()}}},t.prototype.getGAstProductions=function(){return this.gastProductionsCache},t.prototype.getSerializedGastProductions=function(){return(0,Uye.serializeGrammar)((0,Gj.values)(this.gastProductionsCache))},t}();RI.RecognizerApi=Hye});var Wj=E(FI=>{"use strict";Object.defineProperty(FI,"__esModule",{value:!0});FI.RecognizerEngine=void 0;var Er=Dt(),Mn=xI(),NI=vu(),Yj=_h(),xu=Vh(),qj=Tn(),Gye=pS(),Jj=nA(),ep=yu(),jye=dS(),Yye=function(){function t(){}return t.prototype.initRecognizerEngine=function(e,r){if(this.className=(0,jye.classNameFromInstance)(this),this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=ep.tokenStructuredMatcherNoCategories,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,Er.has)(r,"serializedGrammar"))throw Error(`The Parser's configuration can no longer contain a property. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0 + For Further details.`);if((0,Er.isArray)(e)){if((0,Er.isEmpty)(e))throw Error(`A Token Vocabulary cannot be empty. + Note that the first argument for the parser constructor + is no longer a Token vector (since v4.0).`);if(typeof e[0].startOffset=="number")throw Error(`The Parser constructor no longer accepts a token vector as the first argument. + See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0 + For Further details.`)}if((0,Er.isArray)(e))this.tokensMap=(0,Er.reduce)(e,function(o,a){return o[a.name]=a,o},{});else if((0,Er.has)(e,"modes")&&(0,Er.every)((0,Er.flatten)((0,Er.values)(e.modes)),ep.isTokenType)){var i=(0,Er.flatten)((0,Er.values)(e.modes)),n=(0,Er.uniq)(i);this.tokensMap=(0,Er.reduce)(n,function(o,a){return o[a.name]=a,o},{})}else if((0,Er.isObject)(e))this.tokensMap=(0,Er.cloneObj)(e);else throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap.EOF=Jj.EOF;var s=(0,Er.every)((0,Er.values)(e),function(o){return(0,Er.isEmpty)(o.categoryMatches)});this.tokenMatcher=s?ep.tokenStructuredMatcherNoCategories:ep.tokenStructuredMatcher,(0,ep.augmentTokenTypes)((0,Er.values)(this.tokensMap))},t.prototype.defineRule=function(e,r,i){if(this.selfAnalysisDone)throw Error("Grammar rule <"+e+`> may not be defined after the 'performSelfAnalysis' method has been called' +Make sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);var n=(0,Er.has)(i,"resyncEnabled")?i.resyncEnabled:qj.DEFAULT_RULE_CONFIG.resyncEnabled,s=(0,Er.has)(i,"recoveryValueFunc")?i.recoveryValueFunc:qj.DEFAULT_RULE_CONFIG.recoveryValueFunc,o=this.ruleShortNameIdx<r},t.prototype.orInternal=function(e,r){var i=this.getKeyForAutomaticLookahead(Mn.OR_IDX,r),n=(0,Er.isArray)(e)?e:e.DEF,s=this.getLaFuncFromCache(i),o=s.call(this,n);if(o!==void 0){var a=n[o];return a.ALT.call(this)}this.raiseNoAltException(r,e.ERR_MSG)},t.prototype.ruleFinallyStateUpdate=function(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),this.RULE_STACK.length===0&&this.isAtEndOfInput()===!1){var e=this.LA(1),r=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new NI.NotAllInputParsedException(r,e))}},t.prototype.subruleInternal=function(e,r,i){var n;try{var s=i!==void 0?i.ARGS:void 0;return n=e.call(this,r,s),this.cstPostNonTerminal(n,i!==void 0&&i.LABEL!==void 0?i.LABEL:e.ruleName),n}catch(o){this.subruleInternalError(o,i,e.ruleName)}},t.prototype.subruleInternalError=function(e,r,i){throw(0,NI.isRecognitionException)(e)&&e.partialCstResult!==void 0&&(this.cstPostNonTerminal(e.partialCstResult,r!==void 0&&r.LABEL!==void 0?r.LABEL:i),delete e.partialCstResult),e},t.prototype.consumeInternal=function(e,r,i){var n;try{var s=this.LA(1);this.tokenMatcher(s,e)===!0?(this.consumeToken(),n=s):this.consumeInternalError(e,s,i)}catch(o){n=this.consumeInternalRecovery(e,r,o)}return this.cstPostTerminal(i!==void 0&&i.LABEL!==void 0?i.LABEL:e.name,n),n},t.prototype.consumeInternalError=function(e,r,i){var n,s=this.LA(0);throw i!==void 0&&i.ERR_MSG?n=i.ERR_MSG:n=this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:r,previous:s,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new NI.MismatchedTokenException(n,r,s))},t.prototype.consumeInternalRecovery=function(e,r,i){if(this.recoveryEnabled&&i.name==="MismatchedTokenException"&&!this.isBackTracking()){var n=this.getFollowsForInRuleRecovery(e,r);try{return this.tryInRuleRecovery(e,n)}catch(s){throw s.name===Gye.IN_RULE_RECOVERY_EXCEPTION?i:s}}else throw i},t.prototype.saveRecogState=function(){var e=this.errors,r=(0,Er.cloneArr)(this.RULE_STACK);return{errors:e,lexerState:this.exportLexerState(),RULE_STACK:r,CST_STACK:this.CST_STACK}},t.prototype.reloadRecogState=function(e){this.errors=e.errors,this.importLexerState(e.lexerState),this.RULE_STACK=e.RULE_STACK},t.prototype.ruleInvocationStateUpdate=function(e,r,i){this.RULE_OCCURRENCE_STACK.push(i),this.RULE_STACK.push(e),this.cstInvocationStateUpdate(r,e)},t.prototype.isBackTracking=function(){return this.isBackTrackingStack.length!==0},t.prototype.getCurrRuleFullName=function(){var e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]},t.prototype.shortRuleNameToFullName=function(e){return this.shortRuleNameToFull[e]},t.prototype.isAtEndOfInput=function(){return this.tokenMatcher(this.LA(1),Jj.EOF)},t.prototype.reset=function(){this.resetLexerState(),this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]},t}();FI.RecognizerEngine=Yye});var Vj=E(LI=>{"use strict";Object.defineProperty(LI,"__esModule",{value:!0});LI.ErrorHandler=void 0;var ES=vu(),IS=Dt(),zj=_h(),qye=Tn(),Jye=function(){function t(){}return t.prototype.initErrorHandler=function(e){this._errors=[],this.errorMessageProvider=(0,IS.has)(e,"errorMessageProvider")?e.errorMessageProvider:qye.DEFAULT_PARSER_CONFIG.errorMessageProvider},t.prototype.SAVE_ERROR=function(e){if((0,ES.isRecognitionException)(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,IS.cloneArr)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")},Object.defineProperty(t.prototype,"errors",{get:function(){return(0,IS.cloneArr)(this._errors)},set:function(e){this._errors=e},enumerable:!1,configurable:!0}),t.prototype.raiseEarlyExitException=function(e,r,i){for(var n=this.getCurrRuleFullName(),s=this.getGAstProductions()[n],o=(0,zj.getLookaheadPathsForOptionalProd)(e,s,r,this.maxLookahead),a=o[0],l=[],c=1;c<=this.maxLookahead;c++)l.push(this.LA(c));var u=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:a,actual:l,previous:this.LA(0),customUserDescription:i,ruleName:n});throw this.SAVE_ERROR(new ES.EarlyExitException(u,this.LA(1),this.LA(0)))},t.prototype.raiseNoAltException=function(e,r){for(var i=this.getCurrRuleFullName(),n=this.getGAstProductions()[i],s=(0,zj.getLookaheadPathsForOr)(e,n,this.maxLookahead),o=[],a=1;a<=this.maxLookahead;a++)o.push(this.LA(a));var l=this.LA(0),c=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:s,actual:o,previous:l,customUserDescription:r,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new ES.NoViableAltException(c,this.LA(1),l))},t}();LI.ErrorHandler=Jye});var Zj=E(TI=>{"use strict";Object.defineProperty(TI,"__esModule",{value:!0});TI.ContentAssist=void 0;var _j=Vh(),Xj=Dt(),Wye=function(){function t(){}return t.prototype.initContentAssist=function(){},t.prototype.computeContentAssist=function(e,r){var i=this.gastProductionsCache[e];if((0,Xj.isUndefined)(i))throw Error("Rule ->"+e+"<- does not exist in this grammar.");return(0,_j.nextPossibleTokensAfter)([i],r,this.tokenMatcher,this.maxLookahead)},t.prototype.getNextPossibleTokenTypes=function(e){var r=(0,Xj.first)(e.ruleStack),i=this.getGAstProductions(),n=i[r],s=new _j.NextAfterTokenWalker(n,e).startWalking();return s},t}();TI.ContentAssist=Wye});var oY=E(MI=>{"use strict";Object.defineProperty(MI,"__esModule",{value:!0});MI.GastRecorder=void 0;var Cn=Dt(),fo=hn(),zye=Gh(),$j=yu(),eY=nA(),Vye=Tn(),_ye=xI(),OI={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(OI);var tY=!0,rY=Math.pow(2,_ye.BITS_FOR_OCCURRENCE_IDX)-1,iY=(0,eY.createToken)({name:"RECORDING_PHASE_TOKEN",pattern:zye.Lexer.NA});(0,$j.augmentTokenTypes)([iY]);var nY=(0,eY.createTokenInstance)(iY,`This IToken indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,-1,-1,-1,-1,-1,-1);Object.freeze(nY);var Xye={name:`This CSTNode indicates the Parser is in Recording Phase + See: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details`,children:{}},$ye=function(){function t(){}return t.prototype.initGastRecorder=function(e){this.recordingProdStack=[],this.RECORDING_PHASE=!1},t.prototype.enableRecording=function(){var e=this;this.RECORDING_PHASE=!0,this.TRACE_INIT("Enable Recording",function(){for(var r=function(n){var s=n>0?n:"";e["CONSUME"+s]=function(o,a){return this.consumeInternalRecord(o,n,a)},e["SUBRULE"+s]=function(o,a){return this.subruleInternalRecord(o,n,a)},e["OPTION"+s]=function(o){return this.optionInternalRecord(o,n)},e["OR"+s]=function(o){return this.orInternalRecord(o,n)},e["MANY"+s]=function(o){this.manyInternalRecord(n,o)},e["MANY_SEP"+s]=function(o){this.manySepFirstInternalRecord(n,o)},e["AT_LEAST_ONE"+s]=function(o){this.atLeastOneInternalRecord(n,o)},e["AT_LEAST_ONE_SEP"+s]=function(o){this.atLeastOneSepFirstInternalRecord(n,o)}},i=0;i<10;i++)r(i);e.consume=function(n,s,o){return this.consumeInternalRecord(s,n,o)},e.subrule=function(n,s,o){return this.subruleInternalRecord(s,n,o)},e.option=function(n,s){return this.optionInternalRecord(s,n)},e.or=function(n,s){return this.orInternalRecord(s,n)},e.many=function(n,s){this.manyInternalRecord(n,s)},e.atLeastOne=function(n,s){this.atLeastOneInternalRecord(n,s)},e.ACTION=e.ACTION_RECORD,e.BACKTRACK=e.BACKTRACK_RECORD,e.LA=e.LA_RECORD})},t.prototype.disableRecording=function(){var e=this;this.RECORDING_PHASE=!1,this.TRACE_INIT("Deleting Recording methods",function(){for(var r=0;r<10;r++){var i=r>0?r:"";delete e["CONSUME"+i],delete e["SUBRULE"+i],delete e["OPTION"+i],delete e["OR"+i],delete e["MANY"+i],delete e["MANY_SEP"+i],delete e["AT_LEAST_ONE"+i],delete e["AT_LEAST_ONE_SEP"+i]}delete e.consume,delete e.subrule,delete e.option,delete e.or,delete e.many,delete e.atLeastOne,delete e.ACTION,delete e.BACKTRACK,delete e.LA})},t.prototype.ACTION_RECORD=function(e){},t.prototype.BACKTRACK_RECORD=function(e,r){return function(){return!0}},t.prototype.LA_RECORD=function(e){return Vye.END_OF_FILE},t.prototype.topLevelRuleRecord=function(e,r){try{var i=new fo.Rule({definition:[],name:e});return i.name=e,this.recordingProdStack.push(i),r.call(this),this.recordingProdStack.pop(),i}catch(n){if(n.KNOWN_RECORDER_ERROR!==!0)try{n.message=n.message+` + This error was thrown during the "grammar recording phase" For more info see: + https://chevrotain.io/docs/guide/internals.html#grammar-recording`}catch(s){throw n}throw n}},t.prototype.optionInternalRecord=function(e,r){return tp.call(this,fo.Option,e,r)},t.prototype.atLeastOneInternalRecord=function(e,r){tp.call(this,fo.RepetitionMandatory,r,e)},t.prototype.atLeastOneSepFirstInternalRecord=function(e,r){tp.call(this,fo.RepetitionMandatoryWithSeparator,r,e,tY)},t.prototype.manyInternalRecord=function(e,r){tp.call(this,fo.Repetition,r,e)},t.prototype.manySepFirstInternalRecord=function(e,r){tp.call(this,fo.RepetitionWithSeparator,r,e,tY)},t.prototype.orInternalRecord=function(e,r){return Zye.call(this,e,r)},t.prototype.subruleInternalRecord=function(e,r,i){if(KI(r),!e||(0,Cn.has)(e,"ruleName")===!1){var n=new Error(" argument is invalid"+(" expecting a Parser method reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Cn.peek)(this.recordingProdStack),o=e.ruleName,a=new fo.NonTerminal({idx:r,nonTerminalName:o,label:i==null?void 0:i.LABEL,referencedRule:void 0});return s.definition.push(a),this.outputCst?Xye:OI},t.prototype.consumeInternalRecord=function(e,r,i){if(KI(r),!(0,$j.hasShortKeyProperty)(e)){var n=new Error(" argument is invalid"+(" expecting a TokenType reference but got: <"+JSON.stringify(e)+">")+(` + inside top level rule: <`+this.recordingProdStack[0].name+">"));throw n.KNOWN_RECORDER_ERROR=!0,n}var s=(0,Cn.peek)(this.recordingProdStack),o=new fo.Terminal({idx:r,terminalType:e,label:i==null?void 0:i.LABEL});return s.definition.push(o),nY},t}();MI.GastRecorder=$ye;function tp(t,e,r,i){i===void 0&&(i=!1),KI(r);var n=(0,Cn.peek)(this.recordingProdStack),s=(0,Cn.isFunction)(e)?e:e.DEF,o=new t({definition:[],idx:r});return i&&(o.separator=e.SEP),(0,Cn.has)(e,"MAX_LOOKAHEAD")&&(o.maxLookahead=e.MAX_LOOKAHEAD),this.recordingProdStack.push(o),s.call(this),n.definition.push(o),this.recordingProdStack.pop(),OI}function Zye(t,e){var r=this;KI(e);var i=(0,Cn.peek)(this.recordingProdStack),n=(0,Cn.isArray)(t)===!1,s=n===!1?t:t.DEF,o=new fo.Alternation({definition:[],idx:e,ignoreAmbiguities:n&&t.IGNORE_AMBIGUITIES===!0});(0,Cn.has)(t,"MAX_LOOKAHEAD")&&(o.maxLookahead=t.MAX_LOOKAHEAD);var a=(0,Cn.some)(s,function(l){return(0,Cn.isFunction)(l.GATE)});return o.hasPredicates=a,i.definition.push(o),(0,Cn.forEach)(s,function(l){var c=new fo.Alternative({definition:[]});o.definition.push(c),(0,Cn.has)(l,"IGNORE_AMBIGUITIES")?c.ignoreAmbiguities=l.IGNORE_AMBIGUITIES:(0,Cn.has)(l,"GATE")&&(c.ignoreAmbiguities=!0),r.recordingProdStack.push(c),l.ALT.call(r),r.recordingProdStack.pop()}),OI}function sY(t){return t===0?"":""+t}function KI(t){if(t<0||t>rY){var e=new Error("Invalid DSL Method idx value: <"+t+`> + `+("Idx value must be a none negative value smaller than "+(rY+1)));throw e.KNOWN_RECORDER_ERROR=!0,e}}});var AY=E(UI=>{"use strict";Object.defineProperty(UI,"__esModule",{value:!0});UI.PerformanceTracer=void 0;var aY=Dt(),ewe=Tn(),twe=function(){function t(){}return t.prototype.initPerformanceTracer=function(e){if((0,aY.has)(e,"traceInitPerf")){var r=e.traceInitPerf,i=typeof r=="number";this.traceInitMaxIdent=i?r:Infinity,this.traceInitPerf=i?r>0:r}else this.traceInitMaxIdent=0,this.traceInitPerf=ewe.DEFAULT_PARSER_CONFIG.traceInitPerf;this.traceInitIndent=-1},t.prototype.TRACE_INIT=function(e,r){if(this.traceInitPerf===!0){this.traceInitIndent++;var i=new Array(this.traceInitIndent+1).join(" ");this.traceInitIndent <"+e+">");var n=(0,aY.timer)(r),s=n.time,o=n.value,a=s>10?console.warn:console.log;return this.traceInitIndent time: "+s+"ms"),this.traceInitIndent--,o}else return r()},t}();UI.PerformanceTracer=twe});var lY=E(HI=>{"use strict";Object.defineProperty(HI,"__esModule",{value:!0});HI.applyMixins=void 0;function rwe(t,e){e.forEach(function(r){var i=r.prototype;Object.getOwnPropertyNames(i).forEach(function(n){if(n!=="constructor"){var s=Object.getOwnPropertyDescriptor(i,n);s&&(s.get||s.set)?Object.defineProperty(t.prototype,n,s):t.prototype[n]=r.prototype[n]}})})}HI.applyMixins=rwe});var Tn=E(or=>{"use strict";var cY=or&&or.__extends||function(){var t=function(e,r){return t=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(i,n){i.__proto__=n}||function(i,n){for(var s in n)Object.prototype.hasOwnProperty.call(n,s)&&(i[s]=n[s])},t(e,r)};return function(e,r){if(typeof r!="function"&&r!==null)throw new TypeError("Class extends value "+String(r)+" is not a constructor or null");t(e,r);function i(){this.constructor=e}e.prototype=r===null?Object.create(r):(i.prototype=r.prototype,new i)}}();Object.defineProperty(or,"__esModule",{value:!0});or.EmbeddedActionsParser=or.CstParser=or.Parser=or.EMPTY_ALT=or.ParserDefinitionErrorType=or.DEFAULT_RULE_CONFIG=or.DEFAULT_PARSER_CONFIG=or.END_OF_FILE=void 0;var Wi=Dt(),iwe=VG(),uY=nA(),gY=Wh(),fY=yj(),nwe=pS(),swe=kj(),owe=Kj(),awe=Hj(),Awe=jj(),lwe=Wj(),cwe=Vj(),uwe=Zj(),gwe=oY(),fwe=AY(),hwe=lY();or.END_OF_FILE=(0,uY.createTokenInstance)(uY.EOF,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(or.END_OF_FILE);or.DEFAULT_PARSER_CONFIG=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:gY.defaultParserErrorProvider,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1});or.DEFAULT_RULE_CONFIG=Object.freeze({recoveryValueFunc:function(){},resyncEnabled:!0});var pwe;(function(t){t[t.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",t[t.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",t[t.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",t[t.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",t[t.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",t[t.LEFT_RECURSION=5]="LEFT_RECURSION",t[t.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",t[t.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",t[t.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",t[t.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",t[t.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",t[t.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",t[t.TOO_MANY_ALTS=12]="TOO_MANY_ALTS"})(pwe=or.ParserDefinitionErrorType||(or.ParserDefinitionErrorType={}));function dwe(t){return t===void 0&&(t=void 0),function(){return t}}or.EMPTY_ALT=dwe;var GI=function(){function t(e,r){this.definitionErrors=[],this.selfAnalysisDone=!1;var i=this;if(i.initErrorHandler(r),i.initLexerAdapter(),i.initLooksAhead(r),i.initRecognizerEngine(e,r),i.initRecoverable(r),i.initTreeBuilder(r),i.initContentAssist(),i.initGastRecorder(r),i.initPerformanceTracer(r),(0,Wi.has)(r,"ignoredIssues"))throw new Error(`The IParserConfig property has been deprecated. + Please use the flag on the relevant DSL method instead. + See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES + For further details.`);this.skipValidations=(0,Wi.has)(r,"skipValidations")?r.skipValidations:or.DEFAULT_PARSER_CONFIG.skipValidations}return t.performSelfAnalysis=function(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated. \nUse the **instance** method with the same name instead.")},t.prototype.performSelfAnalysis=function(){var e=this;this.TRACE_INIT("performSelfAnalysis",function(){var r;e.selfAnalysisDone=!0;var i=e.className;e.TRACE_INIT("toFastProps",function(){(0,Wi.toFastProperties)(e)}),e.TRACE_INIT("Grammar Recording",function(){try{e.enableRecording(),(0,Wi.forEach)(e.definedRulesNames,function(s){var o=e[s],a=o.originalGrammarAction,l=void 0;e.TRACE_INIT(s+" Rule",function(){l=e.topLevelRuleRecord(s,a)}),e.gastProductionsCache[s]=l})}finally{e.disableRecording()}});var n=[];if(e.TRACE_INIT("Grammar Resolving",function(){n=(0,fY.resolveGrammar)({rules:(0,Wi.values)(e.gastProductionsCache)}),e.definitionErrors=e.definitionErrors.concat(n)}),e.TRACE_INIT("Grammar Validations",function(){if((0,Wi.isEmpty)(n)&&e.skipValidations===!1){var s=(0,fY.validateGrammar)({rules:(0,Wi.values)(e.gastProductionsCache),maxLookahead:e.maxLookahead,tokenTypes:(0,Wi.values)(e.tokensMap),errMsgProvider:gY.defaultGrammarValidatorErrorProvider,grammarName:i});e.definitionErrors=e.definitionErrors.concat(s)}}),(0,Wi.isEmpty)(e.definitionErrors)&&(e.recoveryEnabled&&e.TRACE_INIT("computeAllProdsFollows",function(){var s=(0,iwe.computeAllProdsFollows)((0,Wi.values)(e.gastProductionsCache));e.resyncFollows=s}),e.TRACE_INIT("ComputeLookaheadFunctions",function(){e.preComputeLookaheadFunctions((0,Wi.values)(e.gastProductionsCache))})),!t.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,Wi.isEmpty)(e.definitionErrors))throw r=(0,Wi.map)(e.definitionErrors,function(s){return s.message}),new Error(`Parser Definition Errors detected: + `+r.join(` +------------------------------- +`))})},t.DEFER_DEFINITION_ERRORS_HANDLING=!1,t}();or.Parser=GI;(0,hwe.applyMixins)(GI,[nwe.Recoverable,swe.LooksAhead,owe.TreeBuilder,awe.LexerAdapter,lwe.RecognizerEngine,Awe.RecognizerApi,cwe.ErrorHandler,uwe.ContentAssist,gwe.GastRecorder,fwe.PerformanceTracer]);var Cwe=function(t){cY(e,t);function e(r,i){i===void 0&&(i=or.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Wi.cloneObj)(i);return s.outputCst=!0,n=t.call(this,r,s)||this,n}return e}(GI);or.CstParser=Cwe;var mwe=function(t){cY(e,t);function e(r,i){i===void 0&&(i=or.DEFAULT_PARSER_CONFIG);var n=this,s=(0,Wi.cloneObj)(i);return s.outputCst=!1,n=t.call(this,r,s)||this,n}return e}(GI);or.EmbeddedActionsParser=mwe});var pY=E(jI=>{"use strict";Object.defineProperty(jI,"__esModule",{value:!0});jI.createSyntaxDiagramsCode=void 0;var hY=Uv();function Ewe(t,e){var r=e===void 0?{}:e,i=r.resourceBase,n=i===void 0?"https://unpkg.com/chevrotain@"+hY.VERSION+"/diagrams/":i,s=r.css,o=s===void 0?"https://unpkg.com/chevrotain@"+hY.VERSION+"/diagrams/diagrams.css":s,a=` + + + + + +`,l=` + +`,c=` + + + + +`,u=` +
+`,g=` + +`,f=` + +`;return a+l+c+u+g+f}jI.createSyntaxDiagramsCode=Ewe});var mY=E(He=>{"use strict";Object.defineProperty(He,"__esModule",{value:!0});He.Parser=He.createSyntaxDiagramsCode=He.clearCache=He.GAstVisitor=He.serializeProduction=He.serializeGrammar=He.Terminal=He.Rule=He.RepetitionWithSeparator=He.RepetitionMandatoryWithSeparator=He.RepetitionMandatory=He.Repetition=He.Option=He.NonTerminal=He.Alternative=He.Alternation=He.defaultLexerErrorProvider=He.NoViableAltException=He.NotAllInputParsedException=He.MismatchedTokenException=He.isRecognitionException=He.EarlyExitException=He.defaultParserErrorProvider=He.tokenName=He.tokenMatcher=He.tokenLabel=He.EOF=He.createTokenInstance=He.createToken=He.LexerDefinitionErrorType=He.Lexer=He.EMPTY_ALT=He.ParserDefinitionErrorType=He.EmbeddedActionsParser=He.CstParser=He.VERSION=void 0;var Iwe=Uv();Object.defineProperty(He,"VERSION",{enumerable:!0,get:function(){return Iwe.VERSION}});var YI=Tn();Object.defineProperty(He,"CstParser",{enumerable:!0,get:function(){return YI.CstParser}});Object.defineProperty(He,"EmbeddedActionsParser",{enumerable:!0,get:function(){return YI.EmbeddedActionsParser}});Object.defineProperty(He,"ParserDefinitionErrorType",{enumerable:!0,get:function(){return YI.ParserDefinitionErrorType}});Object.defineProperty(He,"EMPTY_ALT",{enumerable:!0,get:function(){return YI.EMPTY_ALT}});var dY=Gh();Object.defineProperty(He,"Lexer",{enumerable:!0,get:function(){return dY.Lexer}});Object.defineProperty(He,"LexerDefinitionErrorType",{enumerable:!0,get:function(){return dY.LexerDefinitionErrorType}});var ku=nA();Object.defineProperty(He,"createToken",{enumerable:!0,get:function(){return ku.createToken}});Object.defineProperty(He,"createTokenInstance",{enumerable:!0,get:function(){return ku.createTokenInstance}});Object.defineProperty(He,"EOF",{enumerable:!0,get:function(){return ku.EOF}});Object.defineProperty(He,"tokenLabel",{enumerable:!0,get:function(){return ku.tokenLabel}});Object.defineProperty(He,"tokenMatcher",{enumerable:!0,get:function(){return ku.tokenMatcher}});Object.defineProperty(He,"tokenName",{enumerable:!0,get:function(){return ku.tokenName}});var ywe=Wh();Object.defineProperty(He,"defaultParserErrorProvider",{enumerable:!0,get:function(){return ywe.defaultParserErrorProvider}});var rp=vu();Object.defineProperty(He,"EarlyExitException",{enumerable:!0,get:function(){return rp.EarlyExitException}});Object.defineProperty(He,"isRecognitionException",{enumerable:!0,get:function(){return rp.isRecognitionException}});Object.defineProperty(He,"MismatchedTokenException",{enumerable:!0,get:function(){return rp.MismatchedTokenException}});Object.defineProperty(He,"NotAllInputParsedException",{enumerable:!0,get:function(){return rp.NotAllInputParsedException}});Object.defineProperty(He,"NoViableAltException",{enumerable:!0,get:function(){return rp.NoViableAltException}});var wwe=_v();Object.defineProperty(He,"defaultLexerErrorProvider",{enumerable:!0,get:function(){return wwe.defaultLexerErrorProvider}});var ho=hn();Object.defineProperty(He,"Alternation",{enumerable:!0,get:function(){return ho.Alternation}});Object.defineProperty(He,"Alternative",{enumerable:!0,get:function(){return ho.Alternative}});Object.defineProperty(He,"NonTerminal",{enumerable:!0,get:function(){return ho.NonTerminal}});Object.defineProperty(He,"Option",{enumerable:!0,get:function(){return ho.Option}});Object.defineProperty(He,"Repetition",{enumerable:!0,get:function(){return ho.Repetition}});Object.defineProperty(He,"RepetitionMandatory",{enumerable:!0,get:function(){return ho.RepetitionMandatory}});Object.defineProperty(He,"RepetitionMandatoryWithSeparator",{enumerable:!0,get:function(){return ho.RepetitionMandatoryWithSeparator}});Object.defineProperty(He,"RepetitionWithSeparator",{enumerable:!0,get:function(){return ho.RepetitionWithSeparator}});Object.defineProperty(He,"Rule",{enumerable:!0,get:function(){return ho.Rule}});Object.defineProperty(He,"Terminal",{enumerable:!0,get:function(){return ho.Terminal}});var CY=hn();Object.defineProperty(He,"serializeGrammar",{enumerable:!0,get:function(){return CY.serializeGrammar}});Object.defineProperty(He,"serializeProduction",{enumerable:!0,get:function(){return CY.serializeProduction}});var Bwe=wu();Object.defineProperty(He,"GAstVisitor",{enumerable:!0,get:function(){return Bwe.GAstVisitor}});function Qwe(){console.warn(`The clearCache function was 'soft' removed from the Chevrotain API. + It performs no action other than printing this message. + Please avoid using it as it will be completely removed in the future`)}He.clearCache=Qwe;var bwe=pY();Object.defineProperty(He,"createSyntaxDiagramsCode",{enumerable:!0,get:function(){return bwe.createSyntaxDiagramsCode}});var vwe=function(){function t(){throw new Error(`The Parser class has been deprecated, use CstParser or EmbeddedActionsParser instead. +See: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_7-0-0`)}return t}();He.Parser=vwe});var yY=E((Trt,EY)=>{var qI=mY(),ca=qI.createToken,IY=qI.tokenMatcher,yS=qI.Lexer,Swe=qI.EmbeddedActionsParser;EY.exports=t=>{let e=ca({name:"LogicalOperator",pattern:yS.NA}),r=ca({name:"Or",pattern:/\|/,categories:e}),i=ca({name:"Xor",pattern:/\^/,categories:e}),n=ca({name:"And",pattern:/&/,categories:e}),s=ca({name:"Not",pattern:/!/}),o=ca({name:"LParen",pattern:/\(/}),a=ca({name:"RParen",pattern:/\)/}),l=ca({name:"Query",pattern:t}),u=[ca({name:"WhiteSpace",pattern:/\s+/,group:yS.SKIPPED}),r,i,n,o,a,s,e,l],g=new yS(u);class f extends Swe{constructor(p){super(u);this.RULE("expression",()=>this.SUBRULE(this.logicalExpression)),this.RULE("logicalExpression",()=>{let m=this.SUBRULE(this.atomicExpression);return this.MANY(()=>{let I=m,B=this.CONSUME(e),b=this.SUBRULE2(this.atomicExpression);IY(B,r)?m=R=>I(R)||b(R):IY(B,i)?m=R=>!!(I(R)^b(R)):m=R=>I(R)&&b(R)}),m}),this.RULE("atomicExpression",()=>this.OR([{ALT:()=>this.SUBRULE(this.parenthesisExpression)},{ALT:()=>{let{image:d}=this.CONSUME(l);return m=>m(d)}},{ALT:()=>{this.CONSUME(s);let d=this.SUBRULE(this.atomicExpression);return m=>!d(m)}}])),this.RULE("parenthesisExpression",()=>{let d;return this.CONSUME(o),d=this.SUBRULE(this.expression),this.CONSUME(a),d}),this.performSelfAnalysis()}}return{TinylogicLexer:g,TinylogicParser:f}}});var wY=E(JI=>{var xwe=yY();JI.makeParser=(t=/[a-z]+/)=>{let{TinylogicLexer:e,TinylogicParser:r}=xwe(t),i=new r;return(n,s)=>{let o=e.tokenize(n);return i.input=o.tokens,i.expression()(s)}};JI.parse=JI.makeParser()});var QY=E((Ort,BY)=>{"use strict";BY.exports=(...t)=>[...new Set([].concat(...t))]});var wS=E((Krt,bY)=>{"use strict";var kwe=require("stream"),vY=kwe.PassThrough,Pwe=Array.prototype.slice;bY.exports=Dwe;function Dwe(){let t=[],e=!1,r=Pwe.call(arguments),i=r[r.length-1];i&&!Array.isArray(i)&&i.pipe==null?r.pop():i={};let n=i.end!==!1;i.objectMode==null&&(i.objectMode=!0),i.highWaterMark==null&&(i.highWaterMark=64*1024);let s=vY(i);function o(){for(let c=0,u=arguments.length;c0||(e=!1,a())}function f(h){function p(){h.removeListener("merge2UnpipeEnd",p),h.removeListener("end",p),g()}if(h._readableState.endEmitted)return g();h.on("merge2UnpipeEnd",p),h.on("end",p),h.pipe(s,{end:!1}),h.resume()}for(let h=0;h{"use strict";Object.defineProperty(WI,"__esModule",{value:!0});function Rwe(t){return t.reduce((e,r)=>[].concat(e,r),[])}WI.flatten=Rwe;function Fwe(t,e){let r=[[]],i=0;for(let n of t)e(n)?(i++,r[i]=[]):r[i].push(n);return r}WI.splitWhen=Fwe});var kY=E(BS=>{"use strict";Object.defineProperty(BS,"__esModule",{value:!0});function Nwe(t){return t.code==="ENOENT"}BS.isEnoentCodeError=Nwe});var DY=E(QS=>{"use strict";Object.defineProperty(QS,"__esModule",{value:!0});var PY=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function Lwe(t,e){return new PY(t,e)}QS.createDirentFromStats=Lwe});var RY=E(Pu=>{"use strict";Object.defineProperty(Pu,"__esModule",{value:!0});var Twe=require("path"),Mwe=2,Owe=/(\\?)([()*?[\]{|}]|^!|[!+@](?=\())/g;function Kwe(t){return t.replace(/\\/g,"/")}Pu.unixify=Kwe;function Uwe(t,e){return Twe.resolve(t,e)}Pu.makeAbsolute=Uwe;function Hwe(t){return t.replace(Owe,"\\$2")}Pu.escape=Hwe;function Gwe(t){if(t.charAt(0)==="."){let e=t.charAt(1);if(e==="/"||e==="\\")return t.slice(Mwe)}return t}Pu.removeLeadingDotSegment=Gwe});var NY=E((Yrt,FY)=>{FY.exports=function(e){if(typeof e!="string"||e==="")return!1;for(var r;r=/(\\).|([@?!+*]\(.*\))/g.exec(e);){if(r[2])return!0;e=e.slice(r.index+r[0].length)}return!1}});var TY=E((qrt,LY)=>{var jwe=NY(),Ywe={"{":"}","(":")","[":"]"},qwe=/\\(.)|(^!|\*|[\].+)]\?|\[[^\\\]]+\]|\{[^\\}]+\}|\(\?[:!=][^\\)]+\)|\([^|]+\|[^\\)]+\))/,Jwe=/\\(.)|(^!|[*?{}()[\]]|\(\?)/;LY.exports=function(e,r){if(typeof e!="string"||e==="")return!1;if(jwe(e))return!0;var i=qwe,n;for(r&&r.strict===!1&&(i=Jwe);n=i.exec(e);){if(n[2])return!0;var s=n.index+n[0].length,o=n[1],a=o?Ywe[o]:null;if(o&&a){var l=e.indexOf(a,s);l!==-1&&(s=l+1)}e=e.slice(s)}return!1}});var OY=E((Jrt,MY)=>{"use strict";var Wwe=TY(),zwe=require("path").posix.dirname,Vwe=require("os").platform()==="win32",bS="/",_we=/\\/g,Xwe=/[\{\[].*[\}\]]$/,Zwe=/(^|[^\\])([\{\[]|\([^\)]+$)/,$we=/\\([\!\*\?\|\[\]\(\)\{\}])/g;MY.exports=function(e,r){var i=Object.assign({flipBackslashes:!0},r);i.flipBackslashes&&Vwe&&e.indexOf(bS)<0&&(e=e.replace(_we,bS)),Xwe.test(e)&&(e+=bS),e+="a";do e=zwe(e);while(Wwe(e)||Zwe.test(e));return e.replace($we,"$1")}});var WY=E(Hr=>{"use strict";Object.defineProperty(Hr,"__esModule",{value:!0});var eBe=require("path"),tBe=OY(),KY=Nn(),rBe=iv(),UY="**",iBe="\\",nBe=/[*?]|^!/,sBe=/\[.*]/,oBe=/(?:^|[^!*+?@])\(.*\|.*\)/,aBe=/[!*+?@]\(.*\)/,ABe=/{.*(?:,|\.\.).*}/;function GY(t,e={}){return!HY(t,e)}Hr.isStaticPattern=GY;function HY(t,e={}){return!!(e.caseSensitiveMatch===!1||t.includes(iBe)||nBe.test(t)||sBe.test(t)||oBe.test(t)||e.extglob!==!1&&aBe.test(t)||e.braceExpansion!==!1&&ABe.test(t))}Hr.isDynamicPattern=HY;function lBe(t){return zI(t)?t.slice(1):t}Hr.convertToPositivePattern=lBe;function cBe(t){return"!"+t}Hr.convertToNegativePattern=cBe;function zI(t){return t.startsWith("!")&&t[1]!=="("}Hr.isNegativePattern=zI;function jY(t){return!zI(t)}Hr.isPositivePattern=jY;function uBe(t){return t.filter(zI)}Hr.getNegativePatterns=uBe;function gBe(t){return t.filter(jY)}Hr.getPositivePatterns=gBe;function fBe(t){return tBe(t,{flipBackslashes:!1})}Hr.getBaseDirectory=fBe;function hBe(t){return t.includes(UY)}Hr.hasGlobStar=hBe;function YY(t){return t.endsWith("/"+UY)}Hr.endsWithSlashGlobStar=YY;function pBe(t){let e=eBe.basename(t);return YY(t)||GY(e)}Hr.isAffectDepthOfReadingPattern=pBe;function dBe(t){return t.reduce((e,r)=>e.concat(qY(r)),[])}Hr.expandPatternsWithBraceExpansion=dBe;function qY(t){return KY.braces(t,{expand:!0,nodupes:!0})}Hr.expandBraceExpansion=qY;function CBe(t,e){let r=rBe.scan(t,Object.assign(Object.assign({},e),{parts:!0}));return r.parts.length===0?[t]:r.parts}Hr.getPatternParts=CBe;function JY(t,e){return KY.makeRe(t,e)}Hr.makeRe=JY;function mBe(t,e){return t.map(r=>JY(r,e))}Hr.convertPatternsToRe=mBe;function EBe(t,e){return e.some(r=>r.test(t))}Hr.matchAny=EBe});var VY=E(vS=>{"use strict";Object.defineProperty(vS,"__esModule",{value:!0});var IBe=wS();function yBe(t){let e=IBe(t);return t.forEach(r=>{r.once("error",i=>e.emit("error",i))}),e.once("close",()=>zY(t)),e.once("end",()=>zY(t)),e}vS.merge=yBe;function zY(t){t.forEach(e=>e.emit("close"))}});var _Y=E(VI=>{"use strict";Object.defineProperty(VI,"__esModule",{value:!0});function wBe(t){return typeof t=="string"}VI.isString=wBe;function BBe(t){return t===""}VI.isEmpty=BBe});var ga=E(ua=>{"use strict";Object.defineProperty(ua,"__esModule",{value:!0});var QBe=xY();ua.array=QBe;var bBe=kY();ua.errno=bBe;var vBe=DY();ua.fs=vBe;var SBe=RY();ua.path=SBe;var xBe=WY();ua.pattern=xBe;var kBe=VY();ua.stream=kBe;var PBe=_Y();ua.string=PBe});var tq=E(fa=>{"use strict";Object.defineProperty(fa,"__esModule",{value:!0});var Ll=ga();function DBe(t,e){let r=XY(t),i=ZY(t,e.ignore),n=r.filter(l=>Ll.pattern.isStaticPattern(l,e)),s=r.filter(l=>Ll.pattern.isDynamicPattern(l,e)),o=SS(n,i,!1),a=SS(s,i,!0);return o.concat(a)}fa.generate=DBe;function SS(t,e,r){let i=$Y(t);return"."in i?[xS(".",t,e,r)]:eq(i,e,r)}fa.convertPatternsToTasks=SS;function XY(t){return Ll.pattern.getPositivePatterns(t)}fa.getPositivePatterns=XY;function ZY(t,e){return Ll.pattern.getNegativePatterns(t).concat(e).map(Ll.pattern.convertToPositivePattern)}fa.getNegativePatternsAsPositive=ZY;function $Y(t){let e={};return t.reduce((r,i)=>{let n=Ll.pattern.getBaseDirectory(i);return n in r?r[n].push(i):r[n]=[i],r},e)}fa.groupPatternsByBaseDirectory=$Y;function eq(t,e,r){return Object.keys(t).map(i=>xS(i,t[i],e,r))}fa.convertPatternGroupsToTasks=eq;function xS(t,e,r,i){return{dynamic:i,positive:e,negative:r,base:t,patterns:[].concat(e,r.map(Ll.pattern.convertToNegativePattern))}}fa.convertPatternGroupToTask=xS});var iq=E(_I=>{"use strict";Object.defineProperty(_I,"__esModule",{value:!0});_I.read=void 0;function RBe(t,e,r){e.fs.lstat(t,(i,n)=>{if(i!==null){rq(r,i);return}if(!n.isSymbolicLink()||!e.followSymbolicLink){kS(r,n);return}e.fs.stat(t,(s,o)=>{if(s!==null){if(e.throwErrorOnBrokenSymbolicLink){rq(r,s);return}kS(r,n);return}e.markSymbolicLink&&(o.isSymbolicLink=()=>!0),kS(r,o)})})}_I.read=RBe;function rq(t,e){t(e)}function kS(t,e){t(null,e)}});var nq=E(XI=>{"use strict";Object.defineProperty(XI,"__esModule",{value:!0});XI.read=void 0;function FBe(t,e){let r=e.fs.lstatSync(t);if(!r.isSymbolicLink()||!e.followSymbolicLink)return r;try{let i=e.fs.statSync(t);return e.markSymbolicLink&&(i.isSymbolicLink=()=>!0),i}catch(i){if(!e.throwErrorOnBrokenSymbolicLink)return r;throw i}}XI.read=FBe});var sq=E(AA=>{"use strict";Object.defineProperty(AA,"__esModule",{value:!0});AA.createFileSystemAdapter=AA.FILE_SYSTEM_ADAPTER=void 0;var ZI=require("fs");AA.FILE_SYSTEM_ADAPTER={lstat:ZI.lstat,stat:ZI.stat,lstatSync:ZI.lstatSync,statSync:ZI.statSync};function NBe(t){return t===void 0?AA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},AA.FILE_SYSTEM_ADAPTER),t)}AA.createFileSystemAdapter=NBe});var aq=E(PS=>{"use strict";Object.defineProperty(PS,"__esModule",{value:!0});var LBe=sq(),oq=class{constructor(e={}){this._options=e,this.followSymbolicLink=this._getValue(this._options.followSymbolicLink,!0),this.fs=LBe.createFileSystemAdapter(this._options.fs),this.markSymbolicLink=this._getValue(this._options.markSymbolicLink,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0)}_getValue(e,r){return e!=null?e:r}};PS.default=oq});var Tl=E(lA=>{"use strict";Object.defineProperty(lA,"__esModule",{value:!0});lA.statSync=lA.stat=lA.Settings=void 0;var Aq=iq(),TBe=nq(),DS=aq();lA.Settings=DS.default;function MBe(t,e,r){if(typeof e=="function"){Aq.read(t,RS(),e);return}Aq.read(t,RS(e),r)}lA.stat=MBe;function OBe(t,e){let r=RS(e);return TBe.read(t,r)}lA.statSync=OBe;function RS(t={}){return t instanceof DS.default?t:new DS.default(t)}});var cq=E((iit,lq)=>{lq.exports=KBe;function KBe(t,e){var r,i,n,s=!0;Array.isArray(t)?(r=[],i=t.length):(n=Object.keys(t),r={},i=n.length);function o(l){function c(){e&&e(l,r),e=null}s?process.nextTick(c):c()}function a(l,c,u){r[l]=u,(--i==0||c)&&o(c)}i?n?n.forEach(function(l){t[l](function(c,u){a(l,c,u)})}):t.forEach(function(l,c){l(function(u,g){a(c,u,g)})}):o(null),s=!1}});var FS=E($I=>{"use strict";Object.defineProperty($I,"__esModule",{value:!0});$I.IS_SUPPORT_READDIR_WITH_FILE_TYPES=void 0;var ey=process.versions.node.split(".");if(ey[0]===void 0||ey[1]===void 0)throw new Error(`Unexpected behavior. The 'process.versions.node' variable has invalid value: ${process.versions.node}`);var uq=Number.parseInt(ey[0],10),UBe=Number.parseInt(ey[1],10),gq=10,HBe=10,GBe=uq>gq,jBe=uq===gq&&UBe>=HBe;$I.IS_SUPPORT_READDIR_WITH_FILE_TYPES=GBe||jBe});var hq=E(ty=>{"use strict";Object.defineProperty(ty,"__esModule",{value:!0});ty.createDirentFromStats=void 0;var fq=class{constructor(e,r){this.name=e,this.isBlockDevice=r.isBlockDevice.bind(r),this.isCharacterDevice=r.isCharacterDevice.bind(r),this.isDirectory=r.isDirectory.bind(r),this.isFIFO=r.isFIFO.bind(r),this.isFile=r.isFile.bind(r),this.isSocket=r.isSocket.bind(r),this.isSymbolicLink=r.isSymbolicLink.bind(r)}};function YBe(t,e){return new fq(t,e)}ty.createDirentFromStats=YBe});var NS=E(ry=>{"use strict";Object.defineProperty(ry,"__esModule",{value:!0});ry.fs=void 0;var qBe=hq();ry.fs=qBe});var LS=E(iy=>{"use strict";Object.defineProperty(iy,"__esModule",{value:!0});iy.joinPathSegments=void 0;function JBe(t,e,r){return t.endsWith(r)?t+e:t+r+e}iy.joinPathSegments=JBe});var Iq=E(cA=>{"use strict";Object.defineProperty(cA,"__esModule",{value:!0});cA.readdir=cA.readdirWithFileTypes=cA.read=void 0;var WBe=Tl(),pq=cq(),zBe=FS(),dq=NS(),Cq=LS();function VBe(t,e,r){if(!e.stats&&zBe.IS_SUPPORT_READDIR_WITH_FILE_TYPES){mq(t,e,r);return}Eq(t,e,r)}cA.read=VBe;function mq(t,e,r){e.fs.readdir(t,{withFileTypes:!0},(i,n)=>{if(i!==null){ny(r,i);return}let s=n.map(a=>({dirent:a,name:a.name,path:Cq.joinPathSegments(t,a.name,e.pathSegmentSeparator)}));if(!e.followSymbolicLinks){TS(r,s);return}let o=s.map(a=>_Be(a,e));pq(o,(a,l)=>{if(a!==null){ny(r,a);return}TS(r,l)})})}cA.readdirWithFileTypes=mq;function _Be(t,e){return r=>{if(!t.dirent.isSymbolicLink()){r(null,t);return}e.fs.stat(t.path,(i,n)=>{if(i!==null){if(e.throwErrorOnBrokenSymbolicLink){r(i);return}r(null,t);return}t.dirent=dq.fs.createDirentFromStats(t.name,n),r(null,t)})}}function Eq(t,e,r){e.fs.readdir(t,(i,n)=>{if(i!==null){ny(r,i);return}let s=n.map(o=>{let a=Cq.joinPathSegments(t,o,e.pathSegmentSeparator);return l=>{WBe.stat(a,e.fsStatSettings,(c,u)=>{if(c!==null){l(c);return}let g={name:o,path:a,dirent:dq.fs.createDirentFromStats(o,u)};e.stats&&(g.stats=u),l(null,g)})}});pq(s,(o,a)=>{if(o!==null){ny(r,o);return}TS(r,a)})})}cA.readdir=Eq;function ny(t,e){t(e)}function TS(t,e){t(null,e)}});var bq=E(uA=>{"use strict";Object.defineProperty(uA,"__esModule",{value:!0});uA.readdir=uA.readdirWithFileTypes=uA.read=void 0;var XBe=Tl(),ZBe=FS(),yq=NS(),wq=LS();function $Be(t,e){return!e.stats&&ZBe.IS_SUPPORT_READDIR_WITH_FILE_TYPES?Bq(t,e):Qq(t,e)}uA.read=$Be;function Bq(t,e){return e.fs.readdirSync(t,{withFileTypes:!0}).map(i=>{let n={dirent:i,name:i.name,path:wq.joinPathSegments(t,i.name,e.pathSegmentSeparator)};if(n.dirent.isSymbolicLink()&&e.followSymbolicLinks)try{let s=e.fs.statSync(n.path);n.dirent=yq.fs.createDirentFromStats(n.name,s)}catch(s){if(e.throwErrorOnBrokenSymbolicLink)throw s}return n})}uA.readdirWithFileTypes=Bq;function Qq(t,e){return e.fs.readdirSync(t).map(i=>{let n=wq.joinPathSegments(t,i,e.pathSegmentSeparator),s=XBe.statSync(n,e.fsStatSettings),o={name:i,path:n,dirent:yq.fs.createDirentFromStats(i,s)};return e.stats&&(o.stats=s),o})}uA.readdir=Qq});var vq=E(gA=>{"use strict";Object.defineProperty(gA,"__esModule",{value:!0});gA.createFileSystemAdapter=gA.FILE_SYSTEM_ADAPTER=void 0;var Du=require("fs");gA.FILE_SYSTEM_ADAPTER={lstat:Du.lstat,stat:Du.stat,lstatSync:Du.lstatSync,statSync:Du.statSync,readdir:Du.readdir,readdirSync:Du.readdirSync};function e0e(t){return t===void 0?gA.FILE_SYSTEM_ADAPTER:Object.assign(Object.assign({},gA.FILE_SYSTEM_ADAPTER),t)}gA.createFileSystemAdapter=e0e});var xq=E(MS=>{"use strict";Object.defineProperty(MS,"__esModule",{value:!0});var t0e=require("path"),r0e=Tl(),i0e=vq(),Sq=class{constructor(e={}){this._options=e,this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!1),this.fs=i0e.createFileSystemAdapter(this._options.fs),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,t0e.sep),this.stats=this._getValue(this._options.stats,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!0),this.fsStatSettings=new r0e.Settings({followSymbolicLink:this.followSymbolicLinks,fs:this.fs,throwErrorOnBrokenSymbolicLink:this.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};MS.default=Sq});var sy=E(fA=>{"use strict";Object.defineProperty(fA,"__esModule",{value:!0});fA.Settings=fA.scandirSync=fA.scandir=void 0;var kq=Iq(),n0e=bq(),OS=xq();fA.Settings=OS.default;function s0e(t,e,r){if(typeof e=="function"){kq.read(t,KS(),e);return}kq.read(t,KS(e),r)}fA.scandir=s0e;function o0e(t,e){let r=KS(e);return n0e.read(t,r)}fA.scandirSync=o0e;function KS(t={}){return t instanceof OS.default?t:new OS.default(t)}});var Dq=E((fit,Pq)=>{"use strict";function a0e(t){var e=new t,r=e;function i(){var s=e;return s.next?e=s.next:(e=new t,r=e),s.next=null,s}function n(s){r.next=s,r=s}return{get:i,release:n}}Pq.exports=a0e});var Fq=E((hit,US)=>{"use strict";var A0e=Dq();function Rq(t,e,r){if(typeof t=="function"&&(r=e,e=t,t=null),r<1)throw new Error("fastqueue concurrency must be greater than 1");var i=A0e(l0e),n=null,s=null,o=0,a=null,l={push:d,drain:po,saturated:po,pause:u,paused:!1,concurrency:r,running:c,resume:h,idle:p,length:g,getQueue:f,unshift:m,empty:po,kill:B,killAndDrain:b,error:R};return l;function c(){return o}function u(){l.paused=!0}function g(){for(var H=n,L=0;H;)H=H.next,L++;return L}function f(){for(var H=n,L=[];H;)L.push(H.value),H=H.next;return L}function h(){if(!!l.paused){l.paused=!1;for(var H=0;H{"use strict";Object.defineProperty(Co,"__esModule",{value:!0});Co.joinPathSegments=Co.replacePathSegmentSeparator=Co.isAppliedFilter=Co.isFatalError=void 0;function u0e(t,e){return t.errorFilter===null?!0:!t.errorFilter(e)}Co.isFatalError=u0e;function g0e(t,e){return t===null||t(e)}Co.isAppliedFilter=g0e;function f0e(t,e){return t.split(/[/\\]/).join(e)}Co.replacePathSegmentSeparator=f0e;function h0e(t,e,r){return t===""?e:t.endsWith(r)?t+e:t+r+e}Co.joinPathSegments=h0e});var GS=E(HS=>{"use strict";Object.defineProperty(HS,"__esModule",{value:!0});var p0e=oy(),Nq=class{constructor(e,r){this._root=e,this._settings=r,this._root=p0e.replacePathSegmentSeparator(e,r.pathSegmentSeparator)}};HS.default=Nq});var YS=E(jS=>{"use strict";Object.defineProperty(jS,"__esModule",{value:!0});var d0e=require("events"),C0e=sy(),m0e=Fq(),ay=oy(),E0e=GS(),Lq=class extends E0e.default{constructor(e,r){super(e,r);this._settings=r,this._scandir=C0e.scandir,this._emitter=new d0e.EventEmitter,this._queue=m0e(this._worker.bind(this),this._settings.concurrency),this._isFatalError=!1,this._isDestroyed=!1,this._queue.drain=()=>{this._isFatalError||this._emitter.emit("end")}}read(){return this._isFatalError=!1,this._isDestroyed=!1,setImmediate(()=>{this._pushToQueue(this._root,this._settings.basePath)}),this._emitter}get isDestroyed(){return this._isDestroyed}destroy(){if(this._isDestroyed)throw new Error("The reader is already destroyed");this._isDestroyed=!0,this._queue.killAndDrain()}onEntry(e){this._emitter.on("entry",e)}onError(e){this._emitter.once("error",e)}onEnd(e){this._emitter.once("end",e)}_pushToQueue(e,r){let i={directory:e,base:r};this._queue.push(i,n=>{n!==null&&this._handleError(n)})}_worker(e,r){this._scandir(e.directory,this._settings.fsScandirSettings,(i,n)=>{if(i!==null){r(i,void 0);return}for(let s of n)this._handleEntry(s,e.base);r(null,void 0)})}_handleError(e){this._isDestroyed||!ay.isFatalError(this._settings,e)||(this._isFatalError=!0,this._isDestroyed=!0,this._emitter.emit("error",e))}_handleEntry(e,r){if(this._isDestroyed||this._isFatalError)return;let i=e.path;r!==void 0&&(e.path=ay.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),ay.isAppliedFilter(this._settings.entryFilter,e)&&this._emitEntry(e),e.dirent.isDirectory()&&ay.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_emitEntry(e){this._emitter.emit("entry",e)}};jS.default=Lq});var Mq=E(qS=>{"use strict";Object.defineProperty(qS,"__esModule",{value:!0});var I0e=YS(),Tq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new I0e.default(this._root,this._settings),this._storage=new Set}read(e){this._reader.onError(r=>{y0e(e,r)}),this._reader.onEntry(r=>{this._storage.add(r)}),this._reader.onEnd(()=>{w0e(e,[...this._storage])}),this._reader.read()}};qS.default=Tq;function y0e(t,e){t(e)}function w0e(t,e){t(null,e)}});var Kq=E(JS=>{"use strict";Object.defineProperty(JS,"__esModule",{value:!0});var B0e=require("stream"),Q0e=YS(),Oq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new Q0e.default(this._root,this._settings),this._stream=new B0e.Readable({objectMode:!0,read:()=>{},destroy:()=>{this._reader.isDestroyed||this._reader.destroy()}})}read(){return this._reader.onError(e=>{this._stream.emit("error",e)}),this._reader.onEntry(e=>{this._stream.push(e)}),this._reader.onEnd(()=>{this._stream.push(null)}),this._reader.read(),this._stream}};JS.default=Oq});var Hq=E(WS=>{"use strict";Object.defineProperty(WS,"__esModule",{value:!0});var b0e=sy(),Ay=oy(),v0e=GS(),Uq=class extends v0e.default{constructor(){super(...arguments);this._scandir=b0e.scandirSync,this._storage=new Set,this._queue=new Set}read(){return this._pushToQueue(this._root,this._settings.basePath),this._handleQueue(),[...this._storage]}_pushToQueue(e,r){this._queue.add({directory:e,base:r})}_handleQueue(){for(let e of this._queue.values())this._handleDirectory(e.directory,e.base)}_handleDirectory(e,r){try{let i=this._scandir(e,this._settings.fsScandirSettings);for(let n of i)this._handleEntry(n,r)}catch(i){this._handleError(i)}}_handleError(e){if(!!Ay.isFatalError(this._settings,e))throw e}_handleEntry(e,r){let i=e.path;r!==void 0&&(e.path=Ay.joinPathSegments(r,e.name,this._settings.pathSegmentSeparator)),Ay.isAppliedFilter(this._settings.entryFilter,e)&&this._pushToStorage(e),e.dirent.isDirectory()&&Ay.isAppliedFilter(this._settings.deepFilter,e)&&this._pushToQueue(i,e.path)}_pushToStorage(e){this._storage.add(e)}};WS.default=Uq});var jq=E(zS=>{"use strict";Object.defineProperty(zS,"__esModule",{value:!0});var S0e=Hq(),Gq=class{constructor(e,r){this._root=e,this._settings=r,this._reader=new S0e.default(this._root,this._settings)}read(){return this._reader.read()}};zS.default=Gq});var qq=E(VS=>{"use strict";Object.defineProperty(VS,"__esModule",{value:!0});var x0e=require("path"),k0e=sy(),Yq=class{constructor(e={}){this._options=e,this.basePath=this._getValue(this._options.basePath,void 0),this.concurrency=this._getValue(this._options.concurrency,Number.POSITIVE_INFINITY),this.deepFilter=this._getValue(this._options.deepFilter,null),this.entryFilter=this._getValue(this._options.entryFilter,null),this.errorFilter=this._getValue(this._options.errorFilter,null),this.pathSegmentSeparator=this._getValue(this._options.pathSegmentSeparator,x0e.sep),this.fsScandirSettings=new k0e.Settings({followSymbolicLinks:this._options.followSymbolicLinks,fs:this._options.fs,pathSegmentSeparator:this._options.pathSegmentSeparator,stats:this._options.stats,throwErrorOnBrokenSymbolicLink:this._options.throwErrorOnBrokenSymbolicLink})}_getValue(e,r){return e!=null?e:r}};VS.default=Yq});var XS=E(mo=>{"use strict";Object.defineProperty(mo,"__esModule",{value:!0});mo.Settings=mo.walkStream=mo.walkSync=mo.walk=void 0;var Jq=Mq(),P0e=Kq(),D0e=jq(),_S=qq();mo.Settings=_S.default;function R0e(t,e,r){if(typeof e=="function"){new Jq.default(t,ly()).read(e);return}new Jq.default(t,ly(e)).read(r)}mo.walk=R0e;function F0e(t,e){let r=ly(e);return new D0e.default(t,r).read()}mo.walkSync=F0e;function N0e(t,e){let r=ly(e);return new P0e.default(t,r).read()}mo.walkStream=N0e;function ly(t={}){return t instanceof _S.default?t:new _S.default(t)}});var $S=E(ZS=>{"use strict";Object.defineProperty(ZS,"__esModule",{value:!0});var L0e=require("path"),T0e=Tl(),Wq=ga(),zq=class{constructor(e){this._settings=e,this._fsStatSettings=new T0e.Settings({followSymbolicLink:this._settings.followSymbolicLinks,fs:this._settings.fs,throwErrorOnBrokenSymbolicLink:this._settings.followSymbolicLinks})}_getFullEntryPath(e){return L0e.resolve(this._settings.cwd,e)}_makeEntry(e,r){let i={name:r,path:r,dirent:Wq.fs.createDirentFromStats(r,e)};return this._settings.stats&&(i.stats=e),i}_isFatalError(e){return!Wq.errno.isEnoentCodeError(e)&&!this._settings.suppressErrors}};ZS.default=zq});var tx=E(ex=>{"use strict";Object.defineProperty(ex,"__esModule",{value:!0});var M0e=require("stream"),O0e=Tl(),K0e=XS(),U0e=$S(),Vq=class extends U0e.default{constructor(){super(...arguments);this._walkStream=K0e.walkStream,this._stat=O0e.stat}dynamic(e,r){return this._walkStream(e,r)}static(e,r){let i=e.map(this._getFullEntryPath,this),n=new M0e.PassThrough({objectMode:!0});n._write=(s,o,a)=>this._getEntry(i[s],e[s],r).then(l=>{l!==null&&r.entryFilter(l)&&n.push(l),s===i.length-1&&n.end(),a()}).catch(a);for(let s=0;sthis._makeEntry(n,r)).catch(n=>{if(i.errorFilter(n))return null;throw n})}_getStat(e){return new Promise((r,i)=>{this._stat(e,this._fsStatSettings,(n,s)=>n===null?r(s):i(n))})}};ex.default=Vq});var Xq=E(rx=>{"use strict";Object.defineProperty(rx,"__esModule",{value:!0});var Ru=ga(),_q=class{constructor(e,r,i){this._patterns=e,this._settings=r,this._micromatchOptions=i,this._storage=[],this._fillStorage()}_fillStorage(){let e=Ru.pattern.expandPatternsWithBraceExpansion(this._patterns);for(let r of e){let i=this._getPatternSegments(r),n=this._splitSegmentsIntoSections(i);this._storage.push({complete:n.length<=1,pattern:r,segments:i,sections:n})}}_getPatternSegments(e){return Ru.pattern.getPatternParts(e,this._micromatchOptions).map(i=>Ru.pattern.isDynamicPattern(i,this._settings)?{dynamic:!0,pattern:i,patternRe:Ru.pattern.makeRe(i,this._micromatchOptions)}:{dynamic:!1,pattern:i})}_splitSegmentsIntoSections(e){return Ru.array.splitWhen(e,r=>r.dynamic&&Ru.pattern.hasGlobStar(r.pattern))}};rx.default=_q});var $q=E(ix=>{"use strict";Object.defineProperty(ix,"__esModule",{value:!0});var H0e=Xq(),Zq=class extends H0e.default{match(e){let r=e.split("/"),i=r.length,n=this._storage.filter(s=>!s.complete||s.segments.length>i);for(let s of n){let o=s.sections[0];if(!s.complete&&i>o.length||r.every((l,c)=>{let u=s.segments[c];return!!(u.dynamic&&u.patternRe.test(l)||!u.dynamic&&u.pattern===l)}))return!0}return!1}};ix.default=Zq});var tJ=E(nx=>{"use strict";Object.defineProperty(nx,"__esModule",{value:!0});var cy=ga(),G0e=$q(),eJ=class{constructor(e,r){this._settings=e,this._micromatchOptions=r}getFilter(e,r,i){let n=this._getMatcher(r),s=this._getNegativePatternsRe(i);return o=>this._filter(e,o,n,s)}_getMatcher(e){return new G0e.default(e,this._settings,this._micromatchOptions)}_getNegativePatternsRe(e){let r=e.filter(cy.pattern.isAffectDepthOfReadingPattern);return cy.pattern.convertPatternsToRe(r,this._micromatchOptions)}_filter(e,r,i,n){let s=this._getEntryLevel(e,r.path);if(this._isSkippedByDeep(s)||this._isSkippedSymbolicLink(r))return!1;let o=cy.path.removeLeadingDotSegment(r.path);return this._isSkippedByPositivePatterns(o,i)?!1:this._isSkippedByNegativePatterns(o,n)}_isSkippedByDeep(e){return e>=this._settings.deep}_isSkippedSymbolicLink(e){return!this._settings.followSymbolicLinks&&e.dirent.isSymbolicLink()}_getEntryLevel(e,r){let i=e.split("/").length;return r.split("/").length-(e===""?0:i)}_isSkippedByPositivePatterns(e,r){return!this._settings.baseNameMatch&&!r.match(e)}_isSkippedByNegativePatterns(e,r){return!cy.pattern.matchAny(e,r)}};nx.default=eJ});var iJ=E(sx=>{"use strict";Object.defineProperty(sx,"__esModule",{value:!0});var ip=ga(),rJ=class{constructor(e,r){this._settings=e,this._micromatchOptions=r,this.index=new Map}getFilter(e,r){let i=ip.pattern.convertPatternsToRe(e,this._micromatchOptions),n=ip.pattern.convertPatternsToRe(r,this._micromatchOptions);return s=>this._filter(s,i,n)}_filter(e,r,i){if(this._settings.unique){if(this._isDuplicateEntry(e))return!1;this._createIndexRecord(e)}if(this._onlyFileFilter(e)||this._onlyDirectoryFilter(e)||this._isSkippedByAbsoluteNegativePatterns(e,i))return!1;let n=this._settings.baseNameMatch?e.name:e.path;return this._isMatchToPatterns(n,r)&&!this._isMatchToPatterns(e.path,i)}_isDuplicateEntry(e){return this.index.has(e.path)}_createIndexRecord(e){this.index.set(e.path,void 0)}_onlyFileFilter(e){return this._settings.onlyFiles&&!e.dirent.isFile()}_onlyDirectoryFilter(e){return this._settings.onlyDirectories&&!e.dirent.isDirectory()}_isSkippedByAbsoluteNegativePatterns(e,r){if(!this._settings.absolute)return!1;let i=ip.path.makeAbsolute(this._settings.cwd,e.path);return this._isMatchToPatterns(i,r)}_isMatchToPatterns(e,r){let i=ip.path.removeLeadingDotSegment(e);return ip.pattern.matchAny(i,r)}};sx.default=rJ});var sJ=E(ox=>{"use strict";Object.defineProperty(ox,"__esModule",{value:!0});var j0e=ga(),nJ=class{constructor(e){this._settings=e}getFilter(){return e=>this._isNonFatalError(e)}_isNonFatalError(e){return j0e.errno.isEnoentCodeError(e)||this._settings.suppressErrors}};ox.default=nJ});var AJ=E(ax=>{"use strict";Object.defineProperty(ax,"__esModule",{value:!0});var oJ=ga(),aJ=class{constructor(e){this._settings=e}getTransformer(){return e=>this._transform(e)}_transform(e){let r=e.path;return this._settings.absolute&&(r=oJ.path.makeAbsolute(this._settings.cwd,r),r=oJ.path.unixify(r)),this._settings.markDirectories&&e.dirent.isDirectory()&&(r+="/"),this._settings.objectMode?Object.assign(Object.assign({},e),{path:r}):r}};ax.default=aJ});var uy=E(Ax=>{"use strict";Object.defineProperty(Ax,"__esModule",{value:!0});var Y0e=require("path"),q0e=tJ(),J0e=iJ(),W0e=sJ(),z0e=AJ(),lJ=class{constructor(e){this._settings=e,this.errorFilter=new W0e.default(this._settings),this.entryFilter=new J0e.default(this._settings,this._getMicromatchOptions()),this.deepFilter=new q0e.default(this._settings,this._getMicromatchOptions()),this.entryTransformer=new z0e.default(this._settings)}_getRootDirectory(e){return Y0e.resolve(this._settings.cwd,e.base)}_getReaderOptions(e){let r=e.base==="."?"":e.base;return{basePath:r,pathSegmentSeparator:"/",concurrency:this._settings.concurrency,deepFilter:this.deepFilter.getFilter(r,e.positive,e.negative),entryFilter:this.entryFilter.getFilter(e.positive,e.negative),errorFilter:this.errorFilter.getFilter(),followSymbolicLinks:this._settings.followSymbolicLinks,fs:this._settings.fs,stats:this._settings.stats,throwErrorOnBrokenSymbolicLink:this._settings.throwErrorOnBrokenSymbolicLink,transform:this.entryTransformer.getTransformer()}}_getMicromatchOptions(){return{dot:this._settings.dot,matchBase:this._settings.baseNameMatch,nobrace:!this._settings.braceExpansion,nocase:!this._settings.caseSensitiveMatch,noext:!this._settings.extglob,noglobstar:!this._settings.globstar,posix:!0,strictSlashes:!1}}};Ax.default=lJ});var uJ=E(lx=>{"use strict";Object.defineProperty(lx,"__esModule",{value:!0});var V0e=tx(),_0e=uy(),cJ=class extends _0e.default{constructor(){super(...arguments);this._reader=new V0e.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=[];return new Promise((s,o)=>{let a=this.api(r,e,i);a.once("error",o),a.on("data",l=>n.push(i.transform(l))),a.once("end",()=>s(n))})}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};lx.default=cJ});var fJ=E(cx=>{"use strict";Object.defineProperty(cx,"__esModule",{value:!0});var X0e=require("stream"),Z0e=tx(),$0e=uy(),gJ=class extends $0e.default{constructor(){super(...arguments);this._reader=new Z0e.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e),n=this.api(r,e,i),s=new X0e.Readable({objectMode:!0,read:()=>{}});return n.once("error",o=>s.emit("error",o)).on("data",o=>s.emit("data",i.transform(o))).once("end",()=>s.emit("end")),s.once("close",()=>n.destroy()),s}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};cx.default=gJ});var pJ=E(ux=>{"use strict";Object.defineProperty(ux,"__esModule",{value:!0});var eQe=Tl(),tQe=XS(),rQe=$S(),hJ=class extends rQe.default{constructor(){super(...arguments);this._walkSync=tQe.walkSync,this._statSync=eQe.statSync}dynamic(e,r){return this._walkSync(e,r)}static(e,r){let i=[];for(let n of e){let s=this._getFullEntryPath(n),o=this._getEntry(s,n,r);o===null||!r.entryFilter(o)||i.push(o)}return i}_getEntry(e,r,i){try{let n=this._getStat(e);return this._makeEntry(n,r)}catch(n){if(i.errorFilter(n))return null;throw n}}_getStat(e){return this._statSync(e,this._fsStatSettings)}};ux.default=hJ});var CJ=E(gx=>{"use strict";Object.defineProperty(gx,"__esModule",{value:!0});var iQe=pJ(),nQe=uy(),dJ=class extends nQe.default{constructor(){super(...arguments);this._reader=new iQe.default(this._settings)}read(e){let r=this._getRootDirectory(e),i=this._getReaderOptions(e);return this.api(r,e,i).map(i.transform)}api(e,r,i){return r.dynamic?this._reader.dynamic(e,i):this._reader.static(r.patterns,i)}};gx.default=dJ});var EJ=E(np=>{"use strict";Object.defineProperty(np,"__esModule",{value:!0});var Fu=require("fs"),sQe=require("os"),oQe=sQe.cpus().length;np.DEFAULT_FILE_SYSTEM_ADAPTER={lstat:Fu.lstat,lstatSync:Fu.lstatSync,stat:Fu.stat,statSync:Fu.statSync,readdir:Fu.readdir,readdirSync:Fu.readdirSync};var mJ=class{constructor(e={}){this._options=e,this.absolute=this._getValue(this._options.absolute,!1),this.baseNameMatch=this._getValue(this._options.baseNameMatch,!1),this.braceExpansion=this._getValue(this._options.braceExpansion,!0),this.caseSensitiveMatch=this._getValue(this._options.caseSensitiveMatch,!0),this.concurrency=this._getValue(this._options.concurrency,oQe),this.cwd=this._getValue(this._options.cwd,process.cwd()),this.deep=this._getValue(this._options.deep,Infinity),this.dot=this._getValue(this._options.dot,!1),this.extglob=this._getValue(this._options.extglob,!0),this.followSymbolicLinks=this._getValue(this._options.followSymbolicLinks,!0),this.fs=this._getFileSystemMethods(this._options.fs),this.globstar=this._getValue(this._options.globstar,!0),this.ignore=this._getValue(this._options.ignore,[]),this.markDirectories=this._getValue(this._options.markDirectories,!1),this.objectMode=this._getValue(this._options.objectMode,!1),this.onlyDirectories=this._getValue(this._options.onlyDirectories,!1),this.onlyFiles=this._getValue(this._options.onlyFiles,!0),this.stats=this._getValue(this._options.stats,!1),this.suppressErrors=this._getValue(this._options.suppressErrors,!1),this.throwErrorOnBrokenSymbolicLink=this._getValue(this._options.throwErrorOnBrokenSymbolicLink,!1),this.unique=this._getValue(this._options.unique,!0),this.onlyDirectories&&(this.onlyFiles=!1),this.stats&&(this.objectMode=!0)}_getValue(e,r){return e===void 0?r:e}_getFileSystemMethods(e={}){return Object.assign(Object.assign({},np.DEFAULT_FILE_SYSTEM_ADAPTER),e)}};np.default=mJ});var gy=E((Oit,IJ)=>{"use strict";var yJ=tq(),aQe=uJ(),AQe=fJ(),lQe=CJ(),fx=EJ(),Ml=ga();async function px(t,e){Nu(t);let r=hx(t,aQe.default,e),i=await Promise.all(r);return Ml.array.flatten(i)}(function(t){function e(o,a){Nu(o);let l=hx(o,lQe.default,a);return Ml.array.flatten(l)}t.sync=e;function r(o,a){Nu(o);let l=hx(o,AQe.default,a);return Ml.stream.merge(l)}t.stream=r;function i(o,a){Nu(o);let l=[].concat(o),c=new fx.default(a);return yJ.generate(l,c)}t.generateTasks=i;function n(o,a){Nu(o);let l=new fx.default(a);return Ml.pattern.isDynamicPattern(o,l)}t.isDynamicPattern=n;function s(o){return Nu(o),Ml.path.escape(o)}t.escapePath=s})(px||(px={}));function hx(t,e,r){let i=[].concat(t),n=new fx.default(r),s=yJ.generate(i,n),o=new e(n);return s.map(o.read,o)}function Nu(t){if(![].concat(t).every(i=>Ml.string.isString(i)&&!Ml.string.isEmpty(i)))throw new TypeError("Patterns must be a string (non empty) or an array of strings")}IJ.exports=px});var BJ=E(Ol=>{"use strict";var{promisify:cQe}=require("util"),wJ=require("fs");async function dx(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return(await cQe(wJ[t])(r))[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}function Cx(t,e,r){if(typeof r!="string")throw new TypeError(`Expected a string, got ${typeof r}`);try{return wJ[t](r)[e]()}catch(i){if(i.code==="ENOENT")return!1;throw i}}Ol.isFile=dx.bind(null,"stat","isFile");Ol.isDirectory=dx.bind(null,"stat","isDirectory");Ol.isSymlink=dx.bind(null,"lstat","isSymbolicLink");Ol.isFileSync=Cx.bind(null,"statSync","isFile");Ol.isDirectorySync=Cx.bind(null,"statSync","isDirectory");Ol.isSymlinkSync=Cx.bind(null,"lstatSync","isSymbolicLink")});var xJ=E((Uit,mx)=>{"use strict";var Kl=require("path"),QJ=BJ(),bJ=t=>t.length>1?`{${t.join(",")}}`:t[0],vJ=(t,e)=>{let r=t[0]==="!"?t.slice(1):t;return Kl.isAbsolute(r)?r:Kl.join(e,r)},uQe=(t,e)=>Kl.extname(t)?`**/${t}`:`**/${t}.${bJ(e)}`,SJ=(t,e)=>{if(e.files&&!Array.isArray(e.files))throw new TypeError(`Expected \`files\` to be of type \`Array\` but received type \`${typeof e.files}\``);if(e.extensions&&!Array.isArray(e.extensions))throw new TypeError(`Expected \`extensions\` to be of type \`Array\` but received type \`${typeof e.extensions}\``);return e.files&&e.extensions?e.files.map(r=>Kl.posix.join(t,uQe(r,e.extensions))):e.files?e.files.map(r=>Kl.posix.join(t,`**/${r}`)):e.extensions?[Kl.posix.join(t,`**/*.${bJ(e.extensions)}`)]:[Kl.posix.join(t,"**")]};mx.exports=async(t,e)=>{if(e=P({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=await Promise.all([].concat(t).map(async i=>await QJ.isDirectory(vJ(i,e.cwd))?SJ(i,e):i));return[].concat.apply([],r)};mx.exports.sync=(t,e)=>{if(e=P({cwd:process.cwd()},e),typeof e.cwd!="string")throw new TypeError(`Expected \`cwd\` to be of type \`string\` but received type \`${typeof e.cwd}\``);let r=[].concat(t).map(i=>QJ.isDirectorySync(vJ(i,e.cwd))?SJ(i,e):i);return[].concat.apply([],r)}});var TJ=E((Hit,kJ)=>{function PJ(t){return Array.isArray(t)?t:[t]}var gQe=/^\s+$/,fQe=/^\\!/,hQe=/^\\#/,pQe=/\r?\n/g,dQe=/^\.*\/|^\.+$/,Ex="/",DJ=typeof Symbol!="undefined"?Symbol.for("node-ignore"):"node-ignore",CQe=(t,e,r)=>Object.defineProperty(t,e,{value:r}),mQe=/([0-z])-([0-z])/g,EQe=t=>t.replace(mQe,(e,r,i)=>r.charCodeAt(0)<=i.charCodeAt(0)?e:""),IQe=[[/\\?\s+$/,t=>t.indexOf("\\")===0?" ":""],[/\\\s/g,()=>" "],[/[\\^$.|*+(){]/g,t=>`\\${t}`],[/\[([^\]/]*)($|\])/g,(t,e,r)=>r==="]"?`[${EQe(e)}]`:`\\${t}`],[/(?!\\)\?/g,()=>"[^/]"],[/^\//,()=>"^"],[/\//g,()=>"\\/"],[/^\^*\\\*\\\*\\\//,()=>"^(?:.*\\/)?"],[/(?:[^*])$/,t=>/\/$/.test(t)?`${t}$`:`${t}(?=$|\\/$)`],[/^(?=[^^])/,function(){return/\/(?!$)/.test(this)?"^":"(?:^|\\/)"}],[/\\\/\\\*\\\*(?=\\\/|$)/g,(t,e,r)=>e+6`${e}[^\\/]*`],[/(\^|\\\/)?\\\*$/,(t,e)=>`${e?`${e}[^/]+`:"[^/]*"}(?=$|\\/$)`],[/\\\\\\/g,()=>"\\"]],RJ=Object.create(null),yQe=(t,e,r)=>{let i=RJ[t];if(i)return i;let n=IQe.reduce((s,o)=>s.replace(o[0],o[1].bind(t)),t);return RJ[t]=r?new RegExp(n,"i"):new RegExp(n)},Ix=t=>typeof t=="string",wQe=t=>t&&Ix(t)&&!gQe.test(t)&&t.indexOf("#")!==0,BQe=t=>t.split(pQe),FJ=class{constructor(e,r,i,n){this.origin=e,this.pattern=r,this.negative=i,this.regex=n}},QQe=(t,e)=>{let r=t,i=!1;t.indexOf("!")===0&&(i=!0,t=t.substr(1)),t=t.replace(fQe,"!").replace(hQe,"#");let n=yQe(t,i,e);return new FJ(r,t,i,n)},bQe=(t,e)=>{throw new e(t)},ha=(t,e,r)=>Ix(t)?t?ha.isNotRelative(t)?r(`path should be a \`path.relative()\`d string, but got "${e}"`,RangeError):!0:r("path must not be empty",TypeError):r(`path must be a string, but got \`${e}\``,TypeError),NJ=t=>dQe.test(t);ha.isNotRelative=NJ;ha.convert=t=>t;var LJ=class{constructor({ignorecase:e=!0}={}){this._rules=[],this._ignorecase=e,CQe(this,DJ,!0),this._initCache()}_initCache(){this._ignoreCache=Object.create(null),this._testCache=Object.create(null)}_addPattern(e){if(e&&e[DJ]){this._rules=this._rules.concat(e._rules),this._added=!0;return}if(wQe(e)){let r=QQe(e,this._ignorecase);this._added=!0,this._rules.push(r)}}add(e){return this._added=!1,PJ(Ix(e)?BQe(e):e).forEach(this._addPattern,this),this._added&&this._initCache(),this}addPattern(e){return this.add(e)}_testOne(e,r){let i=!1,n=!1;return this._rules.forEach(s=>{let{negative:o}=s;if(n===o&&i!==n||o&&!i&&!n&&!r)return;s.regex.test(e)&&(i=!o,n=o)}),{ignored:i,unignored:n}}_test(e,r,i,n){let s=e&&ha.convert(e);return ha(s,e,bQe),this._t(s,r,i,n)}_t(e,r,i,n){if(e in r)return r[e];if(n||(n=e.split(Ex)),n.pop(),!n.length)return r[e]=this._testOne(e,i);let s=this._t(n.join(Ex)+Ex,r,i,n);return r[e]=s.ignored?s:this._testOne(e,i)}ignores(e){return this._test(e,this._ignoreCache,!1).ignored}createFilter(){return e=>!this.ignores(e)}filter(e){return PJ(e).filter(this.createFilter())}test(e){return this._test(e,this._testCache,!0)}},fy=t=>new LJ(t),vQe=()=>!1,SQe=t=>ha(t&&ha.convert(t),t,vQe);fy.isPathValid=SQe;fy.default=fy;kJ.exports=fy;if(typeof process!="undefined"&&(process.env&&process.env.IGNORE_TEST_WIN32||process.platform==="win32")){let t=r=>/^\\\\\?\\/.test(r)||/["<>|\u0000-\u001F]+/u.test(r)?r:r.replace(/\\/g,"/");ha.convert=t;let e=/^[a-z]:\//i;ha.isNotRelative=r=>e.test(r)||NJ(r)}});var OJ=E((Git,MJ)=>{"use strict";MJ.exports=t=>{let e=/^\\\\\?\\/.test(t),r=/[^\u0000-\u0080]+/.test(t);return e||r?t:t.replace(/\\/g,"/")}});var qJ=E((jit,yx)=>{"use strict";var{promisify:xQe}=require("util"),KJ=require("fs"),pa=require("path"),UJ=gy(),kQe=TJ(),sp=OJ(),HJ=["**/node_modules/**","**/flow-typed/**","**/coverage/**","**/.git"],PQe=xQe(KJ.readFile),DQe=t=>e=>e.startsWith("!")?"!"+pa.posix.join(t,e.slice(1)):pa.posix.join(t,e),RQe=(t,e)=>{let r=sp(pa.relative(e.cwd,pa.dirname(e.fileName)));return t.split(/\r?\n/).filter(Boolean).filter(i=>!i.startsWith("#")).map(DQe(r))},GJ=t=>{let e=kQe();for(let r of t)e.add(RQe(r.content,{cwd:r.cwd,fileName:r.filePath}));return e},FQe=(t,e)=>{if(t=sp(t),pa.isAbsolute(e)){if(sp(e).startsWith(t))return e;throw new Error(`Path ${e} is not in cwd ${t}`)}return pa.join(t,e)},jJ=(t,e)=>r=>t.ignores(sp(pa.relative(e,FQe(e,r.path||r)))),NQe=async(t,e)=>{let r=pa.join(e,t),i=await PQe(r,"utf8");return{cwd:e,filePath:r,content:i}},LQe=(t,e)=>{let r=pa.join(e,t),i=KJ.readFileSync(r,"utf8");return{cwd:e,filePath:r,content:i}},YJ=({ignore:t=[],cwd:e=sp(process.cwd())}={})=>({ignore:t,cwd:e});yx.exports=async t=>{t=YJ(t);let e=await UJ("**/.gitignore",{ignore:HJ.concat(t.ignore),cwd:t.cwd}),r=await Promise.all(e.map(n=>NQe(n,t.cwd))),i=GJ(r);return jJ(i,t.cwd)};yx.exports.sync=t=>{t=YJ(t);let r=UJ.sync("**/.gitignore",{ignore:HJ.concat(t.ignore),cwd:t.cwd}).map(n=>LQe(n,t.cwd)),i=GJ(r);return jJ(i,t.cwd)}});var VJ=E((Yit,JJ)=>{"use strict";var{Transform:TQe}=require("stream"),wx=class extends TQe{constructor(){super({objectMode:!0})}},WJ=class extends wx{constructor(e){super();this._filter=e}_transform(e,r,i){this._filter(e)&&this.push(e),i()}},zJ=class extends wx{constructor(){super();this._pushed=new Set}_transform(e,r,i){this._pushed.has(e)||(this.push(e),this._pushed.add(e)),i()}};JJ.exports={FilterStream:WJ,UniqueStream:zJ}});var vx=E((qit,Ul)=>{"use strict";var _J=require("fs"),hy=QY(),MQe=wS(),py=gy(),dy=xJ(),Bx=qJ(),{FilterStream:OQe,UniqueStream:KQe}=VJ(),XJ=()=>!1,ZJ=t=>t[0]==="!",UQe=t=>{if(!t.every(e=>typeof e=="string"))throw new TypeError("Patterns must be a string or an array of strings")},HQe=(t={})=>{if(!t.cwd)return;let e;try{e=_J.statSync(t.cwd)}catch{return}if(!e.isDirectory())throw new Error("The `cwd` option must be a path to a directory")},GQe=t=>t.stats instanceof _J.Stats?t.path:t,Cy=(t,e)=>{t=hy([].concat(t)),UQe(t),HQe(e);let r=[];e=P({ignore:[],expandDirectories:!0},e);for(let[i,n]of t.entries()){if(ZJ(n))continue;let s=t.slice(i).filter(a=>ZJ(a)).map(a=>a.slice(1)),o=_(P({},e),{ignore:e.ignore.concat(s)});r.push({pattern:n,options:o})}return r},jQe=(t,e)=>{let r={};return t.options.cwd&&(r.cwd=t.options.cwd),Array.isArray(t.options.expandDirectories)?r=_(P({},r),{files:t.options.expandDirectories}):typeof t.options.expandDirectories=="object"&&(r=P(P({},r),t.options.expandDirectories)),e(t.pattern,r)},Qx=(t,e)=>t.options.expandDirectories?jQe(t,e):[t.pattern],$J=t=>t&&t.gitignore?Bx.sync({cwd:t.cwd,ignore:t.ignore}):XJ,bx=t=>e=>{let{options:r}=t;return r.ignore&&Array.isArray(r.ignore)&&r.expandDirectories&&(r.ignore=dy.sync(r.ignore)),{pattern:e,options:r}};Ul.exports=async(t,e)=>{let r=Cy(t,e),i=async()=>e&&e.gitignore?Bx({cwd:e.cwd,ignore:e.ignore}):XJ,n=async()=>{let l=await Promise.all(r.map(async c=>{let u=await Qx(c,dy);return Promise.all(u.map(bx(c)))}));return hy(...l)},[s,o]=await Promise.all([i(),n()]),a=await Promise.all(o.map(l=>py(l.pattern,l.options)));return hy(...a).filter(l=>!s(GQe(l)))};Ul.exports.sync=(t,e)=>{let r=Cy(t,e),i=[];for(let o of r){let a=Qx(o,dy.sync).map(bx(o));i.push(...a)}let n=$J(e),s=[];for(let o of i)s=hy(s,py.sync(o.pattern,o.options));return s.filter(o=>!n(o))};Ul.exports.stream=(t,e)=>{let r=Cy(t,e),i=[];for(let a of r){let l=Qx(a,dy.sync).map(bx(a));i.push(...l)}let n=$J(e),s=new OQe(a=>!n(a)),o=new KQe;return MQe(i.map(a=>py.stream(a.pattern,a.options))).pipe(s).pipe(o)};Ul.exports.generateGlobTasks=Cy;Ul.exports.hasMagic=(t,e)=>[].concat(t).some(r=>py.isDynamicPattern(r,e));Ul.exports.gitignore=Bx});var Ca=E((da,Dy)=>{"use strict";Object.defineProperty(da,"__esModule",{value:!0});var A3=["Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","BigInt64Array","BigUint64Array"];function ibe(t){return A3.includes(t)}var nbe=["Function","Generator","AsyncGenerator","GeneratorFunction","AsyncGeneratorFunction","AsyncFunction","Observable","Array","Buffer","Object","RegExp","Date","Error","Map","Set","WeakMap","WeakSet","ArrayBuffer","SharedArrayBuffer","DataView","Promise","URL","FormData","URLSearchParams","HTMLElement",...A3];function sbe(t){return nbe.includes(t)}var obe=["null","undefined","string","number","bigint","boolean","symbol"];function abe(t){return obe.includes(t)}function Hu(t){return e=>typeof e===t}var{toString:l3}=Object.prototype,mp=t=>{let e=l3.call(t).slice(8,-1);if(/HTML\w+Element/.test(e)&&j.domElement(t))return"HTMLElement";if(sbe(e))return e},er=t=>e=>mp(e)===t;function j(t){if(t===null)return"null";switch(typeof t){case"undefined":return"undefined";case"string":return"string";case"number":return"number";case"boolean":return"boolean";case"function":return"Function";case"bigint":return"bigint";case"symbol":return"symbol";default:}if(j.observable(t))return"Observable";if(j.array(t))return"Array";if(j.buffer(t))return"Buffer";let e=mp(t);if(e)return e;if(t instanceof String||t instanceof Boolean||t instanceof Number)throw new TypeError("Please don't use object wrappers for primitive types");return"Object"}j.undefined=Hu("undefined");j.string=Hu("string");var Abe=Hu("number");j.number=t=>Abe(t)&&!j.nan(t);j.bigint=Hu("bigint");j.function_=Hu("function");j.null_=t=>t===null;j.class_=t=>j.function_(t)&&t.toString().startsWith("class ");j.boolean=t=>t===!0||t===!1;j.symbol=Hu("symbol");j.numericString=t=>j.string(t)&&!j.emptyStringOrWhitespace(t)&&!Number.isNaN(Number(t));j.array=(t,e)=>Array.isArray(t)?j.function_(e)?t.every(e):!0:!1;j.buffer=t=>{var e,r,i,n;return(n=(i=(r=(e=t)===null||e===void 0?void 0:e.constructor)===null||r===void 0?void 0:r.isBuffer)===null||i===void 0?void 0:i.call(r,t))!==null&&n!==void 0?n:!1};j.nullOrUndefined=t=>j.null_(t)||j.undefined(t);j.object=t=>!j.null_(t)&&(typeof t=="object"||j.function_(t));j.iterable=t=>{var e;return j.function_((e=t)===null||e===void 0?void 0:e[Symbol.iterator])};j.asyncIterable=t=>{var e;return j.function_((e=t)===null||e===void 0?void 0:e[Symbol.asyncIterator])};j.generator=t=>j.iterable(t)&&j.function_(t.next)&&j.function_(t.throw);j.asyncGenerator=t=>j.asyncIterable(t)&&j.function_(t.next)&&j.function_(t.throw);j.nativePromise=t=>er("Promise")(t);var lbe=t=>{var e,r;return j.function_((e=t)===null||e===void 0?void 0:e.then)&&j.function_((r=t)===null||r===void 0?void 0:r.catch)};j.promise=t=>j.nativePromise(t)||lbe(t);j.generatorFunction=er("GeneratorFunction");j.asyncGeneratorFunction=t=>mp(t)==="AsyncGeneratorFunction";j.asyncFunction=t=>mp(t)==="AsyncFunction";j.boundFunction=t=>j.function_(t)&&!t.hasOwnProperty("prototype");j.regExp=er("RegExp");j.date=er("Date");j.error=er("Error");j.map=t=>er("Map")(t);j.set=t=>er("Set")(t);j.weakMap=t=>er("WeakMap")(t);j.weakSet=t=>er("WeakSet")(t);j.int8Array=er("Int8Array");j.uint8Array=er("Uint8Array");j.uint8ClampedArray=er("Uint8ClampedArray");j.int16Array=er("Int16Array");j.uint16Array=er("Uint16Array");j.int32Array=er("Int32Array");j.uint32Array=er("Uint32Array");j.float32Array=er("Float32Array");j.float64Array=er("Float64Array");j.bigInt64Array=er("BigInt64Array");j.bigUint64Array=er("BigUint64Array");j.arrayBuffer=er("ArrayBuffer");j.sharedArrayBuffer=er("SharedArrayBuffer");j.dataView=er("DataView");j.directInstanceOf=(t,e)=>Object.getPrototypeOf(t)===e.prototype;j.urlInstance=t=>er("URL")(t);j.urlString=t=>{if(!j.string(t))return!1;try{return new URL(t),!0}catch(e){return!1}};j.truthy=t=>Boolean(t);j.falsy=t=>!t;j.nan=t=>Number.isNaN(t);j.primitive=t=>j.null_(t)||abe(typeof t);j.integer=t=>Number.isInteger(t);j.safeInteger=t=>Number.isSafeInteger(t);j.plainObject=t=>{if(l3.call(t)!=="[object Object]")return!1;let e=Object.getPrototypeOf(t);return e===null||e===Object.getPrototypeOf({})};j.typedArray=t=>ibe(mp(t));var cbe=t=>j.safeInteger(t)&&t>=0;j.arrayLike=t=>!j.nullOrUndefined(t)&&!j.function_(t)&&cbe(t.length);j.inRange=(t,e)=>{if(j.number(e))return t>=Math.min(0,e)&&t<=Math.max(e,0);if(j.array(e)&&e.length===2)return t>=Math.min(...e)&&t<=Math.max(...e);throw new TypeError(`Invalid range: ${JSON.stringify(e)}`)};var ube=1,gbe=["innerHTML","ownerDocument","style","attributes","nodeValue"];j.domElement=t=>j.object(t)&&t.nodeType===ube&&j.string(t.nodeName)&&!j.plainObject(t)&&gbe.every(e=>e in t);j.observable=t=>{var e,r,i,n;return t?t===((r=(e=t)[Symbol.observable])===null||r===void 0?void 0:r.call(e))||t===((n=(i=t)["@@observable"])===null||n===void 0?void 0:n.call(i)):!1};j.nodeStream=t=>j.object(t)&&j.function_(t.pipe)&&!j.observable(t);j.infinite=t=>t===Infinity||t===-Infinity;var c3=t=>e=>j.integer(e)&&Math.abs(e%2)===t;j.evenInteger=c3(0);j.oddInteger=c3(1);j.emptyArray=t=>j.array(t)&&t.length===0;j.nonEmptyArray=t=>j.array(t)&&t.length>0;j.emptyString=t=>j.string(t)&&t.length===0;j.nonEmptyString=t=>j.string(t)&&t.length>0;var fbe=t=>j.string(t)&&!/\S/.test(t);j.emptyStringOrWhitespace=t=>j.emptyString(t)||fbe(t);j.emptyObject=t=>j.object(t)&&!j.map(t)&&!j.set(t)&&Object.keys(t).length===0;j.nonEmptyObject=t=>j.object(t)&&!j.map(t)&&!j.set(t)&&Object.keys(t).length>0;j.emptySet=t=>j.set(t)&&t.size===0;j.nonEmptySet=t=>j.set(t)&&t.size>0;j.emptyMap=t=>j.map(t)&&t.size===0;j.nonEmptyMap=t=>j.map(t)&&t.size>0;j.propertyKey=t=>j.any([j.string,j.number,j.symbol],t);j.formData=t=>er("FormData")(t);j.urlSearchParams=t=>er("URLSearchParams")(t);var u3=(t,e,r)=>{if(!j.function_(e))throw new TypeError(`Invalid predicate: ${JSON.stringify(e)}`);if(r.length===0)throw new TypeError("Invalid number of values");return t.call(r,e)};j.any=(t,...e)=>(j.array(t)?t:[t]).some(i=>u3(Array.prototype.some,i,e));j.all=(t,...e)=>u3(Array.prototype.every,t,e);var Te=(t,e,r,i={})=>{if(!t){let{multipleValues:n}=i,s=n?`received values of types ${[...new Set(r.map(o=>`\`${j(o)}\``))].join(", ")}`:`received value of type \`${j(r)}\``;throw new TypeError(`Expected value which is \`${e}\`, ${s}.`)}};da.assert={undefined:t=>Te(j.undefined(t),"undefined",t),string:t=>Te(j.string(t),"string",t),number:t=>Te(j.number(t),"number",t),bigint:t=>Te(j.bigint(t),"bigint",t),function_:t=>Te(j.function_(t),"Function",t),null_:t=>Te(j.null_(t),"null",t),class_:t=>Te(j.class_(t),"Class",t),boolean:t=>Te(j.boolean(t),"boolean",t),symbol:t=>Te(j.symbol(t),"symbol",t),numericString:t=>Te(j.numericString(t),"string with a number",t),array:(t,e)=>{Te(j.array(t),"Array",t),e&&t.forEach(e)},buffer:t=>Te(j.buffer(t),"Buffer",t),nullOrUndefined:t=>Te(j.nullOrUndefined(t),"null or undefined",t),object:t=>Te(j.object(t),"Object",t),iterable:t=>Te(j.iterable(t),"Iterable",t),asyncIterable:t=>Te(j.asyncIterable(t),"AsyncIterable",t),generator:t=>Te(j.generator(t),"Generator",t),asyncGenerator:t=>Te(j.asyncGenerator(t),"AsyncGenerator",t),nativePromise:t=>Te(j.nativePromise(t),"native Promise",t),promise:t=>Te(j.promise(t),"Promise",t),generatorFunction:t=>Te(j.generatorFunction(t),"GeneratorFunction",t),asyncGeneratorFunction:t=>Te(j.asyncGeneratorFunction(t),"AsyncGeneratorFunction",t),asyncFunction:t=>Te(j.asyncFunction(t),"AsyncFunction",t),boundFunction:t=>Te(j.boundFunction(t),"Function",t),regExp:t=>Te(j.regExp(t),"RegExp",t),date:t=>Te(j.date(t),"Date",t),error:t=>Te(j.error(t),"Error",t),map:t=>Te(j.map(t),"Map",t),set:t=>Te(j.set(t),"Set",t),weakMap:t=>Te(j.weakMap(t),"WeakMap",t),weakSet:t=>Te(j.weakSet(t),"WeakSet",t),int8Array:t=>Te(j.int8Array(t),"Int8Array",t),uint8Array:t=>Te(j.uint8Array(t),"Uint8Array",t),uint8ClampedArray:t=>Te(j.uint8ClampedArray(t),"Uint8ClampedArray",t),int16Array:t=>Te(j.int16Array(t),"Int16Array",t),uint16Array:t=>Te(j.uint16Array(t),"Uint16Array",t),int32Array:t=>Te(j.int32Array(t),"Int32Array",t),uint32Array:t=>Te(j.uint32Array(t),"Uint32Array",t),float32Array:t=>Te(j.float32Array(t),"Float32Array",t),float64Array:t=>Te(j.float64Array(t),"Float64Array",t),bigInt64Array:t=>Te(j.bigInt64Array(t),"BigInt64Array",t),bigUint64Array:t=>Te(j.bigUint64Array(t),"BigUint64Array",t),arrayBuffer:t=>Te(j.arrayBuffer(t),"ArrayBuffer",t),sharedArrayBuffer:t=>Te(j.sharedArrayBuffer(t),"SharedArrayBuffer",t),dataView:t=>Te(j.dataView(t),"DataView",t),urlInstance:t=>Te(j.urlInstance(t),"URL",t),urlString:t=>Te(j.urlString(t),"string with a URL",t),truthy:t=>Te(j.truthy(t),"truthy",t),falsy:t=>Te(j.falsy(t),"falsy",t),nan:t=>Te(j.nan(t),"NaN",t),primitive:t=>Te(j.primitive(t),"primitive",t),integer:t=>Te(j.integer(t),"integer",t),safeInteger:t=>Te(j.safeInteger(t),"integer",t),plainObject:t=>Te(j.plainObject(t),"plain object",t),typedArray:t=>Te(j.typedArray(t),"TypedArray",t),arrayLike:t=>Te(j.arrayLike(t),"array-like",t),domElement:t=>Te(j.domElement(t),"HTMLElement",t),observable:t=>Te(j.observable(t),"Observable",t),nodeStream:t=>Te(j.nodeStream(t),"Node.js Stream",t),infinite:t=>Te(j.infinite(t),"infinite number",t),emptyArray:t=>Te(j.emptyArray(t),"empty array",t),nonEmptyArray:t=>Te(j.nonEmptyArray(t),"non-empty array",t),emptyString:t=>Te(j.emptyString(t),"empty string",t),nonEmptyString:t=>Te(j.nonEmptyString(t),"non-empty string",t),emptyStringOrWhitespace:t=>Te(j.emptyStringOrWhitespace(t),"empty string or whitespace",t),emptyObject:t=>Te(j.emptyObject(t),"empty object",t),nonEmptyObject:t=>Te(j.nonEmptyObject(t),"non-empty object",t),emptySet:t=>Te(j.emptySet(t),"empty set",t),nonEmptySet:t=>Te(j.nonEmptySet(t),"non-empty set",t),emptyMap:t=>Te(j.emptyMap(t),"empty map",t),nonEmptyMap:t=>Te(j.nonEmptyMap(t),"non-empty map",t),propertyKey:t=>Te(j.propertyKey(t),"PropertyKey",t),formData:t=>Te(j.formData(t),"FormData",t),urlSearchParams:t=>Te(j.urlSearchParams(t),"URLSearchParams",t),evenInteger:t=>Te(j.evenInteger(t),"even integer",t),oddInteger:t=>Te(j.oddInteger(t),"odd integer",t),directInstanceOf:(t,e)=>Te(j.directInstanceOf(t,e),"T",t),inRange:(t,e)=>Te(j.inRange(t,e),"in range",t),any:(t,...e)=>Te(j.any(t,...e),"predicate returns truthy for any value",e,{multipleValues:!0}),all:(t,...e)=>Te(j.all(t,...e),"predicate returns truthy for all values",e,{multipleValues:!0})};Object.defineProperties(j,{class:{value:j.class_},function:{value:j.function_},null:{value:j.null_}});Object.defineProperties(da.assert,{class:{value:da.assert.class_},function:{value:da.assert.function_},null:{value:da.assert.null_}});da.default=j;Dy.exports=j;Dy.exports.default=j;Dy.exports.assert=da.assert});var g3=E((gnt,Ux)=>{"use strict";var Hx=class extends Error{constructor(e){super(e||"Promise was canceled");this.name="CancelError"}get isCanceled(){return!0}},Ep=class{static fn(e){return(...r)=>new Ep((i,n,s)=>{r.push(s),e(...r).then(i,n)})}constructor(e){this._cancelHandlers=[],this._isPending=!0,this._isCanceled=!1,this._rejectOnCancel=!0,this._promise=new Promise((r,i)=>{this._reject=i;let n=a=>{this._isPending=!1,r(a)},s=a=>{this._isPending=!1,i(a)},o=a=>{if(!this._isPending)throw new Error("The `onCancel` handler was attached after the promise settled.");this._cancelHandlers.push(a)};return Object.defineProperties(o,{shouldReject:{get:()=>this._rejectOnCancel,set:a=>{this._rejectOnCancel=a}}}),e(n,s,o)})}then(e,r){return this._promise.then(e,r)}catch(e){return this._promise.catch(e)}finally(e){return this._promise.finally(e)}cancel(e){if(!(!this._isPending||this._isCanceled)){if(this._cancelHandlers.length>0)try{for(let r of this._cancelHandlers)r()}catch(r){this._reject(r)}this._isCanceled=!0,this._rejectOnCancel&&this._reject(new Hx(e))}}get isCanceled(){return this._isCanceled}};Object.setPrototypeOf(Ep.prototype,Promise.prototype);Ux.exports=Ep;Ux.exports.CancelError=Hx});var f3=E((Gx,jx)=>{"use strict";Object.defineProperty(Gx,"__esModule",{value:!0});var hbe=require("tls"),Yx=(t,e)=>{let r;typeof e=="function"?r={connect:e}:r=e;let i=typeof r.connect=="function",n=typeof r.secureConnect=="function",s=typeof r.close=="function",o=()=>{i&&r.connect(),t instanceof hbe.TLSSocket&&n&&(t.authorized?r.secureConnect():t.authorizationError||t.once("secureConnect",r.secureConnect)),s&&t.once("close",r.close)};t.writable&&!t.connecting?o():t.connecting?t.once("connect",o):t.destroyed&&s&&r.close(t._hadError)};Gx.default=Yx;jx.exports=Yx;jx.exports.default=Yx});var h3=E((qx,Jx)=>{"use strict";Object.defineProperty(qx,"__esModule",{value:!0});var pbe=f3(),dbe=Number(process.versions.node.split(".")[0]),Wx=t=>{let e={start:Date.now(),socket:void 0,lookup:void 0,connect:void 0,secureConnect:void 0,upload:void 0,response:void 0,end:void 0,error:void 0,abort:void 0,phases:{wait:void 0,dns:void 0,tcp:void 0,tls:void 0,request:void 0,firstByte:void 0,download:void 0,total:void 0}};t.timings=e;let r=o=>{let a=o.emit.bind(o);o.emit=(l,...c)=>(l==="error"&&(e.error=Date.now(),e.phases.total=e.error-e.start,o.emit=a),a(l,...c))};r(t),t.prependOnceListener("abort",()=>{e.abort=Date.now(),(!e.response||dbe>=13)&&(e.phases.total=Date.now()-e.start)});let i=o=>{e.socket=Date.now(),e.phases.wait=e.socket-e.start;let a=()=>{e.lookup=Date.now(),e.phases.dns=e.lookup-e.socket};o.prependOnceListener("lookup",a),pbe.default(o,{connect:()=>{e.connect=Date.now(),e.lookup===void 0&&(o.removeListener("lookup",a),e.lookup=e.connect,e.phases.dns=e.lookup-e.socket),e.phases.tcp=e.connect-e.lookup},secureConnect:()=>{e.secureConnect=Date.now(),e.phases.tls=e.secureConnect-e.connect}})};t.socket?i(t.socket):t.prependOnceListener("socket",i);let n=()=>{var o;e.upload=Date.now(),e.phases.request=e.upload-(o=e.secureConnect,o!=null?o:e.connect)};return(()=>typeof t.writableFinished=="boolean"?t.writableFinished:t.finished&&t.outputSize===0&&(!t.socket||t.socket.writableLength===0))()?n():t.prependOnceListener("finish",n),t.prependOnceListener("response",o=>{e.response=Date.now(),e.phases.firstByte=e.response-e.upload,o.timings=e,r(o),o.prependOnceListener("end",()=>{e.end=Date.now(),e.phases.download=e.end-e.response,e.phases.total=e.end-e.start})}),e};qx.default=Wx;Jx.exports=Wx;Jx.exports.default=Wx});var y3=E((fnt,zx)=>{"use strict";var{V4MAPPED:Cbe,ADDRCONFIG:mbe,ALL:p3,promises:{Resolver:d3},lookup:Ebe}=require("dns"),{promisify:Vx}=require("util"),Ibe=require("os"),Gu=Symbol("cacheableLookupCreateConnection"),_x=Symbol("cacheableLookupInstance"),C3=Symbol("expires"),ybe=typeof p3=="number",m3=t=>{if(!(t&&typeof t.createConnection=="function"))throw new Error("Expected an Agent instance as the first argument")},wbe=t=>{for(let e of t)e.family!==6&&(e.address=`::ffff:${e.address}`,e.family=6)},E3=()=>{let t=!1,e=!1;for(let r of Object.values(Ibe.networkInterfaces()))for(let i of r)if(!i.internal&&(i.family==="IPv6"?e=!0:t=!0,t&&e))return{has4:t,has6:e};return{has4:t,has6:e}},Bbe=t=>Symbol.iterator in t,I3={ttl:!0},Qbe={all:!0},Xx=class{constructor({cache:e=new Map,maxTtl:r=Infinity,fallbackDuration:i=3600,errorTtl:n=.15,resolver:s=new d3,lookup:o=Ebe}={}){if(this.maxTtl=r,this.errorTtl=n,this._cache=e,this._resolver=s,this._dnsLookup=Vx(o),this._resolver instanceof d3?(this._resolve4=this._resolver.resolve4.bind(this._resolver),this._resolve6=this._resolver.resolve6.bind(this._resolver)):(this._resolve4=Vx(this._resolver.resolve4.bind(this._resolver)),this._resolve6=Vx(this._resolver.resolve6.bind(this._resolver))),this._iface=E3(),this._pending={},this._nextRemovalTime=!1,this._hostnamesToFallback=new Set,i<1)this._fallback=!1;else{this._fallback=!0;let a=setInterval(()=>{this._hostnamesToFallback.clear()},i*1e3);a.unref&&a.unref()}this.lookup=this.lookup.bind(this),this.lookupAsync=this.lookupAsync.bind(this)}set servers(e){this.clear(),this._resolver.setServers(e)}get servers(){return this._resolver.getServers()}lookup(e,r,i){if(typeof r=="function"?(i=r,r={}):typeof r=="number"&&(r={family:r}),!i)throw new Error("Callback must be a function.");this.lookupAsync(e,r).then(n=>{r.all?i(null,n):i(null,n.address,n.family,n.expires,n.ttl)},i)}async lookupAsync(e,r={}){typeof r=="number"&&(r={family:r});let i=await this.query(e);if(r.family===6){let n=i.filter(s=>s.family===6);r.hints&Cbe&&(ybe&&r.hints&p3||n.length===0)?wbe(i):i=n}else r.family===4&&(i=i.filter(n=>n.family===4));if(r.hints&mbe){let{_iface:n}=this;i=i.filter(s=>s.family===6?n.has6:n.has4)}if(i.length===0){let n=new Error(`cacheableLookup ENOTFOUND ${e}`);throw n.code="ENOTFOUND",n.hostname=e,n}return r.all?i:i[0]}async query(e){let r=await this._cache.get(e);if(!r){let i=this._pending[e];if(i)r=await i;else{let n=this.queryAndCache(e);this._pending[e]=n,r=await n}}return r=r.map(i=>P({},i)),r}async _resolve(e){let r=async c=>{try{return await c}catch(u){if(u.code==="ENODATA"||u.code==="ENOTFOUND")return[];throw u}},[i,n]=await Promise.all([this._resolve4(e,I3),this._resolve6(e,I3)].map(c=>r(c))),s=0,o=0,a=0,l=Date.now();for(let c of i)c.family=4,c.expires=l+c.ttl*1e3,s=Math.max(s,c.ttl);for(let c of n)c.family=6,c.expires=l+c.ttl*1e3,o=Math.max(o,c.ttl);return i.length>0?n.length>0?a=Math.min(s,o):a=s:a=o,{entries:[...i,...n],cacheTtl:a}}async _lookup(e){try{return{entries:await this._dnsLookup(e,{all:!0}),cacheTtl:0}}catch(r){return{entries:[],cacheTtl:0}}}async _set(e,r,i){if(this.maxTtl>0&&i>0){i=Math.min(i,this.maxTtl)*1e3,r[C3]=Date.now()+i;try{await this._cache.set(e,r,i)}catch(n){this.lookupAsync=async()=>{let s=new Error("Cache Error. Please recreate the CacheableLookup instance.");throw s.cause=n,s}}Bbe(this._cache)&&this._tick(i)}}async queryAndCache(e){if(this._hostnamesToFallback.has(e))return this._dnsLookup(e,Qbe);try{let r=await this._resolve(e);r.entries.length===0&&this._fallback&&(r=await this._lookup(e),r.entries.length!==0&&this._hostnamesToFallback.add(e));let i=r.entries.length===0?this.errorTtl:r.cacheTtl;return await this._set(e,r.entries,i),delete this._pending[e],r.entries}catch(r){throw delete this._pending[e],r}}_tick(e){let r=this._nextRemovalTime;(!r||e{this._nextRemovalTime=!1;let i=Infinity,n=Date.now();for(let[s,o]of this._cache){let a=o[C3];n>=a?this._cache.delete(s):a("lookup"in r||(r.lookup=this.lookup),e[Gu](r,i))}uninstall(e){if(m3(e),e[Gu]){if(e[_x]!==this)throw new Error("The agent is not owned by this CacheableLookup instance");e.createConnection=e[Gu],delete e[Gu],delete e[_x]}}updateInterfaceInfo(){let{_iface:e}=this;this._iface=E3(),(e.has4&&!this._iface.has4||e.has6&&!this._iface.has6)&&this._cache.clear()}clear(e){if(e){this._cache.delete(e);return}this._cache.clear()}};zx.exports=Xx;zx.exports.default=Xx});var Q3=E((hnt,Zx)=>{"use strict";var bbe=typeof URL=="undefined"?require("url").URL:URL,vbe="text/plain",Sbe="us-ascii",w3=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t),xbe=(t,{stripHash:e})=>{let r=t.match(/^data:([^,]*?),([^#]*?)(?:#(.*))?$/);if(!r)throw new Error(`Invalid URL: ${t}`);let i=r[1].split(";"),n=r[2],s=e?"":r[3],o=!1;i[i.length-1]==="base64"&&(i.pop(),o=!0);let a=(i.shift()||"").toLowerCase(),c=[...i.map(u=>{let[g,f=""]=u.split("=").map(h=>h.trim());return g==="charset"&&(f=f.toLowerCase(),f===Sbe)?"":`${g}${f?`=${f}`:""}`}).filter(Boolean)];return o&&c.push("base64"),(c.length!==0||a&&a!==vbe)&&c.unshift(a),`data:${c.join(";")},${o?n.trim():n}${s?`#${s}`:""}`},B3=(t,e)=>{if(e=P({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripAuthentication:!0,stripHash:!1,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps"))throw new Error("options.normalizeHttps is renamed to options.forceHttp");if(Reflect.has(e,"normalizeHttp"))throw new Error("options.normalizeHttp is renamed to options.forceHttps");if(Reflect.has(e,"stripFragment"))throw new Error("options.stripFragment is renamed to options.stripHash");if(t=t.trim(),/^data:/i.test(t))return xbe(t,e);let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new bbe(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripAuthentication&&(n.username="",n.password=""),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?!:).|^)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];w3(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])w3(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),e.removeTrailingSlash&&(n.pathname=n.pathname.replace(/\/$/,"")),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&n.hash===""&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),e.stripProtocol&&(t=t.replace(/^(?:https?:)?\/\//,"")),t};Zx.exports=B3;Zx.exports.default=B3});var S3=E((pnt,b3)=>{b3.exports=v3;function v3(t,e){if(t&&e)return v3(t)(e);if(typeof t!="function")throw new TypeError("need wrapper function");return Object.keys(t).forEach(function(i){r[i]=t[i]}),r;function r(){for(var i=new Array(arguments.length),n=0;n{var x3=S3();$x.exports=x3(Ry);$x.exports.strict=x3(k3);Ry.proto=Ry(function(){Object.defineProperty(Function.prototype,"once",{value:function(){return Ry(this)},configurable:!0}),Object.defineProperty(Function.prototype,"onceStrict",{value:function(){return k3(this)},configurable:!0})});function Ry(t){var e=function(){return e.called?e.value:(e.called=!0,e.value=t.apply(this,arguments))};return e.called=!1,e}function k3(t){var e=function(){if(e.called)throw new Error(e.onceError);return e.called=!0,e.value=t.apply(this,arguments)},r=t.name||"Function wrapped with `once`";return e.onceError=r+" shouldn't be called more than once",e.called=!1,e}});var tk=E((Cnt,P3)=>{var kbe=ek(),Pbe=function(){},Dbe=function(t){return t.setHeader&&typeof t.abort=="function"},Rbe=function(t){return t.stdio&&Array.isArray(t.stdio)&&t.stdio.length===3},D3=function(t,e,r){if(typeof e=="function")return D3(t,null,e);e||(e={}),r=kbe(r||Pbe);var i=t._writableState,n=t._readableState,s=e.readable||e.readable!==!1&&t.readable,o=e.writable||e.writable!==!1&&t.writable,a=function(){t.writable||l()},l=function(){o=!1,s||r.call(t)},c=function(){s=!1,o||r.call(t)},u=function(p){r.call(t,p?new Error("exited with error code: "+p):null)},g=function(p){r.call(t,p)},f=function(){if(s&&!(n&&n.ended))return r.call(t,new Error("premature close"));if(o&&!(i&&i.ended))return r.call(t,new Error("premature close"))},h=function(){t.req.on("finish",l)};return Dbe(t)?(t.on("complete",l),t.on("abort",f),t.req?h():t.on("request",h)):o&&!i&&(t.on("end",a),t.on("close",a)),Rbe(t)&&t.on("exit",u),t.on("end",c),t.on("finish",l),e.error!==!1&&t.on("error",g),t.on("close",f),function(){t.removeListener("complete",l),t.removeListener("abort",f),t.removeListener("request",h),t.req&&t.req.removeListener("finish",l),t.removeListener("end",a),t.removeListener("close",a),t.removeListener("finish",l),t.removeListener("exit",u),t.removeListener("end",c),t.removeListener("error",g),t.removeListener("close",f)}};P3.exports=D3});var N3=E((mnt,R3)=>{var Fbe=ek(),Nbe=tk(),rk=require("fs"),Ip=function(){},Lbe=/^v?\.0/.test(process.version),Fy=function(t){return typeof t=="function"},Tbe=function(t){return!Lbe||!rk?!1:(t instanceof(rk.ReadStream||Ip)||t instanceof(rk.WriteStream||Ip))&&Fy(t.close)},Mbe=function(t){return t.setHeader&&Fy(t.abort)},Obe=function(t,e,r,i){i=Fbe(i);var n=!1;t.on("close",function(){n=!0}),Nbe(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,Tbe(t))return t.close(Ip);if(Mbe(t))return t.abort();if(Fy(t.destroy))return t.destroy();i(o||new Error("stream was destroyed"))}}},F3=function(t){t()},Kbe=function(t,e){return t.pipe(e)},Ube=function(){var t=Array.prototype.slice.call(arguments),e=Fy(t[t.length-1]||Ip)&&t.pop()||Ip;if(Array.isArray(t[0])&&(t=t[0]),t.length<2)throw new Error("pump requires two streams per minimum");var r,i=t.map(function(n,s){var o=s0;return Obe(n,o,a,function(l){r||(r=l),l&&i.forEach(F3),!o&&(i.forEach(F3),e(r))})});return t.reduce(Kbe)};R3.exports=Ube});var T3=E((Ent,L3)=>{"use strict";var{PassThrough:Hbe}=require("stream");L3.exports=t=>{t=P({},t);let{array:e}=t,{encoding:r}=t,i=r==="buffer",n=!1;e?n=!(r||i):r=r||"utf8",i&&(r=null);let s=new Hbe({objectMode:n});r&&s.setEncoding(r);let o=0,a=[];return s.on("data",l=>{a.push(l),n?o=a.length:o+=l.length}),s.getBufferedValue=()=>e?a:i?Buffer.concat(a,o):a.join(""),s.getBufferedLength=()=>o,s}});var M3=E((Int,ju)=>{"use strict";var Gbe=N3(),jbe=T3(),ik=class extends Error{constructor(){super("maxBuffer exceeded");this.name="MaxBufferError"}};async function Ny(t,e){if(!t)return Promise.reject(new Error("Expected a stream"));e=P({maxBuffer:Infinity},e);let{maxBuffer:r}=e,i;return await new Promise((n,s)=>{let o=a=>{a&&(a.bufferedData=i.getBufferedValue()),s(a)};i=Gbe(t,jbe(e),a=>{if(a){o(a);return}n()}),i.on("data",()=>{i.getBufferedLength()>r&&o(new ik)})}),i.getBufferedValue()}ju.exports=Ny;ju.exports.default=Ny;ju.exports.buffer=(t,e)=>Ny(t,_(P({},e),{encoding:"buffer"}));ju.exports.array=(t,e)=>Ny(t,_(P({},e),{array:!0}));ju.exports.MaxBufferError=ik});var K3=E((wnt,O3)=>{"use strict";var Ybe=[200,203,204,206,300,301,404,405,410,414,501],qbe=[200,203,204,300,301,302,303,307,308,404,405,410,414,501],Jbe={date:!0,connection:!0,"keep-alive":!0,"proxy-authenticate":!0,"proxy-authorization":!0,te:!0,trailer:!0,"transfer-encoding":!0,upgrade:!0},Wbe={"content-length":!0,"content-encoding":!0,"transfer-encoding":!0,"content-range":!0};function nk(t){let e={};if(!t)return e;let r=t.trim().split(/\s*,\s*/);for(let i of r){let[n,s]=i.split(/\s*=\s*/,2);e[n]=s===void 0?!0:s.replace(/^"|"$/g,"")}return e}function zbe(t){let e=[];for(let r in t){let i=t[r];e.push(i===!0?r:r+"="+i)}if(!!e.length)return e.join(", ")}O3.exports=class{constructor(e,r,{shared:i,cacheHeuristic:n,immutableMinTimeToLive:s,ignoreCargoCult:o,trustServerDate:a,_fromObject:l}={}){if(l){this._fromObject(l);return}if(!r||!r.headers)throw Error("Response headers missing");this._assertRequestHasHeaders(e),this._responseTime=this.now(),this._isShared=i!==!1,this._trustServerDate=a!==void 0?a:!0,this._cacheHeuristic=n!==void 0?n:.1,this._immutableMinTtl=s!==void 0?s:24*3600*1e3,this._status="status"in r?r.status:200,this._resHeaders=r.headers,this._rescc=nk(r.headers["cache-control"]),this._method="method"in e?e.method:"GET",this._url=e.url,this._host=e.headers.host,this._noAuthorization=!e.headers.authorization,this._reqHeaders=r.headers.vary?e.headers:null,this._reqcc=nk(e.headers["cache-control"]),o&&"pre-check"in this._rescc&&"post-check"in this._rescc&&(delete this._rescc["pre-check"],delete this._rescc["post-check"],delete this._rescc["no-cache"],delete this._rescc["no-store"],delete this._rescc["must-revalidate"],this._resHeaders=Object.assign({},this._resHeaders,{"cache-control":zbe(this._rescc)}),delete this._resHeaders.expires,delete this._resHeaders.pragma),!r.headers["cache-control"]&&/no-cache/.test(r.headers.pragma)&&(this._rescc["no-cache"]=!0)}now(){return Date.now()}storable(){return!!(!this._reqcc["no-store"]&&(this._method==="GET"||this._method==="HEAD"||this._method==="POST"&&this._hasExplicitExpiration())&&qbe.indexOf(this._status)!==-1&&!this._rescc["no-store"]&&(!this._isShared||!this._rescc.private)&&(!this._isShared||this._noAuthorization||this._allowsStoringAuthenticated())&&(this._resHeaders.expires||this._rescc.public||this._rescc["max-age"]||this._rescc["s-maxage"]||Ybe.indexOf(this._status)!==-1))}_hasExplicitExpiration(){return this._isShared&&this._rescc["s-maxage"]||this._rescc["max-age"]||this._resHeaders.expires}_assertRequestHasHeaders(e){if(!e||!e.headers)throw Error("Request headers missing")}satisfiesWithoutRevalidation(e){this._assertRequestHasHeaders(e);let r=nk(e.headers["cache-control"]);return r["no-cache"]||/no-cache/.test(e.headers.pragma)||r["max-age"]&&this.age()>r["max-age"]||r["min-fresh"]&&this.timeToLive()<1e3*r["min-fresh"]||this.stale()&&!(r["max-stale"]&&!this._rescc["must-revalidate"]&&(r["max-stale"]===!0||r["max-stale"]>this.age()-this.maxAge()))?!1:this._requestMatches(e,!1)}_requestMatches(e,r){return(!this._url||this._url===e.url)&&this._host===e.headers.host&&(!e.method||this._method===e.method||r&&e.method==="HEAD")&&this._varyMatches(e)}_allowsStoringAuthenticated(){return this._rescc["must-revalidate"]||this._rescc.public||this._rescc["s-maxage"]}_varyMatches(e){if(!this._resHeaders.vary)return!0;if(this._resHeaders.vary==="*")return!1;let r=this._resHeaders.vary.trim().toLowerCase().split(/\s*,\s*/);for(let i of r)if(e.headers[i]!==this._reqHeaders[i])return!1;return!0}_copyWithoutHopByHopHeaders(e){let r={};for(let i in e)Jbe[i]||(r[i]=e[i]);if(e.connection){let i=e.connection.trim().split(/\s*,\s*/);for(let n of i)delete r[n]}if(r.warning){let i=r.warning.split(/,/).filter(n=>!/^\s*1[0-9][0-9]/.test(n));i.length?r.warning=i.join(",").trim():delete r.warning}return r}responseHeaders(){let e=this._copyWithoutHopByHopHeaders(this._resHeaders),r=this.age();return r>3600*24&&!this._hasExplicitExpiration()&&this.maxAge()>3600*24&&(e.warning=(e.warning?`${e.warning}, `:"")+'113 - "rfc7234 5.5.4"'),e.age=`${Math.round(r)}`,e.date=new Date(this.now()).toUTCString(),e}date(){return this._trustServerDate?this._serverDate():this._responseTime}_serverDate(){let e=Date.parse(this._resHeaders.date);if(isFinite(e)){let r=8*3600*1e3;if(Math.abs(this._responseTime-e)e&&(e=i)}let r=(this.now()-this._responseTime)/1e3;return e+r}_ageValue(){let e=parseInt(this._resHeaders.age);return isFinite(e)?e:0}maxAge(){if(!this.storable()||this._rescc["no-cache"]||this._isShared&&this._resHeaders["set-cookie"]&&!this._rescc.public&&!this._rescc.immutable||this._resHeaders.vary==="*")return 0;if(this._isShared){if(this._rescc["proxy-revalidate"])return 0;if(this._rescc["s-maxage"])return parseInt(this._rescc["s-maxage"],10)}if(this._rescc["max-age"])return parseInt(this._rescc["max-age"],10);let e=this._rescc.immutable?this._immutableMinTtl:0,r=this._serverDate();if(this._resHeaders.expires){let i=Date.parse(this._resHeaders.expires);return Number.isNaN(i)||ii)return Math.max(e,(r-i)/1e3*this._cacheHeuristic)}return e}timeToLive(){return Math.max(0,this.maxAge()-this.age())*1e3}stale(){return this.maxAge()<=this.age()}static fromObject(e){return new this(void 0,void 0,{_fromObject:e})}_fromObject(e){if(this._responseTime)throw Error("Reinitialized");if(!e||e.v!==1)throw Error("Invalid serialization");this._responseTime=e.t,this._isShared=e.sh,this._cacheHeuristic=e.ch,this._immutableMinTtl=e.imm!==void 0?e.imm:24*3600*1e3,this._status=e.st,this._resHeaders=e.resh,this._rescc=e.rescc,this._method=e.m,this._url=e.u,this._host=e.h,this._noAuthorization=e.a,this._reqHeaders=e.reqh,this._reqcc=e.reqcc}toObject(){return{v:1,t:this._responseTime,sh:this._isShared,ch:this._cacheHeuristic,imm:this._immutableMinTtl,st:this._status,resh:this._resHeaders,rescc:this._rescc,m:this._method,u:this._url,h:this._host,a:this._noAuthorization,reqh:this._reqHeaders,reqcc:this._reqcc}}revalidationHeaders(e){this._assertRequestHasHeaders(e);let r=this._copyWithoutHopByHopHeaders(e.headers);if(delete r["if-range"],!this._requestMatches(e,!0)||!this.storable())return delete r["if-none-match"],delete r["if-modified-since"],r;if(this._resHeaders.etag&&(r["if-none-match"]=r["if-none-match"]?`${r["if-none-match"]}, ${this._resHeaders.etag}`:this._resHeaders.etag),r["accept-ranges"]||r["if-match"]||r["if-unmodified-since"]||this._method&&this._method!="GET"){if(delete r["if-modified-since"],r["if-none-match"]){let n=r["if-none-match"].split(/,/).filter(s=>!/^\s*W\//.test(s));n.length?r["if-none-match"]=n.join(",").trim():delete r["if-none-match"]}}else this._resHeaders["last-modified"]&&!r["if-modified-since"]&&(r["if-modified-since"]=this._resHeaders["last-modified"]);return r}revalidatedPolicy(e,r){if(this._assertRequestHasHeaders(e),!r||!r.headers)throw Error("Response headers missing");let i=!1;if(r.status!==void 0&&r.status!=304?i=!1:r.headers.etag&&!/^\s*W\//.test(r.headers.etag)?i=this._resHeaders.etag&&this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag:this._resHeaders.etag&&r.headers.etag?i=this._resHeaders.etag.replace(/^\s*W\//,"")===r.headers.etag.replace(/^\s*W\//,""):this._resHeaders["last-modified"]?i=this._resHeaders["last-modified"]===r.headers["last-modified"]:!this._resHeaders.etag&&!this._resHeaders["last-modified"]&&!r.headers.etag&&!r.headers["last-modified"]&&(i=!0),!i)return{policy:new this.constructor(e,r),modified:r.status!=304,matches:!1};let n={};for(let o in this._resHeaders)n[o]=o in r.headers&&!Wbe[o]?r.headers[o]:this._resHeaders[o];let s=Object.assign({},r,{status:this._status,method:this._method,headers:n});return{policy:new this.constructor(e,s,{shared:this._isShared,cacheHeuristic:this._cacheHeuristic,immutableMinTimeToLive:this._immutableMinTtl,trustServerDate:this._trustServerDate}),modified:!1,matches:!0}}}});var Ly=E((Bnt,U3)=>{"use strict";U3.exports=t=>{let e={};for(let[r,i]of Object.entries(t))e[r.toLowerCase()]=i;return e}});var j3=E((Qnt,H3)=>{"use strict";var Vbe=require("stream").Readable,_be=Ly(),G3=class extends Vbe{constructor(e,r,i,n){if(typeof e!="number")throw new TypeError("Argument `statusCode` should be a number");if(typeof r!="object")throw new TypeError("Argument `headers` should be an object");if(!(i instanceof Buffer))throw new TypeError("Argument `body` should be a buffer");if(typeof n!="string")throw new TypeError("Argument `url` should be a string");super();this.statusCode=e,this.headers=_be(r),this.body=i,this.url=n}_read(){this.push(this.body),this.push(null)}};H3.exports=G3});var q3=E((bnt,Y3)=>{"use strict";var Xbe=["destroy","setTimeout","socket","headers","trailers","rawHeaders","statusCode","httpVersion","httpVersionMinor","httpVersionMajor","rawTrailers","statusMessage"];Y3.exports=(t,e)=>{let r=new Set(Object.keys(t).concat(Xbe));for(let i of r)i in e||(e[i]=typeof t[i]=="function"?t[i].bind(t):t[i])}});var W3=E((vnt,J3)=>{"use strict";var Zbe=require("stream").PassThrough,$be=q3(),eve=t=>{if(!(t&&t.pipe))throw new TypeError("Parameter `response` must be a response stream.");let e=new Zbe;return $be(t,e),t.pipe(e)};J3.exports=eve});var z3=E(sk=>{sk.stringify=function t(e){if(typeof e=="undefined")return e;if(e&&Buffer.isBuffer(e))return JSON.stringify(":base64:"+e.toString("base64"));if(e&&e.toJSON&&(e=e.toJSON()),e&&typeof e=="object"){var r="",i=Array.isArray(e);r=i?"[":"{";var n=!0;for(var s in e){var o=typeof e[s]=="function"||!i&&typeof e[s]=="undefined";Object.hasOwnProperty.call(e,s)&&!o&&(n||(r+=","),n=!1,i?e[s]==null?r+="null":r+=t(e[s]):e[s]!==void 0&&(r+=t(s)+":"+t(e[s])))}return r+=i?"]":"}",r}else return typeof e=="string"?JSON.stringify(/^:/.test(e)?":"+e:e):typeof e=="undefined"?"null":JSON.stringify(e)};sk.parse=function(t){return JSON.parse(t,function(e,r){return typeof r=="string"?/^:base64:/.test(r)?Buffer.from(r.substring(8),"base64"):/^:/.test(r)?r.substring(1):r:r})}});var Z3=E((xnt,V3)=>{"use strict";var tve=require("events"),_3=z3(),rve=t=>{let e={redis:"@keyv/redis",mongodb:"@keyv/mongo",mongo:"@keyv/mongo",sqlite:"@keyv/sqlite",postgresql:"@keyv/postgres",postgres:"@keyv/postgres",mysql:"@keyv/mysql"};if(t.adapter||t.uri){let r=t.adapter||/^[^:]*/.exec(t.uri)[0];return new(require(e[r]))(t)}return new Map},X3=class extends tve{constructor(e,r){super();if(this.opts=Object.assign({namespace:"keyv",serialize:_3.stringify,deserialize:_3.parse},typeof e=="string"?{uri:e}:e,r),!this.opts.store){let i=Object.assign({},this.opts);this.opts.store=rve(i)}typeof this.opts.store.on=="function"&&this.opts.store.on("error",i=>this.emit("error",i)),this.opts.store.namespace=this.opts.namespace}_getKeyPrefix(e){return`${this.opts.namespace}:${e}`}get(e,r){e=this._getKeyPrefix(e);let{store:i}=this.opts;return Promise.resolve().then(()=>i.get(e)).then(n=>typeof n=="string"?this.opts.deserialize(n):n).then(n=>{if(n!==void 0){if(typeof n.expires=="number"&&Date.now()>n.expires){this.delete(e);return}return r&&r.raw?n:n.value}})}set(e,r,i){e=this._getKeyPrefix(e),typeof i=="undefined"&&(i=this.opts.ttl),i===0&&(i=void 0);let{store:n}=this.opts;return Promise.resolve().then(()=>{let s=typeof i=="number"?Date.now()+i:null;return r={value:r,expires:s},this.opts.serialize(r)}).then(s=>n.set(e,s,i)).then(()=>!0)}delete(e){e=this._getKeyPrefix(e);let{store:r}=this.opts;return Promise.resolve().then(()=>r.delete(e))}clear(){let{store:e}=this.opts;return Promise.resolve().then(()=>e.clear())}};V3.exports=X3});var tW=E((knt,$3)=>{"use strict";var ive=require("events"),Ty=require("url"),nve=Q3(),sve=M3(),ok=K3(),eW=j3(),ove=Ly(),ave=W3(),Ave=Z3(),yo=class{constructor(e,r){if(typeof e!="function")throw new TypeError("Parameter `request` must be a function");return this.cache=new Ave({uri:typeof r=="string"&&r,store:typeof r!="string"&&r,namespace:"cacheable-request"}),this.createCacheableRequest(e)}createCacheableRequest(e){return(r,i)=>{let n;if(typeof r=="string")n=ak(Ty.parse(r)),r={};else if(r instanceof Ty.URL)n=ak(Ty.parse(r.toString())),r={};else{let[g,...f]=(r.path||"").split("?"),h=f.length>0?`?${f.join("?")}`:"";n=ak(_(P({},r),{pathname:g,search:h}))}r=P(P({headers:{},method:"GET",cache:!0,strictTtl:!1,automaticFailover:!1},r),lve(n)),r.headers=ove(r.headers);let s=new ive,o=nve(Ty.format(n),{stripWWW:!1,removeTrailingSlash:!1,stripAuthentication:!1}),a=`${r.method}:${o}`,l=!1,c=!1,u=g=>{c=!0;let f=!1,h,p=new Promise(m=>{h=()=>{f||(f=!0,m())}}),d=m=>{if(l&&!g.forceRefresh){m.status=m.statusCode;let B=ok.fromObject(l.cachePolicy).revalidatedPolicy(g,m);if(!B.modified){let b=B.policy.responseHeaders();m=new eW(l.statusCode,b,l.body,l.url),m.cachePolicy=B.policy,m.fromCache=!0}}m.fromCache||(m.cachePolicy=new ok(g,m,g),m.fromCache=!1);let I;g.cache&&m.cachePolicy.storable()?(I=ave(m),(async()=>{try{let B=sve.buffer(m);if(await Promise.race([p,new Promise(L=>m.once("end",L))]),f)return;let b=await B,R={cachePolicy:m.cachePolicy.toObject(),url:m.url,statusCode:m.fromCache?l.statusCode:m.statusCode,body:b},H=g.strictTtl?m.cachePolicy.timeToLive():void 0;g.maxTtl&&(H=H?Math.min(H,g.maxTtl):g.maxTtl),await this.cache.set(a,R,H)}catch(B){s.emit("error",new yo.CacheError(B))}})()):g.cache&&l&&(async()=>{try{await this.cache.delete(a)}catch(B){s.emit("error",new yo.CacheError(B))}})(),s.emit("response",I||m),typeof i=="function"&&i(I||m)};try{let m=e(g,d);m.once("error",h),m.once("abort",h),s.emit("request",m)}catch(m){s.emit("error",new yo.RequestError(m))}};return(async()=>{let g=async h=>{await Promise.resolve();let p=h.cache?await this.cache.get(a):void 0;if(typeof p=="undefined")return u(h);let d=ok.fromObject(p.cachePolicy);if(d.satisfiesWithoutRevalidation(h)&&!h.forceRefresh){let m=d.responseHeaders(),I=new eW(p.statusCode,m,p.body,p.url);I.cachePolicy=d,I.fromCache=!0,s.emit("response",I),typeof i=="function"&&i(I)}else l=p,h.headers=d.revalidationHeaders(h),u(h)},f=h=>s.emit("error",new yo.CacheError(h));this.cache.once("error",f),s.on("response",()=>this.cache.removeListener("error",f));try{await g(r)}catch(h){r.automaticFailover&&!c&&u(r),s.emit("error",new yo.CacheError(h))}})(),s}}};function lve(t){let e=P({},t);return e.path=`${t.pathname||"/"}${t.search||""}`,delete e.pathname,delete e.search,e}function ak(t){return{protocol:t.protocol,auth:t.auth,hostname:t.hostname||t.host||"localhost",port:t.port,pathname:t.pathname,search:t.search}}yo.RequestError=class extends Error{constructor(t){super(t.message);this.name="RequestError",Object.assign(this,t)}};yo.CacheError=class extends Error{constructor(t){super(t.message);this.name="CacheError",Object.assign(this,t)}};$3.exports=yo});var iW=E((Pnt,rW)=>{"use strict";var cve=["aborted","complete","headers","httpVersion","httpVersionMinor","httpVersionMajor","method","rawHeaders","rawTrailers","setTimeout","socket","statusCode","statusMessage","trailers","url"];rW.exports=(t,e)=>{if(e._readableState.autoDestroy)throw new Error("The second stream must have the `autoDestroy` option set to `false`");let r=new Set(Object.keys(t).concat(cve)),i={};for(let n of r)n in e||(i[n]={get(){let s=t[n];return typeof s=="function"?s.bind(t):s},set(s){t[n]=s},enumerable:!0,configurable:!1});return Object.defineProperties(e,i),t.once("aborted",()=>{e.destroy(),e.emit("aborted")}),t.once("close",()=>{t.complete&&e.readable?e.once("end",()=>{e.emit("close")}):e.emit("close")}),e}});var sW=E((Dnt,nW)=>{"use strict";var{Transform:uve,PassThrough:gve}=require("stream"),Ak=require("zlib"),fve=iW();nW.exports=t=>{let e=(t.headers["content-encoding"]||"").toLowerCase();if(!["gzip","deflate","br"].includes(e))return t;let r=e==="br";if(r&&typeof Ak.createBrotliDecompress!="function")return t.destroy(new Error("Brotli is not supported on Node.js < 12")),t;let i=!0,n=new uve({transform(a,l,c){i=!1,c(null,a)},flush(a){a()}}),s=new gve({autoDestroy:!1,destroy(a,l){t.destroy(),l(a)}}),o=r?Ak.createBrotliDecompress():Ak.createUnzip();return o.once("error",a=>{if(i&&!t.readable){s.end();return}s.destroy(a)}),fve(t,s),t.pipe(n).pipe(o).pipe(s),s}});var lk=E((Rnt,oW)=>{"use strict";var aW=class{constructor(e={}){if(!(e.maxSize&&e.maxSize>0))throw new TypeError("`maxSize` must be a number greater than 0");this.maxSize=e.maxSize,this.onEviction=e.onEviction,this.cache=new Map,this.oldCache=new Map,this._size=0}_set(e,r){if(this.cache.set(e,r),this._size++,this._size>=this.maxSize){if(this._size=0,typeof this.onEviction=="function")for(let[i,n]of this.oldCache.entries())this.onEviction(i,n);this.oldCache=this.cache,this.cache=new Map}}get(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e)){let r=this.oldCache.get(e);return this.oldCache.delete(e),this._set(e,r),r}}set(e,r){return this.cache.has(e)?this.cache.set(e,r):this._set(e,r),this}has(e){return this.cache.has(e)||this.oldCache.has(e)}peek(e){if(this.cache.has(e))return this.cache.get(e);if(this.oldCache.has(e))return this.oldCache.get(e)}delete(e){let r=this.cache.delete(e);return r&&this._size--,this.oldCache.delete(e)||r}clear(){this.cache.clear(),this.oldCache.clear(),this._size=0}*keys(){for(let[e]of this)yield e}*values(){for(let[,e]of this)yield e}*[Symbol.iterator](){for(let e of this.cache)yield e;for(let e of this.oldCache){let[r]=e;this.cache.has(r)||(yield e)}}get size(){let e=0;for(let r of this.oldCache.keys())this.cache.has(r)||e++;return Math.min(this._size+e,this.maxSize)}};oW.exports=aW});var uk=E((Fnt,AW)=>{"use strict";var hve=require("events"),pve=require("tls"),dve=require("http2"),Cve=lk(),_i=Symbol("currentStreamsCount"),lW=Symbol("request"),ns=Symbol("cachedOriginSet"),Yu=Symbol("gracefullyClosing"),mve=["maxDeflateDynamicTableSize","maxSessionMemory","maxHeaderListPairs","maxOutstandingPings","maxReservedRemoteStreams","maxSendHeaderBlockLength","paddingStrategy","localAddress","path","rejectUnauthorized","minDHSize","ca","cert","clientCertEngine","ciphers","key","pfx","servername","minVersion","maxVersion","secureProtocol","crl","honorCipherOrder","ecdhCurve","dhparam","secureOptions","sessionIdContext"],Eve=(t,e,r)=>{let i=0,n=t.length;for(;i>>1;r(t[s],e)?i=s+1:n=s}return i},Ive=(t,e)=>t.remoteSettings.maxConcurrentStreams>e.remoteSettings.maxConcurrentStreams,ck=(t,e)=>{for(let r of t)r[ns].lengthe[ns].includes(i))&&r[_i]+e[_i]<=e.remoteSettings.maxConcurrentStreams&&cW(r)},yve=(t,e)=>{for(let r of t)e[ns].lengthr[ns].includes(i))&&e[_i]+r[_i]<=r.remoteSettings.maxConcurrentStreams&&cW(e)},uW=({agent:t,isFree:e})=>{let r={};for(let i in t.sessions){let s=t.sessions[i].filter(o=>{let a=o[ma.kCurrentStreamsCount]{t[Yu]=!0,t[_i]===0&&t.close()},ma=class extends hve{constructor({timeout:e=6e4,maxSessions:r=Infinity,maxFreeSessions:i=10,maxCachedTlsSessions:n=100}={}){super();this.sessions={},this.queue={},this.timeout=e,this.maxSessions=r,this.maxFreeSessions=i,this._freeSessionsCount=0,this._sessionsCount=0,this.settings={enablePush:!1},this.tlsSessionCache=new Cve({maxSize:n})}static normalizeOrigin(e,r){return typeof e=="string"&&(e=new URL(e)),r&&e.hostname!==r&&(e.hostname=r),e.origin}normalizeOptions(e){let r="";if(e)for(let i of mve)e[i]&&(r+=`:${e[i]}`);return r}_tryToCreateNewSession(e,r){if(!(e in this.queue)||!(r in this.queue[e]))return;let i=this.queue[e][r];this._sessionsCount{Array.isArray(i)?(i=[...i],n()):i=[{resolve:n,reject:s}];let o=this.normalizeOptions(r),a=ma.normalizeOrigin(e,r&&r.servername);if(a===void 0){for(let{reject:u}of i)u(new TypeError("The `origin` argument needs to be a string or an URL object"));return}if(o in this.sessions){let u=this.sessions[o],g=-1,f=-1,h;for(let p of u){let d=p.remoteSettings.maxConcurrentStreams;if(d=d||p[Yu]||p.destroyed)continue;h||(g=d),m>f&&(h=p,f=m)}}if(h){if(i.length!==1){for(let{reject:p}of i){let d=new Error(`Expected the length of listeners to be 1, got ${i.length}. +Please report this to https://github.com/szmarczak/http2-wrapper/`);p(d)}return}i[0].resolve(h);return}}if(o in this.queue){if(a in this.queue[o]){this.queue[o][a].listeners.push(...i),this._tryToCreateNewSession(o,a);return}}else this.queue[o]={};let l=()=>{o in this.queue&&this.queue[o][a]===c&&(delete this.queue[o][a],Object.keys(this.queue[o]).length===0&&delete this.queue[o])},c=()=>{let u=`${a}:${o}`,g=!1;try{let f=dve.connect(e,P({createConnection:this.createConnection,settings:this.settings,session:this.tlsSessionCache.get(u)},r));f[_i]=0,f[Yu]=!1;let h=()=>f[_i]{this.tlsSessionCache.set(u,m)}),f.once("error",m=>{for(let{reject:I}of i)I(m);this.tlsSessionCache.delete(u)}),f.setTimeout(this.timeout,()=>{f.destroy()}),f.once("close",()=>{if(g){p&&this._freeSessionsCount--,this._sessionsCount--;let m=this.sessions[o];m.splice(m.indexOf(f),1),m.length===0&&delete this.sessions[o]}else{let m=new Error("Session closed without receiving a SETTINGS frame");m.code="HTTP2WRAPPER_NOSETTINGS";for(let{reject:I}of i)I(m);l()}this._tryToCreateNewSession(o,a)});let d=()=>{if(!(!(o in this.queue)||!h())){for(let m of f[ns])if(m in this.queue[o]){let{listeners:I}=this.queue[o][m];for(;I.length!==0&&h();)I.shift().resolve(f);let B=this.queue[o];if(B[m].listeners.length===0&&(delete B[m],Object.keys(B).length===0)){delete this.queue[o];break}if(!h())break}}};f.on("origin",()=>{f[ns]=f.originSet,!!h()&&(d(),ck(this.sessions[o],f))}),f.once("remoteSettings",()=>{if(f.ref(),f.unref(),this._sessionsCount++,c.destroyed){let m=new Error("Agent has been destroyed");for(let I of i)I.reject(m);f.destroy();return}f[ns]=f.originSet;{let m=this.sessions;if(o in m){let I=m[o];I.splice(Eve(I,f,Ive),0,f)}else m[o]=[f]}this._freeSessionsCount+=1,g=!0,this.emit("session",f),d(),l(),f[_i]===0&&this._freeSessionsCount>this.maxFreeSessions&&f.close(),i.length!==0&&(this.getSession(a,r,i),i.length=0),f.on("remoteSettings",()=>{d(),ck(this.sessions[o],f)})}),f[lW]=f.request,f.request=(m,I)=>{if(f[Yu])throw new Error("The session is gracefully closing. No new streams are allowed.");let B=f[lW](m,I);return f.ref(),++f[_i],f[_i]===f.remoteSettings.maxConcurrentStreams&&this._freeSessionsCount--,B.once("close",()=>{if(p=h(),--f[_i],!f.destroyed&&!f.closed&&(yve(this.sessions[o],f),h()&&!f.closed)){p||(this._freeSessionsCount++,p=!0);let b=f[_i]===0;b&&f.unref(),b&&(this._freeSessionsCount>this.maxFreeSessions||f[Yu])?f.close():(ck(this.sessions[o],f),d())}}),B}}catch(f){for(let h of i)h.reject(f);l()}};c.listeners=i,c.completed=!1,c.destroyed=!1,this.queue[o][a]=c,this._tryToCreateNewSession(o,a)})}request(e,r,i,n){return new Promise((s,o)=>{this.getSession(e,r,[{reject:o,resolve:a=>{try{s(a.request(i,n))}catch(l){o(l)}}}])})}createConnection(e,r){return ma.connect(e,r)}static connect(e,r){r.ALPNProtocols=["h2"];let i=e.port||443,n=e.hostname||e.host;return typeof r.servername=="undefined"&&(r.servername=n),pve.connect(i,n,r)}closeFreeSessions(){for(let e of Object.values(this.sessions))for(let r of e)r[_i]===0&&r.close()}destroy(e){for(let r of Object.values(this.sessions))for(let i of r)i.destroy(e);for(let r of Object.values(this.queue))for(let i of Object.values(r))i.destroyed=!0;this.queue={}}get freeSessions(){return uW({agent:this,isFree:!0})}get busySessions(){return uW({agent:this,isFree:!1})}};ma.kCurrentStreamsCount=_i;ma.kGracefullyClosing=Yu;AW.exports={Agent:ma,globalAgent:new ma}});var gk=E((Nnt,gW)=>{"use strict";var{Readable:wve}=require("stream"),fW=class extends wve{constructor(e,r){super({highWaterMark:r,autoDestroy:!1});this.statusCode=null,this.statusMessage="",this.httpVersion="2.0",this.httpVersionMajor=2,this.httpVersionMinor=0,this.headers={},this.trailers={},this.req=null,this.aborted=!1,this.complete=!1,this.upgrade=null,this.rawHeaders=[],this.rawTrailers=[],this.socket=e,this.connection=e,this._dumped=!1}_destroy(e){this.req._request.destroy(e)}setTimeout(e,r){return this.req.setTimeout(e,r),this}_dump(){this._dumped||(this._dumped=!0,this.removeAllListeners("data"),this.resume())}_read(){this.req&&this.req._request.resume()}};gW.exports=fW});var fk=E((Lnt,hW)=>{"use strict";hW.exports=t=>{let e={protocol:t.protocol,hostname:typeof t.hostname=="string"&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return typeof t.port=="string"&&t.port.length!==0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var dW=E((Tnt,pW)=>{"use strict";pW.exports=(t,e,r)=>{for(let i of r)t.on(i,(...n)=>e.emit(i,...n))}});var mW=E((Mnt,CW)=>{"use strict";CW.exports=t=>{switch(t){case":method":case":scheme":case":authority":case":path":return!0;default:return!1}}});var IW=E((Knt,EW)=>{"use strict";var qu=(t,e,r)=>{EW.exports[e]=class extends t{constructor(...n){super(typeof r=="string"?r:r(n));this.name=`${super.name} [${e}]`,this.code=e}}};qu(TypeError,"ERR_INVALID_ARG_TYPE",t=>{let e=t[0].includes(".")?"property":"argument",r=t[1],i=Array.isArray(r);return i&&(r=`${r.slice(0,-1).join(", ")} or ${r.slice(-1)}`),`The "${t[0]}" ${e} must be ${i?"one of":"of"} type ${r}. Received ${typeof t[2]}`});qu(TypeError,"ERR_INVALID_PROTOCOL",t=>`Protocol "${t[0]}" not supported. Expected "${t[1]}"`);qu(Error,"ERR_HTTP_HEADERS_SENT",t=>`Cannot ${t[0]} headers after they are sent to the client`);qu(TypeError,"ERR_INVALID_HTTP_TOKEN",t=>`${t[0]} must be a valid HTTP token [${t[1]}]`);qu(TypeError,"ERR_HTTP_INVALID_HEADER_VALUE",t=>`Invalid value "${t[0]} for header "${t[1]}"`);qu(TypeError,"ERR_INVALID_CHAR",t=>`Invalid character in ${t[0]} [${t[1]}]`)});var Ck=E((Unt,yW)=>{"use strict";var Bve=require("http2"),{Writable:Qve}=require("stream"),{Agent:wW,globalAgent:bve}=uk(),vve=gk(),Sve=fk(),xve=dW(),kve=mW(),{ERR_INVALID_ARG_TYPE:hk,ERR_INVALID_PROTOCOL:Pve,ERR_HTTP_HEADERS_SENT:BW,ERR_INVALID_HTTP_TOKEN:Dve,ERR_HTTP_INVALID_HEADER_VALUE:Rve,ERR_INVALID_CHAR:Fve}=IW(),{HTTP2_HEADER_STATUS:QW,HTTP2_HEADER_METHOD:bW,HTTP2_HEADER_PATH:vW,HTTP2_METHOD_CONNECT:Nve}=Bve.constants,Pi=Symbol("headers"),pk=Symbol("origin"),dk=Symbol("session"),SW=Symbol("options"),My=Symbol("flushedHeaders"),yp=Symbol("jobs"),Lve=/^[\^`\-\w!#$%&*+.|~]+$/,Tve=/[^\t\u0020-\u007E\u0080-\u00FF]/,xW=class extends Qve{constructor(e,r,i){super({autoDestroy:!1});let n=typeof e=="string"||e instanceof URL;if(n&&(e=Sve(e instanceof URL?e:new URL(e))),typeof r=="function"||r===void 0?(i=r,r=n?e:P({},e)):r=P(P({},e),r),r.h2session)this[dk]=r.h2session;else if(r.agent===!1)this.agent=new wW({maxFreeSessions:0});else if(typeof r.agent=="undefined"||r.agent===null)typeof r.createConnection=="function"?(this.agent=new wW({maxFreeSessions:0}),this.agent.createConnection=r.createConnection):this.agent=bve;else if(typeof r.agent.request=="function")this.agent=r.agent;else throw new hk("options.agent",["Agent-like Object","undefined","false"],r.agent);if(r.protocol&&r.protocol!=="https:")throw new Pve(r.protocol,"https:");let s=r.port||r.defaultPort||this.agent&&this.agent.defaultPort||443,o=r.hostname||r.host||"localhost";delete r.hostname,delete r.host,delete r.port;let{timeout:a}=r;if(r.timeout=void 0,this[Pi]=Object.create(null),this[yp]=[],this.socket=null,this.connection=null,this.method=r.method||"GET",this.path=r.path,this.res=null,this.aborted=!1,this.reusedSocket=!1,r.headers)for(let[l,c]of Object.entries(r.headers))this.setHeader(l,c);r.auth&&!("authorization"in this[Pi])&&(this[Pi].authorization="Basic "+Buffer.from(r.auth).toString("base64")),r.session=r.tlsSession,r.path=r.socketPath,this[SW]=r,s===443?(this[pk]=`https://${o}`,":authority"in this[Pi]||(this[Pi][":authority"]=o)):(this[pk]=`https://${o}:${s}`,":authority"in this[Pi]||(this[Pi][":authority"]=`${o}:${s}`)),a&&this.setTimeout(a),i&&this.once("response",i),this[My]=!1}get method(){return this[Pi][bW]}set method(e){e&&(this[Pi][bW]=e.toUpperCase())}get path(){return this[Pi][vW]}set path(e){e&&(this[Pi][vW]=e)}get _mustNotHaveABody(){return this.method==="GET"||this.method==="HEAD"||this.method==="DELETE"}_write(e,r,i){if(this._mustNotHaveABody){i(new Error("The GET, HEAD and DELETE methods must NOT have a body"));return}this.flushHeaders();let n=()=>this._request.write(e,r,i);this._request?n():this[yp].push(n)}_final(e){if(this.destroyed)return;this.flushHeaders();let r=()=>{if(this._mustNotHaveABody){e();return}this._request.end(e)};this._request?r():this[yp].push(r)}abort(){this.res&&this.res.complete||(this.aborted||process.nextTick(()=>this.emit("abort")),this.aborted=!0,this.destroy())}_destroy(e,r){this.res&&this.res._dump(),this._request&&this._request.destroy(),r(e)}async flushHeaders(){if(this[My]||this.destroyed)return;this[My]=!0;let e=this.method===Nve,r=i=>{if(this._request=i,this.destroyed){i.destroy();return}e||xve(i,this,["timeout","continue","close","error"]);let n=o=>(...a)=>{!this.writable&&!this.destroyed?o(...a):this.once("finish",()=>{o(...a)})};i.once("response",n((o,a,l)=>{let c=new vve(this.socket,i.readableHighWaterMark);this.res=c,c.req=this,c.statusCode=o[QW],c.headers=o,c.rawHeaders=l,c.once("end",()=>{this.aborted?(c.aborted=!0,c.emit("aborted")):(c.complete=!0,c.socket=null,c.connection=null)}),e?(c.upgrade=!0,this.emit("connect",c,i,Buffer.alloc(0))?this.emit("close"):i.destroy()):(i.on("data",u=>{!c._dumped&&!c.push(u)&&i.pause()}),i.once("end",()=>{c.push(null)}),this.emit("response",c)||c._dump())})),i.once("headers",n(o=>this.emit("information",{statusCode:o[QW]}))),i.once("trailers",n((o,a,l)=>{let{res:c}=this;c.trailers=o,c.rawTrailers=l}));let{socket:s}=i.session;this.socket=s,this.connection=s;for(let o of this[yp])o();this.emit("socket",this.socket)};if(this[dk])try{r(this[dk].request(this[Pi]))}catch(i){this.emit("error",i)}else{this.reusedSocket=!0;try{r(await this.agent.request(this[pk],this[SW],this[Pi]))}catch(i){this.emit("error",i)}}}getHeader(e){if(typeof e!="string")throw new hk("name","string",e);return this[Pi][e.toLowerCase()]}get headersSent(){return this[My]}removeHeader(e){if(typeof e!="string")throw new hk("name","string",e);if(this.headersSent)throw new BW("remove");delete this[Pi][e.toLowerCase()]}setHeader(e,r){if(this.headersSent)throw new BW("set");if(typeof e!="string"||!Lve.test(e)&&!kve(e))throw new Dve("Header name",e);if(typeof r=="undefined")throw new Rve(r,e);if(Tve.test(r))throw new Fve("header content",e);this[Pi][e.toLowerCase()]=r}setNoDelay(){}setSocketKeepAlive(){}setTimeout(e,r){let i=()=>this._request.setTimeout(e,r);return this._request?i():this[yp].push(i),this}get maxHeadersCount(){if(!this.destroyed&&this._request)return this._request.session.localSettings.maxHeaderListSize}set maxHeadersCount(e){}};yW.exports=xW});var PW=E((Hnt,kW)=>{"use strict";var Mve=require("tls");kW.exports=(t={})=>new Promise((e,r)=>{let i=Mve.connect(t,()=>{t.resolveSocket?(i.off("error",r),e({alpnProtocol:i.alpnProtocol,socket:i})):(i.destroy(),e({alpnProtocol:i.alpnProtocol}))});i.on("error",r)})});var RW=E((Gnt,DW)=>{"use strict";var Ove=require("net");DW.exports=t=>{let e=t.host,r=t.headers&&t.headers.host;return r&&(r.startsWith("[")?r.indexOf("]")===-1?e=r:e=r.slice(1,-1):e=r.split(":",1)[0]),Ove.isIP(e)?"":e}});var LW=E((jnt,mk)=>{"use strict";var FW=require("http"),Ek=require("https"),Kve=PW(),Uve=lk(),Hve=Ck(),Gve=RW(),jve=fk(),Oy=new Uve({maxSize:100}),wp=new Map,NW=(t,e,r)=>{e._httpMessage={shouldKeepAlive:!0};let i=()=>{t.emit("free",e,r)};e.on("free",i);let n=()=>{t.removeSocket(e,r)};e.on("close",n);let s=()=>{t.removeSocket(e,r),e.off("close",n),e.off("free",i),e.off("agentRemove",s)};e.on("agentRemove",s),t.emit("free",e,r)},Yve=async t=>{let e=`${t.host}:${t.port}:${t.ALPNProtocols.sort()}`;if(!Oy.has(e)){if(wp.has(e))return(await wp.get(e)).alpnProtocol;let{path:r,agent:i}=t;t.path=t.socketPath;let n=Kve(t);wp.set(e,n);try{let{socket:s,alpnProtocol:o}=await n;if(Oy.set(e,o),t.path=r,o==="h2")s.destroy();else{let{globalAgent:a}=Ek,l=Ek.Agent.prototype.createConnection;i?i.createConnection===l?NW(i,s,t):s.destroy():a.createConnection===l?NW(a,s,t):s.destroy()}return wp.delete(e),o}catch(s){throw wp.delete(e),s}}return Oy.get(e)};mk.exports=async(t,e,r)=>{if((typeof t=="string"||t instanceof URL)&&(t=jve(new URL(t))),typeof e=="function"&&(r=e,e=void 0),e=_(P(P({ALPNProtocols:["h2","http/1.1"]},t),e),{resolveSocket:!0}),!Array.isArray(e.ALPNProtocols)||e.ALPNProtocols.length===0)throw new Error("The `ALPNProtocols` option must be an Array with at least one entry");e.protocol=e.protocol||"https:";let i=e.protocol==="https:";e.host=e.hostname||e.host||"localhost",e.session=e.tlsSession,e.servername=e.servername||Gve(e),e.port=e.port||(i?443:80),e._defaultAgent=i?Ek.globalAgent:FW.globalAgent;let n=e.agent;if(n){if(n.addRequest)throw new Error("The `options.agent` object can contain only `http`, `https` or `http2` properties");e.agent=n[i?"https":"http"]}return i&&await Yve(e)==="h2"?(n&&(e.agent=n.http2),new Hve(e,r)):FW.request(e,r)};mk.exports.protocolCache=Oy});var MW=E((Ynt,TW)=>{"use strict";var qve=require("http2"),Jve=uk(),Ik=Ck(),Wve=gk(),zve=LW(),Vve=(t,e,r)=>new Ik(t,e,r),_ve=(t,e,r)=>{let i=new Ik(t,e,r);return i.end(),i};TW.exports=_(P(_(P({},qve),{ClientRequest:Ik,IncomingMessage:Wve}),Jve),{request:Vve,get:_ve,auto:zve})});var wk=E(yk=>{"use strict";Object.defineProperty(yk,"__esModule",{value:!0});var OW=Ca();yk.default=t=>OW.default.nodeStream(t)&&OW.default.function_(t.getBoundary)});var GW=E(Bk=>{"use strict";Object.defineProperty(Bk,"__esModule",{value:!0});var KW=require("fs"),UW=require("util"),HW=Ca(),Xve=wk(),Zve=UW.promisify(KW.stat);Bk.default=async(t,e)=>{if(e&&"content-length"in e)return Number(e["content-length"]);if(!t)return 0;if(HW.default.string(t))return Buffer.byteLength(t);if(HW.default.buffer(t))return t.length;if(Xve.default(t))return UW.promisify(t.getLength.bind(t))();if(t instanceof KW.ReadStream){let{size:r}=await Zve(t.path);return r===0?void 0:r}}});var bk=E(Qk=>{"use strict";Object.defineProperty(Qk,"__esModule",{value:!0});function $ve(t,e,r){let i={};for(let n of r)i[n]=(...s)=>{e.emit(n,...s)},t.on(n,i[n]);return()=>{for(let n of r)t.off(n,i[n])}}Qk.default=$ve});var jW=E(vk=>{"use strict";Object.defineProperty(vk,"__esModule",{value:!0});vk.default=()=>{let t=[];return{once(e,r,i){e.once(r,i),t.push({origin:e,event:r,fn:i})},unhandleAll(){for(let e of t){let{origin:r,event:i,fn:n}=e;r.removeListener(i,n)}t.length=0}}}});var qW=E(Bp=>{"use strict";Object.defineProperty(Bp,"__esModule",{value:!0});Bp.TimeoutError=void 0;var eSe=require("net"),tSe=jW(),YW=Symbol("reentry"),rSe=()=>{},Sk=class extends Error{constructor(e,r){super(`Timeout awaiting '${r}' for ${e}ms`);this.event=r,this.name="TimeoutError",this.code="ETIMEDOUT"}};Bp.TimeoutError=Sk;Bp.default=(t,e,r)=>{if(YW in t)return rSe;t[YW]=!0;let i=[],{once:n,unhandleAll:s}=tSe.default(),o=(g,f,h)=>{var p;let d=setTimeout(f,g,g,h);(p=d.unref)===null||p===void 0||p.call(d);let m=()=>{clearTimeout(d)};return i.push(m),m},{host:a,hostname:l}=r,c=(g,f)=>{t.destroy(new Sk(g,f))},u=()=>{for(let g of i)g();s()};if(t.once("error",g=>{if(u(),t.listenerCount("error")===0)throw g}),t.once("close",u),n(t,"response",g=>{n(g,"end",u)}),typeof e.request!="undefined"&&o(e.request,c,"request"),typeof e.socket!="undefined"){let g=()=>{c(e.socket,"socket")};t.setTimeout(e.socket,g),i.push(()=>{t.removeListener("timeout",g)})}return n(t,"socket",g=>{var f;let{socketPath:h}=t;if(g.connecting){let p=Boolean(h!=null?h:eSe.isIP((f=l!=null?l:a)!==null&&f!==void 0?f:"")!==0);if(typeof e.lookup!="undefined"&&!p&&typeof g.address().address=="undefined"){let d=o(e.lookup,c,"lookup");n(g,"lookup",d)}if(typeof e.connect!="undefined"){let d=()=>o(e.connect,c,"connect");p?n(g,"connect",d()):n(g,"lookup",m=>{m===null&&n(g,"connect",d())})}typeof e.secureConnect!="undefined"&&r.protocol==="https:"&&n(g,"connect",()=>{let d=o(e.secureConnect,c,"secureConnect");n(g,"secureConnect",d)})}if(typeof e.send!="undefined"){let p=()=>o(e.send,c,"send");g.connecting?n(g,"connect",()=>{n(t,"upload-complete",p())}):n(t,"upload-complete",p())}}),typeof e.response!="undefined"&&n(t,"upload-complete",()=>{let g=o(e.response,c,"response");n(t,"response",g)}),u}});var WW=E(xk=>{"use strict";Object.defineProperty(xk,"__esModule",{value:!0});var JW=Ca();xk.default=t=>{t=t;let e={protocol:t.protocol,hostname:JW.default.string(t.hostname)&&t.hostname.startsWith("[")?t.hostname.slice(1,-1):t.hostname,host:t.host,hash:t.hash,search:t.search,pathname:t.pathname,href:t.href,path:`${t.pathname||""}${t.search||""}`};return JW.default.string(t.port)&&t.port.length>0&&(e.port=Number(t.port)),(t.username||t.password)&&(e.auth=`${t.username||""}:${t.password||""}`),e}});var zW=E(kk=>{"use strict";Object.defineProperty(kk,"__esModule",{value:!0});var iSe=require("url"),nSe=["protocol","host","hostname","port","pathname","search"];kk.default=(t,e)=>{var r,i;if(e.path){if(e.pathname)throw new TypeError("Parameters `path` and `pathname` are mutually exclusive.");if(e.search)throw new TypeError("Parameters `path` and `search` are mutually exclusive.");if(e.searchParams)throw new TypeError("Parameters `path` and `searchParams` are mutually exclusive.")}if(e.search&&e.searchParams)throw new TypeError("Parameters `search` and `searchParams` are mutually exclusive.");if(!t){if(!e.protocol)throw new TypeError("No URL protocol specified");t=`${e.protocol}//${(i=(r=e.hostname)!==null&&r!==void 0?r:e.host)!==null&&i!==void 0?i:""}`}let n=new iSe.URL(t);if(e.path){let s=e.path.indexOf("?");s===-1?e.pathname=e.path:(e.pathname=e.path.slice(0,s),e.search=e.path.slice(s+1)),delete e.path}for(let s of nSe)e[s]&&(n[s]=e[s].toString());return n}});var _W=E(Pk=>{"use strict";Object.defineProperty(Pk,"__esModule",{value:!0});var VW=class{constructor(){this.weakMap=new WeakMap,this.map=new Map}set(e,r){typeof e=="object"?this.weakMap.set(e,r):this.map.set(e,r)}get(e){return typeof e=="object"?this.weakMap.get(e):this.map.get(e)}has(e){return typeof e=="object"?this.weakMap.has(e):this.map.has(e)}};Pk.default=VW});var Rk=E(Dk=>{"use strict";Object.defineProperty(Dk,"__esModule",{value:!0});var sSe=async t=>{let e=[],r=0;for await(let i of t)e.push(i),r+=Buffer.byteLength(i);return Buffer.isBuffer(e[0])?Buffer.concat(e,r):Buffer.from(e.join(""))};Dk.default=sSe});var ZW=E(ql=>{"use strict";Object.defineProperty(ql,"__esModule",{value:!0});ql.dnsLookupIpVersionToFamily=ql.isDnsLookupIpVersion=void 0;var XW={auto:0,ipv4:4,ipv6:6};ql.isDnsLookupIpVersion=t=>t in XW;ql.dnsLookupIpVersionToFamily=t=>{if(ql.isDnsLookupIpVersion(t))return XW[t];throw new Error("Invalid DNS lookup IP version")}});var Fk=E(Ky=>{"use strict";Object.defineProperty(Ky,"__esModule",{value:!0});Ky.isResponseOk=void 0;Ky.isResponseOk=t=>{let{statusCode:e}=t,r=t.request.options.followRedirect?299:399;return e>=200&&e<=r||e===304}});var e8=E(Nk=>{"use strict";Object.defineProperty(Nk,"__esModule",{value:!0});var $W=new Set;Nk.default=t=>{$W.has(t)||($W.add(t),process.emitWarning(`Got: ${t}`,{type:"DeprecationWarning"}))}});var t8=E(Lk=>{"use strict";Object.defineProperty(Lk,"__esModule",{value:!0});var ar=Ca(),oSe=(t,e)=>{if(ar.default.null_(t.encoding))throw new TypeError("To get a Buffer, set `options.responseType` to `buffer` instead");ar.assert.any([ar.default.string,ar.default.undefined],t.encoding),ar.assert.any([ar.default.boolean,ar.default.undefined],t.resolveBodyOnly),ar.assert.any([ar.default.boolean,ar.default.undefined],t.methodRewriting),ar.assert.any([ar.default.boolean,ar.default.undefined],t.isStream),ar.assert.any([ar.default.string,ar.default.undefined],t.responseType),t.responseType===void 0&&(t.responseType="text");let{retry:r}=t;if(e?t.retry=P({},e.retry):t.retry={calculateDelay:i=>i.computedValue,limit:0,methods:[],statusCodes:[],errorCodes:[],maxRetryAfter:void 0},ar.default.object(r)?(t.retry=P(P({},t.retry),r),t.retry.methods=[...new Set(t.retry.methods.map(i=>i.toUpperCase()))],t.retry.statusCodes=[...new Set(t.retry.statusCodes)],t.retry.errorCodes=[...new Set(t.retry.errorCodes)]):ar.default.number(r)&&(t.retry.limit=r),ar.default.undefined(t.retry.maxRetryAfter)&&(t.retry.maxRetryAfter=Math.min(...[t.timeout.request,t.timeout.connect].filter(ar.default.number))),ar.default.object(t.pagination)){e&&(t.pagination=P(P({},e.pagination),t.pagination));let{pagination:i}=t;if(!ar.default.function_(i.transform))throw new Error("`options.pagination.transform` must be implemented");if(!ar.default.function_(i.shouldContinue))throw new Error("`options.pagination.shouldContinue` must be implemented");if(!ar.default.function_(i.filter))throw new TypeError("`options.pagination.filter` must be implemented");if(!ar.default.function_(i.paginate))throw new Error("`options.pagination.paginate` must be implemented")}return t.responseType==="json"&&t.headers.accept===void 0&&(t.headers.accept="application/json"),t};Lk.default=oSe});var r8=E(Qp=>{"use strict";Object.defineProperty(Qp,"__esModule",{value:!0});Qp.retryAfterStatusCodes=void 0;Qp.retryAfterStatusCodes=new Set([413,429,503]);var aSe=({attemptCount:t,retryOptions:e,error:r,retryAfter:i})=>{if(t>e.limit)return 0;let n=e.methods.includes(r.options.method),s=e.errorCodes.includes(r.code),o=r.response&&e.statusCodes.includes(r.response.statusCode);if(!n||!s&&!o)return 0;if(r.response){if(i)return e.maxRetryAfter===void 0||i>e.maxRetryAfter?0:i;if(r.response.statusCode===413)return 0}let a=Math.random()*100;return 2**(t-1)*1e3+a};Qp.default=aSe});var vp=E(Rt=>{"use strict";Object.defineProperty(Rt,"__esModule",{value:!0});Rt.UnsupportedProtocolError=Rt.ReadError=Rt.TimeoutError=Rt.UploadError=Rt.CacheError=Rt.HTTPError=Rt.MaxRedirectsError=Rt.RequestError=Rt.setNonEnumerableProperties=Rt.knownHookEvents=Rt.withoutBody=Rt.kIsNormalizedAlready=void 0;var i8=require("util"),n8=require("stream"),ASe=require("fs"),dA=require("url"),s8=require("http"),Tk=require("http"),lSe=require("https"),cSe=h3(),uSe=y3(),o8=tW(),gSe=sW(),fSe=MW(),hSe=Ly(),ce=Ca(),pSe=GW(),a8=wk(),dSe=bk(),A8=qW(),CSe=WW(),l8=zW(),mSe=_W(),ESe=Rk(),c8=ZW(),ISe=Fk(),CA=e8(),ySe=t8(),wSe=r8(),Mk,Ei=Symbol("request"),Uy=Symbol("response"),Ju=Symbol("responseSize"),Wu=Symbol("downloadedSize"),zu=Symbol("bodySize"),Vu=Symbol("uploadedSize"),Hy=Symbol("serverResponsesPiped"),u8=Symbol("unproxyEvents"),g8=Symbol("isFromCache"),Ok=Symbol("cancelTimeouts"),f8=Symbol("startedReading"),_u=Symbol("stopReading"),Gy=Symbol("triggerRead"),mA=Symbol("body"),bp=Symbol("jobs"),h8=Symbol("originalResponse"),p8=Symbol("retryTimeout");Rt.kIsNormalizedAlready=Symbol("isNormalizedAlready");var BSe=ce.default.string(process.versions.brotli);Rt.withoutBody=new Set(["GET","HEAD"]);Rt.knownHookEvents=["init","beforeRequest","beforeRedirect","beforeError","beforeRetry","afterResponse"];function QSe(t){for(let e in t){let r=t[e];if(!ce.default.string(r)&&!ce.default.number(r)&&!ce.default.boolean(r)&&!ce.default.null_(r)&&!ce.default.undefined(r))throw new TypeError(`The \`searchParams\` value '${String(r)}' must be a string, number, boolean or null`)}}function bSe(t){return ce.default.object(t)&&!("statusCode"in t)}var Kk=new mSe.default,vSe=async t=>new Promise((e,r)=>{let i=n=>{r(n)};t.pending||e(),t.once("error",i),t.once("ready",()=>{t.off("error",i),e()})}),SSe=new Set([300,301,302,303,304,307,308]),xSe=["context","body","json","form"];Rt.setNonEnumerableProperties=(t,e)=>{let r={};for(let i of t)if(!!i)for(let n of xSe)n in i&&(r[n]={writable:!0,configurable:!0,enumerable:!1,value:i[n]});Object.defineProperties(e,r)};var _r=class extends Error{constructor(e,r,i){var n;super(e);if(Error.captureStackTrace(this,this.constructor),this.name="RequestError",this.code=r.code,i instanceof Uk?(Object.defineProperty(this,"request",{enumerable:!1,value:i}),Object.defineProperty(this,"response",{enumerable:!1,value:i[Uy]}),Object.defineProperty(this,"options",{enumerable:!1,value:i.options})):Object.defineProperty(this,"options",{enumerable:!1,value:i}),this.timings=(n=this.request)===null||n===void 0?void 0:n.timings,ce.default.string(r.stack)&&ce.default.string(this.stack)){let s=this.stack.indexOf(this.message)+this.message.length,o=this.stack.slice(s).split(` +`).reverse(),a=r.stack.slice(r.stack.indexOf(r.message)+r.message.length).split(` +`).reverse();for(;a.length!==0&&a[0]===o[0];)o.shift();this.stack=`${this.stack.slice(0,s)}${o.reverse().join(` +`)}${a.reverse().join(` +`)}`}}};Rt.RequestError=_r;var Hk=class extends _r{constructor(e){super(`Redirected ${e.options.maxRedirects} times. Aborting.`,{},e);this.name="MaxRedirectsError"}};Rt.MaxRedirectsError=Hk;var Gk=class extends _r{constructor(e){super(`Response code ${e.statusCode} (${e.statusMessage})`,{},e.request);this.name="HTTPError"}};Rt.HTTPError=Gk;var jk=class extends _r{constructor(e,r){super(e.message,e,r);this.name="CacheError"}};Rt.CacheError=jk;var Yk=class extends _r{constructor(e,r){super(e.message,e,r);this.name="UploadError"}};Rt.UploadError=Yk;var qk=class extends _r{constructor(e,r,i){super(e.message,e,i);this.name="TimeoutError",this.event=e.event,this.timings=r}};Rt.TimeoutError=qk;var jy=class extends _r{constructor(e,r){super(e.message,e,r);this.name="ReadError"}};Rt.ReadError=jy;var Jk=class extends _r{constructor(e){super(`Unsupported protocol "${e.url.protocol}"`,{},e);this.name="UnsupportedProtocolError"}};Rt.UnsupportedProtocolError=Jk;var kSe=["socket","connect","continue","information","upgrade","timeout"],Uk=class extends n8.Duplex{constructor(e,r={},i){super({autoDestroy:!1,highWaterMark:0});this[Wu]=0,this[Vu]=0,this.requestInitialized=!1,this[Hy]=new Set,this.redirects=[],this[_u]=!1,this[Gy]=!1,this[bp]=[],this.retryCount=0,this._progressCallbacks=[];let n=()=>this._unlockWrite(),s=()=>this._lockWrite();this.on("pipe",c=>{c.prependListener("data",n),c.on("data",s),c.prependListener("end",n),c.on("end",s)}),this.on("unpipe",c=>{c.off("data",n),c.off("data",s),c.off("end",n),c.off("end",s)}),this.on("pipe",c=>{c instanceof Tk.IncomingMessage&&(this.options.headers=P(P({},c.headers),this.options.headers))});let{json:o,body:a,form:l}=r;if((o||a||l)&&this._lockWrite(),Rt.kIsNormalizedAlready in r)this.options=r;else try{this.options=this.constructor.normalizeArguments(e,r,i)}catch(c){ce.default.nodeStream(r.body)&&r.body.destroy(),this.destroy(c);return}(async()=>{var c;try{this.options.body instanceof ASe.ReadStream&&await vSe(this.options.body);let{url:u}=this.options;if(!u)throw new TypeError("Missing `url` property");if(this.requestUrl=u.toString(),decodeURI(this.requestUrl),await this._finalizeBody(),await this._makeRequest(),this.destroyed){(c=this[Ei])===null||c===void 0||c.destroy();return}for(let g of this[bp])g();this[bp].length=0,this.requestInitialized=!0}catch(u){if(u instanceof _r){this._beforeError(u);return}this.destroyed||this.destroy(u)}})()}static normalizeArguments(e,r,i){var n,s,o,a,l;let c=r;if(ce.default.object(e)&&!ce.default.urlInstance(e))r=P(P(P({},i),e),r);else{if(e&&r&&r.url!==void 0)throw new TypeError("The `url` option is mutually exclusive with the `input` argument");r=P(P({},i),r),e!==void 0&&(r.url=e),ce.default.urlInstance(r.url)&&(r.url=new dA.URL(r.url.toString()))}if(r.cache===!1&&(r.cache=void 0),r.dnsCache===!1&&(r.dnsCache=void 0),ce.assert.any([ce.default.string,ce.default.undefined],r.method),ce.assert.any([ce.default.object,ce.default.undefined],r.headers),ce.assert.any([ce.default.string,ce.default.urlInstance,ce.default.undefined],r.prefixUrl),ce.assert.any([ce.default.object,ce.default.undefined],r.cookieJar),ce.assert.any([ce.default.object,ce.default.string,ce.default.undefined],r.searchParams),ce.assert.any([ce.default.object,ce.default.string,ce.default.undefined],r.cache),ce.assert.any([ce.default.object,ce.default.number,ce.default.undefined],r.timeout),ce.assert.any([ce.default.object,ce.default.undefined],r.context),ce.assert.any([ce.default.object,ce.default.undefined],r.hooks),ce.assert.any([ce.default.boolean,ce.default.undefined],r.decompress),ce.assert.any([ce.default.boolean,ce.default.undefined],r.ignoreInvalidCookies),ce.assert.any([ce.default.boolean,ce.default.undefined],r.followRedirect),ce.assert.any([ce.default.number,ce.default.undefined],r.maxRedirects),ce.assert.any([ce.default.boolean,ce.default.undefined],r.throwHttpErrors),ce.assert.any([ce.default.boolean,ce.default.undefined],r.http2),ce.assert.any([ce.default.boolean,ce.default.undefined],r.allowGetBody),ce.assert.any([ce.default.string,ce.default.undefined],r.localAddress),ce.assert.any([c8.isDnsLookupIpVersion,ce.default.undefined],r.dnsLookupIpVersion),ce.assert.any([ce.default.object,ce.default.undefined],r.https),ce.assert.any([ce.default.boolean,ce.default.undefined],r.rejectUnauthorized),r.https&&(ce.assert.any([ce.default.boolean,ce.default.undefined],r.https.rejectUnauthorized),ce.assert.any([ce.default.function_,ce.default.undefined],r.https.checkServerIdentity),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.certificateAuthority),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.key),ce.assert.any([ce.default.string,ce.default.object,ce.default.array,ce.default.undefined],r.https.certificate),ce.assert.any([ce.default.string,ce.default.undefined],r.https.passphrase),ce.assert.any([ce.default.string,ce.default.buffer,ce.default.array,ce.default.undefined],r.https.pfx)),ce.assert.any([ce.default.object,ce.default.undefined],r.cacheOptions),ce.default.string(r.method)?r.method=r.method.toUpperCase():r.method="GET",r.headers===(i==null?void 0:i.headers)?r.headers=P({},r.headers):r.headers=hSe(P(P({},i==null?void 0:i.headers),r.headers)),"slashes"in r)throw new TypeError("The legacy `url.Url` has been deprecated. Use `URL` instead.");if("auth"in r)throw new TypeError("Parameter `auth` is deprecated. Use `username` / `password` instead.");if("searchParams"in r&&r.searchParams&&r.searchParams!==(i==null?void 0:i.searchParams)){let h;if(ce.default.string(r.searchParams)||r.searchParams instanceof dA.URLSearchParams)h=new dA.URLSearchParams(r.searchParams);else{QSe(r.searchParams),h=new dA.URLSearchParams;for(let p in r.searchParams){let d=r.searchParams[p];d===null?h.append(p,""):d!==void 0&&h.append(p,d)}}(n=i==null?void 0:i.searchParams)===null||n===void 0||n.forEach((p,d)=>{h.has(d)||h.append(d,p)}),r.searchParams=h}if(r.username=(s=r.username)!==null&&s!==void 0?s:"",r.password=(o=r.password)!==null&&o!==void 0?o:"",ce.default.undefined(r.prefixUrl)?r.prefixUrl=(a=i==null?void 0:i.prefixUrl)!==null&&a!==void 0?a:"":(r.prefixUrl=r.prefixUrl.toString(),r.prefixUrl!==""&&!r.prefixUrl.endsWith("/")&&(r.prefixUrl+="/")),ce.default.string(r.url)){if(r.url.startsWith("/"))throw new Error("`input` must not start with a slash when using `prefixUrl`");r.url=l8.default(r.prefixUrl+r.url,r)}else(ce.default.undefined(r.url)&&r.prefixUrl!==""||r.protocol)&&(r.url=l8.default(r.prefixUrl,r));if(r.url){"port"in r&&delete r.port;let{prefixUrl:h}=r;Object.defineProperty(r,"prefixUrl",{set:d=>{let m=r.url;if(!m.href.startsWith(d))throw new Error(`Cannot change \`prefixUrl\` from ${h} to ${d}: ${m.href}`);r.url=new dA.URL(d+m.href.slice(h.length)),h=d},get:()=>h});let{protocol:p}=r.url;if(p==="unix:"&&(p="http:",r.url=new dA.URL(`http://unix${r.url.pathname}${r.url.search}`)),r.searchParams&&(r.url.search=r.searchParams.toString()),p!=="http:"&&p!=="https:")throw new Jk(r);r.username===""?r.username=r.url.username:r.url.username=r.username,r.password===""?r.password=r.url.password:r.url.password=r.password}let{cookieJar:u}=r;if(u){let{setCookie:h,getCookieString:p}=u;ce.assert.function_(h),ce.assert.function_(p),h.length===4&&p.length===0&&(h=i8.promisify(h.bind(r.cookieJar)),p=i8.promisify(p.bind(r.cookieJar)),r.cookieJar={setCookie:h,getCookieString:p})}let{cache:g}=r;if(g&&(Kk.has(g)||Kk.set(g,new o8((h,p)=>{let d=h[Ei](h,p);return ce.default.promise(d)&&(d.once=(m,I)=>{if(m==="error")d.catch(I);else if(m==="abort")(async()=>{try{(await d).once("abort",I)}catch(B){}})();else throw new Error(`Unknown HTTP2 promise event: ${m}`);return d}),d},g))),r.cacheOptions=P({},r.cacheOptions),r.dnsCache===!0)Mk||(Mk=new uSe.default),r.dnsCache=Mk;else if(!ce.default.undefined(r.dnsCache)&&!r.dnsCache.lookup)throw new TypeError(`Parameter \`dnsCache\` must be a CacheableLookup instance or a boolean, got ${ce.default(r.dnsCache)}`);ce.default.number(r.timeout)?r.timeout={request:r.timeout}:i&&r.timeout!==i.timeout?r.timeout=P(P({},i.timeout),r.timeout):r.timeout=P({},r.timeout),r.context||(r.context={});let f=r.hooks===(i==null?void 0:i.hooks);r.hooks=P({},r.hooks);for(let h of Rt.knownHookEvents)if(h in r.hooks)if(ce.default.array(r.hooks[h]))r.hooks[h]=[...r.hooks[h]];else throw new TypeError(`Parameter \`${h}\` must be an Array, got ${ce.default(r.hooks[h])}`);else r.hooks[h]=[];if(i&&!f)for(let h of Rt.knownHookEvents)i.hooks[h].length>0&&(r.hooks[h]=[...i.hooks[h],...r.hooks[h]]);if("family"in r&&CA.default('"options.family" was never documented, please use "options.dnsLookupIpVersion"'),(i==null?void 0:i.https)&&(r.https=P(P({},i.https),r.https)),"rejectUnauthorized"in r&&CA.default('"options.rejectUnauthorized" is now deprecated, please use "options.https.rejectUnauthorized"'),"checkServerIdentity"in r&&CA.default('"options.checkServerIdentity" was never documented, please use "options.https.checkServerIdentity"'),"ca"in r&&CA.default('"options.ca" was never documented, please use "options.https.certificateAuthority"'),"key"in r&&CA.default('"options.key" was never documented, please use "options.https.key"'),"cert"in r&&CA.default('"options.cert" was never documented, please use "options.https.certificate"'),"passphrase"in r&&CA.default('"options.passphrase" was never documented, please use "options.https.passphrase"'),"pfx"in r&&CA.default('"options.pfx" was never documented, please use "options.https.pfx"'),"followRedirects"in r)throw new TypeError("The `followRedirects` option does not exist. Use `followRedirect` instead.");if(r.agent){for(let h in r.agent)if(h!=="http"&&h!=="https"&&h!=="http2")throw new TypeError(`Expected the \`options.agent\` properties to be \`http\`, \`https\` or \`http2\`, got \`${h}\``)}return r.maxRedirects=(l=r.maxRedirects)!==null&&l!==void 0?l:0,Rt.setNonEnumerableProperties([i,c],r),ySe.default(r,i)}_lockWrite(){let e=()=>{throw new TypeError("The payload has been already provided")};this.write=e,this.end=e}_unlockWrite(){this.write=super.write,this.end=super.end}async _finalizeBody(){let{options:e}=this,{headers:r}=e,i=!ce.default.undefined(e.form),n=!ce.default.undefined(e.json),s=!ce.default.undefined(e.body),o=i||n||s,a=Rt.withoutBody.has(e.method)&&!(e.method==="GET"&&e.allowGetBody);if(this._cannotHaveBody=a,o){if(a)throw new TypeError(`The \`${e.method}\` method cannot be used with a body`);if([s,i,n].filter(l=>l).length>1)throw new TypeError("The `body`, `json` and `form` options are mutually exclusive");if(s&&!(e.body instanceof n8.Readable)&&!ce.default.string(e.body)&&!ce.default.buffer(e.body)&&!a8.default(e.body))throw new TypeError("The `body` option must be a stream.Readable, string or Buffer");if(i&&!ce.default.object(e.form))throw new TypeError("The `form` option must be an Object");{let l=!ce.default.string(r["content-type"]);s?(a8.default(e.body)&&l&&(r["content-type"]=`multipart/form-data; boundary=${e.body.getBoundary()}`),this[mA]=e.body):i?(l&&(r["content-type"]="application/x-www-form-urlencoded"),this[mA]=new dA.URLSearchParams(e.form).toString()):(l&&(r["content-type"]="application/json"),this[mA]=e.stringifyJson(e.json));let c=await pSe.default(this[mA],e.headers);ce.default.undefined(r["content-length"])&&ce.default.undefined(r["transfer-encoding"])&&!a&&!ce.default.undefined(c)&&(r["content-length"]=String(c))}}else a?this._lockWrite():this._unlockWrite();this[zu]=Number(r["content-length"])||void 0}async _onResponseBase(e){let{options:r}=this,{url:i}=r;this[h8]=e,r.decompress&&(e=gSe(e));let n=e.statusCode,s=e;s.statusMessage=s.statusMessage?s.statusMessage:s8.STATUS_CODES[n],s.url=r.url.toString(),s.requestUrl=this.requestUrl,s.redirectUrls=this.redirects,s.request=this,s.isFromCache=e.fromCache||!1,s.ip=this.ip,s.retryCount=this.retryCount,this[g8]=s.isFromCache,this[Ju]=Number(e.headers["content-length"])||void 0,this[Uy]=e,e.once("end",()=>{this[Ju]=this[Wu],this.emit("downloadProgress",this.downloadProgress)}),e.once("error",a=>{e.destroy(),this._beforeError(new jy(a,this))}),e.once("aborted",()=>{this._beforeError(new jy({name:"Error",message:"The server aborted pending request",code:"ECONNRESET"},this))}),this.emit("downloadProgress",this.downloadProgress);let o=e.headers["set-cookie"];if(ce.default.object(r.cookieJar)&&o){let a=o.map(async l=>r.cookieJar.setCookie(l,i.toString()));r.ignoreInvalidCookies&&(a=a.map(async l=>l.catch(()=>{})));try{await Promise.all(a)}catch(l){this._beforeError(l);return}}if(r.followRedirect&&e.headers.location&&SSe.has(n)){if(e.resume(),this[Ei]&&(this[Ok](),delete this[Ei],this[u8]()),(n===303&&r.method!=="GET"&&r.method!=="HEAD"||!r.methodRewriting)&&(r.method="GET","body"in r&&delete r.body,"json"in r&&delete r.json,"form"in r&&delete r.form,this[mA]=void 0,delete r.headers["content-length"]),this.redirects.length>=r.maxRedirects){this._beforeError(new Hk(this));return}try{let l=Buffer.from(e.headers.location,"binary").toString(),c=new dA.URL(l,i),u=c.toString();decodeURI(u),c.hostname!==i.hostname||c.port!==i.port?("host"in r.headers&&delete r.headers.host,"cookie"in r.headers&&delete r.headers.cookie,"authorization"in r.headers&&delete r.headers.authorization,(r.username||r.password)&&(r.username="",r.password="")):(c.username=r.username,c.password=r.password),this.redirects.push(u),r.url=c;for(let g of r.hooks.beforeRedirect)await g(r,s);this.emit("redirect",s,r),await this._makeRequest()}catch(l){this._beforeError(l);return}return}if(r.isStream&&r.throwHttpErrors&&!ISe.isResponseOk(s)){this._beforeError(new Gk(s));return}e.on("readable",()=>{this[Gy]&&this._read()}),this.on("resume",()=>{e.resume()}),this.on("pause",()=>{e.pause()}),e.once("end",()=>{this.push(null)}),this.emit("response",e);for(let a of this[Hy])if(!a.headersSent){for(let l in e.headers){let c=r.decompress?l!=="content-encoding":!0,u=e.headers[l];c&&a.setHeader(l,u)}a.statusCode=n}}async _onResponse(e){try{await this._onResponseBase(e)}catch(r){this._beforeError(r)}}_onRequest(e){let{options:r}=this,{timeout:i,url:n}=r;cSe.default(e),this[Ok]=A8.default(e,i,n);let s=r.cache?"cacheableResponse":"response";e.once(s,l=>{this._onResponse(l)}),e.once("error",l=>{var c;e.destroy(),(c=e.res)===null||c===void 0||c.removeAllListeners("end"),l=l instanceof A8.TimeoutError?new qk(l,this.timings,this):new _r(l.message,l,this),this._beforeError(l)}),this[u8]=dSe.default(e,this,kSe),this[Ei]=e,this.emit("uploadProgress",this.uploadProgress);let o=this[mA],a=this.redirects.length===0?this:e;ce.default.nodeStream(o)?(o.pipe(a),o.once("error",l=>{this._beforeError(new Yk(l,this))})):(this._unlockWrite(),ce.default.undefined(o)?(this._cannotHaveBody||this._noPipe)&&(a.end(),this._lockWrite()):(this._writeRequest(o,void 0,()=>{}),a.end(),this._lockWrite())),this.emit("request",e)}async _createCacheableRequest(e,r){return new Promise((i,n)=>{Object.assign(r,CSe.default(e)),delete r.url;let s,o=Kk.get(r.cache)(r,async a=>{a._readableState.autoDestroy=!1,s&&(await s).emit("cacheableResponse",a),i(a)});r.url=e,o.once("error",n),o.once("request",async a=>{s=a,i(s)})})}async _makeRequest(){var e,r,i,n,s;let{options:o}=this,{headers:a}=o;for(let I in a)if(ce.default.undefined(a[I]))delete a[I];else if(ce.default.null_(a[I]))throw new TypeError(`Use \`undefined\` instead of \`null\` to delete the \`${I}\` header`);if(o.decompress&&ce.default.undefined(a["accept-encoding"])&&(a["accept-encoding"]=BSe?"gzip, deflate, br":"gzip, deflate"),o.cookieJar){let I=await o.cookieJar.getCookieString(o.url.toString());ce.default.nonEmptyString(I)&&(o.headers.cookie=I)}for(let I of o.hooks.beforeRequest){let B=await I(o);if(!ce.default.undefined(B)){o.request=()=>B;break}}o.body&&this[mA]!==o.body&&(this[mA]=o.body);let{agent:l,request:c,timeout:u,url:g}=o;if(o.dnsCache&&!("lookup"in o)&&(o.lookup=o.dnsCache.lookup),g.hostname==="unix"){let I=/(?.+?):(?.+)/.exec(`${g.pathname}${g.search}`);if(I==null?void 0:I.groups){let{socketPath:B,path:b}=I.groups;Object.assign(o,{socketPath:B,path:b,host:""})}}let f=g.protocol==="https:",h;o.http2?h=fSe.auto:h=f?lSe.request:s8.request;let p=(e=o.request)!==null&&e!==void 0?e:h,d=o.cache?this._createCacheableRequest:p;l&&!o.http2&&(o.agent=l[f?"https":"http"]),o[Ei]=p,delete o.request,delete o.timeout;let m=o;if(m.shared=(r=o.cacheOptions)===null||r===void 0?void 0:r.shared,m.cacheHeuristic=(i=o.cacheOptions)===null||i===void 0?void 0:i.cacheHeuristic,m.immutableMinTimeToLive=(n=o.cacheOptions)===null||n===void 0?void 0:n.immutableMinTimeToLive,m.ignoreCargoCult=(s=o.cacheOptions)===null||s===void 0?void 0:s.ignoreCargoCult,o.dnsLookupIpVersion!==void 0)try{m.family=c8.dnsLookupIpVersionToFamily(o.dnsLookupIpVersion)}catch(I){throw new Error("Invalid `dnsLookupIpVersion` option value")}o.https&&("rejectUnauthorized"in o.https&&(m.rejectUnauthorized=o.https.rejectUnauthorized),o.https.checkServerIdentity&&(m.checkServerIdentity=o.https.checkServerIdentity),o.https.certificateAuthority&&(m.ca=o.https.certificateAuthority),o.https.certificate&&(m.cert=o.https.certificate),o.https.key&&(m.key=o.https.key),o.https.passphrase&&(m.passphrase=o.https.passphrase),o.https.pfx&&(m.pfx=o.https.pfx));try{let I=await d(g,m);ce.default.undefined(I)&&(I=h(g,m)),o.request=c,o.timeout=u,o.agent=l,o.https&&("rejectUnauthorized"in o.https&&delete m.rejectUnauthorized,o.https.checkServerIdentity&&delete m.checkServerIdentity,o.https.certificateAuthority&&delete m.ca,o.https.certificate&&delete m.cert,o.https.key&&delete m.key,o.https.passphrase&&delete m.passphrase,o.https.pfx&&delete m.pfx),bSe(I)?this._onRequest(I):this.writable?(this.once("finish",()=>{this._onResponse(I)}),this._unlockWrite(),this.end(),this._lockWrite()):this._onResponse(I)}catch(I){throw I instanceof o8.CacheError?new jk(I,this):new _r(I.message,I,this)}}async _error(e){try{for(let r of this.options.hooks.beforeError)e=await r(e)}catch(r){e=new _r(r.message,r,this)}this.destroy(e)}_beforeError(e){if(this[_u])return;let{options:r}=this,i=this.retryCount+1;this[_u]=!0,e instanceof _r||(e=new _r(e.message,e,this));let n=e,{response:s}=n;(async()=>{if(s&&!s.body){s.setEncoding(this._readableState.encoding);try{s.rawBody=await ESe.default(s),s.body=s.rawBody.toString()}catch(o){}}if(this.listenerCount("retry")!==0){let o;try{let a;s&&"retry-after"in s.headers&&(a=Number(s.headers["retry-after"]),Number.isNaN(a)?(a=Date.parse(s.headers["retry-after"])-Date.now(),a<=0&&(a=1)):a*=1e3),o=await r.retry.calculateDelay({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:wSe.default({attemptCount:i,retryOptions:r.retry,error:n,retryAfter:a,computedValue:0})})}catch(a){this._error(new _r(a.message,a,this));return}if(o){let a=async()=>{try{for(let l of this.options.hooks.beforeRetry)await l(this.options,n,i)}catch(l){this._error(new _r(l.message,e,this));return}this.destroyed||(this.destroy(),this.emit("retry",i,e))};this[p8]=setTimeout(a,o);return}}this._error(n)})()}_read(){this[Gy]=!0;let e=this[Uy];if(e&&!this[_u]){e.readableLength&&(this[Gy]=!1);let r;for(;(r=e.read())!==null;){this[Wu]+=r.length,this[f8]=!0;let i=this.downloadProgress;i.percent<1&&this.emit("downloadProgress",i),this.push(r)}}}_write(e,r,i){let n=()=>{this._writeRequest(e,r,i)};this.requestInitialized?n():this[bp].push(n)}_writeRequest(e,r,i){this[Ei].destroyed||(this._progressCallbacks.push(()=>{this[Vu]+=Buffer.byteLength(e,r);let n=this.uploadProgress;n.percent<1&&this.emit("uploadProgress",n)}),this[Ei].write(e,r,n=>{!n&&this._progressCallbacks.length>0&&this._progressCallbacks.shift()(),i(n)}))}_final(e){let r=()=>{for(;this._progressCallbacks.length!==0;)this._progressCallbacks.shift()();if(!(Ei in this)){e();return}if(this[Ei].destroyed){e();return}this[Ei].end(i=>{i||(this[zu]=this[Vu],this.emit("uploadProgress",this.uploadProgress),this[Ei].emit("upload-complete")),e(i)})};this.requestInitialized?r():this[bp].push(r)}_destroy(e,r){var i;this[_u]=!0,clearTimeout(this[p8]),Ei in this&&(this[Ok](),((i=this[Uy])===null||i===void 0?void 0:i.complete)||this[Ei].destroy()),e!==null&&!ce.default.undefined(e)&&!(e instanceof _r)&&(e=new _r(e.message,e,this)),r(e)}get _isAboutToError(){return this[_u]}get ip(){var e;return(e=this.socket)===null||e===void 0?void 0:e.remoteAddress}get aborted(){var e,r,i;return((r=(e=this[Ei])===null||e===void 0?void 0:e.destroyed)!==null&&r!==void 0?r:this.destroyed)&&!((i=this[h8])===null||i===void 0?void 0:i.complete)}get socket(){var e,r;return(r=(e=this[Ei])===null||e===void 0?void 0:e.socket)!==null&&r!==void 0?r:void 0}get downloadProgress(){let e;return this[Ju]?e=this[Wu]/this[Ju]:this[Ju]===this[Wu]?e=1:e=0,{percent:e,transferred:this[Wu],total:this[Ju]}}get uploadProgress(){let e;return this[zu]?e=this[Vu]/this[zu]:this[zu]===this[Vu]?e=1:e=0,{percent:e,transferred:this[Vu],total:this[zu]}}get timings(){var e;return(e=this[Ei])===null||e===void 0?void 0:e.timings}get isFromCache(){return this[g8]}pipe(e,r){if(this[f8])throw new Error("Failed to pipe. The response has been emitted already.");return e instanceof Tk.ServerResponse&&this[Hy].add(e),super.pipe(e,r)}unpipe(e){return e instanceof Tk.ServerResponse&&this[Hy].delete(e),super.unpipe(e),this}};Rt.default=Uk});var Sp=E(Ms=>{"use strict";var PSe=Ms&&Ms.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),DSe=Ms&&Ms.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&PSe(e,t,r)};Object.defineProperty(Ms,"__esModule",{value:!0});Ms.CancelError=Ms.ParseError=void 0;var d8=vp(),C8=class extends d8.RequestError{constructor(e,r){let{options:i}=r.request;super(`${e.message} in "${i.url.toString()}"`,e,r.request);this.name="ParseError"}};Ms.ParseError=C8;var m8=class extends d8.RequestError{constructor(e){super("Promise was canceled",{},e);this.name="CancelError"}get isCanceled(){return!0}};Ms.CancelError=m8;DSe(vp(),Ms)});var I8=E(Wk=>{"use strict";Object.defineProperty(Wk,"__esModule",{value:!0});var E8=Sp(),RSe=(t,e,r,i)=>{let{rawBody:n}=t;try{if(e==="text")return n.toString(i);if(e==="json")return n.length===0?"":r(n.toString());if(e==="buffer")return n;throw new E8.ParseError({message:`Unknown body type '${e}'`,name:"Error"},t)}catch(s){throw new E8.ParseError(s,t)}};Wk.default=RSe});var zk=E(EA=>{"use strict";var FSe=EA&&EA.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),NSe=EA&&EA.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&FSe(e,t,r)};Object.defineProperty(EA,"__esModule",{value:!0});var LSe=require("events"),TSe=Ca(),MSe=g3(),Yy=Sp(),y8=I8(),w8=vp(),OSe=bk(),KSe=Rk(),B8=Fk(),USe=["request","response","redirect","uploadProgress","downloadProgress"];function Q8(t){let e,r,i=new LSe.EventEmitter,n=new MSe((o,a,l)=>{let c=u=>{let g=new w8.default(void 0,t);g.retryCount=u,g._noPipe=!0,l(()=>g.destroy()),l.shouldReject=!1,l(()=>a(new Yy.CancelError(g))),e=g,g.once("response",async p=>{var d;if(p.retryCount=u,p.request.aborted)return;let m;try{m=await KSe.default(g),p.rawBody=m}catch(R){return}if(g._isAboutToError)return;let I=((d=p.headers["content-encoding"])!==null&&d!==void 0?d:"").toLowerCase(),B=["gzip","deflate","br"].includes(I),{options:b}=g;if(B&&!b.decompress)p.body=m;else try{p.body=y8.default(p,b.responseType,b.parseJson,b.encoding)}catch(R){if(p.body=m.toString(),B8.isResponseOk(p)){g._beforeError(R);return}}try{for(let[R,H]of b.hooks.afterResponse.entries())p=await H(p,async L=>{let K=w8.default.normalizeArguments(void 0,_(P({},L),{retry:{calculateDelay:()=>0},throwHttpErrors:!1,resolveBodyOnly:!1}),b);K.hooks.afterResponse=K.hooks.afterResponse.slice(0,R);for(let ne of K.hooks.beforeRetry)await ne(K);let J=Q8(K);return l(()=>{J.catch(()=>{}),J.cancel()}),J})}catch(R){g._beforeError(new Yy.RequestError(R.message,R,g));return}if(!B8.isResponseOk(p)){g._beforeError(new Yy.HTTPError(p));return}r=p,o(g.options.resolveBodyOnly?p.body:p)});let f=p=>{if(n.isCanceled)return;let{options:d}=g;if(p instanceof Yy.HTTPError&&!d.throwHttpErrors){let{response:m}=p;o(g.options.resolveBodyOnly?m.body:m);return}a(p)};g.once("error",f);let h=g.options.body;g.once("retry",(p,d)=>{var m,I;if(h===((m=d.request)===null||m===void 0?void 0:m.options.body)&&TSe.default.nodeStream((I=d.request)===null||I===void 0?void 0:I.options.body)){f(d);return}c(p)}),OSe.default(g,i,USe)};c(0)});n.on=(o,a)=>(i.on(o,a),n);let s=o=>{let a=(async()=>{await n;let{options:l}=r.request;return y8.default(r,o,l.parseJson,l.encoding)})();return Object.defineProperties(a,Object.getOwnPropertyDescriptors(n)),a};return n.json=()=>{let{headers:o}=e.options;return!e.writableFinished&&o.accept===void 0&&(o.accept="application/json"),s("json")},n.buffer=()=>s("buffer"),n.text=()=>s("text"),n}EA.default=Q8;NSe(Sp(),EA)});var b8=E(Vk=>{"use strict";Object.defineProperty(Vk,"__esModule",{value:!0});var HSe=Sp();function GSe(t,...e){let r=(async()=>{if(t instanceof HSe.RequestError)try{for(let n of e)if(n)for(let s of n)t=await s(t)}catch(n){t=n}throw t})(),i=()=>r;return r.json=i,r.text=i,r.buffer=i,r.on=i,r}Vk.default=GSe});var x8=E(_k=>{"use strict";Object.defineProperty(_k,"__esModule",{value:!0});var v8=Ca();function S8(t){for(let e of Object.values(t))(v8.default.plainObject(e)||v8.default.array(e))&&S8(e);return Object.freeze(t)}_k.default=S8});var P8=E(k8=>{"use strict";Object.defineProperty(k8,"__esModule",{value:!0})});var Xk=E(ss=>{"use strict";var jSe=ss&&ss.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),YSe=ss&&ss.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&jSe(e,t,r)};Object.defineProperty(ss,"__esModule",{value:!0});ss.defaultHandler=void 0;var D8=Ca(),os=zk(),qSe=b8(),qy=vp(),JSe=x8(),WSe={RequestError:os.RequestError,CacheError:os.CacheError,ReadError:os.ReadError,HTTPError:os.HTTPError,MaxRedirectsError:os.MaxRedirectsError,TimeoutError:os.TimeoutError,ParseError:os.ParseError,CancelError:os.CancelError,UnsupportedProtocolError:os.UnsupportedProtocolError,UploadError:os.UploadError},zSe=async t=>new Promise(e=>{setTimeout(e,t)}),{normalizeArguments:Jy}=qy.default,R8=(...t)=>{let e;for(let r of t)e=Jy(void 0,r,e);return e},VSe=t=>t.isStream?new qy.default(void 0,t):os.default(t),_Se=t=>"defaults"in t&&"options"in t.defaults,XSe=["get","post","put","patch","head","delete"];ss.defaultHandler=(t,e)=>e(t);var F8=(t,e)=>{if(t)for(let r of t)r(e)},N8=t=>{t._rawHandlers=t.handlers,t.handlers=t.handlers.map(i=>(n,s)=>{let o,a=i(n,l=>(o=s(l),o));if(a!==o&&!n.isStream&&o){let l=a,{then:c,catch:u,finally:g}=l;Object.setPrototypeOf(l,Object.getPrototypeOf(o)),Object.defineProperties(l,Object.getOwnPropertyDescriptors(o)),l.then=c,l.catch=u,l.finally=g}return a});let e=(i,n={},s)=>{var o,a;let l=0,c=u=>t.handlers[l++](u,l===t.handlers.length?VSe:c);if(D8.default.plainObject(i)){let u=P(P({},i),n);qy.setNonEnumerableProperties([i,n],u),n=u,i=void 0}try{let u;try{F8(t.options.hooks.init,n),F8((o=n.hooks)===null||o===void 0?void 0:o.init,n)}catch(f){u=f}let g=Jy(i,n,s!=null?s:t.options);if(g[qy.kIsNormalizedAlready]=!0,u)throw new os.RequestError(u.message,u,g);return c(g)}catch(u){if(n.isStream)throw u;return qSe.default(u,t.options.hooks.beforeError,(a=n.hooks)===null||a===void 0?void 0:a.beforeError)}};e.extend=(...i)=>{let n=[t.options],s=[...t._rawHandlers],o;for(let a of i)_Se(a)?(n.push(a.defaults.options),s.push(...a.defaults._rawHandlers),o=a.defaults.mutableDefaults):(n.push(a),"handlers"in a&&s.push(...a.handlers),o=a.mutableDefaults);return s=s.filter(a=>a!==ss.defaultHandler),s.length===0&&s.push(ss.defaultHandler),N8({options:R8(...n),handlers:s,mutableDefaults:Boolean(o)})};let r=async function*(i,n){let s=Jy(i,n,t.options);s.resolveBodyOnly=!1;let o=s.pagination;if(!D8.default.object(o))throw new TypeError("`options.pagination` must be implemented");let a=[],{countLimit:l}=o,c=0;for(;c{let s=[];for await(let o of r(i,n))s.push(o);return s},e.paginate.each=r,e.stream=(i,n)=>e(i,_(P({},n),{isStream:!0}));for(let i of XSe)e[i]=(n,s)=>e(n,_(P({},s),{method:i})),e.stream[i]=(n,s)=>e(n,_(P({},s),{method:i,isStream:!0}));return Object.assign(e,WSe),Object.defineProperty(e,"defaults",{value:t.mutableDefaults?t:JSe.default(t),writable:t.mutableDefaults,configurable:t.mutableDefaults,enumerable:!0}),e.mergeOptions=R8,e};ss.default=N8;YSe(P8(),ss)});var zy=E((Ea,Wy)=>{"use strict";var ZSe=Ea&&Ea.__createBinding||(Object.create?function(t,e,r,i){i===void 0&&(i=r),Object.defineProperty(t,i,{enumerable:!0,get:function(){return e[r]}})}:function(t,e,r,i){i===void 0&&(i=r),t[i]=e[r]}),L8=Ea&&Ea.__exportStar||function(t,e){for(var r in t)r!=="default"&&!Object.prototype.hasOwnProperty.call(e,r)&&ZSe(e,t,r)};Object.defineProperty(Ea,"__esModule",{value:!0});var $Se=require("url"),T8=Xk(),exe={options:{method:"GET",retry:{limit:2,methods:["GET","PUT","HEAD","DELETE","OPTIONS","TRACE"],statusCodes:[408,413,429,500,502,503,504,521,522,524],errorCodes:["ETIMEDOUT","ECONNRESET","EADDRINUSE","ECONNREFUSED","EPIPE","ENOTFOUND","ENETUNREACH","EAI_AGAIN"],maxRetryAfter:void 0,calculateDelay:({computedValue:t})=>t},timeout:{},headers:{"user-agent":"got (https://github.com/sindresorhus/got)"},hooks:{init:[],beforeRequest:[],beforeRedirect:[],beforeRetry:[],beforeError:[],afterResponse:[]},cache:void 0,dnsCache:void 0,decompress:!0,throwHttpErrors:!0,followRedirect:!0,isStream:!1,responseType:"text",resolveBodyOnly:!1,maxRedirects:10,prefixUrl:"",methodRewriting:!0,ignoreInvalidCookies:!1,context:{},http2:!1,allowGetBody:!1,https:void 0,pagination:{transform:t=>t.request.options.responseType==="json"?t.body:JSON.parse(t.body),paginate:t=>{if(!Reflect.has(t.headers,"link"))return!1;let e=t.headers.link.split(","),r;for(let i of e){let n=i.split(";");if(n[1].includes("next")){r=n[0].trimStart().trim(),r=r.slice(1,-1);break}}return r?{url:new $Se.URL(r)}:!1},filter:()=>!0,shouldContinue:()=>!0,countLimit:Infinity,backoff:0,requestLimit:1e4,stackAllItems:!0},parseJson:t=>JSON.parse(t),stringifyJson:t=>JSON.stringify(t),cacheOptions:{}},handlers:[T8.defaultHandler],mutableDefaults:!1},Zk=T8.default(exe);Ea.default=Zk;Wy.exports=Zk;Wy.exports.default=Zk;Wy.exports.__esModule=!0;L8(Xk(),Ea);L8(zk(),Ea)});var U8=E(Xu=>{"use strict";var fst=require("net"),txe=require("tls"),$k=require("http"),M8=require("https"),rxe=require("events"),hst=require("assert"),ixe=require("util");Xu.httpOverHttp=nxe;Xu.httpsOverHttp=sxe;Xu.httpOverHttps=oxe;Xu.httpsOverHttps=axe;function nxe(t){var e=new Ia(t);return e.request=$k.request,e}function sxe(t){var e=new Ia(t);return e.request=$k.request,e.createSocket=O8,e.defaultPort=443,e}function oxe(t){var e=new Ia(t);return e.request=M8.request,e}function axe(t){var e=new Ia(t);return e.request=M8.request,e.createSocket=O8,e.defaultPort=443,e}function Ia(t){var e=this;e.options=t||{},e.proxyOptions=e.options.proxy||{},e.maxSockets=e.options.maxSockets||$k.Agent.defaultMaxSockets,e.requests=[],e.sockets=[],e.on("free",function(i,n,s,o){for(var a=K8(n,s,o),l=0,c=e.requests.length;l=this.maxSockets){s.requests.push(o);return}s.createSocket(o,function(a){a.on("free",l),a.on("close",c),a.on("agentRemove",c),e.onSocket(a);function l(){s.emit("free",a,o)}function c(u){s.removeSocket(a),a.removeListener("free",l),a.removeListener("close",c),a.removeListener("agentRemove",c)}})};Ia.prototype.createSocket=function(e,r){var i=this,n={};i.sockets.push(n);var s=eP({},i.proxyOptions,{method:"CONNECT",path:e.host+":"+e.port,agent:!1,headers:{host:e.host+":"+e.port}});e.localAddress&&(s.localAddress=e.localAddress),s.proxyAuth&&(s.headers=s.headers||{},s.headers["Proxy-Authorization"]="Basic "+new Buffer(s.proxyAuth).toString("base64")),IA("making CONNECT request");var o=i.request(s);o.useChunkedEncodingByDefault=!1,o.once("response",a),o.once("upgrade",l),o.once("connect",c),o.once("error",u),o.end();function a(g){g.upgrade=!0}function l(g,f,h){process.nextTick(function(){c(g,f,h)})}function c(g,f,h){if(o.removeAllListeners(),f.removeAllListeners(),g.statusCode!==200){IA("tunneling socket could not be established, statusCode=%d",g.statusCode),f.destroy();var p=new Error("tunneling socket could not be established, statusCode="+g.statusCode);p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}if(h.length>0){IA("got illegal response body from proxy"),f.destroy();var p=new Error("got illegal response body from proxy");p.code="ECONNRESET",e.request.emit("error",p),i.removeSocket(n);return}return IA("tunneling connection has established"),i.sockets[i.sockets.indexOf(n)]=f,r(f)}function u(g){o.removeAllListeners(),IA(`tunneling socket could not be established, cause=%s +`,g.message,g.stack);var f=new Error("tunneling socket could not be established, cause="+g.message);f.code="ECONNRESET",e.request.emit("error",f),i.removeSocket(n)}};Ia.prototype.removeSocket=function(e){var r=this.sockets.indexOf(e);if(r!==-1){this.sockets.splice(r,1);var i=this.requests.shift();i&&this.createSocket(i,function(n){i.request.onSocket(n)})}};function O8(t,e){var r=this;Ia.prototype.createSocket.call(r,t,function(i){var n=t.request.getHeader("host"),s=eP({},r.options,{socket:i,servername:n?n.replace(/:.*$/,""):t.host}),o=txe.connect(0,s);r.sockets[r.sockets.indexOf(i)]=o,e(o)})}function K8(t,e,r){return typeof t=="string"?{host:t,port:e,localAddress:r}:t}function eP(t){for(var e=1,r=arguments.length;e{H8.exports=U8()});var b4=E((xot,sP)=>{var e4=Object.assign({},require("fs")),oe=typeof oe!="undefined"?oe:{},kp={},wA;for(wA in oe)oe.hasOwnProperty(wA)&&(kp[wA]=oe[wA]);var oP=[],t4="./this.program",r4=function(t,e){throw e},i4=!1,Wl=!0,Pp="";function dxe(t){return oe.locateFile?oe.locateFile(t,Pp):Pp+t}var Xy,aP,Zy,AP;Wl&&(i4?Pp=require("path").dirname(Pp)+"/":Pp=__dirname+"/",Xy=function(e,r){var i=s4(e);return i?r?i:i.toString():(Zy||(Zy=e4),AP||(AP=require("path")),e=AP.normalize(e),Zy.readFileSync(e,r?null:"utf8"))},aP=function(e){var r=Xy(e,!0);return r.buffer||(r=new Uint8Array(r)),n4(r.buffer),r},process.argv.length>1&&(t4=process.argv[1].replace(/\\/g,"/")),oP=process.argv.slice(2),typeof sP!="undefined"&&(sP.exports=oe),r4=function(t){process.exit(t)},oe.inspect=function(){return"[Emscripten Module object]"});var $y=oe.print||console.log.bind(console),Di=oe.printErr||console.warn.bind(console);for(wA in kp)kp.hasOwnProperty(wA)&&(oe[wA]=kp[wA]);kp=null;oe.arguments&&(oP=oe.arguments);oe.thisProgram&&(t4=oe.thisProgram);oe.quit&&(r4=oe.quit);var Cxe=16;function mxe(t,e){return e||(e=Cxe),Math.ceil(t/e)*e}var Exe=0,Ixe=function(t){Exe=t},lP;oe.wasmBinary&&(lP=oe.wasmBinary);var Pst=oe.noExitRuntime||!0;typeof WebAssembly!="object"&&Gr("no native wasm support detected");function yxe(t,e,r){switch(e=e||"i8",e.charAt(e.length-1)==="*"&&(e="i32"),e){case"i1":return Zi[t>>0];case"i8":return Zi[t>>0];case"i16":return cP[t>>1];case"i32":return _e[t>>2];case"i64":return _e[t>>2];case"float":return o4[t>>2];case"double":return a4[t>>3];default:Gr("invalid type for getValue: "+e)}return null}var ew,A4=!1,wxe;function n4(t,e){t||Gr("Assertion failed: "+e)}function l4(t){var e=oe["_"+t];return n4(e,"Cannot call unknown function "+t+", make sure it is exported"),e}function vxe(t,e,r,i,n){var s={string:function(h){var p=0;if(h!=null&&h!==0){var d=(h.length<<2)+1;p=g4(d),u4(h,p,d)}return p},array:function(h){var p=g4(h.length);return Bxe(h,p),p}};function o(h){return e==="string"?c4(h):e==="boolean"?Boolean(h):h}var a=l4(t),l=[],c=0;if(i)for(var u=0;u=i);)++n;if(n-e>16&&t.subarray&&f4)return f4.decode(t.subarray(e,n));for(var s="";e>10,56320|c&1023)}}return s}function c4(t,e){return t?Zu($u,t,e):""}function tw(t,e,r,i){if(!(i>0))return 0;for(var n=r,s=r+i-1,o=0;o=55296&&a<=57343){var l=t.charCodeAt(++o);a=65536+((a&1023)<<10)|l&1023}if(a<=127){if(r>=s)break;e[r++]=a}else if(a<=2047){if(r+1>=s)break;e[r++]=192|a>>6,e[r++]=128|a&63}else if(a<=65535){if(r+2>=s)break;e[r++]=224|a>>12,e[r++]=128|a>>6&63,e[r++]=128|a&63}else{if(r+3>=s)break;e[r++]=240|a>>18,e[r++]=128|a>>12&63,e[r++]=128|a>>6&63,e[r++]=128|a&63}}return e[r]=0,r-n}function u4(t,e,r){return tw(t,$u,e,r)}function rw(t){for(var e=0,r=0;r=55296&&i<=57343&&(i=65536+((i&1023)<<10)|t.charCodeAt(++r)&1023),i<=127?++e:i<=2047?e+=2:i<=65535?e+=3:e+=4}return e}function uP(t){var e=rw(t)+1,r=h4(e);return r&&tw(t,Zi,r,e),r}function Bxe(t,e){Zi.set(t,e)}function xxe(t,e){return t%e>0&&(t+=e-t%e),t}var gP,Zi,$u,cP,kxe,_e,Pxe,o4,a4;function p4(t){gP=t,oe.HEAP8=Zi=new Int8Array(t),oe.HEAP16=cP=new Int16Array(t),oe.HEAP32=_e=new Int32Array(t),oe.HEAPU8=$u=new Uint8Array(t),oe.HEAPU16=kxe=new Uint16Array(t),oe.HEAPU32=Pxe=new Uint32Array(t),oe.HEAPF32=o4=new Float32Array(t),oe.HEAPF64=a4=new Float64Array(t)}var Dst=oe.INITIAL_MEMORY||16777216,fP,d4=[],C4=[],m4=[],Dxe=!1;function Fxe(){if(oe.preRun)for(typeof oe.preRun=="function"&&(oe.preRun=[oe.preRun]);oe.preRun.length;)Rxe(oe.preRun.shift());hP(d4)}function Nxe(){Dxe=!0,!oe.noFSInit&&!y.init.initialized&&y.init(),BA.init(),hP(C4)}function Txe(){if(oe.postRun)for(typeof oe.postRun=="function"&&(oe.postRun=[oe.postRun]);oe.postRun.length;)Lxe(oe.postRun.shift());hP(m4)}function Rxe(t){d4.unshift(t)}function Mxe(t){C4.unshift(t)}function Lxe(t){m4.unshift(t)}var zl=0,pP=null,Dp=null;function Oxe(t){return t}function E4(t){zl++,oe.monitorRunDependencies&&oe.monitorRunDependencies(zl)}function dP(t){if(zl--,oe.monitorRunDependencies&&oe.monitorRunDependencies(zl),zl==0&&(pP!==null&&(clearInterval(pP),pP=null),Dp)){var e=Dp;Dp=null,e()}}oe.preloadedImages={};oe.preloadedAudios={};function Gr(t){oe.onAbort&&oe.onAbort(t),t+="",Di(t),A4=!0,wxe=1,t="abort("+t+"). Build with -s ASSERTIONS=1 for more info.";var e=new WebAssembly.RuntimeError(t);throw e}var I4="data:application/octet-stream;base64,";function y4(t){return t.startsWith(I4)}var Rp="data:application/octet-stream;base64,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AkEEaiEBIAIoAgAiA0F/cyADQYGChAhrcUGAgYKEeHFFDQALIANB/wFxRQRAIAIgAGsPCwNAIAItAAEhAyACQQFqIgEhAiADDQALCyABIABrC2EBAX8jAEEQayICIAA2AgggAiABNwMAAkAgAikDACACKAIIKQMIVgRAIAIoAghBADoAACACQX82AgwMAQsgAigCCEEBOgAAIAIoAgggAikDADcDECACQQA2AgwLIAIoAgwL7wEBAX8jAEEgayICJAAgAiAANgIYIAIgATcDECACIAIoAhhCCBAeNgIMAkAgAigCDEUEQCACQX82AhwMAQsgAigCDCACKQMQQv8BgzwAACACKAIMIAIpAxBCCIhC/wGDPAABIAIoAgwgAikDEEIQiEL/AYM8AAIgAigCDCACKQMQQhiIQv8BgzwAAyACKAIMIAIpAxBCIIhC/wGDPAAEIAIoAgwgAikDEEIoiEL/AYM8AAUgAigCDCACKQMQQjCIQv8BgzwABiACKAIMIAIpAxBCOIhC/wGDPAAHIAJBADYCHAsgAigCHBogAkEgaiQAC4cDAQF/IwBBMGsiAyQAIAMgADYCJCADIAE2AiAgAyACNwMYAkAgAygCJC0AKEEBcQRAIANCfzcDKAwBCwJAAkAgAygCJCgCIEUNACADKQMYQv///////////wBWDQAgAykDGFANASADKAIgDQELIAMoAiRBDGpBEkEAEBQgA0J/NwMoDAELIAMoAiQtADVBAXEEQCADQn83AygMAQsCfyMAQRBrIgAgAygCJDYCDCAAKAIMLQA0QQFxCwRAIANCADcDKAwBCyADKQMYUARAIANCADcDKAwBCyADQgA3AxADQCADKQMQIAMpAxhUBEAgAyADKAIkIAMoAiAgAykDEKdqIAMpAxggAykDEH1BARAhIgI3AwggAkIAUwRAIAMoAiRBAToANSADKQMQUARAIANCfzcDKAwECyADIAMpAxA3AygMAwsgAykDCFAEQCADKAIkQQE6ADQFIAMgAykDCCADKQMQfDcDEAwCCwsLIAMgAykDEDcDKAsgAykDKCECIANBMGokACACCzYBAX8jAEEQayIBIAA2AgwCfiABKAIMLQAAQQFxBEAgASgCDCkDCCABKAIMKQMQfQwBC0IACwuyAQIBfwF+IwBBEGsiASQAIAEgADYCBCABIAEoAgRC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AkEBNgIQIAJBADYCCANAAkAgAigCCCACKAIYLwEETw0AAkAgAigCDCACKAIIai0AAEEfSwRAIAIoAgwgAigCCGotAABBgAFJDQELIAIoAgwgAigCCGotAABBDUYNACACKAIMIAIoAghqLQAAQQpGDQAgAigCDCACKAIIai0AAEEJRgRADAELIAJBAzYCEAJAIAIoAgwgAigCCGotAABB4AFxQcABRgRAIAJBATYCAAwBCwJAIAIoAgwgAigCCGotAABB8AFxQeABRgRAIAJBAjYCAAwBCwJAIAIoAgwgAigCCGotAABB+AFxQfABRgRAIAJBAzYCAAwBCyACQQQ2AhAMBAsLCyACKAIYLwEEIAIoAgggAigCAGpNBEAgAkEENgIQDAILIAJBATYCBANAIAIoAgQgAigCAE0EQCACKAIMIAIoAgggAigCBGpqLQAAQcABcUGAAUcEQCACQQQ2AhAMBgUgAiACKAIEQQFqNgIEDAILAAsLIAIgAigCACACKAIIajYCCAsgAiACKAIIQQFqNgIIDAELCwsgAigCGCACKAIQNgIIIAIoAhQEQAJAIAIoAhRBAkcNACACKAIQQQNHDQAgAkECNgIQIAIoAhhBAjYCCAsCQCACKAIUIAIoAhBGDQAgAigCEEEBRg0AIAJBBTYCHAwCCwsgAiACKAIQNgIcCyACKAIcC2oBAX8jAEEQayIBIAA2AgwgASgCDEIANwMAIAEoAgxBADYCCCABKAIMQn83AxAgASgCDEEANgIsIAEoAgxBfzYCKCABKAIMQgA3AxggASgCDEIANwMgIAEoAgxBADsBMCABKAIMQQA7ATILUgECf0GQlwEoAgAiASAAQQNqQXxxIgJqIQACQCACQQAgACABTRsNACAAPwBBEHRLBEAgABATRQ0BC0GQlwEgADYCACABDwtBtJsBQTA2AgBBfwuNBQEDfyMAQRBrIgEkACABIAA2AgwgASgCDARAIAEoAgwoAgAEQCABKAIMKAIAEDEaIAEoAgwoAgAQGwsgASgCDCgCHBAVIAEoAgwoAiAQJSABKAIMKAIkECUgASgCDCgCUCECIwBBEGsiACQAIAAgAjYCDCAAKAIMBEAgACgCDCgCEARAIABBADYCCANAIAAoAgggACgCDCgCAEkEQCAAKAIMKAIQIAAoAghBAnRqKAIABEAgACgCDCgC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A3EQHwsgAygCpAEoAhQgA0GeAWogA0GcAWoQgQEgAygCTCADLwGeARAfIAMoAkwgAy8BnAEQHwJAAkAgAy0AhQFBAXFFDQAgAygCpAEpAyhCFFoNACADKAJMQQAQIAwBCyADKAJMIAMoAqQBKAIYECALAkACQCADKAKgAUGAAnFBgAJHDQAgAygCpAEpAyBC/////w9UBEAgAygCpAEpAyhC/////w9UDQELIAMoAkxBfxAgIAMoAkxBfxAgDAELAkAgAygCpAEpAyBC/////w9UBEAgAygCTCADKAKkASkDIKcQIAwBCyADKAJMQX8QIAsCQCADKAKkASkDKEL/////D1QEQCADKAJMIAMoAqQBKQMopxAgDAELIAMoAkxBfxAgCwsgAygCTCADKAKkASgCMBBTQf//A3EQHyADIAMoAqQBKAI0IAMoAqABEIYBQf//A3EgAygCkAFBgAYQhgFB//8DcWo2AogBIAMoAkwgAygCiAFB//8DcRAfIAMoAqABQYACcUUEQCADKAJMIAMoAqQBKAI4EFNB//8DcRAfIAMoAkwgAygCpAEoAjxB//8DcRAfIAMoAkwgAygCpAEvAUAQHyADKAJMIAMoAqQBKAJEECACQCADKAKkASkDSEL/////D1QEQCADKAJMIAMoAqQBKQNIpxAgDAELIAMoAkxBfxAgCwsCfyMAQRBrIgAgAygCTDYCDCAAKAIMLQAAQQFxRQsEQCADKAKoAUEIakEUQQAQFCADKAJMEBYgAygCkAEQIyADQX82AqwBDAELIAMoAqgBIANB0ABqAn4jAEEQayIAIAMoAkw2AgwCfiAAKAIMLQAAQQFxBEAgACgCDCkDEAwBC0IACwsQNUEASARAIAMoAkwQFiADKAKQARAjIANBfzYCrAEMAQsgAygCTBAWIAMoAqQBKAIwBEAgAygCqAEgAygCpAEoAjAQigFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABBEAgAygCqAEgAygCkAFBgAYQhQFBAEgEQCADKAKQARAjIANBfzYCrAEMAgsLIAMoApABECMgAygCpAEoAjQEQCADKAKoASADKAKkASgCNCADKAKgARCFAUEASARAIANBfzYCrAEMAgsLIAMoAqABQYACcUUEQCADKAKkASgCOARAIAMoAqgBIAMoAqQBKAI4EIoBQQBIBEAgA0F/NgKsAQwDCwsLIAMgAy0AhwFBAXE2AqwBCyADKAKsASEAIANBsAFqJAAgAAvgAgEBfyMAQSBrIgQkACAEIAA7ARogBCABOwEYIAQgAjYCFCAEIAM2AhAgBEEQEBgiADYCDAJAIABFBEAgBEEANgIcDAELIAQoAgxBADYCACAEKAIMIAQoAhA2AgQgBCgCDCAELwEaOwEIIAQoAgwgBC8BGDsBCgJAIAQvARgEQCAEKAIUIQEgBC8BGCECIwBBIGsiACQAIAAgATYCGCAAIAI2AhQgAEEANgIQAkAgACgCFEUEQCAAQQA2AhwMAQsgACAAKAIUEBg2AgwgACgCDEUEQCAAKAIQQQ5BABAUIABBADYCHAwBCyAAKAIMIAAoAhggACgCFBAZGiAAIAAoAgw2AhwLIAAoAhwhASAAQSBqJAAgASEAIAQoAgwgADYCDCAARQRAIAQoAgwQFSAEQQA2AhwMAwsMAQsgBCgCDEEANgIMCyAEIAQoAgw2AhwLIAQoAhwhACAEQSBqJAAgAAuMAwEBfyMAQSBrIgQkACAEIAA2AhggBCABOwEWIAQgAjYCECAEIAM2AgwCQCAELwEWRQRAIARBADYCHAwBCwJAAkACQAJAIAQoAhBBgDBxIgAEQCAAQYAQRg0BIABBgCBGDQIMAwsgBEEANgIEDAMLIARBAjYCBAwCCyAEQQQ2AgQMAQsgBCgCDEESQQAQFCAEQQA2AhwMAQsgBEEUEBgiADYCCCAARQRAIAQoAgxBDkEAEBQgBEEANgIcDAELIAQvARZBAWoQGCEAIAQoAgggADYCACAARQRAIAQoAggQFSAEQQA2AhwMAQsgBCgCCCgCACAEKAIYIAQvARYQGRogBCgCCCgCACAELwEWakEAOgAAIAQoAgggBC8BFjsBBCAEKAIIQQA2AgggBCgCCEEANgIMIAQoAghBADYCECAEKAIEBEAgBCgCCCAEKAIEEDpBBUYEQCAEKAIIECUgBCgCDEESQQAQFCAEQQA2AhwMAgsLIAQgBCgCCDYCHAsgBCgCHCEAIARBIGokACAACzcBAX8jAEEQayIBIAA2AggCQCABKAIIRQRAIAFBADsBDgwBCyABIAEoAggvAQQ7AQ4LIAEvAQ4LQwEDfwJAIAJFDQADQCAALQAAIgQgAS0AACIFRgRAIAFBAWohASAAQQFqIQAgAkEBayICDQEMAgsLIAQgBWshAwsgAwuRAQEFfyAAKAJMQQBOIQMgACgCAEEBcSIERQRAIAAoAjQiAQRAIAEgACgCODYCOAsgACgCOCICBEAgAiABNgI0CyAAQaygASgCAEYEQEGsoAEgAjYCAAsLIAAQpQEhASAAIAAoAgwRAAAhAiAAKAJgIgUEQCAFEBULAkAgBEUEQCAAEBUMAQsgA0UNAAsgASACcgv5AQEBfyMAQSBrIgIkACACIAA2AhwgAiABOQMQAkAgAigCHEUNACACAnwCfCACKwMQRAAAAAAAAAAAZARAIAIrAxAMAQtEAAAAAAAAAAALRAAAAAAAAPA/YwRAAnwgAisDEEQAAAAAAAAAAGQEQCACKwMQDAELRAAAAAAAAAAACwwBC0QAAAAAAADwPwsgAigCHCsDKCACKAIcKwMgoaIgAigCHCsDIKA5AwggAigCHCsDECACKwMIIAIoAhwrAxihY0UNACACKAIcKAIAIAIrAwggAigCHCgCDCACKAIcKAIEERYAIAIoAhwgAisDCDkDGAsgAkEgaiQAC+EFAgJ/AX4jAEEwayIEJAAgBCAANgIkIAQgATYCICAEIAI2AhwgBCADNgIYAkAgBCgCJEUEQCAEQn83AygMAQsgBCgCIEUEQCAEKAIYQRJBABAUIARCfzcDKAwBCyAEKAIcQYMgcQRAIARBFUEWIAQoAhxBAXEbNgIUIARCADcDAANAIAQpAwAgBCgCJCkDMFQEQCAEIAQoAiQgBCkDACAEKAIcIAQoAhgQTjYCECAEKAIQBEAgBCgCHEECcQRAIAQCfyAEKAIQIgEQK0EBaiEAA0BBACAARQ0BGiABIABBAWsiAGoiAi0AAEEvRw0ACyACCzYCDCAEKAIMBEAgBCAEKAIMQQFqNgIQCwsgBCgCICAEKAIQIAQoAhQRAwBFBEAjAEEQayIAIAQoAhg2AgwgACgCDARAIAAoAgxBADYCACAAKAIMQQA2AgQLIAQgBCkDADcDKAwFCwsgBCAEKQMAQgF8NwMADAELCyAEKAIYQQlBABAUIARCfzcDKAwBCyAEKAIkKAJQIQEgBCgCICECIAQoAhwhAyAEKAIYIQUjAEEwayIAJAAgACABNgIkIAAgAjYCICAAIAM2AhwgACAFNgIYAkACQCAAKAIkBEAgACgCIA0BCyAAKAIYQRJBABAUIABCfzcDKAwBCyAAKAIkKQMIQgBSBEAgACAAKAIgEHQ2AhQgACAAKAIUIAAoAiQoAgBwNgIQIAAgACgCJCgCECAAKAIQQQJ0aigCADYCDANAAkAgACgCDEUNACAAKAIgIAAoAgwoAgAQWgRAIAAgACgCDCgCGDYCDAwCBSAAKAIcQQhxBEAgACgCDCkDCEJ/UgRAIAAgACgCDCkDCDcDKAwGCwwCCyAAKAIMKQMQQn9SBEAgACAAKAIMKQMQNwMoDAULCwsLCyAAKAIYQQlBABAUIABCfzcDKAsgACkDKCEGIABBMGokACAEIAY3AygLIAQpAyghBiAEQTBqJAAgBgvUAwEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCEAJAAkAgAygCGARAIAMoAhQNAQsgAygCEEESQQAQFCADQQA6AB8MAQsgAygCGCkDCEIAUgRAIAMgAygCFBB0NgIMIAMgAygCDCADKAIYKAIAcDYCCCADQQA2AgAgAyADKAIYKAIQIAMoAghBAnRqKAIANgIEA0AgAygCBARAAkAgAygCBCgCHCADKAIMRw0AIAMoAhQgAygCBCgCABBaDQACQCADKAIEKQMIQn9RBEACQCADKAIABEAgAygCACADKAIEKAIYNgIYDAELIAMoAhgoAhAgAygCCEECdGogAygCBCgCGDYCAAsgAygCBBAVIAMoAhgiACAAKQMIQgF9NwMIAkAgAygCGCIAKQMIuiAAKAIAuER7FK5H4XqEP6JjRQ0AIAMoAhgoAgBBgAJNDQAgAygCGCADKAIYKAIAQQF2IAMoAhAQWUEBcUUEQCADQQA6AB8MCAsLDAELIAMoAgRCfzcDEAsgA0EBOgAfDAQLIAMgAygCBDYCACADIAMoAgQoAhg2AgQMAQsLCyADKAIQQQlBABAUIANBADoAHwsgAy0AH0EBcSEAIANBIGokACAAC98CAQF/IwBBMGsiAyQAIAMgADYCKCADIAE2AiQgAyACNgIgAkAgAygCJCADKAIoKAIARgRAIANBAToALwwBCyADIAMoAiRBBBB2IgA2AhwgAEUEQCADKAIgQQ5BABAUIANBADoALwwBCyADKAIoKQMIQgBSBEAgA0EANgIYA0AgAygCGCADKAIoKAIAT0UEQCADIAMoAigoAhAgAygCGEECdGooAgA2AhQDQCADKAIUBEAgAyADKAIUKAIYNgIQIAMgAygCFCgCHCADKAIkcDYCDCADKAIUIAMoAhwgAygCDEECdGooAgA2AhggAygCHCADKAIMQQJ0aiADKAIUNgIAIAMgAygCEDYCFAwBCwsgAyADKAIYQQFqNgIYDAELCwsgAygCKCgCEBAVIAMoAiggAygCHDYCECADKAIoIAMoAiQ2AgAgA0EBOgAvCyADLQAvQQFxIQAgA0EwaiQAIAALTQECfyABLQAAIQICQCAALQAAIgNFDQAgAiADRw0AA0AgAS0AASECIAAtAAEiA0UNASABQQFqIQEgAEEBaiEAIAIgA0YNAAsLIAMgAmsL0QkBAn8jAEEgayIBJAAgASAANgIcIAEgASgCHCgCLDYCEANAIAEgASgCHCgCPCABKAIcKAJ0ayABKAIcKAJsazYCFCABKAIcKAJsIAEoAhAgASgCHCgCLEGGAmtqTwRAIAEoAhwoAjggASgCHCgCOCABKAIQaiABKAIQIAEoAhRrEBkaIAEoAhwiACAAKAJwIAEoAhBrNgJwIAEoAhwiACAAKAJsIAEoAhBrNgJsIAEoAhwiACAAKAJcIAEoAhBrNgJcIwBBIGsiACABKAIcNgIcIAAgACgCHCgCLDYCDCAAIAAoAhwoAkw2AhggACAAKAIcKAJEIAAoAhhBAXRqNgIQA0AgACAAKAIQQQJrIgI2AhAgACACLwEANgIUIAAoAhACfyAAKAIUIAAoAgxPBEAgACgCFCAAKAIMawwBC0EACzsBACAAIAAoAhhBAWsiAjYCGCACDQALIAAgACgCDDYCGCAAIAAoAhwoAkAgACgCGEEBdGo2AhADQCAAIAAoAhBBAmsiAjYCECAAIAIvAQA2AhQgACgCEAJ/IAAoAhQgACgCDE8EQCAAKAIUIAAoAgxrDAELQQALOwEAIAAgACgCGEEBayICNgIYIAINAAsgASABKAIQIAEoAhRqNgIUCyABKAIcKAIAKAIEBEAgASABKAIcKAIAIAEoAhwoAnQgASgCHCgCOCABKAIcKAJsamogASgCFBB4NgIYIAEoAhwiACABKAIYIAAoAnRqNgJ0IAEoAhwoAnQgASgCHCgCtC1qQQNPBEAgASABKAIcKAJsIAEoAhwoArQtazYCDCABKAIcIAEoAhwoAjggASgCDGotAAA2AkggASgCHCABKAIcKAJUIAEoAhwoAjggASgCDEEBamotAAAgASgCHCgCSCABKAIcKAJYdHNxNgJIA0AgASgCHCgCtC0EQCABKAIcIAEoAhwoAlQgASgCHCgCOCABKAIMQQJqai0AACABKAIcKAJIIAEoAhwoAlh0c3E2AkggASgCHCgCQCABKAIMIAEoAhwoAjRxQQF0aiABKAIcKAJEIAEoAhwoAkhBAXRqLwEAOwEAIAEoAhwoAkQgASgCHCgCSEEBdGogASgCDDsBACABIAEoAgxBAWo2AgwgASgCHCIAIAAoArQtQQFrNgK0LSABKAIcKAJ0IAEoAhwoArQtakEDTw0BCwsLIAEoAhwoAnRBhgJJBH8gASgCHCgCACgCBEEARwVBAAtBAXENAQsLIAEoAhwoAsAtIAEoAhwoAjxJBEAgASABKAIcKAJsIAEoAhwoAnRqNgIIAkAgASgCHCgCwC0gASgCCEkEQCABIAEoAhwoAjwgASgCCGs2AgQgASgCBEGCAksEQCABQYICNgIECyABKAIcKAI4IAEoAghqQQAgASgCBBAyIAEoAhwgASgCCCABKAIEajYCwC0MAQsgASgCHCgCwC0gASgCCEGCAmpJBEAgASABKAIIQYICaiABKAIcKALALWs2AgQgASgCBCABKAIcKAI8IAEoAhwoAsAta0sEQCABIAEoAhwoAjwgASgCHCgCwC1rNgIECyABKAIcKAI4IAEoAhwoAsAtakEAIAEoAgQQMiABKAIcIgAgASgCBCAAKALALWo2AsAtCwsLIAFBIGokAAuGBQEBfyMAQSBrIgQkACAEIAA2AhwgBCABNgIYIAQgAjYCFCAEIAM2AhAgBEEDNgIMAkAgBCgCHCgCvC1BECAEKAIMa0oEQCAEIAQoAhA2AgggBCgCHCIAIAAvAbgtIAQoAghB//8DcSAEKAIcKAK8LXRyOwG4LSAEKAIcLwG4LUH/AXEhASAEKAIcKAIIIQIgBCgCHCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIcLwG4LUEIdiEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhwgBCgCCEH//wNxQRAgBCgCHCgCvC1rdTsBuC0gBCgCHCIAIAAoArwtIAQoAgxBEGtqNgK8LQwBCyAEKAIcIgAgAC8BuC0gBCgCEEH//wNxIAQoAhwoArwtdHI7AbgtIAQoAhwiACAEKAIMIAAoArwtajYCvC0LIAQoAhwQvAEgBCgCFEH/AXEhASAEKAIcKAIIIQIgBCgCHCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIUQf//A3FBCHYhASAEKAIcKAIIIQIgBCgCHCIDKAIUIQAgAyAAQQFqNgIUIAAgAmogAToAACAEKAIUQX9zQf8BcSEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhRBf3NB//8DcUEIdiEBIAQoAhwoAgghAiAEKAIcIgMoAhQhACADIABBAWo2AhQgACACaiABOgAAIAQoAhwoAgggBCgCHCgCFGogBCgCGCAEKAIUEBkaIAQoAhwiACAEKAIUIAAoAhRqNgIUIARBIGokAAuJAgEBfyMAQRBrIgEkACABIAA2AgwCQCABKAIMLQAFQQFxBEAgASgCDCgCAEECcUUNAQsgASgCDCgCMBAlIAEoAgxBADYCMAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEEIcUUNAQsgASgCDCgCNBAjIAEoAgxBADYCNAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEEEcUUNAQsgASgCDCgCOBAlIAEoAgxBADYCOAsCQCABKAIMLQAFQQFxBEAgASgCDCgCAEGAAXFFDQELIAEoAgwoAlQEQCABKAIMKAJUQQAgASgCDCgCVBArEDILIAEoAgwoAlQQFSABKAIMQQA2AlQLIAFBEGokAAt3AQF/IwBBEGsiAiAANgIIIAIgATYCBAJAAkACQCACKAIIKQMoQv////8PWg0AIAIoAggpAyBC/////w9aDQAgAigCBEGABHFFDQEgAigCCCkDSEL/////D1QNAQsgAkEBOgAPDAELIAJBADoADwsgAi0AD0EBcQv/AQEBfyMAQSBrIgUkACAFIAA2AhggBSABNgIUIAUgAjsBEiAFQQA7ARAgBSADNgIMIAUgBDYCCCAFQQA2AgQCQANAIAUoAhgEQAJAIAUoAhgvAQggBS8BEkcNACAFKAIYKAIEIAUoAgxxQYAGcUUNACAFKAIEIAUvARBIBEAgBSAFKAIEQQFqNgIEDAELIAUoAhQEQCAFKAIUIAUoAhgvAQo7AQALIAUoAhgvAQoEQCAFIAUoAhgoAgw2AhwMBAsgBUGR2QA2AhwMAwsgBSAFKAIYKAIANgIYDAELCyAFKAIIQQlBABAUIAVBADYCHAsgBSgCHCEAIAVBIGokACAAC/8CAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE2AiQgBSACNgIgIAUgAzoAHyAFIAQ2AhgCQAJAIAUoAiANACAFLQAfQQFxDQAgBUEANgIsDAELIAUgBSgCICAFLQAfQQFxahAYNgIUIAUoAhRFBEAgBSgCGEEOQQAQFCAFQQA2AiwMAQsCQCAFKAIoBEAgBSAFKAIoIAUoAiCtEB42AhAgBSgCEEUEQCAFKAIYQQ5BABAUIAUoAhQQFSAFQQA2AiwMAwsgBSgCFCAFKAIQIAUoAiAQGRoMAQsgBSgCJCAFKAIUIAUoAiCtIAUoAhgQYUEASARAIAUoAhQQFSAFQQA2AiwMAgsLIAUtAB9BAXEEQCAFKAIUIAUoAiBqQQA6AAAgBSAFKAIUNgIMA0AgBSgCDCAFKAIUIAUoAiBqSQRAIAUoAgwtAABFBEAgBSgCDEEgOgAACyAFIAUoAgxBAWo2AgwMAQsLCyAFIAUoAhQ2AiwLIAUoAiwhACAFQTBqJAAgAAvCAQEBfyMAQTBrIgQkACAEIAA2AiggBCABNgIkIAQgAjcDGCAEIAM2AhQCQCAEKQMYQv///////////wBWBEAgBCgCFEEUQQAQFCAEQX82AiwMAQsgBCAEKAIoIAQoAiQgBCkDGBAuIgI3AwggAkIAUwRAIAQoAhQgBCgCKBAXIARBfzYCLAwBCyAEKQMIIAQpAxhTBEAgBCgCFEERQQAQFCAEQX82AiwMAQsgBEEANgIsCyAEKAIsIQAgBEEwaiQAIAALNgEBfyMAQRBrIgEkACABIAA2AgwgASgCDBBjIAEoAgwoAgAQOSABKAIMKAIEEDkgAUEQaiQAC6sBAQF/IwBBEGsiASQAIAEgADYCDCABKAIMKAIIBEAgASgCDCgCCBAbIAEoAgxBADYCCAsCQCABKAIMKAIERQ0AIAEoAgwoAgQoAgBBAXFFDQAgASgCDCgCBCgCEEF+Rw0AIAEoAgwoAgQiACAAKAIAQX5xNgIAIAEoAgwoAgQoAgBFBEAgASgCDCgCBBA5IAEoAgxBADYCBAsLIAEoAgxBADoADCABQRBqJAAL8QMBAX8jAEHQAGsiCCQAIAggADYCSCAIIAE3A0AgCCACNwM4IAggAzYCNCAIIAQ6ADMgCCAFNgIsIAggBjcDICAIIAc2AhwCQAJAAkAgCCgCSEUNACAIKQNAIAgpA0AgCCkDOHxWDQAgCCgCLA0BIAgpAyBQDQELIAgoAhxBEkEAEBQgCEEANgJMDAELIAhBgAEQGCIANgIYIABFBEAgCCgCHEEOQQAQFCAIQQA2AkwMAQsgCCgCGCAIKQNANwMAIAgoAhggCCkDQCAIKQM4fDcDCCAIKAIYQShqEDsgCCgCGCAILQAzOgBgIAgoAhggCCgCLDYCECAIKAIYIAgpAyA3AxgjAEEQayIAIAgoAhhB5ABqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIwBBEGsiACAIKAJINgIMIAAoAgwpAxhC/4EBgyEBIAhBfzYCCCAIQQc2AgQgCEEONgIAQRAgCBA2IAGEIQEgCCgCGCABNwNwIAgoAhggCCgCGCkDcELAAINCAFI6AHggCCgCNARAIAgoAhhBKGogCCgCNCAIKAIcEJUBQQBIBEAgCCgCGBAVIAhBADYCTAwCCwsgCCAIKAJIQQEgCCgCGCAIKAIcEJIBNgJMCyAIKAJMIQAgCEHQAGokACAAC9MEAQJ/IwBBMGsiAyQAIAMgADYCJCADIAE3AxggAyACNgIUAkAgAygCJCgCQCADKQMYp0EEdGooAgBFBEAgAygCFEEUQQAQFCADQgA3AygMAQsgAyADKAIkKAJAIAMpAxinQQR0aigCACkDSDcDCCADKAIkKAIAIAMpAwhBABAnQQBIBEAgAygCFCADKAIkKAIAEBcgA0IANwMoDAELIAMoAiQoAgAhAiADKAIUIQQjAEEwayIAJAAgACACNgIoIABBgAI7ASYgACAENgIgIAAgAC8BJkGAAnFBAEc6ABsgAEEeQS4gAC0AG0EBcRs2AhwCQCAAKAIoQRpBHCAALQAbQQFxG6xBARAnQQBIBEAgACgCICAAKAIoEBcgAEF/NgIsDAELIAAgACgCKEEEQQYgAC0AG0EBcRusIABBDmogACgCIBBBIgI2AgggAkUEQCAAQX82AiwMAQsgAEEANgIUA0AgACgCFEECQQMgAC0AG0EBcRtIBEAgACAAKAIIEB1B//8DcSAAKAIcajYCHCAAIAAoAhRBAWo2AhQMAQsLIAAoAggQR0EBcUUEQCAAKAIgQRRBABAUIAAoAggQFiAAQX82AiwMAQsgACgCCBAWIAAgACgCHDYCLAsgACgCLCECIABBMGokACADIAIiADYCBCAAQQBIBEAgA0IANwMoDAELIAMpAwggAygCBK18Qv///////////wBWBEAgAygCFEEEQRYQFCADQgA3AygMAQsgAyADKQMIIAMoAgStfDcDKAsgAykDKCEBIANBMGokACABC20BAX8jAEEgayIEJAAgBCAANgIYIAQgATYCFCAEIAI2AhAgBCADNgIMAkAgBCgCGEUEQCAEQQA2AhwMAQsgBCAEKAIUIAQoAhAgBCgCDCAEKAIYQQhqEJIBNgIcCyAEKAIcIQAgBEEgaiQAIAALVQEBfyMAQRBrIgEkACABIAA2AgwCQAJAIAEoAgwoAiRBAUYNACABKAIMKAIkQQJGDQAMAQsgASgCDEEAQgBBChAhGiABKAIMQQA2AiQLIAFBEGokAAumAQEBfyMAQRBrIgIkACACIAA2AgggAiABNgIEAkAgAigCCC0AKEEBcQRAIAJBfzYCDAwBCyACKAIIKAIABEAgAigCCCgCACACKAIEEGhBAEgEQCACKAIIQQxqIAIoAggoAgAQFyACQX82AgwMAgsLIAIoAgggAkEEakIEQRMQIUIAUwRAIAJBfzYCDAwBCyACQQA2AgwLIAIoAgwhACACQRBqJAAgAAuNCAIBfwF+IwBBkAFrIgMkACADIAA2AoQBIAMgATYCgAEgAyACNgJ8IAMQTwJAIAMoAoABKQMIQgBSBEAgAyADKAKAASgCACgCACkDSDcDYCADIAMoAoABKAIAKAIAKQNINwNoDAELIANCADcDYCADQgA3A2gLIANCADcDcAJAA0AgAykDcCADKAKAASkDCFQEQCADKAKAASgCACADKQNwp0EEdGooAgApA0ggAykDaFQEQCADIAMoAoABKAIAIAMpA3CnQQR0aigCACkDSDcDaAsgAykDaCADKAKAASkDIFYEQCADKAJ8QRNBABAUIANCfzcDiAEMAwsgAyADKAKAASgCACADKQNwp0EEdGooAgApA0ggAygCgAEoAgAgAykDcKdBBHRqKAIAKQMgfCADKAKAASgCACADKQNwp0EEdGooAgAoAjAQU0H//wNxrXxC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DEECdGooAgBBAnRqLwEASA0AAkAgAygCGCADKAIQQQJ0ai8BACADKAIYIAMoAhxB3BZqIAMoAgxBAnRqKAIAQQJ0ai8BAEcNACADKAIQIAMoAhxB2Chqai0AACADKAIcQdwWaiADKAIMQQJ0aigCACADKAIcQdgoamotAABKDQAMAQsgAygCHEHcFmogAygCFEECdGogAygCHEHcFmogAygCDEECdGooAgA2AgAgAyADKAIMNgIUIAMgAygCDEEBdDYCDAwBCwsgAygCHEHcFmogAygCFEECdGogAygCEDYCAAvXEwEDfyMAQTBrIgIkACACIAA2AiwgAiABNgIoIAIgAigCKCgCADYCJCACIAIoAigoAggoAgA2AiAgAiACKAIoKAIIKAIMNgIcIAJBfzYCECACKAIsQQA2AtAoIAIoAixBvQQ2AtQoIAJBADYCGANAIAIoAhggAigCHEgEQAJAIAIoAiQgAigCGEECdGovAQAEQCACIAIoAhgiATYCECACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohACAEIAA2AtAoIABBAnQgA2ogATYCACACKAIYIAIoAixB2ChqakEAOgAADAELIAIoAiQgAigCGEECdGpBADsBAgsgAiACKAIYQQFqNgIYDAELCwNAIAIoAiwoAtAoQQJIBEACQCACKAIQQQJIBEAgAiACKAIQQQFqIgA2AhAMAQtBACEACyACKAIsQdwWaiEDIAIoAiwiBCgC0ChBAWohASAEIAE2AtAoIAFBAnQgA2ogADYCACACIAA2AgwgAigCJCACKAIMQQJ0akEBOwEAIAIoAgwgAigCLEHYKGpqQQA6AAAgAigCLCIAIAAoAqgtQQFrNgKoLSACKAIgBEAgAigCLCIAIAAoAqwtIAIoAiAgAigCDEECdGovAQJrNgKsLQsMAQsLIAIoAiggAigCEDYCBCACIAIoAiwoAtAoQQJtNgIYA0AgAigCGEEBTgRAIAIoAiwgAigCJCACKAIYEHogAiACKAIYQQFrNgIYDAELCyACIAIoAhw2AgwDQCACIAIoAiwoAuAWNgIYIAIoAixB3BZqIQEgAigCLCIDKALQKCEAIAMgAEEBazYC0CggAigCLCAAQQJ0IAFqKAIANgLgFiACKAIsIAIoAiRBARB6IAIgAigCLCgC4BY2AhQgAigCGCEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAhQhASACKAIsQdwWaiEDIAIoAiwiBCgC1ChBAWshACAEIAA2AtQoIABBAnQgA2ogATYCACACKAIkIAIoAgxBAnRqIAIoAiQgAigCGEECdGovAQAgAigCJCACKAIUQQJ0ai8BAGo7AQAgAigCDCACKAIsQdgoamoCfyACKAIYIAIoAixB2Chqai0AACACKAIUIAIoAixB2Chqai0AAE4EQCACKAIYIAIoAixB2Chqai0AAAwBCyACKAIUIAIoAixB2Chqai0AAAtBAWo6AAAgAigCJCACKAIUQQJ0aiACKAIMIgA7AQIgAigCJCACKAIYQQJ0aiAAOwECIAIgAigCDCIAQQFqNgIMIAIoAiwgADYC4BYgAigCLCACKAIkQQEQeiACKAIsKALQKEECTg0ACyACKAIsKALgFiEBIAIoAixB3BZqIQMgAigCLCIEKALUKEEBayEAIAQgADYC1CggAEECdCADaiABNgIAIAIoAighASMAQUBqIgAgAigCLDYCPCAAIAE2AjggACAAKAI4KAIANgI0IAAgACgCOCgCBDYCMCAAIAAoAjgoAggoAgA2AiwgACAAKAI4KAIIKAIENgIoIAAgACgCOCgCCCgCCDYCJCAAIAAoAjgoAggoAhA2AiAgAEEANgIEIABBADYCEANAIAAoAhBBD0wEQCAAKAI8QbwWaiAAKAIQQQF0akEAOwEAIAAgACgCEEEBajYCEAwBCwsgACgCNCAAKAI8QdwWaiAAKAI8KALUKEECdGooAgBBAnRqQQA7AQIgACAAKAI8KALUKEEBajYCHANAIAAoAhxBvQRIBEAgACAAKAI8QdwWaiAAKAIcQQJ0aigCADYCGCAAIAAoAjQgACgCNCAAKAIYQQJ0ai8BAkECdGovAQJBAWo2AhAgACgCECAAKAIgSgRAIAAgACgCIDYCECAAIAAoAgRBAWo2AgQLIAAoAjQgACgCGEECdGogACgCEDsBAiAAKAIYIAAoAjBMBEAgACgCPCAAKAIQQQF0akG8FmoiASABLwEAQQFqOwEAIABBADYCDCAAKAIYIAAoAiROBEAgACAAKAIoIAAoAhggACgCJGtBAnRqKAIANgIMCyAAIAAoAjQgACgCGEECdGovAQA7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EANAIAMpAxAgAykDCFpFBEAgAygCKCgCACADKQMQp0EEdGoQkAEgAyADKQMQQgF8NwMQDAELCyADKAIoIAMpAwgiATcDECADKAIoIAE3AwggA0EBOgAvCyADLQAvQQFxIQAgA0EwaiQAIAALzAEBAX8jAEEgayICJAAgAiAANwMQIAIgATYCDCACQTAQGCIBNgIIAkAgAUUEQCACKAIMQQ5BABAUIAJBADYCHAwBCyACKAIIQQA2AgAgAigCCEIANwMQIAIoAghCADcDCCACKAIIQgA3AyAgAigCCEIANwMYIAIoAghBADYCKCACKAIIQQA6ACwgAigCCCACKQMQIAIoAgwQgwFBAXFFBEAgAigCCBAkIAJBADYCHAwBCyACIAIoAgg2AhwLIAIoAhwhASACQSBqJAAgAQvWAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCECADIANBDGpCBBApNgIIAkAgAygCCEUEQCADQX82AhwMAQsDQCADKAIUBEAgAygCFCgCBCADKAIQcUGABnEEQCADKAIIQgAQLBogAygCCCADKAIULwEIEB8gAygCCCADKAIULwEKEB8CfyMAQRBrIgAgAygCCDYCDCAAKAIMLQAAQQFxRQsEQCADKAIYQQhqQRRBABAUIAMoAggQFiADQX82AhwMBAsgAygCGCADQQxqQgQQNUEASARAIAMoAggQFiADQX82AhwMBAsgAygCFC8BCgRAIAMoAhggAygCFCgCDCADKAIULwEKrRA1QQBIBEAgAygCCBAWIANBfzYCHAwFCwsLIAMgAygCFCgCADYCFAwBCwsgAygCCBAWIANBADYCHAsgAygCHCEAIANBIGokACAAC2gBAX8jAEEQayICIAA2AgwgAiABNgIIIAJBADsBBgNAIAIoAgwEQCACKAIMKAIEIAIoAghxQYAGcQRAIAIgAigCDC8BCiACLwEGQQRqajsBBgsgAiACKAIMKAIANgIMDAELCyACLwEGC/ABAQF/IwBBEGsiASQAIAEgADYCDCABIAEoAgw2AgggAUEANgIEA0AgASgCDARAAkACQCABKAIMLwEIQfXGAUYNACABKAIMLwEIQfXgAUYNACABKAIMLwEIQYGyAkYNACABKAIMLwEIQQFHDQELIAEgASgCDCgCADYCACABKAIIIAEoAgxGBEAg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IAEpA4ABIAEpAzB8IAEpA5gBIAEpAzh8VgRAIAEoApABQRVBABAUIAFBADYCrAEMAQsCQCABKAKUAUEEcUUNACABKQOAASABKQMwfCABKQOYASABKQM4fFENACABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEpAyggASkDMEIugFYEQCABKAKQAUEVQQAQFCABQQA2AqwBDAELIAEgASkDKCABKAKQARCEASIFNgKMASAFRQRAIAFBADYCrAEMAQsgASgCjAFBAToALCABKAKMASABKQMwNwMYIAEoAowBIAEpA4ABNwMgIAEgASgCjAE2AqwBCyABKAKsASEFIAFBsAFqJAAgACAFNgJQDAELIAAoAmQgACkDMBAsGiAAKAJkIQUgACkDWCEJIAAoAmgoAhQhBiAAKAJUIQcjAEHQAGsiASQAIAEgBTYCSCABIAk3A0AgASAGNgI8IAEgBzYCOAJAIAEoAkgQL0IWVARAIAEoAjhBFUEAEBQgAUEANgJMDAELIwBBEGsiBSABKAJINgIMIAECfiAFKAIMLQAAQQFxBEAgBSgCDCkDEAwBC0IACzcDCCABKAJIQgQQHhogASgCSBAqBEAgASgCOEEBQQAQFCABQQA2AkwMAQsgASABKAJIEB1B//8Dca03AyggASABKAJIEB1B//8Dca03AyAgASkDICABKQMoUgRAIAEoAjhBE0EAEBQgAUEANgJMDAELIAEgASgCSBAqrTcDGCABIAEoAkgQKq03AxAgASkDECABKQMQIAEpAxh8VgRAIAEoAjhBBEEWEBQgAUEANgJMDAELIAEpAxAgASkDGHwgASkDQCABKQMIfFYEQCABKAI4QRVBABAUIAFBADYCTAwBCwJAIAEoAjxBBHFFDQAgASkDECABKQMYfCABKQNAIAEpAwh8UQ0AIAEoAjhBFUEAEBQgAUEANgJMDAELIAEgASkDICABKAI4EIQBIgU2AjQgBUUEQCABQQA2AkwMAQsgASgCNEEAOgAsIAEoAjQgASkDGDcDGCABKAI0IAEpAxA3AyAgASABKAI0NgJMCyABKAJMIQUgAUHQAGokACAAIAU2AlALIAAoAlBFBEAgAEEANgJsDAELIAAoAmQgACkDMEIUfBAsGiAAIAAoAmQQHTsBTiAAKAJQKQMgIAAoAlApAxh8IAApA1ggACkDMHxWBEAgACgCVEEVQQAQFCAAKAJQECQgAEEANgJsDAELAkAgAC8BTkUEQCAAKAJoKAIEQQRxRQ0BCyAAKAJkIAApAzBCFnwQLBogACAAKAJkEC83AyACQCAAKQMgIAAvAU6tWgRAIAAoAmgoAgRBBHFFDQEgACkDICAALwFOrVENAQsgACgCVEEVQQAQFCAAKAJQECQgAEEANgJsDAILIAAvAU4EQCAAKAJkIAAvAU6tEB4gAC8BTkEAIAAoAlQQUiEBIAAoAlAgATYCKCABRQRAIAAoAlAQJCAAQQA2AmwMAwsLCwJAIAAoAlApAyAgACkDWFoEQCAAKAJkIAAoAlApAyAgACkDWH0QLBogACAAKAJkIAAoAlApAxgQHiIBNgIcIAFFBEAgACgCVEEVQQAQFCAAKAJQECQgAEEANgJsDAMLIAAgACgCHCAAKAJQKQMYECkiATYCLCABRQRAIAAoAlRBDkEAEBQgACgCUBAkIABBADYCbAwDCwwBCyAAQQA2AiwgACgCaCgCACAAKAJQKQMgQQAQJ0EASARAIAAoAlQgACgCaCgCABAXIAAoAlAQJCAAQQA2AmwMAgsgACgCaCgCABBKIAAoAlApAyBSBEAgACgCVEETQQAQFCAAKAJQECQgAEEANgJsDAILCyAAIAAoAlApAxg3AzggAEIANwNAA0ACQCAAKQM4UA0AIABBADoAGyAAKQNAIAAoAlApAwhRBEAgACgCUC0ALEEBcQ0BIAApAzhCLlQNASAAKAJQQoCABCAAKAJUEIMBQQFxRQRAIAAoAlAQJCAAKAIsEBYgAEEANgJsDAQLIABBAToAGwsjAEEQayIBJAAgAUHYABAYIgU2AggCQCAFRQRAIAFBADYCDAwBCyABKAIIEE8gASABKAIINgIMCyABKAIMIQUgAUEQaiQAIAUhASAAKAJQKAIAIAApA0CnQQR0aiABNgIAAkAgAQRAIAAgACgCUCgCACAAKQNAp0EEdGooAgAgACgCaCgCACAAKAIsQQAgACgCVBDGASIJNwMQIAlCAFkNAQsCQCAALQAbQQFxRQ0AIwBBEGsiASAAKAJUNgIMIAEoAgwoAgBBE0cNACAAKAJUQRVBABAUCyAAKAJQECQgACgCLBAWIABBADYCbAwDCyAAIAApA0BCAXw3A0AgACAAKQM4IAApAxB9NwM4DAELCwJAIAApA0AgACgCUCkDCFEEQCAAKQM4UA0BCyAAKAJUQRVBABAUIAAoAiwQFiAAKAJQECQgAEEANgJsDAELIAAoAmgoAgRBBHEEQAJAIAAoAiwEQCAAIAAoAiwQR0EBcToADwwBCyAAIAAoAmgoAgAQSjcDACAAKQMAQgBTBEAgACgCVCAAKAJoKAIAEBcgACgCUBAkIABBADYCbAwDCyAAIAApAwAgACgCUCkDICAAKAJQKQMYfFE6AA8LIAAtAA9BAXFFBEAgACgCVEEVQQAQFCAAKAIsEBYgACgCUBAkIABBADYCbAwCCwsgACgCLBAWIAAgACgCUDYCbAsgACgCbCEBIABB8ABqJAAgAiABNgJIIAEEQAJAIAIoAkwEQCACKQMgQgBXBEAgAiACKAJYIAIoAkwgAkEQahBpNwMgCyACIAIoAlggAigCSCACQRBqEGk3AygCQCACKQMgIAIpAyhTBEAgAigCTBAkIAIgAigCSDYCTCACIAIpAyg3AyAMAQsgAigCSBAkCwwBCyACIAIoAkg2AkwCQCACKAJYKAIEQQRxBEAgAiACKAJYIAIoAkwgAkEQahBpNwMgDAELIAJCADcDIAsLIAJBADYCSAsgAiACKAJEQQFqNgJEIAIoAgwgAigCRAJ/IwBBEGsiACACKAIMNgIMIAAoAgwoAgQLa6wQLBoMAQsLIAIoAgwQFiACKQMgQgBTBEAgAigCWEEIaiACQRBqEEMgAigCTBAkIAJBADYCXAwBCyACIAIoAkw2AlwLIAIoAlwhACACQeAAaiQAIAMgADYCWCAARQRAIAMoAmAgAygCXEEIahBDIwBBEGsiACADKAJoNgIMIAAoAgwiACAAKAIwQQFqNgIwIAMoAlwQPSADQQA2AmwMAQsgAygCXCADKAJYKAIANgJAIAMoAlwgAygCWCkDCDcDMCADKAJcIAMoAlgpAxA3AzggAygCXCADKAJYKAIoNgIgIAMoAlgQFSADKAJcKAJQIQAgAygCXCkDMCEJIAMoAlxBCGohAiMAQSBrIgEkACABIAA2AhggASAJNwMQIAEgAjYCDAJAIAEpAxBQBEAgAUEBOgAfDAELIwBBIGsiACABKQMQNwMQIAAgACkDELpEAAAAAAAA6D+jOQMIAkAgACsDCEQAAOD////vQWQEQCAAQX82AgQMAQsgAAJ/IAArAwgiCkQAAAAAAADwQWMgCkQAAAAAAAAAAGZxBEAgCqsMAQtBAAs2AgQLAkAgACgCBEGAgICAeEsEQCAAQYCAgIB4NgIcDAELIAAgACgCBEEBazYCBCAAIAAoAgQgACgCBEEBdnI2AgQgACAAKAIEIAAoAgRBAnZyNgIEIAAgACgCBCAAKAIEQQR2cjYCBCAAIAAoAgQgACgCBEEIdnI2AgQgACAAKAIEIAAoAgRBEHZyNgIEIAAgACgCBEEBajYCBCAAIAAoAgQ2AhwLIAEgACgCHDYCCCABKAIIIAEoAhgoAgBNBEAgAUEBOgAfDAELIAEoAhggASgCCCABKAIMEFlBAXFFBEAgAUEAOgAfDAELIAFBAToAHwsgAS0AHxogAUEgaiQAIANCADcDEANAIAMpAxAgAygCXCkDMFQEQCADIAMoAlwoAkAgAykDEKdBBHRqKAIAKAIwQQBBACADKAJgEEY2AgwgAygCDEUEQCMAQRBrIgAgAygCaDYCDCAAKAIMIgAgACgCMEEBajYCMCADKAJcED0gA0EANgJsDAMLIAMoAlwoAlAgAygCDCADKQMQQQggAygCXEEIahB1QQFxRQRAAkAgAygCXCgCCEEKRgRAIAMoAmRBBHFFDQELIAMoAmAgAygCXEEIahBDIwBBEGsiACADKAJoNgIMIAAoAgwiACAAKAIwQQFqNgIwIAMoAlwQPSADQQA2AmwMBAsLIAMgAykDEEIBfDcDEAwBCwsgAygCXCADKAJcKAIUNgIYIAMgAygCXDYCbAsgAygCbCEAIANB8ABqJAAgBCAANgI4CyAEKAI4RQRAIAQoAlgQMRogBEEANgJcDAELIAQgBCgCODYCXAsgBCgCXCEAIARB4ABqJAAgAAuOAQEBfyMAQRBrIgIkACACIAA2AgwgAiABNgIIIAJBADYCBCACKAIIBEAjAEEQayIAIAIoAgg2AgwgAiAAKAIMKAIANgIEIAIoAggQlgFBAUYEQCMAQRBrIgAgAigCCDYCDEG0mwEgACgCDCgCBDYCAAsLIAIoAgwEQCACKAIMIAIoAgQ2AgALIAJBEGokAAuVAQEBfyMAQRBrIgEkACABIAA2AggCQAJ/IwBBEGsiACABKAIINgIMIAAoAgwpAxhCgIAQg1ALBEAgASgCCCgCAARAIAEgASgCCCgCABCeAUEBcToADwwCCyABQQE6AA8MAQsgASABKAIIQQBCAEESECE+AgQgASABKAIEQQBHOgAPCyABLQAPQQFxIQAgAUEQaiQAIAALfwEBfyMAQSBrIgMkACADIAA2AhggAyABNwMQIANBADYCDCADIAI2AggCQCADKQMQQv///////////wBWBEAgAygCCEEEQT0QFCADQX82AhwMAQsgAyADKAIYIAMpAxAgAygCDCADKAIIEGs2AhwLIAMoAhwhACADQSBqJAAgAAt9ACACQQFGBEAgASAAKAIIIAAoAgRrrH0hAQsCQCAAKAIUIAAoAhxLBEAgAEEAQQAgACgCJBEBABogACgCFEUNAQsgAEEANgIcIABCADcDECAAIAEgAiAAKAIoEQ8AQgBTDQAgAEIANwIEIAAgACgCAEFvcTYCAEEADwtBfwvhAgECfyMAQSBrIgMkAAJ/AkACQEGnEiABLAAAEKIBRQRAQbSbAUEcNgIADAELQZgJEBgiAg0BC0EADAELIAJBAEGQARAyIAFBKxCiAUUEQCACQQhBBCABLQAAQfIARhs2AgALAkAgAS0AAEHhAEcEQCACKAIAIQEMAQsgAEEDQQAQBCIBQYAIcUUEQCADIAFBgAhyNgIQIABBBCADQRBqEAQaCyACIAIoAgBBgAFyIgE2AgALIAJB/wE6AEsgAkGACDYCMCACIAA2AjwgAiACQZgBajYCLAJAIAFBCHENACADIANBGGo2AgAgAEGTqAEgAxAODQAgAkEKOgBLCyACQRo2AiggAkEbNgIkIAJBHDYCICACQR02AgxB6J8BKAIARQRAIAJBfzYCTAsgAkGsoAEoAgA2AjhBrKABKAIAIgAEQCAAIAI2AjQLQaygASACNgIAIAILIQAgA0EgaiQAIAAL8AEBAn8CfwJAIAFB/wFxIgMEQCAAQQNxBEADQCAALQAAIgJFDQMgAiABQf8BcUYNAyAAQQFqIgBBA3ENAAsLAkAgACgCACICQX9zIAJBgYKECGtxQYCBgoR4cQ0AIANBgYKECGwhAwNAIAIgA3MiAkF/cyACQYGChAhrcUGAgYKEeHENASAAKAIEIQIgAEEEaiEAIAJBgYKECGsgAkF/c3FBgIGChHhxRQ0ACwsDQCAAIgItAAAiAwRAIAJBAWohACADIAFB/wFxRw0BCwsgAgwCCyAAECsgAGoMAQsgAAsiAEEAIAAtAAAgAUH/AXFGGwsYACAAKAJMQX9MBEAgABCkAQ8LIAAQpAELYAIBfgJ/IAAoAighAkEBIQMgAEIAIAAtAABBgAFxBH9BAkEBIAAoAhQgACgCHEsbBUEBCyACEQ8AIgFCAFkEfiAAKAIUIAAoAhxrrCABIAAoAgggACgCBGusfXwFIAELC2sBAX8gAARAIAAoAkxBf0wEQCAAEG8PCyAAEG8PC0GwoAEoAgAEQEGwoAEoAgAQpQEhAQtBrKABKAIAIgAEQANAIAAoAkwaIAAoAhQgACgCHEsEQCAAEG8gAXIhAQsgACgCOCIADQALCyABCyIAIAAgARACIgBBgWBPBH9BtJsBQQAgAGs2AgBBfwUgAAsLUwEDfwJAIAAoAgAsAABBMGtBCk8NAANAIAAoAgAiAiwAACEDIAAgAkEBajYCACABIANqQTBrIQEgAiwAAUEwa0EKTw0BIAFBCmwhAQwACwALIAELuwIAAkAgAUEUSw0AAkACQAJAAkACQAJAAkACQAJAAkAgAUEJaw4KAAECAwQFBgcICQoLIAIgAigCACIBQQRqNgIAIAAgASgCADYCAA8LIAIgAigCACIBQQRqNgIAIAAgATQCADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATUCADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASkDADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATIBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATMBADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATAAADcDAA8LIAIgAigCACIBQQRqNgIAIAAgATEAADcDAA8LIAIgAigCAEEHakF4cSIBQQhqNgIAIAAgASsDADkDAA8LIAAgAkEYEQQACwt/AgF/AX4gAL0iA0I0iKdB/w9xIgJB/w9HBHwgAkUEQCABIABEAAAAAAAAAABhBH9BAAUgAEQAAAAAAADwQ6IgARCpASEAIAEoAgBBQGoLNgIAIAAPCyABIAJB/gdrNgIAIANC/////////4eAf4NCgICAgICAgPA/hL8FIAALC5sCACAARQRAQQAPCwJ/AkAgAAR/IAFB/wBNDQECQEGQmQEoAgAoAgBFBEAgAUGAf3FBgL8DRg0DDAELIAFB/w9NBEAgACABQT9xQYABcjoAASAAIAFBBnZBwAFyOgAAQQIMBAsgAUGAsANPQQAgAUGAQHFBgMADRxtFBEAgACABQT9xQYABcjoAAiAAIAFBDHZB4AFyOgAAIAAgAUEGdkE/cUGAAXI6AAFBAwwECyABQYCABGtB//8/TQRAIAAgAUE/cUGAAXI6AAMgACABQRJ2QfABcjoAACAAIAFBBnZBP3FBgAFyOgACIAAgAUEMdkE/cUGAAXI6AAFBBAwECwtBtJsBQRk2AgBBfwVBAQsMAQsgACABOgAAQQELC+MBAQJ/IAJBAEchAwJAAkACQCAAQQNxRQ0AIAJFDQAgAUH/AXEhBANAIAAtAAAgBEYNAiACQQFrIgJBAEchAyAAQQFqIgBBA3FFDQEgAg0ACwsgA0UNAQsCQCAALQAAIAFB/wFxRg0AIAJBBEkNACABQf8BcUGBgoQIbCEDA0AgACgCACADcyIEQX9zIARBgYKECGtxQYCBgoR4cQ0BIABBBGohACACQQRrIgJBA0sNAAsLIAJFDQAgAUH/AXEhAQNAIAEgAC0AAEYEQCAADwsgAEEBaiEAIAJBAWsiAg0ACwtBAAuLDAEGfyAAIAFqIQUCQAJAIAAoAgQiAkEBcQ0AIAJBA3FFDQEgACgCACICIAFqIQECQCAAIAJrIgBBzJsBKAIARwRAIAJB/wFNBEAgACgCCCIEIAJBA3YiAkEDdEHgmwFqRhogACgCDCIDIARHDQJBuJsBQbibASgCAEF+IAJ3cTYCAAwDCyAAKAIYIQYCQCAAIAAoAgwiA0cEQCAAKAIIIgJByJsBKAIASRogAiADNgIMIAMgAjYCCAwBCwJAIABBFGoiAigCACIEDQAgAEEQaiICKAIAIgQNAEEAIQMMAQsDQCACIQcgBCIDQRRqIgIoAgAiBA0AIANBEGohAiADKAIQIgQNAAsgB0EANgIACyAGRQ0CAkAgACAAKAIcIgRBAnRB6J0BaiICKAIARgRAIAIgAzYCACADDQFBvJsBQbybASgCAEF+IAR3cTYCAAwECyAGQRBBFCAGKAIQIABGG2ogAzYCACADRQ0DCyADIAY2AhggACgCECICBEAgAyACNgIQIAIgAzYCGAsgACgCFCICRQ0CIAMgAjYCFCACIAM2AhgMAgsgBSgCBCICQQNxQQNHDQFBwJsBIAE2AgAgBSACQX5xNgIEIAAgAUEBcjYCBCAFIAE2AgAPCyAEIAM2AgwgAyAENgIICwJAIAUoAgQiAkECcUUEQCAFQdCbASgCAEYEQEHQmwEgADYCAEHEmwFBxJsBKAIAIAFqIgE2AgAgACABQQFyNgIEIABBzJsBKAIARw0DQcCbAUEANgIAQcybAUEANgIADwsgBUHMmwEoAgBGBEBBzJsBIAA2AgBBwJsBQcCbASgCACABaiIBNgIAIAAgAUEBcjYCBCAAIAFqIAE2AgAPCyACQXhxIAFqIQECQCACQf8BTQRAIAUoAggiBCACQQN2IgJBA3RB4JsBakYaIAQgBSgCDCIDRgRAQbibAUG4mwEoAgBBfiACd3E2AgAMAgsgBCADNgIMIAMgBDYCCAwBCyAFKAIYIQYCQCAFIAUoAgwiA0cEQCAFKAIIIgJByJsBKAIASRogAiADNgIMIAMgAjYCCAwBCwJAIAVBFGoiBCgCACICDQAgBUEQaiIEKAIAIgINAEEAIQMMAQsDQCAEIQcgAiIDQRRqIgQoAgAiAg0AIANBEGohBCADKAIQIgINAAsgB0EANgIACyAGRQ0AAkAgBSAFKAIcIgRBAnRB6J0BaiICKAIARgRAIAIgAzYCACADDQFBvJsBQbybASgCAEF+IAR3cTYCAAwCCyAGQRBBFCAGKAIQIAVGG2ogAzYCACADRQ0BCyADIAY2AhggBSgCECICBEAgAyACNgIQIAIgAzYCGAsgBSgCFCICRQ0AIAMgAjYCFCACIAM2AhgLIAAgAUEBcjYCBCAAIAFqIAE2AgAgAEHMmwEoAgBHDQFBwJsBIAE2AgAPCyAFIAJBfnE2AgQgACABQQFyNgIEIAAgAWogATYCAAsgAUH/AU0EQCABQQN2IgJBA3RB4JsBaiEBAn9BuJsBKAIAIgNBASACdCICcUUEQEG4mwEgAiADcjYCACABDAELIAEoAggLIQIgASAANgIIIAIgADYCDCAAIAE2AgwgACACNgIIDwtBHyECIABCADcCECABQf///wdNBEAgAUEIdiICIAJBgP4/akEQdkEIcSIEdCICIAJBgOAfakEQdkEEcSIDdCICIAJBgIAPakEQdkECcSICdEEPdiADIARyIAJyayICQQF0IAEgAkEVanZBAXFyQRxqIQILIAAgAjYCHCACQQJ0QeidAWohBwJAAkBBvJsBKAIAIgRBASACdCIDcUUEQEG8mwEgAyAEcjYCACAHIAA2AgAgACAHNgIYDAELIAFBAEEZIAJBAXZrIAJBH0YbdCECIAcoAgAhAwNAIAMiBCgCBEF4cSABRg0CIAJBHXYhAyACQQF0IQIgBCADQQRxaiIHQRBqKAIAIgMNAAsgByAANgIQIAAgBDYCGAsgACAANgIMIAAgADYCCA8LIAQoAggiASAANgIMIAQgADYCCCAAQQA2AhggACAENgIMIAAgATYCCAsL+QIBAX8jAEEgayIEJAAgBCAANgIYIAQgATcDECAEIAI2AgwgBCADNgIIIAQgBCgCGCAEKAIYIAQpAxAgBCgCDCAEKAIIEK4BIgA2AgACQCAARQRAIARBADYCHAwBCyAEKAIAEElBAEgEQCAEKAIYQQhqIAQoAgAQFyAEKAIAEBsgBEEANgIcDAELIAQoAhghAiMAQRBrIgAkACAAIAI2AgggAEEYEBgiAjYCBAJAIAJFBEAgACgCCEEIakEOQQAQFCAAQQA2AgwMAQsgACgCBCAAKAIINgIAIwBBEGsiAiAAKAIEQQRqNgIMIAIoAgxBADYCACACKAIMQQA2AgQgAigCDEEANgIIIAAoAgRBADoAECAAKAIEQQA2AhQgACAAKAIENgIMCyAAKAIMIQIgAEEQaiQAIAQgAjYCBCACRQRAIAQoAgAQGyAEQQA2AhwMAQsgBCgCBCAEKAIANgIUIAQgBCgCBDYCHAsgBCgCHCEAIARBIGokACAAC7cOAgN/AX4jAEHAAWsiBSQAIAUgADYCuAEgBSABNgK0ASAFIAI3A6gBIAUgAzYCpAEgBUIANwOYASAFQgA3A5ABIAUgBDYCjAECQCAFKAK4AUUEQCAFQQA2ArwBDAELAkAgBSgCtAEEQCAFKQOoASAFKAK0ASkDMFQNAQsgBSgCuAFBCGpBEkEAEBQgBUEANgK8AQwBCwJAIAUoAqQBQQhxDQAgBSgCtAEoAkAgBSkDqAGnQQR0aigCCEUEQCAFKAK0ASgCQCAFKQOoAadBBHRqLQAMQQFxRQ0BCyAFKAK4AUEIakEPQQAQFCAFQQA2ArwBDAELIAUoArQBIAUpA6gBIAUoAqQBQQhyIAVByABqEH9BAEgEQCAFKAK4AUEIakEUQQAQFCAFQQA2ArwBDAELIAUoAqQBQSBxBEAgBSAFKAKkAUEEcjYCpAELAkAgBSkDmAFQBEAgBSkDkAFQDQELIAUoAqQBQQRxRQ0AIAUoArgBQQhqQRJBABAUIAVBADYCvAEMAQsCQCAFKQOYAVAEQCAFKQOQAVANAQsgBSkDmAEgBSkDmAEgBSkDkAF8WARAIAUpA2AgBSkDmAEgBSkDkAF8Wg0BCyAFKAK4AUEIakESQQAQFCAFQQA2ArwBDAELIAUpA5ABUARAIAUgBSkDYCAFKQOYAX03A5ABCyAFIAUpA5ABIAUpA2BUOgBHIAUgBSgCpAFBIHEEf0EABSAFLwF6QQBHC0EBcToARSAFIAUoAqQBQQRxBH9BAAUgBS8BeEEARwtBAXE6AEQgBQJ/IAUoAqQBQQRxBEBBACAFLwF4DQEaCyAFLQBHQX9zC0EBcToARiAFLQBFQQFxBEAgBSgCjAFFBEAgBSAFKAK4ASgCHDYCjAELIAUoAowBRQRAIAUoArgBQQhqQRpBABAUIAVBADYCvAEMAgsLIAUpA2hQBEAgBSAFKAK4AUEAQgBBABB+NgK8AQwBCwJAAkAgBS0AR0EBcUUNACAFLQBFQQFxDQAgBS0AREEBcQ0AIAUgBSkDkAE3AyAgBSAFKQOQATcDKCAFQQA7ATggBSAFKAJwNgIwIAVC3AA3AwggBSAFKAK0ASgCACAFKQOYASAFKQOQASAFQQhqQQAgBSgCtAEgBSkDqAEgBSgCuAFBCGoQZCIANgKIAQwBCyAFIAUoArQBIAUpA6gBIAUoAqQBIAUoArgBQQhqEEUiADYCBCAARQRAIAVBADYCvAEMAgsgBSAFKAK0ASgCAEIAIAUpA2ggBUHIAGogBSgCBC8BDEEBdkEDcSAFKAK0ASAFKQOoASAFKAK4AUEIahBkIgA2AogBCyAARQRAIAVBADYCvAEMAQsCfyAFKAKIASEAIAUoArQBIQMjAEEQayIBJAAgASAANgIMIAEgAzYCCCABKAIMIAEoAgg2AiwgASgCCCEDIAEoAgwhBCMAQSBrIgAkACAAIAM2AhggACAENgIUAkAgACgCGCgCSCAAKAIYKAJEQQFqTQRAIAAgACgCGCgCSEEKajYCDCAAIAAoAhgoAkwgACgCDEECdBBINgIQIAAoAhBFBEAgACgCGEEIakEOQQAQFCAAQX82AhwMAgsgACgCGCAAKAIMNgJIIAAoAhggACgCEDYCTAsgACgCFCEEIAAoAhgoAkwhBiAAKAIYIgcoAkQhAyAHIANBAWo2AkQgA0ECdCAGaiAENgIAIABBADYCHAsgACgCHCEDIABBIGokACABQRBqJAAgA0EASAsEQCAFKAKIARAbIAVBADYCvAEMAQsgBS0ARUEBcQRAIAUgBS8BekEAEHwiADYCACAARQRAIAUoArgBQQhqQRhBABAUIAVBADYCvAEMAgsgBSAFKAK4ASAFKAKIASAFLwF6QQAgBSgCjAEgBSgCABEFADYChAEgBSgCiAEQGyAFKAKEAUUEQCAFQQA2ArwBDAILIAUgBSgChAE2AogBCyAFLQBEQQFxBEAgBSAFKAK4ASAFKAKIASAFLwF4ELABNgKEASAFKAKIARAbIAUoAoQBRQRAIAVBADYCvAEMAgsgBSAFKAKEATYCiAELIAUtAEZBAXEEQCAFIAUoArgBIAUoAogBQQEQrwE2AoQBIAUoAogBEBsgBSgChAFFBEAgBUEANgK8AQwCCyAFIAUoAoQBNgKIAQsCQCAFLQBHQQFxRQ0AIAUtAEVBAXFFBEAgBS0AREEBcUUNAQsgBSgCuAEhASAFKAKIASEDIAUpA5gBIQIgBSkDkAEhCCMAQSBrIgAkACAAIAE2AhwgACADNgIYIAAgAjcDECAAIAg3AwggACgCGCAAKQMQIAApAwhBAEEAQQBCACAAKAIcQQhqEGQhASAAQSBqJAAgBSABNgKEASAFKAKIARAbIAUoAoQBRQRAIAVBADYCvAEMAgsgBSAFKAKEATYCiAELIAUgBSgCiAE2ArwBCyAFKAK8ASEAIAVBwAFqJAAgAAuEAgEBfyMAQSBrIgMkACADIAA2AhggAyABNgIUIAMgAjYCEAJAIAMoAhRFBEAgAygCGEEIakESQQAQFCADQQA2AhwMAQsgA0E4EBgiADYCDCAARQRAIAMoAhhBCGpBDkEAEBQgA0EANgIcDAELIwBBEGsiACADKAIMQQhqNgIMIAAoAgxBADYCACAAKAIMQQA2AgQgACgCDEEANgIIIAMoAgwgAygCEDYCACADKAIMQQA2AgQgAygCDEIANwMoQQBBAEEAEBohACADKAIMIAA2AjAgAygCDEIANwMYIAMgAygCGCADKAIUQRQgAygCDBBmNgIcCyADKAIcIQAgA0EgaiQAIAALQwEBfyMAQRBrIgMkACADIAA2AgwgAyABNgIIIAMgAjYCBCADKAIMIAMoAgggAygCBEEAQQAQsgEhACADQRBqJAAgAAtJAQF/IwBBEGsiASQAIAEgADYCDCABKAIMBEAgASgCDCgCrEAgASgCDCgCqEAoAgQRAgAgASgCDBA3IAEoAgwQFQsgAUEQaiQAC5QFAQF/IwBBMGsiBSQAIAUgADYCKCAFIAE2AiQgBSACNgIgIAUgAzoAHyAFIAQ2AhggBUEANgIMAkAgBSgCJEUEQCAFKAIoQQhqQRJBABAUIAVBADYCLAwBCyAFIAUoAiAgBS0AH0EBcRCzASIANgIMIABFBEAgBSgCKEEIakEQQQAQFCAFQQA2AiwMAQsgBSgCICEBIAUtAB9BAXEhAiAFKAIYIQMgBSgCDCEEIwBBIGsiACQAIAAgATYCGCAAIAI6ABcgACADNgIQIAAgBDYCDCAAQbDAABAYIgE2AggCQCABRQRAIABBADYCHAwBCyMAQRBrIgEgACgCCDYCDCABKAIMQQA2AgAgASgCDEEANgIEIAEoAgxBADYCCCAAKAIIAn8gAC0AF0EBcQRAIAAoAhhBf0cEfyAAKAIYQX5GBUEBC0EBcQwBC0EAC0EARzoADiAAKAIIIAAoAgw2AqhAIAAoAgggACgCGDYCFCAAKAIIIAAtABdBAXE6ABAgACgCCEEAOgAMIAAoAghBADoADSAAKAIIQQA6AA8gACgCCCgCqEAoAgAhAQJ/AkAgACgCGEF/RwRAIAAoAhhBfkcNAQtBCAwBCyAAKAIYC0H//wNxIAAoAhAgACgCCCABEQEAIQEgACgCCCABNgKsQCABRQRAIAAoAggQNyAAKAIIEBUgAEEANgIcDAELIAAgACgCCDYCHAsgACgCHCEBIABBIGokACAFIAE2AhQgAUUEQCAFKAIoQQhqQQ5BABAUIAVBADYCLAwBCyAFIAUoAiggBSgCJEETIAUoAhQQZiIANgIQIABFBEAgBSgCFBCxASAFQQA2AiwMAQsgBSAFKAIQNgIsCyAFKAIsIQAgBUEwaiQAIAALzAEBAX8jAEEgayICIAA2AhggAiABOgAXIAICfwJAIAIoAhhBf0cEQCACKAIYQX5HDQELQQgMAQsgAigCGAs7AQ4gAkEANgIQAkADQCACKAIQQdSXASgCAEkEQCACKAIQQQxsQdiXAWovAQAgAi8BDkYEQCACLQAXQQFxBEAgAiACKAIQQQxsQdiXAWooAgQ2AhwMBAsgAiACKAIQQQxsQdiXAWooAgg2AhwMAwUgAiACKAIQQQFqNgIQDAILAAsLIAJBADYCHAsgAigCHAvkAQEBfyMAQSBrIgMkACADIAA6ABsgAyABNgIUIAMgAjYCECADQcgAEBgiADYCDAJAIABFBEAgAygCEEEBQbSbASgCABAUIANBADYCHAwBCyADKAIMIAMoAhA2AgAgAygCDCADLQAbQQFxOgAEIAMoAgwgAygCFDYCCAJAIAMoAgwoAghBAU4EQCADKAIMKAIIQQlMDQELIAMoAgxBCTYCCAsgAygCDEEAOgAMIAMoAgxBADYCMCADKAIMQQA2AjQgAygCDEEANgI4IAMgAygCDDYCHAsgAygCHCEAIANBIGokACAAC+MIAQF/IwBBQGoiAiAANgI4IAIgATYCNCACIAIoAjgoAnw2AjAgAiACKAI4KAI4IAIoAjgoAmxqNgIsIAIgAigCOCgCeDYCICACIAIoAjgoApABNgIcIAICfyACKAI4KAJsIAIoAjgoAixBhgJrSwRAIAIoAjgoAmwgAigCOCgCLEGGAmtrDAELQQALNgIYIAIgAigCOCgCQDYCFCACIAIoAjgoAjQ2AhAgAiACKAI4KAI4IAIoAjgoAmxqQYICajYCDCACIAIoAiwgAigCIEEBa2otAAA6AAsgAiACKAIsIAIoAiBqLQAAOgAKIAIoAjgoAnggAigCOCgCjAFPBEAgAiACKAIwQQJ2NgIwCyACKAIcIAIoAjgoAnRLBEAgAiACKAI4KAJ0NgIcCwNAAkAgAiACKAI4KAI4IAIoAjRqNgIoAkAgAigCKCACKAIgai0AACACLQAKRw0AIAIoAiggAigCIEEBa2otAAAgAi0AC0cNACACKAIoLQAAIAIoAiwtAABHDQAgAiACKAIoIgBBAWo2AiggAC0AASACKAIsLQABRwRADAELIAIgAigCLEECajYCLCACIAIoAihBAWo2AigDQCACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AigCf0EAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACIAIoAiwiAEEBajYCLCAALQABIQEgAiACKAIoIgBBAWo2AihBACAALQABIAFHDQAaIAIgAigCLCIAQQFqNgIsIAAtAAEhASACIAIoAigiAEEBajYCKEEAIAAtAAEgAUcNABogAiACKAIsIgBBAWo2AiwgAC0AASEBIAIgAigCKCIAQQFqNgIoQQAgAC0AASABRw0AGiACKAIsIAIoAgxJC0EBcQ0ACyACQYICIAIoAgwgAigCLGtrNgIkIAIgAigCDEGCAms2AiwgAigCJCACKAIgSgRAIAIoAjggAigCNDYCcCACIAIoAiQ2AiAgAigCJCACKAIcTg0CIAIgAigCLCACKAIgQQFrai0AADoACyACIAIoAiwgAigCIGotAAA6AAoLCyACIAIoAhQgAigCNCACKAIQcUEBdGovAQAiATYCNEEAIQAgASACKAIYSwR/IAIgAigCMEEBayIANgIwIABBAEcFQQALQQFxDQELCwJAIAIoAiAgAigCOCgCdE0EQCACIAIoAiA2AjwMAQsgAiACKAI4KAJ0NgI8CyACKAI8C5IQAQF/IwBBMGsiAiQAIAIgADYCKCACIAE2AiQgAgJ/IAIoAigoAiwgAigCKCgCDEEFa0kEQCACKAIoKAIsDAELIAIoAigoAgxBBWsLNgIgIAJBADYCECACIAIoAigoAgAoAgQ2AgwDQAJAIAJB//8DNgIcIAIgAigCKCgCvC1BKmpBA3U2AhQgAigCKCgCACgCECACKAIUSQ0AIAIgAigCKCgCACgCECACKAIUazYCFCACIAIoAigoAmwgAigCKCgCXGs2AhggAigCHCACKAIYIAIoAigoAgAoAgRqSwRAIAIgAigCGCACKAIoKAIAKAIEajYCHAsgAigCHCACKAIUSwRAIAIgAigCFDYCHAsCQCACKAIcIAIoAiBPDQACQCACKAIcRQRAIAIoAiRBBEcNAQsgAigCJEUNACACKAIcIAIoAhggAigCKCgCACgCBGpGDQELDAELQQAhACACIAIoAiRBBEYEfyACKAIcIAIoAhggAigCKCgCACgCBGpGBUEAC0EBcTYCECACKAIoQQBBACACKAIQEFwgAigCKCgCCCACKAIoKAIUQQRraiACKAIcOgAAIAIoAigoAgggAigCKCgCFEEDa2ogAigCHEEIdjoAACACKAIoKAIIIAIoAigoAhRBAmtqIAIoAhxBf3M6AAAgAigCKCgCCCACKAIoKAIUQQFraiACKAIcQX9zQQh2OgAAIAIoAigoAgAQHCACKAIYBEAgAigCGCACKAIcSwRAIAIgAigCHDYCGAsgAigCKCgCACgCDCACKAIoKAI4IAIoAigoAlxqIAIoAhgQGRogAigCKCgCACIAIAIoAhggACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCGGs2AhAgAigCKCgCACIAIAIoAhggACgCFGo2AhQgAigCKCIAIAIoAhggACgCXGo2AlwgAiACKAIcIAIoAhhrNgIcCyACKAIcBEAgAigCKCgCACACKAIoKAIAKAIMIAIoAhwQeBogAigCKCgCACIAIAIoAhwgACgCDGo2AgwgAigCKCgCACIAIAAoAhAgAigCHGs2AhAgAigCKCgCACIAIAIoAhwgACgCFGo2AhQLIAIoAhBFDQELCyACIAIoAgwgAigCKCgCACgCBGs2AgwgAigCDARAAkAgAigCDCACKAIoKAIsTwRAIAIoAihBAjYCsC0gAigCKCgCOCACKAIoKAIAKAIAIAIoAigoAixrIAIoAigoAiwQGRogAigCKCACKAIoKAIsNgJsDAELIAIoAgwgAigCKCgCPCACKAIoKAJsa08EQCACKAIoIgAgACgCbCACKAIoKAIsazYCbCACKAIoKAI4IAIoAigoAjggAigCKCgCLGogAigCKCgCbBAZGiACKAIoKAKwLUECSQRAIAIoAigiACAAKAKwLUEBajYCsC0LCyACKAIoKAI4IAIoAigoAmxqIAIoAigoAgAoAgAgAigCDGsgAigCDBAZGiACKAIoIgAgAigCDCAAKAJsajYCbAsgAigCKCACKAIoKAJsNgJcIAIoAigiAQJ/IAIoAgwgAigCKCgCLCACKAIoKAK0LWtLBEAgAigCKCgCLCACKAIoKAK0LWsMAQsgAigCDAsgASgCtC1qNgK0LQsgAigCKCgCwC0gAigCKCgCbEkEQCACKAIoIAIoAigoAmw2AsAtCwJAIAIoAhAEQCACQQM2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mwFCADcDAEGYmwFCADcDAEGQmwFCADcDAEGImwFCADcDAEGAmwFCADcDAEH4mgFCADcDAEHwmgFCADcDAEHwmgEL1QQBBX8jAEGwAWsiASQAIAEgADYCqAEgASgCqAEQNwJAAkAgASgCqAEoAgBBAE4EQCABKAKoASgCAEGAFCgCAEgNAQsgASABKAKoASgCADYCECABQSBqQY8SIAFBEGoQcCABQQA2AqQBIAEgAUEgajYCoAEMAQsgASABKAKoASgCAEECdEGAE2ooAgA2AqQBAkACQAJAAkAgASgCqAEoAgBBAnRBkBRqKAIAQQFrDgIAAQILIAEoAqgBKAIEIQJBkJkBKAIAIQRBACEAAkACQANAIAIgAEGgiAFqLQAARwRAQdcAIQMgAEEBaiIAQdcARw0BDAILCyAAIgMNAEGAiQEhAgwBC0GAiQEhAANAIAAtAAAhBSAAQQFqIgIhACAFDQAgAiEAIANBAWsiAw0ACwsgBCgCFBogASACNgKgAQwCCyMAQRBrIgAgASgCqAEoAgQ2AgwgAUEAIAAoAgxrQQJ0QajZAGooAgA2AqABDAELIAFBADYCoAELCwJAIAEoAqABRQRAIAEgASgCpAE2AqwBDAELIAEgASgCoAEQKwJ/IAEoAqQBBEAgASgCpAEQK0ECagwBC0EAC2pBAWoQGCIANgIcIABFBEAgAUG4EygCADYCrAEMAQsgASgCHCEAAn8gASgCpAEEQCABKAKkAQwBC0H6EgshA0HfEkH6EiABKAKkARshAiABIAEoAqABNgIIIAEgAjYCBCABIAM2AgAgAEG+CiABEHAgASgCqAEgASgCHDYCCCABIAEoAhw2AqwBCyABKAKsASEAIAFBsAFqJAAgAAszAQF/IAAoAhQiAyABIAIgACgCECADayIBIAEgAksbIgEQGRogACAAKAIUIAFqNgIUIAILjwUCBn4BfyABIAEoAgBBD2pBcHEiAUEQajYCACAAAnwgASkDACEDIAEpAwghBiMAQSBrIggkAAJAIAZC////////////AIMiBEKAgICAgIDAgDx9IARCgICAgICAwP/DAH1UBEAgBkIEhiADQjyIhCEEIANC//////////8PgyIDQoGAgICAgICACFoEQCAEQoGAgICAgICAwAB8IQIMAgsgBEKAgICAgICAgEB9IQIgA0KAgICAgICAgAiFQgBSDQEgAiAEQgGDfCECDAELIANQIARCgICAgICAwP//AFQgBEKAgICAgIDA//8AURtFBEAgBkIEhiADQjyIhEL/////////A4NCgICAgICAgPz/AIQhAgwBC0KAgICAgICA+P8AIQIgBEL///////+//8MAVg0AQgAhAiAEQjCIpyIAQZH3AEkNACADIQIgBkL///////8/g0KAgICAgIDAAIQiBSEHAkAgAEGB9wBrIgFBwABxBEAgAiABQUBqrYYhB0IAIQIMAQsgAUUNACAHIAGtIgSGIAJBwAAgAWutiIQhByACIASGIQILIAggAjcDECAIIAc3AxgCQEGB+AAgAGsiAEHAAHEEQCAFIABBQGqtiCEDQgAhBQwBCyAARQ0AIAVBwAAgAGuthiADIACtIgKIhCEDIAUgAoghBQsgCCADNwMAIAggBTcDCCAIKQMIQgSGIAgpAwAiA0I8iIQhAiAIKQMQIAgpAxiEQgBSrSADQv//////////D4OEIgNCgYCAgICAgIAIWgRAIAJCAXwhAgwBCyADQoCAgICAgICACIVCAFINACACQgGDIAJ8IQILIAhBIGokACACIAZCgICAgICAgICAf4OEvws5AwALrRcDEn8CfgF8IwBBsARrIgkkACAJQQA2AiwCQCABvSIYQn9XBEBBASESQa4IIRMgAZoiAb0hGAwBCyAEQYAQcQRAQQEhEkGxCCETDAELQbQIQa8IIARBAXEiEhshEyASRSEXCwJAIBhCgICAgICAgPj/AINCgICAgICAgPj/AFEEQCAAQSAgAiASQQNqIg0gBEH//3txECYgACATIBIQIiAAQeQLQbUSIAVBIHEiAxtBjw1BuRIgAxsgASABYhtBAxAiDAELIAlBEGohEAJAAn8CQCABIAlBLGoQqQEiASABoCIBRAAAAAAAAAAAYgRAIAkgCSgCLCIGQQFrNgIsIAVBIHIiFEHhAEcNAQwDCyAFQSByIhRB4QBGDQIgCSgCLCELQQYgAyADQQBIGwwBCyAJIAZBHWsiCzYCLCABRAAAAAAAALBBoiEBQQYgAyADQQBIGwshCiAJQTBqIAlB0AJqIAtBAEgbIg4hBwNAIAcCfyABRAAAAAAAAPBBYyABRAAAAAAAAAAAZnEEQCABqwwBC0EACyIDNgIAIAdBBGohByABIAO4oUQA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HCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCHCECIAEgASgCGCIDQQFqNgIYQQAgAy0AASACRw0AGiABKAIcIQIgASABKAIYIgNBAWo2AhhBACADLQABIAJHDQAaIAEoAhwhAiABIAEoAhgiA0EBajYCGEEAIAMtAAEgAkcNABogASgCGCABKAIUSQtBAXENAAsgASgCKEGCAiABKAIUIAEoAhhrazYCYCABKAIoKAJgIAEoAigoAnRLBEAgASgCKCABKAIoKAJ0NgJgCwsLAkAgASgCKCgCYEEDTwRAIAEgASgCKCgCYEEDazoAEyABQQE7ARAgASgCKCICKAKkLSACKAKgLUEBdGogAS8BEDsBACABLQATIQMgASgCKCICKAKYLSEEIAIgAigCoC0iAkEBajYCoC0gAiAEaiADOgAAIAEgAS8BEEEBazsBECABKAIoIAEtABNB0N0Aai0AAEECdGpBmAlqIgIgAi8BAEEBajsBACABKAIoQYgTagJ/IAEvARBBgAJJBEAgAS8BEC0A0FkMAQsgAS8BEEEHdkGAAmotANBZC0ECdGoiAiACLwEAQQFqOwEAIAEgASgCKCgCoC0gASgCKCgCnC1BAWtGNgIgIAEoAigiAiACKAJ0IAEoAigoAmBrNgJ0IAEoAigiAiABKAIoKAJgIAIoAmxqNgJsIAEoAihBADYCYAwBCyABIAEoAigiAigCOCACKAJsai0AADoADyABKAIoIgIoAqQtIAIoAqAtQQF0akEAOwEAIAEtAA8hAyABKAIoIgIoApgtIQQgAiACKAKgLSICQQFqNgKgLSACIARqIAM6AAAgASgCKCABLQAPQQJ0aiICIAIvAZQBQQFqOwGUASABIAEoAigoAqAtIAEoAigoApwtQQFrRjYCICABKAIoIgIgAigCdEEBazYCdCABKAIoIgIgAigCbEEBajYCbAsgASgCIARAIAEoAigCfyABKAIoKAJcQQBOBEAgASgCKCgCOCABKAIoKAJcagwBC0EACyABKAIoKAJsIAEoAigoAlxrQQAQKCABKAIoIAEoAigoAmw2AlwgASgCKCgCABAcIAEoAigo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QCABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiQgASgCLCABKAIccUECdGooAQA2ARACQAJAA0AgASABLQARNgIMIAEgASgCLCABKAIMdjYCLCABIAEoAiggASgCDGs2AiggASABLQAQNgIMIAEoAgxFBEAgAS8BEiECIAEgASgCSCIDQQFqNgJIIAMgAjoAAAwCCyABKAIMQRBxBEAgASABLwESNgIIIAEgASgCDEEPcTYCDCABKAIMBEAgASgCKCABKAIMSQRAIAEgASgCUCICQQFqNgJQIAEgASgCLCACLQAAIAEoAih0ajYCLCABIAEoAihBCGo2AigLIAEgASgCCCABKAIsQQEgASgCDHRBAWtxajYCCCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoCyABKAIoQQ9JBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABIAEoAlAiAkEBajYCUCABIAEoAiwgAi0AACABKAIodGo2AiwgASABKAIoQQhqNgIoCyABIAEoAiAgASgCLCABKAIYcUECdGooAQA2ARACQANAIAEgAS0AETYCDCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgAS0AEDYCDCABKAIMQRBxBEAgASABLwESNgIEIAEgASgCDEEPcTYCDCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKCABKAIoIAEoAgxJBEAgASABKAJQIgJBAWo2AlAgASABKAIsIAItAAAgASgCKHRqNgIsIAEgASgCKEEIajYCKAsLIAEgASgCBCABKAIsQQEgASgCDHRBAWtxajYCBCABIAEoAiwgASgCDHY2AiwgASABKAIoIAEoAgxrNgIoIAEgASgCSCABKAJEazYCDAJAIAEoAgQgASgCDEsEQCABIAEoAgQgASgCDGs2AgwgASgCDCABKAI4SwRAIAEoAlQoAsQ3BEAgASgCXEHdDDYCGCABKAJUQdH+ADYCBAwKCwsgASABKAIwNgIAAkAgASgCNEUEQCABIAEoAgAgASgCPCABKAIMa2o2AgAgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAkggASgCBGs2AgALDAELAkAgASgCNCABKAIMSQRAIAEgASgCACABKAI8IAEoAjRqIAEoAgxrajYCACABIAEoAgwgASgCNGs2AgwgASgCDCABKAIISQRAIAEgASgCCCABKAIMazYCCANAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIMQQFrIgI2AgwgAg0ACyABIAEoAjA2AgAgASgCNCABKAIISQRAIAEgASgCNDYCDCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsMAQsgASABKAIAIAEoAjQgASgCDGtqNgIAIAEoAgwgASgCCEkEQCABIAEoAgggASgCDGs2AggDQCABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCDEEBayICNgIMIAINAAsgASABKAJIIAEoAgRrNgIACwsLA0AgASgCCEECSwRAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgiA0EBajYCSCADIAI6AAAgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCCEEDazYCCAwBCwsMAQsgASABKAJIIAEoAgRrNgIAA0AgASABKAIAIgJBAWo2AgAgAi0AACECIAEgASgCSCIDQQFqNgJIIAMgAjoAACABIAEoAgAiAkEBajYCACACLQAAIQIgASABKAJIIgNBAWo2AkggAyACOgAAIAEgASgCACICQQFqNgIAIAItAAAhAiABIAEoAkgi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ZWFkIGVycm9yAFpsaWIgZXJyb3IAZGF0YSBlcnJvcgBDUkMgZXJyb3IAaW5jb21wYXRpYmxlIHZlcnNpb24AbmFuAC9kZXYvdXJhbmRvbQBpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2sAaW5jb3JyZWN0IGhlYWRlciBjaGVjawBpbmNvcnJlY3QgbGVuZ3RoIGNoZWNrAGluY29ycmVjdCBkYXRhIGNoZWNrAGludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrAGhlYWRlciBjcmMgbWlzbWF0Y2gAaW5mAGludmFsaWQgd2luZG93IHNpemUAUmVhZC1vbmx5IGFyY2hpdmUATm90IGEgemlwIGFyY2hpdmUAUmVzb3VyY2Ugc3RpbGwgaW4gdXNlAE1hbGxvYyBmYWlsdXJlAGludmFsaWQgYmxvY2sgdHlwZQBGYWlsdXJlIHRvIGNyZWF0ZSB0ZW1wb3JhcnkgZmlsZQBDYW4ndCBvcGVuIGZpbGUATm8gc3VjaCBmaWxlAFByZW1hdHVyZSBlbmQgb2YgZmlsZQBDYW4ndCByZW1vdmUgZmlsZQBpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUAaW52YWxpZCBkaXN0YW5jZSBjb2RlAHVua25vd24gY29tcHJlc3Npb24gbWV0aG9kAHN0cmVhbSBlbmQAQ29tcHJlc3NlZCBkYXRhIGludmFsaWQATXVsdGktZGlzayB6aXAgYXJjaGl2ZXMgbm90IHN1cHBvcnRlZABPcGVyYXRpb24gbm90IHN1cHBvcnRlZABFbmNyeXB0aW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAENvbXByZXNzaW9uIG1ldGhvZCBub3Qgc3VwcG9ydGVkAEVudHJ5IGhhcyBiZWVuIGRlbGV0ZWQAQ29udGFpbmluZyB6aXAgYXJjaGl2ZSB3YXMgY2xvc2VkAENsb3NpbmcgemlwIGFyY2hpdmUgZmFpbGVkAFJlbmFtaW5nIHRlbXBvcmFyeSBmaWxlIGZhaWxlZABFbnRyeSBoYXMgYmVlbiBjaGFuZ2VkAE5vIHBhc3N3b3JkIHByb3ZpZGVkAFdyb25nIHBhc3N3b3JkIHByb3ZpZGVkAFVua25vd24gZXJyb3IgJWQAcmIAcitiAHJ3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CADcAAgAPAAIALwACAB8AAgA/AAIAAIACACCAAgAQgAIAMIACAAiAAgAogAIAGIACADiAAgAEgAIAJIACABSAAgA0gAIADIACACyAAgAcgAIAPIACAAKAAgAigAIAEoACADKAAgAKgAIAKoACABqAAgA6gAIABoACACaAAgAWgAIANoACAA6AAgAugAIAHoACAD6AAgABgAIAIYACABGAAgAxgAIACYACACmAAgAZgAIAOYACAAWAAgAlgAIAFYACADWAAgANgAIALYACAB2AAgA9gAIAA4ACACOAAgATgAIAM4ACAAuAAgArgAIAG4ACADuAAgAHgAIAJ4ACABeAAgA3gAIAD4ACAC+AAgAfgAIAP4ACAABAAgAgQAIAEEACADBAAgAIQAIAKEACABhAAgA4QAIABEACACRAAgAUQAIANEACAAxAAgAsQAIAHEACADxAAgACQAIAIkACABJAAgAyQAIACkACACpAAgAaQAIAOkACAAZAAgAmQAIAFkACADZAAgAOQAIALkACAB5AAgA+QAIAAUACACFAAgARQAIAMUACAAlAAgApQAIAGUACADlAAgAFQAIAJUACABVAAgA1QAIADUACAC1AAgAdQAIAPUACAANAAgAjQAIAE0ACADNAAgALQAIAK0ACABtAAgA7QAIAB0ACACdAAgAXQAIAN0ACAA9AAgAvQAIAH0ACAD9AAgAEwAJABMBCQCTAAkAkwEJAFMACQBTAQkA0wAJANMBCQAzAAkAMwEJALMACQCzAQkAcwAJAHMBCQDzAAkA8wEJAAsACQALAQkAiwAJAIsBCQBLAAkASwEJAMsACQDLAQkAKwAJACsBCQCrAAkAqwEJAGsACQBrAQkA6wAJAOsBCQAbAAkAGwEJAJsACQCbAQkAWwAJAFsBCQDbAAkA2wEJADsACQA7AQkAuwAJALsBCQB7AAkAewEJAPsACQD7AQkABwAJAAcBCQCHAAkAhwEJAEcACQBHAQkAxwAJAMcBCQAnAAkAJwEJAKcACQCnAQkAZwAJAGcBCQDnAAkA5wEJABcACQAXAQkAlwAJAJcBCQBXAAkAVwEJANcACQDXAQkANwAJADcBCQC3AAkAtwEJAHcACQB3AQkA9wAJAPcBCQAPAAkADwEJAI8ACQCPAQkATwAJAE8BCQDPAAkAzwEJAC8ACQAvAQkArwAJAK8BCQBvAAkAbwEJAO8ACQDvAQkAHwAJAB8BCQCfAAkAnwEJAF8ACQBfAQkA3wAJAN8BCQA/AAkAPwEJAL8ACQC/AQkAfwAJAH8BCQD/AAkA/wEJAAAABwBAAAcAIAAHAGAABwAQAAcAUAAHADAABwBwAAcACAAHAEgABwAoAAcAaAAHABgABwBYAAcAOAAHAHgABwAEAAcARAAHACQABwBkAAcAFAAHAFQABwA0AAcAdAAHAAMACACDAAgAQwAIAMMACAAjAAgAowAIAGMACADjAAgAAAAFABAABQAIAAUAGAAFAAQABQAUAAUADAAFABwABQACAAUAEgAFAAoABQAaAAUABgAFABYABQAOAAUAHgAFAAEABQARAAUACQAFABkABQAFAAUAFQAFAA0ABQAdAAUAAwAFABMABQALAAUAGwAFAAcABQAXAAUAQbDqAAtNAQAAAAEAAAABAAAAAQAAAAIAAAACAAAAAgAAAAIAAAADAAAAAwAAAAMAAAADAAAABAAAAAQAAAAEAAAABAAAAAUAAAAFAAAABQAAAAUAQaDrAAtlAQAAAAEAAAACAAAAAgAAAAMAAAADAAAABAAAAAQAAAAFAAAABQAAAAYAAAAGAAAABwAAAAcAAAAIAAAACAAAAAkAAAAJAAAACgAAAAoAAAALAAAACwAAAAwAAAAMAAAADQAAAA0AQdDsAAsjAgAAAAMAAAAHAAAAAAAAABAREgAIBwkGCgULBAwDDQIOAQ8AQYTtAAtpAQAAAAIAAAADAAAABAAAAAUAAAAGAAAABwAAAAgAAAAKAAAADAAAAA4AAAAQAAAAFAAAABgAAAAcAAAAIAAAACgAAAAwAAAAOAAAAEAAAABQAAAAYAAAAHAAAACAAAAAoAAAAMAAAADgAEGE7gALegEAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAQAAAAGAAAACAAAAAwAAAAAABAACAAQAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAAIAAAADAAAABAAAAAYAAAMS4yLjExAEGI7wALbQcAAAAEAAQACAAEAAgAAAAEAAUAEAAIAAgAAAAEAAYAIAAgAAgAAAAEAAQAEAAQAAkAAAAIABAAIAAgAAkAAAAIABAAgACAAAkAAAAIACAAgAAAAQkAAAAgAIAAAgEABAkAAAAgAAIBAgEAEAkAQYDwAAulAgMABAAFAAYABwAIAAkACgALAA0ADwARABMAFwAbAB8AIwArADMAOwBDAFMAYwBzAIMAowDDAOMAAgEAAAAAAAAQABAAEAAQABAAEAAQABAAEQARABEAEQASABIAEgASABMAEwATABMAFAAUABQAFAAVABUAFQAVABAATQDKAAAAAQACAAMABAAFAAcACQANABEAGQAhADEAQQBhAIEAwQABAYEBAQIBAwEEAQYBCAEMARABGAEgATABQAFgAAAAABAAEAAQABAAEQARABIAEgATABMAFAAUABUAFQAWABYAFwAXABgAGAAZABkAGgAaABsAGwAcABwAHQAdAEAAQAAQABEAEgAAAAgABwAJAAYACgAFAAsABAAMAAMADQACAA4AAQAPAEGw8gALwRFgBwAAAAhQAAAIEAAUCHMAEgcfAAAIcAAACDAAAAnAABAHCgAACGAAAAggAAAJoAAACAAAAAiAAAAIQAAACeAAEAcGAAAIWAAACBgAAAmQABMHOwAACHgAAAg4AAAJ0AARBxEAAAhoAAAIKAAACbAAAAgIAAAIiAAACEgAAAnwABAHBAAACFQAAAgUABUI4wATBysAAAh0AAAINAAACcgAEQcNAAAIZAAACCQAAAmoAAAIBAAACIQAAAhEAAAJ6AAQBwgAAAhcAAAIHAAACZgAFAdTAAAIfAAACDwAAAnYABIHFwAACGwAAAgsAAAJuAAACAwAAAiMAAAITAAACfgAEAcDAAAIUgAACBIAFQijABMHIwAACHIAAAgyAAAJxAARBwsAAAhiAAAIIgAACaQAAAgCAAAIggAACEIAAAnkABAHBwAACFoAAAgaAAAJlAAUB0MAAAh6AAAIOgAACdQAEgcTAAAIagAACCoAAAm0AAAICgAACIoAAAhKAAAJ9AAQBwUAAAhWAAAIFgBACAAAEwczAAAIdgAACDYAAAnMABEHDwAACGYAAAgmAAAJrAAACAYAAAiGAAAIRgAACewAEAcJAAAIXgAACB4AAAmcABQHYwAACH4AAAg+AAAJ3AASBxsAAAhuAAAILgAACbwAAAgOAAAIjgAACE4AAAn8AGAHAAAACFEAAAgRABUIgwASBx8AAAhxAAAIMQAACcIAEAcKAAAIYQAACCEAAAmiAAAIAQAACIEAAAhBAAAJ4gAQBwYAAAhZAAAIGQAACZIAEwc7AAAIeQAACDkAAAnSABEHEQAACGkAAAgpAAAJsgAACAkAAAiJAAAISQAACfIAEAcEAAAIVQAACBUAEAgCARMHKwAACHUAAAg1AAAJygARBw0AAAhlAAAIJQAACaoAAAgFAAAIhQAACEUAAAnqABAHCAAACF0AAAgdAAAJmgAUB1MAAAh9AAAIPQAACdoAEgcXAAAIbQAACC0AAAm6AAAIDQAACI0AAAhNAAAJ+gAQBwMAAAhTAAAIEwAVCMMAEwcjAAAIcwAACDMAAAnGABEHCwAACGMAAAgjAAAJpgAACAMAAAiDAAAIQwAACeYAEAcHAAAIWwAACBsAAAmWABQHQwAACHsAAAg7AAAJ1gASBxMAAAhrAAAIKwAACbYAAAgLAAAIiwAACEsAAAn2ABAHBQAACFcAAAgXAEAIAAATBzMAAAh3AAAINwAACc4AEQcPAAAIZwAACCcAAAmuAAAIBwAACIcAAAhHAAAJ7gAQBwkAAAhfAAAIHwAACZ4AFAdjAAAIfwAACD8AAAneABIHGwAACG8AAAgvAAAJvgAACA8AAAiPAAAITwAACf4AYAcAAAAIUAAACBAAFAhzABIHHwAACHAAAAgwAAAJwQAQBwoAAAhgAAAIIAAACaEAAAgAAAAIgAAACEAAAAnhABAHBgAACFgAAAgYAAAJkQATBzsAAAh4AAAIOAAACdEAEQcRAAAIaAAACCgAAAmxAAAICAAACIgAAAhIAAAJ8QAQBwQAAAhUAAAIFAAVCOMAEwcrAAAIdAAACDQAAAnJABEHDQAACGQAAAgkAAAJqQAACAQAAAiEAAAIRAAACekAEAcIAAAIXAAACBwAAAmZABQHUwAACHwAAAg8AAAJ2QASBxcAAAhsAAAILAAACbkAAAgMAAAIjAAACEwAAAn5ABAHAwAACFIAAAgSABUIowATByMAAAhyAAAIMgAACcUAEQcLAAAIYgAACCIAAAmlAAAIAgAACIIAAAhCAAAJ5QAQBwcAAAhaAAAIGgAACZUAFAdDAAAIegAACDoAAAnVABIHEwAACGoAAAgqAAAJtQAACAoAAAiKAAAISgAACfUAEAcFAAAIVgAACBYAQAgAABMHMwAACHYAAAg2AAAJzQARBw8AAAhmAAAIJgAACa0AAAgGAAAIhgAACEYAAAntABAHCQAACF4AAAgeAAAJnQAUB2MAAAh+AAAIPgAACd0AEgcbAAAIbgAACC4AAAm9AAAIDgAACI4AAAhOAAAJ/QBgBwAAAAhRAAAIEQAVCIMAEgcfAAAIcQAACDEAAAnDABAHCgAACGEAAAghAAAJowAACAEAAAiBAAAIQQAACeMAEAcGAAAIWQAACBkAAAmTABMHOwAACHkAAAg5AAAJ0wARBxEAAAhpAAAIKQAACbMAAAgJAAAIiQAACEkAAAnzABAHBAAACFUAAAgVABAIAgETBysAAAh1AAAINQAACcsAEQcNAAAIZQAACCUAAAmrAAAIBQAACIUAAAhFAAAJ6wAQBwgAAAhdAAAIHQAACZsAFAdTAAAIfQAACD0AAAnbABIHFwAACG0AAAgtAAAJuwAACA0AAAiNAAAITQAACfsAEAcDAAAIUwAACBMAFQjDABMHIwAACHMAAAgzAAAJxwARBwsAAAhjAAAIIwAACacAAAgDAAAIgwAACEMAAAnnABAHBwAACFsAAAgbAAAJlwAUB0MAAAh7AAAIOwAACdcAEgcTAAAIawAACCsAAAm3AAAICwAACIsAAAhLAAAJ9wAQBwUAAAhXAAAIFwBACAAAEwczAAAIdwAACDcAAAnPABEHDwAACGcAAAgnAAAJrwAACAcAAAiHAAAIRwAACe8AEAcJAAAIXwAACB8AAAmfABQHYwAACH8AAAg/AAAJ3wASBxsAAAhvAAAILwAACb8AAAgPAAAIjwAACE8AAAn/ABAFAQAXBQEBEwURABsFARARBQUAGQUBBBUFQQAdBQFAEAUDABgFAQIUBSEAHAUBIBIFCQAaBQEIFgWBAEAFAAAQBQIAFwWBARMFGQAbBQEYEQUHABkFAQYVBWEAHQUBYBAFBAAYBQEDFAUxABwFATASBQ0AGgUBDBYFwQBABQAAEQAKABEREQAAAAAFAAAAAAAACQAAAAALAAAAAAAAAAARAA8KERERAwoHAAEACQsLAAAJBgsAAAsABhEAAAAREREAQYGEAQshCwAAAAAAAAAAEQAKChEREQAKAAACAAkLAAAACQALAAALAEG7hAELAQwAQceEAQsVDAAAAAAMAAAAAAkMAAAAAAAMAAAMAEH1hAELAQ4AQYGFAQsVDQAAAAQNAAAAAAkOAAAAAAAOAAAOAEGvhQELARAAQbuFAQseDwAAAAAPAAAAAAkQAAAAAAAQAAAQAAASAAAAEhISAEHyhQELDhIAAAASEhIAAAAAAAAJAEGjhgELAQsAQa+GAQsVCgAAAAAKAAAAAAkLAAAAAAALAAALAEHdhgELAQwAQemGAQsnDAAAAAAMAAAAAAkMAAAAAAAMAAAMAAAwMTIzNDU2Nzg5QUJDREVGAEG0hwELARkAQduHAQsF//////8AQaCIAQtXGRJEOwI/LEcUPTMwChsGRktFNw9JDo4XA0AdPGkrNh9KLRwBICUpIQgMFRYiLhA4Pgs0MRhkdHV2L0EJfzkRI0MyQomKiwUEJignDSoeNYwHGkiTE5SVAEGAiQELig5JbGxlZ2FsIGJ5dGUgc2VxdWVuY2UARG9tYWluIGVycm9yAFJlc3VsdCBub3QgcmVwcmVzZW50YWJsZQBOb3QgYSB0dHkAUGVybWlzc2lvbiBkZW5pZWQAT3BlcmF0aW9uIG5vdCBwZXJtaXR0ZWQATm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeQBObyBzdWNoIHByb2Nlc3MARmlsZSBleGlzdHMAVmFsdWUgdG9vIGxhcmdlIGZvciBkYXRhIHR5cGUATm8gc3BhY2UgbGVmdCBvbiBkZXZpY2UAT3V0IG9mIG1lbW9yeQBSZXNvdXJjZSBidXN5AEludGVycnVwdGVkIHN5c3RlbSBjYWxsAFJlc291cmNlIHRlbXBvcmFyaWx5IHVuYXZhaWxhYmxlAEludmFsaWQgc2VlawBDcm9zcy1kZXZpY2UgbGluawBSZWFkLW9ubHkgZmlsZSBzeXN0ZW0ARGlyZWN0b3J5IG5vdCBlbXB0eQBDb25uZWN0aW9uIHJlc2V0IGJ5IHBlZXIAT3BlcmF0aW9uIHRpbWVkIG91dABDb25uZWN0aW9uIHJlZnVzZWQASG9zdCBpcyBkb3duAEhvc3QgaXMgdW5yZWFjaGFibGUAQWRkcmVzcyBpbiB1c2UAQnJva2VuIHBpcGUASS9PIGVycm9yAE5vIHN1Y2ggZGV2aWNlIG9yIGFkZHJlc3MAQmxvY2sgZGV2aWNlIHJlcXVpcmVkAE5vIHN1Y2ggZGV2aWNlAE5vdCBhIGRpcmVjdG9yeQBJcyBhIGRpcmVjdG9yeQBUZXh0IGZpbGUgYnVzeQBFeGVjIGZvcm1hdCBlcnJvcgBJbnZhbGlkIGFyZ3VtZW50AEFyZ3VtZW50IGxpc3QgdG9vIGxvbmcAU3ltYm9saWMgbGluayBsb29wAEZpbGVuYW1lIHRvbyBsb25nAFRvbyBtYW55IG9wZW4gZmlsZXMgaW4gc3lzdGVtAE5vIGZpbGUgZGVzY3JpcHRvcnMgYXZhaWxhYmxlAEJhZCBmaWxlIGRlc2NyaXB0b3IATm8gY2hpbGQgcHJvY2VzcwBCYWQgYWRkcmVzcwBGaWxlIHRvbyBsYXJnZQBUb28gbWFueSBsaW5rcwBObyBsb2NrcyBhdmFpbGFibGUAUmVzb3VyY2UgZGVhZGxvY2sgd291bGQgb2NjdXIAU3RhdGUgbm90IHJlY292ZXJhYmxlAFByZXZpb3VzIG93bmVyIGRpZWQAT3BlcmF0aW9uIGNhbmNlbGVkAEZ1bmN0aW9uIG5vdCBpbXBsZW1lbnRlZABObyBtZXNzYWdlIG9mIGRlc2lyZWQgdHlwZQBJZGVudGlmaWVyIHJlbW92ZWQARGV2aWNlIG5vdCBhIHN0cmVhbQBObyBkYXRhIGF2YWlsYWJsZQBEZXZpY2UgdGltZW91dABPdXQgb2Ygc3RyZWFtcyByZXNvdXJjZXMATGluayBoYXMgYmVlbiBzZXZlcmVkAFByb3RvY29sIGVycm9yAEJhZCBtZXNzYWdlAEZpbGUgZGVzY3JpcHRvciBpbiBiYWQgc3RhdGUATm90IGEgc29ja2V0AERlc3RpbmF0aW9uIGFkZHJlc3MgcmVxdWlyZWQATWVzc2FnZSB0b28gbGFyZ2UAUHJvdG9jb2wgd3JvbmcgdHlwZSBmb3Igc29ja2V0AFByb3RvY29sIG5vdCBhdmFpbGFibGUAUHJvdG9jb2wgbm90IHN1cHBvcnRlZABTb2NrZXQgdHlwZSBub3Qgc3VwcG9ydGVkAE5vdCBzdXBwb3J0ZWQAUHJvdG9jb2wgZmFtaWx5IG5vdCBzdXBwb3J0ZWQAQWRkcmVzcyBmYW1pbHkgbm90IHN1cHBvcnRlZCBieSBwcm90b2NvbABBZGRyZXNzIG5vdCBhdmFpbGFibGUATmV0d29yayBpcyBkb3duAE5ldHdvcmsgdW5yZWFjaGFibGUAQ29ubmVjdGlvbiByZXNldCBieSBuZXR3b3JrAENvbm5lY3Rpb24gYWJvcnRlZABObyBidWZmZXIgc3BhY2UgYXZhaWxhYmxlAFNvY2tldCBpcyBjb25uZWN0ZWQAU29ja2V0IG5vdCBjb25uZWN0ZWQAQ2Fubm90IHNlbmQgYWZ0ZXIgc29ja2V0IHNodXRkb3duAE9wZXJhdGlvbiBhbHJlYWR5IGluIHByb2dyZXNzAE9wZXJhdGlvbiBpbiBwcm9ncmVzcwBTdGFsZSBmaWxlIGhhbmRsZQBSZW1vdGUgSS9PIGVycm9yAFF1b3RhIGV4Y2VlZGVkAE5vIG1lZGl1bSBmb3VuZABXcm9uZyBtZWRpdW0gdHlwZQBObyBlcnJvciBpbmZvcm1hdGlvbgBBkJcBC1JQUFAACgAAAAsAAAAMAAAADQAAAA4AAAAPAAAAEAAAABEAAAASAAAACwAAAAwAAAANAAAADgAAAA8AAAAQAAAAEQAAAAEAAAAIAAAAlEsAALRLAEGQmQELAgxQAEHImQELCR8AAADkTAAAAwBB5JkBC4wBLfRRWM+MscBG9rXLKTEDxwRbcDC0Xf0geH+LmthZKVBoSImrp1YDbP+3zYg/1He0K6WjcPG65Kj8QYP92W/hinovLXSWBx8NCV4Ddixw90ClLKdvV0GoqnTfoFhkA0rHxDxTrq9fGAQVseNtKIarDKS/Q/DpUIE5VxZSN/////////////////////8=";y4(Rp)||(Rp=dxe(Rp));function Kxe(t){try{if(t==Rp&&lP)return new Uint8Array(lP);var e=s4(t);if(e)return e;if(aP)return aP(t);throw"sync fetching of the wasm failed: you can preload it to Module['wasmBinary'] manually, or emcc.py will do that for you when generating HTML (but not JS)"}catch(r){Gr(r)}}function Uxe(t,e){var r,i,n;try{n=Kxe(t),i=new WebAssembly.Module(n),r=new WebAssembly.Instance(i,e)}catch(o){var s=o.toString();throw Di("failed to compile wasm module: "+s),(s.includes("imported Memory")||s.includes("memory import"))&&Di("Memory size incompatibility issues may be due to changing INITIAL_MEMORY at runtime to something too large. Use ALLOW_MEMORY_GROWTH to allow any size memory (and also make sure not to set INITIAL_MEMORY at runtime to something smaller than it was at compile time)."),o}return[r,i]}function Gxe(){var t={a:Hxe};function e(n,s){var o=n.exports;oe.asm=o,ew=oe.asm.u,p4(ew.buffer),fP=oe.asm.za,Mxe(oe.asm.v),dP("wasm-instantiate")}if(E4("wasm-instantiate"),oe.instantiateWasm)try{var r=oe.instantiateWasm(t,e);return r}catch(n){return Di("Module.instantiateWasm callback failed with error: "+n),!1}var i=Uxe(Rp,t);return e(i[0]),oe.asm}var ai,ya;function hP(t){for(;t.length>0;){var e=t.shift();if(typeof e=="function"){e(oe);continue}var r=e.func;typeof r=="number"?e.arg===void 0?fP.get(r)():fP.get(r)(e.arg):r(e.arg===void 0?null:e.arg)}}function iw(t,e){var r=new Date(_e[t>>2]*1e3);_e[e>>2]=r.getUTCSeconds(),_e[e+4>>2]=r.getUTCMinutes(),_e[e+8>>2]=r.getUTCHours(),_e[e+12>>2]=r.getUTCDate(),_e[e+16>>2]=r.getUTCMonth(),_e[e+20>>2]=r.getUTCFullYear()-1900,_e[e+24>>2]=r.getUTCDay(),_e[e+36>>2]=0,_e[e+32>>2]=0;var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return _e[e+28>>2]=n,iw.GMTString||(iw.GMTString=uP("GMT")),_e[e+40>>2]=iw.GMTString,e}function jxe(t,e){return iw(t,e)}var yt={splitPath:function(t){var e=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return e.exec(t).slice(1)},normalizeArray:function(t,e){for(var r=0,i=t.length-1;i>=0;i--){var n=t[i];n==="."?t.splice(i,1):n===".."?(t.splice(i,1),r++):r&&(t.splice(i,1),r--)}if(e)for(;r;r--)t.unshift("..");return t},normalize:function(t){var e=t.charAt(0)==="/",r=t.substr(-1)==="/";return t=yt.normalizeArray(t.split("/").filter(function(i){return!!i}),!e).join("/"),!t&&!e&&(t="."),t&&r&&(t+="/"),(e?"/":"")+t},dirname:function(t){var e=yt.splitPath(t),r=e[0],i=e[1];return!r&&!i?".":(i&&(i=i.substr(0,i.length-1)),r+i)},basename:function(t){if(t==="/")return"/";t=yt.normalize(t),t=t.replace(/\/$/,"");var e=t.lastIndexOf("/");return e===-1?t:t.substr(e+1)},extname:function(t){return yt.splitPath(t)[3]},join:function(){var t=Array.prototype.slice.call(arguments,0);return yt.normalize(t.join("/"))},join2:function(t,e){return yt.normalize(t+"/"+e)}};function Yxe(){if(typeof crypto=="object"&&typeof crypto.getRandomValues=="function"){var t=new Uint8Array(1);return function(){return crypto.getRandomValues(t),t[0]}}else if(Wl)try{var e=require("crypto");return function(){return e.randomBytes(1)[0]}}catch(r){}return function(){Gr("randomDevice")}}var wa={resolve:function(){for(var t="",e=!1,r=arguments.length-1;r>=-1&&!e;r--){var i=r>=0?arguments[r]:y.cwd();if(typeof i!="string")throw new TypeError("Arguments to path.resolve must be strings");if(!i)return"";t=i+"/"+t,e=i.charAt(0)==="/"}return t=yt.normalizeArray(t.split("/").filter(function(n){return!!n}),!e).join("/"),(e?"/":"")+t||"."},relative:function(t,e){t=wa.resolve(t).substr(1),e=wa.resolve(e).substr(1);function r(c){for(var u=0;u=0&&c[g]==="";g--);return u>g?[]:c.slice(u,g-u+1)}for(var i=r(t.split("/")),n=r(e.split("/")),s=Math.min(i.length,n.length),o=s,a=0;a0?e=i.slice(0,n).toString("utf-8"):e=null}else typeof window!="undefined"&&typeof window.prompt=="function"?(e=window.prompt("Input: "),e!==null&&(e+=` +`)):typeof readline=="function"&&(e=readline(),e!==null&&(e+=` +`));if(!e)return null;t.input=CP(e,!0)}return t.input.shift()},put_char:function(t,e){e===null||e===10?($y(Zu(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&($y(Zu(t.output,0)),t.output=[])}},default_tty1_ops:{put_char:function(t,e){e===null||e===10?(Di(Zu(t.output,0)),t.output=[]):e!=0&&t.output.push(e)},flush:function(t){t.output&&t.output.length>0&&(Di(Zu(t.output,0)),t.output=[])}}};function mP(t){for(var e=mxe(t,65536),r=h4(e);t=e)){var i=1024*1024;e=Math.max(e,r*(r>>0),r!=0&&(e=Math.max(e,256));var n=t.contents;t.contents=new Uint8Array(e),t.usedBytes>0&&t.contents.set(n.subarray(0,t.usedBytes),0)}},resizeFileStorage:function(t,e){if(t.usedBytes!=e)if(e==0)t.contents=null,t.usedBytes=0;else{var r=t.contents;t.contents=new Uint8Array(e),r&&t.contents.set(r.subarray(0,Math.min(e,t.usedBytes))),t.usedBytes=e}},node_ops:{getattr:function(t){var e={};return e.dev=y.isChrdev(t.mode)?t.id:1,e.ino=t.id,e.mode=t.mode,e.nlink=1,e.uid=0,e.gid=0,e.rdev=t.rdev,y.isDir(t.mode)?e.size=4096:y.isFile(t.mode)?e.size=t.usedBytes:y.isLink(t.mode)?e.size=t.link.length:e.size=0,e.atime=new Date(t.timestamp),e.mtime=new Date(t.timestamp),e.ctime=new Date(t.timestamp),e.blksize=4096,e.blocks=Math.ceil(e.size/e.blksize),e},setattr:function(t,e){e.mode!==void 0&&(t.mode=e.mode),e.timestamp!==void 0&&(t.timestamp=e.timestamp),e.size!==void 0&&pt.resizeFileStorage(t,e.size)},lookup:function(t,e){throw y.genericErrors[44]},mknod:function(t,e,r,i){return pt.createNode(t,e,r,i)},rename:function(t,e,r){if(y.isDir(t.mode)){var i;try{i=y.lookupNode(e,r)}catch(s){}if(i)for(var n in i.contents)throw new y.ErrnoError(55)}delete t.parent.contents[t.name],t.parent.timestamp=Date.now(),t.name=r,e.contents[r]=t,e.timestamp=t.parent.timestamp,t.parent=e},unlink:function(t,e){delete t.contents[e],t.timestamp=Date.now()},rmdir:function(t,e){var r=y.lookupNode(t,e);for(var i in r.contents)throw new y.ErrnoError(55);delete t.contents[e],t.timestamp=Date.now()},readdir:function(t){var e=[".",".."];for(var r in t.contents)!t.contents.hasOwnProperty(r)||e.push(r);return e},symlink:function(t,e,r){var i=pt.createNode(t,e,511|40960,0);return i.link=r,i},readlink:function(t){if(!y.isLink(t.mode))throw new y.ErrnoError(28);return t.link}},stream_ops:{read:function(t,e,r,i,n){var s=t.node.contents;if(n>=t.node.usedBytes)return 0;var o=Math.min(t.node.usedBytes-n,i);if(o>8&&s.subarray)e.set(s.subarray(n,n+o),r);else for(var a=0;a0||i+r>2)}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}return e.mode},realPath:function(t){for(var e=[];t.parent!==t;)e.push(t.name),t=t.parent;return e.push(t.mount.opts.root),e.reverse(),yt.join.apply(null,e)},flagsForNode:function(t){t&=~2097152,t&=~2048,t&=~32768,t&=~524288;var e=0;for(var r in tt.flagsForNodeMap)t&r&&(e|=tt.flagsForNodeMap[r],t^=r);if(t)throw new y.ErrnoError(28);return e},node_ops:{getattr:function(t){var e=tt.realPath(t),r;try{r=ft.lstatSync(e)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}return tt.isWindows&&!r.blksize&&(r.blksize=4096),tt.isWindows&&!r.blocks&&(r.blocks=(r.size+r.blksize-1)/r.blksize|0),{dev:r.dev,ino:r.ino,mode:r.mode,nlink:r.nlink,uid:r.uid,gid:r.gid,rdev:r.rdev,size:r.size,atime:r.atime,mtime:r.mtime,ctime:r.ctime,blksize:r.blksize,blocks:r.blocks}},setattr:function(t,e){var r=tt.realPath(t);try{if(e.mode!==void 0&&(ft.chmodSync(r,e.mode),t.mode=e.mode),e.timestamp!==void 0){var i=new Date(e.timestamp);ft.utimesSync(r,i,i)}e.size!==void 0&&ft.truncateSync(r,e.size)}catch(n){throw n.code?new y.ErrnoError(tt.convertNodeCode(n)):n}},lookup:function(t,e){var r=yt.join2(tt.realPath(t),e),i=tt.getMode(r);return tt.createNode(t,e,i)},mknod:function(t,e,r,i){var n=tt.createNode(t,e,r,i),s=tt.realPath(n);try{y.isDir(n.mode)?ft.mkdirSync(s,n.mode):ft.writeFileSync(s,"",{mode:n.mode})}catch(o){throw o.code?new y.ErrnoError(tt.convertNodeCode(o)):o}return n},rename:function(t,e,r){var i=tt.realPath(t),n=yt.join2(tt.realPath(e),r);try{ft.renameSync(i,n)}catch(s){throw s.code?new y.ErrnoError(tt.convertNodeCode(s)):s}t.name=r},unlink:function(t,e){var r=yt.join2(tt.realPath(t),e);try{ft.unlinkSync(r)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}},rmdir:function(t,e){var r=yt.join2(tt.realPath(t),e);try{ft.rmdirSync(r)}catch(i){throw i.code?new y.ErrnoError(tt.convertNodeCode(i)):i}},readdir:function(t){var e=tt.realPath(t);try{return ft.readdirSync(e)}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}},symlink:function(t,e,r){var i=yt.join2(tt.realPath(t),e);try{ft.symlinkSync(r,i)}catch(n){throw n.code?new y.ErrnoError(tt.convertNodeCode(n)):n}},readlink:function(t){var e=tt.realPath(t);try{return e=ft.readlinkSync(e),e=EP.relative(EP.resolve(t.mount.opts.root),e),e}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}}},stream_ops:{open:function(t){var e=tt.realPath(t.node);try{y.isFile(t.node.mode)&&(t.nfd=ft.openSync(e,tt.flagsForNode(t.flags)))}catch(r){throw r.code?new y.ErrnoError(tt.convertNodeCode(r)):r}},close:function(t){try{y.isFile(t.node.mode)&&t.nfd&&ft.closeSync(t.nfd)}catch(e){throw e.code?new y.ErrnoError(tt.convertNodeCode(e)):e}},read:function(t,e,r,i,n){if(i===0)return 0;try{return ft.readSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n)}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}},write:function(t,e,r,i,n){try{return ft.writeSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n)}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}},llseek:function(t,e,r){var i=e;if(r===1)i+=t.position;else if(r===2&&y.isFile(t.node.mode))try{var n=ft.fstatSync(t.nfd);i+=n.size}catch(s){throw new y.ErrnoError(tt.convertNodeCode(s))}if(i<0)throw new y.ErrnoError(28);return i},mmap:function(t,e,r,i,n,s){if(e!==0)throw new y.ErrnoError(28);if(!y.isFile(t.node.mode))throw new y.ErrnoError(43);var o=mP(r);return tt.stream_ops.read(t,Zi,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){if(!y.isFile(t.node.mode))throw new y.ErrnoError(43);if(n&2)return 0;var s=tt.stream_ops.write(t,e,0,i,r,!1);return 0}}},w4={lookupPath:function(t){return{path:t,node:{mode:tt.getMode(t)}}},createStandardStreams:function(){y.streams[0]={fd:0,nfd:0,position:0,path:"",flags:0,tty:!0,seekable:!1};for(var t=1;t<3;t++)y.streams[t]={fd:t,nfd:t,position:0,path:"",flags:577,tty:!0,seekable:!1}},cwd:function(){return process.cwd()},chdir:function(){process.chdir.apply(void 0,arguments)},mknod:function(t,e){y.isDir(t)?ft.mkdirSync(t,e):ft.writeFileSync(t,"",{mode:e})},mkdir:function(){ft.mkdirSync.apply(void 0,arguments)},symlink:function(){ft.symlinkSync.apply(void 0,arguments)},rename:function(){ft.renameSync.apply(void 0,arguments)},rmdir:function(){ft.rmdirSync.apply(void 0,arguments)},readdir:function(){ft.readdirSync.apply(void 0,arguments)},unlink:function(){ft.unlinkSync.apply(void 0,arguments)},readlink:function(){return ft.readlinkSync.apply(void 0,arguments)},stat:function(){return ft.statSync.apply(void 0,arguments)},lstat:function(){return ft.lstatSync.apply(void 0,arguments)},chmod:function(){ft.chmodSync.apply(void 0,arguments)},fchmod:function(){ft.fchmodSync.apply(void 0,arguments)},chown:function(){ft.chownSync.apply(void 0,arguments)},fchown:function(){ft.fchownSync.apply(void 0,arguments)},truncate:function(){ft.truncateSync.apply(void 0,arguments)},ftruncate:function(t,e){if(e<0)throw new y.ErrnoError(28);ft.ftruncateSync.apply(void 0,arguments)},utime:function(){ft.utimesSync.apply(void 0,arguments)},open:function(t,e,r,i){typeof e=="string"&&(e=Vl.modeStringToFlags(e));var n=ft.openSync(t,tt.flagsForNode(e),r),s=i!=null?i:y.nextfd(n),o={fd:s,nfd:n,position:0,path:t,flags:e,seekable:!0};return y.streams[s]=o,o},close:function(t){t.stream_ops||ft.closeSync(t.nfd),y.closeStream(t.fd)},llseek:function(t,e,r){if(t.stream_ops)return Vl.llseek(t,e,r);var i=e;if(r===1)i+=t.position;else if(r===2)i+=ft.fstatSync(t.nfd).size;else if(r!==0)throw new y.ErrnoError(eg.EINVAL);if(i<0)throw new y.ErrnoError(eg.EINVAL);return t.position=i,i},read:function(t,e,r,i,n){if(t.stream_ops)return Vl.read(t,e,r,i,n);var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ft.readSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},write:function(t,e,r,i,n){if(t.stream_ops)return Vl.write(t,e,r,i,n);t.flags&+"1024"&&y.llseek(t,0,+"2");var s=typeof n!="undefined";!s&&t.seekable&&(n=t.position);var o=ft.writeSync(t.nfd,tt.bufferFrom(e.buffer),r,i,n);return s||(t.position+=o),o},allocate:function(){throw new y.ErrnoError(eg.EOPNOTSUPP)},mmap:function(t,e,r,i,n,s){if(t.stream_ops)return Vl.mmap(t,e,r,i,n,s);if(e!==0)throw new y.ErrnoError(28);var o=mP(r);return y.read(t,Zi,o,r,i),{ptr:o,allocated:!0}},msync:function(t,e,r,i,n){return t.stream_ops?Vl.msync(t,e,r,i,n):(n&2||y.write(t,e,0,i,r),0)},munmap:function(){return 0},ioctl:function(){throw new y.ErrnoError(eg.ENOTTY)}},y={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:!1,ignorePermissions:!0,trackingDelegate:{},tracking:{openFlags:{READ:1,WRITE:2}},ErrnoError:null,genericErrors:{},filesystems:null,syncFSRequests:0,lookupPath:function(t,e){if(t=wa.resolve(y.cwd(),t),e=e||{},!t)return{path:"",node:null};var r={follow_mount:!0,recurse_count:0};for(var i in r)e[i]===void 0&&(e[i]=r[i]);if(e.recurse_count>8)throw new y.ErrnoError(32);for(var n=yt.normalizeArray(t.split("/").filter(function(f){return!!f}),!1),s=y.root,o="/",a=0;a40)throw new y.ErrnoError(32)}}return{path:o,node:s}},getPath:function(t){for(var e;;){if(y.isRoot(t)){var r=t.mount.mountpoint;return e?r[r.length-1]!=="/"?r+"/"+e:r+e:r}e=e?t.name+"/"+e:t.name,t=t.parent}},hashName:function(t,e){for(var r=0,i=0;i>>0)%y.nameTable.length},hashAddNode:function(t){var e=y.hashName(t.parent.id,t.name);t.name_next=y.nameTable[e],y.nameTable[e]=t},hashRemoveNode:function(t){var e=y.hashName(t.parent.id,t.name);if(y.nameTable[e]===t)y.nameTable[e]=t.name_next;else for(var r=y.nameTable[e];r;){if(r.name_next===t){r.name_next=t.name_next;break}r=r.name_next}},lookupNode:function(t,e){var r=y.mayLookup(t);if(r)throw new y.ErrnoError(r,t);for(var i=y.hashName(t.id,e),n=y.nameTable[i];n;n=n.name_next){var s=n.name;if(n.parent.id===t.id&&s===e)return n}return y.lookup(t,e)},createNode:function(t,e,r,i){var n=new y.FSNode(t,e,r,i);return y.hashAddNode(n),n},destroyNode:function(t){y.hashRemoveNode(t)},isRoot:function(t){return t===t.parent},isMountpoint:function(t){return!!t.mounted},isFile:function(t){return(t&61440)==32768},isDir:function(t){return(t&61440)==16384},isLink:function(t){return(t&61440)==40960},isChrdev:function(t){return(t&61440)==8192},isBlkdev:function(t){return(t&61440)==24576},isFIFO:function(t){return(t&61440)==4096},isSocket:function(t){return(t&49152)==49152},flagModes:{r:0,"r+":2,w:577,"w+":578,a:1089,"a+":1090},modeStringToFlags:function(t){var e=y.flagModes[t];if(typeof e=="undefined")throw new Error("Unknown file open mode: "+t);return e},flagsToPermissionString:function(t){var e=["r","w","rw"][t&3];return t&512&&(e+="w"),e},nodePermissions:function(t,e){return y.ignorePermissions?0:e.includes("r")&&!(t.mode&292)||e.includes("w")&&!(t.mode&146)||e.includes("x")&&!(t.mode&73)?2:0},mayLookup:function(t){var e=y.nodePermissions(t,"x");return e||(t.node_ops.lookup?0:2)},mayCreate:function(t,e){try{var r=y.lookupNode(t,e);return 20}catch(i){}return y.nodePermissions(t,"wx")},mayDelete:function(t,e,r){var i;try{i=y.lookupNode(t,e)}catch(s){return s.errno}var n=y.nodePermissions(t,"wx");if(n)return n;if(r){if(!y.isDir(i.mode))return 54;if(y.isRoot(i)||y.getPath(i)===y.cwd())return 10}else if(y.isDir(i.mode))return 31;return 0},mayOpen:function(t,e){return t?y.isLink(t.mode)?32:y.isDir(t.mode)&&(y.flagsToPermissionString(e)!=="r"||e&512)?31:y.nodePermissions(t,y.flagsToPermissionString(e)):44},MAX_OPEN_FDS:4096,nextfd:function(t,e){t=t||0,e=e||y.MAX_OPEN_FDS;for(var r=t;r<=e;r++)if(!y.streams[r])return r;throw new y.ErrnoError(33)},getStream:function(t){return y.streams[t]},createStream:function(t,e,r){y.FSStream||(y.FSStream=function(){},y.FSStream.prototype={object:{get:function(){return this.node},set:function(o){this.node=o}},isRead:{get:function(){return(this.flags&2097155)!=1}},isWrite:{get:function(){return(this.flags&2097155)!=0}},isAppend:{get:function(){return this.flags&1024}}});var i=new y.FSStream;for(var n in t)i[n]=t[n];t=i;var s=y.nextfd(e,r);return t.fd=s,y.streams[s]=t,t},closeStream:function(t){y.streams[t]=null},chrdev_stream_ops:{open:function(t){var e=y.getDevice(t.node.rdev);t.stream_ops=e.stream_ops,t.stream_ops.open&&t.stream_ops.open(t)},llseek:function(){throw new y.ErrnoError(70)}},major:function(t){return t>>8},minor:function(t){return t&255},makedev:function(t,e){return t<<8|e},registerDevice:function(t,e){y.devices[t]={stream_ops:e}},getDevice:function(t){return y.devices[t]},getMounts:function(t){for(var e=[],r=[t];r.length;){var i=r.pop();e.push(i),r.push.apply(r,i.mounts)}return e},syncfs:function(t,e){typeof t=="function"&&(e=t,t=!1),y.syncFSRequests++,y.syncFSRequests>1&&Di("warning: "+y.syncFSRequests+" FS.syncfs operations in flight at once, probably just doing extra work");var r=y.getMounts(y.root.mount),i=0;function n(o){return y.syncFSRequests--,e(o)}function s(o){if(o)return s.errored?void 0:(s.errored=!0,n(o));++i>=r.length&&n(null)}r.forEach(function(o){if(!o.type.syncfs)return s(null);o.type.syncfs(o,t,s)})},mount:function(t,e,r){var i=r==="/",n=!r,s;if(i&&y.root)throw new y.ErrnoError(10);if(!i&&!n){var o=y.lookupPath(r,{follow_mount:!1});if(r=o.path,s=o.node,y.isMountpoint(s))throw new y.ErrnoError(10);if(!y.isDir(s.mode))throw new y.ErrnoError(54)}var a={type:t,opts:e,mountpoint:r,mounts:[]},l=t.mount(a);return l.mount=a,a.root=l,i?y.root=l:s&&(s.mounted=a,s.mount&&s.mount.mounts.push(a)),l},unmount:function(t){var e=y.lookupPath(t,{follow_mount:!1});if(!y.isMountpoint(e.node))throw new y.ErrnoError(28);var r=e.node,i=r.mounted,n=y.getMounts(i);Object.keys(y.nameTable).forEach(function(o){for(var a=y.nameTable[o];a;){var l=a.name_next;n.includes(a.mount)&&y.destroyNode(a),a=l}}),r.mounted=null;var s=r.mount.mounts.indexOf(i);r.mount.mounts.splice(s,1)},lookup:function(t,e){return t.node_ops.lookup(t,e)},mknod:function(t,e,r){var i=y.lookupPath(t,{parent:!0}),n=i.node,s=yt.basename(t);if(!s||s==="."||s==="..")throw new y.ErrnoError(28);var o=y.mayCreate(n,s);if(o)throw new y.ErrnoError(o);if(!n.node_ops.mknod)throw new y.ErrnoError(63);return n.node_ops.mknod(n,s,e,r)},create:function(t,e){return e=e!==void 0?e:438,e&=4095,e|=32768,y.mknod(t,e,0)},mkdir:function(t,e){return e=e!==void 0?e:511,e&=511|512,e|=16384,y.mknod(t,e,0)},mkdirTree:function(t,e){for(var r=t.split("/"),i="",n=0;nthis.length-1||f<0)){var h=f%this.chunkSize,p=f/this.chunkSize|0;return this.getter(p)[h]}},s.prototype.setDataGetter=function(f){this.getter=f},s.prototype.cacheLength=function(){var f=new XMLHttpRequest;if(f.open("HEAD",r,!1),f.send(null),!(f.status>=200&&f.status<300||f.status===304))throw new Error("Couldn't load "+r+". Status: "+f.status);var h=Number(f.getResponseHeader("Content-length")),p,d=(p=f.getResponseHeader("Accept-Ranges"))&&p==="bytes",m=(p=f.getResponseHeader("Content-Encoding"))&&p==="gzip",I=1024*1024;d||(I=h);var B=function(R,H){if(R>H)throw new Error("invalid range ("+R+", "+H+") or no bytes requested!");if(H>h-1)throw new Error("only "+h+" bytes available! programmer error!");var L=new XMLHttpRequest;if(L.open("GET",r,!1),h!==I&&L.setRequestHeader("Range","bytes="+R+"-"+H),typeof Uint8Array!="undefined"&&(L.responseType="arraybuffer"),L.overrideMimeType&&L.overrideMimeType("text/plain; charset=x-user-defined"),L.send(null),!(L.status>=200&&L.status<300||L.status===304))throw new Error("Couldn't load "+r+". Status: "+L.status);return L.response!==void 0?new Uint8Array(L.response||[]):CP(L.responseText||"",!0)},b=this;b.setDataGetter(function(R){var H=R*I,L=(R+1)*I-1;if(L=Math.min(L,h-1),typeof b.chunks[R]=="undefined"&&(b.chunks[R]=B(H,L)),typeof b.chunks[R]=="undefined")throw new Error("doXHR failed!");return b.chunks[R]}),(m||!h)&&(I=h=1,h=this.getter(0).length,I=h,$y("LazyFiles on gzip forces download of the whole file when length is accessed")),this._length=h,this._chunkSize=I,this.lengthKnown=!0},typeof XMLHttpRequest!="undefined"){if(!i4)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var o=new s;Object.defineProperties(o,{length:{get:function(){return this.lengthKnown||this.cacheLength(),this._length}},chunkSize:{get:function(){return this.lengthKnown||this.cacheLength(),this._chunkSize}}});var a={isDevice:!1,contents:o}}else var a={isDevice:!1,url:r};var l=y.createFile(t,e,a,i,n);a.contents?l.contents=a.contents:a.url&&(l.contents=null,l.url=a.url),Object.defineProperties(l,{usedBytes:{get:function(){return this.contents.length}}});var c={},u=Object.keys(l.stream_ops);return u.forEach(function(g){var f=l.stream_ops[g];c[g]=function(){return y.forceLoadFile(l),f.apply(null,arguments)}}),c.read=function(f,h,p,d,m){y.forceLoadFile(l);var I=f.node.contents;if(m>=I.length)return 0;var B=Math.min(I.length-m,d);if(I.slice)for(var b=0;b>2]=i.dev,_e[r+4>>2]=0,_e[r+8>>2]=i.ino,_e[r+12>>2]=i.mode,_e[r+16>>2]=i.nlink,_e[r+20>>2]=i.uid,_e[r+24>>2]=i.gid,_e[r+28>>2]=i.rdev,_e[r+32>>2]=0,ya=[i.size>>>0,(ai=i.size,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[r+40>>2]=ya[0],_e[r+44>>2]=ya[1],_e[r+48>>2]=4096,_e[r+52>>2]=i.blocks,_e[r+56>>2]=i.atime.getTime()/1e3|0,_e[r+60>>2]=0,_e[r+64>>2]=i.mtime.getTime()/1e3|0,_e[r+68>>2]=0,_e[r+72>>2]=i.ctime.getTime()/1e3|0,_e[r+76>>2]=0,ya=[i.ino>>>0,(ai=i.ino,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[r+80>>2]=ya[0],_e[r+84>>2]=ya[1],0},doMsync:function(t,e,r,i,n){var s=$u.slice(t,t+r);y.msync(e,s,n,r,i)},doMkdir:function(t,e){return t=yt.normalize(t),t[t.length-1]==="/"&&(t=t.substr(0,t.length-1)),y.mkdir(t,e,0),0},doMknod:function(t,e,r){switch(e&61440){case 32768:case 8192:case 24576:case 4096:case 49152:break;default:return-28}return y.mknod(t,e,r),0},doReadlink:function(t,e,r){if(r<=0)return-28;var i=y.readlink(t),n=Math.min(r,rw(i)),s=Zi[e+n];return u4(i,e,r+1),Zi[e+n]=s,n},doAccess:function(t,e){if(e&~7)return-28;var r,i=y.lookupPath(t,{follow:!0});if(r=i.node,!r)return-44;var n="";return e&4&&(n+="r"),e&2&&(n+="w"),e&1&&(n+="x"),n&&y.nodePermissions(r,n)?-2:0},doDup:function(t,e,r){var i=y.getStream(r);return i&&y.close(i),y.open(t,e,0,r,r).fd},doReadv:function(t,e,r,i){for(var n=0,s=0;s>2],a=_e[e+(s*8+4)>>2],l=y.read(t,Zi,o,a,i);if(l<0)return-1;if(n+=l,l>2],a=_e[e+(s*8+4)>>2],l=y.write(t,Zi,o,a,i);if(l<0)return-1;n+=l}return n},varargs:void 0,get:function(){Ot.varargs+=4;var t=_e[Ot.varargs-4>>2];return t},getStr:function(t){var e=c4(t);return e},getStreamFromFD:function(t){var e=y.getStream(t);if(!e)throw new y.ErrnoError(8);return e},get64:function(t,e){return t}};function qxe(t,e){try{return t=Ot.getStr(t),y.chmod(t,e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function Wxe(t){return _e[Jxe()>>2]=t,t}function zxe(t,e,r){Ot.varargs=r;try{var i=Ot.getStreamFromFD(t);switch(e){case 0:{var n=Ot.get();if(n<0)return-28;var s;return s=y.open(i.path,i.flags,0,n),s.fd}case 1:case 2:return 0;case 3:return i.flags;case 4:{var n=Ot.get();return i.flags|=n,0}case 12:{var n=Ot.get(),o=0;return cP[n+o>>1]=2,0}case 13:case 14:return 0;case 16:case 8:return-28;case 9:return Wxe(28),-1;default:return-28}}catch(a){return(typeof y=="undefined"||!(a instanceof y.ErrnoError))&&Gr(a),-a.errno}}function Vxe(t,e){try{var r=Ot.getStreamFromFD(t);return Ot.doStat(y.stat,r.path,e)}catch(i){return(typeof y=="undefined"||!(i instanceof y.ErrnoError))&&Gr(i),-i.errno}}function _xe(t,e,r){Ot.varargs=r;try{var i=Ot.getStreamFromFD(t);switch(e){case 21509:case 21505:return i.tty?0:-59;case 21510:case 21511:case 21512:case 21506:case 21507:case 21508:return i.tty?0:-59;case 21519:{if(!i.tty)return-59;var n=Ot.get();return _e[n>>2]=0,0}case 21520:return i.tty?-28:-59;case 21531:{var n=Ot.get();return y.ioctl(i,e,n)}case 21523:return i.tty?0:-59;case 21524:return i.tty?0:-59;default:Gr("bad ioctl syscall "+e)}}catch(s){return(typeof y=="undefined"||!(s instanceof y.ErrnoError))&&Gr(s),-s.errno}}function Xxe(t,e,r){Ot.varargs=r;try{var i=Ot.getStr(t),n=r?Ot.get():0,s=y.open(i,e,n);return s.fd}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),-o.errno}}function Zxe(t,e){try{return t=Ot.getStr(t),e=Ot.getStr(e),y.rename(t,e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function $xe(t){try{return t=Ot.getStr(t),y.rmdir(t),0}catch(e){return(typeof y=="undefined"||!(e instanceof y.ErrnoError))&&Gr(e),-e.errno}}function eke(t,e){try{return t=Ot.getStr(t),Ot.doStat(y.stat,t,e)}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),-r.errno}}function tke(t){try{return t=Ot.getStr(t),y.unlink(t),0}catch(e){return(typeof y=="undefined"||!(e instanceof y.ErrnoError))&&Gr(e),-e.errno}}function rke(t,e,r){$u.copyWithin(t,e,e+r)}function ike(t){try{return ew.grow(t-gP.byteLength+65535>>>16),p4(ew.buffer),1}catch(e){}}function nke(t){var e=$u.length;t=t>>>0;var r=2147483648;if(t>r)return!1;for(var i=1;i<=4;i*=2){var n=e*(1+.2/i);n=Math.min(n,t+100663296);var s=Math.min(r,xxe(Math.max(t,n),65536)),o=ike(s);if(o)return!0}return!1}function ske(t){try{var e=Ot.getStreamFromFD(t);return y.close(e),0}catch(r){return(typeof y=="undefined"||!(r instanceof y.ErrnoError))&&Gr(r),r.errno}}function oke(t,e){try{var r=Ot.getStreamFromFD(t),i=r.tty?2:y.isDir(r.mode)?3:y.isLink(r.mode)?7:4;return Zi[e>>0]=i,0}catch(n){return(typeof y=="undefined"||!(n instanceof y.ErrnoError))&&Gr(n),n.errno}}function ake(t,e,r,i){try{var n=Ot.getStreamFromFD(t),s=Ot.doReadv(n,e,r);return _e[i>>2]=s,0}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),o.errno}}function Ake(t,e,r,i,n){try{var s=Ot.getStreamFromFD(t),o=4294967296,a=r*o+(e>>>0),l=9007199254740992;return a<=-l||a>=l?-61:(y.llseek(s,a,i),ya=[s.position>>>0,(ai=s.position,+Math.abs(ai)>=1?ai>0?(Math.min(+Math.floor(ai/4294967296),4294967295)|0)>>>0:~~+Math.ceil((ai-+(~~ai>>>0))/4294967296)>>>0:0)],_e[n>>2]=ya[0],_e[n+4>>2]=ya[1],s.getdents&&a===0&&i===0&&(s.getdents=null),0)}catch(c){return(typeof y=="undefined"||!(c instanceof y.ErrnoError))&&Gr(c),c.errno}}function lke(t,e,r,i){try{var n=Ot.getStreamFromFD(t),s=Ot.doWritev(n,e,r);return _e[i>>2]=s,0}catch(o){return(typeof y=="undefined"||!(o instanceof y.ErrnoError))&&Gr(o),o.errno}}function cke(t){Ixe(t)}function uke(t){var e=Date.now()/1e3|0;return t&&(_e[t>>2]=e),e}function IP(){if(IP.called)return;IP.called=!0;var t=new Date().getFullYear(),e=new Date(t,0,1),r=new Date(t,6,1),i=e.getTimezoneOffset(),n=r.getTimezoneOffset(),s=Math.max(i,n);_e[fke()>>2]=s*60,_e[gke()>>2]=Number(i!=n);function o(g){var f=g.toTimeString().match(/\(([A-Za-z ]+)\)$/);return f?f[1]:"GMT"}var a=o(e),l=o(r),c=uP(a),u=uP(l);n>2]=c,_e[nw()+4>>2]=u):(_e[nw()>>2]=u,_e[nw()+4>>2]=c)}function hke(t){IP();var e=Date.UTC(_e[t+20>>2]+1900,_e[t+16>>2],_e[t+12>>2],_e[t+8>>2],_e[t+4>>2],_e[t>>2],0),r=new Date(e);_e[t+24>>2]=r.getUTCDay();var i=Date.UTC(r.getUTCFullYear(),0,1,0,0,0,0),n=(r.getTime()-i)/(1e3*60*60*24)|0;return _e[t+28>>2]=n,r.getTime()/1e3|0}var B4=function(t,e,r,i){t||(t=this),this.parent=t,this.mount=t.mount,this.mounted=null,this.id=y.nextInode++,this.name=e,this.mode=r,this.node_ops={},this.stream_ops={},this.rdev=i},sw=292|73,ow=146;Object.defineProperties(B4.prototype,{read:{get:function(){return(this.mode&sw)===sw},set:function(t){t?this.mode|=sw:this.mode&=~sw}},write:{get:function(){return(this.mode&ow)===ow},set:function(t){t?this.mode|=ow:this.mode&=~ow}},isFolder:{get:function(){return y.isDir(this.mode)}},isDevice:{get:function(){return y.isChrdev(this.mode)}}});y.FSNode=B4;y.staticInit();Wl&&(ft=e4,EP=require("path"),tt.staticInit());var ft,EP;if(Wl){Q4=function(t){return function(){try{return t.apply(this,arguments)}catch(e){throw e.code?new y.ErrnoError(eg[e.code]):e}}},Vl=Object.assign({},y);for(yP in w4)y[yP]=Q4(w4[yP])}else throw new Error("NODERAWFS is currently only supported on Node.js environment.");var Q4,Vl,yP;function CP(t,e,r){var i=r>0?r:rw(t)+1,n=new Array(i),s=tw(t,n,0,n.length);return e&&(n.length=s),n}var pke=typeof atob=="function"?atob:function(t){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",r="",i,n,s,o,a,l,c,u=0;t=t.replace(/[^A-Za-z0-9\+\/\=]/g,"");do o=e.indexOf(t.charAt(u++)),a=e.indexOf(t.charAt(u++)),l=e.indexOf(t.charAt(u++)),c=e.indexOf(t.charAt(u++)),i=o<<2|a>>4,n=(a&15)<<4|l>>2,s=(l&3)<<6|c,r=r+String.fromCharCode(i),l!==64&&(r=r+String.fromCharCode(n)),c!==64&&(r=r+String.fromCharCode(s));while(u0||(Fxe(),zl>0))return;function e(){aw||(aw=!0,oe.calledRun=!0,!A4&&(Nxe(),oe.onRuntimeInitialized&&oe.onRuntimeInitialized(),Txe()))}oe.setStatus?(oe.setStatus("Running..."),setTimeout(function(){setTimeout(function(){oe.setStatus("")},1),e()},1)):e()}oe.run=wP;if(oe.preInit)for(typeof oe.preInit=="function"&&(oe.preInit=[oe.preInit]);oe.preInit.length>0;)oe.preInit.pop()();wP()});var x4=E((Dot,S4)=>{"use strict";function Cke(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function _l(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,_l)}Cke(_l,Error);_l.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g>",ee=At(">>",!1),Ue=">&",Oe=At(">&",!1),vt=">",dt=At(">",!1),ri="<<<",ii=At("<<<",!1),an="<&",yr=At("<&",!1),Ki="<",Qi=At("<",!1),Go=function(C){return{type:"argument",segments:[].concat(...C)}},wr=function(C){return C},Ui="'",ws=At("'",!1),Tf=function(C){return[{type:"text",text:C}]},Mf='"',Rm=At('"',!1),Fm=function(C){return C},Nm=function(C){return{type:"arithmetic",arithmetic:C,quoted:!0}},DQ=function(C){return{type:"shell",shell:C,quoted:!0}},RQ=function(C){return _(P({type:"variable"},C),{quoted:!0})},Of=function(C){return{type:"text",text:C}},FQ=function(C){return{type:"arithmetic",arithmetic:C,quoted:!1}},NQ=function(C){return{type:"shell",shell:C,quoted:!1}},Lm=function(C){return _(P({type:"variable"},C),{quoted:!1})},LQ=function(C){return{type:"glob",pattern:C}},Va="\\",jo=At("\\",!1),Tm=/^[\\']/,Mm=Qs(["\\","'"],!1,!1),te=function(C){return C},Om=/^[^']/,Km=Qs(["'"],!0,!1),il=function(C){return C.join("")},Um=/^[\\$"]/,Hm=Qs(["\\","$",'"'],!1,!1),Kf=/^[^$"]/,Gm=Qs(["$",'"'],!0,!1),jm="\\0",TQ=At("\\0",!1),MQ=function(){return"\0"},Ym="\\a",qm=At("\\a",!1),Jm=function(){return"a"},Wm="\\b",zm=At("\\b",!1),Vm=function(){return"\b"},Uf="\\e",OQ=At("\\e",!1),KQ=function(){return""},_m="\\f",UQ=At("\\f",!1),HQ=function(){return"\f"},O="\\n",ht=At("\\n",!1),Vc=function(){return` +`},xn="\\r",Hf=At("\\r",!1),Ye=function(){return"\r"},nl="\\t",Xm=At("\\t",!1),MM=function(){return" "},GQ="\\v",OM=At("\\v",!1),fr=function(){return"\v"},Bs="\\x",jQ=At("\\x",!1),Zm=function(C){return String.fromCharCode(parseInt(C,16))},Yo="\\u",$m=At("\\u",!1),_a="\\U",et=At("\\U",!1),YQ=function(C){return String.fromCodePoint(parseInt(C,16))},eE=/^[0-9a-fA-f]/,tE=Qs([["0","9"],["a","f"],["A","f"]],!1,!1),Xa=Cfe(),sl="-",ol=At("-",!1),al="+",qo=At("+",!1),Al=".",qQ=At(".",!1),rE=function(C,Q,k){return{type:"number",value:(C==="-"?-1:1)*parseFloat(Q.join("")+"."+k.join(""))}},iE=function(C,Q){return{type:"number",value:(C==="-"?-1:1)*parseInt(Q.join(""))}},JQ=function(C){return P({type:"variable"},C)},ll=function(C){return{type:"variable",name:C}},WQ=function(C){return C},nE="*",Gf=At("*",!1),_c="/",jf=At("/",!1),sE=function(C,Q,k){return{type:Q==="*"?"multiplication":"division",right:k}},cl=function(C,Q){return Q.reduce((k,N)=>P({left:k},N),C)},oE=function(C,Q,k){return{type:Q==="+"?"addition":"subtraction",right:k}},Yf="$((",Xc=At("$((",!1),xr="))",KM=At("))",!1),Jo=function(C){return C},Zs="$(",aE=At("$(",!1),Zc=function(C){return C},x="${",U=At("${",!1),le=":-",xe=At(":-",!1),Qe=function(C,Q){return{name:C,defaultValue:Q}},Ge=":-}",ct=At(":-}",!1),sr=function(C){return{name:C,defaultValue:[]}},Wo=function(C){return{name:C}},Afe="$",lfe=At("$",!1),cfe=function(C){return e.isGlobPattern(C)},ufe=function(C){return C},UM=/^[a-zA-Z0-9_]/,HM=Qs([["a","z"],["A","Z"],["0","9"],"_"],!1,!1),GM=function(){return dfe()},jM=/^[$@*?#a-zA-Z0-9_\-]/,YM=Qs(["$","@","*","?","#",["a","z"],["A","Z"],["0","9"],"_","-"],!1,!1),gfe=/^[(){}<>$|&; \t"']/,ffe=Qs(["(",")","{","}","<",">","$","|","&",";"," "," ",'"',"'"],!1,!1),hfe=/^[<>&; \t"']/,pfe=Qs(["<",">","&",";"," "," ",'"',"'"],!1,!1),qM=/^[ \t]/,JM=Qs([" "," "],!1,!1),w=0,Re=0,AE=[{line:1,column:1}],$s=0,zQ=[],we=0,lE;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function dfe(){return t.substring(Re,w)}function P_e(){return qf(Re,w)}function D_e(C,Q){throw Q=Q!==void 0?Q:qf(Re,w),zM([Efe(C)],t.substring(Re,w),Q)}function R_e(C,Q){throw Q=Q!==void 0?Q:qf(Re,w),Ife(C,Q)}function At(C,Q){return{type:"literal",text:C,ignoreCase:Q}}function Qs(C,Q,k){return{type:"class",parts:C,inverted:Q,ignoreCase:k}}function Cfe(){return{type:"any"}}function mfe(){return{type:"end"}}function Efe(C){return{type:"other",description:C}}function WM(C){var Q=AE[C],k;if(Q)return Q;for(k=C-1;!AE[k];)k--;for(Q=AE[k],Q={line:Q.line,column:Q.column};k$s&&($s=w,zQ=[]),zQ.push(C))}function Ife(C,Q){return new _l(C,null,null,Q)}function zM(C,Q,k){return new _l(_l.buildMessage(C,Q),C,Q,k)}function VM(){var C,Q;return C=w,Q=Jf(),Q===r&&(Q=null),Q!==r&&(Re=C,Q=s(Q)),C=Q,C}function Jf(){var C,Q,k,N,Z;if(C=w,Q=VQ(),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();k!==r?(N=_M(),N!==r?(Z=yfe(),Z===r&&(Z=null),Z!==r?(Re=C,Q=o(Q,N,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;if(C===r)if(C=w,Q=VQ(),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();k!==r?(N=_M(),N===r&&(N=null),N!==r?(Re=C,Q=a(Q,N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;return C}function yfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=Jf(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=l(k),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;return C}function _M(){var C;return t.charCodeAt(w)===59?(C=c,w++):(C=r,we===0&&ve(u)),C===r&&(t.charCodeAt(w)===38?(C=g,w++):(C=r,we===0&&ve(f))),C}function VQ(){var C,Q,k;return C=w,Q=XM(),Q!==r?(k=wfe(),k===r&&(k=null),k!==r?(Re=C,Q=h(Q,k),C=Q):(w=C,C=r)):(w=C,C=r),C}function wfe(){var C,Q,k,N,Z,Ee,ot;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=Bfe(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=VQ(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();Ee!==r?(Re=C,Q=p(k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;return C}function Bfe(){var C;return t.substr(w,2)===d?(C=d,w+=2):(C=r,we===0&&ve(m)),C===r&&(t.substr(w,2)===I?(C=I,w+=2):(C=r,we===0&&ve(B))),C}function XM(){var C,Q,k;return C=w,Q=vfe(),Q!==r?(k=Qfe(),k===r&&(k=null),k!==r?(Re=C,Q=b(Q,k),C=Q):(w=C,C=r)):(w=C,C=r),C}function Qfe(){var C,Q,k,N,Z,Ee,ot;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(k=bfe(),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=XM(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();Ee!==r?(Re=C,Q=R(k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;return C}function bfe(){var C;return t.substr(w,2)===H?(C=H,w+=2):(C=r,we===0&&ve(L)),C===r&&(t.charCodeAt(w)===124?(C=K,w++):(C=r,we===0&&ve(J))),C}function cE(){var C,Q,k,N,Z,Ee;if(C=w,Q=oO(),Q!==r)if(t.charCodeAt(w)===61?(k=ne,w++):(k=r,we===0&&ve(q)),k!==r)if(N=$M(),N!==r){for(Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();Z!==r?(Re=C,Q=A(Q,N),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;else w=C,C=r;if(C===r)if(C=w,Q=oO(),Q!==r)if(t.charCodeAt(w)===61?(k=ne,w++):(k=r,we===0&&ve(q)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=V(Q),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r;return C}function vfe(){var C,Q,k,N,Z,Ee,ot,ut,Tr,ni,Yn;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(t.charCodeAt(w)===40?(k=W,w++):(k=r,we===0&&ve(X)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=Jf(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();if(Ee!==r)if(t.charCodeAt(w)===41?(ot=F,w++):(ot=r,we===0&&ve(D)),ot!==r){for(ut=[],Tr=ke();Tr!==r;)ut.push(Tr),Tr=ke();if(ut!==r){for(Tr=[],ni=Wf();ni!==r;)Tr.push(ni),ni=Wf();if(Tr!==r){for(ni=[],Yn=ke();Yn!==r;)ni.push(Yn),Yn=ke();ni!==r?(Re=C,Q=he(Z,Tr),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r)if(t.charCodeAt(w)===123?(k=pe,w++):(k=r,we===0&&ve(Ne)),k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r)if(Z=Jf(),Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();if(Ee!==r)if(t.charCodeAt(w)===125?(ot=Pe,w++):(ot=r,we===0&&ve(qe)),ot!==r){for(ut=[],Tr=ke();Tr!==r;)ut.push(Tr),Tr=ke();if(ut!==r){for(Tr=[],ni=Wf();ni!==r;)Tr.push(ni),ni=Wf();if(Tr!==r){for(ni=[],Yn=ke();Yn!==r;)ni.push(Yn),Yn=ke();ni!==r?(Re=C,Q=re(Z,Tr),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r}else w=C,C=r;else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){for(k=[],N=cE();N!==r;)k.push(N),N=cE();if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();if(N!==r){if(Z=[],Ee=ZM(),Ee!==r)for(;Ee!==r;)Z.push(Ee),Ee=ZM();else Z=r;if(Z!==r){for(Ee=[],ot=ke();ot!==r;)Ee.push(ot),ot=ke();Ee!==r?(Re=C,Q=se(k,Z),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}else w=C,C=r}else w=C,C=r;if(C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){if(k=[],N=cE(),N!==r)for(;N!==r;)k.push(N),N=cE();else k=r;if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=be(k),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r}}}return C}function Sfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r){if(k=[],N=uE(),N!==r)for(;N!==r;)k.push(N),N=uE();else k=r;if(k!==r){for(N=[],Z=ke();Z!==r;)N.push(Z),Z=ke();N!==r?(Re=C,Q=ae(k),C=Q):(w=C,C=r)}else w=C,C=r}else w=C,C=r;return C}function ZM(){var C,Q,k;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();if(Q!==r?(k=Wf(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r){for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();Q!==r?(k=uE(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r)}return C}function Wf(){var C,Q,k,N,Z;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();return Q!==r?(De.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve($)),k===r&&(k=null),k!==r?(N=xfe(),N!==r?(Z=uE(),Z!==r?(Re=C,Q=G(k,N,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function xfe(){var C;return t.substr(w,2)===Ce?(C=Ce,w+=2):(C=r,we===0&&ve(ee)),C===r&&(t.substr(w,2)===Ue?(C=Ue,w+=2):(C=r,we===0&&ve(Oe)),C===r&&(t.charCodeAt(w)===62?(C=vt,w++):(C=r,we===0&&ve(dt)),C===r&&(t.substr(w,3)===ri?(C=ri,w+=3):(C=r,we===0&&ve(ii)),C===r&&(t.substr(w,2)===an?(C=an,w+=2):(C=r,we===0&&ve(yr)),C===r&&(t.charCodeAt(w)===60?(C=Ki,w++):(C=r,we===0&&ve(Qi))))))),C}function uE(){var C,Q,k;for(C=w,Q=[],k=ke();k!==r;)Q.push(k),k=ke();return Q!==r?(k=$M(),k!==r?(Re=C,Q=Ae(k),C=Q):(w=C,C=r)):(w=C,C=r),C}function $M(){var C,Q,k;if(C=w,Q=[],k=eO(),k!==r)for(;k!==r;)Q.push(k),k=eO();else Q=r;return Q!==r&&(Re=C,Q=Go(Q)),C=Q,C}function eO(){var C,Q;return C=w,Q=kfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q,C===r&&(C=w,Q=Pfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q,C===r&&(C=w,Q=Dfe(),Q!==r&&(Re=C,Q=wr(Q)),C=Q)),C}function kfe(){var C,Q,k,N;return C=w,t.charCodeAt(w)===39?(Q=Ui,w++):(Q=r,we===0&&ve(ws)),Q!==r?(k=Rfe(),k!==r?(t.charCodeAt(w)===39?(N=Ui,w++):(N=r,we===0&&ve(ws)),N!==r?(Re=C,Q=Tf(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function Pfe(){var C,Q,k,N;if(C=w,t.charCodeAt(w)===34?(Q=Mf,w++):(Q=r,we===0&&ve(Rm)),Q!==r){for(k=[],N=tO();N!==r;)k.push(N),N=tO();k!==r?(t.charCodeAt(w)===34?(N=Mf,w++):(N=r,we===0&&ve(Rm)),N!==r?(Re=C,Q=Fm(k),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;return C}function Dfe(){var C,Q,k;if(C=w,Q=[],k=rO(),k!==r)for(;k!==r;)Q.push(k),k=rO();else Q=r;return Q!==r&&(Re=C,Q=Fm(Q)),C=Q,C}function tO(){var C,Q;return C=w,Q=nO(),Q!==r&&(Re=C,Q=Nm(Q)),C=Q,C===r&&(C=w,Q=sO(),Q!==r&&(Re=C,Q=DQ(Q)),C=Q,C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=RQ(Q)),C=Q,C===r&&(C=w,Q=Ffe(),Q!==r&&(Re=C,Q=Of(Q)),C=Q))),C}function rO(){var C,Q;return C=w,Q=nO(),Q!==r&&(Re=C,Q=FQ(Q)),C=Q,C===r&&(C=w,Q=sO(),Q!==r&&(Re=C,Q=NQ(Q)),C=Q,C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=Lm(Q)),C=Q,C===r&&(C=w,Q=Lfe(),Q!==r&&(Re=C,Q=LQ(Q)),C=Q,C===r&&(C=w,Q=Nfe(),Q!==r&&(Re=C,Q=Of(Q)),C=Q)))),C}function Rfe(){var C,Q,k,N,Z;for(C=w,Q=[],k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Tm.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Mm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Om.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Km)))));k!==r;)Q.push(k),k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Tm.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Mm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Om.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Km)))));return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function Ffe(){var C,Q,k,N,Z;if(C=w,Q=[],k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Um.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Hm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Kf.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Gm))))),k!==r)for(;k!==r;)Q.push(k),k=gE(),k===r&&(k=fE(),k===r&&(k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(Um.test(t.charAt(w))?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Hm)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(Kf.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(Gm)))));else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function gE(){var C,Q;return C=w,t.substr(w,2)===jm?(Q=jm,w+=2):(Q=r,we===0&&ve(TQ)),Q!==r&&(Re=C,Q=MQ()),C=Q,C===r&&(C=w,t.substr(w,2)===Ym?(Q=Ym,w+=2):(Q=r,we===0&&ve(qm)),Q!==r&&(Re=C,Q=Jm()),C=Q,C===r&&(C=w,t.substr(w,2)===Wm?(Q=Wm,w+=2):(Q=r,we===0&&ve(zm)),Q!==r&&(Re=C,Q=Vm()),C=Q,C===r&&(C=w,t.substr(w,2)===Uf?(Q=Uf,w+=2):(Q=r,we===0&&ve(OQ)),Q!==r&&(Re=C,Q=KQ()),C=Q,C===r&&(C=w,t.substr(w,2)===_m?(Q=_m,w+=2):(Q=r,we===0&&ve(UQ)),Q!==r&&(Re=C,Q=HQ()),C=Q,C===r&&(C=w,t.substr(w,2)===O?(Q=O,w+=2):(Q=r,we===0&&ve(ht)),Q!==r&&(Re=C,Q=Vc()),C=Q,C===r&&(C=w,t.substr(w,2)===xn?(Q=xn,w+=2):(Q=r,we===0&&ve(Hf)),Q!==r&&(Re=C,Q=Ye()),C=Q,C===r&&(C=w,t.substr(w,2)===nl?(Q=nl,w+=2):(Q=r,we===0&&ve(Xm)),Q!==r&&(Re=C,Q=MM()),C=Q,C===r&&(C=w,t.substr(w,2)===GQ?(Q=GQ,w+=2):(Q=r,we===0&&ve(OM)),Q!==r&&(Re=C,Q=fr()),C=Q)))))))),C}function fE(){var C,Q,k,N,Z,Ee,ot,ut,Tr,ni,Yn,$Q;return C=w,t.substr(w,2)===Bs?(Q=Bs,w+=2):(Q=r,we===0&&ve(jQ)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ee=An(),Ee!==r?(Z=[Z,Ee],N=Z):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=Zm(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===Yo?(Q=Yo,w+=2):(Q=r,we===0&&ve($m)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ee=An(),Ee!==r?(ot=An(),ot!==r?(ut=An(),ut!==r?(Z=[Z,Ee,ot,ut],N=Z):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=Zm(k),C=Q):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===_a?(Q=_a,w+=2):(Q=r,we===0&&ve(et)),Q!==r?(k=w,N=w,Z=An(),Z!==r?(Ee=An(),Ee!==r?(ot=An(),ot!==r?(ut=An(),ut!==r?(Tr=An(),Tr!==r?(ni=An(),ni!==r?(Yn=An(),Yn!==r?($Q=An(),$Q!==r?(Z=[Z,Ee,ot,ut,Tr,ni,Yn,$Q],N=Z):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r)):(w=N,N=r),N!==r?k=t.substring(k,w):k=N,k!==r?(Re=C,Q=YQ(k),C=Q):(w=C,C=r)):(w=C,C=r))),C}function An(){var C;return eE.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(tE)),C}function Nfe(){var C,Q,k,N,Z;if(C=w,Q=[],k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(k=w,N=w,we++,Z=aO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r)),k!==r)for(;k!==r;)Q.push(k),k=w,t.charCodeAt(w)===92?(N=Va,w++):(N=r,we===0&&ve(jo)),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k===r&&(k=w,N=w,we++,Z=aO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r));else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function _Q(){var C,Q,k,N,Z,Ee;if(C=w,t.charCodeAt(w)===45?(Q=sl,w++):(Q=r,we===0&&ve(ol)),Q===r&&(t.charCodeAt(w)===43?(Q=al,w++):(Q=r,we===0&&ve(qo))),Q===r&&(Q=null),Q!==r){if(k=[],De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($)),N!==r)for(;N!==r;)k.push(N),De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($));else k=r;if(k!==r)if(t.charCodeAt(w)===46?(N=Al,w++):(N=r,we===0&&ve(qQ)),N!==r){if(Z=[],De.test(t.charAt(w))?(Ee=t.charAt(w),w++):(Ee=r,we===0&&ve($)),Ee!==r)for(;Ee!==r;)Z.push(Ee),De.test(t.charAt(w))?(Ee=t.charAt(w),w++):(Ee=r,we===0&&ve($));else Z=r;Z!==r?(Re=C,Q=rE(Q,k,Z),C=Q):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;if(C===r){if(C=w,t.charCodeAt(w)===45?(Q=sl,w++):(Q=r,we===0&&ve(ol)),Q===r&&(t.charCodeAt(w)===43?(Q=al,w++):(Q=r,we===0&&ve(qo))),Q===r&&(Q=null),Q!==r){if(k=[],De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($)),N!==r)for(;N!==r;)k.push(N),De.test(t.charAt(w))?(N=t.charAt(w),w++):(N=r,we===0&&ve($));else k=r;k!==r?(Re=C,Q=iE(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;if(C===r&&(C=w,Q=ZQ(),Q!==r&&(Re=C,Q=JQ(Q)),C=Q,C===r&&(C=w,Q=zf(),Q!==r&&(Re=C,Q=ll(Q)),C=Q,C===r)))if(C=w,t.charCodeAt(w)===40?(Q=W,w++):(Q=r,we===0&&ve(X)),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();if(k!==r)if(N=iO(),N!==r){for(Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();Z!==r?(t.charCodeAt(w)===41?(Ee=F,w++):(Ee=r,we===0&&ve(D)),Ee!==r?(Re=C,Q=WQ(N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r}return C}function XQ(){var C,Q,k,N,Z,Ee,ot,ut;if(C=w,Q=_Q(),Q!==r){for(k=[],N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===42?(Ee=nE,w++):(Ee=r,we===0&&ve(Gf)),Ee===r&&(t.charCodeAt(w)===47?(Ee=_c,w++):(Ee=r,we===0&&ve(jf))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=_Q(),ut!==r?(Re=N,Z=sE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r;for(;N!==r;){for(k.push(N),N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===42?(Ee=nE,w++):(Ee=r,we===0&&ve(Gf)),Ee===r&&(t.charCodeAt(w)===47?(Ee=_c,w++):(Ee=r,we===0&&ve(jf))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=_Q(),ut!==r?(Re=N,Z=sE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r}k!==r?(Re=C,Q=cl(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;return C}function iO(){var C,Q,k,N,Z,Ee,ot,ut;if(C=w,Q=XQ(),Q!==r){for(k=[],N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===43?(Ee=al,w++):(Ee=r,we===0&&ve(qo)),Ee===r&&(t.charCodeAt(w)===45?(Ee=sl,w++):(Ee=r,we===0&&ve(ol))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=XQ(),ut!==r?(Re=N,Z=oE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r;for(;N!==r;){for(k.push(N),N=w,Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();if(Z!==r)if(t.charCodeAt(w)===43?(Ee=al,w++):(Ee=r,we===0&&ve(qo)),Ee===r&&(t.charCodeAt(w)===45?(Ee=sl,w++):(Ee=r,we===0&&ve(ol))),Ee!==r){for(ot=[],ut=ke();ut!==r;)ot.push(ut),ut=ke();ot!==r?(ut=XQ(),ut!==r?(Re=N,Z=oE(Q,Ee,ut),N=Z):(w=N,N=r)):(w=N,N=r)}else w=N,N=r;else w=N,N=r}k!==r?(Re=C,Q=cl(Q,k),C=Q):(w=C,C=r)}else w=C,C=r;return C}function nO(){var C,Q,k,N,Z,Ee;if(C=w,t.substr(w,3)===Yf?(Q=Yf,w+=3):(Q=r,we===0&&ve(Xc)),Q!==r){for(k=[],N=ke();N!==r;)k.push(N),N=ke();if(k!==r)if(N=iO(),N!==r){for(Z=[],Ee=ke();Ee!==r;)Z.push(Ee),Ee=ke();Z!==r?(t.substr(w,2)===xr?(Ee=xr,w+=2):(Ee=r,we===0&&ve(KM)),Ee!==r?(Re=C,Q=Jo(N),C=Q):(w=C,C=r)):(w=C,C=r)}else w=C,C=r;else w=C,C=r}else w=C,C=r;return C}function sO(){var C,Q,k,N;return C=w,t.substr(w,2)===Zs?(Q=Zs,w+=2):(Q=r,we===0&&ve(aE)),Q!==r?(k=Jf(),k!==r?(t.charCodeAt(w)===41?(N=F,w++):(N=r,we===0&&ve(D)),N!==r?(Re=C,Q=Zc(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C}function ZQ(){var C,Q,k,N,Z,Ee;return C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.substr(w,2)===le?(N=le,w+=2):(N=r,we===0&&ve(xe)),N!==r?(Z=Sfe(),Z!==r?(t.charCodeAt(w)===125?(Ee=Pe,w++):(Ee=r,we===0&&ve(qe)),Ee!==r?(Re=C,Q=Qe(k,Z),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.substr(w,3)===Ge?(N=Ge,w+=3):(N=r,we===0&&ve(ct)),N!==r?(Re=C,Q=sr(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.substr(w,2)===x?(Q=x,w+=2):(Q=r,we===0&&ve(U)),Q!==r?(k=zf(),k!==r?(t.charCodeAt(w)===125?(N=Pe,w++):(N=r,we===0&&ve(qe)),N!==r?(Re=C,Q=Wo(k),C=Q):(w=C,C=r)):(w=C,C=r)):(w=C,C=r),C===r&&(C=w,t.charCodeAt(w)===36?(Q=Afe,w++):(Q=r,we===0&&ve(lfe)),Q!==r?(k=zf(),k!==r?(Re=C,Q=Wo(k),C=Q):(w=C,C=r)):(w=C,C=r)))),C}function Lfe(){var C,Q,k;return C=w,Q=Tfe(),Q!==r?(Re=w,k=cfe(Q),k?k=void 0:k=r,k!==r?(Re=C,Q=ufe(Q),C=Q):(w=C,C=r)):(w=C,C=r),C}function Tfe(){var C,Q,k,N,Z;if(C=w,Q=[],k=w,N=w,we++,Z=AO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r),k!==r)for(;k!==r;)Q.push(k),k=w,N=w,we++,Z=AO(),we--,Z===r?N=void 0:(w=N,N=r),N!==r?(t.length>w?(Z=t.charAt(w),w++):(Z=r,we===0&&ve(Xa)),Z!==r?(Re=k,N=te(Z),k=N):(w=k,k=r)):(w=k,k=r);else Q=r;return Q!==r&&(Re=C,Q=il(Q)),C=Q,C}function oO(){var C,Q,k;if(C=w,Q=[],UM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(HM)),k!==r)for(;k!==r;)Q.push(k),UM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(HM));else Q=r;return Q!==r&&(Re=C,Q=GM()),C=Q,C}function zf(){var C,Q,k;if(C=w,Q=[],jM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(YM)),k!==r)for(;k!==r;)Q.push(k),jM.test(t.charAt(w))?(k=t.charAt(w),w++):(k=r,we===0&&ve(YM));else Q=r;return Q!==r&&(Re=C,Q=GM()),C=Q,C}function aO(){var C;return gfe.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(ffe)),C}function AO(){var C;return hfe.test(t.charAt(w))?(C=t.charAt(w),w++):(C=r,we===0&&ve(pfe)),C}function ke(){var C,Q;if(C=[],qM.test(t.charAt(w))?(Q=t.charAt(w),w++):(Q=r,we===0&&ve(JM)),Q!==r)for(;Q!==r;)C.push(Q),qM.test(t.charAt(w))?(Q=t.charAt(w),w++):(Q=r,we===0&&ve(JM));else C=r;return C}if(lE=n(),lE!==r&&w===t.length)return lE;throw lE!==r&&w{"use strict";function Eke(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function Xl(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,Xl)}Eke(Xl,Error);Xl.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;gH&&(H=B,L=[]),L.push($))}function qe($,G){return new Xl($,null,null,G)}function re($,G,Ce){return new Xl(Xl.buildMessage($,G),$,G,Ce)}function se(){var $,G,Ce,ee;return $=B,G=be(),G!==r?(t.charCodeAt(B)===47?(Ce=s,B++):(Ce=r,K===0&&Pe(o)),Ce!==r?(ee=be(),ee!==r?(b=$,G=a(G,ee),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=be(),G!==r&&(b=$,G=l(G)),$=G),$}function be(){var $,G,Ce,ee;return $=B,G=ae(),G!==r?(t.charCodeAt(B)===64?(Ce=c,B++):(Ce=r,K===0&&Pe(u)),Ce!==r?(ee=De(),ee!==r?(b=$,G=g(G,ee),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=ae(),G!==r&&(b=$,G=f(G)),$=G),$}function ae(){var $,G,Ce,ee,Ue;return $=B,t.charCodeAt(B)===64?(G=c,B++):(G=r,K===0&&Pe(u)),G!==r?(Ce=Ae(),Ce!==r?(t.charCodeAt(B)===47?(ee=s,B++):(ee=r,K===0&&Pe(o)),ee!==r?(Ue=Ae(),Ue!==r?(b=$,G=h(),$=G):(B=$,$=r)):(B=$,$=r)):(B=$,$=r)):(B=$,$=r),$===r&&($=B,G=Ae(),G!==r&&(b=$,G=h()),$=G),$}function Ae(){var $,G,Ce;if($=B,G=[],p.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(d)),Ce!==r)for(;Ce!==r;)G.push(Ce),p.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(d));else G=r;return G!==r&&(b=$,G=h()),$=G,$}function De(){var $,G,Ce;if($=B,G=[],m.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(I)),Ce!==r)for(;Ce!==r;)G.push(Ce),m.test(t.charAt(B))?(Ce=t.charAt(B),B++):(Ce=r,K===0&&Pe(I));else G=r;return G!==r&&(b=$,G=h()),$=G,$}if(J=n(),J!==r&&B===t.length)return J;throw J!==r&&B{"use strict";function F4(t){return typeof t=="undefined"||t===null}function yke(t){return typeof t=="object"&&t!==null}function wke(t){return Array.isArray(t)?t:F4(t)?[]:[t]}function Bke(t,e){var r,i,n,s;if(e)for(s=Object.keys(e),r=0,i=s.length;r{"use strict";function Lp(t,e){Error.call(this),this.name="YAMLException",this.reason=t,this.mark=e,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():""),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=new Error().stack||""}Lp.prototype=Object.create(Error.prototype);Lp.prototype.constructor=Lp;Lp.prototype.toString=function(e){var r=this.name+": ";return r+=this.reason||"(unknown reason)",!e&&this.mark&&(r+=" "+this.mark.toString()),r};N4.exports=Lp});var M4=E((Vot,L4)=>{"use strict";var T4=$l();function kP(t,e,r,i,n){this.name=t,this.buffer=e,this.position=r,this.line=i,this.column=n}kP.prototype.getSnippet=function(e,r){var i,n,s,o,a;if(!this.buffer)return null;for(e=e||4,r=r||75,i="",n=this.position;n>0&&`\0\r +\x85\u2028\u2029`.indexOf(this.buffer.charAt(n-1))===-1;)if(n-=1,this.position-n>r/2-1){i=" ... ",n+=5;break}for(s="",o=this.position;or/2-1){s=" ... ",o-=5;break}return a=this.buffer.slice(n,o),T4.repeat(" ",e)+i+a+s+` +`+T4.repeat(" ",e+this.position-n+i.length)+"^"};kP.prototype.toString=function(e){var r,i="";return this.name&&(i+='in "'+this.name+'" '),i+="at line "+(this.line+1)+", column "+(this.column+1),e||(r=this.getSnippet(),r&&(i+=`: +`+r)),i};L4.exports=kP});var Xr=E((_ot,O4)=>{"use strict";var K4=ng(),vke=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],Ske=["scalar","sequence","mapping"];function xke(t){var e={};return t!==null&&Object.keys(t).forEach(function(r){t[r].forEach(function(i){e[String(i)]=r})}),e}function kke(t,e){if(e=e||{},Object.keys(e).forEach(function(r){if(vke.indexOf(r)===-1)throw new K4('Unknown option "'+r+'" is met in definition of "'+t+'" YAML type.')}),this.tag=t,this.kind=e.kind||null,this.resolve=e.resolve||function(){return!0},this.construct=e.construct||function(r){return r},this.instanceOf=e.instanceOf||null,this.predicate=e.predicate||null,this.represent=e.represent||null,this.defaultStyle=e.defaultStyle||null,this.styleAliases=xke(e.styleAliases||null),Ske.indexOf(this.kind)===-1)throw new K4('Unknown kind "'+this.kind+'" is specified for "'+t+'" YAML type.')}O4.exports=kke});var ec=E((Xot,U4)=>{"use strict";var H4=$l(),hw=ng(),Pke=Xr();function PP(t,e,r){var i=[];return t.include.forEach(function(n){r=PP(n,e,r)}),t[e].forEach(function(n){r.forEach(function(s,o){s.tag===n.tag&&s.kind===n.kind&&i.push(o)}),r.push(n)}),r.filter(function(n,s){return i.indexOf(s)===-1})}function Dke(){var t={scalar:{},sequence:{},mapping:{},fallback:{}},e,r;function i(n){t[n.kind][n.tag]=t.fallback[n.tag]=n}for(e=0,r=arguments.length;e{"use strict";var Rke=Xr();G4.exports=new Rke("tag:yaml.org,2002:str",{kind:"scalar",construct:function(t){return t!==null?t:""}})});var q4=E(($ot,Y4)=>{"use strict";var Fke=Xr();Y4.exports=new Fke("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(t){return t!==null?t:[]}})});var W4=E((eat,J4)=>{"use strict";var Nke=Xr();J4.exports=new Nke("tag:yaml.org,2002:map",{kind:"mapping",construct:function(t){return t!==null?t:{}}})});var pw=E((tat,z4)=>{"use strict";var Lke=ec();z4.exports=new Lke({explicit:[j4(),q4(),W4()]})});var _4=E((rat,V4)=>{"use strict";var Tke=Xr();function Mke(t){if(t===null)return!0;var e=t.length;return e===1&&t==="~"||e===4&&(t==="null"||t==="Null"||t==="NULL")}function Oke(){return null}function Kke(t){return t===null}V4.exports=new Tke("tag:yaml.org,2002:null",{kind:"scalar",resolve:Mke,construct:Oke,predicate:Kke,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})});var Z4=E((iat,X4)=>{"use strict";var Uke=Xr();function Hke(t){if(t===null)return!1;var e=t.length;return e===4&&(t==="true"||t==="True"||t==="TRUE")||e===5&&(t==="false"||t==="False"||t==="FALSE")}function Gke(t){return t==="true"||t==="True"||t==="TRUE"}function jke(t){return Object.prototype.toString.call(t)==="[object Boolean]"}X4.exports=new Uke("tag:yaml.org,2002:bool",{kind:"scalar",resolve:Hke,construct:Gke,predicate:jke,represent:{lowercase:function(t){return t?"true":"false"},uppercase:function(t){return t?"TRUE":"FALSE"},camelcase:function(t){return t?"True":"False"}},defaultStyle:"lowercase"})});var ez=E((nat,$4)=>{"use strict";var Yke=$l(),qke=Xr();function Jke(t){return 48<=t&&t<=57||65<=t&&t<=70||97<=t&&t<=102}function Wke(t){return 48<=t&&t<=55}function zke(t){return 48<=t&&t<=57}function Vke(t){if(t===null)return!1;var e=t.length,r=0,i=!1,n;if(!e)return!1;if(n=t[r],(n==="-"||n==="+")&&(n=t[++r]),n==="0"){if(r+1===e)return!0;if(n=t[++r],n==="b"){for(r++;r=0?"0b"+t.toString(2):"-0b"+t.toString(2).slice(1)},octal:function(t){return t>=0?"0"+t.toString(8):"-0"+t.toString(8).slice(1)},decimal:function(t){return t.toString(10)},hexadecimal:function(t){return t>=0?"0x"+t.toString(16).toUpperCase():"-0x"+t.toString(16).toUpperCase().slice(1)}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})});var iz=E((sat,tz)=>{"use strict";var rz=$l(),Zke=Xr(),$ke=new RegExp("^(?:[-+]?(?:0|[1-9][0-9_]*)(?:\\.[0-9_]*)?(?:[eE][-+]?[0-9]+)?|\\.[0-9_]+(?:[eE][-+]?[0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$");function ePe(t){return!(t===null||!$ke.test(t)||t[t.length-1]==="_")}function tPe(t){var e,r,i,n;return e=t.replace(/_/g,"").toLowerCase(),r=e[0]==="-"?-1:1,n=[],"+-".indexOf(e[0])>=0&&(e=e.slice(1)),e===".inf"?r===1?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:e===".nan"?NaN:e.indexOf(":")>=0?(e.split(":").forEach(function(s){n.unshift(parseFloat(s,10))}),e=0,i=1,n.forEach(function(s){e+=s*i,i*=60}),r*e):r*parseFloat(e,10)}var rPe=/^[-+]?[0-9]+e/;function iPe(t,e){var r;if(isNaN(t))switch(e){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===t)switch(e){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===t)switch(e){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(rz.isNegativeZero(t))return"-0.0";return r=t.toString(10),rPe.test(r)?r.replace("e",".e"):r}function nPe(t){return Object.prototype.toString.call(t)==="[object Number]"&&(t%1!=0||rz.isNegativeZero(t))}tz.exports=new Zke("tag:yaml.org,2002:float",{kind:"scalar",resolve:ePe,construct:tPe,predicate:nPe,represent:iPe,defaultStyle:"lowercase"})});var DP=E((oat,nz)=>{"use strict";var sPe=ec();nz.exports=new sPe({include:[pw()],implicit:[_4(),Z4(),ez(),iz()]})});var RP=E((aat,sz)=>{"use strict";var oPe=ec();sz.exports=new oPe({include:[DP()]})});var lz=E((Aat,oz)=>{"use strict";var aPe=Xr(),az=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9])-([0-9][0-9])$"),Az=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?$");function APe(t){return t===null?!1:az.exec(t)!==null||Az.exec(t)!==null}function lPe(t){var e,r,i,n,s,o,a,l=0,c=null,u,g,f;if(e=az.exec(t),e===null&&(e=Az.exec(t)),e===null)throw new Error("Date resolve error");if(r=+e[1],i=+e[2]-1,n=+e[3],!e[4])return new Date(Date.UTC(r,i,n));if(s=+e[4],o=+e[5],a=+e[6],e[7]){for(l=e[7].slice(0,3);l.length<3;)l+="0";l=+l}return e[9]&&(u=+e[10],g=+(e[11]||0),c=(u*60+g)*6e4,e[9]==="-"&&(c=-c)),f=new Date(Date.UTC(r,i,n,s,o,a,l)),c&&f.setTime(f.getTime()-c),f}function cPe(t){return t.toISOString()}oz.exports=new aPe("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:APe,construct:lPe,instanceOf:Date,represent:cPe})});var uz=E((lat,cz)=>{"use strict";var uPe=Xr();function gPe(t){return t==="<<"||t===null}cz.exports=new uPe("tag:yaml.org,2002:merge",{kind:"scalar",resolve:gPe})});var hz=E((cat,gz)=>{"use strict";var tc;try{fz=require,tc=fz("buffer").Buffer}catch(t){}var fz,fPe=Xr(),FP=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/= +\r`;function hPe(t){if(t===null)return!1;var e,r,i=0,n=t.length,s=FP;for(r=0;r64)){if(e<0)return!1;i+=6}return i%8==0}function pPe(t){var e,r,i=t.replace(/[\r\n=]/g,""),n=i.length,s=FP,o=0,a=[];for(e=0;e>16&255),a.push(o>>8&255),a.push(o&255)),o=o<<6|s.indexOf(i.charAt(e));return r=n%4*6,r===0?(a.push(o>>16&255),a.push(o>>8&255),a.push(o&255)):r===18?(a.push(o>>10&255),a.push(o>>2&255)):r===12&&a.push(o>>4&255),tc?tc.from?tc.from(a):new tc(a):a}function dPe(t){var e="",r=0,i,n,s=t.length,o=FP;for(i=0;i>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]),r=(r<<8)+t[i];return n=s%3,n===0?(e+=o[r>>18&63],e+=o[r>>12&63],e+=o[r>>6&63],e+=o[r&63]):n===2?(e+=o[r>>10&63],e+=o[r>>4&63],e+=o[r<<2&63],e+=o[64]):n===1&&(e+=o[r>>2&63],e+=o[r<<4&63],e+=o[64],e+=o[64]),e}function CPe(t){return tc&&tc.isBuffer(t)}gz.exports=new fPe("tag:yaml.org,2002:binary",{kind:"scalar",resolve:hPe,construct:pPe,predicate:CPe,represent:dPe})});var dz=E((uat,pz)=>{"use strict";var mPe=Xr(),EPe=Object.prototype.hasOwnProperty,IPe=Object.prototype.toString;function yPe(t){if(t===null)return!0;var e=[],r,i,n,s,o,a=t;for(r=0,i=a.length;r{"use strict";var BPe=Xr(),QPe=Object.prototype.toString;function bPe(t){if(t===null)return!0;var e,r,i,n,s,o=t;for(s=new Array(o.length),e=0,r=o.length;e{"use strict";var SPe=Xr(),xPe=Object.prototype.hasOwnProperty;function kPe(t){if(t===null)return!0;var e,r=t;for(e in r)if(xPe.call(r,e)&&r[e]!==null)return!1;return!0}function PPe(t){return t!==null?t:{}}Ez.exports=new SPe("tag:yaml.org,2002:set",{kind:"mapping",resolve:kPe,construct:PPe})});var og=E((hat,yz)=>{"use strict";var DPe=ec();yz.exports=new DPe({include:[RP()],implicit:[lz(),uz()],explicit:[hz(),dz(),mz(),Iz()]})});var Bz=E((pat,wz)=>{"use strict";var RPe=Xr();function FPe(){return!0}function NPe(){}function LPe(){return""}function TPe(t){return typeof t=="undefined"}wz.exports=new RPe("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:FPe,construct:NPe,predicate:TPe,represent:LPe})});var bz=E((dat,Qz)=>{"use strict";var MPe=Xr();function OPe(t){if(t===null||t.length===0)return!1;var e=t,r=/\/([gim]*)$/.exec(t),i="";return!(e[0]==="/"&&(r&&(i=r[1]),i.length>3||e[e.length-i.length-1]!=="/"))}function KPe(t){var e=t,r=/\/([gim]*)$/.exec(t),i="";return e[0]==="/"&&(r&&(i=r[1]),e=e.slice(1,e.length-i.length-1)),new RegExp(e,i)}function UPe(t){var e="/"+t.source+"/";return t.global&&(e+="g"),t.multiline&&(e+="m"),t.ignoreCase&&(e+="i"),e}function HPe(t){return Object.prototype.toString.call(t)==="[object RegExp]"}Qz.exports=new MPe("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:OPe,construct:KPe,predicate:HPe,represent:UPe})});var xz=E((Cat,vz)=>{"use strict";var dw;try{Sz=require,dw=Sz("esprima")}catch(t){typeof window!="undefined"&&(dw=window.esprima)}var Sz,GPe=Xr();function jPe(t){if(t===null)return!1;try{var e="("+t+")",r=dw.parse(e,{range:!0});return!(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")}catch(i){return!1}}function YPe(t){var e="("+t+")",r=dw.parse(e,{range:!0}),i=[],n;if(r.type!=="Program"||r.body.length!==1||r.body[0].type!=="ExpressionStatement"||r.body[0].expression.type!=="ArrowFunctionExpression"&&r.body[0].expression.type!=="FunctionExpression")throw new Error("Failed to resolve function");return r.body[0].expression.params.forEach(function(s){i.push(s.name)}),n=r.body[0].expression.body.range,r.body[0].expression.body.type==="BlockStatement"?new Function(i,e.slice(n[0]+1,n[1]-1)):new Function(i,"return "+e.slice(n[0],n[1]))}function qPe(t){return t.toString()}function JPe(t){return Object.prototype.toString.call(t)==="[object Function]"}vz.exports=new GPe("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:jPe,construct:YPe,predicate:JPe,represent:qPe})});var Tp=E((mat,kz)=>{"use strict";var Pz=ec();kz.exports=Pz.DEFAULT=new Pz({include:[og()],explicit:[Bz(),bz(),xz()]})});var Vz=E((Eat,Mp)=>{"use strict";var Ba=$l(),Dz=ng(),WPe=M4(),Rz=og(),zPe=Tp(),QA=Object.prototype.hasOwnProperty,Cw=1,Fz=2,Nz=3,mw=4,NP=1,VPe=2,Lz=3,_Pe=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,XPe=/[\x85\u2028\u2029]/,ZPe=/[,\[\]\{\}]/,Tz=/^(?:!|!!|![a-z\-]+!)$/i,Mz=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i;function Oz(t){return Object.prototype.toString.call(t)}function wo(t){return t===10||t===13}function rc(t){return t===9||t===32}function yn(t){return t===9||t===32||t===10||t===13}function ag(t){return t===44||t===91||t===93||t===123||t===125}function $Pe(t){var e;return 48<=t&&t<=57?t-48:(e=t|32,97<=e&&e<=102?e-97+10:-1)}function eDe(t){return t===120?2:t===117?4:t===85?8:0}function tDe(t){return 48<=t&&t<=57?t-48:-1}function Kz(t){return t===48?"\0":t===97?"\x07":t===98?"\b":t===116||t===9?" ":t===110?` +`:t===118?"\v":t===102?"\f":t===114?"\r":t===101?"":t===32?" ":t===34?'"':t===47?"/":t===92?"\\":t===78?"\x85":t===95?"\xA0":t===76?"\u2028":t===80?"\u2029":""}function rDe(t){return t<=65535?String.fromCharCode(t):String.fromCharCode((t-65536>>10)+55296,(t-65536&1023)+56320)}var Uz=new Array(256),Hz=new Array(256);for(var Ag=0;Ag<256;Ag++)Uz[Ag]=Kz(Ag)?1:0,Hz[Ag]=Kz(Ag);function iDe(t,e){this.input=t,this.filename=e.filename||null,this.schema=e.schema||zPe,this.onWarning=e.onWarning||null,this.legacy=e.legacy||!1,this.json=e.json||!1,this.listener=e.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=t.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function Gz(t,e){return new Dz(e,new WPe(t.filename,t.input,t.position,t.line,t.position-t.lineStart))}function st(t,e){throw Gz(t,e)}function Ew(t,e){t.onWarning&&t.onWarning.call(null,Gz(t,e))}var jz={YAML:function(e,r,i){var n,s,o;e.version!==null&&st(e,"duplication of %YAML directive"),i.length!==1&&st(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(i[0]),n===null&&st(e,"ill-formed argument of the YAML directive"),s=parseInt(n[1],10),o=parseInt(n[2],10),s!==1&&st(e,"unacceptable YAML version of the document"),e.version=i[0],e.checkLineBreaks=o<2,o!==1&&o!==2&&Ew(e,"unsupported YAML version of the document")},TAG:function(e,r,i){var n,s;i.length!==2&&st(e,"TAG directive accepts exactly two arguments"),n=i[0],s=i[1],Tz.test(n)||st(e,"ill-formed tag handle (first argument) of the TAG directive"),QA.call(e.tagMap,n)&&st(e,'there is a previously declared suffix for "'+n+'" tag handle'),Mz.test(s)||st(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=s}};function bA(t,e,r,i){var n,s,o,a;if(e1&&(t.result+=Ba.repeat(` +`,e-1))}function nDe(t,e,r){var i,n,s,o,a,l,c,u,g=t.kind,f=t.result,h;if(h=t.input.charCodeAt(t.position),yn(h)||ag(h)||h===35||h===38||h===42||h===33||h===124||h===62||h===39||h===34||h===37||h===64||h===96||(h===63||h===45)&&(n=t.input.charCodeAt(t.position+1),yn(n)||r&&ag(n)))return!1;for(t.kind="scalar",t.result="",s=o=t.position,a=!1;h!==0;){if(h===58){if(n=t.input.charCodeAt(t.position+1),yn(n)||r&&ag(n))break}else if(h===35){if(i=t.input.charCodeAt(t.position-1),yn(i))break}else{if(t.position===t.lineStart&&Iw(t)||r&&ag(h))break;if(wo(h))if(l=t.line,c=t.lineStart,u=t.lineIndent,jr(t,!1,-1),t.lineIndent>=e){a=!0,h=t.input.charCodeAt(t.position);continue}else{t.position=o,t.line=l,t.lineStart=c,t.lineIndent=u;break}}a&&(bA(t,s,o,!1),TP(t,t.line-l),s=o=t.position,a=!1),rc(h)||(o=t.position+1),h=t.input.charCodeAt(++t.position)}return bA(t,s,o,!1),t.result?!0:(t.kind=g,t.result=f,!1)}function sDe(t,e){var r,i,n;if(r=t.input.charCodeAt(t.position),r!==39)return!1;for(t.kind="scalar",t.result="",t.position++,i=n=t.position;(r=t.input.charCodeAt(t.position))!==0;)if(r===39)if(bA(t,i,t.position,!0),r=t.input.charCodeAt(++t.position),r===39)i=t.position,t.position++,n=t.position;else return!0;else wo(r)?(bA(t,i,n,!0),TP(t,jr(t,!1,e)),i=n=t.position):t.position===t.lineStart&&Iw(t)?st(t,"unexpected end of the document within a single quoted scalar"):(t.position++,n=t.position);st(t,"unexpected end of the stream within a single quoted scalar")}function oDe(t,e){var r,i,n,s,o,a;if(a=t.input.charCodeAt(t.position),a!==34)return!1;for(t.kind="scalar",t.result="",t.position++,r=i=t.position;(a=t.input.charCodeAt(t.position))!==0;){if(a===34)return bA(t,r,t.position,!0),t.position++,!0;if(a===92){if(bA(t,r,t.position,!0),a=t.input.charCodeAt(++t.position),wo(a))jr(t,!1,e);else if(a<256&&Uz[a])t.result+=Hz[a],t.position++;else if((o=eDe(a))>0){for(n=o,s=0;n>0;n--)a=t.input.charCodeAt(++t.position),(o=$Pe(a))>=0?s=(s<<4)+o:st(t,"expected hexadecimal character");t.result+=rDe(s),t.position++}else st(t,"unknown escape sequence");r=i=t.position}else wo(a)?(bA(t,r,i,!0),TP(t,jr(t,!1,e)),r=i=t.position):t.position===t.lineStart&&Iw(t)?st(t,"unexpected end of the document within a double quoted scalar"):(t.position++,i=t.position)}st(t,"unexpected end of the stream within a double quoted scalar")}function aDe(t,e){var r=!0,i,n=t.tag,s,o=t.anchor,a,l,c,u,g,f={},h,p,d,m;if(m=t.input.charCodeAt(t.position),m===91)l=93,g=!1,s=[];else if(m===123)l=125,g=!0,s={};else return!1;for(t.anchor!==null&&(t.anchorMap[t.anchor]=s),m=t.input.charCodeAt(++t.position);m!==0;){if(jr(t,!0,e),m=t.input.charCodeAt(t.position),m===l)return t.position++,t.tag=n,t.anchor=o,t.kind=g?"mapping":"sequence",t.result=s,!0;r||st(t,"missed comma between flow collection entries"),p=h=d=null,c=u=!1,m===63&&(a=t.input.charCodeAt(t.position+1),yn(a)&&(c=u=!0,t.position++,jr(t,!0,e))),i=t.line,cg(t,e,Cw,!1,!0),p=t.tag,h=t.result,jr(t,!0,e),m=t.input.charCodeAt(t.position),(u||t.line===i)&&m===58&&(c=!0,m=t.input.charCodeAt(++t.position),jr(t,!0,e),cg(t,e,Cw,!1,!0),d=t.result),g?lg(t,s,f,p,h,d):c?s.push(lg(t,null,f,p,h,d)):s.push(h),jr(t,!0,e),m=t.input.charCodeAt(t.position),m===44?(r=!0,m=t.input.charCodeAt(++t.position)):r=!1}st(t,"unexpected end of the stream within a flow collection")}function ADe(t,e){var r,i,n=NP,s=!1,o=!1,a=e,l=0,c=!1,u,g;if(g=t.input.charCodeAt(t.position),g===124)i=!1;else if(g===62)i=!0;else return!1;for(t.kind="scalar",t.result="";g!==0;)if(g=t.input.charCodeAt(++t.position),g===43||g===45)NP===n?n=g===43?Lz:VPe:st(t,"repeat of a chomping mode identifier");else if((u=tDe(g))>=0)u===0?st(t,"bad explicit indentation width of a block scalar; it cannot be less than one"):o?st(t,"repeat of an indentation width identifier"):(a=e+u-1,o=!0);else break;if(rc(g)){do g=t.input.charCodeAt(++t.position);while(rc(g));if(g===35)do g=t.input.charCodeAt(++t.position);while(!wo(g)&&g!==0)}for(;g!==0;){for(LP(t),t.lineIndent=0,g=t.input.charCodeAt(t.position);(!o||t.lineIndenta&&(a=t.lineIndent),wo(g)){l++;continue}if(t.lineIndente)&&l!==0)st(t,"bad indentation of a sequence entry");else if(t.lineIndente)&&(cg(t,e,mw,!0,n)&&(p?f=t.result:h=t.result),p||(lg(t,c,u,g,f,h,s,o),g=f=h=null),jr(t,!0,-1),m=t.input.charCodeAt(t.position)),t.lineIndent>e&&m!==0)st(t,"bad indentation of a mapping entry");else if(t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndente?l=1:t.lineIndent===e?l=0:t.lineIndent tag; it should be "scalar", not "'+t.kind+'"'),g=0,f=t.implicitTypes.length;g tag; it should be "'+h.kind+'", not "'+t.kind+'"'),h.resolve(t.result)?(t.result=h.construct(t.result),t.anchor!==null&&(t.anchorMap[t.anchor]=t.result)):st(t,"cannot resolve a node with !<"+t.tag+"> explicit tag")):st(t,"unknown tag !<"+t.tag+">");return t.listener!==null&&t.listener("close",t),t.tag!==null||t.anchor!==null||u}function fDe(t){var e=t.position,r,i,n,s=!1,o;for(t.version=null,t.checkLineBreaks=t.legacy,t.tagMap={},t.anchorMap={};(o=t.input.charCodeAt(t.position))!==0&&(jr(t,!0,-1),o=t.input.charCodeAt(t.position),!(t.lineIndent>0||o!==37));){for(s=!0,o=t.input.charCodeAt(++t.position),r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);for(i=t.input.slice(r,t.position),n=[],i.length<1&&st(t,"directive name must not be less than one character in length");o!==0;){for(;rc(o);)o=t.input.charCodeAt(++t.position);if(o===35){do o=t.input.charCodeAt(++t.position);while(o!==0&&!wo(o));break}if(wo(o))break;for(r=t.position;o!==0&&!yn(o);)o=t.input.charCodeAt(++t.position);n.push(t.input.slice(r,t.position))}o!==0&&LP(t),QA.call(jz,i)?jz[i](t,i,n):Ew(t,'unknown document directive "'+i+'"')}if(jr(t,!0,-1),t.lineIndent===0&&t.input.charCodeAt(t.position)===45&&t.input.charCodeAt(t.position+1)===45&&t.input.charCodeAt(t.position+2)===45?(t.position+=3,jr(t,!0,-1)):s&&st(t,"directives end mark is expected"),cg(t,t.lineIndent-1,mw,!1,!0),jr(t,!0,-1),t.checkLineBreaks&&XPe.test(t.input.slice(e,t.position))&&Ew(t,"non-ASCII line breaks are interpreted as content"),t.documents.push(t.result),t.position===t.lineStart&&Iw(t)){t.input.charCodeAt(t.position)===46&&(t.position+=3,jr(t,!0,-1));return}if(t.position{"use strict";var Op=$l(),Kp=ng(),dDe=Tp(),CDe=og(),_z=Object.prototype.toString,Xz=Object.prototype.hasOwnProperty,mDe=9,Up=10,EDe=13,IDe=32,yDe=33,wDe=34,Zz=35,BDe=37,QDe=38,bDe=39,vDe=42,$z=44,SDe=45,e5=58,xDe=61,kDe=62,PDe=63,DDe=64,t5=91,r5=93,RDe=96,i5=123,FDe=124,n5=125,Ri={};Ri[0]="\\0";Ri[7]="\\a";Ri[8]="\\b";Ri[9]="\\t";Ri[10]="\\n";Ri[11]="\\v";Ri[12]="\\f";Ri[13]="\\r";Ri[27]="\\e";Ri[34]='\\"';Ri[92]="\\\\";Ri[133]="\\N";Ri[160]="\\_";Ri[8232]="\\L";Ri[8233]="\\P";var NDe=["y","Y","yes","Yes","YES","on","On","ON","n","N","no","No","NO","off","Off","OFF"];function LDe(t,e){var r,i,n,s,o,a,l;if(e===null)return{};for(r={},i=Object.keys(e),n=0,s=i.length;n0?t.charCodeAt(s-1):null,f=f&&a5(o,a)}else{for(s=0;si&&t[g+1]!==" ",g=s);else if(!ug(o))return yw;a=s>0?t.charCodeAt(s-1):null,f=f&&a5(o,a)}c=c||u&&s-g-1>i&&t[g+1]!==" "}return!l&&!c?f&&!n(t)?l5:c5:r>9&&A5(t)?yw:c?g5:u5}function jDe(t,e,r,i){t.dump=function(){if(e.length===0)return"''";if(!t.noCompatMode&&NDe.indexOf(e)!==-1)return"'"+e+"'";var n=t.indent*Math.max(1,r),s=t.lineWidth===-1?-1:Math.max(Math.min(t.lineWidth,40),t.lineWidth-n),o=i||t.flowLevel>-1&&r>=t.flowLevel;function a(l){return MDe(t,l)}switch(UDe(e,o,t.indent,s,a)){case l5:return e;case c5:return"'"+e.replace(/'/g,"''")+"'";case u5:return"|"+f5(e,t.indent)+h5(o5(e,n));case g5:return">"+f5(e,t.indent)+h5(o5(HDe(e,s),n));case yw:return'"'+GDe(e,s)+'"';default:throw new Kp("impossible error: invalid scalar style")}}()}function f5(t,e){var r=A5(t)?String(e):"",i=t[t.length-1]===` +`,n=i&&(t[t.length-2]===` +`||t===` +`),s=n?"+":i?"":"-";return r+s+` +`}function h5(t){return t[t.length-1]===` +`?t.slice(0,-1):t}function HDe(t,e){for(var r=/(\n+)([^\n]*)/g,i=function(){var c=t.indexOf(` +`);return c=c!==-1?c:t.length,r.lastIndex=c,p5(t.slice(0,c),e)}(),n=t[0]===` +`||t[0]===" ",s,o;o=r.exec(t);){var a=o[1],l=o[2];s=l[0]===" ",i+=a+(!n&&!s&&l!==""?` +`:"")+p5(l,e),n=s}return i}function p5(t,e){if(t===""||t[0]===" ")return t;for(var r=/ [^ ]/g,i,n=0,s,o=0,a=0,l="";i=r.exec(t);)a=i.index,a-n>e&&(s=o>n?o:a,l+=` +`+t.slice(n,s),n=s+1),o=a;return l+=` +`,t.length-n>e&&o>n?l+=t.slice(n,o)+` +`+t.slice(o+1):l+=t.slice(n),l.slice(1)}function GDe(t){for(var e="",r,i,n,s=0;s=55296&&r<=56319&&(i=t.charCodeAt(s+1),i>=56320&&i<=57343)){e+=s5((r-55296)*1024+i-56320+65536),s++;continue}n=Ri[r],e+=!n&&ug(r)?t[s]:n||s5(r)}return e}function YDe(t,e,r){var i="",n=t.tag,s,o;for(s=0,o=r.length;s1024&&(u+="? "),u+=t.dump+(t.condenseFlow?'"':"")+":"+(t.condenseFlow?"":" "),!!ic(t,e,c,!1,!1)&&(u+=t.dump,i+=u));t.tag=n,t.dump="{"+i+"}"}function WDe(t,e,r,i){var n="",s=t.tag,o=Object.keys(r),a,l,c,u,g,f;if(t.sortKeys===!0)o.sort();else if(typeof t.sortKeys=="function")o.sort(t.sortKeys);else if(t.sortKeys)throw new Kp("sortKeys must be a boolean or a function");for(a=0,l=o.length;a1024,g&&(t.dump&&Up===t.dump.charCodeAt(0)?f+="?":f+="? "),f+=t.dump,g&&(f+=OP(t,e)),!!ic(t,e+1,u,!0,g)&&(t.dump&&Up===t.dump.charCodeAt(0)?f+=":":f+=": ",f+=t.dump,n+=f));t.tag=s,t.dump=n||"{}"}function d5(t,e,r){var i,n,s,o,a,l;for(n=r?t.explicitTypes:t.implicitTypes,s=0,o=n.length;s tag resolver accepts not "'+l+'" style');t.dump=i}return!0}return!1}function ic(t,e,r,i,n,s){t.tag=null,t.dump=r,d5(t,r,!1)||d5(t,r,!0);var o=_z.call(t.dump);i&&(i=t.flowLevel<0||t.flowLevel>e);var a=o==="[object Object]"||o==="[object Array]",l,c;if(a&&(l=t.duplicates.indexOf(r),c=l!==-1),(t.tag!==null&&t.tag!=="?"||c||t.indent!==2&&e>0)&&(n=!1),c&&t.usedDuplicates[l])t.dump="*ref_"+l;else{if(a&&c&&!t.usedDuplicates[l]&&(t.usedDuplicates[l]=!0),o==="[object Object]")i&&Object.keys(t.dump).length!==0?(WDe(t,e,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(JDe(t,e,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump));else if(o==="[object Array]"){var u=t.noArrayIndent&&e>0?e-1:e;i&&t.dump.length!==0?(qDe(t,u,t.dump,n),c&&(t.dump="&ref_"+l+t.dump)):(YDe(t,u,t.dump),c&&(t.dump="&ref_"+l+" "+t.dump))}else if(o==="[object String]")t.tag!=="?"&&jDe(t,t.dump,e,s);else{if(t.skipInvalid)return!1;throw new Kp("unacceptable kind of an object to dump "+o)}t.tag!==null&&t.tag!=="?"&&(t.dump="!<"+t.tag+"> "+t.dump)}return!0}function zDe(t,e){var r=[],i=[],n,s;for(UP(t,r,i),n=0,s=i.length;n{"use strict";var ww=Vz(),E5=m5();function Bw(t){return function(){throw new Error("Function "+t+" is deprecated and cannot be used.")}}Qr.exports.Type=Xr();Qr.exports.Schema=ec();Qr.exports.FAILSAFE_SCHEMA=pw();Qr.exports.JSON_SCHEMA=DP();Qr.exports.CORE_SCHEMA=RP();Qr.exports.DEFAULT_SAFE_SCHEMA=og();Qr.exports.DEFAULT_FULL_SCHEMA=Tp();Qr.exports.load=ww.load;Qr.exports.loadAll=ww.loadAll;Qr.exports.safeLoad=ww.safeLoad;Qr.exports.safeLoadAll=ww.safeLoadAll;Qr.exports.dump=E5.dump;Qr.exports.safeDump=E5.safeDump;Qr.exports.YAMLException=ng();Qr.exports.MINIMAL_SCHEMA=pw();Qr.exports.SAFE_SCHEMA=og();Qr.exports.DEFAULT_SCHEMA=Tp();Qr.exports.scan=Bw("scan");Qr.exports.parse=Bw("parse");Qr.exports.compose=Bw("compose");Qr.exports.addConstructor=Bw("addConstructor")});var w5=E((wat,y5)=>{"use strict";var _De=I5();y5.exports=_De});var Q5=E((Bat,B5)=>{"use strict";function XDe(t,e){function r(){this.constructor=t}r.prototype=e.prototype,t.prototype=new r}function nc(t,e,r,i){this.message=t,this.expected=e,this.found=r,this.location=i,this.name="SyntaxError",typeof Error.captureStackTrace=="function"&&Error.captureStackTrace(this,nc)}XDe(nc,Error);nc.buildMessage=function(t,e){var r={literal:function(c){return'"'+n(c.text)+'"'},class:function(c){var u="",g;for(g=0;g0){for(g=1,f=1;g({[xe]:le})))},H=function(x){return x},L=function(x){return x},K=Yo("correct indentation"),J=" ",ne=fr(" ",!1),q=function(x){return x.length===Zc*aE},A=function(x){return x.length===(Zc+1)*aE},V=function(){return Zc++,!0},W=function(){return Zc--,!0},X=function(){return Xm()},F=Yo("pseudostring"),D=/^[^\r\n\t ?:,\][{}#&*!|>'"%@`\-]/,he=Bs(["\r",` +`," "," ","?",":",",","]","[","{","}","#","&","*","!","|",">","'",'"',"%","@","`","-"],!0,!1),pe=/^[^\r\n\t ,\][{}:#"']/,Ne=Bs(["\r",` +`," "," ",",","]","[","{","}",":","#",'"',"'"],!0,!1),Pe=function(){return Xm().replace(/^ *| *$/g,"")},qe="--",re=fr("--",!1),se=/^[a-zA-Z\/0-9]/,be=Bs([["a","z"],["A","Z"],"/",["0","9"]],!1,!1),ae=/^[^\r\n\t :,]/,Ae=Bs(["\r",` +`," "," ",":",","],!0,!1),De="null",$=fr("null",!1),G=function(){return null},Ce="true",ee=fr("true",!1),Ue=function(){return!0},Oe="false",vt=fr("false",!1),dt=function(){return!1},ri=Yo("string"),ii='"',an=fr('"',!1),yr=function(){return""},Ki=function(x){return x},Qi=function(x){return x.join("")},Go=/^[^"\\\0-\x1F\x7F]/,wr=Bs(['"',"\\",["\0",""],"\x7F"],!0,!1),Ui='\\"',ws=fr('\\"',!1),Tf=function(){return'"'},Mf="\\\\",Rm=fr("\\\\",!1),Fm=function(){return"\\"},Nm="\\/",DQ=fr("\\/",!1),RQ=function(){return"/"},Of="\\b",FQ=fr("\\b",!1),NQ=function(){return"\b"},Lm="\\f",LQ=fr("\\f",!1),Va=function(){return"\f"},jo="\\n",Tm=fr("\\n",!1),Mm=function(){return` +`},te="\\r",Om=fr("\\r",!1),Km=function(){return"\r"},il="\\t",Um=fr("\\t",!1),Hm=function(){return" "},Kf="\\u",Gm=fr("\\u",!1),jm=function(x,U,le,xe){return String.fromCharCode(parseInt(`0x${x}${U}${le}${xe}`))},TQ=/^[0-9a-fA-F]/,MQ=Bs([["0","9"],["a","f"],["A","F"]],!1,!1),Ym=Yo("blank space"),qm=/^[ \t]/,Jm=Bs([" "," "],!1,!1),Wm=Yo("white space"),zm=/^[ \t\n\r]/,Vm=Bs([" "," ",` +`,"\r"],!1,!1),Uf=`\r +`,OQ=fr(`\r +`,!1),KQ=` +`,_m=fr(` +`,!1),UQ="\r",HQ=fr("\r",!1),O=0,ht=0,Vc=[{line:1,column:1}],xn=0,Hf=[],Ye=0,nl;if("startRule"in e){if(!(e.startRule in i))throw new Error(`Can't start parsing from rule "`+e.startRule+'".');n=i[e.startRule]}function Xm(){return t.substring(ht,O)}function MM(){return _a(ht,O)}function GQ(x,U){throw U=U!==void 0?U:_a(ht,O),eE([Yo(x)],t.substring(ht,O),U)}function OM(x,U){throw U=U!==void 0?U:_a(ht,O),YQ(x,U)}function fr(x,U){return{type:"literal",text:x,ignoreCase:U}}function Bs(x,U,le){return{type:"class",parts:x,inverted:U,ignoreCase:le}}function jQ(){return{type:"any"}}function Zm(){return{type:"end"}}function Yo(x){return{type:"other",description:x}}function $m(x){var U=Vc[x],le;if(U)return U;for(le=x-1;!Vc[le];)le--;for(U=Vc[le],U={line:U.line,column:U.column};lexn&&(xn=O,Hf=[]),Hf.push(x))}function YQ(x,U){return new nc(x,null,null,U)}function eE(x,U,le){return new nc(nc.buildMessage(x,U),x,U,le)}function tE(){var x;return x=ol(),x}function Xa(){var x,U,le;for(x=O,U=[],le=sl();le!==r;)U.push(le),le=sl();return U!==r&&(ht=x,U=s(U)),x=U,x}function sl(){var x,U,le,xe,Qe;return x=O,U=Al(),U!==r?(t.charCodeAt(O)===45?(le=o,O++):(le=r,Ye===0&&et(a)),le!==r?(xe=xr(),xe!==r?(Qe=qo(),Qe!==r?(ht=x,U=l(Qe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x}function ol(){var x,U,le;for(x=O,U=[],le=al();le!==r;)U.push(le),le=al();return U!==r&&(ht=x,U=c(U)),x=U,x}function al(){var x,U,le,xe,Qe,Ge,ct,sr,Wo;if(x=O,U=xr(),U===r&&(U=null),U!==r){if(le=O,t.charCodeAt(O)===35?(xe=u,O++):(xe=r,Ye===0&&et(g)),xe!==r){if(Qe=[],Ge=O,ct=O,Ye++,sr=Zs(),Ye--,sr===r?ct=void 0:(O=ct,ct=r),ct!==r?(t.length>O?(sr=t.charAt(O),O++):(sr=r,Ye===0&&et(f)),sr!==r?(ct=[ct,sr],Ge=ct):(O=Ge,Ge=r)):(O=Ge,Ge=r),Ge!==r)for(;Ge!==r;)Qe.push(Ge),Ge=O,ct=O,Ye++,sr=Zs(),Ye--,sr===r?ct=void 0:(O=ct,ct=r),ct!==r?(t.length>O?(sr=t.charAt(O),O++):(sr=r,Ye===0&&et(f)),sr!==r?(ct=[ct,sr],Ge=ct):(O=Ge,Ge=r)):(O=Ge,Ge=r);else Qe=r;Qe!==r?(xe=[xe,Qe],le=xe):(O=le,le=r)}else O=le,le=r;if(le===r&&(le=null),le!==r){if(xe=[],Qe=Jo(),Qe!==r)for(;Qe!==r;)xe.push(Qe),Qe=Jo();else xe=r;xe!==r?(ht=x,U=h(),x=U):(O=x,x=r)}else O=x,x=r}else O=x,x=r;if(x===r&&(x=O,U=Al(),U!==r?(le=JQ(),le!==r?(xe=xr(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(O)===58?(Qe=p,O++):(Qe=r,Ye===0&&et(d)),Qe!==r?(Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(ct=qo(),ct!==r?(ht=x,U=m(le,ct),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,U=Al(),U!==r?(le=ll(),le!==r?(xe=xr(),xe===r&&(xe=null),xe!==r?(t.charCodeAt(O)===58?(Qe=p,O++):(Qe=r,Ye===0&&et(d)),Qe!==r?(Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(ct=qo(),ct!==r?(ht=x,U=m(le,ct),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r))){if(x=O,U=Al(),U!==r)if(le=ll(),le!==r)if(xe=xr(),xe!==r)if(Qe=nE(),Qe!==r){if(Ge=[],ct=Jo(),ct!==r)for(;ct!==r;)Ge.push(ct),ct=Jo();else Ge=r;Ge!==r?(ht=x,U=m(le,Qe),x=U):(O=x,x=r)}else O=x,x=r;else O=x,x=r;else O=x,x=r;else O=x,x=r;if(x===r)if(x=O,U=Al(),U!==r)if(le=ll(),le!==r){if(xe=[],Qe=O,Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(O)===44?(ct=I,O++):(ct=r,Ye===0&&et(B)),ct!==r?(sr=xr(),sr===r&&(sr=null),sr!==r?(Wo=ll(),Wo!==r?(ht=Qe,Ge=b(le,Wo),Qe=Ge):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r),Qe!==r)for(;Qe!==r;)xe.push(Qe),Qe=O,Ge=xr(),Ge===r&&(Ge=null),Ge!==r?(t.charCodeAt(O)===44?(ct=I,O++):(ct=r,Ye===0&&et(B)),ct!==r?(sr=xr(),sr===r&&(sr=null),sr!==r?(Wo=ll(),Wo!==r?(ht=Qe,Ge=b(le,Wo),Qe=Ge):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r)):(O=Qe,Qe=r);else xe=r;xe!==r?(Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(t.charCodeAt(O)===58?(Ge=p,O++):(Ge=r,Ye===0&&et(d)),Ge!==r?(ct=xr(),ct===r&&(ct=null),ct!==r?(sr=qo(),sr!==r?(ht=x,U=R(le,xe,sr),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)}else O=x,x=r;else O=x,x=r}return x}function qo(){var x,U,le,xe,Qe,Ge,ct;if(x=O,U=O,Ye++,le=O,xe=Zs(),xe!==r?(Qe=qQ(),Qe!==r?(t.charCodeAt(O)===45?(Ge=o,O++):(Ge=r,Ye===0&&et(a)),Ge!==r?(ct=xr(),ct!==r?(xe=[xe,Qe,Ge,ct],le=xe):(O=le,le=r)):(O=le,le=r)):(O=le,le=r)):(O=le,le=r),Ye--,le!==r?(O=U,U=void 0):U=r,U!==r?(le=Jo(),le!==r?(xe=rE(),xe!==r?(Qe=Xa(),Qe!==r?(Ge=iE(),Ge!==r?(ht=x,U=H(Qe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,U=Zs(),U!==r?(le=rE(),le!==r?(xe=ol(),xe!==r?(Qe=iE(),Qe!==r?(ht=x,U=H(xe),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r),x===r))if(x=O,U=WQ(),U!==r){if(le=[],xe=Jo(),xe!==r)for(;xe!==r;)le.push(xe),xe=Jo();else le=r;le!==r?(ht=x,U=L(U),x=U):(O=x,x=r)}else O=x,x=r;return x}function Al(){var x,U,le;for(Ye++,x=O,U=[],t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));le!==r;)U.push(le),t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));return U!==r?(ht=O,le=q(U),le?le=void 0:le=r,le!==r?(U=[U,le],x=U):(O=x,x=r)):(O=x,x=r),Ye--,x===r&&(U=r,Ye===0&&et(K)),x}function qQ(){var x,U,le;for(x=O,U=[],t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));le!==r;)U.push(le),t.charCodeAt(O)===32?(le=J,O++):(le=r,Ye===0&&et(ne));return U!==r?(ht=O,le=A(U),le?le=void 0:le=r,le!==r?(U=[U,le],x=U):(O=x,x=r)):(O=x,x=r),x}function rE(){var x;return ht=O,x=V(),x?x=void 0:x=r,x}function iE(){var x;return ht=O,x=W(),x?x=void 0:x=r,x}function JQ(){var x;return x=cl(),x===r&&(x=Gf()),x}function ll(){var x,U,le;if(x=cl(),x===r){if(x=O,U=[],le=_c(),le!==r)for(;le!==r;)U.push(le),le=_c();else U=r;U!==r&&(ht=x,U=X()),x=U}return x}function WQ(){var x;return x=jf(),x===r&&(x=sE(),x===r&&(x=cl(),x===r&&(x=Gf()))),x}function nE(){var x;return x=jf(),x===r&&(x=cl(),x===r&&(x=_c())),x}function Gf(){var x,U,le,xe,Qe,Ge;if(Ye++,x=O,D.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(he)),U!==r){for(le=[],xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(pe.test(t.charAt(O))?(Ge=t.charAt(O),O++):(Ge=r,Ye===0&&et(Ne)),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);xe!==r;)le.push(xe),xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(pe.test(t.charAt(O))?(Ge=t.charAt(O),O++):(Ge=r,Ye===0&&et(Ne)),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);le!==r?(ht=x,U=Pe(),x=U):(O=x,x=r)}else O=x,x=r;return Ye--,x===r&&(U=r,Ye===0&&et(F)),x}function _c(){var x,U,le,xe,Qe;if(x=O,t.substr(O,2)===qe?(U=qe,O+=2):(U=r,Ye===0&&et(re)),U===r&&(U=null),U!==r)if(se.test(t.charAt(O))?(le=t.charAt(O),O++):(le=r,Ye===0&&et(be)),le!==r){for(xe=[],ae.test(t.charAt(O))?(Qe=t.charAt(O),O++):(Qe=r,Ye===0&&et(Ae));Qe!==r;)xe.push(Qe),ae.test(t.charAt(O))?(Qe=t.charAt(O),O++):(Qe=r,Ye===0&&et(Ae));xe!==r?(ht=x,U=Pe(),x=U):(O=x,x=r)}else O=x,x=r;else O=x,x=r;return x}function jf(){var x,U;return x=O,t.substr(O,4)===De?(U=De,O+=4):(U=r,Ye===0&&et($)),U!==r&&(ht=x,U=G()),x=U,x}function sE(){var x,U;return x=O,t.substr(O,4)===Ce?(U=Ce,O+=4):(U=r,Ye===0&&et(ee)),U!==r&&(ht=x,U=Ue()),x=U,x===r&&(x=O,t.substr(O,5)===Oe?(U=Oe,O+=5):(U=r,Ye===0&&et(vt)),U!==r&&(ht=x,U=dt()),x=U),x}function cl(){var x,U,le,xe;return Ye++,x=O,t.charCodeAt(O)===34?(U=ii,O++):(U=r,Ye===0&&et(an)),U!==r?(t.charCodeAt(O)===34?(le=ii,O++):(le=r,Ye===0&&et(an)),le!==r?(ht=x,U=yr(),x=U):(O=x,x=r)):(O=x,x=r),x===r&&(x=O,t.charCodeAt(O)===34?(U=ii,O++):(U=r,Ye===0&&et(an)),U!==r?(le=oE(),le!==r?(t.charCodeAt(O)===34?(xe=ii,O++):(xe=r,Ye===0&&et(an)),xe!==r?(ht=x,U=Ki(le),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)),Ye--,x===r&&(U=r,Ye===0&&et(ri)),x}function oE(){var x,U,le;if(x=O,U=[],le=Yf(),le!==r)for(;le!==r;)U.push(le),le=Yf();else U=r;return U!==r&&(ht=x,U=Qi(U)),x=U,x}function Yf(){var x,U,le,xe,Qe,Ge;return Go.test(t.charAt(O))?(x=t.charAt(O),O++):(x=r,Ye===0&&et(wr)),x===r&&(x=O,t.substr(O,2)===Ui?(U=Ui,O+=2):(U=r,Ye===0&&et(ws)),U!==r&&(ht=x,U=Tf()),x=U,x===r&&(x=O,t.substr(O,2)===Mf?(U=Mf,O+=2):(U=r,Ye===0&&et(Rm)),U!==r&&(ht=x,U=Fm()),x=U,x===r&&(x=O,t.substr(O,2)===Nm?(U=Nm,O+=2):(U=r,Ye===0&&et(DQ)),U!==r&&(ht=x,U=RQ()),x=U,x===r&&(x=O,t.substr(O,2)===Of?(U=Of,O+=2):(U=r,Ye===0&&et(FQ)),U!==r&&(ht=x,U=NQ()),x=U,x===r&&(x=O,t.substr(O,2)===Lm?(U=Lm,O+=2):(U=r,Ye===0&&et(LQ)),U!==r&&(ht=x,U=Va()),x=U,x===r&&(x=O,t.substr(O,2)===jo?(U=jo,O+=2):(U=r,Ye===0&&et(Tm)),U!==r&&(ht=x,U=Mm()),x=U,x===r&&(x=O,t.substr(O,2)===te?(U=te,O+=2):(U=r,Ye===0&&et(Om)),U!==r&&(ht=x,U=Km()),x=U,x===r&&(x=O,t.substr(O,2)===il?(U=il,O+=2):(U=r,Ye===0&&et(Um)),U!==r&&(ht=x,U=Hm()),x=U,x===r&&(x=O,t.substr(O,2)===Kf?(U=Kf,O+=2):(U=r,Ye===0&&et(Gm)),U!==r?(le=Xc(),le!==r?(xe=Xc(),xe!==r?(Qe=Xc(),Qe!==r?(Ge=Xc(),Ge!==r?(ht=x,U=jm(le,xe,Qe,Ge),x=U):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)):(O=x,x=r)))))))))),x}function Xc(){var x;return TQ.test(t.charAt(O))?(x=t.charAt(O),O++):(x=r,Ye===0&&et(MQ)),x}function xr(){var x,U;if(Ye++,x=[],qm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Jm)),U!==r)for(;U!==r;)x.push(U),qm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Jm));else x=r;return Ye--,x===r&&(U=r,Ye===0&&et(Ym)),x}function KM(){var x,U;if(Ye++,x=[],zm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Vm)),U!==r)for(;U!==r;)x.push(U),zm.test(t.charAt(O))?(U=t.charAt(O),O++):(U=r,Ye===0&&et(Vm));else x=r;return Ye--,x===r&&(U=r,Ye===0&&et(Wm)),x}function Jo(){var x,U,le,xe,Qe,Ge;if(x=O,U=Zs(),U!==r){for(le=[],xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(Ge=Zs(),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);xe!==r;)le.push(xe),xe=O,Qe=xr(),Qe===r&&(Qe=null),Qe!==r?(Ge=Zs(),Ge!==r?(Qe=[Qe,Ge],xe=Qe):(O=xe,xe=r)):(O=xe,xe=r);le!==r?(U=[U,le],x=U):(O=x,x=r)}else O=x,x=r;return x}function Zs(){var x;return t.substr(O,2)===Uf?(x=Uf,O+=2):(x=r,Ye===0&&et(OQ)),x===r&&(t.charCodeAt(O)===10?(x=KQ,O++):(x=r,Ye===0&&et(_m)),x===r&&(t.charCodeAt(O)===13?(x=UQ,O++):(x=r,Ye===0&&et(HQ)))),x}let aE=2,Zc=0;if(nl=n(),nl!==r&&O===t.length)return nl;throw nl!==r&&O{var fRe=typeof global=="object"&&global&&global.Object===Object&&global;V5.exports=fRe});var Ks=E((Zat,_5)=>{var hRe=WP(),pRe=typeof self=="object"&&self&&self.Object===Object&&self,dRe=hRe||pRe||Function("return this")();_5.exports=dRe});var ac=E(($at,X5)=>{var CRe=Ks(),mRe=CRe.Symbol;X5.exports=mRe});var $5=E((eAt,Z5)=>{function ERe(t,e){for(var r=-1,i=t==null?0:t.length,n=Array(i);++r{var IRe=Array.isArray;e6.exports=IRe});var n6=E((rAt,t6)=>{var r6=ac(),i6=Object.prototype,yRe=i6.hasOwnProperty,wRe=i6.toString,Jp=r6?r6.toStringTag:void 0;function BRe(t){var e=yRe.call(t,Jp),r=t[Jp];try{t[Jp]=void 0;var i=!0}catch(s){}var n=wRe.call(t);return i&&(e?t[Jp]=r:delete t[Jp]),n}t6.exports=BRe});var o6=E((iAt,s6)=>{var QRe=Object.prototype,bRe=QRe.toString;function vRe(t){return bRe.call(t)}s6.exports=vRe});var Ac=E((nAt,a6)=>{var A6=ac(),SRe=n6(),xRe=o6(),kRe="[object Null]",PRe="[object Undefined]",l6=A6?A6.toStringTag:void 0;function DRe(t){return t==null?t===void 0?PRe:kRe:l6&&l6 in Object(t)?SRe(t):xRe(t)}a6.exports=DRe});var Qo=E((sAt,c6)=>{function RRe(t){return t!=null&&typeof t=="object"}c6.exports=RRe});var Nw=E((oAt,u6)=>{var FRe=Ac(),NRe=Qo(),LRe="[object Symbol]";function TRe(t){return typeof t=="symbol"||NRe(t)&&FRe(t)==LRe}u6.exports=TRe});var C6=E((aAt,g6)=>{var f6=ac(),MRe=$5(),ORe=As(),KRe=Nw(),URe=1/0,h6=f6?f6.prototype:void 0,p6=h6?h6.toString:void 0;function d6(t){if(typeof t=="string")return t;if(ORe(t))return MRe(t,d6)+"";if(KRe(t))return p6?p6.call(t):"";var e=t+"";return e=="0"&&1/t==-URe?"-0":e}g6.exports=d6});var gg=E((AAt,m6)=>{var HRe=C6();function GRe(t){return t==null?"":HRe(t)}m6.exports=GRe});var zP=E((lAt,E6)=>{function jRe(t,e,r){var i=-1,n=t.length;e<0&&(e=-e>n?0:n+e),r=r>n?n:r,r<0&&(r+=n),n=e>r?0:r-e>>>0,e>>>=0;for(var s=Array(n);++i{var YRe=zP();function qRe(t,e,r){var i=t.length;return r=r===void 0?i:r,!e&&r>=i?t:YRe(t,e,r)}I6.exports=qRe});var VP=E((uAt,w6)=>{var JRe="\\ud800-\\udfff",WRe="\\u0300-\\u036f",zRe="\\ufe20-\\ufe2f",VRe="\\u20d0-\\u20ff",_Re=WRe+zRe+VRe,XRe="\\ufe0e\\ufe0f",ZRe="\\u200d",$Re=RegExp("["+ZRe+JRe+_Re+XRe+"]");function eFe(t){return $Re.test(t)}w6.exports=eFe});var Q6=E((gAt,B6)=>{function tFe(t){return t.split("")}B6.exports=tFe});var R6=E((fAt,b6)=>{var v6="\\ud800-\\udfff",rFe="\\u0300-\\u036f",iFe="\\ufe20-\\ufe2f",nFe="\\u20d0-\\u20ff",sFe=rFe+iFe+nFe,oFe="\\ufe0e\\ufe0f",aFe="["+v6+"]",_P="["+sFe+"]",XP="\\ud83c[\\udffb-\\udfff]",AFe="(?:"+_P+"|"+XP+")",S6="[^"+v6+"]",x6="(?:\\ud83c[\\udde6-\\uddff]){2}",k6="[\\ud800-\\udbff][\\udc00-\\udfff]",lFe="\\u200d",P6=AFe+"?",D6="["+oFe+"]?",cFe="(?:"+lFe+"(?:"+[S6,x6,k6].join("|")+")"+D6+P6+")*",uFe=D6+P6+cFe,gFe="(?:"+[S6+_P+"?",_P,x6,k6,aFe].join("|")+")",fFe=RegExp(XP+"(?="+XP+")|"+gFe+uFe,"g");function hFe(t){return t.match(fFe)||[]}b6.exports=hFe});var N6=E((hAt,F6)=>{var pFe=Q6(),dFe=VP(),CFe=R6();function mFe(t){return dFe(t)?CFe(t):pFe(t)}F6.exports=mFe});var T6=E((pAt,L6)=>{var EFe=y6(),IFe=VP(),yFe=N6(),wFe=gg();function BFe(t){return function(e){e=wFe(e);var r=IFe(e)?yFe(e):void 0,i=r?r[0]:e.charAt(0),n=r?EFe(r,1).join(""):e.slice(1);return i[t]()+n}}L6.exports=BFe});var O6=E((dAt,M6)=>{var QFe=T6(),bFe=QFe("toUpperCase");M6.exports=bFe});var ZP=E((CAt,K6)=>{var vFe=gg(),SFe=O6();function xFe(t){return SFe(vFe(t).toLowerCase())}K6.exports=xFe});var H6=E((mAt,U6)=>{"use strict";U6.exports=(t,...e)=>new Promise(r=>{r(t(...e))})});var Wp=E((EAt,$P)=>{"use strict";var kFe=H6(),G6=t=>{if(t<1)throw new TypeError("Expected `concurrency` to be a number from 1 and up");let e=[],r=0,i=()=>{r--,e.length>0&&e.shift()()},n=(a,l,...c)=>{r++;let u=kFe(a,...c);l(u),u.then(i,i)},s=(a,l,...c)=>{rnew Promise(c=>s(a,c,...l));return Object.defineProperties(o,{activeCount:{get:()=>r},pendingCount:{get:()=>e.length}}),o};$P.exports=G6;$P.exports.default=G6});var X6=E((FAt,Mw)=>{function PFe(){var t=0,e=1,r=2,i=3,n=4,s=5,o=6,a=7,l=8,c=9,u=10,g=11,f=12,h=13,p=14,d=15,m=16,I=17,B=0,b=1,R=2,H=3,L=4;function K(A,V){return 55296<=A.charCodeAt(V)&&A.charCodeAt(V)<=56319&&56320<=A.charCodeAt(V+1)&&A.charCodeAt(V+1)<=57343}function J(A,V){V===void 0&&(V=0);var W=A.charCodeAt(V);if(55296<=W&&W<=56319&&V=1){var X=A.charCodeAt(V-1),F=W;return 55296<=X&&X<=56319?(X-55296)*1024+(F-56320)+65536:F}return W}function ne(A,V,W){var X=[A].concat(V).concat([W]),F=X[X.length-2],D=W,he=X.lastIndexOf(p);if(he>1&&X.slice(1,he).every(function(Pe){return Pe==i})&&[i,h,I].indexOf(A)==-1)return R;var pe=X.lastIndexOf(n);if(pe>0&&X.slice(1,pe).every(function(Pe){return Pe==n})&&[f,n].indexOf(F)==-1)return X.filter(function(Pe){return Pe==n}).length%2==1?H:L;if(F==t&&D==e)return B;if(F==r||F==t||F==e)return D==p&&V.every(function(Pe){return Pe==i})?R:b;if(D==r||D==t||D==e)return b;if(F==o&&(D==o||D==a||D==c||D==u))return B;if((F==c||F==a)&&(D==a||D==l))return B;if((F==u||F==l)&&D==l)return B;if(D==i||D==d)return B;if(D==s)return B;if(F==f)return B;var Ne=X.indexOf(i)!=-1?X.lastIndexOf(i)-1:X.length-2;return[h,I].indexOf(X[Ne])!=-1&&X.slice(Ne+1,-1).every(function(Pe){return Pe==i})&&D==p||F==d&&[m,I].indexOf(D)!=-1?B:V.indexOf(n)!=-1?R:F==n&&D==n?B:b}this.nextBreak=function(A,V){if(V===void 0&&(V=0),V<0)return 0;if(V>=A.length-1)return A.length;for(var W=q(J(A,V)),X=[],F=V+1;F{var DFe=X6(),RFe=/^(.*?)(\x1b\[[^m]+m|\x1b\]8;;.*?(\x1b\\|\u0007))/,FFe=new DFe;Z6.exports=(t,e=0,r=t.length)=>{if(e<0||r<0)throw new RangeError("Negative indices aren't supported by this implementation");let i=r-e,n="",s=0,o=0;for(;t.length>0;){let a=t.match(RFe)||[t,t,void 0],l=FFe.splitGraphemes(a[1]),c=Math.min(e-s,l.length);l=l.slice(c);let u=Math.min(i-o,l.length);n+=l.slice(0,u).join(""),s+=c,o+=u,typeof a[2]!="undefined"&&(n+=a[2]),t=t.slice(a[0].length)}return n}});var fg=E((alt,f9)=>{"use strict";var h9=new Map([["C","cwd"],["f","file"],["z","gzip"],["P","preservePaths"],["U","unlink"],["strip-components","strip"],["stripComponents","strip"],["keep-newer","newer"],["keepNewer","newer"],["keep-newer-files","newer"],["keepNewerFiles","newer"],["k","keep"],["keep-existing","keep"],["keepExisting","keep"],["m","noMtime"],["no-mtime","noMtime"],["p","preserveOwner"],["L","follow"],["h","follow"]]),olt=f9.exports=t=>t?Object.keys(t).map(e=>[h9.has(e)?h9.get(e):e,t[e]]).reduce((e,r)=>(e[r[0]]=r[1],e),Object.create(null)):{}});var hg=E((Alt,p9)=>{"use strict";var JFe=require("events"),d9=require("stream"),_p=Rh(),C9=require("string_decoder").StringDecoder,va=Symbol("EOF"),Xp=Symbol("maybeEmitEnd"),xA=Symbol("emittedEnd"),Gw=Symbol("emittingEnd"),jw=Symbol("closed"),m9=Symbol("read"),iD=Symbol("flush"),E9=Symbol("flushChunk"),Bn=Symbol("encoding"),Sa=Symbol("decoder"),Yw=Symbol("flowing"),Zp=Symbol("paused"),$p=Symbol("resume"),rn=Symbol("bufferLength"),I9=Symbol("bufferPush"),nD=Symbol("bufferShift"),Ni=Symbol("objectMode"),Li=Symbol("destroyed"),y9=global._MP_NO_ITERATOR_SYMBOLS_!=="1",WFe=y9&&Symbol.asyncIterator||Symbol("asyncIterator not implemented"),zFe=y9&&Symbol.iterator||Symbol("iterator not implemented"),w9=t=>t==="end"||t==="finish"||t==="prefinish",VFe=t=>t instanceof ArrayBuffer||typeof t=="object"&&t.constructor&&t.constructor.name==="ArrayBuffer"&&t.byteLength>=0,_Fe=t=>!Buffer.isBuffer(t)&&ArrayBuffer.isView(t);p9.exports=class B9 extends d9{constructor(e){super();this[Yw]=!1,this[Zp]=!1,this.pipes=new _p,this.buffer=new _p,this[Ni]=e&&e.objectMode||!1,this[Ni]?this[Bn]=null:this[Bn]=e&&e.encoding||null,this[Bn]==="buffer"&&(this[Bn]=null),this[Sa]=this[Bn]?new C9(this[Bn]):null,this[va]=!1,this[xA]=!1,this[Gw]=!1,this[jw]=!1,this.writable=!0,this.readable=!0,this[rn]=0,this[Li]=!1}get bufferLength(){return this[rn]}get encoding(){return this[Bn]}set encoding(e){if(this[Ni])throw new Error("cannot set encoding in objectMode");if(this[Bn]&&e!==this[Bn]&&(this[Sa]&&this[Sa].lastNeed||this[rn]))throw new Error("cannot change encoding");this[Bn]!==e&&(this[Sa]=e?new C9(e):null,this.buffer.length&&(this.buffer=this.buffer.map(r=>this[Sa].write(r)))),this[Bn]=e}setEncoding(e){this.encoding=e}get objectMode(){return this[Ni]}set objectMode(e){this[Ni]=this[Ni]||!!e}write(e,r,i){if(this[va])throw new Error("write after end");return this[Li]?(this.emit("error",Object.assign(new Error("Cannot call write after a stream was destroyed"),{code:"ERR_STREAM_DESTROYED"})),!0):(typeof r=="function"&&(i=r,r="utf8"),r||(r="utf8"),!this[Ni]&&!Buffer.isBuffer(e)&&(_Fe(e)?e=Buffer.from(e.buffer,e.byteOffset,e.byteLength):VFe(e)?e=Buffer.from(e):typeof e!="string"&&(this.objectMode=!0)),!this.objectMode&&!e.length?(this[rn]!==0&&this.emit("readable"),i&&i(),this.flowing):(typeof e=="string"&&!this[Ni]&&!(r===this[Bn]&&!this[Sa].lastNeed)&&(e=Buffer.from(e,r)),Buffer.isBuffer(e)&&this[Bn]&&(e=this[Sa].write(e)),this.flowing?(this[rn]!==0&&this[iD](!0),this.emit("data",e)):this[I9](e),this[rn]!==0&&this.emit("readable"),i&&i(),this.flowing))}read(e){if(this[Li])return null;try{return this[rn]===0||e===0||e>this[rn]?null:(this[Ni]&&(e=null),this.buffer.length>1&&!this[Ni]&&(this.encoding?this.buffer=new _p([Array.from(this.buffer).join("")]):this.buffer=new _p([Buffer.concat(Array.from(this.buffer),this[rn])])),this[m9](e||null,this.buffer.head.value))}finally{this[Xp]()}}[m9](e,r){return e===r.length||e===null?this[nD]():(this.buffer.head.value=r.slice(e),r=r.slice(0,e),this[rn]-=e),this.emit("data",r),!this.buffer.length&&!this[va]&&this.emit("drain"),r}end(e,r,i){return typeof e=="function"&&(i=e,e=null),typeof r=="function"&&(i=r,r="utf8"),e&&this.write(e,r),i&&this.once("end",i),this[va]=!0,this.writable=!1,(this.flowing||!this[Zp])&&this[Xp](),this}[$p](){this[Li]||(this[Zp]=!1,this[Yw]=!0,this.emit("resume"),this.buffer.length?this[iD]():this[va]?this[Xp]():this.emit("drain"))}resume(){return this[$p]()}pause(){this[Yw]=!1,this[Zp]=!0}get destroyed(){return this[Li]}get flowing(){return this[Yw]}get paused(){return this[Zp]}[I9](e){return this[Ni]?this[rn]+=1:this[rn]+=e.length,this.buffer.push(e)}[nD](){return this.buffer.length&&(this[Ni]?this[rn]-=1:this[rn]-=this.buffer.head.value.length),this.buffer.shift()}[iD](e){do;while(this[E9](this[nD]()));!e&&!this.buffer.length&&!this[va]&&this.emit("drain")}[E9](e){return e?(this.emit("data",e),this.flowing):!1}pipe(e,r){if(this[Li])return;let i=this[xA];r=r||{},e===process.stdout||e===process.stderr?r.end=!1:r.end=r.end!==!1;let n={dest:e,opts:r,ondrain:s=>this[$p]()};return this.pipes.push(n),e.on("drain",n.ondrain),this[$p](),i&&n.opts.end&&n.dest.end(),e}addListener(e,r){return this.on(e,r)}on(e,r){try{return super.on(e,r)}finally{e==="data"&&!this.pipes.length&&!this.flowing?this[$p]():w9(e)&&this[xA]&&(super.emit(e),this.removeAllListeners(e))}}get emittedEnd(){return this[xA]}[Xp](){!this[Gw]&&!this[xA]&&!this[Li]&&this.buffer.length===0&&this[va]&&(this[Gw]=!0,this.emit("end"),this.emit("prefinish"),this.emit("finish"),this[jw]&&this.emit("close"),this[Gw]=!1)}emit(e,r){if(e!=="error"&&e!=="close"&&e!==Li&&this[Li])return;if(e==="data"){if(!r)return;this.pipes.length&&this.pipes.forEach(n=>n.dest.write(r)===!1&&this.pause())}else if(e==="end"){if(this[xA]===!0)return;this[xA]=!0,this.readable=!1,this[Sa]&&(r=this[Sa].end(),r&&(this.pipes.forEach(n=>n.dest.write(r)),super.emit("data",r))),this.pipes.forEach(n=>{n.dest.removeListener("drain",n.ondrain),n.opts.end&&n.dest.end()})}else if(e==="close"&&(this[jw]=!0,!this[xA]&&!this[Li]))return;let i=new Array(arguments.length);if(i[0]=e,i[1]=r,arguments.length>2)for(let n=2;n{e.push(i),this[Ni]||(e.dataLength+=i.length)}),r.then(()=>e)}concat(){return this[Ni]?Promise.reject(new Error("cannot concat in objectMode")):this.collect().then(e=>this[Ni]?Promise.reject(new Error("cannot concat in objectMode")):this[Bn]?e.join(""):Buffer.concat(e,e.dataLength))}promise(){return new Promise((e,r)=>{this.on(Li,()=>r(new Error("stream destroyed"))),this.on("end",()=>e()),this.on("error",i=>r(i))})}[WFe](){return{next:()=>{let r=this.read();if(r!==null)return Promise.resolve({done:!1,value:r});if(this[va])return Promise.resolve({done:!0});let i=null,n=null,s=c=>{this.removeListener("data",o),this.removeListener("end",a),n(c)},o=c=>{this.removeListener("error",s),this.removeListener("end",a),this.pause(),i({value:c,done:!!this[va]})},a=()=>{this.removeListener("error",s),this.removeListener("data",o),i({done:!0})},l=()=>s(new Error("stream destroyed"));return new Promise((c,u)=>{n=u,i=c,this.once(Li,l),this.once("error",s),this.once("end",a),this.once("data",o)})}}}[zFe](){return{next:()=>{let r=this.read();return{value:r,done:r===null}}}}destroy(e){return this[Li]?(e?this.emit("error",e):this.emit(Li),this):(this[Li]=!0,this.buffer=new _p,this[rn]=0,typeof this.close=="function"&&!this[jw]&&this.close(),e?this.emit("error",e):this.emit(Li),this)}static isStream(e){return!!e&&(e instanceof B9||e instanceof d9||e instanceof JFe&&(typeof e.pipe=="function"||typeof e.write=="function"&&typeof e.end=="function"))}}});var b9=E((llt,Q9)=>{var XFe=require("zlib").constants||{ZLIB_VERNUM:4736};Q9.exports=Object.freeze(Object.assign(Object.create(null),{Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_MEM_ERROR:-4,Z_BUF_ERROR:-5,Z_VERSION_ERROR:-6,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,DEFLATE:1,INFLATE:2,GZIP:3,GUNZIP:4,DEFLATERAW:5,INFLATERAW:6,UNZIP:7,BROTLI_DECODE:8,BROTLI_ENCODE:9,Z_MIN_WINDOWBITS:8,Z_MAX_WINDOWBITS:15,Z_DEFAULT_WINDOWBITS:15,Z_MIN_CHUNK:64,Z_MAX_CHUNK:Infinity,Z_DEFAULT_CHUNK:16384,Z_MIN_MEMLEVEL:1,Z_MAX_MEMLEVEL:9,Z_DEFAULT_MEMLEVEL:8,Z_MIN_LEVEL:-1,Z_MAX_LEVEL:9,Z_DEFAULT_LEVEL:-1,BROTLI_OPERATION_PROCESS:0,BROTLI_OPERATION_FLUSH:1,BROTLI_OPERATION_FINISH:2,BROTLI_OPERATION_EMIT_METADATA:3,BROTLI_MODE_GENERIC:0,BROTLI_MODE_TEXT:1,BROTLI_MODE_FONT:2,BROTLI_DEFAULT_MODE:0,BROTLI_MIN_QUALITY:0,BROTLI_MAX_QUALITY:11,BROTLI_DEFAULT_QUALITY:11,BROTLI_MIN_WINDOW_BITS:10,BROTLI_MAX_WINDOW_BITS:24,BROTLI_LARGE_MAX_WINDOW_BITS:30,BROTLI_DEFAULT_WINDOW:22,BROTLI_MIN_INPUT_BLOCK_BITS:16,BROTLI_MAX_INPUT_BLOCK_BITS:24,BROTLI_PARAM_MODE:0,BROTLI_PARAM_QUALITY:1,BROTLI_PARAM_LGWIN:2,BROTLI_PARAM_LGBLOCK:3,BROTLI_PARAM_DISABLE_LITERAL_CONTEXT_MODELING:4,BROTLI_PARAM_SIZE_HINT:5,BROTLI_PARAM_LARGE_WINDOW:6,BROTLI_PARAM_NPOSTFIX:7,BROTLI_PARAM_NDIRECT:8,BROTLI_DECODER_RESULT_ERROR:0,BROTLI_DECODER_RESULT_SUCCESS:1,BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT:2,BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_PARAM_DISABLE_RING_BUFFER_REALLOCATION:0,BROTLI_DECODER_PARAM_LARGE_WINDOW:1,BROTLI_DECODER_NO_ERROR:0,BROTLI_DECODER_SUCCESS:1,BROTLI_DECODER_NEEDS_MORE_INPUT:2,BROTLI_DECODER_NEEDS_MORE_OUTPUT:3,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_NIBBLE:-1,BROTLI_DECODER_ERROR_FORMAT_RESERVED:-2,BROTLI_DECODER_ERROR_FORMAT_EXUBERANT_META_NIBBLE:-3,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_ALPHABET:-4,BROTLI_DECODER_ERROR_FORMAT_SIMPLE_HUFFMAN_SAME:-5,BROTLI_DECODER_ERROR_FORMAT_CL_SPACE:-6,BROTLI_DECODER_ERROR_FORMAT_HUFFMAN_SPACE:-7,BROTLI_DECODER_ERROR_FORMAT_CONTEXT_MAP_REPEAT:-8,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_1:-9,BROTLI_DECODER_ERROR_FORMAT_BLOCK_LENGTH_2:-10,BROTLI_DECODER_ERROR_FORMAT_TRANSFORM:-11,BROTLI_DECODER_ERROR_FORMAT_DICTIONARY:-12,BROTLI_DECODER_ERROR_FORMAT_WINDOW_BITS:-13,BROTLI_DECODER_ERROR_FORMAT_PADDING_1:-14,BROTLI_DECODER_ERROR_FORMAT_PADDING_2:-15,BROTLI_DECODER_ERROR_FORMAT_DISTANCE:-16,BROTLI_DECODER_ERROR_DICTIONARY_NOT_SET:-19,BROTLI_DECODER_ERROR_INVALID_ARGUMENTS:-20,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MODES:-21,BROTLI_DECODER_ERROR_ALLOC_TREE_GROUPS:-22,BROTLI_DECODER_ERROR_ALLOC_CONTEXT_MAP:-25,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_1:-26,BROTLI_DECODER_ERROR_ALLOC_RING_BUFFER_2:-27,BROTLI_DECODER_ERROR_ALLOC_BLOCK_TYPE_TREES:-30,BROTLI_DECODER_ERROR_UNREACHABLE:-31},XFe))});var fD=E(Un=>{"use strict";var sD=require("assert"),kA=require("buffer").Buffer,v9=require("zlib"),uc=Un.constants=b9(),ZFe=hg(),S9=kA.concat,gc=Symbol("_superWrite"),ed=class extends Error{constructor(e){super("zlib: "+e.message);this.code=e.code,this.errno=e.errno,this.code||(this.code="ZLIB_ERROR"),this.message="zlib: "+e.message,Error.captureStackTrace(this,this.constructor)}get name(){return"ZlibError"}},$Fe=Symbol("opts"),td=Symbol("flushFlag"),x9=Symbol("finishFlushFlag"),oD=Symbol("fullFlushFlag"),tr=Symbol("handle"),qw=Symbol("onError"),pg=Symbol("sawError"),aD=Symbol("level"),AD=Symbol("strategy"),lD=Symbol("ended"),clt=Symbol("_defaultFullFlush"),cD=class extends ZFe{constructor(e,r){if(!e||typeof e!="object")throw new TypeError("invalid options for ZlibBase constructor");super(e);this[pg]=!1,this[lD]=!1,this[$Fe]=e,this[td]=e.flush,this[x9]=e.finishFlush;try{this[tr]=new v9[r](e)}catch(i){throw new ed(i)}this[qw]=i=>{this[pg]||(this[pg]=!0,this.close(),this.emit("error",i))},this[tr].on("error",i=>this[qw](new ed(i))),this.once("end",()=>this.close)}close(){this[tr]&&(this[tr].close(),this[tr]=null,this.emit("close"))}reset(){if(!this[pg])return sD(this[tr],"zlib binding closed"),this[tr].reset()}flush(e){this.ended||(typeof e!="number"&&(e=this[oD]),this.write(Object.assign(kA.alloc(0),{[td]:e})))}end(e,r,i){return e&&this.write(e,r),this.flush(this[x9]),this[lD]=!0,super.end(null,null,i)}get ended(){return this[lD]}write(e,r,i){if(typeof r=="function"&&(i=r,r="utf8"),typeof e=="string"&&(e=kA.from(e,r)),this[pg])return;sD(this[tr],"zlib binding closed");let n=this[tr]._handle,s=n.close;n.close=()=>{};let o=this[tr].close;this[tr].close=()=>{},kA.concat=c=>c;let a;try{let c=typeof e[td]=="number"?e[td]:this[td];a=this[tr]._processChunk(e,c),kA.concat=S9}catch(c){kA.concat=S9,this[qw](new ed(c))}finally{this[tr]&&(this[tr]._handle=n,n.close=s,this[tr].close=o,this[tr].removeAllListeners("error"))}this[tr]&&this[tr].on("error",c=>this[qw](new ed(c)));let l;if(a)if(Array.isArray(a)&&a.length>0){l=this[gc](kA.from(a[0]));for(let c=1;c{this.flush(n),s()};try{this[tr].params(e,r)}finally{this[tr].flush=i}this[tr]&&(this[aD]=e,this[AD]=r)}}}},k9=class extends PA{constructor(e){super(e,"Deflate")}},P9=class extends PA{constructor(e){super(e,"Inflate")}},uD=Symbol("_portable"),D9=class extends PA{constructor(e){super(e,"Gzip");this[uD]=e&&!!e.portable}[gc](e){return this[uD]?(this[uD]=!1,e[9]=255,super[gc](e)):super[gc](e)}},R9=class extends PA{constructor(e){super(e,"Gunzip")}},F9=class extends PA{constructor(e){super(e,"DeflateRaw")}},N9=class extends PA{constructor(e){super(e,"InflateRaw")}},L9=class extends PA{constructor(e){super(e,"Unzip")}},gD=class extends cD{constructor(e,r){e=e||{},e.flush=e.flush||uc.BROTLI_OPERATION_PROCESS,e.finishFlush=e.finishFlush||uc.BROTLI_OPERATION_FINISH,super(e,r),this[oD]=uc.BROTLI_OPERATION_FLUSH}},T9=class extends gD{constructor(e){super(e,"BrotliCompress")}},M9=class extends gD{constructor(e){super(e,"BrotliDecompress")}};Un.Deflate=k9;Un.Inflate=P9;Un.Gzip=D9;Un.Gunzip=R9;Un.DeflateRaw=F9;Un.InflateRaw=N9;Un.Unzip=L9;typeof v9.BrotliCompress=="function"?(Un.BrotliCompress=T9,Un.BrotliDecompress=M9):Un.BrotliCompress=Un.BrotliDecompress=class{constructor(){throw new Error("Brotli is not supported in this version of Node.js")}}});var rd=E(Jw=>{"use strict";Jw.name=new Map([["0","File"],["","OldFile"],["1","Link"],["2","SymbolicLink"],["3","CharacterDevice"],["4","BlockDevice"],["5","Directory"],["6","FIFO"],["7","ContiguousFile"],["g","GlobalExtendedHeader"],["x","ExtendedHeader"],["A","SolarisACL"],["D","GNUDumpDir"],["I","Inode"],["K","NextFileHasLongLinkpath"],["L","NextFileHasLongPath"],["M","ContinuationFile"],["N","OldGnuLongPath"],["S","SparseFile"],["V","TapeVolumeHeader"],["X","OldExtendedHeader"]]);Jw.code=new Map(Array.from(Jw.name).map(t=>[t[1],t[0]]))});var id=E((plt,O9)=>{"use strict";var flt=rd(),eNe=hg(),hD=Symbol("slurp");O9.exports=class extends eNe{constructor(e,r,i){super();switch(this.pause(),this.extended=r,this.globalExtended=i,this.header=e,this.startBlockSize=512*Math.ceil(e.size/512),this.blockRemain=this.startBlockSize,this.remain=e.size,this.type=e.type,this.meta=!1,this.ignore=!1,this.type){case"File":case"OldFile":case"Link":case"SymbolicLink":case"CharacterDevice":case"BlockDevice":case"Directory":case"FIFO":case"ContiguousFile":case"GNUDumpDir":break;case"NextFileHasLongLinkpath":case"NextFileHasLongPath":case"OldGnuLongPath":case"GlobalExtendedHeader":case"ExtendedHeader":case"OldExtendedHeader":this.meta=!0;break;default:this.ignore=!0}this.path=e.path,this.mode=e.mode,this.mode&&(this.mode=this.mode&4095),this.uid=e.uid,this.gid=e.gid,this.uname=e.uname,this.gname=e.gname,this.size=e.size,this.mtime=e.mtime,this.atime=e.atime,this.ctime=e.ctime,this.linkpath=e.linkpath,this.uname=e.uname,this.gname=e.gname,r&&this[hD](r),i&&this[hD](i,!0)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");let i=this.remain,n=this.blockRemain;return this.remain=Math.max(0,i-r),this.blockRemain=Math.max(0,n-r),this.ignore?!0:i>=r?super.write(e):super.write(e.slice(0,i))}[hD](e,r){for(let i in e)e[i]!==null&&e[i]!==void 0&&!(r&&i==="path")&&(this[i]=e[i])}}});var H9=E(pD=>{"use strict";var dlt=pD.encode=(t,e)=>{if(Number.isSafeInteger(t))t<0?rNe(t,e):tNe(t,e);else throw Error("cannot encode number outside of javascript safe integer range");return e},tNe=(t,e)=>{e[0]=128;for(var r=e.length;r>1;r--)e[r-1]=t&255,t=Math.floor(t/256)},rNe=(t,e)=>{e[0]=255;var r=!1;t=t*-1;for(var i=e.length;i>1;i--){var n=t&255;t=Math.floor(t/256),r?e[i-1]=K9(n):n===0?e[i-1]=0:(r=!0,e[i-1]=U9(n))}},Clt=pD.parse=t=>{var e=t[t.length-1],r=t[0],i;if(r===128)i=nNe(t.slice(1,t.length));else if(r===255)i=iNe(t);else throw Error("invalid base256 encoding");if(!Number.isSafeInteger(i))throw Error("parsed number outside of javascript safe integer range");return i},iNe=t=>{for(var e=t.length,r=0,i=!1,n=e-1;n>-1;n--){var s=t[n],o;i?o=K9(s):s===0?o=s:(i=!0,o=U9(s)),o!==0&&(r-=o*Math.pow(256,e-n-1))}return r},nNe=t=>{for(var e=t.length,r=0,i=e-1;i>-1;i--){var n=t[i];n!==0&&(r+=n*Math.pow(256,e-i-1))}return r},K9=t=>(255^t)&255,U9=t=>(255^t)+1&255});var Cg=E((Elt,G9)=>{"use strict";var dD=rd(),dg=require("path").posix,j9=H9(),CD=Symbol("slurp"),Hn=Symbol("type"),Y9=class{constructor(e,r,i,n){this.cksumValid=!1,this.needPax=!1,this.nullBlock=!1,this.block=null,this.path=null,this.mode=null,this.uid=null,this.gid=null,this.size=null,this.mtime=null,this.cksum=null,this[Hn]="0",this.linkpath=null,this.uname=null,this.gname=null,this.devmaj=0,this.devmin=0,this.atime=null,this.ctime=null,Buffer.isBuffer(e)?this.decode(e,r||0,i,n):e&&this.set(e)}decode(e,r,i,n){if(r||(r=0),!e||!(e.length>=r+512))throw new Error("need 512 bytes for header");if(this.path=fc(e,r,100),this.mode=DA(e,r+100,8),this.uid=DA(e,r+108,8),this.gid=DA(e,r+116,8),this.size=DA(e,r+124,12),this.mtime=mD(e,r+136,12),this.cksum=DA(e,r+148,12),this[CD](i),this[CD](n,!0),this[Hn]=fc(e,r+156,1),this[Hn]===""&&(this[Hn]="0"),this[Hn]==="0"&&this.path.substr(-1)==="/"&&(this[Hn]="5"),this[Hn]==="5"&&(this.size=0),this.linkpath=fc(e,r+157,100),e.slice(r+257,r+265).toString()==="ustar\x0000")if(this.uname=fc(e,r+265,32),this.gname=fc(e,r+297,32),this.devmaj=DA(e,r+329,8),this.devmin=DA(e,r+337,8),e[r+475]!==0){let o=fc(e,r+345,155);this.path=o+"/"+this.path}else{let o=fc(e,r+345,130);o&&(this.path=o+"/"+this.path),this.atime=mD(e,r+476,12),this.ctime=mD(e,r+488,12)}let s=8*32;for(let o=r;o=r+512))throw new Error("need 512 bytes for header");let i=this.ctime||this.atime?130:155,n=sNe(this.path||"",i),s=n[0],o=n[1];this.needPax=n[2],this.needPax=hc(e,r,100,s)||this.needPax,this.needPax=RA(e,r+100,8,this.mode)||this.needPax,this.needPax=RA(e,r+108,8,this.uid)||this.needPax,this.needPax=RA(e,r+116,8,this.gid)||this.needPax,this.needPax=RA(e,r+124,12,this.size)||this.needPax,this.needPax=ED(e,r+136,12,this.mtime)||this.needPax,e[r+156]=this[Hn].charCodeAt(0),this.needPax=hc(e,r+157,100,this.linkpath)||this.needPax,e.write("ustar\x0000",r+257,8),this.needPax=hc(e,r+265,32,this.uname)||this.needPax,this.needPax=hc(e,r+297,32,this.gname)||this.needPax,this.needPax=RA(e,r+329,8,this.devmaj)||this.needPax,this.needPax=RA(e,r+337,8,this.devmin)||this.needPax,this.needPax=hc(e,r+345,i,o)||this.needPax,e[r+475]!==0?this.needPax=hc(e,r+345,155,o)||this.needPax:(this.needPax=hc(e,r+345,130,o)||this.needPax,this.needPax=ED(e,r+476,12,this.atime)||this.needPax,this.needPax=ED(e,r+488,12,this.ctime)||this.needPax);let a=8*32;for(let l=r;l{let r=100,i=t,n="",s,o=dg.parse(t).root||".";if(Buffer.byteLength(i)r&&Buffer.byteLength(n)<=e?s=[i.substr(0,r-1),n,!0]:(i=dg.join(dg.basename(n),i),n=dg.dirname(n));while(n!==o&&!s);s||(s=[t.substr(0,r-1),"",!0])}return s},fc=(t,e,r)=>t.slice(e,e+r).toString("utf8").replace(/\0.*/,""),mD=(t,e,r)=>oNe(DA(t,e,r)),oNe=t=>t===null?null:new Date(t*1e3),DA=(t,e,r)=>t[e]&128?j9.parse(t.slice(e,e+r)):aNe(t,e,r),ANe=t=>isNaN(t)?null:t,aNe=(t,e,r)=>ANe(parseInt(t.slice(e,e+r).toString("utf8").replace(/\0.*$/,"").trim(),8)),lNe={12:8589934591,8:2097151},RA=(t,e,r,i)=>i===null?!1:i>lNe[r]||i<0?(j9.encode(i,t.slice(e,e+r)),!0):(cNe(t,e,r,i),!1),cNe=(t,e,r,i)=>t.write(uNe(i,r),e,r,"ascii"),uNe=(t,e)=>gNe(Math.floor(t).toString(8),e),gNe=(t,e)=>(t.length===e-1?t:new Array(e-t.length-1).join("0")+t+" ")+"\0",ED=(t,e,r,i)=>i===null?!1:RA(t,e,r,i.getTime()/1e3),fNe=new Array(156).join("\0"),hc=(t,e,r,i)=>i===null?!1:(t.write(i+fNe,e,r,"utf8"),i.length!==Buffer.byteLength(i)||i.length>r);G9.exports=Y9});var zw=E((Ilt,q9)=>{"use strict";var hNe=Cg(),pNe=require("path"),Ww=class{constructor(e,r){this.atime=e.atime||null,this.charset=e.charset||null,this.comment=e.comment||null,this.ctime=e.ctime||null,this.gid=e.gid||null,this.gname=e.gname||null,this.linkpath=e.linkpath||null,this.mtime=e.mtime||null,this.path=e.path||null,this.size=e.size||null,this.uid=e.uid||null,this.uname=e.uname||null,this.dev=e.dev||null,this.ino=e.ino||null,this.nlink=e.nlink||null,this.global=r||!1}encode(){let e=this.encodeBody();if(e==="")return null;let r=Buffer.byteLength(e),i=512*Math.ceil(1+r/512),n=Buffer.allocUnsafe(i);for(let s=0;s<512;s++)n[s]=0;new hNe({path:("PaxHeader/"+pNe.basename(this.path)).slice(0,99),mode:this.mode||420,uid:this.uid||null,gid:this.gid||null,size:r,mtime:this.mtime||null,type:this.global?"GlobalExtendedHeader":"ExtendedHeader",linkpath:"",uname:this.uname||"",gname:this.gname||"",devmaj:0,devmin:0,atime:this.atime||null,ctime:this.ctime||null}).encode(n),n.write(e,512,r,"utf8");for(let s=r+512;s=Math.pow(10,s)&&(s+=1),s+n+i}};Ww.parse=(t,e,r)=>new Ww(dNe(CNe(t),e),r);var dNe=(t,e)=>e?Object.keys(t).reduce((r,i)=>(r[i]=t[i],r),e):t,CNe=t=>t.replace(/\n$/,"").split(` +`).reduce(mNe,Object.create(null)),mNe=(t,e)=>{let r=parseInt(e,10);if(r!==Buffer.byteLength(e)+1)return t;e=e.substr((r+" ").length);let i=e.split("="),n=i.shift().replace(/^SCHILY\.(dev|ino|nlink)/,"$1");if(!n)return t;let s=i.join("=");return t[n]=/^([A-Z]+\.)?([mac]|birth|creation)time$/.test(n)?new Date(s*1e3):/^[0-9]+$/.test(s)?+s:s,t};q9.exports=Ww});var Vw=E((ylt,J9)=>{"use strict";J9.exports=t=>class extends t{warn(e,r,i={}){this.file&&(i.file=this.file),this.cwd&&(i.cwd=this.cwd),i.code=r instanceof Error&&r.code||e,i.tarCode=e,!this.strict&&i.recoverable!==!1?(r instanceof Error&&(i=Object.assign(r,i),r=r.message),this.emit("warn",i.tarCode,r,i)):r instanceof Error?this.emit("error",Object.assign(r,i)):this.emit("error",Object.assign(new Error(`${e}: ${r}`),i))}}});var yD=E((wlt,W9)=>{"use strict";var _w=["|","<",">","?",":"],ID=_w.map(t=>String.fromCharCode(61440+t.charCodeAt(0))),ENe=new Map(_w.map((t,e)=>[t,ID[e]])),INe=new Map(ID.map((t,e)=>[t,_w[e]]));W9.exports={encode:t=>_w.reduce((e,r)=>e.split(r).join(ENe.get(r)),t),decode:t=>ID.reduce((e,r)=>e.split(r).join(INe.get(r)),t)}});var V9=E((Blt,z9)=>{"use strict";z9.exports=(t,e,r)=>(t&=4095,r&&(t=(t|384)&~18),e&&(t&256&&(t|=64),t&32&&(t|=8),t&4&&(t|=1)),t)});var xD=E((xlt,_9)=>{"use strict";var X9=hg(),Z9=zw(),$9=Cg(),Qlt=id(),bo=require("fs"),mg=require("path"),blt=rd(),yNe=16*1024*1024,eV=Symbol("process"),tV=Symbol("file"),rV=Symbol("directory"),wD=Symbol("symlink"),iV=Symbol("hardlink"),nd=Symbol("header"),Xw=Symbol("read"),BD=Symbol("lstat"),Zw=Symbol("onlstat"),QD=Symbol("onread"),bD=Symbol("onreadlink"),vD=Symbol("openfile"),SD=Symbol("onopenfile"),pc=Symbol("close"),$w=Symbol("mode"),nV=Vw(),wNe=yD(),sV=V9(),eB=nV(class extends X9{constructor(e,r){if(r=r||{},super(r),typeof e!="string")throw new TypeError("path is required");this.path=e,this.portable=!!r.portable,this.myuid=process.getuid&&process.getuid(),this.myuser=process.env.USER||"",this.maxReadSize=r.maxReadSize||yNe,this.linkCache=r.linkCache||new Map,this.statCache=r.statCache||new Map,this.preservePaths=!!r.preservePaths,this.cwd=r.cwd||process.cwd(),this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.mtime=r.mtime||null,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(!this.preservePaths&&mg.win32.isAbsolute(e)){let n=mg.win32.parse(e);this.path=e.substr(n.root.length),i=n.root}this.win32=!!r.win32||process.platform==="win32",this.win32&&(this.path=wNe.decode(this.path.replace(/\\/g,"/")),e=e.replace(/\\/g,"/")),this.absolute=r.absolute||mg.resolve(this.cwd,e),this.path===""&&(this.path="./"),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.statCache.has(this.absolute)?this[Zw](this.statCache.get(this.absolute)):this[BD]()}[BD](){bo.lstat(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[Zw](r)})}[Zw](e){this.statCache.set(this.absolute,e),this.stat=e,e.isFile()||(e.size=0),this.type=BNe(e),this.emit("stat",e),this[eV]()}[eV](){switch(this.type){case"File":return this[tV]();case"Directory":return this[rV]();case"SymbolicLink":return this[wD]();default:return this.end()}}[$w](e){return sV(e,this.type==="Directory",this.portable)}[nd](){this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.header=new $9({path:this.path,linkpath:this.linkpath,mode:this[$w](this.stat.mode),uid:this.portable?null:this.stat.uid,gid:this.portable?null:this.stat.gid,size:this.stat.size,mtime:this.noMtime?null:this.mtime||this.stat.mtime,type:this.type,uname:this.portable?null:this.stat.uid===this.myuid?this.myuser:"",atime:this.portable?null:this.stat.atime,ctime:this.portable?null:this.stat.ctime}),this.header.encode()&&!this.noPax&&this.write(new Z9({atime:this.portable?null:this.header.atime,ctime:this.portable?null:this.header.ctime,gid:this.portable?null:this.header.gid,mtime:this.noMtime?null:this.mtime||this.header.mtime,path:this.path,linkpath:this.linkpath,size:this.header.size,uid:this.portable?null:this.header.uid,uname:this.portable?null:this.header.uname,dev:this.portable?null:this.stat.dev,ino:this.portable?null:this.stat.ino,nlink:this.portable?null:this.stat.nlink}).encode()),this.write(this.header.block)}[rV](){this.path.substr(-1)!=="/"&&(this.path+="/"),this.stat.size=0,this[nd](),this.end()}[wD](){bo.readlink(this.absolute,(e,r)=>{if(e)return this.emit("error",e);this[bD](r)})}[bD](e){this.linkpath=e.replace(/\\/g,"/"),this[nd](),this.end()}[iV](e){this.type="Link",this.linkpath=mg.relative(this.cwd,e).replace(/\\/g,"/"),this.stat.size=0,this[nd](),this.end()}[tV](){if(this.stat.nlink>1){let e=this.stat.dev+":"+this.stat.ino;if(this.linkCache.has(e)){let r=this.linkCache.get(e);if(r.indexOf(this.cwd)===0)return this[iV](r)}this.linkCache.set(e,this.absolute)}if(this[nd](),this.stat.size===0)return this.end();this[vD]()}[vD](){bo.open(this.absolute,"r",(e,r)=>{if(e)return this.emit("error",e);this[SD](r)})}[SD](e){let r=512*Math.ceil(this.stat.size/512),i=Math.min(r,this.maxReadSize),n=Buffer.allocUnsafe(i);this[Xw](e,n,0,n.length,0,this.stat.size,r)}[Xw](e,r,i,n,s,o,a){bo.read(e,r,i,n,s,(l,c)=>{if(l)return this[pc](e,()=>this.emit("error",l));this[QD](e,r,i,n,s,o,a,c)})}[pc](e,r){bo.close(e,r)}[QD](e,r,i,n,s,o,a,l){if(l<=0&&o>0){let u=new Error("encountered unexpected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[pc](e,()=>this.emit("error",u))}if(l>o){let u=new Error("did not encounter expected EOF");return u.path=this.absolute,u.syscall="read",u.code="EOF",this[pc](e,()=>this.emit("error",u))}if(l===o)for(let u=l;uu?this.emit("error",u):this.end());i>=n&&(r=Buffer.allocUnsafe(n),i=0),n=r.length-i,this[Xw](e,r,i,n,s,o,a)}}),oV=class extends eB{constructor(e,r){super(e,r)}[BD](){this[Zw](bo.lstatSync(this.absolute))}[wD](){this[bD](bo.readlinkSync(this.absolute))}[vD](){this[SD](bo.openSync(this.absolute,"r"))}[Xw](e,r,i,n,s,o,a){let l=!0;try{let c=bo.readSync(e,r,i,n,s);this[QD](e,r,i,n,s,o,a,c),l=!1}finally{if(l)try{this[pc](e,()=>{})}catch(c){}}}[pc](e,r){bo.closeSync(e),r()}},QNe=nV(class extends X9{constructor(e,r){r=r||{},super(r),this.preservePaths=!!r.preservePaths,this.portable=!!r.portable,this.strict=!!r.strict,this.noPax=!!r.noPax,this.noMtime=!!r.noMtime,this.readEntry=e,this.type=e.type,this.type==="Directory"&&this.portable&&(this.noMtime=!0),this.path=e.path,this.mode=this[$w](e.mode),this.uid=this.portable?null:e.uid,this.gid=this.portable?null:e.gid,this.uname=this.portable?null:e.uname,this.gname=this.portable?null:e.gname,this.size=e.size,this.mtime=this.noMtime?null:r.mtime||e.mtime,this.atime=this.portable?null:e.atime,this.ctime=this.portable?null:e.ctime,this.linkpath=e.linkpath,typeof r.onwarn=="function"&&this.on("warn",r.onwarn);let i=!1;if(mg.isAbsolute(this.path)&&!this.preservePaths){let n=mg.parse(this.path);i=n.root,this.path=this.path.substr(n.root.length)}this.remain=e.size,this.blockRemain=e.startBlockSize,this.header=new $9({path:this.path,linkpath:this.linkpath,mode:this.mode,uid:this.portable?null:this.uid,gid:this.portable?null:this.gid,size:this.size,mtime:this.noMtime?null:this.mtime,type:this.type,uname:this.portable?null:this.uname,atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime}),i&&this.warn("TAR_ENTRY_INFO",`stripping ${i} from absolute path`,{entry:this,path:i+this.path}),this.header.encode()&&!this.noPax&&super.write(new Z9({atime:this.portable?null:this.atime,ctime:this.portable?null:this.ctime,gid:this.portable?null:this.gid,mtime:this.noMtime?null:this.mtime,path:this.path,linkpath:this.linkpath,size:this.size,uid:this.portable?null:this.uid,uname:this.portable?null:this.uname,dev:this.portable?null:this.readEntry.dev,ino:this.portable?null:this.readEntry.ino,nlink:this.portable?null:this.readEntry.nlink}).encode()),super.write(this.header.block),e.pipe(this)}[$w](e){return sV(e,this.type==="Directory",this.portable)}write(e){let r=e.length;if(r>this.blockRemain)throw new Error("writing more to entry than is appropriate");return this.blockRemain-=r,super.write(e)}end(){return this.blockRemain&&this.write(Buffer.alloc(this.blockRemain)),super.end()}});eB.Sync=oV;eB.Tar=QNe;var BNe=t=>t.isFile()?"File":t.isDirectory()?"Directory":t.isSymbolicLink()?"SymbolicLink":"Unsupported";_9.exports=eB});var AB=E((Plt,aV)=>{"use strict";var kD=class{constructor(e,r){this.path=e||"./",this.absolute=r,this.entry=null,this.stat=null,this.readdir=null,this.pending=!1,this.ignore=!1,this.piped=!1}},bNe=hg(),vNe=fD(),SNe=id(),PD=xD(),xNe=PD.Sync,kNe=PD.Tar,PNe=Rh(),AV=Buffer.alloc(1024),tB=Symbol("onStat"),rB=Symbol("ended"),vo=Symbol("queue"),Eg=Symbol("current"),dc=Symbol("process"),iB=Symbol("processing"),lV=Symbol("processJob"),So=Symbol("jobs"),DD=Symbol("jobDone"),nB=Symbol("addFSEntry"),cV=Symbol("addTarEntry"),RD=Symbol("stat"),FD=Symbol("readdir"),sB=Symbol("onreaddir"),oB=Symbol("pipe"),uV=Symbol("entry"),ND=Symbol("entryOpt"),LD=Symbol("writeEntryClass"),gV=Symbol("write"),TD=Symbol("ondrain"),aB=require("fs"),fV=require("path"),DNe=Vw(),MD=DNe(class extends bNe{constructor(e){super(e);e=e||Object.create(null),this.opt=e,this.file=e.file||"",this.cwd=e.cwd||process.cwd(),this.maxReadSize=e.maxReadSize,this.preservePaths=!!e.preservePaths,this.strict=!!e.strict,this.noPax=!!e.noPax,this.prefix=(e.prefix||"").replace(/(\\|\/)+$/,""),this.linkCache=e.linkCache||new Map,this.statCache=e.statCache||new Map,this.readdirCache=e.readdirCache||new Map,this[LD]=PD,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),this.portable=!!e.portable,this.zip=null,e.gzip?(typeof e.gzip!="object"&&(e.gzip={}),this.portable&&(e.gzip.portable=!0),this.zip=new vNe.Gzip(e.gzip),this.zip.on("data",r=>super.write(r)),this.zip.on("end",r=>super.end()),this.zip.on("drain",r=>this[TD]()),this.on("resume",r=>this.zip.resume())):this.on("drain",this[TD]),this.noDirRecurse=!!e.noDirRecurse,this.follow=!!e.follow,this.noMtime=!!e.noMtime,this.mtime=e.mtime||null,this.filter=typeof e.filter=="function"?e.filter:r=>!0,this[vo]=new PNe,this[So]=0,this.jobs=+e.jobs||4,this[iB]=!1,this[rB]=!1}[gV](e){return super.write(e)}add(e){return this.write(e),this}end(e){return e&&this.write(e),this[rB]=!0,this[dc](),this}write(e){if(this[rB])throw new Error("write after end");return e instanceof SNe?this[cV](e):this[nB](e),this.flowing}[cV](e){let r=fV.resolve(this.cwd,e.path);if(this.prefix&&(e.path=this.prefix+"/"+e.path.replace(/^\.(\/+|$)/,"")),!this.filter(e.path,e))e.resume();else{let i=new kD(e.path,r,!1);i.entry=new kNe(e,this[ND](i)),i.entry.on("end",n=>this[DD](i)),this[So]+=1,this[vo].push(i)}this[dc]()}[nB](e){let r=fV.resolve(this.cwd,e);this.prefix&&(e=this.prefix+"/"+e.replace(/^\.(\/+|$)/,"")),this[vo].push(new kD(e,r)),this[dc]()}[RD](e){e.pending=!0,this[So]+=1;let r=this.follow?"stat":"lstat";aB[r](e.absolute,(i,n)=>{e.pending=!1,this[So]-=1,i?this.emit("error",i):this[tB](e,n)})}[tB](e,r){this.statCache.set(e.absolute,r),e.stat=r,this.filter(e.path,r)||(e.ignore=!0),this[dc]()}[FD](e){e.pending=!0,this[So]+=1,aB.readdir(e.absolute,(r,i)=>{if(e.pending=!1,this[So]-=1,r)return this.emit("error",r);this[sB](e,i)})}[sB](e,r){this.readdirCache.set(e.absolute,r),e.readdir=r,this[dc]()}[dc](){if(!this[iB]){this[iB]=!0;for(let e=this[vo].head;e!==null&&this[So]this.warn(r,i,n),noPax:this.noPax,cwd:this.cwd,absolute:e.absolute,preservePaths:this.preservePaths,maxReadSize:this.maxReadSize,strict:this.strict,portable:this.portable,linkCache:this.linkCache,statCache:this.statCache,noMtime:this.noMtime,mtime:this.mtime}}[uV](e){this[So]+=1;try{return new this[LD](e.path,this[ND](e)).on("end",()=>this[DD](e)).on("error",r=>this.emit("error",r))}catch(r){this.emit("error",r)}}[TD](){this[Eg]&&this[Eg].entry&&this[Eg].entry.resume()}[oB](e){e.piped=!0,e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[nB](o+n)});let r=e.entry,i=this.zip;i?r.on("data",n=>{i.write(n)||r.pause()}):r.on("data",n=>{super.write(n)||r.pause()})}pause(){return this.zip&&this.zip.pause(),super.pause()}}),hV=class extends MD{constructor(e){super(e);this[LD]=xNe}pause(){}resume(){}[RD](e){let r=this.follow?"statSync":"lstatSync";this[tB](e,aB[r](e.absolute))}[FD](e,r){this[sB](e,aB.readdirSync(e.absolute))}[oB](e){let r=e.entry,i=this.zip;e.readdir&&e.readdir.forEach(n=>{let s=this.prefix?e.path.slice(this.prefix.length+1)||"./":e.path,o=s==="./"?"":s.replace(/\/*$/,"/");this[nB](o+n)}),i?r.on("data",n=>{i.write(n)}):r.on("data",n=>{super[gV](n)})}};MD.Sync=hV;aV.exports=MD});var bg=E(sd=>{"use strict";var RNe=hg(),FNe=require("events").EventEmitter,ls=require("fs"),lB=process.binding("fs"),Dlt=lB.writeBuffers,NNe=lB.FSReqWrap||lB.FSReqCallback,Ig=Symbol("_autoClose"),xo=Symbol("_close"),od=Symbol("_ended"),Jt=Symbol("_fd"),pV=Symbol("_finished"),Cc=Symbol("_flags"),OD=Symbol("_flush"),KD=Symbol("_handleChunk"),UD=Symbol("_makeBuf"),HD=Symbol("_mode"),cB=Symbol("_needDrain"),yg=Symbol("_onerror"),wg=Symbol("_onopen"),GD=Symbol("_onread"),mc=Symbol("_onwrite"),FA=Symbol("_open"),NA=Symbol("_path"),Ec=Symbol("_pos"),ko=Symbol("_queue"),Bg=Symbol("_read"),dV=Symbol("_readSize"),LA=Symbol("_reading"),uB=Symbol("_remain"),CV=Symbol("_size"),gB=Symbol("_write"),Qg=Symbol("_writing"),fB=Symbol("_defaultFlag"),jD=class extends RNe{constructor(e,r){if(r=r||{},super(r),this.writable=!1,typeof e!="string")throw new TypeError("path must be a string");this[Jt]=typeof r.fd=="number"?r.fd:null,this[NA]=e,this[dV]=r.readSize||16*1024*1024,this[LA]=!1,this[CV]=typeof r.size=="number"?r.size:Infinity,this[uB]=this[CV],this[Ig]=typeof r.autoClose=="boolean"?r.autoClose:!0,typeof this[Jt]=="number"?this[Bg]():this[FA]()}get fd(){return this[Jt]}get path(){return this[NA]}write(){throw new TypeError("this is a readable stream")}end(){throw new TypeError("this is a readable stream")}[FA](){ls.open(this[NA],"r",(e,r)=>this[wg](e,r))}[wg](e,r){e?this[yg](e):(this[Jt]=r,this.emit("open",r),this[Bg]())}[UD](){return Buffer.allocUnsafe(Math.min(this[dV],this[uB]))}[Bg](){if(!this[LA]){this[LA]=!0;let e=this[UD]();if(e.length===0)return process.nextTick(()=>this[GD](null,0,e));ls.read(this[Jt],e,0,e.length,null,(r,i,n)=>this[GD](r,i,n))}}[GD](e,r,i){this[LA]=!1,e?this[yg](e):this[KD](r,i)&&this[Bg]()}[xo](){this[Ig]&&typeof this[Jt]=="number"&&(ls.close(this[Jt],e=>this.emit("close")),this[Jt]=null)}[yg](e){this[LA]=!0,this[xo](),this.emit("error",e)}[KD](e,r){let i=!1;return this[uB]-=e,e>0&&(i=super.write(ethis[wg](e,r))}[wg](e,r){this[fB]&&this[Cc]==="r+"&&e&&e.code==="ENOENT"?(this[Cc]="w",this[FA]()):e?this[yg](e):(this[Jt]=r,this.emit("open",r),this[OD]())}end(e,r){e&&this.write(e,r),this[od]=!0,!this[Qg]&&!this[ko].length&&typeof this[Jt]=="number"&&this[mc](null,0)}write(e,r){return typeof e=="string"&&(e=new Buffer(e,r)),this[od]?(this.emit("error",new Error("write() after end()")),!1):this[Jt]===null||this[Qg]||this[ko].length?(this[ko].push(e),this[cB]=!0,!1):(this[Qg]=!0,this[gB](e),!0)}[gB](e){ls.write(this[Jt],e,0,e.length,this[Ec],(r,i)=>this[mc](r,i))}[mc](e,r){e?this[yg](e):(this[Ec]!==null&&(this[Ec]+=r),this[ko].length?this[OD]():(this[Qg]=!1,this[od]&&!this[pV]?(this[pV]=!0,this[xo](),this.emit("finish")):this[cB]&&(this[cB]=!1,this.emit("drain"))))}[OD](){if(this[ko].length===0)this[od]&&this[mc](null,0);else if(this[ko].length===1)this[gB](this[ko].pop());else{let e=this[ko];this[ko]=[],LNe(this[Jt],e,this[Ec],(r,i)=>this[mc](r,i))}}[xo](){this[Ig]&&typeof this[Jt]=="number"&&(ls.close(this[Jt],e=>this.emit("close")),this[Jt]=null)}},EV=class extends YD{[FA](){let e;try{e=ls.openSync(this[NA],this[Cc],this[HD])}catch(r){if(this[fB]&&this[Cc]==="r+"&&r&&r.code==="ENOENT")return this[Cc]="w",this[FA]();throw r}this[wg](null,e)}[xo](){if(this[Ig]&&typeof this[Jt]=="number"){try{ls.closeSync(this[Jt])}catch(e){}this[Jt]=null,this.emit("close")}}[gB](e){try{this[mc](null,ls.writeSync(this[Jt],e,0,e.length,this[Ec]))}catch(r){this[mc](r,0)}}},LNe=(t,e,r,i)=>{let n=(o,a)=>i(o,a,e),s=new NNe;s.oncomplete=n,lB.writeBuffers(t,e,r,s)};sd.ReadStream=jD;sd.ReadStreamSync=mV;sd.WriteStream=YD;sd.WriteStreamSync=EV});var ld=E((Llt,IV)=>{"use strict";var TNe=Vw(),Flt=require("path"),MNe=Cg(),ONe=require("events"),KNe=Rh(),UNe=1024*1024,HNe=id(),yV=zw(),GNe=fD(),qD=Buffer.from([31,139]),cs=Symbol("state"),Ic=Symbol("writeEntry"),xa=Symbol("readEntry"),JD=Symbol("nextEntry"),wV=Symbol("processEntry"),us=Symbol("extendedHeader"),ad=Symbol("globalExtendedHeader"),TA=Symbol("meta"),BV=Symbol("emitMeta"),Ar=Symbol("buffer"),ka=Symbol("queue"),yc=Symbol("ended"),QV=Symbol("emittedEnd"),wc=Symbol("emit"),Qn=Symbol("unzip"),hB=Symbol("consumeChunk"),pB=Symbol("consumeChunkSub"),WD=Symbol("consumeBody"),bV=Symbol("consumeMeta"),vV=Symbol("consumeHeader"),dB=Symbol("consuming"),zD=Symbol("bufferConcat"),VD=Symbol("maybeEnd"),Ad=Symbol("writing"),MA=Symbol("aborted"),CB=Symbol("onDone"),Bc=Symbol("sawValidEntry"),mB=Symbol("sawNullBlock"),EB=Symbol("sawEOF"),jNe=t=>!0;IV.exports=TNe(class extends ONe{constructor(e){e=e||{},super(e),this.file=e.file||"",this[Bc]=null,this.on(CB,r=>{(this[cs]==="begin"||this[Bc]===!1)&&this.warn("TAR_BAD_ARCHIVE","Unrecognized archive format")}),e.ondone?this.on(CB,e.ondone):this.on(CB,r=>{this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close")}),this.strict=!!e.strict,this.maxMetaEntrySize=e.maxMetaEntrySize||UNe,this.filter=typeof e.filter=="function"?e.filter:jNe,this.writable=!0,this.readable=!1,this[ka]=new KNe,this[Ar]=null,this[xa]=null,this[Ic]=null,this[cs]="begin",this[TA]="",this[us]=null,this[ad]=null,this[yc]=!1,this[Qn]=null,this[MA]=!1,this[mB]=!1,this[EB]=!1,typeof e.onwarn=="function"&&this.on("warn",e.onwarn),typeof e.onentry=="function"&&this.on("entry",e.onentry)}[vV](e,r){this[Bc]===null&&(this[Bc]=!1);let i;try{i=new MNe(e,r,this[us],this[ad])}catch(n){return this.warn("TAR_ENTRY_INVALID",n)}if(i.nullBlock)this[mB]?(this[EB]=!0,this[cs]==="begin"&&(this[cs]="header"),this[wc]("eof")):(this[mB]=!0,this[wc]("nullBlock"));else if(this[mB]=!1,!i.cksumValid)this.warn("TAR_ENTRY_INVALID","checksum failure",{header:i});else if(!i.path)this.warn("TAR_ENTRY_INVALID","path is required",{header:i});else{let n=i.type;if(/^(Symbolic)?Link$/.test(n)&&!i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath required",{header:i});else if(!/^(Symbolic)?Link$/.test(n)&&i.linkpath)this.warn("TAR_ENTRY_INVALID","linkpath forbidden",{header:i});else{let s=this[Ic]=new HNe(i,this[us],this[ad]);if(!this[Bc])if(s.remain){let o=()=>{s.invalid||(this[Bc]=!0)};s.on("end",o)}else this[Bc]=!0;s.meta?s.size>this.maxMetaEntrySize?(s.ignore=!0,this[wc]("ignoredEntry",s),this[cs]="ignore",s.resume()):s.size>0&&(this[TA]="",s.on("data",o=>this[TA]+=o),this[cs]="meta"):(this[us]=null,s.ignore=s.ignore||!this.filter(s.path,s),s.ignore?(this[wc]("ignoredEntry",s),this[cs]=s.remain?"ignore":"header",s.resume()):(s.remain?this[cs]="body":(this[cs]="header",s.end()),this[xa]?this[ka].push(s):(this[ka].push(s),this[JD]())))}}}[wV](e){let r=!0;return e?Array.isArray(e)?this.emit.apply(this,e):(this[xa]=e,this.emit("entry",e),e.emittedEnd||(e.on("end",i=>this[JD]()),r=!1)):(this[xa]=null,r=!1),r}[JD](){do;while(this[wV](this[ka].shift()));if(!this[ka].length){let e=this[xa];!e||e.flowing||e.size===e.remain?this[Ad]||this.emit("drain"):e.once("drain",i=>this.emit("drain"))}}[WD](e,r){let i=this[Ic],n=i.blockRemain,s=n>=e.length&&r===0?e:e.slice(r,r+n);return i.write(s),i.blockRemain||(this[cs]="header",this[Ic]=null,i.end()),s.length}[bV](e,r){let i=this[Ic],n=this[WD](e,r);return this[Ic]||this[BV](i),n}[wc](e,r,i){!this[ka].length&&!this[xa]?this.emit(e,r,i):this[ka].push([e,r,i])}[BV](e){switch(this[wc]("meta",this[TA]),e.type){case"ExtendedHeader":case"OldExtendedHeader":this[us]=yV.parse(this[TA],this[us],!1);break;case"GlobalExtendedHeader":this[ad]=yV.parse(this[TA],this[ad],!0);break;case"NextFileHasLongPath":case"OldGnuLongPath":this[us]=this[us]||Object.create(null),this[us].path=this[TA].replace(/\0.*/,"");break;case"NextFileHasLongLinkpath":this[us]=this[us]||Object.create(null),this[us].linkpath=this[TA].replace(/\0.*/,"");break;default:throw new Error("unknown meta: "+e.type)}}abort(e){this[MA]=!0,this.emit("abort",e),this.warn("TAR_ABORT",e,{recoverable:!1})}write(e){if(this[MA])return;if(this[Qn]===null&&e){if(this[Ar]&&(e=Buffer.concat([this[Ar],e]),this[Ar]=null),e.lengththis[hB](s)),this[Qn].on("error",s=>this.abort(s)),this[Qn].on("end",s=>{this[yc]=!0,this[hB]()}),this[Ad]=!0;let n=this[Qn][i?"end":"write"](e);return this[Ad]=!1,n}}this[Ad]=!0,this[Qn]?this[Qn].write(e):this[hB](e),this[Ad]=!1;let r=this[ka].length?!1:this[xa]?this[xa].flowing:!0;return!r&&!this[ka].length&&this[xa].once("drain",i=>this.emit("drain")),r}[zD](e){e&&!this[MA]&&(this[Ar]=this[Ar]?Buffer.concat([this[Ar],e]):e)}[VD](){if(this[yc]&&!this[QV]&&!this[MA]&&!this[dB]){this[QV]=!0;let e=this[Ic];if(e&&e.blockRemain){let r=this[Ar]?this[Ar].length:0;this.warn("TAR_BAD_ARCHIVE",`Truncated input (needed ${e.blockRemain} more bytes, only ${r} available)`,{entry:e}),this[Ar]&&e.write(this[Ar]),e.end()}this[wc](CB)}}[hB](e){if(this[dB])this[zD](e);else if(!e&&!this[Ar])this[VD]();else{if(this[dB]=!0,this[Ar]){this[zD](e);let r=this[Ar];this[Ar]=null,this[pB](r)}else this[pB](e);for(;this[Ar]&&this[Ar].length>=512&&!this[MA]&&!this[EB];){let r=this[Ar];this[Ar]=null,this[pB](r)}this[dB]=!1}(!this[Ar]||this[yc])&&this[VD]()}[pB](e){let r=0,i=e.length;for(;r+512<=i&&!this[MA]&&!this[EB];)switch(this[cs]){case"begin":case"header":this[vV](e,r),r+=512;break;case"ignore":case"body":r+=this[WD](e,r);break;case"meta":r+=this[bV](e,r);break;default:throw new Error("invalid state: "+this[cs])}r{"use strict";var YNe=fg(),xV=ld(),vg=require("fs"),qNe=bg(),kV=require("path"),Tlt=SV.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=YNe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&WNe(i,e),i.noResume||JNe(i),i.file&&i.sync?zNe(i):i.file?VNe(i,r):PV(i)},JNe=t=>{let e=t.onentry;t.onentry=e?r=>{e(r),r.resume()}:r=>r.resume()},WNe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||kV.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(kV.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},zNe=t=>{let e=PV(t),r=t.file,i=!0,n;try{let s=vg.statSync(r),o=t.maxReadSize||16*1024*1024;if(s.size{let r=new xV(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("end",o),vg.stat(n,(l,c)=>{if(l)a(l);else{let u=new qNe.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},PV=t=>new xV(t)});var TV=E((Ult,DV)=>{"use strict";var _Ne=fg(),yB=AB(),Olt=require("fs"),RV=bg(),FV=IB(),NV=require("path"),Klt=DV.exports=(t,e,r)=>{if(typeof e=="function"&&(r=e),Array.isArray(t)&&(e=t,t={}),!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");e=Array.from(e);let i=_Ne(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return i.file&&i.sync?XNe(i,e):i.file?ZNe(i,e,r):i.sync?$Ne(i,e):eLe(i,e)},XNe=(t,e)=>{let r=new yB.Sync(t),i=new RV.WriteStreamSync(t.file,{mode:t.mode||438});r.pipe(i),LV(r,e)},ZNe=(t,e,r)=>{let i=new yB(t),n=new RV.WriteStream(t.file,{mode:t.mode||438});i.pipe(n);let s=new Promise((o,a)=>{n.on("error",a),n.on("close",o),i.on("error",a)});return _D(i,e),r?s.then(r,r):s},LV=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?FV({file:NV.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},_D=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return FV({file:NV.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>_D(t,e));t.add(r)}t.end()},$Ne=(t,e)=>{let r=new yB.Sync(t);return LV(r,e),r},eLe=(t,e)=>{let r=new yB(t);return _D(r,e),r}});var XD=E((jlt,MV)=>{"use strict";var tLe=fg(),OV=AB(),Hlt=ld(),gs=require("fs"),KV=bg(),UV=IB(),HV=require("path"),GV=Cg(),Glt=MV.exports=(t,e,r)=>{let i=tLe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),i.sync?rLe(i,e):iLe(i,e,r)},rLe=(t,e)=>{let r=new OV.Sync(t),i=!0,n,s;try{try{n=gs.openSync(t.file,"r+")}catch(l){if(l.code==="ENOENT")n=gs.openSync(t.file,"w+");else throw l}let o=gs.fstatSync(n),a=Buffer.alloc(512);e:for(s=0;so.size)break;s+=c,t.mtimeCache&&t.mtimeCache.set(l.path,l.mtime)}i=!1,nLe(t,r,s,n,e)}finally{if(i)try{gs.closeSync(n)}catch(o){}}},nLe=(t,e,r,i,n)=>{let s=new KV.WriteStreamSync(t.file,{fd:i,start:r});e.pipe(s),sLe(e,n)},iLe=(t,e,r)=>{e=Array.from(e);let i=new OV(t),n=(o,a,l)=>{let c=(p,d)=>{p?gs.close(o,m=>l(p)):l(null,d)},u=0;if(a===0)return c(null,0);let g=0,f=Buffer.alloc(512),h=(p,d)=>{if(p)return c(p);if(g+=d,g<512&&d)return gs.read(o,f,g,f.length-g,u+g,h);if(u===0&&f[0]===31&&f[1]===139)return c(new Error("cannot append to compressed archives"));if(g<512)return c(null,u);let m=new GV(f);if(!m.cksumValid)return c(null,u);let I=512*Math.ceil(m.size/512);if(u+I+512>a||(u+=I+512,u>=a))return c(null,u);t.mtimeCache&&t.mtimeCache.set(m.path,m.mtime),g=0,gs.read(o,f,0,512,u,h)};gs.read(o,f,0,512,u,h)},s=new Promise((o,a)=>{i.on("error",a);let l="r+",c=(u,g)=>{if(u&&u.code==="ENOENT"&&l==="r+")return l="w+",gs.open(t.file,l,c);if(u)return a(u);gs.fstat(g,(f,h)=>{if(f)return a(f);n(g,h.size,(p,d)=>{if(p)return a(p);let m=new KV.WriteStream(t.file,{fd:g,start:d});i.pipe(m),m.on("error",a),m.on("close",o),jV(i,e)})})};gs.open(t.file,l,c)});return r?s.then(r,r):s},sLe=(t,e)=>{e.forEach(r=>{r.charAt(0)==="@"?UV({file:HV.resolve(t.cwd,r.substr(1)),sync:!0,noResume:!0,onentry:i=>t.add(i)}):t.add(r)}),t.end()},jV=(t,e)=>{for(;e.length;){let r=e.shift();if(r.charAt(0)==="@")return UV({file:HV.resolve(t.cwd,r.substr(1)),noResume:!0,onentry:i=>t.add(i)}).then(i=>jV(t,e));t.add(r)}t.end()}});var qV=E((qlt,YV)=>{"use strict";var oLe=fg(),aLe=XD(),Ylt=YV.exports=(t,e,r)=>{let i=oLe(t);if(!i.file)throw new TypeError("file is required");if(i.gzip)throw new TypeError("cannot append to compressed archives");if(!e||!Array.isArray(e)||!e.length)throw new TypeError("no files or directories specified");return e=Array.from(e),ALe(i),aLe(i,e,r)},ALe=t=>{let e=t.filter;t.mtimeCache||(t.mtimeCache=new Map),t.filter=e?(r,i)=>e(r,i)&&!(t.mtimeCache.get(r)>i.mtime):(r,i)=>!(t.mtimeCache.get(r)>i.mtime)}});var zV=E((Jlt,JV)=>{var{promisify:WV}=require("util"),OA=require("fs"),lLe=t=>{if(!t)t={mode:511,fs:OA};else if(typeof t=="object")t=P({mode:511,fs:OA},t);else if(typeof t=="number")t={mode:t,fs:OA};else if(typeof t=="string")t={mode:parseInt(t,8),fs:OA};else throw new TypeError("invalid options argument");return t.mkdir=t.mkdir||t.fs.mkdir||OA.mkdir,t.mkdirAsync=WV(t.mkdir),t.stat=t.stat||t.fs.stat||OA.stat,t.statAsync=WV(t.stat),t.statSync=t.statSync||t.fs.statSync||OA.statSync,t.mkdirSync=t.mkdirSync||t.fs.mkdirSync||OA.mkdirSync,t};JV.exports=lLe});var _V=E((Wlt,VV)=>{var cLe=process.env.__TESTING_MKDIRP_PLATFORM__||process.platform,{resolve:uLe,parse:gLe}=require("path"),fLe=t=>{if(/\0/.test(t))throw Object.assign(new TypeError("path must be a string without null bytes"),{path:t,code:"ERR_INVALID_ARG_VALUE"});if(t=uLe(t),cLe==="win32"){let e=/[*|"<>?:]/,{root:r}=gLe(t);if(e.test(t.substr(r.length)))throw Object.assign(new Error("Illegal characters in path."),{path:t,code:"EINVAL"})}return t};VV.exports=fLe});var t7=E((zlt,XV)=>{var{dirname:ZV}=require("path"),$V=(t,e,r=void 0)=>r===e?Promise.resolve():t.statAsync(e).then(i=>i.isDirectory()?r:void 0,i=>i.code==="ENOENT"?$V(t,ZV(e),e):void 0),e7=(t,e,r=void 0)=>{if(r!==e)try{return t.statSync(e).isDirectory()?r:void 0}catch(i){return i.code==="ENOENT"?e7(t,ZV(e),e):void 0}};XV.exports={findMade:$V,findMadeSync:e7}});var eR=E((Vlt,r7)=>{var{dirname:i7}=require("path"),ZD=(t,e,r)=>{e.recursive=!1;let i=i7(t);return i===t?e.mkdirAsync(t,e).catch(n=>{if(n.code!=="EISDIR")throw n}):e.mkdirAsync(t,e).then(()=>r||t,n=>{if(n.code==="ENOENT")return ZD(i,e).then(s=>ZD(t,e,s));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;return e.statAsync(t).then(s=>{if(s.isDirectory())return r;throw n},()=>{throw n})})},$D=(t,e,r)=>{let i=i7(t);if(e.recursive=!1,i===t)try{return e.mkdirSync(t,e)}catch(n){if(n.code!=="EISDIR")throw n;return}try{return e.mkdirSync(t,e),r||t}catch(n){if(n.code==="ENOENT")return $D(t,e,$D(i,e,r));if(n.code!=="EEXIST"&&n.code!=="EROFS")throw n;try{if(!e.statSync(t).isDirectory())throw n}catch(s){throw n}}};r7.exports={mkdirpManual:ZD,mkdirpManualSync:$D}});var o7=E((_lt,n7)=>{var{dirname:s7}=require("path"),{findMade:hLe,findMadeSync:pLe}=t7(),{mkdirpManual:dLe,mkdirpManualSync:CLe}=eR(),mLe=(t,e)=>(e.recursive=!0,s7(t)===t?e.mkdirAsync(t,e):hLe(e,t).then(i=>e.mkdirAsync(t,e).then(()=>i).catch(n=>{if(n.code==="ENOENT")return dLe(t,e);throw n}))),ELe=(t,e)=>{if(e.recursive=!0,s7(t)===t)return e.mkdirSync(t,e);let i=pLe(e,t);try{return e.mkdirSync(t,e),i}catch(n){if(n.code==="ENOENT")return CLe(t,e);throw n}};n7.exports={mkdirpNative:mLe,mkdirpNativeSync:ELe}});var c7=E((Xlt,a7)=>{var A7=require("fs"),ILe=process.env.__TESTING_MKDIRP_NODE_VERSION__||process.version,tR=ILe.replace(/^v/,"").split("."),l7=+tR[0]>10||+tR[0]==10&&+tR[1]>=12,yLe=l7?t=>t.mkdir===A7.mkdir:()=>!1,wLe=l7?t=>t.mkdirSync===A7.mkdirSync:()=>!1;a7.exports={useNative:yLe,useNativeSync:wLe}});var d7=E((Zlt,u7)=>{var Sg=zV(),xg=_V(),{mkdirpNative:g7,mkdirpNativeSync:f7}=o7(),{mkdirpManual:h7,mkdirpManualSync:p7}=eR(),{useNative:BLe,useNativeSync:QLe}=c7(),kg=(t,e)=>(t=xg(t),e=Sg(e),BLe(e)?g7(t,e):h7(t,e)),bLe=(t,e)=>(t=xg(t),e=Sg(e),QLe(e)?f7(t,e):p7(t,e));kg.sync=bLe;kg.native=(t,e)=>g7(xg(t),Sg(e));kg.manual=(t,e)=>h7(xg(t),Sg(e));kg.nativeSync=(t,e)=>f7(xg(t),Sg(e));kg.manualSync=(t,e)=>p7(xg(t),Sg(e));u7.exports=kg});var B7=E(($lt,C7)=>{"use strict";var fs=require("fs"),Qc=require("path"),vLe=fs.lchown?"lchown":"chown",SLe=fs.lchownSync?"lchownSync":"chownSync",m7=fs.lchown&&!process.version.match(/v1[1-9]+\./)&&!process.version.match(/v10\.[6-9]/),E7=(t,e,r)=>{try{return fs[SLe](t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},xLe=(t,e,r)=>{try{return fs.chownSync(t,e,r)}catch(i){if(i.code!=="ENOENT")throw i}},kLe=m7?(t,e,r,i)=>n=>{!n||n.code!=="EISDIR"?i(n):fs.chown(t,e,r,i)}:(t,e,r,i)=>i,rR=m7?(t,e,r)=>{try{return E7(t,e,r)}catch(i){if(i.code!=="EISDIR")throw i;xLe(t,e,r)}}:(t,e,r)=>E7(t,e,r),PLe=process.version,I7=(t,e,r)=>fs.readdir(t,e,r),DLe=(t,e)=>fs.readdirSync(t,e);/^v4\./.test(PLe)&&(I7=(t,e,r)=>fs.readdir(t,r));var wB=(t,e,r,i)=>{fs[vLe](t,e,r,kLe(t,e,r,n=>{i(n&&n.code!=="ENOENT"?n:null)}))},y7=(t,e,r,i,n)=>{if(typeof e=="string")return fs.lstat(Qc.resolve(t,e),(s,o)=>{if(s)return n(s.code!=="ENOENT"?s:null);o.name=e,y7(t,o,r,i,n)});if(e.isDirectory())iR(Qc.resolve(t,e.name),r,i,s=>{if(s)return n(s);let o=Qc.resolve(t,e.name);wB(o,r,i,n)});else{let s=Qc.resolve(t,e.name);wB(s,r,i,n)}},iR=(t,e,r,i)=>{I7(t,{withFileTypes:!0},(n,s)=>{if(n){if(n.code==="ENOENT")return i();if(n.code!=="ENOTDIR"&&n.code!=="ENOTSUP")return i(n)}if(n||!s.length)return wB(t,e,r,i);let o=s.length,a=null,l=c=>{if(!a){if(c)return i(a=c);if(--o==0)return wB(t,e,r,i)}};s.forEach(c=>y7(t,c,e,r,l))})},RLe=(t,e,r,i)=>{if(typeof e=="string")try{let n=fs.lstatSync(Qc.resolve(t,e));n.name=e,e=n}catch(n){if(n.code==="ENOENT")return;throw n}e.isDirectory()&&w7(Qc.resolve(t,e.name),r,i),rR(Qc.resolve(t,e.name),r,i)},w7=(t,e,r)=>{let i;try{i=DLe(t,{withFileTypes:!0})}catch(n){if(n.code==="ENOENT")return;if(n.code==="ENOTDIR"||n.code==="ENOTSUP")return rR(t,e,r);throw n}return i&&i.length&&i.forEach(n=>RLe(t,n,e,r)),rR(t,e,r)};C7.exports=iR;iR.sync=w7});var S7=E((rct,nR)=>{"use strict";var Q7=d7(),hs=require("fs"),BB=require("path"),b7=B7(),sR=class extends Error{constructor(e,r){super("Cannot extract through symbolic link");this.path=r,this.symlink=e}get name(){return"SylinkError"}},cd=class extends Error{constructor(e,r){super(r+": Cannot cd into '"+e+"'");this.path=e,this.code=r}get name(){return"CwdError"}},ect=nR.exports=(t,e,r)=>{let i=e.umask,n=e.mode|448,s=(n&i)!=0,o=e.uid,a=e.gid,l=typeof o=="number"&&typeof a=="number"&&(o!==e.processUid||a!==e.processGid),c=e.preserve,u=e.unlink,g=e.cache,f=e.cwd,h=(m,I)=>{m?r(m):(g.set(t,!0),I&&l?b7(I,o,a,B=>h(B)):s?hs.chmod(t,n,r):r())};if(g&&g.get(t)===!0)return h();if(t===f)return hs.stat(t,(m,I)=>{(m||!I.isDirectory())&&(m=new cd(t,m&&m.code||"ENOTDIR")),h(m)});if(c)return Q7(t,{mode:n}).then(m=>h(null,m),h);let d=BB.relative(f,t).split(/\/|\\/);QB(f,d,n,g,u,f,null,h)},QB=(t,e,r,i,n,s,o,a)=>{if(!e.length)return a(null,o);let l=e.shift(),c=t+"/"+l;if(i.get(c))return QB(c,e,r,i,n,s,o,a);hs.mkdir(c,r,v7(c,e,r,i,n,s,o,a))},v7=(t,e,r,i,n,s,o,a)=>l=>{if(l){if(l.path&&BB.dirname(l.path)===s&&(l.code==="ENOTDIR"||l.code==="ENOENT"))return a(new cd(s,l.code));hs.lstat(t,(c,u)=>{if(c)a(c);else if(u.isDirectory())QB(t,e,r,i,n,s,o,a);else if(n)hs.unlink(t,g=>{if(g)return a(g);hs.mkdir(t,r,v7(t,e,r,i,n,s,o,a))});else{if(u.isSymbolicLink())return a(new sR(t,t+"/"+e.join("/")));a(l)}})}else o=o||t,QB(t,e,r,i,n,s,o,a)},tct=nR.exports.sync=(t,e)=>{let r=e.umask,i=e.mode|448,n=(i&r)!=0,s=e.uid,o=e.gid,a=typeof s=="number"&&typeof o=="number"&&(s!==e.processUid||o!==e.processGid),l=e.preserve,c=e.unlink,u=e.cache,g=e.cwd,f=m=>{u.set(t,!0),m&&a&&b7.sync(m,s,o),n&&hs.chmodSync(t,i)};if(u&&u.get(t)===!0)return f();if(t===g){let m=!1,I="ENOTDIR";try{m=hs.statSync(t).isDirectory()}catch(B){I=B.code}finally{if(!m)throw new cd(t,I)}f();return}if(l)return f(Q7.sync(t,i));let p=BB.relative(g,t).split(/\/|\\/),d=null;for(let m=p.shift(),I=g;m&&(I+="/"+m);m=p.shift())if(!u.get(I))try{hs.mkdirSync(I,i),d=d||I,u.set(I,!0)}catch(B){if(B.path&&BB.dirname(B.path)===g&&(B.code==="ENOTDIR"||B.code==="ENOENT"))return new cd(g,B.code);let b=hs.lstatSync(I);if(b.isDirectory()){u.set(I,!0);continue}else if(c){hs.unlinkSync(I),hs.mkdirSync(I,i),d=d||I,u.set(I,!0);continue}else if(b.isSymbolicLink())return new sR(I,I+"/"+p.join("/"))}return f(d)}});var P7=E((ict,x7)=>{var k7=require("assert");x7.exports=()=>{let t=new Map,e=new Map,{join:r}=require("path"),i=u=>r(u).split(/[\\\/]/).slice(0,-1).reduce((g,f)=>g.length?g.concat(r(g[g.length-1],f)):[f],[]),n=new Set,s=u=>{let g=e.get(u);if(!g)throw new Error("function does not have any path reservations");return{paths:g.paths.map(f=>t.get(f)),dirs:[...g.dirs].map(f=>t.get(f))}},o=u=>{let{paths:g,dirs:f}=s(u);return g.every(h=>h[0]===u)&&f.every(h=>h[0]instanceof Set&&h[0].has(u))},a=u=>n.has(u)||!o(u)?!1:(n.add(u),u(()=>l(u)),!0),l=u=>{if(!n.has(u))return!1;let{paths:g,dirs:f}=e.get(u),h=new Set;return g.forEach(p=>{let d=t.get(p);k7.equal(d[0],u),d.length===1?t.delete(p):(d.shift(),typeof d[0]=="function"?h.add(d[0]):d[0].forEach(m=>h.add(m)))}),f.forEach(p=>{let d=t.get(p);k7(d[0]instanceof Set),d[0].size===1&&d.length===1?t.delete(p):d[0].size===1?(d.shift(),h.add(d[0])):d[0].delete(u)}),n.delete(u),h.forEach(p=>a(p)),!0};return{check:o,reserve:(u,g)=>{let f=new Set(u.map(h=>i(h)).reduce((h,p)=>h.concat(p)));return e.set(g,{dirs:f,paths:u}),u.forEach(h=>{let p=t.get(h);p?p.push(g):t.set(h,[g])}),f.forEach(h=>{let p=t.get(h);p?p[p.length-1]instanceof Set?p[p.length-1].add(g):p.push(new Set([g])):t.set(h,[new Set([g])])}),a(g)}}}});var F7=E((nct,D7)=>{var FLe=process.env.__FAKE_PLATFORM__||process.platform,NLe=FLe==="win32",LLe=global.__FAKE_TESTING_FS__||require("fs"),{O_CREAT:TLe,O_TRUNC:MLe,O_WRONLY:OLe,UV_FS_O_FILEMAP:R7=0}=LLe.constants,KLe=NLe&&!!R7,ULe=512*1024,HLe=R7|MLe|TLe|OLe;D7.exports=KLe?t=>t"w"});var hR=E((Act,N7)=>{"use strict";var GLe=require("assert"),sct=require("events").EventEmitter,jLe=ld(),Ut=require("fs"),YLe=bg(),Pa=require("path"),oR=S7(),oct=oR.sync,L7=yD(),qLe=P7(),T7=Symbol("onEntry"),aR=Symbol("checkFs"),M7=Symbol("checkFs2"),AR=Symbol("isReusable"),Da=Symbol("makeFs"),lR=Symbol("file"),cR=Symbol("directory"),bB=Symbol("link"),O7=Symbol("symlink"),K7=Symbol("hardlink"),U7=Symbol("unsupported"),act=Symbol("unknown"),H7=Symbol("checkPath"),Pg=Symbol("mkdir"),nn=Symbol("onError"),vB=Symbol("pending"),G7=Symbol("pend"),Dg=Symbol("unpend"),uR=Symbol("ended"),gR=Symbol("maybeClose"),fR=Symbol("skip"),ud=Symbol("doChown"),gd=Symbol("uid"),fd=Symbol("gid"),j7=require("crypto"),Y7=F7(),SB=()=>{throw new Error("sync function called cb somehow?!?")},JLe=(t,e)=>{if(process.platform!=="win32")return Ut.unlink(t,e);let r=t+".DELETE."+j7.randomBytes(16).toString("hex");Ut.rename(t,r,i=>{if(i)return e(i);Ut.unlink(r,e)})},WLe=t=>{if(process.platform!=="win32")return Ut.unlinkSync(t);let e=t+".DELETE."+j7.randomBytes(16).toString("hex");Ut.renameSync(t,e),Ut.unlinkSync(e)},q7=(t,e,r)=>t===t>>>0?t:e===e>>>0?e:r,xB=class extends jLe{constructor(e){if(e||(e={}),e.ondone=r=>{this[uR]=!0,this[gR]()},super(e),this.reservations=qLe(),this.transform=typeof e.transform=="function"?e.transform:null,this.writable=!0,this.readable=!1,this[vB]=0,this[uR]=!1,this.dirCache=e.dirCache||new Map,typeof e.uid=="number"||typeof e.gid=="number"){if(typeof e.uid!="number"||typeof e.gid!="number")throw new TypeError("cannot set owner without number uid and gid");if(e.preserveOwner)throw new TypeError("cannot preserve owner in archive and also set owner explicitly");this.uid=e.uid,this.gid=e.gid,this.setOwner=!0}else this.uid=null,this.gid=null,this.setOwner=!1;e.preserveOwner===void 0&&typeof e.uid!="number"?this.preserveOwner=process.getuid&&process.getuid()===0:this.preserveOwner=!!e.preserveOwner,this.processUid=(this.preserveOwner||this.setOwner)&&process.getuid?process.getuid():null,this.processGid=(this.preserveOwner||this.setOwner)&&process.getgid?process.getgid():null,this.forceChown=e.forceChown===!0,this.win32=!!e.win32||process.platform==="win32",this.newer=!!e.newer,this.keep=!!e.keep,this.noMtime=!!e.noMtime,this.preservePaths=!!e.preservePaths,this.unlink=!!e.unlink,this.cwd=Pa.resolve(e.cwd||process.cwd()),this.strip=+e.strip||0,this.processUmask=process.umask(),this.umask=typeof e.umask=="number"?e.umask:this.processUmask,this.dmode=e.dmode||511&~this.umask,this.fmode=e.fmode||438&~this.umask,this.on("entry",r=>this[T7](r))}warn(e,r,i={}){return(e==="TAR_BAD_ARCHIVE"||e==="TAR_ABORT")&&(i.recoverable=!1),super.warn(e,r,i)}[gR](){this[uR]&&this[vB]===0&&(this.emit("prefinish"),this.emit("finish"),this.emit("end"),this.emit("close"))}[H7](e){if(this.strip){let r=e.path.split(/\/|\\/);if(r.length=this.strip&&(e.linkpath=i.slice(this.strip).join("/"))}}if(!this.preservePaths){let r=e.path;if(r.match(/(^|\/|\\)\.\.(\\|\/|$)/))return this.warn("TAR_ENTRY_ERROR","path contains '..'",{entry:e,path:r}),!1;if(Pa.win32.isAbsolute(r)){let i=Pa.win32.parse(r);e.path=r.substr(i.root.length);let n=i.root;this.warn("TAR_ENTRY_INFO",`stripping ${n} from absolute path`,{entry:e,path:r})}}if(this.win32){let r=Pa.win32.parse(e.path);e.path=r.root===""?L7.encode(e.path):r.root+L7.encode(e.path.substr(r.root.length))}return Pa.isAbsolute(e.path)?e.absolute=e.path:e.absolute=Pa.resolve(this.cwd,e.path),!0}[T7](e){if(!this[H7](e))return e.resume();switch(GLe.equal(typeof e.absolute,"string"),e.type){case"Directory":case"GNUDumpDir":e.mode&&(e.mode=e.mode|448);case"File":case"OldFile":case"ContiguousFile":case"Link":case"SymbolicLink":return this[aR](e);case"CharacterDevice":case"BlockDevice":case"FIFO":return this[U7](e)}}[nn](e,r){e.name==="CwdError"?this.emit("error",e):(this.warn("TAR_ENTRY_ERROR",e,{entry:r}),this[Dg](),r.resume())}[Pg](e,r,i){oR(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r},i)}[ud](e){return this.forceChown||this.preserveOwner&&(typeof e.uid=="number"&&e.uid!==this.processUid||typeof e.gid=="number"&&e.gid!==this.processGid)||typeof this.uid=="number"&&this.uid!==this.processUid||typeof this.gid=="number"&&this.gid!==this.processGid}[gd](e){return q7(this.uid,e.uid,this.processUid)}[fd](e){return q7(this.gid,e.gid,this.processGid)}[lR](e,r){let i=e.mode&4095||this.fmode,n=new YLe.WriteStream(e.absolute,{flags:Y7(e.size),mode:i,autoClose:!1});n.on("error",l=>this[nn](l,e));let s=1,o=l=>{if(l)return this[nn](l,e);--s==0&&Ut.close(n.fd,c=>{r(),c?this[nn](c,e):this[Dg]()})};n.on("finish",l=>{let c=e.absolute,u=n.fd;if(e.mtime&&!this.noMtime){s++;let g=e.atime||new Date,f=e.mtime;Ut.futimes(u,g,f,h=>h?Ut.utimes(c,g,f,p=>o(p&&h)):o())}if(this[ud](e)){s++;let g=this[gd](e),f=this[fd](e);Ut.fchown(u,g,f,h=>h?Ut.chown(c,g,f,p=>o(p&&h)):o())}o()});let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[nn](l,e)),e.pipe(a)),a.pipe(n)}[cR](e,r){let i=e.mode&4095||this.dmode;this[Pg](e.absolute,i,n=>{if(n)return r(),this[nn](n,e);let s=1,o=a=>{--s==0&&(r(),this[Dg](),e.resume())};e.mtime&&!this.noMtime&&(s++,Ut.utimes(e.absolute,e.atime||new Date,e.mtime,o)),this[ud](e)&&(s++,Ut.chown(e.absolute,this[gd](e),this[fd](e),o)),o()})}[U7](e){e.unsupported=!0,this.warn("TAR_ENTRY_UNSUPPORTED",`unsupported entry type: ${e.type}`,{entry:e}),e.resume()}[O7](e,r){this[bB](e,e.linkpath,"symlink",r)}[K7](e,r){this[bB](e,Pa.resolve(this.cwd,e.linkpath),"link",r)}[G7](){this[vB]++}[Dg](){this[vB]--,this[gR]()}[fR](e){this[Dg](),e.resume()}[AR](e,r){return e.type==="File"&&!this.unlink&&r.isFile()&&r.nlink<=1&&process.platform!=="win32"}[aR](e){this[G7]();let r=[e.path];e.linkpath&&r.push(e.linkpath),this.reservations.reserve(r,i=>this[M7](e,i))}[M7](e,r){this[Pg](Pa.dirname(e.absolute),this.dmode,i=>{if(i)return r(),this[nn](i,e);Ut.lstat(e.absolute,(n,s)=>{s&&(this.keep||this.newer&&s.mtime>e.mtime)?(this[fR](e),r()):n||this[AR](e,s)?this[Da](null,e,r):s.isDirectory()?e.type==="Directory"?!e.mode||(s.mode&4095)===e.mode?this[Da](null,e,r):Ut.chmod(e.absolute,e.mode,o=>this[Da](o,e,r)):Ut.rmdir(e.absolute,o=>this[Da](o,e,r)):JLe(e.absolute,o=>this[Da](o,e,r))})})}[Da](e,r,i){if(e)return this[nn](e,r);switch(r.type){case"File":case"OldFile":case"ContiguousFile":return this[lR](r,i);case"Link":return this[K7](r,i);case"SymbolicLink":return this[O7](r,i);case"Directory":case"GNUDumpDir":return this[cR](r,i)}}[bB](e,r,i,n){Ut[i](r,e.absolute,s=>{if(s)return this[nn](s,e);n(),this[Dg](),e.resume()})}},J7=class extends xB{constructor(e){super(e)}[aR](e){let r=this[Pg](Pa.dirname(e.absolute),this.dmode,SB);if(r)return this[nn](r,e);try{let i=Ut.lstatSync(e.absolute);if(this.keep||this.newer&&i.mtime>e.mtime)return this[fR](e);if(this[AR](e,i))return this[Da](null,e,SB);try{return i.isDirectory()?e.type==="Directory"?e.mode&&(i.mode&4095)!==e.mode&&Ut.chmodSync(e.absolute,e.mode):Ut.rmdirSync(e.absolute):WLe(e.absolute),this[Da](null,e,SB)}catch(n){return this[nn](n,e)}}catch(i){return this[Da](null,e,SB)}}[lR](e,r){let i=e.mode&4095||this.fmode,n=l=>{let c;try{Ut.closeSync(o)}catch(u){c=u}(l||c)&&this[nn](l||c,e)},s,o;try{o=Ut.openSync(e.absolute,Y7(e.size),i)}catch(l){return n(l)}let a=this.transform&&this.transform(e)||e;a!==e&&(a.on("error",l=>this[nn](l,e)),e.pipe(a)),a.on("data",l=>{try{Ut.writeSync(o,l,0,l.length)}catch(c){n(c)}}),a.on("end",l=>{let c=null;if(e.mtime&&!this.noMtime){let u=e.atime||new Date,g=e.mtime;try{Ut.futimesSync(o,u,g)}catch(f){try{Ut.utimesSync(e.absolute,u,g)}catch(h){c=f}}}if(this[ud](e)){let u=this[gd](e),g=this[fd](e);try{Ut.fchownSync(o,u,g)}catch(f){try{Ut.chownSync(e.absolute,u,g)}catch(h){c=c||f}}}n(c)})}[cR](e,r){let i=e.mode&4095||this.dmode,n=this[Pg](e.absolute,i);if(n)return this[nn](n,e);if(e.mtime&&!this.noMtime)try{Ut.utimesSync(e.absolute,e.atime||new Date,e.mtime)}catch(s){}if(this[ud](e))try{Ut.chownSync(e.absolute,this[gd](e),this[fd](e))}catch(s){}e.resume()}[Pg](e,r){try{return oR.sync(e,{uid:this.uid,gid:this.gid,processUid:this.processUid,processGid:this.processGid,umask:this.processUmask,preserve:this.preservePaths,unlink:this.unlink,cache:this.dirCache,cwd:this.cwd,mode:r})}catch(i){return i}}[bB](e,r,i,n){try{Ut[i+"Sync"](r,e.absolute),e.resume()}catch(s){return this[nn](s,e)}}};xB.Sync=J7;N7.exports=xB});var X7=E((cct,W7)=>{"use strict";var zLe=fg(),kB=hR(),z7=require("fs"),V7=bg(),_7=require("path"),lct=W7.exports=(t,e,r)=>{typeof t=="function"?(r=t,e=null,t={}):Array.isArray(t)&&(e=t,t={}),typeof e=="function"&&(r=e,e=null),e?e=Array.from(e):e=[];let i=zLe(t);if(i.sync&&typeof r=="function")throw new TypeError("callback not supported for sync tar functions");if(!i.file&&typeof r=="function")throw new TypeError("callback only supported with file option");return e.length&&VLe(i,e),i.file&&i.sync?_Le(i):i.file?XLe(i,r):i.sync?ZLe(i):$Le(i)},VLe=(t,e)=>{let r=new Map(e.map(s=>[s.replace(/\/+$/,""),!0])),i=t.filter,n=(s,o)=>{let a=o||_7.parse(s).root||".",l=s===a?!1:r.has(s)?r.get(s):n(_7.dirname(s),a);return r.set(s,l),l};t.filter=i?(s,o)=>i(s,o)&&n(s.replace(/\/+$/,"")):s=>n(s.replace(/\/+$/,""))},_Le=t=>{let e=new kB.Sync(t),r=t.file,i=!0,n,s=z7.statSync(r),o=t.maxReadSize||16*1024*1024;new V7.ReadStreamSync(r,{readSize:o,size:s.size}).pipe(e)},XLe=(t,e)=>{let r=new kB(t),i=t.maxReadSize||16*1024*1024,n=t.file,s=new Promise((o,a)=>{r.on("error",a),r.on("close",o),z7.stat(n,(l,c)=>{if(l)a(l);else{let u=new V7.ReadStream(n,{readSize:i,size:c.size});u.on("error",a),u.pipe(r)}})});return e?s.then(e,e):s},ZLe=t=>new kB.Sync(t),$Le=t=>new kB(t)});var Z7=E($r=>{"use strict";$r.c=$r.create=TV();$r.r=$r.replace=XD();$r.t=$r.list=IB();$r.u=$r.update=qV();$r.x=$r.extract=X7();$r.Pack=AB();$r.Unpack=hR();$r.Parse=ld();$r.ReadEntry=id();$r.WriteEntry=xD();$r.Header=Cg();$r.Pax=zw();$r.types=rd()});var e_=E((gct,pR)=>{"use strict";var eTe=Object.prototype.hasOwnProperty,sn="~";function hd(){}Object.create&&(hd.prototype=Object.create(null),new hd().__proto__||(sn=!1));function tTe(t,e,r){this.fn=t,this.context=e,this.once=r||!1}function $7(t,e,r,i,n){if(typeof r!="function")throw new TypeError("The listener must be a function");var s=new tTe(r,i||t,n),o=sn?sn+e:e;return t._events[o]?t._events[o].fn?t._events[o]=[t._events[o],s]:t._events[o].push(s):(t._events[o]=s,t._eventsCount++),t}function PB(t,e){--t._eventsCount==0?t._events=new hd:delete t._events[e]}function Ti(){this._events=new hd,this._eventsCount=0}Ti.prototype.eventNames=function(){var e=[],r,i;if(this._eventsCount===0)return e;for(i in r=this._events)eTe.call(r,i)&&e.push(sn?i.slice(1):i);return Object.getOwnPropertySymbols?e.concat(Object.getOwnPropertySymbols(r)):e};Ti.prototype.listeners=function(e){var r=sn?sn+e:e,i=this._events[r];if(!i)return[];if(i.fn)return[i.fn];for(var n=0,s=i.length,o=new Array(s);n{"use strict";t_.exports=(t,e)=>(e=e||(()=>{}),t.then(r=>new Promise(i=>{i(e())}).then(()=>r),r=>new Promise(i=>{i(e())}).then(()=>{throw r})))});var n_=E((hct,DB)=>{"use strict";var rTe=r_(),dR=class extends Error{constructor(e){super(e);this.name="TimeoutError"}},i_=(t,e,r)=>new Promise((i,n)=>{if(typeof e!="number"||e<0)throw new TypeError("Expected `milliseconds` to be a positive number");if(e===Infinity){i(t);return}let s=setTimeout(()=>{if(typeof r=="function"){try{i(r())}catch(l){n(l)}return}let o=typeof r=="string"?r:`Promise timed out after ${e} milliseconds`,a=r instanceof Error?r:new dR(o);typeof t.cancel=="function"&&t.cancel(),n(a)},e);rTe(t.then(i,n),()=>{clearTimeout(s)})});DB.exports=i_;DB.exports.default=i_;DB.exports.TimeoutError=dR});var s_=E(CR=>{"use strict";Object.defineProperty(CR,"__esModule",{value:!0});function iTe(t,e,r){let i=0,n=t.length;for(;n>0;){let s=n/2|0,o=i+s;r(t[o],e)<=0?(i=++o,n-=s+1):n=s}return i}CR.default=iTe});var a_=E(mR=>{"use strict";Object.defineProperty(mR,"__esModule",{value:!0});var nTe=s_(),o_=class{constructor(){this._queue=[]}enqueue(e,r){r=Object.assign({priority:0},r);let i={priority:r.priority,run:e};if(this.size&&this._queue[this.size-1].priority>=r.priority){this._queue.push(i);return}let n=nTe.default(this._queue,i,(s,o)=>o.priority-s.priority);this._queue.splice(n,0,i)}dequeue(){let e=this._queue.shift();return e==null?void 0:e.run}filter(e){return this._queue.filter(r=>r.priority===e.priority).map(r=>r.run)}get size(){return this._queue.length}};mR.default=o_});var c_=E(ER=>{"use strict";Object.defineProperty(ER,"__esModule",{value:!0});var sTe=e_(),A_=n_(),oTe=a_(),RB=()=>{},aTe=new A_.TimeoutError,l_=class extends sTe{constructor(e){var r,i,n,s;super();if(this._intervalCount=0,this._intervalEnd=0,this._pendingCount=0,this._resolveEmpty=RB,this._resolveIdle=RB,e=Object.assign({carryoverConcurrencyCount:!1,intervalCap:Infinity,interval:0,concurrency:Infinity,autoStart:!0,queueClass:oTe.default},e),!(typeof e.intervalCap=="number"&&e.intervalCap>=1))throw new TypeError(`Expected \`intervalCap\` to be a number from 1 and up, got \`${(i=(r=e.intervalCap)===null||r===void 0?void 0:r.toString())!==null&&i!==void 0?i:""}\` (${typeof e.intervalCap})`);if(e.interval===void 0||!(Number.isFinite(e.interval)&&e.interval>=0))throw new TypeError(`Expected \`interval\` to be a finite number >= 0, got \`${(s=(n=e.interval)===null||n===void 0?void 0:n.toString())!==null&&s!==void 0?s:""}\` (${typeof e.interval})`);this._carryoverConcurrencyCount=e.carryoverConcurrencyCount,this._isIntervalIgnored=e.intervalCap===Infinity||e.interval===0,this._intervalCap=e.intervalCap,this._interval=e.interval,this._queue=new e.queueClass,this._queueClass=e.queueClass,this.concurrency=e.concurrency,this._timeout=e.timeout,this._throwOnTimeout=e.throwOnTimeout===!0,this._isPaused=e.autoStart===!1}get _doesIntervalAllowAnother(){return this._isIntervalIgnored||this._intervalCount{this._onResumeInterval()},r)),!0}return!1}_tryToStartAnother(){if(this._queue.size===0)return this._intervalId&&clearInterval(this._intervalId),this._intervalId=void 0,this._resolvePromises(),!1;if(!this._isPaused){let e=!this._isIntervalPaused();if(this._doesIntervalAllowAnother&&this._doesConcurrentAllowAnother){let r=this._queue.dequeue();return r?(this.emit("active"),r(),e&&this._initializeIntervalIfNeeded(),!0):!1}}return!1}_initializeIntervalIfNeeded(){this._isIntervalIgnored||this._intervalId!==void 0||(this._intervalId=setInterval(()=>{this._onInterval()},this._interval),this._intervalEnd=Date.now()+this._interval)}_onInterval(){this._intervalCount===0&&this._pendingCount===0&&this._intervalId&&(clearInterval(this._intervalId),this._intervalId=void 0),this._intervalCount=this._carryoverConcurrencyCount?this._pendingCount:0,this._processQueue()}_processQueue(){for(;this._tryToStartAnother(););}get concurrency(){return this._concurrency}set concurrency(e){if(!(typeof e=="number"&&e>=1))throw new TypeError(`Expected \`concurrency\` to be a number from 1 and up, got \`${e}\` (${typeof e})`);this._concurrency=e,this._processQueue()}async add(e,r={}){return new Promise((i,n)=>{let s=async()=>{this._pendingCount++,this._intervalCount++;try{let o=this._timeout===void 0&&r.timeout===void 0?e():A_.default(Promise.resolve(e()),r.timeout===void 0?this._timeout:r.timeout,()=>{(r.throwOnTimeout===void 0?this._throwOnTimeout:r.throwOnTimeout)&&n(aTe)});i(await o)}catch(o){n(o)}this._next()};this._queue.enqueue(s,r),this._tryToStartAnother(),this.emit("add")})}async addAll(e,r){return Promise.all(e.map(async i=>this.add(i,r)))}start(){return this._isPaused?(this._isPaused=!1,this._processQueue(),this):this}pause(){this._isPaused=!0}clear(){this._queue=new this._queueClass}async onEmpty(){if(this._queue.size!==0)return new Promise(e=>{let r=this._resolveEmpty;this._resolveEmpty=()=>{r(),e()}})}async onIdle(){if(!(this._pendingCount===0&&this._queue.size===0))return new Promise(e=>{let r=this._resolveIdle;this._resolveIdle=()=>{r(),e()}})}get size(){return this._queue.size}sizeBy(e){return this._queue.filter(e).length}get pending(){return this._pendingCount}get isPaused(){return this._isPaused}get timeout(){return this._timeout}set timeout(e){this._timeout=e}};ER.default=l_});var p_=E((Ect,h_)=>{var yR;h_.exports.getContent=()=>(typeof yR=="undefined"&&(yR=require("zlib").brotliDecompressSync(Buffer.from("W4IvekBxw2bzwtWbVf5fyX2AzAPMISJEY/fbMcKtepRTQlBXjG63eijJbQN4ALzvTBt+EVRVTTsqQ1wCS1oAYPuvqgWZIinRemQXGoWk4C5BOebq1CAsym3ILBoVZ6LpLswKQ4VNE6OQ3IoPxtM31ikJr/0aapiJOVzKMZJvVs7xyhEPb7LomEWn5rAew20WdiSC78J8645T+pzTZd2xBeNUftH3D/KCqIvf9WM4TH9KLFd/FFfbC9KDCMMr8adqt8u9KMdA74EW1Fz9lq72Fjds/1MKj113I0V5rYqPiha9B2QgN/UDYBFRw5RY5xhbddceetpc4haPeL+qeP+HTa1/Pq/ByyJE0UgpHdi9UprGorlUjHtupQT+VS2rl031EBiQOP5mroPRuipsZVWUW16j8M/7N+4KHWj7S2plWoCBPv+/38++//x8bZ2sRVXnUHS884T7MhrTmVHjqPfJZSGBA9aVWAxVdDc9Xf/vTf3++/NlPBnDmKNYctqelsOFLOtk2d/mNhagxTxLQhWSlVZ2r6Xa/z4vkq5xSelcxWaxOaNFx4IjJdnZ+Erp8j+b5umKtUkoCoPelwSsxzIp9VzqNhmsiVywXNlJmPWlWr9O1wIvqPm8JC82ja2IDr1iR/Fe8z/fZv0/P1+3V3CNoJcd5i006W2GbMubVIrYElLcSMfKvdfYoV4apEfBp/E11b/nciLpskmBtKqU1gftJEwEDG/ZtYz+9//7pf3nx7wFo/SUT5iokUamoOLyl2UKjdeEU1d8r9Zn1W/R7eZWhxGyeSNAH9CMnYsUVXwp3/n8cvE+dWlKucsjjWYs/4LsTBKzAwNjYyCAAy5NETCxge3maAgT8APsh/XO/peL90kHuBm2p0rV3fIPykIDzo74hlK1bAwxM20ZHt9U63ily5vo+kHRMSdKgaYfOwhz5Sn2hqLhvy9fteViPqI/k9DL+xoFskEQUkGCbXnH0EfVtM4EEiG74fjy7dV+uXg/8mlfsjxHVxeEgUS4uHF2DpkKxpM4LZ4hrh81tj8eOkhmfTq+2R1gENABqeimmItRoeJvJQub2vPpdo2nSCEiTvrJ3v1pZnEV7gg7+7bWHw9/T2fj2NRHgBmZD0gTueleIeisWP3ve1NzaagBiQ4pLZZ5N4QEOcfVAv/cc94VfugWOqDJboCoAcO4FCukye+935B/g2QZAKUpkJMoTaLkkNJqZmXnnXc7l7cb+//v+6WVmwJgtkaxRwjhjeEBiQSrmq21P8vHP+JuIv7/8ZsZGRnNlFNAElxFoAprKLv12efc974EEPEzi5UCNUWCZAuWw+oRylPKm/H8nrGE4Y3nRYI1a3G1VWss5Vjjjd+396ukveuZPAOC3hGow6czI949qilzduyanpH3yOaNG5FZ5le1k3dYAlQAg/erZHpX8khigvo/nVn7RzOS7603SEV3TaEB/xB2h01p0OjvbgwHYahSHZHHkmPJIYCiT5WibQ7Q5f3/ptrb3jczIEFxpU9wE/Wjdp1TO6D2O6UqxNK9K7x337zVvPcGR8CA/AIGoA8whM6SIHWWAMgNoBYAfwDwE7VRcqQc6Uw5bugEUCH+xB/1HVKqfoidQypzaAofF6XLzp3b3m2XqsZFaf/73tT6n55z04FGEFVPpo3z40SSVUWZZ5yP+Wvds/dZobzn3BsFpIkiMhPRZAKMEAEyukiQbSjVOTcT1LlJlCoBUdUJUNUNUKr3KHVVBKWu/u3+9zLPSd/5mRtMfsydGVk/mqm/1TfGgDpnFwZZVYV1P89TV//q/HPhVV/6WdbylQI4FYpghN+zaesKrSABi8VSH1Nx2kmj0XQsFUaHkK5/KcdyY0sswnPfvPCw6crGIMn8huUTkuWHrVKmTlHf3ABu+/6mxDupC4NeFbEgR25IDpQB4ogctIDx4v+eB7f1bx5MDkR+GMAGLIiNEQsiJSUNwgKLUEklUrj4vxfQGoroZy0UMgi9QYq78h+Wnfr7F+lh0AFzmEPAAXMIGCRIwBwiFuxiD8NuYXPo4e3383TBv//uCTN3WSoqEBWICkQFooItZEEgEAhEk3Xb1q0Pvpvd+6uX3GeSQyAqEAhEBQKBQCAQiApERXOpqKhArP/bnn8+zr2hfHjhBGEMOxhkMBgMMhgMBsMJMpwBg2EHww47LAbD3TYqqpm5T717dy0QiAgEAoFAIBARiAgEAoFAIBBUHSIiAohKp9p/A3DA5pMBLw4ATR+lx+ldZfjflmXc9VqyBAuwAKu3c1Vfv68x5vlt/h8sdkFuJKUjDCJNEAvxbubEJrZ+8fOz+QTu28Bv8/+fM3h36Lx1jmIgYYLOYGJg4uyFKBbqpK3Fex9/CCemR7f6iQJ6QOTu/q6mASmUbiAgoQhJoAeQLk2kiAJi393bfzczsyUv2TLwbvv/O8pzGcgLYwmLgiFuYFAGYTVSJqAIvY0bv2veuxPoVg0uEBdEvrkbQguhhdoFAkhIqCnUJq1ldxXvvssKEhYpfyGy6RbAv2zkGaunLESfoON74WHk+D2YOHbOwKOPCESrJ9S5BC7ZgBmPDoObI8dX5FkU4JQzYIGh+6zg9rbnz2QgZohZ3pEbHQ6sjViSgPTQij7Dxutes69hv+5XpysLHkb2cPjYxDOuImDZiaoy4Ysya3+5FPzE5FKHw06eJGnB0LQq0xyqR/1KeqUM8LspwsGd9PmHhrBBt+Rui33l3rZi+li7ZMcC8qelNCM+/KAvzkzPSyerciwLTg0KtrZmCWSr3aqAsSz8V6qB4mYiE6ag9wGCYqPgDqI267Rlxkb01wEJabYuUGhDWCL3ZOJtkhcF6ks3DJeL59x/rmExNtaU8Q8Kziwegm+LLjYrJXAPICERn8O4BPB6BSh8Kg9in4VbjjsaYtsAnLv7evkj3Q78A5v85T70kFfT6zcx7GaA6IVcN8jz9+3M4HzI8ZP8HklBF2bRuyuOnq3B17cPjzClHQgFwSXCmOgEQSY3xoTZFE0mJ8aEa1BiKTImOil6KrkwJtwAKSuBxkRrULrZU2U1nsOiC3k25pUg4NLu9emwkx81TFYucs3wxqTHHS3F/IzT4iFZ9UNDSGyevtDZ8c+SsOKnnc4/yzSjPj319W1EB9Q3YVDtn1sc3+yR1d9LNvyrOh/Ux4FZwNng+ukRPmqhNgH8bAzaGyCyAQ27E8Mlhdberrd1cTapgYerB6kFZOZnVd3F00FZ2X+2/enV06tbrcXkHkFqQu1kt6fF9Hzt6dosWOgP8DTHLX1Pq2E8SEttHRIqej5AnU3SSPSxhYloDWtmwUwe39LycG2LNyIhuSGGgBh5PTww6r6pfYVEbz6R+Gn1uPeUHhB+P6snLuKVEevjYfw9Esz+XTnYXlitNg/mdW3rquMQ9nxowHwWoK84fhOekXLSB2LNjiLJPLsEj8hbsJV5rHYhr9XAtadrtZwHu1m59oNrP3gtB3WA518JFHRCGRQeIXmwkXzYXJkRbA0+d2MmoCwYzfOvNJxCz3Fmdh8uRz78yjyYApcrP4aVuZ8RGJIz/crsNXQ8SbNuQWVDjLKYNHr1vSXqYljW4iaK8giYyU5vzdrBbM2HJpe7D88wqq37wv1n7yBPKjjqDwmUhLIvUUkGahBADYS20ow/S0Sdh3IZX+q49d89tUZiaKr67GoxsI5YDu13YaOg4ZBdFPpIRew7I/qMqqWwO94DJC4pG9BEcosloEHhmPMutLeOpja8dj73sJp7xz8GR2a4L2McYRSJ5bBWxxrwyoSDQ8YgwaKyLfb0aP9iWsq++f1HK/m7OSH6Kqev2H6VLT8yhUeNEKkW4KHkfkYxu+vvMPNPWENrXc4L4fQOkHN994aFLAUEMAYo8JCHhAaQXfvdLAR/JPqN3U7fXLVU3s5S2OoA5r/dSfv94iDXgDTwxTVMA9JAVKY7lMhTGqJ61AMqPJYhswoAhPBRgOblvaPB/TQCL/8B+HUaQAUPB9wUHPzYBzT2lkdoKoEhaffyQTk9csTGEuuJdPDBwo4OZ9ybYXNc4A71bdBm8ofUSrt0z0FhqIc9PdCQ+weKl/D9fisBR7BOudFyHbNB4yWVI3EvCyJKllFC0Wp9T5gsjT6YI2Zz4QQf9dvS1e93LndKH3HIakf4I69vKPEfxsYbhF7kXhaEwtU3zLI6lxudczrc3EVbB7fNqNfA28oCwfqobwYRw6U2D8RYtUNX1YNrorqYMJrqJU6mPT7t1I07laNu31cOST9Ok7DVL4b/orKbf93o+J7A556CD6hTR//2c6J1KJcFuJvVcwooEyW+AE5p0XllGdyFPsvNxzLspyC6nVqm5zsY+ntzzYtDRDZQlX5Dwqs+9YojNnoZ9dOFjMdrGP+UztqB5Vk/qaKlff+NW0cPd4uo++bXvznQOx4BRurVOAfYObmXxvxbbXO5rS6R2YK9nIDgQHJ4N6kRhj1hlt+Ey7+epBAgXI2cdypHEwJm4woBdjttQ6Q4Xywp8KLJxck0CiS5gpT1EoKepra4m9Qex1GfJIZlzuC2EmBRUnnGPiSsdYPShT6lfynnwanlJwJAe/lnNKGux1+W4yv+OCO+YPCP6xWngmCLVhdCEuvb+R5CCW/80/LtRpHoonAuHlG++hUSI+ve8XsDWMmSyAS/8uIh9GNbJfG7x2fhG/1KQk2y7m2pqGHbF3h4ww7lzlNIi/ngyCUaudEaRWXwsguWRYT1pLu0rJyNdmIuxAUJlnG8HfMt5BT7o8jIiviDqYCJq9dg12ifg84sB3UBD8KAhC8T4rRkY73q+kCBWHqCuU5IYnIdltwE/8UNJL1DlJ/DrkEDfy6Ck4xpqW+G4BVpn0ZXCVrcSCGYR44KDDd1/FymdTShe0OdNrpjZVcx2GgPccNtWxmYKnlrKGyROZJQzllGqNzTS2Z/5G06anFD79lXZxB9/25mjU1q922hHaq1kS+vubGXo4v5fFSdmsajepSTGYjMkyOL3Fiw+e7u9KRyUVBVu8gNVC/VGYziP87jv2vKOKDmjRXF+y0hxJvtummPy11OqHRX3cScswDP1jOVdAyg1WCK3nSdF0BVDdfcR4h36sh6wwcwGR6+nm1xZgxx8riXlXIPJL2Yh9sShtbC2jSNPN1QPr78CKMGYiIMB1H71ThPEUUoDELCv29I60pzh6SLt5OMdHGxWN+SYbgs8VmLaNoz0h7DnV6dvpn8tOFUzhtvp0somkWMTq9p7lom++gnyMDywdA4gOTPBMEwE4SoUv3ecxpbkQpWKdlXKXzI5C71nInrLMDxh7yQdp+SzjPoMvlqLCPAqghJC69oUUMIvkklZJFAwLMBFGCGWnP6pmkdlUvjlwSiAL9pWRvLRpIImrQBHgOirgNND5ZeehVPkEi/AcKuwgVFcA5zdmSqlfs+NFLu2yyEA9JsdzVfpiwEOEmn1uWPVbQ7O3yPsmXs6WpI5jJjMo2ZKm4j05By1ttSIw5bk2iiC22ECCroJ5mdO+hGCenkC+lE+ySJqqfqIkJ+9sZpV6/Rr2h8/+HPj4P+Rd9Xpgw9Rm4tcdVCPvnowzH3dheRNkB+GVHWBEXCQZOvDuRkpw2h7DeM4thaBLy+rHUV5T2DzNKu1KoiC0GcqZ+Epj8NyxIaRcmmXjLEtGGDsq2bKGSQ9VGGGKXsFuXP0unthiGWClGYWYWVuW99znc+iYTVi9jUZ38Us6r887Yt8pskyjWp7hDiMejui7KPyhrRH5cC5E91bXQNoFohtkBJuTINLPlEAAzjLTQxBTPPrww3pssM8CKSjsNVBBSPKerxFRJyoF4dE9CuZ1Bxgs0EUkqCDcOvzC3WtyCngt+sBavayVEScdnclhcakhs8fL0W9+MpyR/01tZriT8Y3qB+s9IUFmS4m9xbLTHUixxh2Loepl++OSFehJNMn0QNvVqrYdV17kKDySfzFHUtaWbGkJovdKPGupUY2nVKqWashiAdpxzIGRLn1qXW4/tamTKjhGPH2Nsic1aBxHwBhuU2RKMSLydB2obLQp/+BMuWptwGzwIOpk6XTmOKMugnJB8955oMMAmoeCNfDPAo2d/WsLsdsVBbdvOVhNm+2cqiM9iQsS5w7JocWUr51gb5KYqHTUkNEJ8Te98u869DGa8WbS6socqKGCSkkJF9VCe5jQlHARI5LdFIw3OouobAvaKi/Vdl/FYMYmm0ynq1SICNOdJMhX4eeFklpGWCMn615qWkUVR5h0UBUZQqZr7hd8Tc0LIAXPRWTW9srtKUFO4ra7PkrvEbZlVbC1vP4Ek1GKcp1TBHGrfz7HAgYqWyxnOxYjHvL1GLJ/6rEbZ3ezhjL0HttDpdVv3CBt7tIXtdYKi4IGcnlon8Om3jUBhF8EBJx94lIK3+rBfqhlPXY4+1mc5dSbeZ1WfvWVUV8i0ozU81l3uUgtLwAj19PjYuGPmtrTFsV2/5GFx/XELQHwOAjMKmq8kl92+E4fc+c09jIRvh4whvz4BkI1KyXi0EY+kum36fuCxAaCSQyMtH2QkF1wOjABebibpZeCrxsjmoPzNT+9aS4ygZEPXEG72kBA20mGMXH9bB1XR4JkBmPG3YS21XaAWHvoVy4fHDQa7h43ipZJ4yr2x/H2eTQt0uvoSm6sFf59aVwqRqEmy1WXNwIcQMXIydmNVH5UY4p/lB6g/B49KEXQL0B2A0x/IIYUniRTF9IhNjnclAcDNp0L46SMZnL4rrN4MRMJvpD7Zh58WWSW7qeJHpxa2fSLY+mRWItg9foXC91igcpgmHSQaz/OzWh8fMjpHDAPQHwLil5am4cMWi1k/EbQRgILCDQJkuNQOSWm5l8biwMzcfxupgcPh3h2ALdiyKc2yrTn9Ty+Z+YfPvz8D7BBbm2vO8Onv9p2Be7Pc0GHB72yOXNd0VtnvI2qIkyFmRz7l5U33RGa6W/OXd7BhJL0VQXIUyxjYmda/pNLgKrwTrmBwJdE6+1TIy1KG7VzRyuZlbLEUT9dpgmAShbfCopN5FMnkTYNJPTGh0NIUa3Y4DEL5hiT1RhGr/FPVqHs2f/T33S6IijqG4k8HzsZtWjKoVjaf6n3qvAcNnzTy7hjOCadOZ7bPdJFw1/is/1MKTt4MZi8hToV/F1Qf94c2j1rFCbSqgmeeLxHIbWRRVGi0l+2TbyA46UAjGHhzmoUTEXQtHpqGYtAlcq5hEdOGPORFwmO7eK3cMjwWIMwo2KPMkScsYUklaCMQmCEQ6imeZIe0PYcYOR40HCfRH1V7cWUsJOeEtGRsE63kxZ+POnnlfFwUFHd9Uksn8QF9daRYOm4auFWbvoCxGNlGWpQaheddqwOWMI9S3MykEH4P2xwAar7XaZpHQbvipit0fZppZC6XToDVKLzT6tVfgkZZeWc/ZoZCBXTJPlbebD86p2vxOUYJKlk54oqHaGxLl8xVT4hixfBbq/3JEhpWhB6IVhyuPJS8SaWJdt5cRXgLHxxm6XFKvcTB9OklRnrkNhGKWtfpro0Kr+xJJ873D2OOW9xQQluxVDBywBqEQ+uJlzK4zs11Z6K3pg+QiyZqXsPHMhVJ5SDtdfMJY+UnNsLKfkBYWVAWb6kqA0w23DoXtw2Gn6lM9oUKXV/y5Ev2ewl79JDn+6Jr7kT1coamngUnOGtiFsQJYNUBT4Sk23GhgzRNwVdEWfEG6qPtzmxXiWW4qHPLaqnphlVZeHH9p2vNHC1wwoS8J4mhxudZO775R2VFp8dcR4l16C+vQdCZ1X3J7s9c72BOPaNwzXLeGFKsAlFNNaW8eRMg1H7YIzxNOa1zF+fL8hAYH7QDmE0Dg+EMzAphRsrtRVadiWLIiwEvnv9Xt3gEvtGXXOCfptJ2qmNmgKEzqtKIsZcSIMiGWBIbjE9YJS/Wanu0e4gYBlXfg8DjZGAUPeMokpvhFsELuQxcagL7AvEFGCCcxfNglIViNatlBF0N2VQygBi84vtricEfs6i9uDDdDeEOI10Wu+ikyFfKN7fMG/w4eDKI+lcbHOsgdn6sZWR7UpoS9K5auqJD7yPtkNfVtbR3KWceADDKgmOTBLEC1HNnIuit1EbN8hQJmNH201yg7yDArSAYcEU+ZmmWpDMi7BGjBchzqTaZg4t6jY+/PRIoTNXvzoR5Cpo5MjOSDeTjtoKHpPrKHS4miUdbKPKtKCvxVAmconEDwye+M+RIhHd1JGRyQz0leRDZUUgOd/WwuP+uhWuTpWnXf5mwY2OqROiE9b2ge5c/S7sOnRgDgPlezoNItdGqJUqOFmTU6I9NwEIVEWUIR5oZVzMrt8YVRdxqYFGBIsLsw8DEGtazt+Cif84u6wTU2gwl5WgLormxO30wbrKMWlzrqml8OuVEHK0StdwcPD3TK+ocEIp5i4vDcv8ip4CKmlhjDkK8WB/K8lfYoA8RMnTXamvew+mYhLHBhrLCBEEYFFFLqyAeFnqedPF9c8K2V2AT1vAS839sDkDNJSXMiVPRl5/xBCEeZniL3pLda2ZXXwTbi+vPhT0Kzt/d9/VX1jB7uYxl+fbnE8qtqOotZIBpfSHGDn55gFqrM0rjHSEmU3LYLHdIDmYc0Ur4uUuf0wcj6ZLZbcxEYaSRpXwkYLXgXUW6KDYEtB2cYZOFwD6TKR8MXzXA35j/RXAwy7XluDeBxIwlB87YrCHuYhm6T57v/i8xzUiH3epdM0TIkaiAHOjlQZo5+ri+GbSNub9nteGyQIL+1ccU/UPLvWnzU+p9f8bGYkL1YKM08DKcgwd5YMnaw022W74fsHh6hzZ/GSI5fockxxCh1QnksQZ7vOceC5DInoGadmpJd5lFIG4S655ypy+J0lpQczRdCNIqXFUYtqPs/H+r4IET5opH6BLpxjpPSCIccVMDKrD2HCSTT22f/ZGthaWKy3LR5y0cLFTlewWIcsTtftPHa36C65UVE/EHg1U7dNBA8UarmQk4gnSAmC042oG3QZK3ptkUQP8UZuGpQZVQgwbjlY+LesqoHbmuwHYChlr9tFPAZ3nWJLn8elh8X6Q7c9QJb4T/OwhMxk7gj89jLkI8Udcd3r+WSSSVvpI9bsur6n/z3ZLTo+k2HlfJqDMlpgjC+x/EJgFoyh7ns5PNuflOQIyETrHM6CmsmT7PE5xfywmMa/FPRKUGIZ6LHwfxS4PuNz/snkYla7ybDM5jR4TFOLTTJdqG3Cq7ayzYZofOZWffGRZHIpYi3PsNAEaCveXWIrAWbLAYyT3Z9/0Q/dA1c8ZEz2zFlL6kVWbtx/DPyLqJemzd+bk9voKE+O+hAY9XqJEr2NwIdzMI+p/ZPaz+KP9mm5eUbvIbE3WMowbxYESPXgEgPZBspc4h1iSsVCl0Uh0WRT5ynDpKJzQstJhNufx+nTqBSfVnu9S1cv5v6M3g3Wj+5Z/sDL+lF3COqCGcvs7RTq2v3StgQb11a2XZS7m5DaGezTaRWdkZS3lD2A07+9HxOG7U30OAClU5VM5yHF+GlD43dNcGjKxq6WR+iA/+2CSCsLzHN8DwHkYMhvWfZAwyQjA7uYbuxUF8RBKG77PsDLvuegLCL8PCJmbHONKUSADEpnUonQgt9dxxvxAdn6HE9l4nUNFOwgc/7K+G5BG1YJAawZwZJ8qB1mxdVbN+RT++SUx8RXnwTzxVPhFj7w+iDjJNhx/craHf7j+5sMz46+PU6WGpI7B5R32IYc/h2E9vaCwX/KS3Ok65TEcZVp0o9RbtDcR0HR5VY5H6EAEeka0qMpQCtJVosILm5dR6PN6ibt20D0/a0KarGYiEkYIzemrFJCGi95HKKY02Obn3s7pOL2SLJq1iWFVm1N6pjhmOSAUh/GZDsVpqroj9kiTyP1fkG8/OVnmQeiV2SgkYw3AucrWgRwfox/T/SB2GtGwSVw6pJrSVzstFveXPthgLDeTInls12z0nFglaDyUjZotY7VROkvbXhY+NMcPR8x0kiJOdi8eViiV+mYmYg6UxcVxFzoq2EQdiEnCSAGZEPEdMIGBPoVCKkEZLexbhIfCzNHXoi8wpBO2NZV0c+ScioFpZQMJGwx207RXkf/8JccsHqbVib/0+TmKkfOJHhPSae6ra0c5CNW7D22trw8ObHNOV9xWHi4iVzK/DJGHsppNAqGc4x3zFD5GHaKcfiZyB69rMVju2yiU9A+HaJ/cG2hvz/ERCoUqUxpdjZWBnYOKNnjMfm98+OZekXYEH+U8ODnCL3mB4YA/kLjGqIish0mMZUDle2NJuHNrJTS76ObhdFnWO2GpI1f1DKZaLdWVfO2aXbbMyaP/NLO242TkwRdYHmLGkK+ClgPlQdDv00FWptnPiq4qHj6LbZdQjMwANrMTb4BhRb+6QVfNs+OlF2NJjbUGUyvJFS7K0yOK2vVULELGzEnJGA1b4LyeMxg4q8DeXKSSQLNWovZYUTSle9v1WDlxw0UBp6aZNrhJj/KONBCNzRlkcahhXw8uG9xoXvg/Em23NcNwxpu8MMBWI7XTZLTVWH/6xDN9INEm521aoxYknHqiaN8VqmGBEjFV5FIkL3326eWwhuyLdGwd5bJ3Xnuoob3XkkRMURHXeAVuENV8gLMehK+CRDMwC7TxGdAZBen/BMZl0sn9dmUDzPxsjqMaoR6YT77Cry7mdRNL+q0fz0WvOrFc1PI5q3cVgo0/6HQC6/dXzJGyM+H8Cw30QomC6AlmiLdUSfM13H5Umni/E/JJdzdpxZGxiY7+z43AbYWSfAyzRGoguGg/3ALla7lwGvyO7KcGZsnYbHIeO50zZfpINulwyluBrAV9EeZkq9bOPpkfls143cusV2wn1nIOVwhrKuzii6uKfHhTNkjhkCiKMEiOujFSUTfRTv9JiChTG0HZnFVmptzA0a4qu1hqbaxK4/socwXhkxgXCuK7Pnk19lM2xIEzKp9sZ3YVEWUKmvVUNgDerD5MiVB0MmRgh3fgPie7wBqfviBiwuvAHi2TcYXbertj3DlLTPr8oMS62zBcEmAfEAI9eJsZEw++CTEc0CzMZ8kbF+j44UU4jAU6iMOCmGWmgmUNAc/GUAfQ+hE4LAalQVRhL6orqPdex7q+u1+ElQmiHODfIJ1kc8K3qPK2LYUdtifGO4/tOWkvlSay7zHVcx7+FR8R+OPcYBEVwkznCWzau0HtHBHOz4lra36DjG0heJUAi6ypqOSFQwAHYc7VOdhiMA4Nwj0EnVYgxszQeoMt72crevZ/5sxQwq9vfUj2o5H1FmHQhWsh+JPZqz3r6Yxpt12djbieCdbMblbNDq7J+KfcTXSEUOdqN6fpzQAgZ5LkThApzdhS1KKjHJYjue+D3RgtKvrtUzNyIyP/FohoYQy67CqDMCMZSJqErOXVY6ciHk5qu9J6HGdNtTR+7x5LTmX78zZB9Gt766Ak1zHa8nI/66eJwO91Cswpy8cCwSsM4wwDtX1Ny8XYt1gx+n0D0+5zqhrOMY9VWczQUA4OWBqIptifsnUBZaivcRZTsR/UYuCXQK5he9TgqACElEGwJX6APOfnzLRggHPkrYDCyHxdGRreexKi6AzsH3/ADrwQbAdeHqkrnKxxlj7iN8z2jGVFRNYMs/MfI3p6ChVB1HJE8ziSYdNMcOIpp8Mzdy8sH4Yr+hPIxE1QLFFHnHhWJo2dqfeEwJ82nbUPNae5MwFrgtaGKjB9l0m8egiL/hW+xZbwAsK29nHLocshjlFV0MYjbec1tgUEdapGefcyO8YQFpT5bZWEHpdftM6ebbbYhApPplTFXD66EOYmjoUggPnu2LkVu9iCzbGxijyfYlCQ6Nb7Kdhdqnpvq9PSapY74xSOlaCbNhV1fV4vv17KZD4aVv86qJF31b2rELMN9kPpKYb8tKcA95TDqWY4BnpVgQ2a33dX3VFYTJrqLH+xFyNDJEBptb2JHVbaQoi6nsQl/x/LdIFvFSojTmIjTjR7IBCPkGvRbMWWJJjQmzTqbuhPOC1Jko8cf2gIwaloRsHNXsNBgQybhZ1mkfrJNW2TFTnzYnicf0YVrMPS4HSfstMZl7EE23w4uW0KFY8KVY5YaOmltAcOLdHEZ4U4Epe5yWEf5qbDvFTjEHKuTAWpyldvYz3zlXtB3sr0OW3EUeP24/bE96RH/qALHGXqxq28/tjPxaGoWJx+yltI2grmRLWcFg7ei7MHP6pNyQ7IGNyG0guFiWnKx16QWoINyZj7opcK6afGqfK4zlkXkN+5JekfxdsHvfpFr07OVpu5zH+qICOBabW6RQPSz3SlcFy0LUoOwoKxZdoxjYLEghIVHtG8Ku00oGkAa6aumr6X95KMbTA16Hg99NcgvczS872jF+r8TyMfPYLaBsE6v8N4jiKjHbLnfT2fbD+J8V7GefIaxBQktW7LCbsspPkMhtPkrgdxdg/xaVkT0h8bAwWyTa80SBE8gdUN9zVeSOfZjHrfdue4+nGK6hoHVlB2xA48nuQhnAQ6Pa7ZAU2h+LZ+41tUeWuFucYpciSeMTYxMjM9kuDFaR98T41SLdgsKJ+8DVjknm4l5F6QumtsJ95YDpwFO5vWD9WjR2P8GJPyko04MWORbf2Vr5GbzyusZwxa+VflilV3NGc2ZSSkX6eu1dW/dzkKKx7ZO66hYNGjPM2ovCYaR6FQgNK99WhlP7tnRgVBQqPS2AwR0QHBFoI5Dtz286QA0E5JefpDXJbF3CYVL5PlS1hd2AlUjqmLR2GntSIQhlWdTMBGbPF7mE4dFbGnlBwt+ax+73uZifu1jn6kqfowlZ/mjvS7XrUpOk86HImVx2gIn98yRYOLa2GemxHZrXu9p2Pw1W2HcoEPTuS7S55JDw/zo8ywPkNM/gBmL73l6ZRdDeL4GH9M8Rg3rA0RPy0qLtm3QinoIUSgy6cThM9+DFDBznG4//mYSQH0TU3DVm7RDv9vUMxGSPdWvmWKwLmFySfqrbvOavXV1QQxMxm67K0aKEg1pKxhvBLKevvq6/fYQdpM46sQ0usycSWIPuu/vS+BSjJbNjWXkPISdqth9BHKQ5fojtqbxTbNEc3l6rt8Sjw8lpGfE9tGNAEuVPsXEfpezIxueqn3EY4lnvUJ1PfTb+2m7sdaWEB9DKuHl2vS39OA991MuEHszmhezvh3IaoJLj2Kx+SFZng65550Mg2dnhqbb9t3I/Ifomiv6JF3h96fasYerqrz259s+3df9EfWvdP/zv1iT+/l98/1sFstmK1tfxnzfZmFTC4boS21u3xu0BjOQqOkj9uP1d3atY/7H2LCssGKa+ANuCDesSb1zt4Ns2XkeDHr5833Kl11ncoNtWvva75j2UWX7ZhWJ9bD30PwYFEKh7zee8qUB2ZEWCEbYkiwe2cDeH7NYWSN15Sx+g+SIYiDo2trE4sPnJXg/ShIjh4A4gQLBb7pO6yJ2NWiYgGDJZQSjvjuQjAeXDveXKY85vF7SMJCbu0izwgnLWbhqGpWylhbUcVYHHZPBnDiCr2Kv233xOVt4CvDFp2egXmxfs13eprh+z5A2VNgG4urKnPEyWet9bnHaJEhZDvmHL0IN/fCP/zMc3j25/JqeCU5/O5kBJg5jqJnY92XeE7igrecVzYI+XcQHf5BtR0r2UnOHAJDdPqp7eXcQpqgd3aFL+oEL5HCesNt9FwUAyD4yAvG2pI23ku5iuHl1wDi+UTI2FQk97AFpAeLDhZyQiwptvuIucsdGYrKKeKq+rhyzN/kyBSCNNjngqJ071+bs40O1A/ZWwTHhyFAo5RCZItLChAzseh8G5NuQwBETcOMhxtdnXHEwTkhtjnFHPzER0emkddH0Dmo0Q0QfbnB4bGxC7zytPa6RebC+EF9oIXZxXPTyrQYdVxuwGYvP2d8R5fhzaOwd0qmttfB0bvycLTJYcEsj0iETbkPVdCXX0TSgJe4eVXW4iuilE/z+SszWU2Lz6VhkXt9e9e5+TswNIiA9SQQqo04zavT/LhFmMmDsQdDPV/3ivYSl85P0sG0oe6siK8P7EP8rZAp0m8z4XV1m0ua/QrBRUurpFTDdIWwjLiU1pbM+VqEXMF6YKjlY+dyHJP4WVnaqtz6YfX1BLE8n+4ZCFTxFhOC5D1kKLoVpRB3bhVwYxyA6JAdc3/q632VcX0jqQ88lSc4K7h2ilxP0O6yz/feveNdSUY4yS9iExw5mHRZPzhqgCwXpNCuSa7jlo0d2WAXryYWtdlhHtXMLW2w4R6b5ktZbg9c5bH9xaYfuuVgSBnJPUfqH1uZqTLktK4I326YPfB3OExX43qLfS307HPW5K5lGR9kfAT9pnDTZQfOWYGxF1xS2/CC1TwSmBYNgSeChdqJRashU0FCxbvYyBZVADHKZ42DaMrj+GcL25bYR/If//P3oKsBBASzPytZ8FooIm5yDqjWWD9InF0f+LE+TfPGfXrSsVWbKBuwUGc90rqLiKb29eaOcysiyaWtGg2r5KWC27EyAsiUksu1WQQojnzWp9OI3wjDPUfaiMcIFHidguJ9ivUchJsQkhROnizsT5Q3+Cacr5d1iiv5ybc9Gde0DNtTbTyAAka9DXVic6VnMAyQBly7m4/5mrDly38bHWOHkc8eMTsNjmu4iad6Y3+7CI+ndPnvy1mThRWcvZo1A2dtik12MVdRINeBziTHN6Uny/wNytRPKrR3VX5wPLZ+5yyDrPnCRCmenE5avXSphmGxdC3TXMUgSDLqP2xiAbOjkMzYrJQBGipA6FSuADCSMGyhPDDTwKsWpTxZEqXQDVeJq6KKwbHdx0+/Fb1ULQbuTs9y+GDwFhaTEWTkNZNhnrrGoWSpDhtUcKrUNjEdb4B2/d0N/SXspmDsZaz8oJw1dWQOb5jVnAa42zu3e9IKI1MaONm4Z3aaILxLtEojlyKiSD2OTi8WK3rzaUA8fII2Q5auytGRRdZfC/ezuAaiN8T6Z9breHDomKPsnNH9C2xQxa8kH2oniwphwwTBe7TqX2p9RPUjxbp3tO3r/1rYzPGCWPBoDYTmExK9gdWb8t9KZ97EIJgeHhWWYuSCPolOODJZj8oEu806R0H0887yZLoUfAj2AQieJoS/MBY++GCEuaz3/8RfwBZ9BaDO7+QG1QMF/Cr9dm4H0aoRD/RhWKl3Hut3ehD9/t21r1xeOWy487TYEIWLSKRape8kLHonCYiJIdFclKGcMAnaYcdK2mhI9IXa9tZ4Ra4bVr+Y6ns7hjssndY9DYYQnGhhH+0URuJfQHV7EH2BECVoTKMDoOz7975yjzsG2tB+q4kMBTcuOIfa9hoNcdAK7SdOCV6xZMhHYsWUsf+GB8y0ALVFp5gTmnVzsgd0cTWRDxEYGlFRjOh/kFaJyd5xPODmVBViqlG0JldObfQlDtDdFY/oQ6EvzcnBga3Sab9HKGL4TXNyn3T4sVuD2r3HnHOW3xjAoQExzwz2jj3N8xR6aahE/gSbw+G3dEZi0EvoyRhd4pH1+gbxGCjGmNQffRfqmut9TEWMgIi4892u5XjpoMiH31zdoWrGyUgqM1KuyO2EvmEKz1WvXVOvNryWqeaYGziuww1Bof9dzAT87ssuMamvpG39bno19i2gEXezaAWu76Gj3nr5Dv5l8hkyW3jNKFqDpqRW8Ci/0dtCUDToVYr8pUq1noMSeGv8j97eowwCI6yaoK5GZfYqAI8A/QJX6/01K2cJ5BoO9vIB4K45NbwkMkaJRGzx7qIdS56DDsBgQoGq3GNCKL5IIlmO0DbgzkGHT2nrgijuVp3jwms67M1OfUbpz+OOyMPxASEE3buoYPk8N8InerulVHtIhEQUcAXXoqXm5bD5mAE6FOJspp3TmZBM5riURTDF5Fn2Qx9QiTKvvye4StR7Jkmrzej8EXqw9ltyV6k+CSq+Nxev9Kv0tc5Dcjcwy2kHiq87xh6xH+cicfvpQqgyZ0l36DIWjHdddb6HYq949HscEUqVDPfAtP729FezPotxArrNCsCZsQbJ/PNRIFyIDnM7cCMkCsc5PdPmffz4pgIGg4vj90B91B/zJOpOfOJua7KLL6YdEsPK5stODY5Duuv+w/Fu9mZf5qWAGCfXBi0ZMh8i24ib7l3Z2C6SqonMOkY0iieMRQ4K4+Rw2kn6wljFY1SpqOivg5zy8iQa9dEDT26U6YJMBV8wth0NAg5pCeuEcieAfxc+mFiCq8VehTPol69Yv0eTfyA8s6jiQ6nEHJIhYuGLoLYexgE4Bss3n0kQTtFeU4Eu+4iFtnkPdhrvIzg7YzDFaY06BwlwffaK62t8GuWr761k8bnhd8efI4lG/a6voA6dEZNHW3YD8RcIE3Z2WSvqyCj1IwGsIpXv8K1cDHtjG9MC5HKEKwerVkeplsKYiNmTXCt1Yc1AviQ1at0s6dRVxZdkzDRbUmB0sUibYAG2jpJwLzTDw3kt4WbLe4t3vrxgC+pxQEsNuH5tYLpa/GKWFsTXOemwfGzWaNwH40khfBRHhlNrEVlB6GY7tkSkHRua+SZrocOSDM5Uy8mOVrge/GBPwKy3u4yEC2RPb94Ciz3L8wwxyl2537Kdxbt8nQy0XFnF/8/kt57kvUO/qM3aYktw/bM3z0n7ER4njEqNi/S1vDva8P3H3mG/2AXVFTWW7BJQae2NECYoaUZvqH4/nnr9QN0GtIW/0unN7382JDHcmP1xUcYIvETfXWEm0QlU3dcsbeiSJu4wk9tGOwA4shK6yyutsoDO60YHRgyWggTMiQtduN+1s1mKAOY73cxFjaXGwGsw9OY1sUrg/KeUnGg4ioEN9MGWzSaoJbF9X5EcKzwyMBdbQomkpiIQ4s9nKrRZxxSqhHSM5Tzn5AjYw0RwqxwHYRalzXn7TYLaib1maCjKMXIwCJDpHI5OqpHl05e+4FYagBNFIidQKa4ObBKaMNfSiPpXx1vIsdiFqkfaCnaPfaPq8SvvqIVXqrXjLwwfBFR/2MlwagB5A2zYSzlN4pDB/BvDfBleRqvUApoNYRAsj9MWMF0ESW7D/5IGrQZAYFBmRScfBKNHkuVoVgRDMcY9KjEz7GcmmBE4OVzyii4ZCWlkJKh8wALKWTjB09I62FRWSTkmIoNNOgFyTsbNj6mdbxB+DtI+z0943CUiNcyCOGs3WRAVWoseHLOih4ATg60CJbNis5pSYqFPtkC+iQGR29U6rnzy1sDBE8p2zmiql9fFWbkDQqPtDnu1e+BnQaZCsOFQ1pJX/XPj8d7PMSOD8zz4iCoqKFLJJ+TYwpXcFOIlk+53Yb6RZ/GOoFYJPL+qy0DXwcZOuIeIbaKgvo+qEVy1wL/QWvb+D++dw0KjXFChOr/CbFcMfRVTniApLgYkALNDfFqC/7BNILZ1BszTQWgeCSunMPL5MxtK6vHrv1jElRcKiCeGsS2igii8qY6AbZ5UPamASQ1I1ViHxhmEOnEPpxiNEQjXItezWXg5i5t77ulxfsFVsctoat5i5KhZSieRcpZ74KDMoYxer2YfHSal9uyRqdKcRID8x6Q8Mv0o70FuAQu9tab5joGmsNfqELEpeQftw8rryAdafj0mGUDEsLbvHnqrW9+zxDI6xheX4G8JuwlNKbtfzgesFM2RmwfsSCC4stlTqnHsn40cqGpEE89vxln3R/CB34pZ+bVseGHvInm6D9ETPQzwUauXHzXRhJVF/IKL//P1k3clN+JFdKnwna6P91rrfaRafknnfl+Q1egr35nYzAeYngSH9ChpcBlXjoRe/DIt5b0uZX/7wkUd/666ZWMUD1MHGWeRSMVNzpI5DlT5YSBzf0c17JT7QgNQPYead3/jV6l514lU5oxnd/ZZ+/LA/VQOCYNyeFrnJb4oelRRv4nhKwLGthQPN5sDYjBaW1lP95AxjXzkLVtF2dpmDRCzckxq6nMzOjZDWP7W5mwYtXZGb+LJ+ZefxKbuELCFykeq5hZytrl8Jx6gopme4r3u8aFomMSkUiDpj1lRrxB3xBkPgSa/hs6D/IJ+h2wekNBrWlX36WRm1Pb7qTosxV0EaO/GqBgVqFu/ANIEUlpAYJ8oTdUoKqYu2j8ZASyiFmsqk0xCCcnqbM12JTQRpL9SvddJx/gJ5ob+rwl9vNzsRpVh1ZYOtw22UioSMwYUAkoMdAvQ8KxOaPxs3Ptffk5TWd9l6shs98OXzNsnYKXrCEPelu6uj7sdpU2lp/CR/IBBUPnm4NksP8ORP4fSOSalyHI9sE03V4PQwxq+KeD9n6/8y/hSheYM0+BpER10cOqu1JaO604/qOg0Cl3sUPAO15AVDfq0/UmdZLxE0b0m+3qYaD9v5kiWjTsGFuGMecwanb3DBVVWnmQZNolmA17GR3z1VBziHZzv4wZl6HZ6/zwAG4lPHWkMAGE+l33p6BjjAxKjFx74m7xA24JlZmLRE/UDeX33z/AUF+v2MK9ORPBV5MMapc2NP6gjP7AhlPrnBiLl05nHKv7QxEsnlSzASoqtYSLVfmajKBCSfnZ3Jj+klXxRZAlMmMLl8t+4kMkxw5EJshVUl7VcwuYYwNaTvFDdAi089BxPxxaH8r1Ji+3Dy806CRzoORgG0v49MAvDJztFRquRfmwuYAhZaX5+5ZavEYfz5UbCbtoQOs/SThf0Nc3/rFdRRKLOWSdA5j2W2fCFkMJwpKgdZozabLgnJMitHGYNLcLh9MCmNqHv5xA2Fr5w/U4ejlo5934UKbOBFfuLUNzr4XTj9MnYT92pwwjrQ4LdGZ46hisempe7lC/WeLqW3ktTXJIVvims/5JTmaesejR6CXBTnJGcc+9NIHT0h+vr39G6P5Az3UtwMpMG/FLf7UapON2ZvVe8oG4l1Q2A5csOZ3MIIFKGbX5y52MZd33lLW4rgGB8QtuXlj8/xlqwg6nSNa7krrYZPhUuntQZiqos6tSkZKxbtauO2a+vPRuAWb3WzKu8HEgl5LKsy5i2wmvs2Zletv3sqoaZAu0pJZTLB+W1fviTnuRrQ9ULzT9lRugoO2U46oxA1RC22sUaAu7HN7OwwYlV4cMWPCLKEqHKjBpALX946mzzenj3A2K+UZrPkOuNY70ozV40k/Udabk5oWI01D/AF4pbFqv2v9OrmrtOqx0ybGu6FdAjA0ABQqn2jvsKu7Wqtz7LbR/Eq05ldmZUbfxFTBaRBErp7dHKy6JISJBex++m6u3pAMJwyLs9tT8f0s7h91JaekMsmx/PLCJ+yrHot4M13j6mPxOPon6odoc8IHreffZo+nQ9XWXpy9u5zJUeylJXleTxCPT9p3Gp9PKLFSwKys1UnNtwOVrF5WLZUlO7sU2/VCUWxgTt4tHN5uUqcJgwmglA7qSfZ1d30t89AFOBMpZlaigxkAR7Mwe5IbITIc/SJAi9OXwnFUNRhQkr8RU1KTKd0TPztp5/dw4uHR1VHbA7Gw1bynwXJ6hi/okf6SdTykdPOyYmd5hj+1V7v6Qe7AKXoL7/NqroCADvqGxm+qB7STzOtDzRV2PTdRCTnC5rAbhGZu1ZGDvr55UsJXr6Z0NTSPK7e3WhaDOyvdLx0W4mjLwDlZ4Od0/AAgydEhqy163HZbtPYOo4PxsZKG10AjITQasF/IexfKxxmrCz/aqoty+6yaw8OAB2TnkZZOQmnv3oR5lDviO2Z+aDEsjiwjr+mxr+7sW6a12/9KOPs24Md4l5XEEO9xtT4hgULLbngsbU3fqyEyfareD5+rDL/+V1kV2yuB/PEBoGY+AOzTjm541U0bVs5EfILtFku4yZ2/XS5veXaqb+Oy5HzhdljFm5QUd2yoCxj6u85OEEQK2b+oSS6fJKstmkEv91W4isocfZIFgXhmQdtCcUzGV8HGvabM0VwVEThC2Y7k0cv8TIsI5/Zbj/t1xCjDpTWE/WsXmJHpw3PrurkQ3LXujTD7fiNvCjcWAwz3OeFcaoCjDyX5EImzXFLtKUHyukzwnz6spTz4V253X9oKb3jBHNjBXfg6A/zasb8O8Euy8GG+YIU1xoC9eKWJXPJKa4AYqBxtu8Xr4u2dzvy2xrEvH8hWP5ieQ/7BOUd2mUO81aFBlcxoS2n3cKA1d8xOhGL+/F9gHITE+pXF3XiuZwjXytEx06GmkqH09VnjH/9px8XVe5pT5cd3j62eIk8mov8EpPaGIdCkcLXAS6tg3aLFLPEdjKVzC0h9dzODn1JNdcLVLBzHH8nvMTfMwEpV6sGluJYvABhxH0T/xwPw40HANQa+mcAeKbX4WLWxVEhd8W63kxMsm0AgwD9zFs2OsZqaln1V/18nD0W9CaVZ7nE6blw7N16ZSqvUEUvs2dmhducprvPCmg8H6yqFBnpFXFG3n3g81wWtrpj6vqx56s+VENthhUKTcbpA/IqATcJ1tM+GVCxAIyZkqTp2zWBOe5qd8baq1RW2HBmKGI4qS2RN7yWVC1BAG+X02ycfhIIH31VVAxjyY5piNJBIMnPmWF1dtcz1AqIwjgZE0bZCdrqUfgpOB/mj3pgfikrbJbCAVDLxr8YZgB/O5bnP/fMTjyO9znakvhJIZowg8ZZsP3cek6YZdH5IL3gYblDwjvPAgTOJSfVoeaGpdSO6aDwpHMdOyt6dD36bONTdJco2zaSCMdYMjMPtnLsYy/GQKLvXx4jCPTrxlEjXYKbKewf90qHz7SxtTSy1Bpb6R74VMfMy9wTvzWdH4EvpgN/KPelMnv0JKSu5+TjNZoLigShn4E6H2ierDCHUI0rOsFrEq0imZEDRTyvCHe0Lp8fO4zU2dg0MOLuzHYhfGadffohAfY7Y2u4ZjDUhcnLQoMEqW0qhMrsZr4Vp340O4+klLYxP0TZNFs8dHjli0lpwyMjTlDKb8EXxVU7rwonn6ibEmzlE6U4OUvcT0nl/33M204WY4Gc4JZ5RgmrT+82ftTGbhuBkuEbkNxMtRh2PnQBYEfXvL9+phSNvpoeCP13rIW+JZZJ6R1CFK0jHGfla4YhNGd6lP19UU2zPbI8r8k3HDYtq/C92GTwR0sCrGXGeJ9SexhwxHZiZt2FzKaS+C+ZPVD4FpHx099dKaDr35szXATIQiV5O7vJcj0VVIatzl2VTJhNpUTaSKk/ONpJeQxbGHXBdp9Jos+JZ55eQejTtY6HD4R+2+pYI+c5ByNfBDyn1C490HfpRK8mFo2vdvSEn53jItsu/8JT3yfzFkgeUMP4xWBS+EBa+bYpFPJc34AkXh3BGLEbCp15TTPkemGSfSbev1ggmaDbec52EcGqzT/HTnoasdfic24uHx76YY7YovwuYOGqVOUozYoySXQF3hbC3PcLAy0Y1k9RupiNCboXdlsDMGtu7A7Mgregl5hFZGtnK1ibauSG46hjlZpabA5XIj7TTJPTkyYvCcIpn2PFE3xYMDcan4qNm/fUCXDomWOG4ytdd7aUwjp1VM4ZSsRs3jK/QhF/F9dDYn42jSH9eguHq4IxnHX1+5s4xV4Qi6jm2p/Vphl7O5P5SZmuhJqbFD2UPacSiCkEUCsdrXSTlHPH46PQMO9lzfy0MhdpF9lPVVfuAlKEIno708xinPCRXpBAdKwTU/7Cm6XQtAPP3unATuYS5fuPN4bWEadnnj2zuadJ0pV1ysxWyPFC0Sl3a1a4vQeDHOow+OzN8+7uveMRjGmeBi1yy6pIX3/LB7am//QyYDpa90LPYy86NKG/8O/5ZWkYZ0cIJnEVwMmNhfeQX/G2FI9DW82x7SpQqZ7+AL78KDBHaNf0sIEEGRFFdm3g49UNB0bMBUUJnSppf7qYvciJn3EfRhnso36OUYMeWbHQKcRD7d77mebL1MgWeevkzvPunC0rIVHsOxdLenWSZcBWBosiKabQelZY+3RYpT6qyRVTtQxfT/pHhl2Tt2/Jy/eJX9o06IXDheLlr6Yqwp5w4QCOaX7FORmDa8KnokryAMeTHiXef33NK+bD28/DoF2hRxfEuS1TP7jNMoNPAzZ3E8uW71MMHF3U3YnXqs8oE3iR+J/NGRr004zvuNsScglU5FVjcEPAA3xcWgy3mXyZOEo8j5f6+PIJXCQEQ79Hy/Siq6Kr7rpNkmXow15+hSYum7fNr26JfZMZ3vKB7H3Tx/FYvImh9slHbgQQTxmbwzRdtcQiwIm9ULnDstCXPxDpv3sSLqDRWaJqTckrwRwCtNAlNLUdz/REpxxid3zD4MLz9XIKMOkCxSny165NVSo+zddRbmduOqq5Ma+VwH3jbzm664zuDXMQ/ue4W8Ziy6rz67LYF1XWO56Y3y2Z0qB2CUdu2KN4Niw5TeIDIPiyofeHTpd6S1hf4hNYiCxzaSrgVmlKEy/xtzu3oqmkuihhw1c3RsgZnxRG6G454dg0uP1GEclPGK0drpwcI7Yr6xpid8iKZuMhKvLFoS7HUeX20rUGC6MSf3qSnPfUXAO+NTb675yp846vsZB8SFEUaP+TJUzqNhtCzdd4FskpmOJmGhoPnJkkB0/wY00wf6qdaRaXhKdAcM2QiicVy3SdmBUZA1SWSzJM3Qe7ZBJqlhj8qVlVYEkZJ/zuW/n6jFvJySqU6d3HbZ5RUbjXgkaFmRAWsjhiiOgSfafkSce2FSMJ2jqIKBcVBxbIqaqMe9UWep/tkihUnk1b3wVgoEZDoKoW8OOtDyDdWCqjvRg1UpTbI4HkpRcaQEaV8gcLIiwu3vHvHW8J7leXdMmt3BeEFoiqAmd+XycTtBlW7FjvFBLZ6yJ2+RHIZV96lQM9Um+7nL8bLGrX0ppnpeUPe5vvtbTXVnQFytxm8tRqYERC9+9QzoKNr+ed+yuKx/HEUwqPx/nvx3BO9d6KDz8J1t1KtEVjG9flj08PoQdiRRxBj9yX//vlHOnDm6SmbF+EzyfHVth8r0H59EcxPSldYTBq3ukmPhdFhdruj3pr+Z5NBTMDJpNl4L7JtjgvaPu9IeR0BP8xv9PPKOYGWXqT2K9LqQRemsS5mB12Ysa6LzMCZyw/dvIsj+bxT6kECfL+/M+mCXToeU/pl82wSpIInduO4tzf26LNFHPk44tE/pEUGY36Xkwzxetnc4tUyDZZKgxzQ/HUc6LDKAwktqQ/6WEsFI15Mx0Vo3nHVC3aec//+AZfSmb/yxD/R7zudzmJyxgp+Jlld9nfqwaOIDpH5zau/v/v3mmdPzUcf4jCo4Scdnzmbu7X2qZohxF1i1y951hFD7rHfBpB+G1ywwV1tg/dumwEcfPxkQtplG0tCGyhEiXpbtT1mcV9AkiSEHQnRb0cE4QK9JXkt297MWHKBtjuMcsT7TOTI1c7TnVWOHyIdrzGJjtU9QtGGGC0ZJtu5GmUU/9LoG/ZgQXIGAZsqzqLfxaYdD2fWtuI874BhzeMhW0i0jo1MW+1pcjLUgb1BPSRZsz3rZB+QIJZetq9A+yfuMOt6SIVv/cllPiWIG39lJl9FvSgxIMxMP/ccAXm3hBTEidsT8M40DA1w7+rl80GZDFoAmUEvGa5xM0rjlx4bDnoF/H95LF4ngpR9RLov4zvfmE6eNv35CEx6thtVOlCXXJT5Bjoh29Wdfg9/2D5QCDdL04+//oY27VrHGh5jJ95Scc9HrqFVk72OkN860e68rzfrUzFZ9vWrySpre2PQ/l6TS4j+dsoAQF+QnwbRjONz4OHTzVMXzfY/OcAcHkId5tuvocHLTNeTcucANpGj5Plf7SZqV3JG6O3gu8diPOp/9eAeflghyQEM+W/YJsK90Gk+RumnPcpEgD2ofxXvEc3a0uL0GM8UaAvlS5fYdaKG4xDZIWJ8Ew9dFI+88Lb5rwNw9O3RGXXw53b6Nlw/0iHPp1+kj1Kp0agDZAtHA/Bp5NAbDXwZDN8G9E8NBgP61NbnErlERrgagP9GDb8Ga7/o2x4mA5E/omsr+L+9JhcbIEZBOOAsCGwIvqI3xrQ2shYAin3G2gKjBMIfWMtYDQgFfQxEtdEhACsIYQgdyIHA8A3OCVPLWIeeXURwFyPaHdwJHKAfKAYOXIyAUXHRrTFSwccdPAc1t1jREyCy7gFnlL54yXNBAhrj22CxAivGFC0R4gBlIc0Jawv6sUIYY/6wNT6MvR5FewDYAAYqSnJDT8qJ3H6gUrbknOAMwGpyIOAWcH40ChL1NWsPAMm4E+HiAIDQgPWo8AHSBYCjkkYe2/BAbYk9xBmE3JFva6ZgaQmxVP+G3eOpFiDPYSCeWtTV6INwg0aPaEPC08DVhao2g0cG7SAYWlxcWCIJPIrQtsSwxzGMSi9bRI6wW4PhiB/KrFxyNMrwoMSw4lGjAg8ghlv8y8W08ek/8EjxKMSO8S8fUx3pDRpt0C0IO8WNMl/UttDoFQ8tYdfixiu9Im3R6B1dT+wGbqB88+kFzkc8nARvuWDhibe6YNMQ3rqCTU289QUbJbztCgLL+7fiq1d+nzNKX5++qF3B09NeKcXbx4RNTng7T9gI8fY5YXDy67ugUJbdm+IrVHbXigIqbSn4ApX2u2A24/ZN8S+wtNeKe6+8LwX3Tnn/XfDFK+/fFF+c8v5a8UVZPu4FJerHRrHD+8cERa3KcOUmGVdWLAucBvnEMsOvPR11KTh9lxKbHidlt24Yp8QOqxkOt5ypHGJ3ucIPp9BXM34P/OeqL/xu5PN1bxqIQnm4tPCSLmatITTGGiSBXiMi0MCFMzG0A7aqGqQlrBW0AxbXCBhaSDBIS5h2zkT8P22AVoe1hoGRVQRE7dAtCEgUjycYnJwX7Tbi4NrjCENWtt7BkAk3UWSVAw1hCYNF/mPW0VSfuYRhqwEJEHgeChhJ28sLkhPoqGpAPdxxoyUM7YDFDIdUi7lET7gpaZGOfK371wwLtJBghKXr4bv5BblcfK96wkiHGfJ6o9cIrLEuAYcKZ2uBBqY9G6zCE8ISthdvjBokQTtg64w8qhqkJcwszPDUGGtAgV0jooWPogZJy/JsZicMLihg6IjLweEmENGkRBCmhTYoEPA0CvxI1uHgxksYLHwDAbWks6kEkhMR0aRoBK9EagywBOuwgacwtA4tZDQiqmmgH/6K58HJTqB7dgM16DUCBg1Id5cX5DKkFMevEquqluroJiJIZXf+CbtYHjrEEkgoC2c7WtGCgvWgWmKBtIMpmjo4RddbelOTs4jubKLAQOwf06ypHSSVvoC38gsJ6JzBMARyvmvLnSGDJCDhSa4RbmCkrQOdMyS/BBr6jS/QAazkDqjFhPdVxAjmSmm8wgMxKUhHRrRzBOlWn6ntVsg6AQ5uWNDeKsr2z1ZpGzoUCd7WzGpGq3y3CneZYEd/4lNJEZJC6mCjg1wBrQqGYfD1OSmonwELZ6lmqAt2gyzsK5o17WcT1yLQj/gLz6dyOMKkyFrcs7Mu+Uz/ce/lbwvHcf/Z+w3DGoH49wwmJ4PhEiXNhADtfB6JUa1nI6LtTOurdjwYFNpP/le8e8OAHLCf98vkMXmO82dmsA37kQdpJlGOM3TijfmChgiJljKB+vbIu5fITUEv79mAawRWAtLMJxtiBEQqG60aClDPNF8Z0Xtw4EWPvOgmKRcb6r/bei1YyROwgZlMygIErns2BqJhzRpogJ0j7TXcZVqGHZygDreYYJBqNgMp2Q/7SCZpSLpYY+/WyIlSvZNJeEY75DDtdpVB8D4hDL3RIEXx/pMiY0n2oXFIkHaGjG/LjKzcC2DIFL2erl2j23jU/WFWNhMCJ1h3XJX3Og5n78+mLIoaOJJ+uTBv9d9C9hKrdsjqLNWckVGxAAB16+MWS/6gk6D6LKgJT+8XQ01J0OxeRUSgJwwFWsCgs7ATYkOUeldI81rfmg4JohoF4hJkULW8HWYbtaQzalo3mshmJ1dZRBkOxGCBrJEdMjUkZ4ESWgMdAjHeMTiQh4iBbKN7N++pmh8ufB9nSJ4J8NKZQfxZ4NFMPInLcUZSGDRoKNVSSwzNw2ACxAbZUnjjeoK5RjrWK4Sdmcxwihpo1EdSzioENMEVK0aDQTukVQuDmzCOgd8w1dtPuTAIauJyqMDf3piuAbn1CBG+RGDdVhnADx43zTpNZC1REW22lWmD67UeJovRU6xvJKJKcRxl357/xCwa6nM5I270SK6GZc2f8qVNrOxhGDyguMrNHjiNGnO+E3QPrkVlKSlLxxOECjBl6M1osgcQ+rQpA4+scgasHU+I3srQX9ybjQYkUHXUcJXAuzuiMPAyziBBHbTbCFcEhuuna3Qxg0G03R9V222U/Wyk+jJX7T7NYHg3QwJqJCVlmk2g9NionJgIK3QqEl399E544pkRdoG304yO014i/MNpoZckO41CMDZn3BCY2YTszShuA7PBCWh7bjOA8ZS4s4vawRUGdyIkQckEhiglCqZAFoaPJagVak5JDTZidOQAnnEdg+RVE1a83wWzUpADiXzpFf8ApSawGn0ObRBjmZBQCVznIEHHzLij6koLBkxERMyUEorMlch+tCwbnwmCcrvL2p+JAdfbtZd0EztDb9Y+kSG89PvSNfIm0X7TOOrcWpmb7q/MCevp4yghwzihgcQlKWoY7ESBI4O6gSxhgwV7q9wIAMnNcPNXB7p+RoGiqeiOpJQLYbep7JNhcJnnRgOz1peYpIGslZl54KBRO3gQbSoHA/NII9iXtB0USwKf0PJD6vCDOSrmO5QmNhihIwoqgAsxiRNGEn1QQCaMqhB6B8af+XbRaCD93txnVg3leiRu7j5NO8f5f+VIWwE7dA3GS7/fV87vDaTSAGWvb4aJ375eZxYaO3AwiNrrbDCQ3OPdbDuo7o8atddSu/EBP4gM80bDI+EavKo87o1y78nA6XAx+O+eiIDobnvW/w2MJt/efkqzPvyQLqk7YIU5WviVEIZh8nBkN7Rz+S3k8rhKCDXewRjowgICEVfHZiFgt00Cm4A18QQBl7hLw/hhCVlfx1I0o1xk/8uA4GWZwOCoqPNAKyB+CTB0xP8gItgFEvzPI3DYWcgLz8jQ4QKrXsMH8d7TUxrQ1kMgDJmAXgOStJ1ikEpVxdLbv4HjSYMAQd4RQUJjWs58zft7+EoCG0A91dNsYaKjc6mSDNdH7scYFrVhR31hlYPsZDCcBe7IsQC8UGUglQC35CI+Ah0amEg4TW325fcK40KJdqTVRZqdZTLsF5Pg/tZapyDrS0j/FUw4wuDEQzfSktbEJG/fzGfJ36aI1olbAmzZdINoS2hqa6zkIMm91oTwU6i7boBJW5kPza4EnYn4azNraDtaVmTro9wR4pNgne7noyoV7Bh3oSZ/6TKljokq1fijGd93NR9cNJ1pag7wZ6FHWEc2dyxu3/fy4feYKuulj9swwhi0DdBXSC2Jttua53EYm/P5+ydfQsHYqb5PK96bn9PFD4UTNBL502xHEHDbbWy3UQRTF/TE+3Qh0ayLO8sPldHABt66kaArrFG8orr1RWOCJPgJ/QJIlHBH6hjDgdtCySIsQBcqJNNMc8O61O8cxYPBwul1eTTzd1ETMDT5GTnPyqYoNeJmOhwz1fGgahjyjfI7ibcNxM6ug26un4dZezOhn+w2JxbvTvpl6qv5XSXo4R/+x9qQjF2VoQsKGujXZ1bbJmLw9c/LnxOr3BoswYRy2zG225j18H8XnK18kbuKPGpMT59KPYaJIfGySIdir2DMfLMNdoVVou/6nmijmiTk7fZjwQ07nZlUp2oAw2rAFnf69pw4SQqZxLUIMEG9ccAw7C4a/CFhaASgDE+VhWcAr9WaMDaqAErRJXgfq9LoYfubvP74CdPi5FC/Pr///wCfexOUAwX34hGBuBNHLJnkbLldiwmQM0lZFbmMTxXZLJLMLC4YnwffvTf+VCBH1a+2gCL8djjoNbI4pCqtU3TnyKZbGKTnJRGItNh/FYOb8hoQrImSQGpZqUKsET7huG/4uI2l0offj9HqfmFmq++9qQ7IigyKmJGXmGyfOgQcVZdRp3tzjCAnSgPKVpSM4AIbz1pdY0cfEdwGrdpBYMhk4hPpgV/M+GcAyWHgbhGyrSYpVvVUFN9vT03abVEEpgZwgMRqUX2hdezGOBS8doGkK2ohEOSHIKHSNxe8uZIeIoKgUu1+uu4/y2Y4uNm8uz3MDRZcLCbg0KOnzXD8cj89uWtET/fpSN2Klo5EhXgCriAvqnrF5aaw7CfLejBCb/Zk1CdzbgVNW/jNQ0EW1pgJaBStavfZa0AmYHFoVCLBISs6GebwUoRixhdiAds81w1rekr1S2bIa291mG0hmJS4tOY7QX2h/dPrikDVeKg6tv3XT7PBhFFv3YZtVxYMwa5h50q/VzVOe4ZW/LZmuu1sGrUGn04HX6KENijvvxw+TlYOl+vQRnhTXPbQ9qN8HGXiXCMIisCLETJ90wD8ve5qRV9OgRaEvSEGitjh6slhiETswUg8C6A/iVjbYm7W0MkJxwyK4lc7WzNZJiuMZXWFN9duYP2E/TGJfkEdmvmWBTUnLJeDRniXaoNZTBSPDpkQew0QwmHs7Gx4yrCaEwYoeN5qRL+U7Je47t7RS6LIwDBWYBfH8wFGVUC3nI9rTEELpAwyzNXT8VyMpU16iu7Q2xgZIDr3Dd4MhQkieDVZZ4Vp4vwCpa2OOYPBtCaCsVnjEW8myRg3AiIvpkUY8BQLTgBz/1Q67O15qEoc8A/bY0sotupPnQFy+6kzAC/ApLBBkglTQCYlAQwm3lBWQ+dNBeTlflRisdER2Inj+ICa+09DRyJ1hEMExPuTaEQgDdHCMxBoSnZgacAoWXva3uEqvWGsPabUIEg4MC7R09eLBTc9Cc/xtDrX2EkwZAewyQfRwM2JS5vlqrZnx6B+poPlFH039FJmX/9QPBVPzxcbYAG8YbsdZ1T9NZStyYGVLkb3N92lWDZ64z30DoYeO1z+UPljzD1pHxSYj+NBVSGJ/lILuksNB0Q1Ds5rUI60QzjjQidZwLeI0WATb8aZegZRzkZSEqDSUBhHl08zyf/MDeUIzMWNDCph7N52wqKJDkwM5QpxEPFwl15zZeXJ5iZGFc8XsH8/at4nk9uiQ+MxkAdy3BwPQpuVBAyokUukli0NE9DqKYlWi8LLPpBSb8t29kdfztsKQhCPPm0gieqd5b2Lvr7OSnvxpN12IshESXQ2S+yBBlAnjKkJDAir3UxvXMUYUe9eq0yr9FqZTpSq2DWFLWCwvk4yuoxnQKsCM6/D1Q0NHBk7zkbTGDCRooCKYS8YpmxG20eGvwccJ6Z2gVqeINalcc+2me5CdklX+GbFBKxiA9dHViFqoHpuXMcsVokRRiFhu8S7ZJJFRD2zjXUK37QjVh3y7V1G2e8iis3hmHzFxBjCE8Ra4pCGecFAgjP0XZe5Jmnps331GCmKBKRyO4YGGGJzE8NcC4GKfdaRFan7fM6NWSeQD2L6VRtKU62selWXkx58l4ziA99F4sbtmimafawlBqXUcgQiRFnqtv5Sdyf6dVhCbNpxGxJAFBJLBQn7tAQRzGNBuPaJsq4gWg24dv8Ms0bA2hOU6yNSI1l487xDQwZZaMGLrI4R+yvR8Fxk8BWEL2EsQB5mkBF27p/jyGH9UV37NNAERduyTh97Y5ujMc1pnLy4FuS8NWhYSAxJtMV4f5cYdm8Iwn1+F0MNNpUhYDyASFDWfvJlsjTchPrM3K8MA7LIGV7MBDU5bNcSbRCY83SKyom5Z2XCXMPqZVH+ZYizd1qLSWUDJtMPVSMBSxYJNlX3p6Q+BUAaCMBoT2NVyTcGZwLKclR8vmT/KGy3Ub0FthpAz0TJOLj1lS9CQ7M9YoSntL6PS09LyB89WteInOKdnL07RpM4neFoZXlLmo3VmY1Fpuifwd3cY7iSSeOx9ril5sUsnQtKSOTIXQEv5hMg5aHSkFDQp6EOhbWC+KhqEmc6oI1oeXlo/WpFxP8QZ0C/AnqfTCGrAPfI7+d/wTKKvWYCQzqDpHAAtwW5NSioqaILTih9KtsSf+9LaM2xzCsYWn3sIefdIcmzeOE7thUYFocCp0CjMpSQi8eHKBwUriGjBiepvl+4E6g9LT+TSBkRUbLke8NsdWIUm2pgCqBs/AZGAihmDhgAmCukw02YBggqqtLAJOypIe7Mo/c7CtHwxDvS/2LBT3Ev0VEVw69YpoCh/vO3O7aDyF4HjbIpGwHJ2es7wm4DvThSZEpgykyobjAQmAWvSCYSb03URPEQgzCtOhPVVeZi/Ivd749Y1Pvz1Te8RerZ0PP7GcgClrxk3+Ad5zSJJE5S7a6nmmmO15Hqv4yAS+3YJNDdvnsvPRHfMX5zts6qRFMHdBiuquACA0qOF7/7mCV1J0JtlukkcoJJ3h/zr69TFX/jbx3d0hPFo/YSCkfcEOGOnv7NMpKGwCiOqGUEhczbs1YspZ5tcqCOocRIcZqfGpJkw4M9QE2zMP54PiTHxSuNvcPD447OyrydPgNL/M+Ji2tXHLzPJ56035enOQL5ehQIe/QzyvQMMjAi6JhV0ajmeKFHmB3yxcFIima0UkBjKwCBtAXRcpXFf7BS+aV/TrzJfDc2QsnpEqe/5fve7ehubYHSNi5pM3bmcKsqXEg9vZeONx2pPcGIxDCVo+1DNM0SgNgiQZd261d1czIi4yt5/Re81X/Ys8bh956jQJZZRPp/p+Wvw694ot+15tNIqV+BEpXja6dYV5cw4LpvtLxIHbUcFo0o3ND6a+PksMYYLJxr1NJRx6uG5h+MeL/7E6K+7UYpUPtncDylzPLQ4aiyYQlbzyp8hdTEgXA9jdVp5ZgJgOGoZ2XhzHobfF0OT85nOnBwyGEu2wZpo3GywipmilNATCVtT7EcbJoxkouKMBeZmApfWqta4eT3C6ZxWD+1KePmdbWVDxwg1/6piVX25QmEOKmaQ0QAj0uN2QwOF7esVGxjiSFCrHVesMb4hdbZPwk1uNYu/UDoGOAo9FmAxv5B/qyr3yBQHmIU0SyrufQJRITlNFb4P00NbCGQEOktkzTUoHDFhFiK+GwUX89ZN+VlEwtHoi1sz4QPFDKCBi7AxYM4bZqGPPAEiOwfuwN4d4bj8U3Sa/cOn59BMeI08FyVZywHhifskDmIpzWG4lJmE+ZCVsIGMTI3ZEIaGZzp8+H8F4CLp7FL2mt5uoMvMoH+A10IwCrrgH8+oGexyarIFPOtvtcPXFCQbBWM3BvKeoPPys2x9TAA9IzMmM5rrsZNwWcycJ+kun0P2s/3icXKu4nWIu9fXXGkzO9Vw2iXhEcH9smd0PTpWj0EbtsOpYGR9HqGex8mAT1OVdYZDEGhJCjACadlVDVhvmC7k50Z4WrVoXBoWdQAEQuyrjrTFg9X5Fb2D7R5ginPSeZ1cEDxIUCAXUhqmZOiAdPQk2UR0qnQcNOkwSVKnA03mjvX5HPPxzliimE3VvM3Y40tRCuTHVA5vsWeTII+rExcqZKWbgZRZ8k/Yzgwi9R8aP16OBhGtzCp1yZq75nVstiYBu6sTgqvPW40b9SdII7ql/PYXUGb9Kbx6r69EcRg6M3h95iWae+ID7gS8QgPYNaklaBPQ6tj6Df41jrcYq0kmiHNAzLwilGguKyVLt642MI4IeINUpsYy+AgZsOw9sARs2pZtXcFIPfpyfb7DTBhkFHMXFVleLCVaD1afGLPCmVGcxdT/xmH4Naaa4SlyYx9/IQ5bnCJ5rO6xQRHfCOPeVueIHUqXTB3MRbewoBWcojz2U+tWE47Vxyd1NVTbxChjLJ4s+B91WOezi1NZ3Ye+vn+QFubDZ1vUaZM98kKVmgu3/vBMpDOpfUDs7y7lsG20DMU0KDGQ9onGK9At6HuBDdfaO14Zo39CV3+teaAILLGs+f8d4PD4mI2VD5qenIttKC+1QKdhyyzDbNG7c04o5Y4i18BUlXC+IZmyJHtrjbsyCG6dOh8jQalrvITDvymmEsswVwCb6cj8E8P37LRWmmvBVrBt3Z2lwm+21Isn8FdtqlO+hbOMS+v5YIkeTJHaO4Yf3Lb+jCjaxRb5ZxKqQ4E4PYjqeyka2XVQdCe0DYcBBqYOQnisTJj60M1jUKq2mxMAMUg01PUqdnpc0su6rips7XwrcG6yGrIqBjO0qoDWIJ4Kj3LyVb8yWj776nNnJRCWhKLYq4yLmHLaKwfYb9azBdiI9FskWY/4VYHvOydxuw3AP/5mLKFfdILNLfcmqJn+vOHlZ2V9341tDXpiZ/+sINuNJIQcDW3WSJN1rCKTaj/SNNboZXfXYGxGL/YRwlchilLgQ4yEw+KqyEBmMMUOmvvSj6kYN6VQUCLb+0+JlXOEQGZR2LuGkOkU0Hfw/qG4FKrV73o5mzj2MPmKr/Vw7boz5poVGZ5fIXPd9PsjvfOFJRUQ9m2Y/pN90X8Fasmac4OUv8ZX6Tq9eJzDw6+fZn1geJIKUeiMRTrLiKLAeM3HupUo5Va95fLlF5R6QjA1GG8Mkn28ZHJarYcpm6FpVqM3kbnk2T+nLLFWfmHIuMna9QhEmOwYpRyO6umppgxEP7HPuvb3OnVrZCJq9QMP+calDeY66LBeKY+8JkMCBZP/OCDAK/2FuS2Pg8bUifOKQ62dal4bNShb1jFtGBkdqKnszOIg+2v+2puqqWELmaSP6qFbZRwPRhImNzSWIpd97I0VH636SvIekduZoSGst1X+rk5/1j0GbPGWKj/qACtPZH9+YBseV7c/JAtRHjKYEVDN8AVkzQdOGo5l2h5XDGgGfMNeKvOtczWxtMAeDdgmTH7MRsu9ktG5k857aY/3MUbgW8oUYalKQTk/d+UmU1dOVnnC/KEEF5exoRuwLveyumW5t6SbYUwWJgASGHfn8lvrEOCPjnsv1n9aseN2zCzwlg89S69DTObE5fwdQOO/dpsRLb1y/rE9WvIKzh4LFrgaoHaTA91/kx8vGFS1Or5Fi+vp1ViH1Y8v7mJv96SuXT9/sCkE7Cl+fyzRRKur0M6XPV6rbK6TDmEVLpNjiW8/CTf96oVwqBYafq2EzSZWlUVtkB51lZGy7atXfYuRSCm8ZDUI4u3LlSGn4zugKokHzOtpybTqLxalrFOsKxc79MIZ63eSiC8LMqnezx0auEEMOwEk10RxF8pb+Dj5QPKP4rvj8QDQm7MicB+BQyITKq1g5ymZyzB23wswVkMgIlgLwiTXCvqEeBHoJEDZWhGehyS23+jBQgJfBJtnZc7FRaKbYLcLSQGz+bTQdFjlhpqZRViP433tAG2FqCZ9Cobdu3WRWorQ/dxkLsg2URKEE67pJQ9LTGZ/V+v78iKZL8IXKEitt3SJe0Syl0kUAZJstjJypLUrnO5EGg7g+YnE2R6Ug7tMAPT6LYXL6IzRfwS0mxsgJdf6B6hjNXrsQWuGxcThT4vb+wC+zI0WLbRRiIr/9w0Y6TYn6IcuuY8bOP51ysTsNndvINicxJ7x1Zz55hRb7dET2+5qb3uC1BMDgH7aJG8AxWj05qn+bzSkTceaPSiF3KS6f4EwWplGJ3dEQJf9KmhxsHd2rS8pg0jHFF4jJwS2Bvtn0hCPG67G4euwPxTFLmYw8xbWURoq0D9MmKmQcUX8apc3SOxnSSTTVe7i8axthHCVKH5dpt4FBC4DldJGMJr06uRuxC/RchVKG1k8sdCtV1n2CzqGfwXOlxWCqOOAIkD6IwpB2DNXX4DgqlitddGXNuw6X8exy1/i5ni+oDHYKy0hf6D4T5teIInxftDfogUcRvls9oYC9X1N1QKblc1ZJLynCpz1WKejKSIWWUIzjdFvo/x9lXRJVyABpX0u1JkVfCucfbWGAozJVUMs1+tFx+veztrPUGb2HSU63kakB5Lfjj6yCoqQSMMvmIlMYx3YMrUlzFi03s1197WIdkCfR26pAsj25oFWIgks+mEDU3v3Sh6No/sLISZiWcEJSbezIQECSG5Qf2nr/9T2b+UmPCQd0veEUOqG61LJM/Q363cP5VJpt7Ju4iNjOmHT90aIDRi958HUTum1QxtHgIFr3SXDG/wXSeNpO7UIN7/mR6DjnWrNN8hNkIppWzz5ybKo1aqRVpybOdP3Er7/mgq0JYVJqDke8buJjE0dQKXNFtLlyvW/d78xm8siS1rz02IEDpVigjJOuqPynwmR9fNinY8jWhv0jPhJaa+j5/tB76j9d4R2lCB6dzI/LTO2A2nJuQHqNHiAvKDzpIaVd/fpUzEUDMizgul3L92VHwH5PdCizFbDrG6hlY+uwa7gU01dGwNuq6tCFbMTa/LQA1HEDMoTKg1TiNB3eTY9JQPQpLXv1JmIrCxNMyChnJRfno2f4+471hNj5ykgaaIT7uxycbfs6/iIOPN+LOjQofa/k8OSFIW8cZ9moBkYT1pauKCJViHj8/K/DLFTbl8SQjX8neFDuIA2m7SUm7C4bPyBbqrTzEcEoC4uD6K93iGEE2X1H7Fowb//N+Yo+Bj9nNpyaSGRchRiquyJ8c70x7l6copkogXZzSSyEVba3HGxS9yFWaBORFGym4aTaKNqWXzXzcSwFH1tlo2RRL7qpIqFLXkq2KZ+bLV8LI4iWvSqcMYYTwEtZBq4aiVqE/6AgLd1LYHF4WnYYJV953LCr3lMb6tL34tSn04INv4nu2YyGUU9d3xHPuL7YtqUrjqcS8Tx9nJQ+LIf9jU85BwzOThJmaDicc4Vfm3a4fNJT+FOHUMu4nRPW0qS7YJVMgScWhnXGwvpZ+yKjdvu993+qWORNCr8TEtyeW/mZQv6gw+UHbJMR1/iShI8FXDcknatQ035Yqk08kKy+iw2tv981XqfyHGpNe8tOTErlPWU2VO6DjlQlnEqrU/g9ePIrEF6SwBAdSiKAHeyyqWcVTUJhDLlLpJmc1yOiE6tXguOhs0x9vG5L6iw9zKIEUxjpq79BsEvQXuYO7Li1BdFd1qA+E9iALWy67qMEGSXeLFX2TDtGPtJAKzy+VHSEreD3viy54mhqUqbyTVeH50ozf93ypmjMJRVSoNMdSPgqVI2JERevTFcQwjHfHxVyX9sPqjf37AAVXLhEihROXgFEY6Vl+muZiONKIguBQeIBLeecwyRrvI6rRLp0m441XP31C/hEKoDTrZlvdJzRBptSqmvy458E7xLaVWEiXLaBR1qTzstOqcr0YlhW1U7M8VBp2lDYfrY+8xSa0SMkp62uK6SdUoeys7Cpvzhowtcf8KzVWdPcPlfNdpX0o9r1Cw/Erx4LymtOEssvYF4GuAVT/fsXBZMAMzHF36WHGNfAWOqG96biuAo7SKGwYviiOTJs9sqmAEMrHjcPKLdlpGbJQ5F3XjmqfufHRHiVWt48/MstYNK0T7siPUCm7/561xA2+h/M0P10lHjCp78vVl4xICujEFouN+Y31JqARM1QnegEEDzP59beZNdn7TKrtP1FsPQDyh1zQV8mbxcAVEjj619xHNNVv3hUMxC+bVJuNk4OjRE0XpcHmEjDhi6Ccs8DcfoLbq6lvzbfg3CusfPoyn6K7+Uf4DM4mSNmRRoOlxN0A43WU1hcWahVbYfUKDUHKDtAtqGiiI6J1poQOedeLgdNwkEr+YnQM0OyloqzuIdOlX1MRCwS6cdcBVKj0rLsbcxZEwn9e93FSLxOrciKkjCo3aNK8Uu0XrD0WE6q6DBdEmKGWOYveEX3ZIF7ObsLyodEIZ7BS3Se2FO/4iOXvuqe2ny+eIoxDwuvTwqPo9FX/YSVUn48Nmp1+3Nu+eANPi7Mfbmq17z6ol3F2qG8fNuPYizk/1y4Rd4UHQvhEu477Mv+lsNjezv8JD/flEys4vQCSnfPbrrjuK49sqGoWzX3JJADk/G9c9G+1gASfTTw1lNlKbQDZctKBtcTfAo8bepETvGN8HUy/Q8nx3dpVneq3sqiq4rMdLGLc3LxBaq0xUpIWp+FgwMNgg84xNsAJQS4zES/EGdjpbR7rU81uUd8Yw2I9VkJDksHDPen/+jPZrKvyHD7S3ULIna4yYXaKoaZ3/hUE9Jr3Z5I0fAVFqP8YcZNXLVkz79FpfTFFX9h5HBeUmdK1lMVnWqQfLhE3/7N2rhdbo93zWj9KZC2nO/6iRT2SefPmiKx9T30hUPYY4JxqYuGDv9CNC2/a74oRFaUTd+NiiYXQEQWfgZ2Cq2rcBflV+u/HifHRdr4f9DxyW60cNYHLhds+qV0BH5MtXXT1tm+3WsgWumwclL6cS3bnDeFiE9JQTLPNRNGz3baGgIdWbGU4ZSuBmMtvHSl/tEaV87qz7S6nEmN8Kecedqis7ITv9YWRDNKbzpCHRvJZm7rStT8GZrHJROqi1qzRaMdQ9dcTvoVgpeG51PfJuaRcNr152ZBA9Yo83ISrevOz4iFjhrcvOVYhbpKuLWGzDVEw2LuJcR5aKI6zcitRyDXfbfex0GB/S6Rtt0dkTHiMSni47fCMKYsQ7IuaICa9CLBEXPIPYHMcNGtJUDRfnSuTXrFlXq8TjSNvkGcOvRdvwvu1wDqjaS+2QFP82nubAYiMITUhDHUUuRlrR4cXS9xexfSDUn3JK321j1frSm17Kb4Is9cZO84hqW4qtiP9JY0a6WbuM6bnW6p33v3ht/D+rdPSko0VlvzLspvi4txosgUcyL66aFH2LFjn8bxw6Z92lzP0lXFNiOiZOtqnoGgMxBbrRHqTEGzpR2QvgBFHXIQG+HhEOgrb+iNtEPxqFlcrDYtUun3bSlEc/s9QomfKGdQR1uZG4iGxcquWEHPVwHSbvOgfF8RJbSTFwFBqTnlUXWSXD8AGdN4dOXSQLysBThfVeI2HLzVlR+0ZVLTu2H8k4COcEK2tMGGgNfwKWPlVjPKRPos7rjMuMJEKxwuzXbT8LEZW/HwnR0iX16l7+dbj8UJ3IJUCC4r/beW0PYpLUMRSqGtw4/GTLC59tb8sJfKT9o/j+eKGzcrc7g9+r2qKaTBR1hyMMySHzr6Z+HRWumhRFcjJtwtTsoYnI50K50UT8QZ+o3SxH3P3CVbfNPklHAN6KxMIQyMzcuzr0l0XJnjZCPMcLW8DiAtKdSdxd0gpAD7LzOXX5FfwVjmyOirAJBPDH8cFvkcBmf2P9ZUGDKISwysV4o0SioMRM1bVfxOfnDEtr4xHkp6rGpoJmkxyuUQejnfdOEnQ+MkORHMYAB53h8bQiRP+ithrnCTNSy1DkkLdQ19CKQKIVhMkSySlu5ATxgIHDUGtACpnkm4IJRa1SjBFp00qmtegWQSApPZGzNFVLHZ3IvHbKsCIU+3/gsycdfUUbyASfoQniLISlrox1DtVqa7AsMLn+ylDtk/TMkvoh4tYHggcNgSL8rLmUFK0RnBc15rUM6Zi5un9t1bnlhxdZZFW2xlqWE9bOBqGXNLnncxTTc5nHQxFcLj2EJwuhjbY9Mpg5r3M6KsVx5sTVX3t8UDQpzyLvB/1qzCCpRUcg9NdJb5tAU91RaGgNLJcQYcxnzIX9lW/naQSOg+qB/47Y5nn1HtT+mEEHUhV0DHvtgMQ2k7JxPqVT5YFCqZR4U/r5RuuHlhz9xFP6GVd/tNWQjyzjaEBO7Ppu/2xjO40+OiqTX2b85xQ5qiP5CjOBtNZKLYDBd2JEjbJI2VYO11e9gt8/eqzIEAHWro0CZAS2O4g10nQcHZB6GhVMT5+wjFDqY2Pjh1dMkXEPHGubN6aBj5MeVXe8eDmmssK/SiKpuDp2+cC8mwVqpuWSBDMmw2MsMtbUPSv9rhl2vVmPq2zRm+qbeMyUp+5/p2vjux86I5Gtx2VKzFrUNL4hzYgp7KNq1aWFVvovbYqkeQfMzwPG2cS7thCVdxLXxpri5mL/ow5v6gakN6nGEzHRXdA2mYkqyiD0tWHbc2illmOXxVM3Xp3cUi34MCa9KIgdVXgyWHVzTB2rtV6Q54qZc4BrfZLt30ZPmjcDJnrBs3DkpNeO7OnGLXjLnkM7khdGhxK1ZYFsUkKnzQ5Kxw6ciHkqg/FLhisbQ6VB2iQKgWRCMu5TFDuLqe1htHuqgMGEcqEgCxbgdhaNHjirNoM3jwRmVsUonE2WVW/EhkumLQzGbyEjTjW9NcaJrlHVnDQs195U+VmaRt5qa8zmg3quvq+7fflyl8yOBCBiMOgW4h2MX8GFjH/zauo3oygG38XkVCpy7kMYvy8K+xzoTDG7OTpFEeJloXPUJRZcaManDAb+LbkJODBPi0+QwnDKiulb5DwNJ5mbGFV4CCc/SUNY/dhamzSo2fIbS+/gCVp/iG+KQu09Qvts3G3wa2/YwpsaERdgb7ZPzoaPwIQTrAh2RxJ5bCn2yhVk4uGFJ4jJXSRGMRY3A8CAmx4iYFpeKsx2hMeCNSjo4+iT0Uzzu2EW3/gZH4FQnWS/vzDuVCe0Huy2EnCmxKfNZ49lre4dRmbGdwDsQewwZJC7q+OJ9C8rrbCtsSQ1vBcNFtIofvWxKQ08OivUluzUGfS9TMlABMKRgc8zjeZjZ3dpAdYUqgvKcTe2ie8IUHDkYUlrlB9apKmkWA1ZFdCFbIXBnTu/a7YvxBlJz1Lhp0NisXLZwnjJYZAbjaJ4qB2V4MwXz9EtriroUHNRAYXJ3u9Cqx9HIwcokFX132ehRYBvosOQtzsIolVsLriOpOglnu61aZJ+GcQhuHGsCBzJN8qMmrfOc+u4tk8I4VfBcfwR0qIIkFyubU5xOiLPY4lrN5KtyrKChNZMsqjLeT8GS+pVt8aPzy1Z+Y01Hqqr2r/qWS7XrA0ErkJKAqnB5r4axbEqziHdaqWYoZkTlwu7xmhm+CHMBX8KCi/IU5yeNNGWt6sjiLGokFvc5bnsHFg2qmETS4Ipn8QK9RSlBShqNPV6FkjNpCpEUbBX5DpDsAHhH9kU6yixrGAjpd8LirbRkBcbpbADzCZkL0QmjmyHwJot1alrKMhFyx0jmA55dZWoVoRPqlTITLlsCIAw3jBA33KplJ/Mw3P4BZ3WK1oxFaey5+SxGV4UZmZk4y8rQQJzMaXAdRIo1EwqdF2F9k6NPqA+pq8GuRl2+77h7EiSkq3EWnrlqTI9VNOlwc/IyxJT1CrBp8y+O4dGVe4DyPyfBlRFIghgTSR1ajY/ppXEZ7FV0d+jPhUcfzOKcEz+jnK5z0MDRNs6jc830SoxXP1VH/9gLviqcrXakrmrODpHCiRXMxFIl+F71DeFU0w/NAYFhy+4K6xZvzQ+/1gC0jA9PYy9KdOzrIzAo1qbjtODYN2zV0E5Iv0Kguf5PMqfkTNj9jCT+KLCO7TQVR8eD0tg5UeJG7a8Oe0v+WYJegeKQLgc3KGHpaCjUCdqWTWNufjghZ6M8tNJPb85/14uG0SVGPuYNXgEQwiKCnXh00lhQsm5cjuvrG08K9f3uHarTn5pvSmHNW+ph6+JVBqzkWG53pbE2KEJIs2qNs7yFw8LGpGZJZUBVx+AV9ugHH+AZQ09nx+pBI4T3aVDbFh1VCpcpwFVyTWmz4rJ91nntVfeq2yLnRph6pzCd10hjTsYzFDFSIZf/J3C8xEd+fNmTISfqNF0O9uajS5B//rOEPtH4ciXaN+M/7Cd6MnxsXqPsvTjD6H1ldgT1UImMGofTpRqxtz9UOW8v3xyXsRWcRsqh87zVplvO21yU7q3P4moUruD9oZpp9fTPlYvJ77GnJc0rU4FmuBS014FMec1i2S7uGC9AbeuhXSKny9rY5jX32hiqVQQP1Qt4jEVecMND8OrKjPaMtTcmWJgbzLkErojI0ZC6+Hh8cWFTmGYL4SlGO5Bv2/K8+0Nj5s5qcknh5v2OV7m1Y0oKJjS8Z11SLKTTjAwWc52hPPdl6tE1gnu6QmtbVoB73qnJ6PapJSXRDhUTBLNZJZzo7yP4m5PHXgDZK9isfSZFlKpY3XSdqSpdW/VI7DnC05NBZbdH4vafGSMmrSpV3GLe6vMGYPRffJZJ2ieyV5KdONDi7hvkS8/7/qRg1HWq4sII2+vj/+ORR4X/LFQ8v2dLG4UjCHEht5mxGNVH1k+LNncxBPVRizPUmKn9a7hE9aMqeEVRmA+Y/V9T1xi2L8GDaCzT3tfVoLGdbUAa1n+UdZVV2NKzyUPwS+9uO0yExEEMDitWqsux6XHjZ01OZdCGZwxmzTkJh+1cn+P/FmZ1pX1dZh0Kx1L4hjIC7ZmCidpLVMTOQrpIr/IpqKJr0rFN7OEab804Cd6ott98DxsZdvWNNLNXedTHme2eCx9dqsfgLyV0fBdo2gUr/DR8ATO9XNWhQlyDntmnKz+zCrk20kG+Dc/EYvJqfXQ44q9YuYvAjM83I3WXi3bAuv6Frqc/6NGteKPKnL7J4eXa7+0Lsmv41JNtGmAiyvLZrmnPUWwVlSHel20bYuP9pmTqTrSJeom+nNH52ZuNec35os4oFiC21qDb/iLDEuqPlKwj+/UuydSSP6gT9gpFiLcPdpouu4gnHMqj8uYQzD4DA1Ll3cKpjuv1QSNUeaOQEfwrMWbWtChp5iMi4oWT6InHzhUjoeTawnWIQuljg30aK2MOA58kJZ+gHOBaM/z5M8O5i2QOW5vUZebTY6tiYBhBDy/iYBNbbHc/Gau6EmorL/IFZyGKKoJ18prR4yLjGUw0usERIze0F/+h3b4qtVqu2o0NzIQMXJ1ElvZY+sJRDIQGCeG3f2LVN5en2eLW/onhIrtKHY9d9kvW3fYtozD40jSpVgqNMNCNS+tcIfY5DiWZ4TcrGfMODS0SkLFJEwkGToHeEkxW1fGIwkIEjGwdBe0i3Tbzre9LtQA+zlY83unXJ+cxiQjXHP1ucrDVJPVY54zutzg/r4D83NFQ7dsIB40MB+WT3SJYqsyRrdDiKhjuHiyRO6ISQm88GhGTAEnRrUVNw1LxmshNWjxnRzeCQZ/KRZiQXAuSM5STA9OGhYUQUZ29bYatomvaul69LmIQFY5GIJwnRRNCmbDsUwYOX7/QHEnUd2zvSIVrnHxoBiDjc2S7fp3pkr+UTWm0eNV8QtVg8d6r96Ck2JUtJ0q+Xua3DK8weJLB+8cBs8JeSajtOgzVrkIzOxhLOIMZP45w9gffoOlNEUrtR1b2d69wA7YNPmEuva423O7j+W1jIWJcRY8WpcmYNsex3w+jDM/hFzlPOzkkpv3eXYEoNgrFS7bOISeqT6X+VgkEgeFHbhqcWP4UsWv/xlNoitzBG+VnynvCOO1pscEXvqjlfiDurGDPPoHF9awq/3PZBXbd40fTUvhtW/TpRGxf84GZUuhqrQksePPC6Jl5+9WVVs4NqWRfxPL4TR/zaGVWuI3a7yVJBkwFpU/sV65XMojHQ1rQcsAMOOSC66LtA1AVGSZba+ZgBZr0x0nSN35lq+vr9aqzI813fGetiCxrppKhQrKNe5eplYOTWg3vM/deRxXo1oOau1l4eiykebDoQoQbed08I6OFjiFoOfDd5/DULVhzsIZemYOuf7+miTTZWC09QRkIjDQaqD4CAm87obD4DBzyZedO5l0UppuB7XmG3xWqnTfaibKeU9vscozjAYhdzaZ2cLk++dr5kcCK7ySNpUo/0WYa69OoLaZKnlC+vWM+YBCxTh3l3kGGTQOA1qtVZkfa7jTp2Qz9wlNiteQeqI48e3H1BFwLdmo5yBYNza6FFZhKijk6pqxoUQvF+HSJsXl441SJ0e+TQLk/JqoMqT6S3yDuZjVAASoHrFr11RO1l+l+vMJH1K9JdH4BUyPoV+shRFlFMq5kGJvcqnXF0np14RVMKhGOZOCQm/WTgB5y5yoBzKV0n3JJRRyMA1GG5E0tV3zRIFYDLLCDF98V2MMFJSZg4dMUAvzaum0kH2nCKRUdZoSmrWWnB/BVRBt3R2kS6RdJ34+jQik2C0pIuw9wDuN2UX6GjYmIM0EvojefcI+3rmg9Om79j+FECNLJGQ/lTd/pz7T9l+7fNwvvp7t8an7HC0gQ2LWl35hFeSiHJpG81gPffX/nBar6LzB0pcx1vv3FCxBZ7RKvDWw7LODLOXSQ0R2RMPf1JpJ501rgOic2ZCf3mn/uDz9LW2TYrG2LOsjLhssMOQVpJLFzq7oktYHniOi+fl3fKwECdKmkA0eSvBGhR0edbvCkKO1C+CU7LQgCpAN2u4yeEpEG1uUaRecpiazQMYAj2ZnLkX3E19TDxg9HofYFWfhRIe0IRmKE9FMyZTbfTGQaMvlKWS0i9SS5r/0zmWKL7Ysz26TbMj2ErRIZ0x4nZqBxLGrQg8Za5V06BfOQKYlF3bOE5HYZC8SjxYb+6rj0mfeW3QmJQ7oS/cZQmunWQ3bgwYBPjqvHQ4oglN/JaO5NDBv9lNwwJs5xHh5e/VKi3nFswCEzRZkjcsyFtk0fhj1pzgNQA+Ff8f3u/qFYP3YaKlvJw3G7tqQMgpPxlSaCUiOXDhj0/bMsTxbuDGPbBZXAcu8v8mAPfCBIx/Yejd9qZcF1MK91sB/i5ArK3bTSuzbVf380ENYsoYXgnqghReoYDblZVC/HxIUM6nBOKO8lz+5nilCD6xWg5hNG4keq9vCr1fxSxm3qKPYkVOkANry6HdH85aWOTT0RItkfDOSR5vv5QW7DHzmnH4+wbHrHEjBc+aPn+Wu2Lz2svSyhgvmNgM4uY7GhJIljjxB9zzd7PfN7XI8i4y8+2ZmWSYc0PCYifNMAPBA4utlc/5gmRlSMed5evzrFhlRw2psastjialyHQq8FDWNSie2tYIKIt9QFAaTlp/l4plD1tewMLi8Wtj4jYggqvzkkbroCkrCLGSG9f00ZhsYYObMV+lbWbvqqTVko0FSf00Zb/jAbOpAg2ooraTLOBjMS2xJmy6E0na74QrnX71H+H4YTBUpM7Xxh/GoXK8KBi8vhZra7dR4sEL1mjEzeQpXeG5zCks5JL/gz2sRgAbVIEHbPMcgG+kGmcTQyZUaVVn36+Xu8HlPfBM5lSSTWmsKCtaKXK4zhVj1zy1BUtENukEakHL1IBecQRQV63J1rl2VQxna/64rhaKsbXi/fyH2n97jbEajyo01SQOuec4SG9uzavaPdPhwpP0Kqm7N7Y1syY4MX48ryK2DRZpUIqRXic+3DH9QWR14UtnuE+HWK5kCt9aEZwbunLAAlQqN9FRioZR+21ylrdYFHNYZVoN97OBi5iTT+Kv2hA8LEr3Uooq/cyyhR/og24tIXHmTFaIOv6MMvPJvV5zTs6fR8C0FUFKCy/ithyoiknVLJB9Vlr4b/K3faA+4wKj1rxsMrjFZHsLsIJNYtUgmelYx1aJKnLFWogeWr3NWNPDpi5o6r+wvtCMIxQpH7Te0lHC9rav3CLZq7UPu13cvl2q0F2fsZ0dmNL1IpQ+3CcSbRfjjHEm5I8GemiwFcLImu5xJ7Dg5BdQMdHuLvT4eql3dfsJsdx+Vrhqr/rg6Ffy668w4CVsZI2FccvCsZYpHs35XUcKGM1+okdVTYVcj9GhxCQKbLr1neY28i92csizFs33EjLBENj7h4ocTVSecBLNiMj5qDKx0IvD3TosKOZWrant/Go9K4fNkNZ4ho4sPtCLTolAaxetj6vxo694SmfsCMuGSJDWoaiZHIRyhxeKIpoerM/Jhr5tX9JVgFu2qnVIdaaiAxiBjliEUU68m3IUTdb9TIHyaHnyB994l4ShorboqixEufLo8ZDh5m4l1tyqnSV554YzUob8h0ecjuuqEBL2u+LN+WqSR9kb+EBPuZqHekApaBMiSOOGjrwOk1XPY35Utqm0IFi7judDQ5wI8mijuN1BXz69DEArIG0PPG3NFGC+RVUaEAJVUkQYyI43548ZMsgjeak+43PWM6PIuejo36g62E0JUNLHVNWqpBRTpJSXfN1snAJJKFTIFgyabS0jTZZW28OD1u/pZHJUQbZLa8REI7chHyFRzZkEdMtHLCKbJyCUtlMkXkobUAXKrfGYT5CNUin+3puSQKB7HIkwUaj50SNpc9BsS59Y+c1rkuc4o3oH2LmTDfj8WSu63kWDslzTFoZUJG2yvnGElUiJcZARW41KbqPDDWgjp/SUGWwHaGHi5JA/NNGjLBGU8BLB4ebBFzcggkNFGPN31RuLXqYhnWQQoJcQ1babwRC4G1kiHIkePvP/USilx57Fl5cj+WjLRsbRhKzt1HJXCZIO6GFIPX1xEDzaERyytn4tAeEWCac5HqPfvL8Pcg8qlpBsI2h5qhOF0NJEj/qFrPOLAcB/5ac8oXgtk+AMaA5EH7RYBB4TAqB2XLmLTak7anpTTWvfO3VvuLlehLQGsNcoKHCd+Nv0Y3rpkEdMmsfHzkkFkv2fYAhFJ8nJDw34XRtxiJiPTKG5k1Ry+/pxPsbIK3e9iA+pkiNZVuJPwdnGVxWfCW6ijSvny5G2pw7v5Y0Ya8MLBN6yVIWQr20JdrtgYSYzRr5raQZT9ZWh5v51WtPH3QKxsrFoq7mD35ydTUT19LmTmGwWaJhVlfTRjW0GSgp7Dk7PIDEH9HVOgEi9j7rz9UMDtxHNCac0uZDjWE5ZwrbH6YCwL0+75qf9cLA1bMi58NMKfKdXktmaxcvbziQ0r+/T05+3gpKRo7jtkFK/urjJq3cgk4uQfX8QoCsRjnZGTPeJEvZuYw35F44dTrzGIUYO7FxEwg8+uam1nSGm9vmEmw02PZZ8q/EBf4IMuHnMbRSaM7e63aZB7t5wBbvJD6pv1IvSyGAC2iPUnxBq25WzLkVJruZwrjX4Bpebu6VGMrK2FjTe5fv2b8p/6gZ+FzSHOph9TB2LCXO4j2w8ijdnHL/GLFmIKSwMmuPNeYdxoNsh1NiF9ueFNIogQ5Cf532j58M7y9tkHmsHWbWRjX0T3o9LdmbT64kmYuMm7PscTgRXEP0Aqb8sKmbVjFus5G1wSnBNIUTFi+JkpFLXFwf9tV4uLnBZJ+TCFOV4XVvrSZ3n4pdwdLWYXyPOQ5sPXfKBNvWWxAIW003GAzGnApKr/C2fKatqJZQQ1p76uIcCQlPFIAqZ1bFPl5XCrb1Xtn0JUnWar/yqwgu3I6K1rGaTTsSNkO4U7RdplpCwsQ4c3Pg7Lc/0/QXMDvvv1+N3M/pAyg9PTwsUWu3t75Uxxi67aSr172pGJpfcOTtndnt3D59XX4Fd31ejYhO1Ks0nHmjotZwALUBm8bUqomAWpzZ1UXlg2m2ahXwtrCx62T4lRjNa/thirVpLXAE4b1oupJ2yVF1yCDhBRB1JMkZMiMizgCIZWFErqiDWNcJH6kLqUZzgJUKAQqQtyIYk9atY6e3hg+R0cbvE7WOvgwRfo6cfYUctnwebIXz4NIC5DcFXuah2S+DVpPe7jKswer2xpyG2vXmVFMtHmqAWymI++W16oMmUx+jZQxnk0j+f5zNfUlq6ghi40z4q2tvM9FAhrzhj/svLj6qilvBezqm8CGlSaiNPsas4pilBGEtqmTU+cZxvG5rspAbqBYOO8MzON1nWY7TLQhnnpoE9jr2Ai+LqkIEEAxTDDgJfXcpgMTJ6tNtdFvDmAHQHLQW5h3GAzeiSTB2nfosiVMDXtvzIxnWl72IrsLM0kPlZN4QDm/7q3VZbjm8hp6XIwaOTpQXRyByx66mju5SHXITgpo69Wu1lCL/qYR3HfaW18/w0+lKsjgTZmzu50C49RKJ+dsVL7zNUuiAkOuzCFAqbXnfF0LEI2IvQU3V/d7QGrt5s1pyHQ8KoKBqpVJPpNFV2Jfw6YddgL4nQAS8WaKQDntFv2gmZDtT31HTy3sPFdxRmMXt/MiR2nRt6Ua+hPP9+/mO2dIYAKKi0cJGerCZfYrTmH70HTAywbgfcyuoW2VeGV8/VxIR86r+QwwlOktBVtI+E63QMHh6QLTafOmqg8seLbLQOHQKxCAy5VyWBUB9GX55sX6z7Wim6e43/0GmFbdHZCf5bT2L8eGDKvI2/9TKUKCg8RweJynwZOnsXWdoJm5ipVLa7yOUUpgxqO+VtvqwHKI3AlAkucV+UAjRBBUchZzAKfOy4OJQciscEVjUQUwMQ/3zcKBphJfh9D1onmA5vv6czz5QRgso0eRC+PJHl+4beIS2OCsopzBp7IZqlu9j9tmwPg1lf15Ec2WaZzolTAD+O5TxZcXRaykGnKsoLCRTfqqIX0PJR0enzbn4xU4nzJJTQMIpWccTwDmMV6oAiiM1ve7Hlp+FymVZ4prcc7S1f1xqoBMwW1ekms9wB9hlsb1ziuQfcOGHaiZ8Cm5ERzjlT10Lsrvr50xm1XEkDdAIYxsMUcG8hqUIrWf4aHE3VdgEx5fCX3dx0uoEwhWpWJ1dwheWDQ9XDRR1WeNIGqxTnBM7+DrFs8P2LGG3Si40f/B7MRHwMoxBhFVlPClokCQQZtXA4vzNKYaxuxmjN6wnYw8W5MSjf2vpfFaeKAmZQA2PS0BJahDYTejIBVoploWESZXYTqXTJ3UkcNAIvPieb22ou5cvDdXWq5CLTcHfy+h5cTlSwXChviuyFrfIvi5aORU4YOz/Bx+tYQExJKcZ/g95JEf/YmmtZD68sJMvFtCP0Cakr3W8AMWK4m6M++B22DbgpnsBxu1IU8MGxUgSk/UTd7dX3yXVk1EFdMmhXmg2EJYH2a0wkwNF/EOtPJmK/NYKNvz0urEUGw2XZdCiZaC4yzcpL56F8edNZlyxgfhEZHx5JZ58axBdHUU8Cn7HzmvVk8lcSo0ZVr3XLX02NQ9Je2VGq3hZ0clfcCPdQK+H4lf+4ZIQgpoAt3SFvvbl23nqhBTM1wJXJHE8AkdHDYcXqG4mF585VSmSQhd6/ySbydMCG1cpqEXe+TqxzloB+rAgSO96KYaF1x32kVWY2lTqMVobzyYVjQRCtt6VcezBuXmCnYO636Y1d+8K+FcOsFIFKqRhfXrg6KRvBMXDQFZoZSg1hwT9BbdgM13BPe+08f6VxCCsgbjRfA7zAQGXTXV0qNxVB1WuOBKjNv3AD5UxIo1WNTZF44jSQDzbFMiLYuVajOY+e051XszxOrwvzKD9iUGlTcDXLnQfBky2mNu0RuOx77Pp/p7YH3GlNZvz5axPEEEsqLWaY5eEmeRCdL/3LaB4270rrbB439/gMnxBB4sgVoJvwmxgUyeadLsvFBYtm2rx1YArnaQPeFUd/zhH6pBawv6QRrCd/z48WjtKkz4uX4QQAiWsl+GKJzHlR2GtkoNQxzAEvGUrlLjKLO4XqUlNaTRkZG2r49zuIJQMuRYmP1atzT7Hh+OsNfZF5eTHtHjcSxqIeAvCPCoIEW0PYLx9QnNTIMOpgezNefBDbkj0If22HAtObPRgHDl+nBAGNp7H3TJcbgbhutV5cwdwxeH6HDBQMBUtZ3/eLvdEL5afpMmNPKos2WQcJ/6qnXUkuYK3Ksflzvp58oB6FdbObDdZyLSFwpIw2301dCElzw+sush8zbu1LROIkGxcmwcz5cjaoGWR0sj8HxENqkrGw1bqOVtYRWrCHidJuKqeEH7wkVm9gvGmyfjfDScGUmDN2JBt2FXjSBPYMjanAo2L1EA7hiKjHY25bdEpIwDFIKr6PMaUgOzoWWtR3XItR9bCP0xeyVENS8GRlDjW7a/SmeNBpuOzqEaB7HwBYNsXBBDHA9VuGAsd8HhuGDEJQszfUxL0vGaihTsgtjJje9Ix27PC41vXiXp+hdl/Bw/qUGg8VrDsqiBlm1PBtG/wx16RhbIw9JEWxYCPJlOxcwTKR4KMKoBRq8GRx56eBebgzBauG2IB0LPOVkSAWHfPlniLV1SBWTKFkDuEgabfKhH/hCNOTlzRIRLsWZ9SulvlubQb81z0BtLFDlmh5ZihopbGQEkHwhGIZf6BDiLATot+oT9z2yU7wnVY/AjeoEDfwm3kbyNFjYDLszI3EkTzc2Ezujf6iqbbcHwzEk4WFL45yGwYWxEURIPb2YqQmj+ylkPAoWjzPwDQIJZngmZ9DxE0cDKTdoBV8IxJsBwYYHFclAtBlDf7eCPVY9InGzlT1ecfpDI+hnAo9UMRH1TGABD9gec1CNLoZuejAufUYKbKOrSK7j8G/Pa56xd2B0q2RX5suEW2xY2L4EU9NeK6uiYfu0+HHM9kYyi+3JFnf2l0wqlCXgDMyU5pshpyhiSkWgtBwgeKdGiUmCr1w9JdhaYOF+43q+45ZR5PI5O9SgniGEjpOOOkBQA6EY64wb/R2vxioTRAIneArpQFYteDjR9O02SdVYpFuIfOhyQB2hrb4lyEzbJ5K5rKZfWTbd9rTDCuFfHw7tDk//DLjz492Rqz12TZ4eQ05z3f0eE2L5tl4YdDfSwlicqYfx95HYsGio5WqqDpUcV6UeVBzBB5KTpWRrwezkKH5ssLPKSwY0AYkc35aBpZxy07tGaVgCM8M35PzFO3UhIIHxcENX3fNY9G7ZCvwE4wQVCIEtBBM4QiLVLGKgl0YgklYzpyOID1jTtZ5MwgdCLM22SIzRzrXDlXY84kFR3bCRV36FhDmh7VQC8mkmTCiOhOUdiRFGQAY4ydPM0534KAR8KyQ/KjY+rnRXGfOYEF67TKIoUphxpcewTptgvgBbvuf68x+oEZ4aVO7FUPFrjBFV2U7Zsoy+NzBxkGCBeoB1QWoHYZuyc5tjTBdbnC0msp1lGXJBfxqzfXU8UQu/U+hVzKVD7vS7l9cfs4XTxViAwEtqCFoPUPZ59P8yncS82b9IM2a6K1uRDMtLoy75cO3rCYQHfzWae2LN6lF6zQCS/n5NtcA3RsxPWEq5t1Gxmt5oWL/WqUG4QhHlupJhzwat6MB68iRrUXCq0tXm3mmyNO/FuE4t5vsVl52akBFJnrIofZ1Zt1vcLIUhYN+C4glSF4lfLMosKvWducPAKq/NDY9xD40iZ0teBjNGSSg5Z/9kRz22vUvhl0ap1eFsdoJHTP57EdIQZSGsLzAls5hsyi/GlYw4o2U2Y63CTLgUxQf9X9INPBsEVb7E9yGkrfYW87BKE62g0Q9os8eAN90Hr26Cawh1DVuSnLh8rcKhHio96T15NykuMGAi/XuCTCHUY8lNqHhE1jHhiM9EXnXhVFng6qlK5UiwDgRf67TEV0yqLmqN4MVXp8OqyqkCzZt6HnAvFoEgJE0S9Kb3Tf0EH4QwdlAkteMnuFGCddapRFVFr0/oQTKT3qfc4jTvhlE0h9XBhUHjRr1aHYWpZOuNPnBnejb41A506OmTcNSHMwjwe5dX2lqnP1V07iJtnnE6qIPieXkk5bD9v4q8I4ybLqiQrSeGeKITZbUkIqmYoAfgVVyoHbZ5crUPdc9AGBj5Jw/oIgHCgOUPpylM51sdi53Rj6+ipqI2cYAve8Jh3QvavqLNxxvmnmplK+5OYMZ/ozoBOD56VaC6EE5qPSma8U7bqwnZy4B8DJqqV+2P2JilFxqvI3HUpC3AvnsTrzzX1EnxuWYaxRVdPthYU78sC2pn0ntJUF3PKLzfIztt6P3KK8hoPkc3L063mWdNbddowOhB7p3v1y7pMUM1XCsasu5GHRxTM16EejYjOz8MZld/VrcOrScMM118FX0HST3kIxNpdHUTrl2AS7wb49jwqEl8UD2L5cpLbluqmJqP2RnxwsP0Q/shHRRWwNwUbQ632fxq1mACDC3dpSr4Nl7zHe0t59D5AEHjDNFBA+TDwNG3zSaS1G/r9jhOFIjvoYfNnJeNoOeocwt25GkO8LnzQ7YDmQjH/rEvBzj3YXR/b9oNcDtTe9LLPMX6x1gWgZMWgIt86aSDynkxTqNbicapLqKsnaMipcVom750MiY+cFhXS8VhO90R7MdVFFTXOtlJk5367TcEPadeNUNOcq/zVcb2Y+rd+boZ0Hnr404gTtjW64Qt7VCC4GzNyQ7g5uiNuO0vof5gkj1ZC5l2YJ3x+KbYs5kv91B5Gl/o72mcTHAlkNcCzWhA+IB7bUhdWjT9EtpY8kUl8LD+ATKZ16VGtfHO4HX1ZDl1md6b8Y1Vv/J1+guTagIpo7+8RtW5dmu6mWxxcDt787WjHZ4yXBIokLM8pNt39tLKRALUp85hGW7zYUocBN0xaH8sUY2uxAVpxshjg1oi/J+ryp7cW7cfregEU9B4jLQBntAQ9Zwa39VNRQs1hy3PFcO1zaCjETC8PiZkJLnI5OdSHvDU08ahu/SaJVAcCaM1PDoYlU898k9zd8Eo0gM6kueoLXmCmp5uOtuWCGJDMx86uDZK0lBHBpN+YaRl/3jGa/v469nma+eUTU/7RZBIr31mcB3ovvMqSOOfxz7Yie/4vFWL1N4svOXqyUYCV91lUXuvWPVL7+dXNpIJX6UUx6enbmNOjvUSQ13yyeaHjpC0fqcsdbf6LDNEqP/n/IHnQx7usznRj/t9ZU/H5H3+/0kr4iTFWeTroC7UfWpf2HMKrnLeLF158tHO24pP7yJ1SpaYHgsonjFWd5XicP5FHznDndr2ZdZXOdGVDlll5ZCZgyKPydjZESVmQMHyy4yNFMFWzGqbNi1Fk/wyZT9uSV9Nl9aqPI50aU94x0uCsusXAb6+ymqB0Ea5zLCspSeWwZauS1+eGnDJKaOc+g5TMatZ071sssQcTJbn15w5/Shf9eWWwtmHScbqG7OOPEjeQ0uu3yC02fNsmrnwlEq1dFI4IYx00ere+EAUuWJprNvg7muM6SFcN+t+ab3n5jJve9skb6IR6rP2gEzNuf8atVSI1QfW3hoUGanknCusL5anglGqSJ2Xwb9anFidTp+bloT2nQZs1WlYmUP3qO18hpJIniTvmySRVn3LTKHM1ddMIctLb7SZ0ZYskytIPrr0qsVj/Ku0cSNev9ihnvOhjtolndpiqpndSzzzD88tevMQdJSLJW7UPTdhcesHyYVbADdk/VQM+9ROtRH8qpnQ0lOXZLVpo2bO2KR9DFOOai5lqS7VYJlxzs37ElMtpNuoVh1Ox2xL6Wc4duCUXM4YwXH651WQxZH8YbV6V3Z2GT511Hn9wngyMDdEHM04AJr7MSCLOGuB9vqZ4XTWJNa9cLlXWzHl6tacEcwRmrcYGp5UGYHE3Gf7aAAtgKHwxh2MHPjfg2un2ltuztYP1HQmYGq9gKuygRK6WS5Z5/vLjhJZ7irrjXjWIPxIKZxAlhXjE1NYVAQQJXpEUCBCm9e1gY11+cp3UykxwQi+a3oXJ7izkfxDoNreXmH0Z7/tVnXIEYZnSb7YP6Yd3xEphUHJm8XFC54r6zuQzQPHEjAXolghOcXuUOdWUBmnvEpD5whI9FalU4RYaXjzAufG7qr9nl1ki0Y+tWEAwFmftxgKJ4PBShFfl48WRUZlXXoF+YTB9fboZ6RfoVR0jP1lfZ0MidLiQxbWiRXu4gSdXnoPhTSvmVrjyk2k+szzdOwrsiwJ40PzeOWGEabUAK6rQOVKkSBqtCrEh5AcR1fV4H+i1HfqTTTTmTd9WYKdeGl29ixCe46+LJB+TDc4BjUXuJ9l7J7Z2OXjdjWyviZajbFbdHdInQl23jQTkj0rZz395qvW+7RRg2reSh7Fdvk+x6V3dK0WudgY8KX0QgmphX7Y75NNho8R60BAgml3Ot5R5UnULMqA2Y24/CJFwld73Lqk9F4gKK3iJ6WOUEduGJ6DWVrGkd+FiqOp2A6JMye61k5V1kLEBq9CPaQVLhsMtO6CpcEnKclvbyY1EN9rIaF7OQogrGrSVhLc+LDY4ct1rAPFrfEw5/OdI+Kcvnsz06ZdI384XqKMxjiI0XWyXZ5HR1JyvL9dNi7cgg6g/GHmdfo2RBqPzzDY3Xfnxsn91xphFB8vTLRYVbV2SaFgpIerHmva9QNB0dTGcAtfWW3Cj+qsWla1ctXcTNnoYkKkUpYZg5UXtFdeTfFdlbf386W3ZAixIYcZl7SJe2f/ohWEjD3hM29JS/aclHAsxhsYqFjKlQCaIqYOHH6tS2Bt7JFa659+Y76cT06fKXLdlJzSyzo9+Pdm7InmL0KL27eYi5XK8CkvA5wfXtWAqSxv9eVN4+PkDRoXndAgxvn+RUA5PtwoMyFmG3KZwWPcKB3GV/1ijY+EfPmJORbQE1/nP3OnevQSqgTYnPpEkdW4w2rTYY1WJXG8+Dt9ox09zLUSM5QnU64ZCiR+vpxwA0+az4I5hikYqpck8PXcnhklFID3AANiBgBacFDZ2fLDugpZ2pBKQYsWbYLB/uSau2E9Jp6rCfXzA/7lb/nDTjaxJDfEzwVQr6Z5O/3CT9eHoQFyw8JdsETWEgbiOaB89o66Do0byyD1V8+lAaT6c/GwWyK4JVx767/YonLIrbXEjfLFiv9g5gLaA44VgIThqQCVkZb69kRYmEg1hx6gZ940Tp1v+si616YP03Y7pzugS2p63cCEHaC38vyOw6/9cp6ONGjK5lwdeZb8nm5Xe41/SCux89IKEczgYe3UVzcEZ0LepZez1jVFGoU5tVKaGw8U76rf/t0YPx+VJRU5P/+EUU9K9lOcL/cik6NFCoB231lFYB88JUKRUsnwfS065moy45j8aln9DJlbBltP35mPW/clbyzlMzjYgTq1Zw0y0mdst9Q/u5+BdC9EqeSmiK0G3AGyIsSDSBdm3NQwwMzalnX1Q9KwthfX4RZ0sEzAGAENRolfRrUybanPwS7yE5Q/0VFAgYz9CmRNiex7SxF6pKuoUZM4BZjL1NtLBnvCYC9TxYEj8mvrRojt/LmWx73u71css27cxiSVYpRpmQHvaD/yr8QFqcOaEof+rgle5MXvWKVXCXb5EPrA+5+mCr9YPdWWRabwvoQ5I0VttLesjyTww/r7Zeu2HbYwH7FxiWCKuQn7knnWERhGytS0e6Vl+jEAIzqkGQ3D/MuMlbcoFAbkMr/T2+XBweT7oxMF8ncIpzNPVze5lXTs+CVvQhnLdxalQ5f/4GXETwUfK93grGtbQydAIYwpXnzbOIXn5rHNow8HNeUOo8i5eOoB5DaSbnjgLb7GKY743tHZ8nw6AencYFAAfyOKvXQzg5qUj9hRW5DsYTOY0VPfy1u0w9egZEOgYSJDdt7T0siLwL2KJVGG1d0Z7mwABj8qMUr7AhX3Xhfzc1IRJDo7D8WxV0cg5Fwdg86G+Itj1ZkyRP2SukfcyfjtRjVH+uxJPV09p8v9Zia9dFAsgUOVCp/f8CQeIykUYuoqGoi8HtKGHPXECQ4tQ7xuFmQ5uJujqQ++oWQzyh/fNaNKzEVLkwyR8UQrLYWP6+RrgZDmGhAOuuS2fjP2Jac3a/mZ4gy/uFrPk47BS/q1d32a1M+a3ZfKBhze2aRtbAkQEzSpGQLRioe9THFgNrmXTGwXuIbDf8HUt4K27LeKml1etJr5DPHVEnnICpusaH57fl2qvucofYiyvOfkJWpCBwLhqSGkS9V4tCxxsEKLHU6GMS5OtvKlPAPKnYL1A64tXCw101N3N0luYVXjweh8BoXlYE30EygK+X7mqhN9V7tiPGSni5/H1ldfCplJJbkQOA/pMVXHfVjp3Nv4TBAjYHmY7DLp0hd62nsV85wwjE9XTApAB9hr4bsPNoqjrL63P+QM/sKMCEkh3maBer6hTOoTcSAK547/HIC3CCv7HfwZqlNgG/vWwaPuNxHnWwCQMR39miUqay9nIFe/YtKfd3W1UGsrn48XLScMBCB5O5CtLArswv0dAuUg1wbr9PZK68mfBzMzWnBVEceAs+LLaHjerbNPVVWmal6vMyUC4RZv7p2tLGbR/Q5FaLgPTZGYYD09r2ZE+LaC+gniitBYsHKehjmRcTgqUYWGNQcYnT17+IJIUMFEGJnMfakjqqSwwZmHFw6L1VjnX8z56Yra73gJho+UfXmA/sa9knZL52k11czrloQWDx5JjmvloUtw5d0fSfzcwhgFTXq9MuCX1hA3SnHne8SY9ZrfyMXyoD+uX9k2pTk+6cP+2MtoGa9bkipC114MB3aUM6dLmpbBnP6NRC0aeTFFmxxNBWTFb6HOHRmRU9Q5vUp2vb7BVQCsBlJklmNv1pVzk9QgApj4QtwDiUn2ClS7VXUS4d5cEnxvStpVYLoVEbU6+sVAmJsWniyvXbc8oe1B3lE3VrUMv8whmQ1WYimOIM9jmn79G43RABLJtLQOUALSJ8cyhXvu7IWVbm3Dm4yjqAOQKz8nqgY59oZ1K+n6zz9ef8em4S/iKfxGg5XI6pK5CaLHXJClwK1JUkU8zWUhxhZI3fQ7bROnWia4+0Q9OuI4qKLHXw0FBJVB+N3Uuu6zH9h4lnY+212IG+paaqR5N0wp2VCqBq2R9YdidGCqE3sI7Dz0pOsDbpKfajiN7jfyNW9J0DdqsZ46OKU1yqVK5zmZo6d0L5sG/SldpFuYnkCX/uTQ01PKp1M7ymXheWMEaWNNRlW0gi7kdlSNmfr6jyekBPrCwMtPFp37xZO4mvNbKQVekmOZS2aV7nwtiUSWuBOcGV80EfD97DrGS4eV0cWNc9r11iCWUHSLL09T68T4Kmkp7nCN0uBTWxbTg/5oTy76M5+iKJ9Eo+MebfV72n56k5bZgIZMd++P1VQiFTpTokCx2P/jLqcvwud3JWOHAdyIqVpZZD/vv4hyE74UUNsvlYgYUMKAKV7pi/nh3O1H6dMiicNBd8fR0YtydHJ24BTxDKzvtrgPGOB1y2oW3dXMwuYmXVJT/3n4q4iwy6DlluU31NGQ1JwKV9ISRVnqHcP7dUA0ewC7fqgvgmPYs9PRQ0eArIJL6vm9E5igsyKTe81kc3ErpFYi/1MmnYRpumAKe7F5c85rLmL4/G4nJ/Zbq6gSdlEpL2HD0BoK8DQ5ySf6RvmNNsggYrkpiTgLhQseEFoNjAZn9+oG5FMPsJpDEWDzW6UbMONSnOXD9kpDxls1U50vifC7Ql4cSDSGOXUHS9qr2CuTdNkqGzGPvNRjAlhyWZM3onMgGPBoVLWeX/J/gtpFPWkaRZHwdqyOWVZx0Me4fbuDohGsy+yJFWR9BhpV+Vn10JgAey0q1hT75Lu7JOwSDKd8oj55xOL/o12XP8ASsnQWgfJED63SvV/eGFzknx/3jFKTGRDKBxR3v8QZnHeUhHa4REy8JdPnsPWuDsi7lzimb4gLC+88/7rUt9Qjv+jxlF8SGMY0g9z3OPuTp25rhRyB9W16dmAmlxUf5FxCS/Qwe+awY6/Ps5gB7+MSSgsx/QOPFCmAu6BeKGNRVdThHAemNtZdzZU/K43rqKS9xbCSVapqPnje3G0w2sH+k3WeEuzeez9T1arJjsnnT8rCjMFm+1gBxMes0sDES7N8yYOQOmoYaga9F6UwhP0zOMwjjTunDOWox5d3K1z5g87azJ6Q9TOQb12M440fdcO0/ftIuOLt0v2YhR57HdikK0dDpHTs6yU4aoJnBmJk4D46rs+K4qWpcVysrse7+rTn4Cn7fbMNEm0QEJPvOJXKDpdqAcGwlpqeSFi7HAdg0wxP5SGBveLV/+KIxKxvzEPqgI/y087nyMeE7pk+a51I8Ee4WS/8qWYRYkxF+bKpJEOHQDMwkv519TWKOsCDLxaeMKV718pMcnfXxcmjxPBtJtUR2rEEISUtrVvl+3aMbE4vghzp+qlm2YTaeESOB7TEbBEX0yIQTy3YY7cceqf1ekvlWKj1zIp7326SLVaTNW8LP+XFQQ7t8PJq3JRbvuWizm/4/gnkdLjza07aYz2nJuJ/hwsexHnTjy3R4VYBWmi3+XgCz7xJOoEQ3bpSnXZW0RnGaadkvochYTajXzmVSKyFxl1kD1/VnVXCM+Q+OAgAzhqp1DgXY0Ewoe7bsdpcnywuMqXE6UKKIT8LxunaXAE7QMhwJtmEriejN50Ghw2obAV6jmJAoi+MkJOBZ0yVMPOEH9WVEduV0h2Y+ya9Oz9yoAq0o2bZ7GTgvuNOPWNbQ5nZUyeFQwvXyueNyy/rFVuehu0x0yaK/Eg8ovGSWrWH5S3cE5r7ArrR/MltXBy+CwzDsRGG4t2pUG4lwAckklJ0H62IDUUZNEBLBEOIf/6pjAlFfK/Jp2Bhz84E5IADJEgmhT+5ajBSaoyfpmfdr32PcR1LJ+aAvWe9zJCDujl2T3YvnRTsgh47iPPc2Zr97NZpzuE+Xil7Nkico+RQiVmgtYYZpOHHprgF36XAqXx7QZjrHSsJKNk5YdzYLY8eykMxXi5vHfvLCw+el96wz9Whg5sPJrrOJvgaPobjtlY5Vcg6FefkOEzYOpws5hctmInVmWJPWo/U8knZbb+KVaGFQe+mumQ7/NZGfN8T1x4s0JHtUMvNo28gVc6KxFhl3SDWLo3E+qoQxZfA6N98FFnC6Em7+G9xz+N1xbd5mr6Zv/1ydEg17AMcHbWu+hI+e2h1DiPtE2KL40XY/QexIcn39Uz2Oi6XdxFcPgRitX2X+EAmWnSDlJrDz6aVtECyfKNWHSr8AywfEglw3VJByQRdNP3CJVwM/sjQJ0UktmsTmGyi85y1paUZtsaHRIpn+IN/JYu6DDxLm89zA5xzU2PdEoP0LuMK9G42DWP0dn2wH5awD+b2dozf55Ork9v9t0o7FmvFRj+X9e0kfRmhCh4nriloYmWeQKGpmEh8W5msVN3nZk9MUZu/JlQF6S7MijOt0diHHniQ0mFScEoMnti747No+jDkpog59uq7WJZxvZUsNlGCx8qGuek0j5W5I2ITLuM34ISRBe3YqKWSawMENHNs7jpfj0joBQW51sfULwXhDwE42uMwgCtGk4sKn5jp295xkvTm3uwlHNukJ6RdVw3tuLnuf4r+wTBkYm2K9P7xVN1WX9pdYiQ7ujWMto5x7uwp3DGZZLM0hU34RGcodcxnX2KSRqPfkkWsGaShqq/ZCiDWpSuAuUlrO/vhqUlvfL/dIeN7gmveapB/j7+GI6KChm2GiwOHWm4anhHrSUnn8wyl1435Az+helcVqt23yLaYw+aqPBluGj9Ne2oo9MrvMucZ2dHxXmkoVOBp/js3dU8LheORcSfAVXVyL4zmZu+4FPodDjFj5NwWeoURMz97hq4eLmPj72NPYq9pNdetqPdoRWnjsU0itaO2mwhsyDnXtTrmhUHePO9mLhsbx4vtFk34MsdC2A5eRQC1TJjDms2K3sRI5CCWktXUQKoCR8r1tiZPWHbpEpNXpQ4LNB/OWs4PeHUKFlj/SekIXz52/738tt6RrxJ7+WiL5yBM1ZA82mPH1HPrufD5jj24de3LqdSGfSzTOyX7cDy6+9xzO+t7tQ1WCG5AOaoAtGspurBz8HYLw4kuIKa6xIKqNGSBzM4uOd4h2716Uxu4ZwrPf16M/ak1cI5WhCdxlqNZcNgt5Fa3faEmH3Ld/PVp1zaHVkGDnTdhpeOZAMpOFCfThhRHv57P8zeEr0EQLPa6UWswhV6RonSrtDl3XQq67cda2J4qauNvkYYNpOAerHGPrLcnEnC86CuSOlWIZ/rveDkAsH06fD+M5CS92aK9cfwPtUDrGHIxJyxnbaDnD4aL8Fzx0reoA+f4G6WvlKTdQwkhoeFc/h36iH/lL6nCdBPEJFL6doe8qUwaxpN502sOvpeTOreko7u0Gz1b3Htq0ooeGXpUiuZqLIVepIlbc2XkrKgvz5YUddykh0MlQ3q6ebqnJZvmGwnzSGAN6XzBCKekYwZdI0h1EbNXr8uuJW1zn/ZFeEH4cMGY6qpAD+etg21JCGgDlvQNoCL9gd5BnXwqKY9rjQYCAi+FZj7KcGhF8AH7jPjA4uJXtkSSpptMr72PiAFSWuy91Pa1/qM7GpBcv16e67h+HaPxhpyhfUtQpznAPcV1KrieYbltmxoFWDhZzhg3N+BAfksOu/rXtZDcRk3fykzPym8iBfjAKs9F7sTUZA3hPO/QGyI83E9QNGX3JJShX7hyHWhp+bNsoX+PIUuuPZ5oUZKb+7LBiVWC77x2eKZ9+lzgpu7A1USS0bv2aH6VRGaPQiEq2hO5pR2RgOu1HX7x3dck1XeshVEe5n2Q/Fj/OHALmOu9lSCLbTfxchRyfQTjeDEehyc9Md6JNG2L995B//qqq66+oA44J/g15gL0+PDw3Hb72XXQb7lN5UXNXjycnQel5Z/elf7nZfHUSoNB9Kr+AmvWTxtRWFDSMra5NYxOvLKYju5RHRVP5BVHkDQvgYnpnhpqbiFD4HlaIeFrnhdIZlTTHuc5Ds50mtpTqKtT1m54PPTQvLYzJreT72c2XQ3dtTW8CvLhDt3UVAYsyA4lfsvhGNKUG+CG/WOpU+coQZwZvsqljvDe6ENbEaoP+53T4XnROoXejw4ZHprJmeGDFXw8ybqQXEvXhy2ZEqIryvPmA3/hZUm0bntpP6f87ojlkL6BbJgLnu5Apn5X3XQn3WxT9tYlhyI/k2l6oy/zfd5lO1lQI9pvNUPP1CY3vkoTwcjD33OpYVTlmU7TcjIBaLOyjJ8CTFjKJOpaFhCx9Uzb7eEMCGTP+z1YZY2PXaAQyWlm1/ymzlIISke0OtBa3wM0m9y+LOzyniArzJoB0/S1HGrTU2RjeIDKLFrRItsfdEOOfqokazi0ZLwd9Zkq3YUv8uXbbsRatmOlggULvRKVb7cfn4n7FnO3tEpJN5nTPrVvtCjTMuBZdaung+7YgQXLQwc03RvtdTmzGG2rMTjdaEjOD+5MAiROLb3w/PCq7rdYNKp5D6LqpLlXJZ6KWZHieCyKGM4byD/S9K30u25jSkgJ3WLV+JzY7QlHZNNpiUzREs+0usKnsgNf5mIjhwAlnp8fgKxNg8UEqnl2YJgqQQEZzGVMvyxyQMU/ximUYPl/SfXlDeXZ0CGC9uKKaH3RAGX55J41anJbu0j0GgODX9j8czlvwOTLSYY/mf5NnxWRK2Y3xxGhvu7EMTtRG4G0Y+66kKIk0EO2FAmRezp5tfNxzxVdIBujI0plO98PsKPb3CHK38kN6ifxG7LzANbD3eWpdpV8uCIcmtmeKMieEp0Mfqa86Og/0QRcgO1K022cQBqCUUIezUvcgj+OXM4Q0U8yMkClaJhtfedt6JIDuYRWn2e+O74YofnOaJ6HUNvN0TiCuWCofV89tHL5I1J8d33keKCxoxKZJUAVnKqCFLJ3dKkdwka2HXd9jUdoqVp26Th/JAZN5DDRvl7RG+PPjznIh7YTG8/Y0MdJmsCKILZaQSg82RUxCiDLjOHIU7FkcJ+rHWEeNcN5lCE9TSRUT9WWcruGx7ONYtnBVsMQ9hTb0YleeEJ7U0VytWZqtFxt30yiI7E2TUogLe1AfgmXeoAlh75ymficS3Ci6xdZP4D7BBP1DN7qR470Ih15iMwV4FPBfTTfaNby7TwT/BN+XbnUjeAEY7eydoeoCtoDo2XqiGk/JhbRrv8CJk7Hsw3DfQWgM4WLKHagxQWBYGmtUqoaD1KKa83IeoE+sVWsXSnNenz5SzCoeLa0Wp0M/9h02dx9/lG51L8eHhtmA7bup8cDr/KgE6u55JnNdu71wRyXOAsJH/BD7u4XAIT3vPbS+zLVXcQCxNTmzYgDUmY8pLPjG20MUqYFzkpCvM1HHpkyN6V7RSIHX4au9uu3BTYT8X35cn7+QT4lnefc9Zfz1TA21GfysGJYwnVikxYbPUHGQr1lKYGVnk8SZpWpfZv1s1NVbfc5P8iZJ8hjD8KcxabexgUZEOFVRktqdwckh/FSf6sMgm0dkS7IrIXgRSdq7Sc8LIo2NFfV8uTNmdqYA9GbYlCWrvzo1B+4qg6mCZrvzBEsi1dy2cood2TS7VNqAtUmXiVoSrIC3Qhti8Pt63KYQMitfXvl26McdnfBtP+zfobBfKbF6lDyiDfgTosXoN46ZePAn2P7Z9Q7kMRHIDYsqQu0Qp6OsfXpDaBetv1R9X3LikTqf3HvfUelJEQDhnO/SOaD3HMwHucttaE8JLpp/h8+jJWJJBbcsai530/lIEVMFTzVEChtpJ1kZRgte+VLrNQ77Pl4pQfz7ZbDqNdtP+Hg6RFYwmrl/TI/rvusoKOAyW9pT0zsktEyJQz7AukSnszy44NqPW06EzR/iyJwz8hPXX8VzDjiVx3FDD2sHH7MoQyAlEKlCqrIYdMf8A7pu+uE3AXbyAQG7L0rBEWL7wxPy1uaWGIV1U40vC6FHTLazlkWZ0gBkLxDhnzjFjpG0OBUYWREcQPprusrO8pvxVln/3mDwbbMiUcTOfopm2E1DvTxD2QJ6g7Mgcdym08l1ndXtyrDmEUGJ+eA6XhT6hYkbM6zXHhQiy4tV0nv9UDLYRGHgHtGZTwcl6sQfGvTqssuFC5OegOPU8vMV6p6Kvo4wObIxCP7yPdK2tzRG7tfrRa8YyGSed2KXnBUmIIdBTztGImceq7zlsPvQwBFmV2xFclh5zyDTBOIiciI1YW6/oDr6r0hN8+bGbhuTBVfmId/z/zt8UiFXdgPa3moN6moCT6fcEuPQbolbMlltZdzchCTjtaUvwAmuCMcaNeJQY3yr7nAaupDQXgMhiGP5TIhLp8BlPwX4tgvj88ozfAib76GTI+GUuw+olMvo6/hHsE21Ugsd4jSQyKHrgUzNk8JqnNe/lKUbv5OsoVoahm+t7dLRXyd6zWB9KTrKf5/efq6itzAkj+GMaFG/QXO005LkLXBv/lg5zNWEOMbF3u/H71mLoOGfH/15N9x2RS8yLhKEL0r0KVUzfeTkdiCJUlERwv2EPanHXWxFyeTy0ZZegp7F2dAMiLa11sbjjfA7ASS9MCIXWzO93Y092C5lCQInCQq8fp3Lei2f0xv9X/LQP89ETs/FoArW/6Vodi2jwdAGKt7cufMOkzSIhkYaC8RuPocedJfi7Y5Sd0TyVX0pIadhxfZN/QXKXR9qrnl1xIQfGOCyLHUc8rP3LEp2L/dLM3+FgWr4EKXs8vDvX54smbrtmt7Sry83jUkIMY/lqgr3t2ICXmcnn2ZE1tzIgnnKgUtM3mjDqJaoufuV0PQCGzdY/8Hbx8HAaan7/CjO7+kSKDzuGgTQB3wCPoe2lkVKY2vZ7Fy0G8Xli4/H2cCHu3W7C/J7U3zhMRj00HoJ09DMYGYhvgxXj3xJ8FUasJCXlvYrIWU/gm3JCJ3hCtvb+1VnuZsUl5o2MA9Yf+ssHjOE9aF8+WkjQHFWiqr/9toafespnb9xjKd+6HE+cqMTJpYOx8haLX0+8q+95mwj6TcKIbLuDJ3ubyAVf9YGwozA8fbZY89pyv+Eo9CU/tLEjkVw9x8JvoNSK8EoI3t6KZREw0LPXhCTuA2fduB3Kx6l8Qha9Ar4NrfWVr0pK3eFKdRpqWlz6VsaeLcYEfRTZLgAO09C6GKlJo0nv9QmLd6E/A5OUg44IjOZK3nbRfNJyqEcrVA85NdME20Dl6yCe+3OAJLshTUUBQFwGW5co0ZOuCe1CZW0ysoWJMFcjJAgHcCfTqc2Kxj8IopRhbNR1jD8Z4DwQxbeMsgB36qNsSCpQxlHeESXsjY4KW5MCCNIQblVwMXtMz8QQSPiFYRayDwvggzhgcuDbnT5xgsOUybjxnjMYpE3AyC7aNFXxYhrrK8TcBQwwK1bLxF1W0oeMLuHCaNWUxZCgHAqoEgdD4uQfqbGb5qgWCJS82xLD8ctd/GyYiEufokaz3W4OC2NsHwZgTASL6c0IbxHFGegFGgMcLjXGGwqptjTp2JKzCkg2K4D3PEBqAPeBF5dxx9efi+KOxxUVGIMnsyHue+ADZerMkuVGfvL01S7gPRlfaaoE7H0fZZ2WlI9txC2Ryt7R/Csb/3Wc83wR4SUmk7oHN/ytVlPBGMozcwlnmaEwT5ApJNTMq2NUntMwcGf9W/KZ+MBwmW8gTkyDOwsmACrCwaztTx8hkCa71CMIiyMgHwyQFzvrqiFTtZcvNoCOQCKzByUy8Gb5ZqmeSmccFRIISpDAC8sPGqB8JtJqMwkitjcToI+vAD7P9H8x5Kaj28K5YLbaOMh6vZbg+R512SKNwONLKcgUZ9nlyRMPQowEQYu+yCJCnC6AKF3AGXACQoHTFcmcNO4oErDYjRGBYCQMywls17oPHUrsvXzEml12X+2r/zLdIgvrYicICw/T/CN113yPBzvqC/uAyZ4Qonah1vKy3e7pYT6jj2GyMRB2a39MsFLa8CBB/TVKn2men4OV2daIG4X71VwGne+0nPzzKaZ0ZX3ClommxUt41d0pO00p53hq2cgZhx7brkxby+awjvtRylUxiVn8qjH0p5EX+GgvgWF7w1f/t08wSdbXzOu08/aQatXdG0TxFkryoqPUVJU/GeEt/k3LVKw7yY/E6HWFsQ1La/U1GOZK3HHskMDXukoVwz+cvOJpy4ivgCNxgnuyhPJTXfBDI1WdHS3tvSMchXDNU2cr9M9TYpt9N0e5kk1ycz4J1f1V66UqKTd2hbwUfEQ4FirG/6SILWa+J1xZhGsM4JJeywvmmUbyVjFik55uCWHA2FaIrZeYJhzpEwCz39TLt1alMrP6mTnHpp6SPYUZyuWMeR20F3paCcnA9oA8gzeG03ZpRMX04vkVmhEOWA2bUESGGdB1uAT67uzQMKmUFXqBQJMjHeqoBOMbmUoZT76UFvjGgtVac+ulhebFCORLv48eX4bItmVsRazAVyPEoHUWEhi6DtqCQnx8tFc5u99snEkztLTqpLSJcR5hYtR3oLrjxhYImlk7ZBi53B1N3ASRVjLxrBCgOkWrXjqYkeamDeh6VU/88CPk46ZvyU9P6iRoHfZLjKQdaR4vmMZzd4NKdZPHSKNlzn0vmZ1UcaowDjbm72YWe8x7+NZNRyrep8PquaGqZL5b6WoMVdclSGqBatrgRRu5Kju9wEJT1p5xad3VFFXAmc/bMg9hDb3dcnxOIM3YRbErzluE05pAoKuG5G+1jeWNXcUhAHVU9FR4exLJRD4uz3y42OhIgxmbNsl4qYqWFRCAp5Hq+ls1RucVKFp9ahOuU5IHmQe6Khrqan3AWmZAzeYtcMIjomdbb7mIojJarSmd1zoN+mSfpSnsEBIkHsB0QQGkDFw682qKLYT6262HUuVAa4NdshuxCZ10+b+0w3UAGIxRx4awplvnnaOBt0ttEGK1um5bGEgq6Doxs7wl03TpLcF+Eg60IXNEXSZTVKZ01oKDZ61xa4MA/JgmArU18a0TffGNDiz5V0GDM+e2PYDKBWPm8dIFv4cRPvCijO3d25+S+QlZ/JR48UAiBGp3t5WPASR3bH6QyN3XQAawS9auQ/EnPWZ1HW9HSF0pQKSdZ/MOIjVpKbhduuKMzFN4m67JFa5Xpouwbz6aqVyF9p5zAzBN9Qud1EubgZLwyx+r74uDnbmwrUytvjTm3UunrN9YGh/ZsJRyqU6Pa8F16+JuwEaIte+w0vIQSgxQgXUZYvHwiV1X0EsiFni5TLCXrE3exnZQux9HwWbeRBMULBMOHaBfong9gYanyPb+UQOwVqeUN8eRWqAfi2yWv0ko/GvIw+UXu0luuO7PQQzDsLuaA5fYOezI2UT+Vojfmd9boC24wbeqhl0u8QL1ZnF5nm4ivVgNUW14yq48w28SBdLLKq4WeDfcN0f39UL8/M8Gy9LX5/+YyDcMKFQbZ/NPvrxMlu1/NJehuONpfiEayT3gkGzksuxtJLwdczeoNi2o7c0PMUnmsWW5w90h3A9sg9T9TxzgL+v14X3ObWYOZTQ/KnVbTqITIrWxDDgcVGDA9k5ISyFWpV34Wuvm1dWGY+z4m+pSwkoekTomukw5n32nyUTnOzgVHt/yuhCpGIC2kfpkawPPAByf2AD7+J9xfjlb5qjO5DGkq72EqHWhOUjKhXOe7SFkTNSbgx/a96L/yQBCyqwWrh2N1GXs1iacv7rkuwjCkLTwef6NcFEOvH0rnTGWPGIbTGyoZYkqAr/KzrAMwB1OBnTkZhVMg0CVosZwpJQvI8yULRBk6Xgw2s5mkQR7D6BuhDRpsx6xR1wAHSGr9Eb6DSj9h9Wq5YIq1laSF5Ah8bF0TI1gT0tmLsPkiPmwmUlIvDABq+dYttPqeYhFcggrF2UkOIJhH6jIajr34RzITp3cGta11lz74HI8mtZv8TdsmhUK6erV03IRmPWFFfcCWJoVjS6jJ0HAyAmy+VspLuU4Uok2kEyTjcU9oXcNfwkDYpmg5YQkKVa8kN3vyKSEM9hCdRFePO3I5BKxGWTFUKGARq4LXKjz88mFohS0LMRQIrbTW2CiM/GVVj74F72AS+p1cpzKmM+HB6zKbPFnlVa6ymg5EivCkfphW/De3fOz2ANQjrJ9gqeh2tnFozF1k4B7w2Zg4lxUqbG4FcWXVp0/L7RfjFPGITS2pIthGnd7SRlMxcH8ExUHKcR2uVRUolx68ZJdXYKQjBU+hKoW9obxP93iGgfkrDAy7XMADtqOszlkUXl6EEhXxzWICct7lqP9KYB/WV9/z4mxRHfwmObA89tJzfKfaxWTYzvGfvcnKnA7cG4nMcr/QsbrudY1pmUZhHh5gp4UwZ6c/DptmWX5zHD8cnAB+1iJD+d+ne++mgie4hRnqF4TL5i9KPJ3Cu2YbePqw+GQETdiMechFRfLMEe1KZ2x406ZHzPGN0PPJcvWR3lCvg0A6Jk59XU9tftvqDhPnw66nlC6qpDIS8725Z5uWwOMJYYpvTrZSveFhHEHTRypgy4oRt2AA1Nb1eK8tJz3XB+jXPZ3ZtuVSMp7CtN71iCu+IsVluustOMBVhqoovcyeTyvbNpe+jcFV+iGySqUXb4CrKHDfqpzk1xTG24vGv65pm47IBAtrTCsmPJyqywde+ms5iqlXrZdC/XvvpaGM6PozYWDJnbDuZgRCuqU7dWYu4NU3aZHhQLWuMQq52FDDvHtU3qSjBAXEKZycC03Zi2lytZki0Vvt3u7NUyn7O6kRed4yNY+34pbrcw0+bY+fcUgq+udF40yVnhW0uA0+VhOL5c+0fvtzSNDkqNplIss+sCYFMzlDSo0bLa0TOQk4snn1kJY3O81TxakKtSIckoNMnZs980RAwJ9M7eoRjALzkHXpx0kMPKJvx8+Bmii/FbZtap46jO0TSsoAu5PWQ/SteOhBbuPvcXLNIUEI66/ohQykm972gPk3s8l7gthOR9m6xfeV1E/Lqjjrx0FLtq8JxSaSL79cb+hp1fLcvsaa80xDjNyklsEeICsDNlsCmy4FGJ13YlL32hcZNpLI+wuDPGp8daqIveX/uw00XW3F2yHcoInWMfQXLpJMRi8JrC2IBlvsn5calFi3su7h9HYfXm00VPPkqFoASO0vzdb+vqy0BlcftTv4bT6Md89zIgiXfJU+HSbYs7xk6xfHfrt6sYaCJfRP4bmymQk4zqe6qL51uFiwI3ti8Z36hqXBwfJvWkCQ3a6o6xwJI99uUH28GaVEtMaiwkPYmOpbwwf5+nhbQX+sXPIcymsGPkUApgACzTs5NxuWtZ4+OzrlScX8wt2oOhmatmKdjbqKpJx0kvNmDGYEsiQ/gSfx0SrCRNegkfW17jU8Tjr16CI7qk5nuHpxwkcHHRTR08ZW6Q+qKd6ckIOMrWLTynWHzkyqxwLYMi5IpykuGL4fNubwI+BKtYctehjBwjRut5wplQlzkNgJ7kvNGKr8sj6pWaF5Ghge0sOnV+8pgWgpCFiRzWPLZyfe04E4HUTp5taVLYht3cbR0EzVS88ALyeBdz2m63sXx0mXEPDb0RfXIqVyDemAqX/bmX14EfEnX8Iq9TA/6jN3R1oWCq7mlyojkTbRIJNyvsWT7y/26+5/oXNSDgisNzJeuKn40efYHd/1Z5rqW2lCQx1hlXddsUZVIOSWZyziF633lz0ixe+5olpEN8PKDfkKonlFViwui1qrXqHl2eU/aGhmDT3M6Zmloz0eTZk9dDO1hIgNcP+gJp1jqPfQF5CajQTGJB3j4oPf/uvyjL052vHA0UdY03hMTHuDyQTckX7LoPbQmSW1eZWIGOH/QFcchXdX29GnTDtWY4kkOi1B6iY5HlRe73RK72hzlXiHaxlgOu1io0N1VCVmca11KQU8P2T5U06iVfvZTtrW1NlVPQbpapBeL7KnaYEjTZnZSThhkTiheq3ZPiv52drNAVYceidMrncEkq6GggbFC563FUe5yV1qW44pF50roH8tVKd3HCVfW34gzwA7ZwaT4tOdsCLkXz9M09HEraEWDbMz4mCdiReclm2YBUl4pCpxapQrDuaVMdBZdSbcV4//zv9qfj0fGgVxQ9xdFpq/O6eceksO/DufpVwb+zkLZ72Gt77fuYPavYqJrWQaZbCF2T5V1QanlBaaaFuaKVuTE25qD16uadJCt1lUrOYddnd5c68wnXytFgdN0/FxP+Wh2DM+gn/uITJNoNxdKaIuXlw8O9QbUfmutl8fKJLs+08g+bjUxzhtdRXVaI7FU5lKpq7oqV5xcU6UdUj2KXU3R5aXn6lqXuGEVrykDo1ZAuVi7KNqvmICsDUZ7juWjIzkvsET1RV+7gIE7Gol/gOsHPWEUycGSbWcCC3JdYcERT/Dq7+y82C2NN7NrSeWujFPdbVe9qsOTNYyt5/oN1GDcdlAe6tN998jUqe1qlnvYKT26ymqc9g5pl8l/epsqW370Y525KtK4Cmp1Sc5JcN1l5pUDxd+oR0Ub8y03q1nv6G+hrTUktPpG8u3Gku+fd8DLfGVD72ZvNIbXvalyCmEJRl+4jKKVMhMe4PJBNwQvGG1UxjiidQ1zSR9+qrRGe/IEBeQwTsWfqB5oTK3ZqXfG+Uaz1U6d/46nAF0RXA61Trcz3kUId2myfr8SSSW+tfK7+cnRUOkXiMwejgbRDnB80FEqUZDdlrqSXn/9+RnJ5KAV9fZxhCdRPKdzefFajTOrTh0U/VqIqxgFdaRPW8z0Q5OyKBk0I6NuLAJbwsiYIz71OtB1zABi6yQocJ14HEGieIgMbKasHyrug27dNU9jdxnWfw/lhbIzHDx5D05Oj+lpdM7Vmyh4ilI+3cz8JoyWn6bMt69k7cbbY0Gkr+B3i4mFDVQhYxfRqr0v0v5RQHDYZGTp9DISccyXFy5lGbW5+ED/7dm4h4W732aHOgFT6dC6i6w9v/O9FmPCOdKda2/9gvhK3xlydcZ9pca9y5OLATBAuhYzSvt9jkAWCyQnFidH2msoyRvlfWeuxFtkAwvhXHuYIh2PK+CpI81gFchSFE/2MgbNi5tOM5aleChxqwNBLyeAeprn8NpiHCcX3hE0bFFbjFj7uYAgZ8z4bjYxWMdS/L69eoiXZ62KI65aTQRTrCTxkkVgI4ntlqYSO9LgVYCkUuvLQYmdvCmnwCImnpwOEYEaZTducHrGlswMBbNJrfsVEYI/ZXuEIV8wvq4oPz6ttz78fQcZKqK49iXyFC/Y/ssUk9yeTRBeFtZTdHsT3sCpu4cDyBH4PsLP2aLrXs9yqg1dHdUFKy7kEBcnXIyFRXYOz/5z+bpF0pR/0B/Tw4+cQE9fmjBK+OvdhIzJBZuPJ6AFy0TBQSX8HAJRIQkqDlkKBPO4HMG55OgbOhAtk32lBBGMxpBhRz8zM5Ca48XzJBkiPy6kmMdKSEwIIxRmn7W5kEC+f4RROobGLrfuS9iHII9jF2Hu889zkSZgxVn/VbTbwQsGCzxG6Y6mZPBW9l/DNPTpLUGX0XxaUTvdP6GjjRv4ls476MQsUU+vEqwBP1gsN4XBruJUeevdF7XYgIiQ9jlfeH+wkvHfLi0fXzPqX9I7OX4SiA7Lb2Wzgkz8i2befqu9pOAl1vY9g1iJgkyK/rrbpzfjPv9OxdzD7bPaK+TJEbzb3etmVT+RsYfUpTXhmuxvI3u8K7CjE/a8SY5+3+nBGpgqrH4SkYNQAom1ZHW1rQgWb93IBTFpDZnWqda5A1+nwypWt4+jl6c6/uoPu26t7qrh67s5I7bujLlw/VjBa/mojNkVXZq7GRG9nMiqhZxWj9UrqarOv89oCK8uem8LwUHxIBqXQ3DsnX65DPgBRNHiA7UdaCKZxQttzf9jKEh+s7q/MN+972Bmtwa03nM67qoSj8NVKaMlQ7fJXMGG/boiMLmC09RoEQzzihHKuMS5SyF9gFtzvTU9+hgGBSYczTA+bKYtd8/MYAgg3elPusVd+uVQ2bC5Hr9Invu4YJMIZQlWlkrPXFIBg6ZIbQslNaMMOMyGLhn1oE9j7lXpJn57V6Mt5TfnUBmL3z/bYztNDkO2r+QPBl/5vSpv/6hd32eRVOqTb+h4oDz1qLMlrX9Wwf6EGunPjzD1iNN3CfPyfbpL66ryvCmaCN/cP/DN2vVeQpItPTHfmKL2XoX69y/NXYeZM4O8rMqH7bywpA19jo5kzf8R1/Js7rc39WlOyMn529nM3dTjSl7Ibd3nEPmf5uGCh9Hhd3aQnybbWOLEqIJSqWLp0j23ih2bB22UwIT99V5lbwzjBT5gcs+fM7mUFltUSe61L4qppvIJXtwLGJGvbde2MxOHwk+jrnugMSsqT4IyxYxj1yx9XYRZuBKO4t4NlXwRrUtice3siGoxSzmY+t3GCe3ij3X4814s7wWuQvKaJmeqjuZQTnjzhO+vviFTIAcPNiZ/OjhA1x5PipvIOeCV94RIW7p0sSmKWPxqnPVuCd/Wyssv+oXelETpqoV5xhBFvtvW88PKe5TWlEg9OhGvhkr6OL706NbIGEunLTum6fxAcv1FtQdrAyl5epenQREPKUwLWoYRvLfcPjL5dnvLSkJmv/NugLD0oHoRnCay26dXYvcp0jDb7vzcpvrR35JnRkJDZu9k65oqzs7REPQZfeL7ot39b3B6qtjiYWWJUTuszI2ibghjmgc4dqxOQe8cK65wlm5O+eAkpt7+JApuYP6IQJKz2ba3lhh1gydt6znbho9F+xKytmZtYk8D9EFum6k+3TZmOvnKEmLXJ2O21fKPj1DjD8TNAjF3FC8RDEbZAok6CpQheI0JCzQp44hW0TFTkvfnTsf3GgXNTbsJReEQJbKwRZroOD68Z7MQ74jOkd2L8qXEcxzRHEx6Pg7ZgX3a+D1CzoR7nXsDRA5NL/51FPG49Y9S3aSTCYGzoMKhGVmKkkltoQLddsS5lFFMZIbrhkj+iViKPzQ9xIDI/tJE/PKi9FdmbRBUUdLMbLgkQSMZ4O7+7hC+oCS0AxmgyI9lwvAy4o2bV6hQmVnsQZBU0x8lBezDDyw5ivnqS5MyA35sQI5ZDStwF4bewe+xmDVx4sGZIOveI2tyHIDkdLQ2L57wYb9bLWs/tL/tpS09vZLvy46AiQu3qWFerYZv9ZOJXOS/MM3q9UiweFpEeeKYKl2KLeYQI5zq/oLN+LwhlS2FNj0DiHh/QMelxJoSg+Tu9WbDFqqyovrDyFeHRxKQZYA1P99uW+xrXW2mSQ4/kszyDvZBzlc8RCF1euVvkpZHSBiW2j5oAwn+nDsyvZutDIgQpea8yWi7/OsrLHtc1FNcz1W61p99hu/Yz1XEKrvnUdc8CaqHFN0TNX99/cCV5uTEL4f6eKWa4v+Y5yc6g0EM+UtvxXIGekKaFsbND3824XRkt3Dx73HXK9YD1/qKgn4oxgHy94ylrmFExpp2zPSzTtjbaw5u04WhNmDhdhI4DnCInYbbXs0b5/cqes52/MXvQkSjiee7E4B5zm2oq15lHthLQgge6EZUr+S3pu0JEjdlAgxkOBGPm/wp5q6SSkYA0n5PV/fzK6VFZXM84j11zP5QA+wDrzG1NHcWP/4FfJuWWKFXSh6TOwJUUTR5MQ/+vhEyI3a+xjMvVcZ/3CnBsmMORc7W7a37UWnKHqE29lL/lGrNQ+w6y3nPQ4NS9O0xrgoy9ZcCURRadROReeFpzHVyZElnOlt9kwwkbv2m/1puPPNVg7+DgWopU/cp6varAQ+p7yNOePXlH0aV49W1EY4Z62IZC+zPMOIf+Ro7GeS2cfTY5Ctr5IQiNS9rBS3Ki440UZP7EtN1OpEbw+UlIA8SEbOKr3Ves7HPvVB4fq+xVDVH43nLdomxxcuQjkGNYtf8VwiIKYh/6YVEaEYRHJLTV49jZdBnCDbqd6B62Swgig3PbultovbymN76KiuyWSQi/kr5yTxWzpzlt74wjDR6/RgBGBCnYV4BK0kv/NGb605LfZnyzf8RlXgNwee7JHqbImonoplZj4TjIiBaSmpZdDobkHj93kvCYNDlHnyZYiqzJi68p79bwt9JBgnKa8b27FMMnfCZbSTOqXw8r9c2ROqcfH48gbni4uXQnXmzAfz2+dGleD1cM0of9BCxoHGpQqvQkzMmsNpSLHWdYrOhAnnhSlrdw5wrLnvSAEgGddn6kWtkMtLQgF3ZtAivADjH78JLiofmoK1y2iCvg+CqOE8IJI6RQVycZcjj1jzJ13nayCmEZ6E+E9Nq12U3Cc80b9RlsLYJn1swh4aBkcbZUuyo+NjZKq1tK4+OXCWnxQTPDslEuodpk8OP6jFd360zB19H2Q1Jvo1CNY4K+9Og0STqfNXyFRbdlWKV8/yob/xsB8Od6s//Bb53xZPtXHK86zLXPzKM8+2wnLsiet9ki6cQ8UsQH0ADnjykwhBciuW3rFPHOdxGAtFdAKl78FxaK4MoYfhhBxYh4mnHuUbSUB0/Ov0Fiu37psfauk5vSHUkandvI7B0a5HErxcaRfhlHbbytWF4r0N8MhDIYJ6C5KFwiIbJwlAfcPBk+u5R/AzRwKCamnh5DIwGT2wHZI6VmckVwouL7PoqWpSeyxW59SC/yyjUKndyTJbbwWDY72v9RK/HqG918eUVnerbHcSFTEbVb01IzgaKSTDEm9cmcyWh9366m6r35bs96eTnssrHqkg9ZGReWekxEVmLANdJPLxmqSrgYxwn7JSi5lJpG9egQErA8odUaRpFl99PlXkqVnZfLPk3EMkWm+KxXp4hhEokXCJW7cUvffXuZSBvhAz7tU6teR/bLN6m/r9U8+g9wnJ+nMagn/gocMZN5LheTtahLvyqoCxI2wh/CQNRLtlXqYMsKTZLs4+zOd2+pAnRuaiudzNGnu/GzYd8YHfdFyI+xEVDemWBg/FwJFKKDrqa8nxypfPYBls/UOERl/e+gLCo530e5/AEZ742sdinATgdVq3V9QElfMxYiGYCc11c7ibKgvOc5ZlFeJk1GCHme2j8ECY0y4HVy5ELq9n075yIpxMibjTNZbU0g8ZivuO0wTeMWTuDpKXGz0JTl+XtOeo+eHgrs8A4fOdJoLmwhOUviGH4SiVoSx0JB+8QCXa3tHNup7n1IS41CFKmUM5pk0Tb40T0JlKXyqt34ZJAOIClafVPD3dN/ScbKuywwVGOTNpL2J/tAEpf+eABVmf/AVL/POPiojoOEG3xNQfOhwdPtPNc858bQcRpY/BD3k2KXkKcUfFLaa5cOIVjZsY7oKFeQukCQnZfxhq8JG5gggM3ViXYw5G7hxD9Zetl3Gv83SZ/I6mteZwWA/eK7T7tVjwcOk3KN43kEtoOJm8y0ZYJhAp5JjytKL9nTyJnRhtu7f0r6/CAPlcTTI0f1AjT4LYySwnq4htoL2Q4letsYx169Y9gDV9FtcUTL9JekHzyPDrt901gZeHxGnX+PW5AV4zhqmEvu0R/uypyGKxg79CVlQtDLBgTFBHtlnN5uKoq8XmxnCKqfofk+fR15AxoJYTb9kwB47LAoqOfNoiudlvA/qw+rxVNqemwRFLeEXS1w8CT8uCB/WJJagIy/+ItRw5f5uWQDA9G6M7j6Y9eEfnRkjBBYfEeGu1BxsvW7Z1aEaA23Ddf1GmdkrRfSF5XmBUqtyczHu2cECPt/t4sNhs9RPtdl8AY8NDg8XruGIzBq+AJr8YLSpgVmWg/RIfVkUySAMMg0MhCiY+LbZ/GqCUPCxZX1gKJiEUg5Vm2esdN+Bg6+NTNLfoxQRInvIbwLeJkjxLHMRhUT2SyDgGpzE3GOcR+hFwrMryPcWnaneZOltabNRBvfczyHRHGI7eIj786UsZSrtXERB8F2HRPgfW2AeE/4bO6t7V5tDLlu/26Asm4Uha034ua+8/JWijIonD3ZPUSg6ZNvVPVTr7VeFHoPoOQYbkROoMdtlSIfgSmMCdAjbGjUOynFauoHkDzh9+fwilkubbVMa9Yt9zYJcftstm6r3iskPQi+DnaA6CGWN7Qvglkj+MGsCLbi02PDo1a6k9ZaImYB522Bf4cSsI+WWHUxMp/1sHhCjn2HWrG44UsDopHZhZny36i98cDuFqg/LV6SlRn2t+zTqiwpedcsSTkfpRcUk0HWSHoRhGnBa7I0hAHiz4toBrL36uHcbP1OQEtUmY/nMIoso+cRMVgX+qJHD/i5mVklj3TglUNS0Ge9J2GQps+s0bQV8DIU6yyBCRYrF9jbV4M9ST/Flite69lF0AKou1oz7pGXWhVr4EldTTXHcABXFJu2T0daAEZ1wIdVBIA4IjpNLtaCXizeYLKr7NtEwuE9yORh8kIgYA1mKPTI7jEPwpzblmfJSZUb5hnCUfPUdJytvf4OYPWNbjgSBZyaYUAwArRx04fLKXS4uk+Wk6qwPhUfrCs96OfkxKLvErnSDBIsu2jnxTZbx3I0C4jpmmt05R9Zq662xd9yxbobE5CXyjTTXCaxQIhM4T3pkuGl6oj9ATeUnqJIhAneHVBkFQvDye/fO5OjP7zXIXjh/gD44KN2SHQEOjqM4l9Kz0v+yMcPAxN6yqFu5D3gZSeBwp/DfEBWELo/pJlfYHll/12mRmeUNlpXYmXdUby/95Wv3x8eo6nbos9WMByteb/TTUXkbvtyWUlnm71NDtIJCe/xB9tZVzxZSVETVtavcCHxDfZ1viIdgVOzEszQceY3TIq6HcKvUfZhVCTsEjwpi9ug0MXmdkYEb45BtBwL0ILU75r9E/j2ESuzc6IEMx/Dw/d3CihWsB+f0J4jk5JI2pMnGLOlfo9GNPkkShacgI1oyvm+HcabWpTKUFicUpPKj0C0kd8K+exdGCYf4unM0NmtE4qdshz4No5R9zrXruk8LO+tHydHTQfX3zp/ZFRdA+mjMJQ+QXm9TRW6BZEfmYmjgeSLcBjT2B0blC1vNqtlTu3kT/7NVj2hcfQon1sEFNNM400IPE2CRl+tvd3Qht+n2qyBwuXKE2bRkBTSaMGfIIk37Gdor5jwhNBljRxuHm6O9MTapklnrD3hY1jT/OBbn0yCXMxBEJjmk01r5lURtwIoTN2CAd0K+SWh4gaV5ifQauM4FrYzMoO0jPPuqFJxAsK6/DUe1ZlCoakytmRKUwtNHR6FPn1LB8hZ7JQ5FJENek9nnWVaN1FoJuihirMHZ1qg6v1H6VqJ5D5TxqXffelWM3IidQr2M3bnXEEEC2iMyJ3t8b3GegrqfcW6toswf1rGKIGSQsoi1+UaBUG3YrYqvkQR9AWp7zDw4CWJDb/uo8gdbQUIqnDFeYnZ47oWaNuOSeDexs6YBFT6GQOZ7TfzRNku9VgYjiMT0bl29NTyjqNhvGSS4LMyzUkjVrtqmJhL96ojteja5tDyUFI/uut7V+2bymb2epuzSoxeThA3bOUYEXYOgyTa3psuqwe9ty7Wv9jEwdwIp1JzZVLK8dD8rmqH7PzYqGNPhVvS6qR5817X/yhRuxvoiNCDTH8k30zIB0d1j+SWg5T8uvM17Hqt3WrcyPXt5TSuj+bmb2dG6kSvdLQeq+Q+eNeb2JEt9cXF89Nqlhk0OtJ59Ir7VUTkpR1Uz+3sOZnFzFcEBbogqr5H4m7HhY54wpf9IQNrWbBkKMu6zRQ/60qBGWXRANzUqDXHvsAqt6GTGBKQop6oz6+936zOAEFznAKaGx+FwHdh4VN2rFb4LaeneXjipFrdBOmwpuPQamm9v0AONGrHKACXQdDb+R7CGtgSo/kc6Hqye/gfVwvsUjYHz2NrTyMbGL1MDGwUZwEs+zv267dGvssmWd1IVeNldoCG5KJSdzX2GvD65oVb5GgFubgoZQugQYf7LbH4ikLFSV8C9L+oVi6biZnT3NI7JEtOaOZRVO9sz+iFTCxm6lRGFWgmo72MjylFTrT/BOqvfcYjeWIEkxkSVc028OVIj3751E2OFXrAuxSLcJqPl5cMLEloSv4mjBwa7Oz7xhVoAGzz+MbzXxrYs1MoRoyaT5m8SjjEYctaHz4hO9DkJm8ZMVG2c+0og5bu/Es0W8vGl3d+sgOKL5elqZNq4o1VI20lVvGwWyU64+6yXPyZFc/7fxBBt7dJRCynM4f2ECC+3cJm9P4PMAaHh296Noj+W5lGxCbwylJrHfwRyA7g8PGDxw2H9PH2DHZO9LDnjJw8Hjj03xr9lunzwZuN/OxggxJlaLGgvv+kiqBYHMv1ANWFgA0fqrwel+ffMYTHeJ1BaErDLQ7Uk9YDAzdoMqq+E3A+af7em3ejVzExOS4RuvP6b8QjH/aVU/ZxI/zqsO5i+ysW1foh/4U6GbGxhWVxx+Osou/m/NLViNj43LopnSU0IwrAL4oyfE7KWe5EqH/z02eL7Mqa/DQdJeOWL3QLw4RJBqD5B2j11wJmlYWWVo5/juGIhlUYdp4bNhP8hOXSJSNJ9vSKKUzcB62t6FKGTVGd8DhaJIiH+fbfwhnwLVYror6PyrRMq8SU0ZBcVJSnLz0lLRAZzR7tpP6v+tSFXlarrqo3/Jf0b9AVYe/QleK1uzI+Fgf79df/1+RNn2fIIIjgbynocPgJMLYrQ9NeZH73+KoPes1/Zf1FMWDot3vz5+ShMRLQ3oa9Y6nIyurVXV8ErdeuoOfF6gR9XvWcv4YhdTjZJGUEOVwnra8TyeR6OHu4jJwN7oHsk2s9rRJDT1oFUTuoeu/RXz6tK2FOtw53gn5fF5dWgjVhD7qK3Sfh731o5OmNDjDz8PaelN73444fKrxIYESCHZP0hGwnbvzjARmGlMkZ1HIYI/IV/Bj3q4k9s5R6U4K3TJ4SV3Q2Xq0rczQFPn5b+vpnDI8ZBNfIMDHL8w1xcKKUW6g2eEGLD8/+3pCkP2UIKlSQQTMljMjwMiZd9zIOhPuUtWNNJWERZHKbfRAWXVGj2/tOACjdpKMHOq5LMow4r4Kl/WmakiJiU7Bq7NsE/A2C0jpZYE44w+hQeFViSOjuDOUhxIeYLDsE7yfur/1KrvXbPx0a/lhhRu6Mo3GHH2fyItNNl2B5V8wNdUjBh9coVdf7rNhdACcOGbuKxxrQ15jeUUmZejdwsujOrcyVUchno1EqNkmQbjhiY+ifHAX8MEcdml+92pI0QtmgCVv9xnmV261MrpNrcsb+XhX5rOItZGtm1QJw9KwI9yeUVglkcmQ1j43IQhELGth8nXQMNNkhWLglZyc6lV637B0J/Iw20IZsU4ezqBHzkFlfFskwYDfoLFhvHHxILt0LnbtzIp5U39iXGCe4OCE8ADwzk3DfCy6/NJ9805fE8MTt+WKJ73EpcPRQb5A13f444TXLeb3ElGN2cF4GXBWYiCRTmil8QLJGmvvAJolt0EClH+sKHP6x2l//PQ/LoqH2+3digIv+B850T+j2JnUNPMDwn+3raEUPYJoIxqYoxd6Q/+kU9oEuqzCy3MYJestIPK9eSI71L+uzX+smsh9Qxfj4PaHlbNR+LuBMKh6Nk5scR7AORsdMYANFVb8hxxBqEtvs2pTOiIi3A+BkOjipP4efKEPvV8kZlSEW/wjIue1aU6O517d+D/Rd9bJOzDhdXiEXMxVrXlr1BjE190n9P8ZBd0P7YLMmx8YfGSK58xCHetj/4A/uHQ59pyRUyiRW1PUCe49xYIYRTHYNLp1azzlCqo9FQEdBPJ4MRSOr8Y1SoGXlS/w71eKtrpcMRsuusrtIGFJQF2UCDDoG9YNXdfcNPg9hQE1rbOfzwVMHItTJiPDHtWivrHu9+SXmtGzS50yFU+NzXH3cNQ3Fd51ffAD1PEozTV6waGCbm2N1niJqhANmCwtGGP7M7NexfGsCaevjCX7qF9mVo/8Kid4Nktp5JyUgUF2qfzM4/HzGidSaPcVcVECPiamPwmp9TDRht/IeeuHDco6eiH3RR5+8JIPlk54CwePErrMLmz37F8dnDOCKYHjTvqZhHMviV8gf4xsB8OXtlmxkjvWipvyFun7DYz7pHUFUT1V08Ik0P7T2pBRfBZtrjRjISg+aA4geBk7kJOlMQGP0UXLL/ewEwVtszsZxzBh40JJE5YrGwUF9IJEZ+PrKwuCW3aWCJKbOrBgGf/InBwIQtJXVlyi1aFFOr7+BWnQLRZLOCZhxLjktUnMrc+xOhzBp9/vLjRRk72irEzIX6ayzs5WPGzUnaLVyk5fpyVMeAL6mDnz0uxCf3WIeGOC8HHw3rrGRvzC/jpAIRYrlB5HwzzVm4cP5ZS840hKxvDLAdMg8vi+gq06kuEvLsJ33LGuK2CH7ElXWp3TYAl44DEpcVwyvM1XIwNqPTSx7jFIbbozwCZDdTt3Yf4fQuaOp0y5oIWlD2IGlu4W98eA9OJupj9Xng4e/z15QkOaQsJEb2IVhwYjE+7IvUylNBlkl5/WsUGJkf7wAHQ+lHHlpNQF2N+NE9DjxhqSAW9avqeokq09wpzezXqhnXjq9qQbSndHgse5+DD5n6AfkQl6G+9q9KlmZGHoH7hRm8P99FtK+v7Geq8xH89HbzSTOt+ARod2EI/XwBUTT51d2Ve8Vv/2QbTsfpodnY+Z9K0ribE6O2Yj/7CATYrjLICB7CfY4S3vkFW5EXdBYT7u/j8xl9TwHf8o7k0vZIKAhxx7c0geuDfR7XA6y9UJWdtxK/q0COmae0xESytE0Z8bOyCCTwSZZKeKPgB/I5Pp7/jD7eissnJxs5uVoBAGgmeEH5NgrcwOgE9psf2NAK6nv80yme/PXxB73wYkUy/E6BzMBcabtm5geDEwxx3nj44ZZvIk31gGvDMpuhhXfMqsYBSsZc756+0Dr1X7+VM8FNl5Y43M1mkpTSNdmVfI+4rQjggWctKmXJ+/qYVwDm7auczW9Fr4mR9Z6/L0MiU2v+1LqvpbvyrGOplAPDSgR20G6tYcTruTH6pq0XQ2ciCihvPalIM20Lb6EunKBvk60Q2CzKH7NSVFJtIw/ABOcbXdYtCIZKOm4JfN17VIDIBC3hoDHxOK8HkCdMMoSGCv7YC6z6t0MyFsXfiLUOvdpV9kP5Mq7OnDgfBiqyL+y45p0D0smefOa1vq8qN5/S+07KGlwrVi5BVTne5IG8DC+T2MVTUj5W2Z+S6WS3rzrh5h1GOk7V7Mebb8F13u36AtbjfkRgnwyLhbYj06+7vOEPcgP0Q8i165B+As3+UDlZwpmiSd2FkiowEKpmz8raJOfTfiLv2OySS/UuCdkmCfBbLsTfKwpim/82hrFhnoZeL2CftlLZQYdUe3uzWr/K/viZvyet9ethHqrVMazOLEr6gq5JNrcS0tC+NsPdMJKn3ucEp8PZiKRDxcVCCz2mOX8OTxRAPcYR/YoljwNyQYEF0MlFPaz/s663Etj5T+5pjKhiNykM7xMpt/R0hg2tenQ0SvYz0D+G+soyecCVVoGRyFCYIHnDZ4StCr9jWYN2ebSXujv9CmkwTbmR55LJGdMOzpZdekvl+E4kHpmAeY0NL+2GFl5v8lU3MHmUnOT7/T4QL4yq6fAUDWoKXfIqo9rhl0twtUQRlHmMrlEpV6sBKMx+7e48p5AzL02yW2c55V4kia6iqirZKzf3cKlYCWdIv8CwWh4Co8S0Gz28pEte3s7hIC5+b5FXSRs6CTOryrvGxFMCNXh2DF7vkPbN18/e/c1Ct7ej53hrej0UGi6DHGR2cwPBO+D85T3g8zIbOnuv4cgn5hwFdU8ubTkrfE/7YY6d/79DxFf/Zf74HhxCcq/j93UdcOukRp7LvjAoy4ho5+dRxc5L1DB7cQzbJhCpFIppJJHmgR2qN6mimfo+Z+2Pmy7BYg9i/dzxrs+P40TbJKh/2hUUsWS/eAfbOo2CXfO/DxeLXLFgm+AkV4BhqgUT0NXld6cMDr4X1Kxk/Yj3i1BQFnb90vnahIXA3dfk9V/j/DCC8JMg+P/vJcln60/STRwTX9G+oS47YIEF0ToXbs4tuiIJgniHhN/hxU7WSh/5W7I4qZNosBhdKYQaPXLares5dwi2+henwvIT3GVGVpudoV74UAnMr17S65CvcabdftdfjUIqUb7Faf2qbQ9k1yG0B3DpvKxTZDH2G/kYhGNjOIz1JDsZ3B9kweKAw+9o2lELp+ZH417gLX7J6mCrdO9BIfjTyseE1d9/g6G0ZPL0dtDZUVXjUtea9OeoF0NGt1FvGFh9Bun+NAMGWN9Fz/7FpL/b4wj7vmidYeZu1bgIeojSvXBreNBW3fBNcwERlyteCuilgEprAzftWqaq6yUfv6EKHy0xMDfcHqEba75+OTfqTiZq8Y2DYrxFT9apjFu42cOPFZrrWr/kTJXKuSOZi2LW6qB6Ti1T9SJLUpGtxVS1N/Jy2Vl1IwH9Lk64ZJqCKdGIn56MhA46tODZkdaDEMKch7YIycRk9/1jEZKuriai4omemVOfU7Zocgn0DNvKNrYKeND9x29+fm9E+4ZoyZe8qw2LkzUmHFuJOpss7W2xJEwHydlakFWsFhwlSOh+TdNPwRSa083hVbv0JODqNJahjT6cj3uczc5Xk0J9WC7a2QBWMwgZLL66rbMmOLZ7oiWINJ+tttSKi2rqMAgeexiaHi6Pqe46fM+j4aoN5T6WpNPUp6U+4hdeDfD9LR8kAW2dtpGPAet9KyONHN+pjL8vAWO4ofSkoe6mYvcsOxgR644RYO//2qJKSm4GbB0O3dDMW+sbuYqSLGAI2AZeGdgrrYM4Ohbbs49RN+Wxv6HRtu9k/lpbbq5zv5TVi35dfTPIXT9+RbnddtXsP2XD7W6hMp3wunRlhYz3iJyhW6X64Pte9XMjXeDajoIwyKUk0yViSrdz2MtFy/kq0M9g0jJaHcIPPBfHnbBFLtHubjQ0AAB4l3XfdgjQrAwIKEyYPiyHRUasZs2dvgc4rnqHMpS36ap5Mmt8fDlOp1h1FE4jMLjlPW4jXGzpXzh9nuQ4M/3caiL4GAwSKCLu812jjZ/fioGUlj1aThjaMnuPOiPdd3a585LAjBNNRn56Z7ZyD1vDhSM7IT5/52TsaEpIa/G8D+ug20DtvNDdg86oU8/jonX/K6HmSuaO5CxKwNsDW6XctRsfIpndpL2cduX2yTyh0XqQmGzgknfWX6CPcfcU4t93WgaupTX2yCdngfQ9kNsoj72zipR0wt8EqRfTVJklhErFKrcS64++iOYK2qXDYZ4/hnFDTrrVzTLnpBzO96i5Jfab1NTm9JfyuZc7Cdx8rM2jY37FKU2uxu5SAOB0/3G0ibB9aNkRwwU6VeLh8Xg6FJPWoxqTBdlwBDq+2TR639Xhc2aUalK1AeIagUyjUV5w3T8r4kdloIlQPMRe8JCTjvp7NcW6dSVkSBbFNkkY4e9kgxfq5opOB1vSbGHyHClp1Udvkkmiqrz7D1l4KLKPr5iOab5KbHLu3ScC0IPXtR2agxd4okwxMxwwtdo9gfRV81aX47zKk6+9LtdcYOq9EYrPo9x0G8vWHFamGKvfG8AT8wtgKiYeqcOx6HPRvDpXIqt9u9erKtvYrljEngdtY14wh+jcpMuZvs93mpKwZZOL/nhe//fHC+s2TkMyuO+H2L42liVhFvEYw7ShiznByZelUZ6Ogeg+JiMqTVe3o+zTvN0bISUFOkJKDeC1CD9tW5KOdYNQw3yvQ9JkJQxvNnCaNewqAldUH1RjKKoZzOG6ZfGD4Xh3FiygHPHd87oYwnI8EYPC4zWy5EW0MD5fGKfu2Hk4llbzPjMefER8PINPLwrVmrk+azhluk96E+VoimwftTPCqH7V6HVDsHHpY/hk0EVgVKLy+IA6ESpFWPdNE7F2I5/RMOb8b6jNKfM7R0O0Myhc2tXuulDl9dLb6jgX89Xd2rEh2hFKU6/cnJySfEC//Vdx/V5MmLhhhjczZOoMGCc4y8j2d4DFAnrEb/bK/Ou+Tk40zWkO3OA9ISWWDkCr0efsMI6J45XvnnKZS2tIkVWdpoQdOwvJJSP35eURKEQWeVs1Up3SxV9Ha97+H7EdFzDq66x3Jijvbu0W6gJWaVCbaSg5uj46TKQQNm0yTgFyCxSVUaeqjVKMgnEqS1sZWmzqAXPHMIHn0ohNKBubg9PaOMjfVneMyyw6uBotFC69CSzleVlie75BDEDDwl5AvLgGUbfIMh89PBLnlvuzeaywVfQnSHV0bDTKbpD2g9NxX+rskTxzKhSw5aqx88G6/ejhMcCuIfPef91JhPlvLOdBBX0ZEHD1tn17JqE1fBL8HSbx5yE/pAarhxzWRw5eWKuryYqUAuWF1asuJvyJrPdWD6ueWBRnnt2fmJt9rP6vXaA965Eikm73Nz4CuCEJRz2Cx/W6U9imwQxggLiHS5N/Tm/m8QY338ZpnqviYjWE2mGUE/L1ZEVP+LIV+vvljQ4R4kI5q2BTVcuYJCcXl04EPwnNLdLoHu04Mf4HTfhQOOuCvDQURes5PU9+KM+XI3WJxYu/PQX3MQl8NWZJTF7n6V6/8gXsRmX+G/1hR6kEP5YQVAkDKwcwXcocAR/5T4cTH4e/IAPXYQJHEJVsIGCnTI63cH5kdJXOEIg5T07PnHLJMHCcr3J615/rXfdewEEYJz3XhZsZN/GGw7CGryQOD5/3U27djAgm0sLo0glB7AYBzwGaJc0h0AANC8t4xgbdufz7NIUodC9TofRoCOMFCiSwVyNdsIAekyQ+BkE3UMYSR0fOeEXGU8N4rNHvc5p5O7JQ03SjVlL7NyP+myRZrVDeSxlVp07PaMy4cxjiq1wZNPjcbAuiFmMJSdAVq5K/KEgjqMpnOan/R4htm+4O2D/rMuX7Biden3Sf48gOnI3N/YiK1x1PXkgF3f7d9t3OvP/RMxCVve6nZv1ucOPwfHr2Li6P9l9gbe+hauPGktL8L8zUIb3Xn07WCGnvDEcyrLpA2prPjJ+BrGLqdk6tHddbQGV9X/Uyp9OzArfmdHHj0/sXef+k0oSz90pbshsXWlDL6cOa1X/D/HwKU1G5ruTHzCyyb/UpHyFPI4a8AKrOb002VunzTESDaY3CeVO4ZwojNSvqbV2UMg80FbUXVzGBwGt7PS00IptiqUKDe6QUDLkHDKBywEz5S8jrMsfJt8fGsaosGVCBPLJE4vSXRApUN9thfFO/pidjtx7mAY5e1Chceu5l4B8PzTMJnz2lbBZKGrRl/pjIyVh9vhg9ofq73pdJudrJuqZcZFL39mtL00DYJxovNgugP7kqdoXIkp11HyXs7fS3l23c80O9ZDt0Ew1UERaRl0ZTZY75IalIL9PQJW7hpXjn4uGXsdYv767JNJvBXf3ot/tUJhlOpsy583xIhy1C5gebemCcple2ZJIDCrjjPygiVpxayYWY+q5OTIicUE5XG54SbzYIq6fFAy2OrCXUmq/txWXey2Ugk6LUNVzdp+0AOXpfqG7LusBVy/CEHadgR929sw6TOOMDpx63t4E/jaI9/n4s90uOB5r/2s9bpVxYSGaN4mfaX6jmO127Z5ow5shdHNcD+a5gmMuY3GM6tXJTs4JCqAG7vdeIrEs2I9Y1XpCFsMto0TcJwESzw+ucXogDp5E9mZnWisX8zGSBkGtD+D4PWXa3ovuEJFpoVPHhEletdc46/8qBI8GCZ7UfVrIe8LB+6neqqDEj0CmaNCj+I7hOCzCY9Ev81OJFmgAZIqwzAm8j3aHS7I/vEd2yNLVUra7+cZDYPgi4ey69evU5L+2eFaw6vbVvXrbPZJvLtJ1vVwVBlnLHTvvHWsVEnK+YkmdDG9J3NMAUeYJrSqX8vhYmvV/SaM8VnxJGqYm6rTWLRmCkunFMXPSC/kwM3iODLSrjzPqWMKrojiwaVhKLtzDkoMAABwa59v9rs39l+WcnRWZXc2yFRDO4rmEudymLAS3GfxpK8z/tUKpS2Bry84eoerr/1QPllFaCsA1XM/FzCeD7YdDD+HAh0jJfSC+4vZXGEnCYffAjYawFA4NKxmEJhCff10uUG3fuJl12JYAVY3ctVgtvPdojlcCYoIT1AlfXz2aKts/+LZy9wz0ez/rBLqdS4I6rxhqMpxoi0Vl4pFcn1EHlVNkOS+crA160p69ByPYnpXG7fyKF9P4kgdLuJOcEj5qaczVkdGfbtu9tuY4gnD1nWpb890mBHiCf3WtRf0ZBKex7mAv7UTrYZh7eDJme1ErfqQgubNDzTf5C2OXbSwdXx/aFTSDYS1fM6tT6tclepq82AmrEqFdZTK+d+KUcWKd7SrJnTihGmv/II6vxQESZWW8WRB0IIvT+kAfnn6R8HJ0DBuHYN12RGGvqKSZVdmCO6Haa60NBOWgvvJlRLpcaCV+eq3ja22e/Su/5ZyTlD5KPnBtF7d14vdD8/MzWC4XZ2N4KWRchuUG/RAgWBV2nYbpsRZZdQDqdAMwAOsvX8LBm6vBD17UqArbGmkHNxtPUictHVst8tHNZyQoD1IIDd/AGcj6JuwS4NPXvYDqaWIQ/Q1dKHqE/lNJuZ/SYQwHi6tO2FiQ4GQUAsEFavnJRhCtsp1Sat0QTk1JYm2eqbcDsAMjfNmhj3udsg6qpAukBEJI5U2v8KbBfyvITx80wASMMwbp3noMAPf75Mqu8xEw/kxKIdUpQoFBaBqfHsstKTzdk6qyYwXhrjIB7nCRvXLhhv8Ll+ndjQWjHOVdGGBi0VuMt3gaSloC7y3oqLeBnE9I41iYLF/Ma1TIYvhFSTNTQ6NHLvPcrlQLJ7THLA+GHaCtqPrVpVgqoiD0cebz2FwZ/1b90zoMc/gEL37DccHoWuky9JB4vciLrUMlDln2dDLarwoy2mJetkjiatevXTZB9+K09MqfnlusNEy3eSCt4GInODCl4vyA+2L52TMN6B6x6ouAk+dCOtB7aDgeOr98/GyTJLXd74jE4wdVFtBdzF7bkAL+TuZYiqtg/H0vbZlOebtEB91InMCICcRiHc+ZJTbTOfpVJ8KQMIZnqPCEN14DmKysTHm5Hga32nalfxVlr+dYcJC9fls2mTClPBuJXl/6mj7ba7HvlQ7H2oD7WCrxwY/sIQUxrrle0O/3QOp8T0M5Rlg6EQYxcKsNybBd2WRjtyKkL0GyuvXHBuws0XUssh1aznzSFT1OPaLAI9jJdP5i7ytsLyjTGE0hor0duoaisqOkFUR3DIbYzcZ/EiZE0G3ywgblzdvnQ6DpeFKvJ3yYjj7P2L4/NlePx5smXFTpb9nG8Ft21CdfUcsazzZdexXNPRCPADX3Jx+uVK2750YiUXCxMfrtymxgv4uSS49H/ak8PLv/FW3NORIizQk4/fw/eUHdCyhVf2+6ioGCvu8y7Nc4uy8L9QOdv44wmPBIPsd0litHu8g0Dud5KGdZ/VQVJW2UUHODc4ukNpQDtYbaHRnWdGBp3A46Roc0Ss9I5Wsb8vaKg5BD++244FWiTzf67BARUsfDv3xhUJD892YV+G9NlYoualsoJG0XSvCQaBO+ITYf1NmRGOcAQPJO118e6qH+djc4Ij87O9xNk9LKUkr5cGHonYVUqSZzVLKtY2j7ud4UJikwN+iJ2TrPIR0FNI2s/bd5jy5517ji8H9WN2vd0KlADzVNvJIynXxw9QYVSbL6hvkgXavFGzgswPQx+66g2oQCJUMtz1uUnrG++ODCfmrT/nQd3eDs1X2a7PpADWFbPxiS4UzocUzrrkMOWQKfdd2rCneIU4Crz3omicn+F63/cb8pXektvp8rUJYtlmmxYcw3+FSRqfQnKNS7UUohnQRWXeDP+gNhMz2jd6Wy6gxjhV1fG/VMzT+TBfeJg4Kb9WnwEufepymf+3H51u7TYRE/pIwwY7jJjI/P0tdQquMM2TXvKy8Zg1F8ja4jHhsXWO/Is7tLX3HJwYROZ4FHR0QU9IeBprwGIOONeqGM7uU9hgsmS/t2fuexuXUU8lQ1vgFtkPkvfBPTqXz9ORp2/DEcA+91WYL7XAfq49Yqb0TpBrZ6QMrm/kn3pGaM8KnU7es1errt2TCiRb6acU9MQRSGheVZv1RxOnkDEplhxnYVgtkTEXwYotC2/il9cly4fIWr7QJ9wYTrFs+FKWOq3Pms0Syj3gXVUQr+u5HV8C5crWxQlJxHd1BO0W/k04gbhxZV0fQbpM/2G6QrC6YeCMLzaGkjwbiZEUbVOMyy6kKjQonmJtes7VP2iRFKRJImZeYReoouDYJQ+h8sYGvuD2hD74jQCn+pjr7YRarjyQoq7qElH1aAeKqZu2HAX7Gah3s0/+jtZ0BJo60+e+H9SETUmRrVhIKBSWxGAPqYmJTF+1kIwAYuliPTarGoobYAU/j3qyc0/12j8y2hyplWod5xziVxMALWo5VWurEVM3npkbvoAlpwpYZrxX9CnO3SQQgJzDTZJzcIV9AkIY+q2Tg7Hq/qLMG1+rALzoON4knQn2F32aiWtzPa7Y1ZJxZTcIFDLxTxOAIMXIo2MbxvICWGZYn0EB/DRMnX+Yj5+w2oKhef4sVhuVZeBI0OBIUcci/GS/cm/UocFSJ4PAAF4WocLHZ3g9wEzGEcWLof3FqI5J99OE4U14l0sV9ZRkP5n5Ytm9sOJlmpyzssSbAiE7XPboVCfz7kFZM/ct51736aQQIn9mO8/JCFwPb9xCOrsiVuOwkDlpZ33Xic+VmyvS6Y2JgkTuRszfuh+ghXir3H5QKO3BVwckXkfK9INb9+kZyJvzQQIO7w12yRKSrnA5AYhUaR98jaogt4rCwPP/26L1lZtGAH5wDLhOjLxH3+8Wqlr1/+3nZ8zOASXo4d3C3z0pRkkXVOYX1WtSxCOHzC93mst/T3TRutYkecIoe+N7heIOQZV6llaKR+grIJK+19ig/2DaqjPAKDl5306gqhyrO/AbCHZY/2TlySUxyAZsg/nqEERcCtR2dqFs+MElKKzmgT+WSy3iRPAo/rZgYg92GZyupXxSTmHO+MbjbtRDwEqnFJtvHq2NypxLwjQsodB3gp5pwhnWp1UZSrT4UIuMoaqId9MXFi1AWHPjLguG1RFKLC//8F5uFcKOGvjuw4GXU0/DekbU3vPAa2oukopd77WWB8uKATHCKX8aChHN//P0ZYAExpL5IkQQBYENpJpY6DojsjP9zm6LK/Cr++5hEkKNdfNsJCCoLxfBk9C7VkmCJ6pfdfRv/GojaKufUlLUt0WPDiGbZV+6i3t+XzVApwd35pEzBQTUuOee0Nrt5SmCUABeO4Cbu2kochn0BW0LQEHLWgWWYgaBfIzr8AOuCW8FwuCZ92ec/bpiTbsy4vW8msMdZiw4+Ox4OLxeeG+fMD2sPcGgpmDeIwo35HrQ3KfR+Sbru7VrzVx9LMrXgepr49O10di5wTBzrVRLC945TzmJW5X9G320cmpGsRe586+kevvvnGxg8uGdvYygvLRwpkcEg6jeVexsXhKs4UeyxDD40WviMEBNeb6QnzB93yKK6C2aLpd+SwXuCXrx2gW7PwlazeKqkpP/E+4/++vkTZqKf8Zs3/BaOYCGmTIN3THYsT/pobOUPyifFJSLZivnO41QxhkYOmusT9/1NVpNmP9oNg+GiKWyNq3JsCps7dfxRnMHPpVyy6IEYEeEJc2xvYp9m9NvXDjXJ32yGlEI/FgX8xIsS1XJED3gb3mhKux/lj0P89opHgyjVeZk+VC162eHHuIAfaLGQiOtIype+CO4//lBQHlks/1BdeIZklHKCKzglLik2hHrj0vtA6lU3L7zQIJ98w/MyZTlllvMbT+3gxshX9ZiVfIzg5EY10KV9pJpGwUNJc5mzzBBLPptls8gv+faagvinmtP11VsSs5kzjdSqeVVuWfzrIkAuyq+sWOhiqfopC0J1bfxhLM9loogko18Y8wHhCH4my+69XzTJPyZT9/y4MaZaJM1kaiLayOIilBkAe/+7uEvfKXxw1gT2E7R5/eCMbn9uPYsmPAHlCysUNr9t3DYb0UpgSrO0KDfisWHyGo5h0XdhyxYNCa4jicvmhmfROHTDRFhMU3S20BF5BOKjtMawsEYMonTS2218rxrQrI4zJijZeUB1WpCmwGHzcOvArtmjknXvcM10K3DFx3jbUjq9NAx3RBoKu3PKvyNgFzdjmZ5XqeRM1WiRRpqfu66ldhL/orzxEZZz3385j+LhCAWIb9jX1ilieckPFuR2bzp5LlR2tpbjDpY2K6VFXCdLTzYUcj7r/B3q0o29CL8NJjfDO8bmCZhY59WP3bqi4b6jh27KYQ5uCYMdgdT7RExFDu/tEKEN+42a1wsaqRCLZeTBKwCq9nNZ1T/vhQ2wlOvD8SfxpxxpjeBkpnVRhbTYBQDyuxAnvEuB+rEepdXzj2qKBbsBBfhw6sb149t6Ix+UyS1AHnxP0IfgMZy5Ce6Ls70BHuDTGp3kC1enqIr1a2HrY9t6Cg65ONnvkz1GFSxuHQ9ZeDvrv6F9Oejz8OlVt0BEz3mvSAW2dWS5ntsH2V1W25gj4KHPgtEmlqHWXRR7Hw7iLnvwuu2fk6IRYCOzqqF3QF4XdRpARx82P90HcyYxyRgnqGmEWhbNCu737F+2Zz+awghoxPDAKgqyGtbc62cIqSusY9g5rkrC4jGT84rsm47l4imeqDW0OYG2HHKTBat4yQri+/onX9lwzNXtLDTJpKvXGQSiCRIfJLNkWf3ZfNXAXXfcKPmOcbLs1nxFax2uv6oJ3zZ8yET54pvkKM/lJSPWR/C6bR2ZpcckKrE22niuHSAFe0dU2o4bwSBsh4n0OUFfNTQx8o76JEtPWLDsIy2VYrLXKOjHxcDvTHr87cc4/j68LtimtoxyfMJj83BL3GdbfmBKjnhCoM+CEMrV6R9k4ePj1ccRKivT/+9K11uAjxqqYMibnB+oU+eGAyHcwURaWNT2TuYdykmbo6TkZNJWVYe6C3pEToprf8BF14iwdGhX/qikcwy1GNLK3FgQhnUC1Tluz3iGJjWuPWTPX1biZJAxOIdbo2Ji0INjKU7uZ2lddFsm+T9e6D7MWSethHhRTmZjitg4peSoGN+FGK59SRzYQyFRVlYxbb6Rte9denw6/Yg038/2b73vZYGnW6fBbRfVWNJw+OERlV1AP7Pnv0oUb6jDA7HT6yyCjlURhoxcd82rdEGTxdBlOKtK4pibgc/iGZ1XmtWexR1j6RvWt7cZKfvgD619UXhuKfqEqyqNJzw+FIpfL1PsxPKvaDIGIl49xewCNUMtZfxnuLGuBpEZ8t1KEBK9uqKgYAjYpiTtqpUXDk2IiwlKe4LkD1a+2CrgkJtz0T33agYrnWueg0OPyNCwDcqS1TkSmjqqaUuOFLlToHFRS9wMDiE2DzW03lJohymylmUlKu4TOUj495IzuCpYWY9KqPVke51wCeLdJrCgPfN3+Uv4QqSzwxIAvZ9KUZ3fRXS+lR/cFj8q2tJlfFjx5W0Pqs5Je1N0F5wY5m1FI9a84amuPNmpdmrspVMDX1A2drQKz0+4sNOCgymb8xUSfmdRzPyADeNovdZEb525PuFx8zG+Ci0CuJVOiIKaPguhUAHjvg1UReIiLmW3Q6ok338BPmpUBQM8+XJm9Ww4mASA6L0Re7He/Zl+SnVZxWYeWY9HHHFXWNRYmJJLS22k+vKwlR3g9HcQU+jxGe/9PY1l+BGqHcM4SNjp7jxAuWeJlnnFE3R3pUBfh758cee02cIV195tMptFzZ7fRXIpJ4OvU9M+z0XOhRU+AUMf1IRKyeUXb2LgCrkIIDwDHp7gUc8Qd9VwVBEV0qB4EfAlqWHPXuKP1OcluEk8sGWiF+z/cpdNOVRPAIq/D6t36CGR2ARfmzz1t4Yq6nbWnIy4/su7/vw6t/XDs6tv7ACHss67FMSCOEtZSJEV+zxgq1GiODGQuZS5viR1BQ1Ll9qs1mVgGtnyts2043Ct/Wg1XqZlgemAan5sVDx06JP8aETtc1vFZYOrgl7TfGSKW5VvdWST9r4yOhk+GSMWEU5gBwUq7YS8xjQtLQ2a3+e+j+WWzetin+um7aNrnu/nuoOV2/9+MDtUHIPfH3H8frcigW+8POrGu8wtd0R8m6Jax5u4Lyhr4277C0jIFsP03Xe5czW3NHrGpDyl8NjqmPqVABlvHXlDQvl6xLTBszhUs8JhCMjHelacsjYiDAsf1Q2Vg6lBUi+I7W7u+jPWrGnb/E/HBktwGmEoK4y9NJNKMbsAKVWRUV7X1gJZ55+iwEIljE3A9MnvLExK3ld/9IMRD+fT8XacRf7D0iQG84F9HZzbOreyi6g+RLf4FrrlvG8XT+kbFtSs5tZF/m7DVVeYLjLuqx2rDNfU0duKg+CGFeH1d0by3elqjbmuWnqUqTbGozV4tYIDJzoYGzmduLOH9St/v3ttfeBlwSmxROoM6arxsQMiYZXUmQ5siAOA2Rh5x4k2dQPuu44WSloiXl1E6SqR9+2+dtYSNnOvgcdOAfe8yZL9I4IU8bCiIPklUH2T6PfTovf/f5kicssXg5eLXkYCJmxXJS9nh1gjIUjvup3ONQDwBOsWQbXKuXckoye3twD0Q2qW3MOkzvdtyqrDIUKCAOK+6FmuN1H6kCyrJ+JwZGPTOOzH2+8Nw5VY46wkoeGa886dJQcwF54vMfq9WXhbTmzv0mREEoj/ld41Bhn5YOIDX4ymIEpOEkvyhsQcgUJP/GyfTlJw8E/ApWroA5NItpunWGDakAq6tIvScjC5gSY0xoQM42mPk/bVHzMhg0TeCe1VT2HsAssx2ufGpvHQv/76OBbKhpD5Ln3cFb8ySzzlPRhKRzKo9UICwQYjqutiNdx8351cuIxwY5zYZVsKkFy+P4JDmhN5N1OwyXNSou5kjyeTrKdr5EGn6r7wMGYm/ntaLj5AKI9NOGgy0siOxgAwuYHFcwkfuZeiNZCiAYYRB4Hic6SLvYSDzrJoZa548b+ASfHcKpbSKP8Y4VAdPxwz7P9ihMiJyi2k+b/wOfug6VFJYSLjbMYcqn/7WGRGrS7txe7iisrh03Y+o8MTr8lnPxFWkROWzK0ZKxhiDKikKNdJEcAfZaX1NAL0UY/Rzz7xqYsM52Kn4u3lir+iLekvP2OXCyCEE0fQkRhBUGzw0WodFsvXnqtrK9wjtaenRpz2KpJ+E/vYIDCRMB/9H4VTvjnDeJ+JTXz+bbYxw14WmwC2GxU1bJ9Kjrg8wLljVCPM0hU3S742zWvnsQON2galrWLHWJnRkBVHvz5znhUwUMbhcFxj4IwMZS6u+LEVjMqSvHddObYfSb48atDoIUTWylP6FSUHidlwVJCwyeL94FL3PjE5apepW9JDULjzw5lcxK7Txwc7+17uzNw8elqrDcCxQhvVBjPnEw9QA3IyVf8n0AC5/dw8shNyT5/05P9EFIDKGsgH8vRBVkblIrv2hXcZDWKrdPy7z/819qanUhqb/hBpX7/eUXPxnBOxK+Y1dutVJp1Rvog7jQWxt6IUiQjVjtdhhWsUpCmtTjX2Hidyp21enqvgA3p7ciXMVGLuw7vqr09yXX91M/c8LklN+jNt3KsxjLw7nOrNQcVgqw0QJZ53oh2A9KJ75CBASXKbafM1W48hwo/gmvP1HUeiui+iq2vT99iWWlzdQQY4ksN5+7VPv87YIXpoL3Wo8rfHUU3wDdx/AWrCjDMAkCdKv5Pgi9zszHetF9K2Xtya5GssHSxVt0r7YF1WFuoPZzn4bSt7ZtwjivmuN8urENL4HV9Es7eWsfzkRuZLwtlV07akxH2sX+WZM7T8gG7msqLRA5tBE8d3PHiK6wis4WspJfmAHDS0e/fr93iCSNCRL8v2Ahsf5OiD+8Oorea9S6NlBgrnN7tNS/KOZAFMyR2rvt6XG8358q5Qus19PNkdVjwCYFSDXaZLYFmVAjYpMPQLtACrowUjpvLK+jPVn8oZVi6dNUIktvrVXKz93ymsgdy3u9mxjo3Jo13/gR4/OiHL+UN7jZpuDQIju/k9cgwlO6eM+uXziq7n9wSKNCrrU2MpxS6lLRX9vdVQqfdVx6K8bzR/C/LnVB2ZC6ROcRi1Lii84M5B09l8TLx/QOXDsS3Sw5WPvbzGwXHrFafBXbzEGJsDb+zEcPm9fdTu7+gi4K/hr6hgsqsbxLEjWWrhqsrztA+ztkdRTz7l6Mwsegmy7TfcmPdy4boqc9qP9tw9WO2JuIDqr/r5vZ7Zn21s500BWt3f/FifS4yaXF1qN54KjEhS2Kd25fVhFW6JkL3ydjRJGdKr16VpUXOmW+qyOgXiKREn8n3dF62FkrkpA1Bi0liG5JgQQBBODEXRoXNHXYqPKkYKeoJPrjMcOPdFSv8fprrmwP4OUXiL1A/o9AGAnIwgxcEZpkRkKWh7gCeSryNjgJMsLYvIvhztdWntyRdqOCdqIiP1GF6w5KHuD/bbKN468DzcgXDxQiwfzOoDADvJITxOmu7B0PEhiJPuG7vaRb73hvRfKuaDGiexFRsiYLwxlfZk72CJ2cOMxlN432lt5x8KDbYlmIg4S7wp5Ih+f84zv9vS9zqJZGU17gvr516Z32fiSLO/+cO0uh9XXAu/JEjf885XioeYo3U6g2VmaJFyKOcDwhBudlM8Al3OR/aBQrrLb4t+bZAGOP+t+bhk2JrhzAqTi2jk8yQJHLEm42DM+UakifdCX/Xtjwr0Oui99eMB3I7yVB6ju7Hq2orVoHHsTnfNMfK1Rv3zQNbx7+2ZVY1aEPzA/aZAz4/RLsh8AYLWkVU8cz7wKzb8a6eDXzMfoL6KiJ5bYLIgkrfHIUz6MnWZO1RU20VQcXQXRqLXa9F6MOmqVVAPJzNj0r5tt7gheE0Wi+JcDRczdSPcuFdWtl4MxhEYsedHBLqAI1MsQF4tOEtbsJw7cPqktlhxmPakSZvRfZJk3IG3jwlKs/GO9vCk9oxdDhKdAMKNEbt6ngkQWuHalspRGfMPU2uoxjny6JNTmcerSd/8E5ymEEaH3zz+9KkrbF83mSRqsu241gO06j2e3fPmJEku3jEkMm48snY6EkxToVpnu3W81syqIVmyuF2CP+Atyagblttctw+8x2z5HVYbo1ls7Kc782WYCIVE7vljNT3Z00QoOh1/4qJfvK6QmrFNW2zi4EDsNZL/qErJAk7S2ybgfoBEcUNCACRy48V9CgLw+yDA952Fe3dlu5ScjxRpeNRxj+tctbceGp29Yw1yiWaSnJkN+TD2Bmf/lZ/VI+f7HkJSfR0ejsYX1udNRQ0cROApH+q+PmvKrqDZTNmkLlZmjS5Ar2YRvjP7q1ZwreDBPYHx9r7jqRanImKGS7TGC0+jsGGg4tBVfLp0NHp/nL5NhSHwX+2+uxMRnKwpNiJ8gG66TQ+dg5MUqMRM875CmGEPD56RXbxFoLb2ir5n48dwq7i8tIq86ATba0AIHNL+f7X7CPv79paz9ZzGmwE9IhG2t1KUz3UACU9TeXiNeEb8/g8PmevnPGSrjR77i28tmO0njss/R25h8VMXF6iKQiSVSjwaB55Mmt3GQDq5yWiilow5D7GIQ5bWRLQ99L6+rl1S6sfEHvbJUMhUxkUjYwpZ6YVrBCnytTumJCxZcwKzCKDxBNsf/72BtTj0Ln1RtX+H5NIe0yS+MxObuTDD+D7GM0MwUIspLe4uKSrKHitX4hOlTkczUCDe5/ktn9RRSq4zBAeaogMqmwp8X963Psoo1StiuIpeFzsK5Pauul5P7d0D+x5R+NcHchm+Vq7e792f2xEmbVmMwMdG7J5A4lMLlz4Fkj9HkHVBSKsAt32KG4D0qofaXaPCS9v2aj4Rp7ruvcSH5OvQSyjN+68h/u+rBh92QWMeOqhuHo/IM/wqqWsoXtDhQLi6H/piO/g9d4Z6eC/EJ8/JvcXem/3/c1+wBrgdqhZNCSRGC/xfiNvPScOj6Kvt+IrljLnHKH+2pmboG3UM+ahJpJw/87u5fx1Sr02qqClPJLEckzvbqXyIJeTogm7EdyiKn4FjifPNlwYweHMIvOWqzA7TCBJf/Shx3BShf0c6inkrjbFfcVUfUPsZPZT0c3i8rsqy3qHPbXfhlRpedMVAR7JD13olzXxGBIfjj2NXlvohxPzeCZZZ3etlnca2BeZnidPEgRSyDH1A+w9QwZsUDGym4xqc+hGS2fcV6atH5Ckufepei4vzWHwv6KLk0vaZIonKSNWvisb/celr4k06GGt+Mm5w3wTsNBoJxocV0EqDlnJVZeH+zx05kIMLRPbBwmIMlDNvUFysXR3Sb1m9z9M3GjzKWHT9UcxibCbWKkvo0/CR+zQCqBT3GIet3+Hvb0GrwX4zyTTarcTRrJEKmIUVutPxOJwHfays3c6MtgMNP1Sq3jgKq5wArU0jHNb5MQXkF8mGaebNAV9vWj8kA2saN07bttEgIY7NbQj2agKaqy66n+NCKDc1s83CLKT+KUwbhzu766jnpMFGgdOUN1ZW1VBYE12pF/gFcbA1Gk7fB7rAm9+8THuV0zWnaXXne6gDgzgN5laPOQxZvmR9M64f80xZHo8OgBqZY8NJf9f8BDLTXlL5bdNd4+3ZdAMNMw8sVvJYfy7G+YcVNbKj8T4V5jNONkVNf/z8Cf9j+ji1uJov3xSD6dFOsZ/yXA6Andh3lHWAfSpyyvm22t5MCSbUQ3k1/h9vDPnfZ5o+jstCmm7+5hdfX4j8nMwZwVbUeRUSH4Dv2VsgrjBJ0/pyKGrey8FlKqfblLJgLa3IfejvXN+TJE+UCVlxrUTwqBeRdL1t2LE9v8zLKceEAtmNXWvkShQlmP27CJ0lxuSw/osFAK3CumJ/LttusrCqH7Vb0KXRiTmPlWS6WQR9/G8JCW3TD2QHdFaJ6VTHStkHq421bLP2WdrJ5L2E8T4x9Bhxv9rY8d99s53uVRCBueQXZDCQHYVRb69fYJ83wi6oTh05qm4Q0HMzX4oyF6yxtbKrzWYvoJ3ZaRFwF328ZtHz2S7X28JkMY02MnISeZUE+mM8v2WDdoUewvUV29Ll1sLrSGVLmiLJ3EtdY5c1Vu+dETDV1/P3ltbVvFBFR6fzyyt4PoVFR173wTFuEHT5l8p8fcNLxMgeNcvxfkReurdHxVURXQZ3rL62XEexHDXSKG1DioZMJM8smCHbnxqFQ2OWW3Y5E6WpUhdHGDetU//jHSws+lkpbPxF++BAdMuwtniAoyY/e9nTgzQJTTuWWDg9cogFoXk70j4xE09oZJ/0h5PVLpuiz7CtUNMuPELq2og+d4UtsSBp4ytQ1gYGnvHHgUcSgGUX2gOsScL393K2ZsmDD/7iiN7cu5Jeh2fy+f7RXoi7HCzXQRRazyVAWhk8xdWqiyG4F8nC3FPm2rndp6dI3Mrk+/+UL7dnoO3VLxCfn2EMUUc8kaocEOwH5grgJBUQj3J8bxevIrF06stc2zsCBalst8oj5chn3Q6zyUPfkvsqogqhD49Jni/pF68hVoof0LuVS3iGZg68+bdgXWZwj48dp4ysDUvdPhngjofvzMzlHFzzyGDLRu+oFxHU+0oCr1FgP5986wRKIrBUjEpwzuDWJE961+fRdxD/VtIoUolFv2VQX8r2nisQ6t0BnglCkHB1DIojMwzi/az888LVp6oatVwjah+CnNjfVP0R8lKIkJtonfO6C4jjZOwQq/Dr7lYRFYBVZ8L8YCv9mlPx6Ubcipc2Tb6OYrbxL95uxNo52lREhYmqXjQBR6aUKzNb0/dB2riqdeG617xD0uWiuKG1OFysjQ+5YC4Jzhkfa8nfEPgupQgxfVOv+nU4ryIamihdZpMYas+ieAgd5nyer08izpMIv0c6B8deppAoAvnzRQG2TruQ0mJZgcOlaP6AmHNVvZwp41pcIYwUWb7fNqxDfTjALO8Xn8ksqRJzsZCRQ4qDCCjIOkR8bP2+VDIHJ2qHG/ffMo7E7sdmudCjhTbcVGrtGeZEeU0tFf9HmhwgguAnM0JHh0bT0Z7qNxmDEpFGmxgjOlQHrvDHLALNSvHkOphiG8GldUcnGLX+moVkndyz9P2yeel3zD/fH68/704mGQVEKlE0geplZDoq7+LEaPURATxlIkLLdTyAMdOVK2k4bagWw8PF1ilp3jCZB9ohqXANm37Z9i9EVm1Q/93PJriawMZFtyuPfgtbHOt1E5PE4xqFLg+r/IA9eM9LiFpU62vRYV3GJapPpVR6XJAziZsrD55Ecz8p25kwrATPw1wxbTfPz790ytT2pzMAYLO7NEhGV7cszBt88veed38EtOOvw5QTZ+bQdl/i4dgqVVRvxC8RS2GW5FZZ7qtWXwCr9MlJRX4u1DhEnX65/3N1NoQ07iDqVtZ4reOTVJ3P6sf7x/7eRT3Ymp+lQ61G6aieyfniQ+WGD0uPpVG9mwpG7xDEzbARD3Oq916DUV2t+bYH18bcIyzRlFt743vsSFFZa21SDN28xXWGUFs2ytQzJ1Bo/XVqZk4Yvz7Wd8U7o5fdFu/t70SPZXD7DQRvOl5u45vS7f37tSR9Vj3iQAw7uquKXtgxzz39ud7fZbyzwlrJtY14KjTAR71EqC+qdB/Hhi3xmGrOQepa0pepAzxjpzlCvBdrAkhk94T8LeeogoPff3TCHkgOmRp4IsT5WjcdSciPuiTrRZ/l6bx3MwThLTWsFfXxCUJOeoLoS8coJ31bm0FEgMsRBR2i26y51QMOGzSuKAWPa3bUY50cQxla0mQbgnFBf6p+kwn7S1OysKFcOEa9xxYq8dTn7PwYzj73C9EIGN/Iveve9eW8b9QfKb+2xN/xVTSG4NAjNd+wP6E7B+NSUKmdyyXaT2NuCnNeEmpPENXYowF19OUNah5B0daTIsNExro29ld5TLujY47Agj5UAy+5SjJNy4pZ6EKaXtlFoHqOdlPW8Z9zP/caVxod1PNC/k04XFMrEEzoMi9mE02lUo7xthuloKE1UDC99RPL37iPAY+puop/JiYScFwWUsjpTxXiF0lDMzV1+t62ABWQfdazNBZYiV3v1gxajHhGPAXjdHWdhtzEchBS6pC50Q0o113QWwqcgGSRab9NqBTgBmIAy3iEE6nxRtenlfmpuGh+sobRuDCegEO+HCofCyJx4ahk5AM/c0UfFuO1iPrgwTjSQ6yMKrchrw7jp0BQpQ3phZhxMwJB4y0OtYz5qFF2rW+ggsly4Q/kS0+tPlQNcUf3jnDva1c4Mn8OXxJIxuOlNvcV1Fm82AXMXmk7i75IiTjaSi7FUo32gEI5rGl5b8wGr4ZhC+iyGtSdwn71zoSfCQNN0AHwA9BpFZjamvG+hbbWThUiKd0KrWUqr5zxwFY136VjeHK3gDBx8Wgc/cQw/uFJqH03qIak/QI2uS1CoADE/9bl0Zq/ma/wxMX7om2fkbEVQe+BXl1GTQp7OD7v9pJZ6W3Fo3FwDXNFcjMO+urCn8IOujzMIpt5T2pCSlpa9tJg42rZEbvuJ06rHiR/un2xYBsgtW5x4NYYeeBa4bcar+oJLfFjJiuWT/7Fu4t1/OSHHxfEoiH3TEZm8YLLAbS9WFPuo7EIbEtZxZkmQ/HieOa+uWcYrkCk8u1uXCc5nwD0eMdWfJRAGr+a8whX7FztUMVF21+gh2/k1hcvWH3Vq10+Y0BH4DX54i9vg0lYHQXFEKTg4wbvMfnKPiw2nf9ggxBt2mnitxfrzQou8f8KM6CgIxTejqzXPrpoDEQPhdNj/CY1IWPniisyAkzBwNXbXYJ3jR7/hzWk2AOUjypWrKBY66oSi1ESUzBMd7hli4we183i+kqJ91C3E3IKxRn99QVISS02OfEVO4dq7IW1JA/smzbwkYn2Vc0bc8kbcJ06abMIlgJAxKyz7wMc8bqVGMMjviUFp8B3AbZdfR22YLGpirQlYelFZ7dgOn9Nu3Qu8lmdDFKFZslIii9csKqHgGwi8VBsWQk0wg1CJLcV2ntsakQHxrc6biVNaM6Ym5CCb8x6sDxV85NxHTfUMjfQBX4SXVAXFHX8vvPw0YKvIh5XoOH/vfLRKRGPJFvwws4tpvMSrh2JMuQurmoSjQFZulQ5dxSzIfZ/zYVIxJFEuTjsAi1z6OSt0oUQXjaSRZWxmZVwAhWuifdKMQoyBvNvkUuJ5VvPqqA3B4SfC/pbtDO7oOy7S/1eDAwuv7QA/Be/3lEVVP/eCap8CmgjmWnnUn/h9v00aFBCcLtlTz1WivMXEfJI7JV485CUf1f8SJFbQUf3miSqB3XqwYra04KnE6w/VN0Vhs0LHNagfSfGq7nLqbP0PXbXwmYNXsORNhFRgWxsxIaQAq63uNkjUkAk6aDw4h8lwy4SdAr8jIw/+fSTel+TUFeC/88sfdP7C3DXTLUX7rx2wo2R7Nem5T0fftYZz+rzRsWvnaClnf8LxcUnCOC+kF8eKe5z5+EnAfWDPNeII3X6OFoSrUXustRny9MzM5YuuG2s1ud5fvgh9wB3vBP6F/t96C+mES8HEUGWJIAthSF96Z6u35PqTI1ZmOq3xtprYyG++qRm/G+o0t+T/0MXA0erajvttg7mnfSb73r5ghHrsyQXhFNyx+rM2puMkqYUNJeJsbGnho6zLhKha9XIu7soEVeUzAX9R+NCSoNnZzvF5Np5knniRmnqha1zXVmzKDTfnorfm0U4MbrU5whcpP4FGSuPDRyf7Bp3jD2EVbdzPO5TQrN0oFB0OEypOaqZ69OEqT8EGmjIkNL5pCJ2LMSggDXikXQk0io8Oplp1EW0Y14MdKXDdIBYLwXeUdZTlXXDfSWcg48DUb2sTKCw3hU8un7y7Q2uNOhDk/O0qWrV1VDlEpJPX1HDic4Jc1G0G8y77lGSuUPhyJVPXO3O6M+2SgcsK126j9bWzKz+ahYqx9dPTEjvSP47/ugZj7GIvJbLi3HdxCgv1ZfSS0BcOndZINW60+AGWrqLBJHkMeWpPYyScEvWz5vfTOTDeffMF9chlGLQfrJY83P3/O0UqxOz0Lmsv8vfB+u7cVRP/TD0nZjwcZ2EOA9482iRuS182+yV0IhFYA8vb79hMn/HfwrQnn+bRwbQ/hA3fXlYbq2rHpJnrRHxdD8VnW1uSvl7XLvOA/m8JsTSeoIpuWJssiRLtpTJUmT4XsqKbqovPJja40YkbqMH7ITwq1tS7afQhSllPgZXf09vYiExZ5Ztx5awWWNn6tt/43qukd9ro0+uzJpk+8n9vqnnc8zWBJvOnAtM1lz8s9h1guNBdGMIxSTLPpmZuEZ26h6UY6w5N4WVyCzbSwAlT0BfqfUO6QWAlYXfPji+gVy2QyLjrMQTEcjj5ezb4De7OqA1S1TwJxu9WS2dHuloPkrsFPJALevd9wcz4xdZkHM+xAmxrUouHUN6eP3oOobnWTuiRNXJRNclS25f9IUow3B7y56ssZ1il0ly3NKBWAI7QXkRJi4xuH8Zknj5+NzCmUkxaA+je0HnTiPJiIqnRZQZuhCK7Ll6ctfMYMcVkpHBegeXxDCCY4sSnA8u8YWtOS6E0zgiQ+uIO7o7Jk7hxvkMmlvX4ixh/7tgyEXISaR0vDUtnjIkYq1r/Wx9RGCLmAd5mSrcxxnzTGr1apRVAz1FLXn7gqxMRxBq++nz/CtTRidacCrMZnvGF0xplssIAA4D2Lp5ybKtQAJVM9i1O9KcLzMVYgLDwL5j+vHhrS/xy5k5yeSVH4voeOfDvlkgErWGHNwkcsuDfbLF1JNv9zM7jdw3zkkkmsnymtY4u6X3swO+UcwPN2UeOLxHwu625jwaWQ+2PHEBEEeFwV4lMu1PHxQta7QItpNFlmvp4D3nfGhNuPhj4aM+v4w7m0Yw5KS8hLfbZ9zk+UaeokN+RjGehinq3Gwr1e5Nftjh0DOMGIiSU/zkJHHXkaLv8XrBArctn0fIxxbBFakckZlAYReDkr2pbCCunr8zRXdcwooTLgsbIKzH6WMFZEVaWxSZh3atKp9ea1YhRTsXh5D/CPweRYyPO+I69HSZz3mqf0wqNe+qHbuRoVn1tbL6V+2jNl5ookISNh9mjChz/alJVaptTSIpmbgtWJpiScdF7e/8oLugRDkwCkXUXklt68oM66niOfCodfm3wu29KsCSsG8jJWkEKsdNlV+oWsKlcJNzAn1hdQ2GjcUwz3WWSW5MBeu2q/kQ1HamK1uyU4Qy7URb7ejuFuOfQSCh0w9OzLKsIoX1OGHd75IbguGmLIwz1+Xy09ef11svHCzakY8CGWohh1tGd29YcwZ4BOsSGQ1v9rkCa+GKhMeftgtkRyYOZoUsMSrEql74+LIvvtplvC28wjqhA/DXCLlCCrMevgy5+CsBHfn3xXr4pSEKqbc3cuW+NJOOI1FMFagk2MiUz46Z9HFtPsNbwUZ7FsYyVgFsF6g8iGXCNjHqth/Soq68pVFYZlNADADnniH4cPkmWLt8CgTFGtYv22MyYJLmdBHNgKaDfdk29Kaknm2pJchANL33QC75O6YaP/vlry07PzoZ6/l6fVizveEQmltiPsecab8kIIO0x+aW+X3/QleSbEgStHF/N2rS5ujpqqF2GHulecADhg7uMNGC6QSn6oi0vzwWOUUGm7fO0w6HPQAb0PfLz2vdOL+PpR8fM6UgclifXPy8HtZj+U8HvQiktB6rA9hPMBy7FCdlaZRgs6UhrzWNTWWn5+iSd6zNT8ZVJWs/9nK5TwSJyN3Pjcgl7rBxaKnlOUoHPkC3hKIjwM+W/GyW+HXXHUHDNg+JVxMmZTx0KXRbTT8iVwY/6LBruIVLznffGR1/8lzAZHN/NcWiVBmQn9V8vhjxpiLpfXZ/giYh1nhWTnqVzKhej515MQTdm1JC/IbSWSD0LXBnDnFexsNyo35STpCLOwdqjfB2W+aaBqGBXiWb03uVZB+CFcYe83YPcPvDpxyNstBy8LnAmBULsjm9zO7HUm+HzrHdKLkpSyN6/V7CeeT3dLLPjP5WS07bZ1DVEH3Qnpp4JzjvfqNygdj6IxoEjsU3D9h29XZuxqDbHgdN11fRC1Ael51wD5NRHdbOqN1v6ob00cHdZnwTaJM7rzhvfpo0QVKeVf1LlY7+k2YDCHoR5USvQ553wLG8ACJ3bdMvx2Sr0i4mhYXW36i473jaoCV4+NkAdF0sB2j1CWgnetj5h9RwryyQT21asgIGPEXyjzjhBVp+cywGMR+sDopX93+csGe/Uf3JHPYiylbXlsf/b9hXd5YBg7SaEHLUOfrSNadIDkvUrhbq2qAfaSITfxKu0RbVEI7qggy93mdp4gVWh622KIcC+TQ2jQ5TDdtzNxjtsf5Q0igHmpYrvlualOAkWIGueRlLFYbzVgpYhWxHbbOh7yqWNpb6XC0+CMGjSE+PtA56GG459gcpEhWOp4125nAh+dkHLSjy6/TP0OhHdDhEvibrmVcOVpZ5rw03cmgLpI0wm7a1Vv6p7SBtWXjN3LgQLfr8QPVRSiQ13mjDHgAFLtdzBJwNoqVAcWFWAI1w1HLPQrGSUAYx11nZmgaVQJC7Jy0bPRr1l+VlW0V8iHNrRPgj0jDumtyA1wVPIuATLhzrQS37vA3xRWGsUf+7YXJty9gIojhLOh+CZHTMnWMzjDQ0eiUlNyPfOxELBL2K2JsX1LNlBfapXW0iBmVeUQUlj7QeXd0ZpQ6qUptR/QsWSpMbgWveAEZqBMVjdSMhsss+XtD/MnkO0PQz8v3O5woguNAZqhGCakK3bHxqV9fkq7OkYYCiuXTW7vPg7HNmaUSICe+jysN0Ttfb7/oSAt7VBX/HOr/uTM2S3toct/VnsDkPRVJgvG/rxAonxu36x1caw1trSlSSbtOT/3xZxPQclh6QLwQ9aigGde/ubNwJo//AtcT0WB2BmseYPGnlmxgRZaRNZdwS8mzwqf8Q1K4Gij4BzGgA9OoAkQgwPSnwqTWQ1xFAvwZAgRZY9QygJw/At8AybAHbkQMm7wDbCkBEHnh1CmR9DNAfKaCqQNQmADUGQOQdsGxjwB4NgOfqgHW4B2xGDtiiBnJOADhw3EQYSygAMAAQAOy31p2vje8LyMiHA/7/vArHEulIUKI37WlkAx2ArMhgSlSXBIvcV5dLh/SVILkH3a3gozEBpn6MvMpY+pzfPAyVh4oo46YzZ2/8TuNsJrrWRYD9EAzHhfLG2UHQi5LquCcb2veq7crJCaEu/Uy67gGNYPcsfejFYr+BsyRnbWaTzqG6xw6sfjVNVjtmhACJHilBDJoHd5h3OvPj2MuCMScL/sGJ+LCYxXk55YH5XxlmXB1MAhOaLpjbYmLTAzhXu885c/WiTwbIvwND/sSYwwKFYpsv8yLyUXcjngfxEoIxcbcR5fhj0xbSAZjWnVahvD9cp/A6KHvNEWzeG05jOoUNgQ9xfkm1Bv1ISir/KNeX2mR74fbxoTPdM8cpX4Sd5ZzJnwZam00w47tLordwAfhsshHXgdqgPYzQdJVFGwhwGLvfGnVsu4S/JJKPVlD34ZNTyyNVBTaW7IkWxT1D1DZn/8SQItFv2I66kJCdXnJ1hPypHaUZa4EHYwnJ2TGwJlS4NuxeTqrTZwp90TIZhhNp4782LSMN/gCA2/YYUCvIA6JkOGoBlOeiXXYtaQ3G48SOUAHKfJI2cz+7xtUB/zTvXamTqhPS2waZjZMV/FF2jD+GHm07RoovIapwQmcbBE59GYcjCUlhflXNwyUkLTH/GBWWMnwG3PZvSBwdieQrh1VZe+fQvQWmitjOzbRxEEjvz+LOqzPXd0ZRLIzMs//GFwPbE346tbfkRxmutruktVL08pxVjAiVDY9D7L7lz2Hk8S13kCWaVoKjKAtXUZBLjXlvGO1IMbkOPJ8HeW95OjmzFVa+SY6dxjJEdPRDyrGRBSRn55mdzqts7wC8mB3Cxqw6F+cX9jJFwPqqZ5wkCcshCVSkI+uQ+GWh86hebXcpfA7hW486aZuKKhKKyvjW8pLdA9D7s88zl50vW0N6tpseFt6cWIIVZJ5E+Dos6XmzACvvRfyeRqnXzfZ7Nz7dvwaaqNG81CVYQ5Q3Ht59LvJyE07pqIkNI8Aid1FjLvpY1ezkDiHbzWIFwebpZRvSI30+h0POyCoieS5Vj4ma7GPWzK10Nj93tJVtpsL+E4vAwplFFT98GLEZNnB0XeKytEsjRdJiL4RXLwtaFfM+4/EEwFvNyTXy3AF0WpJz6QFVdz8atVdDL/XvZkATHtNV521JsncJVahkpRmntE/WgKDvDykdH51xZXCeIjvL8A4wbTBDRPFHnqiyFG2xSI8vy6B5XOvZDd6KhCklalSceMcPytUrTzTvcS07pQsV9wiJEh2F+MeiGzQgCGorouqicfAnVZmoAdhg/+/OEe3Zd81QrT8gsv7kHNE8OWJ48vj3xhgdPTClh16f1+kgWy0pHE5C2nLkzlvrK4AjvbZvfl6iKTFa0JvpIIZhGMbxhVxK1M7sdT74oJ01wiMVYqhEEWmF1+jFU9Z/Og0pWvWidLe7+hs47pS2DMMno8OPietMsLPBSVtWOzlwdc5rmR4Jbb+wXWwY5DsJ43jvsADfAxQmo0RWM6F5wnRiL07SBmaib0LPuez7szUOYRRv3yO3wdqG5GBu8OzPlKFV415MAUMRsm9FRHTLiQmr+hen+Z/gPB49zPE44mzb8DKurtodnOWXzjur4afc8N3w5zvqlkZnBplDIExm9d8c8vpoyvKdxaCwoCeNbogGje0ic87IVHhwP9XUGHmwL2p+K6JPHKsqiVX1+/vof7Cqzf8e+iWbofwNBEo78YQNaJwSXCC5JlkPQO5t3wB5JE1MXeZ6CLMBmn499NTSKfPNGMy3PVJJgHlsdmtcIJ9zeCMWmheGIj251+sb7baE3fIilzDXuB7uAbNTC2tcRWcy60rIZuOldQKrPv8Ddzg2y65o0amK7uoMXWbGXDsKG49vk1R5AxuZGUxVT1b5kTkD4REf96nmAvWDy8EyWWshCJeptLprm/bXij+xEUrbwFbV0AviAUhPDG9Gvo9Lsl0VepVoQx/iRqm+z6VE4o6eB1AnS0XlU0h6htL0Fo+1NSqArr8PWq8w8bHy5bueeIAC8vmmdBqcPxcyA3oxbgPoM60hD3lIVyzUv9eKonkTrqT5D21Lm+6rN5hLen1vWTuu6Jqffsg9IBCJEIM/VMh51Yx6lN6pdraQfrYRRBQR6thcCwnvEOvNA2ZNPEEin6wbxDcizyxT+6WE7BSJ3kweqFMMacBsvkJ3jxl1H8ZuFWbSR99IrGaQtKujRf9Mleit/TIE/ftVvfm5wHA8Z4TIH3nfOlPWyx3tpUK7qK2tYDyjtsOTeT9/zxLgsM295NY88WlharFGzIAQnS6tTROvrY/ZfG5zz3lInEfduFrLu+utfHymSdo6/h+eb5owACojJgYMt2/yMXUmVdBSvP3gnEK3hZD9g8/tlqpAi5cl/bYQehiSTtdcTKmaqy+OTAsGd50H8hY6Pvi3J7M168ZrtWh/jr7Pc6XQuLILJLIV0lJ5DDnnm+zlqdBIAovvWm4S6JkhxqA+eKIKI/ZDVEOmAqwJSUjBu3J9iB9Vk3BrDya0wswIQGqK1A6mW78qsNgHRDWcSSJQgxNG70A23k7ANlMPNXLsPZfQjxoyp4a9/r8eifOZQjlfRSXngCZA48VsFWJzClVB1kBlmj31KReXp3ncQuVW6EnCpUH9Nu2uOOoDtbYv+T05Sfrh7Bs/JxrLnwA0uZn3Ab7rUuBYBfDyfKewm/BDBtK9Uq6aazoiwz0tfyiaSdF8Rp+cE8yzq3dvJoxSKW/xbcPG1g/0PJ9hGIbhy+1pxAtWHD7KcYk5v4Vz6v05DumYP5NVgsh/IixwDav/b5enM3F80JaEAyO1h4wLLR9hGk1PMc0OyoJDuV5tX/mrnFKeq07+hjJhiYP7qHxC5FM69Hp7e/iMhvSzFVi4gYR+rUndBXcI3l9g3cxmg96wsaBaCEwc0KFq68YdIAz+PttKCO/zLxxgDsK2cMF+LqHtcc86GCoNGc4Omzju07tOH9Q87Mx0pFXiPeGGi/ego9Cw1h369ZJxhX+wwl3VKnvzYsCoqPkLj1MdXjPpTFIlmE5Z50lh41/lhOWUm02mCUKD0gbkxpfrsYVm31cvTOT4vuyzg2vPFFSnOHOaeRSH23cfh6rAhx+VlUJNTVSDaLec9VdEXXGiQ7gyP7UeAMRDqYhjYFqJdLvWXKiRJ18eVOzbGKG6Ue2dr0ff36OFXCAvScKSwHWw1ytXMjiD76NEFi7oxcX0+z9zWnBHFFCM4D7djj0JZZaI+AAm0hEj4SHVF16ZMjOr2Fkx7thjq1YMRkuGTb2KI9e73x4dQJ1zX2vYy8zX4nISkGQ6XGkHGckFU8sRYlZVVMHlddOJzYSHmA0fRk5OPt2B2YUK3ZnpzdDeXzh85uiEM+OxW/8iFiK4lKAW+bDecZfg5y46aV8RL4mM0vRIqiHiPZeAIR74xiIawjueoHsPAUb64/ZEZRSzSPuo9HSN7T7WDQqf7hS8ii8l+5F1YALnW029KFux/CtciY6UZCix0AHrwAXC+pNIFmQDLjqW5o3SGx8sag+qvypXa2Bz0hD8Hke6l7w6e9I5vAqIoyu2W4Vw+L/GbI7qErq1GTeE8ncUBJXWjP0DY2JMUPSvaZue2LIyx9gk94RfZgrp594+L4qO5arDgR+llZYu0dH76wJh3h0G6GkrMwSxwKDJlRN2vCE5mf/feDeb+QmCoUw1FQccSVHFveKVsQ05UtVhe/kX0/i5D2osrK45bXasGvfRutsvrvpNQO2db/WzBZejRoiFfMNBEOl3d/8xqPNydMtRs3uIaypPmcvpLk/y+nXAH2Bdsz2UvJi6lm4sIgZTfewlv/onYGBeE99Sv7aqt1KVAHhiDbHER+36pbwu5X/qGbhLIDmGLiO+BLOfJv3HwGNOOA0BS67DVJVVJlihMqWTvKwhKStS9OlgCQYq96IJfWPA3H4dJdFqm7h94A9OsgaytHUkl2YzMCHddjzfvL2W+30fDk/LKG+XgFMtsnNnO5bKipv4rakcQ3gVBPAkYkGru4aCDGLJdrrWrHIkiQ6SbeGsipTdPWCFOKQrEO58/vzPFfJwgD9paPUIw7Ej2UU5KzKGmvBqciQgm3dWJfxU9upW7EbW0SweN5D0veRuGIZh2DElP6yjGnW7iPt01XhENNu4+cqk3zr7Itwyq5L8OuhNVpuT4QHT4ZtJChYmOxAe9hKR9s9A6xoTEyeBuzp8RwfouZFgvVqw1xfQXu4zWBIlkPlFSp6TVVidQOuPWXBPg1BihRMgq8HGSUdSipkwqMxZ6H/ZnubdedVFF8XeqG8Rb6VvOzj9Dw1iOPmYBizgKCMGvhi72bRNqhj3UbfF0vG0GAINV7unKFDjTbRt+YG4TDQSFROxYCbTaRfQZEwDeWHGS0XrmS4a6Hi+dCSHRnB4evhFkdkxg+Sx39M/udr0LlTBUFFSs3qRqU19RxnMV0oRBG5YQEiw68XTGjpivTzigUUhM0f2ZZ8mJDU7aERkgOXb/pZFAcBKPM+e6rOIBCq+/xTl3Urzfy0Gn4hTuospLJA52P2h5+7JNb80lPlR5XLExvo+butrHIbUUZJDngPSNlWP7ES2B4qMqamSg6UJjHge+X1oXt8xTyHtfN7EYJz+k1uZyk6z9DU8Nqr25zSoG9/x1D1UcDJ8Y5AIHmQ4NcabwOK7BPGD0kSagAcuE6YP6SziZ8DMzEzqp0LJcqVDv2ooPI7A8exGVrHw9A4UFQ+95WIe4sdjK/79ZYlruIOFLwPCrqWm/ULPltIRWET+RQQIHMeq0GzvzyADQ+vEbThlYIwpt3aIz2+RaUqGpIuH0VOPrAy78wEiT2shiuoudYYDw/cpmtXPfDBf0HLUozuIdIQrCmGEDdE8k70C6WW8lPIkiZlnCXFmfuvoKNvej6h/oypCq0Vn4F92yje2UtXNHaDhTYmkReNRM1RxxOUZPMPUqLdGKZu1bzXeJW55qz3iWR3X+qsAgShFp5nIZEwnpJtc9X6eeB0smPr09XrGe+o27HJzEgVZy4tinR1OxpPUc6Q0XpWtG73ukIwYAnv/6XVqsM85TTgN+CfX1PpvgdvOF1passxTaCqo2nJvz+a2QmpxJrImLJweeSIwIpHYxPWjWv7Ftqbc0hBCVSRZwGplKP2LmOs6+eXHad/VstV7qYBaLQtIrlt5IG6yhO+U26uOFgiv+04UOX5gX+s6Z8ffTMoio7HkuDv9f252lWCmkzeOPKB3RHqFzgSa5DK36hsnLypeAvR3GLJlp9q1ooj3FK8oEn+hmYtZhk+Pbw6G8+qlDRDWQssu6uFKAgBru9VRub35JWAJIgiP0PQgxN/FKQVfpPZKYCSHg3ZkcouzWEBhIr4Jd5wVh380OLrBX/vsA/7OGNvYxDpbUSp6jm5uDJKPQtFvRZQuOVeUC6Cb+K0LEw7h/tM4jjpWGXbEp8pnRqXvQu7xpOd8cJrfN0+f97qu4hy4wHoYL/E3LzRKEp7egsSWGMMwDFM+xTNemJV4X8qFEsEiqCDF7EYr4JoQATxPXrg8ZN7xKo7q3YCZ8SqvtYckjXoOz17vInVXFaY7lXO/iCvnhZNK26PY+n/FotLqOIu2ewbL8IlW/k6bHhwktt8WhZ+rbZRK1/LYcAfEm5YW8yEyYuEjhpSbM8H/cN87jUn756UYrZG5bAVHLItr6lzECsUAvus9fuDSitnWyMjt4W7m0QIM2jdJf35Rc7TrP+7wepJbpojCL4yaifkTt2uHw4T43BGUGGMdfRwkHAhJQqTkPnSG2f9ytn2tUXrpyMh/DXepeM0mjfI2f3rsgk54zp2jnxxJrSEUYitnF5J2EF2eLzswcl44WQJ1HEXSgaPN0tsmg3TuQT2T4LBWHQbzJsZSU8c/PG6qibopZMuvTVIji3k97Wl7iJtKX4xPZsFE5x7UTpFLYtdGwYPYascI+MGu8Sk90lhhikIbMsxTbpzmfPq2GkqEnH7v/Qbqk1JLeimXVIh0sNqbJkWBd+BLoXlMYmLtoftvFsXIfnD9fOedwOj4aDKW1QAV7gnROQRA5kpEC5SfM7VHleKea3OZrMBy8G88Rolni+aLYMnHvxow4WtzBedkG8C9jPM5T9OO5XJ6QZNj0X9FecAVeIurdIXeg6WVszrpvDNxugwTHRTlBi1+BMQnEnqHD/no67FXCNZ8XHaTFsKQecfL3gut+wYHBT6XKro/fq624Y+yGY8hhi6s7mBhjplHC1BNa7ZZjvU/l8/VQMk13KWikDzv8sPjptA+XQ+1GEtN7coeOkAjahwn7JhSR5rz6ZtPh4SDZCChmQp9dyOYKxFNdekdP36V9N3v5A24FXoPZnMoZAifWU9osjugGIYYuuDT4BecEpmC0nSL5WyTgYQG3WcOd8J7d7Y/S+7zCe/dKcvKa4Mi/P0Q7YzCwZsv5O1OE1AVZ3tgH5UuRqZGoLeI6oL1ucHLVXg9p8x8CifuY8h6yf3mC3nvGs19zX6Kmxfr5sYaegwSFQwZ1KubU9XBd7W3SJ4a2kNK9qfO4bbgD5enhjYzg7RVh2X29Mcilcg6bCzgEegtenfJS1CRwr43HyL9nQctRI6XEcDHf0GShY7QVNuetgfbcoAN6oLmNibTG58vEiAeKHJ5aZ6TLIq5HeqilcKJ+wQ+9FZIiWRRi8s4Z9EjUQWCttunsc1AsBSn33YzRsPmPuZL/fIbjw/5gT8obU6/tIUkJqKhcXUhCMjnOt9PcfPOOYrOl0GfczLphqS0idpHu7pwUnRJ3a5/DgaBgb5rpfj2netG6x9+Zjg1a7pOBmELNGZXM0DHYlXocb5Jc6o6UkiCDYujJme69dZwD+JIDH2ez1rCRUTf42QuwGQYhmHYITcC4TMnjdM+2H8Q93gdly5BVwzHbW4Hmh2PWkGSRYEKjfTq/SaUvafNWd/10Ob16KoHpGo+xGrxpvihnRNG0Uc8w6ls94EQ+XZS5drPMjTJeBLZLznLQmwwL2raK4nSg9nc7tHrPd/8XJ+uFI1DFMylp4AFAUQpOONXImw5r+tVKsSI6nM7DtjisqWqvl2v/oesmkcXY0CO6EtDuNy3VXBXcM+R29Dk9AGjATei61K4NSOfQ+a8x5P59kShBKGotGRJ/SxE96WlczT0Y6PAqjMKDenczy1TRl54J57Jn+QXz7y6aEXngTouCitAEweRffF0nH3dk45MbLNtFvefeE1mXHgG6mzpM5CNLBCThe0dgnS0pCcUC7TMmbM0XuQ9iaSFRxu3yhYwJPrH32CYUYR/UcnvtevQug2ojbhgOFgI9hCTzrTpzB0bIkbPKgmM2thc+cDq3aPrXR9QtYPhd6+qpHRED0bH0W5VKuJbNeHfoJc8ByvMhVYgKU9reF/Rf4quNP6eYfRPBksZyd03I+lWsDOI2lC8jQIj7lQt6T550CFXyms+ROJy9fiCZtho1hernayHZMWmEM04CqzqBFGFDpWdIS8Zx9P6UA/I/wuGzjzQcURntqkv6sWB/Advkn52MIRUkfqNq7ETSzPvLRucijzyN6i0bk79gWzwVlfWbuWaCQaOwdmPS4kBuvShHMoZ/ER80CwNxeptMxMGe3M8g3ui93nKFnUSLjbPUu47dGK3gDmLiJIwTygCSZOmNrvgky+BLommP0Xc4PRfzDBnvFbf45x5jJFNBJ8YxlsU4w2w60pWzjtD20VrXxQP/6bF+n62KqDPKYIzTL6tCZUVZJl5ucqwYCO/XcvQ+YRQVtnttpQQsHW75UpPDMFiUGQJNiBEt/drc1Qa7aOAIN8KbTAUz02/qV64fHgzAgNLogbK/P/53SZsmGy0cb/V6Ytu5JufAdgwB6u/p1B1Bmbf+JW7VTKa4i1RUyksCQqi26HjVWr+tI9zFf3APfZPvcUbEP/12MDMSugzIBKGDek9Q58z9vkUj3SSgVdgWJL69mB/IbQpZ+EbQkwhIHFmPNgcM6zqnfElXW8SAXtdIFFAtzoeYp6zJRzPfwwZJgcF6o3OskvW2apCO/Eq0RZhnqjHlIQ/JEyOp4A5xOxaAxr305PJexmcrEFKtqpv+3CRmNujVxkiHA4I5rZaBSE4Q2WJQVFFdxN8etTwbK4qz76FblxVIU93RNO6+vvIvyFozlwKnkYnPcUvqhf1v70dZIbsZ+oWA7Rx6atn3lH1cf3eGHOuVLLgmy7RvUijC35jPKMt3Of8GvX4FrmY6ToywZtBTrOp5x8+ny4ahmEYhn2mBWUwP8gbVbrHQeayvmCPmyMez6x1RfTfTORb070Y0LUwyhyxOOLF+MacIQMiR0FU0+dW7OSas3B/qFA385ErX3VfoCtfrEpYaJU+St/Z/UzSI9lokJOiCaZdBaaOxqfxHhRyYVpb9vdVIbTFJRBt7FHeDOvnJa4u17QEWML4ydbNgvxSzbKaG7t8WiD7B2gXR7cNhgh6iAukAInbMjHxl87/OHv+BJK0gTXCCmx5LoRz44OQezNegUU9d8dTZtwSYFYB6gW75IyooU8G2FA2Zq4+fpo8pVVtI9TmDtK4i0BbagUlVtJ4TCs8+JVt5zjQnNfvWJk6Cl02+JkWlCnCfqZRo4oy/EN5Ky1xY5Tl1PW/ExJB8SvLKHdjQkXlFvTI1K4dSBHn3046EW9kb6gEpRrQRViMlXyPnc715zokGHCV8rbsvcrvzSGiC26ndyuBN8940WOm+bf4sNtRSkkQKLQRYd+QtCEK0U2zPIYld7grc1Iai0gBdu2DPv4+VhUzIfZgo/aHzS3j0UYnm/LbR/2gNztx1ZxMZHQPL5uEQqI0WnQEEnEVZXgC2TQGl+Hh9neGedIGS+9ZOKCi1gl9g0vhEr55PDrpRA3AnulFhdj206lZvwtyHIDDvbOqNldEu46i/GzHbmhJsSRwAYq5mWRg/HbDtd49+sT8IG8sHi3yujsK8MJQa0SqhDrgfwbPccfzdjYul+Cd+FaHBSMvp+GBr5vH/ExstyU4sMOt+exMe9/+TCOmsbhryL9snoJKXQbX8phvOmS3mZBa5gDolpDAqXoFHYs1HKYefvVsnWtQ8Gl5aKKCNBZqR3VSH/6+q6cxJATu1AYpNK1EuEH0BQ3pneocMrcvA0dnGb5N4J+xu6Q92UP5UsfLcufNPtqi/IYtMDnP4DwW2Uk2R4Ay3jJoeyqk3VPZtXxDEhAMrxi5WkK6FXjflvEKNQ6Pnx/9n3xKi1sOxiXUWPczYPkWUJypXq2oXOVe+f0FRy4NRMoD235MI/sbDddT6R4HzsnrFx26k9NXe9XYKVp7ohgRN9jwoCNuLcAUXpzJXwZUHNgLoLBYK5rrFV/SDs4/Ly2fwJ9+ifTW/YdixOz84OmFs2YxzMRCwv6xc+0WriSVk6PpS2WFieuMpD8TK0uVjosYAmxY4sEXuUBOSRioN2hDaUqwIpb4TYJjxdwq3Vm0prnWaksb39oI9wIycq/k79ZcVd8j4BC273y7aKYSIVl7e9cJFw7jbDx/ml3sZn01gXBAq69tZFt2Ip7zWChoDmLbeT4Hbr73ivuT6fvLwzge4LVIUeUR7emQMLzoosv0JfREAAvARLpSqTDyv+p2j5Ytjr/htUJ2IjEtiGEYhrn0d06zRf2Uwzsz8OoRLQ7/uqJ4ZcxgsJjLAruKCNIsmuYEQMtJtEnNgm0fUYN3AKOmPUErvi5/M0leNgrYMZ6BbjTsnRBUKnC2HytKmnyMdn6J6ixjRXEo1Mq/LNxj+tFdIRF9YDjBS5ZMrpIOcFEJ9e8h7Xk77uDkVf4y5tt/LOmPNuf6cz5zTWZM5g74dh2Bt+aVMKUshcbTSk6TTIZKiMB03+4hOit/Y7GBfRCU1IvkuncsNOHr1r2R/tHArvXUqn7FpTO4vZvH0q6h8aaPGuZUO3S0ks7rn5H4qIYEwlTIYp/xJHm9YqsJjgCDImUGoalZHupxbfGsHp1eN7E9a7Hh5pVTDukyGYVeF/mR7fi2xr5nSsacnE8Ut1pk3sPbJz5Bb73E0RBLioIKfW6jEWgslvw+ynrQUsmow+QJ9T+iXk4cX9bKCVuEV8jxHgZNGxwsfApkPEL6Iuf3YfbzRHS4bjgsUJKZT1kwOT/YBU/pEtRoFRtS85JBh1Tvgm/wzUlX4baxZh3g/jwFtwmZH2N/ofKzvl5v2b5uwkOBV9L3Tg3VI06BZy4Y9aWEjvyC50bPG294tnerMsx+oJlNi3/BmTWnJq6SxS4utzSps8BC7vJHH3TsfJm46Oqw9hf7+hYbj3PsjrK7qlSqoVbVMawEScfM6jbg7/kuOD37M8RLsXJhFjhs8JDKsLM+8UCWUuKK5iOq8ukXgtMspIJV1gVyicPFtLbG5rW2yuYSozYQcuKTnOX0gFgnhHYsaWDrT3rcUtU84KYDXDM6FaGwrRLSLNFIHFPUOpXjHvqCm/E07IJuiH2klU23GB1HrPC/Ba9CpB7XelRA+fOjI2XrOK4nfk5OyYppAiEoRe1HlTirAc0YVkJKjlLyT0F/eTMkM+o/PQIiKctWTGBJZLpzin3K7jwlDBGdRg1e+PPXbfy7GTzRSxIcUMZizxPM2dS2D9j4JhWCjFnjpEeMdCojlmBc9vsJEvhmW53gaqA8/ZbUVAYzCN+CwI2PF/ErTPpvSU3oV1AXeAAEeQE8Gg8CyZd711d3OSPwPbpJG3+vQXczyZBqxko20cicgppgCWi5AkHwzJv84NJv3FFHD59SckHvz4hjwTMtISqJAdEPzO2GaWd+cHLzi288vsdUEYngHxGgeY1q9A19IskVRVJKB0gCX+ooYqv7av3pFHT89nq+tKzlTD0oXyPPNJXL9MYy6eVuI5AvV9/kiRWoc4WJE+V3DX82sWBiUrLSbwUXZhDTeTQ3BuEwrAgiQkrbbLbP9X2690a7L4DIUeUcj6V0CcPXqOeDkZRI4ZIH27OHnszH4STKG3lgcR6y3Di0oS6Z36qmDE9Sv2Kd/GUYhlD7Y0q9dFInY0q4pFPMZvy+OFUDZXK4dFOnY7K5jFALZxy94OIwZw1O3ozp1nV9FW/kXbre8EFO2o3HQ9hVgCiOMDlS4AumQeoxwPRYOlxgPDLFf5iQHLjBCnKPAFujcHjAOqwUT9gRa+AZu2DtCWCGOrJgRakUg1tUoBQ8oPKUgwM2jtaIgFqpQpTjBfSCqMGLpwZRj1dHO0Qeb0ofiEIaUIdY0HjqEdd4d/SD2GGrdEY8Yge6Il6w8+SRMFpHf0gUe6U5SYsP0CPJgA9PIUnAwcFIeMYMd8JK8Ih1WNV4rPaM1Ygn7C9WC/5hGXmNSe038gbP2DlrwV3de2Qdch+2xVIwePOFZet6l3RYBYTVPrFmBG7OyAb8eqg8VfyqCVkyzr/Q3j06HsM28ILLDGqnbc0ZhBA8r3P43+mGa5TmTl/rmsKjq1BdrClzFeXlmiSEfe1fyTvtam5BnJa8XlMXw7lmCdrojmuT2ikseD2mVWh7LtcUHMe8XVPvmPJruTzbh2o2CLGDX1v8m3DD6huPYc+6Crgtjje3umfqj321vCGuj+9GnEz8+exJ5ALE1fIBGo6Pk5mwxNcAoqHoYaamJgBX1wLJkALmnRR49TWQDREAEIBSayAPW4CekhIF33uYf48KFUvQiLSJyTUJ+TY5d/71q0KJ+8tkyvpdD0vjYg/FfH5fWPj890VhNfj/1+LWOuf/X2vrQ+dpAMr/JtxvccvriPREWb/EHx0wD93at3gRRvCbKfv33xfDNnS/LW7jDp9te//wv68y+O4U9KvfjTs4F/14QJVzR+8qEzSrW3IAGzAt1mQ2lnV5QJ8HdOaitfqALQLdHr9KDoZ/YLzmANjWAJgAfEAB6wGkCIDRQpF4gBbMr/GVhDkPsMd8i7+4BQTiYUA54PBX/LsLUzPaWRWtH1GstawUmg1IjRnq5MXRII7F0lIlYGsmrXWxdBw8xFpals6eUM3Wq6J48l8Si4Y0pdiNqfn2blW8+hLFKmSlueeBRc3KRl78dxHHSqSlDw9szZ2DdUHD6WCOJZalzgLVlGpFcTNKYpdRo5d2Ur1Tt6r33m/VX7CSlR7dLdSIWqraV0+qviCSll7cszX39tZF4XNwECuzLF39QzV7b4ri2a8k9ufZIwXlZNRsgB695xRRDqO0gfYIqiuKP7ms5k8riRUOjEXmOGQsZSp5rCVTc3EWly6erIqdWFqz8yqKNWeLf/7LSv98WMeigbYm0Q1uS4mbvPiRWtb8eBfHekTFmy9p6c2LIlbB1jy4SkoPnq2LNTskrFnbDA5j/THFr4tl6dfOKlaCag5+RKWDB0Uxs5bVzBwksWaXV+qTLrqbvEsQ20LVbMkzg10x2KJSYyUpWLmMWr2okQrs3yL/NZvzxZiX55OXn+154CNCSbf6TKFqtuSZwa4YbFGpsZIUrBxGS71IVAT2A76Uy8RF6+2h7uz5B66Fl+MhxJxcLE+3lmM7/nZNPR8lJOj+ga291L7Q3ejm85prNpRi3HS9XjOml9Y4g+x7xrtxsf8ZoHs7AuOnzLfJTf7fS3YQ8n1sXJ0RvLUqK2iINpsrcD3N29fjuKmW5ixjb1q4e5Nzj+OtbmkvnpKOZAo6hiFSj9Wt+V8g+3DznPTRF0dcio8SzNpjf9E1Zid5tfidffINHMu/imyn7ZBzCpOtXbFb2w5BNSGB1FR+AOQFVLvZPsPBwDBPAaDS9XbBMQiMQ4gw25hj98L/L7gctGLQ0JM8iv6fjQ4ZEGA9SlCOyGMHChGPC2yOlSeLKEfj6Q+SY/DWYpUDjgEAABQEcLarzbsM/niU64A85rHBw90keKEnPTXzwEbtQYaz6cizm4VbNA/xX58dLEOVOgjDKwgNE1QInhnakAHnKEEx2GEDUkQOAGS5pJDjUvAqm/co9KCGuPQO6t+bjIHGMY9W+vckuH0aBmZtanezzDUwFzkY2fqGnI3PXdT31/ia60rmy8idXCOdurLX/MiaJAe79gBAWgDGAsAPQEiMA0wMAM4BSId1bhxjonA/xpxq4yR5lebEPPitXpqsPGASRtwimgbZkm5+Qrq6YWvLuevuSirHxU6GH4RGep67L2RRsaFpbE6geLF1YG0L78Po/Lbo0u/Vscz29FjJO63keJ/Itd/gUOu35pEkkW/sj7G5+X8+eLlND45t7V4QRHr8jBCTW/3oOMR1q0ydI+l5w7Fl+3pcU3D0ZLX2qtNmbZ0xCGqcwTLPaq/vI0d6H7Nv/9beodnyO5xYje9cNOJRun54ad6eWQB8t3c0aSzcbQ93Krr5L+vOW+XT4jpEXAAf5cGwnG9O6LZy5RAZy9Uo2LFQjLoIjffGesh8+NcP1avKqnfq6PTSVSkE90VfqsFwBmWWavednMBXUzWI2qnauQYC+/Htcu+5azV4mzsEnmIFitzJbV5kjxeT5z7berl4GuQ+5wk5u9SjkfTVG71Gjf71PuQuXXqNrEdvnPOTgWrfv4GvQO839Md8uBjwFlnz2vzntZL+C30OvEU+eaGPxEK//XXCrPnrBZoANrxD99fcTAB+eZUxTAfgACAdx2lWr/NhnAvgYGYJcLkBRxo6Tf0ZeDGrg2FeAJqUUn3PSsOgjwDvPTUv7Ny1GUGfHPhbjyCeqOZwM7iYORnuqJkZHMkXR5g+ujZb7qhh++EMXsIG517VMJdw6kTcdQO9Bii5xrx/Ksw3J0jMaXKlFj7Gj2aeO06QHWeRZ87C6tPM9TCQ8k3FixGKdxan43GI7nKq3230eTzVnKg8KdXv/tTbyxMIHOee7kaqzoWqE51q9nQ3UsFuJ8iVF6Sgu5G/yl/7tPL8nXw+eW0sL9/9GLM7+fzjdy1vzANvTHaqeXuV57W7tTY/vDYJvwt54e4gzOxU88sLs+aFBPTf7RkIERRvpEzs6xI0RihRktaItSaiOlLFnjQCo7YgF0GlpoqRoCYhiYxiS8oSuVcCIwKgpILIvxLKPIoVO1JuWOsE1EfQ5oVeGYnW1BAiAhpSthHqG8hH2KAiDYhdTZaayCuBFGDFEsQlK55RaUCZYiPj4Z+uEggPXHIJP+QAw+iYAUjJjQBGUMcAUHLJ0CZm6NgZvzvsetR0ZAlmd5+Z2QU4/lfAGdRD24+o/2LLpqj8Pd1vDVRycHLfhsX1TRwZuluLyApWUaz2xr+dRkvs2v0f/3B+N9YR1bohlYvLSRGcTCBpfzy5uKY43+TSFBx/dg4LxvHtXbnLODZ6CHuApyX7zsU+vuPb/vPaAT7fyF9h6/nw5x61Tm3JLzE4DoofB31s/z/3ouzvf6l0awR6fYvLlFdeZr219XqTe9ONcdlfo8I/p3ZYvCFgv477S9E9L7PSk5j6JOryqGyOWYfFnRuDvOz6ffIy7wNLD399KcFx0uF7efQ1p0f3Y6vho2l8EvfHHT/ev4BjHJWzoys03vNrdU0dPI4+cGxVawh6M/azwH+qUnIRhi6dSJNzBT1ayo1oVv0tg3kPqfmoFftTu7s0DNlT7+LC04d35HXAvm17UJa0DEugpim5C+BsDlcVPkWpUb1tmk+kKGnmMBFu01t9w5tx+UqrNYAAmpyq7KPIWi7Tw+OHcfIQtpRuE2/5hSGZdzhXmCnAErMCWc5wMIf4h6RzkFDfgHxKWh+CBMYpFl0jso8047f4bVLiTOU+jn4yt89l9uVEARp8CG9nkqcCMmJbDum52yNW/85OehZZ3FVmctpKyo/y2RbihLNbm+yM/xApdjh0qyltuWrKpEPWL7OXffdGSqQ1ciqFrCRNo3LqFOOeqPnA43WMuypj4uaodHCiLTsxUMmY8fp7Ug7s+6+EjMyBUjoK8U+0pEVKfsyhY8Qe5t5ZsXljpIkyN8b3N+XkESn9BrVU1qqn+hsjXhDwH8cVlc/6O4Kefc4cqaVFQd6ToZfJRSCH5bIjfYizUpL5pNeMy6BlIlLUaS0lXqLn28PSTgj1sqJF+a1tZV/VNXbIE6qHxnDTfPK38g+5jug/ay4h+mxkYjviHU1FUkpc0kvmtW5sDNNlqcUYec66NuIHgPTZ1qifZZC6lKiV8M753cBPYfzbp6RXjmRIS57UTNNka+VEAUfQ5U2zi6kds3rhOD8IOMOt6tdfAUH4KIgwyXShKcVXbk2VYVYsAmHnhK6tpRGuuQkJxJHPK8KfWrHqOn5fgtP5GsfI9ydO+DooJX6oS0szoiDNeVCKnrdKyc8skBFKYrjnwySnVfhpzYWZykYOAsVYGz4q65lX5t4weveBTJCdfX7KQlJkbVkWcky6oKu0U9ZBErq5ICF/yQa4n0nLUPiezECJUd08mSRN8S4TvJSGdsXeY0bBFCOp5OXyOTlPtBrPd6aSQ9KUW9WLtQfLXTrWMPi8z5OkWRql1pGJEaOVQslpKVFLsnL+ptKBDu/ZMw+jlmSR0eUCiJEPZEUaGXR1A3tFDiLv2pdANhE0crGCnKsgLRTNGqpfGLX+tKz1Tkie2jAkCdXlZYD/tDrxxSjZANbl1nA9kPCKhg0wWW/LIE62RaYW6JoJU7cUMK8iu9bMkbKO4m6CCVnqptYiu3QoTd22b7XYbU6Fg4Od2yPd2bHvpsHVfRHGYoEl1qUqlbrmuDeiHMJfG5NbjIb9guBk2TZv9KN0KDoYjPmX9vhgCMVZRaVI5U+etaL3ICb1ukmYLxT+PsG4G1QyP7Yao96LReCSjK9PXkBqnBkf1VqdlYfHmQzL6paEO9SJAFqbfZnUY1OkV5sPSh2he5YVztui++WdXmsLhaWU9dNMxcW9St3I7ebaPDPVTBb5XqBW18z5JMBEyXodySGAikH9P68Eo6uUd9KzWtb01KxmqGPljP+agJLkPqBoUh2BqMUDYn8RXgxqWSW/Tuo1Xr6aJixmzD7bq7iUmcIwHe+/wYdF/IpnDB6W8KzO9P93AZyDa2X/rhiz598Kkjv237cVOvhf1xJx3Zcu6suXr8+6zn8dhUjkNH/5KOPj1tdrzhyafw1Nk/3o0+XYPWv2+sqH0+Vfe7y+//iwy2Egp7/Dj7fZg//p7ffz459sP8l49n/ReP5+kaJm2z/xW0f39/V1StAdTJ/v2f+tXsdxsd+nx63NTk/X++v3+zH5qqzUY1N+PueX0+y5+N9fNfm/xjhs2oj/XwnqePEjMHnsmGD8rRWkb5w5KdpD960FXZVtRNtj5BHvEP3NrczC1Yp56bY2108CnraQo2wLX7wm2VboSzI86DGhZwvelC0Qm3wBXh3jNXcipAWmJ9fQ0CTYYnNt+iZSY7Tm11PLs0ZD/o20fgLHjZy17zjM5ZbBKlrDVK4jbgk/yEiO8QLtSBwjTWWp8kwWeNnEREGm1AJj5gQnV1tTKrLTCePhHf4/VTfNb4VwdvcMdY7I0xb4dJytGrUGqSdHFPVhi9pAnY+rnFjyDFqZ+u2HogdaMke0rUixlmhzjWthZA4jxzsb5YU/a907x0cEt8HrshbFdbWi6bB3CnnLI8y9YER110w387y9mSvEDiQ119wvE+cm0Pwqdn4l4XHSx+BB20aBg5MaZfV0+Ipg0AwCy+9Yi9xWh4zP10Tno5xWTB0SDOSHTbKSc6wwtIoGbHRUrk3uZUy7YZPu3Os3nqIf3ISSo66EqjN2vcsoVI03QROWRF1vDUIgaTZSiw8HtUotpJ7XRNjJVNWJP9VwXBGDeUIMxrYI8vMWxCHJM6F7n9k4Kw+cBHkTfTtdGzCuHpxief6wO3HOfyHwyEnFcTCQablt6mOOgkvJ7KYG0HAyQu1ulfIGdjtoMP6ANck9AMXXPz/Xkkn1YtwvmEvQggk89RVOjncoRuzoZQqf24KbLXGR55OKmit4GbB3cbqZXroqWPuDo4rqV4YOamduNJ2VIhuSeiKfEzD0zOqmSSEAJc8OtAGnpgiZDth+nV+vrH4gD59sus0W4zB95RloOm+kolfcPneaw/ROiIvQCGNzMatcf0ZIYI1FvsP2PbtyOPSBLyMRqQpKelDsI4UpPDJY+9AxEPfkcY0M60XeLIjB6MmBqky9cKmI0kd373LQdrvk5j6BRjuNJKNfLjEf8vQWSt3ybHUAKySJeleAAbicqXkv8bp+aznt2/zuqj/FQCyLHhuOjio9Bsq9Y/ZSVO0+W8UgHJWo6dR9BXdo8N5PZ9PDIbZF+oNS+KhBRxtsq4YH/WLnIkVr6ZaRFq2B7VcPGnZUU7Re/ZBzgH4VcdxS/DlTAoga0HUD9PT6D4W3ObhuKLyOOqYYi6Z3WnTX3/XYUFFbRa/rpj81zn6GYtGRGSc2jTqwBYrT2CKYorL09z3nZAuNP1dw43TT4Wl55cyPOu+4Kllq4zwFAK/DLeP11/uZd1Kr0XjCtOvlZJR0yvKz7OtFvXlyDXluTbM4nj8qo2h5EarasaNBcNIODFBXG+/J6Gr/McLC8app//3Al4LXsHj8hFXr+f+qDT8cruXNh83bIwI3I1/iuJfvg9GrWrTsxLbwUeMYW38coe4oGJowHTehR81hhWlnmQQ3e8N5tcjf5kabM+ly+mUhcGm6YsxzPraxJBSvsuNQp8rXCojT4dCyZKpAkBN1V83RDeyhwdh53cmI5t6stlegyF3Ure7uTH+Ahqzxi8Iwt8dsjauHcit5VSXG8o4dWINWtwWh9k75lm5OO/iEnts0oogLIW40YNZzLGYs59HAUCDie2k0hw5yVovJ6nlf5KpITwXmZ5xVRZm+Zt6IMaSKdL/Ip0GRt7pJ2OFh2l+nI4QO8l5EIAW9MYBG4Q7fMiSSfm/clljZF/9gJG107rFL65x2QZeEtJQqhiHJeQE14z0jMJe2P6QfBxVKH81UA21ZTsFHvlIOIo7j2OMCVbssEvqURrhsEVIyJ/J66/CpcEz4BS2iYv4eUElE4Ht9hXARHeHJtF74PSS7TDdLyCMxT4sU5uN0wbxDCR1PL4IksaBIaN8twCLNHB69aOo0hTn3I3HvWgdm61S4f1ztTzII4hOlk6jK3kiHXsjjHzb5W374wHlQ4Us+gqhae8UOuXUPZnVWvLspJVKX4dubgg6S+xQacnvj7xKNNUMj9dnRVt3zxp49OppHpa8z/8k1M2o4ppY9dL6fwKhTSTCIQvat4zriVIR+jgA2TQprwkn2CZCvPH8SMguH1ftdt71YIZLVK3sQkdpfD4jCir8kuq/X5xTGu1VNf1Gu9sf4FFvbx1eJ7siONUPLBNo43RVHt34cLtVZHkDp6rP5ydQIhKUMn7HTXQlGQLEzOQrUjJlqLzYsPuGYHnnhciu6ffk5mHOiubiHAUhaM5w7t0u6Sbv78meE+OFNNncl34gRpF/BvhSeG5vTHRCWxCoJ9oynm4iNiLKYwdAlUb+CyKDtA6810Ny5Q4DCMncKFGy1YYAeeNCziHMDbmzd8unTYWML83CbUHAcyt7nW0+q0lwuGJhzHuYsu/fkEqzLYTXDQB/FZz5sy7G9dLFTHKgfdZGGQ1Ekr7iYpjkC1u6wNvfAOx+41NQhRzuFLCBRkEGk72GUcRATdvADTFgjD4QFqOP73mxqFG9tQTQjB1Ron2axWtO3R9J2sx29XVn0hSNmadxdnG0t+Qgnl0DgEqAECbj0Z8kmqozXb3kkLh+u9XrH9iGONIUbKeKIahylPv5y5x9SNxVV+Kh21gMiaWSY6WV0DQWcWrM6UHSKpkQnRs8N+EyEEnvC6g47bK+7J0bm1bqcL9gYphRsZKCjZnsvuVvIZi6NOeStzOaKN9LQuqRpGvlz23bQynRXfgdYenw567iFJ6kKJTwox463UrbMfDFaP0eJ/rMCBrSGY36RG67HdAHNtWfQPzjzeS4SaWIfbjOZg6dEOguhNYrJA6UCaGPY2M/OUpWASHTS1EuhVH0y3Lia5fCpyuYM4G7UvgSwnogp7Wn4TxjYEXg9PR89lI3KXd1STUaztqRb4FqX2pX/XFzKD8r5HXCVWeemiQwn08GWUjtGVp03AzVfqge3w28okU/3oM0IrDRjTUG8x+0kWRDsgXsaU8Sz3KIOqvFL1F5GVJtHBP5VhIIhGT8srENdgmbacj/6lsIVVC98T3WIvjO7FN4DBXvzzUC5iEIr1S6OYJwUHwXpP8FwSSgVyHC7O7f3v9tyRn8cLbG9XHvG6bqVuohTpMzkoaWycy3o5T8d2oXVu9X3mN+RuzSuD22Axu7GDE+TvuabYl/Y6+khpcKXQzxD6dZxcYdaw79ozD2cW8KegQH4LOSHc2HMc6iLi4IP5nunvXrmWoOiowgXOf8CdFj3dZIqDUUzFvrLinsyHbYC+1OnBsJLfz+J/w35Fb9Ft+4uvwNqVUPdP/unRJKs1exBv+ymk7g0ODAzV5hyUBNF8+obIQ7LoROcKINZVWs20VHC1x4m0xLSVX9xn7r9qDD5iHtvNgDK3Hr4wCB+zaYJcaIVg8YYMSUZOhOGV4d2N49ij43wFgFfVPHJ8s4v09RX4MR2vIw/PDqNslWIzdmuW+oBrcXGqHdigG75Tprc4N8C567ZffPa/L54jnoM/xP5kecSzV7+Zf618HtlX+Q51EnxfwSDFOkddgfMlOZY1XV8s7ar37NOfTQlMiC7MTF9iYNfr4CMXEf1/r4/7kB+Ks7at5n3b6EuPTDZ5uy0AhSPK1EnxvbQyuRrczPo9G8iJ22JatOf34ykCg2C1BJn7NuCfLRmrBIsvzU0WKA/kXD7o8vRimjL7421dCAk9B+HwqVM4GcPrt69xdpiOP+1eiEiQWvG6bHD701teAbM/xKPb0C+UKgD0y0KMqrnSmydpK/FvppIvq3cP+SCCSV3n39by/md8vGdo9w+vzYhvnfkk+eXdk2XDqTu/E754p2/XJaPLkaPwEV2funXuAPKOhaacv51saHtLK+ZGZ4ihuD6S8wkEOE5soBhSjH1ISoW+k+KAqILLJDygkrEMAJcqk8Nlz/pCFqRC15GKuHoJSxEEajb0QznuQGKmk+NF8hwuFbyetmuWX2CGOjkhQm5kjdasZxMN6+l3CcJXFn6rhAbMiOR7EwXkNmYIARQZi/Asct/J7Xir80uhxQ9iJMQ4u8fhvaGIcepEUQWD9jxYbFBI8FgUMJvtcJux9QnCIVEWMiUyJ/6tXARax8JAAMAJXfTRYcbHXFzHQ8BFSAw5kFrF6KAG3YQ2H5FKxykBi+zNoiIS6iirOoilMXZeVf11xJa7ii6Pped2o3OS06Kc6JSYOPYXd7XtCqUZSY43bkpu5pMluCJsXo1HXwkHENxSxaO8sHjk2wm9YFh2yISKIee3Iu8JWoaR/fYIH9tsaOezhoDpnhWtGq5PnAw1v4Ycf6bxMYyCR5nUptWmZhBOc2+NvLImhLyR8TbQBJtmoq3C6/6v6iB+ZiKriL1+ErRISOt4gYLJ66vuAv4tovVQrtXAfvEOEVIC6UDx5ljE3lKwOLYHHjq74C0XLEYgDrEuBaH1V7N5QlElpgFKDj+Ornqa/vc7dCLRfjwhhgOYgnaUrEcyDBeM2An2cvL2yWJ/D61FpwRr/9aMayX0ASocHzQmpDE3/ApUDwyJ3Zcc5qNuF67/kRMPG4nOjZjegp0GR3n9yJhIXIyUv7Vwoy5x8ElMgOmSmAnVu/RodEZ1fOYgQyzVgP1ckoxHPApAYUMAOmgsggLkc7y5EyRXFE3yKYbjfwzZp9WdZe6B26VOC+CkuszZql/nsC8jbvd9oKpIU3W0WCqVXKEQD90U8al0HlKGXqo6NdzpoROXQ3qpK7A52v5yO0aAL3azYi1lHorKnUpHZ/Te21Cc+/ZVHFvBrhbRnFt9a6l9VFC+XHNBrAMv4v8KiUnbdq+g2K5jQAN7pUYJYWaYPftfqOAOU3TrkpUcNR39F3vjrSSAKc7nicW3OA3CKkhB5K/QXu9Q8PfWmTchN7SyTtQReYXb9LiQ3YzmeUJgQZbxnUbuBAUXzaAWkZOAnQK1yP+TQBTmB+5/fp7Dmow1R1rrL+ewAU2D7shWG5pllzcS0qNqseghhvTj5mvA6yF9k9g6O0qf2s6GZi7gzbfSPy9rfkw+1Av/co3d3oxy5Z3qXKXcjHdy01Yde1DOik0Qeu6VesfsbON0nHhH5x2hHpYZXoWhQ/kOoyHA3GN8umYl7glWcDmbSY0ahi6Lqc+wwMmdqpahOCO1P5vS/HPOtAFk5qOywRP10sKTvAmG8SlmBmmvq6Yt9FrBIxVQs3wBIHYTZYiTrncEnw5Dsy3G6gpvFb0hiUnhWJBT+1sXOBIdFWBdUiOMrI8cl3BTxhOwIugdpiHVbPE4CXI/ndggJduMOimtxART+yI0VGihp0Z+zAKSL3DROg0C/RttibHHuhuYwXoVDKnI57sHfZsWqWOMtNSvXxOeTgUdY6Gzgy3XtnSzQ7VFqGmC6uUqscaAzSyYQyXx0Ngno+P0dzbiaNOl5K9amg/HqcdoqMbzDU6Mi03sM6YAblabJwsBXfQVBpIf45yaITxvQaB1A7qocCIVmq2tCLeRGTMDi2XbQhbiP3PCvaa0xdJbSinVbHreDFqTKNg4TKUCfzCaTWcpA1Sui+fZ+ssjhTThj4BkjrsbAbufr+EHOFspNFGS9Cxby+CUMr+bsb10jksgazLumqSgj2kwlF0IZG/d5SrMVTuTqUIvYDadxayfjF+/WMM7bWW8W9FQIBR/A1Gc/4CuGQWuJjEzIQz8zkLo0lEMXsAH+mnOQKgAtMvzY4Pu2tt49jiLwgZ86sxJ1SRdU5Q7ZtB+geqp8FAYcn8sS6r//ZnKWTQOKWTraga46ltHDIxkI1LgAlMrBEeJni4qixO3jKp90ipH4beGNQVkmLhBzECQ0abAou088Xqq258PrsfKvHyfbAUD7Ru2s/0eNoUSi4gI2TmCA1IJXoOt3/dLlXgrlZxsZ57td0zXuTShGkZT718qSF//MJwvGA0ZYI1/TrNA0Zmp/QGRgMTP57n0xPWh25CNH3igD5kASzC1CdyUlMs1tPnmgDZuVzPkj49xUC2h4QEkNE+QKRgGTzjZBJHh4OJPOYrI8hmdzw/0jQ7/f20KKZpYkybbdLZsNQUje5YZ1deJ2mOlGfwoTfM1qw7dPCkIiRU8mPSmB7MB8wu5p0Hd6NJOWoto5o9FAtNU+6IxYvAxITbCD+6xL2T9WUSIRXf13aTRopFFvQsJq9X4RyJ0+wU9/bPKDsl5noqxP3O88fb8SgyES/+9OpMcZ0Po++HVVr1mV3cCpk8eREEkcXgay3W0DRPgVIn6F3ndHls4suLxHFJ0bP3DTfp3jRgT4tOV2ZBzaskVVNfWClMyfDDjnWG5dIxTMWdhMpGesFpUrFDQhHlc8niqZd37NKJe1qpxrqvYut18uzDM+KJVjqWsWdHmVnob1Gtw1BKgKNqRTSR93kSZN1y9JnO8sV9/WWrsciKXHbTJgYhSwfHy7ncyl9lEXo5xqWX1R7H6+RdPscHIFYOdeyAvscwHqhDMi5wDynOCEkZJLF4wlBB5QIJxvIsCFHbvWt9TVsSSmusqYKKA6gDs2bXUDv5nSiX7hjOqTpFG4m+kzr2yNKcgWIl0dPxUI/yGWSrCdfWf/peaSpDWyYYkmfHtbPbpzwlfNERKgUudfezurPumC5cysCXbJeK1UXKXVXCoGpYaMgamq5svNhtL3Wa2L8s/BkojxtVQu2w0uh9IayGDu+nvSbHyTDS66FTf6HIsyTO4D8bEMcrDmMduhGy5eySQcbgn1JLeAPPhs1TJ6nXhhzl4tpHG/D+c92QGe8ioI/TiDqvClgCHx+GITD62gWzgEZhTv68VPYfFljJswIK2vk44xkR0PDxUxNlHNJrj4MizRtfcXTGTQ3hsKyp0+gfH5NNUdWoZ7VP2JfEfDHGuuNY5Xk/GaqWCPqo/wXRHo+Wrvt8L3YDeoMxmyHgGRK5uAUZosTZlgmdKCSHKxfwUmbVd6b49dDxoSl2ydl0UL+2zQNQitF9lhFxadizlXkr/uw+crg83oEIgd4/ZtUK1iLt37ry3Td0JoQfh2CX4jTO3wdPw+coBn4HNcx8wA4CFAl+YlppavrxnO0WxJ9wbYyAE1go3Za+gW6QG3+8emrNg4s4ncPDWnFL22Ji+bMlU3q24Iw+l0/ZTPh1004TTxi0xmz4IUHGhCh+MsmlsTYs7r7gF/n5+fh3vJyA4I+mkQfX6Hik0/AHRdxiarihv9lQNxfKbqaS/Y88Y275t5AcoiNwy8uNa1gBEAGOcLASGLqcH9+n2dlkXquuH2CADEGqhDgBkDoY1DXd+9K2/uSot+5ym+D2TEcorwQUPZQk/nJ/jJKsrJLeaC/PucTKqH5hExrWLPVSwQ+CDmk3FzsbFA8dLRNxB7hHneIsGqv2ALHWws8Nwf1adNAuW0TEZIqcHZ8aKR9cu2FFmhC9YpQOopUs5H86sNUz0+QJIfRWoxuN0APh5BMkroX5JZp8Er+O0CnetoS3l3XhEQo0gd/RSq0sQlLWVvFIiA675aJjPOIOhDWrtbWloqRHGQ1VjmOiBj39znhxDAyVdIQ6R7Xkszl4mFlmkCNe+AV5m0kbqcvF9oDAoWDZa2uwApcGAuyxSerURXj4z2Uy9njlDa/C/fZSCN587ui0snVevr0l8+sFgT9muN4EQ3XykI/RkSfgAA/aV2iY4uSAkqSdD2kRKsN5COfu1NsbapcuTlH+XHNe6PQcLnMWMgrGTxFsoZiC7ZdY+Bh3nfS25TpWtSlEP0YIG0cQvw9a35jO9Zus9y3uS/VQSwev1FFsoZXqPoxIFYMyAc4E9cvRI0YuEER/vcUc4cbMvhQbv7VwTpREZw8VELAh6OhHoXooqe5MuP6+aHbXtJzVmcySvXYjiCbNsMti0l2chM73YAWHX6av+7Gu7Vo6oJ0hJO8GAChaiF0cV+soKgB67zKWkHpA+XPLo2ny/L/mLXy+zZwtM5e3Gdw/cvOuyYwdPmGydrudqVv1FzKbafWrddLVcLHs070xAbFagf+uq6h8Z/fpJHRNmgj3yXyN/XqPqH66APcSpD1+V84/8CRjPDPhPtJH3u/3o9sP72Y6HmdcBlyoewnOhx6vtx6n4UDCnlxBNaePz47NId48jGh49q92TYwJ5Ek9g/74a37dc0R1Y+DRmbpNZvuFbfg9UulccblmyWpLA2WYq+L+mMzUn3A6sQaxpTtoTqy8cE7oDGT3TT2t9+mnlyx6YLAIRqleWaLag+kN+xuR5/ihUlTd/5frcm1QPOC8hnpF9yD8IAqW5baDPONG5oe8HgakHNjOKj3qcmmT9dwx+fI+zLxg856O3nbRk7Ccp+21nG9U5WDO+y96FF54oIQwQp97hlupP5TMpcu7Ow57dOKQE+0D99DZ1MWjN9ZeNOeB8xZJhj2xXivvDNRBi0iFY/DDlTqGAF25/ggzCpONT9t8Iu+LkfhFLp0bP9vz4k+nGcuov1Rwigc9rsr7PFiOj3mAH/QA8atENAjwPZ0JSlCCtFmPlnl2U+WDlo7iMSkYXG1X2kBQuBH78ae5pyn6B4CpWCvtPRMLsWibEomNS29OgpHYFayuSZ4/MhlE1QozHzUIC3PN1tHrCLYeJWSEM6DDejU7bh3AZosGHL0MwLWnASOcxKOiLWbekypok5Y880YygfHt2uwdxWzf3VIAjr3qdA+ts0Y4hb/vjOmuDZoBgKkCZsHbkVcC2bBniKioP+NCfA/DchBzyWrOcy7rRA7bXqFMYRexnMf6C9thjrd5HnebX7a6fzry3XNR/6syJ/wB3x3NmM5OT5p/n/m4f0vo2TVr68VpwulvcE9BhTGpVIHA/v7aL5zZu7oSNyqgZmM3zzTGi8oFTzDCyYQhgIJ5whsuZO3HVIIQauk0Y4CTw9owxrGiQ6enZyyV7vAIPfDmaQ4nadazLpKZcyDbjWEsqhR2JDv/6qxdVVfRxSiTz714rZX48epWcI0rQU/He2GQH+K1dXEUyB9pGJH0M667lsyeTa4qLeZJiYWM48YNGgblAGHDu1EbruNo3khr1LVF9VDMpTSF7JTbx2nw1MYPuW7YkcwL7t7OwR73fJBj3TYfvsGZ8f8e7ILNfEIs67+T2XWGgXkpal7Lp+MFkcTQC7/wqt3pW2nUOyfsNkKPs3DabHK5bPHPjBbVKT89Vx8OljloDd20CbOqy11LXPOp3hKeFSMKrDJxBhePa+bMkHm8QIuCekEGU3oKRFhIvx26sa5tDnyDNaMu0mfgVvqjVEeIHxypX5LDTRcvqzo0hrv184xcBd/XIfGZxhE3qoj1boKpKpyxtRWId0zJzK9HZqJ5YGeagvE4fmzJyKFdIHEerLhjZI9iBOHYD4cU2m9f2WWN/g+v94FSgVgWBenxRIOguWLDSjW7uXpnPZx9kF5PXxYWxkzclUrdpp2ZeevRYmTalUOdHCMgtWIVmLrzyVEhf+H7Adc2ZJLszczuTvMi99x2Uxdyh1etv7nAlIqfA97N0sStHaQwu+zHDyE3cJqfagU+ElhXRIoisIHt30tS+U2Oc3fkA3C8Ebczve0XkjqWB5zllUJqRecBuTsGbbMadiYnhxAM2zrJRKSVwcIAnpDI+l49xk56LoPRg/muEjLADchsvq6HICtEmHg92JT4G92LT7nNcrneMic1JMsmMTjQZPfm3/ivqg/oVczZFYlTrKloVSuv2NGC7UIkHhmksBcYXVmhd8XyLRcicq/I+7x9EV9YRB1GOlW8uYpBo7fTHi1bRkeeJ03bj6Lh1pZFhovHiSCpcKCDYvyhdxxzVLsymA30z8Xir1krmmRckogga37X3aAtY9j8VF+rPGB6OVqHIUvL1ovbKHS1SLXE4qr7hHCPhhGwDDVLYwhsw9WaPyimaMJAv75WtcXUHzKKHOUzTUzeYbtbihF+B26D85z/AWfIecuDsEintdtg6i4JjbpYt62Cor5tuKbJP792xqEnub8ZR8PXhQL29iRVCqTeAMflRqzo4Hl1xbioJYmyfDR3gsdlGeP0CuJGIdp9OFXUybYZwvdgNUYzZEjVwTVW73+LYP6QmGSzuOPn6Q+v0GWKeD9lp53TXfDhqp65zhXUXfQ/7ECgkHCeYvMUkcpkl49gAAwUUfRsbkRXXdSfwnW05Mpt1HlrwsMamcPHB+WRBg69HDxrYNzZlxUwiBObNGNvLcrS04D21zy3i/0skjDB5XIcQZYWMb6V0QXwCSRRtN6fUfczeLRyyYy963314IzUctpcFwNjJyLU/ch+rD53bS+HcXrqYQHAD1YBL1DaI69GxgR408LDAUIaGlZYeWgunja+A0JbRxMxvcpWgxzRi2vX10+GgS3MjvQRflqXYgepxoSNxoI3FCSZ1rBpfSU31nOwllbHb/OH7nKJ6Bk2Usl54zMIh7aytzfA9vWqxZW+87eyL2/sJinIqFudZYddJkdsybBi5UlGDPF3ohIr5eqpVoRVdwnQkmv50mF5NVewyBWpESBFjpXgj5eKd8lTu2Xn6icq8atuWiYgdMlUiKST2eUsx+Jkyjxmj55EsXvM9vfz4HWSNJHzl/qD4c/vHjbTfphLl9ORzKQHOKVlWszxyZmDXm2wwGvJbnea4Mm26Fr4bCVOPi3UNyUHNIo1aiK/0R8RA6KxknKKHPMaDSpq8FU//SEH41U/P2JlNz1TiN6jk/ejdeIRQFYsZo0PJXnFSCAhyqGSK2QkPZR2q7yXOh3TRXeY2Gj4AgHgfm0QQIM7ELIzzoUDV18ezQYnyBfuY4ftYwwvRYDHK6drUJpq8rlIrk/WozCPNBq9tw1OJFZ5uIbFzKIq9O/dhf2M5mipfhmGmmd/1vYg0o76BGkZ1UtAlxWPGCHFL0kZUuvWX1axaCxuS3Qsljl9WpHCAw/LQnK5VRmYSQ/R0yv4ahZ7/r9+OEIHhUAHPxqlqqrnBTQsSaGe/advTCu2AGV00sMFgbJVMywANc+PRTM5TUIjvAU7BfPd4fi67hEtqPzLKh0RkD2HnHYB8UHy/eEMmdzuveMNgjfWVNT8rC70c7IuGbhOtjqG8yUbKSXkZM8ZKTYsUZW5S/d4QwxM4S76K01bBzYacVjIOmad6v5jZok/cmtjDEd5ZRqhna0PJ2asOCcBPAGjXbtqfANHjGOq1yyMTfo0cbamZoqTZt4M3y9SodZw4hyBr1VM5+bHZmyQbqDdFHEO1Q19wq6y4QXXN4alnAK1emvpXkIgvJEGATf3oaix6g6hs/V8WK9XsB+29FXebixRuK6nttdxyJwebqB5e+Qtrc7PPSbz+PXL9qTn4ckk8rN8OseY2bp49LbCkspRHQbJH2GP28DZqf0VBOt/L/w2ct/csUpaRVrdpdow/E4K0uhOuYNPw4ZftX8QjK2A61tMO3+hHqMIXMkpiOoLFoFZrFjCKYti5ZCwzL9g/HXaUg+LGPT1ALUUSCxdQDme+1MDcC0OhU5E56mbxfUD86TCoFeyNXbzNQkuEQ/lxkOKPxc+Vj8PyPZM5PLp2SAN9AX9tTq9sGTkbKwu06f8Fsq8vZf+PIGJ6F74ZhdAQifAGwxO3fEBfO4fJi8kHPvUrfmyTR/kCIRH06Aeqy2s67r9ju+KRT+HaWYWa7usZg5brwNoscDxoHRaLiRKVKK5mAufKTcqC8wTNB5VrVC/iM6LwiyeWvIs4vyKODNchgtJzxLcC46tfk3CKElQmHlA2sS7zwkyU70AMutM5rwAhC+foU7Ru1w8njfqFxovKGqc4iYbjzoyGKrlsqEjJ2zhUOqCl6V82OuFW8W+H0BnCZ6QmifIUGy7ueJZwdhM7R/mRokt+YUTo38c8w0w/6YwceuMX5k4A/R6z+lo51L0Kj2wD7oEenHj4y0aIfB2L74HUjfRmh1jIWFRHWHjLc3ZSgbL5fZa8IJ508MzLsCACYLh2H+KZtnOSH/XUR1WaaOajzGBZravHuLVH58qapUAo0HBRBGcK+ZC2KSqUAdVwVYa3QIKWrjglHhiIThwMLCm+keL1PncTqnE229pfSvq2JKZFQzC5Q6MuSQFzDWDc/XhpaEBPRaomRnyZuJTVxa9WQUHfiwk3xnPRTv3C8BewF4eMKnMG5tAYTBqXNQDGQMWoKt5Z0dBVMZLCtamqZnnyCtt+HEvoD+KcLic6o3uM+BVd6gsRpR9C5hypxnFoLeAIdtwaKPw9VEWH4zwCtBYsK6KK8lrG+Xa2UM1BmpKGurGOIb2o8Vmvq/j+LWKp48xMc8FtyyhgOLiPSmttDjGPMcPSr1G3qugkifJ+nd+u0TOTLTrjdFAiBqhU7WFnL6Y31x1+8q4kMyvWp5iJA7R99j2vTwif28tYochC4eXSMUC9ai2j3aMXIioYJOcsNpsQ21chyybXnsdgq+w2By06CSCo50WwO2LVcHN5jOPWMtAsjyYGDdEdzdUJpwvwMgbno9KEBGFvhiUfETetjnFa6ZA9S0cm3/B5omjmqCcrvmHjw0A5S0nrVt0gGnNNhF6lzriHKfCpx56aC//kqJ5WGl1nYzZXm6LphPYQkm27SS6t8peHfGOvV6Siz2MPamqHeVIH1cBtv4NdRoN2gSUkdP+PRANNw1lKjyiu5oOUYQ5t4yo3X7eqi0rV+kcBamKjELR4Aaqu2zDSEfhJOZqhiehX1TQI95WNhEgdIe/PrVeydA6RHWG9mNOD1DzyLe8B42H4sHRVmkFvAfAQwDNoma4hRxPAvvByeRRVZoo0M6ys6Obz9NOjC3WH8w+x4VeO0EVwpF7eZDL3iGpb3kpp4mTaaQ6VGy8CCsG3LtoXUHEQLkrTYrELWwvYMr+OeS+PJ4z4ZHNpt5oTlBLCJsyQBWbDOOQqATTpsdAhOdYZ3y/P+AtrGlBpXibDV4N1PNa8+jRhJBj4Y7DX3HNPim2G5uOw6tT/n8VXvaSSFnhUw6k98vE3x/0GgyEtzjbxP9nYhLEonfbicytR/yuhREe968+8KtHjsqiXPGLiiM6nkyZBQa7KbdCPNbWVniJBZuZyKkP+VnTu+CqwWr3bLr+Zza9SyvfariPmeNRv9hJtb/gaYBG8I5H3T1v13fAs9jq9JbLCqvsYQTuWc+uEAM8a1omTZew4qgJUGZd9fYB6Sh7mIKrOoR95B2U5axp/pjih63GiccGyPg4h9Xh7Y18PtXI8XBJgd9Dp5UzPst+QaPsP/CAVioPVnBJB8B1tiHNtWzN/9zpQ6ASp36cOdGADjHkto7C8j1qaERJENFDHSaVirqatx8w3Kr9n9xdXJogm/fYmEtpoIovNLlk8lMiD3ubm9ocFKvoWqgeECNRIS9V8AN0MaDg4jP5f/lmbdEdBhd2VTBci6FSQl8TotH6vgLHbHvifL6rL8E9drSD6uQpyNmy4afDaDxLUChsdGD7wMZ1lz3UGDAs9mtr5/Mu4GRFny0KrPKHKUIjaZpFSqLt4BTTil4nR0vKRbZhYqMezuVTlzVmsDzliclayCiwYDSghw3u/TMbUs42kCSVH3NBLBdbvPcK2uhwz1TN/M6vPN7PkyJUSpBn3UqS5HawP1Y2HPHWG6cdEmzm8lHX1bpY7X3XLWD6MBG7dT5ophZP879lkpqr3Wrp3WimfHUn7W+WYF7rissdMZF3NRWH53e4Da3GnbKxKLb+5+SQO/8oI3f8LaYYBqEc4PZvw2tlpq3v6PKXqP3bKtA7JdME5DxGwmokdF4h/B0KNgsjhCM7QZFo8et36Al27lACVPklMEFqhUmzcfEKq4WOXVAMF1bKF4XY3BtF/KOA1qcefHkQ1EVGk2u33I4saQu2vPCFrHomXz7pwQtFkbl/OwZ53xw/v6f7BjSdCkAmei3fyk1vb+9rSdExq+3V3HY7STTDT3n5KDmtlXzvjLHS35y9Fe34vSJqK2sfivfYV3UHZNUP0Laz4NIawP1rBjRGHUM5LK5NV1ZrJFpwv+/KnsK6C67oOu15O+zNJs+ZGPuWoQ7fMN/yPt9D8+QZoHCsWOCwfud5DzhEFeI7ScNfZKeCzXPWXqffQaCGzS8nvk2uLVrcfsf015se3GhOGxid0AIjm8RWZ2aDwInjWIyp6jTsfk+UrF5ii8VEv/pFlwQswVpuOQvmRNfxy4bo4mlS76ymLpfN1+OBVr7BnTvo6SNdd/ypQK1OFR0Fwg4CUWVlO9AzQ7TPwKi9xPM3GOQPJAEIqPAt7Y2qmvpcYkB4FjBT58neHuh16FAB+qCR+ITxM9/GvgrdJH6WxeH7Lwd3SE9GWq+ISEv5wBdHs3Vp2N8cFuX+DifBRebomHPTuSf1arL+BfbOEQNGgbhZONEhaN+KZxYF12vmUAf35NX/6CY4rZFp1S8JygjmvP+0vODsovd6o/kcJP7T6TQ/F8OeA1ppWCRM5WCcz+nUGPWBOplCn9sEVqnSyQ+3/MsRUyPghvE9PvMLAlzl8IhxyeoBxr+BiGb+KoL6YUL1023uqgWxKDe2hqOy1m/3zo7yKqjBzVnSWX2TlTm9qt4XwJxJ3JkHvjeVUCckWKPNaBi66DKdF8ZfoiQNS3lsvK8x3K2puFrOTS16jKo1+qm5vx/NUshy5jWoJyik0NbTO18blVYN5Uin6IcCCZ9p+0onqyNKlXDHVgS/ibqBXZCE1G9TY0m9SVoXEoFDIC/zq+bfArMqHJnJy4KvRJqxd/COwwuGkebo5tNIGm0eFPg6FTsfxmYyEnhUNuLHsRgc/5/nUfyUjjUkr+uZYJv+dMqBEo4tHJGBhZXKT/zj8zDgnbWKz0ToVhEnKFjX2SOJmcNXTGodjoovNbJYCvk6VQygC3uEzFLfrGejuGKO+PmlqqZ2ZZkts7yKbPKxaGw+1svmS3ZCXCUIMaho2XDvCE4F+eJH/mMzcneb0+V7K0u9I4jACPJPeh/ESi8eImbRzUm2gWccY+GsGmgyYPjY5LPA7V5QAEXiluKZ+BdZHcJhKehW1A6zIKbxaPN+9KfOdIMvOyBoopq84P5xadf1g5nigik4kuPzCDEoRBzjz+0NFzShOCG5fNlrTjJaZFK1WJKIG+JImDmlZ+m1FDHkTfwci1zfER2h5Ocso8P55VcDq/x3MWO7E+KiHYcQMRlgyz+sUSKZxMr3BBZ5zUXlk5qd58PwpC75PfrqU19jOp8L7AZv03oQ/bhrXBLfl4e+f8xdDtC9X9AXhAbOPhlvCKJXL+f3zorcyTNuAyF9ETfcO6+U9PG3i1yMa/4OukjEqo0FsvhEq4Phm5wY8SA0O52dVcX789GxjfZBokEQY7u1qR+nUcn5Lki0jPhOc+vYtNHAHUSBPGId9LHIhT9cSlyrnvptRVj/xS/h+YGEufA5ZMeV3VanwURsg48cB1iWX3zAoUOUA9e1ATZd3wa/QycOYMewNUsftrpApywCUc6f/l/q+vk7YQ4bfjphi4sxlp9bVdOwkFlNM0uUKdz0+oL3jyjwQRUYtqfxIxiiAPKhOqXMItgWFXnEo6zwigj92EPM/fe2CB52n6DKhk1AC8UxxBLNx1A1R0ngL9606nTYZnp+E5Tjk+qYusE/eObeYWFjlKPZFvdOx0U2vDYQpfHSlEGDetsAIj6SvWe/fxCh8fcwF7OI8sOHOARZGScamcnNujlMj8X1UxPBlZyl+GIUhnbLW0Mj6pEsMOpajd1wrhdBnbOs5nR9FqtxmqqjKsOk9SA+P+yewuK3MEcLjMMZIvkEmUIK5Vqbg/lny9j5bZ0oTsAQ7Z6OwzC9ScdsBm2UELpNKejZ72/k9vYfa9gTTcoZqMQyMzfQz/uEaARJe2y9OHljkfGR3jVOj9FW42kOXI9QGCbqApdHn5HmxySA3PX0g3r1l6uifW0iWwS3wsIEYRXnkHxM2+hJ0KhlqiELiMjMNvHBwUAB/xX4W5l7ywzsMSjIr/uneHafs//L+dWdNxDIxchHPw+SDD+TQRgx1kHZjbdOjgIfL1ZKH4TGhV5N2xhXITSkDBbbA7qtM1LnhNSO/ii/t1rgh9LtRou5MuIEYH038sThHYRYwClZdKNTlYUE9gzcAxouObogr/wQG5ii3PqN0pX9tYW3er653gGL0aK4229AyvTL3uBeVGwtmdywGuaz8BLQVqp7kHjUyg8rRb6PJM3JFvirc4XXVQyD9/qO+5BUxqVH3lC3ydYr1PIw9GfdO4R6W0uMkTpSF0AYteEZB/nXP8aJgJbTAsPlF+ToV8m+RoIDBudIKlhrGFjP9iACJT3eV4BwJXkQTx+Mgoag05e/r1s3aWLoFoBhjMmCOCFZXzMssuADwFBnHdfl6JWm5Zd6DTbq5TpEg4PgCHx5q84GxevizR0o/7jJibLlSzVDlHfDJtQwAC/+LxmgzgRdRwumxNkqeeJ8hAJQp2GriLh1T86G4qEcdSSi5ABJpYeFEq25ePj9/tElmTwN6JIHG0tYuSj/632s6lojObkwFPEA49nYPzC0yAtffIhjhnCPoESvm6+KLBCYl7/plOEJL02drWKT5Tiu86gAfInifuArBctIYvi2WQ+tMSLebcbkRgPRCaJsJ1/z8KzDH4k50S1iOGLD7nrjO9hAqTmATs7jWfg21we4Cn8KC6e8+ksPGpMpvVXxYZDEuchVY35pOc4a+/bEI+u1g3uCwyTo3vrPG9BWCbT/nwH4zMRdifbIdddInr2746zod5L3/MrrXat97DuAKuB5Mrz7sH3jp/CJ/cj3X/EwpMIFAMha93Xv+sO0J3+SkP4CdwYEYJX5cPGZ2hO/th3AIqAOAFgCaEADdYABDcwEGNDAet7iXKbTFQz1RlENvPNV3urcN8LPy93O9jqHxLJkn2oA5cU4Zof9SzfZenxX/floWI7fUbVUmJJ6bbPpzPUGSJO3b+qZdipueejyIrF7Eh8M+qb+F5er3ehiNgqTYIelqwBz1JFVZL8osTiFCjPTXAzchYzbKWpiJQB0oE5p5G7Pakmd/s99/UYK0nF6ZReacvHJ3RTmY2Gh8ZVpKks4qMEq+4cGYsvTl2EEb5d8BKss6Xqy6EZNd94TLbfGOBAEabZNxAAPy5Y7IfzhTW7caFtJpDWXBWEGJVwiNMkhIdM8G9Pe7L50/4gdtzcrIKI7P7al4ucWLZ3UQVrgdE/obHkkIZGMSawfMGPs1yPMG/mz3CgpuQw3HT1l8cO4XuTcE0S8IkNFz6uVchSlKr45ZYopkFz9b9IwGVPCv7vN6ddVZhj7fmU+xGS8RSN3Wh7xaOn2PtJ/QeTCbPqDdK8MOdZMCJLt0cNA09YMF0ddaJG1LOsNRbwN4qHB8Xt7R5TlbpTuWQgrqrkDkLOw8DLHpTHuFqLqg9HfSgeuLNtrKe5eY+cwMdRFjgP4/qPjCDg+RHDqsM77mYrrbAzqT1yjMVfwTJTvZURM0usoXAT5S6h0PuqweSlQlwWMsKTRwGGWRHXoOzmVdKsVVgozhORicsAWc0BiINwXYUibrHIh3K/gc1jALdJQE1PTLkjC8y+1E5anrTI7T01YfjLaIq9vtjr7vCi1TBDY93Nmu33HJbRiuaf74vftq8dJGTVwOFU3nPgDEWjPGm5otMypK5TEBFIwVZQnhq1PWAk+rnwFOEYT3mM3WXEhtp1JSVGFtnhiUAzD1ZgGXBdfH5XQ37qnn8DJgtjTcMQlHpq7zvxYmc/8z/oBGUDSongiu2A/+daBvEg0Z9wKkOZNCU9N1tp3aTwLfeDNl0yhBDoLdLGUi0Du2Mb19dZBQcYufzdMOZkE3BBz3d5XopBcqNZRvnrElL2LbCfC/oQNv/jG/vQgzKGY6SUsqBelG61sn/m3zvxbZ/4lr4BPlliSdjkNhu7JVTMtM9hYvfMZANXynC/Z57fZu1ce1qYXflV//FA0zNFuZNB0rp9DR8jkNIzWCTixI/WZkkca+lMxhasKVssICOuL6YRPIxqbA8BUMifXTVSR1EUnbpmfqx2mAuyS/XzNgX5CVtLGhRoh2S8zUf35WMVwBS6hnAs5ppsvrgT5IgJVnlwNFSSMjOk763BvNozGF4ALYV2gh57FcItut3bW+c4tBxSjdq3aXAbGkfPLG5eNoebX963ZEGMzGpSoiELABJ6vcHOhgEGCc7au7wzYmMEv8w633R4dJe63fqK8DdPKomN98a95+uaqRqQx6j64zAtfNkXGu0bdPi0p/LSZ3iJRTNQFabOZdp/Al72hZlfjApMtvjZ/OG3JsYfNLF8S0Xi1VWHfhVi4Ke6cu3eFTanMGMjF+EjzABfrjSOoQRK53U9AtKwnZdzqo1ltPciLOlA+FahH1pZ3WtaaPfuu83EECgb9cDn7rJiTFcy8LZxNOpcLzUGW/RKK2cACUzS6g8MTr1bqbBr13AUM9KJalL1r2QSLeNy7OPWyxLKeOki8gHgpH7Fbmf5kLHnWt1m+GHHCtxmxITO9RXSbHeMHUkzBFpijh+seGc9dXFSDVhSfqxX9c8HtmjLWwJliof1Fs0RTYz8ymxmnJum29cGaUR0ujsF4/q1T1je3LeMZ5UuuCSxoFQ7pWzm2fkANeT2mQW4e4TWMaeO3pwyDBxf5VZ9raPUDIFYGKnCIko9SPyQr7m1AbRQ3LknG5P2yJ00Lsh0QhOptVtB3uWl7ieJtMLRaqzmsejDoy0ZK+pAz02dU/k8RQ9VmeRoQU+k6l2LUgixXJ/YVKbPABwoy14gXmHzurB718O4XpLqgfDYz9oOyPPMhHl640/diHAmZNiht61EvQsK1+UsDPvJVKrm80HJLgHpxyvg8VG9xq1YaOEJNrxKK9l6dJIPsyuK0Cw42ZC1UFOUHEExOHE8f6OvQAb43dsu77866fUABrjRgHOW7Je+ef/+327G6aH0msJh8KDePlhM7jtYp0FeNH2txpH/GMhekIf1rkgiJuLsyYHk0TYMxY57oTKdjU/Inmsx3LkNoqnc/Z4/OEHFosy2PXVBHOgaskQBnycGpxEmJXV9Xg6GyRqbb+TY2eqHLW3RK21m73VkBcvZIbRI8vWXNq7beM2vYOLhQPLklDPF/RzUY8lIYYa4viK60KNrVcpcD7kCb66J4StJMn2g/2QD4c436RPYy36521SmOuAxCDmjbsi39btciulIBDCRhUCIRhZbplOsAj0eIveKPyLdZdAyaNtAnaTLLOsIlBj8v1aQeeWW2aeIlnRi2Tl2BhLfFpBuO8rSdnl2M7AQ7T4NQKUxVwpcj2qQ7kOINfITv11lzvMnoQA0mqNq8z6W0cLmdzpYGtHuyBNCrIFK4smn+gbPb3Q1ops8K8KkOGRyrp1pElB91yOGzkPji/HhxtuR8mJdsXQdaiYuxZvjnmaVt9Uf/Y7DTeD7KO6TPUo9/olB0BowMIpNQPXqfHykrzs+e89cFZqXi73hDoNcAUl2XyPk7Rbg7Q9+Lxbyae2/jeEgKPrTe6u2QNW0jLdQO/TsScf7K9d/RhoD/JAcwlO3bzx3ZVjf/WMrd1UUbzTX046pol7cv1oYW08J9Z0iFXEZTIu+H5dJlz1yHfHgDQnVVlbtm4VSnraZfnJGdovhrM3nJGt/2otGT4MbNeLryzvYAyk3DiAjLGyzQrnuAMD6IYFwl8A7v/AFigRK9v8ZSaQ/80Ew2iFHIcljnQ/XDMWQit4SP9430Z/PJkDWeUvn0x47yjmHp49b6oz/0qqZUBnwVlW2KhY+koO4TR/qAUsjYht6IbS3GrLgpH1Ujd27vUFAr3r1F9trEw+wiNyUYrMq+bWL1UzVmIllh7YH6/S3SHLxKaEVcgZ+F8MzWu8BVeA3hKrUDS2WvVL9rl1AG87ns0XGejfC4tWJeEYoppO71bhv8Sfjj5cLiHBSd6t+O0UREpvNB3SySB+er3FFixGj/C4pIabMjtWNq7dSHpjybQv6QMfX0dKdgDiL4b+QRT/gAYST2TGcFun7VsC9T/sHOamm2/yJiXJ0Pw+65ojBA2AznJa1xspcl5lVia2nGdIV1Fa2XStTIm5jbR+N07fVZKv1M2Z9fFXkYR3BvEDF+JAm+1voa6rq31adV3u95VpaunVN9jNZueWe1XnvH71h5TREs3Jg1djlF+avN895/DZ/FAHrGjXHuH1zS8G+24RJH/hxfNA7nPMU4wKP69TIyWedcZX9mteyHj9YKxuaNxx3M5qzOfpC3doaRjRJR0AY6TF4RUuy1AQi7d5DBqsMZ/DdQeWDAeIxqqWw56fIK5zH6r5usimIcwboW327CcScN+H549dlYqtN1PpuN6S/79gNVUvn6JapFW3CBn50fcULGDzF0LOq0ki0LHZPm1G5ieJH0xBzD0/mNYu7daOf2dKi+Iz2v4Fhu9TcTl9QD51hfSIdQLynymI0xpCpO1X41B2a87RDtVejVhlfByx8VTqq7RY+dPKTjStbkq7L/R9nL+YefPDUgpJFDpXdAIWZIhgc3yvdu3ctFEh/5cpxWxe8k3tPCh6N328f32m77Zvuvzyqv7kQhHukfyLxTQvODdPprXsV92u+29zxll/LGAEU8xZ0mfimfvTCzzgnEpSHzAcHW0R2nUprPjkm8soq3RCShidWKlBSKRcnb27XErLIeaT9C7Am8VX5ewf50Fs+9XXBjrZmbYNQvkeFhzHxMAkYmDVIPEsljPpZHKlKLZcWdjhf7U79Tc/PKtrukrxkslwF+6ur+h+K+tD4wUPfbB/FO/53Amxt3pAhXsrroiYb7YKT9y4+1s82HLgDVxvJFIHadb58SCBdsOdF0tbofQm0P9n6gl5q1hfHNhBWHaljUm6D7XQuHWRxW845lWBOg1pnfha18dQp73Lyw3b7PcxqHK0cj6YdcsLLC4OebwQjy/c9xq6tr/867LnzLwLOvsc7z9KFBh4pgiwIFIlluROHCle3TTF9d0u4X5641NjUc0vZJYoVeC6zOewjMx+ULDCBQDxjxqeAxWYsTJ/p9YCFA1U6hEAXJ3oBLdF+f5UegX1VyojjqB6fkCbr+fVGxviURrd6iD0RZwxON5SzQmuWqE3JzjiFJ+hI+EBJt3dL35wP69yBumerrGwournFwcOJHRWVVhNsmZFgRxsrfE3zJg2OEdJw4gAfIyzjwIQQw7Z71XHzBAwdY8Pw9JTPHvvZihnf1OSot97ng+xKJI3sCZu75rtTWXpMFP27fvYsaM3uq4AxzdbmqfnbE1fPHtlLx4bQHpdtunR9VsuLhaeVIif3dpaiPLcztN5iMlTrcHvK3jawICK3dZNJ+XG2n/tpRMqvvaUEpmm+9wkEab+E4W0t6pwMW87T4hCm1i7v45ZRU7cXO7ito7t2q8djUZDFpr+7+AZDzLYxebvEF6U+WkwIG/FYNAJJl3HAq+Tqie0GywnVvvHvpE+cT6VoGkjzsH42Pf9cGap9sSffLKFzYjJf64VdOn1TnTWhztIy9DnqfWOBiqc/6/pvyLVPZjflCQXQUufbnYkn6j8W9Hky+6QRtaWiKePLnI/CYfHce2R0d2K/nLK8Zg/L9IGfWNLKAr6srZyHXP7o3wA2mnOvszw9lLkAypiZR7J/edDOFZrlbKTzJ4lMZ80PqME5OQUDDYWwCCBKOQZu90RRKjP469B9YZsz/AhImy4Klyd6MEsXuNgDueGz6oM26fA36Jra10he1osALGS8ksywi8fmn+BgERfL/C7MoiQaPxBUyCoKe6SUV1Fbl0KtGSl7P9GUgwi4h84BQU9JRIgtjEOYwXBlmssWIeFgs8GBgGh1Xy64md7tw8UFjJJU2rFQO84H3G2fFey7k1kh9eTexRWelz3MZVfkgg+su5Bfai5Y251veLTyiS8BY+5uuZLfs68hYRLRDiSqLfafgxWpN1X7OQyuuS0Jc/qTKbJi7dq5vmYeyf5npfrbPMb2erXzGsy6by4hv2rWokP2kysx/7Mj1xh72fSnfuNskXQFtqBJ6gTt9QVuypEWzVs/kH++OVdO0Bjh4OEminUFGSLqzQjLs7BM52jK+/WWZXHv9//bXQEq3OpPo1u2b6E+AnIacAUe8MCdfUcN8phT/sIm9Vi2n6p/r9zeh4qg/YrxEhdxXggXWo/DMhdZU9ShRZBQBctx64wKxzYNGkfLJdHhbo+3zUDl67fePCuB/3p56ZOr21PdzeGFkGSqJOmAEqGNcaj1pKUL0IJ2bqfehdriyLHgQ4tu3llXFwwZh7tM1Nb3RDI1Xv7mfh6Pf2E6qXLZ4glKrHd9spxFhRnqm+mrE/BP1Ob1d+Qw++OSnbWztT0WjuxjiBsEMBHxjP7AnVYikuClKzDrxUnqoy5UXdzp3ZEMjbsVLXt51Tup2hYdJbQBAz5Mkjiydl4eRFdw9wRz8btzX4TtMeuS4+rOvq33YlF4Ka13/vz4M9cfR1Wr8pfi+8pMveEQ4xXsSSnvrccQsCLbnz7jvfB5zJJ5B8h6rY5kHQKD/1KMUVZIdoAs+ZezggSrMOe+s87zn8sx2+Hdsr0UKsMA7JgT47MPxZvUk9wsAWuMCiDeAvNR6PLwJpYR7hYJMFiuk3u4uxXxPqQK+d1qK/i4gr0V3+eJ71Y+O4hd3pQJRdJhuoy4K+Cefar/J+JjWzfLbQorarPsm4/CZ+/HgW4u+jGD2r71XOcCimxsLPZ7c+mwjoJPJOcA7r2c3hNnZnvxxhxp73wFKHF4cgItAt14IF9198TKzYm/d+Ft60micbljhy3QGqedQBtqX6Lq6NrMdgE8yezdni36OTl0t1GpXq+Li+UzDsB4aPBgypajJUSr5oL+ypdhM7S3s80XGi4ebMPaWGCGA2LgkEDQrELAZ2Lr6HyOCxyRgt7FggK7+hgM0JLk6IkoRbGLhsLU1ioIvl2oJDYtiuDYZ9kSHitrvGGLIE8VqzmsxV768PMcie4n6xsUbidkTV6AOWqgKWCZClQp9hu4ca9yDFgnJqG6/MTvgLV2f/Ycjw794dE5U8Fh5vrQ4iVAEQzO4ewfXqCK2k0w9FJiOQc8Q6u5y7S2E2dh92e25C7afh3o8Rbtdh/NreF+7mb0H4SzY6Pk93n3+uudMDMCCzCXh+sPwgapxViDuTlxPir7JGwRwGRaTZxJMYu0FxCGe9TxqnyT/ZQ8Q/kiTF3/QlHdLIUiZyVA9OC5trRRbDwsIvJCDDmm3qQr2aolz8u52yipSv26a2UYsKFpAwHMg/zI3Xcb1mhTGWKVvmUMnRzJfX5ayBSF/DYyNj17b0VDNOyvuv6lFYu2aot9FmJ7trr0ILBiXmJq0Cnz5gmZtBlw2aNkl5kv/Q7sKMV7RYWFgF30Ymn1dlMHA78o5LBTso9hrzw8F+ZKrG8zEdKFGzYacvPQnPfYXpBeaptnW2XVj04jrrAKgzdazxfRehGBcfG3qCJq/bboe3so3vpvOAv7oAsHE7/30qizPwn9KXiK2eZkMR4SG/qkBIuadT8o/AVfpBbxr7VYO/mvtdYj1Ieo1P+inYwJ4zTuJmeC95rkk1+i95q+PlbEMXMvCvsaO1Wvei+m28zfwIC/KBCnE3v274E9z6qTy/n54zNENYuWqPy17B4yr/zJ3PQj/q/z1t4rzwrG9+t9u/ZdD+KpLl5LM1flO/kl6Tq8Q++r7+xvup80HWCIAS9xdDhPzNJt64OpHm+o03OE4HiyjXU/i6no38yQv/IHONZy+JntNZ3lx2XKOK4I4YFzDRXokb7mMJhIxeLdd7dL0+LHD/2LczSm3B4bwXP0foW3vX0QWV18lW3v15+oTeWKWu3tCxNxbln5hsck62tYvrGyuCDgPb3wPuK/FzvIqIBC4Npfl1t3WmFnW38kDErWRwbUFAesv+K7pLtslu9VAUph2+w1ISRuAa9nUB8NuEVu0MhhivVriqnQzMOoT3uYmmmRrm7L4PB+XRcz20xxdqgH5x0U0NIEUNRC8ck+PGJlWQApUrsJ4xJ2GARnCVxE8VU8BeAPwKYXRXSQyQAkErrSk2xY5AqQYedkWup2RQoAKoSvd05Zr/HKYeLHEOz07nF75oCZ2UaF1XYBsutNRI22txckae/78PuNaW43AeM3/69AcLGyvsd4ZBEG9hhM79si0hO5iCUb60I34Q6cz1kY0UBq49U0MdAbhB5iEeHp9QpLqFJG8csAggKYekrGbAS+whcFF1SpXcmAjP+gIbEQDHXrl19AjwpD3BuA1+rDig54eHDkWmh/zEK4QD6tOQ18otbDXLqTHKQ6A72MaP21If+4D320GApbqURAlM3CCc945B01GyExKoXDOwSoAnBKsIvACyr0IMDRAZNuSjfXPH1LpR+FiOt4ccypVrZ0IDFHnKm2a35RL+kiKdVu6wTjgaw8v/z2nM7BPrSZ72WmYiLJrUvjbMu3vvToHKcgAokxw7xrXs9VKHU1dpfPYYBAWkfTgK4jEBwNcScKP0APw4NFD6R5vCSAikg480dGHDFBysPs0iTDuqAFEmaAtvqERQ0cknRBtsjsLheepL0idVnrwXYYgAUkP/aSs36FZWD3jXpMPDywgyav9H9eE4YoOqYZdL2cThGdhdfBioiIMkkQMwuu77mTjFzLAyau2UCIEURGtJI91B5JCR68OrB3/JSuLkMscsYTeG00jUIlD6iHa8PdZpQ7oAJ0Y/KH7YVlYfX/9Kfpub5UBvhTotc5HgpU7ZMku/CyI+CQJkUXUQXMYmYEicgi+pJSIcpmXoxaHTOOFDKIjWkFJc6KZCytzJJXOt166tT4USBEi4aR8vz9bp7Fs/Yace6Jxo5J+mCz5PYe7Bi/TLK7m7q7+ZagvbEc7+2OI2NTa+jRyHf+Gt7+z/fy/yYHkAJRg5rL3G6x+MW4/J19M2nuKsDBnm4l0KE0cRib3WzQsvfZunIAb3m/Dub+UnYP6HLMWdrdqvajFsJH0PRHBGo3udYvkRChPgfAJ4nkYecv+W0LQxKCN3qExqIO3FNpdhy+GBOeKhV6MmV2I+tGuEy8XQNa0uOZ1cvxnORV5T6MQ3salnN/uYmNGmtpLzCV/KG+kXHBzQPzkkv7ugOZazqFIxxyBiwMS16EvwZpiu47PDjK0deIgQXtQT5dMs4s/A9r61b8XXdH1Ca8Ucrl6SvQTb9j5jtmZOU16W7ffDoew4Ok7MuF/CBXn9Ie40nP8IW65WlybDeIQnQRRCO/DHO78HTZAhCkJOCTN82SfTQ9PMI+d6BpiYmEmO/dMgsK61zNBAyMMLtiIB6MBS2zIAa1lUjNqiJI8SHn9gQw74tlp2GMhqU1PlEoQjQLphLhZAFcAnl4/HpHe5UxhcwYeMlL3vfOZDjbWSCOpG2yZrH2yVYYaXipULGiwnLuaE56Sphi+vx/i1jgZOaguHh2yuC2KPFKgOcwFwas1bWsuDXHSQRbziYscwCqIl6leVjhh8ZyvJNn+OAvKSinwQE3ZopyWPODBr37YtwNl7U4Vk/yzu+k5Wm/l3dn4veL2t99nk1QqiprFFQkAY9b3v4q7fua2Rojx74qy5Vw2duJCINlYkypkfGm98SMzPq6Cuh5cVHdKlv7sOsnDcego04lvRdwWtPpUwYOft86qaMG0X1AgLHXOsBJCN4iuqDwhxgz2Ja75EwCd72meDTve7SDWulazQMNOAvI0GdXGFo6VfJJRJEtnGp/ZRdbTsEWwKufWTZsFGnZBUDoxK2De2RmrdFQqsFo96WMwky2FdTG09kEOpC79DEudA5qoRucWB/9hB78+v+ZI+gobhHF1mQX1RaYG25IHSS9anxWDrSSrEm/GMgu2xMC1MNp7FcO6oMlmdFWBf1NxFdcXxZJq/ehBSAWZ1G0O/kz2JNNfXiGJtnrpE7/V5HU9S3zJr8JQX1cXa5M1Oj6Pb8RsTrKdGj8O9F+NFv1Voh6Vwl6zgDXcmYhFnEYkFqzpKLZwjb3Zsq6P2EtO4WuGCE5RZy4w3eLTTHEDiFn78ee37vvKrDPk8zbkVyPL9STxrrab6lQPCnJn34psCtjRHTpLg8VjaBa5eZBpc8+jahjA3u4bm63OvSMtQxP2Pba+he2d84XggADxcyyHbn9yTMAU4wYXPhTLj4Til3bMXBMDy1tfCxEbAMMNCqUbWCEDBXZSBsE1VbZB38ijr0q8KpcVITyHx+VCG+JSzugzh92QwN6SfRAEz9IdwtB62knNOqlGqI22bvx9WQ7PoHiopDFVLdf4SBnMMqaLUrfXC1ubvzRQD5h1SXeYrl1uwmb0jUbJB7/j9d7T9G1L+WAvFXu7fXGYY9f4m64r27pUuy4nZZG3T7PLNakkLW22yW/05Vqc1kZvjAXXphIodTP/5B0O2diQpUOlxmsAG7hvmyZBGSSoWu0qlcP4knYiRO9qOnKpMtqm+mecdwCiF1rYCr23xICgJKM0tktDvmMgMoGbGh2x3jHUUFqAlLy7HzJRW0QirAiEGNpM1BZ+WinqeMwVCsIsC0Q2FmKylRjQj//2QTge+pCkY2cKzsBSYBolPiZe08oJEHc8Bj/RVAmDbeAhWOANqaK1SDHevPzv7oMIvgOQikJ/UR/+GA0nA8WWAiAvrG7eZbOPSmmKUVAJgJCCNTM21GrY8fa/oQRhoHZZC0uxFtuArSMtGT4LqlXPSaSxHJ8HPv5oAg1NTmBH0xEhe3OFa1jGCn9jAMdU6EPF2dnCi6GJ44BsVABBQO2ThNsAQKTxhJR9r9tCMiAtYi5HOkQUkAOA3a/CigCo9r7/MaSGgnWGOEvKPAjmUeJ2bmPV3GDPu2TBkpPpkKmELJaJEeOpaKuqwIAx2AHSy6fOvcYUeYwtMonZ+2g598Nyzirisi/AUwOWeY+nn8UyzxjPjoZCSV6w04A+epYAnL7GZknlCQe08gIS5A/nKKGFIrUXwFmsj/w+2Tmu+gCA2RlHsLwOJazf1VB0kC8GDMI2Ce265LnGUg5FpuIfEACCwKTvQecMR3R8Zfi2HC6gEUGhQOuhxZ5OH5Rr6T1wbimEyg7BZ/U3+b8tYW/HPEht/UXILZCwReX0lBL7ZsQ3Pykn8GfqQfMYPN+RjPrEsH7ysouUcY0N+VC6MhtbH9whFgyK1jUnT/1beBziPBKQ3pTdy8k118k2IPiLubQJoi9bvRXhXFkDGF41H3VV+9WS9S/rSSsplHb+qkSh3xeetXI0L0SeCs5BDrsCWxD9sziDM3wUEMw7hVrtePY5gJxN1LfyGV9kAwRje/H+2fTgh7VMn5dsiAQkif2HB1LRDiGkmjLknRpxWPi6tYda+KeVLU2JuG2omYbpR6JG8m2AO1RQyeJNuYg4dsqqFOWST3+CW2/FJ8F/03l1odXAevOdyn59HcxRk0Ss1ooq+PRvnQ3C2tJY41/oG9N8/IGH559F8OVKCKQ1xLIcIKAeD1QvgVdFK0I9AXpTvYCGqFTqrQQjMA5NLrCZb7GRYA7pFMHaqBWCiZS6p8AiEa+HEId1yBc2oVOMNpr4hrOfT11QIISQ3y/7bnXN1tehmXuLFHESHvYH61cESbenYBRPX5HCY3CPvEmzhTrtnFeaVHQ77gZv1XMMtdCtqnB6UGBJ8zDczdF+s7Xh5oTmyCHLnylx3VAsrprlI8+5/8EhJY34k2T15v6Fc/90LoG9FGlLng2+OSG7i0R17ZgT+bYMfbBu/zLatREul/3t9erWEtw2TJFXuh9BjXICyeCUohmTdVndSU8wDYIPm5BNVNvcMQo7uJg9U6JyQ22lhshTpTe7forJMhJ3DyBsRjhq3IFUMfFmvh1MO58AlpFtgMHoLYaOdkp0olZDzCadklV1RSDbQq/bmXVdKlHNyWZC7+kRrLsCBMFv6K0Bkm4WO8xa6dzfCETzctK6qlwDZyzSp+i7NG7jO9jfOeY2DthFtPCHrslDeROxKZKlMvIBe05f7D5Twuy5FVz+cGL0fTWfKHLO29Rj2qw6q5iaszmDEKIcQjcrOu8RprDK4NAj6bdFKHpP2bfggmCvEKaFHSLBW3Dh09LvYGSmdI896p3utQUOMAQPNoJ0D74pYwVUhu5rd5KnCgHuT0sS6BUyD6hEoF51IZUtBohT6mNOfTt+qUgRkYaUFFasHtKniqYXJ0c9slVnNwgA9V/aLdyjrtwSAgGggBeec0ay02/oKtdj7QGWG7SxByvKxa5oApoP/TiefeinBbmWJLj72SoDIluti7ZSmXzrO6nV54CYn0UHHAH02LaI7xGQdRlQ3j4mj1UwFH/iZWzN1NHR7yRM3SnMpW0Q3skX+D+2OH2Qsyr/+KCKKelv7+Zmn8sLxNZsNHBMgPkS0lM6G6sM+15xBp6ss12S5PbekpMDU7NTcpsejQgDkJ5HhqBcT93wOTwdF1xdVkl56cfEVeL8yeWhegcbggj4ycbs+vleYAgCesjo4HnsFkXB/f14ENviUHMuCpol/iB24BnubF+HwbTybV5vYB3ne/qpjkAg3fI93gcW5liOCB2Yb2Odg/UXdBj/B82SzmoXVk6RFJveV7LWk2Vc1sOJeekl/bqTRO7bDvfTi1xWqRUnOaR5/VBBGNfgp753cHei4kNTMbjB1kSBA6iMtaqLnmKZfnUhSTFtJEqsXlA9HBZ27vq1Qzeg3fAIoxqg/uKS5RfjtuVPEgcoDVQQmnIVmyhWxqhS/mD4gGJjTf/djLMwbMfqa4y/6TQgyUx1iYUMPFCqyejyI4LuUYdEnd/8L1j+O6eoAmwdCrdNlVpsxJ8s08Qc8Qehs6gu9Qg7b7umC6eIb9TbN1t8qj6/JuLa6y6EKgyfKV6YRFdALsysax+SYO1puX1i83j+Ndg9bbZGXe3u7rAZ//evKQWdC7EGvAHzWwRY7LY5peBPlXDAMYgSCetTwAHzVEJt4PVPHkcIomnf1nPYA1uhmQNFE2FkRAl8otwn8rKfwDdx0mlaSUWLuOanJiz1YytKzEj2yXayntKUKglcahKeXjUY7getsFb6hnfXCLLwS6RmCWym+WuIr4DppYsYE5v+vRu77/m+s2LMGGqRX52p1bT0LrEp3y5NlleXKaApewJexgxfRsE16lpagPkK6sBFiQHHUZ2Tvmsq5LSR6fJp6RDI4CzmJMBZl6XJ7jxdvL43sdWDFf2rGJ/JP2GBPHIXS0WTP08YoA2AUYNGR+DkIwwYQT82zRtbKrGmIpLejwfEtU0MLL3eF18j3KpULciBn8UqJeDoRvZ4FzCwGKH3pf/WNlQtYph9YRtKMeTwaQioPguNGmKNdJ8+pgSQgSCAMfBblFAJzMkHMNu/7tJBIQkLDFmV7IG3SYk/NMQz0pOmojhrmgQMEdHJv0bZS/s9qKKfM6c7xSqaYcrAinUTrYCA+IwO09fTLXniUMkxrKQST6TI3v7/yExvfRefpSS/uhQW4svFzg3+W9zzCrKu6/3SKeZR2g6LMkeI4Rz54cu40/qf5RfcbKIhO1wSe4HrgOBmd1Aw3p7aapn4cu7wFETK7CoXt9GYXVeqhdJUIRQGwBD86Z5UkgNp2oWENF3Z/AlDVc1pDtaP8Nd9Cb3LTSWdSZ7p9yXxgAWdRz1F6610QthkKVgEVSEfeSbldcXllSu3lm0Av/z2kMeXb7i/jzsjAAVGNTQZoPDHSH7ISCORGQWrcRjLncecw6561mZ+VwbXvePQ0qgPBTqFrRQWW5QrsizEW/BGahNr/oBzB8I/QWuGyoH5eaLNFS/chePk4Rb/6v939Hesost2jokPPlmZesOXEwP7WIzqOPdBNNtV4Y2vjttc6LSyxYbhNoBWm7h7eCO+wOO9/p1x7Z0M4sLV6V29qjl4JT7ukaLldGuB9Zj0nF18TEJLjbf9Wm/HUNjlSPOIY6oZ54RSwT8vB4nAMl1RinLASrth9YwaJQCDkf3VlXTmp9F6weTOTkIhWMghO6ByBbJufY6kRRJKX8AdAkE8kJVvE0d7S/gojina3d9mtjQm4vPOnenSGgD0MMSaPQIJlKpXH4xWH4qYyi2oEcGmV0+w3LGbVB9mXQzwM8U8OHRs70xOpaoH5aDKQdV4QFPspbPRAucg+H8GnGg/WGgHOv40FHTSUl+AumC7WsqFamhHSi9/q0r81pKGU1mvSpvLjnPdtGWaLqF8YCVmQ6yrmTemQmvTOkffcH/VIgDMYIRhp3RuELIY09lRxSkepm395tY/vSG5BHpRSMf2C2yqs/XBoLrGfeBab+wqQ2PoVi1OGieYVlqBGdBYX9XWNgB8BkDDP8nTMyxwYVO27dKRnc++iah7/LKzzgD7a+5hrrJbC/O9XrsL/DXybRxpuGvx9di9IW1N38v1irnm6udAz1KUTC1JUeEJXsNUbrgcm2pxlDxyTB2aOTnoqzNho92GlqE/JuWPKj18KcigEv3dgoMqzkUqRgpO6y2g7tIxOf/NLY9oqccMqhtxCdx9AeB03Z5nxPN0IeE6PwWKABR6ZRELkQjbooXite1VT79oF6JqIxzkx7WCjBQqpHBQNElVrXmjQKXhPDcBFiDiqyF6UnGEyqtQ85OC25UVoO60XeczbFZKEFhoIuCIqKzqzAvA/DstHqjNX1qBk9749vWV/0FrORorqcaUUFyacp9srzRYzTpp17w5z9Rp7hESocvNlwqqNvGt0V8zJ812eYUtJAK7dgq3a+cUULe9aYZFEy/HPs4p6j8qtcBw2YAljW5d0BxkJtnM7ZHq7JPAOLFZXgMntqZpGDPt2yoCwSV04KDTQXmF44fIeIKSZviLzOZ/6SI8iyOqSJ2hr3VEakn9iF4fxYi2x3lQxPvgmfH7NR/xQkWSSt7ySc1KAdMHHwtwkLWbKQX5dA/ywbbJkgiyZ4k2afZkLwGb2ZS0EdR+kaUC9DG/jGtx/ax7nujkUQguyh/ha3iHElFYcLZtOaTy7BeICyp/AA1kwE8oQ8s8eCz0WZIM38jKtnHquGui8uqXkaJHrNSNP73R2jzYaSvmLnPvLX8y+uQe/z1RZQn82BRl1uPQ2Id/Y+4fi4VNFf91hUrEEm7E6C3TLshOZdddxszV7+Wbutr0cYjpq0R9hnlSuDsULt3hLFknQA1Oq8UC73YtWOw5V2ltOAncU+B9C5T2xpWAkiv8gBWgGNQuhiDjfm6VDUIOQRNyIHXSwL6hroEcw7otiVxV9vaAeVeypWicQ87pJFuBz91Uhy8XeO3y9n0x3jZZUOqlxpUHQs4xsV1rF55789iF40Wb3kiYig4MpMmLj8JbjUlaEBsM8VNc5qOOJWDDlcKIrM7mQpR5jTixA6kGDhYe5CoMH2jfRIWHAQQ1Oh86V6g/s2pt9BFHOBrWP4qzKNSM34U/45RPBXBCcclGY0hV1UdxuEZO9MshrhHr8JXbv2op/xJS5mpyFA9BhBBzAg/IpXEO5Jkr28y04DRGOIgEeVoMxAETs93M+vEiZwAx5DUg4+YhCON2SlMlT4XvXNw8FJZoYjugRborjrkJLxltahlDJfdRkNIMga9T+i4uVBSQoIvL4EhFmR/QzolTCU9syfgkpssn0+wP/4rjoA2BllQRlKjcrYnru5yG99wPmabRqIs7DmRRTBVFlfutM3F42gZMoiCJN9TnLF0rKVP7isZnej436RINtRjNxWeemCJbfcDbsfZrDmCmtNZiU8t/NBTuahdQUbGZ8WhaXTql09kn9uxjPTidblEuKXz5oHddE/rCnGcUk+sMXpiDQnmtAVy+NIfN6uuIuE9WQKJN7wdgZys3rKGS3QgH1GBxMLxUdwPaBvzs3IztN9mzV9D8hxOQ+MhP7Af5mnPH1SxIdHW9SWyKBqBdXS5F5nx211N/wjG07okji+YRqTiqYpE28GN2Usd6BiZG783Si175fRKQlIstgtxBD0fIgahnIHdw/9vFpFvvPd36QGqtSY0u+w4Id+AVkWX4hNFmGUdCPjN557LvyzEYuwZzuH8XP4CHk3+vpReDadyBbPyPB7htQgKJxEIjCYIKyy7fnAdPwWfpoLPJgqb9fbDWeF/HMp2tNRn5zmkkF4op0aqR11M+8orvAg8j4xQQJ6N+p6kjSeJ3f4n5ouCWeZpGnaCEBF3NE0DTH9CnsOXVtBZKfNGpo/oS2SWC1JOkSFOvp0v3MzZWu54OTN7IQsOvPqiA3oOWE7rIyRMZC3Ly9QveqwGlpjbq8ARapqJyxD0JHBwpWgYHG6UwBl3+5q1HpztQnb2JEQonwb7pl8+kbK5VnAdyqLMOZZ2a2JKBGHmXazGeUYClHjSJY5E3zJNIRRa08feoshzRcAZaTPqVOhYla6ij6fWmJ3TmMhLeMkM2PHrKhNPtX0/P8LN6pj/dY79L0qiUSViAFCnv5J5XrEuS9c+QUILPt0nCfnbCRp0YYC457JLIw5Jf/rkJlQ07KdUpoMbOmSwBVjAI5Iwj69CbASKPEy9j0yXdIWtJRDJtZ5Nl+gZkq9YBEvNcTaxswqFyKFI+DBXW0TDBxYGNCBNFsicVSmtr8devIVcUTgOVdWjjSeRw2Aj7/rHXaQ8nAMZgE8Oo7WRNKpECBmaAwwMMbvA+yNuVSdttinUFzklPj7NalfZ5lcHCuStO6p67AIAkx1Y2eLyf+NfqrWP+18gUSEzKkLZnQuydnDFJuoeZxMPPgFi84DCuaLHadhYtkx+S8GutDGDQYtP7kasjEKiEZzPRK6ULYBJDqt7Vc80RVRuYGqtjjCCZ5x+yGYdB7Srm/lsYpRh1IyAbBW02ai9fgkQ7keQ83dRwTRoWibevC8D1g4ojlDYUhYY7tfYenDOutv1AoxeOHX5sHZjfn725cHd1K4Yqx6wrH4FsWru2cbS7BvCSe5Uaj+Kp3ztVizBQ1VrXQrXgL/xt8O6RyCRzEEVgT+69DvH1/zN3e7cpwjD657nfwc5jWGotRH2YZdupvtEtAYojLzMeu23Rca4rqfRyN0nOupHCaoZN/TS3CGhrgvJpOFrT/bGntcagGSsfX6P+wXm1G6f2clODuPdJ+9FQ6e6l+4xptK336MaLzgBon2Muond0SDCv2TEhOHhtuodxzfVEQI61EuJOrCk3PAjf8aDIikXkGKndtW7TuBtRqPjbvSKm+y7XHkNA6zakzomzPonNnXu1UXcsaDdqedlvP9mTSabv9/Rq+icv6vN0q7FLBnOHT5zJIoReyHovn8/ccnK1Teo2l8L5XFLnxp6wrhQK4KeGTWL9QLhPigcxi+u0rX9TnwKf6Apj+Nr/LXQn9X+mQuZz6XCq4BPTehwF60wdKXsm4/1O0dRh96RvP0wInWMO3tRN/YSzUFRmsT0btpo9zV1XTWzTOhBKOE+UAESEdoSmfqVcuFciVGiUavdDdMRPji9xPAFYiZSphZl+9lrkEL8f3LcSId+OHierpvgk60y6//2VBp7VLXaWjGImFRbDUeoZU73VFGrBS+tEYqPVVyvrNBDOOV4cCXnL9jyDx0SKKCF7tMFXOgdsHBIZejLrl8WF+QYfia/EQMoAn37erC6O9SMdmWz1yDo68P8UXRY5+BYYjsvfcheZXEP9GnX9grkIovgGYUW/cS48zFphU/3WT5SYU+x4OB6GeG479Q9iORaX3hWIarQx3YGpvq3bQ9LKyfbQvGo1liweFoePgFfi1Ompun55Xnz6onsf5KBZyscxSagtziCoomvl04d3j1IrcnRDxh/QF55/mqLAvnhQvno4OQsQL2zIn42zYgHa3VDILSexofSsugurfixgFDUbKeU6bMht1/eKh6/v+/GaBHrXRNiwviGJgBQb+o1oIp5h2pDpt0vGsL7vPyzs/diQB+DFhu4hRRzgg1LLFeph/6G0Nq+wz72AGxuZZMFoMPGSSm4jsRF5PJ2owCDbDBvQJPkB2oCnArD8Dj9c0fuxgVQqxSeRiJAZB354Bn3chw3kHI8I3oJnTdXAluSMCmiIvSI3GmvMRZ91CoQ5Hnz5iXbt7JfU7mh1kFDqmjqhHOoqnKQR52SC5nUk+Xpx+Sb33cvu809Uy25R2xBpPJNKjAaYS0kgzA6rdMBSjfRgTKn2Amcx/JapTnJ/kKoWMNe2Zo6aPo+U6P5H2y96t62nTNenr9cu63CFG8aWRDSpNvvqUhY4BdORC/p5F/C+pwn2coywX5zbctdZtCxHC9+qwhjlAeZ0Eyz/pDlXLBq4lAeOs1XPtci1NC+3BrTzJnVUspuVqP3/AMifewqVDyrrYBkJGh4pM7UepCCD2hh1xjaQAEz4H+uh1hMNCqnT36JPgdc4EtOTGI4jZQndrnnD23oytaMN4ER7Nm5i28o6UAsGz8yxNQAvM9sjg0ZCQ4hWjjaIrmhylGh66h6d3jHI5N9W/TjSk0QViuUKUMOIkA+DBaQnBYoZVzZOByNmhskt/kqw048124fQplrwCAviIJ2Vs2u3J1x30EGHD6N3fI4AFxviJrU2I4zLAfkWITWqMF1kX8vtERGpraFPFQoxAp9lhI4H25giLW9pFROvJROBDdKk6awRlqiWt4aCKuRxKvCTJ09/DTF9TYEHh6apJTbSEm80kA2fvw9vaj2O7T1zaO4UQHb2JjttIZnHNISVOJX3RrT0IkYrCrwvx31zVBmsIl1te+Ir3dm9pYD6ebPnDS1WoWUNn+LA158yr3SOrWNbMMObUT1Juprx1B8kAK6GsUEclIikDQt0BXh4KD/CE8pLGd39F67HZTVOCMWIgCzsN9ZYwsgD7vIDFP0Z8ic9XlxxAW85YurZMrRARj9799BYvtnf04V1rDHHpePie427zBpJQGYqyV2tP4Zl/yjpZMFUr73u2Lc+MXtBcpH86hQVSsVkBe4RAzXLTe1WvIBiqehe5EJrUzbhLm2dT5RRlbTMryHXW/1wTzbsMvQ6x7GnFIJAHd9BiFbsQ5iTKR2j5w+z78uZildJplJ6qYldEtPA2W08s7sW3FSr0IiMumKxE7h9wXOPQxby8pG/CAsRr0r6x8tO+By48MMHJ+dY2N1ELQznIDs2ls6XLJ4ufKxbBxGB3CSN/Ry1mJHBxrfb5WvpyfdLfc7crpf8csnZQetSR2BbhLIJ/lsrj00ei+iuzn9WCDMh4e/wd9u+17amWyauoDaYqgXLGBR4YbDDVu9Kc4D9RSZGLEweRq7mRFU5Nm6IR989mQ7QTKCqdkb93wQlaOhEzHHiIER8V2clnveqR5qV0q2MjfyaznQW3VPmW/izlyQIMuxWgyHvkMZEwOOpwoBIY/FJaSKR9aLUhbyw7QfCzUxO9CLDvZXHC6filr5A7ZKkKdA2LtzKVqp5Sa9b1bKNd1fu3oyGmAqW1fX6XO5L9CeO/fF3ZNRZkQwMtrHpYksKaiuXgaE38P3qkpmpf9r8L/aJh8bkY9iZm+MG731B1rnUF8Oze2UYBO7gJOCSM1l03LWICd+6ReuixgVNonQtTYBJdiHGnDu9O6H7HyxcHGXBAH3pk0Zc1ZJ6NiLymPvFNdvnSSw829S3LBiUuVQqiJy7PeZSlO0wcy+nAWIEaD3OGCpirruqHaFNMcI0/McVXWUNX4r3tFXyHidvpaU9JzEF7VJntaqrzKNa1zY9SpfDqRxg755znsovju7cl5QdaNYAHzUUFTTp/tZcX1CnRDcsvWoP6ajyxqaTT0Ge/v0VfM9nNPF5yNyKTjy0Y+mNvBE+UD6ZmKfLwA91HvP/F1ebVhVdSQRl03XN5080HCtkcFVCkHctPq7t8R2b8B4g4265Wp0URWoc635r4ALEcuigPH1Tyznxs6+i+mp6yQuREdZHwz3hDl/wgx55f/wg4ZB4r16siHTR3WZkE67yyivddDWXt0LG9iS0JaEpZxhUT78GntUXuCVG7IRvAv4woMgCnDbFZB0zBUkfRGRmO2Xys/utrHftAehidFIsh1lbHlqI1ByxYYKlmVEPMzUoOSVqN7XhwzisUs61ZgidQfPH+oKL7htt1oWsfmLlD+jQQiIqUlJcxstEkV8gF0GlQbo71tY0SnM9C02j2Beq4L5XOoVaAlqU6WyjOHtSC9cjSTmJ2ZDTs8IXtiGR0Dg231t6Awni1NlyLFIZ3j00S6sTQVO1e46qKux14qj5ystBP6fozxf0ljnAfBWlH5tdSD2mUNFWGvT8JG604z41YlpWZRaY83WHEXIFdLL4xTnaEbM4oTJ3OUvjDn4322WSyzNiv7YxqYOBCGDhXacDKyIc7q28VhInipsOI4xZEYLeJFflmdfnp2VL/QWauMC/dfrCF9hs6cjt3c8sXueYnqXmWIr8wl19dOWl548Ilb22jNsB6GmFHiwBptUXk7jGptZl0rQyYLQAJ/RwHly4tQzPCyM78rMF91qeoEPep17R0DAB9RXZnFvCiW0+kZVpeqHOM2S51HCtoOqcxKQ51zjEJgtabblRA5iKKZ3796SU5q9w56aex3F/9/B4+JAd3EMjvrx+fY3kH/LGwFPiBPZLdfEDcWbUktT1hQYdPLxyGvmlOUH3ByhWlqU6FvaSwL2rWjXjrytzt8yV/kN75aKSy0P1/2HHX62tlhO7hsGOXGms6aMcuUR9x2DcOkLb2sEQsYY1VpQlTHti7pd2j9ZhUC7gNj7F08Jk8vcWM8zf8uujQwHyt0Ejf49IN37gwN4JcEhv5qq/SxYQwMLQ/Nyp2auuN/8Oze2dkzCS+KjX5OIeyW1mKWItgcB+wMAAjJpnp4vdDhjPCLUsSXS+ECKHpSxaV8wxvcZXdxOlWrkuN3IT1qQjrP7gZXCVNuWw1yhDcXqP1izTmoKk7IeAbYnxNp4I8G5+e0a914PVdowmEaqgTyCZCXt7L+8DkWGUb/Td9TaMyrf7yZczvNPXa3Kz4TeXz72LYwPQGmbK6tJZSuu+SpIpzq7Kyf9cADxoVJXdDt3L/jR/9N5lAEPRPd177ypJMcLrfXDN2S1D7yM8vCBrqk+Ooz/8zWFoWgnHvRp9PlRZYxn2eMesoOROqw/Ywf1en8F08qYhLqccAqGlAZYlIXDGmPXm/8ThUyxYy3wRGHFtTtUnVlJWQdlCLVeu8TTFYaPd2/uTnrDYH6lbylcHJbWgBoV47T7p/bKdgLhNTdXGxpxcQeTY1Kt+xs7e31tbgYCX8pisjYZ3YD1HdxGKD7Zc2lFzDw/2o26EoYbssIdZdUPYHKT0D/FpyNSrU8h41JmmBL0LAGEqlZiuR2/s+ur7/VeZZKB7a/J07pPwXBlZeob+CdYunrk5Sfe676ZqT69tMnHbTEf4RpXf/BxKalb9e0y6gTt9eOAS++LBd8k5eEI55NiqUF/5/ac9ydnfOEvTL/2zScByuzq8AcCWWuhzT9FI+3CbIrsE18TQlbeoKY1Rv8Z0HNhyoq525Y0FBHKdUvfu3o/Kef8QWNlXdxEX3vVbAMxh1ZSbLcBRmnV0W1EU4zVBODj6cq73N0HEd7LAGmS52uCg+DaOj+zffYEUBAM9r4UhCRCo1wUHYrt9trV8OMHYrfiBub1PUBMeahUrly+ASA9fCkeCXZh66UQm5EmM5jAfARaYYanBFsAKFTCbHSaMsLBgZJa40e7Pr9zYS4lNpq5FI1uBoNPIuqRiGyEsHNP4zCMY5KKDP+kgVzDrJ5v+bj4MWsztd0tP1TFVF5ynOgC9poJEvSUXMATglKpy61S1OSoFeiwY5+onqVb9qKKchOtbwQBsW3Be6PuZSpUEcqURXaCIG1MK9HQ2Xwh/+rSKztxva6eTdyPmK8Irw0FbMgC24xG+SrhakJygFg3QZJMw2fFo2lBiX628ir2ancfUDwtQlhpYnBkpnrRW6wXiwY4SYm5zgy8YeNYSPLoK7VeoVRji5uWrZoNrwN8sJHb/7cQkmQtg8VreJVoRP2ot8TW5wO6FhiQ9a4AI4Eb/VPkDa+6V+00RhLYodEoKG7Ue5wcyXvUCv64M5GtFHczM1NuTh0rGScHJdF/6C7dlWGlm3UIi+A0Qy8vTe32zfyI35JzW9jilCpVgBiXSGTRhqfI77vd0kg0k58r5BSoVXq3CCjW6Gs2vaIueNev+du7T9Y91HwAlbI/JF5LFykXmuBD7KDotdbJl/YTqDKhnH7Gq6O0z0WSPRrac2u30ZUcE/gXBf8SkoV+bau+0EU0OZrmuHDitQ/a682TfDI8/NcdBRqd8TKTfeAVN9RCH9ht3fwrfIew6DxsrUMfFRJ32yPcavKuyYbHpYeZDCOx3A8ttb9Iu1kGJeHp3JGvJWVdmoTPrSKMPgFmW55mBzbqkXZp+Cu6JAKCd5LqodU93SZ+vlUgJLE6rwcfO3t2B+QEbQ9jMk0Ikmh9FKEOe1eS48olJGyZRR7hANnumnLGN2/01CHYYrSAr8cRNZRi5W358fyDBm06Sg6VWe8K9+FCEgiCp5W4FSHP4m8JjGOQu+sd2Zs0UqOi6P/Sv8+mDao90enj2caNDlnjdixbNzLI3HVhayA6Eg+ntJwTHZpquKG0Lb4Pj7qLMlJN5ersxriMHQVaUGrYa04g3ruFZMYR15Il1ixvH8Q0OQOendeO48odh20fBKc668F/Hc4ZFss8YfpY/9Y12o4f9PM3iyh957KQn3nrc6LVfwKiLzx9srW5j5yzZY8/H7CVcS2MZD0QVoyLuEM9TXZnJ0nQldPHZBZpAnaE82Vz27kpfpvng6uwCGoI2NKs41JdO4ElesU3Z9HaQkTX6/6rsTpDHiowDGyHZ2kGEQTwrH3ytW3bkg4NFEGfUshwL4s3jQ+8JUysBR28QzhCjIWXm9hP9YxQiKvPZKqeaH/vsJxk9MIUKEZ4qOd8Vp/Ytx2hFOBj3BRwUJL3I9smm1xEbprdT5LTTmGU9O+/tuceg0ucTYM1VUn2hqnRZrS3djDb03IHU1C9+hNk7ZP5+MqpS1/HE1Ts79J87K03uR1b9Mrc+dXuL4npqKSPiCxN/gAqXPJvUyVgZHFumq0ej1PTj9E1rXSg6F/2V+e7xtQW1zHfWdkg/58Z5qxS4UKBK+VlbggJuVs/BtK5O9QeE2jzQyFwYrx5QA+d91L3ZhODn0EEa1lIgPxO/v1PDhn2uVxdY1xC+wXH7VvzONaL5s2nsUgaD9vtWMrWGHTeb2A1fQ5LQzTshVWQi3Jhlb+fUkHAhbw5oblmmMC+8J6wzFTt2yqwBPewJRoN0lQtXsTqlrbJ9tXtJnmJFhZJdIWxp8UKQJjvxuT96XIBRFgxJ0ayavAHIHlb5YxYa6plEO4mvVtcafoNEkaQ7TL9OibZqpHS3L0/yyOaXLCgD9Dn3G1nlXfdC7vsoO25sT60G6hWNUHqvd0f1O768WBMI339VIz0PFZiN/g/rx7eot+PxCRyFHNsIlT5HKxI6mAiJm5bg92/cxQonMAigQpFo3+7ELaDXLanP9IX9z3x6CApBAP5hdv16D+qIAQ1rBfAe61qo1PuCi9VEyn+BqEeJCzcuaERCmIiAzEBWVwmyE48f7Eu4nseVLa/9I/os6QWmQyuqvl4DQuESgJM01uy93qkfXX4aMFmUtlr1kIloZjEqBVSO7V1Rw+d3RWp/BQcweLGjou7JsK9Ahgplzi/GZrApAOOB/eGmzIynnWecsBiPKOtOjWzXGHod1tas/u8redu2VADwANPtVaSb130xuaZjihQmaJGHdPLYheTaaGxsmY1L5MfOhCvyAPPWwblb6vYfZ/En3FmEiqnCM6B/d5GSAlKrn8JLnUX+VucuPyG1t9R7v2MaL1kGDs1S5NsqvWUun4AS1NL0Aa+uYz+3QQnpwfze8AzsLIrRnuvEXRHwE5J+H+56LmEauQOebU/AMYvPSsrIfthoCnPDyHgKHNdrXMaoi46XVBKFa7WHBfPoYUw88vrRX1aPLBLHDBa+pkaYGozCiK6oQeOHL5K2eLqQ1kYeFYnBUF0WFpuS3SIqS3QUqrHd2E8i9JdmUV1GHZc6zH9ENWCpgUTudM6gTJnuYJIbIby8Afr5Y/nU3R6jDHveyq6cS/hwhXA+SmU5ns8HjbC4PqZSii5LqcpRnZn/tZ8ccKyZe2RAWnByrWCkNtzo7YSJH4F8CVnjENBFKvUPX6Iq7q+ECKF1EjskNPtk9JVVnl8e40uFqv7SjD9F4icroPK/smSOUciXDQM34wKiNHmbNCSsnKOhKkTP8PSSKH3SW/ExC8pKnRa/1JjJO43+Jdq99k9d/llZctI4rO0sG7UYH416n8y0tqpXS9v7LJa/azRq2YSESDtROdFffnPDUC+gAjbAZZKzhrsD8wBo+Ln126i8VC6N+k+tuoYig/2Er2hZOctwM16Gjw0CDWR3rqyhQkXjE4h98X55MMwkDep9C6DyypV7rn1VBzgEZ5WYS94JAWOmIQdQvswoSDbsVNduH0SupQQcT0k/9W8+/FFZf9HaJIR0rQk2HlbWkG/YdYsDCN3DAoWM2EUhUZFSJJtIr8pal7Pg8kqokuB1Wy6gAKVUWyDh/Ub5GAcY/tDwztA/8rvQ8e5ao+52WASmlItmqikFnaf0CiK+SYRRwn1mXPL1Oy66wPirpoRK5sQSUD4NbuG9jnuRuSFujhCnGtKxRqS6XT4NvMyu2RgNzppAINSCCXd+h7wvqhr2QSadYHSzYPGdPqnEF7bN50YjRC2g3oiDRx1VYOmoAuENnVOEg6CxEIhOcOgu2J2n9eMldPEZKsElOUJoRTTBiMSRLhIijBwkkud6wVWnCLtZfNttDsv491M5kaTSn6JAIau3Y50ATklyO3wqgo/tqCPC+D59VEUgn6qs9d9P/5s1KQJyHmPKHO7VneAgcss1h7qIQQuKmEP9Yu5Nk5Zb1Dy/MfzQnGYzoa36f/bYm/Jqin7CIP/WBNLn7jvXnI7O39NOLRCCPIh9lIpIwrWqMwH/YW3Y2btgq5Y4XAFVONzjSVTl72RMxm+tN6PMXDp2hpnF3jQOd3k0rzqUUXcL2IYi3lnwZ61scTA0A/uGDTpwbsCpObQQKmz7kcHZ9oQ3JNZnvl5+lW0cpPUK67323/Up1v4gP3ILpipYhyG4IMs1a3+5s66IRM9ablZ8g00qfrHFUj8d9O17PQ9Kxp9kasvpfw4kHlDVF91zM9SkscptgZ986eUVhjsXHju4pic3/nKLDF9T3ZM/AEko1uQyG6nu894kY+dtSzgflTD0CIjnDSEpgc7gCKA6osaFR7nZcD5icj8UF1Lq+vyOdMRxsriLb3ZwL0SrYsCY+4mALTDLEqAjzkwtEUOOQ2sRmPsc8NRo7mtqNb5DtuMzKbHf1rEj7f5zii1NwFOc/A78h7wT3nVOZs9F2f2qx+pEFVJmepjvxh8i6wRREdaKKt118JZ178uUoAsf7+ZWf9+4K6+HLbDjLjxOWwJ45DmuxF88rfr7tKXxzj4SYxZoA2fdkuIRwsQQOINUkMLuT4ft3Q54RSRIxIQGh+m7CJJMn8SnlLZV2cR9I9mVbTdVc+IjhXGN0+VLjPiQC8z86Kmm+rNlmfsCJrqfwD0Cwo6/IlSH/f0KdkCSvQxAFRT9cHWLJjO3Iu9V5ptDwdBP5BA6l9wWjheW1eTFa0mRcg9ViS43yrHKuGiD+erty9urt2jN8T15r4Du1jAG2SvMusMb37cTVXg3sF3wd7BuxbQlnqdqWBevd1iblSe/2j3rRoPQS15sLooZ21UfRZoR3HjNo8qi0JbhaF2H3HrkKqTQ3J7cwd5cTK8BvI/BPUQQ6GSXE67/hHGdsxHzOBLhJDzlgH7+uppdv20VP/VTbq+kl2+8KpF1UmAzxEWHize3pJcvRJK6F1ZFffDOX21bG0e/EM9bvgBWmNos4sVyG4kgb3zYRRrAwPbJr73qdnczI6f2i14hw28v/IQE7khPZedYuOYDAievMM3kia89FUkHvRwDGdP09k8fSfy7Q+10MSM285XmagH/hzo8eTTz9M1A4iSj8hNu7vj82kVOE9wPNjmwkW0SbGIAR3IJdwo5RsR+efMqwVqWbTUvIPxUjdUiqK9arpYEr7B+A3mXBD66O2vL16EbkqoPVxijtEQmUvJS2gdFGSzEeSZBlr1ELcOEXrnB5w5Pt3AciLKigw1XdOvbROTZj1oUdWW+OiiBhd3ipo2VH7rj1vDTr2FM+i++p/x+cVh5/eLQhx7k8C2hLg6HjLC45eZSBCI9L266mdbra60Z/Jq2eG8EIsHzcy0a2nL2hqhTuK0l2W/Z0w3yH+T/Can4Fs1Wvl+S6HmZ3NfwEBOl/cXDAhoOzg0GzrxriQ+hiDF+Mg2jFKZD5HjPPUznPnRjKReFtWgcUMDf5f7V5kJlpcsBGtJCFYDB8VBFzG1BKxgZpwoP161UqAdYUXZpfA+yU+8Lhs5XrZSPYpGq/HcQDaE4/etQTcbOMMxX7YhLMrIIIkt+Sicb2bGr0UEEFlHnOHNgDqLPjPynwBP5Y6KN9t8DFpY338vaCu1GEc2JCo4cwj77dt5wMRla7vd+WfXXFHmdVsN6YTJ5o0g8V2zJDY8IJ39/1JUSKqXe66J25ICopdp87pG2uvaxtAqSjoNBthRcFr+gts8oh+QVf0EPSQPOghu3+zSdgXh8e+xIkUKQZ+QEgMlvgZ1vuV8iq2RbTeDSzPZpICa8+arauGLqvdyraFIYW1aGmnzrBl3W6e4/eIGLFFO0P356oSb6NYnhuYoq1Fv2y8H4dQ7/l17oT9aPvUjNE1Z51UZ6Ve+Q6lmjW8HfQ3vtJOlaGpL7dCG8s96zK1af+FdBtwcKC9vViuKoNsJjeDN+beNPfNUw//946xB1Z27VnfWEH730sru1ulFrAb0BAvISNJUqDv8NKwm+h3oNm10bsTt/VeO5pSxSxs8j4NGVq8d+gBbY/sWgtq73mRktTxf7SqO8NHFO6An9kc2UeNun9eJqkBLOIZ3EeNPLG/Va/I1W0mx6wnSbJ/bl72BzGeChqefYvoA288DYZokHswaEVJvEZEewndhUtnESRmHCKLOu7ZWP4lKJo5vQZyBcs4liA/8bU9zsP48XjpjcTQ/peMe63lb9QPWw9tcdxxq3gp7alM/U/QnxrW02UvHGgRxvCDbuzIdek3j1oXa2ngkowCLeeOs/5YDolZ3yIWIX6zTrimYTbuH+CsDhtgTC4gn2U1RB6n8+Uv3S0Y89A/V3TmqeWr77HgDd6X448SqA9HjIbfcadLt8Pwi+MvP3tW/Xvl/74R3xGvQcuuzPMVDSRnvHBRcQrSCRIF9V3NeZEU2x2L+39aUwT1Rwy/R4pBJbFsrehXdGqd9zcj/+BF0RWQhCIARJYgwFxPDPx2CkXZzyL2A3yT9XTeMlcdO2nVpQZioQBU3WeiDeiC5cPCyEU0ogF3JVKRPbJX2BwslXy1IcZmz1vJFzsQwyfWNLRLlVsyKNFi/g5Y3VkSHf/qWYcOsXVCPUAq9j+1UU8D7hTx+DYzEvSMO9MSkmRJj2CQ5AqP48I0hcVAO1sK0vTksq+n1DYi0M+vVpJO3grrtPoDNHnhMlXmei331+YTMUg1cbWhzp+QfpQSi+nZt2qAOxvaJ2Drx4zOdN3uRPbzW9Oqt4jcuU2WmFNAZP4Fpvkhzo8oDFo7lLBQsWznnqe+DjRzgOfxqakdosdbWu0mW9vYIaTKaRKm+WbmDIkzGy56/t1nzpVp6DzW8lErc2/6QPYEXiDEf4zT/DdgCMG4Hw6Ln73P+w2Z98Npg//tIkq5f1X2SmPWDWZO/Dgnn7+H2GP/OGssn6cfgFaO89EuxvcAAHmxFwNErQUqIMkkcElzAnW3czAwb1cm8DDrCt/lQXdNnG7SUFCbL8ya3o7M9tyT1UwWai7AXkoYvvOdB0xCWHTdd0PLtt8VZ31+rNFXff3dQ6lSIwLrt1nuSBhnFQcvXtQ4K7ZOhTypt2rbfWQRiZYg5zm0UcOjikwPVrmw+5vYIof2WR3vLBsuJnHYDQlxy03XLldOJLLLO598MzpBQogrBvEui9vwBkHhdm/V+xxkd1TpBaNckq5xASrIgi1uNRdolI1Oaok8FJMXcpQLU1NWO/C+In60SEM5pbd5nbHJL3xAX+DG2AENVlZ+7HI/7PwUfodfZ+NPpONQH7ybJP7LNmlyZvsXG9Qfaq7zSIW4WivBxI0A2IJHlPfyGbboh+y4S1kor6ug0U/F9J43BBZRJ5t5DhmeyqV9dvgboDZ1wlDSa2EqDdldVvq4W7lohtyQC2ufeFe1ZiW4FE9YAQYGBiqSbAMEjKyOvYxewfcEARGq3l8+yZ8+AHex8pL2pS2ItwGdNkVVAEm9njXnbFdeXATVW3hUxjDSGRUyitFMHxM+aJFcfF0sVtrOWqpTsDIQ2cIvyM7sniNL8dK2Q0Gucztkgi/+8X8ZlJAphTJx5d3Nmpr22t+uaepTXzg/4QoAaihPyvmjUbm2/Tf+ePxpCm9TU7W/z9S3NO5sN8ibPJaF8vN2xkOr+vQO0Z/uv0woIAjoIelS4VQypVk8xNVdc2ripyCrB1y7fuVd8EuSO46oJHXPA58Gfo3QNZxFxV3MtZ0eFvajTmbIkmpXSDIGGycDErrLTrT04xABRqrczBN9iDPMzxAjTEzTgLxvLQcpHf1KWu2VzZOuRq0KgXlM0sKGebGeUTLGreFi09ZlYj3Nnso8zctmCYbWjZtide/ucCeOPWD8EpExkh4I6JWhucsmp9tbHYmq7kcTmclt64yqGY2zjv84fogLQoepVRJQJ2WINk+EWvYEvMT32V7Y3o81LzlydtLyO09AXogZlrYWdv41GgLxYF6m8Lr6+MqqMyv4RvZ8nCD/ubi0v5YB8GlRqc/pv0vP+GxOUAI2HKyaLvH/GUUYf8BJKGUY0NkGNFz37lb0g9DrAkKqpur8tqNEYNoF9/IFvWSo9/ECWZSxa5Kvg/8mwbFODaPAQV1mrVb+HtuzX6w8GnAmcJHn4AUlcseGioGfDYvAKGDNfpeOgB+JhcAjw8E4EKYPDpcDpq1WAfWDJgv/7/EjSUxtNqGMtQWO2huoTEudlveh+DaFPFQ0lKhVoh5YuFWq6CYOcIFC/6pKc60IoU1ASRr8GPocQcKGu1zprSgsR2HqpcaDF6PcCpsuIFWwv0Hqx8DKcfqxsVI3IwdMrVvkCB7Qvg1yNKuxse3xkL1Xq4WZ7K8lOFy2dFMqXsQI/CSNpPVaYPboB0eh20Z2UP0WxIy6+AO6GO4YwrJVEUuQgmaGAAShY2aQzaxxAO7pIKsix4lWI76IouPPLUy2QDXXBy3aqOHnAG0cm+LcqkkXZrCqUKO5AGpnFpM03T913cnzzHf01kwRh8/fBJOK9DCHLFjqU5aj3MNg3H2rJp/TJrnfpmagYcc4gugisCSU6z/Id4yfG0XIgABpYYwwX68nXPz+hXwwktRz8w9+53xKO+Uj+MMCRzIlm9qd3AQX+TJ9h2GI5pPlLHTTjtXm1jfU8rpUoP5LHSK3BUX9bLXPFeMes0c9BxfroDJ0dsy9CiBesIqfgU6TpJrBobI+uIi3kKdx9aHP98TBN1Fp5uEwybTz889CTdgXQDfKPSzqgEy1JcIHrXQlTfykFzPtvuyfBx87SOLxYyEdufJ+YkWC9UwMR2h8QJ1y0h2s1QsWEuQj8o5E0pLyMC/h6IPYx8fqprFUya/TE/bO5Fn7f2KJM9S0iuIMsLVkrpxHA+jho2CfLlm0h4iyGQIis3rQaAA09NDg80wo2Hku0oAoL7CuOpPqZfsXu6/3xs25iCn4Yc8mnKQDv+aNKy5AAobgxejiGcopYtMbp4oYbQl0HTkkezL28vgr3OwaopTBg2pX2seHcPq5jN7kdhyMh6CkbKFHE1cHswmyd/Z5qcVWC4htmvW+p+y4E8D9RyRj5+WuB3yrhIa4Jlwg+Ob+8rhAlU+0KCF/4WjL8GqAw1XDCl04zxRp1gwKfyg7o0VikcKj2TxKkmErPkKnQLSNZXRBJTvnaJ7+m5o5bqGZ0QBkkTYM0JefSaS/aXHTmDvVAdKp4Xv5qsWy8Epuo2sGQCvpDIDNu9qtflzKE8DVhDhPGHg8sn6ve4Lh5cAORTR/AiNoFwmKoXhzZOEwiZvzkgv1Fj54IBg5N0VcJHzFshILQX7nEJpLFcTlwfEke8BcCaLXwjNzWbCCziULiqW2qMq9qlvrW6J6VlDiFSXs3BDtaCAKfUR1dPrVRVV0eU1mGHUPAem7BKijNIa1LAxOCJRG2DtyyzBEhaGERVXxUS1ij4lARNWBjDHm9pJkOvF8GxbtSHzLwmWqYpfMx5y5d64XLivOXiBcqRzU2ad5zKc+SlxvtaGKc+N4pBxCpw8pLoVH7ozHnQ3fE8Z851Tl3gnLu0iQ5vJo8TeObOc8KTXegcBqV5zxUMrd5ShmuQuxSYud8OeAV7CaaCQObhyQmH6OxzYnFOk645OyLyIX6EufF/V2WoERRvztS7viWkdlzZ1LRLoGuh0IS2F94Kzeu1eftaas32DHLM6PMYEkHB5ONbVkTNwExKMiJPaRf/ao/9oFuUmz11BDunDY56vUyp3a9RnZrvgInPZyU6Z4/4yYXN60/J/Kdbw5lWcMuIpUE7V6iM40lnbR+Nca2GrlL6YoBds9pV3dXiNSmJu7hiOkArztA1hZmZzPUyLxbk5yJuTp88Ljveb20xjF9JTHFX7LG9cAAFZNTxPqnoHy86MZkujO76obaAb/fvTy1jmS2hl5LXXxj2L6dwdKPRi8+2Brhuim4Kcls2qd+SsmfHTatKUfkjypsh+FD+7Yq6ZhUGbi4/zrTe75I3y63qB0OzKNse++J5YL+fVKj/WPGFxGfwPngMfiBY0zSLFls7uqZ4tN3Qx+OtCTsDqjwm85aY0wkN5Mmo2OMmbwe0duDrRSFo/+bhTD/B+5h7SzfXHad0pqYQ+9m/MipwjpY2CTpodQpxk6w3OfzGYOcKfz/pin6PdNhNDDKB/B/DZvCPsauCvz5uhx9HvkO3UUVcRuk7sH1U+QsrfNYGpeBpm+1FkHnP4SREZ6+nWSm/ykkd/ReKojSXPPHCa7tKGA33KeoaczLop67Wm6+nVyez6/5yqdInTQavDpH2wMQFGYJUIdn0b7clpBBiu1gxPkncUlD3DGogSw+UvIJlR5S9avQHEkNl9sHMMjD7Bt2WRu3t09+7aWTm4vIZhxhNWLjnD83Gsa7T56aaEOLnnD/m62Abz0/PK48SpAUgCikEm9JIvc6Y98cooTCNyOp9+k55DX9i9I3A1i/yrYHXC6hdQJL/CNJswkI9IKnSJUP7hN0slnXWPQH1VDlttAab30WuGhvkrLTBylZmSwQgiTvUWlJiEvN7xzhbeCss2GIeVDtsg9ptNMgC6826sv9/Fbwn3v9x7SAMEBiFA+MCD5TZt+emNx8Srz2OPzifkMMh/QykXF8nWsakn6dZhg19ExdRKBnzJu7wItnzxB1Q6+SY2HvLx04tPavj82xMscpmi+Edm4mrQl5cI9pekMahrlT01WspRP6vfsuAxaZa49pWiGvsGt0bOFQDCrOQTmNvm9h0oAFKwDLg+oKRCJoygp42YiCroGrQtkfZoI2cPDqhGDBeD0DQzjkR5Cn0NnT0cr5z8PD0+4cNCfF27HwuwBiTZkuRhKswL0l0lBaJ/6CNvcntX3HCj5rx8vAizIvkyfjVh1bu7r+uYqQXvxpSuGL2ErQEhRWdXBsuhByLPpFrWcTPc81vkfCyxNrgOMlNIk4eMFJZnqzYlpsECzFXy3iCyPNryBF/SMjpCjZDIkvtaPa/4HPuhp2u4A1NhG0unVxQgAWGqQKgPuWrgItuSCim3AUzpMSuSeX8waHUAB/UjZPNyxiepZeCJW9zxtNndTaRueXKFs3utFDU2QtUlB0i0cqiMP3tYTdmMhIArNrE4j7mPpRjBbHEJKKEVPRl86kZEHa8BDm+tDs4tBx3KfGpgJcvHb8le3MGkcF8dZCAe7FKDhdu9R4pEEAaGUwud0D0hpyCjUyEUblUy1QNvJfrf17sGRth1x38L9Y+TXNF/rPCs2+s+img310nNtnkqye4nnciw+3octoSZYrxcKET9E+swgeYAYPmgCOpftHKtD+H2UFKodwuoILGskzkFj+cSitNhHDcZGgB5v6X0QF4qudVgqQKMgVb9yYc5wvW3HYWwWawEwePDlnmf01XpPOctLAmdFRty3jeHy0QnKAjfCtik64Fi4JAadoAQPdZuJgGthqxX3kCN6lOU0ySNatNK3sVJmUgfSMwCGwqqvFW1RcDa9WL/yBsiV5labYf0i27kG19ybU60SRkOv1LROWirbBZZEUFkXsBksrKDV3mMGmd4JOGI3skac2pF9uhf2WEflK2x6v7RisEYAZkyVTK0ulJOwnN9ZJ9kJHokRiHJSEswn6VTSjRHzOa1EKHjbwCom950jMZRWwRD2V6PDV9TIL1ItC5sJWTK2vS7/Q7B7Vf5xg5eAdrAX92Ks12MdNLHR7LaQojA9bvoox2Z1RVl2//2CCdipbVP4BGoIi6FN83Kb64GLzgSlv2m2P0TVHgEYH9kW5rMrDezqKcv9S0VBCvZQkyxmXeoF6RfywVg+Qb0rmmXp9Afz4CbgRKXpEb47jCIP5IurCCDAV4NxYz17Oq1CmvGdalN9kTPyQYN1xbAS5wN60cesWktXjJAYn4i1QAVqqwWYTAOjgdA207ecYFX/S4gTnuQs/SqMpJJ1sEjFfkRliLGHCTx5b7OiSyv0+MBItcnMqFKf9WWNtz29ChumY9qcYziol5/Z3l+yAIiSuVlJXajaxcdOaQ1XMNSzp3uovLk5KE4e38qClmvQf0QfkZ13ANXyNL6o1K12QuhNA0p7y6TLRYoZYBovTaOwMZr+auTpDyBjAxGpoVZ6/ipy8r/qfHu2x7W3x/+2lp2SM27NZ4XbFhhjNWhDJjruAh7JWQgyNRXXYqivvM0qhJpyH5e6G2MBhO+05udUX+Y2pn8AH2p9xdW6VW4z9+P+ImaONjpixFWl7Cg1jqZTCVAXimxLG9NFFDUtAGx5c9kxUauHwUULDqPH5PUkotAd84gDpwttUOy58OP+pCoo7SNEq6H1nY2FCaz1nXuas5d0f/e3Vu/RLBY40mcCTFsKn9N+eEXfDIlim/c9FZjEASoxNuaokMoffBXAyKBOuTw/2T8KQzTA84ZJEB8tFiCOmT1cQ928t3PDNb8BFsEVYkvrXGJmaI0DGI6IxdJMlJMsrkNXs68WgHSLzTmquxm8lkixJHs6OwDRFKEfJ9hpTvyOQYZMoczgwidsgsJwn7rEW35ljToVsRMoQIpUHKDLNdHYhMwElseQaE0THYuCFFl6PEo017lzfsXc05C0MkSPzlGAS5eMme2oew4qapAjjsDV4qGhOCR7F0v9iA8jP+MOZi0v4bvwU0aK3J+0I2IGAtPNUERgJsCa/pRPlSIPnfaAS/rNwMysGyzLeil2ikov6ZGHjSKXv9NUFk3haMFAZe2GVfpOq8J3B0hggglTO3gWcecG3fMxndlNixJz/NY5IiP304F2ZL/uYBsC8SwtHD4/xvCG9rBI7OdwQSVxkMZfdLblDQwm8dtNByGg2uXbQWNH9fMly39ihDIcFm1Z174AyAgwbnhARwYqEnq1ZqaYVgrWrhOWo9LAtb0lHsrrrukoHPTImGBwuKfjXAAvpLyuLiBsWCMAdLU1OvtB3R0iGr6AoWYzb8kit0m8Ca/Qv0p+Ut8WsQmL49eFIkE8GtaD30a3NPSaTaQE5q60EjLMH/OvqBMu1tqKVZ1IdWtszosLI0UMHL4O88JIOjRkhQrIjIej0GC9aRDyY2MjOLGFniaAywbqzm8AYNmAQe6oxkqzYCj4xFOkQuDdcB3a8v7ALSre+e0ccghJHsxAsErrsvMwOBGKr+7aN6L68YNLy0jfnStMxqfNbfanwzgl2nSM8R6HU+7E32Fkzr0C2YcBVGYFc3EnT4lSUo7FV4XlUdacJiv73KTeVz39MClQ04HdfEvx7f4LZzTr/eFBMqxsmA63jChpZz2a3XdR5sTsuxLLKTkf1FUOo8wIUjDXTCOM9TxYGDs+ApirvBw5GUg4B0Rpwt/ukz3JbD8FM/wDMeGZpmRXWdlIAC/kHUZDjsCPlSJoYMNDMYF8Gc8JiByT2H4ktoPh9hYQ7dmZDDOXfB4xziHw5HwweOAXJ4eNFHTZ0eDV9nGOJ/bBeH+1/wMyg49u7PABzR8r9jbmUOLJNatl7mI7DG+4484fLzmVLCg7wkjtoH+BOQt7vdvwWmgFHcYzGJ9UORSgEK6fktFB5HuAwW8SefMBirlVvrJ1TEIYDayT0fGeVMwYi2pxN29jZudisczvQnrRg1ap7slD4SkwYKLSYrmOvSZCsMeSREOBYbljvvedt+MhEJVP3ouPf1fllunpXdek0R32vvz0d+tvJG3tUImMv8SwIRKbC9nVpN37mTL2CkwilcBMHKy9GG5rkpZRtTOhGDYaGZMO+Lksqpem1AqYf1JEnNHvl/mZ+v7swz271iGiLUs4yYz51eCddZlMUVKRhA+KAwjiCKRojAxBAN/jaLzuTUZxSc43l2w+r6ZDUUW35TvwABOR+0JCdMN82Iu6g8M+LAa0288Xl6JUHSiRDyQnBpyAhEQJfAraE+FiWscCdCRdq0+eTHxR5YMJjn6+1IN2UWeguJUVdaIT7HDGWjf5xsUiIdljb5A2+QC3grKGqOQOE4ymYCvLWxemXTUk8Grgtl6hChk85FQRIFb3pkLXYjyMMABqcIkCada5zg4MQ1Cp1kolo2L7kvJ9A5UefYnRdpYi5AqIW0xhAuTCdacHxe17MIMT9epNy5yJ7sQvVjttmy9aSFKc4RxI5NL2+jnSHlRw0OHh+5dExru/c0q06XiJgKAnl58UuyQCdo5xRFakedAEuvYzRPUNWBOlACkCZw7qrJAMTv82L4i6QUgWh66OTN9dMTaCdToJJjulrw6mntoR7xZKqARJCHtUXIkx5dy9YiJDtP1JbNbDFnEjj1OTbNQ0fEp7D5/D5bh3otmjGJ1lOq+c2Dm4IxApStaFJTCrqF5KJtpHx+ew7g25UEGglHpiI0G0JS4trie4ghjmKWQnycTesYscn1Vzbj12PTzwUJ7TbGN2IkGrkWo0DggFmY2pdWQDud8ICxctaAmlWnuuhcNcbCHgUFQb+Z/KgNRZjYx4jaD94PIqKhOAQinrNne/RL3XU0rEZg9emxYpmocujhPWdiYbnCRtOndqbt3/j/yGGiDPA1ejaoZhQaEzwQKL4URzM1xCUej8fxbfKTnezGAlsGdrWSAo91GdaLHSc28899SzW4g0sJU/eVLm95S5OCMXL8sEYEwxf8Z/6r8ts9eHLgyT85oVgadmk8ykB1bRxSDoL+jf9rSnit/S6aYcTgXENC3wKFIyga0P+f/2g0MMxg7V+Av9G7cRaAaxA25Q5gjx4DKf8FyhE2wXX+z+Y5ebGE+KoB+MDYom6+j4lRg+aBPKCFsDF16AYyvDd4f3XUm+IKDyMopOr/4j8HBEX6ueNF4pJqUMhbQ4vDOO15GxyQsMEkU4ocvQnUwxkCjt+DryUrENJ+koYBwEY2MRT1MuDyhlp4gUWtXNJtGNShonm3mJJhr76p5Z/q9PCdf640Pxp/2gTyrZyUG1GpHk4pGSUK6qIkE/0x7x60WfwSPB5NC9JEkklPn7W8DbxUJShavxBgRTa1WhlFfRTL+6wkB+2XKZBAur5RZKlmztG9rA+zSsh9oF3TAQ4GcAR+pgLgxomEKLZNokEsEz//1FLDbv61q98CgELxR6Ey+fr0Q66+yr/+/0IkfVzKVcIrmEdS8GxstELC3g8JhniLKiEKPjyJP2VqciBjG6cZlwfLPR6ET3lMgzlwz3f+ev9GFbo2aAoaWZ9xewz4D56Xl7J6+jRu3bboliYKcYAh3YSzzcQn6g+3c0JORE+B6NT5tEau4qjyQeainx4jeuwJ9dDnNGya6KSTZ3WEfdkbreJq2BBpfOAvx6bqFcusLb1qbSjtGoVmqTMInZvfpJaPW8FnF4fN1hvLFP/PUPGVa4UiPY2GEi4gyTMfDSUPFYD7gHePl/Z8g+ir2r5hQMrg1KbSsxaNXRy1JDCtjw8YRnRYibsogSru8CKXflaRCPN60M5nRWPoWy4kzs/sKOIyhuALvNcjxQz8earn5sHXlMYvnOksydvFFkrEOw53b2iRDsj9xYmx4oKT8TR+3W4QFlVi50Wk6p3cyMOfXW9wMXKxKNw2yC9bUdbeMHBHhvqBep+Hhkpgz+Ej81W5EzGVQkmQSe8/5NmQX4plECMwitGhz6b7QZ21DlR2OETvbVArV2t+66xy14/psJSnGHYoJNU+BIJ4quSCBCvEiJEQRkjJKFVEYA/7soW7/WuxZ0HK2nbNNlQIHF+VvASv1EosLQHkeerbsIZvGHyIWBVBrA8jo4rJjTagW8ebN1MmlFUNdK2Mnelmy3UtbrltBw2ZPF1FaskFRY6FgkU/7REUv3oSA7W41USntV7NfGH56DkzMw8vUFLd4REFTrGuVHsU5r9zXPlzUs0mkpJ0p80G8CQUaUN/Gtd8qYqCZlUX804l/TvJlXHjgyNzXXkA7Fojh0cmGREbNDjuoUIXvhRmpQy7D/L2t7BpGckcZzWlO8QgWcShcX1WZmVoYODBwYbn84wZyMvbWPJm1U7dAoAL3ZuZcIj363LfbQvmEqM2Kgg0y6ZtHm6tpsVQceqOA816DvhvZebXy9XAYF7VjNET1wKPGWYCPQBJRBdWUgEtEv9WYpLkN+R8fD9NmCoYgZ7PJAkMG59TBSDApbCp9hNLD/uf6V7ECQq9M6pZWu+xTrTLX3zbGGbppJnpZMU2u8qpNvo9cuAn6gZziYdNaig4ybwuRb1PnDwxcqyTgmAoxZpLOkXyN74lznj7bmtOLMGi0/392IbXhCqJyIH1oDRlymwKvdS8Tl2f+zIO0wI8NgmogbWr5tbcGFopz/3V+ubcYgIcO5S0ITYyKtiYp/h3ngXt9QX+9smtgxEGDVwl8PwyLEDDMuqhkKiXlRLh6acwqYSNeHiDeS0d5yhCEGY4gQwjN8FIi7FDC9u6ToBIWPqzlICDV6f2g3NDlSOoF0YdvRm7como8E7Oc1mrp9IPAIDOTE1X2CWXoCNHgWFNUYiKPedAolYED8k9Es4qUjaouDiFhiD24NBq2+umz6rzi8O9ik5gSPssZCpLLj5U8YPxVKBRk7fXo/PmXgtB6gkKVG1+bubmR20fEcJVOPbClRpCMFwg7y0cyU9b6VmlU1xyuHFV4mAoK7jHgcNQPCkxzi145lqo3tQr0YFTs1fdM19PZGhBG8vHYuFoKyl3DbCJfCtXlLSiQrZqagpt+ZngzOKB07IBn2YaRytwj081Dnz/3DqZW5Nhk1FqkoAGztMjU2d4vDTTKDPHpO0afaAXR5XsS6tZ8x1RwIDWKC+05q7xktKU7fGU8SkqcK9SgznbjoJvGdjdhhPP8ofoBn7cEENTHGkw8xfnBYIaw6n21omrE7mbPXeriScYyJGZgLBYrJHpo2/A2X0Zw/bv5WWVaqdDBSE9I+x93pQc8nUpbkzhkpI7poCeiQlX9co3Fn0mv2CBqbT3hvWbD35TR6LDzOQj0vDz8HN04bf9T89+Wh9M0NmRcW4cnXqjkXcVb0SvEGtdCYePlJ+vsam1JvVHH9Xilp9/TFhdMjXPRWeiSx2Gp3JPL07LngXJzPw6deYCZbKN8JLmQHJcmRtR0++ZhNikEazeMA1hR84VMJFpWe5VItT5J0l1WJgD1bLXZ8ok+2G9hNaVEUoxz24pb90Ddfg2UkF97tYfSmyG7vnN8le9yu6Ab7rHVGItMAYDHFEvwH/8Vb0uH2VQhcZGe3h7U3Q4Lp7Z0X7zwiRkG4dgYjBOsstakU2n1mBVqVD3elJYyhMVOrZbKycz49x+VolIX9qt/MqW6VjRyBSFpsO3k2E0n9PZ9HY/7Tql1NxChHX6RjA+5NaSK4YKdJxvV+AMjVHuwpszYjMAQC1T/hYt1O8SPaieSVFLdDorrfI/vkHOeFd5nSPOFdcGKKL63bBNxlYzCu/yoK0WJZ4DCNvCt0ES7/h131uDsWWJo9vPgEK9C4coYzPk3bVutdl4DKvr5x/l27na8p6f7sa5ROf3aVmPaNv+teP0I0GJDp6TWr9iApYmjroSM5qzy6xxkaWBWWdHwMxlo71jZmq/OZym0zj2J86WlCXRGt0qqiMYRgge9bDOfdR+avzaFiDZnJftac4bQ2hF0mPHUO2nZERO7uQacGEyJRrJrJzjopUH1FSFjVIGilKugblkuYW7m5UdIIKFiV4XSmbmnLMAY3gtHyAFs1J8h4VHKFL1kqvUYkyK6byPLLAYZSBlEsrfvh+ZwCt3gveY64eVWOxUIj2enQeUWPFh/lImmtJF3JRpzzFkeD6FmZxCx858GPdkl4uSeF2fmavPSAdfQXq0iIWx1NX5W/63mTC8MdHN+A8L+R/NzJz8dP2rewlkYbWpL1BbE7IpsUYmBULtyuMrh3FQDABANUISWWYNIOTiLKsBsrz0aUBKB9dmSnlHFsZQFZmUBhUScnzJk0GLxioLEjiEkCLC188dS1BCZOzPUQ23cMKUILhDCSyAZ81mPyrXthlBDQMWZJo7KJ1kImoHVof5mVgGF9T1JgIA0FgDN+fcpboCmqnjxLol/c9uHXHSHbwMbmo2jvQ8qYY9nXwfYO5bwKLtTQOmFR46q/RO7nX7A9c69oI4VnSZNmpnzhkFbtVZd2IPHD5gW8zsHZporhqyPAgUOxKKkBRYYxpB7nMAZkrBq0MGUTMiewxiANbyZlMsa3VFUSCAm2CVdKr6GDbjmCJWRWCYwYq/qcms0mx7bMxgttkgcxgtaLBxRicbzhtesieg9yhoYDPD2jnE8vrkxRVhnB7jXy4o9qdhJKso0JZs3LNScNZ7y6AuY0rY9YAcOY5LHocmsyb4C+BJRsVD+jW81JRzG6gcawv7yqANvel/4HL8+C+c532tOSfFiw3R8wsrLHD2jdJ1imb4e8Jh3Rs4Y+2zp2+7Tw0HnHlU/9Hp+S0YweHQX+R/LZYtgqP8ZZbNussdR7NmnJvz1pvYIaAI03HMnDSwdgBdlaViwkSAJ3qYx5YyVX1ig07E0HCKZCX631x8Ny1B0c7vGpxFziTfujjwC54xezVj5bAehUv6U7DZ3tihHgy3fUZx4dxWovqI3zZtV+26ptGWYonmMHIY58UXNcYOEQomMJfivJ3KsOsa6sQ+Js7JFr4Nn9S1MATeyne+MnHrJIJCHtkSTj2V8Q1/YM2Cw2bWD9VRhZns2DQ8lWcIaEvLbCoLly1asAqDnKuHEpi4jjNU3ZOQagdrL0RHhGTinyOYYobynr+4QKXYWdjIrvYWan+vn6fWtbayvuoJvepLQP5PWw/l3mZYkcych5B3PgHwNXEafpk4HiwO0iExdmaRTWPRxvu3cgZv9w79TefQvuBMkpHvfoAAgt19o7FQtl6376cptm4hRIqQt/BWVMDhlINUZU5TQQVm+4Fs5Ito/Ma+xxdzQOe8j3x7M6bJVHo7TUN1uChu/QNqLWgdqph6abiz+lYUXDO8y+ddNkNJtDJL600ZcB5r3I3e31WvZKziaFreS0BCbKSIwR3BRGs1GCgGAIGQx9fpHASkTapjPsHBoZhLQ/+A9Ge0fyPYF1y7QJrYFJ69g326ezl65ZFPQEkCxYiBy5cEaiYZOCgKzGQjvRqf8iR3wUc2h31h0fEXzHYSyv34vl4oH2Q6CdbzL3mleHUdkqr8ss9SFrJQIssTWZADlwyeZVq9eLVtPpogkQXJxbO6cizrnTMRY0YOud3xDPFyjB3nNPNxOYWrWEtolEc4bMd03VHUQuPQJVzXXMms2x/w238aR/JYUSNzmCkirAXcemUaWSE7/yN4r6tJzByVs+VqbGw/dca0NFGcCv5vmwaS46M32iYcPY2pQxpS3So0oXhihZIRJShFXG6XAgwn4TX8LKm4AGJfWzOzlp6bV9CCgK1J4+Or9Q8f437NSeHsN/P/lqVVcugn7T1yksQjV5rFZ7VRHeX0U2O6jDBwBkU0y0zYnzNuwsN6HDN/FAdhqGykn0Ph4FWzkQuznUlU8PoKCcaswyxmmIqPCpfV8D/meBTEanvCjvDM3puRbbhc2wVL4TewvJuDoZ1Jst0SuD7JlfeibOvgGKrRlffNRZAm2mbWPOU2qOAt7G+ihtTtZg8xbaEAECEfnv1ZC53gw/aTxoTaU4d/2iwDlzYx629VN/zzDoq7Ei/sSI99dyvVJ/KQ/z2Jjbs4reccZQWSvikFTRly7KYEBB67KQKoFoOs5eTf75lQMgUYk36wmyMcnDOXX74rW4jUMvSeiPy+PBBqIZLX0TFkP8aCC2+u9R9Hb+haeEAtRi7J8rhLEb+4UxntwtQUL+cWXsoXYK42YSgYZley0c5XWTTeZcq3z/22axmfPCKqbxsU3rS0w3EXMc7DL1RdYhWyMJqr3UdkC3wLPm+xozhex7BEh6bsgg+zRfEkFdbWyyXWaDnE4VkkJlZ6CRLRn21+ZEOzIKrh8QFu2LsX8j5a79dSGH3k/3kkkIQmIjWRPnbfJTbZBQGFx8+VLCmuD2LecM2oqgY7Z+SBXJHT0P5VBw3YWve1Ct6oKFzpd8dAq0Sr6hWu1IL1ILy4sulOq9WnqwAXfB9rvMllz3B7qdAx4cZZ9Wy+3GNlNc12LCinuRh8g/ItJfpDUG8C0hlAhlKIHIYFxiE5fE4GAQSL+wVosJNDQOPmSnl5KOaF7Lq0N7hDWuMjqE+pR7jSvJU3oyYk1MPIXC4tO4afUmMSDDmSDCji5s6OEQv3KcFGBY2NfOg/tJx0luW5s26kcC/TQxHcSnTQuMK3VEkbm7QdcMVcRv3SOOF76+r9CwCuzUBPcZ1zYn1iY2nTC2sUtn3IFfqZTci+WP6ULpshOCiRp3T6+aw39GwF2k1vjMWPkDyv1f3B3MwCtu1nTZ4vumQ0JSSVFOnAcou0t+oQ2xB+RJlFrPuSirVIv/ru+zPTbmIScu/kVMyorGwJ8mLZxrxCSikownl11j565vDFoUvxXWwUNHWao+BWzR4Y6ZO5r+mRocXzzq8vOwLzUJykCWM8nUgVJrvGwuN7PYhRg6w0vaHYS3gJi/xONe/OiJaTCdUthaCJuUNIm5y/dGHudOPeQEAtdT1Z7vFosgSHHDgHdLFIsCTcNVzHc5ym4XYwinVaw3r0/GHljGro8vHVGmL30KlvEUfsXlwXzNoifcBE5wT5Tp79N7yyqq8cBu875BkmYaCUC8/v79oOQ+dzGgTK9JkFxCwxDL/cD0+qhLCAS1XDOVk2tPTrT1JjTZkr7C99qE95ORyENa/W8wX+1LRbyxaaPghwGFUAg4ElMZ/BA0kCkJo0Kcv4SlJltPK/mgHtoZpUdbOvUlOu+8dx7Mhl0e//OMXKBtvXXv2E8e8vHOWglWDtgFG/Dax428p2PVUJafWvsrBJNSBCS1SqAQDdv5MqSsi4IVt/80XP7ZbEWyKHPrzOXc36jiGf/YvmMSo0cLq1ow2Z6Bheu5kjhDKT61ThVKdxkCFauavNh/Tj67UfsQPOwBVFEtJgiLvv2Tm/nX3uwXBFK9A55JGh7Ni3t/89JbJp0mzLEPvyHf6LYaJ3o+ObpytKpUi6LUVHVzWgR5flJLxUswQwTFwz91vwxc3+YAYz49pE+J25DLq+EfXPAA7iMymPWjooMuj1BHe7movQtSIgF9Ko3+eJY0SEH++uc8Z4axJMmShxNysdByEMMagGasIBmEVacq4OsQomQmqn+NoKpnsE1GucfgyRs43eb98t3p3xeFVKx3B/jdQL61Mj0hfR62w5+r9FkjjgXE0DqYfV7/k52C2qfRzXIEsqZD8C0nCKt7uL9caLGUabpY21/LMeiUlYldL3kPyhDWphCfnlQs0M7w4LZpdRztqt8gmLNBMvO5KuqGPhZniihKciwdo1Y+t+hNhOj8bY5H9ydfBA+uDCbChFXwf3i7D4ANi/65mO3ODbfH/st09w7wyNG/Uk87Bgre1GpPAI9P6f+v0Pz6lpThVWLkCFBPEdRW35xQ2lWKqKwMFtvgSPht4jgh5zoAEAFsP3m80P/DyeU5DFExJfhWoDxxHIU1/avmprGJ63BWl/RtXb6hNRzeMA8zw9PF1PopQAaM8gQJp8yTa0p9m+uxTeDgKLstRvLtDZ2Z5XzQvhW3yXzJWEFebAKTkNw4tWoe3FO7D87cNdsfoDLV0Bf2gkrsuhayDk8RvIqwG3xIMjecxQtgIF36DOabt6kA2j45abq9OwYhgL4eqlsBGzAYY9PTkOh8OrU49aFwmbYmp2nTHpNcOFSwITc1j0ZUNeJDWHyskBj1PW5/94McP1G2yaApCUJZsOPcueiTekuZBoryMZXjeBbIx4j/1GdDQDodk0CWGYoC7hmAAfpGkOLEPAoTp9VbUVLiH7ZroASO8yQPYxzJk0E/3KdcnQTT8cPqy+BGwlX0WoNGWwu5EgNquaMRShwPAUNJGFzrYyV4bSn8wL7ElM6ksBj/UM7t2nit40LkwrV9XOA+/5wPvLAMp9jBIyoo2eZL0nxcDA3xtx+mMFkro6hmw6yPL7az7BYgk8jVxLRQdiRx8T+Ok7jkF56j5+TEJ4IEWp34DzGH3ygbSkGd4+PYOlJ+QbfaCEoayJ3W3ZE+nYFKceBZe2xYwrsqvBFyBIG5P0UDCFNBTwvWS/ZljamTAjSyls4mP3PEcq0ZlWftQ2DrIB4BhgyHLAIcudGFpO+tWKsU5NRlF9Gu4/wXiX/YUsH5iIr3pizV6iwPPqLXmiDMuM8Rx6yXc+lIzzzk9cV/kLQAY5noB3AIAOBxBbNsv72ECei/Vhwg+q9JBNpoCpsueKD0e4muBn6EvmHKU1ejJ6bE5gGNOAngoNntVi36sEKEbcC3IgiO7MjyHAfKi/3yRYUVsCBg/OPNsJxyGGYQVZN5f5E28IEFWvIXyobf2VdWQjWDyurYJmmM3xheumQZjA0bWp4zeITEAW4YAD1SsM4n6C6In/i/i+ittNFl0AsmFzUGtawPI65UH5EEo3oKYxCzWdiOUOwnz7Ys0EsOvzSJtkYaQ/TzXNo8+dG6As3QHtQ9wCI+Qe25upkuDorsNE5xTWFa5MmcjqjXLfwvFPE2U1wGwfDoDaDp/IGTYu1b22gM3DAU7iNWLbkYk2bNCU/87d3JvHS1RxiH1ytw8gAR/SBmUN+EASy2SabAdZKE53S/2wWQxgsOMeVFy7yxfnx2IGkWFt/G2anIbaRtN481TpaAYZvi8SETf4M5LG6W2/cnv1zqxkb8eI3xGZ02qwrgGmBsZuZMwDCxavQHU+YTCzz4vrFoH7udyzDmEs8Hw3BROWNkpno9YzFaTbgjMobwJzZ1PJDmJshsyaOO3xjKJqz90PPcbjbAqiPJ3G3tK7MnnWTt20f4ciUknPoeE9ODfSeJcV/DAnrL3ELWapkmZoHdn1Xv7bHcP5w6P9vlwxEbVFvjpGlgnL3x2W3J2EEX3QCjSj+KLu9FXM7FiEzBoYv9Skz8ZZysGsyiW9JFubVeGHeGHDBrJmAkwIDjlRuM1sIubeTeeXKMJYrYc3XxThkSt/+6fCSqQEbg08dcCgdSskbAtSGTI2YAd4MkV/NqW3O3/WnC7Q+GtkhVa/LN/d5lpKRWV/g9nnhyj6M4HNjIlTs1x3FmcJ//ViSSgm99pPdCrRooT2Z5GQci/MolRkkTjyQf8fuUfCrdWz2q3Z+IT/vnWsEDn73z9+UM1E2GtVtnKzZuU1Z4Y9MDGMXaFX4BhjWCNsnugE/UShxjLAkwU8BKvoKvE3AbhHoo8SuKEILKM+KOIhAGce49mF6YKQWzKDl75x+VT0g8g9cAh3RR2wEeO/W2kY/V+CP6ZdUGzSMgi+ojJeQ2AQ9Eb855F0Tzn+eQ15C/9PsRpMRsWhwXvTcQ/mVfKnEn5g5KTLGf3wR3PLQEDlelW2Z8RXleDmkp13wtWqJ1af4m5MYw1QedEiU6xZu86qYJx4FkForxJMScF/HBy1LaYyVhiO1FlDTxyY7zBu/ChIqcYzYUOdTM+aYR+1vFWLqJDClImxunguU/Fahuw3RzbGTprH4sYBd7TyRSsfJ3abw/qT3EayGVjaY+ocAoZ06Wlnn3pHEK4fPwG3GqyUH14q/jyAQJGHCotcLVRy5Td0nQHk63oTy18wz0rw7Tep1CuAzm82AwAwpy/Tor86HQHAWCFxY5WsDY/IRkgRG83/B5OO8n20aYNVBPHIpuO+SuNiX09Kj165dlggk0gqQqnXhJVOfCj8MjiwvHGaz62lN65tFyn+WuqJJj8n3yPz7cFsYBKfTSJLTRSVeQ9FOXY6tgJwR9lo7BeGucFc5x9+NRpqb5JXddJ+zPvSEarZbwnTJo3vmkCNqfQ43P9MeFlZjDp02BVfGD7/gU3VcuyHf7IJDgVRrZJ8BHTYyOEbXDs2oTsgO9/YrB5Bf3E+lFNTPj/isG6kU3y/9UENm2CzbFOdJyN8edMEo9QFI0nqBFONwqdA8MoJYojHCEUfx+srS8k1Ax1oyIlK0QMGdsyvMRp+6fSZPHn09R26AbOpXGD32T6pJ2pfC/yRrTu1A4/VDhzk+s4Le4kX5488FUOZ1H/3/qxJ/0PJK4FoBZmVOsOvfxo3Jf3bkuu8+BSfyce7WLid21FQ7RsD2/XbwbC3akZ5pseCXh5lGwhIekeGzUac3TvVVUEViiN4RleDGF6s2TC6WZKCO9eRD0CC2uDyMyi1c95ggNqC4DGwBQIxZORqIMb5UNH+AHeTEnWO1MXiIHP7C2GDXEos3jL2uMT065LiI4MvwdskQ5aPr3K+vq+GF4aAjsTM8HMphGBEZg7OOOfzy2QPmOxq3AYxy/xHvpLUkcPnc+93+UylQ62BCPkwfOYItDG59swE87cPgtHVX42EjghNWLareMwggoKOFsQj1hGBMZLVrlRkM5z6CuhfLITxIkxnpTJThArFlurxeERGbrnDsHjDfcyIJvo0hGFWtTsxQoAVY1ukF05zrWM679HNtW6zwnEfO0CMbC37huMV1cgavn3AF+oAsWV0h7Vk7yYPZaymN1QNzCFzXrtooIQjrrrKEU2yw6YGxBhlzbVvf0w+XC8voqPpKeLYviRmWUEpN9cMDkvCbd9J+Bal/JT9JLDO5yMo41n2mtalpPxRhQwqXBNhIeKHH8CkjhlKWR/MWNJb3WcOwVmJFFbULPuyLM+33OfGlLeLIxRAfzW38JkVPPuLlP0gQA1yRa4SODn/OAy0KgMUH3XnXOUOqaseD3GbwTf5xR8ymHwQToZmyJOZSmqSyPeW2zkFpunv5/ZT0WZzHTbPgyp2qpI2zmzKparvznUahpb33BO/+dJ5z1maz1goQwU3WpOsCm2efKuPI4s46ILPjKTqh5kcmUaBVLxI5XUeL/nUQjcOwsmwexIVbwzqAzMIjrCihKoOWeekyLXMXex2KjZZqfpgBW9Z0TonBbb005J91XMTac6JMPerC1LHDxr9u8t15PC80egKvlXA8QnOtVZmnH2nR+ETknfKDWBShLWF8Gkeagx19eWRXkkccZ7w+Dabw0A+21PYPMr8ACsQ0m/yhSDUNAVW7ZcisQomTBRP3EJFpnm4u8p0XLI1IwtjEtWvTAnAR1xsAs5EezQl5U+YzlSvq/um0TnbfaemZlPx7JtUkAJROGuD4yLOsHHM7/xM9M4O0+xp487eblaNGOfm/Jn2waIs+/mO8UzN9O8fqef5kOXt1qQ2VeJomSZtHS5RzOHANKPAE3N7UXvunzy84QYIqo0+w/hVPU6nUllmELSU5M1EnlreaoUvHLlEqho+9mBm0PuNp1RJSR4Oo1B7iLYCkmY571qKrdoCuo9tY1+esrY1wfHh7XjPnRaotYpgpgPKpwFLfXM+voQXnsImIOikMHshOrYnHWYxeODp4jtXgue7lPsikZXKOcvjYutP/kz1/umQnpfT0p4VLgVHob9MtcgNUeHP5rlrnp2H/w0gbmrTh3l0Y0+3zu0eeZBL2fN2AB2kcxReOodH3HGhHOAaFkFTbiuMLmaikntzaJT//7yNNbSXD3ogcTaiNRu8WsHCuv5/ghVEcvh9ZQASUvcta6hfXDw8nvMJwp0JrkwCTMHkXtK+7Dlp8EojovRG9vpTgJ/DI6mdhPbfXnS6dX574mRiTsbAsdwQz/+YDeJA9FlniI8P0rklQZ1DLGbKjRnnYqMNxhOiijDsfgtmbqgRohW/yqlmr7pr5Q3NY6WrmDSvn0mzTEbx1b0pD2dsZrAicxOS14SRH66O5I+OXTTk1WbjlCPfkH3UhErA9NQfBYTzoatCoXxHm3i7Zu5UvNv+oz/dM1ha/Ku852skbhCVuOUoPISInl4hYsGyxWfFVOccq4pusMq8EKjg+Xk3MtWHgGVyHERjMTFUua2eVERnhUaXlWwpWxOuYz9XgyTkLksLdnD/4KnlROs3VHwRqfFFFCo8O4V/rMdYFudOr7riAbpTLNi7b1DUZehFVrH3isnh0dhiGh7wmdrwnSWrGgpihHPyi4zG8yS2jwIGpqbuBLVSgJ4ouH05wl+WW2Qgw/PRxpAlnuBInTZtIyn9S9S/v8gGv8pAG0QRedLyTpB+6szYZGg+oFRil0L1YpsTy6MUrGFDHuP7nc32iDSgwOVBrmlQJFGhRhJBDWPc9vgFVSqhsvaAbWli5LRv55EYAzfrLbRpf7wv8my4oaEuKw6q4dBV16Obq6Xr+8tGSbsxc8UH4dwp3HUMrT0bs3OiuV1dHEHka8NCRM4+5sd1XIgWc2kZCmLB0VST7iJaSxRPtqyWijrS+/l6YDG9WQIjmsgTrljfr5Xv3Hm7Gt/AM9jYQKFnm8s08KNH17V6B60UVgw7UMY33L+F8NCuHORXVZeiA9YpL/qTNYSWg38jvjILaPyMfqZt9VhoQWpVKVbn28zG48hHjtQ95RSDn0w5Hkbfr7bjoW8v282hHyrbm0OvSytfv8s0nPxPrU2jQMgO+Jm4hdaW7r5A5s9nFuBsXyqODPXqXRwqWsBY6+wYYzXoto8RyUk73Nr/pto66URtnXJ8t0/KUJt7doyriGA8kPzP4P7kDcsCZ//9KqdyIcnyUY9gkkbl5+p2a6/gb21JF+yzD3cxSocWmsDnau9dpKiiodfd+kkNkVgCk/yshiQ8F5RTPNbASi8++u4Xsh9KIG6yq9q44fK34vhuSZmquMib6dg35Zi3j46gnhOht0XKlwrp2uaeVftfTFcy/YIH41nZ8lw+ik8QxzKVtxWQPcoD0eQlFdhoHqJIyrfRKQsfY3h+c3te18u3RQ9G+o8eMwPIBsqsm+HltCMjmmrvX03AlkP5Si1/54oSlFVQi+qv0LJnKwEQauFdA9l2Ga4LKSXID5wuuAGgKCIIBU0k3GCwHzx5RV4gK2ri+GllLPUt0sQq7eYXVNq4QjSivgz9LpJf9y5UlsbQpEvWHpgTI5mC3Ahlc52puVffBci9xqZphIM6ef9C8CBECsYghMqouEvYerbZNbplFxO+7BXdWrF8oXetucmyBjY9SCGvJimlzFfM5KQOD6LYMc2qMT/9w6RgcjUErWI9Gbc/X16jFyg1Sduq2ZwU4DKyfiwiWOoTDVShO/KhOkragDAyEhZf0CX5F1wjYTULzOFrULSoO/6iRUsKI4lI6potFJ0E1t2mAKkfEwD4Ta6Zp2oMA3DK3XogNq2+otAbZSg1/4Jd2f06WgW0fLuVC/c/Po27I7lIwIB61SJZkZdKasLK+Wq5U8xQ5R6v3GWDl39McMlPxDc16f5ldjMy8kpJ4G+Tnj/lB6enCma0By/MJEkD0tpdGj2z+R/0ncndiHU3uGYgjcbr0fyd7UiuVGKqrIghFNjUigeR4eLdwACJZXmxRCw76zsaQ1nMWAqXR5edttbVnAbym5vK+YNyLuabvIpKtFmvSPYHKT1CLSY2mKzi89niN6jcpvjKLR8q8ZrQ9b6ohv+h3gH9JvV24+fQe5tQL+OSOz+zv59xIdLoxQJwRNSydcC8lhYgBrhX8CtAjwCN5R/+PIhozpl34PGV5xsAaWHD7A51iRv1hBoTbWLxqB4xbaHWtXPbtlZNm03LuyXz1dZx71ytE7HbElTReqp1XdGXteTU2uq9rI6TKIFexPcq0eyc+Z3v8Eq7eA/NzxD0Y436ZgOQdIbsGz2RMhu6Bhqf3N7Kr+6tC3hM+gf3jpz0lRrox4djLbWX455P4olRAJsqBJvUFEd0Tm9E3kXvtNa/YIj60x3zb1o4KBfSkOYsVu+osrb02lE1J2GD3up7x1OnRRFNeBu2A1gupzstWGVv2uL1VjLAVmi/CdihoXMqVuxguPFjogaZcWnxky6P589pQGeq4Sm0VydwuOIajvWY55e7tTV5r67Myz2ROoCYjiQSiVEfd/cBZnJ8VwgTzCHGOnxGCMVmWh2FbvT7kWd3RCdOTiUBrVDu2Tr2bZEEYthnKdWIJ1LrsfR98/QQmvMa91EJLjIQpJIkDcOwSMfcbq680Jt4eaG51FU7CnA0Y0VfGzdz6KG4P64sQPJYyaI7nNsV1S6LGMxTLUf2sVyWub9EfBYO7H/xUvXaS2OCuZY+AKsk/FWcwUAnhwVaVcqwUG5ic9NIcVFcj9Kbq8vArpJkBSPCaFAADy9u9u4RduZHGDGEFVfiYF458XyTzfCVFYxxVGEb9dj7cNOD4ZbwHpk3wH7Q5OcE1Lww8/mfSZ5VtItHYfWEOayvhhFfAVw8m3mqNEYpnmyVTWoiw8fqxy3ah0VVdN1c8X4lZzpE5oRHyUwY2sEuhZ4fCRzH9oLjIIni4CIz4AUoR3DKCfpCfNKhUSy93NCxvBae8s8cwQX+YFs6KySHbopiobEjyU4MY5OnVIMHfbNV5BJEPaqoo3xcsSswU0eaX6Iq/zF9rvU6zMIjk8wGoqmSXbOT2NcokTsmzvnEj0zWTj5zQHY3V/fABMhvslOWdD2e8zyGDrgocFqDHjfH0waiASybvnQk3JpqqanjARFK4n2cKOLFxzjqDsbPIdz0bzYpgUcEC6eQlIHYvBYFHEcz6nSHnpSiZ+54QtWL8k0gwIn/LfM/tqSqyUN9lKmZOFTccZr3xFBoy7ptoKfI7POZOnWw+ij0+mP/G5vpQqCrq40CJnlqfHDYUpfYuX6/i+GjjkLVKgalS25BbG260nu0w6DMi7raAOhxu8fBR5bUIv6FyWBVzsN2RHzhjlNe3mXDhKn9sWmx65jkOXaYqkvH5Sp24X7R5OSibEbwBrqsqzt1g6fhif2IPaW10Xg7NM6Vt/gpJnvjgA5PZr5Hun5nAFsBRheWKIJIvfI23lfBNCTR7sdRsLdWPpNVhwWw4rma/EpwbeRJulzyxFmCg2NpYIctjWrMMWbauptYpmX5MAIyik+Yk4wbxCaZFznZ2wic0JZjgtgNFtBqZzuBl+OzHywHXckbWGWpyGMYcnowzUGEFKxYjzHtSnH0+jOS6rHG6ort1+SmB55bxBEbOd5dwnSTMHu73gMReRPKbCh1i6cklyWlv1k3+C/bsFqElifMXLswzTaZAwZ3rRoPkQxcrh9+P4Vso6NBF/wntKihsrGXOIgXFGg5qx9E/gjfuekI/JBtnoQwH0K17fE2MChICix+5dZH7Yhg1RYu76/cBKwgaH15hCFdoKv1yrNNzV4ukl365mr4Vu47gbFbi54jxhU45fVzlA8ksv5EN5TisVZkBq9JgwduHieHtuhorUOgPZhR5utX94al1/tT7h1s4/qGZpWtOZblxUS9mr6PaaPjFMMDyWhoopyg6nJiqqEtlHFlF2O5kas+vexJL46qy7l00iy6x8zCb8TSWfAaPV+3YVqi3TmDF/xdsTDWZpPr59fls1TR6uinZbnGfavcssZ/bA+tHWrBrtEt4n22p2J0QSuoC+QYyhVlj7h1FZm4g/+sGKW+VVs9UecFlAaDYOkGoL628PLAzfeYEhaAUjNYKqF1uBLBu8bbSSUCxpOv3gYK+IXfJluEMSrQcSMpAvbXfNF/pW7tCZD7h5pqRsuw9TFLgzv65GyNVyUJ5cUz/67DI/agIM28+RvesB7XyIsfRLKliJJNB0YG6b04rz6J356ubuM0FGU0vWpWAgiBdiZ5oH54y7J91q5bu5muds0Yw5YM3yGEsq0OeDOPjAPT6lcTaeo8U6nPBJxt4DaqL7hb4K1ls1n2033Tzte+1pI2jtDBhhKZSOZZLLHxpAu0KGL4k32jMabRr10/ZlkH4TqZjiv+H60P5lblDlrurbVUqWKbPM691CaOkMlRTFBj0ovwqfalCK6UIGXYs8XGbusjBfPKEBZQsvDQhdZlz6grC6zOmgWbzVq04lF+z2Lt9PxLNlhapJcuG87MMBF2msS6LDX0svxlXw9jogUh/uZrjEhDxWdKqJbGObTVUI0JyMe2+4A6A5ukFqeFhDc99HFg0smCstUSSD8+5QPcjzOdUXF8zhb7RU3DTz3aKMcrdOmVNz264vR7J2/zzMaIphp74/si+RyeorNv1jgkB5BSDsUHtSU7yf+yAFC/ns3LT+4GYJXUVzqTwzVhPowGt/wUpT8WpybOsc5mYRiYdkg0dkgqBDM5B1+LdaG5kUWdH4yaY6Ly1ZOGZoTvmt2pPUv/2Pi4lHSOMBXXThv65nhet4NCOz+jhZ+QeuIGK9vd0rH0GpdiBbTekNhxu+FhcfRcZaMRCN7YrfQ3bGndMAwayn3bWeDX8beTCy/zk57gtlIl7w35GCmUD4djA+/hQMT2OntZifyjBZ62eo0tOu5wLmy62bDtmGnjzXhRorQrNRzVS6YXyW1Nws3MsR7AStrZIQSDfT4VZrIaHWORhSLo2qTWGrJW7EG/schUfRsHiCTd9TqjF3zKHCm6IqEJA601uGi9722eTWQdVmwjgWCslUGAhWEmCroU6EBpjT+bUha8qbuodS/MFGzPRoftH/3fqrrFDOD41lNlfRgzMW4R5Ndxl9PegcMLcZJ7s1AmPjyN/hCqp7Px+4cTyizZvUAhO2ZKK6SOzOmtq3MjkMc+4dM18WTbUmx621KJJKdaW503Jt9QoPgV+KWh1nmorbCZ/DQlDvqHoWS96jJYKJ4F/HqNaqj7sMenbJ01pksp62M7LCv/GNwvcRokormuZuaItGy+PWMWsuCK1+WS0P7INmNe3fiUcGzlvk6vm3zuxuFcjyBq1l+Pv9WamvXVJtdjj5ADTHijVa+kD3A2h6xeFYMcl9J0fvWU3tNk1i+segkIsy1jsQeBF/s84fGLSfaUwHsb/iAcg4t7nR7j3WvSh7HVbHvNDcZH4XUle41S1tk1JNsgqtQGgQ+CxyDmSAx5imDgQ2LdSQZL3fN+i2XG0dw4N+VbRpVGop+NT3U4YEk4nEM2w5TwtZQ9k/RMfhoJZHHpfADAyP8GJ8FXEtX7Ws1miIzfAqAOpMMH6yDTsRS8ZQGqB8usRxG5/juNfL5JD/EVNE9lWTFzTcd3IOa/3fINXMA/BQARwevLf8wfBUXo2VGC2vB5CqM6eHrsNXwDf0I3rJWr84+jRa46CqN1VsJDDwR6Dtz9StF1QZ67QvUQxBeJAtPyPRI+oLpvyUcWrisH1YK5460o4bl4URukNyO0Sbs70M+NV16TgrGEVS2V9TJznj+nauxrr/vDJCrrfsuM4FP1MiT4VvzxDY98ydWzd7H+dTqxjoLaLAxIPiZcgUkzRyF+NmN5fU3UXB/C2MdcRiW9x1SuEUHnWMRoxAD4ylcMcxuqVb+Rj/uNvtZoWQb5IaeI73zV0ZpcdD0hiH2uHoXm16zk9zHB/roYN+pmRxCbXcNSNLVmm+vGbNkl6NDgP9TATQMpoA7UgTpQB/JAHtCAAiyu1nJBv3UpMx1uWHpfnpLQGk7oC2NI0hTSeX5tl3osx643dGYA9ovKHpqkyayXIkB97ElvT7Viwd//duNlCzX5tRR4SM9vigbKpFRpHWrrUB3iH+FsUMZCdF561tWffWGHua7n11Yyfy0yeDH6f28sHAsU/SKbl1vob8G+cxbbho3vxhmS8YymZP2O+aVcyD6RwZ4UlCu+0zsqHlnH+VtKmbTGEjj2L2wMH+7itZVY8YPXSnLTMSDTW2mJJffCJlpuHmaMC0g5T9wuWBFZFgIP1Y27POXjpl0QqaMEWGoElHpf7FcwAc2wsL2/9WAQT0Uuba7MwnmqbkIdVuvQUBQ4ppbB2vsrpLGXc+jGuR1i2CvKn04TGXl5i4Hd2oEA9/IeHAyXA9aamotEQkDiY8YqDKWlGfZzixc7GPah+3hjaEHr9pOpkIb+ZIEx7CDDbPg597REwrQHV3o9bcGC9ffu/yN7O7Af17IEmra4WMVljenKWwNDmMRyasaVGbWTpsTKnwCPQPh8Wlk9sWE2qRazEnJ60L21RPjF6MI7CQRQBx5z5Dyfu6asnERWkCkH3ugtQORTA62JHn7QH2ZAFYDCjUU1Pr49vnHdl7x2tnHt/z1IKZASPfGJM0AkhZJW6U+qgyZ6ImGIX8jlHn4olvOt1PsM9BKvH58RXzBDtwngsGG/58xU4oR/XjqikdeYxPEXWSPSmtnb+Bux1nhEV5tSSGabYrPNwObTXv71pCpA6HfUfYhZZUxl5pf30+4Hk2SvORyvtpQQq0Dhz0rDRJ9NL1GlsnQ+/wa5m3Ps+TX+kUBG998goM0qhWgZESPNhScbYrvzI0zW5i2FxAc6FpbbcXVPbqQQAscgNnoZ7CbxDVNOv+Kcwi6FzsCUS0hR7jAMpGZSM5ipbITcRgNd0VDTk3yvZUy/DViXmMGPxXcnDDWtVhWN4ihMDhUXcLIYlDHCwxipVMtgFUzCaR44JFSZThNfiFalO4HJ5cxFQ9Orsr3BKiZYAvt+oH1VAoptPGfeBX+6rQDqbjsGQao19bQ3XozbL3wPLILruDG53zmGRZDCS4FcMUIfO9nX89htBUhqTCLYFFlGww7E52lm2tvpp0HNRp/omCVrna4Wy74QSLLhe6WM2fasUfiiohKXHGs4NdjGKptPh3jI/nQV0BdwbnaqNd0uEfdgnv1xTmcXKykPtyNorgPwN/h6qasEpuNDlMXUnTQyzrgBV7KP9bd3vBPL7diUIeF/r9tOsHFV4KrP68b2sD5WFb+6HJyECRTZwS/1hP88oWBofkrY9GeRJXqnGL8+HWvjW+Nn+j68pHpovQcz6/IcNAzc73gr9f382VzQyoEAIaDDZSDPxeWjUA6XkZ8rjKQEoCv8BQDYjJVQ/R4wKTIhbYC+excGh6Wx/lrEnE44+s1h8bhY257srz4fChNAlzLGT/1yuwREjw7RdJNi+lT9ny2IY4u1z6DHcvHulfS07QgPzVEONyC5C8mu0x6J2yVXmj4gYiJ/b6m7IIDRlbbCOw2BhaSNgm7rncPGLsXyhf5SiCbXj1aZtr7bPr30SL4oEabsuJFCKicDAMILDMsB0ED1BTfKYXNVOLRCcoZjNMwSpWr23g7ka5Rk+1M4dbSCROPDjHlchWLX3mGO/xgt1lEYVK7ryN6UkwKVQav4TMKd7TpYP6UWjxbLCRSYtF2H68hEg9GYleD9INx8koPwOrAPw7aN5MPtw0FgpmMAe0caHNTKggWHI3zCUM1uCkvgWagoVb7xrS6seApM1E+hvKcW3saZQeo9ingdUgzzrD6P76cXRbq+qjsXVHyNlLp+xjd6OSfT7ejyV1DGB+ddgEdNdQDfVA6ub2Gn1VeGubBThQtmB96xi8pRrSxZ/dJeH0aCTGF8XB5Nrclaaf3yjPJ/JPUGf/HfB8QEPymKk4ge8zPL9w+aaPhVVta9fmMwYY9JTvh7v9/svt90329O328m2udD7ggJbLjyyVwdvbAa/xtHF78U9Wd3AWrF3eduUWzTkNTgOFayTltEo9Fj98PPLaTNm+rhs2kShZViEaJrDAbBh8opwF6cEfl/j47iwvj2tTp+0LD77bSEfxRjkLDtyXjD5gbqovngmbOgBVUBJW8McX+4ojKPY1unya6wdCGV2fdiAkf/m5Co4DWkv6tKV5eKyhwOSteekOVtTTXcuJspQ/DXf+LtWrwrusdoeA6vDBplwnxyVlL7oCWzfLlVxF8kBSEHS8Vg4/PwbLOkHx8QBTj7tN0S/6lgGkUsBk8ZHW9wN5EnX6/dgKdQEk4ffBjcGMn+T1H8MbMIaEUMlq6VPz7P874mIhPYyvarsS7hFk2atDQHcWZuVPBD/gaa7nO4TXqaC9B1W3Lf1y34bqMDfzYmen0OCCAnqnLjHyEPaWSJbJ/Fi4I+oUzEar/LJKi5doZM6Zq4ixBJvO1c4hktNu/xvice06dCpVg7toyAUN6CLmiMxvbbWcgWEamq46k+FryoADnnnAZUU9D5zEgRwf2fFJwqnvgzbMRUXb/K+7PjljHpLkD83pOrtrzrC0P02wgeNG7f7rPOMRFQ1NgWPb0kNDPsV3zrGjMRfS5oDJH9OhPn54ImON7xSM0+1U0fZFHmsXCgzIWd12Ssg0I11uUJp1OPH/S3cFExlNkfbDod3sQcdJL9K3mhGjXvuqF17lkX6TYhcXegQZjISYS/04Kek+pwwBd5Nqp7PjT2Lrh9Pi45DR3e819DKDmANqEfbYm7FFiJRhZsP9KcABNN6Jy1CqKFQDoHnF3Pneg08jEWKeNg1y1IORmARNvvO2IJHfc/K3o/Odna0snUXo9NtVchy3v/b6w9m5AK+14OEg7nZts3lAJBRbBFGPsdzjxlhNtHJeFoEKx/9ruc8Xd0TAimS8joEPuXjnBIx/yPutWk/T8qDtPJkh7pji81T6SJaV6z1bNOxkiKvqQFrSGL5IQ5qaf5M+okFCnNsnBnVoeZHtWJyLOVf7h3pyfW/30pkrRnZ2Zq6wLEYob2HSRe0OqAh7QJJOmlrnrMRSfLf231Ssx9sfEkzXku633ATsjjpPuD72UTsla0G/H/doYnjn7V6m4QWdwaN/2s+VRw3CXu8MEpBbvLJ8E7N6l9o1QEBTc864BCkFCnkFyErbGL0zDgmiVtgxC3vf91Eej5b1Eg7Cwo9RS8BuTJvuPOADna9Sz11A45bbEcBZTf0owc21U3052sDbJsKHv2Z1kBFt2+g1y+qCdZm1xiXUW2DV5zokd0K7UsyOK/m3K88ry2Hsjpuo/q5x3c9dPJyoPhJcnjviroj9TlZPqXzuKRWcyAN7ZxVwVOe9WDSJ1S61bDV+VTC8rQ4Q1DOh7suq5ZV4N8Jlhth16t5vZr4o7ag7WbjUChRIPSQF2LZzDYXpW2Vbemrktr5+d2PQ/lxIKOvPPSgWjTnkx/usFXM9T2F18MXFa6PHHvf7gqwM6lVy57N0ipxNv1xLDvShfUyHn2BRM7pSZBXpkKiZO7sx54ILvHQ7OIQU43wc/DxuZtTP+UX+xz+x5nP6ZEheW/9ReMAx6lhv3fqb65wjABWg4epIZkzrZBMeALTbLjqGIZtlQ8qRF0t0PUHyPnSVCqWB30QVTC4o261TawPutkgm7g4o8xAzvRdNH/8GyZMFkENiBxU/RfXH0Gi8PUtAuqLBDYfuIK6XLg9AWqdgR656qHE9/FghYiOEOEGmoR/Uv4jSXGf14qyy7uZTQTH3JbpWTM/eWB98ViF6XR07hhRZhw/THlpJWJacmb6XnLe7yrfC9ZR32J+VvvrDwVppv+Lj3TR2bVcLP9BvBRmphVFgxIeG6xRikoyvmfzigzW3U1UVsV9jsP6iWkrKH16Fy8/dvmgVjKylgVdLx5+AcbIupUoU/IJWFSrTzy2icp5KBtbJOug2qve/T1t+jh4UW/N+Nz+r5svOYykU7tB9Huzt2hc1mWVnUZWHJkw7AEjPcdkl26TdMGpkrqwn1qKsg33QdkXbK1LKjYmGzUCX+uZaoG5a6CAZ5B3omoCVwP/lic9YWQDuN/e2UH8jYj/t+xz9avDTSO3dsRJt42iDNQL0U0p8kjI3bIdR01VIyc3/TiY68nc84vgE8F6K2iEe3jNmPz2mxXK/6DOovc5IAEGO9MyDXx/EqrgY/7WGq3w0G12oJzpUQSozNPxWZwMxqpOAN1DDqCbRtF0PtAkCSV+P8tP3tq9c253/67zYeb1Ifub6aCoRDVWzaW6cFsc7+7Nq9RarwnekaWJKxn8pPDJkGnqsxbPTn/gxglxq3IL5ZlStkyYFvv0iUhDJIXVtGxybJQjfmiZ6afyfGZBMNtI+LKf97B3b9C9PfE1XPCaa9fi10fiWtQu7EcE/FlL0lGbWCW46dv04Y+iShZ1A/bYn96TLBtqT+Hm9JPsMbcO39CzHF47WL4wUmjnULvIRA8FmIkQMO57MNOcNHHNsLeVdf5h9Dci8D1NhLAvXQ1d2cGvZFargRiasSfkrvKkbS4/tYRv8LlEgeK9kd83HQ5s/HFfRBLtzQgZ4aUP0PkNSXWUMwNC+4/Z/MUQbzFU7KMV8HMQt+G5dMPZwi9wNPhY4kT0Blj+v+I50McPMkXxL2+G6MaYWrqX5x/lCvDK7/4EDmWXJ7cQ9OIVu3ECFdoT7357i6BcFRKQU2LUZ0ecN/mqr0KquaooWbDq8jyWj3YDv1cFJ2zyyjKUTiKmFnpCbJaI72y6Y0ycDHcuNi8P+hltk4yH/0kIf/ep184e4muj74VJKjRgfaA0ikBl+1/KPj8dsMupCFzz8eZP4ZCXIeErzPBU8k7L1DT4mq7UTo7nVrXZIk2EcWjPqJX8GsT4bPi16lGe6Vkr67JdY7fPymWK1TtxTV0TmPZONaI6vbydYvmOr5PFgzJkU00W9TTTxVmRS04E/dadg0hZ0o711L+SlP50lrlh2sFI1sVxWMyewNjVhzQV+C4sAXrYoGU5ksSwtoKAKoXZCiC4L/FPPmWtgbr0tNbiJ5ByKJKZdCxoTxM6NWDcud0WxFnEx+EbU6IbZ7Jsxfgn4XgsTG1Dhb1jcxt30yvLprsboh9tQZSioV6zqYSGkb3Co7ojUHkH6WmiYXUymYwbNyZEV0K2tXK6k23+uRZieRMxchWS/zakn4zdSNSSpZugN2rxjfpauuUUTnVkgJrLRj5H0ufbhLtf1y4qbA1XU3nUMbCdlapDlYxgjefcsipxX8hCYvHT5f7nhVctv48lxv/STSex70BHGNM+6ccR1S0+Pz4XbkPK1NnN32X7KU8YThmFu/R3h4rjAHxcNptm9hkj/AifoVU8NUGzJIxe/rrXzuAKkMcongdvvLl/5//byjiTr8F/cgTvKU8DwqI/wyaE7eu3Jslis8XqvLkPnB5ZToNqF3WfO985zvn4KXDaKgGcyfVNHn+cdYRPeXw+LQezmxOISQe+BV5nrTf2aFko8JpDhgJsbsXcfrhSbWWHHReD6sJ9Gw2QgTwkms+GGuIsVZIaKwEKLHz9UW8dm+x900mjKt19PGjH15o+PmAsP/O/ae0/GLLYbb1HoyQYfgGgL8GfQcOF4cmfgaaXE/51Gp+YzowbUtWsfGuYsX0YIh6jPNdWF+ygvH8SOoMOT7hGNLeWHrq+QqE7IP1Abn9e/ydpyVsSA2IINKnxT8JOIepHAg1QJ3sPtgb5Uxi9/fOotL+EdFfFu+p7x0bKZSyVQMDPHBCWSMe/OV7ArNyerKoCLElDYPISOw3WR5HqqK7iNV8L+bf30lGDXQCut8FHFg35MArv2AjA7BqOACcJQDEQ4HDo09n4C/LU7RJ0fJeSJK74fiFB6fHY774Kit6MHVyEk7NpzzVndBtTfJWb/nijLLHjAG4keNlpV0GrhSCkJi9jF/cpCJNlNaQjQLk1Nt5al0lmbHGu83VJKiuuQj5a7fjnALzzwwF5WeTdbmoCGBw245Gq+3XsLHFA2LkBdL2Gw6Ov/xyuByVAuk0dsEtAlCe5ZC1DV14Ett533xQuJHZQUwmoG4aDMJH0Pmk+buAXmWi5ZblRu/CMdbgALVA0KlwWpbQ1OrHhSyYGEd06s2NSdQ9yH/ZBTMy/tlOkCtJx6m+3/7DCz1wSL+hpVgHd1lQuZvAKa8KFljHRezGhl0ohrzGVOnIfE3qYGk862dB8uX6DZX9iuyWaPKMEUtuo41pbORzqd8A+8rC6/P261viHCuU6ossN/0Rfknw9XDbTdc1wm3XqiNd5CFNxkTOXvZCm+VknyIeQmxSLX30srurRUoVIxjfaHlxRK4/C7DAA5RcHF0oizs0YsiB+01q353NCJ8d2pXrZ0zocKL4jyRh2BnEGl5iFIGzyOfDMlAUYhQzTqcP2Dqu0+lyk8HiXVhIsMYIsOXTp657fvMN67It1MHO01t8pKXd5kLJ8SrM36tzx+OOFS7hs+cNSFQfwW1+bfegobfrmat1GzXbNPRKMx0Kiu1oEhjD9t58lwCtHX7wemxzs+k6vTs/dyWEjScB8QzJ35YQKL2f0i/WTfa3KeIjbXQtehf7gi4Mlhx7r+qS2uqxhMgYmGPYHmN9pmKfSOxOw03w/QcCs5uxQPk/sOFUw+dK2mvaY4odoBnOF+Aquog6utW38opfGSxeXoByzOzzVUSky8JvixU0kB/HSd0mNOsbcjZ2T0U/qnyIorNDcG+Dm/Es7sgx5dDld5HIcHdNsFJz0AKI8N/3SVs8Fu8AEc90O8wq1eBfSFyMzb1rz6K94we3Nmc0BiDBYWuA2XDs4uRbUcDaOrNnka/OkbLOT7jIfrhpPsM+/dSACEncbZE08Y6QHh5SkNeOkc8+FtbOQRMN2pwQn9RH7VTixGqudE/Pz2nwTpPRgxsXlKjwjhVEuPEv4lBUobAf5Lb3V8ugZQ3M+KAsktA/lRH+3aM9pqKwcgLToTn6dZ52uA99HdTg3scYHdnpNIISX1zlay0DmPCjh9pD1+so4F4S1rqvV1zqawsDLl4hjBH6wwSjngj/L4KPQmF8ihm4h3RzkMdA+wAqfhcKvxMChNIDwM9YgIFnAOLWEvGO9uNxd5F24yvpVatvBba9364nvxkYvBYPpYidsII4reX70HAuZNhkixIscEnb4sgbSVhCb6SAT7TOxPgWKNxmzuiO74+wwPc3UA7Yh1i3WFpggl07Exq8edORvyUunIVNQrdJF5Wx9WrTkrxlsmVCVtcyRIebPg6/JHj4sbsubTfznnrWoGHjGxRnqZxwWA9VLig3i1uaYJTNaa0ralB3wiPXdUSkHw2GIE9v5srQ2SHh9MPImxvGuNAcZk5VLKkXIcjg00bBoIvtUv483ZrMZY5II6/Zw+yXOCPvAojtNVt7CQFoYE5756DcT+T0RlxjeuX05Ur2HsNBXjSYu8tiAs9NdlkMj6cK93Y7KE4chOSnCr9zAiKWA3YwWznrQNPngm1YDyczJao4xmT3bSsQWn8xDhwn6PmWWt8dX+AbVJF/dwE7LRlFVsiWTTpHjdA0T/IJAeDM+GkEKGjt8sDERQ1iChXiregxIe5atfzHQPOdLao3ahu0nr5Uhpk3EMmrRK9N7RbI17ThehDxOfoysimNOubr/6k0nkc3qzn0nKiHhyCc+juDj0H/qkfAsYVa10TeB7r5ZE7dHU9nuzwtzGbUI6/VnIpb9M8scMkbi+pUHUwOKi8bdqHWdMK6ugn+A8vXyeF7GiWIlaEiJplNfhhJOzd1i+mNnj0pJYIun2mVUMaGCrAfnhf2cO6rKdza0DnpJBGmblArzxNwLijVHQA+tZWtkgE9Qac0Fq1WWxCjEOVBjZB/XBJNPsuygS75zA6ycHjk27eKpDEvQt74HsogXLONSGuwzljB6mUxOEwTjkpCh1ZzOZ4Sqaguot1XlGjegLj50wblfdiBujtvQ21MjkmPD9yzhSmnk7YKZRqnqAlwyIIXUiijExtZVeghsJ69ZVH2T6mZYTJkNQ2PthObDiyoWhIDEx/2Ls+J3jhIMdGGb4XccxaFS93dfgYFPK83Wdrqk7PhSUlZcpF6Kst+J4XfOeF3mfDZhVeqaUkNrAm4yb5UPvVBQiTKk+AfL8/9AUnzR6is9aSROgemqpoTlNPAFAQleIGt9EyuRCt9yQzsyOqNAD40SckUN/vKyOxHxw0YZdyxb2e1Fvdmm/SahS2KhJRlSqpofa53PuDM4p3Ffl1llRIGIf2CZgn78pL01NWzUF6eg1BRvsNGw8STCvYDg3ROghCuHqouFuuG5/GLCoF5K9t2k+Cn6DJc9PrZbPmUBniebeG5GEUavwLXS6Q1HPv+5c+CLC3K5lHl259Si0SKdD3aWyH4D/ZuqvYLHMtKnIh1PQGqtfhQ2xtIbNMupJjuq+7w3aGQntNCiOwf+9ql4GdPGT6nE7kgjNCavkYQweRZyK0gJwtAXTXN14e4JLJeyTFfV9R+v+wx4NI7XAkPsgE3uV+Ur5TrNiFlxdVqXFUYrOoDzTFZ1XVWaT38li9vAwOgGnATtw+gnv5VNw0vyisSOgxA5wKz3bWVVpXcaX4+UmUNZ8aowhf6x5YBlqzNlG6Hmi4ILBp4H/0WHu0GBTC0hVH6RrW8XUjYBGDvd6xPyYRZrntOBQBdy2JDyXql5+u7ePHX1xidnX6su7WdL/pr8EaYAHYIe09alKBHbdjGFzDVG1MQLcphi0Zc2fV6RDOac4fxw4+eb5UVJI02owQwld2yKEH5fdvDTSX0L1pPHOtjNNn1sNYJyWAoaoCl3SPkJtRyPwYSHpbemx9QsE4r8phzjtJ72c30Xqb91o/+vbivWbE+81xBVJqomUdpFKLVlkpuTezAwKvUr5y9tYLs2P6wTVWw+2W2DjY1VL3uQhz1XOY/v4PB2JSf/kzEcmPjsI7QVAIF1s1NpbBd0Sf+4pfxQnzQ81kFO3dxjNg92lSCwoG1yT+tj9WDR2iLqyb4B//86xPX35zhdgVCRKQIIQFIVHoAKnWl70HRAapRw61HVGXaoPpdI7wk/BbBAAeUviMAatQAPaKAaQOAIDEwEUdvMYenKXNi+HgS4ClvQm2RkFncHvbNOTia118ckKJMOtDK9lebJAoH00TxYImgWVQnU3fbOFhAOMwS0kIW4QZN7gbmvrP72XMC/96YsFd5gCXBm7CPFLxh0mvc0E0UByPNj+iLqkkL1G96s3PvH1VInBw3AVeJ6EwWMIuM04pebNYDsLGcE9TI3SASy8nSfCM/X3lKs5oCLOapleNdZigCLopQcfyqU2gI1St59fftjj1uLM80eYPlGZYfPtwF7hfhYprpu9O7fMJ0/h7JUOnJDMiyNn5FL2EKaeI62C11ppaAx0SzV4XueNd29hCZ/3lEJsyrIlc4LZPDTQ58+9J7/2T35sZ3r+QbBfDIeZJtacCu/GUjB3YuLLs6f7WCqhGG1h3FlqcU1dEmVxygECJhXZTyeyjnw+X8i7QgmYPWuFyv6lxdptdVdoD0Vjtwjvwh5xl/WteZNuzVvZbaqqriwJl6TpDqquLUWuWmMpNpAE5fO9pj9Kxty6gxRxF28OiiXtmlcGt/sKc+Kapl+lAybEY3A76xog3gsTPIyOfU4tXMu/Ax0jzyvkL1+NmrEn5m7nKwIB3DKRDUGKoSCRU28gLHwB8LNv0WYqRbIix+yQWBRxe8qmg2bW0uIGpu/6Ir+ZarZNtul71JUQWpGGzS5fcltr4PuxApJJwQRt24mi0NH28yXpMPouFmRCb0hKu6O5XR5tnPBttIW/qSqdT+h1+PcK+IJurU5xDPRRsnfYSXhw1/FLvmP09FXt2TjoC1Qq5C8LQDteJUTQ/jfajiNbwhlGl3ADIXU44+qfA0yt0sHMwpFyfFzfTo0Prt/74+uOAt1N4KQNQ5JS0PXPo9rckWrP1iq5hAlQ2ZcF93aEJOBio1oZvSiZxP4xDP4/qlCXgNqCC9XvXjWHU1M61ncFj0nLvujORUqbQin2l4RI/6kj8kA88TZw9KGB+FFkQsMFuHaL9j2FPsTUOl6YfHXOoDqcpvbGEyOQvzbJmaMC3hMd+8yWbxM6dKRlzDv4tL9vcUJDZtT1ne4ZAw8p23aMXMgNqT8zC6nVOoGT7NtUrSKbzjMhoqpUOc45Dhd6/e2733EO+oDp29LSI6MibuuycOS4kJE2hrY4WJuIQOUlDEhWtgj/Nn7Dx6ex7c2iPKuS0iuNUhvHVttelKanT9UxPNr0V78XHfG1mRZhNnLA4LP3Vkf6T7EupoSDxb3lTRSkkkYtLY6FL4JPjyQh6m1x568aFeMCbFHbCCZEf2OqsW2w9dQ8kCOm2syEHbvgG+Gkfp4n/BLTKIYzxMbJ3ZR5YpthJ48EWKK1DDV6nFIlIb/gsezHfSsFYPWLvBXFBwnfWyxUD9zYZRiT7WYgWDJCdQISFjLpMBAjyBSWAf6MtGrkGQ+gTJzi4TOH/vNq/Rg03UxM48jlD667T1chM2Pk8rZIrLRX9buSwfEPPBnXiFSgNjlGmMJrJF09Dw41OnixUsyhopYqwktuSpj1jq3BPUm9BW81qTe38rmGKFPCZLRPx3lVTEdS7c3lZwa5NYETz5Zdr108kiRy+QgGDrDJlYA7OvJ5ilLR6H9E4xhspBgk9ApwZjS1s4thFY2zx/bh3pcU8njf9hs7gAInibhjskFQ/AMiQ+i5TPY+3e8nlsET1ykixVlgZxsYUCtsr0OhHzFS2Hjf2zMwugpu0NE7LBU0SOOao66J5CninYgVHXpPA+keQh7JmkXNL7Q1oG8aFMRnh/5HLJXLOo1gDp8ICW5lPSYJdDP06Ke0xCynPVe6YWrRsgPgMmw9EVt7m5/QnfM4p7101gmDbYbbmZ8G6KT5lJH8mbMC3+7SNR0Pi261bT65vVr2eSTtPMgrwbiV3+XLOfF8+opnJSxvIuHIdsqRaJdOtZV0bBOUNu5s17WuabULx3t97k8WzlgE9PnAXBm3LTVB8DZAqfFiuy68S+Btvs3TSgyBBy74zOoXMlTzoQ8PNdB+Tw8gAgBGC5xCrhYK+Z+YVEcQPST9cBviHVWLAEtWLatfiMA/kUTmf1bFmnTjrHHpwMsO3zemKfkJO9XK/HerazzkOwFYWILGwqZCfaNdDcJbwaFo5LjgQgiv56ouNOJ3zOuiiRc2Kn2IwDpMaZTOP891Pl1PmgepxxqVV+TCUD9RA4EVfkLGbHBPTe5RpGAuLCR9A1qF/gr4A7ULCZinA042wITN4czaXZmdXCeb+Ydcxf+TPRUX/2JNyIaLjcTqcAZZyexmwrz/Gej5wuXQYIu0Demvx51TyNCT8Fkd4syx1vWRVcFEK0fTys6M//gG2cQLCEb/LfrRgDB2H9+xvq4PfaMLdgMBglXn66TEP4WUAXLMJ9u563f4Kcfzc377oGBvp7X6PB4Ftm5di1yzfzzhzrbYJu78XWpH01KzMCpiK5qmYpvz63oD5IMkILo+Jec2jehWaDtNAx2a4lurJgTJDpZ4xd51NsI1GZac6tkJ4pjBFK9jTOzfRvdGV4r6Y2Gk10oC10korVB+RuRFg0x6FeK8XYhSuFOc6w0vpNRAZhgR4RESDkx6pgXvvzruZ9zeOGrRhUf4EwTYjbpzAvSS5gEEtesFspn2HGU29h0ECtkBKs/EhpnTikzmS/rKOwBUG2yxaUntC0UIA07Ik+hzfHr8aCw/fZcb3BYU4IqoUzQE6E6txo+m3wqtc0DCeJHX+1E2ilTdUwXDE8TjU89k04pD/TS3Yud4pVVlQm5FlK/i2V1PJxiH1mdz35+/VhFkiIiYLPo+UxrLnwpOi7pfirvXSs+Du9tFaACEze64vLK+h0PkTuzlyLWENlOuZFMJBOmYmVdirFUZJhw9UmRaQCoJ2ehYvoiAaG8mjLLEfo4ICeMiE5DpSuBik22l3SMRrEg5AGP3N0xj7yGtVqVtR2RZw5bLWn3uviAFZQIETemIoNku+qT7BsYe4F7hiwpsBN80Ti8zpRFP3EUJnl8zc4mgMOZ/6IqJ7AKBkG8J/BHIOikzSuV3Au80GAKtfBff0H7MCdyzkAtT2vCOTsP7pq+ySKYk37F+kDbXT9vvqTKHJns8rprJN9aJJxnxC239i6A7EkV+mHgnAlIYVdHHD9XZaImDy/H+9hi9bNJIZVAeENGjIRWvLvBhPygoM1DfSQRq6U48iGgQ2Zf3HubkbKjOFRAORKcNelvd3UTya/fDFsQPRCax9ziVEYLcz76QGbf/CvP3dtbVnjuuUlSBR0KT71yLvdUuBLNsSxrx/F77typypW+MQy7QOrUeBLggthkHpDM2rkN4x5AY201RfvniWyV24OCmOcQJkHNeT2JQsmPevPfzHv4dixzgg4t2v2YQ0l0kLJdYBHh+JgUaw3kHPrXMCkSwdAVJe7G8Lknaqb4JuqEef7Hr0ZtvLH7iS7BoeBZm76BIZpxKLyM9Qvqmnx6ZpjHaYdx2E0jrgWateVP78y3WYHQSpQ1jz+KW0/6Hc++r69bSUHDhp9S2tA1FDGPbM4USITUfiBjYhib+QGRF1RNJljZgxpB+dOxc495kp5si7QK8ngOhkSGwPnJNfGq1XO6uVr28LWca1ymlF6qE+tQujl/NY7AIsFNPikiOoRwXozxS6xpc+ltrJ5FKGonWqVHBBT6rAgRzO3HcULxoASMIT8GB+A9tP7nRu3ubffKXwwbr07FSH07imabxRt3plbUCsa1TDmDUAjB4UWe6Rs1a21MrWZG9v5aImWdIZhdNl6tSMsJPCo4SN46VvkiRecKCW0OFr2xrKA/o4FPBNDXbJT8RmfPuFNZY+KdK0epDfKohy1is2LLZYsg9s1bX7TIIc3c9oaNFbW6tOujwENWM0ZgTAX9BT6iGAuae/fC18ARBwfKqKYt2O+WWv3WvEm3MSa77UXAsz6FwfAKs6lGJIFBNP4+LvrId3M4K9Ec9nm2H5Q+j/UfpO1M+iiMk0W1E5r2aXgQC7003xl+k7CCCuWnG2dCo1VXzKF8wRWfzJx8gEcvGtljpkDMF65c27cyE9YD1+9lVHb7vRYD3IoRVAelQR3QBftprVxk7gAjyMace2Aw9z/6pgOg01KwkDYwMY5c6MhqZqRHCjcqRSHxff5/FkmU+88XZH6uyRGwSg2a9y5jQnXjZU/gMIuD+yzRYtibOGb4rRFRLxFyVMPc/oeR3ITb861j6MiE5WtGY2V2Nn3pru14MR/xCmbn0QYk9OAGQVx1DFnZ3C1OGJCZVUtYwT5ecPX6ctHpqoDlVnT9ps40FnFt0eAJ8QvYi/ipRvPZph2jyXs13iu+e4s0usJ53sdcEWdSbdkCC0kGrI58N8ZEgEsuPw4x52XRnNXu8z09FILByavk7nA9WtfUnIDnJ5hN/s+kmGLhX5zygtv5oTLb8PtjldVXeD01VNk2yvMZ8jYS5oMwEuXCgA/uTvr/tI2sQq5ovu7BY+rgLFc0Rgk+EHQi1NWH73xxXlDhaHM39IkS+3qFOWlVlUMUqj9ewZ79i8oK8hkOVOa2NVTFwHVxZSEi0xATT0WC4IVKmtWklNsQsyMdQh6+QvzIW9bpwS5x8vrXfqIqYtwXKzkvJDlCskXstwbR//mGY3A68g75M+rmI8dFv0YwM2M1FVaqNvdsJXnkoWLwv6ednkO7ixj6yaLKA4MmIibF8gtWmK8e6GYvzbdbchW1fq48UQQT3JE02zhrAxqCH/FY/EGub4/c/kb+XPtxv1TziNOzpBDTlBgi/daOFjom2UyEHCsxHSrPFBc6Ypbw7DNN5HlwKBNrqB5V3jZKi9jwoKh5z3qu7evFDxE0h87YT3NfZlkwqQJ91oPz2C8A8dsb5JWpRK43OiqbBjSzP6sMJauZZq68W1xivOZX3I0JB9UBOSGr1Hz5H9GqJZal1XLmILz8iqOaLse71LlRNSEAGetYjxsZ4zZRuYUtlNZplKgxE63CruJ9SsqXKRYg8Og4GJ2fdQUrG+L3EbI160fJjG6FfIW1SKBlGdbrI7Smo1jPPkSHmbwm8BR3DOQHHgJovfGe/0A48uhq8/uMFk24MKpc/eHGNSEQrObdZERMafvT22WMEpSOFwYf/f5jaC2i5fTGSILAlEG8kGXnuLUl4VxkkU56mz0jIdKAm/ru009oGTZU7HWMZSo7VCdO1UjKA4CIi/CbR48WYtTwCR45Ur4fIvvYC7b7MMAkfScuTbaJqDhMWx42lQ4/T1BdVG2yuL6nE0Tg/HkpS14ES9Q6GLL3LFVsijhsWnmqfa41B1pCE9tI4QHupiYnAG4wrtdgwnCkbAV4B8KwIhvS2+YqnWn5uGTwHRWbmX7tU2I76wl8hJAWGXKOYkDshrAh0+M6HiPtHya9YGIkGAJN31Xz+Uc5khIPKy2kaz/oNS6wLZbLCi9HgAJonB+jmj48W0S0YsBhEgtzpEHW5hKi+RNXYQmPud7MiAMKRescNrsqi/U3WeFMUYsBlxVIdTXHfcDRstO1fQqMepXmad0At/7aQKD6olByRVRfD2dYTwHOraumrF23+bYlAd2U5Ni4/eTkDzcTJOX/+bvhN85QZozBaIwkrVQFeQV21Ea2LrE3cs4fm27o/xBMYxjBxCGcCRao8W78IMUjshGgd0aiIqDQAOQIvmH5iFvqVApDZgEB7Ejxybu94rCXp+bqZfbq9insB34ndUceurw7N7slW3JJTkqFCGDj5JZmTkS7flyvqKs68Tqb46QyzhwOZ7o28ShLlRfTMtJD3xwWyrH/ZuSxyQaIUJnpmnzq066eOfMx/566rZaIt4zGL+6CrBXLaXq7YFvf+zD1F+5Z+MfFYVoBsjtA+fLaw8fTwcKE5Wl+qT39EBjB4/jteUluFrnxMAy9tX7dQxYVdssv/x0f7AtYiFvECXsVjsZoL52AwmDbd5mIcFD0o7BHFTgAwB2f0uCLr5dfnsfb8nNpTf9dTecpibb3mSr850iEcn1bwc6i7CcXp2r+ANmjQQAQxdQZ56cPg1MXVCmmQDQt8I4r/wqbya/JwEHsqnAZSRJcNlzCrxO3+JPB8mSQhzersE9aOrYCht7oirMHoyWSef94fEbhzoAvW6E1lcph8eJaVw1XXPkcg+QgGWZx5weuh5Wh9s2ih/knL9+NcPPG7OJFQhpS+Z0v1XL3xuLw9ss3hiefiGBTS4DhqoTBFV8y4neeOkDrOlX9TmnR4YzFkq3xsgStn56LRNQ/fnMiZvSWeqwpN66DgNVDyIqwX/3/UUB4nvWd6EXyKOtk1+lvDR+qn9l/abC+OsurRa82Mli3xTeRCkmQiw03chasjovJ8NepCWkFxMdWUhNm8n6yXeEtqnNrveQigbvBlK8VTEmWSmYYzU1dedb1MXTMxx+/P7ClTktpuJcMxzfw1n9E4zum+5hophO1WJ1vJBjxWr3peqHT1nqCgewl2VzAKS8ieiXFPA+MAiuOXP4PmgEoMPVrdlfu1bQdha+rH8m8Pbnh2rWaevgcsrVL4l7oMjLWieDqdHhDIfGY9F2C1Jt9+LGklSYSp0A8stTA2Ow5L4bD3t6xoS9PJP/cA4yMg5xr+5reBgVaOHNfMpM2CtUCJ2IH5JB0qnbzwH9hAT4+FRLRc8PjsuGM6p/aFscsRz0GDzFUSbJj75OiuAMhXyIyNZ9ThQu6c3NPnIf5UD66qPbxzRjXlAitc9VvXLnPyP/6ilYwRHa0eNV9AkCmjMscQ2lllgB1GOM78HkLqH46vKZiNh3c7oXeXWRzqJab3AOgYxXexpytTXnrwOLhRVOBEW0ldQqXd4WsV6PwD5H3vdyqp1kupSh5/eg6KBiZUG2qcBAdzAMdxwMDyroUF25hLLuNEmo9r5xnCh2ODrD35wEPmTU+AdLu70WrT97fahXpeUOXoiwDJfeKqh8iaJ1hvN3SQAHwXCgLGAKetzAjbBdBl6HAw/52mMzgT88/mbROZJO0P2H7+yyThSumdpF03VkTyoiMttc9qKU/Z6MB8ce3Ub7Hc5GS6QlrdF6bT8zSqSz4A2nMnmE3+4QSMbkPgaaE3lEaXs+4ox+oDUbK1vou0ZdabR99ZhjMpWRlFZmjUuh9qycQdES3FickOYP8kQ0mrF+SDBzB7mLqtKq+mYmH4eODv2v9cxzksppqO7PkAWZEXJ5ZLCwfMW0Q32FeczmGdB+XyylMn6jGNtUrKt94fpadH0V2sAZuulcvzmnviJfvumnfpP1sAFqcGO+flXMLYh3/lvOF43xUX7fkbJYgmclkv/t2+eo3pBQhlCwRevUAlqtCjKM8ucQ3Xgz608Qm3z37VCti0Lp+/2YoRl74f1gAivftOSo9e3lC+2eOaHjT67xjtVAMB/EnYXKmn16PvWafUbybioguI/b/Q9cEcI6tegUSPie1Ry7V2HvZHir0LFNiAZE8OqzAFuSa3S41u+K0Hyv6Ujr7MD4ZxV+BwVNzwgwHXBDVe8Cu+UYUKCrfNYm6M2g39jBmMrTVLDmkyNvCnry07wddTg2RA6SCamVw1sAxR4UEX1S5TXeA2/xhvPKsFnJj3Kam9aoN0KUUn5ADnmgpSgNISkDlYaeTHU+GrdD8exBz3kyKnBwt+CQsjBQWBfilv+wmDJOnZ227BNjr/kLHE9PlOZl8bUJJ3zGAeE0Bdv4NQU1Sw6D7/wMP1ZhPmUUUiVYfZ+tFjDrO5wZiu9uPiy9zpuNH7+rKMFHRSOq6gsYpX3d2KjWQ+NUarMSH8gYTyvjApG5NXUF14lVSaEPTxLdwKJJ+QO8swmDcFpTvRl5+SUHIAMpmNSm+H45wY59inKOdfjDN9RkSlUjkINarBkksNTdmoKsYTElvjYnj0Acz39S3nEIaHtLRWIhAtsa+XFGTlmrmFM1Vvam0MPuLI4mO2oXw9LwSonufky57ZzOgI1tcFNIZBekM82Xdv1N7OmO1S4jA1zTcPBdmvzk9OUmnIaCSk+EaOGmojzJkHTZFwaWDYCoHDClFzKrBXe5j8Q8QmCQxvhmYHbN8CPRqsRLnavl/mwjpcaELwzw76iSyqVf0oyXxM24hi/Fi3M3QraM4noERTgxCWBw8Hv2GVNKONUj4J7ZKuBiFX4EGAO537+mWHE1EDJL4Cgha7S7QrTgGvsLA9dSX9RudD5msfb1KyvWhs350Ub2USYVq/F6FB3BRolhVkVIf/RJEGgXBZruwAMT/Z6hwCbJf5agXm1Mq2Kvwn5wQ6O9G93u9H5Cr+XNTpZc7n2OKhnKJbiR00DqmmIpZ0K3Pi+EzFFyKQ5ekQLKVYPDptnhdvKRtErfhM29u0eNlyYLsQ7eklroWwktHtm4GM+I81Ny8nvTogo/9eVPh4eHFvGyWrKjOZx10Npjc36iUZwdPHMnK0cnVosehI49h4+7hvHxw+qfBiEB2pelUkv8S3NIbNMtmxXZRoCHkqS+JpSvs86KAFI7atZRhTk/vIFyffFifpjToPUj6Rab1hxtxzmKFqdWoERR2VARZyjnm3zcoWBrYZ59WUMD6whAO8tBmCAQ8McHKAqLEdLJFissSli0sIyECcIiBOzyDgNeLUfxGL+mckiCjQtOBIr8YnnKamCETx2PU2pDkL622nT5BVmvOR/2touQWlckN0ue8Rv17/8IHkzn9MBl/rRanB2UCbO+OYlWgSqGY2jLP/9wFaPYwljd/TUloPMQi8lWi9iPA8s4vOVoDzggZ3FAlhWmPSCis9JoEHmmRqPq7ZiISU7GCN2+OATRRRc4cN5Xmx7euwlWW3tQOMzNXWGBBLWl5fZSwn1TdDxk1ds+kZRoeBCNvSrUbb9BoPJ2a0wZCK2dxW3YlK8P5VeEsgOnV/UA2sZ/RGoKx5J552euCFcr4SIJM7on+1U4m7hqWKNGY5PZX1Ywi9zgtB0NSkeKFMC18u1Z0wj2MZMWPj0hSUZSa/s4mnR5AXdODis42ztKmdmP4SmTYPxuYty/QRX6BH9Wg8XOcA9u6BXb6/y+1aB9Lt8oqOTi7tyr6pj8fiFtvN4amPmrQA9w553hCDtdHnn2YD7K6U/X+i4+M9r6zOO7rBQNR/vLITm7HX5xgszvr8xTfSVF4t+KzKoMD9Id4jFNhEoCKLUUtEeAgOwx3qywl0mTNpdBppZrPTzIlBTUzONIDbvwV8l1hS7X5Rqu4d2/eJgEPGCCQaBLQ7VCxzkJLlA3xnzg3/fFTVBViy7eIDeHq8YQJx49APlJH88He89c6wtO2EMk/kWdOLxDiCyKygf02S36NbkP9yswzlM/FV+IDZ9c+4Tw5hfEA9a2AWx9taBeL7tYQAKK/DEf5F30g2rbHrTdL9zJBudm9t5i+L2sPb0twblpgt0LNBdzn33fipicPbpD7Ldntw6rGzVX6a8LGBAusaQkf0pW4WASfMhOlUVcWr1TYaaQ2qmEe2olPQFO/bM6lbp3VImo/FZ8y3jF6L8IuJYdrXW3E8nwidU0WTnTsKE0Vric67T4orseDTsC95v3qVcgf7ZCBUByJ7xpdVWJzXVRJAJEPAKnXieerzSVOBHHyeUoXURciiQm+mtn7SEOIbCQWThx/1ZDkczSxKuoJTEZms9qTsWPWWkYxHXBFXuTb80KWYVtWbOQg2y8jyNYuzIZmMGWPuNOMmxQlxmyMmEYbQM2eLHfsXcEAsNY+/7lwyv2rs5fLC4XZiOuMlrp4S9TJZo6H7OpL5Rk5SR7+lr/K2uUja5XDeIs6nJR6DIVjprKpSrGtB6aAofK9Sb92q6MpfdI025v3F0U7WStiJzrtPFkDRkmfSs95p0t1z23PH0jojPsYzOQiGjwTluoGsiakW1jqVdfH2/wYzXqKgWjny4QD06nWUhduKj6EQFCUimuzvGpT1CGDu5+jw6gYAMwXjw1RCz5vkXKNyWVXlx2lRrjc/L05yCEy1lf8mIt1xL9m7M0nGkKy0kHiwRQsGdinhoWAH5iDYu4dzKjDcGbJfpMg9ZlYZskxaLf2eGo1Xz5kq88q7+UuaGSTRJdqn6/7B0rjepdxT9wLfiBgsytUV16/m3Rl/sGPkEAxlFzjU4uzzeiRVq5BIyP7yGmYoLl0Mp5MnDSVan1kA26QfVQ4hUIwcywwcqmY03a9wVGvWvW2nnVOeXxLQopvIbjTYp3leumTY2Yv34/1AmsQPGfgkfxbzAvf7rl6xjxNOA1PI20BeP3uB24Y+uE34r7hAeNcD9eWVFmlAry6ejDMoTsu4knbG32Idm2X7atwNROzqj6QZ8fwEntcImXj00hzi8KuwOrlTAzdq0nvH49G47ZmYALilI8b62ScjgwfTHFY3EvmONYnx2c9EH9az2p7cFk18prOfkPu6Hi7InSvHebW6MS6w+NnSdZUXFTlEzMTSIBYUWa+Zsu3js/UPorCBxD2GoyYHjxBsXrA658BWdCxUb5cuvm/fD3k2u7bLsnuNkfQPr0qrlO85RDlZo09LeUYwqPFNMt9XXQKwaz2QVpEy72V8NubChkl92A8FpvXuuNIMKp1y7dHxEn4Tt3ojmKAHB4xQqLiMJE8mDxqG0nUQMe94OsQDRZ7mZyQo0YmOxMK8YQF5o4ixPHEPrux1emk30MKCGY+d3anNuY7r5GfggMfD5idEOYHghcvnmBY/8TB3htNwhtCIV+CvTk/QuAnH55kjiN/M3yPL/V50oMGcBmHICcLjLENKsEEcOQ9WhrT7b9wXXjK4//5A99KRmSzp95mvSF01wNQgm1958b+/Sek5BEwAnQsqC6BVZ8ybKKgwvCmdn/9wZAOze2zhK84oqKzKqz+LNpYI7mQYWoh/ek7bE00B6IMFMxm5ZTSUP8pCJToMHo2F3CVL8zsq6KFIf5G/bVBkuVox0P8Xw6D6jc7WrEHVkvUF0zgfr2ELEiQb5uXRrqXwfulhNQ3FNpwcGlM7yPFdJhIu84YqLouARz9SSdJ0gAzJCIuRVQ3UPNOfrOR8AUbCfjtkUZKK6An+F7UX8oGoC48TXUgcyU4W6pmWB6xbxxCG5dattz4Pgi4xaMgNlZ3twkJ0T9ZlOfT8uAi/p/7h7rI5VVE956er9r66pJOuDC2rxX5y/jF1tL/z+3Hq6pMHijh84W8GFb8cf+qdBojbvoWwxYd7d1iytTVs5t5Yu+A+jTgGqKU3mqmMaRqnIByLDFW5giuJDhsbp4oifQbxXdibleQDldazNxfcb6AnpfmWf7dsZDdLOZmUHQsXAmKqUp1GDVGipjuZfe02Xr/WmSQE0Z8F578dpXHM4t+3PAd7us29TKeive69cj41aQ35a4x5xo+zJk6ZR/tkNPPL2/u+oEngVURSVvW2YP1BmI8uysVg/Sx+ISVYaWK7LSR8Z/4viRQWQ8RrHaqirrk556jTq887nbZuAR2/SoJq2M1L0BrGjjkuA/YeXmjTY/JcK/Kht1/kDupfvYHvViz6E8DiAWSTil4wUhyBqQhOXxXi9SLBSgh102la1nrO4wjyB3ouAIUtrByftqgvZl6yvr4ak4xX1JdKRgkC8fee7N6g+7Gc/Pnr+Fwfh0L9lu+jqR/PYEA2oA91vlQPW8L6DZi+tHf8fNkslsUw7Lmum6ZHtWW+jvxy+i4zwli+Vu3k5QQWaesiOijpwC45RBoYti7HMEfMbXn/H1a1l/xtf90ZkBS9uG5MZgocEjbNlRUX6miiIurYCf5GIFMUILWDeKdEfcgTyMAtgl1Hchhkw9itiFVuIyF2UdvBUF7HxML/+8/xaG27C6WO7tr5h0STm6bbS81vFKuU7VT9RgAGkXhLa1ezFayPcIgC+i0WAF8nNI9ZX1j7RKdGHQEb68eOHptU+dm17o2cCFl+D6QyUcMVpex863vc++d3NqP/39wrq8PP9bFY04tNmxwjcMQCfRL6qpMNMQ/HBVtmoJUC0we24ZnPIkiFHErVmSX8zfvEW7Z1We1oa6XewjtcdgC+uL/LOopmBFj315eiGzULLtWvZgCSXhcaaTN95Vekq8om+iM7LfzSQA5eJIFT1q3L/zJOQqTp1+9X05CT91cXLemNONdwqgqp4BHXlSw+uK74483nhxPJXwRKr4bc1n/55QYKfjOLrXwU31pSqx08/Er9T0bSyPP3mKVWrEq9ZqbuH3cti5oV5n9uOMSJeeymvH6DrGh//4Q4wcAR2j+ZR6+c1Z7q9O3eIKOpSgpEu/JUCJd7oEEHBWo4z36PCFSr6OVaRW2b6Jf8s6jgnzghKWdQlgwHky3O/GqMshOz3AurJeXmjkfi9Ci9PDgMagNovxDu3EPLSu+jXbSlqCRv5U09lcIdtKMcf3x9P7p64Y/1KjaLI8ZXmT5Zq6M30X/1KTu7HmkqcagnCerSvGrf+lOiBG5StyAUF8hHD6j+gV46NswH+Ia0K8A3/1vzyegBHfOMfcoEYOoJ0YYInCXe9r9kV9tZc9H3bvJgrjPQWJR7gPxyzFUdFYfLGIU4+Zhp+VfZMRbanS+a/eiRX2xhZwvWp+24lnWuZydXjioYSAqZCIhEaWqpxy3sepE+mtMSoZY3Nnbh/xvE6M2QQlPBFNg+dV+xLz2/pp0nnVMzUayfAPekkDBNDkWm6Nt5++Rt4+EHsfQILw3dW390qyy5FpgXIYNTOneHE+d9J+YLYnRRuCYIH0L5PP3sXJsl7MPu7w94vsQy6epbrTgidaJpnvj2OxTw6ZsVoIe8J3/qbNoW/Fkz2lotiT+baR5OHmluvH3YwPqiOKbGq94phkEdoyBtRAJoA/1Wp9534Ox56vqb7QnWmknxbFOrNRIcV7/HqAJQUpzyFH6LO6dKu6KSHwE0m8YfXwidZxgKp5rD6Mb66Lh1PXz0xZ47NzftBqKg0/Dcb7AJvu2f/AV7CkWPPAWX14rPiYP5Bh1/ryqVKN07xqFXGVJIuEDtMGz9DtMU5BgNahpB5TD5Z9M/vPCYW1vGN2b/cBMKrGVf+gp/u9nk9Y4hRxMF18iZpG05oz4TsHX4psYDy2rjSZR857hzFrR2VNTa6+wq6SzulSjHa3noQGQne9xHMlpmKhEQcBdIUsRAcmGC8vSEpM1ZjEXYmnp3jWBG4/Ghe4VJjYuxH6344nnFnT9midsCN8xgxESC1x2yB6Mi/Lw+IWUmDTQvK4PCY280BUBYREFXgydMTEUsAeW1UWzMLSutQo7EuuKokYIijcgEk+w322B11QPNdsI6GbKueCneic77NY/HwxlWbj7/nnYiYKjKUTKBmtBi7ws3hAuRIZ18/L4oVsbZnczZ9FcbOkiNolgHGNC44Ojgp+bhP/YXuKA5As6KZ9yRpviXZzr3XbsxR6uAxXh7jDZaBbpii0NNetxTbhNK2xx5JGgQkWXMeAlXa0Xf9PRIYtsaTyh5F4Iy7Hn2n6CDfbg19UDne3DdytglcmFKS/vKOpWLMYfqbKyMRfszSBnCgIpJoRqtAngSE1jV3MTCsAcz3hQs3cozb+YPpcST0sgh7zj8O+SxT7j9/oI4ezNJWw3eEn2GALDw3DyCsy3lS3Jzy8lkLvqYsxEn2niP0z9HK+bsvETqtmlzBYjvst/ayEPzFMCY6Cbd8jzMKAZafHiI6sh8tbBQcpz83TvHzx2rHU5ICEAcBDXctnJHArUy/oZ9+eLW5jPtVMuKB33QQ=","base64")).toString()),yR)});var y_=E((wR,I_)=>{(function(t,e){typeof wR=="object"?I_.exports=e():typeof define=="function"&&define.amd?define(e):t.treeify=e()})(wR,function(){function t(n,s){var o=s?"\u2514":"\u251C";return n?o+="\u2500 ":o+="\u2500\u2500\u2510",o}function e(n,s){var o=[];for(var a in n)!n.hasOwnProperty(a)||s&&typeof n[a]=="function"||o.push(a);return o}function r(n,s,o,a,l,c,u){var g="",f=0,h,p,d=a.slice(0);if(d.push([s,o])&&a.length>0&&(a.forEach(function(I,B){B>0&&(g+=(I[1]?" ":"\u2502")+" "),!p&&I[0]===s&&(p=!0)}),g+=t(n,o)+n,l&&(typeof s!="object"||s instanceof Date)&&(g+=": "+s),p&&(g+=" (circular ref.)"),u(g)),!p&&typeof s=="object"){var m=e(s,c);m.forEach(function(I){h=++f===m.length,r(I,s[I],h,d,l,c,u)})}}var i={};return i.asLines=function(n,s,o,a){var l=typeof o!="function"?o:!1;r(".",n,!1,[],s,l,a||o)},i.asTree=function(n,s,o){var a="";return r(".",n,!1,[],s,o,function(l){a+=l+` +`}),a},i})});var x_=E((Uct,bR)=>{"use strict";var pTe=t=>{let e=!1,r=!1,i=!1;for(let n=0;n{if(!(typeof t=="string"||Array.isArray(t)))throw new TypeError("Expected the input to be `string | string[]`");e=Object.assign({pascalCase:!1},e);let r=n=>e.pascalCase?n.charAt(0).toUpperCase()+n.slice(1):n;return Array.isArray(t)?t=t.map(n=>n.trim()).filter(n=>n.length).join("-"):t=t.trim(),t.length===0?"":t.length===1?e.pascalCase?t.toUpperCase():t.toLowerCase():(t!==t.toLowerCase()&&(t=pTe(t)),t=t.replace(/^[_.\- ]+/,"").toLowerCase().replace(/[_.\- ]+(\w|$)/g,(n,s)=>s.toUpperCase()).replace(/\d+(\w|$)/g,n=>n.toUpperCase()),r(t))};bR.exports=S_;bR.exports.default=S_});var Na=E(TR=>{"use strict";Object.defineProperty(TR,"__esModule",{value:!0});TR.default=L_;function L_(){}L_.prototype={diff:function(e,r){var i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},n=i.callback;typeof i=="function"&&(n=i,i={}),this.options=i;var s=this;function o(d){return n?(setTimeout(function(){n(void 0,d)},0),!0):d}e=this.castInput(e),r=this.castInput(r),e=this.removeEmpty(this.tokenize(e)),r=this.removeEmpty(this.tokenize(r));var a=r.length,l=e.length,c=1,u=a+l,g=[{newPos:-1,components:[]}],f=this.extractCommon(g[0],r,e,0);if(g[0].newPos+1>=a&&f+1>=l)return o([{value:this.join(r),count:r.length}]);function h(){for(var d=-1*c;d<=c;d+=2){var m=void 0,I=g[d-1],B=g[d+1],b=(B?B.newPos:0)-d;I&&(g[d-1]=void 0);var R=I&&I.newPos+1=a&&b+1>=l)return o(yTe(s,m.components,r,e,s.useLongestToken));g[d]=m}c++}if(n)(function d(){setTimeout(function(){if(c>u)return n();h()||d()},0)})();else for(;c<=u;){var p=h();if(p)return p}},pushComponent:function(e,r,i){var n=e[e.length-1];n&&n.added===r&&n.removed===i?e[e.length-1]={count:n.count+1,added:r,removed:i}:e.push({count:1,added:r,removed:i})},extractCommon:function(e,r,i,n){for(var s=r.length,o=i.length,a=e.newPos,l=a-n,c=0;a+1h.length?d:h}),c.value=t.join(u)}else c.value=t.join(r.slice(a,a+c.count));a+=c.count,c.added||(l+=c.count)}}var f=e[o-1];return o>1&&typeof f.value=="string"&&(f.added||f.removed)&&t.equals("",f.value)&&(e[o-2].value+=f.value,e.pop()),e}function wTe(t){return{newPos:t.newPos,components:t.components.slice(0)}}});var M_=E(Cd=>{"use strict";Object.defineProperty(Cd,"__esModule",{value:!0});Cd.diffChars=BTe;Cd.characterDiff=void 0;var bTe=QTe(Na());function QTe(t){return t&&t.__esModule?t:{default:t}}var T_=new bTe.default;Cd.characterDiff=T_;function BTe(t,e,r){return T_.diff(t,e,r)}});var OR=E(MR=>{"use strict";Object.defineProperty(MR,"__esModule",{value:!0});MR.generateOptions=vTe;function vTe(t,e){if(typeof t=="function")e.callback=t;else if(t)for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r]);return e}});var U_=E(Ng=>{"use strict";Object.defineProperty(Ng,"__esModule",{value:!0});Ng.diffWords=STe;Ng.diffWordsWithSpace=xTe;Ng.wordDiff=void 0;var PTe=kTe(Na()),DTe=OR();function kTe(t){return t&&t.__esModule?t:{default:t}}var O_=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,K_=/\S/,md=new PTe.default;Ng.wordDiff=md;md.equals=function(t,e){return this.options.ignoreCase&&(t=t.toLowerCase(),e=e.toLowerCase()),t===e||this.options.ignoreWhitespace&&!K_.test(t)&&!K_.test(e)};md.tokenize=function(t){for(var e=t.split(/(\s+|[()[\]{}'"]|\b)/),r=0;r{"use strict";Object.defineProperty(Lg,"__esModule",{value:!0});Lg.diffLines=RTe;Lg.diffTrimmedLines=FTe;Lg.lineDiff=void 0;var LTe=NTe(Na()),TTe=OR();function NTe(t){return t&&t.__esModule?t:{default:t}}var OB=new LTe.default;Lg.lineDiff=OB;OB.tokenize=function(t){var e=[],r=t.split(/(\n|\r\n)/);r[r.length-1]||r.pop();for(var i=0;i{"use strict";Object.defineProperty(Ed,"__esModule",{value:!0});Ed.diffSentences=MTe;Ed.sentenceDiff=void 0;var KTe=OTe(Na());function OTe(t){return t&&t.__esModule?t:{default:t}}var KR=new KTe.default;Ed.sentenceDiff=KR;KR.tokenize=function(t){return t.split(/(\S.+?[.!?])(?=\s+|$)/)};function MTe(t,e,r){return KR.diff(t,e,r)}});var G_=E(Id=>{"use strict";Object.defineProperty(Id,"__esModule",{value:!0});Id.diffCss=UTe;Id.cssDiff=void 0;var GTe=HTe(Na());function HTe(t){return t&&t.__esModule?t:{default:t}}var UR=new GTe.default;Id.cssDiff=UR;UR.tokenize=function(t){return t.split(/([{}:;,]|\s+)/)};function UTe(t,e,r){return UR.diff(t,e,r)}});var Y_=E(Tg=>{"use strict";Object.defineProperty(Tg,"__esModule",{value:!0});Tg.diffJson=jTe;Tg.canonicalize=UB;Tg.jsonDiff=void 0;var j_=YTe(Na()),qTe=KB();function YTe(t){return t&&t.__esModule?t:{default:t}}function HB(t){return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?HB=function(r){return typeof r}:HB=function(r){return r&&typeof Symbol=="function"&&r.constructor===Symbol&&r!==Symbol.prototype?"symbol":typeof r},HB(t)}var JTe=Object.prototype.toString,bc=new j_.default;Tg.jsonDiff=bc;bc.useLongestToken=!0;bc.tokenize=qTe.lineDiff.tokenize;bc.castInput=function(t){var e=this.options,r=e.undefinedReplacement,i=e.stringifyReplacer,n=i===void 0?function(s,o){return typeof o=="undefined"?r:o}:i;return typeof t=="string"?t:JSON.stringify(UB(t,null,null,n),n," ")};bc.equals=function(t,e){return j_.default.prototype.equals.call(bc,t.replace(/,([\r\n])/g,"$1"),e.replace(/,([\r\n])/g,"$1"))};function jTe(t,e,r){return bc.diff(t,e,r)}function UB(t,e,r,i,n){e=e||[],r=r||[],i&&(t=i(n,t));var s;for(s=0;s{"use strict";Object.defineProperty(yd,"__esModule",{value:!0});yd.diffArrays=WTe;yd.arrayDiff=void 0;var VTe=zTe(Na());function zTe(t){return t&&t.__esModule?t:{default:t}}var wd=new VTe.default;yd.arrayDiff=wd;wd.tokenize=function(t){return t.slice()};wd.join=wd.removeEmpty=function(t){return t};function WTe(t,e,r){return wd.diff(t,e,r)}});var GB=E(HR=>{"use strict";Object.defineProperty(HR,"__esModule",{value:!0});HR.parsePatch=_Te;function _Te(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},r=t.split(/\r\n|[\n\v\f\r\x85]/),i=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],n=[],s=0;function o(){var c={};for(n.push(c);s{"use strict";Object.defineProperty(GR,"__esModule",{value:!0});GR.default=XTe;function XTe(t,e,r){var i=!0,n=!1,s=!1,o=1;return function a(){if(i&&!s){if(n?o++:i=!1,t+o<=r)return o;s=!0}if(!n)return s||(i=!0),e<=t-o?-o++:(n=!0,a())}}});var V_=E(jB=>{"use strict";Object.defineProperty(jB,"__esModule",{value:!0});jB.applyPatch=W_;jB.applyPatches=ZTe;var z_=GB(),eMe=$Te(J_());function $Te(t){return t&&t.__esModule?t:{default:t}}function W_(t,e){var r=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};if(typeof e=="string"&&(e=(0,z_.parsePatch)(e)),Array.isArray(e)){if(e.length>1)throw new Error("applyPatch only works with a single input.");e=e[0]}var i=t.split(/\r\n|[\n\v\f\r\x85]/),n=t.match(/\r\n|[\n\v\f\r\x85]/g)||[],s=e.hunks,o=r.compareLine||function(F,D,he,pe){return D===pe},a=0,l=r.fuzzFactor||0,c=0,u=0,g,f;function h(F,D){for(var he=0;he0?pe[0]:" ",Pe=pe.length>0?pe.substr(1):pe;if(Ne===" "||Ne==="-"){if(!o(D+1,i[D],Ne,Pe)&&(a++,a>l))return!1;D++}}return!0}for(var p=0;p0?ne[0]:" ",A=ne.length>0?ne.substr(1):ne,V=L.linedelimiters[J];if(q===" ")K++;else if(q==="-")i.splice(K,1),n.splice(K,1);else if(q==="+")i.splice(K,0,A),n.splice(K,0,V),K++;else if(q==="\\"){var W=L.lines[J-1]?L.lines[J-1][0]:null;W==="+"?g=!0:W==="-"&&(f=!0)}}}if(g)for(;!i[i.length-1];)i.pop(),n.pop();else f&&(i.push(""),n.push(` +`));for(var X=0;X{"use strict";Object.defineProperty(Bd,"__esModule",{value:!0});Bd.structuredPatch=__;Bd.createTwoFilesPatch=X_;Bd.createPatch=tMe;var rMe=KB();function jR(t){return sMe(t)||nMe(t)||iMe()}function iMe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function nMe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function sMe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e0?l(L.lines.slice(-o.context)):[],u-=f.length,g-=f.length)}(H=f).push.apply(H,jR(R.map(function(X){return(b.added?"+":"-")+X}))),b.added?p+=R.length:h+=R.length}else{if(u)if(R.length<=o.context*2&&B=a.length-2&&R.length<=o.context){var A=/\n$/.test(r),V=/\n$/.test(i),W=R.length==0&&f.length>q.oldLines;!A&&W&&f.splice(q.oldLines,0,"\\ No newline at end of file"),(!A&&!W||!V)&&f.push("\\ No newline at end of file")}c.push(q),u=0,g=0,f=[]}h+=R.length,p+=R.length}},m=0;m{"use strict";Object.defineProperty(YB,"__esModule",{value:!0});YB.arrayEqual=oMe;YB.arrayStartsWith=Z_;function oMe(t,e){return t.length!==e.length?!1:Z_(t,e)}function Z_(t,e){if(e.length>t.length)return!1;for(var r=0;r{"use strict";Object.defineProperty(qB,"__esModule",{value:!0});qB.calcLineCount=eX;qB.merge=aMe;var AMe=YR(),lMe=GB(),qR=$_();function Mg(t){return gMe(t)||uMe(t)||cMe()}function cMe(){throw new TypeError("Invalid attempt to spread non-iterable instance")}function uMe(t){if(Symbol.iterator in Object(t)||Object.prototype.toString.call(t)==="[object Arguments]")return Array.from(t)}function gMe(t){if(Array.isArray(t)){for(var e=0,r=new Array(t.length);e{"use strict";Object.defineProperty(zR,"__esModule",{value:!0});zR.convertChangesToDMP=dMe;function dMe(t){for(var e=[],r,i,n=0;n{"use strict";Object.defineProperty(VR,"__esModule",{value:!0});VR.convertChangesToXML=CMe;function CMe(t){for(var e=[],r=0;r"):i.removed&&e.push(""),e.push(mMe(i.value)),i.added?e.push(""):i.removed&&e.push("")}return e.join("")}function mMe(t){var e=t;return e=e.replace(/&/g,"&"),e=e.replace(//g,">"),e=e.replace(/"/g,"""),e}});var CX=E(br=>{"use strict";Object.defineProperty(br,"__esModule",{value:!0});Object.defineProperty(br,"Diff",{enumerable:!0,get:function(){return EMe.default}});Object.defineProperty(br,"diffChars",{enumerable:!0,get:function(){return IMe.diffChars}});Object.defineProperty(br,"diffWords",{enumerable:!0,get:function(){return fX.diffWords}});Object.defineProperty(br,"diffWordsWithSpace",{enumerable:!0,get:function(){return fX.diffWordsWithSpace}});Object.defineProperty(br,"diffLines",{enumerable:!0,get:function(){return hX.diffLines}});Object.defineProperty(br,"diffTrimmedLines",{enumerable:!0,get:function(){return hX.diffTrimmedLines}});Object.defineProperty(br,"diffSentences",{enumerable:!0,get:function(){return yMe.diffSentences}});Object.defineProperty(br,"diffCss",{enumerable:!0,get:function(){return wMe.diffCss}});Object.defineProperty(br,"diffJson",{enumerable:!0,get:function(){return pX.diffJson}});Object.defineProperty(br,"canonicalize",{enumerable:!0,get:function(){return pX.canonicalize}});Object.defineProperty(br,"diffArrays",{enumerable:!0,get:function(){return BMe.diffArrays}});Object.defineProperty(br,"applyPatch",{enumerable:!0,get:function(){return dX.applyPatch}});Object.defineProperty(br,"applyPatches",{enumerable:!0,get:function(){return dX.applyPatches}});Object.defineProperty(br,"parsePatch",{enumerable:!0,get:function(){return QMe.parsePatch}});Object.defineProperty(br,"merge",{enumerable:!0,get:function(){return bMe.merge}});Object.defineProperty(br,"structuredPatch",{enumerable:!0,get:function(){return _R.structuredPatch}});Object.defineProperty(br,"createTwoFilesPatch",{enumerable:!0,get:function(){return _R.createTwoFilesPatch}});Object.defineProperty(br,"createPatch",{enumerable:!0,get:function(){return _R.createPatch}});Object.defineProperty(br,"convertChangesToDMP",{enumerable:!0,get:function(){return vMe.convertChangesToDMP}});Object.defineProperty(br,"convertChangesToXML",{enumerable:!0,get:function(){return SMe.convertChangesToXML}});var EMe=xMe(Na()),IMe=M_(),fX=U_(),hX=KB(),yMe=H_(),wMe=G_(),pX=Y_(),BMe=q_(),dX=V_(),QMe=GB(),bMe=cX(),_R=YR(),vMe=uX(),SMe=gX();function xMe(t){return t&&t.__esModule?t:{default:t}}});var WB=E((agt,mX)=>{var kMe=As(),PMe=Nw(),DMe=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,RMe=/^\w*$/;function FMe(t,e){if(kMe(t))return!1;var r=typeof t;return r=="number"||r=="symbol"||r=="boolean"||t==null||PMe(t)?!0:RMe.test(t)||!DMe.test(t)||e!=null&&t in Object(e)}mX.exports=FMe});var Gs=E((Agt,EX)=>{function NMe(t){var e=typeof t;return t!=null&&(e=="object"||e=="function")}EX.exports=NMe});var zB=E((lgt,IX)=>{var LMe=Ac(),TMe=Gs(),MMe="[object AsyncFunction]",OMe="[object Function]",KMe="[object GeneratorFunction]",UMe="[object Proxy]";function HMe(t){if(!TMe(t))return!1;var e=LMe(t);return e==OMe||e==KMe||e==MMe||e==UMe}IX.exports=HMe});var wX=E((cgt,yX)=>{var GMe=Ks(),jMe=GMe["__core-js_shared__"];yX.exports=jMe});var bX=E((ugt,BX)=>{var XR=wX(),QX=function(){var t=/[^.]+$/.exec(XR&&XR.keys&&XR.keys.IE_PROTO||"");return t?"Symbol(src)_1."+t:""}();function YMe(t){return!!QX&&QX in t}BX.exports=YMe});var ZR=E((ggt,vX)=>{var qMe=Function.prototype,JMe=qMe.toString;function WMe(t){if(t!=null){try{return JMe.call(t)}catch(e){}try{return t+""}catch(e){}}return""}vX.exports=WMe});var xX=E((fgt,SX)=>{var zMe=zB(),VMe=bX(),_Me=Gs(),XMe=ZR(),ZMe=/[\\^$.*+?()[\]{}|]/g,$Me=/^\[object .+?Constructor\]$/,eOe=Function.prototype,tOe=Object.prototype,rOe=eOe.toString,iOe=tOe.hasOwnProperty,nOe=RegExp("^"+rOe.call(iOe).replace(ZMe,"\\$&").replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g,"$1.*?")+"$");function sOe(t){if(!_Me(t)||VMe(t))return!1;var e=zMe(t)?nOe:$Me;return e.test(XMe(t))}SX.exports=sOe});var PX=E((hgt,kX)=>{function oOe(t,e){return t==null?void 0:t[e]}kX.exports=oOe});var UA=E((pgt,DX)=>{var aOe=xX(),AOe=PX();function lOe(t,e){var r=AOe(t,e);return aOe(r)?r:void 0}DX.exports=lOe});var Qd=E((dgt,RX)=>{var cOe=UA(),uOe=cOe(Object,"create");RX.exports=uOe});var LX=E((Cgt,FX)=>{var NX=Qd();function gOe(){this.__data__=NX?NX(null):{},this.size=0}FX.exports=gOe});var MX=E((mgt,TX)=>{function fOe(t){var e=this.has(t)&&delete this.__data__[t];return this.size-=e?1:0,e}TX.exports=fOe});var KX=E((Egt,OX)=>{var hOe=Qd(),pOe="__lodash_hash_undefined__",dOe=Object.prototype,COe=dOe.hasOwnProperty;function mOe(t){var e=this.__data__;if(hOe){var r=e[t];return r===pOe?void 0:r}return COe.call(e,t)?e[t]:void 0}OX.exports=mOe});var HX=E((Igt,UX)=>{var EOe=Qd(),IOe=Object.prototype,yOe=IOe.hasOwnProperty;function wOe(t){var e=this.__data__;return EOe?e[t]!==void 0:yOe.call(e,t)}UX.exports=wOe});var jX=E((ygt,GX)=>{var BOe=Qd(),QOe="__lodash_hash_undefined__";function bOe(t,e){var r=this.__data__;return this.size+=this.has(t)?0:1,r[t]=BOe&&e===void 0?QOe:e,this}GX.exports=bOe});var qX=E((wgt,YX)=>{var vOe=LX(),SOe=MX(),xOe=KX(),kOe=HX(),POe=jX();function Og(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{function DOe(){this.__data__=[],this.size=0}JX.exports=DOe});var Kg=E((Qgt,zX)=>{function ROe(t,e){return t===e||t!==t&&e!==e}zX.exports=ROe});var bd=E((bgt,VX)=>{var FOe=Kg();function NOe(t,e){for(var r=t.length;r--;)if(FOe(t[r][0],e))return r;return-1}VX.exports=NOe});var XX=E((vgt,_X)=>{var LOe=bd(),TOe=Array.prototype,MOe=TOe.splice;function OOe(t){var e=this.__data__,r=LOe(e,t);if(r<0)return!1;var i=e.length-1;return r==i?e.pop():MOe.call(e,r,1),--this.size,!0}_X.exports=OOe});var $X=E((Sgt,ZX)=>{var KOe=bd();function UOe(t){var e=this.__data__,r=KOe(e,t);return r<0?void 0:e[r][1]}ZX.exports=UOe});var tZ=E((xgt,eZ)=>{var HOe=bd();function GOe(t){return HOe(this.__data__,t)>-1}eZ.exports=GOe});var iZ=E((kgt,rZ)=>{var jOe=bd();function YOe(t,e){var r=this.__data__,i=jOe(r,t);return i<0?(++this.size,r.push([t,e])):r[i][1]=e,this}rZ.exports=YOe});var vd=E((Pgt,nZ)=>{var qOe=WX(),JOe=XX(),WOe=$X(),zOe=tZ(),VOe=iZ();function Ug(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var _Oe=UA(),XOe=Ks(),ZOe=_Oe(XOe,"Map");sZ.exports=ZOe});var AZ=E((Rgt,oZ)=>{var aZ=qX(),$Oe=vd(),eKe=VB();function tKe(){this.size=0,this.__data__={hash:new aZ,map:new(eKe||$Oe),string:new aZ}}oZ.exports=tKe});var cZ=E((Fgt,lZ)=>{function rKe(t){var e=typeof t;return e=="string"||e=="number"||e=="symbol"||e=="boolean"?t!=="__proto__":t===null}lZ.exports=rKe});var Sd=E((Ngt,uZ)=>{var iKe=cZ();function nKe(t,e){var r=t.__data__;return iKe(e)?r[typeof e=="string"?"string":"hash"]:r.map}uZ.exports=nKe});var fZ=E((Lgt,gZ)=>{var sKe=Sd();function oKe(t){var e=sKe(this,t).delete(t);return this.size-=e?1:0,e}gZ.exports=oKe});var pZ=E((Tgt,hZ)=>{var aKe=Sd();function AKe(t){return aKe(this,t).get(t)}hZ.exports=AKe});var CZ=E((Mgt,dZ)=>{var lKe=Sd();function cKe(t){return lKe(this,t).has(t)}dZ.exports=cKe});var EZ=E((Ogt,mZ)=>{var uKe=Sd();function gKe(t,e){var r=uKe(this,t),i=r.size;return r.set(t,e),this.size+=r.size==i?0:1,this}mZ.exports=gKe});var _B=E((Kgt,IZ)=>{var fKe=AZ(),hKe=fZ(),pKe=pZ(),dKe=CZ(),CKe=EZ();function Hg(t){var e=-1,r=t==null?0:t.length;for(this.clear();++e{var wZ=_B(),mKe="Expected a function";function $R(t,e){if(typeof t!="function"||e!=null&&typeof e!="function")throw new TypeError(mKe);var r=function(){var i=arguments,n=e?e.apply(this,i):i[0],s=r.cache;if(s.has(n))return s.get(n);var o=t.apply(this,i);return r.cache=s.set(n,o)||s,o};return r.cache=new($R.Cache||wZ),r}$R.Cache=wZ;yZ.exports=$R});var bZ=E((Hgt,QZ)=>{var EKe=BZ(),IKe=500;function yKe(t){var e=EKe(t,function(i){return r.size===IKe&&r.clear(),i}),r=e.cache;return e}QZ.exports=yKe});var SZ=E((Ggt,vZ)=>{var wKe=bZ(),BKe=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,QKe=/\\(\\)?/g,bKe=wKe(function(t){var e=[];return t.charCodeAt(0)===46&&e.push(""),t.replace(BKe,function(r,i,n,s){e.push(n?s.replace(QKe,"$1"):i||r)}),e});vZ.exports=bKe});var Gg=E((jgt,xZ)=>{var vKe=As(),SKe=WB(),xKe=SZ(),kKe=gg();function PKe(t,e){return vKe(t)?t:SKe(t,e)?[t]:xKe(kKe(t))}xZ.exports=PKe});var Sc=E((Ygt,kZ)=>{var DKe=Nw(),RKe=1/0;function FKe(t){if(typeof t=="string"||DKe(t))return t;var e=t+"";return e=="0"&&1/t==-RKe?"-0":e}kZ.exports=FKe});var xd=E((qgt,PZ)=>{var NKe=Gg(),LKe=Sc();function TKe(t,e){e=NKe(e,t);for(var r=0,i=e.length;t!=null&&r{var MKe=UA(),OKe=function(){try{var t=MKe(Object,"defineProperty");return t({},"",{}),t}catch(e){}}();DZ.exports=OKe});var jg=E((Wgt,RZ)=>{var FZ=eF();function KKe(t,e,r){e=="__proto__"&&FZ?FZ(t,e,{configurable:!0,enumerable:!0,value:r,writable:!0}):t[e]=r}RZ.exports=KKe});var XB=E((zgt,NZ)=>{var UKe=jg(),HKe=Kg(),GKe=Object.prototype,jKe=GKe.hasOwnProperty;function YKe(t,e,r){var i=t[e];(!(jKe.call(t,e)&&HKe(i,r))||r===void 0&&!(e in t))&&UKe(t,e,r)}NZ.exports=YKe});var kd=E((Vgt,LZ)=>{var qKe=9007199254740991,JKe=/^(?:0|[1-9]\d*)$/;function WKe(t,e){var r=typeof t;return e=e==null?qKe:e,!!e&&(r=="number"||r!="symbol"&&JKe.test(t))&&t>-1&&t%1==0&&t{var zKe=XB(),VKe=Gg(),_Ke=kd(),MZ=Gs(),XKe=Sc();function ZKe(t,e,r,i){if(!MZ(t))return t;e=VKe(e,t);for(var n=-1,s=e.length,o=s-1,a=t;a!=null&&++n{var $Ke=xd(),e1e=tF(),t1e=Gg();function r1e(t,e,r){for(var i=-1,n=e.length,s={};++i{function i1e(t,e){return t!=null&&e in Object(t)}UZ.exports=i1e});var jZ=E(($gt,GZ)=>{var n1e=Ac(),s1e=Qo(),o1e="[object Arguments]";function a1e(t){return s1e(t)&&n1e(t)==o1e}GZ.exports=a1e});var Pd=E((eft,YZ)=>{var qZ=jZ(),A1e=Qo(),JZ=Object.prototype,l1e=JZ.hasOwnProperty,c1e=JZ.propertyIsEnumerable,u1e=qZ(function(){return arguments}())?qZ:function(t){return A1e(t)&&l1e.call(t,"callee")&&!c1e.call(t,"callee")};YZ.exports=u1e});var ZB=E((tft,WZ)=>{var g1e=9007199254740991;function f1e(t){return typeof t=="number"&&t>-1&&t%1==0&&t<=g1e}WZ.exports=f1e});var rF=E((rft,zZ)=>{var h1e=Gg(),p1e=Pd(),d1e=As(),C1e=kd(),m1e=ZB(),E1e=Sc();function I1e(t,e,r){e=h1e(e,t);for(var i=-1,n=e.length,s=!1;++i{var y1e=HZ(),w1e=rF();function B1e(t,e){return t!=null&&w1e(t,e,y1e)}VZ.exports=B1e});var XZ=E((nft,_Z)=>{var Q1e=KZ(),b1e=iF();function v1e(t,e){return Q1e(t,e,function(r,i){return b1e(t,i)})}_Z.exports=v1e});var $B=E((sft,ZZ)=>{function S1e(t,e){for(var r=-1,i=e.length,n=t.length;++r{var e$=ac(),x1e=Pd(),k1e=As(),t$=e$?e$.isConcatSpreadable:void 0;function P1e(t){return k1e(t)||x1e(t)||!!(t$&&t&&t[t$])}$Z.exports=P1e});var s$=E((aft,i$)=>{var D1e=$B(),R1e=r$();function n$(t,e,r,i,n){var s=-1,o=t.length;for(r||(r=R1e),n||(n=[]);++s0&&r(a)?e>1?n$(a,e-1,r,i,n):D1e(n,a):i||(n[n.length]=a)}return n}i$.exports=n$});var a$=E((Aft,o$)=>{var F1e=s$();function N1e(t){var e=t==null?0:t.length;return e?F1e(t,1):[]}o$.exports=N1e});var l$=E((lft,A$)=>{function L1e(t,e,r){switch(r.length){case 0:return t.call(e);case 1:return t.call(e,r[0]);case 2:return t.call(e,r[0],r[1]);case 3:return t.call(e,r[0],r[1],r[2])}return t.apply(e,r)}A$.exports=L1e});var nF=E((cft,c$)=>{var T1e=l$(),u$=Math.max;function M1e(t,e,r){return e=u$(e===void 0?t.length-1:e,0),function(){for(var i=arguments,n=-1,s=u$(i.length-e,0),o=Array(s);++n{function O1e(t){return function(){return t}}g$.exports=O1e});var e0=E((gft,h$)=>{function K1e(t){return t}h$.exports=K1e});var C$=E((fft,p$)=>{var U1e=f$(),d$=eF(),H1e=e0(),G1e=d$?function(t,e){return d$(t,"toString",{configurable:!0,enumerable:!1,value:U1e(e),writable:!0})}:H1e;p$.exports=G1e});var E$=E((hft,m$)=>{var j1e=800,Y1e=16,q1e=Date.now;function J1e(t){var e=0,r=0;return function(){var i=q1e(),n=Y1e-(i-r);if(r=i,n>0){if(++e>=j1e)return arguments[0]}else e=0;return t.apply(void 0,arguments)}}m$.exports=J1e});var sF=E((pft,I$)=>{var W1e=C$(),z1e=E$(),V1e=z1e(W1e);I$.exports=V1e});var w$=E((dft,y$)=>{var _1e=a$(),X1e=nF(),Z1e=sF();function $1e(t){return Z1e(X1e(t,void 0,_1e),t+"")}y$.exports=$1e});var Q$=E((Cft,B$)=>{var eUe=XZ(),tUe=w$(),rUe=tUe(function(t,e){return t==null?{}:eUe(t,e)});B$.exports=rUe});var M$=E((lpt,N$)=>{"use strict";var pF;try{pF=Map}catch(t){}var dF;try{dF=Set}catch(t){}function L$(t,e,r){if(!t||typeof t!="object"||typeof t=="function")return t;if(t.nodeType&&"cloneNode"in t)return t.cloneNode(!0);if(t instanceof Date)return new Date(t.getTime());if(t instanceof RegExp)return new RegExp(t);if(Array.isArray(t))return t.map(T$);if(pF&&t instanceof pF)return new Map(Array.from(t.entries()));if(dF&&t instanceof dF)return new Set(Array.from(t.values()));if(t instanceof Object){e.push(t);var i=Object.create(t);r.push(i);for(var n in t){var s=e.findIndex(function(o){return o===t[n]});i[n]=s>-1?r[s]:L$(t[n],e,r)}return i}return t}function T$(t){return L$(t,[],[])}N$.exports=T$});var Nd=E(CF=>{"use strict";Object.defineProperty(CF,"__esModule",{value:!0});CF.default=uUe;var gUe=Object.prototype.toString,fUe=Error.prototype.toString,hUe=RegExp.prototype.toString,pUe=typeof Symbol!="undefined"?Symbol.prototype.toString:()=>"",dUe=/^Symbol\((.*)\)(.*)$/;function CUe(t){return t!=+t?"NaN":t===0&&1/t<0?"-0":""+t}function O$(t,e=!1){if(t==null||t===!0||t===!1)return""+t;let r=typeof t;if(r==="number")return CUe(t);if(r==="string")return e?`"${t}"`:t;if(r==="function")return"[Function "+(t.name||"anonymous")+"]";if(r==="symbol")return pUe.call(t).replace(dUe,"Symbol($1)");let i=gUe.call(t).slice(8,-1);return i==="Date"?isNaN(t.getTime())?""+t:t.toISOString(t):i==="Error"||t instanceof Error?"["+fUe.call(t)+"]":i==="RegExp"?hUe.call(t):null}function uUe(t,e){let r=O$(t,e);return r!==null?r:JSON.stringify(t,function(i,n){let s=O$(this[i],e);return s!==null?s:n},2)}});var La=E(ci=>{"use strict";Object.defineProperty(ci,"__esModule",{value:!0});ci.default=ci.array=ci.object=ci.boolean=ci.date=ci.number=ci.string=ci.mixed=void 0;var K$=mUe(Nd());function mUe(t){return t&&t.__esModule?t:{default:t}}var U$={default:"${path} is invalid",required:"${path} is a required field",oneOf:"${path} must be one of the following values: ${values}",notOneOf:"${path} must not be one of the following values: ${values}",notType:({path:t,type:e,value:r,originalValue:i})=>{let n=i!=null&&i!==r,s=`${t} must be a \`${e}\` type, but the final value was: \`${(0,K$.default)(r,!0)}\``+(n?` (cast from the value \`${(0,K$.default)(i,!0)}\`).`:".");return r===null&&(s+='\n If "null" is intended as an empty value be sure to mark the schema as `.nullable()`'),s},defined:"${path} must be defined"};ci.mixed=U$;var H$={length:"${path} must be exactly ${length} characters",min:"${path} must be at least ${min} characters",max:"${path} must be at most ${max} characters",matches:'${path} must match the following: "${regex}"',email:"${path} must be a valid email",url:"${path} must be a valid URL",uuid:"${path} must be a valid UUID",trim:"${path} must be a trimmed string",lowercase:"${path} must be a lowercase string",uppercase:"${path} must be a upper case string"};ci.string=H$;var G$={min:"${path} must be greater than or equal to ${min}",max:"${path} must be less than or equal to ${max}",lessThan:"${path} must be less than ${less}",moreThan:"${path} must be greater than ${more}",positive:"${path} must be a positive number",negative:"${path} must be a negative number",integer:"${path} must be an integer"};ci.number=G$;var j$={min:"${path} field must be later than ${min}",max:"${path} field must be at earlier than ${max}"};ci.date=j$;var Y$={isValue:"${path} field must be ${value}"};ci.boolean=Y$;var q$={noUnknown:"${path} field has unspecified keys: ${unknown}"};ci.object=q$;var J$={min:"${path} field must have at least ${min} items",max:"${path} field must have less than or equal to ${max} items",length:"${path} must be have ${length} items"};ci.array=J$;var EUe=Object.assign(Object.create(null),{mixed:U$,string:H$,number:G$,date:j$,object:q$,array:J$,boolean:Y$});ci.default=EUe});var z$=E((gpt,W$)=>{var IUe=Object.prototype,yUe=IUe.hasOwnProperty;function wUe(t,e){return t!=null&&yUe.call(t,e)}W$.exports=wUe});var Ld=E((fpt,V$)=>{var BUe=z$(),QUe=rF();function bUe(t,e){return t!=null&&QUe(t,e,BUe)}V$.exports=bUe});var qg=E(n0=>{"use strict";Object.defineProperty(n0,"__esModule",{value:!0});n0.default=void 0;var vUe=t=>t&&t.__isYupSchema__;n0.default=vUe});var Z$=E(s0=>{"use strict";Object.defineProperty(s0,"__esModule",{value:!0});s0.default=void 0;var SUe=_$(Ld()),xUe=_$(qg());function _$(t){return t&&t.__esModule?t:{default:t}}var X$=class{constructor(e,r){if(this.refs=e,this.refs=e,typeof r=="function"){this.fn=r;return}if(!(0,SUe.default)(r,"is"))throw new TypeError("`is:` is required for `when()` conditions");if(!r.then&&!r.otherwise)throw new TypeError("either `then:` or `otherwise:` is required for `when()` conditions");let{is:i,then:n,otherwise:s}=r,o=typeof i=="function"?i:(...a)=>a.every(l=>l===i);this.fn=function(...a){let l=a.pop(),c=a.pop(),u=o(...a)?n:s;if(!!u)return typeof u=="function"?u(c):c.concat(u.resolve(l))}}resolve(e,r){let i=this.refs.map(s=>s.getValue(r==null?void 0:r.value,r==null?void 0:r.parent,r==null?void 0:r.context)),n=this.fn.apply(e,i.concat(e,r));if(n===void 0||n===e)return e;if(!(0,xUe.default)(n))throw new TypeError("conditions must return a schema object");return n.resolve(r)}},kUe=X$;s0.default=kUe});var EF=E(mF=>{"use strict";Object.defineProperty(mF,"__esModule",{value:!0});mF.default=PUe;function PUe(t){return t==null?[]:[].concat(t)}});var xc=E(o0=>{"use strict";Object.defineProperty(o0,"__esModule",{value:!0});o0.default=void 0;var DUe=$$(Nd()),RUe=$$(EF());function $$(t){return t&&t.__esModule?t:{default:t}}function IF(){return IF=Object.assign||function(t){for(var e=1;e(0,DUe.default)(r[s])):typeof e=="function"?e(r):e}static isError(e){return e&&e.name==="ValidationError"}constructor(e,r,i,n){super();this.name="ValidationError",this.value=r,this.path=i,this.type=n,this.errors=[],this.inner=[],(0,RUe.default)(e).forEach(s=>{Td.isError(s)?(this.errors.push(...s.errors),this.inner=this.inner.concat(s.inner.length?s.inner:s)):this.errors.push(s)}),this.message=this.errors.length>1?`${this.errors.length} errors occurred`:this.errors[0],Error.captureStackTrace&&Error.captureStackTrace(this,Td)}};o0.default=Td});var a0=E(yF=>{"use strict";Object.defineProperty(yF,"__esModule",{value:!0});yF.default=NUe;var wF=LUe(xc());function LUe(t){return t&&t.__esModule?t:{default:t}}var TUe=t=>{let e=!1;return(...r)=>{e||(e=!0,t(...r))}};function NUe(t,e){let{endEarly:r,tests:i,args:n,value:s,errors:o,sort:a,path:l}=t,c=TUe(e),u=i.length,g=[];if(o=o||[],!u)return o.length?c(new wF.default(o,s,l)):c(null,s);for(let f=0;f{function MUe(t){return function(e,r,i){for(var n=-1,s=Object(e),o=i(e),a=o.length;a--;){var l=o[t?a:++n];if(r(s[l],l,s)===!1)break}return e}}eee.exports=MUe});var BF=E((Ipt,ree)=>{var OUe=tee(),KUe=OUe();ree.exports=KUe});var nee=E((ypt,iee)=>{function UUe(t,e){for(var r=-1,i=Array(t);++r{function HUe(){return!1}see.exports=HUe});var Od=E((Md,Jg)=>{var GUe=Ks(),jUe=oee(),aee=typeof Md=="object"&&Md&&!Md.nodeType&&Md,Aee=aee&&typeof Jg=="object"&&Jg&&!Jg.nodeType&&Jg,YUe=Aee&&Aee.exports===aee,lee=YUe?GUe.Buffer:void 0,qUe=lee?lee.isBuffer:void 0,JUe=qUe||jUe;Jg.exports=JUe});var uee=E((Bpt,cee)=>{var WUe=Ac(),zUe=ZB(),VUe=Qo(),_Ue="[object Arguments]",XUe="[object Array]",ZUe="[object Boolean]",$Ue="[object Date]",e2e="[object Error]",t2e="[object Function]",r2e="[object Map]",i2e="[object Number]",n2e="[object Object]",s2e="[object RegExp]",o2e="[object Set]",a2e="[object String]",A2e="[object WeakMap]",l2e="[object ArrayBuffer]",c2e="[object DataView]",u2e="[object Float32Array]",g2e="[object Float64Array]",f2e="[object Int8Array]",h2e="[object Int16Array]",p2e="[object Int32Array]",d2e="[object Uint8Array]",C2e="[object Uint8ClampedArray]",m2e="[object Uint16Array]",E2e="[object Uint32Array]",lr={};lr[u2e]=lr[g2e]=lr[f2e]=lr[h2e]=lr[p2e]=lr[d2e]=lr[C2e]=lr[m2e]=lr[E2e]=!0;lr[_Ue]=lr[XUe]=lr[l2e]=lr[ZUe]=lr[c2e]=lr[$Ue]=lr[e2e]=lr[t2e]=lr[r2e]=lr[i2e]=lr[n2e]=lr[s2e]=lr[o2e]=lr[a2e]=lr[A2e]=!1;function I2e(t){return VUe(t)&&zUe(t.length)&&!!lr[WUe(t)]}cee.exports=I2e});var A0=E((Qpt,gee)=>{function y2e(t){return function(e){return t(e)}}gee.exports=y2e});var l0=E((Kd,Wg)=>{var w2e=WP(),fee=typeof Kd=="object"&&Kd&&!Kd.nodeType&&Kd,Ud=fee&&typeof Wg=="object"&&Wg&&!Wg.nodeType&&Wg,B2e=Ud&&Ud.exports===fee,QF=B2e&&w2e.process,Q2e=function(){try{var t=Ud&&Ud.require&&Ud.require("util").types;return t||QF&&QF.binding&&QF.binding("util")}catch(e){}}();Wg.exports=Q2e});var c0=E((bpt,hee)=>{var b2e=uee(),v2e=A0(),pee=l0(),dee=pee&&pee.isTypedArray,S2e=dee?v2e(dee):b2e;hee.exports=S2e});var bF=E((vpt,Cee)=>{var x2e=nee(),k2e=Pd(),P2e=As(),D2e=Od(),R2e=kd(),F2e=c0(),N2e=Object.prototype,L2e=N2e.hasOwnProperty;function T2e(t,e){var r=P2e(t),i=!r&&k2e(t),n=!r&&!i&&D2e(t),s=!r&&!i&&!n&&F2e(t),o=r||i||n||s,a=o?x2e(t.length,String):[],l=a.length;for(var c in t)(e||L2e.call(t,c))&&!(o&&(c=="length"||n&&(c=="offset"||c=="parent")||s&&(c=="buffer"||c=="byteLength"||c=="byteOffset")||R2e(c,l)))&&a.push(c);return a}Cee.exports=T2e});var u0=E((Spt,mee)=>{var M2e=Object.prototype;function O2e(t){var e=t&&t.constructor,r=typeof e=="function"&&e.prototype||M2e;return t===r}mee.exports=O2e});var vF=E((xpt,Eee)=>{function K2e(t,e){return function(r){return t(e(r))}}Eee.exports=K2e});var yee=E((kpt,Iee)=>{var U2e=vF(),H2e=U2e(Object.keys,Object);Iee.exports=H2e});var Bee=E((Ppt,wee)=>{var G2e=u0(),j2e=yee(),Y2e=Object.prototype,q2e=Y2e.hasOwnProperty;function J2e(t){if(!G2e(t))return j2e(t);var e=[];for(var r in Object(t))q2e.call(t,r)&&r!="constructor"&&e.push(r);return e}wee.exports=J2e});var Hd=E((Dpt,Qee)=>{var W2e=zB(),z2e=ZB();function V2e(t){return t!=null&&z2e(t.length)&&!W2e(t)}Qee.exports=V2e});var zg=E((Rpt,bee)=>{var _2e=bF(),X2e=Bee(),Z2e=Hd();function $2e(t){return Z2e(t)?_2e(t):X2e(t)}bee.exports=$2e});var SF=E((Fpt,vee)=>{var eHe=BF(),tHe=zg();function rHe(t,e){return t&&eHe(t,e,tHe)}vee.exports=rHe});var xee=E((Npt,See)=>{var iHe=vd();function nHe(){this.__data__=new iHe,this.size=0}See.exports=nHe});var Pee=E((Lpt,kee)=>{function sHe(t){var e=this.__data__,r=e.delete(t);return this.size=e.size,r}kee.exports=sHe});var Ree=E((Tpt,Dee)=>{function oHe(t){return this.__data__.get(t)}Dee.exports=oHe});var Nee=E((Mpt,Fee)=>{function aHe(t){return this.__data__.has(t)}Fee.exports=aHe});var Tee=E((Opt,Lee)=>{var AHe=vd(),lHe=VB(),cHe=_B(),uHe=200;function gHe(t,e){var r=this.__data__;if(r instanceof AHe){var i=r.__data__;if(!lHe||i.length{var fHe=vd(),hHe=xee(),pHe=Pee(),dHe=Ree(),CHe=Nee(),mHe=Tee();function Vg(t){var e=this.__data__=new fHe(t);this.size=e.size}Vg.prototype.clear=hHe;Vg.prototype.delete=pHe;Vg.prototype.get=dHe;Vg.prototype.has=CHe;Vg.prototype.set=mHe;Mee.exports=Vg});var Kee=E((Upt,Oee)=>{var EHe="__lodash_hash_undefined__";function IHe(t){return this.__data__.set(t,EHe),this}Oee.exports=IHe});var Hee=E((Hpt,Uee)=>{function yHe(t){return this.__data__.has(t)}Uee.exports=yHe});var jee=E((Gpt,Gee)=>{var wHe=_B(),BHe=Kee(),QHe=Hee();function g0(t){var e=-1,r=t==null?0:t.length;for(this.__data__=new wHe;++e{function bHe(t,e){for(var r=-1,i=t==null?0:t.length;++r{function vHe(t,e){return t.has(e)}Jee.exports=vHe});var xF=E((qpt,zee)=>{var SHe=jee(),xHe=qee(),kHe=Wee(),PHe=1,DHe=2;function RHe(t,e,r,i,n,s){var o=r&PHe,a=t.length,l=e.length;if(a!=l&&!(o&&l>a))return!1;var c=s.get(t),u=s.get(e);if(c&&u)return c==e&&u==t;var g=-1,f=!0,h=r&DHe?new SHe:void 0;for(s.set(t,e),s.set(e,t);++g{var FHe=Ks(),NHe=FHe.Uint8Array;Vee.exports=NHe});var Xee=E((Wpt,_ee)=>{function LHe(t){var e=-1,r=Array(t.size);return t.forEach(function(i,n){r[++e]=[n,i]}),r}_ee.exports=LHe});var $ee=E((zpt,Zee)=>{function THe(t){var e=-1,r=Array(t.size);return t.forEach(function(i){r[++e]=i}),r}Zee.exports=THe});var nte=E((Vpt,ete)=>{var tte=ac(),rte=kF(),MHe=Kg(),OHe=xF(),KHe=Xee(),UHe=$ee(),HHe=1,GHe=2,jHe="[object Boolean]",YHe="[object Date]",qHe="[object Error]",JHe="[object Map]",WHe="[object Number]",zHe="[object RegExp]",VHe="[object Set]",_He="[object String]",XHe="[object Symbol]",ZHe="[object ArrayBuffer]",$He="[object DataView]",ite=tte?tte.prototype:void 0,PF=ite?ite.valueOf:void 0;function eGe(t,e,r,i,n,s,o){switch(r){case $He:if(t.byteLength!=e.byteLength||t.byteOffset!=e.byteOffset)return!1;t=t.buffer,e=e.buffer;case ZHe:return!(t.byteLength!=e.byteLength||!s(new rte(t),new rte(e)));case jHe:case YHe:case WHe:return MHe(+t,+e);case qHe:return t.name==e.name&&t.message==e.message;case zHe:case _He:return t==e+"";case JHe:var a=KHe;case VHe:var l=i&HHe;if(a||(a=UHe),t.size!=e.size&&!l)return!1;var c=o.get(t);if(c)return c==e;i|=GHe,o.set(t,e);var u=OHe(a(t),a(e),i,n,s,o);return o.delete(t),u;case XHe:if(PF)return PF.call(t)==PF.call(e)}return!1}ete.exports=eGe});var DF=E((_pt,ste)=>{var tGe=$B(),rGe=As();function iGe(t,e,r){var i=e(t);return rGe(t)?i:tGe(i,r(t))}ste.exports=iGe});var ate=E((Xpt,ote)=>{function nGe(t,e){for(var r=-1,i=t==null?0:t.length,n=0,s=[];++r{function sGe(){return[]}Ate.exports=sGe});var f0=E(($pt,lte)=>{var oGe=ate(),aGe=RF(),AGe=Object.prototype,lGe=AGe.propertyIsEnumerable,cte=Object.getOwnPropertySymbols,cGe=cte?function(t){return t==null?[]:(t=Object(t),oGe(cte(t),function(e){return lGe.call(t,e)}))}:aGe;lte.exports=cGe});var FF=E((edt,ute)=>{var uGe=DF(),gGe=f0(),fGe=zg();function hGe(t){return uGe(t,fGe,gGe)}ute.exports=hGe});var hte=E((tdt,gte)=>{var fte=FF(),pGe=1,dGe=Object.prototype,CGe=dGe.hasOwnProperty;function mGe(t,e,r,i,n,s){var o=r&pGe,a=fte(t),l=a.length,c=fte(e),u=c.length;if(l!=u&&!o)return!1;for(var g=l;g--;){var f=a[g];if(!(o?f in e:CGe.call(e,f)))return!1}var h=s.get(t),p=s.get(e);if(h&&p)return h==e&&p==t;var d=!0;s.set(t,e),s.set(e,t);for(var m=o;++g{var EGe=UA(),IGe=Ks(),yGe=EGe(IGe,"DataView");pte.exports=yGe});var mte=E((idt,Cte)=>{var wGe=UA(),BGe=Ks(),QGe=wGe(BGe,"Promise");Cte.exports=QGe});var Ite=E((ndt,Ete)=>{var bGe=UA(),vGe=Ks(),SGe=bGe(vGe,"Set");Ete.exports=SGe});var wte=E((sdt,yte)=>{var xGe=UA(),kGe=Ks(),PGe=xGe(kGe,"WeakMap");yte.exports=PGe});var jd=E((odt,Bte)=>{var NF=dte(),LF=VB(),TF=mte(),MF=Ite(),OF=wte(),Qte=Ac(),_g=ZR(),bte="[object Map]",DGe="[object Object]",vte="[object Promise]",Ste="[object Set]",xte="[object WeakMap]",kte="[object DataView]",RGe=_g(NF),FGe=_g(LF),NGe=_g(TF),LGe=_g(MF),TGe=_g(OF),kc=Qte;(NF&&kc(new NF(new ArrayBuffer(1)))!=kte||LF&&kc(new LF)!=bte||TF&&kc(TF.resolve())!=vte||MF&&kc(new MF)!=Ste||OF&&kc(new OF)!=xte)&&(kc=function(t){var e=Qte(t),r=e==DGe?t.constructor:void 0,i=r?_g(r):"";if(i)switch(i){case RGe:return kte;case FGe:return bte;case NGe:return vte;case LGe:return Ste;case TGe:return xte}return e});Bte.exports=kc});var Mte=E((adt,Pte)=>{var KF=Gd(),MGe=xF(),OGe=nte(),KGe=hte(),Dte=jd(),Rte=As(),Fte=Od(),UGe=c0(),HGe=1,Nte="[object Arguments]",Lte="[object Array]",h0="[object Object]",GGe=Object.prototype,Tte=GGe.hasOwnProperty;function jGe(t,e,r,i,n,s){var o=Rte(t),a=Rte(e),l=o?Lte:Dte(t),c=a?Lte:Dte(e);l=l==Nte?h0:l,c=c==Nte?h0:c;var u=l==h0,g=c==h0,f=l==c;if(f&&Fte(t)){if(!Fte(e))return!1;o=!0,u=!1}if(f&&!u)return s||(s=new KF),o||UGe(t)?MGe(t,e,r,i,n,s):OGe(t,e,l,r,i,n,s);if(!(r&HGe)){var h=u&&Tte.call(t,"__wrapped__"),p=g&&Tte.call(e,"__wrapped__");if(h||p){var d=h?t.value():t,m=p?e.value():e;return s||(s=new KF),n(d,m,r,i,s)}}return f?(s||(s=new KF),KGe(t,e,r,i,n,s)):!1}Pte.exports=jGe});var UF=E((Adt,Ote)=>{var YGe=Mte(),Kte=Qo();function Ute(t,e,r,i,n){return t===e?!0:t==null||e==null||!Kte(t)&&!Kte(e)?t!==t&&e!==e:YGe(t,e,r,i,Ute,n)}Ote.exports=Ute});var Gte=E((ldt,Hte)=>{var qGe=Gd(),JGe=UF(),WGe=1,zGe=2;function VGe(t,e,r,i){var n=r.length,s=n,o=!i;if(t==null)return!s;for(t=Object(t);n--;){var a=r[n];if(o&&a[2]?a[1]!==t[a[0]]:!(a[0]in t))return!1}for(;++n{var _Ge=Gs();function XGe(t){return t===t&&!_Ge(t)}jte.exports=XGe});var qte=E((udt,Yte)=>{var ZGe=HF(),$Ge=zg();function eje(t){for(var e=$Ge(t),r=e.length;r--;){var i=e[r],n=t[i];e[r]=[i,n,ZGe(n)]}return e}Yte.exports=eje});var GF=E((gdt,Jte)=>{function tje(t,e){return function(r){return r==null?!1:r[t]===e&&(e!==void 0||t in Object(r))}}Jte.exports=tje});var zte=E((fdt,Wte)=>{var rje=Gte(),ije=qte(),nje=GF();function sje(t){var e=ije(t);return e.length==1&&e[0][2]?nje(e[0][0],e[0][1]):function(r){return r===t||rje(r,t,e)}}Wte.exports=sje});var p0=E((hdt,Vte)=>{var oje=xd();function aje(t,e,r){var i=t==null?void 0:oje(t,e);return i===void 0?r:i}Vte.exports=aje});var Xte=E((pdt,_te)=>{var Aje=UF(),lje=p0(),cje=iF(),uje=WB(),gje=HF(),fje=GF(),hje=Sc(),pje=1,dje=2;function Cje(t,e){return uje(t)&&gje(e)?fje(hje(t),e):function(r){var i=lje(r,t);return i===void 0&&i===e?cje(r,t):Aje(e,i,pje|dje)}}_te.exports=Cje});var $te=E((ddt,Zte)=>{function mje(t){return function(e){return e==null?void 0:e[t]}}Zte.exports=mje});var tre=E((Cdt,ere)=>{var Eje=xd();function Ije(t){return function(e){return Eje(e,t)}}ere.exports=Ije});var ire=E((mdt,rre)=>{var yje=$te(),wje=tre(),Bje=WB(),Qje=Sc();function bje(t){return Bje(t)?yje(Qje(t)):wje(t)}rre.exports=bje});var jF=E((Edt,nre)=>{var vje=zte(),Sje=Xte(),xje=e0(),kje=As(),Pje=ire();function Dje(t){return typeof t=="function"?t:t==null?xje:typeof t=="object"?kje(t)?Sje(t[0],t[1]):vje(t):Pje(t)}nre.exports=Dje});var YF=E((Idt,sre)=>{var Rje=jg(),Fje=SF(),Nje=jF();function Lje(t,e){var r={};return e=Nje(e,3),Fje(t,function(i,n,s){Rje(r,n,e(i,n,s))}),r}sre.exports=Lje});var Yd=E((ydt,ore)=>{"use strict";function Pc(t){this._maxSize=t,this.clear()}Pc.prototype.clear=function(){this._size=0,this._values=Object.create(null)};Pc.prototype.get=function(t){return this._values[t]};Pc.prototype.set=function(t,e){return this._size>=this._maxSize&&this.clear(),t in this._values||this._size++,this._values[t]=e};var Tje=/[^.^\]^[]+|(?=\[\]|\.\.)/g,are=/^\d+$/,Mje=/^\d/,Oje=/[~`!#$%\^&*+=\-\[\]\\';,/{}|\\":<>\?]/g,Kje=/^\s*(['"]?)(.*?)(\1)\s*$/,qF=512,Are=new Pc(qF),lre=new Pc(qF),cre=new Pc(qF);ore.exports={Cache:Pc,split:WF,normalizePath:JF,setter:function(t){var e=JF(t);return lre.get(t)||lre.set(t,function(i,n){for(var s=0,o=e.length,a=i;s{"use strict";Object.defineProperty(qd,"__esModule",{value:!0});qd.create=Yje;qd.default=void 0;var qje=Yd(),d0={context:"$",value:"."};function Yje(t,e){return new C0(t,e)}var C0=class{constructor(e,r={}){if(typeof e!="string")throw new TypeError("ref must be a string, got: "+e);if(this.key=e.trim(),e==="")throw new TypeError("ref must be a non-empty string");this.isContext=this.key[0]===d0.context,this.isValue=this.key[0]===d0.value,this.isSibling=!this.isContext&&!this.isValue;let i=this.isContext?d0.context:this.isValue?d0.value:"";this.path=this.key.slice(i.length),this.getter=this.path&&(0,qje.getter)(this.path,!0),this.map=r.map}getValue(e,r,i){let n=this.isContext?i:this.isValue?e:r;return this.getter&&(n=this.getter(n||{})),this.map&&(n=this.map(n)),n}cast(e,r){return this.getValue(e,r==null?void 0:r.parent,r==null?void 0:r.context)}resolve(){return this}describe(){return{type:"ref",key:this.key}}toString(){return`Ref(${this.key})`}static isRef(e){return e&&e.__isYupRef}};qd.default=C0;C0.prototype.__isYupRef=!0});var ure=E(VF=>{"use strict";Object.defineProperty(VF,"__esModule",{value:!0});VF.default=Jje;var Wje=_F(YF()),m0=_F(xc()),zje=_F(Dc());function _F(t){return t&&t.__esModule?t:{default:t}}function E0(){return E0=Object.assign||function(t){for(var e=1;e=0)&&(r[n]=t[n]);return r}function Jje(t){function e(r,i){let{value:n,path:s="",label:o,options:a,originalValue:l,sync:c}=r,u=Vje(r,["value","path","label","options","originalValue","sync"]),{name:g,test:f,params:h,message:p}=t,{parent:d,context:m}=a;function I(L){return zje.default.isRef(L)?L.getValue(n,d,m):L}function B(L={}){let K=(0,Wje.default)(E0({value:n,originalValue:l,label:o,path:L.path||s},h,L.params),I),J=new m0.default(m0.default.formatError(L.message||p,K),n,K.path,L.type||g);return J.params=K,J}let b=E0({path:s,parent:d,type:g,createError:B,resolve:I,options:a,originalValue:l},u);if(!c){try{Promise.resolve(f.call(b,n,b)).then(L=>{m0.default.isError(L)?i(L):L?i(null,L):i(B())})}catch(L){i(L)}return}let R;try{var H;if(R=f.call(b,n,b),typeof((H=R)==null?void 0:H.then)=="function")throw new Error(`Validation test of type: "${b.type}" returned a Promise during a synchronous validate. This test will finish after the validate call has returned`)}catch(L){i(L);return}m0.default.isError(R)?i(R):R?i(null,R):i(B())}return e.OPTIONS=t,e}});var XF=E(Jd=>{"use strict";Object.defineProperty(Jd,"__esModule",{value:!0});Jd.getIn=gre;Jd.default=void 0;var _je=Yd(),Xje=t=>t.substr(0,t.length-1).substr(1);function gre(t,e,r,i=r){let n,s,o;return e?((0,_je.forEach)(e,(a,l,c)=>{let u=l?Xje(a):a;if(t=t.resolve({context:i,parent:n,value:r}),t.innerType){let g=c?parseInt(u,10):0;if(r&&g>=r.length)throw new Error(`Yup.reach cannot resolve an array item at index: ${a}, in the path: ${e}. because there is no value at that index. `);n=r,r=r&&r[g],t=t.innerType}if(!c){if(!t.fields||!t.fields[u])throw new Error(`The schema does not contain the path: ${e}. (failed at: ${o} which is a type: "${t._type}")`);n=r,r=r&&r[u],t=t.fields[u]}s=u,o=l?"["+a+"]":"."+a}),{schema:t,parent:n,parentPath:s}):{parent:n,parentPath:e,schema:t}}var Zje=(t,e,r,i)=>gre(t,e,r,i).schema,$je=Zje;Jd.default=$je});var hre=E(I0=>{"use strict";Object.defineProperty(I0,"__esModule",{value:!0});I0.default=void 0;var fre=eYe(Dc());function eYe(t){return t&&t.__esModule?t:{default:t}}var y0=class{constructor(){this.list=new Set,this.refs=new Map}get size(){return this.list.size+this.refs.size}describe(){let e=[];for(let r of this.list)e.push(r);for(let[,r]of this.refs)e.push(r.describe());return e}toArray(){return Array.from(this.list).concat(Array.from(this.refs.values()))}add(e){fre.default.isRef(e)?this.refs.set(e.key,e):this.list.add(e)}delete(e){fre.default.isRef(e)?this.refs.delete(e.key):this.list.delete(e)}has(e,r){if(this.list.has(e))return!0;let i,n=this.refs.values();for(;i=n.next(),!i.done;)if(r(i.value)===e)return!0;return!1}clone(){let e=new y0;return e.list=new Set(this.list),e.refs=new Map(this.refs),e}merge(e,r){let i=this.clone();return e.list.forEach(n=>i.add(n)),e.refs.forEach(n=>i.add(n)),r.list.forEach(n=>i.delete(n)),r.refs.forEach(n=>i.delete(n)),i}};I0.default=y0});var Ma=E(w0=>{"use strict";Object.defineProperty(w0,"__esModule",{value:!0});w0.default=void 0;var pre=Ta(M$()),Xg=La(),tYe=Ta(Z$()),dre=Ta(a0()),B0=Ta(ure()),Cre=Ta(Nd()),rYe=Ta(Dc()),iYe=XF(),nYe=Ta(EF()),mre=Ta(xc()),Ere=Ta(hre());function Ta(t){return t&&t.__esModule?t:{default:t}}function ds(){return ds=Object.assign||function(t){for(var e=1;e{this.typeError(Xg.mixed.notType)}),this.type=(e==null?void 0:e.type)||"mixed",this.spec=ds({strip:!1,strict:!1,abortEarly:!0,recursive:!0,nullable:!1,presence:"optional"},e==null?void 0:e.spec)}get _type(){return this.type}_typeCheck(e){return!0}clone(e){if(this._mutate)return e&&Object.assign(this.spec,e),this;let r=Object.create(Object.getPrototypeOf(this));return r.type=this.type,r._typeError=this._typeError,r._whitelistError=this._whitelistError,r._blacklistError=this._blacklistError,r._whitelist=this._whitelist.clone(),r._blacklist=this._blacklist.clone(),r.exclusiveTests=ds({},this.exclusiveTests),r.deps=[...this.deps],r.conditions=[...this.conditions],r.tests=[...this.tests],r.transforms=[...this.transforms],r.spec=(0,pre.default)(ds({},this.spec,e)),r}label(e){var r=this.clone();return r.spec.label=e,r}meta(...e){if(e.length===0)return this.spec.meta;let r=this.clone();return r.spec.meta=Object.assign(r.spec.meta||{},e[0]),r}withMutation(e){let r=this._mutate;this._mutate=!0;let i=e(this);return this._mutate=r,i}concat(e){if(!e||e===this)return this;if(e.type!==this.type&&this.type!=="mixed")throw new TypeError(`You cannot \`concat()\` schema's of different types: ${this.type} and ${e.type}`);let r=this,i=e.clone(),n=ds({},r.spec,i.spec);return i.spec=n,i._typeError||(i._typeError=r._typeError),i._whitelistError||(i._whitelistError=r._whitelistError),i._blacklistError||(i._blacklistError=r._blacklistError),i._whitelist=r._whitelist.merge(e._whitelist,e._blacklist),i._blacklist=r._blacklist.merge(e._blacklist,e._whitelist),i.tests=r.tests,i.exclusiveTests=r.exclusiveTests,i.withMutation(s=>{e.tests.forEach(o=>{s.test(o.OPTIONS)})}),i}isType(e){return this.spec.nullable&&e===null?!0:this._typeCheck(e)}resolve(e){let r=this;if(r.conditions.length){let i=r.conditions;r=r.clone(),r.conditions=[],r=i.reduce((n,s)=>s.resolve(n,e),r),r=r.resolve(e)}return r}cast(e,r={}){let i=this.resolve(ds({value:e},r)),n=i._cast(e,r);if(e!==void 0&&r.assert!==!1&&i.isType(n)!==!0){let s=(0,Cre.default)(e),o=(0,Cre.default)(n);throw new TypeError(`The value of ${r.path||"field"} could not be cast to a value that satisfies the schema type: "${i._type}". + +attempted value: ${s} +`+(o!==s?`result of cast: ${o}`:""))}return n}_cast(e,r){let i=e===void 0?e:this.transforms.reduce((n,s)=>s.call(this,n,e,this),e);return i===void 0&&(i=this.getDefault()),i}_validate(e,r={},i){let{sync:n,path:s,from:o=[],originalValue:a=e,strict:l=this.spec.strict,abortEarly:c=this.spec.abortEarly}=r,u=e;l||(u=this._cast(u,ds({assert:!1},r)));let g={value:u,path:s,options:r,originalValue:a,schema:this,label:this.spec.label,sync:n,from:o},f=[];this._typeError&&f.push(this._typeError),this._whitelistError&&f.push(this._whitelistError),this._blacklistError&&f.push(this._blacklistError),(0,dre.default)({args:g,value:u,path:s,sync:n,tests:f,endEarly:c},h=>{if(h)return void i(h,u);(0,dre.default)({tests:this.tests,args:g,path:s,sync:n,value:u,endEarly:c},i)})}validate(e,r,i){let n=this.resolve(ds({},r,{value:e}));return typeof i=="function"?n._validate(e,r,i):new Promise((s,o)=>n._validate(e,r,(a,l)=>{a?o(a):s(l)}))}validateSync(e,r){let i=this.resolve(ds({},r,{value:e})),n;return i._validate(e,ds({},r,{sync:!0}),(s,o)=>{if(s)throw s;n=o}),n}isValid(e,r){return this.validate(e,r).then(()=>!0,i=>{if(mre.default.isError(i))return!1;throw i})}isValidSync(e,r){try{return this.validateSync(e,r),!0}catch(i){if(mre.default.isError(i))return!1;throw i}}_getDefault(){let e=this.spec.default;return e==null?e:typeof e=="function"?e.call(this):(0,pre.default)(e)}getDefault(e){return this.resolve(e||{})._getDefault()}default(e){return arguments.length===0?this._getDefault():this.clone({default:e})}strict(e=!0){var r=this.clone();return r.spec.strict=e,r}_isPresent(e){return e!=null}defined(e=Xg.mixed.defined){return this.test({message:e,name:"defined",exclusive:!0,test(r){return r!==void 0}})}required(e=Xg.mixed.required){return this.clone({presence:"required"}).withMutation(r=>r.test({message:e,name:"required",exclusive:!0,test(i){return this.schema._isPresent(i)}}))}notRequired(){var e=this.clone({presence:"optional"});return e.tests=e.tests.filter(r=>r.OPTIONS.name!=="required"),e}nullable(e=!0){var r=this.clone({nullable:e!==!1});return r}transform(e){var r=this.clone();return r.transforms.push(e),r}test(...e){let r;if(e.length===1?typeof e[0]=="function"?r={test:e[0]}:r=e[0]:e.length===2?r={name:e[0],test:e[1]}:r={name:e[0],message:e[1],test:e[2]},r.message===void 0&&(r.message=Xg.mixed.default),typeof r.test!="function")throw new TypeError("`test` is a required parameters");let i=this.clone(),n=(0,B0.default)(r),s=r.exclusive||r.name&&i.exclusiveTests[r.name]===!0;if(r.exclusive&&!r.name)throw new TypeError("Exclusive tests must provide a unique `name` identifying the test");return r.name&&(i.exclusiveTests[r.name]=!!r.exclusive),i.tests=i.tests.filter(o=>!(o.OPTIONS.name===r.name&&(s||o.OPTIONS.test===n.OPTIONS.test))),i.tests.push(n),i}when(e,r){!Array.isArray(e)&&typeof e!="string"&&(r=e,e=".");let i=this.clone(),n=(0,nYe.default)(e).map(s=>new rYe.default(s));return n.forEach(s=>{s.isSibling&&i.deps.push(s.key)}),i.conditions.push(new tYe.default(n,r)),i}typeError(e){var r=this.clone();return r._typeError=(0,B0.default)({message:e,name:"typeError",test(i){return i!==void 0&&!this.schema.isType(i)?this.createError({params:{type:this.schema._type}}):!0}}),r}oneOf(e,r=Xg.mixed.oneOf){var i=this.clone();return e.forEach(n=>{i._whitelist.add(n),i._blacklist.delete(n)}),i._whitelistError=(0,B0.default)({message:r,name:"oneOf",test(n){if(n===void 0)return!0;let s=this.schema._whitelist;return s.has(n,this.resolve)?!0:this.createError({params:{values:s.toArray().join(", ")}})}}),i}notOneOf(e,r=Xg.mixed.notOneOf){var i=this.clone();return e.forEach(n=>{i._blacklist.add(n),i._whitelist.delete(n)}),i._blacklistError=(0,B0.default)({message:r,name:"notOneOf",test(n){let s=this.schema._blacklist;return s.has(n,this.resolve)?this.createError({params:{values:s.toArray().join(", ")}}):!0}}),i}strip(e=!0){let r=this.clone();return r.spec.strip=e,r}describe(){let e=this.clone(),{label:r,meta:i}=e.spec;return{meta:i,label:r,type:e.type,oneOf:e._whitelist.describe(),notOneOf:e._blacklist.describe(),tests:e.tests.map(s=>({name:s.OPTIONS.name,params:s.OPTIONS.params})).filter((s,o,a)=>a.findIndex(l=>l.name===s.name)===o)}}};w0.default=Do;Do.prototype.__isYupSchema__=!0;for(let t of["validate","validateSync"])Do.prototype[`${t}At`]=function(e,r,i={}){let{parent:n,parentPath:s,schema:o}=(0,iYe.getIn)(this,e,r,i.context);return o[t](n&&n[s],ds({},i,{parent:n,path:e}))};for(let t of["equals","is"])Do.prototype[t]=Do.prototype.oneOf;for(let t of["not","nope"])Do.prototype[t]=Do.prototype.notOneOf;Do.prototype.optional=Do.prototype.notRequired});var yre=E(Wd=>{"use strict";Object.defineProperty(Wd,"__esModule",{value:!0});Wd.create=Ire;Wd.default=void 0;var oYe=sYe(Ma());function sYe(t){return t&&t.__esModule?t:{default:t}}var ZF=oYe.default,aYe=ZF;Wd.default=aYe;function Ire(){return new ZF}Ire.prototype=ZF.prototype});var Zg=E(Q0=>{"use strict";Object.defineProperty(Q0,"__esModule",{value:!0});Q0.default=void 0;var AYe=t=>t==null;Q0.default=AYe});var vre=E(zd=>{"use strict";Object.defineProperty(zd,"__esModule",{value:!0});zd.create=wre;zd.default=void 0;var lYe=Bre(Ma()),Qre=La(),bre=Bre(Zg());function Bre(t){return t&&t.__esModule?t:{default:t}}function wre(){return new b0}var b0=class extends lYe.default{constructor(){super({type:"boolean"});this.withMutation(()=>{this.transform(function(e){if(!this.isType(e)){if(/^(true|1)$/i.test(String(e)))return!0;if(/^(false|0)$/i.test(String(e)))return!1}return e})})}_typeCheck(e){return e instanceof Boolean&&(e=e.valueOf()),typeof e=="boolean"}isTrue(e=Qre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"true"},test(r){return(0,bre.default)(r)||r===!0}})}isFalse(e=Qre.boolean.isValue){return this.test({message:e,name:"is-value",exclusive:!0,params:{value:"false"},test(r){return(0,bre.default)(r)||r===!1}})}};zd.default=b0;wre.prototype=b0.prototype});var kre=E(Vd=>{"use strict";Object.defineProperty(Vd,"__esModule",{value:!0});Vd.create=Sre;Vd.default=void 0;var Ro=La(),Oa=xre(Zg()),cYe=xre(Ma());function xre(t){return t&&t.__esModule?t:{default:t}}var uYe=/^((([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+(\.([a-z]|\d|[!#\$%&'\*\+\-\/=\?\^_`{\|}~]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])+)*)|((\x22)((((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(([\x01-\x08\x0b\x0c\x0e-\x1f\x7f]|\x21|[\x23-\x5b]|[\x5d-\x7e]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(\\([\x01-\x09\x0b\x0c\x0d-\x7f]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]))))*(((\x20|\x09)*(\x0d\x0a))?(\x20|\x09)+)?(\x22)))@((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))$/i,gYe=/^((https?|ftp):)?\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(\#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i,fYe=/^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i,hYe=t=>(0,Oa.default)(t)||t===t.trim(),pYe={}.toString();function Sre(){return new v0}var v0=class extends cYe.default{constructor(){super({type:"string"});this.withMutation(()=>{this.transform(function(e){if(this.isType(e)||Array.isArray(e))return e;let r=e!=null&&e.toString?e.toString():e;return r===pYe?e:r})})}_typeCheck(e){return e instanceof String&&(e=e.valueOf()),typeof e=="string"}_isPresent(e){return super._isPresent(e)&&!!e.length}length(e,r=Ro.string.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,Oa.default)(i)||i.length===this.resolve(e)}})}min(e,r=Ro.string.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Oa.default)(i)||i.length>=this.resolve(e)}})}max(e,r=Ro.string.max){return this.test({name:"max",exclusive:!0,message:r,params:{max:e},test(i){return(0,Oa.default)(i)||i.length<=this.resolve(e)}})}matches(e,r){let i=!1,n,s;return r&&(typeof r=="object"?{excludeEmptyString:i=!1,message:n,name:s}=r:n=r),this.test({name:s||"matches",message:n||Ro.string.matches,params:{regex:e},test:o=>(0,Oa.default)(o)||o===""&&i||o.search(e)!==-1})}email(e=Ro.string.email){return this.matches(uYe,{name:"email",message:e,excludeEmptyString:!0})}url(e=Ro.string.url){return this.matches(gYe,{name:"url",message:e,excludeEmptyString:!0})}uuid(e=Ro.string.uuid){return this.matches(fYe,{name:"uuid",message:e,excludeEmptyString:!1})}ensure(){return this.default("").transform(e=>e===null?"":e)}trim(e=Ro.string.trim){return this.transform(r=>r!=null?r.trim():r).test({message:e,name:"trim",test:hYe})}lowercase(e=Ro.string.lowercase){return this.transform(r=>(0,Oa.default)(r)?r:r.toLowerCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,Oa.default)(r)||r===r.toLowerCase()})}uppercase(e=Ro.string.uppercase){return this.transform(r=>(0,Oa.default)(r)?r:r.toUpperCase()).test({message:e,name:"string_case",exclusive:!0,test:r=>(0,Oa.default)(r)||r===r.toUpperCase()})}};Vd.default=v0;Sre.prototype=v0.prototype});var Rre=E(_d=>{"use strict";Object.defineProperty(_d,"__esModule",{value:!0});_d.create=Pre;_d.default=void 0;var Rc=La(),Fc=Dre(Zg()),dYe=Dre(Ma());function Dre(t){return t&&t.__esModule?t:{default:t}}var CYe=t=>t!=+t;function Pre(){return new S0}var S0=class extends dYe.default{constructor(){super({type:"number"});this.withMutation(()=>{this.transform(function(e){let r=e;if(typeof r=="string"){if(r=r.replace(/\s/g,""),r==="")return NaN;r=+r}return this.isType(r)?r:parseFloat(r)})})}_typeCheck(e){return e instanceof Number&&(e=e.valueOf()),typeof e=="number"&&!CYe(e)}min(e,r=Rc.number.min){return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,Fc.default)(i)||i>=this.resolve(e)}})}max(e,r=Rc.number.max){return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,Fc.default)(i)||i<=this.resolve(e)}})}lessThan(e,r=Rc.number.lessThan){return this.test({message:r,name:"max",exclusive:!0,params:{less:e},test(i){return(0,Fc.default)(i)||ithis.resolve(e)}})}positive(e=Rc.number.positive){return this.moreThan(0,e)}negative(e=Rc.number.negative){return this.lessThan(0,e)}integer(e=Rc.number.integer){return this.test({name:"integer",message:e,test:r=>(0,Fc.default)(r)||Number.isInteger(r)})}truncate(){return this.transform(e=>(0,Fc.default)(e)?e:e|0)}round(e){var r,i=["ceil","floor","round","trunc"];if(e=((r=e)==null?void 0:r.toLowerCase())||"round",e==="trunc")return this.truncate();if(i.indexOf(e.toLowerCase())===-1)throw new TypeError("Only valid options for round() are: "+i.join(", "));return this.transform(n=>(0,Fc.default)(n)?n:Math[e](n))}};_d.default=S0;Pre.prototype=S0.prototype});var Fre=E($F=>{"use strict";Object.defineProperty($F,"__esModule",{value:!0});$F.default=mYe;var EYe=/^(\d{4}|[+\-]\d{6})(?:-?(\d{2})(?:-?(\d{2}))?)?(?:[ T]?(\d{2}):?(\d{2})(?::?(\d{2})(?:[,\.](\d{1,}))?)?(?:(Z)|([+\-])(\d{2})(?::?(\d{2}))?)?)?$/;function mYe(t){var e=[1,4,5,6,7,10,11],r=0,i,n;if(n=EYe.exec(t)){for(var s=0,o;o=e[s];++s)n[o]=+n[o]||0;n[2]=(+n[2]||1)-1,n[3]=+n[3]||1,n[7]=n[7]?String(n[7]).substr(0,3):0,(n[8]===void 0||n[8]==="")&&(n[9]===void 0||n[9]==="")?i=+new Date(n[1],n[2],n[3],n[4],n[5],n[6],n[7]):(n[8]!=="Z"&&n[9]!==void 0&&(r=n[10]*60+n[11],n[9]==="+"&&(r=0-r)),i=Date.UTC(n[1],n[2],n[3],n[4],n[5]+r,n[6],n[7]))}else i=Date.parse?Date.parse(t):NaN;return i}});var Tre=E(Xd=>{"use strict";Object.defineProperty(Xd,"__esModule",{value:!0});Xd.create=eN;Xd.default=void 0;var IYe=x0(Fre()),Nre=La(),Lre=x0(Zg()),yYe=x0(Dc()),wYe=x0(Ma());function x0(t){return t&&t.__esModule?t:{default:t}}var tN=new Date(""),BYe=t=>Object.prototype.toString.call(t)==="[object Date]";function eN(){return new Zd}var Zd=class extends wYe.default{constructor(){super({type:"date"});this.withMutation(()=>{this.transform(function(e){return this.isType(e)?e:(e=(0,IYe.default)(e),isNaN(e)?tN:new Date(e))})})}_typeCheck(e){return BYe(e)&&!isNaN(e.getTime())}prepareParam(e,r){let i;if(yYe.default.isRef(e))i=e;else{let n=this.cast(e);if(!this._typeCheck(n))throw new TypeError(`\`${r}\` must be a Date or a value that can be \`cast()\` to a Date`);i=n}return i}min(e,r=Nre.date.min){let i=this.prepareParam(e,"min");return this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(n){return(0,Lre.default)(n)||n>=this.resolve(i)}})}max(e,r=Nre.date.max){var i=this.prepareParam(e,"max");return this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(n){return(0,Lre.default)(n)||n<=this.resolve(i)}})}};Xd.default=Zd;Zd.INVALID_DATE=tN;eN.prototype=Zd.prototype;eN.INVALID_DATE=tN});var Ore=E((Ndt,Mre)=>{function QYe(t,e,r,i){var n=-1,s=t==null?0:t.length;for(i&&s&&(r=t[++n]);++n{function bYe(t){return function(e){return t==null?void 0:t[e]}}Kre.exports=bYe});var Gre=E((Tdt,Hre)=>{var vYe=Ure(),SYe={\u00C0:"A",\u00C1:"A",\u00C2:"A",\u00C3:"A",\u00C4:"A",\u00C5:"A",\u00E0:"a",\u00E1:"a",\u00E2:"a",\u00E3:"a",\u00E4:"a",\u00E5:"a",\u00C7:"C",\u00E7:"c",\u00D0:"D",\u00F0:"d",\u00C8:"E",\u00C9:"E",\u00CA:"E",\u00CB:"E",\u00E8:"e",\u00E9:"e",\u00EA:"e",\u00EB:"e",\u00CC:"I",\u00CD:"I",\u00CE:"I",\u00CF:"I",\u00EC:"i",\u00ED:"i",\u00EE:"i",\u00EF:"i",\u00D1:"N",\u00F1:"n",\u00D2:"O",\u00D3:"O",\u00D4:"O",\u00D5:"O",\u00D6:"O",\u00D8:"O",\u00F2:"o",\u00F3:"o",\u00F4:"o",\u00F5:"o",\u00F6:"o",\u00F8:"o",\u00D9:"U",\u00DA:"U",\u00DB:"U",\u00DC:"U",\u00F9:"u",\u00FA:"u",\u00FB:"u",\u00FC:"u",\u00DD:"Y",\u00FD:"y",\u00FF:"y",\u00C6:"Ae",\u00E6:"ae",\u00DE:"Th",\u00FE:"th",\u00DF:"ss",\u0100:"A",\u0102:"A",\u0104:"A",\u0101:"a",\u0103:"a",\u0105:"a",\u0106:"C",\u0108:"C",\u010A:"C",\u010C:"C",\u0107:"c",\u0109:"c",\u010B:"c",\u010D:"c",\u010E:"D",\u0110:"D",\u010F:"d",\u0111:"d",\u0112:"E",\u0114:"E",\u0116:"E",\u0118:"E",\u011A:"E",\u0113:"e",\u0115:"e",\u0117:"e",\u0119:"e",\u011B:"e",\u011C:"G",\u011E:"G",\u0120:"G",\u0122:"G",\u011D:"g",\u011F:"g",\u0121:"g",\u0123:"g",\u0124:"H",\u0126:"H",\u0125:"h",\u0127:"h",\u0128:"I",\u012A:"I",\u012C:"I",\u012E:"I",\u0130:"I",\u0129:"i",\u012B:"i",\u012D:"i",\u012F:"i",\u0131:"i",\u0134:"J",\u0135:"j",\u0136:"K",\u0137:"k",\u0138:"k",\u0139:"L",\u013B:"L",\u013D:"L",\u013F:"L",\u0141:"L",\u013A:"l",\u013C:"l",\u013E:"l",\u0140:"l",\u0142:"l",\u0143:"N",\u0145:"N",\u0147:"N",\u014A:"N",\u0144:"n",\u0146:"n",\u0148:"n",\u014B:"n",\u014C:"O",\u014E:"O",\u0150:"O",\u014D:"o",\u014F:"o",\u0151:"o",\u0154:"R",\u0156:"R",\u0158:"R",\u0155:"r",\u0157:"r",\u0159:"r",\u015A:"S",\u015C:"S",\u015E:"S",\u0160:"S",\u015B:"s",\u015D:"s",\u015F:"s",\u0161:"s",\u0162:"T",\u0164:"T",\u0166:"T",\u0163:"t",\u0165:"t",\u0167:"t",\u0168:"U",\u016A:"U",\u016C:"U",\u016E:"U",\u0170:"U",\u0172:"U",\u0169:"u",\u016B:"u",\u016D:"u",\u016F:"u",\u0171:"u",\u0173:"u",\u0174:"W",\u0175:"w",\u0176:"Y",\u0177:"y",\u0178:"Y",\u0179:"Z",\u017B:"Z",\u017D:"Z",\u017A:"z",\u017C:"z",\u017E:"z",\u0132:"IJ",\u0133:"ij",\u0152:"Oe",\u0153:"oe",\u0149:"'n",\u017F:"s"},xYe=vYe(SYe);Hre.exports=xYe});var Yre=E((Mdt,jre)=>{var kYe=Gre(),PYe=gg(),DYe=/[\xc0-\xd6\xd8-\xf6\xf8-\xff\u0100-\u017f]/g,RYe="\\u0300-\\u036f",FYe="\\ufe20-\\ufe2f",NYe="\\u20d0-\\u20ff",LYe=RYe+FYe+NYe,TYe="["+LYe+"]",MYe=RegExp(TYe,"g");function OYe(t){return t=PYe(t),t&&t.replace(DYe,kYe).replace(MYe,"")}jre.exports=OYe});var Jre=E((Odt,qre)=>{var KYe=/[^\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+/g;function UYe(t){return t.match(KYe)||[]}qre.exports=UYe});var zre=E((Kdt,Wre)=>{var HYe=/[a-z][A-Z]|[A-Z]{2}[a-z]|[0-9][a-zA-Z]|[a-zA-Z][0-9]|[^a-zA-Z0-9 ]/;function GYe(t){return HYe.test(t)}Wre.exports=GYe});var fie=E((Udt,Vre)=>{var _re="\\ud800-\\udfff",jYe="\\u0300-\\u036f",YYe="\\ufe20-\\ufe2f",qYe="\\u20d0-\\u20ff",JYe=jYe+YYe+qYe,Xre="\\u2700-\\u27bf",Zre="a-z\\xdf-\\xf6\\xf8-\\xff",WYe="\\xac\\xb1\\xd7\\xf7",zYe="\\x00-\\x2f\\x3a-\\x40\\x5b-\\x60\\x7b-\\xbf",VYe="\\u2000-\\u206f",_Ye=" \\t\\x0b\\f\\xa0\\ufeff\\n\\r\\u2028\\u2029\\u1680\\u180e\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200a\\u202f\\u205f\\u3000",$re="A-Z\\xc0-\\xd6\\xd8-\\xde",XYe="\\ufe0e\\ufe0f",eie=WYe+zYe+VYe+_Ye,tie="['\u2019]",rie="["+eie+"]",ZYe="["+JYe+"]",iie="\\d+",$Ye="["+Xre+"]",nie="["+Zre+"]",sie="[^"+_re+eie+iie+Xre+Zre+$re+"]",eqe="\\ud83c[\\udffb-\\udfff]",tqe="(?:"+ZYe+"|"+eqe+")",rqe="[^"+_re+"]",oie="(?:\\ud83c[\\udde6-\\uddff]){2}",aie="[\\ud800-\\udbff][\\udc00-\\udfff]",$g="["+$re+"]",iqe="\\u200d",Aie="(?:"+nie+"|"+sie+")",nqe="(?:"+$g+"|"+sie+")",lie="(?:"+tie+"(?:d|ll|m|re|s|t|ve))?",cie="(?:"+tie+"(?:D|LL|M|RE|S|T|VE))?",uie=tqe+"?",gie="["+XYe+"]?",sqe="(?:"+iqe+"(?:"+[rqe,oie,aie].join("|")+")"+gie+uie+")*",oqe="\\d*(?:1st|2nd|3rd|(?![123])\\dth)(?=\\b|[A-Z_])",aqe="\\d*(?:1ST|2ND|3RD|(?![123])\\dTH)(?=\\b|[a-z_])",Aqe=gie+uie+sqe,lqe="(?:"+[$Ye,oie,aie].join("|")+")"+Aqe,cqe=RegExp([$g+"?"+nie+"+"+lie+"(?="+[rie,$g,"$"].join("|")+")",nqe+"+"+cie+"(?="+[rie,$g+Aie,"$"].join("|")+")",$g+"?"+Aie+"+"+lie,$g+"+"+cie,aqe,oqe,iie,lqe].join("|"),"g");function uqe(t){return t.match(cqe)||[]}Vre.exports=uqe});var pie=E((Hdt,hie)=>{var gqe=Jre(),fqe=zre(),hqe=gg(),pqe=fie();function dqe(t,e,r){return t=hqe(t),e=r?void 0:e,e===void 0?fqe(t)?pqe(t):gqe(t):t.match(e)||[]}hie.exports=dqe});var rN=E((Gdt,die)=>{var Cqe=Ore(),mqe=Yre(),Eqe=pie(),Iqe="['\u2019]",yqe=RegExp(Iqe,"g");function wqe(t){return function(e){return Cqe(Eqe(mqe(e).replace(yqe,"")),t,"")}}die.exports=wqe});var mie=E((jdt,Cie)=>{var Bqe=rN(),Qqe=Bqe(function(t,e,r){return t+(r?"_":"")+e.toLowerCase()});Cie.exports=Qqe});var Iie=E((Ydt,Eie)=>{var bqe=ZP(),vqe=rN(),Sqe=vqe(function(t,e,r){return e=e.toLowerCase(),t+(r?bqe(e):e)});Eie.exports=Sqe});var wie=E((qdt,yie)=>{var xqe=jg(),kqe=SF(),Pqe=jF();function Dqe(t,e){var r={};return e=Pqe(e,3),kqe(t,function(i,n,s){xqe(r,e(i,n,s),i)}),r}yie.exports=Dqe});var Qie=E((Jdt,iN)=>{iN.exports=function(t){return Bie(Rqe(t),t)};iN.exports.array=Bie;function Bie(t,e){var r=t.length,i=new Array(r),n={},s=r,o=Fqe(e),a=Nqe(t);for(e.forEach(function(c){if(!a.has(c[0])||!a.has(c[1]))throw new Error("Unknown node. There is an unknown node in the supplied edges.")});s--;)n[s]||l(t[s],s,new Set);return i;function l(c,u,g){if(g.has(c)){var f;try{f=", node was:"+JSON.stringify(c)}catch(d){f=""}throw new Error("Cyclic dependency"+f)}if(!a.has(c))throw new Error("Found unknown node. Make sure to provided all involved nodes. Unknown node: "+JSON.stringify(c));if(!n[u]){n[u]=!0;var h=o.get(c)||new Set;if(h=Array.from(h),u=h.length){g.add(c);do{var p=h[--u];l(p,a.get(p),g)}while(u);g.delete(c)}i[--r]=c}}}function Rqe(t){for(var e=new Set,r=0,i=t.length;r{"use strict";Object.defineProperty(nN,"__esModule",{value:!0});nN.default=Lqe;var Tqe=k0(Ld()),Mqe=k0(Qie()),Oqe=Yd(),Kqe=k0(Dc()),Uqe=k0(qg());function k0(t){return t&&t.__esModule?t:{default:t}}function Lqe(t,e=[]){let r=[],i=[];function n(s,o){var a=(0,Oqe.split)(s)[0];~i.indexOf(a)||i.push(a),~e.indexOf(`${o}-${a}`)||r.push([o,a])}for(let s in t)if((0,Tqe.default)(t,s)){let o=t[s];~i.indexOf(s)||i.push(s),Kqe.default.isRef(o)&&o.isSibling?n(o.path,s):(0,Uqe.default)(o)&&"deps"in o&&o.deps.forEach(a=>n(a,s))}return Mqe.default.array(i,r).reverse()}});var Sie=E(sN=>{"use strict";Object.defineProperty(sN,"__esModule",{value:!0});sN.default=Hqe;function vie(t,e){let r=Infinity;return t.some((i,n)=>{var s;if(((s=e.path)==null?void 0:s.indexOf(i))!==-1)return r=n,!0}),r}function Hqe(t){return(e,r)=>vie(t,e)-vie(t,r)}});var Nie=E($d=>{"use strict";Object.defineProperty($d,"__esModule",{value:!0});$d.create=xie;$d.default=void 0;var kie=Fo(Ld()),Pie=Fo(mie()),Gqe=Fo(Iie()),jqe=Fo(wie()),Yqe=Fo(YF()),qqe=Yd(),Die=La(),Jqe=Fo(bie()),Rie=Fo(Sie()),Wqe=Fo(a0()),zqe=Fo(xc()),oN=Fo(Ma());function Fo(t){return t&&t.__esModule?t:{default:t}}function ef(){return ef=Object.assign||function(t){for(var e=1;eObject.prototype.toString.call(t)==="[object Object]";function Vqe(t,e){let r=Object.keys(t.fields);return Object.keys(e).filter(i=>r.indexOf(i)===-1)}var _qe=(0,Rie.default)([]),P0=class extends oN.default{constructor(e){super({type:"object"});this.fields=Object.create(null),this._sortErrors=_qe,this._nodes=[],this._excludedEdges=[],this.withMutation(()=>{this.transform(function(i){if(typeof i=="string")try{i=JSON.parse(i)}catch(n){i=null}return this.isType(i)?i:null}),e&&this.shape(e)})}_typeCheck(e){return Fie(e)||typeof e=="function"}_cast(e,r={}){var i;let n=super._cast(e,r);if(n===void 0)return this.getDefault();if(!this._typeCheck(n))return n;let s=this.fields,o=(i=r.stripUnknown)!=null?i:this.spec.noUnknown,a=this._nodes.concat(Object.keys(n).filter(g=>this._nodes.indexOf(g)===-1)),l={},c=ef({},r,{parent:l,__validating:r.__validating||!1}),u=!1;for(let g of a){let f=s[g],h=(0,kie.default)(n,g);if(f){let p,d=n[g];c.path=(r.path?`${r.path}.`:"")+g,f=f.resolve({value:d,context:r.context,parent:l});let m="spec"in f?f.spec:void 0,I=m==null?void 0:m.strict;if(m==null?void 0:m.strip){u=u||g in n;continue}p=!r.__validating||!I?f.cast(n[g],c):n[g],p!==void 0&&(l[g]=p)}else h&&!o&&(l[g]=n[g]);l[g]!==n[g]&&(u=!0)}return u?l:n}_validate(e,r={},i){let n=[],{sync:s,from:o=[],originalValue:a=e,abortEarly:l=this.spec.abortEarly,recursive:c=this.spec.recursive}=r;o=[{schema:this,value:a},...o],r.__validating=!0,r.originalValue=a,r.from=o,super._validate(e,r,(u,g)=>{if(u){if(!zqe.default.isError(u)||l)return void i(u,g);n.push(u)}if(!c||!Fie(g)){i(n[0]||null,g);return}a=a||g;let f=this._nodes.map(h=>(p,d)=>{let m=h.indexOf(".")===-1?(r.path?`${r.path}.`:"")+h:`${r.path||""}["${h}"]`,I=this.fields[h];if(I&&"validate"in I){I.validate(g[h],ef({},r,{path:m,from:o,strict:!0,parent:g,originalValue:a[h]}),d);return}d(null)});(0,Wqe.default)({sync:s,tests:f,value:g,errors:n,endEarly:l,sort:this._sortErrors,path:r.path},i)})}clone(e){let r=super.clone(e);return r.fields=ef({},this.fields),r._nodes=this._nodes,r._excludedEdges=this._excludedEdges,r._sortErrors=this._sortErrors,r}concat(e){let r=super.concat(e),i=r.fields;for(let[n,s]of Object.entries(this.fields)){let o=i[n];o===void 0?i[n]=s:o instanceof oN.default&&s instanceof oN.default&&(i[n]=s.concat(o))}return r.withMutation(()=>r.shape(i))}getDefaultFromShape(){let e={};return this._nodes.forEach(r=>{let i=this.fields[r];e[r]="default"in i?i.getDefault():void 0}),e}_getDefault(){if("default"in this.spec)return super._getDefault();if(!!this._nodes.length)return this.getDefaultFromShape()}shape(e,r=[]){let i=this.clone(),n=Object.assign(i.fields,e);if(i.fields=n,i._sortErrors=(0,Rie.default)(Object.keys(n)),r.length){Array.isArray(r[0])||(r=[r]);let s=r.map(([o,a])=>`${o}-${a}`);i._excludedEdges=i._excludedEdges.concat(s)}return i._nodes=(0,Jqe.default)(n,i._excludedEdges),i}pick(e){let r={};for(let i of e)this.fields[i]&&(r[i]=this.fields[i]);return this.clone().withMutation(i=>(i.fields={},i.shape(r)))}omit(e){let r=this.clone(),i=r.fields;r.fields={};for(let n of e)delete i[n];return r.withMutation(()=>r.shape(i))}from(e,r,i){let n=(0,qqe.getter)(e,!0);return this.transform(s=>{if(s==null)return s;let o=s;return(0,kie.default)(s,e)&&(o=ef({},s),i||delete o[e],o[r]=n(s)),o})}noUnknown(e=!0,r=Die.object.noUnknown){typeof e=="string"&&(r=e,e=!0);let i=this.test({name:"noUnknown",exclusive:!0,message:r,test(n){if(n==null)return!0;let s=Vqe(this.schema,n);return!e||s.length===0||this.createError({params:{unknown:s.join(", ")}})}});return i.spec.noUnknown=e,i}unknown(e=!0,r=Die.object.noUnknown){return this.noUnknown(!e,r)}transformKeys(e){return this.transform(r=>r&&(0,jqe.default)(r,(i,n)=>e(n)))}camelCase(){return this.transformKeys(Gqe.default)}snakeCase(){return this.transformKeys(Pie.default)}constantCase(){return this.transformKeys(e=>(0,Pie.default)(e).toUpperCase())}describe(){let e=super.describe();return e.fields=(0,Yqe.default)(this.fields,r=>r.describe()),e}};$d.default=P0;function xie(t){return new P0(t)}xie.prototype=P0.prototype});var Tie=E(eC=>{"use strict";Object.defineProperty(eC,"__esModule",{value:!0});eC.create=Lie;eC.default=void 0;var aN=tf(Zg()),Xqe=tf(qg()),Zqe=tf(Nd()),AN=La(),$qe=tf(a0()),eJe=tf(xc()),tJe=tf(Ma());function tf(t){return t&&t.__esModule?t:{default:t}}function D0(){return D0=Object.assign||function(t){for(var e=1;e{this.transform(function(r){if(typeof r=="string")try{r=JSON.parse(r)}catch(i){r=null}return this.isType(r)?r:null})})}_typeCheck(e){return Array.isArray(e)}get _subType(){return this.innerType}_cast(e,r){let i=super._cast(e,r);if(!this._typeCheck(i)||!this.innerType)return i;let n=!1,s=i.map((o,a)=>{let l=this.innerType.cast(o,D0({},r,{path:`${r.path||""}[${a}]`}));return l!==o&&(n=!0),l});return n?s:i}_validate(e,r={},i){var n,s;let o=[],a=r.sync,l=r.path,c=this.innerType,u=(n=r.abortEarly)!=null?n:this.spec.abortEarly,g=(s=r.recursive)!=null?s:this.spec.recursive,f=r.originalValue!=null?r.originalValue:e;super._validate(e,r,(h,p)=>{if(h){if(!eJe.default.isError(h)||u)return void i(h,p);o.push(h)}if(!g||!c||!this._typeCheck(p)){i(o[0]||null,p);return}f=f||p;let d=new Array(p.length);for(let m=0;mc.validate(I,b,H)}(0,$qe.default)({sync:a,path:l,value:p,errors:o,endEarly:u,tests:d},i)})}clone(e){let r=super.clone(e);return r.innerType=this.innerType,r}concat(e){let r=super.concat(e);return r.innerType=this.innerType,e.innerType&&(r.innerType=r.innerType?r.innerType.concat(e.innerType):e.innerType),r}of(e){let r=this.clone();if(!(0,Xqe.default)(e))throw new TypeError("`array.of()` sub-schema must be a valid yup schema not: "+(0,Zqe.default)(e));return r.innerType=e,r}length(e,r=AN.array.length){return this.test({message:r,name:"length",exclusive:!0,params:{length:e},test(i){return(0,aN.default)(i)||i.length===this.resolve(e)}})}min(e,r){return r=r||AN.array.min,this.test({message:r,name:"min",exclusive:!0,params:{min:e},test(i){return(0,aN.default)(i)||i.length>=this.resolve(e)}})}max(e,r){return r=r||AN.array.max,this.test({message:r,name:"max",exclusive:!0,params:{max:e},test(i){return(0,aN.default)(i)||i.length<=this.resolve(e)}})}ensure(){return this.default(()=>[]).transform((e,r)=>this._typeCheck(e)?e:r==null?[]:[].concat(r))}compact(e){let r=e?(i,n,s)=>!e(i,n,s):i=>!!i;return this.transform(i=>i!=null?i.filter(r):i)}describe(){let e=super.describe();return this.innerType&&(e.innerType=this.innerType.describe()),e}nullable(e=!0){return super.nullable(e)}defined(){return super.defined()}required(e){return super.required(e)}};eC.default=R0;Lie.prototype=R0.prototype});var Mie=E(tC=>{"use strict";Object.defineProperty(tC,"__esModule",{value:!0});tC.create=rJe;tC.default=void 0;var nJe=iJe(qg());function iJe(t){return t&&t.__esModule?t:{default:t}}function rJe(t){return new lN(t)}var lN=class{constructor(e){this.type="lazy",this.__isYupSchema__=!0,this._resolve=(r,i={})=>{let n=this.builder(r,i);if(!(0,nJe.default)(n))throw new TypeError("lazy() functions must return a valid schema");return n.resolve(i)},this.builder=e}resolve(e){return this._resolve(e.value,e)}cast(e,r){return this._resolve(e,r).cast(e,r)}validate(e,r,i){return this._resolve(e,r).validate(e,r,i)}validateSync(e,r){return this._resolve(e,r).validateSync(e,r)}validateAt(e,r,i){return this._resolve(r,i).validateAt(e,r,i)}validateSyncAt(e,r,i){return this._resolve(r,i).validateSyncAt(e,r,i)}describe(){return null}isValid(e,r){return this._resolve(e,r).isValid(e,r)}isValidSync(e,r){return this._resolve(e,r).isValidSync(e,r)}},sJe=lN;tC.default=sJe});var Oie=E(cN=>{"use strict";Object.defineProperty(cN,"__esModule",{value:!0});cN.default=oJe;var AJe=aJe(La());function aJe(t){return t&&t.__esModule?t:{default:t}}function oJe(t){Object.keys(t).forEach(e=>{Object.keys(t[e]).forEach(r=>{AJe.default[e][r]=t[e][r]})})}});var gN=E(cr=>{"use strict";Object.defineProperty(cr,"__esModule",{value:!0});cr.addMethod=lJe;Object.defineProperty(cr,"MixedSchema",{enumerable:!0,get:function(){return Kie.default}});Object.defineProperty(cr,"mixed",{enumerable:!0,get:function(){return Kie.create}});Object.defineProperty(cr,"BooleanSchema",{enumerable:!0,get:function(){return uN.default}});Object.defineProperty(cr,"bool",{enumerable:!0,get:function(){return uN.create}});Object.defineProperty(cr,"boolean",{enumerable:!0,get:function(){return uN.create}});Object.defineProperty(cr,"StringSchema",{enumerable:!0,get:function(){return Uie.default}});Object.defineProperty(cr,"string",{enumerable:!0,get:function(){return Uie.create}});Object.defineProperty(cr,"NumberSchema",{enumerable:!0,get:function(){return Hie.default}});Object.defineProperty(cr,"number",{enumerable:!0,get:function(){return Hie.create}});Object.defineProperty(cr,"DateSchema",{enumerable:!0,get:function(){return Gie.default}});Object.defineProperty(cr,"date",{enumerable:!0,get:function(){return Gie.create}});Object.defineProperty(cr,"ObjectSchema",{enumerable:!0,get:function(){return jie.default}});Object.defineProperty(cr,"object",{enumerable:!0,get:function(){return jie.create}});Object.defineProperty(cr,"ArraySchema",{enumerable:!0,get:function(){return Yie.default}});Object.defineProperty(cr,"array",{enumerable:!0,get:function(){return Yie.create}});Object.defineProperty(cr,"ref",{enumerable:!0,get:function(){return cJe.create}});Object.defineProperty(cr,"lazy",{enumerable:!0,get:function(){return uJe.create}});Object.defineProperty(cr,"ValidationError",{enumerable:!0,get:function(){return gJe.default}});Object.defineProperty(cr,"reach",{enumerable:!0,get:function(){return fJe.default}});Object.defineProperty(cr,"isSchema",{enumerable:!0,get:function(){return qie.default}});Object.defineProperty(cr,"setLocale",{enumerable:!0,get:function(){return hJe.default}});Object.defineProperty(cr,"BaseSchema",{enumerable:!0,get:function(){return pJe.default}});var Kie=Nc(yre()),uN=Nc(vre()),Uie=Nc(kre()),Hie=Nc(Rre()),Gie=Nc(Tre()),jie=Nc(Nie()),Yie=Nc(Tie()),cJe=Dc(),uJe=Mie(),gJe=rC(xc()),fJe=rC(XF()),qie=rC(qg()),hJe=rC(Oie()),pJe=rC(Ma());function rC(t){return t&&t.__esModule?t:{default:t}}function Jie(){if(typeof WeakMap!="function")return null;var t=new WeakMap;return Jie=function(){return t},t}function Nc(t){if(t&&t.__esModule)return t;if(t===null||typeof t!="object"&&typeof t!="function")return{default:t};var e=Jie();if(e&&e.has(t))return e.get(t);var r={},i=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var n in t)if(Object.prototype.hasOwnProperty.call(t,n)){var s=i?Object.getOwnPropertyDescriptor(t,n):null;s&&(s.get||s.set)?Object.defineProperty(r,n,s):r[n]=t[n]}return r.default=t,e&&e.set(t,r),r}function lJe(t,e,r){if(!t||!(0,qie.default)(t.prototype))throw new TypeError("You must provide a yup schema constructor function");if(typeof e!="string")throw new TypeError("A Method name must be provided");if(typeof r!="function")throw new TypeError("Method function must be provided");t.prototype[e]=r}});var Xie=E((gCt,nC)=>{"use strict";var mJe=process.env.TERM_PROGRAM==="Hyper",EJe=process.platform==="win32",zie=process.platform==="linux",fN={ballotDisabled:"\u2612",ballotOff:"\u2610",ballotOn:"\u2611",bullet:"\u2022",bulletWhite:"\u25E6",fullBlock:"\u2588",heart:"\u2764",identicalTo:"\u2261",line:"\u2500",mark:"\u203B",middot:"\xB7",minus:"\uFF0D",multiplication:"\xD7",obelus:"\xF7",pencilDownRight:"\u270E",pencilRight:"\u270F",pencilUpRight:"\u2710",percent:"%",pilcrow2:"\u2761",pilcrow:"\xB6",plusMinus:"\xB1",section:"\xA7",starsOff:"\u2606",starsOn:"\u2605",upDownArrow:"\u2195"},Vie=Object.assign({},fN,{check:"\u221A",cross:"\xD7",ellipsisLarge:"...",ellipsis:"...",info:"i",question:"?",questionSmall:"?",pointer:">",pointerSmall:"\xBB",radioOff:"( )",radioOn:"(*)",warning:"\u203C"}),_ie=Object.assign({},fN,{ballotCross:"\u2718",check:"\u2714",cross:"\u2716",ellipsisLarge:"\u22EF",ellipsis:"\u2026",info:"\u2139",question:"?",questionFull:"\uFF1F",questionSmall:"\uFE56",pointer:zie?"\u25B8":"\u276F",pointerSmall:zie?"\u2023":"\u203A",radioOff:"\u25EF",radioOn:"\u25C9",warning:"\u26A0"});nC.exports=EJe&&!mJe?Vie:_ie;Reflect.defineProperty(nC.exports,"common",{enumerable:!1,value:fN});Reflect.defineProperty(nC.exports,"windows",{enumerable:!1,value:Vie});Reflect.defineProperty(nC.exports,"other",{enumerable:!1,value:_ie})});var js=E((fCt,hN)=>{"use strict";var IJe=t=>t!==null&&typeof t=="object"&&!Array.isArray(t),yJe=/[\u001b\u009b][[\]#;?()]*(?:(?:(?:[^\W_]*;?[^\W_]*)\u0007)|(?:(?:[0-9]{1,4}(;[0-9]{0,4})*)?[~0-9=<>cf-nqrtyA-PRZ]))/g,Zie=()=>{let t={enabled:!0,visible:!0,styles:{},keys:{}};"FORCE_COLOR"in process.env&&(t.enabled=process.env.FORCE_COLOR!=="0");let e=s=>{let o=s.open=`[${s.codes[0]}m`,a=s.close=`[${s.codes[1]}m`,l=s.regex=new RegExp(`\\u001b\\[${s.codes[1]}m`,"g");return s.wrap=(c,u)=>{c.includes(a)&&(c=c.replace(l,a+o));let g=o+c+a;return u?g.replace(/\r*\n/g,`${a}$&${o}`):g},s},r=(s,o,a)=>typeof s=="function"?s(o):s.wrap(o,a),i=(s,o)=>{if(s===""||s==null)return"";if(t.enabled===!1)return s;if(t.visible===!1)return"";let a=""+s,l=a.includes(` +`),c=o.length;for(c>0&&o.includes("unstyle")&&(o=[...new Set(["unstyle",...o])].reverse());c-- >0;)a=r(t.styles[o[c]],a,l);return a},n=(s,o,a)=>{t.styles[s]=e({name:s,codes:o}),(t.keys[a]||(t.keys[a]=[])).push(s),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(c){t.alias(s,c)},get(){let c=u=>i(u,c.stack);return Reflect.setPrototypeOf(c,t),c.stack=this.stack?this.stack.concat(s):[s],c}})};return n("reset",[0,0],"modifier"),n("bold",[1,22],"modifier"),n("dim",[2,22],"modifier"),n("italic",[3,23],"modifier"),n("underline",[4,24],"modifier"),n("inverse",[7,27],"modifier"),n("hidden",[8,28],"modifier"),n("strikethrough",[9,29],"modifier"),n("black",[30,39],"color"),n("red",[31,39],"color"),n("green",[32,39],"color"),n("yellow",[33,39],"color"),n("blue",[34,39],"color"),n("magenta",[35,39],"color"),n("cyan",[36,39],"color"),n("white",[37,39],"color"),n("gray",[90,39],"color"),n("grey",[90,39],"color"),n("bgBlack",[40,49],"bg"),n("bgRed",[41,49],"bg"),n("bgGreen",[42,49],"bg"),n("bgYellow",[43,49],"bg"),n("bgBlue",[44,49],"bg"),n("bgMagenta",[45,49],"bg"),n("bgCyan",[46,49],"bg"),n("bgWhite",[47,49],"bg"),n("blackBright",[90,39],"bright"),n("redBright",[91,39],"bright"),n("greenBright",[92,39],"bright"),n("yellowBright",[93,39],"bright"),n("blueBright",[94,39],"bright"),n("magentaBright",[95,39],"bright"),n("cyanBright",[96,39],"bright"),n("whiteBright",[97,39],"bright"),n("bgBlackBright",[100,49],"bgBright"),n("bgRedBright",[101,49],"bgBright"),n("bgGreenBright",[102,49],"bgBright"),n("bgYellowBright",[103,49],"bgBright"),n("bgBlueBright",[104,49],"bgBright"),n("bgMagentaBright",[105,49],"bgBright"),n("bgCyanBright",[106,49],"bgBright"),n("bgWhiteBright",[107,49],"bgBright"),t.ansiRegex=yJe,t.hasColor=t.hasAnsi=s=>(t.ansiRegex.lastIndex=0,typeof s=="string"&&s!==""&&t.ansiRegex.test(s)),t.alias=(s,o)=>{let a=typeof o=="string"?t[o]:o;if(typeof a!="function")throw new TypeError("Expected alias to be the name of an existing color (string) or a function");a.stack||(Reflect.defineProperty(a,"name",{value:s}),t.styles[s]=a,a.stack=[s]),Reflect.defineProperty(t,s,{configurable:!0,enumerable:!0,set(l){t.alias(s,l)},get(){let l=c=>i(c,l.stack);return Reflect.setPrototypeOf(l,t),l.stack=this.stack?this.stack.concat(a.stack):a.stack,l}})},t.theme=s=>{if(!IJe(s))throw new TypeError("Expected theme to be an object");for(let o of Object.keys(s))t.alias(o,s[o]);return t},t.alias("unstyle",s=>typeof s=="string"&&s!==""?(t.ansiRegex.lastIndex=0,s.replace(t.ansiRegex,"")):""),t.alias("noop",s=>s),t.none=t.clear=t.noop,t.stripColor=t.unstyle,t.symbols=Xie(),t.define=n,t};hN.exports=Zie();hN.exports.create=Zie});var Mi=E(bt=>{"use strict";var wJe=Object.prototype.toString,Cs=js(),$ie=!1,pN=[],ene={yellow:"blue",cyan:"red",green:"magenta",black:"white",blue:"yellow",red:"cyan",magenta:"green",white:"black"};bt.longest=(t,e)=>t.reduce((r,i)=>Math.max(r,e?i[e].length:i.length),0);bt.hasColor=t=>!!t&&Cs.hasColor(t);var N0=bt.isObject=t=>t!==null&&typeof t=="object"&&!Array.isArray(t);bt.nativeType=t=>wJe.call(t).slice(8,-1).toLowerCase().replace(/\s/g,"");bt.isAsyncFn=t=>bt.nativeType(t)==="asyncfunction";bt.isPrimitive=t=>t!=null&&typeof t!="object"&&typeof t!="function";bt.resolve=(t,e,...r)=>typeof e=="function"?e.call(t,...r):e;bt.scrollDown=(t=[])=>[...t.slice(1),t[0]];bt.scrollUp=(t=[])=>[t.pop(),...t];bt.reorder=(t=[])=>{let e=t.slice();return e.sort((r,i)=>r.index>i.index?1:r.index{let i=t.length,n=r===i?0:r<0?i-1:r,s=t[e];t[e]=t[n],t[n]=s};bt.width=(t,e=80)=>{let r=t&&t.columns?t.columns:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[0]),process.platform==="win32"?r-1:r};bt.height=(t,e=20)=>{let r=t&&t.rows?t.rows:e;return t&&typeof t.getWindowSize=="function"&&(r=t.getWindowSize()[1]),r};bt.wordWrap=(t,e={})=>{if(!t)return t;typeof e=="number"&&(e={width:e});let{indent:r="",newline:i=` +`+r,width:n=80}=e;n-=((i+r).match(/[^\S\n]/g)||[]).length;let o=`.{1,${n}}([\\s\\u200B]+|$)|[^\\s\\u200B]+?([\\s\\u200B]+|$)`,a=t.trim(),l=new RegExp(o,"g"),c=a.match(l)||[];return c=c.map(u=>u.replace(/\n$/,"")),e.padEnd&&(c=c.map(u=>u.padEnd(n," "))),e.padStart&&(c=c.map(u=>u.padStart(n," "))),r+c.join(i)};bt.unmute=t=>{let e=t.stack.find(i=>Cs.keys.color.includes(i));return e?Cs[e]:t.stack.find(i=>i.slice(2)==="bg")?Cs[e.slice(2)]:i=>i};bt.pascal=t=>t?t[0].toUpperCase()+t.slice(1):"";bt.inverse=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Cs.keys.color.includes(i));if(e){let i=Cs["bg"+bt.pascal(e)];return i?i.black:t}let r=t.stack.find(i=>i.slice(0,2)==="bg");return r?Cs[r.slice(2).toLowerCase()]||t:Cs.none};bt.complement=t=>{if(!t||!t.stack)return t;let e=t.stack.find(i=>Cs.keys.color.includes(i)),r=t.stack.find(i=>i.slice(0,2)==="bg");if(e&&!r)return Cs[ene[e]||e];if(r){let i=r.slice(2).toLowerCase(),n=ene[i];return n&&Cs["bg"+bt.pascal(n)]||t}return Cs.none};bt.meridiem=t=>{let e=t.getHours(),r=t.getMinutes(),i=e>=12?"pm":"am";e=e%12;let n=e===0?12:e,s=r<10?"0"+r:r;return n+":"+s+" "+i};bt.set=(t={},e="",r)=>e.split(".").reduce((i,n,s,o)=>{let a=o.length-1>s?i[n]||{}:r;return!bt.isObject(a)&&s{let i=t[e]==null?e.split(".").reduce((n,s)=>n&&n[s],t):t[e];return i==null?r:i};bt.mixin=(t,e)=>{if(!N0(t))return e;if(!N0(e))return t;for(let r of Object.keys(e)){let i=Object.getOwnPropertyDescriptor(e,r);if(i.hasOwnProperty("value"))if(t.hasOwnProperty(r)&&N0(i.value)){let n=Object.getOwnPropertyDescriptor(t,r);N0(n.value)?t[r]=bt.merge({},t[r],e[r]):Reflect.defineProperty(t,r,i)}else Reflect.defineProperty(t,r,i);else Reflect.defineProperty(t,r,i)}return t};bt.merge=(...t)=>{let e={};for(let r of t)bt.mixin(e,r);return e};bt.mixinEmitter=(t,e)=>{let r=e.constructor.prototype;for(let i of Object.keys(r)){let n=r[i];typeof n=="function"?bt.define(t,i,n.bind(e)):bt.define(t,i,n)}};bt.onExit=t=>{let e=(r,i)=>{$ie||($ie=!0,pN.forEach(n=>n()),r===!0&&process.exit(128+i))};pN.length===0&&(process.once("SIGTERM",e.bind(null,!0,15)),process.once("SIGINT",e.bind(null,!0,2)),process.once("exit",e)),pN.push(t)};bt.define=(t,e,r)=>{Reflect.defineProperty(t,e,{value:r})};bt.defineExport=(t,e,r)=>{let i;Reflect.defineProperty(t,e,{enumerable:!0,configurable:!0,set(n){i=n},get(){return i?i():r()}})}});var tne=E(nf=>{"use strict";nf.ctrl={a:"first",b:"backward",c:"cancel",d:"deleteForward",e:"last",f:"forward",g:"reset",i:"tab",k:"cutForward",l:"reset",n:"newItem",m:"cancel",j:"submit",p:"search",r:"remove",s:"save",u:"undo",w:"cutLeft",x:"toggleCursor",v:"paste"};nf.shift={up:"shiftUp",down:"shiftDown",left:"shiftLeft",right:"shiftRight",tab:"prev"};nf.fn={up:"pageUp",down:"pageDown",left:"pageLeft",right:"pageRight",delete:"deleteForward"};nf.option={b:"backward",f:"forward",d:"cutRight",left:"cutLeft",up:"altUp",down:"altDown"};nf.keys={pageup:"pageUp",pagedown:"pageDown",home:"home",end:"end",cancel:"cancel",delete:"deleteForward",backspace:"delete",down:"down",enter:"submit",escape:"cancel",left:"left",space:"space",number:"number",return:"submit",right:"right",tab:"next",up:"up"}});var nne=E((dCt,rne)=>{"use strict";var ine=require("readline"),BJe=tne(),QJe=/^(?:\x1b)([a-zA-Z0-9])$/,bJe=/^(?:\x1b+)(O|N|\[|\[\[)(?:(\d+)(?:;(\d+))?([~^$])|(?:1;)?(\d+)?([a-zA-Z]))/,vJe={OP:"f1",OQ:"f2",OR:"f3",OS:"f4","[11~":"f1","[12~":"f2","[13~":"f3","[14~":"f4","[[A":"f1","[[B":"f2","[[C":"f3","[[D":"f4","[[E":"f5","[15~":"f5","[17~":"f6","[18~":"f7","[19~":"f8","[20~":"f9","[21~":"f10","[23~":"f11","[24~":"f12","[A":"up","[B":"down","[C":"right","[D":"left","[E":"clear","[F":"end","[H":"home",OA:"up",OB:"down",OC:"right",OD:"left",OE:"clear",OF:"end",OH:"home","[1~":"home","[2~":"insert","[3~":"delete","[4~":"end","[5~":"pageup","[6~":"pagedown","[[5~":"pageup","[[6~":"pagedown","[7~":"home","[8~":"end","[a":"up","[b":"down","[c":"right","[d":"left","[e":"clear","[2$":"insert","[3$":"delete","[5$":"pageup","[6$":"pagedown","[7$":"home","[8$":"end",Oa:"up",Ob:"down",Oc:"right",Od:"left",Oe:"clear","[2^":"insert","[3^":"delete","[5^":"pageup","[6^":"pagedown","[7^":"home","[8^":"end","[Z":"tab"};function SJe(t){return["[a","[b","[c","[d","[e","[2$","[3$","[5$","[6$","[7$","[8$","[Z"].includes(t)}function xJe(t){return["Oa","Ob","Oc","Od","Oe","[2^","[3^","[5^","[6^","[7^","[8^"].includes(t)}var L0=(t="",e={})=>{let r,i=P({name:e.name,ctrl:!1,meta:!1,shift:!1,option:!1,sequence:t,raw:t},e);if(Buffer.isBuffer(t)?t[0]>127&&t[1]===void 0?(t[0]-=128,t=""+String(t)):t=String(t):t!==void 0&&typeof t!="string"?t=String(t):t||(t=i.sequence||""),i.sequence=i.sequence||t||i.name,t==="\r")i.raw=void 0,i.name="return";else if(t===` +`)i.name="enter";else if(t===" ")i.name="tab";else if(t==="\b"||t==="\x7F"||t==="\x7F"||t==="\b")i.name="backspace",i.meta=t.charAt(0)==="";else if(t===""||t==="")i.name="escape",i.meta=t.length===2;else if(t===" "||t===" ")i.name="space",i.meta=t.length===2;else if(t<="")i.name=String.fromCharCode(t.charCodeAt(0)+"a".charCodeAt(0)-1),i.ctrl=!0;else if(t.length===1&&t>="0"&&t<="9")i.name="number";else if(t.length===1&&t>="a"&&t<="z")i.name=t;else if(t.length===1&&t>="A"&&t<="Z")i.name=t.toLowerCase(),i.shift=!0;else if(r=QJe.exec(t))i.meta=!0,i.shift=/^[A-Z]$/.test(r[1]);else if(r=bJe.exec(t)){let n=[...t];n[0]===""&&n[1]===""&&(i.option=!0);let s=[r[1],r[2],r[4],r[6]].filter(Boolean).join(""),o=(r[3]||r[5]||1)-1;i.ctrl=!!(o&4),i.meta=!!(o&10),i.shift=!!(o&1),i.code=s,i.name=vJe[s],i.shift=SJe(s)||i.shift,i.ctrl=xJe(s)||i.ctrl}return i};L0.listen=(t={},e)=>{let{stdin:r}=t;if(!r||r!==process.stdin&&!r.isTTY)throw new Error("Invalid stream passed");let i=ine.createInterface({terminal:!0,input:r});ine.emitKeypressEvents(r,i);let n=(a,l)=>e(a,L0(a,l),i),s=r.isRaw;return r.isTTY&&r.setRawMode(!0),r.on("keypress",n),i.resume(),()=>{r.isTTY&&r.setRawMode(s),r.removeListener("keypress",n),i.pause(),i.close()}};L0.action=(t,e,r)=>{let i=P(P({},BJe),r);return e.ctrl?(e.action=i.ctrl[e.name],e):e.option&&i.option?(e.action=i.option[e.name],e):e.shift?(e.action=i.shift[e.name],e):(e.action=i.keys[e.name],e)};rne.exports=L0});var one=E((CCt,sne)=>{"use strict";sne.exports=t=>{t.timers=t.timers||{};let e=t.options.timers;if(!!e)for(let r of Object.keys(e)){let i=e[r];typeof i=="number"&&(i={interval:i}),kJe(t,r,i)}};function kJe(t,e,r={}){let i=t.timers[e]={name:e,start:Date.now(),ms:0,tick:0},n=r.interval||120;i.frames=r.frames||[],i.loading=!0;let s=setInterval(()=>{i.ms=Date.now()-i.start,i.tick++,t.render()},n);return i.stop=()=>{i.loading=!1,clearInterval(s)},Reflect.defineProperty(i,"interval",{value:s}),t.once("close",()=>i.stop()),i.stop}});var lne=E((mCt,ane)=>{"use strict";var{define:PJe,width:DJe}=Mi(),Ane=class{constructor(e){let r=e.options;PJe(this,"_prompt",e),this.type=e.type,this.name=e.name,this.message="",this.header="",this.footer="",this.error="",this.hint="",this.input="",this.cursor=0,this.index=0,this.lines=0,this.tick=0,this.prompt="",this.buffer="",this.width=DJe(r.stdout||process.stdout),Object.assign(this,r),this.name=this.name||this.message,this.message=this.message||this.name,this.symbols=e.symbols,this.styles=e.styles,this.required=new Set,this.cancelled=!1,this.submitted=!1}clone(){let e=P({},this);return e.status=this.status,e.buffer=Buffer.from(e.buffer),delete e.clone,e}set color(e){this._color=e}get color(){let e=this.prompt.styles;if(this.cancelled)return e.cancelled;if(this.submitted)return e.submitted;let r=this._color||e[this.status];return typeof r=="function"?r:e.pending}set loading(e){this._loading=e}get loading(){return typeof this._loading=="boolean"?this._loading:this.loadingChoices?"choices":!1}get status(){return this.cancelled?"cancelled":this.submitted?"submitted":"pending"}};ane.exports=Ane});var une=E((ECt,cne)=>{"use strict";var dN=Mi(),yi=js(),CN={default:yi.noop,noop:yi.noop,set inverse(t){this._inverse=t},get inverse(){return this._inverse||dN.inverse(this.primary)},set complement(t){this._complement=t},get complement(){return this._complement||dN.complement(this.primary)},primary:yi.cyan,success:yi.green,danger:yi.magenta,strong:yi.bold,warning:yi.yellow,muted:yi.dim,disabled:yi.gray,dark:yi.dim.gray,underline:yi.underline,set info(t){this._info=t},get info(){return this._info||this.primary},set em(t){this._em=t},get em(){return this._em||this.primary.underline},set heading(t){this._heading=t},get heading(){return this._heading||this.muted.underline},set pending(t){this._pending=t},get pending(){return this._pending||this.primary},set submitted(t){this._submitted=t},get submitted(){return this._submitted||this.success},set cancelled(t){this._cancelled=t},get cancelled(){return this._cancelled||this.danger},set typing(t){this._typing=t},get typing(){return this._typing||this.dim},set placeholder(t){this._placeholder=t},get placeholder(){return this._placeholder||this.primary.dim},set highlight(t){this._highlight=t},get highlight(){return this._highlight||this.inverse}};CN.merge=(t={})=>{t.styles&&typeof t.styles.enabled=="boolean"&&(yi.enabled=t.styles.enabled),t.styles&&typeof t.styles.visible=="boolean"&&(yi.visible=t.styles.visible);let e=dN.merge({},CN,t.styles);delete e.merge;for(let r of Object.keys(yi))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>yi[r]});for(let r of Object.keys(yi.styles))e.hasOwnProperty(r)||Reflect.defineProperty(e,r,{get:()=>yi[r]});return e};cne.exports=CN});var fne=E((ICt,gne)=>{"use strict";var mN=process.platform==="win32",Ka=js(),RJe=Mi(),EN=_(P({},Ka.symbols),{upDownDoubleArrow:"\u21D5",upDownDoubleArrow2:"\u2B0D",upDownArrow:"\u2195",asterisk:"*",asterism:"\u2042",bulletWhite:"\u25E6",electricArrow:"\u2301",ellipsisLarge:"\u22EF",ellipsisSmall:"\u2026",fullBlock:"\u2588",identicalTo:"\u2261",indicator:Ka.symbols.check,leftAngle:"\u2039",mark:"\u203B",minus:"\u2212",multiplication:"\xD7",obelus:"\xF7",percent:"%",pilcrow:"\xB6",pilcrow2:"\u2761",pencilUpRight:"\u2710",pencilDownRight:"\u270E",pencilRight:"\u270F",plus:"+",plusMinus:"\xB1",pointRight:"\u261E",rightAngle:"\u203A",section:"\xA7",hexagon:{off:"\u2B21",on:"\u2B22",disabled:"\u2B22"},ballot:{on:"\u2611",off:"\u2610",disabled:"\u2612"},stars:{on:"\u2605",off:"\u2606",disabled:"\u2606"},folder:{on:"\u25BC",off:"\u25B6",disabled:"\u25B6"},prefix:{pending:Ka.symbols.question,submitted:Ka.symbols.check,cancelled:Ka.symbols.cross},separator:{pending:Ka.symbols.pointerSmall,submitted:Ka.symbols.middot,cancelled:Ka.symbols.middot},radio:{off:mN?"( )":"\u25EF",on:mN?"(*)":"\u25C9",disabled:mN?"(|)":"\u24BE"},numbers:["\u24EA","\u2460","\u2461","\u2462","\u2463","\u2464","\u2465","\u2466","\u2467","\u2468","\u2469","\u246A","\u246B","\u246C","\u246D","\u246E","\u246F","\u2470","\u2471","\u2472","\u2473","\u3251","\u3252","\u3253","\u3254","\u3255","\u3256","\u3257","\u3258","\u3259","\u325A","\u325B","\u325C","\u325D","\u325E","\u325F","\u32B1","\u32B2","\u32B3","\u32B4","\u32B5","\u32B6","\u32B7","\u32B8","\u32B9","\u32BA","\u32BB","\u32BC","\u32BD","\u32BE","\u32BF"]});EN.merge=t=>{let e=RJe.merge({},Ka.symbols,EN,t.symbols);return delete e.merge,e};gne.exports=EN});var pne=E((yCt,hne)=>{"use strict";var FJe=une(),NJe=fne(),LJe=Mi();hne.exports=t=>{t.options=LJe.merge({},t.options.theme,t.options),t.symbols=NJe.merge(t.options),t.styles=FJe.merge(t.options)}});var Ine=E((dne,Cne)=>{"use strict";var mne=process.env.TERM_PROGRAM==="Apple_Terminal",TJe=js(),IN=Mi(),Ys=Cne.exports=dne,Ir="[",Ene="\x07",yN=!1,HA=Ys.code={bell:Ene,beep:Ene,beginning:`${Ir}G`,down:`${Ir}J`,esc:Ir,getPosition:`${Ir}6n`,hide:`${Ir}?25l`,line:`${Ir}2K`,lineEnd:`${Ir}K`,lineStart:`${Ir}1K`,restorePosition:Ir+(mne?"8":"u"),savePosition:Ir+(mne?"7":"s"),screen:`${Ir}2J`,show:`${Ir}?25h`,up:`${Ir}1J`},Lc=Ys.cursor={get hidden(){return yN},hide(){return yN=!0,HA.hide},show(){return yN=!1,HA.show},forward:(t=1)=>`${Ir}${t}C`,backward:(t=1)=>`${Ir}${t}D`,nextLine:(t=1)=>`${Ir}E`.repeat(t),prevLine:(t=1)=>`${Ir}F`.repeat(t),up:(t=1)=>t?`${Ir}${t}A`:"",down:(t=1)=>t?`${Ir}${t}B`:"",right:(t=1)=>t?`${Ir}${t}C`:"",left:(t=1)=>t?`${Ir}${t}D`:"",to(t,e){return e?`${Ir}${e+1};${t+1}H`:`${Ir}${t+1}G`},move(t=0,e=0){let r="";return r+=t<0?Lc.left(-t):t>0?Lc.right(t):"",r+=e<0?Lc.up(-e):e>0?Lc.down(e):"",r},restore(t={}){let{after:e,cursor:r,initial:i,input:n,prompt:s,size:o,value:a}=t;if(i=IN.isPrimitive(i)?String(i):"",n=IN.isPrimitive(n)?String(n):"",a=IN.isPrimitive(a)?String(a):"",o){let l=Ys.cursor.up(o)+Ys.cursor.to(s.length),c=n.length-r;return c>0&&(l+=Ys.cursor.left(c)),l}if(a||e){let l=!n&&!!i?-i.length:-n.length+r;return e&&(l-=e.length),n===""&&i&&!s.includes(i)&&(l+=i.length),Ys.cursor.move(l)}}},wN=Ys.erase={screen:HA.screen,up:HA.up,down:HA.down,line:HA.line,lineEnd:HA.lineEnd,lineStart:HA.lineStart,lines(t){let e="";for(let r=0;r{if(!e)return wN.line+Lc.to(0);let r=s=>[...TJe.unstyle(s)].length,i=t.split(/\r?\n/),n=0;for(let s of i)n+=1+Math.floor(Math.max(r(s)-1,0)/e);return(wN.line+Lc.prevLine()).repeat(n-1)+wN.line+Lc.to(0)}});var sf=E((wCt,yne)=>{"use strict";var MJe=require("events"),wne=js(),BN=nne(),OJe=one(),KJe=lne(),UJe=pne(),bn=Mi(),Tc=Ine(),T0=class extends MJe{constructor(e={}){super();this.name=e.name,this.type=e.type,this.options=e,UJe(this),OJe(this),this.state=new KJe(this),this.initial=[e.initial,e.default].find(r=>r!=null),this.stdout=e.stdout||process.stdout,this.stdin=e.stdin||process.stdin,this.scale=e.scale||1,this.term=this.options.term||process.env.TERM_PROGRAM,this.margin=GJe(this.options.margin),this.setMaxListeners(0),HJe(this)}async keypress(e,r={}){this.keypressed=!0;let i=BN.action(e,BN(e,r),this.options.actions);this.state.keypress=i,this.emit("keypress",e,i),this.emit("state",this.state.clone());let n=this.options[i.action]||this[i.action]||this.dispatch;if(typeof n=="function")return await n.call(this,e,i);this.alert()}alert(){delete this.state.alert,this.options.show===!1?this.emit("alert"):this.stdout.write(Tc.code.beep)}cursorHide(){this.stdout.write(Tc.cursor.hide()),bn.onExit(()=>this.cursorShow())}cursorShow(){this.stdout.write(Tc.cursor.show())}write(e){!e||(this.stdout&&this.state.show!==!1&&this.stdout.write(e),this.state.buffer+=e)}clear(e=0){let r=this.state.buffer;this.state.buffer="",!(!r&&!e||this.options.show===!1)&&this.stdout.write(Tc.cursor.down(e)+Tc.clear(r,this.width))}restore(){if(this.state.closed||this.options.show===!1)return;let{prompt:e,after:r,rest:i}=this.sections(),{cursor:n,initial:s="",input:o="",value:a=""}=this,l=this.state.size=i.length,c={after:r,cursor:n,initial:s,input:o,prompt:e,size:l,value:a},u=Tc.cursor.restore(c);u&&this.stdout.write(u)}sections(){let{buffer:e,input:r,prompt:i}=this.state;i=wne.unstyle(i);let n=wne.unstyle(e),s=n.indexOf(i),o=n.slice(0,s),l=n.slice(s).split(` +`),c=l[0],u=l[l.length-1],f=(i+(r?" "+r:"")).length,h=fe.call(this,this.value),this.result=()=>i.call(this,this.value),typeof r.initial=="function"&&(this.initial=await r.initial.call(this,this)),typeof r.onRun=="function"&&await r.onRun.call(this,this),typeof r.onSubmit=="function"){let n=r.onSubmit.bind(this),s=this.submit.bind(this);delete this.options.onSubmit,this.submit=async()=>(await n(this.name,this.value,this),s())}await this.start(),await this.render()}render(){throw new Error("expected prompt to have a custom render method")}run(){return new Promise(async(e,r)=>{if(this.once("submit",e),this.once("cancel",r),await this.skip())return this.render=()=>{},this.submit();await this.initialize(),this.emit("run")})}async element(e,r,i){let{options:n,state:s,symbols:o,timers:a}=this,l=a&&a[e];s.timer=l;let c=n[e]||s[e]||o[e],u=r&&r[e]!=null?r[e]:await c;if(u==="")return u;let g=await this.resolve(u,s,r,i);return!g&&r&&r[e]?this.resolve(c,s,r,i):g}async prefix(){let e=await this.element("prefix")||this.symbols,r=this.timers&&this.timers.prefix,i=this.state;return i.timer=r,bn.isObject(e)&&(e=e[i.status]||e.pending),bn.hasColor(e)?e:(this.styles[i.status]||this.styles.pending)(e)}async message(){let e=await this.element("message");return bn.hasColor(e)?e:this.styles.strong(e)}async separator(){let e=await this.element("separator")||this.symbols,r=this.timers&&this.timers.separator,i=this.state;i.timer=r;let n=e[i.status]||e.pending||i.separator,s=await this.resolve(n,i);return bn.isObject(s)&&(s=s[i.status]||s.pending),bn.hasColor(s)?s:this.styles.muted(s)}async pointer(e,r){let i=await this.element("pointer",e,r);if(typeof i=="string"&&bn.hasColor(i))return i;if(i){let n=this.styles,s=this.index===r,o=s?n.primary:c=>c,a=await this.resolve(i[s?"on":"off"]||i,this.state),l=bn.hasColor(a)?a:o(a);return s?l:" ".repeat(a.length)}}async indicator(e,r){let i=await this.element("indicator",e,r);if(typeof i=="string"&&bn.hasColor(i))return i;if(i){let n=this.styles,s=e.enabled===!0,o=s?n.success:n.dark,a=i[s?"on":"off"]||i;return bn.hasColor(a)?a:o(a)}return""}body(){return null}footer(){if(this.state.status==="pending")return this.element("footer")}header(){if(this.state.status==="pending")return this.element("header")}async hint(){if(this.state.status==="pending"&&!this.isValue(this.state.input)){let e=await this.element("hint");return bn.hasColor(e)?e:this.styles.muted(e)}}error(e){return this.state.submitted?"":e||this.state.error}format(e){return e}result(e){return e}validate(e){return this.options.required===!0?this.isValue(e):!0}isValue(e){return e!=null&&e!==""}resolve(e,...r){return bn.resolve(this,e,...r)}get base(){return T0.prototype}get style(){return this.styles[this.state.status]}get height(){return this.options.rows||bn.height(this.stdout,25)}get width(){return this.options.columns||bn.width(this.stdout,80)}get size(){return{width:this.width,height:this.height}}set cursor(e){this.state.cursor=e}get cursor(){return this.state.cursor}set input(e){this.state.input=e}get input(){return this.state.input}set value(e){this.state.value=e}get value(){let{input:e,value:r}=this.state,i=[r,e].find(this.isValue.bind(this));return this.isValue(i)?i:this.initial}static get prompt(){return e=>new this(e).run()}};function HJe(t){let e=n=>t[n]===void 0||typeof t[n]=="function",r=["actions","choices","initial","margin","roles","styles","symbols","theme","timers","value"],i=["body","footer","error","header","hint","indicator","message","prefix","separator","skip"];for(let n of Object.keys(t.options)){if(r.includes(n)||/^on[A-Z]/.test(n))continue;let s=t.options[n];typeof s=="function"&&e(n)?i.includes(n)||(t[n]=s.bind(t)):typeof t[n]!="function"&&(t[n]=s)}}function GJe(t){typeof t=="number"&&(t=[t,t,t,t]);let e=[].concat(t||[]),r=n=>n%2==0?` +`:" ",i=[];for(let n=0;n<4;n++){let s=r(n);e[n]?i.push(s.repeat(e[n])):i.push("")}return i}yne.exports=T0});var bne=E((BCt,Bne)=>{"use strict";var jJe=Mi(),Qne={default(t,e){return e},checkbox(t,e){throw new Error("checkbox role is not implemented yet")},editable(t,e){throw new Error("editable role is not implemented yet")},expandable(t,e){throw new Error("expandable role is not implemented yet")},heading(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||"",e},input(t,e){throw new Error("input role is not implemented yet")},option(t,e){return Qne.default(t,e)},radio(t,e){throw new Error("radio role is not implemented yet")},separator(t,e){return e.disabled="",e.indicator=[e.indicator," "].find(r=>r!=null),e.message=e.message||t.symbols.line.repeat(5),e},spacer(t,e){return e}};Bne.exports=(t,e={})=>{let r=jJe.merge({},Qne,e.roles);return r[t]||r.default}});var sC=E((QCt,vne)=>{"use strict";var YJe=js(),qJe=sf(),JJe=bne(),M0=Mi(),{reorder:QN,scrollUp:WJe,scrollDown:zJe,isObject:Sne,swap:VJe}=M0,xne=class extends qJe{constructor(e){super(e);this.cursorHide(),this.maxSelected=e.maxSelected||Infinity,this.multiple=e.multiple||!1,this.initial=e.initial||0,this.delay=e.delay||0,this.longest=0,this.num=""}async initialize(){typeof this.options.initial=="function"&&(this.initial=await this.options.initial.call(this)),await this.reset(!0),await super.initialize()}async reset(){let{choices:e,initial:r,autofocus:i,suggest:n}=this.options;if(this.state._choices=[],this.state.choices=[],this.choices=await Promise.all(await this.toChoices(e)),this.choices.forEach(s=>s.enabled=!1),typeof n!="function"&&this.selectable.length===0)throw new Error("At least one choice must be selectable");Sne(r)&&(r=Object.keys(r)),Array.isArray(r)?(i!=null&&(this.index=this.findIndex(i)),r.forEach(s=>this.enable(this.find(s))),await this.render()):(i!=null&&(r=i),typeof r=="string"&&(r=this.findIndex(r)),typeof r=="number"&&r>-1&&(this.index=Math.max(0,Math.min(r,this.choices.length)),this.enable(this.find(this.index)))),this.isDisabled(this.focused)&&await this.down()}async toChoices(e,r){this.state.loadingChoices=!0;let i=[],n=0,s=async(o,a)=>{typeof o=="function"&&(o=await o.call(this)),o instanceof Promise&&(o=await o);for(let l=0;l(this.state.loadingChoices=!1,o))}async toChoice(e,r,i){if(typeof e=="function"&&(e=await e.call(this,this)),e instanceof Promise&&(e=await e),typeof e=="string"&&(e={name:e}),e.normalized)return e;e.normalized=!0;let n=e.value;if(e=JJe(e.role,this.options)(this,e),typeof e.disabled=="string"&&!e.hint&&(e.hint=e.disabled,e.disabled=!0),e.disabled===!0&&e.hint==null&&(e.hint="(disabled)"),e.index!=null)return e;e.name=e.name||e.key||e.title||e.value||e.message,e.message=e.message||e.name||"",e.value=[e.value,e.name].find(this.isValue.bind(this)),e.input="",e.index=r,e.cursor=0,M0.define(e,"parent",i),e.level=i?i.level+1:1,e.indent==null&&(e.indent=i?i.indent+" ":e.indent||""),e.path=i?i.path+"."+e.name:e.name,e.enabled=!!(this.multiple&&!this.isDisabled(e)&&(e.enabled||this.isSelected(e))),this.isDisabled(e)||(this.longest=Math.max(this.longest,YJe.unstyle(e.message).length));let o=P({},e);return e.reset=(a=o.input,l=o.value)=>{for(let c of Object.keys(o))e[c]=o[c];e.input=a,e.value=l},n==null&&typeof e.initial=="function"&&(e.input=await e.initial.call(this,this.state,e,r)),e}async onChoice(e,r){this.emit("choice",e,r,this),typeof e.onChoice=="function"&&await e.onChoice.call(this,this.state,e,r)}async addChoice(e,r,i){let n=await this.toChoice(e,r,i);return this.choices.push(n),this.index=this.choices.length-1,this.limit=this.choices.length,n}async newItem(e,r,i){let n=P({name:"New choice name?",editable:!0,newChoice:!0},e),s=await this.addChoice(n,r,i);return s.updateChoice=()=>{delete s.newChoice,s.name=s.message=s.input,s.input="",s.cursor=0},this.render()}indent(e){return e.indent==null?e.level>1?" ".repeat(e.level-1):"":e.indent}dispatch(e,r){if(this.multiple&&this[r.name])return this[r.name]();this.alert()}focus(e,r){return typeof r!="boolean"&&(r=e.enabled),r&&!e.enabled&&this.selected.length>=this.maxSelected?this.alert():(this.index=e.index,e.enabled=r&&!this.isDisabled(e),e)}space(){return this.multiple?(this.toggle(this.focused),this.render()):this.alert()}a(){if(this.maxSelectedr.enabled);return this.choices.forEach(r=>r.enabled=!e),this.render()}i(){return this.choices.length-this.selected.length>this.maxSelected?this.alert():(this.choices.forEach(e=>e.enabled=!e.enabled),this.render())}g(e=this.focused){return this.choices.some(r=>!!r.parent)?(this.toggle(e.parent&&!e.choices?e.parent:e),this.render()):this.a()}toggle(e,r){if(!e.enabled&&this.selected.length>=this.maxSelected)return this.alert();typeof r!="boolean"&&(r=!e.enabled),e.enabled=r,e.choices&&e.choices.forEach(n=>this.toggle(n,r));let i=e.parent;for(;i;){let n=i.choices.filter(s=>this.isDisabled(s));i.enabled=n.every(s=>s.enabled===!0),i=i.parent}return kne(this,this.choices),this.emit("toggle",e,this),e}enable(e){return this.selected.length>=this.maxSelected?this.alert():(e.enabled=!this.isDisabled(e),e.choices&&e.choices.forEach(this.enable.bind(this)),e)}disable(e){return e.enabled=!1,e.choices&&e.choices.forEach(this.disable.bind(this)),e}number(e){this.num+=e;let r=i=>{let n=Number(i);if(n>this.choices.length-1)return this.alert();let s=this.focused,o=this.choices.find(a=>n===a.index);if(!o.enabled&&this.selected.length>=this.maxSelected)return this.alert();if(this.visible.indexOf(o)===-1){let a=QN(this.choices),l=a.indexOf(o);if(s.index>l){let c=a.slice(l,l+this.limit),u=a.filter(g=>!c.includes(g));this.choices=c.concat(u)}else{let c=l-this.limit+1;this.choices=a.slice(c).concat(a.slice(0,c))}}return this.index=this.choices.indexOf(o),this.toggle(this.focused),this.render()};return clearTimeout(this.numberTimeout),new Promise(i=>{let n=this.choices.length,s=this.num,o=(a=!1,l)=>{clearTimeout(this.numberTimeout),a&&(l=r(s)),this.num="",i(l)};if(s==="0"||s.length===1&&Number(s+"0")>n)return o(!0);if(Number(s)>n)return o(!1,this.alert());this.numberTimeout=setTimeout(()=>o(!0),this.delay)})}home(){return this.choices=QN(this.choices),this.index=0,this.render()}end(){let e=this.choices.length-this.limit,r=QN(this.choices);return this.choices=r.slice(e).concat(r.slice(0,e)),this.index=this.limit-1,this.render()}first(){return this.index=0,this.render()}last(){return this.index=this.visible.length-1,this.render()}prev(){return this.visible.length<=1?this.alert():this.up()}next(){return this.visible.length<=1?this.alert():this.down()}right(){return this.cursor>=this.input.length?this.alert():(this.cursor++,this.render())}left(){return this.cursor<=0?this.alert():(this.cursor--,this.render())}up(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===0?this.alert():e>r&&i===0?this.scrollUp():(this.index=(i-1%e+e)%e,this.isDisabled()?this.up():this.render())}down(){let e=this.choices.length,r=this.visible.length,i=this.index;return this.options.scroll===!1&&i===r-1?this.alert():e>r&&i===r-1?this.scrollDown():(this.index=(i+1)%e,this.isDisabled()?this.down():this.render())}scrollUp(e=0){return this.choices=WJe(this.choices),this.index=e,this.isDisabled()?this.up():this.render()}scrollDown(e=this.visible.length-1){return this.choices=zJe(this.choices),this.index=e,this.isDisabled()?this.down():this.render()}async shiftUp(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index-1),await this.up(),this.sorting=!1;return}return this.scrollUp(this.index)}async shiftDown(){if(this.options.sort===!0){this.sorting=!0,this.swap(this.index+1),await this.down(),this.sorting=!1;return}return this.scrollDown(this.index)}pageUp(){return this.visible.length<=1?this.alert():(this.limit=Math.max(this.limit-1,0),this.index=Math.min(this.limit-1,this.index),this._limit=this.limit,this.isDisabled()?this.up():this.render())}pageDown(){return this.visible.length>=this.choices.length?this.alert():(this.index=Math.max(0,this.index),this.limit=Math.min(this.limit+1,this.choices.length),this._limit=this.limit,this.isDisabled()?this.down():this.render())}swap(e){VJe(this.choices,this.index,e)}isDisabled(e=this.focused){return e&&["disabled","collapsed","hidden","completing","readonly"].some(i=>e[i]===!0)?!0:e&&e.role==="heading"}isEnabled(e=this.focused){if(Array.isArray(e))return e.every(r=>this.isEnabled(r));if(e.choices){let r=e.choices.filter(i=>!this.isDisabled(i));return e.enabled&&r.every(i=>this.isEnabled(i))}return e.enabled&&!this.isDisabled(e)}isChoice(e,r){return e.name===r||e.index===Number(r)}isSelected(e){return Array.isArray(this.initial)?this.initial.some(r=>this.isChoice(e,r)):this.isChoice(e,this.initial)}map(e=[],r="value"){return[].concat(e||[]).reduce((i,n)=>(i[n]=this.find(n,r),i),{})}filter(e,r){let i=(a,l)=>[a.name,l].includes(e),n=typeof e=="function"?e:i,o=(this.options.multiple?this.state._choices:this.choices).filter(n);return r?o.map(a=>a[r]):o}find(e,r){if(Sne(e))return r?e[r]:e;let i=(o,a)=>[o.name,a].includes(e),n=typeof e=="function"?e:i,s=this.choices.find(n);if(s)return r?s[r]:s}findIndex(e){return this.choices.indexOf(this.find(e))}async submit(){let e=this.focused;if(!e)return this.alert();if(e.newChoice)return e.input?(e.updateChoice(),this.render()):this.alert();if(this.choices.some(o=>o.newChoice))return this.alert();let{reorder:r,sort:i}=this.options,n=this.multiple===!0,s=this.selected;return s===void 0?this.alert():(Array.isArray(s)&&r!==!1&&i!==!0&&(s=M0.reorder(s)),this.value=n?s.map(o=>o.name):s.name,super.submit())}set choices(e=[]){this.state._choices=this.state._choices||[],this.state.choices=e;for(let r of e)this.state._choices.some(i=>i.name===r.name)||this.state._choices.push(r);if(!this._initial&&this.options.initial){this._initial=!0;let r=this.initial;if(typeof r=="string"||typeof r=="number"){let i=this.find(r);i&&(this.initial=i.index,this.focus(i,!0))}}}get choices(){return kne(this,this.state.choices||[])}set visible(e){this.state.visible=e}get visible(){return(this.state.visible||this.choices).slice(0,this.limit)}set limit(e){this.state.limit=e}get limit(){let{state:e,options:r,choices:i}=this,n=e.limit||this._limit||r.limit||i.length;return Math.min(n,this.height)}set value(e){super.value=e}get value(){return typeof super.value!="string"&&super.value===this.initial?this.input:super.value}set index(e){this.state.index=e}get index(){return Math.max(0,this.state?this.state.index:0)}get enabled(){return this.filter(this.isEnabled.bind(this))}get focused(){let e=this.choices[this.index];return e&&this.state.submitted&&this.multiple!==!0&&(e.enabled=!0),e}get selectable(){return this.choices.filter(e=>!this.isDisabled(e))}get selected(){return this.multiple?this.enabled:this.focused}};function kne(t,e){if(e instanceof Promise)return e;if(typeof e=="function"){if(M0.isAsyncFn(e))return e;e=e.call(t,t)}for(let r of e){if(Array.isArray(r.choices)){let i=r.choices.filter(n=>!t.isDisabled(n));r.enabled=i.every(n=>n.enabled===!0)}t.isDisabled(r)===!0&&delete r.enabled}return e}vne.exports=xne});var GA=E((bCt,Pne)=>{"use strict";var _Je=sC(),bN=Mi(),Dne=class extends _Je{constructor(e){super(e);this.emptyError=this.options.emptyError||"No items were selected"}async dispatch(e,r){if(this.multiple)return this[r.name]?await this[r.name](e,r):await super.dispatch(e,r);this.alert()}separator(){if(this.options.separator)return super.separator();let e=this.styles.muted(this.symbols.ellipsis);return this.state.submitted?super.separator():e}pointer(e,r){return!this.multiple||this.options.pointer?super.pointer(e,r):""}indicator(e,r){return this.multiple?super.indicator(e,r):""}choiceMessage(e,r){let i=this.resolve(e.message,this.state,e,r);return e.role==="heading"&&!bN.hasColor(i)&&(i=this.styles.strong(i)),this.resolve(i,this.state,e,r)}choiceSeparator(){return":"}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await this.indicator(e,r)+(e.pad||""),o=await this.resolve(e.hint,this.state,e,r);o&&!bN.hasColor(o)&&(o=this.styles.muted(o));let a=this.indent(e),l=await this.choiceMessage(e,r),c=()=>[this.margin[3],a+n+s,l,this.margin[1],o].filter(Boolean).join(" ");return e.role==="heading"?c():e.disabled?(bN.hasColor(l)||(l=this.styles.disabled(l)),c()):(i&&(l=this.styles.em(l)),c())}async renderChoices(){if(this.state.loading==="choices")return this.styles.warning("Loading choices");if(this.state.submitted)return"";let e=this.visible.map(async(s,o)=>await this.renderChoice(s,o)),r=await Promise.all(e);r.length||r.push(this.styles.danger("No matching choices"));let i=this.margin[0]+r.join(` +`),n;return this.options.choicesHeader&&(n=await this.resolve(this.options.choicesHeader,this.state)),[n,i].filter(Boolean).join(` +`)}format(){return!this.state.submitted||this.state.cancelled?"":Array.isArray(this.selected)?this.selected.map(e=>this.styles.primary(e.name)).join(", "):this.styles.primary(this.selected.name)}async render(){let{submitted:e,size:r}=this.state,i="",n=await this.header(),s=await this.prefix(),o=await this.separator(),a=await this.message();this.options.promptLine!==!1&&(i=[s,a,o,""].join(" "),this.state.prompt=i);let l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();l&&(i+=l),c&&!i.includes(c)&&(i+=" "+c),e&&!l&&!u.trim()&&this.multiple&&this.emptyError!=null&&(i+=this.styles.danger(this.emptyError)),this.clear(r),this.write([n,i,u,g].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Pne.exports=Dne});var Nne=E((vCt,Rne)=>{"use strict";var XJe=GA(),ZJe=(t,e)=>{let r=t.toLowerCase();return i=>{let s=i.toLowerCase().indexOf(r),o=e(i.slice(s,s+r.length));return s>=0?i.slice(0,s)+o+i.slice(s+r.length):i}},Fne=class extends XJe{constructor(e){super(e);this.cursorShow()}moveCursor(e){this.state.cursor+=e}dispatch(e){return this.append(e)}space(e){return this.options.multiple?super.space(e):this.append(e)}append(e){let{cursor:r,input:i}=this.state;return this.input=i.slice(0,r)+e+i.slice(r),this.moveCursor(1),this.complete()}delete(){let{cursor:e,input:r}=this.state;return r?(this.input=r.slice(0,e-1)+r.slice(e),this.moveCursor(-1),this.complete()):this.alert()}deleteForward(){let{cursor:e,input:r}=this.state;return r[e]===void 0?this.alert():(this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.complete())}number(e){return this.append(e)}async complete(){this.completing=!0,this.choices=await this.suggest(this.input,this.state._choices),this.state.limit=void 0,this.index=Math.min(Math.max(this.visible.length-1,0),this.index),await this.render(),this.completing=!1}suggest(e=this.input,r=this.state._choices){if(typeof this.options.suggest=="function")return this.options.suggest.call(this,e,r);let i=e.toLowerCase();return r.filter(n=>n.message.toLowerCase().includes(i))}pointer(){return""}format(){if(!this.focused)return this.input;if(this.options.multiple&&this.state.submitted)return this.selected.map(e=>this.styles.primary(e.message)).join(", ");if(this.state.submitted){let e=this.value=this.input=this.focused.value;return this.styles.primary(e)}return this.input}async render(){if(this.state.status!=="pending")return super.render();let e=this.options.highlight?this.options.highlight.bind(this):this.styles.placeholder,r=ZJe(this.input,e),i=this.choices;this.choices=i.map(n=>_(P({},n),{message:r(n.message)})),await super.render(),this.choices=i}submit(){return this.options.multiple&&(this.value=this.selected.map(e=>e.name)),super.submit()}};Rne.exports=Fne});var SN=E((SCt,Lne)=>{"use strict";var vN=Mi();Lne.exports=(t,e={})=>{t.cursorHide();let{input:r="",initial:i="",pos:n,showCursor:s=!0,color:o}=e,a=o||t.styles.placeholder,l=vN.inverse(t.styles.primary),c=d=>l(t.styles.black(d)),u=r,g=" ",f=c(g);if(t.blink&&t.blink.off===!0&&(c=d=>d,f=""),s&&n===0&&i===""&&r==="")return c(g);if(s&&n===0&&(r===i||r===""))return c(i[0])+a(i.slice(1));i=vN.isPrimitive(i)?`${i}`:"",r=vN.isPrimitive(r)?`${r}`:"";let h=i&&i.startsWith(r)&&i!==r,p=h?c(i[r.length]):f;if(n!==r.length&&s===!0&&(u=r.slice(0,n)+c(r[n])+r.slice(n+1),p=""),s===!1&&(p=""),h){let d=t.styles.unstyle(u+p);return u+p+a(i.slice(d.length))}return u+p}});var O0=E((xCt,Tne)=>{"use strict";var $Je=js(),e3e=GA(),t3e=SN(),Mne=class extends e3e{constructor(e){super(_(P({},e),{multiple:!0}));this.type="form",this.initial=this.options.initial,this.align=[this.options.align,"right"].find(r=>r!=null),this.emptyError="",this.values={}}async reset(e){return await super.reset(),e===!0&&(this._index=this.index),this.index=this._index,this.values={},this.choices.forEach(r=>r.reset&&r.reset()),this.render()}dispatch(e){return!!e&&this.append(e)}append(e){let r=this.focused;if(!r)return this.alert();let{cursor:i,input:n}=r;return r.value=r.input=n.slice(0,i)+e+n.slice(i),r.cursor++,this.render()}delete(){let e=this.focused;if(!e||e.cursor<=0)return this.alert();let{cursor:r,input:i}=e;return e.value=e.input=i.slice(0,r-1)+i.slice(r),e.cursor--,this.render()}deleteForward(){let e=this.focused;if(!e)return this.alert();let{cursor:r,input:i}=e;if(i[r]===void 0)return this.alert();let n=`${i}`.slice(0,r)+`${i}`.slice(r+1);return e.value=e.input=n,this.render()}right(){let e=this.focused;return e?e.cursor>=e.input.length?this.alert():(e.cursor++,this.render()):this.alert()}left(){let e=this.focused;return e?e.cursor<=0?this.alert():(e.cursor--,this.render()):this.alert()}space(e,r){return this.dispatch(e,r)}number(e,r){return this.dispatch(e,r)}next(){let e=this.focused;if(!e)return this.alert();let{initial:r,input:i}=e;return r&&r.startsWith(i)&&i!==r?(e.value=e.input=r,e.cursor=e.value.length,this.render()):super.next()}prev(){let e=this.focused;return e?e.cursor===0?super.prev():(e.value=e.input="",e.cursor=0,this.render()):this.alert()}separator(){return""}format(e){return this.state.submitted?"":super.format(e)}pointer(){return""}indicator(e){return e.input?"\u29BF":"\u2299"}async choiceSeparator(e,r){let i=await this.resolve(e.separator,this.state,e,r)||":";return i?" "+this.styles.disabled(i):""}async renderChoice(e,r){await this.onChoice(e,r);let{state:i,styles:n}=this,{cursor:s,initial:o="",name:a,hint:l,input:c=""}=e,{muted:u,submitted:g,primary:f,danger:h}=n,p=l,d=this.index===r,m=e.validate||(()=>!0),I=await this.choiceSeparator(e,r),B=e.message;this.align==="right"&&(B=B.padStart(this.longest+1," ")),this.align==="left"&&(B=B.padEnd(this.longest+1," "));let b=this.values[a]=c||o,R=c?"success":"dark";await m.call(e,b,this.state)!==!0&&(R="danger");let L=n[R](await this.indicator(e,r))+(e.pad||""),K=this.indent(e),J=()=>[K,L,B+I,c,p].filter(Boolean).join(" ");if(i.submitted)return B=$Je.unstyle(B),c=g(c),p="",J();if(e.format)c=await e.format.call(this,c,e,r);else{let ne=this.styles.muted;c=t3e(this,{input:c,initial:o,pos:s,showCursor:d,color:ne})}return this.isValue(c)||(c=this.styles.muted(this.symbols.ellipsis)),e.result&&(this.values[a]=await e.result.call(this,b,e,r)),d&&(B=f(B)),e.error?c+=(c?" ":"")+h(e.error.trim()):e.hint&&(c+=(c?" ":"")+u(e.hint.trim())),J()}async submit(){return this.value=this.values,super.base.submit.call(this)}};Tne.exports=Mne});var xN=E((kCt,One)=>{"use strict";var r3e=O0(),i3e=()=>{throw new Error("expected prompt to have a custom authenticate method")},Kne=(t=i3e)=>{class e extends r3e{constructor(i){super(i)}async submit(){this.value=await t.call(this,this.values,this.state),super.base.submit.call(this)}static create(i){return Kne(i)}}return e};One.exports=Kne()});var Gne=E((PCt,Une)=>{"use strict";var n3e=xN();function s3e(t,e){return t.username===this.options.username&&t.password===this.options.password}var Hne=(t=s3e)=>{let e=[{name:"username",message:"username"},{name:"password",message:"password",format(i){return this.options.showPassword?i:(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(i.length))}}];class r extends n3e.create(t){constructor(n){super(_(P({},n),{choices:e}))}static create(n){return Hne(n)}}return r};Une.exports=Hne()});var K0=E((DCt,jne)=>{"use strict";var o3e=sf(),{isPrimitive:a3e,hasColor:A3e}=Mi(),Yne=class extends o3e{constructor(e){super(e);this.cursorHide()}async initialize(){let e=await this.resolve(this.initial,this.state);this.input=await this.cast(e),await super.initialize()}dispatch(e){return this.isValue(e)?(this.input=e,this.submit()):this.alert()}format(e){let{styles:r,state:i}=this;return i.submitted?r.success(e):r.primary(e)}cast(e){return this.isTrue(e)}isTrue(e){return/^[ty1]/i.test(e)}isFalse(e){return/^[fn0]/i.test(e)}isValue(e){return a3e(e)&&(this.isTrue(e)||this.isFalse(e))}async hint(){if(this.state.status==="pending"){let e=await this.element("hint");return A3e(e)?e:this.styles.muted(e)}}async render(){let{input:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=this.styles.muted(this.default),a=[i,s,o,n].filter(Boolean).join(" ");this.state.prompt=a;let l=await this.header(),c=this.value=this.cast(e),u=await this.format(c),g=await this.error()||await this.hint(),f=await this.footer();g&&!a.includes(g)&&(u+=" "+g),a+=" "+u,this.clear(r),this.write([l,a,f].filter(Boolean).join(` +`)),this.restore()}set value(e){super.value=e}get value(){return this.cast(super.value)}};jne.exports=Yne});var Wne=E((RCt,qne)=>{"use strict";var l3e=K0(),Jne=class extends l3e{constructor(e){super(e);this.default=this.options.default||(this.initial?"(Y/n)":"(y/N)")}};qne.exports=Jne});var _ne=E((FCt,zne)=>{"use strict";var c3e=GA(),u3e=O0(),of=u3e.prototype,Vne=class extends c3e{constructor(e){super(_(P({},e),{multiple:!0}));this.align=[this.options.align,"left"].find(r=>r!=null),this.emptyError="",this.values={}}dispatch(e,r){let i=this.focused,n=i.parent||{};return!i.editable&&!n.editable&&(e==="a"||e==="i")?super[e]():of.dispatch.call(this,e,r)}append(e,r){return of.append.call(this,e,r)}delete(e,r){return of.delete.call(this,e,r)}space(e){return this.focused.editable?this.append(e):super.space()}number(e){return this.focused.editable?this.append(e):super.number(e)}next(){return this.focused.editable?of.next.call(this):super.next()}prev(){return this.focused.editable?of.prev.call(this):super.prev()}async indicator(e,r){let i=e.indicator||"",n=e.editable?i:super.indicator(e,r);return await this.resolve(n,this.state,e,r)||""}indent(e){return e.role==="heading"?"":e.editable?" ":" "}async renderChoice(e,r){return e.indent="",e.editable?of.renderChoice.call(this,e,r):super.renderChoice(e,r)}error(){return""}footer(){return this.state.error}async validate(){let e=!0;for(let r of this.choices){if(typeof r.validate!="function"||r.role==="heading")continue;let i=r.parent?this.value[r.parent.name]:this.value;if(r.editable?i=r.value===r.name?r.initial||"":r.value:this.isDisabled(r)||(i=r.enabled===!0),e=await r.validate(i,this.state),e!==!0)break}return e!==!0&&(this.state.error=typeof e=="string"?e:"Invalid Input"),e}submit(){if(this.focused.newChoice===!0)return super.submit();if(this.choices.some(e=>e.newChoice))return this.alert();this.value={};for(let e of this.choices){let r=e.parent?this.value[e.parent.name]:this.value;if(e.role==="heading"){this.value[e.name]={};continue}e.editable?r[e.name]=e.value===e.name?e.initial||"":e.value:this.isDisabled(e)||(r[e.name]=e.enabled===!0)}return this.base.submit.call(this)}};zne.exports=Vne});var Mc=E((NCt,Xne)=>{"use strict";var g3e=sf(),f3e=SN(),{isPrimitive:h3e}=Mi(),Zne=class extends g3e{constructor(e){super(e);this.initial=h3e(this.initial)?String(this.initial):"",this.initial&&this.cursorHide(),this.state.prevCursor=0,this.state.clipboard=[]}async keypress(e,r={}){let i=this.state.prevKeypress;return this.state.prevKeypress=r,this.options.multiline===!0&&r.name==="return"&&(!i||i.name!=="return")?this.append(` +`,r):super.keypress(e,r)}moveCursor(e){this.cursor+=e}reset(){return this.input=this.value="",this.cursor=0,this.render()}dispatch(e,r){if(!e||r.ctrl||r.code)return this.alert();this.append(e)}append(e){let{cursor:r,input:i}=this.state;this.input=`${i}`.slice(0,r)+e+`${i}`.slice(r),this.moveCursor(String(e).length),this.render()}insert(e){this.append(e)}delete(){let{cursor:e,input:r}=this.state;if(e<=0)return this.alert();this.input=`${r}`.slice(0,e-1)+`${r}`.slice(e),this.moveCursor(-1),this.render()}deleteForward(){let{cursor:e,input:r}=this.state;if(r[e]===void 0)return this.alert();this.input=`${r}`.slice(0,e)+`${r}`.slice(e+1),this.render()}cutForward(){let e=this.cursor;if(this.input.length<=e)return this.alert();this.state.clipboard.push(this.input.slice(e)),this.input=this.input.slice(0,e),this.render()}cutLeft(){let e=this.cursor;if(e===0)return this.alert();let r=this.input.slice(0,e),i=this.input.slice(e),n=r.split(" ");this.state.clipboard.push(n.pop()),this.input=n.join(" "),this.cursor=this.input.length,this.input+=i,this.render()}paste(){if(!this.state.clipboard.length)return this.alert();this.insert(this.state.clipboard.pop()),this.render()}toggleCursor(){this.state.prevCursor?(this.cursor=this.state.prevCursor,this.state.prevCursor=0):(this.state.prevCursor=this.cursor,this.cursor=0),this.render()}first(){this.cursor=0,this.render()}last(){this.cursor=this.input.length-1,this.render()}next(){let e=this.initial!=null?String(this.initial):"";if(!e||!e.startsWith(this.input))return this.alert();this.input=this.initial,this.cursor=this.initial.length,this.render()}prev(){if(!this.input)return this.alert();this.reset()}backward(){return this.left()}forward(){return this.right()}right(){return this.cursor>=this.input.length?this.alert():(this.moveCursor(1),this.render())}left(){return this.cursor<=0?this.alert():(this.moveCursor(-1),this.render())}isValue(e){return!!e}async format(e=this.value){let r=await this.resolve(this.initial,this.state);return this.state.submitted?this.styles.submitted(e||r):f3e(this,{input:e,initial:r,pos:this.cursor})}async render(){let e=this.state.size,r=await this.prefix(),i=await this.separator(),n=await this.message(),s=[r,n,i].filter(Boolean).join(" ");this.state.prompt=s;let o=await this.header(),a=await this.format(),l=await this.error()||await this.hint(),c=await this.footer();l&&!a.includes(l)&&(a+=" "+l),s+=" "+a,this.clear(e),this.write([o,s,c].filter(Boolean).join(` +`)),this.restore()}};Xne.exports=Zne});var ese=E((LCt,$ne)=>{"use strict";var p3e=t=>t.filter((e,r)=>t.lastIndexOf(e)===r),U0=t=>p3e(t).filter(Boolean);$ne.exports=(t,e={},r="")=>{let{past:i=[],present:n=""}=e,s,o;switch(t){case"prev":case"undo":return s=i.slice(0,i.length-1),o=i[i.length-1]||"",{past:U0([r,...s]),present:o};case"next":case"redo":return s=i.slice(1),o=i[0]||"",{past:U0([...s,r]),present:o};case"save":return{past:U0([...i,r]),present:""};case"remove":return o=U0(i.filter(a=>a!==r)),n="",o.length&&(n=o.pop()),{past:o,present:n};default:throw new Error(`Invalid action: "${t}"`)}}});var kN=E((TCt,tse)=>{"use strict";var d3e=Mc(),rse=ese(),ise=class extends d3e{constructor(e){super(e);let r=this.options.history;if(r&&r.store){let i=r.values||this.initial;this.autosave=!!r.autosave,this.store=r.store,this.data=this.store.get("values")||{past:[],present:i},this.initial=this.data.present||this.data.past[this.data.past.length-1]}}completion(e){return this.store?(this.data=rse(e,this.data,this.input),this.data.present?(this.input=this.data.present,this.cursor=this.input.length,this.render()):this.alert()):this.alert()}altUp(){return this.completion("prev")}altDown(){return this.completion("next")}prev(){return this.save(),super.prev()}save(){!this.store||(this.data=rse("save",this.data,this.input),this.store.set("values",this.data))}submit(){return this.store&&this.autosave===!0&&this.save(),super.submit()}};tse.exports=ise});var ose=E((MCt,nse)=>{"use strict";var C3e=Mc(),sse=class extends C3e{format(){return""}};nse.exports=sse});var lse=E((OCt,ase)=>{"use strict";var m3e=Mc(),Ase=class extends m3e{constructor(e={}){super(e);this.sep=this.options.separator||/, */,this.initial=e.initial||""}split(e=this.value){return e?String(e).split(this.sep):[]}format(){let e=this.state.submitted?this.styles.primary:r=>r;return this.list.map(e).join(", ")}async submit(e){let r=this.state.error||await this.validate(this.list,this.state);return r!==!0?(this.state.error=r,super.submit()):(this.value=this.list,super.submit())}get list(){return this.split()}};ase.exports=Ase});var gse=E((KCt,cse)=>{"use strict";var E3e=GA(),use=class extends E3e{constructor(e){super(_(P({},e),{multiple:!0}))}};cse.exports=use});var PN=E((UCt,fse)=>{"use strict";var I3e=Mc(),hse=class extends I3e{constructor(e={}){super(P({style:"number"},e));this.min=this.isValue(e.min)?this.toNumber(e.min):-Infinity,this.max=this.isValue(e.max)?this.toNumber(e.max):Infinity,this.delay=e.delay!=null?e.delay:1e3,this.float=e.float!==!1,this.round=e.round===!0||e.float===!1,this.major=e.major||10,this.minor=e.minor||1,this.initial=e.initial!=null?e.initial:"",this.input=String(this.initial),this.cursor=this.input.length,this.cursorShow()}append(e){return!/[-+.]/.test(e)||e==="."&&this.input.includes(".")?this.alert("invalid number"):super.append(e)}number(e){return super.append(e)}next(){return this.input&&this.input!==this.initial?this.alert():this.isValue(this.initial)?(this.input=this.initial,this.cursor=String(this.initial).length,this.render()):this.alert()}up(e){let r=e||this.minor,i=this.toNumber(this.input);return i>this.max+r?this.alert():(this.input=`${i+r}`,this.render())}down(e){let r=e||this.minor,i=this.toNumber(this.input);return ithis.isValue(r));return this.value=this.toNumber(e||0),super.submit()}};fse.exports=hse});var dse=E((HCt,pse)=>{pse.exports=PN()});var Ese=E((GCt,Cse)=>{"use strict";var y3e=Mc(),mse=class extends y3e{constructor(e){super(e);this.cursorShow()}format(e=this.input){return this.keypressed?(this.state.submitted?this.styles.primary:this.styles.muted)(this.symbols.asterisk.repeat(e.length)):""}};Cse.exports=mse});var Bse=E((jCt,Ise)=>{"use strict";var w3e=js(),B3e=sC(),yse=Mi(),wse=class extends B3e{constructor(e={}){super(e);this.widths=[].concat(e.messageWidth||50),this.align=[].concat(e.align||"left"),this.linebreak=e.linebreak||!1,this.edgeLength=e.edgeLength||3,this.newline=e.newline||` + `;let r=e.startNumber||1;typeof this.scale=="number"&&(this.scaleKey=!1,this.scale=Array(this.scale).fill(0).map((i,n)=>({name:n+r})))}async reset(){return this.tableized=!1,await super.reset(),this.render()}tableize(){if(this.tableized===!0)return;this.tableized=!0;let e=0;for(let r of this.choices){e=Math.max(e,r.message.length),r.scaleIndex=r.initial||2,r.scale=[];for(let i=0;i=this.scale.length-1?this.alert():(e.scaleIndex++,this.render())}left(){let e=this.focused;return e.scaleIndex<=0?this.alert():(e.scaleIndex--,this.render())}indent(){return""}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.index)).join(", "):""}pointer(){return""}renderScaleKey(){if(this.scaleKey===!1||this.state.submitted)return"";let e=this.scale.map(i=>` ${i.name} - ${i.message}`);return["",...e].map(i=>this.styles.muted(i)).join(` +`)}renderScaleHeading(e){let r=this.scale.map(l=>l.name);typeof this.options.renderScaleHeading=="function"&&(r=this.options.renderScaleHeading.call(this,e));let i=this.scaleLength-r.join("").length,n=Math.round(i/(r.length-1)),o=r.map(l=>this.styles.strong(l)).join(" ".repeat(n)),a=" ".repeat(this.widths[0]);return this.margin[3]+a+this.margin[1]+o}scaleIndicator(e,r,i){if(typeof this.options.scaleIndicator=="function")return this.options.scaleIndicator.call(this,e,r,i);let n=e.scaleIndex===r.index;return r.disabled?this.styles.hint(this.symbols.radio.disabled):n?this.styles.success(this.symbols.radio.on):this.symbols.radio.off}renderScale(e,r){let i=e.scale.map(s=>this.scaleIndicator(e,s,r)),n=this.term==="Hyper"?"":" ";return i.join(n+this.symbols.line.repeat(this.edgeLength))}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=await this.pointer(e,r),s=await e.hint;s&&!yse.hasColor(s)&&(s=this.styles.muted(s));let o=p=>this.margin[3]+p.replace(/\s+$/,"").padEnd(this.widths[0]," "),a=this.newline,l=this.indent(e),c=await this.resolve(e.message,this.state,e,r),u=await this.renderScale(e,r),g=this.margin[1]+this.margin[3];this.scaleLength=w3e.unstyle(u).length,this.widths[0]=Math.min(this.widths[0],this.width-this.scaleLength-g.length);let h=yse.wordWrap(c,{width:this.widths[0],newline:a}).split(` +`).map(p=>o(p)+this.margin[1]);return i&&(u=this.styles.info(u),h=h.map(p=>this.styles.info(p))),h[0]+=u,this.linebreak&&h.push(""),[l+n,h.join(` +`)].filter(Boolean)}async renderChoices(){if(this.state.submitted)return"";this.tableize();let e=this.visible.map(async(n,s)=>await this.renderChoice(n,s)),r=await Promise.all(e),i=await this.renderScaleHeading();return this.margin[0]+[i,...r.map(n=>n.join(" "))].join(` +`)}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o="";this.options.promptLine!==!1&&(o=[i,s,n,""].join(" "),this.state.prompt=o);let a=await this.header(),l=await this.format(),c=await this.renderScaleKey(),u=await this.error()||await this.hint(),g=await this.renderChoices(),f=await this.footer(),h=this.emptyError;l&&(o+=l),u&&!o.includes(u)&&(o+=" "+u),e&&!l&&!g.trim()&&this.multiple&&h!=null&&(o+=this.styles.danger(h)),this.clear(r),this.write([a,o,c,g,f].filter(Boolean).join(` +`)),this.state.submitted||this.write(this.margin[2]),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIndex;return this.base.submit.call(this)}};Ise.exports=wse});var Sse=E((YCt,Qse)=>{"use strict";var bse=js(),Q3e=(t="")=>typeof t=="string"?t.replace(/^['"]|['"]$/g,""):"",vse=class{constructor(e){this.name=e.key,this.field=e.field||{},this.value=Q3e(e.initial||this.field.initial||""),this.message=e.message||this.name,this.cursor=0,this.input="",this.lines=[]}},b3e=async(t={},e={},r=i=>i)=>{let i=new Set,n=t.fields||[],s=t.template,o=[],a=[],l=[],c=1;typeof s=="function"&&(s=await s());let u=-1,g=()=>s[++u],f=()=>s[u+1],h=p=>{p.line=c,o.push(p)};for(h({type:"bos",value:""});uR.name===I.key);I.field=n.find(R=>R.name===I.key),b||(b=new vse(I),a.push(b)),b.lines.push(I.line-1);continue}let d=o[o.length-1];d.type==="text"&&d.line===c?d.value+=p:h({type:"text",value:p})}return h({type:"eos",value:""}),{input:s,tabstops:o,unique:i,keys:l,items:a}};Qse.exports=async t=>{let e=t.options,r=new Set(e.required===!0?[]:e.required||[]),i=P(P({},e.values),e.initial),{tabstops:n,items:s,keys:o}=await b3e(e,i),a=DN("result",t,e),l=DN("format",t,e),c=DN("validate",t,e,!0),u=t.isValue.bind(t);return async(g={},f=!1)=>{let h=0;g.required=r,g.items=s,g.keys=o,g.output="";let p=async(B,b,R,H)=>{let L=await c(B,b,R,H);return L===!1?"Invalid field "+R.name:L};for(let B of n){let b=B.value,R=B.key;if(B.type!=="template"){b&&(g.output+=b);continue}if(B.type==="template"){let H=s.find(q=>q.name===R);e.required===!0&&g.required.add(H.name);let L=[H.input,g.values[H.value],H.value,b].find(u),J=(H.field||{}).message||B.inner;if(f){let q=await p(g.values[R],g,H,h);if(q&&typeof q=="string"||q===!1){g.invalid.set(R,q);continue}g.invalid.delete(R);let A=await a(g.values[R],g,H,h);g.output+=bse.unstyle(A);continue}H.placeholder=!1;let ne=b;b=await l(b,g,H,h),L!==b?(g.values[R]=L,b=t.styles.typing(L),g.missing.delete(J)):(g.values[R]=void 0,L=`<${J}>`,b=t.styles.primary(L),H.placeholder=!0,g.required.has(R)&&g.missing.add(J)),g.missing.has(J)&&g.validating&&(b=t.styles.warning(L)),g.invalid.has(R)&&g.validating&&(b=t.styles.danger(L)),h===g.index&&(ne!==b?b=t.styles.underline(b):b=t.styles.heading(bse.unstyle(b))),h++}b&&(g.output+=b)}let d=g.output.split(` +`).map(B=>" "+B),m=s.length,I=0;for(let B of s)g.invalid.has(B.name)&&B.lines.forEach(b=>{d[b][0]===" "&&(d[b]=g.styles.danger(g.symbols.bullet)+d[b].slice(1))}),t.isValue(g.values[B.name])&&I++;return g.completed=(I/m*100).toFixed(0),g.output=d.join(` +`),g.output}};function DN(t,e,r,i){return(n,s,o,a)=>typeof o.field[t]=="function"?o.field[t].call(e,n,s,o,a):[i,n].find(l=>e.isValue(l))}});var Pse=E((qCt,xse)=>{"use strict";var v3e=js(),S3e=Sse(),x3e=sf(),kse=class extends x3e{constructor(e){super(e);this.cursorHide(),this.reset(!0)}async initialize(){this.interpolate=await S3e(this),await super.initialize()}async reset(e){this.state.keys=[],this.state.invalid=new Map,this.state.missing=new Set,this.state.completed=0,this.state.values={},e!==!0&&(await this.initialize(),await this.render())}moveCursor(e){let r=this.getItem();this.cursor+=e,r.cursor+=e}dispatch(e,r){if(!r.code&&!r.ctrl&&e!=null&&this.getItem()){this.append(e,r);return}this.alert()}append(e,r){let i=this.getItem(),n=i.input.slice(0,this.cursor),s=i.input.slice(this.cursor);this.input=i.input=`${n}${e}${s}`,this.moveCursor(1),this.render()}delete(){let e=this.getItem();if(this.cursor<=0||!e.input)return this.alert();let r=e.input.slice(this.cursor),i=e.input.slice(0,this.cursor-1);this.input=e.input=`${i}${r}`,this.moveCursor(-1),this.render()}increment(e){return e>=this.state.keys.length-1?0:e+1}decrement(e){return e<=0?this.state.keys.length-1:e-1}first(){this.state.index=0,this.render()}last(){this.state.index=this.state.keys.length-1,this.render()}right(){if(this.cursor>=this.input.length)return this.alert();this.moveCursor(1),this.render()}left(){if(this.cursor<=0)return this.alert();this.moveCursor(-1),this.render()}prev(){this.state.index=this.decrement(this.state.index),this.getItem(),this.render()}next(){this.state.index=this.increment(this.state.index),this.getItem(),this.render()}up(){this.prev()}down(){this.next()}format(e){let r=this.state.completed<100?this.styles.warning:this.styles.success;return this.state.submitted===!0&&this.state.completed!==100&&(r=this.styles.danger),r(`${this.state.completed}% completed`)}async render(){let{index:e,keys:r=[],submitted:i,size:n}=this.state,s=[this.options.newline,` +`].find(B=>B!=null),o=await this.prefix(),a=await this.separator(),l=await this.message(),c=[o,l,a].filter(Boolean).join(" ");this.state.prompt=c;let u=await this.header(),g=await this.error()||"",f=await this.hint()||"",h=i?"":await this.interpolate(this.state),p=this.state.key=r[e]||"",d=await this.format(p),m=await this.footer();d&&(c+=" "+d),f&&!d&&this.state.completed===0&&(c+=" "+f),this.clear(n);let I=[u,c,h,m,g.trim()];this.write(I.filter(Boolean).join(s)),this.restore()}getItem(e){let{items:r,keys:i,index:n}=this.state,s=r.find(o=>o.name===i[n]);return s&&s.input!=null&&(this.input=s.input,this.cursor=s.cursor),s}async submit(){typeof this.interpolate!="function"&&await this.initialize(),await this.interpolate(this.state,!0);let{invalid:e,missing:r,output:i,values:n}=this.state;if(e.size){let a="";for(let[l,c]of e)a+=`Invalid ${l}: ${c} +`;return this.state.error=a,super.submit()}if(r.size)return this.state.error="Required: "+[...r.keys()].join(", "),super.submit();let o=v3e.unstyle(i).split(` +`).map(a=>a.slice(1)).join(` +`);return this.value={values:n,result:o},super.submit()}};xse.exports=kse});var Fse=E((JCt,Dse)=>{"use strict";var k3e="(Use + to sort)",P3e=GA(),Rse=class extends P3e{constructor(e){super(_(P({},e),{reorder:!1,sort:!0,multiple:!0}));this.state.hint=[this.options.hint,k3e].find(this.isValue.bind(this))}indicator(){return""}async renderChoice(e,r){let i=await super.renderChoice(e,r),n=this.symbols.identicalTo+" ",s=this.index===r&&this.sorting?this.styles.muted(n):" ";return this.options.drag===!1&&(s=""),this.options.numbered===!0?s+`${r+1} - `+i:s+i}get selected(){return this.choices}submit(){return this.value=this.choices.map(e=>e.value),super.submit()}};Dse.exports=Rse});var Tse=E((WCt,Nse)=>{"use strict";var D3e=sC(),Lse=class extends D3e{constructor(e={}){super(e);if(this.emptyError=e.emptyError||"No items were selected",this.term=process.env.TERM_PROGRAM,!this.options.header){let r=["","4 - Strongly Agree","3 - Agree","2 - Neutral","1 - Disagree","0 - Strongly Disagree",""];r=r.map(i=>this.styles.muted(i)),this.state.header=r.join(` + `)}}async toChoices(...e){if(this.createdScales)return!1;this.createdScales=!0;let r=await super.toChoices(...e);for(let i of r)i.scale=R3e(5,this.options),i.scaleIdx=2;return r}dispatch(){this.alert()}space(){let e=this.focused,r=e.scale[e.scaleIdx],i=r.selected;return e.scale.forEach(n=>n.selected=!1),r.selected=!i,this.render()}indicator(){return""}pointer(){return""}separator(){return this.styles.muted(this.symbols.ellipsis)}right(){let e=this.focused;return e.scaleIdx>=e.scale.length-1?this.alert():(e.scaleIdx++,this.render())}left(){let e=this.focused;return e.scaleIdx<=0?this.alert():(e.scaleIdx--,this.render())}indent(){return" "}async renderChoice(e,r){await this.onChoice(e,r);let i=this.index===r,n=this.term==="Hyper",s=n?9:8,o=n?"":" ",a=this.symbols.line.repeat(s),l=" ".repeat(s+(n?0:1)),c=b=>(b?this.styles.success("\u25C9"):"\u25EF")+o,u=r+1+".",g=i?this.styles.heading:this.styles.noop,f=await this.resolve(e.message,this.state,e,r),h=this.indent(e),p=h+e.scale.map((b,R)=>c(R===e.scaleIdx)).join(a),d=b=>b===e.scaleIdx?g(b):b,m=h+e.scale.map((b,R)=>d(R)).join(l),I=()=>[u,f].filter(Boolean).join(" "),B=()=>[I(),p,m," "].filter(Boolean).join(` +`);return i&&(p=this.styles.cyan(p),m=this.styles.cyan(m)),B()}async renderChoices(){if(this.state.submitted)return"";let e=this.visible.map(async(i,n)=>await this.renderChoice(i,n)),r=await Promise.all(e);return r.length||r.push(this.styles.danger("No matching choices")),r.join(` +`)}format(){return this.state.submitted?this.choices.map(r=>this.styles.info(r.scaleIdx)).join(", "):""}async render(){let{submitted:e,size:r}=this.state,i=await this.prefix(),n=await this.separator(),s=await this.message(),o=[i,s,n].filter(Boolean).join(" ");this.state.prompt=o;let a=await this.header(),l=await this.format(),c=await this.error()||await this.hint(),u=await this.renderChoices(),g=await this.footer();(l||!c)&&(o+=" "+l),c&&!o.includes(c)&&(o+=" "+c),e&&!l&&!u&&this.multiple&&this.type!=="form"&&(o+=this.styles.danger(this.emptyError)),this.clear(r),this.write([o,a,u,g].filter(Boolean).join(` +`)),this.restore()}submit(){this.value={};for(let e of this.choices)this.value[e.name]=e.scaleIdx;return this.base.submit.call(this)}};function R3e(t,e={}){if(Array.isArray(e.scale))return e.scale.map(i=>P({},i));let r=[];for(let i=1;i{Mse.exports=kN()});var Hse=E((VCt,Kse)=>{"use strict";var F3e=K0(),Use=class extends F3e{async initialize(){await super.initialize(),this.value=this.initial=!!this.options.initial,this.disabled=this.options.disabled||"no",this.enabled=this.options.enabled||"yes",await this.render()}reset(){this.value=this.initial,this.render()}delete(){this.alert()}toggle(){this.value=!this.value,this.render()}enable(){if(this.value===!0)return this.alert();this.value=!0,this.render()}disable(){if(this.value===!1)return this.alert();this.value=!1,this.render()}up(){this.toggle()}down(){this.toggle()}right(){this.toggle()}left(){this.toggle()}next(){this.toggle()}prev(){this.toggle()}dispatch(e="",r){switch(e.toLowerCase()){case" ":return this.toggle();case"1":case"y":case"t":return this.enable();case"0":case"n":case"f":return this.disable();default:return this.alert()}}format(){let e=i=>this.styles.primary.underline(i);return[this.value?this.disabled:e(this.disabled),this.value?e(this.enabled):this.enabled].join(this.styles.muted(" / "))}async render(){let{size:e}=this.state,r=await this.header(),i=await this.prefix(),n=await this.separator(),s=await this.message(),o=await this.format(),a=await this.error()||await this.hint(),l=await this.footer(),c=[i,s,n,o].join(" ");this.state.prompt=c,a&&!c.includes(a)&&(c+=" "+a),this.clear(e),this.write([r,c,l].filter(Boolean).join(` +`)),this.write(this.margin[2]),this.restore()}};Kse.exports=Use});var Yse=E((_Ct,Gse)=>{"use strict";var N3e=GA(),jse=class extends N3e{constructor(e){super(e);if(typeof this.options.correctChoice!="number"||this.options.correctChoice<0)throw new Error("Please specify the index of the correct answer from the list of choices")}async toChoices(e,r){let i=await super.toChoices(e,r);if(i.length<2)throw new Error("Please give at least two choices to the user");if(this.options.correctChoice>i.length)throw new Error("Please specify the index of the correct answer from the list of choices");return i}check(e){return e.index===this.options.correctChoice}async result(e){return{selectedAnswer:e,correctAnswer:this.options.choices[this.options.correctChoice].value,correct:await this.check(this.state)}}};Gse.exports=jse});var Jse=E(RN=>{"use strict";var qse=Mi(),ti=(t,e)=>{qse.defineExport(RN,t,e),qse.defineExport(RN,t.toLowerCase(),e)};ti("AutoComplete",()=>Nne());ti("BasicAuth",()=>Gne());ti("Confirm",()=>Wne());ti("Editable",()=>_ne());ti("Form",()=>O0());ti("Input",()=>kN());ti("Invisible",()=>ose());ti("List",()=>lse());ti("MultiSelect",()=>gse());ti("Numeral",()=>dse());ti("Password",()=>Ese());ti("Scale",()=>Bse());ti("Select",()=>GA());ti("Snippet",()=>Pse());ti("Sort",()=>Fse());ti("Survey",()=>Tse());ti("Text",()=>Ose());ti("Toggle",()=>Hse());ti("Quiz",()=>Yse())});var zse=E((ZCt,Wse)=>{Wse.exports={ArrayPrompt:sC(),AuthPrompt:xN(),BooleanPrompt:K0(),NumberPrompt:PN(),StringPrompt:Mc()}});var aC=E(($Ct,Vse)=>{"use strict";var _se=require("assert"),FN=require("events"),jA=Mi(),No=class extends FN{constructor(e,r){super();this.options=jA.merge({},e),this.answers=P({},r)}register(e,r){if(jA.isObject(e)){for(let n of Object.keys(e))this.register(n,e[n]);return this}_se.equal(typeof r,"function","expected a function");let i=e.toLowerCase();return r.prototype instanceof this.Prompt?this.prompts[i]=r:this.prompts[i]=r(this.Prompt,this),this}async prompt(e=[]){for(let r of[].concat(e))try{typeof r=="function"&&(r=await r.call(this)),await this.ask(jA.merge({},this.options,r))}catch(i){return Promise.reject(i)}return this.answers}async ask(e){typeof e=="function"&&(e=await e.call(this));let r=jA.merge({},this.options,e),{type:i,name:n}=e,{set:s,get:o}=jA;if(typeof i=="function"&&(i=await i.call(this,e,this.answers)),!i)return this.answers[n];_se(this.prompts[i],`Prompt "${i}" is not registered`);let a=new this.prompts[i](r),l=o(this.answers,n);a.state.answers=this.answers,a.enquirer=this,n&&a.on("submit",u=>{this.emit("answer",n,u,a),s(this.answers,n,u)});let c=a.emit.bind(a);return a.emit=(...u)=>(this.emit.call(this,...u),c(...u)),this.emit("prompt",a,this),r.autofill&&l!=null?(a.value=a.input=l,r.autofill==="show"&&await a.submit()):l=a.value=await a.run(),l}use(e){return e.call(this,this),this}set Prompt(e){this._Prompt=e}get Prompt(){return this._Prompt||this.constructor.Prompt}get prompts(){return this.constructor.prompts}static set Prompt(e){this._Prompt=e}static get Prompt(){return this._Prompt||sf()}static get prompts(){return Jse()}static get types(){return zse()}static get prompt(){let e=(r,...i)=>{let n=new this(...i),s=n.emit.bind(n);return n.emit=(...o)=>(e.emit(...o),s(...o)),n.prompt(r)};return jA.mixinEmitter(e,new FN),e}};jA.mixinEmitter(No,new FN);var NN=No.prompts;for(let t of Object.keys(NN)){let e=t.toLowerCase(),r=i=>new NN[t](i).run();No.prompt[e]=r,No[e]=r,No[t]||Reflect.defineProperty(No,t,{get:()=>NN[t]})}var oC=t=>{jA.defineExport(No,t,()=>No.types[t])};oC("ArrayPrompt");oC("AuthPrompt");oC("BooleanPrompt");oC("NumberPrompt");oC("StringPrompt");Vse.exports=No});var loe=E((Gmt,Aoe)=>{function K3e(t,e){for(var r=-1,i=t==null?0:t.length;++r{var U3e=XB(),H3e=jg();function G3e(t,e,r,i){var n=!r;r||(r={});for(var s=-1,o=e.length;++s{var j3e=Af(),Y3e=zg();function q3e(t,e){return t&&j3e(e,Y3e(e),t)}uoe.exports=q3e});var hoe=E((qmt,foe)=>{function J3e(t){var e=[];if(t!=null)for(var r in Object(t))e.push(r);return e}foe.exports=J3e});var doe=E((Jmt,poe)=>{var W3e=Gs(),z3e=u0(),V3e=hoe(),_3e=Object.prototype,X3e=_3e.hasOwnProperty;function Z3e(t){if(!W3e(t))return V3e(t);var e=z3e(t),r=[];for(var i in t)i=="constructor"&&(e||!X3e.call(t,i))||r.push(i);return r}poe.exports=Z3e});var lf=E((Wmt,Coe)=>{var $3e=bF(),eWe=doe(),tWe=Hd();function rWe(t){return tWe(t)?$3e(t,!0):eWe(t)}Coe.exports=rWe});var Eoe=E((zmt,moe)=>{var iWe=Af(),nWe=lf();function sWe(t,e){return t&&iWe(e,nWe(e),t)}moe.exports=sWe});var UN=E((hC,cf)=>{var oWe=Ks(),Ioe=typeof hC=="object"&&hC&&!hC.nodeType&&hC,yoe=Ioe&&typeof cf=="object"&&cf&&!cf.nodeType&&cf,aWe=yoe&&yoe.exports===Ioe,woe=aWe?oWe.Buffer:void 0,Boe=woe?woe.allocUnsafe:void 0;function AWe(t,e){if(e)return t.slice();var r=t.length,i=Boe?Boe(r):new t.constructor(r);return t.copy(i),i}cf.exports=AWe});var HN=E((Vmt,Qoe)=>{function lWe(t,e){var r=-1,i=t.length;for(e||(e=Array(i));++r{var cWe=Af(),uWe=f0();function gWe(t,e){return cWe(t,uWe(t),e)}boe.exports=gWe});var H0=E((Xmt,Soe)=>{var fWe=vF(),hWe=fWe(Object.getPrototypeOf,Object);Soe.exports=hWe});var GN=E((Zmt,xoe)=>{var pWe=$B(),dWe=H0(),CWe=f0(),mWe=RF(),EWe=Object.getOwnPropertySymbols,IWe=EWe?function(t){for(var e=[];t;)pWe(e,CWe(t)),t=dWe(t);return e}:mWe;xoe.exports=IWe});var Poe=E(($mt,koe)=>{var yWe=Af(),wWe=GN();function BWe(t,e){return yWe(t,wWe(t),e)}koe.exports=BWe});var Roe=E((eEt,Doe)=>{var QWe=DF(),bWe=GN(),vWe=lf();function SWe(t){return QWe(t,vWe,bWe)}Doe.exports=SWe});var Noe=E((tEt,Foe)=>{var xWe=Object.prototype,kWe=xWe.hasOwnProperty;function PWe(t){var e=t.length,r=new t.constructor(e);return e&&typeof t[0]=="string"&&kWe.call(t,"index")&&(r.index=t.index,r.input=t.input),r}Foe.exports=PWe});var G0=E((rEt,Loe)=>{var Toe=kF();function DWe(t){var e=new t.constructor(t.byteLength);return new Toe(e).set(new Toe(t)),e}Loe.exports=DWe});var Ooe=E((iEt,Moe)=>{var RWe=G0();function FWe(t,e){var r=e?RWe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.byteLength)}Moe.exports=FWe});var Uoe=E((nEt,Koe)=>{var NWe=/\w*$/;function LWe(t){var e=new t.constructor(t.source,NWe.exec(t));return e.lastIndex=t.lastIndex,e}Koe.exports=LWe});var qoe=E((sEt,Hoe)=>{var Goe=ac(),joe=Goe?Goe.prototype:void 0,Yoe=joe?joe.valueOf:void 0;function TWe(t){return Yoe?Object(Yoe.call(t)):{}}Hoe.exports=TWe});var jN=E((oEt,Joe)=>{var MWe=G0();function OWe(t,e){var r=e?MWe(t.buffer):t.buffer;return new t.constructor(r,t.byteOffset,t.length)}Joe.exports=OWe});var zoe=E((aEt,Woe)=>{var KWe=G0(),UWe=Ooe(),HWe=Uoe(),GWe=qoe(),jWe=jN(),YWe="[object Boolean]",qWe="[object Date]",JWe="[object Map]",WWe="[object Number]",zWe="[object RegExp]",VWe="[object Set]",_We="[object String]",XWe="[object Symbol]",ZWe="[object ArrayBuffer]",$We="[object DataView]",e8e="[object Float32Array]",t8e="[object Float64Array]",r8e="[object Int8Array]",i8e="[object Int16Array]",n8e="[object Int32Array]",s8e="[object Uint8Array]",o8e="[object Uint8ClampedArray]",a8e="[object Uint16Array]",A8e="[object Uint32Array]";function l8e(t,e,r){var i=t.constructor;switch(e){case ZWe:return KWe(t);case YWe:case qWe:return new i(+t);case $We:return UWe(t,r);case e8e:case t8e:case r8e:case i8e:case n8e:case s8e:case o8e:case a8e:case A8e:return jWe(t,r);case JWe:return new i;case WWe:case _We:return new i(t);case zWe:return HWe(t);case VWe:return new i;case XWe:return GWe(t)}}Woe.exports=l8e});var Xoe=E((AEt,Voe)=>{var c8e=Gs(),_oe=Object.create,u8e=function(){function t(){}return function(e){if(!c8e(e))return{};if(_oe)return _oe(e);t.prototype=e;var r=new t;return t.prototype=void 0,r}}();Voe.exports=u8e});var YN=E((lEt,Zoe)=>{var g8e=Xoe(),f8e=H0(),h8e=u0();function p8e(t){return typeof t.constructor=="function"&&!h8e(t)?g8e(f8e(t)):{}}Zoe.exports=p8e});var eae=E((cEt,$oe)=>{var d8e=jd(),C8e=Qo(),m8e="[object Map]";function E8e(t){return C8e(t)&&d8e(t)==m8e}$oe.exports=E8e});var nae=E((uEt,tae)=>{var I8e=eae(),y8e=A0(),rae=l0(),iae=rae&&rae.isMap,w8e=iae?y8e(iae):I8e;tae.exports=w8e});var oae=E((gEt,sae)=>{var B8e=jd(),Q8e=Qo(),b8e="[object Set]";function v8e(t){return Q8e(t)&&B8e(t)==b8e}sae.exports=v8e});var cae=E((fEt,aae)=>{var S8e=oae(),x8e=A0(),Aae=l0(),lae=Aae&&Aae.isSet,k8e=lae?x8e(lae):S8e;aae.exports=k8e});var pae=E((hEt,uae)=>{var P8e=Gd(),D8e=loe(),R8e=XB(),F8e=goe(),N8e=Eoe(),L8e=UN(),T8e=HN(),M8e=voe(),O8e=Poe(),K8e=FF(),U8e=Roe(),H8e=jd(),G8e=Noe(),j8e=zoe(),Y8e=YN(),q8e=As(),J8e=Od(),W8e=nae(),z8e=Gs(),V8e=cae(),_8e=zg(),X8e=lf(),Z8e=1,$8e=2,e4e=4,gae="[object Arguments]",t4e="[object Array]",r4e="[object Boolean]",i4e="[object Date]",n4e="[object Error]",fae="[object Function]",s4e="[object GeneratorFunction]",o4e="[object Map]",a4e="[object Number]",hae="[object Object]",A4e="[object RegExp]",l4e="[object Set]",c4e="[object String]",u4e="[object Symbol]",g4e="[object WeakMap]",f4e="[object ArrayBuffer]",h4e="[object DataView]",p4e="[object Float32Array]",d4e="[object Float64Array]",C4e="[object Int8Array]",m4e="[object Int16Array]",E4e="[object Int32Array]",I4e="[object Uint8Array]",y4e="[object Uint8ClampedArray]",w4e="[object Uint16Array]",B4e="[object Uint32Array]",rr={};rr[gae]=rr[t4e]=rr[f4e]=rr[h4e]=rr[r4e]=rr[i4e]=rr[p4e]=rr[d4e]=rr[C4e]=rr[m4e]=rr[E4e]=rr[o4e]=rr[a4e]=rr[hae]=rr[A4e]=rr[l4e]=rr[c4e]=rr[u4e]=rr[I4e]=rr[y4e]=rr[w4e]=rr[B4e]=!0;rr[n4e]=rr[fae]=rr[g4e]=!1;function j0(t,e,r,i,n,s){var o,a=e&Z8e,l=e&$8e,c=e&e4e;if(r&&(o=n?r(t,i,n,s):r(t)),o!==void 0)return o;if(!z8e(t))return t;var u=q8e(t);if(u){if(o=G8e(t),!a)return T8e(t,o)}else{var g=H8e(t),f=g==fae||g==s4e;if(J8e(t))return L8e(t,a);if(g==hae||g==gae||f&&!n){if(o=l||f?{}:Y8e(t),!a)return l?O8e(t,N8e(o,t)):M8e(t,F8e(o,t))}else{if(!rr[g])return n?t:{};o=j8e(t,g,a)}}s||(s=new P8e);var h=s.get(t);if(h)return h;s.set(t,o),V8e(t)?t.forEach(function(m){o.add(j0(m,e,r,m,t,s))}):W8e(t)&&t.forEach(function(m,I){o.set(I,j0(m,e,r,I,t,s))});var p=c?l?U8e:K8e:l?X8e:_8e,d=u?void 0:p(t);return D8e(d||t,function(m,I){d&&(I=m,m=t[I]),R8e(o,I,j0(m,e,r,I,t,s))}),o}uae.exports=j0});var qN=E((pEt,dae)=>{var Q4e=pae(),b4e=1,v4e=4;function S4e(t){return Q4e(t,b4e|v4e)}dae.exports=S4e});var mae=E((dEt,Cae)=>{var x4e=tF();function k4e(t,e,r){return t==null?t:x4e(t,e,r)}Cae.exports=k4e});var Qae=E((wEt,Bae)=>{function P4e(t){var e=t==null?0:t.length;return e?t[e-1]:void 0}Bae.exports=P4e});var vae=E((BEt,bae)=>{var D4e=xd(),R4e=zP();function F4e(t,e){return e.length<2?t:D4e(t,R4e(e,0,-1))}bae.exports=F4e});var xae=E((QEt,Sae)=>{var N4e=Gg(),L4e=Qae(),T4e=vae(),M4e=Sc();function O4e(t,e){return e=N4e(e,t),t=T4e(t,e),t==null||delete t[M4e(L4e(e))]}Sae.exports=O4e});var Pae=E((bEt,kae)=>{var K4e=xae();function U4e(t,e){return t==null?!0:K4e(t,e)}kae.exports=U4e});var Kae=E((tIt,Oae)=>{Oae.exports={name:"@yarnpkg/cli",version:"3.1.1",license:"BSD-2-Clause",main:"./sources/index.ts",dependencies:{"@yarnpkg/core":"workspace:^","@yarnpkg/fslib":"workspace:^","@yarnpkg/libzip":"workspace:^","@yarnpkg/parsers":"workspace:^","@yarnpkg/plugin-compat":"workspace:^","@yarnpkg/plugin-dlx":"workspace:^","@yarnpkg/plugin-essentials":"workspace:^","@yarnpkg/plugin-file":"workspace:^","@yarnpkg/plugin-git":"workspace:^","@yarnpkg/plugin-github":"workspace:^","@yarnpkg/plugin-http":"workspace:^","@yarnpkg/plugin-init":"workspace:^","@yarnpkg/plugin-link":"workspace:^","@yarnpkg/plugin-nm":"workspace:^","@yarnpkg/plugin-npm":"workspace:^","@yarnpkg/plugin-npm-cli":"workspace:^","@yarnpkg/plugin-pack":"workspace:^","@yarnpkg/plugin-patch":"workspace:^","@yarnpkg/plugin-pnp":"workspace:^","@yarnpkg/plugin-pnpm":"workspace:^","@yarnpkg/shell":"workspace:^",chalk:"^3.0.0","ci-info":"^3.2.0",clipanion:"^3.0.1",semver:"^7.1.2",tslib:"^1.13.0",typanion:"^3.3.0",yup:"^0.32.9"},devDependencies:{"@types/semver":"^7.1.0","@types/yup":"^0","@yarnpkg/builder":"workspace:^","@yarnpkg/monorepo":"workspace:^","@yarnpkg/pnpify":"workspace:^",micromatch:"^4.0.2",typescript:"^4.5.2"},peerDependencies:{"@yarnpkg/core":"workspace:^"},scripts:{postpack:"rm -rf lib",prepack:'run build:compile "$(pwd)"',"build:cli+hook":"run build:pnp:hook && builder build bundle","build:cli":"builder build bundle","run:cli":"builder run","update-local":"run build:cli --no-git-hash && rsync -a --delete bundles/ bin/"},publishConfig:{main:"./lib/index.js",types:"./lib/index.d.ts",bin:null},files:["/lib/**/*","!/lib/pluginConfiguration.*","!/lib/cli.*"],"@yarnpkg/builder":{bundles:{standard:["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"]}},repository:{type:"git",url:"ssh://git@github.com/yarnpkg/berry.git",directory:"packages/yarnpkg-cli"},engines:{node:">=12 <14 || 14.2 - 14.9 || >14.10.0"}}});var iL=E((SBt,QAe)=>{"use strict";QAe.exports=function(e,r){r===!0&&(r=0);var i=e.indexOf("://"),n=e.substring(0,i).split("+").filter(Boolean);return typeof r=="number"?n[r]:n}});var nL=E((xBt,bAe)=>{"use strict";var sze=iL();function vAe(t){if(Array.isArray(t))return t.indexOf("ssh")!==-1||t.indexOf("rsync")!==-1;if(typeof t!="string")return!1;var e=sze(t);return t=t.substring(t.indexOf("://")+3),vAe(e)?!0:t.indexOf("@"){"use strict";var oze=iL(),aze=nL(),Aze=require("querystring");function lze(t){t=(t||"").trim();var e={protocols:oze(t),protocol:null,port:null,resource:"",user:"",pathname:"",hash:"",search:"",href:t,query:Object.create(null)},r=t.indexOf("://"),i=-1,n=null,s=null;t.startsWith(".")&&(t.startsWith("./")&&(t=t.substring(2)),e.pathname=t,e.protocol="file");var o=t.charAt(1);return e.protocol||(e.protocol=e.protocols[0],e.protocol||(aze(t)?e.protocol="ssh":((o==="/"||o==="~")&&(t=t.substring(2)),e.protocol="file"))),r!==-1&&(t=t.substring(r+3)),s=t.split("/"),e.protocol!=="file"?e.resource=s.shift():e.resource="",n=e.resource.split("@"),n.length===2&&(e.user=n[0],e.resource=n[1]),n=e.resource.split(":"),n.length===2&&(e.resource=n[0],n[1]?(e.port=Number(n[1]),isNaN(e.port)&&(e.port=null,s.unshift(n[1]))):e.port=null),s=s.filter(Boolean),e.protocol==="file"?e.pathname=e.href:e.pathname=e.pathname||(e.protocol!=="file"||e.href[0]==="/"?"/":"")+s.join("/"),n=e.pathname.split("#"),n.length===2&&(e.pathname=n[0],e.hash=n[1]),n=e.pathname.split("?"),n.length===2&&(e.pathname=n[0],e.search=n[1]),e.query=Aze.parse(e.search),e.href=e.href.replace(/\/$/,""),e.pathname=e.pathname.replace(/\/$/,""),e}SAe.exports=lze});var DAe=E((PBt,kAe)=>{"use strict";var cze=typeof URL=="undefined"?require("url").URL:URL,PAe=(t,e)=>e.some(r=>r instanceof RegExp?r.test(t):r===t);kAe.exports=(t,e)=>{e=Object.assign({defaultProtocol:"http:",normalizeProtocol:!0,forceHttp:!1,forceHttps:!1,stripHash:!0,stripWWW:!0,removeQueryParameters:[/^utm_\w+/i],removeTrailingSlash:!0,removeDirectoryIndex:!1,sortQueryParameters:!0},e),Reflect.has(e,"normalizeHttps")&&(e.forceHttp=e.normalizeHttps),Reflect.has(e,"normalizeHttp")&&(e.forceHttps=e.normalizeHttp),Reflect.has(e,"stripFragment")&&(e.stripHash=e.stripFragment),t=t.trim();let r=t.startsWith("//");!r&&/^\.*\//.test(t)||(t=t.replace(/^(?!(?:\w+:)?\/\/)|^\/\//,e.defaultProtocol));let n=new cze(t);if(e.forceHttp&&e.forceHttps)throw new Error("The `forceHttp` and `forceHttps` options cannot be used together");if(e.forceHttp&&n.protocol==="https:"&&(n.protocol="http:"),e.forceHttps&&n.protocol==="http:"&&(n.protocol="https:"),e.stripHash&&(n.hash=""),n.pathname&&(n.pathname=n.pathname.replace(/((?![https?:]).)\/{2,}/g,(s,o)=>/^(?!\/)/g.test(o)?`${o}/`:"/")),n.pathname&&(n.pathname=decodeURI(n.pathname)),e.removeDirectoryIndex===!0&&(e.removeDirectoryIndex=[/^index\.[a-z]+$/]),Array.isArray(e.removeDirectoryIndex)&&e.removeDirectoryIndex.length>0){let s=n.pathname.split("/"),o=s[s.length-1];PAe(o,e.removeDirectoryIndex)&&(s=s.slice(0,s.length-1),n.pathname=s.slice(1).join("/")+"/")}if(n.hostname&&(n.hostname=n.hostname.replace(/\.$/,""),e.stripWWW&&/^www\.([a-z\-\d]{2,63})\.([a-z\.]{2,5})$/.test(n.hostname)&&(n.hostname=n.hostname.replace(/^www\./,""))),Array.isArray(e.removeQueryParameters))for(let s of[...n.searchParams.keys()])PAe(s,e.removeQueryParameters)&&n.searchParams.delete(s);return e.sortQueryParameters&&n.searchParams.sort(),t=n.toString(),(e.removeTrailingSlash||n.pathname==="/")&&(t=t.replace(/\/$/,"")),r&&!e.normalizeProtocol&&(t=t.replace(/^http:\/\//,"//")),t}});var FAe=E((DBt,RAe)=>{"use strict";var uze=typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?function(t){return typeof t}:function(t){return t&&typeof Symbol=="function"&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},gze=xAe(),fze=DAe();function hze(t){var e=arguments.length>1&&arguments[1]!==void 0?arguments[1]:!1;if(typeof t!="string"||!t.trim())throw new Error("Invalid url.");e&&((typeof e=="undefined"?"undefined":uze(e))!=="object"&&(e={stripFragment:!1}),t=fze(t,e));var r=gze(t);return r}RAe.exports=hze});var TAe=E((RBt,NAe)=>{"use strict";var pze=FAe(),LAe=nL();function dze(t){var e=pze(t);e.token="";var r=e.user.split(":");return r.length===2&&(r[1]==="x-oauth-basic"?e.token=r[0]:r[0]==="x-token-auth"&&(e.token=r[1])),LAe(e.protocols)||LAe(t)?e.protocol="ssh":e.protocols.length?e.protocol=e.protocols[0]:e.protocol="file",e.href=e.href.replace(/\/$/,""),e}NAe.exports=dze});var OAe=E((FBt,MAe)=>{"use strict";var Cze=TAe();function sL(t){if(typeof t!="string")throw new Error("The url must be a string.");var e=Cze(t),r=e.resource.split("."),i=null;switch(e.toString=function(l){return sL.stringify(this,l)},e.source=r.length>2?r.slice(1-r.length).join("."):e.source=e.resource,e.git_suffix=/\.git$/.test(e.pathname),e.name=decodeURIComponent(e.pathname.replace(/^\//,"").replace(/\.git$/,"")),e.owner=decodeURIComponent(e.user),e.source){case"git.cloudforge.com":e.owner=e.user,e.organization=r[0],e.source="cloudforge.com";break;case"visualstudio.com":if(e.resource==="vs-ssh.visualstudio.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3],e.full_name=i[2]+"/"+i[3]);break}else{i=e.name.split("/"),i.length===2?(e.owner=i[1],e.name=i[1],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}case"dev.azure.com":case"azure.com":if(e.resource==="ssh.dev.azure.com"){i=e.name.split("/"),i.length===4&&(e.organization=i[1],e.owner=i[2],e.name=i[3]);break}else{i=e.name.split("/"),i.length===5?(e.organization=i[0],e.owner=i[1],e.name=i[4],e.full_name="_git/"+e.name):i.length===3?(e.name=i[2],i[0]==="DefaultCollection"?(e.owner=i[2],e.organization=i[0],e.full_name=e.organization+"/_git/"+e.name):(e.owner=i[0],e.full_name=e.owner+"/_git/"+e.name)):i.length===4&&(e.organization=i[0],e.owner=i[1],e.name=i[3],e.full_name=e.organization+"/"+e.owner+"/_git/"+e.name);break}default:i=e.name.split("/");var n=i.length-1;if(i.length>=2){var s=i.indexOf("blob",2),o=i.indexOf("tree",2),a=i.indexOf("commit",2);n=s>0?s-1:o>0?o-1:a>0?a-1:n,e.owner=i.slice(0,n).join("/"),e.name=i[n],a&&(e.commit=i[n+2])}e.ref="",e.filepathtype="",e.filepath="",i.length>n+2&&["blob","tree"].indexOf(i[n+1])>=0&&(e.filepathtype=i[n+1],e.ref=i[n+2],i.length>n+3&&(e.filepath=i.slice(n+3).join("/"))),e.organization=e.owner;break}return e.full_name||(e.full_name=e.owner,e.name&&(e.full_name&&(e.full_name+="/"),e.full_name+=e.name)),e}sL.stringify=function(t,e){e=e||(t.protocols&&t.protocols.length?t.protocols.join("+"):t.protocol);var r=t.port?":"+t.port:"",i=t.user||"git",n=t.git_suffix?".git":"";switch(e){case"ssh":return r?"ssh://"+i+"@"+t.resource+r+"/"+t.full_name+n:i+"@"+t.resource+":"+t.full_name+n;case"git+ssh":case"ssh+git":case"ftp":case"ftps":return e+"://"+i+"@"+t.resource+r+"/"+t.full_name+n;case"http":case"https":var s=t.token?mze(t):t.user&&(t.protocols.includes("http")||t.protocols.includes("https"))?t.user+"@":"";return e+"://"+s+t.resource+r+"/"+t.full_name+n;default:return t.href}};function mze(t){switch(t.source){case"bitbucket.org":return"x-token-auth:"+t.token+"@";default:return t.token+"@"}}MAe.exports=sL});var NL=E((Obt,ole)=>{var Mze=jg(),Oze=Kg();function Kze(t,e,r){(r!==void 0&&!Oze(t[e],r)||r===void 0&&!(e in t))&&Mze(t,e,r)}ole.exports=Kze});var Ale=E((Kbt,ale)=>{var Uze=Hd(),Hze=Qo();function Gze(t){return Hze(t)&&Uze(t)}ale.exports=Gze});var ule=E((Ubt,lle)=>{var jze=Ac(),Yze=H0(),qze=Qo(),Jze="[object Object]",Wze=Function.prototype,zze=Object.prototype,cle=Wze.toString,Vze=zze.hasOwnProperty,_ze=cle.call(Object);function Xze(t){if(!qze(t)||jze(t)!=Jze)return!1;var e=Yze(t);if(e===null)return!0;var r=Vze.call(e,"constructor")&&e.constructor;return typeof r=="function"&&r instanceof r&&cle.call(r)==_ze}lle.exports=Xze});var LL=E((Hbt,gle)=>{function Zze(t,e){if(!(e==="constructor"&&typeof t[e]=="function")&&e!="__proto__")return t[e]}gle.exports=Zze});var hle=E((Gbt,fle)=>{var $ze=Af(),e5e=lf();function t5e(t){return $ze(t,e5e(t))}fle.exports=t5e});var Ile=E((jbt,ple)=>{var dle=NL(),r5e=UN(),i5e=jN(),n5e=HN(),s5e=YN(),Cle=Pd(),mle=As(),o5e=Ale(),a5e=Od(),A5e=zB(),l5e=Gs(),c5e=ule(),u5e=c0(),Ele=LL(),g5e=hle();function f5e(t,e,r,i,n,s,o){var a=Ele(t,r),l=Ele(e,r),c=o.get(l);if(c){dle(t,r,c);return}var u=s?s(a,l,r+"",t,e,o):void 0,g=u===void 0;if(g){var f=mle(l),h=!f&&a5e(l),p=!f&&!h&&u5e(l);u=l,f||h||p?mle(a)?u=a:o5e(a)?u=n5e(a):h?(g=!1,u=r5e(l,!0)):p?(g=!1,u=i5e(l,!0)):u=[]:c5e(l)||Cle(l)?(u=a,Cle(a)?u=g5e(a):(!l5e(a)||A5e(a))&&(u=s5e(l))):g=!1}g&&(o.set(l,u),n(u,l,i,s,o),o.delete(l)),dle(t,r,u)}ple.exports=f5e});var Ble=E((Ybt,yle)=>{var h5e=Gd(),p5e=NL(),d5e=BF(),C5e=Ile(),m5e=Gs(),E5e=lf(),I5e=LL();function wle(t,e,r,i,n){t!==e&&d5e(e,function(s,o){if(n||(n=new h5e),m5e(s))C5e(t,e,o,r,wle,i,n);else{var a=i?i(I5e(t,o),s,o+"",t,e,n):void 0;a===void 0&&(a=s),p5e(t,o,a)}},E5e)}yle.exports=wle});var ble=E((qbt,Qle)=>{var y5e=e0(),w5e=nF(),B5e=sF();function Q5e(t,e){return B5e(w5e(t,e,y5e),t+"")}Qle.exports=Q5e});var Sle=E((Jbt,vle)=>{var b5e=Kg(),v5e=Hd(),S5e=kd(),x5e=Gs();function k5e(t,e,r){if(!x5e(r))return!1;var i=typeof e;return(i=="number"?v5e(r)&&S5e(e,r.length):i=="string"&&e in r)?b5e(r[e],t):!1}vle.exports=k5e});var kle=E((Wbt,xle)=>{var P5e=ble(),D5e=Sle();function R5e(t){return P5e(function(e,r){var i=-1,n=r.length,s=n>1?r[n-1]:void 0,o=n>2?r[2]:void 0;for(s=t.length>3&&typeof s=="function"?(n--,s):void 0,o&&D5e(r[0],r[1],o)&&(s=n<3?void 0:s,n=1),e=Object(e);++i{var F5e=Ble(),N5e=kle(),L5e=N5e(function(t,e,r){F5e(t,e,r)});Ple.exports=L5e});var Wle=E(($vt,Jle)=>{var VL;Jle.exports=()=>(typeof VL=="undefined"&&(VL=require("zlib").brotliDecompressSync(Buffer.from("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","base64")).toString()),VL)});var $le=E(XL=>{function pf(t,e){if(typeof t=="string")return t;if(t){let r,i;if(Array.isArray(t)){for(r=0;r0)return(f=pf(n[g],u))?f.replace("*",c.substring(g.length-1)):Gc(i,c,1)}return Gc(i,c)}}function l6e(t,e={}){let r=0,i,n=e.browser,s=e.fields||["module","main"];for(n&&!s.includes("browser")&&s.unshift("browser");r{var eT;nce.exports=()=>(typeof eT=="undefined"&&(eT=require("zlib").brotliDecompressSync(Buffer.from("GzAfABynw5pcuBFmTv/70/1/f76uO9EY2rrhxLEWYC/7pSrhkeCCoArnFYpOj/QE6fHx/9uvLDqs7BiRsBXp++jMh+HuCQG8qpo/jQFCBS4aVBSu82uBpBshV9hdhtNJ5SY01hAgQGf92Yk6uIWH23NmLWpvI/fq4YaC6ep7dbhgBKxrceRcU3/MeT3keq5fx3N9Ilx5x6/unaWRPwdp0d46sZJnmNonGRAEgSIv8bIRDT92SKHtAQS1+L9lk0IfNBmC0P+Bzz15CLp7KzBkg7MGTxSRr0KLpulDDZQHK6cvj0DXQcCXhNZS6vUSVWoDpZrGhKjl/9sMLDCwpasO4JXS8geYKH2eJ98pCISCGGIZ4f0EaPFVw6g1hHTtBMdGyaSAuIZznuByTQOKR+LTBZo9rNzUzxL41JB6UziDRdbK0SYtv251lGn4hAgwg66Aaqv6ZEIZ0Glk1ao5SNj3hemgByM/NLvnHGNGyYqQdSDAFDwRbZR/GVlM9K/FKKgtRlFPW0xrpIgH67IWOYJlE2PG0zV27p0jullnFUVkSvzj5QsApadVRvHUzgOgo1qvQVHRRAASexPTNYoC0yFbG1ADE2KhwmAFv5JR01WNmnysDJIogK3pwpzAuvhRO62KvbhKLUF2R3M2ukvVxejf7OSXCM4b8aPFv53F19Dl83TaQXmmh8u9EVp/8OWDJOBBQLfIu95p7sRTrw6riWKuaMoE/W0BT5UJHI5qyvG4WEcqml41oasr+GsnRPBblktDNEsyp1c/MgMVNXocu09syuR6iVpfHAUpQ/yf5HqJXd+lAsENt8hQgE2CvuOd/oTqqrDJMKauNt0SA8M/CGwB8iBAcCFa0K3D0KJkcaXp765U3xk4TsF45+jqWUT9R4yaxKmKDOIExgdFSL2YeadftqAz3RIIPi+3OIfc0y9VOMHEc+fkaYUvW1JlnDkJqy/pGJkRFM4gSY7cqTFZ+iCl9uE232WGhHbiMI2uK4vhzFqUSW2iTrAx4BKkxfxtUu/SQV4lPhkN8nuQbWf4yLvyd/0jMmzj/yJNwad8eINyJZe0ywrJdYRi2LxYGvi9I3dZBWOVUXUP0rgA7S4/yrkyih21s3aNiCX1VBUUPWqavm4Yo9sCkCEWF0xX6jPKggcrc/BWUq7D6ZZDZrVXjDzIukbrinQSULi4V2hPaRMqdFzWwQLQ9lIQnpapOltQBpvUFC71QbYAtFrclZVlhaWc28KX63KdiE67bUYcBIqtVndrDmot0Q/IJ/pvLX29EGcNg/eaFsMlSP2UQu/ZjL13v2VC6F2NUr9Bg1CPox1NU6MAKeGPGw3heVhj8nWkCZQaalymuab+vcUkz4g9fyyK+CtZ1KCzJte88qkMFdU4QUBpxc5JDYmpYj0lEPtGMBN58CEHl1cHl/djakVPATD/avUNmOIttSU+XcYGdxb/XrSpJ+Q8ChXIl/bGQh4ri8ysI//r96HyNlhFOSpQ60aRF/lrsh/jq/bzX1FpNCRw5l7ifgKgKkGL0vsi/xxrdA2/wMRWoikHOEtOuK551bGet3xH+nM0tZJqaP81lrj1OoS2HoF8EjmfbCppTLdrdDeLlA3sbfKPQJ6Uo02W0dTfiynMpUPlWwYz/l5M7riTjCIQtDJ+xH0UKukWGcNbANHR1S/Pem7PjFKJDJ9sRWumByRHqKds38JII8HAEWSQo7ze1B8gTF2JWL6REzgVGp04K/vgouudFCqouwPVtLvHuADVhXSGz50i3URqsWYOnFtobc3WM5XLMwDrlxNkU4VNxwg3V02DdNyUl3pV0ApHozKVXlWC6mLSW6jOXC/r1c23U/FkmTiGpPrQhFZBc/+vcxWlSlPm1YTztjso680JXVQ3cWC4spuBmydcGIdM84Kw+FShErEoWWVtOV/XPVfEx7cm5oP8IHDCrgb3FV3A2z47S7bcwOmmKSW/9S1VmrnbOmjbf3PChboxvZxEA2ee8Pmulhy1FUmetU9t+ZWHcPuUXGa1EopbhB7qkvU3aHNZptdltVNJC6J908WAwd0Ruq5ekJAjdKmin5MntvnxCn9nEGj06qUIQ9YjhsBjChJCYpgaK9IOU5gsYnK22OjhJvcasLumq6MFP7QgeDoNUJs6WBjulWCLnS29IwW3qVVJ9anKKqokl94u/gvCpDMtwqH61i1g/zIK7qtZEzOYKjaiktuVO40kvz0vWoM3YaQm79KqmRf1q/BNHghpvQCDCJ4iz1ak/K/ks+edjG5ipd81BCGdq5QJLHvrJZK2WYvhOoiYKXnolnv1UN5++EqZpRXJCKPLrVMFKpl5hB6b0je+Oms3eSFyxbAOE3pIjqCg6UvCi/QVKYVv8YZ0RABb9rmNFmEOr7t1Fk11d24+zCS9gc5CVTclE909oExrTXHhBS0x3CP4TJ59GTvih5K5coxfcUy58EzjWFkWMDfdSjlq59pFEU7iIpD7HbtgufaEpv5we7xKwhb3XC5SbMkm5FcW2oLW5RobgTRFrsy1KawVNedhCvjvvp5cjw73QRgOlteW15dWl9e9oIMOi3dxzqO60K7MyX6eMo3Odhn2NUyd/Q8Bap7MljyFWW7ksXB/jSGuAVHarS0CEQRKhDC7oPaqzCFfpsdCy0pV+8HcxINa7qGHHyoyq8v7VrX0YQqg8iaeZl8sGD2r0TEr+1Wj4x0bmZ6WUHSr2bx3/PGu5d/zsmmxKglKna2lnstwta3+nqyEhQZBe4QKV+1KkZp5HS1l75WuhJZuvd9bmt6KHrwf2f7kE8iR8s+oImRLwXVi6Fum4EeYQb9lUh8LyKgqe9A/FpksPVbqXYPY7G3ansEqdF3IClEzzIKkmQubjcGQlnUTOq9KF1u98uogWAaJ3eBDErzN3rzz0Y5UGZggNlcV6uBKsdqrl1VeAq04LUyMnCENsPVETgA=","base64")).toString()),eT)});var gce=E((aT,AT)=>{(function(t){aT&&typeof aT=="object"&&typeof AT!="undefined"?AT.exports=t():typeof define=="function"&&define.amd?define([],t):typeof window!="undefined"?window.isWindows=t():typeof global!="undefined"?global.isWindows=t():typeof self!="undefined"?self.isWindows=t():this.isWindows=t()})(function(){"use strict";return function(){return process&&(process.platform==="win32"||/^(msys|cygwin)$/.test(process.env.OSTYPE))}})});var dce=E((Dxt,fce)=>{"use strict";lT.ifExists=E6e;var mf=require("util"),Es=require("path"),hce=gce(),I6e=/^#!\s*(?:\/usr\/bin\/env)?\s*([^ \t]+)(.*)$/,y6e={createPwshFile:!0,createCmdFile:hce(),fs:require("fs")},w6e=new Map([[".js","node"],[".cjs","node"],[".mjs","node"],[".cmd","cmd"],[".bat","cmd"],[".ps1","pwsh"],[".sh","sh"]]);function pce(t){let e=P(P({},y6e),t),r=e.fs;return e.fs_={chmod:r.chmod?mf.promisify(r.chmod):async()=>{},mkdir:mf.promisify(r.mkdir),readFile:mf.promisify(r.readFile),stat:mf.promisify(r.stat),unlink:mf.promisify(r.unlink),writeFile:mf.promisify(r.writeFile)},e}async function lT(t,e,r){let i=pce(r);await i.fs_.stat(t),await B6e(t,e,i)}function E6e(t,e,r){return lT(t,e,r).catch(()=>{})}function Q6e(t,e){return e.fs_.unlink(t).catch(()=>{})}async function B6e(t,e,r){let i=await S6e(t,r);return await b6e(e,r),v6e(t,e,i,r)}function b6e(t,e){return e.fs_.mkdir(Es.dirname(t),{recursive:!0})}function v6e(t,e,r,i){let n=pce(i),s=[{generator:P6e,extension:""}];return n.createCmdFile&&s.push({generator:k6e,extension:".cmd"}),n.createPwshFile&&s.push({generator:D6e,extension:".ps1"}),Promise.all(s.map(o=>x6e(t,e+o.extension,r,o.generator,n)))}function R6e(t,e){return Q6e(t,e)}function N6e(t,e){return F6e(t,e)}async function S6e(t,e){let n=(await e.fs_.readFile(t,"utf8")).trim().split(/\r*\n/)[0].match(I6e);if(!n){let s=Es.extname(t).toLowerCase();return{program:w6e.get(s)||null,additionalArgs:""}}return{program:n[1],additionalArgs:n[2]}}async function x6e(t,e,r,i,n){let s=n.preserveSymlinks?"--preserve-symlinks":"",o=[r.additionalArgs,s].filter(a=>a).join(" ");return n=Object.assign({},n,{prog:r.program,args:o}),await R6e(e,n),await n.fs_.writeFile(e,i(t,e,n),"utf8"),N6e(e,n)}function k6e(t,e,r){let n=Es.relative(Es.dirname(e),t).split("/").join("\\"),s=Es.isAbsolute(n)?`"${n}"`:`"%~dp0\\${n}"`,o,a=r.prog,l=r.args||"",c=cT(r.nodePath).win32;a?(o=`"%~dp0\\${a}.exe"`,n=s):(a=s,l="",n="");let u=r.progArgs?`${r.progArgs.join(" ")} `:"",g=c?`@SET NODE_PATH=${c}\r +`:"";return o?g+=`@IF EXIST ${o} (\r + ${o} ${l} ${n} ${u}%*\r +) ELSE (\r + @SETLOCAL\r + @SET PATHEXT=%PATHEXT:;.JS;=;%\r + ${a} ${l} ${n} ${u}%*\r +)\r +`:g+=`@${a} ${l} ${n} ${u}%*\r +`,g}function P6e(t,e,r){let i=Es.relative(Es.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s;i=i.split("\\").join("/");let o=Es.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,a=r.args||"",l=cT(r.nodePath).posix;n?(s=`"$basedir/${r.prog}"`,i=o):(n=o,a="",i="");let c=r.progArgs?`${r.progArgs.join(" ")} `:"",u=`#!/bin/sh +basedir=$(dirname "$(echo "$0" | sed -e 's,\\\\,/,g')") + +case \`uname\` in + *CYGWIN*) basedir=\`cygpath -w "$basedir"\`;; +esac + +`,g=r.nodePath?`export NODE_PATH="${l}" +`:"";return s?u+=`${g}if [ -x ${s} ]; then + exec ${s} ${a} ${i} ${c}"$@" +else + exec ${n} ${a} ${i} ${c}"$@" +fi +`:u+=`${g}${n} ${a} ${i} ${c}"$@" +exit $? +`,u}function D6e(t,e,r){let i=Es.relative(Es.dirname(e),t),n=r.prog&&r.prog.split("\\").join("/"),s=n&&`"${n}$exe"`,o;i=i.split("\\").join("/");let a=Es.isAbsolute(i)?`"${i}"`:`"$basedir/${i}"`,l=r.args||"",c=cT(r.nodePath),u=c.win32,g=c.posix;s?(o=`"$basedir/${r.prog}$exe"`,i=a):(s=a,l="",i="");let f=r.progArgs?`${r.progArgs.join(" ")} `:"",h=`#!/usr/bin/env pwsh +$basedir=Split-Path $MyInvocation.MyCommand.Definition -Parent + +$exe="" +${r.nodePath?`$env_node_path=$env:NODE_PATH +$env:NODE_PATH="${u}" +`:""}if ($PSVersionTable.PSVersion -lt "6.0" -or $IsWindows) { + # Fix case when both the Windows and Linux builds of Node + # are installed in the same directory + $exe=".exe" +}`;return r.nodePath&&(h+=` else { + $env:NODE_PATH="${g}" +}`),o?h+=` +$ret=0 +if (Test-Path ${o}) { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${o} ${l} ${i} ${f}$args + } else { + & ${o} ${l} ${i} ${f}$args + } + $ret=$LASTEXITCODE +} else { + # Support pipeline input + if ($MyInvocation.ExpectingInput) { + $input | & ${s} ${l} ${i} ${f}$args + } else { + & ${s} ${l} ${i} ${f}$args + } + $ret=$LASTEXITCODE +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $ret +`:h+=` +# Support pipeline input +if ($MyInvocation.ExpectingInput) { + $input | & ${s} ${l} ${i} ${f}$args +} else { + & ${s} ${l} ${i} ${f}$args +} +${r.nodePath?`$env:NODE_PATH=$env_node_path +`:""}exit $LASTEXITCODE +`,h}function F6e(t,e){return e.fs_.chmod(t,493)}function cT(t){if(!t)return{win32:"",posix:""};let e=typeof t=="string"?t.split(Es.delimiter):Array.from(t),r={};for(let i=0;i`/mnt/${a.toLowerCase()}`):e[i];r.win32=r.win32?`${r.win32};${n}`:n,r.posix=r.posix?`${r.posix}:${s}`:s,r[i]={win32:n,posix:s}}return r}fce.exports=lT});var PT=E((fPt,Nce)=>{Nce.exports=require("stream")});var Oce=E((hPt,Lce)=>{"use strict";function Tce(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function e9e(t){for(var e=1;e0?this.tail.next=i:this.head=i,this.tail=i,++this.length}},{key:"unshift",value:function(r){var i={data:r,next:this.head};this.length===0&&(this.tail=i),this.head=i,++this.length}},{key:"shift",value:function(){if(this.length!==0){var r=this.head.data;return this.length===1?this.head=this.tail=null:this.head=this.head.next,--this.length,r}}},{key:"clear",value:function(){this.head=this.tail=null,this.length=0}},{key:"join",value:function(r){if(this.length===0)return"";for(var i=this.head,n=""+i.data;i=i.next;)n+=r+i.data;return n}},{key:"concat",value:function(r){if(this.length===0)return iQ.alloc(0);for(var i=iQ.allocUnsafe(r>>>0),n=this.head,s=0;n;)o9e(n.data,i,s),s+=n.data.length,n=n.next;return i}},{key:"consume",value:function(r,i){var n;return ro.length?o.length:r;if(a===o.length?s+=o:s+=o.slice(0,r),r-=a,r===0){a===o.length?(++n,i.next?this.head=i.next:this.head=this.tail=null):(this.head=i,i.data=o.slice(a));break}++n}return this.length-=n,s}},{key:"_getBuffer",value:function(r){var i=iQ.allocUnsafe(r),n=this.head,s=1;for(n.data.copy(i),r-=n.data.length;n=n.next;){var o=n.data,a=r>o.length?o.length:r;if(o.copy(i,i.length-r,0,a),r-=a,r===0){a===o.length?(++s,n.next?this.head=n.next:this.head=this.tail=null):(this.head=n,n.data=o.slice(a));break}++s}return this.length-=s,i}},{key:s9e,value:function(r,i){return DT(this,e9e({},i,{depth:0,customInspect:!1}))}}]),t}()});var FT=E((pPt,Kce)=>{"use strict";function a9e(t,e){var r=this,i=this._readableState&&this._readableState.destroyed,n=this._writableState&&this._writableState.destroyed;return i||n?(e?e(t):t&&(this._writableState?this._writableState.errorEmitted||(this._writableState.errorEmitted=!0,process.nextTick(RT,this,t)):process.nextTick(RT,this,t)),this):(this._readableState&&(this._readableState.destroyed=!0),this._writableState&&(this._writableState.destroyed=!0),this._destroy(t||null,function(s){!e&&s?r._writableState?r._writableState.errorEmitted?process.nextTick(nQ,r):(r._writableState.errorEmitted=!0,process.nextTick(Uce,r,s)):process.nextTick(Uce,r,s):e?(process.nextTick(nQ,r),e(s)):process.nextTick(nQ,r)}),this)}function Uce(t,e){RT(t,e),nQ(t)}function nQ(t){t._writableState&&!t._writableState.emitClose||t._readableState&&!t._readableState.emitClose||t.emit("close")}function A9e(){this._readableState&&(this._readableState.destroyed=!1,this._readableState.reading=!1,this._readableState.ended=!1,this._readableState.endEmitted=!1),this._writableState&&(this._writableState.destroyed=!1,this._writableState.ended=!1,this._writableState.ending=!1,this._writableState.finalCalled=!1,this._writableState.prefinished=!1,this._writableState.finished=!1,this._writableState.errorEmitted=!1)}function RT(t,e){t.emit("error",e)}function l9e(t,e){var r=t._readableState,i=t._writableState;r&&r.autoDestroy||i&&i.autoDestroy?t.destroy(e):t.emit("error",e)}Kce.exports={destroy:a9e,undestroy:A9e,errorOrDestroy:l9e}});var VA=E((dPt,Hce)=>{"use strict";var Gce={};function Is(t,e,r){r||(r=Error);function i(s,o,a){return typeof e=="string"?e:e(s,o,a)}class n extends r{constructor(o,a,l){super(i(o,a,l))}}n.prototype.name=r.name,n.prototype.code=t,Gce[t]=n}function jce(t,e){if(Array.isArray(t)){let r=t.length;return t=t.map(i=>String(i)),r>2?`one of ${e} ${t.slice(0,r-1).join(", ")}, or `+t[r-1]:r===2?`one of ${e} ${t[0]} or ${t[1]}`:`of ${e} ${t[0]}`}else return`of ${e} ${String(t)}`}function c9e(t,e,r){return t.substr(!r||r<0?0:+r,e.length)===e}function u9e(t,e,r){return(r===void 0||r>t.length)&&(r=t.length),t.substring(r-e.length,r)===e}function g9e(t,e,r){return typeof r!="number"&&(r=0),r+e.length>t.length?!1:t.indexOf(e,r)!==-1}Is("ERR_INVALID_OPT_VALUE",function(t,e){return'The value "'+e+'" is invalid for option "'+t+'"'},TypeError);Is("ERR_INVALID_ARG_TYPE",function(t,e,r){let i;typeof e=="string"&&c9e(e,"not ")?(i="must not be",e=e.replace(/^not /,"")):i="must be";let n;if(u9e(t," argument"))n=`The ${t} ${i} ${jce(e,"type")}`;else{let s=g9e(t,".")?"property":"argument";n=`The "${t}" ${s} ${i} ${jce(e,"type")}`}return n+=`. Received type ${typeof r}`,n},TypeError);Is("ERR_STREAM_PUSH_AFTER_EOF","stream.push() after EOF");Is("ERR_METHOD_NOT_IMPLEMENTED",function(t){return"The "+t+" method is not implemented"});Is("ERR_STREAM_PREMATURE_CLOSE","Premature close");Is("ERR_STREAM_DESTROYED",function(t){return"Cannot call "+t+" after a stream was destroyed"});Is("ERR_MULTIPLE_CALLBACK","Callback called multiple times");Is("ERR_STREAM_CANNOT_PIPE","Cannot pipe, not readable");Is("ERR_STREAM_WRITE_AFTER_END","write after end");Is("ERR_STREAM_NULL_VALUES","May not write null values to stream",TypeError);Is("ERR_UNKNOWN_ENCODING",function(t){return"Unknown encoding: "+t},TypeError);Is("ERR_STREAM_UNSHIFT_AFTER_END_EVENT","stream.unshift() after end event");Hce.exports.codes=Gce});var NT=E((CPt,Yce)=>{"use strict";var f9e=VA().codes.ERR_INVALID_OPT_VALUE;function h9e(t,e,r){return t.highWaterMark!=null?t.highWaterMark:e?t[r]:null}function p9e(t,e,r,i){var n=h9e(e,i,r);if(n!=null){if(!(isFinite(n)&&Math.floor(n)===n)||n<0){var s=i?r:"highWaterMark";throw new f9e(s,n)}return Math.floor(n)}return t.objectMode?16:16*1024}Yce.exports={getHighWaterMark:p9e}});var qce=E((mPt,LT)=>{typeof Object.create=="function"?LT.exports=function(e,r){r&&(e.super_=r,e.prototype=Object.create(r.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}))}:LT.exports=function(e,r){if(r){e.super_=r;var i=function(){};i.prototype=r.prototype,e.prototype=new i,e.prototype.constructor=e}}});var _A=E((EPt,TT)=>{try{if(MT=require("util"),typeof MT.inherits!="function")throw"";TT.exports=MT.inherits}catch(t){TT.exports=qce()}var MT});var Wce=E((IPt,Jce)=>{Jce.exports=require("util").deprecate});var UT=E((yPt,zce)=>{"use strict";zce.exports=Sr;function Vce(t){var e=this;this.next=null,this.entry=null,this.finish=function(){d9e(e,t)}}var If;Sr.WritableState=em;var C9e={deprecate:Wce()},_ce=PT(),sQ=require("buffer").Buffer,m9e=global.Uint8Array||function(){};function E9e(t){return sQ.from(t)}function I9e(t){return sQ.isBuffer(t)||t instanceof m9e}var OT=FT(),y9e=NT(),w9e=y9e.getHighWaterMark,XA=VA().codes,B9e=XA.ERR_INVALID_ARG_TYPE,Q9e=XA.ERR_METHOD_NOT_IMPLEMENTED,b9e=XA.ERR_MULTIPLE_CALLBACK,v9e=XA.ERR_STREAM_CANNOT_PIPE,S9e=XA.ERR_STREAM_DESTROYED,x9e=XA.ERR_STREAM_NULL_VALUES,k9e=XA.ERR_STREAM_WRITE_AFTER_END,P9e=XA.ERR_UNKNOWN_ENCODING,yf=OT.errorOrDestroy;_A()(Sr,_ce);function D9e(){}function em(t,e,r){If=If||Yc(),t=t||{},typeof r!="boolean"&&(r=e instanceof If),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.writableObjectMode),this.highWaterMark=w9e(this,t,"writableHighWaterMark",r),this.finalCalled=!1,this.needDrain=!1,this.ending=!1,this.ended=!1,this.finished=!1,this.destroyed=!1;var i=t.decodeStrings===!1;this.decodeStrings=!i,this.defaultEncoding=t.defaultEncoding||"utf8",this.length=0,this.writing=!1,this.corked=0,this.sync=!0,this.bufferProcessing=!1,this.onwrite=function(n){R9e(e,n)},this.writecb=null,this.writelen=0,this.bufferedRequest=null,this.lastBufferedRequest=null,this.pendingcb=0,this.prefinished=!1,this.errorEmitted=!1,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.bufferedRequestCount=0,this.corkedRequestsFree=new Vce(this)}em.prototype.getBuffer=function(){for(var e=this.bufferedRequest,r=[];e;)r.push(e),e=e.next;return r};(function(){try{Object.defineProperty(em.prototype,"buffer",{get:C9e.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.","DEP0003")})}catch(t){}})();var oQ;typeof Symbol=="function"&&Symbol.hasInstance&&typeof Function.prototype[Symbol.hasInstance]=="function"?(oQ=Function.prototype[Symbol.hasInstance],Object.defineProperty(Sr,Symbol.hasInstance,{value:function(e){return oQ.call(this,e)?!0:this!==Sr?!1:e&&e._writableState instanceof em}})):oQ=function(e){return e instanceof this};function Sr(t){If=If||Yc();var e=this instanceof If;if(!e&&!oQ.call(Sr,this))return new Sr(t);this._writableState=new em(t,this,e),this.writable=!0,t&&(typeof t.write=="function"&&(this._write=t.write),typeof t.writev=="function"&&(this._writev=t.writev),typeof t.destroy=="function"&&(this._destroy=t.destroy),typeof t.final=="function"&&(this._final=t.final)),_ce.call(this)}Sr.prototype.pipe=function(){yf(this,new v9e)};function F9e(t,e){var r=new k9e;yf(t,r),process.nextTick(e,r)}function N9e(t,e,r,i){var n;return r===null?n=new x9e:typeof r!="string"&&!e.objectMode&&(n=new B9e("chunk",["string","Buffer"],r)),n?(yf(t,n),process.nextTick(i,n),!1):!0}Sr.prototype.write=function(t,e,r){var i=this._writableState,n=!1,s=!i.objectMode&&I9e(t);return s&&!sQ.isBuffer(t)&&(t=E9e(t)),typeof e=="function"&&(r=e,e=null),s?e="buffer":e||(e=i.defaultEncoding),typeof r!="function"&&(r=D9e),i.ending?F9e(this,r):(s||N9e(this,i,t,r))&&(i.pendingcb++,n=L9e(this,i,s,t,e,r)),n};Sr.prototype.cork=function(){this._writableState.corked++};Sr.prototype.uncork=function(){var t=this._writableState;t.corked&&(t.corked--,!t.writing&&!t.corked&&!t.bufferProcessing&&t.bufferedRequest&&Xce(this,t))};Sr.prototype.setDefaultEncoding=function(e){if(typeof e=="string"&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new P9e(e);return this._writableState.defaultEncoding=e,this};Object.defineProperty(Sr.prototype,"writableBuffer",{enumerable:!1,get:function(){return this._writableState&&this._writableState.getBuffer()}});function T9e(t,e,r){return!t.objectMode&&t.decodeStrings!==!1&&typeof e=="string"&&(e=sQ.from(e,r)),e}Object.defineProperty(Sr.prototype,"writableHighWaterMark",{enumerable:!1,get:function(){return this._writableState.highWaterMark}});function L9e(t,e,r,i,n,s){if(!r){var o=T9e(e,i,n);i!==o&&(r=!0,n="buffer",i=o)}var a=e.objectMode?1:i.length;e.length+=a;var l=e.length{"use strict";var j9e=Object.keys||function(t){var e=[];for(var r in t)e.push(r);return e};eue.exports=Mo;var tue=HT(),GT=UT();_A()(Mo,tue);for(jT=j9e(GT.prototype),aQ=0;aQ{var lQ=require("buffer"),qa=lQ.Buffer;function iue(t,e){for(var r in t)e[r]=t[r]}qa.from&&qa.alloc&&qa.allocUnsafe&&qa.allocUnsafeSlow?rue.exports=lQ:(iue(lQ,YT),YT.Buffer=wf);function wf(t,e,r){return qa(t,e,r)}iue(qa,wf);wf.from=function(t,e,r){if(typeof t=="number")throw new TypeError("Argument must not be a number");return qa(t,e,r)};wf.alloc=function(t,e,r){if(typeof t!="number")throw new TypeError("Argument must be a number");var i=qa(t);return e!==void 0?typeof r=="string"?i.fill(e,r):i.fill(e):i.fill(0),i};wf.allocUnsafe=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return qa(t)};wf.allocUnsafeSlow=function(t){if(typeof t!="number")throw new TypeError("Argument must be a number");return lQ.SlowBuffer(t)}});var WT=E(sue=>{"use strict";var qT=nue().Buffer,oue=qT.isEncoding||function(t){switch(t=""+t,t&&t.toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":case"raw":return!0;default:return!1}};function J9e(t){if(!t)return"utf8";for(var e;;)switch(t){case"utf8":case"utf-8":return"utf8";case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return"utf16le";case"latin1":case"binary":return"latin1";case"base64":case"ascii":case"hex":return t;default:if(e)return;t=(""+t).toLowerCase(),e=!0}}function W9e(t){var e=J9e(t);if(typeof e!="string"&&(qT.isEncoding===oue||!oue(t)))throw new Error("Unknown encoding: "+t);return e||t}sue.StringDecoder=rm;function rm(t){this.encoding=W9e(t);var e;switch(this.encoding){case"utf16le":this.text=V9e,this.end=_9e,e=4;break;case"utf8":this.fillLast=z9e,e=4;break;case"base64":this.text=X9e,this.end=Z9e,e=3;break;default:this.write=$9e,this.end=eVe;return}this.lastNeed=0,this.lastTotal=0,this.lastChar=qT.allocUnsafe(e)}rm.prototype.write=function(t){if(t.length===0)return"";var e,r;if(this.lastNeed){if(e=this.fillLast(t),e===void 0)return"";r=this.lastNeed,this.lastNeed=0}else r=0;return r>5==6?2:t>>4==14?3:t>>3==30?4:t>>6==2?-1:-2}function iVe(t,e,r){var i=e.length-1;if(i=0?(n>0&&(t.lastNeed=n-1),n):--i=0?(n>0&&(t.lastNeed=n-2),n):--i=0?(n>0&&(n===2?n=0:t.lastNeed=n-3),n):0))}function nVe(t,e,r){if((e[0]&192)!=128)return t.lastNeed=0,"\uFFFD";if(t.lastNeed>1&&e.length>1){if((e[1]&192)!=128)return t.lastNeed=1,"\uFFFD";if(t.lastNeed>2&&e.length>2&&(e[2]&192)!=128)return t.lastNeed=2,"\uFFFD"}}function z9e(t){var e=this.lastTotal-this.lastNeed,r=nVe(this,t,e);if(r!==void 0)return r;if(this.lastNeed<=t.length)return t.copy(this.lastChar,e,0,this.lastNeed),this.lastChar.toString(this.encoding,0,this.lastTotal);t.copy(this.lastChar,e,0,t.length),this.lastNeed-=t.length}function rVe(t,e){var r=iVe(this,t,e);if(!this.lastNeed)return t.toString("utf8",e);this.lastTotal=r;var i=t.length-(r-this.lastNeed);return t.copy(this.lastChar,0,i),t.toString("utf8",e,i)}function tVe(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+"\uFFFD":e}function V9e(t,e){if((t.length-e)%2==0){var r=t.toString("utf16le",e);if(r){var i=r.charCodeAt(r.length-1);if(i>=55296&&i<=56319)return this.lastNeed=2,this.lastTotal=4,this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1],r.slice(0,-1)}return r}return this.lastNeed=1,this.lastTotal=2,this.lastChar[0]=t[t.length-1],t.toString("utf16le",e,t.length-1)}function _9e(t){var e=t&&t.length?this.write(t):"";if(this.lastNeed){var r=this.lastTotal-this.lastNeed;return e+this.lastChar.toString("utf16le",0,r)}return e}function X9e(t,e){var r=(t.length-e)%3;return r===0?t.toString("base64",e):(this.lastNeed=3-r,this.lastTotal=3,r===1?this.lastChar[0]=t[t.length-1]:(this.lastChar[0]=t[t.length-2],this.lastChar[1]=t[t.length-1]),t.toString("base64",e,t.length-r))}function Z9e(t){var e=t&&t.length?this.write(t):"";return this.lastNeed?e+this.lastChar.toString("base64",0,3-this.lastNeed):e}function $9e(t){return t.toString(this.encoding)}function eVe(t){return t&&t.length?this.write(t):""}});var cQ=E((QPt,aue)=>{"use strict";var Aue=VA().codes.ERR_STREAM_PREMATURE_CLOSE;function sVe(t){var e=!1;return function(){if(!e){e=!0;for(var r=arguments.length,i=new Array(r),n=0;n{"use strict";var uQ;function ZA(t,e,r){return e in t?Object.defineProperty(t,e,{value:r,enumerable:!0,configurable:!0,writable:!0}):t[e]=r,t}var AVe=cQ(),$A=Symbol("lastResolve"),qc=Symbol("lastReject"),im=Symbol("error"),gQ=Symbol("ended"),Jc=Symbol("lastPromise"),zT=Symbol("handlePromise"),Wc=Symbol("stream");function el(t,e){return{value:t,done:e}}function lVe(t){var e=t[$A];if(e!==null){var r=t[Wc].read();r!==null&&(t[Jc]=null,t[$A]=null,t[qc]=null,e(el(r,!1)))}}function cVe(t){process.nextTick(lVe,t)}function uVe(t,e){return function(r,i){t.then(function(){if(e[gQ]){r(el(void 0,!0));return}e[zT](r,i)},i)}}var gVe=Object.getPrototypeOf(function(){}),fVe=Object.setPrototypeOf((uQ={get stream(){return this[Wc]},next:function(){var e=this,r=this[im];if(r!==null)return Promise.reject(r);if(this[gQ])return Promise.resolve(el(void 0,!0));if(this[Wc].destroyed)return new Promise(function(o,a){process.nextTick(function(){e[im]?a(e[im]):o(el(void 0,!0))})});var i=this[Jc],n;if(i)n=new Promise(uVe(i,this));else{var s=this[Wc].read();if(s!==null)return Promise.resolve(el(s,!1));n=new Promise(this[zT])}return this[Jc]=n,n}},ZA(uQ,Symbol.asyncIterator,function(){return this}),ZA(uQ,"return",function(){var e=this;return new Promise(function(r,i){e[Wc].destroy(null,function(n){if(n){i(n);return}r(el(void 0,!0))})})}),uQ),gVe),hVe=function(e){var r,i=Object.create(fVe,(r={},ZA(r,Wc,{value:e,writable:!0}),ZA(r,$A,{value:null,writable:!0}),ZA(r,qc,{value:null,writable:!0}),ZA(r,im,{value:null,writable:!0}),ZA(r,gQ,{value:e._readableState.endEmitted,writable:!0}),ZA(r,zT,{value:function(s,o){var a=i[Wc].read();a?(i[Jc]=null,i[$A]=null,i[qc]=null,s(el(a,!1))):(i[$A]=s,i[qc]=o)},writable:!0}),r));return i[Jc]=null,AVe(e,function(n){if(n&&n.code!=="ERR_STREAM_PREMATURE_CLOSE"){var s=i[qc];s!==null&&(i[Jc]=null,i[$A]=null,i[qc]=null,s(n)),i[im]=n;return}var o=i[$A];o!==null&&(i[Jc]=null,i[$A]=null,i[qc]=null,o(el(void 0,!0))),i[gQ]=!0}),e.on("readable",cVe.bind(null,i)),i};cue.exports=hVe});var pue=E((vPt,gue)=>{"use strict";function fue(t,e,r,i,n,s,o){try{var a=t[s](o),l=a.value}catch(c){r(c);return}a.done?e(l):Promise.resolve(l).then(i,n)}function pVe(t){return function(){var e=this,r=arguments;return new Promise(function(i,n){var s=t.apply(e,r);function o(l){fue(s,i,n,o,a,"next",l)}function a(l){fue(s,i,n,o,a,"throw",l)}o(void 0)})}}function hue(t,e){var r=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter(function(n){return Object.getOwnPropertyDescriptor(t,n).enumerable})),r.push.apply(r,i)}return r}function CVe(t){for(var e=1;e{"use strict";due.exports=kt;var Bf;kt.ReadableState=Cue;var SPt=require("events").EventEmitter,mue=function(e,r){return e.listeners(r).length},nm=PT(),fQ=require("buffer").Buffer,IVe=global.Uint8Array||function(){};function yVe(t){return fQ.from(t)}function wVe(t){return fQ.isBuffer(t)||t instanceof IVe}var VT=require("util"),Et;VT&&VT.debuglog?Et=VT.debuglog("stream"):Et=function(){};var BVe=Oce(),_T=FT(),QVe=NT(),bVe=QVe.getHighWaterMark,hQ=VA().codes,vVe=hQ.ERR_INVALID_ARG_TYPE,SVe=hQ.ERR_STREAM_PUSH_AFTER_EOF,xVe=hQ.ERR_METHOD_NOT_IMPLEMENTED,kVe=hQ.ERR_STREAM_UNSHIFT_AFTER_END_EVENT,Qf,XT,ZT;_A()(kt,nm);var sm=_T.errorOrDestroy,$T=["error","close","destroy","pause","resume"];function PVe(t,e,r){if(typeof t.prependListener=="function")return t.prependListener(e,r);!t._events||!t._events[e]?t.on(e,r):Array.isArray(t._events[e])?t._events[e].unshift(r):t._events[e]=[r,t._events[e]]}function Cue(t,e,r){Bf=Bf||Yc(),t=t||{},typeof r!="boolean"&&(r=e instanceof Bf),this.objectMode=!!t.objectMode,r&&(this.objectMode=this.objectMode||!!t.readableObjectMode),this.highWaterMark=bVe(this,t,"readableHighWaterMark",r),this.buffer=new BVe,this.length=0,this.pipes=null,this.pipesCount=0,this.flowing=null,this.ended=!1,this.endEmitted=!1,this.reading=!1,this.sync=!0,this.needReadable=!1,this.emittedReadable=!1,this.readableListening=!1,this.resumeScheduled=!1,this.paused=!0,this.emitClose=t.emitClose!==!1,this.autoDestroy=!!t.autoDestroy,this.destroyed=!1,this.defaultEncoding=t.defaultEncoding||"utf8",this.awaitDrain=0,this.readingMore=!1,this.decoder=null,this.encoding=null,t.encoding&&(Qf||(Qf=WT().StringDecoder),this.decoder=new Qf(t.encoding),this.encoding=t.encoding)}function kt(t){if(Bf=Bf||Yc(),!(this instanceof kt))return new kt(t);var e=this instanceof Bf;this._readableState=new Cue(t,this,e),this.readable=!0,t&&(typeof t.read=="function"&&(this._read=t.read),typeof t.destroy=="function"&&(this._destroy=t.destroy)),nm.call(this)}Object.defineProperty(kt.prototype,"destroyed",{enumerable:!1,get:function(){return this._readableState===void 0?!1:this._readableState.destroyed},set:function(e){!this._readableState||(this._readableState.destroyed=e)}});kt.prototype.destroy=_T.destroy;kt.prototype._undestroy=_T.undestroy;kt.prototype._destroy=function(t,e){e(t)};kt.prototype.push=function(t,e){var r=this._readableState,i;return r.objectMode?i=!0:typeof t=="string"&&(e=e||r.defaultEncoding,e!==r.encoding&&(t=fQ.from(t,e),e=""),i=!0),Eue(this,t,e,!1,i)};kt.prototype.unshift=function(t){return Eue(this,t,null,!0,!1)};function Eue(t,e,r,i,n){Et("readableAddChunk",e);var s=t._readableState;if(e===null)s.reading=!1,RVe(t,s);else{var o;if(n||(o=DVe(s,e)),o)sm(t,o);else if(s.objectMode||e&&e.length>0)if(typeof e!="string"&&!s.objectMode&&Object.getPrototypeOf(e)!==fQ.prototype&&(e=yVe(e)),i)s.endEmitted?sm(t,new kVe):eM(t,s,e,!0);else if(s.ended)sm(t,new SVe);else{if(s.destroyed)return!1;s.reading=!1,s.decoder&&!r?(e=s.decoder.write(e),s.objectMode||e.length!==0?eM(t,s,e,!1):tM(t,s)):eM(t,s,e,!1)}else i||(s.reading=!1,tM(t,s))}return!s.ended&&(s.length=Iue?t=Iue:(t--,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,t|=t>>>16,t++),t}function yue(t,e){return t<=0||e.length===0&&e.ended?0:e.objectMode?1:t!==t?e.flowing&&e.length?e.buffer.head.data.length:e.length:(t>e.highWaterMark&&(e.highWaterMark=FVe(t)),t<=e.length?t:e.ended?e.length:(e.needReadable=!0,0))}kt.prototype.read=function(t){Et("read",t),t=parseInt(t,10);var e=this._readableState,r=t;if(t!==0&&(e.emittedReadable=!1),t===0&&e.needReadable&&((e.highWaterMark!==0?e.length>=e.highWaterMark:e.length>0)||e.ended))return Et("read: emitReadable",e.length,e.ended),e.length===0&&e.ended?rM(this):pQ(this),null;if(t=yue(t,e),t===0&&e.ended)return e.length===0&&rM(this),null;var i=e.needReadable;Et("need readable",i),(e.length===0||e.length-t0?n=wue(t,e):n=null,n===null?(e.needReadable=e.length<=e.highWaterMark,t=0):(e.length-=t,e.awaitDrain=0),e.length===0&&(e.ended||(e.needReadable=!0),r!==t&&e.ended&&rM(this)),n!==null&&this.emit("data",n),n};function RVe(t,e){if(Et("onEofChunk"),!e.ended){if(e.decoder){var r=e.decoder.end();r&&r.length&&(e.buffer.push(r),e.length+=e.objectMode?1:r.length)}e.ended=!0,e.sync?pQ(t):(e.needReadable=!1,e.emittedReadable||(e.emittedReadable=!0,Bue(t)))}}function pQ(t){var e=t._readableState;Et("emitReadable",e.needReadable,e.emittedReadable),e.needReadable=!1,e.emittedReadable||(Et("emitReadable",e.flowing),e.emittedReadable=!0,process.nextTick(Bue,t))}function Bue(t){var e=t._readableState;Et("emitReadable_",e.destroyed,e.length,e.ended),!e.destroyed&&(e.length||e.ended)&&(t.emit("readable"),e.emittedReadable=!1),e.needReadable=!e.flowing&&!e.ended&&e.length<=e.highWaterMark,iM(t)}function tM(t,e){e.readingMore||(e.readingMore=!0,process.nextTick(NVe,t,e))}function NVe(t,e){for(;!e.reading&&!e.ended&&(e.length1&&Que(i.pipes,t)!==-1)&&!c&&(Et("false write response, pause",i.awaitDrain),i.awaitDrain++),r.pause())}function f(m){Et("onerror",m),d(),t.removeListener("error",f),mue(t,"error")===0&&sm(t,m)}PVe(t,"error",f);function h(){t.removeListener("finish",p),d()}t.once("close",h);function p(){Et("onfinish"),t.removeListener("close",h),d()}t.once("finish",p);function d(){Et("unpipe"),r.unpipe(t)}return t.emit("pipe",r),i.flowing||(Et("pipe resume"),r.resume()),t};function LVe(t){return function(){var r=t._readableState;Et("pipeOnDrain",r.awaitDrain),r.awaitDrain&&r.awaitDrain--,r.awaitDrain===0&&mue(t,"data")&&(r.flowing=!0,iM(t))}}kt.prototype.unpipe=function(t){var e=this._readableState,r={hasUnpiped:!1};if(e.pipesCount===0)return this;if(e.pipesCount===1)return t&&t!==e.pipes?this:(t||(t=e.pipes),e.pipes=null,e.pipesCount=0,e.flowing=!1,t&&t.emit("unpipe",this,r),this);if(!t){var i=e.pipes,n=e.pipesCount;e.pipes=null,e.pipesCount=0,e.flowing=!1;for(var s=0;s0,i.flowing!==!1&&this.resume()):t==="readable"&&!i.endEmitted&&!i.readableListening&&(i.readableListening=i.needReadable=!0,i.flowing=!1,i.emittedReadable=!1,Et("on readable",i.length,i.reading),i.length?pQ(this):i.reading||process.nextTick(TVe,this)),r};kt.prototype.addListener=kt.prototype.on;kt.prototype.removeListener=function(t,e){var r=nm.prototype.removeListener.call(this,t,e);return t==="readable"&&process.nextTick(bue,this),r};kt.prototype.removeAllListeners=function(t){var e=nm.prototype.removeAllListeners.apply(this,arguments);return(t==="readable"||t===void 0)&&process.nextTick(bue,this),e};function bue(t){var e=t._readableState;e.readableListening=t.listenerCount("readable")>0,e.resumeScheduled&&!e.paused?e.flowing=!0:t.listenerCount("data")>0&&t.resume()}function TVe(t){Et("readable nexttick read 0"),t.read(0)}kt.prototype.resume=function(){var t=this._readableState;return t.flowing||(Et("resume"),t.flowing=!t.readableListening,MVe(this,t)),t.paused=!1,this};function MVe(t,e){e.resumeScheduled||(e.resumeScheduled=!0,process.nextTick(OVe,t,e))}function OVe(t,e){Et("resume",e.reading),e.reading||t.read(0),e.resumeScheduled=!1,t.emit("resume"),iM(t),e.flowing&&!e.reading&&t.read(0)}kt.prototype.pause=function(){return Et("call pause flowing=%j",this._readableState.flowing),this._readableState.flowing!==!1&&(Et("pause"),this._readableState.flowing=!1,this.emit("pause")),this._readableState.paused=!0,this};function iM(t){var e=t._readableState;for(Et("flow",e.flowing);e.flowing&&t.read()!==null;);}kt.prototype.wrap=function(t){var e=this,r=this._readableState,i=!1;t.on("end",function(){if(Et("wrapped end"),r.decoder&&!r.ended){var o=r.decoder.end();o&&o.length&&e.push(o)}e.push(null)}),t.on("data",function(o){if(Et("wrapped data"),r.decoder&&(o=r.decoder.write(o)),!(r.objectMode&&o==null)&&!(!r.objectMode&&(!o||!o.length))){var a=e.push(o);a||(i=!0,t.pause())}});for(var n in t)this[n]===void 0&&typeof t[n]=="function"&&(this[n]=function(a){return function(){return t[a].apply(t,arguments)}}(n));for(var s=0;s<$T.length;s++)t.on($T[s],this.emit.bind(this,$T[s]));return this._read=function(o){Et("wrapped _read",o),i&&(i=!1,t.resume())},this};typeof Symbol=="function"&&(kt.prototype[Symbol.asyncIterator]=function(){return XT===void 0&&(XT=uue()),XT(this)});Object.defineProperty(kt.prototype,"readableHighWaterMark",{enumerable:!1,get:function(){return this._readableState.highWaterMark}});Object.defineProperty(kt.prototype,"readableBuffer",{enumerable:!1,get:function(){return this._readableState&&this._readableState.buffer}});Object.defineProperty(kt.prototype,"readableFlowing",{enumerable:!1,get:function(){return this._readableState.flowing},set:function(e){this._readableState&&(this._readableState.flowing=e)}});kt._fromList=wue;Object.defineProperty(kt.prototype,"readableLength",{enumerable:!1,get:function(){return this._readableState.length}});function wue(t,e){if(e.length===0)return null;var r;return e.objectMode?r=e.buffer.shift():!t||t>=e.length?(e.decoder?r=e.buffer.join(""):e.buffer.length===1?r=e.buffer.first():r=e.buffer.concat(e.length),e.buffer.clear()):r=e.buffer.consume(t,e.decoder),r}function rM(t){var e=t._readableState;Et("endReadable",e.endEmitted),e.endEmitted||(e.ended=!0,process.nextTick(KVe,e,t))}function KVe(t,e){if(Et("endReadableNT",t.endEmitted,t.length),!t.endEmitted&&t.length===0&&(t.endEmitted=!0,e.readable=!1,e.emit("end"),t.autoDestroy)){var r=e._writableState;(!r||r.autoDestroy&&r.finished)&&e.destroy()}}typeof Symbol=="function"&&(kt.from=function(t,e){return ZT===void 0&&(ZT=pue()),ZT(kt,t,e)});function Que(t,e){for(var r=0,i=t.length;r{"use strict";vue.exports=Ja;var dQ=VA().codes,UVe=dQ.ERR_METHOD_NOT_IMPLEMENTED,HVe=dQ.ERR_MULTIPLE_CALLBACK,GVe=dQ.ERR_TRANSFORM_ALREADY_TRANSFORMING,jVe=dQ.ERR_TRANSFORM_WITH_LENGTH_0,CQ=Yc();_A()(Ja,CQ);function YVe(t,e){var r=this._transformState;r.transforming=!1;var i=r.writecb;if(i===null)return this.emit("error",new HVe);r.writechunk=null,r.writecb=null,e!=null&&this.push(e),i(t);var n=this._readableState;n.reading=!1,(n.needReadable||n.length{"use strict";xue.exports=om;var kue=nM();_A()(om,kue);function om(t){if(!(this instanceof om))return new om(t);kue.call(this,t)}om.prototype._transform=function(t,e,r){r(null,t)}});var Lue=E((DPt,Due)=>{"use strict";var sM;function JVe(t){var e=!1;return function(){e||(e=!0,t.apply(void 0,arguments))}}var Rue=VA().codes,WVe=Rue.ERR_MISSING_ARGS,zVe=Rue.ERR_STREAM_DESTROYED;function Fue(t){if(t)throw t}function VVe(t){return t.setHeader&&typeof t.abort=="function"}function _Ve(t,e,r,i){i=JVe(i);var n=!1;t.on("close",function(){n=!0}),sM===void 0&&(sM=cQ()),sM(t,{readable:e,writable:r},function(o){if(o)return i(o);n=!0,i()});var s=!1;return function(o){if(!n&&!s){if(s=!0,VVe(t))return t.abort();if(typeof t.destroy=="function")return t.destroy();i(o||new zVe("pipe"))}}}function Nue(t){t()}function XVe(t,e){return t.pipe(e)}function ZVe(t){return!t.length||typeof t[t.length-1]!="function"?Fue:t.pop()}function $Ve(){for(var t=arguments.length,e=new Array(t),r=0;r0;return _Ve(o,l,c,function(u){n||(n=u),u&&s.forEach(Nue),!l&&(s.forEach(Nue),i(n))})});return e.reduce(XVe)}Due.exports=$Ve});var bf=E((ys,am)=>{var Am=require("stream");process.env.READABLE_STREAM==="disable"&&Am?(am.exports=Am.Readable,Object.assign(am.exports,Am),am.exports.Stream=Am):(ys=am.exports=HT(),ys.Stream=Am||ys,ys.Readable=ys,ys.Writable=UT(),ys.Duplex=Yc(),ys.Transform=nM(),ys.PassThrough=Pue(),ys.finished=cQ(),ys.pipeline=Lue())});var Oue=E((RPt,Tue)=>{"use strict";var{Buffer:_s}=require("buffer"),Mue=Symbol.for("BufferList");function nr(t){if(!(this instanceof nr))return new nr(t);nr._init.call(this,t)}nr._init=function(e){Object.defineProperty(this,Mue,{value:!0}),this._bufs=[],this.length=0,e&&this.append(e)};nr.prototype._new=function(e){return new nr(e)};nr.prototype._offset=function(e){if(e===0)return[0,0];let r=0;for(let i=0;ithis.length||e<0)return;let r=this._offset(e);return this._bufs[r[0]][r[1]]};nr.prototype.slice=function(e,r){return typeof e=="number"&&e<0&&(e+=this.length),typeof r=="number"&&r<0&&(r+=this.length),this.copy(null,0,e,r)};nr.prototype.copy=function(e,r,i,n){if((typeof i!="number"||i<0)&&(i=0),(typeof n!="number"||n>this.length)&&(n=this.length),i>=this.length||n<=0)return e||_s.alloc(0);let s=!!e,o=this._offset(i),a=n-i,l=a,c=s&&r||0,u=o[1];if(i===0&&n===this.length){if(!s)return this._bufs.length===1?this._bufs[0]:_s.concat(this._bufs,this.length);for(let g=0;gf)this._bufs[g].copy(e,c,u),c+=f;else{this._bufs[g].copy(e,c,u,u+l),c+=f;break}l-=f,u&&(u=0)}return e.length>c?e.slice(0,c):e};nr.prototype.shallowSlice=function(e,r){if(e=e||0,r=typeof r!="number"?this.length:r,e<0&&(e+=this.length),r<0&&(r+=this.length),e===r)return this._new();let i=this._offset(e),n=this._offset(r),s=this._bufs.slice(i[0],n[0]+1);return n[1]===0?s.pop():s[s.length-1]=s[s.length-1].slice(0,n[1]),i[1]!==0&&(s[0]=s[0].slice(i[1])),this._new(s)};nr.prototype.toString=function(e,r,i){return this.slice(r,i).toString(e)};nr.prototype.consume=function(e){if(e=Math.trunc(e),Number.isNaN(e)||e<=0)return this;for(;this._bufs.length;)if(e>=this._bufs[0].length)e-=this._bufs[0].length,this.length-=this._bufs[0].length,this._bufs.shift();else{this._bufs[0]=this._bufs[0].slice(e),this.length-=e;break}return this};nr.prototype.duplicate=function(){let e=this._new();for(let r=0;rthis.length?this.length:e;let i=this._offset(e),n=i[0],s=i[1];for(;n=t.length){let l=o.indexOf(t,s);if(l!==-1)return this._reverseOffset([n,l]);s=o.length-t.length+1}else{let l=this._reverseOffset([n,s]);if(this._match(l,t))return l;s++}s=0}return-1};nr.prototype._match=function(t,e){if(this.length-t{"use strict";var oM=bf().Duplex,e7e=_A(),lm=Oue();function Oi(t){if(!(this instanceof Oi))return new Oi(t);if(typeof t=="function"){this._callback=t;let e=function(i){this._callback&&(this._callback(i),this._callback=null)}.bind(this);this.on("pipe",function(i){i.on("error",e)}),this.on("unpipe",function(i){i.removeListener("error",e)}),t=null}lm._init.call(this,t),oM.call(this)}e7e(Oi,oM);Object.assign(Oi.prototype,lm.prototype);Oi.prototype._new=function(e){return new Oi(e)};Oi.prototype._write=function(e,r,i){this._appendBuffer(e),typeof i=="function"&&i()};Oi.prototype._read=function(e){if(!this.length)return this.push(null);e=Math.min(e,this.length),this.push(this.slice(0,e)),this.consume(e)};Oi.prototype.end=function(e){oM.prototype.end.call(this,e),this._callback&&(this._callback(null,this.slice()),this._callback=null)};Oi.prototype._destroy=function(e,r){this._bufs.length=0,this.length=0,r(e)};Oi.prototype._isBufferList=function(e){return e instanceof Oi||e instanceof lm||Oi.isBufferList(e)};Oi.isBufferList=lm.isBufferList;mQ.exports=Oi;mQ.exports.BufferListStream=Oi;mQ.exports.BufferList=lm});var lM=E(vf=>{var t7e=Buffer.alloc,r7e="0000000000000000000",i7e="7777777777777777777",Uue="0".charCodeAt(0),Hue=Buffer.from("ustar\0","binary"),n7e=Buffer.from("00","binary"),s7e=Buffer.from("ustar ","binary"),o7e=Buffer.from(" \0","binary"),a7e=parseInt("7777",8),cm=257,aM=263,A7e=function(t,e,r){return typeof t!="number"?r:(t=~~t,t>=e?e:t>=0||(t+=e,t>=0)?t:0)},l7e=function(t){switch(t){case 0:return"file";case 1:return"link";case 2:return"symlink";case 3:return"character-device";case 4:return"block-device";case 5:return"directory";case 6:return"fifo";case 7:return"contiguous-file";case 72:return"pax-header";case 55:return"pax-global-header";case 27:return"gnu-long-link-path";case 28:case 30:return"gnu-long-path"}return null},c7e=function(t){switch(t){case"file":return 0;case"link":return 1;case"symlink":return 2;case"character-device":return 3;case"block-device":return 4;case"directory":return 5;case"fifo":return 6;case"contiguous-file":return 7;case"pax-header":return 72}return 0},Gue=function(t,e,r,i){for(;re?i7e.slice(0,e)+" ":r7e.slice(0,e-t.length)+t+" "};function u7e(t){var e;if(t[0]===128)e=!0;else if(t[0]===255)e=!1;else return null;for(var r=[],i=t.length-1;i>0;i--){var n=t[i];e?r.push(n):r.push(255-n)}var s=0,o=r.length;for(i=0;i=Math.pow(10,r)&&r++,e+r+t};vf.decodeLongPath=function(t,e){return Sf(t,0,t.length,e)};vf.encodePax=function(t){var e="";t.name&&(e+=AM(" path="+t.name+` +`)),t.linkname&&(e+=AM(" linkpath="+t.linkname+` +`));var r=t.pax;if(r)for(var i in r)e+=AM(" "+i+"="+r[i]+` +`);return Buffer.from(e)};vf.decodePax=function(t){for(var e={};t.length;){for(var r=0;r100;){var n=r.indexOf("/");if(n===-1)return null;i+=i?"/"+r.slice(0,n):r.slice(0,n),r=r.slice(n+1)}return Buffer.byteLength(r)>100||Buffer.byteLength(i)>155||t.linkname&&Buffer.byteLength(t.linkname)>100?null:(e.write(r),e.write(tl(t.mode&a7e,6),100),e.write(tl(t.uid,6),108),e.write(tl(t.gid,6),116),e.write(tl(t.size,11),124),e.write(tl(t.mtime.getTime()/1e3|0,11),136),e[156]=Uue+c7e(t.type),t.linkname&&e.write(t.linkname,157),Hue.copy(e,cm),n7e.copy(e,aM),t.uname&&e.write(t.uname,265),t.gname&&e.write(t.gname,297),e.write(tl(t.devmajor||0,6),329),e.write(tl(t.devminor||0,6),337),i&&e.write(i,345),e.write(tl(jue(e),6),148),e)};vf.decode=function(t,e,r){var i=t[156]===0?0:t[156]-Uue,n=Sf(t,0,100,e),s=rl(t,100,8),o=rl(t,108,8),a=rl(t,116,8),l=rl(t,124,12),c=rl(t,136,12),u=l7e(i),g=t[157]===0?null:Sf(t,157,100,e),f=Sf(t,265,32),h=Sf(t,297,32),p=rl(t,329,8),d=rl(t,337,8),m=jue(t);if(m===8*32)return null;if(m!==rl(t,148,8))throw new Error("Invalid tar header. Maybe the tar is corrupted or it needs to be gunzipped?");if(Hue.compare(t,cm,cm+6)===0)t[345]&&(n=Sf(t,345,155,e)+"/"+n);else if(!(s7e.compare(t,cm,cm+6)===0&&o7e.compare(t,aM,aM+2)===0)){if(!r)throw new Error("Invalid tar header: unknown format.")}return i===0&&n&&n[n.length-1]==="/"&&(i=5),{name:n,mode:s,uid:o,gid:a,size:l,mtime:new Date(1e3*c),type:u,linkname:g,uname:f,gname:h,devmajor:p,devminor:d}}});var _ue=E((LPt,Yue)=>{var que=require("util"),g7e=Kue(),um=lM(),Jue=bf().Writable,Wue=bf().PassThrough,zue=function(){},Vue=function(t){return t&=511,t&&512-t},f7e=function(t,e){var r=new EQ(t,e);return r.end(),r},h7e=function(t,e){return e.path&&(t.name=e.path),e.linkpath&&(t.linkname=e.linkpath),e.size&&(t.size=parseInt(e.size,10)),t.pax=e,t},EQ=function(t,e){this._parent=t,this.offset=e,Wue.call(this,{autoDestroy:!1})};que.inherits(EQ,Wue);EQ.prototype.destroy=function(t){this._parent.destroy(t)};var Wa=function(t){if(!(this instanceof Wa))return new Wa(t);Jue.call(this,t),t=t||{},this._offset=0,this._buffer=g7e(),this._missing=0,this._partial=!1,this._onparse=zue,this._header=null,this._stream=null,this._overflow=null,this._cb=null,this._locked=!1,this._destroyed=!1,this._pax=null,this._paxGlobal=null,this._gnuLongPath=null,this._gnuLongLinkPath=null;var e=this,r=e._buffer,i=function(){e._continue()},n=function(f){if(e._locked=!1,f)return e.destroy(f);e._stream||i()},s=function(){e._stream=null;var f=Vue(e._header.size);f?e._parse(f,o):e._parse(512,g),e._locked||i()},o=function(){e._buffer.consume(Vue(e._header.size)),e._parse(512,g),i()},a=function(){var f=e._header.size;e._paxGlobal=um.decodePax(r.slice(0,f)),r.consume(f),s()},l=function(){var f=e._header.size;e._pax=um.decodePax(r.slice(0,f)),e._paxGlobal&&(e._pax=Object.assign({},e._paxGlobal,e._pax)),r.consume(f),s()},c=function(){var f=e._header.size;this._gnuLongPath=um.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},u=function(){var f=e._header.size;this._gnuLongLinkPath=um.decodeLongPath(r.slice(0,f),t.filenameEncoding),r.consume(f),s()},g=function(){var f=e._offset,h;try{h=e._header=um.decode(r.slice(0,512),t.filenameEncoding,t.allowUnknownFormat)}catch(p){e.emit("error",p)}if(r.consume(512),!h){e._parse(512,g),i();return}if(h.type==="gnu-long-path"){e._parse(h.size,c),i();return}if(h.type==="gnu-long-link-path"){e._parse(h.size,u),i();return}if(h.type==="pax-global-header"){e._parse(h.size,a),i();return}if(h.type==="pax-header"){e._parse(h.size,l),i();return}if(e._gnuLongPath&&(h.name=e._gnuLongPath,e._gnuLongPath=null),e._gnuLongLinkPath&&(h.linkname=e._gnuLongLinkPath,e._gnuLongLinkPath=null),e._pax&&(e._header=h=h7e(h,e._pax),e._pax=null),e._locked=!0,!h.size||h.type==="directory"){e._parse(512,g),e.emit("entry",h,f7e(e,f),n);return}e._stream=new EQ(e,f),e.emit("entry",h,e._stream,n),e._parse(h.size,s),i()};this._onheader=g,this._parse(512,g)};que.inherits(Wa,Jue);Wa.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.emit("close"))};Wa.prototype._parse=function(t,e){this._destroyed||(this._offset+=t,this._missing=t,e===this._onheader&&(this._partial=!1),this._onparse=e)};Wa.prototype._continue=function(){if(!this._destroyed){var t=this._cb;this._cb=zue,this._overflow?this._write(this._overflow,void 0,t):t()}};Wa.prototype._write=function(t,e,r){if(!this._destroyed){var i=this._stream,n=this._buffer,s=this._missing;if(t.length&&(this._partial=!0),t.lengths&&(o=t.slice(s),t=t.slice(0,s)),i?i.end(t):n.append(t),this._overflow=o,this._onparse()}};Wa.prototype._final=function(t){if(this._partial)return this.destroy(new Error("Unexpected end of data"));t()};Yue.exports=Wa});var Zue=E((TPt,Xue)=>{Xue.exports=require("fs").constants||require("constants")});var ige=E((MPt,$ue)=>{var xf=Zue(),ege=tk(),IQ=_A(),p7e=Buffer.alloc,tge=bf().Readable,kf=bf().Writable,d7e=require("string_decoder").StringDecoder,yQ=lM(),C7e=parseInt("755",8),m7e=parseInt("644",8),rge=p7e(1024),cM=function(){},uM=function(t,e){e&=511,e&&t.push(rge.slice(0,512-e))};function E7e(t){switch(t&xf.S_IFMT){case xf.S_IFBLK:return"block-device";case xf.S_IFCHR:return"character-device";case xf.S_IFDIR:return"directory";case xf.S_IFIFO:return"fifo";case xf.S_IFLNK:return"symlink"}return"file"}var wQ=function(t){kf.call(this),this.written=0,this._to=t,this._destroyed=!1};IQ(wQ,kf);wQ.prototype._write=function(t,e,r){if(this.written+=t.length,this._to.push(t))return r();this._to._drain=r};wQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var BQ=function(){kf.call(this),this.linkname="",this._decoder=new d7e("utf-8"),this._destroyed=!1};IQ(BQ,kf);BQ.prototype._write=function(t,e,r){this.linkname+=this._decoder.write(t),r()};BQ.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var gm=function(){kf.call(this),this._destroyed=!1};IQ(gm,kf);gm.prototype._write=function(t,e,r){r(new Error("No body allowed for this entry"))};gm.prototype.destroy=function(){this._destroyed||(this._destroyed=!0,this.emit("close"))};var Oo=function(t){if(!(this instanceof Oo))return new Oo(t);tge.call(this,t),this._drain=cM,this._finalized=!1,this._finalizing=!1,this._destroyed=!1,this._stream=null};IQ(Oo,tge);Oo.prototype.entry=function(t,e,r){if(this._stream)throw new Error("already piping an entry");if(!(this._finalized||this._destroyed)){typeof e=="function"&&(r=e,e=null),r||(r=cM);var i=this;if((!t.size||t.type==="symlink")&&(t.size=0),t.type||(t.type=E7e(t.mode)),t.mode||(t.mode=t.type==="directory"?C7e:m7e),t.uid||(t.uid=0),t.gid||(t.gid=0),t.mtime||(t.mtime=new Date),typeof e=="string"&&(e=Buffer.from(e)),Buffer.isBuffer(e)){t.size=e.length,this._encode(t);var n=this.push(e);return uM(i,t.size),n?process.nextTick(r):this._drain=r,new gm}if(t.type==="symlink"&&!t.linkname){var s=new BQ;return ege(s,function(a){if(a)return i.destroy(),r(a);t.linkname=s.linkname,i._encode(t),r()}),s}if(this._encode(t),t.type!=="file"&&t.type!=="contiguous-file")return process.nextTick(r),new gm;var o=new wQ(this);return this._stream=o,ege(o,function(a){if(i._stream=null,a)return i.destroy(),r(a);if(o.written!==t.size)return i.destroy(),r(new Error("size mismatch"));uM(i,t.size),i._finalizing&&i.finalize(),r()}),o}};Oo.prototype.finalize=function(){if(this._stream){this._finalizing=!0;return}this._finalized||(this._finalized=!0,this.push(rge),this.push(null))};Oo.prototype.destroy=function(t){this._destroyed||(this._destroyed=!0,t&&this.emit("error",t),this.emit("close"),this._stream&&this._stream.destroy&&this._stream.destroy())};Oo.prototype._encode=function(t){if(!t.pax){var e=yQ.encode(t);if(e){this.push(e);return}}this._encodePax(t)};Oo.prototype._encodePax=function(t){var e=yQ.encodePax({name:t.name,linkname:t.linkname,pax:t.pax}),r={name:"PaxHeader",mode:t.mode,uid:t.uid,gid:t.gid,size:e.length,mtime:t.mtime,type:"pax-header",linkname:t.linkname&&"PaxHeader",uname:t.uname,gname:t.gname,devmajor:t.devmajor,devminor:t.devminor};this.push(yQ.encode(r)),this.push(e),uM(this,e.length),r.size=t.size,r.type=t.type,this.push(yQ.encode(r))};Oo.prototype._read=function(t){var e=this._drain;this._drain=cM,e()};$ue.exports=Oo});var nge=E(gM=>{gM.extract=_ue();gM.pack=ige()});var Cge=E((oDt,fge)=>{"use strict";var Pf=class{constructor(e,r,i){this.__specs=e||{},Object.keys(this.__specs).forEach(n=>{if(typeof this.__specs[n]=="string"){let s=this.__specs[n],o=this.__specs[s];if(o){let a=o.aliases||[];a.push(n,s),o.aliases=[...new Set(a)],this.__specs[n]=o}else throw new Error(`Alias refers to invalid key: ${s} -> ${n}`)}}),this.__opts=r||{},this.__providers=pge(i.filter(n=>n!=null&&typeof n=="object")),this.__isFiggyPudding=!0}get(e){return mM(this,e,!0)}get[Symbol.toStringTag](){return"FiggyPudding"}forEach(e,r=this){for(let[i,n]of this.entries())e.call(r,n,i,this)}toJSON(){let e={};return this.forEach((r,i)=>{e[i]=r}),e}*entries(e){for(let i of Object.keys(this.__specs))yield[i,this.get(i)];let r=e||this.__opts.other;if(r){let i=new Set;for(let n of this.__providers){let s=n.entries?n.entries(r):R7e(n);for(let[o,a]of s)r(o)&&!i.has(o)&&(i.add(o),yield[o,a])}}}*[Symbol.iterator](){for(let[e,r]of this.entries())yield[e,r]}*keys(){for(let[e]of this.entries())yield e}*values(){for(let[,e]of this.entries())yield e}concat(...e){return new Proxy(new Pf(this.__specs,this.__opts,pge(this.__providers).concat(e)),hge)}};try{let t=require("util");Pf.prototype[t.inspect.custom]=function(e,r){return this[Symbol.toStringTag]+" "+t.inspect(this.toJSON(),r)}}catch(t){}function F7e(t){throw Object.assign(new Error(`invalid config key requested: ${t}`),{code:"EBADKEY"})}function mM(t,e,r){let i=t.__specs[e];if(r&&!i&&(!t.__opts.other||!t.__opts.other(e)))F7e(e);else{i||(i={});let n;for(let s of t.__providers){if(n=dge(e,s),n===void 0&&i.aliases&&i.aliases.length){for(let o of i.aliases)if(o!==e&&(n=dge(o,s),n!==void 0))break}if(n!==void 0)break}return n===void 0&&i.default!==void 0?typeof i.default=="function"?i.default(t):i.default:n}}function dge(t,e){let r;return e.__isFiggyPudding?r=mM(e,t,!1):typeof e.get=="function"?r=e.get(t):r=e[t],r}var hge={has(t,e){return e in t.__specs&&mM(t,e,!1)!==void 0},ownKeys(t){return Object.keys(t.__specs)},get(t,e){return typeof e=="symbol"||e.slice(0,2)==="__"||e in Pf.prototype?t[e]:t.get(e)},set(t,e,r){if(typeof e=="symbol"||e.slice(0,2)==="__")return t[e]=r,!0;throw new Error("figgyPudding options cannot be modified. Use .concat() instead.")},deleteProperty(){throw new Error("figgyPudding options cannot be deleted. Use .concat() and shadow them instead.")}};fge.exports=N7e;function N7e(t,e){function r(...i){return new Proxy(new Pf(t,e,i),hge)}return r}function pge(t){let e=[];return t.forEach(r=>e.unshift(r)),e}function R7e(t){return Object.keys(t).map(e=>[e,t[e]])}});var Ige=E((aDt,Ko)=>{"use strict";var hm=require("crypto"),L7e=Cge(),T7e=require("stream").Transform,mge=["sha256","sha384","sha512"],M7e=/^[a-z0-9+/]+(?:=?=?)$/i,O7e=/^([^-]+)-([^?]+)([?\S*]*)$/,K7e=/^([^-]+)-([A-Za-z0-9+/=]{44,88})(\?[\x21-\x7E]*)*$/,U7e=/^[\x21-\x7E]+$/,on=L7e({algorithms:{default:["sha512"]},error:{default:!1},integrity:{},options:{default:[]},pickAlgorithm:{default:()=>H7e},Promise:{default:()=>Promise},sep:{default:" "},single:{default:!1},size:{},strict:{default:!1}}),zc=class{get isHash(){return!0}constructor(e,r){r=on(r);let i=!!r.strict;this.source=e.trim();let n=this.source.match(i?K7e:O7e);if(!n||i&&!mge.some(o=>o===n[1]))return;this.algorithm=n[1],this.digest=n[2];let s=n[3];this.options=s?s.slice(1).split("?"):[]}hexDigest(){return this.digest&&Buffer.from(this.digest,"base64").toString("hex")}toJSON(){return this.toString()}toString(e){if(e=on(e),e.strict&&!(mge.some(i=>i===this.algorithm)&&this.digest.match(M7e)&&(this.options||[]).every(i=>i.match(U7e))))return"";let r=this.options&&this.options.length?`?${this.options.join("?")}`:"";return`${this.algorithm}-${this.digest}${r}`}},Df=class{get isIntegrity(){return!0}toJSON(){return this.toString()}toString(e){e=on(e);let r=e.sep||" ";return e.strict&&(r=r.replace(/\S+/g," ")),Object.keys(this).map(i=>this[i].map(n=>zc.prototype.toString.call(n,e)).filter(n=>n.length).join(r)).filter(i=>i.length).join(r)}concat(e,r){r=on(r);let i=typeof e=="string"?e:pm(e,r);return Uo(`${this.toString(r)} ${i}`,r)}hexDigest(){return Uo(this,{single:!0}).hexDigest()}match(e,r){r=on(r);let i=Uo(e,r),n=i.pickAlgorithm(r);return this[n]&&i[n]&&this[n].find(s=>i[n].find(o=>s.digest===o.digest))||!1}pickAlgorithm(e){e=on(e);let r=e.pickAlgorithm,i=Object.keys(this);if(!i.length)throw new Error(`No algorithms available for ${JSON.stringify(this.toString())}`);return i.reduce((n,s)=>r(n,s)||n)}};Ko.exports.parse=Uo;function Uo(t,e){if(e=on(e),typeof t=="string")return EM(t,e);if(t.algorithm&&t.digest){let r=new Df;return r[t.algorithm]=[t],EM(pm(r,e),e)}else return EM(pm(t,e),e)}function EM(t,e){return e.single?new zc(t,e):t.trim().split(/\s+/).reduce((r,i)=>{let n=new zc(i,e);if(n.algorithm&&n.digest){let s=n.algorithm;r[s]||(r[s]=[]),r[s].push(n)}return r},new Df)}Ko.exports.stringify=pm;function pm(t,e){return e=on(e),t.algorithm&&t.digest?zc.prototype.toString.call(t,e):typeof t=="string"?pm(Uo(t,e),e):Df.prototype.toString.call(t,e)}Ko.exports.fromHex=G7e;function G7e(t,e,r){r=on(r);let i=r.options&&r.options.length?`?${r.options.join("?")}`:"";return Uo(`${e}-${Buffer.from(t,"hex").toString("base64")}${i}`,r)}Ko.exports.fromData=j7e;function j7e(t,e){e=on(e);let r=e.algorithms,i=e.options&&e.options.length?`?${e.options.join("?")}`:"";return r.reduce((n,s)=>{let o=hm.createHash(s).update(t).digest("base64"),a=new zc(`${s}-${o}${i}`,e);if(a.algorithm&&a.digest){let l=a.algorithm;n[l]||(n[l]=[]),n[l].push(a)}return n},new Df)}Ko.exports.fromStream=Y7e;function Y7e(t,e){e=on(e);let r=e.Promise||Promise,i=IM(e);return new r((n,s)=>{t.pipe(i),t.on("error",s),i.on("error",s);let o;i.on("integrity",a=>{o=a}),i.on("end",()=>n(o)),i.on("data",()=>{})})}Ko.exports.checkData=q7e;function q7e(t,e,r){if(r=on(r),e=Uo(e,r),!Object.keys(e).length){if(r.error)throw Object.assign(new Error("No valid integrity hashes to check against"),{code:"EINTEGRITY"});return!1}let i=e.pickAlgorithm(r),n=hm.createHash(i).update(t).digest("base64"),s=Uo({algorithm:i,digest:n}),o=s.match(e,r);if(o||!r.error)return o;if(typeof r.size=="number"&&t.length!==r.size){let a=new Error(`data size mismatch when checking ${e}. + Wanted: ${r.size} + Found: ${t.length}`);throw a.code="EBADSIZE",a.found=t.length,a.expected=r.size,a.sri=e,a}else{let a=new Error(`Integrity checksum failed when using ${i}: Wanted ${e}, but got ${s}. (${t.length} bytes)`);throw a.code="EINTEGRITY",a.found=s,a.expected=e,a.algorithm=i,a.sri=e,a}}Ko.exports.checkStream=J7e;function J7e(t,e,r){r=on(r);let i=r.Promise||Promise,n=IM(r.concat({integrity:e}));return new i((s,o)=>{t.pipe(n),t.on("error",o),n.on("error",o);let a;n.on("verified",l=>{a=l}),n.on("end",()=>s(a)),n.on("data",()=>{})})}Ko.exports.integrityStream=IM;function IM(t){t=on(t);let e=t.integrity&&Uo(t.integrity,t),r=e&&Object.keys(e).length,i=r&&e.pickAlgorithm(t),n=r&&e[i],s=Array.from(new Set(t.algorithms.concat(i?[i]:[]))),o=s.map(hm.createHash),a=0,l=new T7e({transform(c,u,g){a+=c.length,o.forEach(f=>f.update(c,u)),g(null,c,u)}}).on("end",()=>{let c=t.options&&t.options.length?`?${t.options.join("?")}`:"",u=Uo(o.map((f,h)=>`${s[h]}-${f.digest("base64")}${c}`).join(" "),t),g=r&&u.match(e,t);if(typeof t.size=="number"&&a!==t.size){let f=new Error(`stream size mismatch when checking ${e}. + Wanted: ${t.size} + Found: ${a}`);f.code="EBADSIZE",f.found=a,f.expected=t.size,f.sri=e,l.emit("error",f)}else if(t.integrity&&!g){let f=new Error(`${e} integrity checksum failed when using ${i}: wanted ${n} but got ${u}. (${a} bytes)`);f.code="EINTEGRITY",f.found=u,f.expected=n,f.algorithm=i,f.sri=e,l.emit("error",f)}else l.emit("size",a),l.emit("integrity",u),g&&l.emit("verified",g)});return l}Ko.exports.create=W7e;function W7e(t){t=on(t);let e=t.algorithms,r=t.options.length?`?${t.options.join("?")}`:"",i=e.map(hm.createHash);return{update:function(n,s){return i.forEach(o=>o.update(n,s)),this},digest:function(n){return e.reduce((o,a)=>{let l=i.shift().digest("base64"),c=new zc(`${a}-${l}${r}`,t);if(c.algorithm&&c.digest){let u=c.algorithm;o[u]||(o[u]=[]),o[u].push(c)}return o},new Df)}}}var z7e=new Set(hm.getHashes()),Ege=["md5","whirlpool","sha1","sha224","sha256","sha384","sha512","sha3","sha3-256","sha3-384","sha3-512","sha3_256","sha3_384","sha3_512"].filter(t=>z7e.has(t));function H7e(t,e){return Ege.indexOf(t.toLowerCase())>=Ege.indexOf(e.toLowerCase())?t:e}});var Fd={};it(Fd,{BuildType:()=>Gn,Cache:()=>Qt,Configuration:()=>fe,DEFAULT_LOCK_FILENAME:()=>DR,DEFAULT_RC_FILENAME:()=>PR,FormatType:()=>ps,InstallMode:()=>li,LightReport:()=>Fa,LinkType:()=>gt,Manifest:()=>Ze,MessageName:()=>z,PackageExtensionStatus:()=>ki,PackageExtensionType:()=>oi,Project:()=>Ke,ProjectLookup:()=>KA,Report:()=>Xi,ReportError:()=>nt,SettingsType:()=>ge,StreamReport:()=>Fe,TAG_REGEXP:()=>Rg,TelemetryManager:()=>Rd,ThrowReport:()=>ei,VirtualFetcher:()=>dd,Workspace:()=>Dd,WorkspaceResolver:()=>Yr,YarnVersion:()=>Zr,execUtils:()=>hr,folderUtils:()=>Pb,formatUtils:()=>ue,hashUtils:()=>mn,httpUtils:()=>Zt,miscUtils:()=>de,scriptUtils:()=>Kt,semverUtils:()=>qt,structUtils:()=>S,tgzUtils:()=>Ai,treeUtils:()=>Hs});var hr={};it(hr,{EndStrategy:()=>Pn,execvp:()=>Nhe,pipevp:()=>to});var ch={};it(ch,{AliasFS:()=>Xo,CwdFS:()=>Ft,DEFAULT_COMPRESSION_LEVEL:()=>pl,FakeFS:()=>eA,Filename:()=>wt,JailFS:()=>Zo,LazyFS:()=>oh,LinkStrategy:()=>eh,NoFS:()=>bE,NodeFS:()=>Wt,PortablePath:()=>Se,PosixFS:()=>ah,ProxiedFS:()=>fi,VirtualFS:()=>Pr,ZipFS:()=>Jr,ZipOpenFS:()=>Jn,constants:()=>mr,extendFs:()=>SE,normalizeLineEndings:()=>ul,npath:()=>M,opendir:()=>wE,patchFs:()=>pb,ppath:()=>v,statUtils:()=>rb,toFilename:()=>kr,xfs:()=>T});var mr={};it(mr,{SAFE_TIME:()=>tb,S_IFDIR:()=>zo,S_IFLNK:()=>_o,S_IFMT:()=>kn,S_IFREG:()=>Vo});var kn=61440,zo=16384,Vo=32768,_o=40960,tb=456789e3;var rb={};it(rb,{BigIntStatsEntry:()=>Xf,DEFAULT_MODE:()=>_f,DirEntry:()=>uO,StatEntry:()=>Za,areStatsEqual:()=>nb,clearStats:()=>pE,convertToBigIntStats:()=>dE,makeDefaultStats:()=>Zf,makeEmptyStats:()=>Jfe});var ib=ie(require("util"));var _f=Vo|420,uO=class{constructor(){this.name="";this.mode=0}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&kn)===zo}isFIFO(){return!1}isFile(){return(this.mode&kn)===Vo}isSocket(){return!1}isSymbolicLink(){return(this.mode&kn)===_o}},Za=class{constructor(){this.uid=0;this.gid=0;this.size=0;this.blksize=0;this.atimeMs=0;this.mtimeMs=0;this.ctimeMs=0;this.birthtimeMs=0;this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=0;this.ino=0;this.mode=_f;this.nlink=1;this.rdev=0;this.blocks=1}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&kn)===zo}isFIFO(){return!1}isFile(){return(this.mode&kn)===Vo}isSocket(){return!1}isSymbolicLink(){return(this.mode&kn)===_o}},Xf=class{constructor(){this.uid=BigInt(0);this.gid=BigInt(0);this.size=BigInt(0);this.blksize=BigInt(0);this.atimeMs=BigInt(0);this.mtimeMs=BigInt(0);this.ctimeMs=BigInt(0);this.birthtimeMs=BigInt(0);this.atimeNs=BigInt(0);this.mtimeNs=BigInt(0);this.ctimeNs=BigInt(0);this.birthtimeNs=BigInt(0);this.atime=new Date(0);this.mtime=new Date(0);this.ctime=new Date(0);this.birthtime=new Date(0);this.dev=BigInt(0);this.ino=BigInt(0);this.mode=BigInt(_f);this.nlink=BigInt(1);this.rdev=BigInt(0);this.blocks=BigInt(1)}isBlockDevice(){return!1}isCharacterDevice(){return!1}isDirectory(){return(this.mode&BigInt(kn))===BigInt(zo)}isFIFO(){return!1}isFile(){return(this.mode&BigInt(kn))===BigInt(Vo)}isSocket(){return!1}isSymbolicLink(){return(this.mode&BigInt(kn))===BigInt(_o)}};function Zf(){return new Za}function Jfe(){return pE(Zf())}function pE(t){for(let e in t)if(Object.prototype.hasOwnProperty.call(t,e)){let r=t[e];typeof r=="number"?t[e]=0:typeof r=="bigint"?t[e]=BigInt(0):ib.types.isDate(r)&&(t[e]=new Date(0))}return t}function dE(t){let e=new Xf;for(let r in t)if(Object.prototype.hasOwnProperty.call(t,r)){let i=t[r];typeof i=="number"?e[r]=BigInt(i):ib.types.isDate(i)&&(e[r]=new Date(i))}return e.atimeNs=e.atimeMs*BigInt(1e6),e.mtimeNs=e.mtimeMs*BigInt(1e6),e.ctimeNs=e.ctimeMs*BigInt(1e6),e.birthtimeNs=e.birthtimeMs*BigInt(1e6),e}function nb(t,e){if(t.atimeMs!==e.atimeMs||t.birthtimeMs!==e.birthtimeMs||t.blksize!==e.blksize||t.blocks!==e.blocks||t.ctimeMs!==e.ctimeMs||t.dev!==e.dev||t.gid!==e.gid||t.ino!==e.ino||t.isBlockDevice()!==e.isBlockDevice()||t.isCharacterDevice()!==e.isCharacterDevice()||t.isDirectory()!==e.isDirectory()||t.isFIFO()!==e.isFIFO()||t.isFile()!==e.isFile()||t.isSocket()!==e.isSocket()||t.isSymbolicLink()!==e.isSymbolicLink()||t.mode!==e.mode||t.mtimeMs!==e.mtimeMs||t.nlink!==e.nlink||t.rdev!==e.rdev||t.size!==e.size||t.uid!==e.uid)return!1;let r=t,i=e;return!(r.atimeNs!==i.atimeNs||r.mtimeNs!==i.mtimeNs||r.ctimeNs!==i.ctimeNs||r.birthtimeNs!==i.birthtimeNs)}var mE=ie(require("fs"));var $f=ie(require("path")),gO;(function(i){i[i.File=0]="File",i[i.Portable=1]="Portable",i[i.Native=2]="Native"})(gO||(gO={}));var Se={root:"/",dot:"."},wt={nodeModules:"node_modules",manifest:"package.json",lockfile:"yarn.lock",virtual:"__virtual__",pnpJs:".pnp.js",pnpCjs:".pnp.cjs",rc:".yarnrc.yml"},M=Object.create($f.default),v=Object.create($f.default.posix);M.cwd=()=>process.cwd();v.cwd=()=>sb(process.cwd());v.resolve=(...t)=>t.length>0&&v.isAbsolute(t[0])?$f.default.posix.resolve(...t):$f.default.posix.resolve(v.cwd(),...t);var fO=function(t,e,r){return e=t.normalize(e),r=t.normalize(r),e===r?".":(e.endsWith(t.sep)||(e=e+t.sep),r.startsWith(e)?r.slice(e.length):null)};M.fromPortablePath=hO;M.toPortablePath=sb;M.contains=(t,e)=>fO(M,t,e);v.contains=(t,e)=>fO(v,t,e);var Wfe=/^([a-zA-Z]:.*)$/,zfe=/^\\\\(\.\\)?(.*)$/,Vfe=/^\/([a-zA-Z]:.*)$/,_fe=/^\/unc\/(\.dot\/)?(.*)$/;function hO(t){if(process.platform!=="win32")return t;let e,r;if(e=t.match(Vfe))t=e[1];else if(r=t.match(_fe))t=`\\\\${r[1]?".\\":""}${r[2]}`;else return t;return t.replace(/\//g,"\\")}function sb(t){if(process.platform!=="win32")return t;let e,r;return(e=t.match(Wfe))?t=`/${e[1]}`:(r=t.match(zfe))&&(t=`/unc/${r[1]?".dot/":""}${r[2]}`),t.replace(/\\/g,"/")}function CE(t,e){return t===M?hO(e):sb(e)}function kr(t){if(M.parse(t).dir!==""||v.parse(t).dir!=="")throw new Error(`Invalid filename: "${t}"`);return t}var EE=new Date(tb*1e3),eh;(function(r){r.Allow="allow",r.ReadOnly="readOnly"})(eh||(eh={}));async function pO(t,e,r,i,n){let s=t.pathUtils.normalize(e),o=r.pathUtils.normalize(i),a=[],l=[],c=n.stableTime?{mtime:EE,atime:EE}:await r.lstatPromise(o);await t.mkdirpPromise(t.pathUtils.dirname(e),{utimes:[c.atime,c.mtime]});let u=typeof t.lutimesPromise=="function"?t.lutimesPromise.bind(t):t.utimesPromise.bind(t);await ob(a,l,u,t,s,r,o,n);for(let g of a)await g();await Promise.all(l.map(g=>g()))}async function ob(t,e,r,i,n,s,o,a){var f,h;let l=await Xfe(i,n),c=await s.lstatPromise(o),u=a.stableTime?{mtime:EE,atime:EE}:c,g;switch(!0){case c.isDirectory():g=await Zfe(t,e,r,i,n,l,s,o,c,a);break;case c.isFile():g=await $fe(t,e,r,i,n,l,s,o,c,a);break;case c.isSymbolicLink():g=await ehe(t,e,r,i,n,l,s,o,c,a);break;default:throw new Error(`Unsupported file type (${c.mode})`)}return(g||((f=l==null?void 0:l.mtime)==null?void 0:f.getTime())!==u.mtime.getTime()||((h=l==null?void 0:l.atime)==null?void 0:h.getTime())!==u.atime.getTime())&&(e.push(()=>r(n,u.atime,u.mtime)),g=!0),(l===null||(l.mode&511)!=(c.mode&511))&&(e.push(()=>i.chmodPromise(n,c.mode&511)),g=!0),g}async function Xfe(t,e){try{return await t.lstatPromise(e)}catch(r){return null}}async function Zfe(t,e,r,i,n,s,o,a,l,c){if(s!==null&&!s.isDirectory())if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=!1;s===null&&(t.push(async()=>{try{await i.mkdirPromise(n,{mode:l.mode})}catch(f){if(f.code!=="EEXIST")throw f}}),u=!0);let g=await o.readdirPromise(a);if(c.stableSort)for(let f of g.sort())await ob(t,e,r,i,i.pathUtils.join(n,f),o,o.pathUtils.join(a,f),c)&&(u=!0);else(await Promise.all(g.map(async h=>{await ob(t,e,r,i,i.pathUtils.join(n,h),o,o.pathUtils.join(a,h),c)}))).some(h=>h)&&(u=!0);return u}var ab=new WeakMap;function Ab(t,e,r,i,n){return async()=>{await t.linkPromise(r,e),n===eh.ReadOnly&&(i.mode&=~146,await t.chmodPromise(e,i.mode))}}function the(t,e,r,i,n){let s=ab.get(t);return typeof s=="undefined"?async()=>{try{await t.copyFilePromise(r,e,mE.default.constants.COPYFILE_FICLONE_FORCE),ab.set(t,!0)}catch(o){if(o.code==="ENOSYS"||o.code==="ENOTSUP")ab.set(t,!1),await Ab(t,e,r,i,n)();else throw o}}:s?async()=>t.copyFilePromise(r,e,mE.default.constants.COPYFILE_FICLONE_FORCE):Ab(t,e,r,i,n)}async function $fe(t,e,r,i,n,s,o,a,l,c){var f;if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;let u=(f=c.linkStrategy)!=null?f:null,g=i===o?u!==null?the(i,n,a,l,u):async()=>i.copyFilePromise(a,n,mE.default.constants.COPYFILE_FICLONE):u!==null?Ab(i,n,a,l,u):async()=>i.writeFilePromise(n,await o.readFilePromise(a));return t.push(async()=>g()),!0}async function ehe(t,e,r,i,n,s,o,a,l,c){if(s!==null)if(c.overwrite)t.push(async()=>i.removePromise(n)),s=null;else return!1;return t.push(async()=>{await i.symlinkPromise(CE(i.pathUtils,await o.readlinkPromise(a)),n)}),!0}function qn(t,e){return Object.assign(new Error(`${t}: ${e}`),{code:t})}function IE(t){return qn("EBUSY",t)}function th(t,e){return qn("ENOSYS",`${t}, ${e}`)}function $a(t){return qn("EINVAL",`invalid argument, ${t}`)}function Hi(t){return qn("EBADF",`bad file descriptor, ${t}`)}function bs(t){return qn("ENOENT",`no such file or directory, ${t}`)}function eo(t){return qn("ENOTDIR",`not a directory, ${t}`)}function rh(t){return qn("EISDIR",`illegal operation on a directory, ${t}`)}function yE(t){return qn("EEXIST",`file already exists, ${t}`)}function ln(t){return qn("EROFS",`read-only filesystem, ${t}`)}function dO(t){return qn("ENOTEMPTY",`directory not empty, ${t}`)}function CO(t){return qn("EOPNOTSUPP",`operation not supported, ${t}`)}function mO(){return qn("ERR_DIR_CLOSED","Directory handle was closed")}var lb=class extends Error{constructor(e,r){super(e);this.name="Libzip Error",this.code=r}};var EO=class{constructor(e,r,i={}){this.path=e;this.nextDirent=r;this.opts=i;this.closed=!1}throwIfClosed(){if(this.closed)throw mO()}async*[Symbol.asyncIterator](){try{let e;for(;(e=await this.read())!==null;)yield e}finally{await this.close()}}read(e){let r=this.readSync();return typeof e!="undefined"?e(null,r):Promise.resolve(r)}readSync(){return this.throwIfClosed(),this.nextDirent()}close(e){return this.closeSync(),typeof e!="undefined"?e(null):Promise.resolve()}closeSync(){var e,r;this.throwIfClosed(),(r=(e=this.opts).onClose)==null||r.call(e),this.closed=!0}};function wE(t,e,r,i){let n=()=>{let s=r.shift();return typeof s=="undefined"?null:Object.assign(t.statSync(t.pathUtils.join(e,s)),{name:s})};return new EO(e,n,i)}var IO=ie(require("os"));var eA=class{constructor(e){this.pathUtils=e}async*genTraversePromise(e,{stableSort:r=!1}={}){let i=[e];for(;i.length>0;){let n=i.shift();if((await this.lstatPromise(n)).isDirectory()){let o=await this.readdirPromise(n);if(r)for(let a of o.sort())i.push(this.pathUtils.join(n,a));else throw new Error("Not supported")}else yield n}}async removePromise(e,{recursive:r=!0,maxRetries:i=5}={}){let n;try{n=await this.lstatPromise(e)}catch(s){if(s.code==="ENOENT")return;throw s}if(n.isDirectory()){if(r){let o=await this.readdirPromise(e);await Promise.all(o.map(a=>this.removePromise(this.pathUtils.resolve(e,a))))}let s=0;do try{await this.rmdirPromise(e);break}catch(o){if(o.code==="EBUSY"||o.code==="ENOTEMPTY"){if(i===0)break;await new Promise(a=>setTimeout(a,s*100));continue}else throw o}while(s++{let l;try{[l]=await this.readJsonPromise(i)}catch(c){return Date.now()-s<500}try{return process.kill(l,0),!0}catch(c){return!1}};for(;o===null;)try{o=await this.openPromise(i,"wx")}catch(l){if(l.code==="EEXIST"){if(!await a())try{await this.unlinkPromise(i);continue}catch(c){}if(Date.now()-s<60*1e3)await new Promise(c=>setTimeout(c,n));else throw new Error(`Couldn't acquire a lock in a reasonable time (via ${i})`)}else throw l}await this.writePromise(o,JSON.stringify([process.pid]));try{return await r()}finally{try{await this.closePromise(o),await this.unlinkPromise(i)}catch(l){}}}async readJsonPromise(e){let r=await this.readFilePromise(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}readJsonSync(e){let r=this.readFileSync(e,"utf8");try{return JSON.parse(r)}catch(i){throw i.message+=` (in ${e})`,i}}async writeJsonPromise(e,r){return await this.writeFilePromise(e,`${JSON.stringify(r,null,2)} +`)}writeJsonSync(e,r){return this.writeFileSync(e,`${JSON.stringify(r,null,2)} +`)}async preserveTimePromise(e,r){let i=await this.lstatPromise(e),n=await r();typeof n!="undefined"&&(e=n),this.lutimesPromise?await this.lutimesPromise(e,i.atime,i.mtime):i.isSymbolicLink()||await this.utimesPromise(e,i.atime,i.mtime)}async preserveTimeSync(e,r){let i=this.lstatSync(e),n=r();typeof n!="undefined"&&(e=n),this.lutimesSync?this.lutimesSync(e,i.atime,i.mtime):i.isSymbolicLink()||this.utimesSync(e,i.atime,i.mtime)}},gl=class extends eA{constructor(){super(v)}};function rhe(t){let e=t.match(/\r?\n/g);if(e===null)return IO.EOL;let r=e.filter(n=>n===`\r +`).length,i=e.length-r;return r>i?`\r +`:` +`}function ul(t,e){return e.replace(/\r?\n/g,rhe(t))}var $c=ie(require("fs")),cb=ie(require("stream")),QO=ie(require("util")),ub=ie(require("zlib"));var yO=ie(require("fs"));var Wt=class extends gl{constructor(e=yO.default){super();this.realFs=e,typeof this.realFs.lutimes!="undefined"&&(this.lutimesPromise=this.lutimesPromiseImpl,this.lutimesSync=this.lutimesSyncImpl)}getExtractHint(){return!1}getRealPath(){return Se.root}resolve(e){return v.resolve(e)}async openPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.open(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}openSync(e,r,i){return this.realFs.openSync(M.fromPortablePath(e),r,i)}async opendirPromise(e,r){return await new Promise((i,n)=>{typeof r!="undefined"?this.realFs.opendir(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.opendir(M.fromPortablePath(e),this.makeCallback(i,n))}).then(i=>Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0}))}opendirSync(e,r){let i=typeof r!="undefined"?this.realFs.opendirSync(M.fromPortablePath(e),r):this.realFs.opendirSync(M.fromPortablePath(e));return Object.defineProperty(i,"path",{value:e,configurable:!0,writable:!0})}async readPromise(e,r,i=0,n=0,s=-1){return await new Promise((o,a)=>{this.realFs.read(e,r,i,n,s,(l,c)=>{l?a(l):o(c)})})}readSync(e,r,i,n,s){return this.realFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return await new Promise((o,a)=>typeof r=="string"?this.realFs.write(e,r,i,this.makeCallback(o,a)):this.realFs.write(e,r,i,n,s,this.makeCallback(o,a)))}writeSync(e,r,i,n,s){return typeof r=="string"?this.realFs.writeSync(e,r,i):this.realFs.writeSync(e,r,i,n,s)}async closePromise(e){await new Promise((r,i)=>{this.realFs.close(e,this.makeCallback(r,i))})}closeSync(e){this.realFs.closeSync(e)}createReadStream(e,r){let i=e!==null?M.fromPortablePath(e):e;return this.realFs.createReadStream(i,r)}createWriteStream(e,r){let i=e!==null?M.fromPortablePath(e):e;return this.realFs.createWriteStream(i,r)}async realpathPromise(e){return await new Promise((r,i)=>{this.realFs.realpath(M.fromPortablePath(e),{},this.makeCallback(r,i))}).then(r=>M.toPortablePath(r))}realpathSync(e){return M.toPortablePath(this.realFs.realpathSync(M.fromPortablePath(e),{}))}async existsPromise(e){return await new Promise(r=>{this.realFs.exists(M.fromPortablePath(e),r)})}accessSync(e,r){return this.realFs.accessSync(M.fromPortablePath(e),r)}async accessPromise(e,r){return await new Promise((i,n)=>{this.realFs.access(M.fromPortablePath(e),r,this.makeCallback(i,n))})}existsSync(e){return this.realFs.existsSync(M.fromPortablePath(e))}async statPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.stat(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.stat(M.fromPortablePath(e),this.makeCallback(i,n))})}statSync(e,r){return r?this.realFs.statSync(M.fromPortablePath(e),r):this.realFs.statSync(M.fromPortablePath(e))}async fstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.fstat(e,r,this.makeCallback(i,n)):this.realFs.fstat(e,this.makeCallback(i,n))})}fstatSync(e,r){return r?this.realFs.fstatSync(e,r):this.realFs.fstatSync(e)}async lstatPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.lstat(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.lstat(M.fromPortablePath(e),this.makeCallback(i,n))})}lstatSync(e,r){return r?this.realFs.lstatSync(M.fromPortablePath(e),r):this.realFs.lstatSync(M.fromPortablePath(e))}async chmodPromise(e,r){return await new Promise((i,n)=>{this.realFs.chmod(M.fromPortablePath(e),r,this.makeCallback(i,n))})}chmodSync(e,r){return this.realFs.chmodSync(M.fromPortablePath(e),r)}async chownPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.chown(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}chownSync(e,r,i){return this.realFs.chownSync(M.fromPortablePath(e),r,i)}async renamePromise(e,r){return await new Promise((i,n)=>{this.realFs.rename(M.fromPortablePath(e),M.fromPortablePath(r),this.makeCallback(i,n))})}renameSync(e,r){return this.realFs.renameSync(M.fromPortablePath(e),M.fromPortablePath(r))}async copyFilePromise(e,r,i=0){return await new Promise((n,s)=>{this.realFs.copyFile(M.fromPortablePath(e),M.fromPortablePath(r),i,this.makeCallback(n,s))})}copyFileSync(e,r,i=0){return this.realFs.copyFileSync(M.fromPortablePath(e),M.fromPortablePath(r),i)}async appendFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.appendFile(o,r,i,this.makeCallback(n,s)):this.realFs.appendFile(o,r,this.makeCallback(n,s))})}appendFileSync(e,r,i){let n=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.appendFileSync(n,r,i):this.realFs.appendFileSync(n,r)}async writeFilePromise(e,r,i){return await new Promise((n,s)=>{let o=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.writeFile(o,r,i,this.makeCallback(n,s)):this.realFs.writeFile(o,r,this.makeCallback(n,s))})}writeFileSync(e,r,i){let n=typeof e=="string"?M.fromPortablePath(e):e;i?this.realFs.writeFileSync(n,r,i):this.realFs.writeFileSync(n,r)}async unlinkPromise(e){return await new Promise((r,i)=>{this.realFs.unlink(M.fromPortablePath(e),this.makeCallback(r,i))})}unlinkSync(e){return this.realFs.unlinkSync(M.fromPortablePath(e))}async utimesPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.utimes(M.fromPortablePath(e),r,i,this.makeCallback(n,s))})}utimesSync(e,r,i){this.realFs.utimesSync(M.fromPortablePath(e),r,i)}async lutimesPromiseImpl(e,r,i){let n=this.realFs.lutimes;if(typeof n=="undefined")throw th("unavailable Node binding",`lutimes '${e}'`);return await new Promise((s,o)=>{n.call(this.realFs,M.fromPortablePath(e),r,i,this.makeCallback(s,o))})}lutimesSyncImpl(e,r,i){let n=this.realFs.lutimesSync;if(typeof n=="undefined")throw th("unavailable Node binding",`lutimes '${e}'`);n.call(this.realFs,M.fromPortablePath(e),r,i)}async mkdirPromise(e,r){return await new Promise((i,n)=>{this.realFs.mkdir(M.fromPortablePath(e),r,this.makeCallback(i,n))})}mkdirSync(e,r){return this.realFs.mkdirSync(M.fromPortablePath(e),r)}async rmdirPromise(e,r){return await new Promise((i,n)=>{r?this.realFs.rmdir(M.fromPortablePath(e),r,this.makeCallback(i,n)):this.realFs.rmdir(M.fromPortablePath(e),this.makeCallback(i,n))})}rmdirSync(e,r){return this.realFs.rmdirSync(M.fromPortablePath(e),r)}async linkPromise(e,r){return await new Promise((i,n)=>{this.realFs.link(M.fromPortablePath(e),M.fromPortablePath(r),this.makeCallback(i,n))})}linkSync(e,r){return this.realFs.linkSync(M.fromPortablePath(e),M.fromPortablePath(r))}async symlinkPromise(e,r,i){return await new Promise((n,s)=>{this.realFs.symlink(M.fromPortablePath(e.replace(/\/+$/,"")),M.fromPortablePath(r),i,this.makeCallback(n,s))})}symlinkSync(e,r,i){return this.realFs.symlinkSync(M.fromPortablePath(e.replace(/\/+$/,"")),M.fromPortablePath(r),i)}async readFilePromise(e,r){return await new Promise((i,n)=>{let s=typeof e=="string"?M.fromPortablePath(e):e;this.realFs.readFile(s,r,this.makeCallback(i,n))})}readFileSync(e,r){let i=typeof e=="string"?M.fromPortablePath(e):e;return this.realFs.readFileSync(i,r)}async readdirPromise(e,r){return await new Promise((i,n)=>{(r==null?void 0:r.withFileTypes)?this.realFs.readdir(M.fromPortablePath(e),{withFileTypes:!0},this.makeCallback(i,n)):this.realFs.readdir(M.fromPortablePath(e),this.makeCallback(s=>i(s),n))})}readdirSync(e,r){return(r==null?void 0:r.withFileTypes)?this.realFs.readdirSync(M.fromPortablePath(e),{withFileTypes:!0}):this.realFs.readdirSync(M.fromPortablePath(e))}async readlinkPromise(e){return await new Promise((r,i)=>{this.realFs.readlink(M.fromPortablePath(e),this.makeCallback(r,i))}).then(r=>M.toPortablePath(r))}readlinkSync(e){return M.toPortablePath(this.realFs.readlinkSync(M.fromPortablePath(e)))}async truncatePromise(e,r){return await new Promise((i,n)=>{this.realFs.truncate(M.fromPortablePath(e),r,this.makeCallback(i,n))})}truncateSync(e,r){return this.realFs.truncateSync(M.fromPortablePath(e),r)}watch(e,r,i){return this.realFs.watch(M.fromPortablePath(e),r,i)}watchFile(e,r,i){return this.realFs.watchFile(M.fromPortablePath(e),r,i)}unwatchFile(e,r){return this.realFs.unwatchFile(M.fromPortablePath(e),r)}makeCallback(e,r){return(i,n)=>{i?r(i):e(n)}}};var wO=ie(require("events"));var fl;(function(r){r.Change="change",r.Stop="stop"})(fl||(fl={}));var hl;(function(i){i.Ready="ready",i.Running="running",i.Stopped="stopped"})(hl||(hl={}));function BO(t,e){if(t!==e)throw new Error(`Invalid StatWatcher status: expected '${e}', got '${t}'`)}var ih=class extends wO.EventEmitter{constructor(e,r,{bigint:i=!1}={}){super();this.status=hl.Ready;this.changeListeners=new Map;this.startTimeout=null;this.fakeFs=e,this.path=r,this.bigint=i,this.lastStats=this.stat()}static create(e,r,i){let n=new ih(e,r,i);return n.start(),n}start(){BO(this.status,hl.Ready),this.status=hl.Running,this.startTimeout=setTimeout(()=>{this.startTimeout=null,this.fakeFs.existsSync(this.path)||this.emit(fl.Change,this.lastStats,this.lastStats)},3)}stop(){BO(this.status,hl.Running),this.status=hl.Stopped,this.startTimeout!==null&&(clearTimeout(this.startTimeout),this.startTimeout=null),this.emit(fl.Stop)}stat(){try{return this.fakeFs.statSync(this.path,{bigint:this.bigint})}catch(e){let r=this.bigint?new Xf:new Za;return pE(r)}}makeInterval(e){let r=setInterval(()=>{let i=this.stat(),n=this.lastStats;nb(i,n)||(this.lastStats=i,this.emit(fl.Change,i,n))},e.interval);return e.persistent?r:r.unref()}registerChangeListener(e,r){this.addListener(fl.Change,e),this.changeListeners.set(e,this.makeInterval(r))}unregisterChangeListener(e){this.removeListener(fl.Change,e);let r=this.changeListeners.get(e);typeof r!="undefined"&&clearInterval(r),this.changeListeners.delete(e)}unregisterAllChangeListeners(){for(let e of this.changeListeners.keys())this.unregisterChangeListener(e)}hasChangeListeners(){return this.changeListeners.size>0}ref(){for(let e of this.changeListeners.values())e.ref();return this}unref(){for(let e of this.changeListeners.values())e.unref();return this}};var BE=new WeakMap;function QE(t,e,r,i){let n,s,o,a;switch(typeof r){case"function":n=!1,s=!0,o=5007,a=r;break;default:({bigint:n=!1,persistent:s=!0,interval:o=5007}=r),a=i;break}let l=BE.get(t);typeof l=="undefined"&&BE.set(t,l=new Map);let c=l.get(e);return typeof c=="undefined"&&(c=ih.create(t,e,{bigint:n}),l.set(e,c)),c.registerChangeListener(a,{persistent:s,interval:o}),c}function nh(t,e,r){let i=BE.get(t);if(typeof i=="undefined")return;let n=i.get(e);typeof n!="undefined"&&(typeof r=="undefined"?n.unregisterAllChangeListeners():n.unregisterChangeListener(r),n.hasChangeListeners()||(n.stop(),i.delete(e)))}function sh(t){let e=BE.get(t);if(typeof e!="undefined")for(let r of e.keys())nh(t,r)}var pl="mixed";function ihe(t){if(typeof t=="string"&&String(+t)===t)return+t;if(Number.isFinite(t))return t<0?Date.now()/1e3:t;if((0,QO.isDate)(t))return t.getTime()/1e3;throw new Error("Invalid time")}function bO(){return Buffer.from([80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0])}var Jr=class extends gl{constructor(e,r){super();this.lzSource=null;this.listings=new Map;this.entries=new Map;this.fileSources=new Map;this.fds=new Map;this.nextFd=0;this.ready=!1;this.readOnly=!1;this.libzip=r.libzip;let i=r;if(this.level=typeof i.level!="undefined"?i.level:pl,e!=null||(e=bO()),typeof e=="string"){let{baseFs:o=new Wt}=i;this.baseFs=o,this.path=e}else this.path=null,this.baseFs=null;if(r.stats)this.stats=r.stats;else if(typeof e=="string")try{this.stats=this.baseFs.statSync(e)}catch(o){if(o.code==="ENOENT"&&i.create)this.stats=Zf();else throw o}else this.stats=Zf();let n=this.libzip.malloc(4);try{let o=0;if(typeof e=="string"&&i.create&&(o|=this.libzip.ZIP_CREATE|this.libzip.ZIP_TRUNCATE),r.readOnly&&(o|=this.libzip.ZIP_RDONLY,this.readOnly=!0),typeof e=="string")this.zip=this.libzip.open(M.fromPortablePath(e),o,n);else{let a=this.allocateUnattachedSource(e);try{this.zip=this.libzip.openFromSource(a,o,n),this.lzSource=a}catch(l){throw this.libzip.source.free(a),l}}if(this.zip===0){let a=this.libzip.struct.errorS();throw this.libzip.error.initWithCode(a,this.libzip.getValue(n,"i32")),this.makeLibzipError(a)}}finally{this.libzip.free(n)}this.listings.set(Se.root,new Set);let s=this.libzip.getNumEntries(this.zip,0);for(let o=0;oe)throw new Error("Overread");let n=this.libzip.HEAPU8.subarray(r,r+e);return Buffer.from(n)}finally{this.libzip.free(r)}}finally{this.libzip.source.close(this.lzSource),this.libzip.source.free(this.lzSource),this.ready=!1}}prepareClose(){if(!this.ready)throw IE("archive closed, close");sh(this)}saveAndClose(){if(!this.path||!this.baseFs)throw new Error("ZipFS cannot be saved and must be discarded when loaded from a buffer");if(this.prepareClose(),this.readOnly){this.discardAndClose();return}let e=this.baseFs.existsSync(this.path)||this.stats.mode===_f?void 0:this.stats.mode;if(this.entries.size===0)this.discardAndClose(),this.baseFs.writeFileSync(this.path,bO(),{mode:e});else{if(this.libzip.close(this.zip)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));typeof e!="undefined"&&this.baseFs.chmodSync(this.path,e)}this.ready=!1}discardAndClose(){this.prepareClose(),this.libzip.discard(this.zip),this.ready=!1}resolve(e){return v.resolve(Se.root,e)}async openPromise(e,r,i){return this.openSync(e,r,i)}openSync(e,r,i){let n=this.nextFd++;return this.fds.set(n,{cursor:0,p:e}),n}hasOpenFileHandles(){return!!this.fds.size}async opendirPromise(e,r){return this.opendirSync(e,r)}opendirSync(e,r={}){let i=this.resolveFilename(`opendir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`opendir '${e}'`);let n=this.listings.get(i);if(!n)throw eo(`opendir '${e}'`);let s=[...n],o=this.openSync(i,"r");return wE(this,i,s,{onClose:()=>{this.closeSync(o)}})}async readPromise(e,r,i,n,s){return this.readSync(e,r,i,n,s)}readSync(e,r,i=0,n=r.byteLength,s=-1){let o=this.fds.get(e);if(typeof o=="undefined")throw Hi("read");let a;s===-1||s===null?a=o.cursor:a=s;let l=this.readFileSync(o.p);l.copy(r,i,a,a+n);let c=Math.max(0,Math.min(l.length-a,n));return(s===-1||s===null)&&(o.cursor+=c),c}async writePromise(e,r,i,n,s){return typeof r=="string"?this.writeSync(e,r,s):this.writeSync(e,r,i,n,s)}writeSync(e,r,i,n,s){throw typeof this.fds.get(e)=="undefined"?Hi("read"):new Error("Unimplemented")}async closePromise(e){return this.closeSync(e)}closeSync(e){if(typeof this.fds.get(e)=="undefined")throw Hi("read");this.fds.delete(e)}createReadStream(e,{encoding:r}={}){if(e===null)throw new Error("Unimplemented");let i=this.openSync(e,"r"),n=Object.assign(new cb.PassThrough({emitClose:!0,autoDestroy:!0,destroy:(o,a)=>{clearImmediate(s),this.closeSync(i),a(o)}}),{close(){n.destroy()},bytesRead:0,path:e}),s=setImmediate(async()=>{try{let o=await this.readFilePromise(e,r);n.bytesRead=o.length,n.end(o)}catch(o){n.destroy(o)}});return n}createWriteStream(e,{encoding:r}={}){if(this.readOnly)throw ln(`open '${e}'`);if(e===null)throw new Error("Unimplemented");let i=[],n=this.openSync(e,"w"),s=Object.assign(new cb.PassThrough({autoDestroy:!0,emitClose:!0,destroy:(o,a)=>{try{o?a(o):(this.writeFileSync(e,Buffer.concat(i),r),a(null))}catch(l){a(l)}finally{this.closeSync(n)}}}),{bytesWritten:0,path:e,close(){s.destroy()}});return s.on("data",o=>{let a=Buffer.from(o);s.bytesWritten+=a.length,i.push(a)}),s}async realpathPromise(e){return this.realpathSync(e)}realpathSync(e){let r=this.resolveFilename(`lstat '${e}'`,e);if(!this.entries.has(r)&&!this.listings.has(r))throw bs(`lstat '${e}'`);return r}async existsPromise(e){return this.existsSync(e)}existsSync(e){if(!this.ready)throw IE(`archive closed, existsSync '${e}'`);if(this.symlinkCount===0){let i=v.resolve(Se.root,e);return this.entries.has(i)||this.listings.has(i)}let r;try{r=this.resolveFilename(`stat '${e}'`,e)}catch(i){return!1}return this.entries.has(r)||this.listings.has(r)}async accessPromise(e,r){return this.accessSync(e,r)}accessSync(e,r=$c.constants.F_OK){let i=this.resolveFilename(`access '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`access '${e}'`);if(this.readOnly&&r&$c.constants.W_OK)throw ln(`access '${e}'`)}async statPromise(e,r){return this.statSync(e,r)}statSync(e,r){let i=this.resolveFilename(`stat '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`stat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`stat '${e}'`);return this.statImpl(`stat '${e}'`,i,r)}async fstatPromise(e,r){return this.fstatSync(e,r)}fstatSync(e,r){let i=this.fds.get(e);if(typeof i=="undefined")throw Hi("fstatSync");let{p:n}=i,s=this.resolveFilename(`stat '${n}'`,n);if(!this.entries.has(s)&&!this.listings.has(s))throw bs(`stat '${n}'`);if(n[n.length-1]==="/"&&!this.listings.has(s))throw eo(`stat '${n}'`);return this.statImpl(`fstat '${n}'`,s,r)}async lstatPromise(e,r){return this.lstatSync(e,r)}lstatSync(e,r){let i=this.resolveFilename(`lstat '${e}'`,e,!1);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`lstat '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`lstat '${e}'`);return this.statImpl(`lstat '${e}'`,i,r)}statImpl(e,r,i={}){let n=this.entries.get(r);if(typeof n!="undefined"){let s=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,n,0,0,s)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let a=this.stats.uid,l=this.stats.gid,c=this.libzip.struct.statSize(s)>>>0,u=512,g=Math.ceil(c/u),f=(this.libzip.struct.statMtime(s)>>>0)*1e3,h=f,p=f,d=f,m=new Date(h),I=new Date(p),B=new Date(d),b=new Date(f),R=this.listings.has(r)?zo:this.isSymbolicLink(n)?_o:Vo,H=R===zo?493:420,L=R|this.getUnixMode(n,H)&511,K=this.libzip.struct.statCrc(s),J=Object.assign(new Za,{uid:a,gid:l,size:c,blksize:u,blocks:g,atime:m,birthtime:I,ctime:B,mtime:b,atimeMs:h,birthtimeMs:p,ctimeMs:d,mtimeMs:f,mode:L,crc:K});return i.bigint===!0?dE(J):J}if(this.listings.has(r)){let s=this.stats.uid,o=this.stats.gid,a=0,l=512,c=0,u=this.stats.mtimeMs,g=this.stats.mtimeMs,f=this.stats.mtimeMs,h=this.stats.mtimeMs,p=new Date(u),d=new Date(g),m=new Date(f),I=new Date(h),B=zo|493,b=0,R=Object.assign(new Za,{uid:s,gid:o,size:a,blksize:l,blocks:c,atime:p,birthtime:d,ctime:m,mtime:I,atimeMs:u,birthtimeMs:g,ctimeMs:f,mtimeMs:h,mode:B,crc:b});return i.bigint===!0?dE(R):R}throw new Error("Unreachable")}getUnixMode(e,r){if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?r:this.libzip.getValue(this.libzip.uint32S,"i32")>>>16}registerListing(e){let r=this.listings.get(e);if(r)return r;let i=this.registerListing(v.dirname(e));return r=new Set,i.add(v.basename(e)),this.listings.set(e,r),r}registerEntry(e,r){this.registerListing(v.dirname(e)).add(v.basename(e)),this.entries.set(e,r)}unregisterListing(e){this.listings.delete(e);let r=this.listings.get(v.dirname(e));r==null||r.delete(v.basename(e))}unregisterEntry(e){this.unregisterListing(e);let r=this.entries.get(e);this.entries.delete(e),typeof r!="undefined"&&(this.fileSources.delete(r),this.isSymbolicLink(r)&&this.symlinkCount--)}deleteEntry(e,r){if(this.unregisterEntry(e),this.libzip.delete(this.zip,r)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}resolveFilename(e,r,i=!0){if(!this.ready)throw IE(`archive closed, ${e}`);let n=v.resolve(Se.root,r);if(n==="/")return Se.root;let s=this.entries.get(n);if(i&&s!==void 0)if(this.symlinkCount!==0&&this.isSymbolicLink(s)){let o=this.getFileSource(s).toString();return this.resolveFilename(e,v.resolve(v.dirname(n),o),!0)}else return n;for(;;){let o=this.resolveFilename(e,v.dirname(n),!0),a=this.listings.has(o),l=this.entries.has(o);if(!a&&!l)throw bs(e);if(!a)throw eo(e);if(n=v.resolve(o,v.basename(n)),!i||this.symlinkCount===0)break;let c=this.libzip.name.locate(this.zip,n.slice(1));if(c===-1)break;if(this.isSymbolicLink(c)){let u=this.getFileSource(c).toString();n=v.resolve(v.dirname(n),u)}else break}return n}allocateBuffer(e){Buffer.isBuffer(e)||(e=Buffer.from(e));let r=this.libzip.malloc(e.byteLength);if(!r)throw new Error("Couldn't allocate enough memory");return new Uint8Array(this.libzip.HEAPU8.buffer,r,e.byteLength).set(e),{buffer:r,byteLength:e.byteLength}}allocateUnattachedSource(e){let r=this.libzip.struct.errorS(),{buffer:i,byteLength:n}=this.allocateBuffer(e),s=this.libzip.source.fromUnattachedBuffer(i,n,0,!0,r);if(s===0)throw this.libzip.free(r),this.makeLibzipError(r);return s}allocateSource(e){let{buffer:r,byteLength:i}=this.allocateBuffer(e),n=this.libzip.source.fromBuffer(this.zip,r,i,0,!0);if(n===0)throw this.libzip.free(r),this.makeLibzipError(this.libzip.getError(this.zip));return n}setFileSource(e,r){let i=Buffer.isBuffer(r)?r:Buffer.from(r),n=v.relative(Se.root,e),s=this.allocateSource(r);try{let o=this.libzip.file.add(this.zip,n,s,this.libzip.ZIP_FL_OVERWRITE);if(o===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));if(this.level!=="mixed"){let a;if(this.level===0?a=this.libzip.ZIP_CM_STORE:a=this.libzip.ZIP_CM_DEFLATE,this.libzip.file.setCompression(this.zip,o,0,a,this.level)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}return this.fileSources.set(o,i),o}catch(o){throw this.libzip.source.free(s),o}}isSymbolicLink(e){if(this.symlinkCount===0)return!1;if(this.libzip.file.getExternalAttributes(this.zip,e,0,0,this.libzip.uint08S,this.libzip.uint32S)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.libzip.getValue(this.libzip.uint08S,"i8")>>>0!==this.libzip.ZIP_OPSYS_UNIX?!1:(this.libzip.getValue(this.libzip.uint32S,"i32")>>>16&kn)===_o}getFileSource(e,r={asyncDecompress:!1}){let i=this.fileSources.get(e);if(typeof i!="undefined")return i;let n=this.libzip.struct.statS();if(this.libzip.statIndex(this.zip,e,0,0,n)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));let o=this.libzip.struct.statCompSize(n),a=this.libzip.struct.statCompMethod(n),l=this.libzip.malloc(o);try{let c=this.libzip.fopenIndex(this.zip,e,0,this.libzip.ZIP_FL_COMPRESSED);if(c===0)throw this.makeLibzipError(this.libzip.getError(this.zip));try{let u=this.libzip.fread(c,l,o,0);if(u===-1)throw this.makeLibzipError(this.libzip.file.getError(c));if(uo)throw new Error("Overread");let g=this.libzip.HEAPU8.subarray(l,l+o),f=Buffer.from(g);if(a===0)return this.fileSources.set(e,f),f;if(r.asyncDecompress)return new Promise((h,p)=>{ub.default.inflateRaw(f,(d,m)=>{d?p(d):(this.fileSources.set(e,m),h(m))})});{let h=ub.default.inflateRawSync(f);return this.fileSources.set(e,h),h}}finally{this.libzip.fclose(c)}}finally{this.libzip.free(l)}}async chmodPromise(e,r){return this.chmodSync(e,r)}chmodSync(e,r){if(this.readOnly)throw ln(`chmod '${e}'`);r&=493;let i=this.resolveFilename(`chmod '${e}'`,e,!1),n=this.entries.get(i);if(typeof n=="undefined")throw new Error(`Assertion failed: The entry should have been registered (${i})`);let o=this.getUnixMode(n,Vo|0)&~511|r;if(this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,o<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async chownPromise(e,r,i){return this.chownSync(e,r,i)}chownSync(e,r,i){throw new Error("Unimplemented")}async renamePromise(e,r){return this.renameSync(e,r)}renameSync(e,r){throw new Error("Unimplemented")}async copyFilePromise(e,r,i){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=await this.getFileSource(n,{asyncDecompress:!0}),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}copyFileSync(e,r,i=0){let{indexSource:n,indexDest:s,resolvedDestP:o}=this.prepareCopyFile(e,r,i),a=this.getFileSource(n),l=this.setFileSource(o,a);l!==s&&this.registerEntry(o,l)}prepareCopyFile(e,r,i=0){if(this.readOnly)throw ln(`copyfile '${e} -> '${r}'`);if((i&$c.constants.COPYFILE_FICLONE_FORCE)!=0)throw th("unsupported clone operation",`copyfile '${e}' -> ${r}'`);let n=this.resolveFilename(`copyfile '${e} -> ${r}'`,e),s=this.entries.get(n);if(typeof s=="undefined")throw $a(`copyfile '${e}' -> '${r}'`);let o=this.resolveFilename(`copyfile '${e}' -> ${r}'`,r),a=this.entries.get(o);if((i&($c.constants.COPYFILE_EXCL|$c.constants.COPYFILE_FICLONE_FORCE))!=0&&typeof a!="undefined")throw yE(`copyfile '${e}' -> '${r}'`);return{indexSource:s,resolvedDestP:o,indexDest:a}}async appendFilePromise(e,r,i){if(this.readOnly)throw ln(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=P({flag:"a"},i)),this.writeFilePromise(e,r,i)}appendFileSync(e,r,i={}){if(this.readOnly)throw ln(`open '${e}'`);return typeof i=="undefined"?i={flag:"a"}:typeof i=="string"?i={flag:"a",encoding:i}:typeof i.flag=="undefined"&&(i=P({flag:"a"},i)),this.writeFileSync(e,r,i)}fdToPath(e,r){var n;let i=(n=this.fds.get(e))==null?void 0:n.p;if(typeof i=="undefined")throw Hi(r);return i}async writeFilePromise(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([await this.getFileSource(o,{asyncDecompress:!0}),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&await this.chmodPromise(a,s)}writeFileSync(e,r,i){let{encoding:n,mode:s,index:o,resolvedP:a}=this.prepareWriteFile(e,i);o!==void 0&&typeof i=="object"&&i.flag&&i.flag.includes("a")&&(r=Buffer.concat([this.getFileSource(o),Buffer.from(r)])),n!==null&&(r=r.toString(n));let l=this.setFileSource(a,r);l!==o&&this.registerEntry(a,l),s!==null&&this.chmodSync(a,s)}prepareWriteFile(e,r){if(typeof e=="number"&&(e=this.fdToPath(e,"read")),this.readOnly)throw ln(`open '${e}'`);let i=this.resolveFilename(`open '${e}'`,e);if(this.listings.has(i))throw rh(`open '${e}'`);let n=null,s=null;typeof r=="string"?n=r:typeof r=="object"&&({encoding:n=null,mode:s=null}=r);let o=this.entries.get(i);return{encoding:n,mode:s,resolvedP:i,index:o}}async unlinkPromise(e){return this.unlinkSync(e)}unlinkSync(e){if(this.readOnly)throw ln(`unlink '${e}'`);let r=this.resolveFilename(`unlink '${e}'`,e);if(this.listings.has(r))throw rh(`unlink '${e}'`);let i=this.entries.get(r);if(typeof i=="undefined")throw $a(`unlink '${e}'`);this.deleteEntry(r,i)}async utimesPromise(e,r,i){return this.utimesSync(e,r,i)}utimesSync(e,r,i){if(this.readOnly)throw ln(`utimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e);this.utimesImpl(n,i)}async lutimesPromise(e,r,i){return this.lutimesSync(e,r,i)}lutimesSync(e,r,i){if(this.readOnly)throw ln(`lutimes '${e}'`);let n=this.resolveFilename(`utimes '${e}'`,e,!1);this.utimesImpl(n,i)}utimesImpl(e,r){this.listings.has(e)&&(this.entries.has(e)||this.hydrateDirectory(e));let i=this.entries.get(e);if(i===void 0)throw new Error("Unreachable");if(this.libzip.file.setMtime(this.zip,i,0,ihe(r),0)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip))}async mkdirPromise(e,r){return this.mkdirSync(e,r)}mkdirSync(e,{mode:r=493,recursive:i=!1}={}){if(i){this.mkdirpSync(e,{chmod:r});return}if(this.readOnly)throw ln(`mkdir '${e}'`);let n=this.resolveFilename(`mkdir '${e}'`,e);if(this.entries.has(n)||this.listings.has(n))throw yE(`mkdir '${e}'`);this.hydrateDirectory(n),this.chmodSync(n,r)}async rmdirPromise(e,r){return this.rmdirSync(e,r)}rmdirSync(e,{recursive:r=!1}={}){if(this.readOnly)throw ln(`rmdir '${e}'`);if(r){this.removeSync(e);return}let i=this.resolveFilename(`rmdir '${e}'`,e),n=this.listings.get(i);if(!n)throw eo(`rmdir '${e}'`);if(n.size>0)throw dO(`rmdir '${e}'`);let s=this.entries.get(i);if(typeof s=="undefined")throw $a(`rmdir '${e}'`);this.deleteEntry(e,s)}hydrateDirectory(e){let r=this.libzip.dir.add(this.zip,v.relative(Se.root,e));if(r===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));return this.registerListing(e),this.registerEntry(e,r),r}async linkPromise(e,r){return this.linkSync(e,r)}linkSync(e,r){throw CO(`link '${e}' -> '${r}'`)}async symlinkPromise(e,r){return this.symlinkSync(e,r)}symlinkSync(e,r){if(this.readOnly)throw ln(`symlink '${e}' -> '${r}'`);let i=this.resolveFilename(`symlink '${e}' -> '${r}'`,r);if(this.listings.has(i))throw rh(`symlink '${e}' -> '${r}'`);if(this.entries.has(i))throw yE(`symlink '${e}' -> '${r}'`);let n=this.setFileSource(i,e);if(this.registerEntry(i,n),this.libzip.file.setExternalAttributes(this.zip,n,0,0,this.libzip.ZIP_OPSYS_UNIX,(_o|511)<<16)===-1)throw this.makeLibzipError(this.libzip.getError(this.zip));this.symlinkCount+=1}async readFilePromise(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=await this.readFileBuffer(e,{asyncDecompress:!0});return r?i.toString(r):i}readFileSync(e,r){typeof r=="object"&&(r=r?r.encoding:void 0);let i=this.readFileBuffer(e);return r?i.toString(r):i}readFileBuffer(e,r={asyncDecompress:!1}){typeof e=="number"&&(e=this.fdToPath(e,"read"));let i=this.resolveFilename(`open '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`open '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(i))throw eo(`open '${e}'`);if(this.listings.has(i))throw rh("read");let n=this.entries.get(i);if(n===void 0)throw new Error("Unreachable");return this.getFileSource(n,r)}async readdirPromise(e,r){return this.readdirSync(e,r)}readdirSync(e,r){let i=this.resolveFilename(`scandir '${e}'`,e);if(!this.entries.has(i)&&!this.listings.has(i))throw bs(`scandir '${e}'`);let n=this.listings.get(i);if(!n)throw eo(`scandir '${e}'`);let s=[...n];return(r==null?void 0:r.withFileTypes)?s.map(o=>Object.assign(this.statImpl("lstat",v.join(e,o)),{name:o})):s}async readlinkPromise(e){let r=this.prepareReadlink(e);return(await this.getFileSource(r,{asyncDecompress:!0})).toString()}readlinkSync(e){let r=this.prepareReadlink(e);return this.getFileSource(r).toString()}prepareReadlink(e){let r=this.resolveFilename(`readlink '${e}'`,e,!1);if(!this.entries.has(r)&&!this.listings.has(r))throw bs(`readlink '${e}'`);if(e[e.length-1]==="/"&&!this.listings.has(r))throw eo(`open '${e}'`);if(this.listings.has(r))throw $a(`readlink '${e}'`);let i=this.entries.get(r);if(i===void 0)throw new Error("Unreachable");if(!this.isSymbolicLink(i))throw $a(`readlink '${e}'`);return i}async truncatePromise(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw $a(`open '${e}'`);let s=await this.getFileSource(n,{asyncDecompress:!0}),o=Buffer.alloc(r,0);return s.copy(o),await this.writeFilePromise(e,o)}truncateSync(e,r=0){let i=this.resolveFilename(`open '${e}'`,e),n=this.entries.get(i);if(typeof n=="undefined")throw $a(`open '${e}'`);let s=this.getFileSource(n),o=Buffer.alloc(r,0);return s.copy(o),this.writeFileSync(e,o)}watch(e,r,i){let n;switch(typeof r){case"function":case"string":case"undefined":n=!0;break;default:({persistent:n=!0}=r);break}if(!n)return{on:()=>{},close:()=>{}};let s=setInterval(()=>{},24*60*60*1e3);return{on:()=>{},close:()=>{clearInterval(s)}}}watchFile(e,r,i){let n=v.resolve(Se.root,e);return QE(this,n,r,i)}unwatchFile(e,r){let i=v.resolve(Se.root,e);return nh(this,i,r)}};var fi=class extends eA{getExtractHint(e){return this.baseFs.getExtractHint(e)}resolve(e){return this.mapFromBase(this.baseFs.resolve(this.mapToBase(e)))}getRealPath(){return this.mapFromBase(this.baseFs.getRealPath())}async openPromise(e,r,i){return this.baseFs.openPromise(this.mapToBase(e),r,i)}openSync(e,r,i){return this.baseFs.openSync(this.mapToBase(e),r,i)}async opendirPromise(e,r){return Object.assign(await this.baseFs.opendirPromise(this.mapToBase(e),r),{path:e})}opendirSync(e,r){return Object.assign(this.baseFs.opendirSync(this.mapToBase(e),r),{path:e})}async readPromise(e,r,i,n,s){return await this.baseFs.readPromise(e,r,i,n,s)}readSync(e,r,i,n,s){return this.baseFs.readSync(e,r,i,n,s)}async writePromise(e,r,i,n,s){return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s)}writeSync(e,r,i,n,s){return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s)}async closePromise(e){return this.baseFs.closePromise(e)}closeSync(e){this.baseFs.closeSync(e)}createReadStream(e,r){return this.baseFs.createReadStream(e!==null?this.mapToBase(e):e,r)}createWriteStream(e,r){return this.baseFs.createWriteStream(e!==null?this.mapToBase(e):e,r)}async realpathPromise(e){return this.mapFromBase(await this.baseFs.realpathPromise(this.mapToBase(e)))}realpathSync(e){return this.mapFromBase(this.baseFs.realpathSync(this.mapToBase(e)))}async existsPromise(e){return this.baseFs.existsPromise(this.mapToBase(e))}existsSync(e){return this.baseFs.existsSync(this.mapToBase(e))}accessSync(e,r){return this.baseFs.accessSync(this.mapToBase(e),r)}async accessPromise(e,r){return this.baseFs.accessPromise(this.mapToBase(e),r)}async statPromise(e,r){return this.baseFs.statPromise(this.mapToBase(e),r)}statSync(e,r){return this.baseFs.statSync(this.mapToBase(e),r)}async fstatPromise(e,r){return this.baseFs.fstatPromise(e,r)}fstatSync(e,r){return this.baseFs.fstatSync(e,r)}async lstatPromise(e,r){return this.baseFs.lstatPromise(this.mapToBase(e),r)}lstatSync(e,r){return this.baseFs.lstatSync(this.mapToBase(e),r)}async chmodPromise(e,r){return this.baseFs.chmodPromise(this.mapToBase(e),r)}chmodSync(e,r){return this.baseFs.chmodSync(this.mapToBase(e),r)}async chownPromise(e,r,i){return this.baseFs.chownPromise(this.mapToBase(e),r,i)}chownSync(e,r,i){return this.baseFs.chownSync(this.mapToBase(e),r,i)}async renamePromise(e,r){return this.baseFs.renamePromise(this.mapToBase(e),this.mapToBase(r))}renameSync(e,r){return this.baseFs.renameSync(this.mapToBase(e),this.mapToBase(r))}async copyFilePromise(e,r,i=0){return this.baseFs.copyFilePromise(this.mapToBase(e),this.mapToBase(r),i)}copyFileSync(e,r,i=0){return this.baseFs.copyFileSync(this.mapToBase(e),this.mapToBase(r),i)}async appendFilePromise(e,r,i){return this.baseFs.appendFilePromise(this.fsMapToBase(e),r,i)}appendFileSync(e,r,i){return this.baseFs.appendFileSync(this.fsMapToBase(e),r,i)}async writeFilePromise(e,r,i){return this.baseFs.writeFilePromise(this.fsMapToBase(e),r,i)}writeFileSync(e,r,i){return this.baseFs.writeFileSync(this.fsMapToBase(e),r,i)}async unlinkPromise(e){return this.baseFs.unlinkPromise(this.mapToBase(e))}unlinkSync(e){return this.baseFs.unlinkSync(this.mapToBase(e))}async utimesPromise(e,r,i){return this.baseFs.utimesPromise(this.mapToBase(e),r,i)}utimesSync(e,r,i){return this.baseFs.utimesSync(this.mapToBase(e),r,i)}async mkdirPromise(e,r){return this.baseFs.mkdirPromise(this.mapToBase(e),r)}mkdirSync(e,r){return this.baseFs.mkdirSync(this.mapToBase(e),r)}async rmdirPromise(e,r){return this.baseFs.rmdirPromise(this.mapToBase(e),r)}rmdirSync(e,r){return this.baseFs.rmdirSync(this.mapToBase(e),r)}async linkPromise(e,r){return this.baseFs.linkPromise(this.mapToBase(e),this.mapToBase(r))}linkSync(e,r){return this.baseFs.linkSync(this.mapToBase(e),this.mapToBase(r))}async symlinkPromise(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkPromise(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkPromise(o,n,i)}symlinkSync(e,r,i){let n=this.mapToBase(r);if(this.pathUtils.isAbsolute(e))return this.baseFs.symlinkSync(this.mapToBase(e),n,i);let s=this.mapToBase(this.pathUtils.join(this.pathUtils.dirname(r),e)),o=this.baseFs.pathUtils.relative(this.baseFs.pathUtils.dirname(n),s);return this.baseFs.symlinkSync(o,n,i)}async readFilePromise(e,r){return r==="utf8"?this.baseFs.readFilePromise(this.fsMapToBase(e),r):this.baseFs.readFilePromise(this.fsMapToBase(e),r)}readFileSync(e,r){return r==="utf8"?this.baseFs.readFileSync(this.fsMapToBase(e),r):this.baseFs.readFileSync(this.fsMapToBase(e),r)}async readdirPromise(e,r){return this.baseFs.readdirPromise(this.mapToBase(e),r)}readdirSync(e,r){return this.baseFs.readdirSync(this.mapToBase(e),r)}async readlinkPromise(e){return this.mapFromBase(await this.baseFs.readlinkPromise(this.mapToBase(e)))}readlinkSync(e){return this.mapFromBase(this.baseFs.readlinkSync(this.mapToBase(e)))}async truncatePromise(e,r){return this.baseFs.truncatePromise(this.mapToBase(e),r)}truncateSync(e,r){return this.baseFs.truncateSync(this.mapToBase(e),r)}watch(e,r,i){return this.baseFs.watch(this.mapToBase(e),r,i)}watchFile(e,r,i){return this.baseFs.watchFile(this.mapToBase(e),r,i)}unwatchFile(e,r){return this.baseFs.unwatchFile(this.mapToBase(e),r)}fsMapToBase(e){return typeof e=="number"?e:this.mapToBase(e)}};var Xo=class extends fi{constructor(e,{baseFs:r,pathUtils:i}){super(i);this.target=e,this.baseFs=r}getRealPath(){return this.target}getBaseFs(){return this.baseFs}mapFromBase(e){return e}mapToBase(e){return e}};var Ft=class extends fi{constructor(e,{baseFs:r=new Wt}={}){super(v);this.target=this.pathUtils.normalize(e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.target)}resolve(e){return this.pathUtils.isAbsolute(e)?v.normalize(e):this.baseFs.resolve(v.join(this.target,e))}mapFromBase(e){return e}mapToBase(e){return this.pathUtils.isAbsolute(e)?e:this.pathUtils.join(this.target,e)}};var vO=Se.root,Zo=class extends fi{constructor(e,{baseFs:r=new Wt}={}){super(v);this.target=this.pathUtils.resolve(Se.root,e),this.baseFs=r}getRealPath(){return this.pathUtils.resolve(this.baseFs.getRealPath(),this.pathUtils.relative(Se.root,this.target))}getTarget(){return this.target}getBaseFs(){return this.baseFs}mapToBase(e){let r=this.pathUtils.normalize(e);if(this.pathUtils.isAbsolute(e))return this.pathUtils.resolve(this.target,this.pathUtils.relative(vO,e));if(r.match(/^\.\.\/?/))throw new Error(`Resolving this path (${e}) would escape the jail`);return this.pathUtils.resolve(this.target,e)}mapFromBase(e){return this.pathUtils.resolve(vO,this.pathUtils.relative(this.target,e))}};var oh=class extends fi{constructor(e,r){super(r);this.instance=null;this.factory=e}get baseFs(){return this.instance||(this.instance=this.factory()),this.instance}set baseFs(e){this.instance=e}mapFromBase(e){return e}mapToBase(e){return e}};var ze=()=>Object.assign(new Error("ENOSYS: unsupported filesystem access"),{code:"ENOSYS"}),gb=class extends eA{constructor(){super(v)}getExtractHint(){throw ze()}getRealPath(){throw ze()}resolve(){throw ze()}async openPromise(){throw ze()}openSync(){throw ze()}async opendirPromise(){throw ze()}opendirSync(){throw ze()}async readPromise(){throw ze()}readSync(){throw ze()}async writePromise(){throw ze()}writeSync(){throw ze()}async closePromise(){throw ze()}closeSync(){throw ze()}createWriteStream(){throw ze()}createReadStream(){throw ze()}async realpathPromise(){throw ze()}realpathSync(){throw ze()}async readdirPromise(){throw ze()}readdirSync(){throw ze()}async existsPromise(e){throw ze()}existsSync(e){throw ze()}async accessPromise(){throw ze()}accessSync(){throw ze()}async statPromise(){throw ze()}statSync(){throw ze()}async fstatPromise(e){throw ze()}fstatSync(e){throw ze()}async lstatPromise(e){throw ze()}lstatSync(e){throw ze()}async chmodPromise(){throw ze()}chmodSync(){throw ze()}async chownPromise(){throw ze()}chownSync(){throw ze()}async mkdirPromise(){throw ze()}mkdirSync(){throw ze()}async rmdirPromise(){throw ze()}rmdirSync(){throw ze()}async linkPromise(){throw ze()}linkSync(){throw ze()}async symlinkPromise(){throw ze()}symlinkSync(){throw ze()}async renamePromise(){throw ze()}renameSync(){throw ze()}async copyFilePromise(){throw ze()}copyFileSync(){throw ze()}async appendFilePromise(){throw ze()}appendFileSync(){throw ze()}async writeFilePromise(){throw ze()}writeFileSync(){throw ze()}async unlinkPromise(){throw ze()}unlinkSync(){throw ze()}async utimesPromise(){throw ze()}utimesSync(){throw ze()}async readFilePromise(){throw ze()}readFileSync(){throw ze()}async readlinkPromise(){throw ze()}readlinkSync(){throw ze()}async truncatePromise(){throw ze()}truncateSync(){throw ze()}watch(){throw ze()}watchFile(){throw ze()}unwatchFile(){throw ze()}},bE=gb;bE.instance=new gb;var ah=class extends fi{constructor(e){super(M);this.baseFs=e}mapFromBase(e){return M.fromPortablePath(e)}mapToBase(e){return M.toPortablePath(e)}};var nhe=/^[0-9]+$/,fb=/^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/,she=/^([^/]+-)?[a-f0-9]+$/,Pr=class extends fi{static makeVirtualPath(e,r,i){if(v.basename(e)!=="__virtual__")throw new Error('Assertion failed: Virtual folders must be named "__virtual__"');if(!v.basename(r).match(she))throw new Error("Assertion failed: Virtual components must be ended by an hexadecimal hash");let s=v.relative(v.dirname(e),i).split("/"),o=0;for(;o{let r=t.indexOf(e);if(r<=0)return null;let i=r;for(;r>=0&&(i=r+e.length,t[i]!==v.sep);){if(t[r-1]===v.sep)return null;r=t.indexOf(e,i)}return t.length>i&&t[i]!==v.sep?null:t.slice(0,i)},Jn=class extends gl{constructor({libzip:e,baseFs:r=new Wt,filter:i=null,maxOpenFiles:n=Infinity,readOnlyArchives:s=!1,useCache:o=!0,maxAge:a=5e3,fileExtensions:l=null}){super();this.fdMap=new Map;this.nextFd=3;this.isZip=new Set;this.notZip=new Set;this.realPaths=new Map;this.limitOpenFilesTimeout=null;this.libzipFactory=typeof e!="function"?()=>e:e,this.baseFs=r,this.zipInstances=o?new Map:null,this.filter=i,this.maxOpenFiles=n,this.readOnlyArchives=s,this.maxAge=a,this.fileExtensions=l}static async openPromise(e,r){let i=new Jn(r);try{return await e(i)}finally{i.saveAndClose()}}get libzip(){return typeof this.libzipInstance=="undefined"&&(this.libzipInstance=this.libzipFactory()),this.libzipInstance}getExtractHint(e){return this.baseFs.getExtractHint(e)}getRealPath(){return this.baseFs.getRealPath()}saveAndClose(){if(sh(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.saveAndClose(),this.zipInstances.delete(e)}discardAndClose(){if(sh(this),this.zipInstances)for(let[e,{zipFs:r}]of this.zipInstances.entries())r.discardAndClose(),this.zipInstances.delete(e)}resolve(e){return this.baseFs.resolve(e)}remapFd(e,r){let i=this.nextFd++|$o;return this.fdMap.set(i,[e,r]),i}async openPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.openPromise(e,r,i),async(n,{subPath:s})=>this.remapFd(n,await n.openPromise(s,r,i)))}openSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.openSync(e,r,i),(n,{subPath:s})=>this.remapFd(n,n.openSync(s,r,i)))}async opendirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.opendirPromise(e,r),async(i,{subPath:n})=>await i.opendirPromise(n,r),{requireSubpath:!1})}opendirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.opendirSync(e,r),(i,{subPath:n})=>i.opendirSync(n,r),{requireSubpath:!1})}async readPromise(e,r,i,n,s){if((e&$o)==0)return await this.baseFs.readPromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("read");let[a,l]=o;return await a.readPromise(l,r,i,n,s)}readSync(e,r,i,n,s){if((e&$o)==0)return this.baseFs.readSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("readSync");let[a,l]=o;return a.readSync(l,r,i,n,s)}async writePromise(e,r,i,n,s){if((e&$o)==0)return typeof r=="string"?await this.baseFs.writePromise(e,r,i):await this.baseFs.writePromise(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("write");let[a,l]=o;return typeof r=="string"?await a.writePromise(l,r,i):await a.writePromise(l,r,i,n,s)}writeSync(e,r,i,n,s){if((e&$o)==0)return typeof r=="string"?this.baseFs.writeSync(e,r,i):this.baseFs.writeSync(e,r,i,n,s);let o=this.fdMap.get(e);if(typeof o=="undefined")throw Hi("writeSync");let[a,l]=o;return typeof r=="string"?a.writeSync(l,r,i):a.writeSync(l,r,i,n,s)}async closePromise(e){if((e&$o)==0)return await this.baseFs.closePromise(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw Hi("close");this.fdMap.delete(e);let[i,n]=r;return await i.closePromise(n)}closeSync(e){if((e&$o)==0)return this.baseFs.closeSync(e);let r=this.fdMap.get(e);if(typeof r=="undefined")throw Hi("closeSync");this.fdMap.delete(e);let[i,n]=r;return i.closeSync(n)}createReadStream(e,r){return e===null?this.baseFs.createReadStream(e,r):this.makeCallSync(e,()=>this.baseFs.createReadStream(e,r),(i,{subPath:n})=>i.createReadStream(n,r))}createWriteStream(e,r){return e===null?this.baseFs.createWriteStream(e,r):this.makeCallSync(e,()=>this.baseFs.createWriteStream(e,r),(i,{subPath:n})=>i.createWriteStream(n,r))}async realpathPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.realpathPromise(e),async(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=await this.baseFs.realpathPromise(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,await r.realpathPromise(n)))})}realpathSync(e){return this.makeCallSync(e,()=>this.baseFs.realpathSync(e),(r,{archivePath:i,subPath:n})=>{let s=this.realPaths.get(i);return typeof s=="undefined"&&(s=this.baseFs.realpathSync(i),this.realPaths.set(i,s)),this.pathUtils.join(s,this.pathUtils.relative(Se.root,r.realpathSync(n)))})}async existsPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.existsPromise(e),async(r,{subPath:i})=>await r.existsPromise(i))}existsSync(e){return this.makeCallSync(e,()=>this.baseFs.existsSync(e),(r,{subPath:i})=>r.existsSync(i))}async accessPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.accessPromise(e,r),async(i,{subPath:n})=>await i.accessPromise(n,r))}accessSync(e,r){return this.makeCallSync(e,()=>this.baseFs.accessSync(e,r),(i,{subPath:n})=>i.accessSync(n,r))}async statPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.statPromise(e,r),async(i,{subPath:n})=>await i.statPromise(n,r))}statSync(e,r){return this.makeCallSync(e,()=>this.baseFs.statSync(e,r),(i,{subPath:n})=>i.statSync(n,r))}async fstatPromise(e,r){if((e&$o)==0)return this.baseFs.fstatPromise(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Hi("fstat");let[n,s]=i;return n.fstatPromise(s,r)}fstatSync(e,r){if((e&$o)==0)return this.baseFs.fstatSync(e,r);let i=this.fdMap.get(e);if(typeof i=="undefined")throw Hi("fstatSync");let[n,s]=i;return n.fstatSync(s,r)}async lstatPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.lstatPromise(e,r),async(i,{subPath:n})=>await i.lstatPromise(n,r))}lstatSync(e,r){return this.makeCallSync(e,()=>this.baseFs.lstatSync(e,r),(i,{subPath:n})=>i.lstatSync(n,r))}async chmodPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.chmodPromise(e,r),async(i,{subPath:n})=>await i.chmodPromise(n,r))}chmodSync(e,r){return this.makeCallSync(e,()=>this.baseFs.chmodSync(e,r),(i,{subPath:n})=>i.chmodSync(n,r))}async chownPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.chownPromise(e,r,i),async(n,{subPath:s})=>await n.chownPromise(s,r,i))}chownSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.chownSync(e,r,i),(n,{subPath:s})=>n.chownSync(s,r,i))}async renamePromise(e,r){return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.renamePromise(e,r),async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),async(i,{subPath:n})=>await this.makeCallPromise(r,async()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},async(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return await i.renamePromise(n,o)}))}renameSync(e,r){return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.renameSync(e,r),()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})}),(i,{subPath:n})=>this.makeCallSync(r,()=>{throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"})},(s,{subPath:o})=>{if(i!==s)throw Object.assign(new Error("EEXDEV: cross-device link not permitted"),{code:"EEXDEV"});return i.renameSync(n,o)}))}async copyFilePromise(e,r,i=0){let n=async(s,o,a,l)=>{if((i&Ah.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Ah.constants.COPYFILE_EXCL&&await this.existsPromise(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=await s.readFilePromise(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}await a.writeFilePromise(l,c)};return await this.makeCallPromise(e,async()=>await this.makeCallPromise(r,async()=>await this.baseFs.copyFilePromise(e,r,i),async(s,{subPath:o})=>await n(this.baseFs,e,s,o)),async(s,{subPath:o})=>await this.makeCallPromise(r,async()=>await n(s,o,this.baseFs,r),async(a,{subPath:l})=>s!==a?await n(s,o,a,l):await s.copyFilePromise(o,l,i)))}copyFileSync(e,r,i=0){let n=(s,o,a,l)=>{if((i&Ah.constants.COPYFILE_FICLONE_FORCE)!=0)throw Object.assign(new Error(`EXDEV: cross-device clone not permitted, copyfile '${o}' -> ${l}'`),{code:"EXDEV"});if(i&Ah.constants.COPYFILE_EXCL&&this.existsSync(o))throw Object.assign(new Error(`EEXIST: file already exists, copyfile '${o}' -> '${l}'`),{code:"EEXIST"});let c;try{c=s.readFileSync(o)}catch(u){throw Object.assign(new Error(`EINVAL: invalid argument, copyfile '${o}' -> '${l}'`),{code:"EINVAL"})}a.writeFileSync(l,c)};return this.makeCallSync(e,()=>this.makeCallSync(r,()=>this.baseFs.copyFileSync(e,r,i),(s,{subPath:o})=>n(this.baseFs,e,s,o)),(s,{subPath:o})=>this.makeCallSync(r,()=>n(s,o,this.baseFs,r),(a,{subPath:l})=>s!==a?n(s,o,a,l):s.copyFileSync(o,l,i)))}async appendFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.appendFilePromise(e,r,i),async(n,{subPath:s})=>await n.appendFilePromise(s,r,i))}appendFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.appendFileSync(e,r,i),(n,{subPath:s})=>n.appendFileSync(s,r,i))}async writeFilePromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.writeFilePromise(e,r,i),async(n,{subPath:s})=>await n.writeFilePromise(s,r,i))}writeFileSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.writeFileSync(e,r,i),(n,{subPath:s})=>n.writeFileSync(s,r,i))}async unlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.unlinkPromise(e),async(r,{subPath:i})=>await r.unlinkPromise(i))}unlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.unlinkSync(e),(r,{subPath:i})=>r.unlinkSync(i))}async utimesPromise(e,r,i){return await this.makeCallPromise(e,async()=>await this.baseFs.utimesPromise(e,r,i),async(n,{subPath:s})=>await n.utimesPromise(s,r,i))}utimesSync(e,r,i){return this.makeCallSync(e,()=>this.baseFs.utimesSync(e,r,i),(n,{subPath:s})=>n.utimesSync(s,r,i))}async mkdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.mkdirPromise(e,r),async(i,{subPath:n})=>await i.mkdirPromise(n,r))}mkdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.mkdirSync(e,r),(i,{subPath:n})=>i.mkdirSync(n,r))}async rmdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.rmdirPromise(e,r),async(i,{subPath:n})=>await i.rmdirPromise(n,r))}rmdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.rmdirSync(e,r),(i,{subPath:n})=>i.rmdirSync(n,r))}async linkPromise(e,r){return await this.makeCallPromise(r,async()=>await this.baseFs.linkPromise(e,r),async(i,{subPath:n})=>await i.linkPromise(e,n))}linkSync(e,r){return this.makeCallSync(r,()=>this.baseFs.linkSync(e,r),(i,{subPath:n})=>i.linkSync(e,n))}async symlinkPromise(e,r,i){return await this.makeCallPromise(r,async()=>await this.baseFs.symlinkPromise(e,r,i),async(n,{subPath:s})=>await n.symlinkPromise(e,s))}symlinkSync(e,r,i){return this.makeCallSync(r,()=>this.baseFs.symlinkSync(e,r,i),(n,{subPath:s})=>n.symlinkSync(e,s))}async readFilePromise(e,r){return this.makeCallPromise(e,async()=>{switch(r){case"utf8":return await this.baseFs.readFilePromise(e,r);default:return await this.baseFs.readFilePromise(e,r)}},async(i,{subPath:n})=>await i.readFilePromise(n,r))}readFileSync(e,r){return this.makeCallSync(e,()=>{switch(r){case"utf8":return this.baseFs.readFileSync(e,r);default:return this.baseFs.readFileSync(e,r)}},(i,{subPath:n})=>i.readFileSync(n,r))}async readdirPromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.readdirPromise(e,r),async(i,{subPath:n})=>await i.readdirPromise(n,r),{requireSubpath:!1})}readdirSync(e,r){return this.makeCallSync(e,()=>this.baseFs.readdirSync(e,r),(i,{subPath:n})=>i.readdirSync(n,r),{requireSubpath:!1})}async readlinkPromise(e){return await this.makeCallPromise(e,async()=>await this.baseFs.readlinkPromise(e),async(r,{subPath:i})=>await r.readlinkPromise(i))}readlinkSync(e){return this.makeCallSync(e,()=>this.baseFs.readlinkSync(e),(r,{subPath:i})=>r.readlinkSync(i))}async truncatePromise(e,r){return await this.makeCallPromise(e,async()=>await this.baseFs.truncatePromise(e,r),async(i,{subPath:n})=>await i.truncatePromise(n,r))}truncateSync(e,r){return this.makeCallSync(e,()=>this.baseFs.truncateSync(e,r),(i,{subPath:n})=>i.truncateSync(n,r))}watch(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watch(e,r,i),(n,{subPath:s})=>n.watch(s,r,i))}watchFile(e,r,i){return this.makeCallSync(e,()=>this.baseFs.watchFile(e,r,i),()=>QE(this,e,r,i))}unwatchFile(e,r){return this.makeCallSync(e,()=>this.baseFs.unwatchFile(e,r),()=>nh(this,e,r))}async makeCallPromise(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return await r();let s=this.resolve(e),o=this.findZip(s);return o?n&&o.subPath==="/"?await r():await this.getZipPromise(o.archivePath,async a=>await i(a,o)):await r()}makeCallSync(e,r,i,{requireSubpath:n=!0}={}){if(typeof e!="string")return r();let s=this.resolve(e),o=this.findZip(s);return!o||n&&o.subPath==="/"?r():this.getZipSync(o.archivePath,a=>i(a,o))}findZip(e){if(this.filter&&!this.filter.test(e))return null;let r="";for(;;){let i=e.substr(r.length),n;if(!this.fileExtensions)n=SO(i,".zip");else for(let s of this.fileExtensions)if(n=SO(i,s),n)break;if(!n)return null;if(r=this.pathUtils.join(r,n),this.isZip.has(r)===!1){if(this.notZip.has(r))continue;try{if(!this.baseFs.lstatSync(r).isFile()){this.notZip.add(r);continue}}catch{return null}this.isZip.add(r)}return{archivePath:r,subPath:this.pathUtils.join(Se.root,e.substr(r.length))}}}limitOpenFiles(e){if(this.zipInstances===null)return;let r=Date.now(),i=r+this.maxAge,n=e===null?0:this.zipInstances.size-e;for(let[s,{zipFs:o,expiresAt:a,refCount:l}]of this.zipInstances.entries())if(!(l!==0||o.hasOpenFileHandles())){if(r>=a){o.saveAndClose(),this.zipInstances.delete(s),n-=1;continue}else if(e===null||n<=0){i=a;break}o.saveAndClose(),this.zipInstances.delete(s),n-=1}this.limitOpenFilesTimeout===null&&(e===null&&this.zipInstances.size>0||e!==null)&&(this.limitOpenFilesTimeout=setTimeout(()=>{this.limitOpenFilesTimeout=null,this.limitOpenFiles(null)},i-r).unref())}async getZipPromise(e,r){let i=async()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:await this.baseFs.statPromise(e)});if(this.zipInstances){let n=this.zipInstances.get(e);if(!n){let s=await i();n=this.zipInstances.get(e),n||(n={zipFs:new Jr(e,s),expiresAt:0,refCount:0})}this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,n.refCount+=1;try{return await r(n.zipFs)}finally{n.refCount-=1}}else{let n=new Jr(e,await i());try{return await r(n)}finally{n.saveAndClose()}}}getZipSync(e,r){let i=()=>({baseFs:this.baseFs,libzip:this.libzip,readOnly:this.readOnlyArchives,stats:this.baseFs.statSync(e)});if(this.zipInstances){let n=this.zipInstances.get(e);return n||(n={zipFs:new Jr(e,i()),expiresAt:0,refCount:0}),this.zipInstances.delete(e),this.limitOpenFiles(this.maxOpenFiles-1),this.zipInstances.set(e,n),n.expiresAt=Date.now()+this.maxAge,r(n.zipFs)}else{let n=new Jr(e,i());try{return r(n)}finally{n.saveAndClose()}}}};var lh=ie(require("util"));var vE=ie(require("url"));var hb=class extends fi{constructor(e){super(M);this.baseFs=e}mapFromBase(e){return e}mapToBase(e){return e instanceof vE.URL?(0,vE.fileURLToPath)(e):e}};var ohe=new Set(["accessSync","appendFileSync","createReadStream","createWriteStream","chmodSync","chownSync","closeSync","copyFileSync","linkSync","lstatSync","fstatSync","lutimesSync","mkdirSync","openSync","opendirSync","readSync","readlinkSync","readFileSync","readdirSync","readlinkSync","realpathSync","renameSync","rmdirSync","statSync","symlinkSync","truncateSync","unlinkSync","unwatchFile","utimesSync","watch","watchFile","writeFileSync","writeSync"]),xO=new Set(["accessPromise","appendFilePromise","chmodPromise","chownPromise","closePromise","copyFilePromise","linkPromise","fstatPromise","lstatPromise","lutimesPromise","mkdirPromise","openPromise","opendirPromise","readdirPromise","realpathPromise","readFilePromise","readdirPromise","readlinkPromise","renamePromise","rmdirPromise","statPromise","symlinkPromise","truncatePromise","unlinkPromise","utimesPromise","writeFilePromise","writeSync"]),ahe=new Set(["appendFilePromise","chmodPromise","chownPromise","closePromise","readPromise","readFilePromise","statPromise","truncatePromise","utimesPromise","writePromise","writeFilePromise"]);function pb(t,e){e=new hb(e);let r=(i,n,s)=>{let o=i[n];i[n]=s,typeof(o==null?void 0:o[lh.promisify.custom])!="undefined"&&(s[lh.promisify.custom]=o[lh.promisify.custom])};{r(t,"exists",(i,...n)=>{let o=typeof n[n.length-1]=="function"?n.pop():()=>{};process.nextTick(()=>{e.existsPromise(i).then(a=>{o(a)},()=>{o(!1)})})}),r(t,"read",(i,n,...s)=>{let a=typeof s[s.length-1]=="function"?s.pop():()=>{};process.nextTick(()=>{e.readPromise(i,n,...s).then(l=>{a(null,l,n)},l=>{a(l,0,n)})})});for(let i of xO){let n=i.replace(/Promise$/,"");if(typeof t[n]=="undefined")continue;let s=e[i];if(typeof s=="undefined")continue;r(t,n,(...a)=>{let c=typeof a[a.length-1]=="function"?a.pop():()=>{};process.nextTick(()=>{s.apply(e,a).then(u=>{c(null,u)},u=>{c(u)})})})}t.realpath.native=t.realpath}{r(t,"existsSync",i=>{try{return e.existsSync(i)}catch(n){return!1}});for(let i of ohe){let n=i;if(typeof t[n]=="undefined")continue;let s=e[i];typeof s!="undefined"&&r(t,n,s.bind(e))}t.realpathSync.native=t.realpathSync}{let i=process.emitWarning;process.emitWarning=()=>{};let n;try{n=t.promises}finally{process.emitWarning=i}if(typeof n!="undefined"){for(let o of xO){let a=o.replace(/Promise$/,"");if(typeof n[a]=="undefined")continue;let l=e[o];typeof l!="undefined"&&o!=="open"&&r(n,a,l.bind(e))}class s{constructor(a){this.fd=a}}for(let o of ahe){let a=o.replace(/Promise$/,""),l=e[o];typeof l!="undefined"&&r(s.prototype,a,function(...c){return l.call(e,this.fd,...c)})}r(n,"open",async(...o)=>{let a=await e.openPromise(...o);return new s(a)})}}t.read[lh.promisify.custom]=async(i,n,...s)=>({bytesRead:await e.readPromise(i,n,...s),buffer:n})}function SE(t,e){let r=Object.create(t);return pb(r,e),r}var kO=ie(require("os"));function PO(t){let e=M.toPortablePath(kO.default.tmpdir()),r=Math.ceil(Math.random()*4294967296).toString(16).padStart(8,"0");return v.join(e,`${t}${r}`)}var vs=new Set,DO=!1;function RO(){DO||(DO=!0,process.once("exit",()=>{T.rmtempSync()}))}var T=Object.assign(new Wt,{detachTemp(t){vs.delete(t)},mktempSync(t){for(RO();;){let e=PO("xfs-");try{this.mkdirSync(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=this.realpathSync(e);if(vs.add(r),typeof t!="undefined")try{return t(r)}finally{if(vs.has(r)){vs.delete(r);try{this.removeSync(r)}catch{}}}else return r}},async mktempPromise(t){for(RO();;){let e=PO("xfs-");try{await this.mkdirPromise(e)}catch(i){if(i.code==="EEXIST")continue;throw i}let r=await this.realpathPromise(e);if(vs.add(r),typeof t!="undefined")try{return await t(r)}finally{if(vs.has(r)){vs.delete(r);try{await this.removePromise(r)}catch{}}}else return r}},async rmtempPromise(){await Promise.all(Array.from(vs.values()).map(async t=>{try{await T.removePromise(t,{maxRetries:0}),vs.delete(t)}catch{}}))},rmtempSync(){for(let t of vs)try{T.removeSync(t),vs.delete(t)}catch{}}});var vb=ie(bb()),Pn;(function(i){i[i.Never=0]="Never",i[i.ErrorCode=1]="ErrorCode",i[i.Always=2]="Always"})(Pn||(Pn={}));function dl(t){return t!==null&&typeof t.fd=="number"}var Cl=new Set;function Sb(){}function xb(){for(let t of Cl)t.kill()}async function to(t,e,{cwd:r,env:i=process.env,strict:n=!1,stdin:s=null,stdout:o,stderr:a,end:l=2}){let c=["pipe","pipe","pipe"];s===null?c[0]="ignore":dl(s)&&(c[0]=s),dl(o)&&(c[1]=o),dl(a)&&(c[2]=a);let u=(0,vb.default)(t,e,{cwd:M.fromPortablePath(r),env:_(P({},i),{PWD:M.fromPortablePath(r)}),stdio:c});Cl.add(u),Cl.size===1&&(process.on("SIGINT",Sb),process.on("SIGTERM",xb)),!dl(s)&&s!==null&&s.pipe(u.stdin),dl(o)||u.stdout.pipe(o,{end:!1}),dl(a)||u.stderr.pipe(a,{end:!1});let g=()=>{for(let f of new Set([o,a]))dl(f)||f.end()};return new Promise((f,h)=>{u.on("error",p=>{Cl.delete(u),Cl.size===0&&(process.off("SIGINT",Sb),process.off("SIGTERM",xb)),(l===2||l===1)&&g(),h(p)}),u.on("close",(p,d)=>{Cl.delete(u),Cl.size===0&&(process.off("SIGINT",Sb),process.off("SIGTERM",xb)),(l===2||l===1&&p>0)&&g(),p===0||!n?f({code:kb(p,d)}):h(p!==null?new Error(`Child "${t}" exited with exit code ${p}`):new Error(`Child "${t}" exited with signal ${d}`))})})}async function Nhe(t,e,{cwd:r,env:i=process.env,encoding:n="utf8",strict:s=!1}){let o=["ignore","pipe","pipe"],a=[],l=[],c=M.fromPortablePath(r);typeof i.PWD!="undefined"&&(i=_(P({},i),{PWD:c}));let u=(0,vb.default)(t,e,{cwd:c,env:i,stdio:o});return u.stdout.on("data",g=>{a.push(g)}),u.stderr.on("data",g=>{l.push(g)}),await new Promise((g,f)=>{u.on("error",()=>{f()}),u.on("close",(h,p)=>{let d=n==="buffer"?Buffer.concat(a):Buffer.concat(a).toString(n),m=n==="buffer"?Buffer.concat(l):Buffer.concat(l).toString(n);h===0||!s?g({code:kb(h,p),stdout:d,stderr:m}):f(Object.assign(new Error(`Child "${t}" exited with exit code ${h} + +${m}`),{code:kb(h,p),stdout:d,stderr:m}))})})}var Lhe=new Map([["SIGINT",2],["SIGQUIT",3],["SIGKILL",9],["SIGTERM",15]]);function kb(t,e){let r=Lhe.get(e);return typeof r!="undefined"?128+r:t!=null?t:1}var Pb={};it(Pb,{getDefaultGlobalFolder:()=>Rb,getHomeFolder:()=>uh,isFolderInside:()=>Fb});var Db=ie(require("os"));function Rb(){if(process.platform==="win32"){let t=M.toPortablePath(process.env.LOCALAPPDATA||M.join((0,Db.homedir)(),"AppData","Local"));return v.resolve(t,"Yarn/Berry")}if(process.env.XDG_DATA_HOME){let t=M.toPortablePath(process.env.XDG_DATA_HOME);return v.resolve(t,"yarn/berry")}return v.resolve(uh(),".yarn/berry")}function uh(){return M.toPortablePath((0,Db.homedir)()||"/usr/local/share")}function Fb(t,e){let r=v.relative(e,t);return r&&!r.startsWith("..")&&!v.isAbsolute(r)}var ue={};it(ue,{LogLevel:()=>Ts,Style:()=>Gl,Type:()=>Le,addLogFilterSupport:()=>Cp,applyColor:()=>On,applyHyperlink:()=>Ku,applyStyle:()=>Py,json:()=>Uu,mark:()=>xx,pretty:()=>Ve,prettyField:()=>Yl,prettyList:()=>Kx,supportsColor:()=>xy,supportsHyperlinks:()=>Mx,tuple:()=>jl});var pp=ie(jb()),dp=ie(ml()),o3=ie(Nn()),a3=ie(gU());var z;(function(te){te[te.UNNAMED=0]="UNNAMED",te[te.EXCEPTION=1]="EXCEPTION",te[te.MISSING_PEER_DEPENDENCY=2]="MISSING_PEER_DEPENDENCY",te[te.CYCLIC_DEPENDENCIES=3]="CYCLIC_DEPENDENCIES",te[te.DISABLED_BUILD_SCRIPTS=4]="DISABLED_BUILD_SCRIPTS",te[te.BUILD_DISABLED=5]="BUILD_DISABLED",te[te.SOFT_LINK_BUILD=6]="SOFT_LINK_BUILD",te[te.MUST_BUILD=7]="MUST_BUILD",te[te.MUST_REBUILD=8]="MUST_REBUILD",te[te.BUILD_FAILED=9]="BUILD_FAILED",te[te.RESOLVER_NOT_FOUND=10]="RESOLVER_NOT_FOUND",te[te.FETCHER_NOT_FOUND=11]="FETCHER_NOT_FOUND",te[te.LINKER_NOT_FOUND=12]="LINKER_NOT_FOUND",te[te.FETCH_NOT_CACHED=13]="FETCH_NOT_CACHED",te[te.YARN_IMPORT_FAILED=14]="YARN_IMPORT_FAILED",te[te.REMOTE_INVALID=15]="REMOTE_INVALID",te[te.REMOTE_NOT_FOUND=16]="REMOTE_NOT_FOUND",te[te.RESOLUTION_PACK=17]="RESOLUTION_PACK",te[te.CACHE_CHECKSUM_MISMATCH=18]="CACHE_CHECKSUM_MISMATCH",te[te.UNUSED_CACHE_ENTRY=19]="UNUSED_CACHE_ENTRY",te[te.MISSING_LOCKFILE_ENTRY=20]="MISSING_LOCKFILE_ENTRY",te[te.WORKSPACE_NOT_FOUND=21]="WORKSPACE_NOT_FOUND",te[te.TOO_MANY_MATCHING_WORKSPACES=22]="TOO_MANY_MATCHING_WORKSPACES",te[te.CONSTRAINTS_MISSING_DEPENDENCY=23]="CONSTRAINTS_MISSING_DEPENDENCY",te[te.CONSTRAINTS_INCOMPATIBLE_DEPENDENCY=24]="CONSTRAINTS_INCOMPATIBLE_DEPENDENCY",te[te.CONSTRAINTS_EXTRANEOUS_DEPENDENCY=25]="CONSTRAINTS_EXTRANEOUS_DEPENDENCY",te[te.CONSTRAINTS_INVALID_DEPENDENCY=26]="CONSTRAINTS_INVALID_DEPENDENCY",te[te.CANT_SUGGEST_RESOLUTIONS=27]="CANT_SUGGEST_RESOLUTIONS",te[te.FROZEN_LOCKFILE_EXCEPTION=28]="FROZEN_LOCKFILE_EXCEPTION",te[te.CROSS_DRIVE_VIRTUAL_LOCAL=29]="CROSS_DRIVE_VIRTUAL_LOCAL",te[te.FETCH_FAILED=30]="FETCH_FAILED",te[te.DANGEROUS_NODE_MODULES=31]="DANGEROUS_NODE_MODULES",te[te.NODE_GYP_INJECTED=32]="NODE_GYP_INJECTED",te[te.AUTHENTICATION_NOT_FOUND=33]="AUTHENTICATION_NOT_FOUND",te[te.INVALID_CONFIGURATION_KEY=34]="INVALID_CONFIGURATION_KEY",te[te.NETWORK_ERROR=35]="NETWORK_ERROR",te[te.LIFECYCLE_SCRIPT=36]="LIFECYCLE_SCRIPT",te[te.CONSTRAINTS_MISSING_FIELD=37]="CONSTRAINTS_MISSING_FIELD",te[te.CONSTRAINTS_INCOMPATIBLE_FIELD=38]="CONSTRAINTS_INCOMPATIBLE_FIELD",te[te.CONSTRAINTS_EXTRANEOUS_FIELD=39]="CONSTRAINTS_EXTRANEOUS_FIELD",te[te.CONSTRAINTS_INVALID_FIELD=40]="CONSTRAINTS_INVALID_FIELD",te[te.AUTHENTICATION_INVALID=41]="AUTHENTICATION_INVALID",te[te.PROLOG_UNKNOWN_ERROR=42]="PROLOG_UNKNOWN_ERROR",te[te.PROLOG_SYNTAX_ERROR=43]="PROLOG_SYNTAX_ERROR",te[te.PROLOG_EXISTENCE_ERROR=44]="PROLOG_EXISTENCE_ERROR",te[te.STACK_OVERFLOW_RESOLUTION=45]="STACK_OVERFLOW_RESOLUTION",te[te.AUTOMERGE_FAILED_TO_PARSE=46]="AUTOMERGE_FAILED_TO_PARSE",te[te.AUTOMERGE_IMMUTABLE=47]="AUTOMERGE_IMMUTABLE",te[te.AUTOMERGE_SUCCESS=48]="AUTOMERGE_SUCCESS",te[te.AUTOMERGE_REQUIRED=49]="AUTOMERGE_REQUIRED",te[te.DEPRECATED_CLI_SETTINGS=50]="DEPRECATED_CLI_SETTINGS",te[te.PLUGIN_NAME_NOT_FOUND=51]="PLUGIN_NAME_NOT_FOUND",te[te.INVALID_PLUGIN_REFERENCE=52]="INVALID_PLUGIN_REFERENCE",te[te.CONSTRAINTS_AMBIGUITY=53]="CONSTRAINTS_AMBIGUITY",te[te.CACHE_OUTSIDE_PROJECT=54]="CACHE_OUTSIDE_PROJECT",te[te.IMMUTABLE_INSTALL=55]="IMMUTABLE_INSTALL",te[te.IMMUTABLE_CACHE=56]="IMMUTABLE_CACHE",te[te.INVALID_MANIFEST=57]="INVALID_MANIFEST",te[te.PACKAGE_PREPARATION_FAILED=58]="PACKAGE_PREPARATION_FAILED",te[te.INVALID_RANGE_PEER_DEPENDENCY=59]="INVALID_RANGE_PEER_DEPENDENCY",te[te.INCOMPATIBLE_PEER_DEPENDENCY=60]="INCOMPATIBLE_PEER_DEPENDENCY",te[te.DEPRECATED_PACKAGE=61]="DEPRECATED_PACKAGE",te[te.INCOMPATIBLE_OS=62]="INCOMPATIBLE_OS",te[te.INCOMPATIBLE_CPU=63]="INCOMPATIBLE_CPU",te[te.FROZEN_ARTIFACT_EXCEPTION=64]="FROZEN_ARTIFACT_EXCEPTION",te[te.TELEMETRY_NOTICE=65]="TELEMETRY_NOTICE",te[te.PATCH_HUNK_FAILED=66]="PATCH_HUNK_FAILED",te[te.INVALID_CONFIGURATION_VALUE=67]="INVALID_CONFIGURATION_VALUE",te[te.UNUSED_PACKAGE_EXTENSION=68]="UNUSED_PACKAGE_EXTENSION",te[te.REDUNDANT_PACKAGE_EXTENSION=69]="REDUNDANT_PACKAGE_EXTENSION",te[te.AUTO_NM_SUCCESS=70]="AUTO_NM_SUCCESS",te[te.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK=71]="NM_CANT_INSTALL_EXTERNAL_SOFT_LINK",te[te.NM_PRESERVE_SYMLINKS_REQUIRED=72]="NM_PRESERVE_SYMLINKS_REQUIRED",te[te.UPDATE_LOCKFILE_ONLY_SKIP_LINK=73]="UPDATE_LOCKFILE_ONLY_SKIP_LINK",te[te.NM_HARDLINKS_MODE_DOWNGRADED=74]="NM_HARDLINKS_MODE_DOWNGRADED",te[te.PROLOG_INSTANTIATION_ERROR=75]="PROLOG_INSTANTIATION_ERROR",te[te.INCOMPATIBLE_ARCHITECTURE=76]="INCOMPATIBLE_ARCHITECTURE",te[te.GHOST_ARCHITECTURE=77]="GHOST_ARCHITECTURE"})(z||(z={}));function KE(t){return`YN${t.toString(10).padStart(4,"0")}`}var de={};it(de,{BufferStream:()=>OH,CachingStrategy:()=>Dl,DefaultStream:()=>KH,assertNever:()=>Lv,bufferStream:()=>Cu,buildIgnorePattern:()=>DEe,convertMapsToIndexableObjects:()=>aI,dynamicRequire:()=>mu,escapeRegExp:()=>SEe,getArrayWithDefault:()=>hu,getFactoryWithDefault:()=>na,getMapWithDefault:()=>pu,getSetWithDefault:()=>Pl,isIndexableObject:()=>Tv,isPathLike:()=>REe,isTaggedYarnVersion:()=>vEe,mapAndFilter:()=>kl,mapAndFind:()=>MH,overrideType:()=>Nv,parseBoolean:()=>Hh,parseOptionalBoolean:()=>jH,prettifyAsyncErrors:()=>du,prettifySyncErrors:()=>Mv,releaseAfterUseAsync:()=>kEe,replaceEnvVariables:()=>Ov,sortMap:()=>gn,tryParseOptionalBoolean:()=>Kv,validateEnum:()=>xEe});var vh={};it(vh,{Builtins:()=>Iv,Cli:()=>oo,Command:()=>ye,Option:()=>Y,UsageError:()=>me});var yl=0,Eh=1,Gi=2,sv="",hi="\0",Au=-1,ov=/^(-h|--help)(?:=([0-9]+))?$/,UE=/^(--[a-z]+(?:-[a-z]+)*|-[a-zA-Z]+)$/,fU=/^-[a-zA-Z]{2,}$/,av=/^([^=]+)=([\s\S]*)$/,Av=process.env.DEBUG_CLI==="1";var me=class extends Error{constructor(e){super(e);this.clipanion={type:"usage"},this.name="UsageError"}},Ih=class extends Error{constructor(e,r){super();if(this.input=e,this.candidates=r,this.clipanion={type:"none"},this.name="UnknownSyntaxError",this.candidates.length===0)this.message="Command not found, but we're not sure what's the alternative.";else if(this.candidates.every(i=>i.reason!==null&&i.reason===r[0].reason)){let[{reason:i}]=this.candidates;this.message=`${i} + +${this.candidates.map(({usage:n})=>`$ ${n}`).join(` +`)}`}else if(this.candidates.length===1){let[{usage:i}]=this.candidates;this.message=`Command not found; did you mean: + +$ ${i} +${lv(e)}`}else this.message=`Command not found; did you mean one of: + +${this.candidates.map(({usage:i},n)=>`${`${n}.`.padStart(4)} ${i}`).join(` +`)} + +${lv(e)}`}},cv=class extends Error{constructor(e,r){super();this.input=e,this.usages=r,this.clipanion={type:"none"},this.name="AmbiguousSyntaxError",this.message=`Cannot find which to pick amongst the following alternatives: + +${this.usages.map((i,n)=>`${`${n}.`.padStart(4)} ${i}`).join(` +`)} + +${lv(e)}`}},lv=t=>`While running ${t.filter(e=>e!==hi).map(e=>{let r=JSON.stringify(e);return e.match(/\s/)||e.length===0||r!==`"${e}"`?r:e}).join(" ")}`;var yh=Symbol("clipanion/isOption");function ji(t){return _(P({},t),{[yh]:!0})}function so(t,e){return typeof t=="undefined"?[t,e]:typeof t=="object"&&t!==null&&!Array.isArray(t)?[void 0,t]:[t,e]}function HE(t,e=!1){let r=t.replace(/^\.: /,"");return e&&(r=r[0].toLowerCase()+r.slice(1)),r}function wh(t,e){return e.length===1?new me(`${t}: ${HE(e[0],!0)}`):new me(`${t}: +${e.map(r=>` +- ${HE(r)}`).join("")}`)}function Bh(t,e,r){if(typeof r=="undefined")return e;let i=[],n=[],s=a=>{let l=e;return e=a,s.bind(null,l)};if(!r(e,{errors:i,coercions:n,coercion:s}))throw wh(`Invalid value for ${t}`,i);for(let[,a]of n)a();return e}var ye=class{constructor(){this.help=!1}static Usage(e){return e}async catch(e){throw e}async validateAndExecute(){let r=this.constructor.schema;if(typeof r!="undefined"){let{isDict:n,isUnknown:s,applyCascade:o}=await Promise.resolve().then(()=>(Ss(),lu)),a=o(n(s()),r),l=[],c=[];if(!a(this,{errors:l,coercions:c}))throw wh("Invalid option schema",l);for(let[,g]of c)g()}let i=await this.execute();return typeof i!="undefined"?i:0}};ye.isOption=yh;ye.Default=[];function un(t){Av&&console.log(t)}var BU={candidateUsage:null,requiredOptions:[],errorMessage:null,ignoreOptions:!1,path:[],positionals:[],options:[],remainder:null,selectedIndex:Au};function QU(){return{nodes:[qi(),qi(),qi()]}}function nCe(t){let e=QU(),r=[],i=e.nodes.length;for(let n of t){r.push(i);for(let s=0;s{if(e.has(i))return;e.add(i);let n=t.nodes[i];for(let o of Object.values(n.statics))for(let{to:a}of o)r(a);for(let[,{to:o}]of n.dynamics)r(o);for(let{to:o}of n.shortcuts)r(o);let s=new Set(n.shortcuts.map(({to:o})=>o));for(;n.shortcuts.length>0;){let{to:o}=n.shortcuts.shift(),a=t.nodes[o];for(let[l,c]of Object.entries(a.statics)){let u=Object.prototype.hasOwnProperty.call(n.statics,l)?n.statics[l]:n.statics[l]=[];for(let g of c)u.some(({to:f})=>g.to===f)||u.push(g)}for(let[l,c]of a.dynamics)n.dynamics.some(([u,{to:g}])=>l===u&&c.to===g)||n.dynamics.push([l,c]);for(let l of a.shortcuts)s.has(l.to)||(n.shortcuts.push(l),s.add(l.to))}};r(yl)}function oCe(t,{prefix:e=""}={}){if(Av){un(`${e}Nodes are:`);for(let r=0;rl!==Gi).map(({state:l})=>({usage:l.candidateUsage,reason:null})));if(a.every(({node:l})=>l===Gi))throw new Ih(e,a.map(({state:l})=>({usage:l.candidateUsage,reason:l.errorMessage})));i=aCe(a)}if(i.length>0){un(" Results:");for(let s of i)un(` - ${s.node} -> ${JSON.stringify(s.state)}`)}else un(" No results");return i}function ACe(t,e){if(e.selectedIndex!==null)return!0;if(Object.prototype.hasOwnProperty.call(t.statics,hi)){for(let{to:r}of t.statics[hi])if(r===Eh)return!0}return!1}function cCe(t,e,r){let i=r&&e.length>0?[""]:[],n=vU(t,e,r),s=[],o=new Set,a=(l,c,u=!0)=>{let g=[c];for(;g.length>0;){let h=g;g=[];for(let p of h){let d=t.nodes[p],m=Object.keys(d.statics);for(let I of Object.keys(d.statics)){let B=m[0];for(let{to:b,reducer:R}of d.statics[B])R==="pushPath"&&(u||l.push(B),g.push(b))}}u=!1}let f=JSON.stringify(l);o.has(f)||(s.push(l),o.add(f))};for(let{node:l,state:c}of n){if(c.remainder!==null){a([c.remainder],l);continue}let u=t.nodes[l],g=ACe(u,c);for(let[f,h]of Object.entries(u.statics))(g&&f!==hi||!f.startsWith("-")&&h.some(({reducer:p})=>p==="pushPath"))&&a([...i,f],l);if(!!g)for(let[f,{to:h}]of u.dynamics){if(h===Gi)continue;let p=lCe(f,c);if(p!==null)for(let d of p)a([...i,d],l)}}return[...s].sort()}function gCe(t,e){let r=vU(t,[...e,hi]);return uCe(e,r.map(({state:i})=>i))}function aCe(t){let e=0;for(let{state:r}of t)r.path.length>e&&(e=r.path.length);return t.filter(({state:r})=>r.path.length===e)}function uCe(t,e){let r=e.filter(g=>g.selectedIndex!==null);if(r.length===0)throw new Error;let i=r.filter(g=>g.requiredOptions.every(f=>f.some(h=>g.options.find(p=>p.name===h))));if(i.length===0)throw new Ih(t,r.map(g=>({usage:g.candidateUsage,reason:null})));let n=0;for(let g of i)g.path.length>n&&(n=g.path.length);let s=i.filter(g=>g.path.length===n),o=g=>g.positionals.filter(({extra:f})=>!f).length+g.options.length,a=s.map(g=>({state:g,positionalCount:o(g)})),l=0;for(let{positionalCount:g}of a)g>l&&(l=g);let c=a.filter(({positionalCount:g})=>g===l).map(({state:g})=>g),u=fCe(c);if(u.length>1)throw new cv(t,u.map(g=>g.candidateUsage));return u[0]}function fCe(t){let e=[],r=[];for(let i of t)i.selectedIndex===Au?r.push(i):e.push(i);return r.length>0&&e.push(_(P({},BU),{path:SU(...r.map(i=>i.path)),options:r.reduce((i,n)=>i.concat(n.options),[])})),e}function SU(t,e,...r){return e===void 0?Array.from(t):SU(t.filter((i,n)=>i===e[n]),...r)}function qi(){return{dynamics:[],shortcuts:[],statics:{}}}function bU(t){return t===Eh||t===Gi}function Cv(t,e=0){return{to:bU(t.to)?t.to:t.to>2?t.to+e-2:t.to+e,reducer:t.reducer}}function iCe(t,e=0){let r=qi();for(let[i,n]of t.dynamics)r.dynamics.push([i,Cv(n,e)]);for(let i of t.shortcuts)r.shortcuts.push(Cv(i,e));for(let[i,n]of Object.entries(t.statics))r.statics[i]=n.map(s=>Cv(s,e));return r}function pi(t,e,r,i,n){t.nodes[e].dynamics.push([r,{to:i,reducer:n}])}function cu(t,e,r,i){t.nodes[e].shortcuts.push({to:r,reducer:i})}function ta(t,e,r,i,n){(Object.prototype.hasOwnProperty.call(t.nodes[e].statics,r)?t.nodes[e].statics[r]:t.nodes[e].statics[r]=[]).push({to:i,reducer:n})}function jE(t,e,r,i){if(Array.isArray(e)){let[n,...s]=e;return t[n](r,i,...s)}else return t[e](r,i)}function lCe(t,e){let r=Array.isArray(t)?YE[t[0]]:YE[t];if(typeof r.suggest=="undefined")return null;let i=Array.isArray(t)?t.slice(1):[];return r.suggest(e,...i)}var YE={always:()=>!0,isOptionLike:(t,e)=>!t.ignoreOptions&&e!=="-"&&e.startsWith("-"),isNotOptionLike:(t,e)=>t.ignoreOptions||e==="-"||!e.startsWith("-"),isOption:(t,e,r,i)=>!t.ignoreOptions&&e===r,isBatchOption:(t,e,r)=>!t.ignoreOptions&&fU.test(e)&&[...e.slice(1)].every(i=>r.includes(`-${i}`)),isBoundOption:(t,e,r,i)=>{let n=e.match(av);return!t.ignoreOptions&&!!n&&UE.test(n[1])&&r.includes(n[1])&&i.filter(s=>s.names.includes(n[1])).every(s=>s.allowBinding)},isNegatedOption:(t,e,r)=>!t.ignoreOptions&&e===`--no-${r.slice(2)}`,isHelp:(t,e)=>!t.ignoreOptions&&ov.test(e),isUnsupportedOption:(t,e,r)=>!t.ignoreOptions&&e.startsWith("-")&&UE.test(e)&&!r.includes(e),isInvalidOption:(t,e)=>!t.ignoreOptions&&e.startsWith("-")&&!UE.test(e)};YE.isOption.suggest=(t,e,r=!0)=>r?null:[e];var dv={setCandidateState:(t,e,r)=>P(P({},t),r),setSelectedIndex:(t,e,r)=>_(P({},t),{selectedIndex:r}),pushBatch:(t,e)=>_(P({},t),{options:t.options.concat([...e.slice(1)].map(r=>({name:`-${r}`,value:!0})))}),pushBound:(t,e)=>{let[,r,i]=e.match(av);return _(P({},t),{options:t.options.concat({name:r,value:i})})},pushPath:(t,e)=>_(P({},t),{path:t.path.concat(e)}),pushPositional:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:!1})}),pushExtra:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:!0})}),pushExtraNoLimits:(t,e)=>_(P({},t),{positionals:t.positionals.concat({value:e,extra:Ln})}),pushTrue:(t,e,r=e)=>_(P({},t),{options:t.options.concat({name:e,value:!0})}),pushFalse:(t,e,r=e)=>_(P({},t),{options:t.options.concat({name:r,value:!1})}),pushUndefined:(t,e)=>_(P({},t),{options:t.options.concat({name:e,value:void 0})}),pushStringValue:(t,e)=>{var r;let i=_(P({},t),{options:[...t.options]}),n=t.options[t.options.length-1];return n.value=((r=n.value)!==null&&r!==void 0?r:[]).concat([e]),i},setStringValue:(t,e)=>{let r=_(P({},t),{options:[...t.options]}),i=t.options[t.options.length-1];return i.value=e,r},inhibateOptions:t=>_(P({},t),{ignoreOptions:!0}),useHelp:(t,e,r)=>{let[,,i]=e.match(ov);return typeof i!="undefined"?_(P({},t),{options:[{name:"-c",value:String(r)},{name:"-i",value:i}]}):_(P({},t),{options:[{name:"-c",value:String(r)}]})},setError:(t,e,r)=>e===hi?_(P({},t),{errorMessage:`${r}.`}):_(P({},t),{errorMessage:`${r} ("${e}").`}),setOptionArityError:(t,e)=>{let r=t.options[t.options.length-1];return _(P({},t),{errorMessage:`Not enough arguments to option ${r.name}.`})}},Ln=Symbol(),xU=class{constructor(e,r){this.allOptionNames=[],this.arity={leading:[],trailing:[],extra:[],proxy:!1},this.options=[],this.paths=[],this.cliIndex=e,this.cliOpts=r}addPath(e){this.paths.push(e)}setArity({leading:e=this.arity.leading,trailing:r=this.arity.trailing,extra:i=this.arity.extra,proxy:n=this.arity.proxy}){Object.assign(this.arity,{leading:e,trailing:r,extra:i,proxy:n})}addPositional({name:e="arg",required:r=!0}={}){if(!r&&this.arity.extra===Ln)throw new Error("Optional parameters cannot be declared when using .rest() or .proxy()");if(!r&&this.arity.trailing.length>0)throw new Error("Optional parameters cannot be declared after the required trailing positional arguments");!r&&this.arity.extra!==Ln?this.arity.extra.push(e):this.arity.extra!==Ln&&this.arity.extra.length===0?this.arity.leading.push(e):this.arity.trailing.push(e)}addRest({name:e="arg",required:r=0}={}){if(this.arity.extra===Ln)throw new Error("Infinite lists cannot be declared multiple times in the same command");if(this.arity.trailing.length>0)throw new Error("Infinite lists cannot be declared after the required trailing positional arguments");for(let i=0;i1)throw new Error("The arity cannot be higher than 1 when the option only supports the --arg=value syntax");if(!Number.isInteger(i))throw new Error(`The arity must be an integer, got ${i}`);if(i<0)throw new Error(`The arity must be positive, got ${i}`);this.allOptionNames.push(...e),this.options.push({names:e,description:r,arity:i,hidden:n,required:s,allowBinding:o})}setContext(e){this.context=e}usage({detailed:e=!0,inlineOptions:r=!0}={}){let i=[this.cliOpts.binaryName],n=[];if(this.paths.length>0&&i.push(...this.paths[0]),e){for(let{names:o,arity:a,hidden:l,description:c,required:u}of this.options){if(l)continue;let g=[];for(let h=0;h`:`[${f}]`)}i.push(...this.arity.leading.map(o=>`<${o}>`)),this.arity.extra===Ln?i.push("..."):i.push(...this.arity.extra.map(o=>`[${o}]`)),i.push(...this.arity.trailing.map(o=>`<${o}>`))}return{usage:i.join(" "),options:n}}compile(){if(typeof this.context=="undefined")throw new Error("Assertion failed: No context attached");let e=QU(),r=yl,i=this.usage().usage,n=this.options.filter(a=>a.required).map(a=>a.names);r=xs(e,qi()),ta(e,yl,sv,r,["setCandidateState",{candidateUsage:i,requiredOptions:n}]);let s=this.arity.proxy?"always":"isNotOptionLike",o=this.paths.length>0?this.paths:[[]];for(let a of o){let l=r;if(a.length>0){let f=xs(e,qi());cu(e,l,f),this.registerOptions(e,f),l=f}for(let f=0;f0||!this.arity.proxy){let f=xs(e,qi());pi(e,l,"isHelp",f,["useHelp",this.cliIndex]),ta(e,f,hi,Eh,["setSelectedIndex",Au]),this.registerOptions(e,l)}this.arity.leading.length>0&&ta(e,l,hi,Gi,["setError","Not enough positional arguments"]);let c=l;for(let f=0;f0||f+1!==this.arity.leading.length)&&ta(e,h,hi,Gi,["setError","Not enough positional arguments"]),pi(e,c,"isNotOptionLike",h,"pushPositional"),c=h}let u=c;if(this.arity.extra===Ln||this.arity.extra.length>0){let f=xs(e,qi());if(cu(e,c,f),this.arity.extra===Ln){let h=xs(e,qi());this.arity.proxy||this.registerOptions(e,h),pi(e,c,s,h,"pushExtraNoLimits"),pi(e,h,s,h,"pushExtraNoLimits"),cu(e,h,f)}else for(let h=0;h0&&ta(e,u,hi,Gi,["setError","Not enough positional arguments"]);let g=u;for(let f=0;fo.length>s.length?o:s,"");if(i.arity===0)for(let s of i.names)pi(e,r,["isOption",s,i.hidden||s!==n],r,"pushTrue"),s.startsWith("--")&&!s.startsWith("--no-")&&pi(e,r,["isNegatedOption",s],r,["pushFalse",s]);else{let s=xs(e,qi());for(let o of i.names)pi(e,r,["isOption",o,i.hidden||o!==n],s,"pushUndefined");for(let o=0;o=0&&egCe(i,n),suggest:(n,s)=>cCe(i,n,s)}}};var kU=80,mv=Array(kU).fill("\u2501");for(let t=0;t<=24;++t)mv[mv.length-t]=`[38;5;${232+t}m\u2501`;var Ev={header:t=>`\u2501\u2501\u2501 ${t}${t.length`${t}`,error:t=>`${t}`,code:t=>`${t}`},PU={header:t=>t,bold:t=>t,error:t=>t,code:t=>t};function hCe(t){let e=t.split(` +`),r=e.filter(n=>n.match(/\S/)),i=r.length>0?r.reduce((n,s)=>Math.min(n,s.length-s.trimStart().length),Number.MAX_VALUE):0;return e.map(n=>n.slice(i).trimRight()).join(` +`)}function Vn(t,{format:e,paragraphs:r}){return t=t.replace(/\r\n?/g,` +`),t=hCe(t),t=t.replace(/^\n+|\n+$/g,""),t=t.replace(/^(\s*)-([^\n]*?)\n+/gm,`$1-$2 + +`),t=t.replace(/\n(\n)?\n*/g,"$1"),r&&(t=t.split(/\n/).map(i=>{let n=i.match(/^\s*[*-][\t ]+(.*)/);if(!n)return i.match(/(.{1,80})(?: |$)/g).join(` +`);let s=i.length-i.trimStart().length;return n[1].match(new RegExp(`(.{1,${78-s}})(?: |$)`,"g")).map((o,a)=>" ".repeat(s)+(a===0?"- ":" ")+o).join(` +`)}).join(` + +`)),t=t.replace(/(`+)((?:.|[\n])*?)\1/g,(i,n,s)=>e.code(n+s+n)),t=t.replace(/(\*\*)((?:.|[\n])*?)\1/g,(i,n,s)=>e.bold(n+s+n)),t?`${t} +`:""}var bh=class extends ye{constructor(e){super();this.contexts=e,this.commands=[]}static from(e,r){let i=new bh(r);i.path=e.path;for(let n of e.options)switch(n.name){case"-c":i.commands.push(Number(n.value));break;case"-i":i.index=Number(n.value);break}return i}async execute(){let e=this.commands;if(typeof this.index!="undefined"&&this.index>=0&&this.index1){this.context.stdout.write(`Multiple commands match your selection: +`),this.context.stdout.write(` +`);let r=0;for(let i of this.commands)this.context.stdout.write(this.cli.usage(this.contexts[i].commandClass,{prefix:`${r++}. `.padStart(5)}));this.context.stdout.write(` +`),this.context.stdout.write(`Run again with -h= to see the longer details of any of those commands. +`)}}};var DU=Symbol("clipanion/errorCommand");function pCe(){return process.env.FORCE_COLOR==="0"?!1:!!(process.env.FORCE_COLOR==="1"||typeof process.stdout!="undefined"&&process.stdout.isTTY)}var oo=class{constructor({binaryLabel:e,binaryName:r="...",binaryVersion:i,enableColors:n=pCe()}={}){this.registrations=new Map,this.builder=new Qh({binaryName:r}),this.binaryLabel=e,this.binaryName=r,this.binaryVersion=i,this.enableColors=n}static from(e,r={}){let i=new oo(r);for(let n of e)i.register(n);return i}register(e){var r;let i=new Map,n=new e;for(let l in n){let c=n[l];typeof c=="object"&&c!==null&&c[ye.isOption]&&i.set(l,c)}let s=this.builder.command(),o=s.cliIndex,a=(r=e.paths)!==null&&r!==void 0?r:n.paths;if(typeof a!="undefined")for(let l of a)s.addPath(l);this.registrations.set(e,{specs:i,builder:s,index:o});for(let[l,{definition:c}]of i.entries())c(s,l);s.setContext({commandClass:e})}process(e){let{contexts:r,process:i}=this.builder.compile(),n=i(e);switch(n.selectedIndex){case Au:return bh.from(n,r);default:{let{commandClass:s}=r[n.selectedIndex],o=this.registrations.get(s);if(typeof o=="undefined")throw new Error("Assertion failed: Expected the command class to have been registered.");let a=new s;a.path=n.path;try{for(let[l,{transformer:c}]of o.specs.entries())a[l]=c(o.builder,l,n);return a}catch(l){throw l[DU]=a,l}}break}}async run(e,r){let i;if(!Array.isArray(e))i=e;else try{i=this.process(e)}catch(s){return r.stdout.write(this.error(s)),1}if(i.help)return r.stdout.write(this.usage(i,{detailed:!0})),0;i.context=r,i.cli={binaryLabel:this.binaryLabel,binaryName:this.binaryName,binaryVersion:this.binaryVersion,enableColors:this.enableColors,definitions:()=>this.definitions(),error:(s,o)=>this.error(s,o),process:s=>this.process(s),run:(s,o)=>this.run(s,P(P({},r),o)),usage:(s,o)=>this.usage(s,o)};let n;try{n=await i.validateAndExecute().catch(s=>i.catch(s).then(()=>0))}catch(s){return r.stdout.write(this.error(s,{command:i})),1}return n}async runExit(e,r){process.exitCode=await this.run(e,r)}suggest(e,r){let{suggest:i}=this.builder.compile();return i(e,r)}definitions({colored:e=!1}={}){let r=[];for(let[i,{index:n}]of this.registrations){if(typeof i.usage=="undefined")continue;let{usage:s}=this.getUsageByIndex(n,{detailed:!1}),{usage:o,options:a}=this.getUsageByIndex(n,{detailed:!0,inlineOptions:!1}),l=typeof i.usage.category!="undefined"?Vn(i.usage.category,{format:this.format(e),paragraphs:!1}):void 0,c=typeof i.usage.description!="undefined"?Vn(i.usage.description,{format:this.format(e),paragraphs:!1}):void 0,u=typeof i.usage.details!="undefined"?Vn(i.usage.details,{format:this.format(e),paragraphs:!0}):void 0,g=typeof i.usage.examples!="undefined"?i.usage.examples.map(([f,h])=>[Vn(f,{format:this.format(e),paragraphs:!1}),h.replace(/\$0/g,this.binaryName)]):void 0;r.push({path:s,usage:o,category:l,description:c,details:u,examples:g,options:a})}return r}usage(e=null,{colored:r,detailed:i=!1,prefix:n="$ "}={}){var s;if(e===null){for(let l of this.registrations.keys()){let c=l.paths,u=typeof l.usage!="undefined";if(!c||c.length===0||c.length===1&&c[0].length===0||((s=c==null?void 0:c.some(h=>h.length===0))!==null&&s!==void 0?s:!1))if(e){e=null;break}else e=l;else if(u){e=null;continue}}e&&(i=!0)}let o=e!==null&&e instanceof ye?e.constructor:e,a="";if(o)if(i){let{description:l="",details:c="",examples:u=[]}=o.usage||{};l!==""&&(a+=Vn(l,{format:this.format(r),paragraphs:!1}).replace(/^./,h=>h.toUpperCase()),a+=` +`),(c!==""||u.length>0)&&(a+=`${this.format(r).header("Usage")} +`,a+=` +`);let{usage:g,options:f}=this.getUsageByRegistration(o,{inlineOptions:!1});if(a+=`${this.format(r).bold(n)}${g} +`,f.length>0){a+=` +`,a+=`${Ev.header("Options")} +`;let h=f.reduce((p,d)=>Math.max(p,d.definition.length),0);a+=` +`;for(let{definition:p,description:d}of f)a+=` ${this.format(r).bold(p.padEnd(h))} ${Vn(d,{format:this.format(r),paragraphs:!1})}`}if(c!==""&&(a+=` +`,a+=`${this.format(r).header("Details")} +`,a+=` +`,a+=Vn(c,{format:this.format(r),paragraphs:!0})),u.length>0){a+=` +`,a+=`${this.format(r).header("Examples")} +`;for(let[h,p]of u)a+=` +`,a+=Vn(h,{format:this.format(r),paragraphs:!1}),a+=`${p.replace(/^/m,` ${this.format(r).bold(n)}`).replace(/\$0/g,this.binaryName)} +`}}else{let{usage:l}=this.getUsageByRegistration(o);a+=`${this.format(r).bold(n)}${l} +`}else{let l=new Map;for(let[f,{index:h}]of this.registrations.entries()){if(typeof f.usage=="undefined")continue;let p=typeof f.usage.category!="undefined"?Vn(f.usage.category,{format:this.format(r),paragraphs:!1}):null,d=l.get(p);typeof d=="undefined"&&l.set(p,d=[]);let{usage:m}=this.getUsageByIndex(h);d.push({commandClass:f,usage:m})}let c=Array.from(l.keys()).sort((f,h)=>f===null?-1:h===null?1:f.localeCompare(h,"en",{usage:"sort",caseFirst:"upper"})),u=typeof this.binaryLabel!="undefined",g=typeof this.binaryVersion!="undefined";u||g?(u&&g?a+=`${this.format(r).header(`${this.binaryLabel} - ${this.binaryVersion}`)} + +`:u?a+=`${this.format(r).header(`${this.binaryLabel}`)} +`:a+=`${this.format(r).header(`${this.binaryVersion}`)} +`,a+=` ${this.format(r).bold(n)}${this.binaryName} +`):a+=`${this.format(r).bold(n)}${this.binaryName} +`;for(let f of c){let h=l.get(f).slice().sort((d,m)=>d.usage.localeCompare(m.usage,"en",{usage:"sort",caseFirst:"upper"})),p=f!==null?f.trim():"General commands";a+=` +`,a+=`${this.format(r).header(`${p}`)} +`;for(let{commandClass:d,usage:m}of h){let I=d.usage.description||"undocumented";a+=` +`,a+=` ${this.format(r).bold(m)} +`,a+=` ${Vn(I,{format:this.format(r),paragraphs:!1})}`}}a+=` +`,a+=Vn("You can also print more details about any of these commands by calling them with the `-h,--help` flag right after the command name.",{format:this.format(r),paragraphs:!0})}return a}error(e,r){var i,{colored:n,command:s=(i=e[DU])!==null&&i!==void 0?i:null}=r===void 0?{}:r;e instanceof Error||(e=new Error(`Execution failed with a non-error rejection (rejected value: ${JSON.stringify(e)})`));let o="",a=e.name.replace(/([a-z])([A-Z])/g,"$1 $2");a==="Error"&&(a="Internal Error"),o+=`${this.format(n).error(a)}: ${e.message} +`;let l=e.clipanion;return typeof l!="undefined"?l.type==="usage"&&(o+=` +`,o+=this.usage(s)):e.stack&&(o+=`${e.stack.replace(/^.*\n/,"")} +`),o}getUsageByRegistration(e,r){let i=this.registrations.get(e);if(typeof i=="undefined")throw new Error("Assertion failed: Unregistered command");return this.getUsageByIndex(i.index,r)}getUsageByIndex(e,r){return this.builder.getBuilderByIndex(e).usage(r)}format(e=this.enableColors){return e?Ev:PU}};oo.defaultContext={stdin:process.stdin,stdout:process.stdout,stderr:process.stderr};var Iv={};it(Iv,{DefinitionsCommand:()=>qE,HelpCommand:()=>JE,VersionCommand:()=>WE});var qE=class extends ye{async execute(){this.context.stdout.write(`${JSON.stringify(this.cli.definitions(),null,2)} +`)}};qE.paths=[["--clipanion=definitions"]];var JE=class extends ye{async execute(){this.context.stdout.write(this.cli.usage())}};JE.paths=[["-h"],["--help"]];var WE=class extends ye{async execute(){var e;this.context.stdout.write(`${(e=this.cli.binaryVersion)!==null&&e!==void 0?e:""} +`)}};WE.paths=[["-v"],["--version"]];var Y={};it(Y,{Array:()=>RU,Boolean:()=>FU,Counter:()=>NU,Proxy:()=>LU,Rest:()=>TU,String:()=>MU,applyValidator:()=>Bh,cleanValidationError:()=>HE,formatError:()=>wh,isOptionSymbol:()=>yh,makeCommandOption:()=>ji,rerouteArguments:()=>so});function RU(t,e,r){let[i,n]=so(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return ji({definition(l){l.addOption({names:o,arity:s,hidden:n==null?void 0:n.hidden,description:n==null?void 0:n.description,required:n.required})},transformer(l,c,u){let g=typeof i!="undefined"?[...i]:void 0;for(let{name:f,value:h}of u.options)!a.has(f)||(g=g!=null?g:[],g.push(h));return g}})}function FU(t,e,r){let[i,n]=so(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return ji({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u=f);return u}})}function NU(t,e,r){let[i,n]=so(e,r!=null?r:{}),s=t.split(","),o=new Set(s);return ji({definition(a){a.addOption({names:s,allowBinding:!1,arity:0,hidden:n.hidden,description:n.description,required:n.required})},transformer(a,l,c){let u=i;for(let{name:g,value:f}of c.options)!o.has(g)||(u!=null||(u=0),f?u+=1:u=0);return u}})}function LU(t={}){return ji({definition(e,r){var i;e.addProxy({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){return i.positionals.map(({value:n})=>n)}})}function TU(t={}){return ji({definition(e,r){var i;e.addRest({name:(i=t.name)!==null&&i!==void 0?i:r,required:t.required})},transformer(e,r,i){let n=o=>{let a=i.positionals[o];return a.extra===Ln||a.extra===!1&&oo)}})}function dCe(t,e,r){let[i,n]=so(e,r!=null?r:{}),{arity:s=1}=n,o=t.split(","),a=new Set(o);return ji({definition(l){l.addOption({names:o,arity:n.tolerateBoolean?0:s,hidden:n.hidden,description:n.description,required:n.required})},transformer(l,c,u){let g,f=i;for(let{name:h,value:p}of u.options)!a.has(h)||(g=h,f=p);return typeof f=="string"?Bh(g!=null?g:c,f,n.validator):f}})}function CCe(t={}){let{required:e=!0}=t;return ji({definition(r,i){var n;r.addPositional({name:(n=t.name)!==null&&n!==void 0?n:i,required:t.required})},transformer(r,i,n){var s;for(let o=0;oJSON.stringify(i)).join(", ")})`);return e}function kl(t,e){let r=[];for(let i of t){let n=e(i);n!==LH&&r.push(n)}return r}var LH=Symbol();kl.skip=LH;function MH(t,e){for(let r of t){let i=e(r);if(i!==TH)return i}}var TH=Symbol();MH.skip=TH;function Tv(t){return typeof t=="object"&&t!==null}function aI(t){if(t instanceof Map&&(t=Object.fromEntries(t)),Tv(t))for(let e of Object.keys(t)){let r=t[e];Tv(r)&&(t[e]=aI(r))}return t}function na(t,e,r){let i=t.get(e);return typeof i=="undefined"&&t.set(e,i=r()),i}function hu(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=[]),r}function Pl(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Set),r}function pu(t,e){let r=t.get(e);return typeof r=="undefined"&&t.set(e,r=new Map),r}async function kEe(t,e){if(e==null)return await t();try{return await t()}finally{await e()}}async function du(t,e){try{return await t()}catch(r){throw r.message=e(r.message),r}}function Mv(t,e){try{return t()}catch(r){throw r.message=e(r.message),r}}async function Cu(t){return await new Promise((e,r)=>{let i=[];t.on("error",n=>{r(n)}),t.on("data",n=>{i.push(n)}),t.on("end",()=>{e(Buffer.concat(i))})})}var OH=class extends Fv.Transform{constructor(){super(...arguments);this.chunks=[]}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: BufferStream only accept buffers");this.chunks.push(e),i(null,null)}_flush(e){e(null,Buffer.concat(this.chunks))}},KH=class extends Fv.Transform{constructor(e=Buffer.alloc(0)){super();this.active=!0;this.ifEmpty=e}_transform(e,r,i){if(r!=="buffer"||!Buffer.isBuffer(e))throw new Error("Assertion failed: DefaultStream only accept buffers");this.active=!1,i(null,e)}_flush(e){this.active&&this.ifEmpty.length>0?e(null,this.ifEmpty):e(null)}},Uh=eval("require");function UH(t){return Uh(M.fromPortablePath(t))}function HH(path){let physicalPath=M.fromPortablePath(path),currentCacheEntry=Uh.cache[physicalPath];delete Uh.cache[physicalPath];let result;try{result=UH(physicalPath);let freshCacheEntry=Uh.cache[physicalPath],dynamicModule=eval("module"),freshCacheIndex=dynamicModule.children.indexOf(freshCacheEntry);freshCacheIndex!==-1&&dynamicModule.children.splice(freshCacheIndex,1)}finally{Uh.cache[physicalPath]=currentCacheEntry}return result}var GH=new Map;function PEe(t){let e=GH.get(t),r=T.statSync(t);if((e==null?void 0:e.mtime)===r.mtimeMs)return e.instance;let i=HH(t);return GH.set(t,{mtime:r.mtimeMs,instance:i}),i}var Dl;(function(i){i[i.NoCache=0]="NoCache",i[i.FsTime=1]="FsTime",i[i.Node=2]="Node"})(Dl||(Dl={}));function mu(t,{cachingStrategy:e=2}={}){switch(e){case 0:return HH(t);case 1:return PEe(t);case 2:return UH(t);default:throw new Error("Unsupported caching strategy")}}function gn(t,e){let r=Array.from(t);Array.isArray(e)||(e=[e]);let i=[];for(let s of e)i.push(r.map(o=>s(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function DEe(t){return t.length===0?null:t.map(e=>`(${FH.default.makeRe(e,{windows:!1,dot:!0}).source})`).join("|")}function Ov(t,{env:e}){let r=/\${(?[\d\w_]+)(?:)?(?:-(?[^}]*))?}/g;return t.replace(r,(...i)=>{let{variableName:n,colon:s,fallback:o}=i[i.length-1],a=Object.prototype.hasOwnProperty.call(e,n),l=e[n];if(l||a&&!s)return l;if(o!=null)return o;throw new me(`Environment variable not found (${n})`)})}function Hh(t){switch(t){case"true":case"1":case 1:case!0:return!0;case"false":case"0":case 0:case!1:return!1;default:throw new Error(`Couldn't parse "${t}" as a boolean`)}}function jH(t){return typeof t=="undefined"?t:Hh(t)}function Kv(t){try{return jH(t)}catch{return null}}function REe(t){return!!(M.isAbsolute(t)||t.match(/^(\.{1,2}|~)\//))}var S={};it(S,{areDescriptorsEqual:()=>i3,areIdentsEqual:()=>cp,areLocatorsEqual:()=>up,areVirtualPackagesEquivalent:()=>XQe,bindDescriptor:()=>VQe,bindLocator:()=>_Qe,convertDescriptorToLocator:()=>By,convertLocatorToDescriptor:()=>WQe,convertPackageToLocator:()=>zQe,convertToIdent:()=>JQe,convertToManifestRange:()=>ebe,copyPackage:()=>ap,devirtualizeDescriptor:()=>Ap,devirtualizeLocator:()=>lp,getIdentVendorPath:()=>Lx,isPackageCompatible:()=>Sy,isVirtualDescriptor:()=>hA,isVirtualLocator:()=>Io,makeDescriptor:()=>Yt,makeIdent:()=>Eo,makeLocator:()=>Vi,makeRange:()=>by,parseDescriptor:()=>pA,parseFileStyleRange:()=>ZQe,parseIdent:()=>En,parseLocator:()=>Hl,parseRange:()=>Tu,prettyDependent:()=>Nx,prettyDescriptor:()=>Xt,prettyIdent:()=>Vr,prettyLocator:()=>lt,prettyLocatorNoColors:()=>Rx,prettyRange:()=>yy,prettyReference:()=>fp,prettyResolution:()=>Fx,prettyWorkspace:()=>hp,renamePackage:()=>op,slugifyIdent:()=>Dx,slugifyLocator:()=>Mu,sortDescriptors:()=>Ou,stringifyDescriptor:()=>In,stringifyIdent:()=>St,stringifyLocator:()=>is,tryParseDescriptor:()=>gp,tryParseIdent:()=>n3,tryParseLocator:()=>Qy,virtualizeDescriptor:()=>kx,virtualizePackage:()=>Px});var Lu=ie(require("querystring")),e3=ie(Or()),t3=ie(wY());var mn={};it(mn,{checksumFile:()=>Ey,checksumPattern:()=>Iy,makeHash:()=>zi});var my=ie(require("crypto")),Sx=ie(vx());function zi(...t){let e=(0,my.createHash)("sha512"),r="";for(let i of t)typeof i=="string"?r+=i:i&&(r&&(e.update(r),r=""),e.update(i));return r&&e.update(r),e.digest("hex")}async function Ey(t,{baseFs:e,algorithm:r}={baseFs:T,algorithm:"sha512"}){let i=await e.openPromise(t,"r");try{let n=65536,s=Buffer.allocUnsafeSlow(n),o=(0,my.createHash)(r),a=0;for(;(a=await e.readPromise(i,s,0,n))!==0;)o.update(a===n?s:s.slice(0,a));return o.digest("hex")}finally{await e.closePromise(i)}}async function Iy(t,{cwd:e}){let i=(await(0,Sx.default)(t,{cwd:M.fromPortablePath(e),expandDirectories:!1,onlyDirectories:!0,unique:!0})).map(a=>`${a}/**/*`),n=await(0,Sx.default)([t,...i],{cwd:M.fromPortablePath(e),expandDirectories:!1,onlyFiles:!1,unique:!0});n.sort();let s=await Promise.all(n.map(async a=>{let l=[Buffer.from(a)],c=M.toPortablePath(a),u=await T.lstatPromise(c);return u.isSymbolicLink()?l.push(Buffer.from(await T.readlinkPromise(c))):u.isFile()&&l.push(await T.readFilePromise(c)),l.join("\0")})),o=(0,my.createHash)("sha512");for(let a of s)o.update(a);return o.digest("hex")}var wy="virtual:",YQe=5,r3=/(os|cpu)=([a-z0-9_-]+)/,qQe=(0,t3.makeParser)(r3);function Eo(t,e){if(t==null?void 0:t.startsWith("@"))throw new Error("Invalid scope: don't prefix it with '@'");return{identHash:zi(t,e),scope:t,name:e}}function Yt(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:zi(t.identHash,e),range:e}}function Vi(t,e){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:zi(t.identHash,e),reference:e}}function JQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name}}function By(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.descriptorHash,reference:t.range}}function WQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,descriptorHash:t.locatorHash,range:t.reference}}function zQe(t){return{identHash:t.identHash,scope:t.scope,name:t.name,locatorHash:t.locatorHash,reference:t.reference}}function op(t,e){return{identHash:e.identHash,scope:e.scope,name:e.name,locatorHash:e.locatorHash,reference:e.reference,version:t.version,languageName:t.languageName,linkType:t.linkType,conditions:t.conditions,dependencies:new Map(t.dependencies),peerDependencies:new Map(t.peerDependencies),dependenciesMeta:new Map(t.dependenciesMeta),peerDependenciesMeta:new Map(t.peerDependenciesMeta),bin:new Map(t.bin)}}function ap(t){return op(t,t)}function kx(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return Yt(t,`virtual:${e}#${t.range}`)}function Px(t,e){if(e.includes("#"))throw new Error("Invalid entropy");return op(t,Vi(t,`virtual:${e}#${t.reference}`))}function hA(t){return t.range.startsWith(wy)}function Io(t){return t.reference.startsWith(wy)}function Ap(t){if(!hA(t))throw new Error("Not a virtual descriptor");return Yt(t,t.range.replace(/^[^#]*#/,""))}function lp(t){if(!Io(t))throw new Error("Not a virtual descriptor");return Vi(t,t.reference.replace(/^[^#]*#/,""))}function VQe(t,e){return t.range.includes("::")?t:Yt(t,`${t.range}::${Lu.default.stringify(e)}`)}function _Qe(t,e){return t.reference.includes("::")?t:Vi(t,`${t.reference}::${Lu.default.stringify(e)}`)}function cp(t,e){return t.identHash===e.identHash}function i3(t,e){return t.descriptorHash===e.descriptorHash}function up(t,e){return t.locatorHash===e.locatorHash}function XQe(t,e){if(!Io(t))throw new Error("Invalid package type");if(!Io(e))throw new Error("Invalid package type");if(!cp(t,e)||t.dependencies.size!==e.dependencies.size)return!1;for(let r of t.dependencies.values()){let i=e.dependencies.get(r.identHash);if(!i||!i3(r,i))return!1}return!0}function En(t){let e=n3(t);if(!e)throw new Error(`Invalid ident (${t})`);return e}function n3(t){let e=t.match(/^(?:@([^/]+?)\/)?([^/]+)$/);if(!e)return null;let[,r,i]=e,n=typeof r!="undefined"?r:null;return Eo(n,i)}function pA(t,e=!1){let r=gp(t,e);if(!r)throw new Error(`Invalid descriptor (${t})`);return r}function gp(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid range (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Yt(Eo(o,n),a)}function Hl(t,e=!1){let r=Qy(t,e);if(!r)throw new Error(`Invalid locator (${t})`);return r}function Qy(t,e=!1){let r=e?t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))$/):t.match(/^(?:@([^/]+?)\/)?([^/]+?)(?:@(.+))?$/);if(!r)return null;let[,i,n,s]=r;if(s==="unknown")throw new Error(`Invalid reference (${t})`);let o=typeof i!="undefined"?i:null,a=typeof s!="undefined"?s:"unknown";return Vi(Eo(o,n),a)}function Tu(t,e){let r=t.match(/^([^#:]*:)?((?:(?!::)[^#])*)(?:#((?:(?!::).)*))?(?:::(.*))?$/);if(r===null)throw new Error(`Invalid range (${t})`);let i=typeof r[1]!="undefined"?r[1]:null;if(typeof(e==null?void 0:e.requireProtocol)=="string"&&i!==e.requireProtocol)throw new Error(`Invalid protocol (${i})`);if((e==null?void 0:e.requireProtocol)&&i===null)throw new Error(`Missing protocol (${i})`);let n=typeof r[3]!="undefined"?decodeURIComponent(r[2]):null;if((e==null?void 0:e.requireSource)&&n===null)throw new Error(`Missing source (${t})`);let s=typeof r[3]!="undefined"?decodeURIComponent(r[3]):decodeURIComponent(r[2]),o=(e==null?void 0:e.parseSelector)?Lu.default.parse(s):s,a=typeof r[4]!="undefined"?Lu.default.parse(r[4]):null;return{protocol:i,source:n,selector:o,params:a}}function ZQe(t,{protocol:e}){let{selector:r,params:i}=Tu(t,{requireProtocol:e,requireBindings:!0});if(typeof i.locator!="string")throw new Error(`Assertion failed: Invalid bindings for ${t}`);return{parentLocator:Hl(i.locator,!0),path:r}}function s3(t){return t=t.replace(/%/g,"%25"),t=t.replace(/:/g,"%3A"),t=t.replace(/#/g,"%23"),t}function $Qe(t){return t===null?!1:Object.entries(t).length>0}function by({protocol:t,source:e,selector:r,params:i}){let n="";return t!==null&&(n+=`${t}`),e!==null&&(n+=`${s3(e)}#`),n+=s3(r),$Qe(i)&&(n+=`::${Lu.default.stringify(i)}`),n}function ebe(t){let{params:e,protocol:r,source:i,selector:n}=Tu(t);for(let s in e)s.startsWith("__")&&delete e[s];return by({protocol:r,source:i,params:e,selector:n})}function St(t){return t.scope?`@${t.scope}/${t.name}`:`${t.name}`}function In(t){return t.scope?`@${t.scope}/${t.name}@${t.range}`:`${t.name}@${t.range}`}function is(t){return t.scope?`@${t.scope}/${t.name}@${t.reference}`:`${t.name}@${t.reference}`}function Dx(t){return t.scope!==null?`@${t.scope}-${t.name}`:t.name}function Mu(t){let{protocol:e,selector:r}=Tu(t.reference),i=e!==null?e.replace(/:$/,""):"exotic",n=e3.default.valid(r),s=n!==null?`${i}-${n}`:`${i}`,o=10,a=t.scope?`${Dx(t)}-${s}-${t.locatorHash.slice(0,o)}`:`${Dx(t)}-${s}-${t.locatorHash.slice(0,o)}`;return kr(a)}function Vr(t,e){return e.scope?`${Ve(t,`@${e.scope}/`,Le.SCOPE)}${Ve(t,e.name,Le.NAME)}`:`${Ve(t,e.name,Le.NAME)}`}function vy(t){if(t.startsWith(wy)){let e=vy(t.substr(t.indexOf("#")+1)),r=t.substr(wy.length,YQe);return`${e} [${r}]`}else return t.replace(/\?.*/,"?[...]")}function yy(t,e){return`${Ve(t,vy(e),Le.RANGE)}`}function Xt(t,e){return`${Vr(t,e)}${Ve(t,"@",Le.RANGE)}${yy(t,e.range)}`}function fp(t,e){return`${Ve(t,vy(e),Le.REFERENCE)}`}function lt(t,e){return`${Vr(t,e)}${Ve(t,"@",Le.REFERENCE)}${fp(t,e.reference)}`}function Rx(t){return`${St(t)}@${vy(t.reference)}`}function Ou(t){return gn(t,[e=>St(e),e=>e.range])}function hp(t,e){return Vr(t,e.locator)}function Fx(t,e,r){let i=hA(e)?Ap(e):e;return r===null?`${Xt(t,i)} \u2192 ${xx(t).Cross}`:i.identHash===r.identHash?`${Xt(t,i)} \u2192 ${fp(t,r.reference)}`:`${Xt(t,i)} \u2192 ${lt(t,r)}`}function Nx(t,e,r){return r===null?`${lt(t,e)}`:`${lt(t,e)} (via ${yy(t,r.range)})`}function Lx(t){return`node_modules/${St(t)}`}function Sy(t,e){return t.conditions?qQe(t.conditions,r=>{let[,i,n]=r.match(r3),s=e[i];return s?s.includes(n):!0}):!0}var gt;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(gt||(gt={}));var oi;(function(i){i.Dependency="Dependency",i.PeerDependency="PeerDependency",i.PeerDependencyMeta="PeerDependencyMeta"})(oi||(oi={}));var ki;(function(i){i.Inactive="inactive",i.Redundant="redundant",i.Active="active"})(ki||(ki={}));var Le={NO_HINT:"NO_HINT",NULL:"NULL",SCOPE:"SCOPE",NAME:"NAME",RANGE:"RANGE",REFERENCE:"REFERENCE",NUMBER:"NUMBER",PATH:"PATH",URL:"URL",ADDED:"ADDED",REMOVED:"REMOVED",CODE:"CODE",DURATION:"DURATION",SIZE:"SIZE",IDENT:"IDENT",DESCRIPTOR:"DESCRIPTOR",LOCATOR:"LOCATOR",RESOLUTION:"RESOLUTION",DEPENDENT:"DEPENDENT",PACKAGE_EXTENSION:"PACKAGE_EXTENSION",SETTING:"SETTING"},Gl;(function(e){e[e.BOLD=2]="BOLD"})(Gl||(Gl={}));var Tx=dp.default.GITHUB_ACTIONS?{level:2}:pp.default.supportsColor?{level:pp.default.supportsColor.level}:{level:0},xy=Tx.level!==0,Mx=xy&&!dp.default.GITHUB_ACTIONS&&!dp.default.CIRCLE&&!dp.default.GITLAB,Ox=new pp.default.Instance(Tx),tbe=new Map([[Le.NO_HINT,null],[Le.NULL,["#a853b5",129]],[Le.SCOPE,["#d75f00",166]],[Le.NAME,["#d7875f",173]],[Le.RANGE,["#00afaf",37]],[Le.REFERENCE,["#87afff",111]],[Le.NUMBER,["#ffd700",220]],[Le.PATH,["#d75fd7",170]],[Le.URL,["#d75fd7",170]],[Le.ADDED,["#5faf00",70]],[Le.REMOVED,["#d70000",160]],[Le.CODE,["#87afff",111]],[Le.SIZE,["#ffd700",220]]]),Ls=t=>t,ky={[Le.NUMBER]:Ls({pretty:(t,e)=>`${e}`,json:t=>t}),[Le.IDENT]:Ls({pretty:(t,e)=>Vr(t,e),json:t=>St(t)}),[Le.LOCATOR]:Ls({pretty:(t,e)=>lt(t,e),json:t=>is(t)}),[Le.DESCRIPTOR]:Ls({pretty:(t,e)=>Xt(t,e),json:t=>In(t)}),[Le.RESOLUTION]:Ls({pretty:(t,{descriptor:e,locator:r})=>Fx(t,e,r),json:({descriptor:t,locator:e})=>({descriptor:In(t),locator:e!==null?is(e):null})}),[Le.DEPENDENT]:Ls({pretty:(t,{locator:e,descriptor:r})=>Nx(t,e,r),json:({locator:t,descriptor:e})=>({locator:is(t),descriptor:In(e)})}),[Le.PACKAGE_EXTENSION]:Ls({pretty:(t,e)=>{switch(e.type){case oi.Dependency:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"dependencies",Le.CODE)} \u27A4 ${Vr(t,e.descriptor)}`;case oi.PeerDependency:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"peerDependencies",Le.CODE)} \u27A4 ${Vr(t,e.descriptor)}`;case oi.PeerDependencyMeta:return`${Vr(t,e.parentDescriptor)} \u27A4 ${On(t,"peerDependenciesMeta",Le.CODE)} \u27A4 ${Vr(t,En(e.selector))} \u27A4 ${On(t,e.key,Le.CODE)}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${e.type}`)}},json:t=>{switch(t.type){case oi.Dependency:return`${St(t.parentDescriptor)} > ${St(t.descriptor)}`;case oi.PeerDependency:return`${St(t.parentDescriptor)} >> ${St(t.descriptor)}`;case oi.PeerDependencyMeta:return`${St(t.parentDescriptor)} >> ${t.selector} / ${t.key}`;default:throw new Error(`Assertion failed: Unsupported package extension type: ${t.type}`)}}}),[Le.SETTING]:Ls({pretty:(t,e)=>(t.get(e),Ku(t,On(t,e,Le.CODE),`https://yarnpkg.com/configuration/yarnrc#${e}`)),json:t=>t}),[Le.DURATION]:Ls({pretty:(t,e)=>{if(e>1e3*60){let r=Math.floor(e/1e3/60),i=Math.ceil((e-r*60*1e3)/1e3);return i===0?`${r}m`:`${r}m ${i}s`}else{let r=Math.floor(e/1e3),i=e-r*1e3;return i===0?`${r}s`:`${r}s ${i}ms`}},json:t=>t}),[Le.SIZE]:Ls({pretty:(t,e)=>{let r=["KB","MB","GB","TB"],i=r.length;for(;i>1&&e<1024**i;)i-=1;let n=1024**i,s=Math.floor(e*100/n)/100;return On(t,`${s} ${r[i-1]}`,Le.NUMBER)},json:t=>t}),[Le.PATH]:Ls({pretty:(t,e)=>On(t,M.fromPortablePath(e),Le.PATH),json:t=>M.fromPortablePath(t)})};function jl(t,e){return[e,t]}function Py(t,e,r){return t.get("enableColors")&&r&2&&(e=pp.default.bold(e)),e}function On(t,e,r){if(!t.get("enableColors"))return e;let i=tbe.get(r);if(i===null)return e;let n=typeof i=="undefined"?r:Tx.level>=3?i[0]:i[1],s=typeof n=="number"?Ox.ansi256(n):n.startsWith("#")?Ox.hex(n):Ox[n];if(typeof s!="function")throw new Error(`Invalid format type ${n}`);return s(e)}var rbe=!!process.env.KONSOLE_VERSION;function Ku(t,e,r){return t.get("enableHyperlinks")?rbe?`]8;;${r}\\${e}]8;;\\`:`]8;;${r}\x07${e}]8;;\x07`:e}function Ve(t,e,r){if(e===null)return On(t,"null",Le.NULL);if(Object.prototype.hasOwnProperty.call(ky,r))return ky[r].pretty(t,e);if(typeof e!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof e}`);return On(t,e,r)}function Kx(t,e,r,{separator:i=", "}={}){return[...e].map(n=>Ve(t,n,r)).join(i)}function Uu(t,e){if(t===null)return null;if(Object.prototype.hasOwnProperty.call(ky,e))return Nv(e),ky[e].json(t);if(typeof t!="string")throw new Error(`Assertion failed: Expected the value to be a string, got ${typeof t}`);return t}function xx(t){return{Check:On(t,"\u2713","green"),Cross:On(t,"\u2718","red"),Question:On(t,"?","cyan")}}function Yl(t,{label:e,value:[r,i]}){return`${Ve(t,e,Le.CODE)}: ${Ve(t,r,i)}`}var Ts;(function(n){n.Error="error",n.Warning="warning",n.Info="info",n.Discard="discard"})(Ts||(Ts={}));function Cp(t,{configuration:e}){let r=e.get("logFilters"),i=new Map,n=new Map,s=[];for(let g of r){let f=g.get("level");if(typeof f=="undefined")continue;let h=g.get("code");typeof h!="undefined"&&i.set(h,f);let p=g.get("text");typeof p!="undefined"&&n.set(p,f);let d=g.get("pattern");typeof d!="undefined"&&s.push([o3.default.matcher(d,{contains:!0}),f])}s.reverse();let o=(g,f,h)=>{if(g===null||g===z.UNNAMED)return h;let p=n.size>0||s.length>0?(0,a3.default)(f):f;if(n.size>0){let d=n.get(p);if(typeof d!="undefined")return d!=null?d:h}if(s.length>0){for(let[d,m]of s)if(d(p))return m!=null?m:h}if(i.size>0){let d=i.get(KE(g));if(typeof d!="undefined")return d!=null?d:h}return h},a=t.reportInfo,l=t.reportWarning,c=t.reportError,u=function(g,f,h,p){switch(o(f,h,p)){case Ts.Info:a.call(g,f,h);break;case Ts.Warning:l.call(g,f!=null?f:z.UNNAMED,h);break;case Ts.Error:c.call(g,f!=null?f:z.UNNAMED,h);break}};t.reportInfo=function(...g){return u(this,...g,Ts.Info)},t.reportWarning=function(...g){return u(this,...g,Ts.Warning)},t.reportError=function(...g){return u(this,...g,Ts.Error)}}var Zt={};it(Zt,{Method:()=>Jl,RequestError:()=>z8.RequestError,del:()=>pxe,get:()=>fxe,getNetworkSettings:()=>Z8,post:()=>iP,put:()=>hxe,request:()=>xp});var q8=ie(zy()),J8=ie(require("https")),W8=ie(require("http")),tP=ie(Nn()),rP=ie(G8()),Vy=ie(require("url"));var j8=ie(require("stream")),Y8=ie(require("string_decoder"));var nt=class extends Error{constructor(e,r,i){super(r);this.reportExtra=i;this.reportCode=e}};function Axe(t){return typeof t.reportCode!="undefined"}var Xi=class{constructor(){this.reportedInfos=new Set;this.reportedWarnings=new Set;this.reportedErrors=new Set}static progressViaCounter(e){let r=0,i,n=new Promise(l=>{i=l}),s=l=>{let c=i;n=new Promise(u=>{i=u}),r=l,c()},o=(l=0)=>{s(r+1)},a=async function*(){for(;r{let o=i.write(s),a;do if(a=o.indexOf(` +`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",e!==null?this.reportInfo(null,`${e} ${l}`):this.reportInfo(null,l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&(e!==null?this.reportInfo(null,`${e} ${s}`):this.reportInfo(null,s))}),r}};var z8=ie(zy()),V8=new Map,_8=new Map,lxe=new W8.Agent({keepAlive:!0}),cxe=new J8.Agent({keepAlive:!0});function X8(t){let e=new Vy.URL(t),r={host:e.hostname,headers:{}};return e.port&&(r.port=Number(e.port)),{proxy:r}}async function uxe(t){return na(_8,t,()=>T.readFilePromise(t).then(e=>(_8.set(t,e),e)))}function gxe({statusCode:t,statusMessage:e},r){let i=Ve(r,t,Le.NUMBER),n=`https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/${t}`;return Ku(r,`${i}${e?` (${e})`:""}`,n)}async function _y(t,{configuration:e,customErrorMessage:r}){var i,n;try{return await t}catch(s){if(s.name!=="HTTPError")throw s;let o=(n=r==null?void 0:r(s))!=null?n:(i=s.response.body)==null?void 0:i.error;o==null&&(s.message.startsWith("Response code")?o="The remote server failed to provide the requested resource":o=s.message),s instanceof q8.TimeoutError&&s.event==="socket"&&(o+=`(can be increased via ${Ve(e,"httpTimeout",Le.SETTING)})`);let a=new nt(z.NETWORK_ERROR,o,l=>{s.response&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Response Code",value:jl(Le.NO_HINT,gxe(s.response,e))})}`),s.request&&(l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Method",value:jl(Le.NO_HINT,s.request.options.method)})}`),l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request URL",value:jl(Le.URL,s.request.requestUrl)})}`)),s.request.redirects.length>0&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Redirects",value:jl(Le.NO_HINT,Kx(e,s.request.redirects,Le.URL))})}`),s.request.retryCount===s.request.options.retry.limit&&l.reportError(z.NETWORK_ERROR,` ${Yl(e,{label:"Request Retry Count",value:jl(Le.NO_HINT,`${Ve(e,s.request.retryCount,Le.NUMBER)} (can be increased via ${Ve(e,"httpRetry",Le.SETTING)})`)})}`)});throw a.originalError=s,a}}function Z8(t,e){let r=[...e.configuration.get("networkSettings")].sort(([o],[a])=>a.length-o.length),i={enableNetwork:void 0,caFilePath:void 0,httpProxy:void 0,httpsProxy:void 0},n=Object.keys(i),s=typeof t=="string"?new Vy.URL(t):t;for(let[o,a]of r)if(tP.default.isMatch(s.hostname,o))for(let l of n){let c=a.get(l);c!==null&&typeof i[l]=="undefined"&&(i[l]=c)}for(let o of n)typeof i[o]=="undefined"&&(i[o]=e.configuration.get(o));return i}var Jl;(function(n){n.GET="GET",n.PUT="PUT",n.POST="POST",n.DELETE="DELETE"})(Jl||(Jl={}));async function xp(t,e,{configuration:r,headers:i,jsonRequest:n,jsonResponse:s,method:o=Jl.GET}){let a=typeof t=="string"?new Vy.URL(t):t,l=Z8(a,{configuration:r});if(l.enableNetwork===!1)throw new Error(`Request to '${a.href}' has been blocked because of your configuration settings`);if(a.protocol==="http:"&&!tP.default.isMatch(a.hostname,r.get("unsafeHttpWhitelist")))throw new Error(`Unsafe http requests must be explicitly whitelisted in your configuration (${a.hostname})`);let u={agent:{http:l.httpProxy?rP.default.httpOverHttp(X8(l.httpProxy)):lxe,https:l.httpsProxy?rP.default.httpsOverHttp(X8(l.httpsProxy)):cxe},headers:i,method:o};u.responseType=s?"json":"buffer",e!==null&&(Buffer.isBuffer(e)||!n&&typeof e=="string"?u.body=e:u.json=e);let g=r.get("httpTimeout"),f=r.get("httpRetry"),h=r.get("enableStrictSsl"),p=l.caFilePath,{default:d}=await Promise.resolve().then(()=>ie(zy())),m=p?await uxe(p):void 0,I=d.extend(P({timeout:{socket:g},retry:f,https:{rejectUnauthorized:h,certificateAuthority:m}},u));return r.getLimit("networkConcurrency")(()=>I(a))}async function fxe(t,n){var s=n,{configuration:e,jsonResponse:r}=s,i=qr(s,["configuration","jsonResponse"]);let o=na(V8,t,()=>_y(xp(t,null,P({configuration:e},i)),{configuration:e}).then(a=>(V8.set(t,a.body),a.body)));return Buffer.isBuffer(o)===!1&&(o=await o),r?JSON.parse(o.toString()):o}async function hxe(t,e,n){var s=n,{customErrorMessage:r}=s,i=qr(s,["customErrorMessage"]);return(await _y(xp(t,e,_(P({},i),{method:Jl.PUT})),i)).body}async function iP(t,e,n){var s=n,{customErrorMessage:r}=s,i=qr(s,["customErrorMessage"]);return(await _y(xp(t,e,_(P({},i),{method:Jl.POST})),i)).body}async function pxe(t,i){var n=i,{customErrorMessage:e}=n,r=qr(n,["customErrorMessage"]);return(await _y(xp(t,null,_(P({},r),{method:Jl.DELETE})),r)).body}var Kt={};it(Kt,{PackageManager:()=>tn,detectPackageManager:()=>a9,executePackageAccessibleBinary:()=>g9,executePackageScript:()=>Uw,executePackageShellcode:()=>rD,executeWorkspaceAccessibleBinary:()=>qFe,executeWorkspaceLifecycleScript:()=>u9,executeWorkspaceScript:()=>c9,getPackageAccessibleBinaries:()=>Hw,getWorkspaceAccessibleBinaries:()=>l9,hasPackageScript:()=>GFe,hasWorkspaceScript:()=>tD,makeScriptEnv:()=>Vp,maybeExecuteWorkspaceLifecycleScript:()=>YFe,prepareExternalProject:()=>HFe});var Fp={};it(Fp,{getLibzipPromise:()=>$i,getLibzipSync:()=>v4});var yA=["number","number"],nP;(function(D){D[D.ZIP_ER_OK=0]="ZIP_ER_OK",D[D.ZIP_ER_MULTIDISK=1]="ZIP_ER_MULTIDISK",D[D.ZIP_ER_RENAME=2]="ZIP_ER_RENAME",D[D.ZIP_ER_CLOSE=3]="ZIP_ER_CLOSE",D[D.ZIP_ER_SEEK=4]="ZIP_ER_SEEK",D[D.ZIP_ER_READ=5]="ZIP_ER_READ",D[D.ZIP_ER_WRITE=6]="ZIP_ER_WRITE",D[D.ZIP_ER_CRC=7]="ZIP_ER_CRC",D[D.ZIP_ER_ZIPCLOSED=8]="ZIP_ER_ZIPCLOSED",D[D.ZIP_ER_NOENT=9]="ZIP_ER_NOENT",D[D.ZIP_ER_EXISTS=10]="ZIP_ER_EXISTS",D[D.ZIP_ER_OPEN=11]="ZIP_ER_OPEN",D[D.ZIP_ER_TMPOPEN=12]="ZIP_ER_TMPOPEN",D[D.ZIP_ER_ZLIB=13]="ZIP_ER_ZLIB",D[D.ZIP_ER_MEMORY=14]="ZIP_ER_MEMORY",D[D.ZIP_ER_CHANGED=15]="ZIP_ER_CHANGED",D[D.ZIP_ER_COMPNOTSUPP=16]="ZIP_ER_COMPNOTSUPP",D[D.ZIP_ER_EOF=17]="ZIP_ER_EOF",D[D.ZIP_ER_INVAL=18]="ZIP_ER_INVAL",D[D.ZIP_ER_NOZIP=19]="ZIP_ER_NOZIP",D[D.ZIP_ER_INTERNAL=20]="ZIP_ER_INTERNAL",D[D.ZIP_ER_INCONS=21]="ZIP_ER_INCONS",D[D.ZIP_ER_REMOVE=22]="ZIP_ER_REMOVE",D[D.ZIP_ER_DELETED=23]="ZIP_ER_DELETED",D[D.ZIP_ER_ENCRNOTSUPP=24]="ZIP_ER_ENCRNOTSUPP",D[D.ZIP_ER_RDONLY=25]="ZIP_ER_RDONLY",D[D.ZIP_ER_NOPASSWD=26]="ZIP_ER_NOPASSWD",D[D.ZIP_ER_WRONGPASSWD=27]="ZIP_ER_WRONGPASSWD",D[D.ZIP_ER_OPNOTSUPP=28]="ZIP_ER_OPNOTSUPP",D[D.ZIP_ER_INUSE=29]="ZIP_ER_INUSE",D[D.ZIP_ER_TELL=30]="ZIP_ER_TELL",D[D.ZIP_ER_COMPRESSED_DATA=31]="ZIP_ER_COMPRESSED_DATA"})(nP||(nP={}));var $8=t=>({get HEAP8(){return t.HEAP8},get HEAPU8(){return t.HEAPU8},errors:nP,SEEK_SET:0,SEEK_CUR:1,SEEK_END:2,ZIP_CHECKCONS:4,ZIP_CREATE:1,ZIP_EXCL:2,ZIP_TRUNCATE:8,ZIP_RDONLY:16,ZIP_FL_OVERWRITE:8192,ZIP_FL_COMPRESSED:4,ZIP_OPSYS_DOS:0,ZIP_OPSYS_AMIGA:1,ZIP_OPSYS_OPENVMS:2,ZIP_OPSYS_UNIX:3,ZIP_OPSYS_VM_CMS:4,ZIP_OPSYS_ATARI_ST:5,ZIP_OPSYS_OS_2:6,ZIP_OPSYS_MACINTOSH:7,ZIP_OPSYS_Z_SYSTEM:8,ZIP_OPSYS_CPM:9,ZIP_OPSYS_WINDOWS_NTFS:10,ZIP_OPSYS_MVS:11,ZIP_OPSYS_VSE:12,ZIP_OPSYS_ACORN_RISC:13,ZIP_OPSYS_VFAT:14,ZIP_OPSYS_ALTERNATE_MVS:15,ZIP_OPSYS_BEOS:16,ZIP_OPSYS_TANDEM:17,ZIP_OPSYS_OS_400:18,ZIP_OPSYS_OS_X:19,ZIP_CM_DEFAULT:-1,ZIP_CM_STORE:0,ZIP_CM_DEFLATE:8,uint08S:t._malloc(1),uint16S:t._malloc(2),uint32S:t._malloc(4),uint64S:t._malloc(8),malloc:t._malloc,free:t._free,getValue:t.getValue,open:t.cwrap("zip_open","number",["string","number","number"]),openFromSource:t.cwrap("zip_open_from_source","number",["number","number","number"]),close:t.cwrap("zip_close","number",["number"]),discard:t.cwrap("zip_discard",null,["number"]),getError:t.cwrap("zip_get_error","number",["number"]),getName:t.cwrap("zip_get_name","string",["number","number","number"]),getNumEntries:t.cwrap("zip_get_num_entries","number",["number","number"]),delete:t.cwrap("zip_delete","number",["number","number"]),stat:t.cwrap("zip_stat","number",["number","string","number","number"]),statIndex:t.cwrap("zip_stat_index","number",["number",...yA,"number","number"]),fopen:t.cwrap("zip_fopen","number",["number","string","number"]),fopenIndex:t.cwrap("zip_fopen_index","number",["number",...yA,"number"]),fread:t.cwrap("zip_fread","number",["number","number","number","number"]),fclose:t.cwrap("zip_fclose","number",["number"]),dir:{add:t.cwrap("zip_dir_add","number",["number","string"])},file:{add:t.cwrap("zip_file_add","number",["number","string","number","number"]),getError:t.cwrap("zip_file_get_error","number",["number"]),getExternalAttributes:t.cwrap("zip_file_get_external_attributes","number",["number",...yA,"number","number","number"]),setExternalAttributes:t.cwrap("zip_file_set_external_attributes","number",["number",...yA,"number","number","number"]),setMtime:t.cwrap("zip_file_set_mtime","number",["number",...yA,"number","number"]),setCompression:t.cwrap("zip_set_file_compression","number",["number",...yA,"number","number"])},ext:{countSymlinks:t.cwrap("zip_ext_count_symlinks","number",["number"])},error:{initWithCode:t.cwrap("zip_error_init_with_code",null,["number","number"]),strerror:t.cwrap("zip_error_strerror","string",["number"])},name:{locate:t.cwrap("zip_name_locate","number",["number","string","number"])},source:{fromUnattachedBuffer:t.cwrap("zip_source_buffer_create","number",["number","number","number","number"]),fromBuffer:t.cwrap("zip_source_buffer","number",["number","number",...yA,"number"]),free:t.cwrap("zip_source_free",null,["number"]),keep:t.cwrap("zip_source_keep",null,["number"]),open:t.cwrap("zip_source_open","number",["number"]),close:t.cwrap("zip_source_close","number",["number"]),seek:t.cwrap("zip_source_seek","number",["number",...yA,"number"]),tell:t.cwrap("zip_source_tell","number",["number"]),read:t.cwrap("zip_source_read","number",["number","number","number"]),error:t.cwrap("zip_source_error","number",["number"]),setMtime:t.cwrap("zip_source_set_mtime","number",["number","number"])},struct:{stat:t.cwrap("zipstruct_stat","number",[]),statS:t.cwrap("zipstruct_statS","number",[]),statName:t.cwrap("zipstruct_stat_name","string",["number"]),statIndex:t.cwrap("zipstruct_stat_index","number",["number"]),statSize:t.cwrap("zipstruct_stat_size","number",["number"]),statCompSize:t.cwrap("zipstruct_stat_comp_size","number",["number"]),statCompMethod:t.cwrap("zipstruct_stat_comp_method","number",["number"]),statMtime:t.cwrap("zipstruct_stat_mtime","number",["number"]),statCrc:t.cwrap("zipstruct_stat_crc","number",["number"]),error:t.cwrap("zipstruct_error","number",[]),errorS:t.cwrap("zipstruct_errorS","number",[]),errorCodeZip:t.cwrap("zipstruct_error_code_zip","number",["number"])}});var BP=null;function v4(){return BP===null&&(BP=$8(b4())),BP}async function $i(){return v4()}var jp={};it(jp,{ShellError:()=>as,execute:()=>Fw,globUtils:()=>bw});var Hp={};it(Hp,{parseResolution:()=>gw,parseShell:()=>Aw,parseSyml:()=>Ii,stringifyArgument:()=>SP,stringifyArgumentSegment:()=>xP,stringifyArithmeticExpression:()=>uw,stringifyCommand:()=>vP,stringifyCommandChain:()=>rg,stringifyCommandChainThen:()=>bP,stringifyCommandLine:()=>lw,stringifyCommandLineThen:()=>QP,stringifyEnvSegment:()=>cw,stringifyRedirectArgument:()=>Np,stringifyResolution:()=>fw,stringifyShell:()=>tg,stringifyShellLine:()=>tg,stringifySyml:()=>Qa,stringifyValueArgument:()=>ig});var k4=ie(x4());function Aw(t,e={isGlobPattern:()=>!1}){try{return(0,k4.parse)(t,e)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function tg(t,{endSemicolon:e=!1}={}){return t.map(({command:r,type:i},n)=>`${lw(r)}${i===";"?n!==t.length-1||e?";":"":" &"}`).join(" ")}function lw(t){return`${rg(t.chain)}${t.then?` ${QP(t.then)}`:""}`}function QP(t){return`${t.type} ${lw(t.line)}`}function rg(t){return`${vP(t)}${t.then?` ${bP(t.then)}`:""}`}function bP(t){return`${t.type} ${rg(t.chain)}`}function vP(t){switch(t.type){case"command":return`${t.envs.length>0?`${t.envs.map(e=>cw(e)).join(" ")} `:""}${t.args.map(e=>SP(e)).join(" ")}`;case"subshell":return`(${tg(t.subshell)})${t.args.length>0?` ${t.args.map(e=>Np(e)).join(" ")}`:""}`;case"group":return`{ ${tg(t.group,{endSemicolon:!0})} }${t.args.length>0?` ${t.args.map(e=>Np(e)).join(" ")}`:""}`;case"envs":return t.envs.map(e=>cw(e)).join(" ");default:throw new Error(`Unsupported command type: "${t.type}"`)}}function cw(t){return`${t.name}=${t.args[0]?ig(t.args[0]):""}`}function SP(t){switch(t.type){case"redirection":return Np(t);case"argument":return ig(t);default:throw new Error(`Unsupported argument type: "${t.type}"`)}}function Np(t){return`${t.subtype} ${t.args.map(e=>ig(e)).join(" ")}`}function ig(t){return t.segments.map(e=>xP(e)).join("")}function xP(t){let e=(i,n)=>n?`"${i}"`:i,r=i=>i===""?'""':i.match(/[(){}<>$|&; \t"']/)?`$'${i.replace(/\\/g,"\\\\").replace(/'/g,"\\'").replace(/\f/g,"\\f").replace(/\n/g,"\\n").replace(/\r/g,"\\r").replace(/\t/g,"\\t").replace(/\v/g,"\\v").replace(/\0/g,"\\0")}'`:i;switch(t.type){case"text":return r(t.text);case"glob":return t.pattern;case"shell":return e(`\${${tg(t.shell)}}`,t.quoted);case"variable":return e(typeof t.defaultValue=="undefined"?`\${${t.name}}`:t.defaultValue.length===0?`\${${t.name}:-}`:`\${${t.name}:-${t.defaultValue.map(i=>ig(i)).join(" ")}}`,t.quoted);case"arithmetic":return`$(( ${uw(t.arithmetic)} ))`;default:throw new Error(`Unsupported argument segment type: "${t.type}"`)}}function uw(t){let e=n=>{switch(n){case"addition":return"+";case"subtraction":return"-";case"multiplication":return"*";case"division":return"/";default:throw new Error(`Can't extract operator from arithmetic expression of type "${n}"`)}},r=(n,s)=>s?`( ${n} )`:n,i=n=>r(uw(n),!["number","variable"].includes(n.type));switch(t.type){case"number":return String(t.value);case"variable":return t.name;default:return`${i(t.left)} ${e(t.type)} ${i(t.right)}`}}var R4=ie(D4());function gw(t){let e=t.match(/^\*{1,2}\/(.*)/);if(e)throw new Error(`The override for '${t}' includes a glob pattern. Glob patterns have been removed since their behaviours don't match what you'd expect. Set the override to '${e[1]}' instead.`);try{return(0,R4.parse)(t)}catch(r){throw r.location&&(r.message=r.message.replace(/(\.)?$/,` (line ${r.location.start.line}, column ${r.location.start.column})$1`)),r}}function fw(t){let e="";return t.from&&(e+=t.from.fullName,t.from.description&&(e+=`@${t.from.description}`),e+="/"),e+=t.descriptor.fullName,t.descriptor.description&&(e+=`@${t.descriptor.description}`),e}var Qw=ie(w5()),b5=ie(Q5()),$De=/^(?![-?:,\][{}#&*!|>'"%@` \t\r\n]).([ \t]*(?![,\][{}:# \t\r\n]).)*$/,v5=["__metadata","version","resolution","dependencies","peerDependencies","dependenciesMeta","peerDependenciesMeta","binaries"],HP=class{constructor(e){this.data=e}};function S5(t){return t.match($De)?t:JSON.stringify(t)}function x5(t){return typeof t=="undefined"?!0:typeof t=="object"&&t!==null?Object.keys(t).every(e=>x5(t[e])):!1}function GP(t,e,r){if(t===null)return`null +`;if(typeof t=="number"||typeof t=="boolean")return`${t.toString()} +`;if(typeof t=="string")return`${S5(t)} +`;if(Array.isArray(t)){if(t.length===0)return`[] +`;let i=" ".repeat(e);return` +${t.map(s=>`${i}- ${GP(s,e+1,!1)}`).join("")}`}if(typeof t=="object"&&t){let i,n;t instanceof HP?(i=t.data,n=!1):(i=t,n=!0);let s=" ".repeat(e),o=Object.keys(i);n&&o.sort((l,c)=>{let u=v5.indexOf(l),g=v5.indexOf(c);return u===-1&&g===-1?lc?1:0:u!==-1&&g===-1?-1:u===-1&&g!==-1?1:u-g});let a=o.filter(l=>!x5(i[l])).map((l,c)=>{let u=i[l],g=S5(l),f=GP(u,e+1,!0),h=c>0||r?s:"";return f.startsWith(` +`)?`${h}${g}:${f}`:`${h}${g}: ${f}`}).join(e===0?` +`:"")||` +`;return r?` +${a}`:`${a}`}throw new Error(`Unsupported value type (${t})`)}function Qa(t){try{let e=GP(t,0,!1);return e!==` +`?e:""}catch(e){throw e.location&&(e.message=e.message.replace(/(\.)?$/,` (line ${e.location.start.line}, column ${e.location.start.column})$1`)),e}}Qa.PreserveOrdering=HP;function eRe(t){return t.endsWith(` +`)||(t+=` +`),(0,b5.parse)(t)}var tRe=/^(#.*(\r?\n))*?#\s+yarn\s+lockfile\s+v1\r?\n/i;function rRe(t){if(tRe.test(t))return eRe(t);let e=(0,Qw.safeLoad)(t,{schema:Qw.FAILSAFE_SCHEMA,json:!0});if(e==null)return{};if(typeof e!="object")throw new Error(`Expected an indexed object, got a ${typeof e} instead. Does your file follow Yaml's rules?`);if(Array.isArray(e))throw new Error("Expected an indexed object, got an array instead. Does your file follow Yaml's rules?");return e}function Ii(t){return rRe(t)}var U5=ie(jb()),H5=ie(require("os")),Kn=ie(require("stream")),G5=ie(require("util"));var as=class extends Error{constructor(e){super(e);this.name="ShellError"}};var bw={};it(bw,{fastGlobOptions:()=>D5,isBraceExpansion:()=>R5,isGlobPattern:()=>iRe,match:()=>nRe,micromatchOptions:()=>Sw});var k5=ie(gy()),P5=ie(require("fs")),vw=ie(Nn()),Sw={strictBrackets:!0},D5={onlyDirectories:!1,onlyFiles:!1};function iRe(t){if(!vw.default.scan(t,Sw).isGlob)return!1;try{vw.default.parse(t,Sw)}catch{return!1}return!0}function nRe(t,{cwd:e,baseFs:r}){return(0,k5.default)(t,_(P({},D5),{cwd:M.fromPortablePath(e),fs:SE(P5.default,new ah(r))}))}function R5(t){return vw.default.scan(t,Sw).isBrace}var F5=ie(bb()),Bo=ie(require("stream")),N5=ie(require("string_decoder")),wn;(function(i){i[i.STDIN=0]="STDIN",i[i.STDOUT=1]="STDOUT",i[i.STDERR=2]="STDERR"})(wn||(wn={}));var sc=new Set;function jP(){}function YP(){for(let t of sc)t.kill()}function L5(t,e,r,i){return n=>{let s=n[0]instanceof Bo.Transform?"pipe":n[0],o=n[1]instanceof Bo.Transform?"pipe":n[1],a=n[2]instanceof Bo.Transform?"pipe":n[2],l=(0,F5.default)(t,e,_(P({},i),{stdio:[s,o,a]}));return sc.add(l),sc.size===1&&(process.on("SIGINT",jP),process.on("SIGTERM",YP)),n[0]instanceof Bo.Transform&&n[0].pipe(l.stdin),n[1]instanceof Bo.Transform&&l.stdout.pipe(n[1],{end:!1}),n[2]instanceof Bo.Transform&&l.stderr.pipe(n[2],{end:!1}),{stdin:l.stdin,promise:new Promise(c=>{l.on("error",u=>{switch(sc.delete(l),sc.size===0&&(process.off("SIGINT",jP),process.off("SIGTERM",YP)),u.code){case"ENOENT":n[2].write(`command not found: ${t} +`),c(127);break;case"EACCES":n[2].write(`permission denied: ${t} +`),c(128);break;default:n[2].write(`uncaught error: ${u.message} +`),c(1);break}}),l.on("exit",u=>{sc.delete(l),sc.size===0&&(process.off("SIGINT",jP),process.off("SIGTERM",YP)),c(u!==null?u:129)})})}}}function T5(t){return e=>{let r=e[0]==="pipe"?new Bo.PassThrough:e[0];return{stdin:r,promise:Promise.resolve().then(()=>t({stdin:r,stdout:e[1],stderr:e[2]}))}}}var Os=class{constructor(e){this.stream=e}close(){}get(){return this.stream}},M5=class{constructor(){this.stream=null}close(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");this.stream.end()}attach(e){this.stream=e}get(){if(this.stream===null)throw new Error("Assertion failed: No stream attached");return this.stream}},Gp=class{constructor(e,r){this.stdin=null;this.stdout=null;this.stderr=null;this.pipe=null;this.ancestor=e,this.implementation=r}static start(e,{stdin:r,stdout:i,stderr:n}){let s=new Gp(null,e);return s.stdin=r,s.stdout=i,s.stderr=n,s}pipeTo(e,r=1){let i=new Gp(this,e),n=new M5;return i.pipe=n,i.stdout=this.stdout,i.stderr=this.stderr,(r&1)==1?this.stdout=n:this.ancestor!==null&&(this.stderr=this.ancestor.stdout),(r&2)==2?this.stderr=n:this.ancestor!==null&&(this.stderr=this.ancestor.stderr),i}async exec(){let e=["ignore","ignore","ignore"];if(this.pipe)e[0]="pipe";else{if(this.stdin===null)throw new Error("Assertion failed: No input stream registered");e[0]=this.stdin.get()}let r;if(this.stdout===null)throw new Error("Assertion failed: No output stream registered");r=this.stdout,e[1]=r.get();let i;if(this.stderr===null)throw new Error("Assertion failed: No error stream registered");i=this.stderr,e[2]=i.get();let n=this.implementation(e);return this.pipe&&this.pipe.attach(n.stdin),await n.promise.then(s=>(r.close(),i.close(),s))}async run(){let e=[];for(let i=this;i;i=i.ancestor)e.push(i.exec());return(await Promise.all(e))[0]}};function xw(t,e){return Gp.start(t,e)}function O5(t,e=null){let r=new Bo.PassThrough,i=new N5.StringDecoder,n="";return r.on("data",s=>{let o=i.write(s),a;do if(a=o.indexOf(` +`),a!==-1){let l=n+o.substr(0,a);o=o.substr(a+1),n="",t(e!==null?`${e} ${l}`:l)}while(a!==-1);n+=o}),r.on("end",()=>{let s=i.end();s!==""&&t(e!==null?`${e} ${s}`:s)}),r}function K5(t,{prefix:e}){return{stdout:O5(r=>t.stdout.write(`${r} +`),t.stdout.isTTY?e:null),stderr:O5(r=>t.stderr.write(`${r} +`),t.stderr.isTTY?e:null)}}var sRe=(0,G5.promisify)(setTimeout);var Fi;(function(r){r[r.Readable=1]="Readable",r[r.Writable=2]="Writable"})(Fi||(Fi={}));function j5(t,e,r){let i=new Kn.PassThrough({autoDestroy:!0});switch(t){case wn.STDIN:(e&1)==1&&r.stdin.pipe(i,{end:!1}),(e&2)==2&&r.stdin instanceof Kn.Writable&&i.pipe(r.stdin,{end:!1});break;case wn.STDOUT:(e&1)==1&&r.stdout.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stdout,{end:!1});break;case wn.STDERR:(e&1)==1&&r.stderr.pipe(i,{end:!1}),(e&2)==2&&i.pipe(r.stderr,{end:!1});break;default:throw new as(`Bad file descriptor: "${t}"`)}return i}function kw(t,e={}){let r=P(P({},t),e);return r.environment=P(P({},t.environment),e.environment),r.variables=P(P({},t.variables),e.variables),r}var oRe=new Map([["cd",async([t=(0,H5.homedir)(),...e],r,i)=>{let n=v.resolve(i.cwd,M.toPortablePath(t));if(!(await r.baseFs.statPromise(n).catch(o=>{throw o.code==="ENOENT"?new as(`cd: no such file or directory: ${t}`):o})).isDirectory())throw new as(`cd: not a directory: ${t}`);return i.cwd=n,0}],["pwd",async(t,e,r)=>(r.stdout.write(`${M.fromPortablePath(r.cwd)} +`),0)],[":",async(t,e,r)=>0],["true",async(t,e,r)=>0],["false",async(t,e,r)=>1],["exit",async([t,...e],r,i)=>i.exitCode=parseInt(t!=null?t:i.variables["?"],10)],["echo",async(t,e,r)=>(r.stdout.write(`${t.join(" ")} +`),0)],["sleep",async([t],e,r)=>{if(typeof t=="undefined")throw new as("sleep: missing operand");let i=Number(t);if(Number.isNaN(i))throw new as(`sleep: invalid time interval '${t}'`);return await sRe(1e3*i,0)}],["__ysh_run_procedure",async(t,e,r)=>{let i=r.procedures[t[0]];return await xw(i,{stdin:new Os(r.stdin),stdout:new Os(r.stdout),stderr:new Os(r.stderr)}).run()}],["__ysh_set_redirects",async(t,e,r)=>{let i=r.stdin,n=r.stdout,s=r.stderr,o=[],a=[],l=[],c=0;for(;t[c]!=="--";){let g=t[c++],{type:f,fd:h}=JSON.parse(g),p=B=>{switch(h){case null:case 0:o.push(B);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},d=B=>{switch(h){case null:case 1:a.push(B);break;case 2:l.push(B);break;default:throw new Error(`Unsupported file descriptor: "${h}"`)}},m=Number(t[c++]),I=c+m;for(let B=c;Be.baseFs.createReadStream(v.resolve(r.cwd,M.toPortablePath(t[B]))));break;case"<<<":p(()=>{let b=new Kn.PassThrough;return process.nextTick(()=>{b.write(`${t[B]} +`),b.end()}),b});break;case"<&":p(()=>j5(Number(t[B]),1,r));break;case">":case">>":{let b=v.resolve(r.cwd,M.toPortablePath(t[B]));d(b==="/dev/null"?new Kn.Writable({autoDestroy:!0,emitClose:!0,write(R,H,L){setImmediate(L)}}):e.baseFs.createWriteStream(b,f===">>"?{flags:"a"}:void 0))}break;case">&":d(j5(Number(t[B]),2,r));break;default:throw new Error(`Assertion failed: Unsupported redirection type: "${f}"`)}}if(o.length>0){let g=new Kn.PassThrough;i=g;let f=h=>{if(h===o.length)g.end();else{let p=o[h]();p.pipe(g,{end:!1}),p.on("end",()=>{f(h+1)})}};f(0)}if(a.length>0){let g=new Kn.PassThrough;n=g;for(let f of a)g.pipe(f)}if(l.length>0){let g=new Kn.PassThrough;s=g;for(let f of l)g.pipe(f)}let u=await xw(Yp(t.slice(c+1),e,r),{stdin:new Os(i),stdout:new Os(n),stderr:new Os(s)}).run();return await Promise.all(a.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),await Promise.all(l.map(g=>new Promise((f,h)=>{g.on("error",p=>{h(p)}),g.on("close",()=>{f()}),g.end()}))),u}]]);async function aRe(t,e,r){let i=[],n=new Kn.PassThrough;return n.on("data",s=>i.push(s)),await Pw(t,e,kw(r,{stdout:n})),Buffer.concat(i).toString().replace(/[\r\n]+$/,"")}async function Y5(t,e,r){let i=t.map(async s=>{let o=await oc(s.args,e,r);return{name:s.name,value:o.join(" ")}});return(await Promise.all(i)).reduce((s,o)=>(s[o.name]=o.value,s),{})}function Dw(t){return t.match(/[^ \r\n\t]+/g)||[]}async function q5(t,e,r,i,n=i){switch(t.name){case"$":i(String(process.pid));break;case"#":i(String(e.args.length));break;case"@":if(t.quoted)for(let s of e.args)n(s);else for(let s of e.args){let o=Dw(s);for(let a=0;a=0&&st+e,subtraction:(t,e)=>t-e,multiplication:(t,e)=>t*e,division:(t,e)=>Math.trunc(t/e)};async function qp(t,e,r){if(t.type==="number"){if(Number.isInteger(t.value))return t.value;throw new Error(`Invalid number: "${t.value}", only integers are allowed`)}else if(t.type==="variable"){let i=[];await q5(_(P({},t),{quoted:!0}),e,r,s=>i.push(s));let n=Number(i.join(" "));return Number.isNaN(n)?qp({type:"variable",name:i.join(" ")},e,r):qp({type:"number",value:n},e,r)}else return ARe[t.type](await qp(t.left,e,r),await qp(t.right,e,r))}async function oc(t,e,r){let i=new Map,n=[],s=[],o=u=>{s.push(u)},a=()=>{s.length>0&&n.push(s.join("")),s=[]},l=u=>{o(u),a()},c=(u,g,f)=>{let h=JSON.stringify({type:u,fd:g}),p=i.get(h);typeof p=="undefined"&&i.set(h,p=[]),p.push(f)};for(let u of t){let g=!1;switch(u.type){case"redirection":{let f=await oc(u.args,e,r);for(let h of f)c(u.subtype,u.fd,h)}break;case"argument":for(let f of u.segments)switch(f.type){case"text":o(f.text);break;case"glob":o(f.pattern),g=!0;break;case"shell":{let h=await aRe(f.shell,e,r);if(f.quoted)o(h);else{let p=Dw(h);for(let d=0;d0){let u=[];for(let[g,f]of i.entries())u.splice(u.length,0,g,String(f.length),...f);n.splice(0,0,"__ysh_set_redirects",...u,"--")}return n}function Yp(t,e,r){e.builtins.has(t[0])||(t=["command",...t]);let i=M.fromPortablePath(r.cwd),n=r.environment;typeof n.PWD!="undefined"&&(n=_(P({},n),{PWD:i}));let[s,...o]=t;if(s==="command")return L5(o[0],o.slice(1),e,{cwd:i,env:n});let a=e.builtins.get(s);if(typeof a=="undefined")throw new Error(`Assertion failed: A builtin should exist for "${s}"`);return T5(async({stdin:l,stdout:c,stderr:u})=>{let{stdin:g,stdout:f,stderr:h}=r;r.stdin=l,r.stdout=c,r.stderr=u;try{return await a(o,e,r)}finally{r.stdin=g,r.stdout=f,r.stderr=h}})}function lRe(t,e,r){return i=>{let n=new Kn.PassThrough,s=Pw(t,e,kw(r,{stdin:n}));return{stdin:n,promise:s}}}function cRe(t,e,r){return i=>{let n=new Kn.PassThrough,s=Pw(t,e,r);return{stdin:n,promise:s}}}function J5(t,e,r,i){if(e.length===0)return t;{let n;do n=String(Math.random());while(Object.prototype.hasOwnProperty.call(i.procedures,n));return i.procedures=P({},i.procedures),i.procedures[n]=t,Yp([...e,"__ysh_run_procedure",n],r,i)}}async function W5(t,e,r){let i=t,n=null,s=null;for(;i;){let o=i.then?P({},r):r,a;switch(i.type){case"command":{let l=await oc(i.args,e,r),c=await Y5(i.envs,e,r);a=i.envs.length?Yp(l,e,kw(o,{environment:c})):Yp(l,e,o)}break;case"subshell":{let l=await oc(i.args,e,r),c=lRe(i.subshell,e,o);a=J5(c,l,e,o)}break;case"group":{let l=await oc(i.args,e,r),c=cRe(i.group,e,o);a=J5(c,l,e,o)}break;case"envs":{let l=await Y5(i.envs,e,r);o.environment=P(P({},o.environment),l),a=Yp(["true"],e,o)}break}if(typeof a=="undefined")throw new Error("Assertion failed: An action should have been generated");if(n===null)s=xw(a,{stdin:new Os(o.stdin),stdout:new Os(o.stdout),stderr:new Os(o.stderr)});else{if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");switch(n){case"|":s=s.pipeTo(a,wn.STDOUT);break;case"|&":s=s.pipeTo(a,wn.STDOUT|wn.STDERR);break}}i.then?(n=i.then.type,i=i.then.chain):i=null}if(s===null)throw new Error("Assertion failed: The execution pipeline should have been setup");return await s.run()}async function uRe(t,e,r,{background:i=!1}={}){function n(s){let o=["#2E86AB","#A23B72","#F18F01","#C73E1D","#CCE2A3"],a=o[s%o.length];return U5.default.hex(a)}if(i){let s=r.nextBackgroundJobIndex++,o=n(s),a=`[${s}]`,l=o(a),{stdout:c,stderr:u}=K5(r,{prefix:l});return r.backgroundJobs.push(W5(t,e,kw(r,{stdout:c,stderr:u})).catch(g=>u.write(`${g.message} +`)).finally(()=>{r.stdout.isTTY&&r.stdout.write(`Job ${l}, '${o(rg(t))}' has ended +`)})),0}return await W5(t,e,r)}async function gRe(t,e,r,{background:i=!1}={}){let n,s=a=>{n=a,r.variables["?"]=String(a)},o=async a=>{try{return await uRe(a.chain,e,r,{background:i&&typeof a.then=="undefined"})}catch(l){if(!(l instanceof as))throw l;return r.stderr.write(`${l.message} +`),1}};for(s(await o(t));t.then;){if(r.exitCode!==null)return r.exitCode;switch(t.then.type){case"&&":n===0&&s(await o(t.then.line));break;case"||":n!==0&&s(await o(t.then.line));break;default:throw new Error(`Assertion failed: Unsupported command type: "${t.then.type}"`)}t=t.then.line}return n}async function Pw(t,e,r){let i=r.backgroundJobs;r.backgroundJobs=[];let n=0;for(let{command:s,type:o}of t){if(n=await gRe(s,e,r,{background:o==="&"}),r.exitCode!==null)return r.exitCode;r.variables["?"]=String(n)}return await Promise.all(r.backgroundJobs),r.backgroundJobs=i,n}function z5(t){switch(t.type){case"variable":return t.name==="@"||t.name==="#"||t.name==="*"||Number.isFinite(parseInt(t.name,10))||"defaultValue"in t&&!!t.defaultValue&&t.defaultValue.some(e=>Rw(e));case"arithmetic":return qP(t.arithmetic);case"shell":return JP(t.shell);default:return!1}}function Rw(t){switch(t.type){case"redirection":return t.args.some(e=>Rw(e));case"argument":return t.segments.some(e=>z5(e));default:throw new Error(`Assertion failed: Unsupported argument type: "${t.type}"`)}}function qP(t){switch(t.type){case"variable":return z5(t);case"number":return!1;default:return qP(t.left)||qP(t.right)}}function JP(t){return t.some(({command:e})=>{for(;e;){let r=e.chain;for(;r;){let i;switch(r.type){case"subshell":i=JP(r.subshell);break;case"command":i=r.envs.some(n=>n.args.some(s=>Rw(s)))||r.args.some(n=>Rw(n));break}if(i)return!0;if(!r.then)break;r=r.then.chain}if(!e.then)break;e=e.then.line}return!1})}async function Fw(t,e=[],{baseFs:r=new Wt,builtins:i={},cwd:n=M.toPortablePath(process.cwd()),env:s=process.env,stdin:o=process.stdin,stdout:a=process.stdout,stderr:l=process.stderr,variables:c={},glob:u=bw}={}){let g={};for(let[p,d]of Object.entries(s))typeof d!="undefined"&&(g[p]=d);let f=new Map(oRe);for(let[p,d]of Object.entries(i))f.set(p,d);o===null&&(o=new Kn.PassThrough,o.end());let h=Aw(t,u);if(!JP(h)&&h.length>0&&e.length>0){let{command:p}=h[h.length-1];for(;p.then;)p=p.then.line;let d=p.chain;for(;d.then;)d=d.then.chain;d.type==="command"&&(d.args=d.args.concat(e.map(m=>({type:"argument",segments:[{type:"text",text:m}]}))))}return await Pw(h,{args:e,baseFs:r,builtins:f,initialStdin:o,initialStdout:a,initialStderr:l,glob:u},{cwd:n,environment:g,exitCode:null,procedures:{},stdin:o,stdout:a,stderr:l,variables:Object.assign({},c,{["?"]:0}),nextBackgroundJobIndex:1,backgroundJobs:[]})}var s9=ie(ZP()),o9=ie(Wp()),cc=ie(require("stream"));var J6=ie(Or());var zp=class{supportsDescriptor(e,r){return!!(e.range.startsWith(zp.protocol)||r.project.tryWorkspaceByDescriptor(e)!==null)}supportsLocator(e,r){return!!e.reference.startsWith(zp.protocol)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[i.project.getWorkspaceByDescriptor(e).anchoredLocator]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.getWorkspaceByCwd(e.reference.slice(zp.protocol.length));return _(P({},e),{version:i.manifest.version||"0.0.0",languageName:"unknown",linkType:gt.SOFT,conditions:null,dependencies:new Map([...i.manifest.dependencies,...i.manifest.devDependencies]),peerDependencies:new Map([...i.manifest.peerDependencies]),dependenciesMeta:i.manifest.dependenciesMeta,peerDependenciesMeta:i.manifest.peerDependenciesMeta,bin:i.manifest.bin})}},Yr=zp;Yr.protocol="workspace:";var qt={};it(qt,{SemVer:()=>j6.SemVer,satisfiesWithPrereleases:()=>lc,validRange:()=>Us});var Lw=ie(Or()),j6=ie(Or()),Y6=new Map;function lc(t,e,r=!1){if(!t)return!1;let i=`${e}${r}`,n=Y6.get(i);if(typeof n=="undefined")try{n=new Lw.default.Range(e,{includePrerelease:!0,loose:r})}catch{return!1}finally{Y6.set(i,n||null)}else if(n===null)return!1;let s;try{s=new Lw.default.SemVer(t,n)}catch(o){return!1}return n.test(s)?!0:(s.prerelease&&(s.prerelease=[]),n.set.some(o=>{for(let a of o)a.semver.prerelease&&(a.semver.prerelease=[]);return o.every(a=>a.test(s))}))}var q6=new Map;function Us(t){if(t.indexOf(":")!==-1)return null;let e=q6.get(t);if(typeof e!="undefined")return e;try{e=new Lw.default.Range(t)}catch{e=null}return q6.set(t,e),e}var vA=class{constructor(){this.indent=" ";this.name=null;this.version=null;this.os=null;this.cpu=null;this.type=null;this.packageManager=null;this.private=!1;this.license=null;this.main=null;this.module=null;this.browser=null;this.languageName=null;this.bin=new Map;this.scripts=new Map;this.dependencies=new Map;this.devDependencies=new Map;this.peerDependencies=new Map;this.workspaceDefinitions=[];this.dependenciesMeta=new Map;this.peerDependenciesMeta=new Map;this.resolutions=[];this.files=null;this.publishConfig=null;this.installConfig=null;this.preferUnplugged=null;this.raw={};this.errors=[]}static async tryFind(e,{baseFs:r=new Wt}={}){let i=v.join(e,"package.json");return await r.existsPromise(i)?await vA.fromFile(i,{baseFs:r}):null}static async find(e,{baseFs:r}={}){let i=await vA.tryFind(e,{baseFs:r});if(i===null)throw new Error("Manifest not found");return i}static async fromFile(e,{baseFs:r=new Wt}={}){let i=new vA;return await i.loadFile(e,{baseFs:r}),i}static fromText(e){let r=new vA;return r.loadFromText(e),r}static isManifestFieldCompatible(e,r){if(e===null)return!0;let i=!0,n=!1;for(let s of e)if(s[0]==="!"){if(n=!0,r===s.slice(1))return!1}else if(i=!1,s===r)return!0;return n&&i}loadFromText(e){let r;try{r=JSON.parse(z6(e)||"{}")}catch(i){throw i.message+=` (when parsing ${e})`,i}this.load(r),this.indent=W6(e)}async loadFile(e,{baseFs:r=new Wt}){let i=await r.readFilePromise(e,"utf8"),n;try{n=JSON.parse(z6(i)||"{}")}catch(s){throw s.message+=` (when parsing ${e})`,s}this.load(n),this.indent=W6(i)}load(e,{yamlCompatibilityMode:r=!1}={}){if(typeof e!="object"||e===null)throw new Error(`Utterly invalid manifest data (${e})`);this.raw=e;let i=[];if(this.name=null,typeof e.name=="string")try{this.name=En(e.name)}catch(s){i.push(new Error("Parsing failed for the 'name' field"))}if(typeof e.version=="string"?this.version=e.version:this.version=null,Array.isArray(e.os)){let s=[];this.os=s;for(let o of e.os)typeof o!="string"?i.push(new Error("Parsing failed for the 'os' field")):s.push(o)}else this.os=null;if(Array.isArray(e.cpu)){let s=[];this.cpu=s;for(let o of e.cpu)typeof o!="string"?i.push(new Error("Parsing failed for the 'cpu' field")):s.push(o)}else this.cpu=null;if(typeof e.type=="string"?this.type=e.type:this.type=null,typeof e.packageManager=="string"?this.packageManager=e.packageManager:this.packageManager=null,typeof e.private=="boolean"?this.private=e.private:this.private=!1,typeof e.license=="string"?this.license=e.license:this.license=null,typeof e.languageName=="string"?this.languageName=e.languageName:this.languageName=null,typeof e.main=="string"?this.main=en(e.main):this.main=null,typeof e.module=="string"?this.module=en(e.module):this.module=null,e.browser!=null)if(typeof e.browser=="string")this.browser=en(e.browser);else{this.browser=new Map;for(let[s,o]of Object.entries(e.browser))this.browser.set(en(s),typeof o=="string"?en(o):o)}else this.browser=null;if(this.bin=new Map,typeof e.bin=="string")this.name!==null?this.bin.set(this.name.name,en(e.bin)):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.bin=="object"&&e.bin!==null)for(let[s,o]of Object.entries(e.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.bin.set(s,en(o))}if(this.scripts=new Map,typeof e.scripts=="object"&&e.scripts!==null)for(let[s,o]of Object.entries(e.scripts)){if(typeof o!="string"){i.push(new Error(`Invalid script definition for '${s}'`));continue}this.scripts.set(s,o)}if(this.dependencies=new Map,typeof e.dependencies=="object"&&e.dependencies!==null)for(let[s,o]of Object.entries(e.dependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=En(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.dependencies.set(l.identHash,l)}if(this.devDependencies=new Map,typeof e.devDependencies=="object"&&e.devDependencies!==null)for(let[s,o]of Object.entries(e.devDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=En(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.devDependencies.set(l.identHash,l)}if(this.peerDependencies=new Map,typeof e.peerDependencies=="object"&&e.peerDependencies!==null)for(let[s,o]of Object.entries(e.peerDependencies)){let a;try{a=En(s)}catch(c){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}(typeof o!="string"||!o.startsWith(Yr.protocol)&&!Us(o))&&(i.push(new Error(`Invalid dependency range for '${s}'`)),o="*");let l=Yt(a,o);this.peerDependencies.set(l.identHash,l)}typeof e.workspaces=="object"&&e.workspaces.nohoist&&i.push(new Error("'nohoist' is deprecated, please use 'installConfig.hoistingLimits' instead"));let n=Array.isArray(e.workspaces)?e.workspaces:typeof e.workspaces=="object"&&e.workspaces!==null&&Array.isArray(e.workspaces.packages)?e.workspaces.packages:[];this.workspaceDefinitions=[];for(let s of n){if(typeof s!="string"){i.push(new Error(`Invalid workspace definition for '${s}'`));continue}this.workspaceDefinitions.push({pattern:s})}if(this.dependenciesMeta=new Map,typeof e.dependenciesMeta=="object"&&e.dependenciesMeta!==null)for(let[s,o]of Object.entries(e.dependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}`));continue}let a=pA(s),l=this.ensureDependencyMeta(a),c=Tw(o.built,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid built meta field for '${s}'`));continue}let u=Tw(o.optional,{yamlCompatibilityMode:r});if(u===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}let g=Tw(o.unplugged,{yamlCompatibilityMode:r});if(g===null){i.push(new Error(`Invalid unplugged meta field for '${s}'`));continue}Object.assign(l,{built:c,optional:u,unplugged:g})}if(this.peerDependenciesMeta=new Map,typeof e.peerDependenciesMeta=="object"&&e.peerDependenciesMeta!==null)for(let[s,o]of Object.entries(e.peerDependenciesMeta)){if(typeof o!="object"||o===null){i.push(new Error(`Invalid meta field for '${s}'`));continue}let a=pA(s),l=this.ensurePeerDependencyMeta(a),c=Tw(o.optional,{yamlCompatibilityMode:r});if(c===null){i.push(new Error(`Invalid optional meta field for '${s}'`));continue}Object.assign(l,{optional:c})}if(this.resolutions=[],typeof e.resolutions=="object"&&e.resolutions!==null)for(let[s,o]of Object.entries(e.resolutions)){if(typeof o!="string"){i.push(new Error(`Invalid resolution entry for '${s}'`));continue}try{this.resolutions.push({pattern:gw(s),reference:o})}catch(a){i.push(a);continue}}if(Array.isArray(e.files)){this.files=new Set;for(let s of e.files){if(typeof s!="string"){i.push(new Error(`Invalid files entry for '${s}'`));continue}this.files.add(s)}}else this.files=null;if(typeof e.publishConfig=="object"&&e.publishConfig!==null){if(this.publishConfig={},typeof e.publishConfig.access=="string"&&(this.publishConfig.access=e.publishConfig.access),typeof e.publishConfig.main=="string"&&(this.publishConfig.main=en(e.publishConfig.main)),typeof e.publishConfig.module=="string"&&(this.publishConfig.module=en(e.publishConfig.module)),e.publishConfig.browser!=null)if(typeof e.publishConfig.browser=="string")this.publishConfig.browser=en(e.publishConfig.browser);else{this.publishConfig.browser=new Map;for(let[s,o]of Object.entries(e.publishConfig.browser))this.publishConfig.browser.set(en(s),typeof o=="string"?en(o):o)}if(typeof e.publishConfig.registry=="string"&&(this.publishConfig.registry=e.publishConfig.registry),typeof e.publishConfig.bin=="string")this.name!==null?this.publishConfig.bin=new Map([[this.name.name,en(e.publishConfig.bin)]]):i.push(new Error("String bin field, but no attached package name"));else if(typeof e.publishConfig.bin=="object"&&e.publishConfig.bin!==null){this.publishConfig.bin=new Map;for(let[s,o]of Object.entries(e.publishConfig.bin)){if(typeof o!="string"){i.push(new Error(`Invalid bin definition for '${s}'`));continue}this.publishConfig.bin.set(s,en(o))}}if(Array.isArray(e.publishConfig.executableFiles)){this.publishConfig.executableFiles=new Set;for(let s of e.publishConfig.executableFiles){if(typeof s!="string"){i.push(new Error("Invalid executable file definition"));continue}this.publishConfig.executableFiles.add(en(s))}}}else this.publishConfig=null;if(typeof e.installConfig=="object"&&e.installConfig!==null){this.installConfig={};for(let s of Object.keys(e.installConfig))s==="hoistingLimits"?typeof e.installConfig.hoistingLimits=="string"?this.installConfig.hoistingLimits=e.installConfig.hoistingLimits:i.push(new Error("Invalid hoisting limits definition")):s=="selfReferences"?typeof e.installConfig.selfReferences=="boolean"?this.installConfig.selfReferences=e.installConfig.selfReferences:i.push(new Error("Invalid selfReferences definition, must be a boolean value")):i.push(new Error(`Unrecognized installConfig key: ${s}`))}else this.installConfig=null;if(typeof e.optionalDependencies=="object"&&e.optionalDependencies!==null)for(let[s,o]of Object.entries(e.optionalDependencies)){if(typeof o!="string"){i.push(new Error(`Invalid dependency range for '${s}'`));continue}let a;try{a=En(s)}catch(g){i.push(new Error(`Parsing failed for the dependency name '${s}'`));continue}let l=Yt(a,o);this.dependencies.set(l.identHash,l);let c=Yt(a,"unknown"),u=this.ensureDependencyMeta(c);Object.assign(u,{optional:!0})}typeof e.preferUnplugged=="boolean"?this.preferUnplugged=e.preferUnplugged:this.preferUnplugged=null,this.errors=i}getForScope(e){switch(e){case"dependencies":return this.dependencies;case"devDependencies":return this.devDependencies;case"peerDependencies":return this.peerDependencies;default:throw new Error(`Unsupported value ("${e}")`)}}hasConsumerDependency(e){return!!(this.dependencies.has(e.identHash)||this.peerDependencies.has(e.identHash))}hasHardDependency(e){return!!(this.dependencies.has(e.identHash)||this.devDependencies.has(e.identHash))}hasSoftDependency(e){return!!this.peerDependencies.has(e.identHash)}hasDependency(e){return!!(this.hasHardDependency(e)||this.hasSoftDependency(e))}getConditions(){let e=[];return this.os&&this.os.length>0&&e.push(V6("os",this.os)),this.cpu&&this.cpu.length>0&&e.push(V6("cpu",this.cpu)),e.length>0?e.join(" & "):null}isCompatibleWithOS(e){return vA.isManifestFieldCompatible(this.os,e)}isCompatibleWithCPU(e){return vA.isManifestFieldCompatible(this.cpu,e)}ensureDependencyMeta(e){if(e.range!=="unknown"&&!J6.default.valid(e.range))throw new Error(`Invalid meta field range for '${In(e)}'`);let r=St(e),i=e.range!=="unknown"?e.range:null,n=this.dependenciesMeta.get(r);n||this.dependenciesMeta.set(r,n=new Map);let s=n.get(i);return s||n.set(i,s={}),s}ensurePeerDependencyMeta(e){if(e.range!=="unknown")throw new Error(`Invalid meta field range for '${In(e)}'`);let r=St(e),i=this.peerDependenciesMeta.get(r);return i||this.peerDependenciesMeta.set(r,i={}),i}setRawField(e,r,{after:i=[]}={}){let n=new Set(i.filter(s=>Object.prototype.hasOwnProperty.call(this.raw,s)));if(n.size===0||Object.prototype.hasOwnProperty.call(this.raw,e))this.raw[e]=r;else{let s=this.raw,o=this.raw={},a=!1;for(let l of Object.keys(s))o[l]=s[l],a||(n.delete(l),n.size===0&&(o[e]=r,a=!0))}}exportTo(e,{compatibilityMode:r=!0}={}){var s;if(Object.assign(e,this.raw),this.name!==null?e.name=St(this.name):delete e.name,this.version!==null?e.version=this.version:delete e.version,this.os!==null?e.os=this.os:delete e.os,this.cpu!==null?e.cpu=this.cpu:delete e.cpu,this.type!==null?e.type=this.type:delete e.type,this.packageManager!==null?e.packageManager=this.packageManager:delete e.packageManager,this.private?e.private=!0:delete e.private,this.license!==null?e.license=this.license:delete e.license,this.languageName!==null?e.languageName=this.languageName:delete e.languageName,this.main!==null?e.main=this.main:delete e.main,this.module!==null?e.module=this.module:delete e.module,this.browser!==null){let o=this.browser;typeof o=="string"?e.browser=o:o instanceof Map&&(e.browser=Object.assign({},...Array.from(o.keys()).sort().map(a=>({[a]:o.get(a)}))))}else delete e.browser;this.bin.size===1&&this.name!==null&&this.bin.has(this.name.name)?e.bin=this.bin.get(this.name.name):this.bin.size>0?e.bin=Object.assign({},...Array.from(this.bin.keys()).sort().map(o=>({[o]:this.bin.get(o)}))):delete e.bin,this.workspaceDefinitions.length>0?this.raw.workspaces&&!Array.isArray(this.raw.workspaces)?e.workspaces=_(P({},this.raw.workspaces),{packages:this.workspaceDefinitions.map(({pattern:o})=>o)}):e.workspaces=this.workspaceDefinitions.map(({pattern:o})=>o):this.raw.workspaces&&!Array.isArray(this.raw.workspaces)&&Object.keys(this.raw.workspaces).length>0?e.workspaces=this.raw.workspaces:delete e.workspaces;let i=[],n=[];for(let o of this.dependencies.values()){let a=this.dependenciesMeta.get(St(o)),l=!1;if(r&&a){let c=a.get(null);c&&c.optional&&(l=!0)}l?n.push(o):i.push(o)}i.length>0?e.dependencies=Object.assign({},...Ou(i).map(o=>({[St(o)]:o.range}))):delete e.dependencies,n.length>0?e.optionalDependencies=Object.assign({},...Ou(n).map(o=>({[St(o)]:o.range}))):delete e.optionalDependencies,this.devDependencies.size>0?e.devDependencies=Object.assign({},...Ou(this.devDependencies.values()).map(o=>({[St(o)]:o.range}))):delete e.devDependencies,this.peerDependencies.size>0?e.peerDependencies=Object.assign({},...Ou(this.peerDependencies.values()).map(o=>({[St(o)]:o.range}))):delete e.peerDependencies,e.dependenciesMeta={};for(let[o,a]of gn(this.dependenciesMeta.entries(),([l,c])=>l))for(let[l,c]of gn(a.entries(),([u,g])=>u!==null?`0${u}`:"1")){let u=l!==null?In(Yt(En(o),l)):o,g=P({},c);r&&l===null&&delete g.optional,Object.keys(g).length!==0&&(e.dependenciesMeta[u]=g)}if(Object.keys(e.dependenciesMeta).length===0&&delete e.dependenciesMeta,this.peerDependenciesMeta.size>0?e.peerDependenciesMeta=Object.assign({},...gn(this.peerDependenciesMeta.entries(),([o,a])=>o).map(([o,a])=>({[o]:a}))):delete e.peerDependenciesMeta,this.resolutions.length>0?e.resolutions=Object.assign({},...this.resolutions.map(({pattern:o,reference:a})=>({[fw(o)]:a}))):delete e.resolutions,this.files!==null?e.files=Array.from(this.files):delete e.files,this.preferUnplugged!==null?e.preferUnplugged=this.preferUnplugged:delete e.preferUnplugged,this.scripts!==null&&this.scripts.size>0){(s=e.scripts)!=null||(e.scripts={});for(let o of Object.keys(e.scripts))this.scripts.has(o)||delete e.scripts[o];for(let[o,a]of this.scripts.entries())e.scripts[o]=a}else delete e.scripts;return e}},Ze=vA;Ze.fileName="package.json",Ze.allDependencies=["dependencies","devDependencies","peerDependencies"],Ze.hardDependencies=["dependencies","devDependencies"];function W6(t){let e=t.match(/^[ \t]+/m);return e?e[0]:" "}function z6(t){return t.charCodeAt(0)===65279?t.slice(1):t}function en(t){return t.replace(/\\/g,"/")}function Tw(t,{yamlCompatibilityMode:e}){return e?Kv(t):typeof t=="undefined"||typeof t=="boolean"?t:null}function _6(t,e){let r=e.search(/[^!]/);if(r===-1)return"invalid";let i=r%2==0?"":"!",n=e.slice(r);return`${i}${t}=${n}`}function V6(t,e){return e.length===1?_6(t,e[0]):`(${e.map(r=>_6(t,r)).join(" | ")})`}var e9=ie($6()),Ow=ie(ml());var t9=["\u280B","\u2819","\u2839","\u2838","\u283C","\u2834","\u2826","\u2827","\u2807","\u280F"],r9=80,NFe=new Set([z.FETCH_NOT_CACHED,z.UNUSED_CACHE_ENTRY]),LFe=5,SA=Ow.default.GITHUB_ACTIONS?{start:t=>`::group::${t} +`,end:t=>`::endgroup:: +`}:Ow.default.TRAVIS?{start:t=>`travis_fold:start:${t} +`,end:t=>`travis_fold:end:${t} +`}:Ow.default.GITLAB?{start:t=>`section_start:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}[collapsed=true]\r${t} +`,end:t=>`section_end:${Math.floor(Date.now()/1e3)}:${t.toLowerCase().replace(/\W+/g,"_")}\r`}:null,i9=new Date,TFe=["iTerm.app","Apple_Terminal"].includes(process.env.TERM_PROGRAM)||!!process.env.WT_SESSION,MFe=t=>t,Kw=MFe({patrick:{date:[17,3],chars:["\u{1F340}","\u{1F331}"],size:40},simba:{date:[19,7],chars:["\u{1F981}","\u{1F334}"],size:40},jack:{date:[31,10],chars:["\u{1F383}","\u{1F987}"],size:40},hogsfather:{date:[31,12],chars:["\u{1F389}","\u{1F384}"],size:40},default:{chars:["=","-"],size:80}}),OFe=TFe&&Object.keys(Kw).find(t=>{let e=Kw[t];return!(e.date&&(e.date[0]!==i9.getDate()||e.date[1]!==i9.getMonth()+1))})||"default";function n9(t,{configuration:e,json:r}){if(!e.get("enableMessageNames"))return"";let n=KE(t===null?0:t);return!r&&t===null?Ve(e,n,"grey"):n}function eD(t,{configuration:e,json:r}){let i=n9(t,{configuration:e,json:r});if(!i||t===null||t===z.UNNAMED)return i;let n=z[t],s=`https://yarnpkg.com/advanced/error-codes#${i}---${n}`.toLowerCase();return Ku(e,i,s)}var Fe=class extends Xi{constructor({configuration:e,stdout:r,json:i=!1,includeFooter:n=!0,includeLogs:s=!i,includeInfos:o=s,includeWarnings:a=s,forgettableBufferSize:l=LFe,forgettableNames:c=new Set}){super();this.uncommitted=new Set;this.cacheHitCount=0;this.cacheMissCount=0;this.lastCacheMiss=null;this.warningCount=0;this.errorCount=0;this.startTime=Date.now();this.indent=0;this.progress=new Map;this.progressTime=0;this.progressFrame=0;this.progressTimeout=null;this.forgettableLines=[];Cp(this,{configuration:e}),this.configuration=e,this.forgettableBufferSize=l,this.forgettableNames=new Set([...c,...NFe]),this.includeFooter=n,this.includeInfos=o,this.includeWarnings=a,this.json=i,this.stdout=r;let u=this.configuration.get("progressBarStyle")||OFe;if(!Object.prototype.hasOwnProperty.call(Kw,u))throw new Error("Assertion failed: Invalid progress bar style");this.progressStyle=Kw[u];let g="\u27A4 YN0000: \u250C ".length,f=Math.max(0,Math.min(process.stdout.columns-g,80));this.progressMaxScaledSize=Math.floor(this.progressStyle.size*f/80)}static async start(e,r){let i=new this(e),n=process.emitWarning;process.emitWarning=(s,o)=>{if(typeof s!="string"){let l=s;s=l.message,o=o!=null?o:l.name}let a=typeof o!="undefined"?`${o}: ${s}`:s;i.reportWarning(z.UNNAMED,a)};try{await r(i)}catch(s){i.reportExceptionOnce(s)}finally{await i.finalize(),process.emitWarning=n}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){this.cacheHitCount+=1}reportCacheMiss(e,r){this.lastCacheMiss=e,this.cacheMissCount+=1,typeof r!="undefined"&&!this.configuration.get("preferAggregateCacheInfo")&&this.reportInfo(z.FETCH_NOT_CACHED,r)}startTimerSync(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${Ve(this.configuration,l-a,Le.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startTimerPromise(e,r,i){let n=typeof r=="function"?{}:r,s=typeof r=="function"?r:i,o={committed:!1,action:()=>{this.reportInfo(null,`\u250C ${e}`),this.indent+=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.start(e))}};n.skipIfEmpty?this.uncommitted.add(o):(o.action(),o.committed=!0);let a=Date.now();try{return await s()}catch(l){throw this.reportExceptionOnce(l),l}finally{let l=Date.now();this.uncommitted.delete(o),o.committed&&(this.indent-=1,SA!==null&&!this.json&&this.includeInfos&&this.stdout.write(SA.end(e)),this.configuration.get("enableTimers")&&l-a>200?this.reportInfo(null,`\u2514 Completed in ${Ve(this.configuration,l-a,Le.DURATION)}`):this.reportInfo(null,"\u2514 Completed"))}}async startCacheReport(e){let r=this.configuration.get("preferAggregateCacheInfo")?{cacheHitCount:this.cacheHitCount,cacheMissCount:this.cacheMissCount}:null;try{return await e()}catch(i){throw this.reportExceptionOnce(i),i}finally{r!==null&&this.reportCacheChanges(r)}}reportSeparator(){this.indent===0?this.writeLineWithForgettableReset(""):this.reportInfo(null,"")}reportInfo(e,r){if(!this.includeInfos)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"",s=`${Ve(this.configuration,"\u27A4","blueBright")} ${n}${this.formatIndent()}${r}`;if(this.json)this.reportJson({type:"info",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r});else if(this.forgettableNames.has(e))if(this.forgettableLines.push(s),this.forgettableLines.length>this.forgettableBufferSize){for(;this.forgettableLines.length>this.forgettableBufferSize;)this.forgettableLines.shift();this.writeLines(this.forgettableLines,{truncate:!0})}else this.writeLine(s,{truncate:!0});else this.writeLineWithForgettableReset(s)}reportWarning(e,r){if(this.warningCount+=1,!this.includeWarnings)return;this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"warning",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${Ve(this.configuration,"\u27A4","yellowBright")} ${n}${this.formatIndent()}${r}`)}reportError(e,r){this.errorCount+=1,this.commit();let i=this.formatNameWithHyperlink(e),n=i?`${i}: `:"";this.json?this.reportJson({type:"error",name:e,displayName:this.formatName(e),indent:this.formatIndent(),data:r}):this.writeLineWithForgettableReset(`${Ve(this.configuration,"\u27A4","redBright")} ${n}${this.formatIndent()}${r}`,{truncate:!1})}reportProgress(e){let r=!1,i=Promise.resolve().then(async()=>{let s={progress:0,title:void 0};this.progress.set(e,{definition:s,lastScaledSize:-1}),this.refreshProgress(-1);for await(let{progress:o,title:a}of e)r||s.progress===o&&s.title===a||(s.progress=o,s.title=a,this.refreshProgress());n()}),n=()=>{r||(r=!0,this.progress.delete(e),this.refreshProgress(1))};return _(P({},i),{stop:n})}reportJson(e){this.json&&this.writeLineWithForgettableReset(`${JSON.stringify(e)}`)}async finalize(){if(!this.includeFooter)return;let e="";this.errorCount>0?e="Failed with errors":this.warningCount>0?e="Done with warnings":e="Done";let r=Ve(this.configuration,Date.now()-this.startTime,Le.DURATION),i=this.configuration.get("enableTimers")?`${e} in ${r}`:e;this.errorCount>0?this.reportError(z.UNNAMED,i):this.warningCount>0?this.reportWarning(z.UNNAMED,i):this.reportInfo(z.UNNAMED,i)}writeLine(e,{truncate:r}={}){this.clearProgress({clear:!0}),this.stdout.write(`${this.truncate(e,{truncate:r})} +`),this.writeProgress()}writeLineWithForgettableReset(e,{truncate:r}={}){this.forgettableLines=[],this.writeLine(e,{truncate:r})}writeLines(e,{truncate:r}={}){this.clearProgress({delta:e.length});for(let i of e)this.stdout.write(`${this.truncate(i,{truncate:r})} +`);this.writeProgress()}reportCacheChanges({cacheHitCount:e,cacheMissCount:r}){let i=this.cacheHitCount-e,n=this.cacheMissCount-r;if(i===0&&n===0)return;let s="";this.cacheHitCount>1?s+=`${this.cacheHitCount} packages were already cached`:this.cacheHitCount===1?s+=" - one package was already cached":s+="No packages were cached",this.cacheHitCount>0?this.cacheMissCount>1?s+=`, ${this.cacheMissCount} had to be fetched`:this.cacheMissCount===1&&(s+=`, one had to be fetched (${lt(this.configuration,this.lastCacheMiss)})`):this.cacheMissCount>1?s+=` - ${this.cacheMissCount} packages had to be fetched`:this.cacheMissCount===1&&(s+=` - one package had to be fetched (${lt(this.configuration,this.lastCacheMiss)})`),this.reportInfo(z.FETCH_NOT_CACHED,s)}commit(){let e=this.uncommitted;this.uncommitted=new Set;for(let r of e)r.committed=!0,r.action()}clearProgress({delta:e=0,clear:r=!1}){!this.configuration.get("enableProgressBars")||this.json||this.progress.size+e>0&&(this.stdout.write(`[${this.progress.size+e}A`),(e>0||r)&&this.stdout.write(""))}writeProgress(){if(!this.configuration.get("enableProgressBars")||this.json||(this.progressTimeout!==null&&clearTimeout(this.progressTimeout),this.progressTimeout=null,this.progress.size===0))return;let e=Date.now();e-this.progressTime>r9&&(this.progressFrame=(this.progressFrame+1)%t9.length,this.progressTime=e);let r=t9[this.progressFrame];for(let i of this.progress.values()){let n=this.progressStyle.chars[0].repeat(i.lastScaledSize),s=this.progressStyle.chars[1].repeat(this.progressMaxScaledSize-i.lastScaledSize),o=this.formatName(null),a=o?`${o}: `:"";this.stdout.write(`${Ve(this.configuration,"\u27A4","blueBright")} ${a}${r} ${n}${s} +`)}this.progressTimeout=setTimeout(()=>{this.refreshProgress()},r9)}refreshProgress(e=0){let r=!1;if(this.progress.size===0)r=!0;else for(let i of this.progress.values()){let n=Math.trunc(this.progressMaxScaledSize*i.definition.progress),s=i.lastScaledSize;if(i.lastScaledSize=n,n!==s){r=!0;break}}r&&(this.clearProgress({delta:e}),this.writeProgress())}truncate(e,{truncate:r}={}){return this.configuration.get("enableProgressBars")||(r=!1),typeof r=="undefined"&&(r=this.configuration.get("preferTruncatedLines")),r&&(e=(0,e9.default)(e,0,process.stdout.columns-1)),e}formatName(e){return n9(e,{configuration:this.configuration,json:this.json})}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:this.json})}formatIndent(){return"\u2502 ".repeat(this.indent)}};var Zr="3.1.1";var tn;(function(n){n.Yarn1="Yarn Classic",n.Yarn2="Yarn",n.Npm="npm",n.Pnpm="pnpm"})(tn||(tn={}));async function ba(t,e,r,i=[]){if(process.platform==="win32"){let n=`@goto #_undefined_# 2>NUL || @title %COMSPEC% & @setlocal & @"${r}" ${i.map(s=>`"${s.replace('"','""')}"`).join(" ")} %*`;await T.writeFilePromise(v.format({dir:t,name:e,ext:".cmd"}),n)}await T.writeFilePromise(v.join(t,e),`#!/bin/sh +exec "${r}" ${i.map(n=>`'${n.replace(/'/g,`'"'"'`)}'`).join(" ")} "$@" +`,{mode:493})}async function a9(t){let e=await Ze.tryFind(t);if(e==null?void 0:e.packageManager){let i=Qy(e.packageManager);if(i==null?void 0:i.name){let n=`found ${JSON.stringify({packageManager:e.packageManager})} in manifest`,[s]=i.reference.split(".");switch(i.name){case"yarn":return{packageManager:Number(s)===1?tn.Yarn1:tn.Yarn2,reason:n};case"npm":return{packageManager:tn.Npm,reason:n};case"pnpm":return{packageManager:tn.Pnpm,reason:n}}}}let r;try{r=await T.readFilePromise(v.join(t,wt.lockfile),"utf8")}catch{}return r!==void 0?r.match(/^__metadata:$/m)?{packageManager:tn.Yarn2,reason:'"__metadata" key found in yarn.lock'}:{packageManager:tn.Yarn1,reason:'"__metadata" key not found in yarn.lock, must be a Yarn classic lockfile'}:T.existsSync(v.join(t,"package-lock.json"))?{packageManager:tn.Npm,reason:`found npm's "package-lock.json" lockfile`}:T.existsSync(v.join(t,"pnpm-lock.yaml"))?{packageManager:tn.Pnpm,reason:`found pnpm's "pnpm-lock.yaml" lockfile`}:null}async function Vp({project:t,locator:e,binFolder:r,lifecycleScript:i}){var l,c;let n={};for(let[u,g]of Object.entries(process.env))typeof g!="undefined"&&(n[u.toLowerCase()!=="path"?u:"PATH"]=g);let s=M.fromPortablePath(r);n.BERRY_BIN_FOLDER=M.fromPortablePath(s);let o=process.env.COREPACK_ROOT?M.join(process.env.COREPACK_ROOT,"dist/yarn.js"):process.argv[1];if(await Promise.all([ba(r,"node",process.execPath),...Zr!==null?[ba(r,"run",process.execPath,[o,"run"]),ba(r,"yarn",process.execPath,[o]),ba(r,"yarnpkg",process.execPath,[o]),ba(r,"node-gyp",process.execPath,[o,"run","--top-level","node-gyp"])]:[]]),t&&(n.INIT_CWD=M.fromPortablePath(t.configuration.startingCwd),n.PROJECT_CWD=M.fromPortablePath(t.cwd)),n.PATH=n.PATH?`${s}${M.delimiter}${n.PATH}`:`${s}`,n.npm_execpath=`${s}${M.sep}yarn`,n.npm_node_execpath=`${s}${M.sep}node`,e){if(!t)throw new Error("Assertion failed: Missing project");let u=t.tryWorkspaceByLocator(e),g=u?(l=u.manifest.version)!=null?l:"":(c=t.storedPackages.get(e.locatorHash).version)!=null?c:"";n.npm_package_name=St(e),n.npm_package_version=g}let a=Zr!==null?`yarn/${Zr}`:`yarn/${mu("@yarnpkg/core").version}-core`;return n.npm_config_user_agent=`${a} npm/? node/${process.versions.node} ${process.platform} ${process.arch}`,i&&(n.npm_lifecycle_event=i),t&&await t.configuration.triggerHook(u=>u.setupScriptEnvironment,t,n,async(u,g,f)=>await ba(r,kr(u),g,f)),n}var KFe=2,UFe=(0,o9.default)(KFe);async function HFe(t,e,{configuration:r,report:i,workspace:n=null,locator:s=null}){await UFe(async()=>{await T.mktempPromise(async o=>{let a=v.join(o,"pack.log"),l=null,{stdout:c,stderr:u}=r.getSubprocessStreams(a,{prefix:M.fromPortablePath(t),report:i}),g=s&&Io(s)?lp(s):s,f=g?is(g):"an external project";c.write(`Packing ${f} from sources +`);let h=await a9(t),p;h!==null?(c.write(`Using ${h.packageManager} for bootstrap. Reason: ${h.reason} + +`),p=h.packageManager):(c.write(`No package manager configuration detected; defaulting to Yarn + +`),p=tn.Yarn2),await T.mktempPromise(async d=>{let m=await Vp({binFolder:d}),B=new Map([[tn.Yarn1,async()=>{let R=n!==null?["workspace",n]:[],H=await to("yarn",["set","version","classic","--only-if-needed"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(H.code!==0)return H.code;await T.appendFilePromise(v.join(t,".npmignore"),`/.yarn +`),c.write(` +`);let L=await to("yarn",["install"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(L.code!==0)return L.code;c.write(` +`);let K=await to("yarn",[...R,"pack","--filename",M.fromPortablePath(e)],{cwd:t,env:m,stdin:l,stdout:c,stderr:u});return K.code!==0?K.code:0}],[tn.Yarn2,async()=>{let R=n!==null?["workspace",n]:[];m.YARN_ENABLE_INLINE_BUILDS="1";let H=v.join(t,wt.lockfile);await T.existsPromise(H)||await T.writeFilePromise(H,"");let L=await to("yarn",[...R,"pack","--install-if-needed","--filename",M.fromPortablePath(e)],{cwd:t,env:m,stdin:l,stdout:c,stderr:u});return L.code!==0?L.code:0}],[tn.Npm,async()=>{if(n!==null){let A=new cc.PassThrough,V=Cu(A);A.pipe(c,{end:!1});let W=await to("npm",["--version"],{cwd:t,env:m,stdin:l,stdout:A,stderr:u,end:Pn.Never});if(A.end(),W.code!==0)return c.end(),u.end(),W.code;let X=(await V).toString().trim();if(!lc(X,">=7.x")){let F=Eo(null,"npm"),D=Yt(F,X),he=Yt(F,">=7.x");throw new Error(`Workspaces aren't supported by ${Xt(r,D)}; please upgrade to ${Xt(r,he)} (npm has been detected as the primary package manager for ${Ve(r,t,Le.PATH)})`)}}let R=n!==null?["--workspace",n]:[];delete m.npm_config_user_agent;let H=await to("npm",["install"],{cwd:t,env:m,stdin:l,stdout:c,stderr:u,end:Pn.ErrorCode});if(H.code!==0)return H.code;let L=new cc.PassThrough,K=Cu(L);L.pipe(c);let J=await to("npm",["pack","--silent",...R],{cwd:t,env:m,stdin:l,stdout:L,stderr:u});if(J.code!==0)return J.code;let ne=(await K).toString().trim().replace(/^.*\n/s,""),q=v.resolve(t,M.toPortablePath(ne));return await T.renamePromise(q,e),0}]]).get(p);if(typeof B=="undefined")throw new Error("Assertion failed: Unsupported workflow");let b=await B();if(!(b===0||typeof b=="undefined"))throw T.detachTemp(o),new nt(z.PACKAGE_PREPARATION_FAILED,`Packing the package failed (exit code ${b}, logs can be found here: ${Ve(r,a,Le.PATH)})`)})})})}async function GFe(t,e,{project:r}){let i=r.tryWorkspaceByLocator(t);if(i!==null)return tD(i,e);let n=r.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${lt(r.configuration,t)} not found in the project`);return await Jn.openPromise(async s=>{let o=r.configuration,a=r.configuration.getLinkers(),l={project:r,report:new Fe({stdout:new cc.PassThrough,configuration:o})},c=a.find(h=>h.supportsPackage(n,l));if(!c)throw new Error(`The package ${lt(r.configuration,n)} isn't supported by any of the available linkers`);let u=await c.findPackageLocation(n,l),g=new Ft(u,{baseFs:s});return(await Ze.find(Se.dot,{baseFs:g})).scripts.has(e)},{libzip:await $i()})}async function Uw(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await T.mktempPromise(async l=>{let{manifest:c,env:u,cwd:g}=await A9(t,{project:n,binFolder:l,cwd:i,lifecycleScript:e}),f=c.scripts.get(e);if(typeof f=="undefined")return 1;let h=async()=>await Fw(f,r,{cwd:g,env:u,stdin:s,stdout:o,stderr:a});return await(await n.configuration.reduceHook(d=>d.wrapScriptExecution,h,n,t,e,{script:f,args:r,cwd:g,env:u,stdin:s,stdout:o,stderr:a}))()})}async function rD(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a}){return await T.mktempPromise(async l=>{let{env:c,cwd:u}=await A9(t,{project:n,binFolder:l,cwd:i});return await Fw(e,r,{cwd:u,env:c,stdin:s,stdout:o,stderr:a})})}async function jFe(t,{binFolder:e,cwd:r,lifecycleScript:i}){let n=await Vp({project:t.project,locator:t.anchoredLocator,binFolder:e,lifecycleScript:i});return await Promise.all(Array.from(await l9(t),([s,[,o]])=>ba(e,kr(s),process.execPath,[o]))),typeof r=="undefined"&&(r=v.dirname(await T.realpathPromise(v.join(t.cwd,"package.json")))),{manifest:t.manifest,binFolder:e,env:n,cwd:r}}async function A9(t,{project:e,binFolder:r,cwd:i,lifecycleScript:n}){let s=e.tryWorkspaceByLocator(t);if(s!==null)return jFe(s,{binFolder:r,cwd:i,lifecycleScript:n});let o=e.storedPackages.get(t.locatorHash);if(!o)throw new Error(`Package for ${lt(e.configuration,t)} not found in the project`);return await Jn.openPromise(async a=>{let l=e.configuration,c=e.configuration.getLinkers(),u={project:e,report:new Fe({stdout:new cc.PassThrough,configuration:l})},g=c.find(m=>m.supportsPackage(o,u));if(!g)throw new Error(`The package ${lt(e.configuration,o)} isn't supported by any of the available linkers`);let f=await Vp({project:e,locator:t,binFolder:r,lifecycleScript:n});await Promise.all(Array.from(await Hw(t,{project:e}),([m,[,I]])=>ba(r,kr(m),process.execPath,[I])));let h=await g.findPackageLocation(o,u),p=new Ft(h,{baseFs:a}),d=await Ze.find(Se.dot,{baseFs:p});return typeof i=="undefined"&&(i=h),{manifest:d,binFolder:r,env:f,cwd:i}},{libzip:await $i()})}async function c9(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o}){return await Uw(t.anchoredLocator,e,r,{cwd:i,project:t.project,stdin:n,stdout:s,stderr:o})}function tD(t,e){return t.manifest.scripts.has(e)}async function u9(t,e,{cwd:r,report:i}){let{configuration:n}=t.project,s=null;await T.mktempPromise(async o=>{let a=v.join(o,`${e}.log`),l=`# This file contains the result of Yarn calling the "${e}" lifecycle script inside a workspace ("${M.fromPortablePath(t.cwd)}") +`,{stdout:c,stderr:u}=n.getSubprocessStreams(a,{report:i,prefix:lt(n,t.anchoredLocator),header:l});i.reportInfo(z.LIFECYCLE_SCRIPT,`Calling the "${e}" lifecycle script`);let g=await c9(t,e,[],{cwd:r,stdin:s,stdout:c,stderr:u});if(c.end(),u.end(),g!==0)throw T.detachTemp(o),new nt(z.LIFECYCLE_SCRIPT,`${(0,s9.default)(e)} script failed (exit code ${Ve(n,g,Le.NUMBER)}, logs can be found here: ${Ve(n,a,Le.PATH)}); run ${Ve(n,`yarn ${e}`,Le.CODE)} to investigate`)})}async function YFe(t,e,r){tD(t,e)&&await u9(t,e,r)}async function Hw(t,{project:e}){let r=e.configuration,i=new Map,n=e.storedPackages.get(t.locatorHash);if(!n)throw new Error(`Package for ${lt(r,t)} not found in the project`);let s=new cc.Writable,o=r.getLinkers(),a={project:e,report:new Fe({configuration:r,stdout:s})},l=new Set([t.locatorHash]);for(let u of n.dependencies.values()){let g=e.storedResolutions.get(u.descriptorHash);if(!g)throw new Error(`Assertion failed: The resolution (${Xt(r,u)}) should have been registered`);l.add(g)}let c=await Promise.all(Array.from(l,async u=>{let g=e.storedPackages.get(u);if(!g)throw new Error(`Assertion failed: The package (${u}) should have been registered`);if(g.bin.size===0)return kl.skip;let f=o.find(p=>p.supportsPackage(g,a));if(!f)return kl.skip;let h=null;try{h=await f.findPackageLocation(g,a)}catch(p){if(p.code==="LOCATOR_NOT_INSTALLED")return kl.skip;throw p}return{dependency:g,packageLocation:h}}));for(let u of c){if(u===kl.skip)continue;let{dependency:g,packageLocation:f}=u;for(let[h,p]of g.bin)i.set(h,[g,M.fromPortablePath(v.resolve(f,p))])}return i}async function l9(t){return await Hw(t.anchoredLocator,{project:t.project})}async function g9(t,e,r,{cwd:i,project:n,stdin:s,stdout:o,stderr:a,nodeArgs:l=[],packageAccessibleBinaries:c}){c!=null||(c=await Hw(t,{project:n}));let u=c.get(e);if(!u)throw new Error(`Binary not found (${e}) for ${lt(n.configuration,t)}`);return await T.mktempPromise(async g=>{let[,f]=u,h=await Vp({project:n,locator:t,binFolder:g});await Promise.all(Array.from(c,([d,[,m]])=>ba(h.BERRY_BIN_FOLDER,kr(d),process.execPath,[m])));let p;try{p=await to(process.execPath,[...l,f,...r],{cwd:i,env:h,stdin:s,stdout:o,stderr:a})}finally{await T.removePromise(h.BERRY_BIN_FOLDER)}return p.code})}async function qFe(t,e,r,{cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a}){return await g9(t.anchoredLocator,e,r,{project:t.project,cwd:i,stdin:n,stdout:s,stderr:o,packageAccessibleBinaries:a})}var Ai={};it(Ai,{convertToZip:()=>lTe,extractArchiveTo:()=>uTe,makeArchiveFromDirectory:()=>ATe});var d_=ie(require("stream")),C_=ie(Z7());var u_=ie(require("os")),g_=ie(c_()),f_=ie(require("worker_threads")),IR=class{constructor(e){this.source=e;this.pool=[];this.queue=new g_.default({concurrency:Math.max(1,(0,u_.cpus)().length)});let r=setTimeout(()=>{if(!(this.queue.size!==0||this.queue.pending!==0)){for(let i of this.pool)i.terminate();this.pool=[]}},1e3).unref();this.queue.on("idle",()=>{r.refresh()})}run(e){return this.queue.add(()=>{var i;let r=(i=this.pool.pop())!=null?i:new f_.Worker(this.source,{eval:!0,execArgv:[...process.execArgv,"--unhandled-rejections=strict"]});return r.ref(),new Promise((n,s)=>{let o=a=>{a!==0&&s(new Error(`Worker exited with code ${a}`))};r.once("message",a=>{this.pool.push(r),r.unref(),r.off("error",s),r.off("exit",o),n(a)}),r.once("error",s),r.once("exit",o),r.postMessage(e)})})}};var m_=ie(p_());async function ATe(t,{baseFs:e=new Wt,prefixPath:r=Se.root,compressionLevel:i,inMemory:n=!1}={}){let s=await $i(),o;if(n)o=new Jr(null,{libzip:s,level:i});else{let l=await T.mktempPromise(),c=v.join(l,"archive.zip");o=new Jr(c,{create:!0,libzip:s,level:i})}let a=v.resolve(Se.root,r);return await o.copyPromise(a,t,{baseFs:e,stableTime:!0,stableSort:!0}),o}var E_;async function lTe(t,e){let r=await T.mktempPromise(),i=v.join(r,"archive.zip");return E_||(E_=new IR((0,m_.getContent)())),await E_.run({tmpFile:i,tgz:t,opts:e}),new Jr(i,{libzip:await $i(),level:e.compressionLevel})}async function*cTe(t){let e=new C_.default.Parse,r=new d_.PassThrough({objectMode:!0,autoDestroy:!0,emitClose:!0});e.on("entry",i=>{r.write(i)}),e.on("error",i=>{r.destroy(i)}),e.on("close",()=>{r.destroyed||r.end()}),e.end(t);for await(let i of r){let n=i;yield n,n.resume()}}async function uTe(t,e,{stripComponents:r=0,prefixPath:i=Se.dot}={}){var s,o;function n(a){if(a.path[0]==="/")return!0;let l=a.path.split(/\//g);return!!(l.some(c=>c==="..")||l.length<=r)}for await(let a of cTe(t)){if(n(a))continue;let l=v.normalize(M.toPortablePath(a.path)).replace(/\/$/,"").split(/\//g);if(l.length<=r)continue;let c=l.slice(r).join("/"),u=v.join(i,c),g=420;switch((a.type==="Directory"||(((s=a.mode)!=null?s:0)&73)!=0)&&(g|=73),a.type){case"Directory":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.mkdirSync(u,{mode:g}),e.utimesSync(u,mr.SAFE_TIME,mr.SAFE_TIME);break;case"OldFile":case"File":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.writeFileSync(u,await Cu(a),{mode:g}),e.utimesSync(u,mr.SAFE_TIME,mr.SAFE_TIME);break;case"SymbolicLink":e.mkdirpSync(v.dirname(u),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),e.symlinkSync(a.linkpath,u),(o=e.lutimesSync)==null||o.call(e,u,mr.SAFE_TIME,mr.SAFE_TIME);break}}return e}var Hs={};it(Hs,{emitList:()=>gTe,emitTree:()=>b_,treeNodeToJson:()=>Q_,treeNodeToTreeify:()=>B_});var w_=ie(y_());function B_(t,{configuration:e}){let r={},i=(n,s)=>{let o=Array.isArray(n)?n.entries():Object.entries(n);for(let[a,{label:l,value:c,children:u}]of o){let g=[];typeof l!="undefined"&&g.push(Py(e,l,Gl.BOLD)),typeof c!="undefined"&&g.push(Ve(e,c[0],c[1])),g.length===0&&g.push(Py(e,`${a}`,Gl.BOLD));let f=g.join(": "),h=s[f]={};typeof u!="undefined"&&i(u,h)}};if(typeof t.children=="undefined")throw new Error("The root node must only contain children");return i(t.children,r),r}function Q_(t){let e=r=>{var s;if(typeof r.children=="undefined"){if(typeof r.value=="undefined")throw new Error("Assertion failed: Expected a value to be set if the children are missing");return Uu(r.value[0],r.value[1])}let i=Array.isArray(r.children)?r.children.entries():Object.entries((s=r.children)!=null?s:{}),n=Array.isArray(r.children)?[]:{};for(let[o,a]of i)n[o]=e(a);return typeof r.value=="undefined"?n:{value:Uu(r.value[0],r.value[1]),children:n}};return e(t)}function gTe(t,{configuration:e,stdout:r,json:i}){let n=t.map(s=>({value:s}));b_({children:n},{configuration:e,stdout:r,json:i})}function b_(t,{configuration:e,stdout:r,json:i,separators:n=0}){var o;if(i){let a=Array.isArray(t.children)?t.children.values():Object.values((o=t.children)!=null?o:{});for(let l of a)r.write(`${JSON.stringify(Q_(l))} +`);return}let s=(0,w_.asTree)(B_(t,{configuration:e}),!1,!1);if(n>=1&&(s=s.replace(/^([├└]─)/gm,`\u2502 +$1`).replace(/^│\n/,"")),n>=2)for(let a=0;a<2;++a)s=s.replace(/^([│ ].{2}[├│ ].{2}[^\n]+\n)(([│ ]).{2}[├└].{2}[^\n]*\n[│ ].{2}[│ ].{2}[├└]─)/gm,`$1$3 \u2502 +$2`).replace(/^│\n/,"");if(n>=3)throw new Error("Only the first two levels are accepted by treeUtils.emitTree");r.write(s)}var v_=ie(require("crypto")),BR=ie(require("fs"));var fTe=8,Qt=class{constructor(e,{configuration:r,immutable:i=r.get("enableImmutableCache"),check:n=!1}){this.markedFiles=new Set;this.mutexes=new Map;this.cacheId=`-${(0,v_.randomBytes)(8).toString("hex")}.tmp`;this.configuration=r,this.cwd=e,this.immutable=i,this.check=n;let s=r.get("cacheKeyOverride");if(s!==null)this.cacheKey=`${s}`;else{let o=r.get("compressionLevel"),a=o!==pl?`c${o}`:"";this.cacheKey=[fTe,a].join("")}}static async find(e,{immutable:r,check:i}={}){let n=new Qt(e.get("cacheFolder"),{configuration:e,immutable:r,check:i});return await n.setup(),n}get mirrorCwd(){if(!this.configuration.get("enableMirror"))return null;let e=`${this.configuration.get("globalFolder")}/cache`;return e!==this.cwd?e:null}getVersionFilename(e){return`${Mu(e)}-${this.cacheKey}.zip`}getChecksumFilename(e,r){let n=hTe(r).slice(0,10);return`${Mu(e)}-${n}.zip`}getLocatorPath(e,r,i={}){var s;return this.mirrorCwd===null||((s=i.unstablePackages)==null?void 0:s.has(e.locatorHash))?v.resolve(this.cwd,this.getVersionFilename(e)):r===null||QR(r)!==this.cacheKey?null:v.resolve(this.cwd,this.getChecksumFilename(e,r))}getLocatorMirrorPath(e){let r=this.mirrorCwd;return r!==null?v.resolve(r,this.getVersionFilename(e)):null}async setup(){if(!this.configuration.get("enableGlobalCache"))if(this.immutable){if(!await T.existsPromise(this.cwd))throw new nt(z.IMMUTABLE_CACHE,"Cache path does not exist.")}else{await T.mkdirPromise(this.cwd,{recursive:!0});let e=v.resolve(this.cwd,".gitignore");await T.changeFilePromise(e,`/.gitignore +*.flock +*.tmp +`)}(this.mirrorCwd||!this.immutable)&&await T.mkdirPromise(this.mirrorCwd||this.cwd,{recursive:!0})}async fetchPackageFromCache(e,r,a){var l=a,{onHit:i,onMiss:n,loader:s}=l,o=qr(l,["onHit","onMiss","loader"]);var A;let c=this.getLocatorMirrorPath(e),u=new Wt,g=()=>{let V=new Jr(null,{libzip:H}),W=v.join(Se.root,Lx(e));return V.mkdirSync(W,{recursive:!0}),V.writeJsonSync(v.join(W,wt.manifest),{name:St(e),mocked:!0}),V},f=async(V,W=null)=>{let X=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await Ey(V)}`:r;if(W!==null){let F=!o.skipIntegrityCheck||!r?`${this.cacheKey}/${await Ey(W)}`:r;if(X!==F)throw new nt(z.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the local checksum - has the local cache been corrupted?")}if(r!==null&&X!==r){let F;switch(this.check?F="throw":QR(r)!==QR(X)?F="update":F=this.configuration.get("checksumBehavior"),F){case"ignore":return r;case"update":return X;default:case"throw":throw new nt(z.CACHE_CHECKSUM_MISMATCH,"The remote archive doesn't match the expected checksum")}}return X},h=async V=>{if(!s)throw new Error(`Cache check required but no loader configured for ${lt(this.configuration,e)}`);let W=await s(),X=W.getRealPath();return W.saveAndClose(),await T.chmodPromise(X,420),await f(V,X)},p=async()=>{if(c===null||!await T.existsPromise(c)){let V=await s(),W=V.getRealPath();return V.saveAndClose(),{source:"loader",path:W}}return{source:"mirror",path:c}},d=async()=>{if(!s)throw new Error(`Cache entry required but missing for ${lt(this.configuration,e)}`);if(this.immutable)throw new nt(z.IMMUTABLE_CACHE,`Cache entry required but missing for ${lt(this.configuration,e)}`);let{path:V,source:W}=await p(),X=await f(V),F=this.getLocatorPath(e,X,o);if(!F)throw new Error("Assertion failed: Expected the cache path to be available");let D=[];W!=="mirror"&&c!==null&&D.push(async()=>{let pe=`${c}${this.cacheId}`;await T.copyFilePromise(V,pe,BR.default.constants.COPYFILE_FICLONE),await T.chmodPromise(pe,420),await T.renamePromise(pe,c)}),(!o.mirrorWriteOnly||c===null)&&D.push(async()=>{let pe=`${F}${this.cacheId}`;await T.copyFilePromise(V,pe,BR.default.constants.COPYFILE_FICLONE),await T.chmodPromise(pe,420),await T.renamePromise(pe,F)});let he=o.mirrorWriteOnly&&c!=null?c:F;return await Promise.all(D.map(pe=>pe())),[!1,he,X]},m=async()=>{let W=(async()=>{var Ne;let X=this.getLocatorPath(e,r,o),F=X!==null?await u.existsPromise(X):!1,D=!!((Ne=o.mockedPackages)==null?void 0:Ne.has(e.locatorHash))&&(!this.check||!F),he=D||F,pe=he?i:n;if(pe&&pe(),he){let Pe=null,qe=X;return D||(Pe=this.check?await h(qe):await f(qe)),[D,qe,Pe]}else return d()})();this.mutexes.set(e.locatorHash,W);try{return await W}finally{this.mutexes.delete(e.locatorHash)}};for(let V;V=this.mutexes.get(e.locatorHash);)await V;let[I,B,b]=await m();this.markedFiles.add(B);let R,H=await $i(),L=I?()=>g():()=>new Jr(B,{baseFs:u,libzip:H,readOnly:!0}),K=new oh(()=>Mv(()=>R=L(),V=>`Failed to open the cache entry for ${lt(this.configuration,e)}: ${V}`),v),J=new Xo(B,{baseFs:K,pathUtils:v}),ne=()=>{R==null||R.discardAndClose()},q=((A=o.unstablePackages)==null?void 0:A.has(e.locatorHash))?null:b;return[J,ne,q]}};function QR(t){let e=t.indexOf("/");return e!==-1?t.slice(0,e):null}function hTe(t){let e=t.indexOf("/");return e!==-1?t.slice(e+1):t}var F_=ie(x_()),NB=ie(ml());var N_=ie(Wp()),kR=ie(require("stream"));var k_={hooks:{reduceDependency:(t,e,r,i,{resolver:n,resolveOptions:s})=>{for(let{pattern:o,reference:a}of e.topLevelWorkspace.manifest.resolutions){if(o.from&&o.from.fullName!==St(r)||o.from&&o.from.description&&o.from.description!==r.reference||o.descriptor.fullName!==St(t)||o.descriptor.description&&o.descriptor.description!==t.range)continue;return n.bindDescriptor(Yt(t,a),e.topLevelWorkspace.anchoredLocator,s)}return t},validateProject:async(t,e)=>{for(let r of t.workspaces){let i=hp(t.configuration,r);await t.configuration.triggerHook(n=>n.validateWorkspace,r,{reportWarning:(n,s)=>e.reportWarning(n,`${i}: ${s}`),reportError:(n,s)=>e.reportError(n,`${i}: ${s}`)})}},validateWorkspace:async(t,e)=>{let{manifest:r}=t;r.resolutions.length&&t.cwd!==t.project.cwd&&r.errors.push(new Error("Resolutions field will be ignored"));for(let i of r.errors)e.reportWarning(z.INVALID_MANIFEST,i.message)}}};var vR=class{constructor(e){this.fetchers=e}supports(e,r){return!!this.tryFetcher(e,r)}getLocalPath(e,r){return this.getFetcher(e,r).getLocalPath(e,r)}async fetch(e,r){return await this.getFetcher(e,r).fetch(e,r)}tryFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));return i||null}getFetcher(e,r){let i=this.fetchers.find(n=>n.supports(e,r));if(!i)throw new nt(z.FETCHER_NOT_FOUND,`${lt(r.project.configuration,e)} isn't supported by any available fetcher`);return i}};var pd=class{constructor(e){this.resolvers=e.filter(r=>r)}supportsDescriptor(e,r){return!!this.tryResolverByDescriptor(e,r)}supportsLocator(e,r){return!!this.tryResolverByLocator(e,r)}shouldPersistResolution(e,r){return this.getResolverByLocator(e,r).shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.getResolverByDescriptor(e,i).bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.getResolverByDescriptor(e,r).getResolutionDependencies(e,r)}async getCandidates(e,r,i){return await this.getResolverByDescriptor(e,i).getCandidates(e,r,i)}async getSatisfying(e,r,i){return this.getResolverByDescriptor(e,i).getSatisfying(e,r,i)}async resolve(e,r){return await this.getResolverByLocator(e,r).resolve(e,r)}tryResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));return i||null}getResolverByDescriptor(e,r){let i=this.resolvers.find(n=>n.supportsDescriptor(e,r));if(!i)throw new Error(`${Xt(r.project.configuration,e)} isn't supported by any available resolver`);return i}tryResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));return i||null}getResolverByLocator(e,r){let i=this.resolvers.find(n=>n.supportsLocator(e,r));if(!i)throw new Error(`${lt(r.project.configuration,e)} isn't supported by any available resolver`);return i}};var P_=ie(Or());var Rg=/^(?!v)[a-z0-9._-]+$/i,SR=class{supportsDescriptor(e,r){return!!(Us(e.range)||Rg.test(e.range))}supportsLocator(e,r){return!!(P_.default.valid(e.reference)||Rg.test(e.reference))}shouldPersistResolution(e,r){return r.resolver.shouldPersistResolution(this.forwardLocator(e,r),r)}bindDescriptor(e,r,i){return i.resolver.bindDescriptor(this.forwardDescriptor(e,i),r,i)}getResolutionDependencies(e,r){return r.resolver.getResolutionDependencies(this.forwardDescriptor(e,r),r)}async getCandidates(e,r,i){return await i.resolver.getCandidates(this.forwardDescriptor(e,i),r,i)}async getSatisfying(e,r,i){return await i.resolver.getSatisfying(this.forwardDescriptor(e,i),r,i)}async resolve(e,r){let i=await r.resolver.resolve(this.forwardLocator(e,r),r);return op(i,e)}forwardDescriptor(e,r){return Yt(e,`${r.project.configuration.get("defaultProtocol")}${e.range}`)}forwardLocator(e,r){return Vi(e,`${r.project.configuration.get("defaultProtocol")}${e.reference}`)}};var dd=class{supports(e){return!!e.reference.startsWith("virtual:")}getLocalPath(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=Vi(e,n);return r.fetcher.getLocalPath(s,r)}async fetch(e,r){let i=e.reference.indexOf("#");if(i===-1)throw new Error("Invalid virtual package reference");let n=e.reference.slice(i+1),s=Vi(e,n),o=await r.fetcher.fetch(s,r);return await this.ensureVirtualLink(e,o,r)}getLocatorFilename(e){return Mu(e)}async ensureVirtualLink(e,r,i){let n=r.packageFs.getRealPath(),s=i.project.configuration.get("virtualFolder"),o=this.getLocatorFilename(e),a=Pr.makeVirtualPath(s,o,n),l=new Xo(a,{baseFs:r.packageFs,pathUtils:v});return _(P({},r),{packageFs:l})}};var Fg=class{static isVirtualDescriptor(e){return!!e.range.startsWith(Fg.protocol)}static isVirtualLocator(e){return!!e.reference.startsWith(Fg.protocol)}supportsDescriptor(e,r){return Fg.isVirtualDescriptor(e)}supportsLocator(e,r){return Fg.isVirtualLocator(e)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){throw new Error('Assertion failed: calling "bindDescriptor" on a virtual descriptor is unsupported')}getResolutionDependencies(e,r){throw new Error('Assertion failed: calling "getResolutionDependencies" on a virtual descriptor is unsupported')}async getCandidates(e,r,i){throw new Error('Assertion failed: calling "getCandidates" on a virtual descriptor is unsupported')}async getSatisfying(e,r,i){throw new Error('Assertion failed: calling "getSatisfying" on a virtual descriptor is unsupported')}async resolve(e,r){throw new Error('Assertion failed: calling "resolve" on a virtual locator is unsupported')}},FB=Fg;FB.protocol="virtual:";var xR=class{supports(e){return!!e.reference.startsWith(Yr.protocol)}getLocalPath(e,r){return this.getWorkspace(e,r).cwd}async fetch(e,r){let i=this.getWorkspace(e,r).cwd;return{packageFs:new Ft(i),prefixPath:Se.dot,localPath:i}}getWorkspace(e,r){return r.project.getWorkspaceByCwd(e.reference.slice(Yr.protocol.length))}};var D_=ie(require("module"));function R_(){return new Set(D_.default.builtinModules||Object.keys(process.binding("natives")))}var dTe=new Set(["binFolder","version","flags","profile","gpg","ignoreNode","wrapOutput","home","confDir"]),LB="yarn_",PR=".yarnrc.yml",DR="yarn.lock",CTe="********",ge;(function(u){u.ANY="ANY",u.BOOLEAN="BOOLEAN",u.ABSOLUTE_PATH="ABSOLUTE_PATH",u.LOCATOR="LOCATOR",u.LOCATOR_LOOSE="LOCATOR_LOOSE",u.NUMBER="NUMBER",u.STRING="STRING",u.SECRET="SECRET",u.SHAPE="SHAPE",u.MAP="MAP"})(ge||(ge={}));var ps=Le,RR={lastUpdateCheck:{description:"Last timestamp we checked whether new Yarn versions were available",type:ge.STRING,default:null},yarnPath:{description:"Path to the local executable that must be used over the global one",type:ge.ABSOLUTE_PATH,default:null},ignorePath:{description:"If true, the local executable will be ignored when using the global one",type:ge.BOOLEAN,default:!1},ignoreCwd:{description:"If true, the `--cwd` flag will be ignored",type:ge.BOOLEAN,default:!1},cacheKeyOverride:{description:"A global cache key override; used only for test purposes",type:ge.STRING,default:null},globalFolder:{description:"Folder where are stored the system-wide settings",type:ge.ABSOLUTE_PATH,default:Rb()},cacheFolder:{description:"Folder where the cache files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/cache"},compressionLevel:{description:"Zip files compression level, from 0 to 9 or mixed (a variant of 9, which stores some files uncompressed, when compression doesn't yield good results)",type:ge.NUMBER,values:["mixed",0,1,2,3,4,5,6,7,8,9],default:pl},virtualFolder:{description:"Folder where the virtual packages (cf doc) will be mapped on the disk (must be named __virtual__)",type:ge.ABSOLUTE_PATH,default:"./.yarn/__virtual__"},lockfileFilename:{description:"Name of the files where the Yarn dependency tree entries must be stored",type:ge.STRING,default:DR},installStatePath:{description:"Path of the file where the install state will be persisted",type:ge.ABSOLUTE_PATH,default:"./.yarn/install-state.gz"},immutablePatterns:{description:"Array of glob patterns; files matching them won't be allowed to change during immutable installs",type:ge.STRING,default:[],isArray:!0},rcFilename:{description:"Name of the files where the configuration can be found",type:ge.STRING,default:TB()},enableGlobalCache:{description:"If true, the system-wide cache folder will be used regardless of `cache-folder`",type:ge.BOOLEAN,default:!1},enableColors:{description:"If true, the CLI is allowed to use colors in its output",type:ge.BOOLEAN,default:xy,defaultText:""},enableHyperlinks:{description:"If true, the CLI is allowed to use hyperlinks in its output",type:ge.BOOLEAN,default:Mx,defaultText:""},enableInlineBuilds:{description:"If true, the CLI will print the build output on the command line",type:ge.BOOLEAN,default:NB.isCI,defaultText:""},enableMessageNames:{description:"If true, the CLI will prefix most messages with codes suitable for search engines",type:ge.BOOLEAN,default:!0},enableProgressBars:{description:"If true, the CLI is allowed to show a progress bar for long-running events",type:ge.BOOLEAN,default:!NB.isCI&&process.stdout.isTTY&&process.stdout.columns>22,defaultText:""},enableTimers:{description:"If true, the CLI is allowed to print the time spent executing commands",type:ge.BOOLEAN,default:!0},preferAggregateCacheInfo:{description:"If true, the CLI will only print a one-line report of any cache changes",type:ge.BOOLEAN,default:NB.isCI},preferInteractive:{description:"If true, the CLI will automatically use the interactive mode when called from a TTY",type:ge.BOOLEAN,default:!1},preferTruncatedLines:{description:"If true, the CLI will truncate lines that would go beyond the size of the terminal",type:ge.BOOLEAN,default:!1},progressBarStyle:{description:"Which style of progress bar should be used (only when progress bars are enabled)",type:ge.STRING,default:void 0,defaultText:""},defaultLanguageName:{description:"Default language mode that should be used when a package doesn't offer any insight",type:ge.STRING,default:"node"},defaultProtocol:{description:"Default resolution protocol used when resolving pure semver and tag ranges",type:ge.STRING,default:"npm:"},enableTransparentWorkspaces:{description:"If false, Yarn won't automatically resolve workspace dependencies unless they use the `workspace:` protocol",type:ge.BOOLEAN,default:!0},supportedArchitectures:{description:"Architectures that Yarn will fetch and inject into the resolver",type:ge.SHAPE,properties:{os:{description:"Array of supported process.platform strings, or null to target them all",type:ge.STRING,isArray:!0,isNullable:!0,default:["current"]},cpu:{description:"Array of supported process.arch strings, or null to target them all",type:ge.STRING,isArray:!0,isNullable:!0,default:["current"]}}},enableMirror:{description:"If true, the downloaded packages will be retrieved and stored in both the local and global folders",type:ge.BOOLEAN,default:!0},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:!0},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null},unsafeHttpWhitelist:{description:"List of the hostnames for which http queries are allowed (glob patterns are supported)",type:ge.STRING,default:[],isArray:!0},httpTimeout:{description:"Timeout of each http request in milliseconds",type:ge.NUMBER,default:6e4},httpRetry:{description:"Retry times on http failure",type:ge.NUMBER,default:3},networkConcurrency:{description:"Maximal number of concurrent requests",type:ge.NUMBER,default:50},networkSettings:{description:"Network settings per hostname (glob patterns are supported)",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:{caFilePath:{description:"Path to file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableNetwork:{description:"If false, the package manager will refuse to use the network if required to",type:ge.BOOLEAN,default:null},httpProxy:{description:"URL of the http proxy that must be used for outgoing http requests",type:ge.STRING,default:null},httpsProxy:{description:"URL of the http proxy that must be used for outgoing https requests",type:ge.STRING,default:null}}}},caFilePath:{description:"A path to a file containing one or multiple Certificate Authority signing certificates",type:ge.ABSOLUTE_PATH,default:null},enableStrictSsl:{description:"If false, SSL certificate errors will be ignored",type:ge.BOOLEAN,default:!0},logFilters:{description:"Overrides for log levels",type:ge.SHAPE,isArray:!0,concatenateValues:!0,properties:{code:{description:"Code of the messages covered by this override",type:ge.STRING,default:void 0},text:{description:"Code of the texts covered by this override",type:ge.STRING,default:void 0},pattern:{description:"Code of the patterns covered by this override",type:ge.STRING,default:void 0},level:{description:"Log level override, set to null to remove override",type:ge.STRING,values:Object.values(Ts),isNullable:!0,default:void 0}}},enableTelemetry:{description:"If true, telemetry will be periodically sent, following the rules in https://yarnpkg.com/advanced/telemetry",type:ge.BOOLEAN,default:!0},telemetryInterval:{description:"Minimal amount of time between two telemetry uploads, in days",type:ge.NUMBER,default:7},telemetryUserId:{description:"If you desire to tell us which project you are, you can set this field. Completely optional and opt-in.",type:ge.STRING,default:null},enableScripts:{description:"If true, packages are allowed to have install scripts by default",type:ge.BOOLEAN,default:!0},enableStrictSettings:{description:"If true, unknown settings will cause Yarn to abort",type:ge.BOOLEAN,default:!0},enableImmutableCache:{description:"If true, the cache is reputed immutable and actions that would modify it will throw",type:ge.BOOLEAN,default:!1},checksumBehavior:{description:"Enumeration defining what to do when a checksum doesn't match expectations",type:ge.STRING,default:"throw"},packageExtensions:{description:"Map of package corrections to apply on the dependency tree",type:ge.MAP,valueDefinition:{description:"The extension that will be applied to any package whose version matches the specified range",type:ge.SHAPE,properties:{dependencies:{description:"The set of dependencies that must be made available to the current package in order for it to work properly",type:ge.MAP,valueDefinition:{description:"A range",type:ge.STRING}},peerDependencies:{description:"Inherited dependencies - the consumer of the package will be tasked to provide them",type:ge.MAP,valueDefinition:{description:"A semver range",type:ge.STRING}},peerDependenciesMeta:{description:"Extra information related to the dependencies listed in the peerDependencies field",type:ge.MAP,valueDefinition:{description:"The peerDependency meta",type:ge.SHAPE,properties:{optional:{description:"If true, the selected peer dependency will be marked as optional by the package manager and the consumer omitting it won't be reported as an error",type:ge.BOOLEAN,default:!1}}}}}}}};function NR(t,e,r,i,n){if(i.isArray||i.type===ge.ANY&&Array.isArray(r))return Array.isArray(r)?r.map((s,o)=>FR(t,`${e}[${o}]`,s,i,n)):String(r).split(/,/).map(s=>FR(t,e,s,i,n));if(Array.isArray(r))throw new Error(`Non-array configuration settings "${e}" cannot be an array`);return FR(t,e,r,i,n)}function FR(t,e,r,i,n){var a;switch(i.type){case ge.ANY:return r;case ge.SHAPE:return mTe(t,e,r,i,n);case ge.MAP:return ETe(t,e,r,i,n)}if(r===null&&!i.isNullable&&i.default!==null)throw new Error(`Non-nullable configuration settings "${e}" cannot be set to null`);if((a=i.values)==null?void 0:a.includes(r))return r;let o=(()=>{if(i.type===ge.BOOLEAN&&typeof r!="string")return Hh(r);if(typeof r!="string")throw new Error(`Expected value (${r}) to be a string`);let l=Ov(r,{env:process.env});switch(i.type){case ge.ABSOLUTE_PATH:return v.resolve(n,M.toPortablePath(l));case ge.LOCATOR_LOOSE:return Hl(l,!1);case ge.NUMBER:return parseInt(l);case ge.LOCATOR:return Hl(l);case ge.BOOLEAN:return Hh(l);default:return l}})();if(i.values&&!i.values.includes(o))throw new Error(`Invalid value, expected one of ${i.values.join(", ")}`);return o}function mTe(t,e,r,i,n){if(typeof r!="object"||Array.isArray(r))throw new me(`Object configuration settings "${e}" must be an object`);let s=LR(t,i,{ignoreArrays:!0});if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=`${e}.${o}`;if(!i.properties[o])throw new me(`Unrecognized configuration settings found: ${e}.${o} - run "yarn config -v" to see the list of settings supported in Yarn`);s.set(o,NR(t,l,a,i.properties[o],n))}return s}function ETe(t,e,r,i,n){let s=new Map;if(typeof r!="object"||Array.isArray(r))throw new me(`Map configuration settings "${e}" must be an object`);if(r===null)return s;for(let[o,a]of Object.entries(r)){let l=i.normalizeKeys?i.normalizeKeys(o):o,c=`${e}['${l}']`,u=i.valueDefinition;s.set(l,NR(t,c,a,u,n))}return s}function LR(t,e,{ignoreArrays:r=!1}={}){switch(e.type){case ge.SHAPE:{if(e.isArray&&!r)return[];let i=new Map;for(let[n,s]of Object.entries(e.properties))i.set(n,LR(t,s));return i}break;case ge.MAP:return e.isArray&&!r?[]:new Map;case ge.ABSOLUTE_PATH:return e.default===null?null:t.projectCwd===null?v.isAbsolute(e.default)?v.normalize(e.default):e.isNullable?null:void 0:Array.isArray(e.default)?e.default.map(i=>v.resolve(t.projectCwd,i)):v.resolve(t.projectCwd,e.default);default:return e.default}}function MB(t,e,r){if(e.type===ge.SECRET&&typeof t=="string"&&r.hideSecrets)return CTe;if(e.type===ge.ABSOLUTE_PATH&&typeof t=="string"&&r.getNativePaths)return M.fromPortablePath(t);if(e.isArray&&Array.isArray(t)){let i=[];for(let n of t)i.push(MB(n,e,r));return i}if(e.type===ge.MAP&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries())i.set(n,MB(s,e.valueDefinition,r));return i}if(e.type===ge.SHAPE&&t instanceof Map){let i=new Map;for(let[n,s]of t.entries()){let o=e.properties[n];i.set(n,MB(s,o,r))}return i}return t}function ITe(){let t={};for(let[e,r]of Object.entries(process.env))e=e.toLowerCase(),!!e.startsWith(LB)&&(e=(0,F_.default)(e.slice(LB.length)),t[e]=r);return t}function TB(){let t=`${LB}rc_filename`;for(let[e,r]of Object.entries(process.env))if(e.toLowerCase()===t&&typeof r=="string")return r;return PR}var KA;(function(i){i[i.LOCKFILE=0]="LOCKFILE",i[i.MANIFEST=1]="MANIFEST",i[i.NONE=2]="NONE"})(KA||(KA={}));var Ra=class{constructor(e){this.projectCwd=null;this.plugins=new Map;this.settings=new Map;this.values=new Map;this.sources=new Map;this.invalid=new Map;this.packageExtensions=new Map;this.limits=new Map;this.startingCwd=e}static create(e,r,i){let n=new Ra(e);typeof r!="undefined"&&!(r instanceof Map)&&(n.projectCwd=r),n.importSettings(RR);let s=typeof i!="undefined"?i:r instanceof Map?r:new Map;for(let[o,a]of s)n.activatePlugin(o,a);return n}static async find(e,r,{lookup:i=0,strict:n=!0,usePath:s=!1,useRc:o=!0}={}){let a=ITe();delete a.rcFilename;let l=await Ra.findRcFiles(e),c=await Ra.findHomeRcFile();if(c){let I=l.find(B=>B.path===c.path);I?I.strict=!1:l.push(_(P({},c),{strict:!1}))}let u=({ignoreCwd:I,yarnPath:B,ignorePath:b,lockfileFilename:R})=>({ignoreCwd:I,yarnPath:B,ignorePath:b,lockfileFilename:R}),g=L=>{var K=L,{ignoreCwd:I,yarnPath:B,ignorePath:b,lockfileFilename:R}=K,H=qr(K,["ignoreCwd","yarnPath","ignorePath","lockfileFilename"]);return H},f=new Ra(e);f.importSettings(u(RR)),f.useWithSource("",u(a),e,{strict:!1});for(let{path:I,cwd:B,data:b}of l)f.useWithSource(I,u(b),B,{strict:!1});if(s){let I=f.get("yarnPath"),B=f.get("ignorePath");if(I!==null&&!B)return f}let h=f.get("lockfileFilename"),p;switch(i){case 0:p=await Ra.findProjectCwd(e,h);break;case 1:p=await Ra.findProjectCwd(e,null);break;case 2:T.existsSync(v.join(e,"package.json"))?p=v.resolve(e):p=null;break}f.startingCwd=e,f.projectCwd=p,f.importSettings(g(RR));let d=new Map([["@@core",k_]]),m=I=>"default"in I?I.default:I;if(r!==null){for(let R of r.plugins.keys())d.set(R,m(r.modules.get(R)));let I=new Map;for(let R of R_())I.set(R,()=>mu(R));for(let[R,H]of r.modules)I.set(R,()=>H);let B=new Set,b=async(R,H)=>{let{factory:L,name:K}=mu(R);if(B.has(K))return;let J=new Map(I),ne=A=>{if(J.has(A))return J.get(A)();throw new me(`This plugin cannot access the package referenced via ${A} which is neither a builtin, nor an exposed entry`)},q=await du(async()=>m(await L(ne)),A=>`${A} (when initializing ${K}, defined in ${H})`);I.set(K,()=>q),B.add(K),d.set(K,q)};if(a.plugins)for(let R of a.plugins.split(";")){let H=v.resolve(e,M.toPortablePath(R));await b(H,"")}for(let{path:R,cwd:H,data:L}of l)if(!!o&&!!Array.isArray(L.plugins))for(let K of L.plugins){let J=typeof K!="string"?K.path:K,ne=v.resolve(H,M.toPortablePath(J));await b(ne,R)}}for(let[I,B]of d)f.activatePlugin(I,B);f.useWithSource("",g(a),e,{strict:n});for(let{path:I,cwd:B,data:b,strict:R}of l)f.useWithSource(I,g(b),B,{strict:R!=null?R:n});return f.get("enableGlobalCache")&&(f.values.set("cacheFolder",`${f.get("globalFolder")}/cache`),f.sources.set("cacheFolder","")),await f.refreshPackageExtensions(),f}static async findRcFiles(e){let r=TB(),i=[],n=e,s=null;for(;n!==s;){s=n;let o=v.join(s,r);if(T.existsSync(o)){let a=await T.readFilePromise(o,"utf8"),l;try{l=Ii(a)}catch(c){let u="";throw a.match(/^\s+(?!-)[^:]+\s+\S+/m)&&(u=" (in particular, make sure you list the colons after each key name)"),new me(`Parse error when loading ${o}; please check it's proper Yaml${u}`)}i.push({path:o,cwd:s,data:l})}n=v.dirname(s)}return i}static async findHomeRcFile(){let e=TB(),r=uh(),i=v.join(r,e);if(T.existsSync(i)){let n=await T.readFilePromise(i,"utf8"),s=Ii(n);return{path:i,cwd:r,data:s}}return null}static async findProjectCwd(e,r){let i=null,n=e,s=null;for(;n!==s;){if(s=n,T.existsSync(v.join(s,"package.json"))&&(i=s),r!==null){if(T.existsSync(v.join(s,r))){i=s;break}}else if(i!==null)break;n=v.dirname(s)}return i}static async updateConfiguration(e,r){let i=TB(),n=v.join(e,i),s=T.existsSync(n)?Ii(await T.readFilePromise(n,"utf8")):{},o=!1,a;if(typeof r=="function"){try{a=r(s)}catch{a=r({})}if(a===s)return}else{a=s;for(let l of Object.keys(r)){let c=s[l],u=r[l],g;if(typeof u=="function")try{g=u(c)}catch{g=u(void 0)}else g=u;c!==g&&(a[l]=g,o=!0)}if(!o)return}await T.changeFilePromise(n,Qa(a),{automaticNewlines:!0})}static async updateHomeConfiguration(e){let r=uh();return await Ra.updateConfiguration(r,e)}activatePlugin(e,r){this.plugins.set(e,r),typeof r.configuration!="undefined"&&this.importSettings(r.configuration)}importSettings(e){for(let[r,i]of Object.entries(e))if(i!=null){if(this.settings.has(r))throw new Error(`Cannot redefine settings "${r}"`);this.settings.set(r,i),this.values.set(r,LR(this,i))}}useWithSource(e,r,i,n){try{this.use(e,r,i,n)}catch(s){throw s.message+=` (in ${Ve(this,e,Le.PATH)})`,s}}use(e,r,i,{strict:n=!0,overwrite:s=!1}={}){n=n&&this.get("enableStrictSettings");for(let o of["enableStrictSettings",...Object.keys(r)]){if(typeof r[o]=="undefined"||o==="plugins"||e===""&&dTe.has(o))continue;if(o==="rcFilename")throw new me(`The rcFilename settings can only be set via ${`${LB}RC_FILENAME`.toUpperCase()}, not via a rc file`);let l=this.settings.get(o);if(!l){if(n)throw new me(`Unrecognized or legacy configuration settings found: ${o} - run "yarn config -v" to see the list of settings supported in Yarn`);this.invalid.set(o,e);continue}if(this.sources.has(o)&&!(s||l.type===ge.MAP||l.isArray&&l.concatenateValues))continue;let c;try{c=NR(this,o,r[o],l,i)}catch(u){throw u.message+=` in ${Ve(this,e,Le.PATH)}`,u}if(o==="enableStrictSettings"&&e!==""){n=c;continue}if(l.type===ge.MAP){let u=this.values.get(o);this.values.set(o,new Map(s?[...u,...c]:[...c,...u])),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else if(l.isArray&&l.concatenateValues){let u=this.values.get(o);this.values.set(o,s?[...u,...c]:[...c,...u]),this.sources.set(o,`${this.sources.get(o)}, ${e}`)}else this.values.set(o,c),this.sources.set(o,e)}}get(e){if(!this.values.has(e))throw new Error(`Invalid configuration key "${e}"`);return this.values.get(e)}getSpecial(e,{hideSecrets:r=!1,getNativePaths:i=!1}){let n=this.get(e),s=this.settings.get(e);if(typeof s=="undefined")throw new me(`Couldn't find a configuration settings named "${e}"`);return MB(n,s,{hideSecrets:r,getNativePaths:i})}getSubprocessStreams(e,{header:r,prefix:i,report:n}){let s,o,a=T.createWriteStream(e);if(this.get("enableInlineBuilds")){let l=n.createStreamReporter(`${i} ${Ve(this,"STDOUT","green")}`),c=n.createStreamReporter(`${i} ${Ve(this,"STDERR","red")}`);s=new kR.PassThrough,s.pipe(l),s.pipe(a),o=new kR.PassThrough,o.pipe(c),o.pipe(a)}else s=a,o=a,typeof r!="undefined"&&s.write(`${r} +`);return{stdout:s,stderr:o}}makeResolver(){let e=[];for(let r of this.plugins.values())for(let i of r.resolvers||[])e.push(new i);return new pd([new FB,new Yr,new SR,...e])}makeFetcher(){let e=[];for(let r of this.plugins.values())for(let i of r.fetchers||[])e.push(new i);return new vR([new dd,new xR,...e])}getLinkers(){let e=[];for(let r of this.plugins.values())for(let i of r.linkers||[])e.push(new i);return e}getSupportedArchitectures(){let e=this.get("supportedArchitectures"),r=e.get("os");r!==null&&(r=r.map(n=>n==="current"?process.platform:n));let i=e.get("cpu");return i!==null&&(i=i.map(n=>n==="current"?process.arch:n)),{os:r,cpu:i}}async refreshPackageExtensions(){this.packageExtensions=new Map;let e=this.packageExtensions,r=(i,n,{userProvided:s=!1}={})=>{if(!Us(i.range))throw new Error("Only semver ranges are allowed as keys for the packageExtensions setting");let o=new Ze;o.load(n,{yamlCompatibilityMode:!0});let a=hu(e,i.identHash),l=[];a.push([i.range,l]);let c={status:ki.Inactive,userProvided:s,parentDescriptor:i};for(let u of o.dependencies.values())l.push(_(P({},c),{type:oi.Dependency,descriptor:u}));for(let u of o.peerDependencies.values())l.push(_(P({},c),{type:oi.PeerDependency,descriptor:u}));for(let[u,g]of o.peerDependenciesMeta)for(let[f,h]of Object.entries(g))l.push(_(P({},c),{type:oi.PeerDependencyMeta,selector:u,key:f,value:h}))};await this.triggerHook(i=>i.registerPackageExtensions,this,r);for(let[i,n]of this.get("packageExtensions"))r(pA(i,!0),aI(n),{userProvided:!0})}normalizePackage(e){let r=ap(e);if(this.packageExtensions==null)throw new Error("refreshPackageExtensions has to be called before normalizing packages");let i=this.packageExtensions.get(e.identHash);if(typeof i!="undefined"){let s=e.version;if(s!==null){for(let[o,a]of i)if(!!lc(s,o))for(let l of a)switch(l.status===ki.Inactive&&(l.status=ki.Redundant),l.type){case oi.Dependency:typeof r.dependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=ki.Active,r.dependencies.set(l.descriptor.identHash,l.descriptor));break;case oi.PeerDependency:typeof r.peerDependencies.get(l.descriptor.identHash)=="undefined"&&(l.status=ki.Active,r.peerDependencies.set(l.descriptor.identHash,l.descriptor));break;case oi.PeerDependencyMeta:{let c=r.peerDependenciesMeta.get(l.selector);(typeof c=="undefined"||!Object.prototype.hasOwnProperty.call(c,l.key)||c[l.key]!==l.value)&&(l.status=ki.Active,na(r.peerDependenciesMeta,l.selector,()=>({}))[l.key]=l.value)}break;default:Lv(l);break}}}let n=s=>s.scope?`${s.scope}__${s.name}`:`${s.name}`;for(let s of r.peerDependenciesMeta.keys()){let o=En(s);r.peerDependencies.has(o.identHash)||r.peerDependencies.set(o.identHash,Yt(o,"*"))}for(let s of r.peerDependencies.values()){if(s.scope==="types")continue;let o=n(s),a=Eo("types",o),l=St(a);r.peerDependencies.has(a.identHash)||r.peerDependenciesMeta.has(l)||(r.peerDependencies.set(a.identHash,Yt(a,"*")),r.peerDependenciesMeta.set(l,{optional:!0}))}return r.dependencies=new Map(gn(r.dependencies,([,s])=>In(s))),r.peerDependencies=new Map(gn(r.peerDependencies,([,s])=>In(s))),r}getLimit(e){return na(this.limits,e,()=>(0,N_.default)(this.get(e)))}async triggerHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);!s||await s(...r)}}async triggerMultipleHooks(e,r){for(let i of r)await this.triggerHook(e,...i)}async reduceHook(e,r,...i){let n=r;for(let s of this.plugins.values()){let o=s.hooks;if(!o)continue;let a=e(o);!a||(n=await a(n,...i))}return n}async firstHook(e,...r){for(let i of this.plugins.values()){let n=i.hooks;if(!n)continue;let s=e(n);if(!s)continue;let o=await s(...r);if(typeof o!="undefined")return o}return null}},fe=Ra;fe.telemetry=null;var Gn;(function(r){r[r.SCRIPT=0]="SCRIPT",r[r.SHELLCODE=1]="SHELLCODE"})(Gn||(Gn={}));var Fa=class extends Xi{constructor({configuration:e,stdout:r,suggestInstall:i=!0}){super();this.errorCount=0;Cp(this,{configuration:e}),this.configuration=e,this.stdout=r,this.suggestInstall=i}static async start(e,r){let i=new this(e);try{await r(i)}catch(n){i.reportExceptionOnce(n)}finally{await i.finalize()}return i}hasErrors(){return this.errorCount>0}exitCode(){return this.hasErrors()?1:0}reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){this.errorCount+=1,this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} ${this.formatNameWithHyperlink(e)}: ${r} +`)}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return _(P({},r),{stop:i})}reportJson(e){}async finalize(){this.errorCount>0&&(this.stdout.write(` +`),this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} Errors happened when preparing the environment required to run this command. +`),this.suggestInstall&&this.stdout.write(`${Ve(this.configuration,"\u27A4","redBright")} This might be caused by packages being missing from the lockfile, in which case running "yarn install" might help. +`))}formatNameWithHyperlink(e){return eD(e,{configuration:this.configuration,json:!1})}};var t0=ie(require("crypto")),v$=ie(CX()),r0=ie(Q$()),S$=ie(Wp()),x$=ie(Or()),lF=ie(require("util")),cF=ie(require("v8")),uF=ie(require("zlib"));var iUe=[[/^(git(?:\+(?:https|ssh))?:\/\/.*(?:\.git)?)#(.*)$/,(t,e,r,i)=>`${r}#commit=${i}`],[/^https:\/\/((?:[^/]+?)@)?codeload\.github\.com\/([^/]+\/[^/]+)\/tar\.gz\/([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https:\/\/((?:[^/]+?)@)?github\.com\/([^/]+\/[^/]+?)(?:\.git)?#([0-9a-f]+)$/,(t,e,r="",i,n)=>`https://${r}github.com/${i}.git#commit=${n}`],[/^https?:\/\/[^/]+\/(?:[^/]+\/)*(?:@.+(?:\/|(?:%2f)))?([^/]+)\/(?:-|download)\/\1-[^/]+\.tgz(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.pkg\.github\.com\/download\/(?:@[^/]+)\/(?:[^/]+)\/(?:[^/]+)\/(?:[0-9a-f]+)(?:#|$)/,t=>`npm:${t}`],[/^https:\/\/npm\.fontawesome\.com\/(?:@[^/]+)\/([^/]+)\/-\/([^/]+)\/\1-\2.tgz(?:#|$)/,t=>`npm:${t}`],[/^https?:\/\/(?:[^\\.]+)\.jfrog\.io\/.*\/(@[^/]+)\/([^/]+)\/-\/\1\/\2-(?:[.\d\w-]+)\.tgz(?:#|$)/,(t,e)=>by({protocol:"npm:",source:null,selector:t,params:{__archiveUrl:e}})],[/^[^/]+\.tgz#[0-9a-f]+$/,t=>`npm:${t}`]],oF=class{constructor(){this.resolutions=null}async setup(e,{report:r}){let i=v.join(e.cwd,e.configuration.get("lockfileFilename"));if(!T.existsSync(i))return;let n=await T.readFilePromise(i,"utf8"),s=Ii(n);if(Object.prototype.hasOwnProperty.call(s,"__metadata"))return;let o=this.resolutions=new Map;for(let a of Object.keys(s)){let l=gp(a);if(!l){r.reportWarning(z.YARN_IMPORT_FAILED,`Failed to parse the string "${a}" into a proper descriptor`);continue}Us(l.range)&&(l=Yt(l,`npm:${l.range}`));let{version:c,resolved:u}=s[a];if(!u)continue;let g;for(let[h,p]of iUe){let d=u.match(h);if(d){g=p(c,...d);break}}if(!g){r.reportWarning(z.YARN_IMPORT_FAILED,`${Xt(e.configuration,l)}: Only some patterns can be imported from legacy lockfiles (not "${u}")`);continue}let f=l;try{let h=Tu(l.range),p=gp(h.selector,!0);p&&(f=p)}catch{}o.set(l.descriptorHash,Vi(f,g))}}supportsDescriptor(e,r){return this.resolutions?this.resolutions.has(e.descriptorHash):!1}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!this.resolutions)throw new Error("Assertion failed: The resolution store should have been setup");let n=this.resolutions.get(e.descriptorHash);if(!n)throw new Error("Assertion failed: The resolution should have been registered");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Assertion failed: This resolver doesn't support resolving locators to packages")}};var aF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return!!(r.project.storedResolutions.get(e.descriptorHash)||r.project.originalPackages.has(By(e).locatorHash))}supportsLocator(e,r){return!!(r.project.originalPackages.has(e.locatorHash)&&!r.project.lockfileNeedsRefresh)}shouldPersistResolution(e,r){throw new Error("The shouldPersistResolution method shouldn't be called on the lockfile resolver, which would always answer yes")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){let n=i.project.originalPackages.get(By(e).locatorHash);if(n)return[n];let s=i.project.storedResolutions.get(e.descriptorHash);if(!s)throw new Error("Expected the resolution to have been successful - resolution not found");if(n=i.project.originalPackages.get(s),!n)throw new Error("Expected the resolution to have been successful - package not found");return[n]}async getSatisfying(e,r,i){return null}async resolve(e,r){let i=r.project.originalPackages.get(e.locatorHash);if(!i)throw new Error("The lockfile resolver isn't meant to resolve packages - they should already have been stored into a cache");return i}};var AF=class{constructor(e){this.resolver=e}supportsDescriptor(e,r){return this.resolver.supportsDescriptor(e,r)}supportsLocator(e,r){return this.resolver.supportsLocator(e,r)}shouldPersistResolution(e,r){return this.resolver.shouldPersistResolution(e,r)}bindDescriptor(e,r,i){return this.resolver.bindDescriptor(e,r,i)}getResolutionDependencies(e,r){return this.resolver.getResolutionDependencies(e,r)}async getCandidates(e,r,i){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async getSatisfying(e,r,i){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}async resolve(e,r){throw new nt(z.MISSING_LOCKFILE_ENTRY,`This package doesn't seem to be present in your lockfile; run "yarn install" to update the lockfile`)}};var ei=class extends Xi{reportCacheHit(e){}reportCacheMiss(e){}startTimerSync(e,r,i){return(typeof r=="function"?r:i)()}async startTimerPromise(e,r,i){return await(typeof r=="function"?r:i)()}async startCacheReport(e){return await e()}reportSeparator(){}reportInfo(e,r){}reportWarning(e,r){}reportError(e,r){}reportProgress(e){let r=Promise.resolve().then(async()=>{for await(let{}of e);}),i=()=>{};return _(P({},r),{stop:i})}reportJson(e){}async finalize(){}};var b$=ie(vx());var Dd=class{constructor(e,{project:r}){this.workspacesCwds=new Set;this.dependencies=new Map;this.project=r,this.cwd=e}async setup(){this.manifest=T.existsSync(v.join(this.cwd,Ze.fileName))?await Ze.find(this.cwd):new Ze,this.relativeCwd=v.relative(this.project.cwd,this.cwd)||Se.dot;let e=this.manifest.name?this.manifest.name:Eo(null,`${this.computeCandidateName()}-${zi(this.relativeCwd).substr(0,6)}`),r=this.manifest.version?this.manifest.version:"0.0.0";this.locator=Vi(e,r),this.anchoredDescriptor=Yt(this.locator,`${Yr.protocol}${this.relativeCwd}`),this.anchoredLocator=Vi(this.locator,`${Yr.protocol}${this.relativeCwd}`);let i=this.manifest.workspaceDefinitions.map(({pattern:s})=>s),n=await(0,b$.default)(i,{cwd:M.fromPortablePath(this.cwd),expandDirectories:!1,onlyDirectories:!0,onlyFiles:!1,ignore:["**/node_modules","**/.git","**/.yarn"]});n.sort();for(let s of n){let o=v.resolve(this.cwd,M.toPortablePath(s));T.existsSync(v.join(o,"package.json"))&&this.workspacesCwds.add(o)}}accepts(e){var o;let r=e.indexOf(":"),i=r!==-1?e.slice(0,r+1):null,n=r!==-1?e.slice(r+1):e;if(i===Yr.protocol&&v.normalize(n)===this.relativeCwd||i===Yr.protocol&&(n==="*"||n==="^"||n==="~"))return!0;let s=Us(n);return s?i===Yr.protocol?s.test((o=this.manifest.version)!=null?o:"0.0.0"):this.project.configuration.get("enableTransparentWorkspaces")&&this.manifest.version!==null?s.test(this.manifest.version):!1:!1}computeCandidateName(){return this.cwd===this.project.cwd?"root-workspace":`${v.basename(this.cwd)}`||"unnamed-workspace"}getRecursiveWorkspaceDependencies({dependencies:e=Ze.hardDependencies}={}){let r=new Set,i=n=>{for(let s of e)for(let o of n.manifest[s].values()){let a=this.project.tryWorkspaceByDescriptor(o);a===null||r.has(a)||(r.add(a),i(a))}};return i(this),r}getRecursiveWorkspaceDependents({dependencies:e=Ze.hardDependencies}={}){let r=new Set,i=n=>{for(let s of this.project.workspaces)e.some(a=>[...s.manifest[a].values()].some(l=>{let c=this.project.tryWorkspaceByDescriptor(l);return c!==null&&up(c.anchoredLocator,n.anchoredLocator)}))&&!r.has(s)&&(r.add(s),i(s))};return i(this),r}getRecursiveWorkspaceChildren(){let e=[];for(let r of this.workspacesCwds){let i=this.project.workspacesByCwd.get(r);i&&e.push(i,...i.getRecursiveWorkspaceChildren())}return e}async persistManifest(){let e={};this.manifest.exportTo(e);let r=v.join(this.cwd,Ze.fileName),i=`${JSON.stringify(e,null,this.manifest.indent)} +`;await T.changeFilePromise(r,i,{automaticNewlines:!0}),this.manifest.raw=e}};var k$=5,nUe=1,sUe=/ *, */g,P$=/\/$/,oUe=32,aUe=(0,lF.promisify)(uF.default.gzip),AUe=(0,lF.promisify)(uF.default.gunzip),li;(function(r){r.UpdateLockfile="update-lockfile",r.SkipBuild="skip-build"})(li||(li={}));var gF={restoreInstallersCustomData:["installersCustomData"],restoreResolutions:["accessibleLocators","conditionalLocators","disabledLocators","optionalBuilds","storedDescriptors","storedResolutions","storedPackages","lockFileChecksum"],restoreBuildState:["storedBuildState"]},D$=t=>zi(`${nUe}`,t),Ke=class{constructor(e,{configuration:r}){this.resolutionAliases=new Map;this.workspaces=[];this.workspacesByCwd=new Map;this.workspacesByIdent=new Map;this.storedResolutions=new Map;this.storedDescriptors=new Map;this.storedPackages=new Map;this.storedChecksums=new Map;this.storedBuildState=new Map;this.accessibleLocators=new Set;this.conditionalLocators=new Set;this.disabledLocators=new Set;this.originalPackages=new Map;this.optionalBuilds=new Set;this.lockfileNeedsRefresh=!1;this.peerRequirements=new Map;this.installersCustomData=new Map;this.lockFileChecksum=null;this.installStateChecksum=null;this.configuration=r,this.cwd=e}static async find(e,r){var c,u,g;if(!e.projectCwd)throw new me(`No project found in ${r}`);let i=e.projectCwd,n=r,s=null;for(;s!==e.projectCwd;){if(s=n,T.existsSync(v.join(s,wt.manifest))){i=s;break}n=v.dirname(s)}let o=new Ke(e.projectCwd,{configuration:e});(c=fe.telemetry)==null||c.reportProject(o.cwd),await o.setupResolutions(),await o.setupWorkspaces(),(u=fe.telemetry)==null||u.reportWorkspaceCount(o.workspaces.length),(g=fe.telemetry)==null||g.reportDependencyCount(o.workspaces.reduce((f,h)=>f+h.manifest.dependencies.size+h.manifest.devDependencies.size,0));let a=o.tryWorkspaceByCwd(i);if(a)return{project:o,workspace:a,locator:a.anchoredLocator};let l=await o.findLocatorForLocation(`${i}/`,{strict:!0});if(l)return{project:o,locator:l,workspace:null};throw new me(`The nearest package directory (${Ve(e,i,Le.PATH)}) doesn't seem to be part of the project declared in ${Ve(e,o.cwd,Le.PATH)}. + +- If the project directory is right, it might be that you forgot to list ${Ve(e,v.relative(o.cwd,i),Le.PATH)} as a workspace. +- If it isn't, it's likely because you have a yarn.lock or package.json file there, confusing the project root detection.`)}async setupResolutions(){var i;this.storedResolutions=new Map,this.storedDescriptors=new Map,this.storedPackages=new Map,this.lockFileChecksum=null;let e=v.join(this.cwd,this.configuration.get("lockfileFilename")),r=this.configuration.get("defaultLanguageName");if(T.existsSync(e)){let n=await T.readFilePromise(e,"utf8");this.lockFileChecksum=D$(n);let s=Ii(n);if(s.__metadata){let o=s.__metadata.version,a=s.__metadata.cacheKey;this.lockfileNeedsRefresh=o0;){let r=e;e=[];for(let i of r){if(this.workspacesByCwd.has(i))continue;let n=await this.addWorkspace(i),s=this.storedPackages.get(n.anchoredLocator.locatorHash);s&&(n.dependencies=s.dependencies);for(let o of n.workspacesCwds)e.push(o)}}}async addWorkspace(e){let r=new Dd(e,{project:this});await r.setup();let i=this.workspacesByIdent.get(r.locator.identHash);if(typeof i!="undefined")throw new Error(`Duplicate workspace name ${Vr(this.configuration,r.locator)}: ${M.fromPortablePath(e)} conflicts with ${M.fromPortablePath(i.cwd)}`);return this.workspaces.push(r),this.workspacesByCwd.set(e,r),this.workspacesByIdent.set(r.locator.identHash,r),r}get topLevelWorkspace(){return this.getWorkspaceByCwd(this.cwd)}tryWorkspaceByCwd(e){v.isAbsolute(e)||(e=v.resolve(this.cwd,e)),e=v.normalize(e).replace(/\/+$/,"");let r=this.workspacesByCwd.get(e);return r||null}getWorkspaceByCwd(e){let r=this.tryWorkspaceByCwd(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByFilePath(e){let r=null;for(let i of this.workspaces)v.relative(i.cwd,e).startsWith("../")||r&&r.cwd.length>=i.cwd.length||(r=i);return r||null}getWorkspaceByFilePath(e){let r=this.tryWorkspaceByFilePath(e);if(!r)throw new Error(`Workspace not found (${e})`);return r}tryWorkspaceByIdent(e){let r=this.workspacesByIdent.get(e.identHash);return typeof r=="undefined"?null:r}getWorkspaceByIdent(e){let r=this.tryWorkspaceByIdent(e);if(!r)throw new Error(`Workspace not found (${Vr(this.configuration,e)})`);return r}tryWorkspaceByDescriptor(e){let r=this.tryWorkspaceByIdent(e);return r===null||(hA(e)&&(e=Ap(e)),!r.accepts(e.range))?null:r}getWorkspaceByDescriptor(e){let r=this.tryWorkspaceByDescriptor(e);if(r===null)throw new Error(`Workspace not found (${Xt(this.configuration,e)})`);return r}tryWorkspaceByLocator(e){let r=this.tryWorkspaceByIdent(e);return r===null||(Io(e)&&(e=lp(e)),r.locator.locatorHash!==e.locatorHash&&r.anchoredLocator.locatorHash!==e.locatorHash)?null:r}getWorkspaceByLocator(e){let r=this.tryWorkspaceByLocator(e);if(!r)throw new Error(`Workspace not found (${lt(this.configuration,e)})`);return r}refreshWorkspaceDependencies(){for(let e of this.workspaces){let r=this.storedPackages.get(e.anchoredLocator.locatorHash);if(!r)throw new Error(`Assertion failed: Expected workspace ${hp(this.configuration,e)} (${Ve(this.configuration,v.join(e.cwd,wt.manifest),Le.PATH)}) to have been resolved. Run "yarn install" to update the lockfile`);e.dependencies=new Map(r.dependencies)}}forgetResolution(e){let r=n=>{this.storedResolutions.delete(n),this.storedDescriptors.delete(n)},i=n=>{this.originalPackages.delete(n),this.storedPackages.delete(n),this.accessibleLocators.delete(n)};if("descriptorHash"in e){let n=this.storedResolutions.get(e.descriptorHash);r(e.descriptorHash);let s=new Set(this.storedResolutions.values());typeof n!="undefined"&&!s.has(n)&&i(n)}if("locatorHash"in e){i(e.locatorHash);for(let[n,s]of this.storedResolutions)s===e.locatorHash&&r(n)}}forgetTransientResolutions(){let e=this.configuration.makeResolver();for(let r of this.originalPackages.values()){let i;try{i=e.shouldPersistResolution(r,{project:this,resolver:e})}catch{i=!1}i||this.forgetResolution(r)}}forgetVirtualResolutions(){for(let e of this.storedPackages.values())for(let[r,i]of e.dependencies)hA(i)&&e.dependencies.set(r,Ap(i))}getDependencyMeta(e,r){let i={},s=this.topLevelWorkspace.manifest.dependenciesMeta.get(St(e));if(!s)return i;let o=s.get(null);if(o&&Object.assign(i,o),r===null||!x$.default.valid(r))return i;for(let[a,l]of s)a!==null&&a===r&&Object.assign(i,l);return i}async findLocatorForLocation(e,{strict:r=!1}={}){let i=new ei,n=this.configuration.getLinkers(),s={project:this,report:i};for(let o of n){let a=await o.findPackageLocator(e,s);if(a){if(r&&(await o.findPackageLocation(a,s)).replace(P$,"")!==e.replace(P$,""))continue;return a}}return null}async resolveEverything(e){if(!this.workspacesByCwd||!this.workspacesByIdent)throw new Error("Workspaces must have been setup before calling this function");this.forgetVirtualResolutions(),e.lockfileOnly||this.forgetTransientResolutions();let r=e.resolver||this.configuration.makeResolver(),i=new oF;await i.setup(this,{report:e.report});let n=e.lockfileOnly?[new AF(r)]:[i,r],s=new pd([new aF(r),...n]),o=this.configuration.makeFetcher(),a=e.lockfileOnly?{project:this,report:e.report,resolver:s}:{project:this,report:e.report,resolver:s,fetchOptions:{project:this,cache:e.cache,checksums:this.storedChecksums,report:e.report,fetcher:o,cacheOptions:{mirrorWriteOnly:!0}}},l=new Map,c=new Map,u=new Map,g=new Map,f=new Map,h=new Map,p=this.topLevelWorkspace.anchoredLocator,d=new Set,m=[],I=async W=>{let X=await du(async()=>await s.resolve(W,a),D=>`${lt(this.configuration,W)}: ${D}`);if(!up(W,X))throw new Error(`Assertion failed: The locator cannot be changed by the resolver (went from ${lt(this.configuration,W)} to ${lt(this.configuration,X)})`);g.set(X.locatorHash,X);let F=this.configuration.normalizePackage(X);for(let[D,he]of F.dependencies){let pe=await this.configuration.reduceHook(Pe=>Pe.reduceDependency,he,this,F,he,{resolver:s,resolveOptions:a});if(!cp(he,pe))throw new Error("Assertion failed: The descriptor ident cannot be changed through aliases");let Ne=s.bindDescriptor(pe,W,a);F.dependencies.set(D,Ne)}return m.push(Promise.all([...F.dependencies.values()].map(D=>H(D)))),c.set(F.locatorHash,F),F},B=async W=>{let X=f.get(W.locatorHash);if(typeof X!="undefined")return X;let F=Promise.resolve().then(()=>I(W));return f.set(W.locatorHash,F),F},b=async(W,X)=>{let F=await H(X);return l.set(W.descriptorHash,W),u.set(W.descriptorHash,F.locatorHash),F},R=async W=>{let X=this.resolutionAliases.get(W.descriptorHash);if(typeof X!="undefined")return b(W,this.storedDescriptors.get(X));let F=s.getResolutionDependencies(W,a),D=new Map(await Promise.all(F.map(async Ne=>{let Pe=s.bindDescriptor(Ne,p,a),qe=await H(Pe);return d.add(qe.locatorHash),[Ne.descriptorHash,qe]}))),pe=(await du(async()=>await s.getCandidates(W,D,a),Ne=>`${Xt(this.configuration,W)}: ${Ne}`))[0];if(typeof pe=="undefined")throw new Error(`${Xt(this.configuration,W)}: No candidates found`);return l.set(W.descriptorHash,W),u.set(W.descriptorHash,pe.locatorHash),B(pe)},H=W=>{let X=h.get(W.descriptorHash);if(typeof X!="undefined")return X;l.set(W.descriptorHash,W);let F=Promise.resolve().then(()=>R(W));return h.set(W.descriptorHash,F),F};for(let W of this.workspaces){let X=W.anchoredDescriptor;m.push(H(X))}for(;m.length>0;){let W=[...m];m.length=0,await Promise.all(W)}let L=new Set(this.resolutionAliases.values()),K=new Set(c.keys()),J=new Set,ne=new Map;lUe({project:this,report:e.report,accessibleLocators:J,volatileDescriptors:L,optionalBuilds:K,peerRequirements:ne,allDescriptors:l,allResolutions:u,allPackages:c});for(let W of d)K.delete(W);for(let W of L)l.delete(W),u.delete(W);let q=this.configuration.getSupportedArchitectures(),A=new Set,V=new Set;for(let W of c.values())W.conditions!=null&&(!K.has(W.locatorHash)||(Sy(W,q)||(Sy(W,{os:[process.platform],cpu:[process.arch]})&&e.report.reportWarningOnce(z.GHOST_ARCHITECTURE,`${lt(this.configuration,W)}: Your current architecture (${process.platform}-${process.arch}) is supported by this package, but is missing from the ${Ve(this.configuration,"supportedArchitectures",ps.SETTING)} setting`),V.add(W.locatorHash)),A.add(W.locatorHash)));this.storedResolutions=u,this.storedDescriptors=l,this.storedPackages=c,this.accessibleLocators=J,this.conditionalLocators=A,this.disabledLocators=V,this.originalPackages=g,this.optionalBuilds=K,this.peerRequirements=ne,this.refreshWorkspaceDependencies()}async fetchEverything({cache:e,report:r,fetcher:i,mode:n}){let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,cacheOptions:s},l=Array.from(new Set(gn(this.storedResolutions.values(),[f=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");return is(h)}])));n===li.UpdateLockfile&&(l=l.filter(f=>!this.storedChecksums.has(f)));let c=!1,u=Xi.progressViaCounter(l.length);r.reportProgress(u);let g=(0,S$.default)(oUe);if(await r.startCacheReport(async()=>{await Promise.all(l.map(f=>g(async()=>{let h=this.storedPackages.get(f);if(!h)throw new Error("Assertion failed: The locator should have been registered");if(Io(h))return;let p;try{p=await o.fetch(h,a)}catch(d){d.message=`${lt(this.configuration,h)}: ${d.message}`,r.reportExceptionOnce(d),c=d;return}p.checksum!=null?this.storedChecksums.set(h.locatorHash,p.checksum):this.storedChecksums.delete(h.locatorHash),p.releaseFs&&p.releaseFs()}).finally(()=>{u.tick()})))}),c)throw c}async linkEverything({cache:e,report:r,fetcher:i,mode:n}){var A,V,W;let s={mockedPackages:this.disabledLocators,unstablePackages:this.conditionalLocators,skipIntegrityCheck:!0},o=i||this.configuration.makeFetcher(),a={checksums:this.storedChecksums,project:this,cache:e,fetcher:o,report:r,skipIntegrityCheck:!0,cacheOptions:s},l=this.configuration.getLinkers(),c={project:this,report:r},u=new Map(l.map(X=>{let F=X.makeInstaller(c),D=F.getCustomDataKey(),he=this.installersCustomData.get(D);return typeof he!="undefined"&&F.attachCustomData(he),[X,F]})),g=new Map,f=new Map,h=new Map,p=new Map(await Promise.all([...this.accessibleLocators].map(async X=>{let F=this.storedPackages.get(X);if(!F)throw new Error("Assertion failed: The locator should have been registered");return[X,await o.fetch(F,a)]}))),d=[];for(let X of this.accessibleLocators){let F=this.storedPackages.get(X);if(typeof F=="undefined")throw new Error("Assertion failed: The locator should have been registered");let D=p.get(F.locatorHash);if(typeof D=="undefined")throw new Error("Assertion failed: The fetch result should have been registered");let he=[],pe=Pe=>{he.push(Pe)},Ne=this.tryWorkspaceByLocator(F);if(Ne!==null){let Pe=[],{scripts:qe}=Ne.manifest;for(let se of["preinstall","install","postinstall"])qe.has(se)&&Pe.push([Gn.SCRIPT,se]);try{for(let[se,be]of u)if(se.supportsPackage(F,c)&&(await be.installPackage(F,D,{holdFetchResult:pe})).buildDirective!==null)throw new Error("Assertion failed: Linkers can't return build directives for workspaces; this responsibility befalls to the Yarn core")}finally{he.length===0?(A=D.releaseFs)==null||A.call(D):d.push(Promise.all(he).catch(()=>{}).then(()=>{var se;(se=D.releaseFs)==null||se.call(D)}))}let re=v.join(D.packageFs.getRealPath(),D.prefixPath);f.set(F.locatorHash,re),!Io(F)&&Pe.length>0&&h.set(F.locatorHash,{directives:Pe,buildLocations:[re]})}else{let Pe=l.find(se=>se.supportsPackage(F,c));if(!Pe)throw new nt(z.LINKER_NOT_FOUND,`${lt(this.configuration,F)} isn't supported by any available linker`);let qe=u.get(Pe);if(!qe)throw new Error("Assertion failed: The installer should have been registered");let re;try{re=await qe.installPackage(F,D,{holdFetchResult:pe})}finally{he.length===0?(V=D.releaseFs)==null||V.call(D):d.push(Promise.all(he).then(()=>{}).then(()=>{var se;(se=D.releaseFs)==null||se.call(D)}))}g.set(F.locatorHash,Pe),f.set(F.locatorHash,re.packageLocation),re.buildDirective&&re.buildDirective.length>0&&re.packageLocation&&h.set(F.locatorHash,{directives:re.buildDirective,buildLocations:[re.packageLocation]})}}let m=new Map;for(let X of this.accessibleLocators){let F=this.storedPackages.get(X);if(!F)throw new Error("Assertion failed: The locator should have been registered");let D=this.tryWorkspaceByLocator(F)!==null,he=async(pe,Ne)=>{let Pe=f.get(F.locatorHash);if(typeof Pe=="undefined")throw new Error(`Assertion failed: The package (${lt(this.configuration,F)}) should have been registered`);let qe=[];for(let re of F.dependencies.values()){let se=this.storedResolutions.get(re.descriptorHash);if(typeof se=="undefined")throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,re)}, from ${lt(this.configuration,F)})should have been registered`);let be=this.storedPackages.get(se);if(typeof be=="undefined")throw new Error(`Assertion failed: The package (${se}, resolved from ${Xt(this.configuration,re)}) should have been registered`);let ae=this.tryWorkspaceByLocator(be)===null?g.get(se):null;if(typeof ae=="undefined")throw new Error(`Assertion failed: The package (${se}, resolved from ${Xt(this.configuration,re)}) should have been registered`);ae===pe||ae===null?f.get(be.locatorHash)!==null&&qe.push([re,be]):!D&&Pe!==null&&hu(m,se).push(Pe)}Pe!==null&&await Ne.attachInternalDependencies(F,qe)};if(D)for(let[pe,Ne]of u)pe.supportsPackage(F,c)&&await he(pe,Ne);else{let pe=g.get(F.locatorHash);if(!pe)throw new Error("Assertion failed: The linker should have been found");let Ne=u.get(pe);if(!Ne)throw new Error("Assertion failed: The installer should have been registered");await he(pe,Ne)}}for(let[X,F]of m){let D=this.storedPackages.get(X);if(!D)throw new Error("Assertion failed: The package should have been registered");let he=g.get(D.locatorHash);if(!he)throw new Error("Assertion failed: The linker should have been found");let pe=u.get(he);if(!pe)throw new Error("Assertion failed: The installer should have been registered");await pe.attachExternalDependents(D,F)}let I=new Map;for(let X of u.values()){let F=await X.finalizeInstall();for(let D of(W=F==null?void 0:F.records)!=null?W:[])h.set(D.locatorHash,{directives:D.buildDirective,buildLocations:D.buildLocations});typeof(F==null?void 0:F.customData)!="undefined"&&I.set(X.getCustomDataKey(),F.customData)}if(this.installersCustomData=I,await Promise.all(d),n===li.SkipBuild)return;let B=new Set(this.storedPackages.keys()),b=new Set(h.keys());for(let X of b)B.delete(X);let R=(0,t0.createHash)("sha512");R.update(process.versions.node),await this.configuration.triggerHook(X=>X.globalHashGeneration,this,X=>{R.update("\0"),R.update(X)});let H=R.digest("hex"),L=new Map,K=X=>{let F=L.get(X.locatorHash);if(typeof F!="undefined")return F;let D=this.storedPackages.get(X.locatorHash);if(typeof D=="undefined")throw new Error("Assertion failed: The package should have been registered");let he=(0,t0.createHash)("sha512");he.update(X.locatorHash),L.set(X.locatorHash,"");for(let pe of D.dependencies.values()){let Ne=this.storedResolutions.get(pe.descriptorHash);if(typeof Ne=="undefined")throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,pe)}) should have been registered`);let Pe=this.storedPackages.get(Ne);if(typeof Pe=="undefined")throw new Error("Assertion failed: The package should have been registered");he.update(K(Pe))}return F=he.digest("hex"),L.set(X.locatorHash,F),F},J=(X,F)=>{let D=(0,t0.createHash)("sha512");D.update(H),D.update(K(X));for(let he of F)D.update(he);return D.digest("hex")},ne=new Map,q=!1;for(;b.size>0;){let X=b.size,F=[];for(let D of b){let he=this.storedPackages.get(D);if(!he)throw new Error("Assertion failed: The package should have been registered");let pe=!0;for(let qe of he.dependencies.values()){let re=this.storedResolutions.get(qe.descriptorHash);if(!re)throw new Error(`Assertion failed: The resolution (${Xt(this.configuration,qe)}) should have been registered`);if(b.has(re)){pe=!1;break}}if(!pe)continue;b.delete(D);let Ne=h.get(he.locatorHash);if(!Ne)throw new Error("Assertion failed: The build directive should have been registered");let Pe=J(he,Ne.buildLocations);if(this.storedBuildState.get(he.locatorHash)===Pe){ne.set(he.locatorHash,Pe);continue}q||(await this.persistInstallStateFile(),q=!0),this.storedBuildState.has(he.locatorHash)?r.reportInfo(z.MUST_REBUILD,`${lt(this.configuration,he)} must be rebuilt because its dependency tree changed`):r.reportInfo(z.MUST_BUILD,`${lt(this.configuration,he)} must be built because it never has been before or the last one failed`);for(let qe of Ne.buildLocations){if(!v.isAbsolute(qe))throw new Error(`Assertion failed: Expected the build location to be absolute (not ${qe})`);F.push((async()=>{for(let[re,se]of Ne.directives){let be=`# This file contains the result of Yarn building a package (${is(he)}) +`;switch(re){case Gn.SCRIPT:be+=`# Script name: ${se} +`;break;case Gn.SHELLCODE:be+=`# Script code: ${se} +`;break}let ae=null;if(!await T.mktempPromise(async De=>{let $=v.join(De,"build.log"),{stdout:G,stderr:Ce}=this.configuration.getSubprocessStreams($,{header:be,prefix:lt(this.configuration,he),report:r}),ee;try{switch(re){case Gn.SCRIPT:ee=await Uw(he,se,[],{cwd:qe,project:this,stdin:ae,stdout:G,stderr:Ce});break;case Gn.SHELLCODE:ee=await rD(he,se,[],{cwd:qe,project:this,stdin:ae,stdout:G,stderr:Ce});break}}catch(Oe){Ce.write(Oe.stack),ee=1}if(G.end(),Ce.end(),ee===0)return ne.set(he.locatorHash,Pe),!0;T.detachTemp(De);let Ue=`${lt(this.configuration,he)} couldn't be built successfully (exit code ${Ve(this.configuration,ee,Le.NUMBER)}, logs can be found here: ${Ve(this.configuration,$,Le.PATH)})`;return this.optionalBuilds.has(he.locatorHash)?(r.reportInfo(z.BUILD_FAILED,Ue),ne.set(he.locatorHash,Pe),!0):(r.reportError(z.BUILD_FAILED,Ue),!1)}))return}})())}}if(await Promise.all(F),X===b.size){let D=Array.from(b).map(he=>{let pe=this.storedPackages.get(he);if(!pe)throw new Error("Assertion failed: The package should have been registered");return lt(this.configuration,pe)}).join(", ");r.reportError(z.CYCLIC_DEPENDENCIES,`Some packages have circular dependencies that make their build order unsatisfiable - as a result they won't be built (affected packages are: ${D})`);break}}this.storedBuildState=ne}async install(e){var a,l;let r=this.configuration.get("nodeLinker");(a=fe.telemetry)==null||a.reportInstall(r),await e.report.startTimerPromise("Project validation",{skipIfEmpty:!0},async()=>{await this.configuration.triggerHook(c=>c.validateProject,this,{reportWarning:e.report.reportWarning.bind(e.report),reportError:e.report.reportError.bind(e.report)})});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.status=ki.Inactive;let i=v.join(this.cwd,this.configuration.get("lockfileFilename")),n=null;if(e.immutable)try{n=await T.readFilePromise(i,"utf8")}catch(c){throw c.code==="ENOENT"?new nt(z.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been created by this install, which is explicitly forbidden."):c}await e.report.startTimerPromise("Resolution step",async()=>{await this.resolveEverything(e)}),await e.report.startTimerPromise("Post-resolution validation",{skipIfEmpty:!0},async()=>{for(let[,c]of this.configuration.packageExtensions)for(let[,u]of c)for(let g of u)if(g.userProvided){let f=Ve(this.configuration,g,Le.PACKAGE_EXTENSION);switch(g.status){case ki.Inactive:e.report.reportWarning(z.UNUSED_PACKAGE_EXTENSION,`${f}: No matching package in the dependency tree; you may not need this rule anymore.`);break;case ki.Redundant:e.report.reportWarning(z.REDUNDANT_PACKAGE_EXTENSION,`${f}: This rule seems redundant when applied on the original package; the extension may have been applied upstream.`);break}}if(n!==null){let c=ul(n,this.generateLockfile());if(c!==n){let u=(0,v$.structuredPatch)(i,i,n,c);e.report.reportSeparator();for(let g of u.hunks){e.report.reportInfo(null,`@@ -${g.oldStart},${g.oldLines} +${g.newStart},${g.newLines} @@`);for(let f of g.lines)f.startsWith("+")?e.report.reportError(z.FROZEN_LOCKFILE_EXCEPTION,Ve(this.configuration,f,Le.ADDED)):f.startsWith("-")?e.report.reportError(z.FROZEN_LOCKFILE_EXCEPTION,Ve(this.configuration,f,Le.REMOVED)):e.report.reportInfo(null,Ve(this.configuration,f,"grey"))}throw e.report.reportSeparator(),new nt(z.FROZEN_LOCKFILE_EXCEPTION,"The lockfile would have been modified by this install, which is explicitly forbidden.")}}});for(let c of this.configuration.packageExtensions.values())for(let[,u]of c)for(let g of u)g.userProvided&&g.status===ki.Active&&((l=fe.telemetry)==null||l.reportPackageExtension(Uu(g,Le.PACKAGE_EXTENSION)));await e.report.startTimerPromise("Fetch step",async()=>{await this.fetchEverything(e),(typeof e.persistProject=="undefined"||e.persistProject)&&e.mode!==li.UpdateLockfile&&await this.cacheCleanup(e)});let s=e.immutable?[...new Set(this.configuration.get("immutablePatterns"))].sort():[],o=await Promise.all(s.map(async c=>Iy(c,{cwd:this.cwd})));(typeof e.persistProject=="undefined"||e.persistProject)&&await this.persist(),await e.report.startTimerPromise("Link step",async()=>{if(e.mode===li.UpdateLockfile){e.report.reportWarning(z.UPDATE_LOCKFILE_ONLY_SKIP_LINK,`Skipped due to ${Ve(this.configuration,"mode=update-lockfile",Le.CODE)}`);return}await this.linkEverything(e);let c=await Promise.all(s.map(async u=>Iy(u,{cwd:this.cwd})));for(let u=0;uc.afterAllInstalled,this,e)}generateLockfile(){let e=new Map;for(let[n,s]of this.storedResolutions.entries()){let o=e.get(s);o||e.set(s,o=new Set),o.add(n)}let r={};r.__metadata={version:k$,cacheKey:void 0};for(let[n,s]of e.entries()){let o=this.originalPackages.get(n);if(!o)continue;let a=[];for(let f of s){let h=this.storedDescriptors.get(f);if(!h)throw new Error("Assertion failed: The descriptor should have been registered");a.push(h)}let l=a.map(f=>In(f)).sort().join(", "),c=new Ze;c.version=o.linkType===gt.HARD?o.version:"0.0.0-use.local",c.languageName=o.languageName,c.dependencies=new Map(o.dependencies),c.peerDependencies=new Map(o.peerDependencies),c.dependenciesMeta=new Map(o.dependenciesMeta),c.peerDependenciesMeta=new Map(o.peerDependenciesMeta),c.bin=new Map(o.bin);let u,g=this.storedChecksums.get(o.locatorHash);if(typeof g!="undefined"){let f=g.indexOf("/");if(f===-1)throw new Error("Assertion failed: Expected the checksum to reference its cache key");let h=g.slice(0,f),p=g.slice(f+1);typeof r.__metadata.cacheKey=="undefined"&&(r.__metadata.cacheKey=h),h===r.__metadata.cacheKey?u=p:u=g}r[l]=_(P({},c.exportTo({},{compatibilityMode:!1})),{linkType:o.linkType.toLowerCase(),resolution:is(o),checksum:u,conditions:o.conditions||void 0})}return`${[`# This file is generated by running "yarn install" inside your project. +`,`# Manual changes might be lost - proceed with caution! +`].join("")} +`+Qa(r)}async persistLockfile(){let e=v.join(this.cwd,this.configuration.get("lockfileFilename")),r="";try{r=await T.readFilePromise(e,"utf8")}catch(s){}let i=this.generateLockfile(),n=ul(r,i);n!==r&&(await T.writeFilePromise(e,n),this.lockFileChecksum=D$(n),this.lockfileNeedsRefresh=!1)}async persistInstallStateFile(){let e=[];for(let o of Object.values(gF))e.push(...o);let r=(0,r0.default)(this,e),i=cF.default.serialize(r),n=zi(i);if(this.installStateChecksum===n)return;let s=this.configuration.get("installStatePath");await T.mkdirPromise(v.dirname(s),{recursive:!0}),await T.writeFilePromise(s,await aUe(i)),this.installStateChecksum=n}async restoreInstallState({restoreInstallersCustomData:e=!0,restoreResolutions:r=!0,restoreBuildState:i=!0}={}){let n=this.configuration.get("installStatePath");if(!T.existsSync(n)){r&&await this.applyLightResolution();return}let s=await AUe(await T.readFilePromise(n));this.installStateChecksum=zi(s);let o=cF.default.deserialize(s);e&&typeof o.installersCustomData!="undefined"&&(this.installersCustomData=o.installersCustomData),i&&Object.assign(this,(0,r0.default)(o,gF.restoreBuildState)),r&&(o.lockFileChecksum===this.lockFileChecksum?(Object.assign(this,(0,r0.default)(o,gF.restoreResolutions)),this.refreshWorkspaceDependencies()):await this.applyLightResolution())}async applyLightResolution(){await this.resolveEverything({lockfileOnly:!0,report:new ei}),await this.persistInstallStateFile()}async persist(){await this.persistLockfile();for(let e of this.workspacesByCwd.values())await e.persistManifest()}async cacheCleanup({cache:e,report:r}){let i=new Set([".gitignore"]);if(!Fb(e.cwd,this.cwd)||!await T.existsPromise(e.cwd))return;let n=this.configuration.get("preferAggregateCacheInfo"),s=0,o=null;for(let a of await T.readdirPromise(e.cwd)){if(i.has(a))continue;let l=v.resolve(e.cwd,a);e.markedFiles.has(l)||(o=a,e.immutable?r.reportError(z.IMMUTABLE_CACHE,`${Ve(this.configuration,v.basename(l),"magenta")} appears to be unused and would be marked for deletion, but the cache is immutable`):(n?s+=1:r.reportInfo(z.UNUSED_CACHE_ENTRY,`${Ve(this.configuration,v.basename(l),"magenta")} appears to be unused - removing`),await T.removePromise(l)))}n&&s!==0&&r.reportInfo(z.UNUSED_CACHE_ENTRY,s>1?`${s} packages appeared to be unused and were removed`:`${o} appeared to be unused and was removed`),e.markedFiles.clear()}};function lUe({project:t,allDescriptors:e,allResolutions:r,allPackages:i,accessibleLocators:n=new Set,optionalBuilds:s=new Set,volatileDescriptors:o=new Set,peerRequirements:a=new Map,report:l,tolerateMissingPackages:c=!1}){var ne;let u=new Map,g=[],f=new Map,h=new Map,p=new Map,d=new Map,m=new Map,I=new Map(t.workspaces.map(q=>{let A=q.anchoredLocator.locatorHash,V=i.get(A);if(typeof V=="undefined"){if(c)return[A,null];throw new Error("Assertion failed: The workspace should have an associated package")}return[A,ap(V)]})),B=()=>{let q=T.mktempSync(),A=v.join(q,"stacktrace.log"),V=String(g.length+1).length,W=g.map((X,F)=>`${`${F+1}.`.padStart(V," ")} ${is(X)} +`).join("");throw T.writeFileSync(A,W),T.detachTemp(q),new nt(z.STACK_OVERFLOW_RESOLUTION,`Encountered a stack overflow when resolving peer dependencies; cf ${M.fromPortablePath(A)}`)},b=q=>{let A=r.get(q.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: The resolution should have been registered");let V=i.get(A);if(!V)throw new Error("Assertion failed: The package could not be found");return V},R=(q,A,V,{top:W,optional:X})=>{g.length>1e3&&B(),g.push(A);let F=H(q,A,V,{top:W,optional:X});return g.pop(),F},H=(q,A,V,{top:W,optional:X})=>{if(n.has(A.locatorHash))return;n.add(A.locatorHash),X||s.delete(A.locatorHash);let F=i.get(A.locatorHash);if(!F){if(c)return;throw new Error(`Assertion failed: The package (${lt(t.configuration,A)}) should have been registered`)}let D=[],he=[],pe=[],Ne=[],Pe=[];for(let re of Array.from(F.dependencies.values())){if(F.peerDependencies.has(re.identHash)&&F.locatorHash!==W)continue;if(hA(re))throw new Error("Assertion failed: Virtual packages shouldn't be encountered when virtualizing a branch");o.delete(re.descriptorHash);let se=X;if(!se){let ee=F.dependenciesMeta.get(St(re));if(typeof ee!="undefined"){let Ue=ee.get(null);typeof Ue!="undefined"&&Ue.optional&&(se=!0)}}let be=r.get(re.descriptorHash);if(!be){if(c)continue;throw new Error(`Assertion failed: The resolution (${Xt(t.configuration,re)}) should have been registered`)}let ae=I.get(be)||i.get(be);if(!ae)throw new Error(`Assertion failed: The package (${be}, resolved from ${Xt(t.configuration,re)}) should have been registered`);if(ae.peerDependencies.size===0){R(re,ae,new Map,{top:W,optional:se});continue}let Ae=u.get(ae.locatorHash);typeof Ae=="number"&&Ae>=2&&B();let De,$,G=new Set,Ce;he.push(()=>{De=kx(re,A.locatorHash),$=Px(ae,A.locatorHash),F.dependencies.delete(re.identHash),F.dependencies.set(De.identHash,De),r.set(De.descriptorHash,$.locatorHash),e.set(De.descriptorHash,De),i.set($.locatorHash,$),D.push([ae,De,$])}),pe.push(()=>{var ee;Ce=new Map;for(let Ue of $.peerDependencies.values()){let Oe=F.dependencies.get(Ue.identHash);if(!Oe&&cp(A,Ue)&&(Oe=q),(!Oe||Oe.range==="missing:")&&$.dependencies.has(Ue.identHash)){$.peerDependencies.delete(Ue.identHash);continue}Oe||(Oe=Yt(Ue,"missing:")),$.dependencies.set(Oe.identHash,Oe),hA(Oe)&&Pl(p,Oe.descriptorHash).add($.locatorHash),f.set(Oe.identHash,Oe),Oe.range==="missing:"&&G.add(Oe.identHash),Ce.set(Ue.identHash,(ee=V.get(Ue.identHash))!=null?ee:$.locatorHash)}$.dependencies=new Map(gn($.dependencies,([Ue,Oe])=>St(Oe)))}),Ne.push(()=>{if(!i.has($.locatorHash))return;let ee=u.get(ae.locatorHash),Ue=typeof ee!="undefined"?ee+1:1;u.set(ae.locatorHash,Ue),R(De,$,Ce,{top:W,optional:se}),u.set(ae.locatorHash,Ue-1)}),Pe.push(()=>{let ee=F.dependencies.get(re.identHash);if(typeof ee=="undefined")throw new Error("Assertion failed: Expected the peer dependency to have been turned into a dependency");let Ue=r.get(ee.descriptorHash);if(typeof Ue=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");if(Pl(m,Ue).add(A.locatorHash),!!i.has($.locatorHash)){for(let Oe of $.peerDependencies.values()){let vt=Ce.get(Oe.identHash);if(typeof vt=="undefined")throw new Error("Assertion failed: Expected the peer dependency ident to be registered");hu(pu(d,vt),St(Oe)).push($.locatorHash)}for(let Oe of G)$.dependencies.delete(Oe)}})}for(let re of[...he,...pe])re();let qe;do{qe=!0;for(let[re,se,be]of D){if(!i.has(be.locatorHash))continue;let ae=pu(h,re.locatorHash),Ae=zi(...[...be.dependencies.values()].map(Ce=>{let ee=Ce.range!=="missing:"?r.get(Ce.descriptorHash):"missing:";if(typeof ee=="undefined")throw new Error(`Assertion failed: Expected the resolution for ${Xt(t.configuration,Ce)} to have been registered`);return ee===W?`${ee} (top)`:ee}),se.identHash),De=ae.get(Ae);if(typeof De=="undefined"){ae.set(Ae,se);continue}if(De===se)continue;qe=!1,i.delete(be.locatorHash),e.delete(se.descriptorHash),r.delete(se.descriptorHash),n.delete(be.locatorHash);let $=p.get(se.descriptorHash)||[],G=[F.locatorHash,...$];p.delete(se.descriptorHash);for(let Ce of G){let ee=i.get(Ce);typeof ee!="undefined"&&ee.dependencies.set(se.identHash,De)}}}while(!qe);for(let re of[...Ne,...Pe])re()};for(let q of t.workspaces){let A=q.anchoredLocator;o.delete(q.anchoredDescriptor.descriptorHash),R(q.anchoredDescriptor,A,new Map,{top:A.locatorHash,optional:!1})}var L;(function(V){V[V.NotProvided=0]="NotProvided",V[V.NotCompatible=1]="NotCompatible"})(L||(L={}));let K=[];for(let[q,A]of m){let V=i.get(q);if(typeof V=="undefined")throw new Error("Assertion failed: Expected the root to be registered");let W=d.get(q);if(typeof W!="undefined")for(let X of A){let F=i.get(X);if(typeof F!="undefined")for(let[D,he]of W){let pe=En(D);if(F.peerDependencies.has(pe.identHash))continue;let Ne=`p${zi(X,D,q).slice(0,5)}`;a.set(Ne,{subject:X,requested:pe,rootRequester:q,allRequesters:he});let Pe=V.dependencies.get(pe.identHash);if(typeof Pe!="undefined"){let qe=b(Pe),re=(ne=qe.version)!=null?ne:"0.0.0",se=new Set;for(let ae of he){let Ae=i.get(ae);if(typeof Ae=="undefined")throw new Error("Assertion failed: Expected the link to be registered");let De=Ae.peerDependencies.get(pe.identHash);if(typeof De=="undefined")throw new Error("Assertion failed: Expected the ident to be registered");se.add(De.range)}[...se].every(ae=>{if(ae.startsWith(Yr.protocol)){if(!t.tryWorkspaceByLocator(qe))return!1;ae=ae.slice(Yr.protocol.length),(ae==="^"||ae==="~")&&(ae="*")}return lc(re,ae)})||K.push({type:1,subject:F,requested:pe,requester:V,version:re,hash:Ne,requirementCount:he.length})}else{let qe=V.peerDependenciesMeta.get(D);(qe==null?void 0:qe.optional)||K.push({type:0,subject:F,requested:pe,requester:V,hash:Ne})}}}}let J=[q=>Rx(q.subject),q=>St(q.requested),q=>`${q.type}`];for(let q of gn(K,J))switch(q.type){case 0:l==null||l.reportWarning(z.MISSING_PEER_DEPENDENCY,`${lt(t.configuration,q.subject)} doesn't provide ${Vr(t.configuration,q.requested)} (${Ve(t.configuration,q.hash,Le.CODE)}), requested by ${Vr(t.configuration,q.requester)}`);break;case 1:{let A=q.requirementCount>1?"and some of its descendants request":"requests";l==null||l.reportWarning(z.INCOMPATIBLE_PEER_DEPENDENCY,`${lt(t.configuration,q.subject)} provides ${Vr(t.configuration,q.requested)} (${Ve(t.configuration,q.hash,Le.CODE)}) with version ${fp(t.configuration,q.version)}, which doesn't satisfy what ${Vr(t.configuration,q.requester)} ${A}`)}break}K.length>0&&(l==null||l.reportWarning(z.UNNAMED,`Some peer dependencies are incorrectly met; run ${Ve(t.configuration,"yarn explain peer-requirements ",Le.CODE)} for details, where ${Ve(t.configuration,"",Le.CODE)} is the six-letter p-prefixed code`))}var Po;(function(l){l.VERSION="version",l.COMMAND_NAME="commandName",l.PLUGIN_NAME="pluginName",l.INSTALL_COUNT="installCount",l.PROJECT_COUNT="projectCount",l.WORKSPACE_COUNT="workspaceCount",l.DEPENDENCY_COUNT="dependencyCount",l.EXTENSION="packageExtension"})(Po||(Po={}));var Rd=class{constructor(e,r){this.values=new Map;this.hits=new Map;this.enumerators=new Map;this.configuration=e;let i=this.getRegistryPath();this.isNew=!T.existsSync(i),this.sendReport(r),this.startBuffer()}reportVersion(e){this.reportValue(Po.VERSION,e.replace(/-git\..*/,"-git"))}reportCommandName(e){this.reportValue(Po.COMMAND_NAME,e||"")}reportPluginName(e){this.reportValue(Po.PLUGIN_NAME,e)}reportProject(e){this.reportEnumerator(Po.PROJECT_COUNT,e)}reportInstall(e){this.reportHit(Po.INSTALL_COUNT,e)}reportPackageExtension(e){this.reportValue(Po.EXTENSION,e)}reportWorkspaceCount(e){this.reportValue(Po.WORKSPACE_COUNT,String(e))}reportDependencyCount(e){this.reportValue(Po.DEPENDENCY_COUNT,String(e))}reportValue(e,r){Pl(this.values,e).add(r)}reportEnumerator(e,r){Pl(this.enumerators,e).add(zi(r))}reportHit(e,r="*"){let i=pu(this.hits,e),n=na(i,r,()=>0);i.set(r,n+1)}getRegistryPath(){let e=this.configuration.get("globalFolder");return v.join(e,"telemetry.json")}sendReport(e){var u,g,f;let r=this.getRegistryPath(),i;try{i=T.readJsonSync(r)}catch{i={}}let n=Date.now(),s=this.configuration.get("telemetryInterval")*24*60*60*1e3,a=((u=i.lastUpdate)!=null?u:n+s+Math.floor(s*Math.random()))+s;if(a>n&&i.lastUpdate!=null)return;try{T.mkdirSync(v.dirname(r),{recursive:!0}),T.writeJsonSync(r,{lastUpdate:n})}catch{return}if(a>n||!i.blocks)return;let l=`https://browser-http-intake.logs.datadoghq.eu/v1/input/${e}?ddsource=yarn`,c=h=>iP(l,h,{configuration:this.configuration}).catch(()=>{});for(let[h,p]of Object.entries((g=i.blocks)!=null?g:{})){if(Object.keys(p).length===0)continue;let d=p;d.userId=h,d.reportType="primary";for(let B of Object.keys((f=d.enumerators)!=null?f:{}))d.enumerators[B]=d.enumerators[B].length;c(d);let m=new Map,I=20;for(let[B,b]of Object.entries(d.values))b.length>0&&m.set(B,b.slice(0,I));for(;m.size>0;){let B={};B.userId=h,B.reportType="secondary",B.metrics={};for(let[b,R]of m)B.metrics[b]=R.shift(),R.length===0&&m.delete(b);c(B)}}}applyChanges(){var o,a,l,c,u,g,f,h,p;let e=this.getRegistryPath(),r;try{r=T.readJsonSync(e)}catch{r={}}let i=(o=this.configuration.get("telemetryUserId"))!=null?o:"*",n=r.blocks=(a=r.blocks)!=null?a:{},s=n[i]=(l=n[i])!=null?l:{};for(let d of this.hits.keys()){let m=s.hits=(c=s.hits)!=null?c:{},I=m[d]=(u=m[d])!=null?u:{};for(let[B,b]of this.hits.get(d))I[B]=((g=I[B])!=null?g:0)+b}for(let d of["values","enumerators"])for(let m of this[d].keys()){let I=s[d]=(f=s[d])!=null?f:{};I[m]=[...new Set([...(h=I[m])!=null?h:[],...(p=this[d].get(m))!=null?p:[]])]}T.mkdirSync(v.dirname(e),{recursive:!0}),T.writeJsonSync(e,r)}startBuffer(){process.on("exit",()=>{try{this.applyChanges()}catch{}})}};var fF=ie(require("child_process")),R$=ie(ml());var hF=ie(require("fs"));var Yg=new Map([["constraints",[["constraints","query"],["constraints","source"],["constraints"]]],["exec",[]],["interactive-tools",[["search"],["upgrade-interactive"]]],["stage",[["stage"]]],["typescript",[]],["version",[["version","apply"],["version","check"],["version"]]],["workspace-tools",[["workspaces","focus"],["workspaces","foreach"]]]]);function cUe(t){let e=M.fromPortablePath(t);process.on("SIGINT",()=>{}),e?(0,fF.execFileSync)(process.execPath,[e,...process.argv.slice(2)],{stdio:"inherit",env:_(P({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})}):(0,fF.execFileSync)(e,process.argv.slice(2),{stdio:"inherit",env:_(P({},process.env),{YARN_IGNORE_PATH:"1",YARN_IGNORE_CWD:"1"})})}async function i0({binaryVersion:t,pluginConfiguration:e}){async function r(){let n=new oo({binaryLabel:"Yarn Package Manager",binaryName:"yarn",binaryVersion:t});try{await i(n)}catch(s){process.stdout.write(n.error(s)),process.exitCode=1}}async function i(n){var p,d,m,I,B;let s=process.versions.node,o=">=12 <14 || 14.2 - 14.9 || >14.10.0";if(process.env.YARN_IGNORE_NODE!=="1"&&!qt.satisfiesWithPrereleases(s,o))throw new me(`This tool requires a Node version compatible with ${o} (got ${s}). Upgrade Node, or set \`YARN_IGNORE_NODE=1\` in your environment.`);let a=await fe.find(M.toPortablePath(process.cwd()),e,{usePath:!0,strict:!1}),l=a.get("yarnPath"),c=a.get("ignorePath"),u=a.get("ignoreCwd"),g=M.toPortablePath(M.resolve(process.argv[1])),f=b=>T.readFilePromise(b).catch(()=>Buffer.of());if(!c&&!u&&await(async()=>l===g||Buffer.compare(...await Promise.all([f(l),f(g)]))===0)()){process.env.YARN_IGNORE_PATH="1",process.env.YARN_IGNORE_CWD="1",await i(n);return}else if(l!==null&&!c)if(!T.existsSync(l))process.stdout.write(n.error(new Error(`The "yarn-path" option has been set (in ${a.sources.get("yarnPath")}), but the specified location doesn't exist (${l}).`))),process.exitCode=1;else try{cUe(l)}catch(b){process.exitCode=b.code||1}else{c&&delete process.env.YARN_IGNORE_PATH,a.get("enableTelemetry")&&!R$.isCI&&process.stdout.isTTY&&(fe.telemetry=new Rd(a,"puba9cdc10ec5790a2cf4969dd413a47270")),(p=fe.telemetry)==null||p.reportVersion(t);for(let[L,K]of a.plugins.entries()){Yg.has((m=(d=L.match(/^@yarnpkg\/plugin-(.*)$/))==null?void 0:d[1])!=null?m:"")&&((I=fe.telemetry)==null||I.reportPluginName(L));for(let J of K.commands||[])n.register(J)}let R=n.process(process.argv.slice(2));R.help||(B=fe.telemetry)==null||B.reportCommandName(R.path.join(" "));let H=R.cwd;if(typeof H!="undefined"&&!u){let L=(0,hF.realpathSync)(process.cwd()),K=(0,hF.realpathSync)(H);if(L!==K){process.chdir(H),await r();return}}await n.runExit(R,{cwd:M.toPortablePath(process.cwd()),plugins:e,quiet:!1,stdin:process.stdin,stdout:process.stdout,stderr:process.stderr})}}return r().catch(n=>{process.stdout.write(n.stack||n.message),process.exitCode=1}).finally(()=>T.rmtempPromise())}function F$(t){t.Command.Path=(...e)=>r=>{r.paths=r.paths||[],r.paths.push(e)};for(let e of["Array","Boolean","String","Proxy","Rest","Counter"])t.Command[e]=(...r)=>(i,n)=>{let s=t.Option[e](...r);Object.defineProperty(i,`__${n}`,{configurable:!1,enumerable:!0,get(){return s},set(o){this[n]=o}})};return t}var iC={};it(iC,{BaseCommand:()=>Be,WorkspaceRequiredError:()=>rt,getDynamicLibs:()=>Wie,getPluginConfiguration:()=>F0,main:()=>i0,openWorkspace:()=>rf,pluginCommands:()=>Yg});var Be=class extends ye{constructor(){super(...arguments);this.cwd=Y.String("--cwd",{hidden:!0})}};var rt=class extends me{constructor(e,r){let i=v.relative(e,r),n=v.join(e,Ze.fileName);super(`This command can only be run from within a workspace of your project (${i} isn't a workspace of ${n}).`)}};var dJe=ie(Or());Ss();var CJe=ie(gN()),Wie=()=>new Map([["@yarnpkg/cli",iC],["@yarnpkg/core",Fd],["@yarnpkg/fslib",ch],["@yarnpkg/libzip",Fp],["@yarnpkg/parsers",Hp],["@yarnpkg/shell",jp],["clipanion",vh],["semver",dJe],["typanion",lu],["yup",CJe]]);async function rf(t,e){let{project:r,workspace:i}=await Ke.find(t,e);if(!i)throw new rt(r.cwd,e);return i}var x_e=ie(Or());Ss();var k_e=ie(gN());var hL={};it(hL,{dedupeUtils:()=>zN,default:()=>Qze,suggestUtils:()=>LN});var WAe=ie(ml());var roe=ie(aC());Ss();var LN={};it(LN,{Modifier:()=>Lo,Strategy:()=>Fr,Target:()=>vr,WorkspaceModifier:()=>af,applyModifier:()=>Zse,extractDescriptorFromPath:()=>ON,extractRangeModifier:()=>Xse,fetchDescriptorFrom:()=>MN,findProjectDescriptors:()=>toe,getModifier:()=>AC,getSuggestedDescriptors:()=>lC,makeWorkspaceDescriptor:()=>eoe,toWorkspaceModifier:()=>$se});var TN=ie(Or()),L3e="workspace:",vr;(function(i){i.REGULAR="dependencies",i.DEVELOPMENT="devDependencies",i.PEER="peerDependencies"})(vr||(vr={}));var Lo;(function(i){i.CARET="^",i.TILDE="~",i.EXACT=""})(Lo||(Lo={}));var af;(function(i){i.CARET="^",i.TILDE="~",i.EXACT="*"})(af||(af={}));var Fr;(function(s){s.KEEP="keep",s.REUSE="reuse",s.PROJECT="project",s.LATEST="latest",s.CACHE="cache"})(Fr||(Fr={}));function AC(t,e){return t.exact?Lo.EXACT:t.caret?Lo.CARET:t.tilde?Lo.TILDE:e.configuration.get("defaultSemverRangePrefix")}var T3e=/^([\^~]?)[0-9]+(?:\.[0-9]+){0,2}(?:-\S+)?$/;function Xse(t,{project:e}){let r=t.match(T3e);return r?r[1]:e.configuration.get("defaultSemverRangePrefix")}function Zse(t,e){let{protocol:r,source:i,params:n,selector:s}=S.parseRange(t.range);return TN.default.valid(s)&&(s=`${e}${t.range}`),S.makeDescriptor(t,S.makeRange({protocol:r,source:i,params:n,selector:s}))}function $se(t){switch(t){case Lo.CARET:return af.CARET;case Lo.TILDE:return af.TILDE;case Lo.EXACT:return af.EXACT;default:throw new Error(`Assertion failed: Unknown modifier: "${t}"`)}}function eoe(t,e){return S.makeDescriptor(t.anchoredDescriptor,`${L3e}${$se(e)}`)}async function toe(t,{project:e,target:r}){let i=new Map,n=s=>{let o=i.get(s.descriptorHash);return o||i.set(s.descriptorHash,o={descriptor:s,locators:[]}),o};for(let s of e.workspaces)if(r===vr.PEER){let o=s.manifest.peerDependencies.get(t.identHash);o!==void 0&&n(o).locators.push(s.locator)}else{let o=s.manifest.dependencies.get(t.identHash),a=s.manifest.devDependencies.get(t.identHash);r===vr.DEVELOPMENT?a!==void 0?n(a).locators.push(s.locator):o!==void 0&&n(o).locators.push(s.locator):o!==void 0?n(o).locators.push(s.locator):a!==void 0&&n(a).locators.push(s.locator)}return i}async function ON(t,{cwd:e,workspace:r}){return await M3e(async i=>{v.isAbsolute(t)||(t=v.relative(r.cwd,v.resolve(e,t)),t.match(/^\.{0,2}\//)||(t=`./${t}`));let{project:n}=r,s=await MN(S.makeIdent(null,"archive"),t,{project:r.project,cache:i,workspace:r});if(!s)throw new Error("Assertion failed: The descriptor should have been found");let o=new ei,a=n.configuration.makeResolver(),l=n.configuration.makeFetcher(),c={checksums:n.storedChecksums,project:n,cache:i,fetcher:l,report:o,resolver:a},u=a.bindDescriptor(s,r.anchoredLocator,c),g=S.convertDescriptorToLocator(u),f=await l.fetch(g,c),h=await Ze.find(f.prefixPath,{baseFs:f.packageFs});if(!h.name)throw new Error("Target path doesn't have a name");return S.makeDescriptor(h.name,t)})}async function lC(t,{project:e,workspace:r,cache:i,target:n,modifier:s,strategies:o,maxResults:a=Infinity}){if(!(a>=0))throw new Error(`Invalid maxResults (${a})`);if(t.range!=="unknown")return{suggestions:[{descriptor:t,name:`Use ${S.prettyDescriptor(e.configuration,t)}`,reason:"(unambiguous explicit request)"}],rejections:[]};let l=typeof r!="undefined"&&r!==null&&r.manifest[n].get(t.identHash)||null,c=[],u=[],g=async f=>{try{await f()}catch(h){u.push(h)}};for(let f of o){if(c.length>=a)break;switch(f){case Fr.KEEP:await g(async()=>{l&&c.push({descriptor:l,name:`Keep ${S.prettyDescriptor(e.configuration,l)}`,reason:"(no changes)"})});break;case Fr.REUSE:await g(async()=>{for(let{descriptor:h,locators:p}of(await toe(t,{project:e,target:n})).values()){if(p.length===1&&p[0].locatorHash===r.anchoredLocator.locatorHash&&o.includes(Fr.KEEP))continue;let d=`(originally used by ${S.prettyLocator(e.configuration,p[0])}`;d+=p.length>1?` and ${p.length-1} other${p.length>2?"s":""})`:")",c.push({descriptor:h,name:`Reuse ${S.prettyDescriptor(e.configuration,h)}`,reason:d})}});break;case Fr.CACHE:await g(async()=>{for(let h of e.storedDescriptors.values())h.identHash===t.identHash&&c.push({descriptor:h,name:`Reuse ${S.prettyDescriptor(e.configuration,h)}`,reason:"(already used somewhere in the lockfile)"})});break;case Fr.PROJECT:await g(async()=>{if(r.manifest.name!==null&&t.identHash===r.manifest.name.identHash)return;let h=e.tryWorkspaceByIdent(t);if(h===null)return;let p=eoe(h,s);c.push({descriptor:p,name:`Attach ${S.prettyDescriptor(e.configuration,p)}`,reason:`(local workspace at ${ue.pretty(e.configuration,h.relativeCwd,ue.Type.PATH)})`})});break;case Fr.LATEST:await g(async()=>{if(t.range!=="unknown")c.push({descriptor:t,name:`Use ${S.prettyRange(e.configuration,t.range)}`,reason:"(explicit range requested)"});else if(n===vr.PEER)c.push({descriptor:S.makeDescriptor(t,"*"),name:"Use *",reason:"(catch-all peer dependency pattern)"});else if(!e.configuration.get("enableNetwork"))c.push({descriptor:null,name:"Resolve from latest",reason:ue.pretty(e.configuration,"(unavailable because enableNetwork is toggled off)","grey")});else{let h=await MN(t,"latest",{project:e,cache:i,workspace:r,preserveModifier:!1});h&&(h=Zse(h,s),c.push({descriptor:h,name:`Use ${S.prettyDescriptor(e.configuration,h)}`,reason:"(resolved from latest)"}))}});break}}return{suggestions:c.slice(0,a),rejections:u.slice(0,a)}}async function MN(t,e,{project:r,cache:i,workspace:n,preserveModifier:s=!0}){let o=S.makeDescriptor(t,e),a=new ei,l=r.configuration.makeFetcher(),c=r.configuration.makeResolver(),u={project:r,fetcher:l,cache:i,checksums:r.storedChecksums,report:a,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},g=_(P({},u),{resolver:c,fetchOptions:u}),f=c.bindDescriptor(o,n.anchoredLocator,g),h=await c.getCandidates(f,new Map,g);if(h.length===0)return null;let p=h[0],{protocol:d,source:m,params:I,selector:B}=S.parseRange(S.convertToManifestRange(p.reference));if(d===r.configuration.get("defaultProtocol")&&(d=null),TN.default.valid(B)&&s!==!1){let b=typeof s=="string"?s:o.range;B=Xse(b,{project:r})+B}return S.makeDescriptor(p,S.makeRange({protocol:d,source:m,params:I,selector:B}))}async function M3e(t){return await T.mktempPromise(async e=>{let r=fe.create(e);return r.useWithSource(e,{enableMirror:!1,compressionLevel:0},e,{overwrite:!0}),await t(new Qt(e,{configuration:r,check:!1,immutable:!1}))})}var cC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.dev=Y.Boolean("-D,--dev",!1,{description:"Add a package as a dev dependency"});this.peer=Y.Boolean("-P,--peer",!1,{description:"Add a package as a peer dependency"});this.optional=Y.Boolean("-O,--optional",!1,{description:"Add / upgrade a package to an optional regular / peer dependency"});this.preferDev=Y.Boolean("--prefer-dev",!1,{description:"Add / upgrade a package to a dev dependency"});this.interactive=Y.Boolean("-i,--interactive",{description:"Reuse the specified package from other workspaces in the project"});this.cached=Y.Boolean("--cached",!1,{description:"Reuse the highest version already used somewhere within the project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.silent=Y.Boolean("--silent",{hidden:!0});this.packages=Y.Rest()}async execute(){var d;let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(d=this.interactive)!=null?d:e.get("preferInteractive"),o=AC(this,r),a=[...s?[Fr.REUSE]:[],Fr.PROJECT,...this.cached?[Fr.CACHE]:[],Fr.LATEST],l=s?Infinity:1,c=await Promise.all(this.packages.map(async m=>{let I=m.match(/^\.{0,2}\//)?await ON(m,{cwd:this.context.cwd,workspace:i}):S.parseDescriptor(m),B=O3e(i,I,{dev:this.dev,peer:this.peer,preferDev:this.preferDev,optional:this.optional}),b=await lC(I,{project:r,workspace:i,cache:n,target:B,modifier:o,strategies:a,maxResults:l});return[I,b,B]})),u=await Fa.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async m=>{for(let[I,{suggestions:B,rejections:b}]of c)if(B.filter(H=>H.descriptor!==null).length===0){let[H]=b;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");r.configuration.get("enableNetwork")?m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range`):m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range (note: network resolution has been disabled)`),m.reportSeparator(),m.reportExceptionOnce(H)}});if(u.hasErrors())return u.exitCode();let g=!1,f=[],h=[];for(let[,{suggestions:m},I]of c){let B,b=m.filter(K=>K.descriptor!==null),R=b[0].descriptor,H=b.every(K=>S.areDescriptorsEqual(K.descriptor,R));b.length===1||H?B=R:(g=!0,{answer:B}=await(0,roe.prompt)({type:"select",name:"answer",message:"Which range do you want to use?",choices:m.map(({descriptor:K,name:J,reason:ne})=>K?{name:J,hint:ne,descriptor:K}:{name:J,hint:ne,disabled:!0}),onCancel:()=>process.exit(130),result(K){return this.find(K,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let L=i.manifest[I].get(B.identHash);(typeof L=="undefined"||L.descriptorHash!==B.descriptorHash)&&(i.manifest[I].set(B.identHash,B),this.optional&&(I==="dependencies"?i.manifest.ensureDependencyMeta(_(P({},B),{range:"unknown"})).optional=!0:I==="peerDependencies"&&(i.manifest.ensurePeerDependencyMeta(_(P({},B),{range:"unknown"})).optional=!0)),typeof L=="undefined"?f.push([i,I,B,a]):h.push([i,I,L,B]))}return await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyAddition,f),await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyReplacement,h),g&&this.context.stdout.write(` +`),(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!this.context.quiet},async m=>{await r.install({cache:n,report:m,mode:this.mode})})).exitCode()}};cC.paths=[["add"]],cC.usage=ye.Usage({description:"add dependencies to the project",details:"\n This command adds a package to the package.json for the nearest workspace.\n\n - If it didn't exist before, the package will by default be added to the regular `dependencies` field, but this behavior can be overriden thanks to the `-D,--dev` flag (which will cause the dependency to be added to the `devDependencies` field instead) and the `-P,--peer` flag (which will do the same but for `peerDependencies`).\n\n - If the package was already listed in your dependencies, it will by default be upgraded whether it's part of your `dependencies` or `devDependencies` (it won't ever update `peerDependencies`, though).\n\n - If set, the `--prefer-dev` flag will operate as a more flexible `-D,--dev` in that it will add the package to your `devDependencies` if it isn't already listed in either `dependencies` or `devDependencies`, but it will also happily upgrade your `dependencies` if that's what you already use (whereas `-D,--dev` would throw an exception).\n\n - If set, the `-O,--optional` flag will add the package to the `optionalDependencies` field and, in combination with the `-P,--peer` flag, it will add the package as an optional peer dependency. If the package was already listed in your `dependencies`, it will be upgraded to `optionalDependencies`. If the package was already listed in your `peerDependencies`, in combination with the `-P,--peer` flag, it will be upgraded to an optional peer dependency: `\"peerDependenciesMeta\": { \"\": { \"optional\": true } }`\n\n - If the added package doesn't specify a range at all its `latest` tag will be resolved and the returned version will be used to generate a new semver range (using the `^` modifier by default unless otherwise configured via the `defaultSemverRangePrefix` configuration, or the `~` modifier if `-T,--tilde` is specified, or no modifier at all if `-E,--exact` is specified). Two exceptions to this rule: the first one is that if the package is a workspace then its local version will be used, and the second one is that if you use `-P,--peer` the default range will be `*` and won't be resolved at all.\n\n - If the added package specifies a range (such as `^1.0.0`, `latest`, or `rc`), Yarn will add this range as-is in the resulting package.json entry (in particular, tags such as `rc` will be encoded as-is rather than being converted into a semver range).\n\n If the `--cached` option is used, Yarn will preferably reuse the highest version already used somewhere within the project, even if through a transitive dependency.\n\n If the `-i,--interactive` option is used (or if the `preferInteractive` settings is toggled on) the command will first try to check whether other workspaces in the project use the specified package and, if so, will offer to reuse them.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n For a compilation of all the supported protocols, please consult the dedicated page from our website: https://yarnpkg.com/features/protocols.\n ",examples:[["Add a regular package to the current workspace","$0 add lodash"],["Add a specific version for a package to the current workspace","$0 add lodash@1.2.3"],["Add a package from a GitHub repository (the master branch) to the current workspace using a URL","$0 add lodash@https://github.com/lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol","$0 add lodash@github:lodash/lodash"],["Add a package from a GitHub repository (the master branch) to the current workspace using the GitHub protocol (shorthand)","$0 add lodash@lodash/lodash"],["Add a package from a specific branch of a GitHub repository to the current workspace using the GitHub protocol (shorthand)","$0 add lodash-es@lodash/lodash#es"]]});var ioe=cC;function O3e(t,e,{dev:r,peer:i,preferDev:n,optional:s}){let o=t.manifest[vr.REGULAR].has(e.identHash),a=t.manifest[vr.DEVELOPMENT].has(e.identHash),l=t.manifest[vr.PEER].has(e.identHash);if((r||i)&&o)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a regular dependency - remove the -D,-P flags or remove it from your dependencies first`);if(!r&&!i&&l)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - use either of -D or -P, or remove it from your peer dependencies first`);if(s&&a)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a dev dependency - remove the -O flag or remove it from your dev dependencies first`);if(s&&!i&&l)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" is already listed as a peer dependency - remove the -O flag or add the -P flag or remove it from your peer dependencies first`);if((r||n)&&s)throw new me(`Package "${S.prettyIdent(t.project.configuration,e)}" cannot simultaneously be a dev dependency and an optional dependency`);return i?vr.PEER:r||n?vr.DEVELOPMENT:o?vr.REGULAR:a?vr.DEVELOPMENT:vr.REGULAR}var uC=class extends Be{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print both the binary name and the locator of the package that provides the binary"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.name=Y.String({required:!1})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Ke.find(e,this.context.cwd);if(await r.restoreInstallState(),this.name){let o=(await Kt.getPackageAccessibleBinaries(i,{project:r})).get(this.name);if(!o)throw new me(`Couldn't find a binary named "${this.name}" for package "${S.prettyLocator(e,i)}"`);let[,a]=o;return this.context.stdout.write(`${a} +`),0}return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async s=>{let o=await Kt.getPackageAccessibleBinaries(i,{project:r}),l=Array.from(o.keys()).reduce((c,u)=>Math.max(c,u.length),0);for(let[c,[u,g]]of o)s.reportJson({name:c,source:S.stringifyIdent(u),path:g});if(this.verbose)for(let[c,[u]]of o)s.reportInfo(null,`${c.padEnd(l," ")} ${S.prettyLocator(e,u)}`);else for(let c of o.keys())s.reportInfo(null,c)})).exitCode()}};uC.paths=[["bin"]],uC.usage=ye.Usage({description:"get the path to a binary script",details:` + When used without arguments, this command will print the list of all the binaries available in the current workspace. Adding the \`-v,--verbose\` flag will cause the output to contain both the binary name and the locator of the package that provides the binary. + + When an argument is specified, this command will just print the path to the binary on the standard output and exit. Note that the reported path may be stored within a zip archive. + `,examples:[["List all the available binaries","$0 bin"],["Print the path to a specific binary","$0 bin eslint"]]});var noe=uC;var gC=class extends Be{constructor(){super(...arguments);this.mirror=Y.Boolean("--mirror",!1,{description:"Remove the global cache files instead of the local cache files"});this.all=Y.Boolean("--all",!1,{description:"Remove both the global cache files and the local cache files of the current project"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=await Qt.find(e);return(await Fe.start({configuration:e,stdout:this.context.stdout},async()=>{let n=(this.all||this.mirror)&&r.mirrorCwd!==null,s=!this.mirror;n&&(await T.removePromise(r.mirrorCwd),await e.triggerHook(o=>o.cleanGlobalArtifacts,e)),s&&await T.removePromise(r.cwd)})).exitCode()}};gC.paths=[["cache","clean"],["cache","clear"]],gC.usage=ye.Usage({description:"remove the shared cache files",details:` + This command will remove all the files from the cache. + `,examples:[["Remove all the local archives","$0 cache clean"],["Remove all the archives stored in the ~/.yarn directory","$0 cache clean --mirror"]]});var soe=gC;var ooe=ie(p0()),KN=ie(require("util")),fC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.unsafe=Y.Boolean("--no-redacted",!1,{description:"Don't redact secrets (such as tokens) from the output"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=this.name.replace(/[.[].*$/,""),i=this.name.replace(/^[^.[]*/,"");if(typeof e.settings.get(r)=="undefined")throw new me(`Couldn't find a configuration settings named "${r}"`);let s=e.getSpecial(r,{hideSecrets:!this.unsafe,getNativePaths:!0}),o=de.convertMapsToIndexableObjects(s),a=i?(0,ooe.default)(o,i):o,l=await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async c=>{c.reportJson(a)});if(!this.json){if(typeof a=="string")return this.context.stdout.write(`${a} +`),l.exitCode();KN.inspect.styles.name="cyan",this.context.stdout.write(`${(0,KN.inspect)(a,{depth:Infinity,colors:e.get("enableColors"),compact:!1})} +`)}return l.exitCode()}};fC.paths=[["config","get"]],fC.usage=ye.Usage({description:"read a configuration settings",details:` + This command will print a configuration setting. + + Secrets (such as tokens) will be redacted from the output by default. If this behavior isn't desired, set the \`--no-redacted\` to get the untransformed value. + `,examples:[["Print a simple configuration setting","yarn config get yarnPath"],["Print a complex configuration setting","yarn config get packageExtensions"],["Print a nested field from the configuration",`yarn config get 'npmScopes["my-company"].npmRegistryServer'`],["Print a token from the configuration","yarn config get npmAuthToken --no-redacted"],["Print a configuration setting as JSON","yarn config get packageExtensions --json"]]});var aoe=fC;var Eae=ie(qN()),Iae=ie(p0()),yae=ie(mae()),JN=ie(require("util")),pC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Set complex configuration settings to JSON values"});this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String();this.value=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);if(i==="enableStrictSettings")throw new me("This setting only affects the file it's in, and thus cannot be set from the CLI");let o=this.json?JSON.parse(this.value):this.value;await(this.home?h=>fe.updateHomeConfiguration(h):h=>fe.updateConfiguration(r(),h))(h=>{if(n){let p=(0,Eae.default)(h);return(0,yae.default)(p,this.name,o),p}else return _(P({},h),{[i]:o})});let c=(await fe.find(this.context.cwd,this.context.plugins)).getSpecial(i,{hideSecrets:!0,getNativePaths:!0}),u=de.convertMapsToIndexableObjects(c),g=n?(0,Iae.default)(u,n):u;return(await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async h=>{JN.inspect.styles.name="cyan",h.reportInfo(z.UNNAMED,`Successfully set ${this.name} to ${(0,JN.inspect)(g,{depth:Infinity,colors:e.get("enableColors"),compact:!1})}`)})).exitCode()}};pC.paths=[["config","set"]],pC.usage=ye.Usage({description:"change a configuration settings",details:` + This command will set a configuration setting. + + When used without the \`--json\` flag, it can only set a simple configuration setting (a string, a number, or a boolean). + + When used with the \`--json\` flag, it can set both simple and complex configuration settings, including Arrays and Objects. + `,examples:[["Set a simple configuration setting (a string, a number, or a boolean)","yarn config set initScope myScope"],["Set a simple configuration setting (a string, a number, or a boolean) using the `--json` flag",'yarn config set initScope --json \\"myScope\\"'],["Set a complex configuration setting (an Array) using the `--json` flag",`yarn config set unsafeHttpWhitelist --json '["*.example.com", "example.com"]'`],["Set a complex configuration setting (an Object) using the `--json` flag",`yarn config set packageExtensions --json '{ "@babel/parser@*": { "dependencies": { "@babel/types": "*" } } }'`],["Set a nested configuration setting",'yarn config set npmScopes.company.npmRegistryServer "https://npm.example.com"'],["Set a nested configuration setting using indexed access for non-simple keys",`yarn config set 'npmRegistries["//npm.example.com"].npmAuthToken' "ffffffff-ffff-ffff-ffff-ffffffffffff"`]]});var wae=pC;var Dae=ie(qN()),Rae=ie(Ld()),Fae=ie(Pae()),dC=class extends Be{constructor(){super(...arguments);this.home=Y.Boolean("-H,--home",!1,{description:"Update the home configuration instead of the project configuration"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=()=>{if(!e.projectCwd)throw new me("This command must be run from within a project folder");return e.projectCwd},i=this.name.replace(/[.[].*$/,""),n=this.name.replace(/^[^.[]*\.?/,"");if(typeof e.settings.get(i)=="undefined")throw new me(`Couldn't find a configuration settings named "${i}"`);let o=this.home?l=>fe.updateHomeConfiguration(l):l=>fe.updateConfiguration(r(),l);return(await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout},async l=>{let c=!1;await o(u=>{if(!(0,Rae.default)(u,this.name))return l.reportWarning(z.UNNAMED,`Configuration doesn't contain setting ${this.name}; there is nothing to unset`),c=!0,u;let g=n?(0,Dae.default)(u):P({},u);return(0,Fae.default)(g,this.name),g}),c||l.reportInfo(z.UNNAMED,`Successfully unset ${this.name}`)})).exitCode()}};dC.paths=[["config","unset"]],dC.usage=ye.Usage({description:"unset a configuration setting",details:` + This command will unset a configuration setting. + `,examples:[["Unset a simple configuration setting","yarn config unset initScope"],["Unset a complex configuration setting","yarn config unset packageExtensions"],["Unset a nested configuration setting","yarn config unset npmScopes.company.npmRegistryServer"]]});var Nae=dC;var WN=ie(require("util")),CC=class extends Be{constructor(){super(...arguments);this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Print the setting description on top of the regular key/value information"});this.why=Y.Boolean("--why",!1,{description:"Print the reason why a setting is set a particular way"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins,{strict:!1});return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{if(e.invalid.size>0&&!this.json){for(let[n,s]of e.invalid)i.reportError(z.INVALID_CONFIGURATION_KEY,`Invalid configuration key "${n}" in ${s}`);i.reportSeparator()}if(this.json){let n=de.sortMap(e.settings.keys(),s=>s);for(let s of n){let o=e.settings.get(s),a=e.getSpecial(s,{hideSecrets:!0,getNativePaths:!0}),l=e.sources.get(s);this.verbose?i.reportJson({key:s,effective:a,source:l}):i.reportJson(P({key:s,effective:a,source:l},o))}}else{let n=de.sortMap(e.settings.keys(),a=>a),s=n.reduce((a,l)=>Math.max(a,l.length),0),o={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2};if(this.why||this.verbose){let a=n.map(c=>{let u=e.settings.get(c);if(!u)throw new Error(`Assertion failed: This settings ("${c}") should have been registered`);let g=this.why?e.sources.get(c)||"":u.description;return[c,g]}),l=a.reduce((c,[,u])=>Math.max(c,u.length),0);for(let[c,u]of a)i.reportInfo(null,`${c.padEnd(s," ")} ${u.padEnd(l," ")} ${(0,WN.inspect)(e.getSpecial(c,{hideSecrets:!0,getNativePaths:!0}),o)}`)}else for(let a of n)i.reportInfo(null,`${a.padEnd(s," ")} ${(0,WN.inspect)(e.getSpecial(a,{hideSecrets:!0,getNativePaths:!0}),o)}`)}})).exitCode()}};CC.paths=[["config"]],CC.usage=ye.Usage({description:"display the current configuration",details:` + This command prints the current active configuration settings. + `,examples:[["Print the active configuration settings","$0 config"]]});var Lae=CC;Ss();var zN={};it(zN,{Strategy:()=>Oc,acceptedStrategies:()=>H4e,dedupe:()=>VN});var Tae=ie(Nn()),Oc;(function(e){e.HIGHEST="highest"})(Oc||(Oc={}));var H4e=new Set(Object.values(Oc)),G4e={highest:async(t,e,{resolver:r,fetcher:i,resolveOptions:n,fetchOptions:s})=>{let o=new Map;for(let[a,l]of t.storedResolutions){let c=t.storedDescriptors.get(a);if(typeof c=="undefined")throw new Error(`Assertion failed: The descriptor (${a}) should have been registered`);de.getSetWithDefault(o,c.identHash).add(l)}return Array.from(t.storedDescriptors.values(),async a=>{if(e.length&&!Tae.default.isMatch(S.stringifyIdent(a),e))return null;let l=t.storedResolutions.get(a.descriptorHash);if(typeof l=="undefined")throw new Error(`Assertion failed: The resolution (${a.descriptorHash}) should have been registered`);let c=t.originalPackages.get(l);if(typeof c=="undefined"||!r.shouldPersistResolution(c,n))return null;let u=o.get(a.identHash);if(typeof u=="undefined")throw new Error(`Assertion failed: The resolutions (${a.identHash}) should have been registered`);if(u.size===1)return null;let g=[...u].map(m=>{let I=t.originalPackages.get(m);if(typeof I=="undefined")throw new Error(`Assertion failed: The package (${m}) should have been registered`);return I.reference}),f=await r.getSatisfying(a,g,n),h=f==null?void 0:f[0];if(typeof h=="undefined")return null;let p=h.locatorHash,d=t.originalPackages.get(p);if(typeof d=="undefined")throw new Error(`Assertion failed: The package (${p}) should have been registered`);return p===l?null:{descriptor:a,currentPackage:c,updatedPackage:d}})}};async function VN(t,{strategy:e,patterns:r,cache:i,report:n}){let{configuration:s}=t,o=new ei,a=s.makeResolver(),l=s.makeFetcher(),c={cache:i,checksums:t.storedChecksums,fetcher:l,project:t,report:o,skipIntegrityCheck:!0,cacheOptions:{skipIntegrityCheck:!0}},u={project:t,resolver:a,report:o,fetchOptions:c};return await n.startTimerPromise("Deduplication step",async()=>{let f=await G4e[e](t,r,{resolver:a,resolveOptions:u,fetcher:l,fetchOptions:c}),h=Xi.progressViaCounter(f.length);n.reportProgress(h);let p=0;await Promise.all(f.map(I=>I.then(B=>{if(B===null)return;p++;let{descriptor:b,currentPackage:R,updatedPackage:H}=B;n.reportInfo(z.UNNAMED,`${S.prettyDescriptor(s,b)} can be deduped from ${S.prettyLocator(s,R)} to ${S.prettyLocator(s,H)}`),n.reportJson({descriptor:S.stringifyDescriptor(b),currentResolution:S.stringifyLocator(R),updatedResolution:S.stringifyLocator(H)}),t.storedResolutions.set(b.descriptorHash,H.locatorHash)}).finally(()=>h.tick())));let d;switch(p){case 0:d="No packages";break;case 1:d="One package";break;default:d=`${p} packages`}let m=ue.pretty(s,e,ue.Type.CODE);return n.reportInfo(z.UNNAMED,`${d} can be deduped using the ${m} strategy`),p})}var mC=class extends Be{constructor(){super(...arguments);this.strategy=Y.String("-s,--strategy",Oc.HIGHEST,{description:"The strategy to use when deduping dependencies",validator:Yi(Oc)});this.check=Y.Boolean("-c,--check",!1,{description:"Exit with exit code 1 when duplicates are found, without persisting the dependency tree"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=await Qt.find(e);await r.restoreInstallState({restoreResolutions:!1});let n=0,s=await Fe.start({configuration:e,includeFooter:!1,stdout:this.context.stdout,json:this.json},async o=>{n=await VN(r,{strategy:this.strategy,patterns:this.patterns,cache:i,report:o})});return s.hasErrors()?s.exitCode():this.check?n?1:0:(await Fe.start({configuration:e,stdout:this.context.stdout,json:this.json},async a=>{await r.install({cache:i,report:a,mode:this.mode})})).exitCode()}};mC.paths=[["dedupe"]],mC.usage=ye.Usage({description:"deduplicate dependencies with overlapping ranges",details:"\n Duplicates are defined as descriptors with overlapping ranges being resolved and locked to different locators. They are a natural consequence of Yarn's deterministic installs, but they can sometimes pile up and unnecessarily increase the size of your project.\n\n This command dedupes dependencies in the current project using different strategies (only one is implemented at the moment):\n\n - `highest`: Reuses (where possible) the locators with the highest versions. This means that dependencies can only be upgraded, never downgraded. It's also guaranteed that it never takes more than a single pass to dedupe the entire dependency tree.\n\n **Note:** Even though it never produces a wrong dependency tree, this command should be used with caution, as it modifies the dependency tree, which can sometimes cause problems when packages don't strictly follow semver recommendations. Because of this, it is recommended to also review the changes manually.\n\n If set, the `-c,--check` flag will only report the found duplicates, without persisting the modified dependency tree. If changes are found, the command will exit with a non-zero exit code, making it suitable for CI purposes.\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n ### In-depth explanation:\n\n Yarn doesn't deduplicate dependencies by default, otherwise installs wouldn't be deterministic and the lockfile would be useless. What it actually does is that it tries to not duplicate dependencies in the first place.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@*`will cause Yarn to reuse `foo@2.3.4`, even if the latest `foo` is actually `foo@2.10.14`, thus preventing unnecessary duplication.\n\n Duplication happens when Yarn can't unlock dependencies that have already been locked inside the lockfile.\n\n **Example:** If `foo@^2.3.4` (a dependency of a dependency) has already been resolved to `foo@2.3.4`, running `yarn add foo@2.10.14` will cause Yarn to install `foo@2.10.14` because the existing resolution doesn't satisfy the range `2.10.14`. This behavior can lead to (sometimes) unwanted duplication, since now the lockfile contains 2 separate resolutions for the 2 `foo` descriptors, even though they have overlapping ranges, which means that the lockfile can be simplified so that both descriptors resolve to `foo@2.10.14`.\n ",examples:[["Dedupe all packages","$0 dedupe"],["Dedupe all packages using a specific strategy","$0 dedupe --strategy highest"],["Dedupe a specific package","$0 dedupe lodash"],["Dedupe all packages with the `@babel/*` scope","$0 dedupe '@babel/*'"],["Check for duplicates (can be used as a CI step)","$0 dedupe --check"]]});var Mae=mC;var Y0=class extends Be{async execute(){let{plugins:e}=await fe.find(this.context.cwd,this.context.plugins),r=[];for(let o of e){let{commands:a}=o[1];if(a){let c=oo.from(a).definitions();r.push([o[0],c])}}let i=this.cli.definitions(),n=(o,a)=>o.split(" ").slice(1).join()===a.split(" ").slice(1).join(),s=Kae()["@yarnpkg/builder"].bundles.standard;for(let o of r){let a=o[1];for(let l of a)i.find(c=>n(c.path,l.path)).plugin={name:o[0],isDefault:s.includes(o[0])}}this.context.stdout.write(`${JSON.stringify(i,null,2)} +`)}};Y0.paths=[["--clipanion=definitions"]];var Uae=Y0;var q0=class extends Be{async execute(){this.context.stdout.write(this.cli.usage(null))}};q0.paths=[["help"],["--help"],["-h"]];var Hae=q0;var _N=class extends Be{constructor(){super(...arguments);this.leadingArgument=Y.String();this.args=Y.Proxy()}async execute(){if(this.leadingArgument.match(/[\\/]/)&&!S.tryParseIdent(this.leadingArgument)){let e=v.resolve(this.context.cwd,M.toPortablePath(this.leadingArgument));return await this.cli.run(this.args,{cwd:e})}else return await this.cli.run(["run",this.leadingArgument,...this.args])}},Gae=_N;var J0=class extends Be{async execute(){this.context.stdout.write(`${Zr||""} +`)}};J0.paths=[["-v"],["--version"]];var jae=J0;var EC=class extends Be{constructor(){super(...arguments);this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,locator:i}=await Ke.find(e,this.context.cwd);return await r.restoreInstallState(),await Kt.executePackageShellcode(i,this.commandName,this.args,{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,project:r})}};EC.paths=[["exec"]],EC.usage=ye.Usage({description:"execute a shell script",details:` + This command simply executes a shell script within the context of the root directory of the active workspace using the portable shell. + + It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + `,examples:[["Execute a single shell command","$0 exec echo Hello World"],["Execute a shell script",'$0 exec "tsc & babel src --out-dir lib"']]});var Yae=EC;Ss();var IC=class extends Be{constructor(){super(...arguments);this.hash=Y.String({required:!1,validator:fv(gv(),[hv(/^p[0-9a-f]{5}$/)])})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return await r.restoreInstallState({restoreResolutions:!1}),await r.applyLightResolution(),typeof this.hash!="undefined"?await j4e(this.hash,r,{stdout:this.context.stdout}):(await Fe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async n=>{var o;let s=[([,a])=>S.stringifyLocator(r.storedPackages.get(a.subject)),([,a])=>S.stringifyIdent(a.requested)];for(let[a,l]of de.sortMap(r.peerRequirements,s)){let c=r.storedPackages.get(l.subject);if(typeof c=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let u=r.storedPackages.get(l.rootRequester);if(typeof u=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let g=(o=c.dependencies.get(l.requested.identHash))!=null?o:null,f=ue.pretty(e,a,ue.Type.CODE),h=S.prettyLocator(e,c),p=S.prettyIdent(e,l.requested),d=S.prettyIdent(e,u),m=l.allRequesters.length-1,I=`descendant${m===1?"":"s"}`,B=m>0?` and ${m} ${I}`:"",b=g!==null?"provides":"doesn't provide";n.reportInfo(null,`${f} \u2192 ${h} ${b} ${p} to ${d}${B}`)}})).exitCode()}};IC.paths=[["explain","peer-requirements"]],IC.usage=ye.Usage({description:"explain a set of peer requirements",details:` + A set of peer requirements represents all peer requirements that a dependent must satisfy when providing a given peer request to a requester and its descendants. + + When the hash argument is specified, this command prints a detailed explanation of all requirements of the set corresponding to the hash and whether they're satisfied or not. + + When used without arguments, this command lists all sets of peer requirements and the corresponding hash that can be used to get detailed information about a given set. + + **Note:** A hash is a six-letter p-prefixed code that can be obtained from peer dependency warnings or from the list of all peer requirements (\`yarn explain peer-requirements\`). + `,examples:[["Explain the corresponding set of peer requirements for a hash","$0 explain peer-requirements p1a4ed"],["List all sets of peer requirements","$0 explain peer-requirements"]]});var qae=IC;async function j4e(t,e,r){let{configuration:i}=e,n=e.peerRequirements.get(t);if(typeof n=="undefined")throw new Error(`No peerDependency requirements found for hash: "${t}"`);return(await Fe.start({configuration:i,stdout:r.stdout,includeFooter:!1},async o=>{var I,B;let a=e.storedPackages.get(n.subject);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the subject package to have been registered");let l=e.storedPackages.get(n.rootRequester);if(typeof l=="undefined")throw new Error("Assertion failed: Expected the root package to have been registered");let c=(I=a.dependencies.get(n.requested.identHash))!=null?I:null,u=c!==null?e.storedResolutions.get(c.descriptorHash):null;if(typeof u=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let g=u!==null?e.storedPackages.get(u):null;if(typeof g=="undefined")throw new Error("Assertion failed: Expected the provided package to have been registered");let f=[...n.allRequesters.values()].map(b=>{let R=e.storedPackages.get(b);if(typeof R=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let H=S.devirtualizeLocator(R),L=e.storedPackages.get(H.locatorHash);if(typeof L=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let K=L.peerDependencies.get(n.requested.identHash);if(typeof K=="undefined")throw new Error("Assertion failed: Expected the peer dependency to be registered");return{pkg:R,peerDependency:K}});if(g!==null){let b=f.every(({peerDependency:R})=>qt.satisfiesWithPrereleases(g.version,R.range));o.reportInfo(z.UNNAMED,`${S.prettyLocator(i,a)} provides ${S.prettyLocator(i,g)} with version ${S.prettyReference(i,(B=g.version)!=null?B:"")}, which ${b?"satisfies":"doesn't satisfy"} the following requirements:`)}else o.reportInfo(z.UNNAMED,`${S.prettyLocator(i,a)} doesn't provide ${S.prettyIdent(i,n.requested)}, breaking the following requirements:`);o.reportSeparator();let h=ue.mark(i),p=[];for(let{pkg:b,peerDependency:R}of de.sortMap(f,H=>S.stringifyLocator(H.pkg))){let L=(g!==null?qt.satisfiesWithPrereleases(g.version,R.range):!1)?h.Check:h.Cross;p.push({stringifiedLocator:S.stringifyLocator(b),prettyLocator:S.prettyLocator(i,b),prettyRange:S.prettyRange(i,R.range),mark:L})}let d=Math.max(...p.map(({stringifiedLocator:b})=>b.length)),m=Math.max(...p.map(({prettyRange:b})=>b.length));for(let{stringifiedLocator:b,prettyLocator:R,prettyRange:H,mark:L}of de.sortMap(p,({stringifiedLocator:K})=>K))o.reportInfo(null,`${R.padEnd(d+(R.length-b.length)," ")} \u2192 ${H.padEnd(m," ")} ${L}`);p.length>1&&(o.reportSeparator(),o.reportInfo(z.UNNAMED,`Note: these requirements start with ${S.prettyLocator(e.configuration,l)}`))})).exitCode()}var Jae=ie(Nn()),yC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Print versions of a package from the whole project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Print information for all packages, including transitive dependencies"});this.extra=Y.Array("-X,--extra",[],{description:"An array of requests of extra data provided by plugins"});this.cache=Y.Boolean("--cache",!1,{description:"Print information about the cache entry of a package (path, size, checksum)"});this.dependents=Y.Boolean("--dependents",!1,{description:"Print all dependents for each matching package"});this.manifest=Y.Boolean("--manifest",!1,{description:"Print data obtained by looking at the package archive (license, homepage, ...)"});this.nameOnly=Y.Boolean("--name-only",!1,{description:"Only print the name for the matching packages"});this.virtuals=Y.Boolean("--virtuals",!1,{description:"Print each instance of the virtual packages"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i&&!this.all)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let s=new Set(this.extra);this.cache&&s.add("cache"),this.dependents&&s.add("dependents"),this.manifest&&s.add("manifest");let o=(b,{recursive:R})=>{let H=b.anchoredLocator.locatorHash,L=new Map,K=[H];for(;K.length>0;){let J=K.shift();if(L.has(J))continue;let ne=r.storedPackages.get(J);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the package to be registered");if(L.set(J,ne),S.isVirtualLocator(ne)&&K.push(S.devirtualizeLocator(ne).locatorHash),!(!R&&J!==H))for(let q of ne.dependencies.values()){let A=r.storedResolutions.get(q.descriptorHash);if(typeof A=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");K.push(A)}}return L.values()},a=({recursive:b})=>{let R=new Map;for(let H of r.workspaces)for(let L of o(H,{recursive:b}))R.set(L.locatorHash,L);return R.values()},l=({all:b,recursive:R})=>b&&R?r.storedPackages.values():b?a({recursive:R}):o(i,{recursive:R}),c=({all:b,recursive:R})=>{let H=l({all:b,recursive:R}),L=this.patterns.map(ne=>{let q=S.parseLocator(ne),A=Jae.default.makeRe(S.stringifyIdent(q)),V=S.isVirtualLocator(q),W=V?S.devirtualizeLocator(q):q;return X=>{let F=S.stringifyIdent(X);if(!A.test(F))return!1;if(q.reference==="unknown")return!0;let D=S.isVirtualLocator(X),he=D?S.devirtualizeLocator(X):X;return!(V&&D&&q.reference!==X.reference||W.reference!==he.reference)}}),K=de.sortMap([...H],ne=>S.stringifyLocator(ne));return{selection:K.filter(ne=>L.length===0||L.some(q=>q(ne))),sortedLookup:K}},{selection:u,sortedLookup:g}=c({all:this.all,recursive:this.recursive});if(u.length===0)throw new me("No package matched your request");let f=new Map;if(this.dependents)for(let b of g)for(let R of b.dependencies.values()){let H=r.storedResolutions.get(R.descriptorHash);if(typeof H=="undefined")throw new Error("Assertion failed: Expected the resolution to be registered");de.getArrayWithDefault(f,H).push(b)}let h=new Map;for(let b of g){if(!S.isVirtualLocator(b))continue;let R=S.devirtualizeLocator(b);de.getArrayWithDefault(h,R.locatorHash).push(b)}let p={},d={children:p},m=e.makeFetcher(),I={project:r,fetcher:m,cache:n,checksums:r.storedChecksums,report:new ei,cacheOptions:{skipIntegrityCheck:!0},skipIntegrityCheck:!0},B=[async(b,R,H)=>{var J,ne;if(!R.has("manifest"))return;let L=await m.fetch(b,I),K;try{K=await Ze.find(L.prefixPath,{baseFs:L.packageFs})}finally{(J=L.releaseFs)==null||J.call(L)}H("Manifest",{License:ue.tuple(ue.Type.NO_HINT,K.license),Homepage:ue.tuple(ue.Type.URL,(ne=K.raw.homepage)!=null?ne:null)})},async(b,R,H)=>{var A;if(!R.has("cache"))return;let L={mockedPackages:r.disabledLocators,unstablePackages:r.conditionalLocators},K=(A=r.storedChecksums.get(b.locatorHash))!=null?A:null,J=n.getLocatorPath(b,K,L),ne;if(J!==null)try{ne=T.statSync(J)}catch{}let q=typeof ne!="undefined"?[ne.size,ue.Type.SIZE]:void 0;H("Cache",{Checksum:ue.tuple(ue.Type.NO_HINT,K),Path:ue.tuple(ue.Type.PATH,J),Size:q})}];for(let b of u){let R=S.isVirtualLocator(b);if(!this.virtuals&&R)continue;let H={},L={value:[b,ue.Type.LOCATOR],children:H};if(p[S.stringifyLocator(b)]=L,this.nameOnly){delete L.children;continue}let K=h.get(b.locatorHash);typeof K!="undefined"&&(H.Instances={label:"Instances",value:ue.tuple(ue.Type.NUMBER,K.length)}),H.Version={label:"Version",value:ue.tuple(ue.Type.NO_HINT,b.version)};let J=(q,A)=>{let V={};if(H[q]=V,Array.isArray(A))V.children=A.map(W=>({value:W}));else{let W={};V.children=W;for(let[X,F]of Object.entries(A))typeof F!="undefined"&&(W[X]={label:X,value:F})}};if(!R){for(let q of B)await q(b,s,J);await e.triggerHook(q=>q.fetchPackageInfo,b,s,J)}b.bin.size>0&&!R&&J("Exported Binaries",[...b.bin.keys()].map(q=>ue.tuple(ue.Type.PATH,q)));let ne=f.get(b.locatorHash);typeof ne!="undefined"&&ne.length>0&&J("Dependents",ne.map(q=>ue.tuple(ue.Type.LOCATOR,q))),b.dependencies.size>0&&!R&&J("Dependencies",[...b.dependencies.values()].map(q=>{var W;let A=r.storedResolutions.get(q.descriptorHash),V=typeof A!="undefined"&&(W=r.storedPackages.get(A))!=null?W:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:q,locator:V})})),b.peerDependencies.size>0&&R&&J("Peer dependencies",[...b.peerDependencies.values()].map(q=>{var X,F;let A=b.dependencies.get(q.identHash),V=typeof A!="undefined"&&(X=r.storedResolutions.get(A.descriptorHash))!=null?X:null,W=V!==null&&(F=r.storedPackages.get(V))!=null?F:null;return ue.tuple(ue.Type.RESOLUTION,{descriptor:q,locator:W})}))}Hs.emitTree(d,{configuration:e,json:this.json,stdout:this.context.stdout,separators:this.nameOnly?0:2})}};yC.paths=[["info"]],yC.usage=ye.Usage({description:"see information related to packages",details:"\n This command prints various information related to the specified packages, accepting glob patterns.\n\n By default, if the locator reference is missing, Yarn will default to print the information about all the matching direct dependencies of the package for the active workspace. To instead print all versions of the package that are direct dependencies of any of your workspaces, use the `-A,--all` flag. Adding the `-R,--recursive` flag will also report transitive dependencies.\n\n Some fields will be hidden by default in order to keep the output readable, but can be selectively displayed by using additional options (`--dependents`, `--manifest`, `--virtuals`, ...) described in the option descriptions.\n\n Note that this command will only print the information directly related to the selected packages - if you wish to know why the package is there in the first place, use `yarn why` which will do just that (it also provides a `-R,--recursive` flag that may be of some help).\n ",examples:[["Show information about Lodash","$0 info lodash"]]});var Wae=yC;var W0=ie(ml());Ss();var wC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.immutable=Y.Boolean("--immutable",{description:"Abort with an error exit code if the lockfile was to be modified"});this.immutableCache=Y.Boolean("--immutable-cache",{description:"Abort with an error exit code if the cache folder was to be modified"});this.checkCache=Y.Boolean("--check-cache",!1,{description:"Always refetch the packages and ensure that their checksums are consistent"});this.inlineBuilds=Y.Boolean("--inline-builds",{description:"Verbosely print the output of the build steps of dependencies"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.cacheFolder=Y.String("--cache-folder",{hidden:!0});this.frozenLockfile=Y.Boolean("--frozen-lockfile",{hidden:!0});this.ignoreEngines=Y.Boolean("--ignore-engines",{hidden:!0});this.nonInteractive=Y.Boolean("--non-interactive",{hidden:!0});this.preferOffline=Y.Boolean("--prefer-offline",{hidden:!0});this.production=Y.Boolean("--production",{hidden:!0});this.registry=Y.String("--registry",{hidden:!0});this.silent=Y.Boolean("--silent",{hidden:!0});this.networkTimeout=Y.String("--network-timeout",{hidden:!0})}async execute(){var c;let e=await fe.find(this.context.cwd,this.context.plugins);typeof this.inlineBuilds!="undefined"&&e.useWithSource("",{enableInlineBuilds:this.inlineBuilds},e.startingCwd,{overwrite:!0});let r=!!process.env.FUNCTION_TARGET||!!process.env.GOOGLE_RUNTIME,i=async(u,{error:g})=>{let f=await Fe.start({configuration:e,stdout:this.context.stdout,includeFooter:!1},async h=>{g?h.reportError(z.DEPRECATED_CLI_SETTINGS,u):h.reportWarning(z.DEPRECATED_CLI_SETTINGS,u)});return f.hasErrors()?f.exitCode():null};if(typeof this.ignoreEngines!="undefined"){let u=await i("The --ignore-engines option is deprecated; engine checking isn't a core feature anymore",{error:!W0.default.VERCEL});if(u!==null)return u}if(typeof this.registry!="undefined"){let u=await i("The --registry option is deprecated; prefer setting npmRegistryServer in your .yarnrc.yml file",{error:!1});if(u!==null)return u}if(typeof this.preferOffline!="undefined"){let u=await i("The --prefer-offline flag is deprecated; use the --cached flag with 'yarn add' instead",{error:!W0.default.VERCEL});if(u!==null)return u}if(typeof this.production!="undefined"){let u=await i("The --production option is deprecated on 'install'; use 'yarn workspaces focus' instead",{error:!0});if(u!==null)return u}if(typeof this.nonInteractive!="undefined"){let u=await i("The --non-interactive option is deprecated",{error:!r});if(u!==null)return u}if(typeof this.frozenLockfile!="undefined"&&(await i("The --frozen-lockfile option is deprecated; use --immutable and/or --immutable-cache instead",{error:!1}),this.immutable=this.frozenLockfile),typeof this.cacheFolder!="undefined"){let u=await i("The cache-folder option has been deprecated; use rc settings instead",{error:!W0.default.NETLIFY});if(u!==null)return u}let n=(c=this.immutable)!=null?c:e.get("enableImmutableInstalls");if(e.projectCwd!==null){let u=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async g=>{await Y4e(e,n)&&(g.reportInfo(z.AUTOMERGE_SUCCESS,"Automatically fixed merge conflicts \u{1F44D}"),g.reportSeparator())});if(u.hasErrors())return u.exitCode()}if(e.projectCwd!==null&&typeof e.sources.get("nodeLinker")=="undefined"){let u=e.projectCwd,g;try{g=await T.readFilePromise(v.join(u,wt.lockfile),"utf8")}catch{}if(g==null?void 0:g.includes("yarn lockfile v1")){let f=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async h=>{h.reportInfo(z.AUTO_NM_SUCCESS,"Migrating from Yarn 1; automatically enabling the compatibility node-modules linker \u{1F44D}"),h.reportSeparator(),e.use("",{nodeLinker:"node-modules"},u,{overwrite:!0}),await fe.updateConfiguration(u,{nodeLinker:"node-modules"})});if(f.hasErrors())return f.exitCode()}}if(e.projectCwd!==null){let u=await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeFooter:!1},async g=>{var f;((f=fe.telemetry)==null?void 0:f.isNew)&&(g.reportInfo(z.TELEMETRY_NOTICE,"Yarn will periodically gather anonymous telemetry: https://yarnpkg.com/advanced/telemetry"),g.reportInfo(z.TELEMETRY_NOTICE,`Run ${ue.pretty(e,"yarn config set --home enableTelemetry 0",ue.Type.CODE)} to disable`),g.reportSeparator())});if(u.hasErrors())return u.exitCode()}let{project:s,workspace:o}=await Ke.find(e,this.context.cwd),a=await Qt.find(e,{immutable:this.immutableCache,check:this.checkCache});if(!o)throw new rt(s.cwd,this.context.cwd);return await s.restoreInstallState({restoreResolutions:!1}),(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout,includeLogs:!0},async u=>{await s.install({cache:a,report:u,immutable:n,mode:this.mode})})).exitCode()}};wC.paths=[["install"],ye.Default],wC.usage=ye.Usage({description:"install the project dependencies",details:` + This command sets up your project if needed. The installation is split into four different steps that each have their own characteristics: + + - **Resolution:** First the package manager will resolve your dependencies. The exact way a dependency version is privileged over another isn't standardized outside of the regular semver guarantees. If a package doesn't resolve to what you would expect, check that all dependencies are correctly declared (also check our website for more information: ). + + - **Fetch:** Then we download all the dependencies if needed, and make sure that they're all stored within our cache (check the value of \`cacheFolder\` in \`yarn config\` to see where the cache files are stored). + + - **Link:** Then we send the dependency tree information to internal plugins tasked with writing them on the disk in some form (for example by generating the .pnp.cjs file you might know). + + - **Build:** Once the dependency tree has been written on the disk, the package manager will now be free to run the build scripts for all packages that might need it, in a topological order compatible with the way they depend on one another. See https://yarnpkg.com/advanced/lifecycle-scripts for detail. + + Note that running this command is not part of the recommended workflow. Yarn supports zero-installs, which means that as long as you store your cache and your .pnp.cjs file inside your repository, everything will work without requiring any install right after cloning your repository or switching branches. + + If the \`--immutable\` option is set (defaults to true on CI), Yarn will abort with an error exit code if the lockfile was to be modified (other paths can be added using the \`immutablePatterns\` configuration setting). For backward compatibility we offer an alias under the name of \`--frozen-lockfile\`, but it will be removed in a later release. + + If the \`--immutable-cache\` option is set, Yarn will abort with an error exit code if the cache folder was to be modified (either because files would be added, or because they'd be removed). + + If the \`--check-cache\` option is set, Yarn will always refetch the packages and will ensure that their checksum matches what's 1/ described in the lockfile 2/ inside the existing cache files (if present). This is recommended as part of your CI workflow if you're both following the Zero-Installs model and accepting PRs from third-parties, as they'd otherwise have the ability to alter the checked-in packages before submitting them. + + If the \`--inline-builds\` option is set, Yarn will verbosely print the output of the build steps of your dependencies (instead of writing them into individual files). This is likely useful mostly for debug purposes only when using Docker-like environments. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + `,examples:[["Install the project","$0 install"],["Validate a project when using Zero-Installs","$0 install --immutable --immutable-cache"],["Validate a project when using Zero-Installs (slightly safer if you accept external PRs)","$0 install --immutable --immutable-cache --check-cache"]]});var zae=wC,q4e="|||||||",J4e=">>>>>>>",W4e="=======",Vae="<<<<<<<";async function Y4e(t,e){if(!t.projectCwd)return!1;let r=v.join(t.projectCwd,t.get("lockfileFilename"));if(!await T.existsPromise(r))return!1;let i=await T.readFilePromise(r,"utf8");if(!i.includes(Vae))return!1;if(e)throw new nt(z.AUTOMERGE_IMMUTABLE,"Cannot autofix a lockfile when running an immutable install");let[n,s]=z4e(i),o,a;try{o=Ii(n),a=Ii(s)}catch(c){throw new nt(z.AUTOMERGE_FAILED_TO_PARSE,"The individual variants of the lockfile failed to parse")}let l=P(P({},o),a);for(let[c,u]of Object.entries(l))typeof u=="string"&&delete l[c];return await T.changeFilePromise(r,Qa(l),{automaticNewlines:!0}),!0}function z4e(t){let e=[[],[]],r=t.split(/\r?\n/g),i=!1;for(;r.length>0;){let n=r.shift();if(typeof n=="undefined")throw new Error("Assertion failed: Some lines should remain");if(n.startsWith(Vae)){for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s===W4e){i=!1;break}else if(i||s.startsWith(q4e)){i=!0;continue}else e[0].push(s)}for(;r.length>0;){let s=r.shift();if(typeof s=="undefined")throw new Error("Assertion failed: Some lines should remain");if(s.startsWith(J4e))break;e[1].push(s)}}else e[0].push(n),e[1].push(n)}return[e[0].join(` +`),e[1].join(` +`)]}var BC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Link all workspaces belonging to the target project to the current one"});this.private=Y.Boolean("-p,--private",!1,{description:"Also link private workspaces belonging to the target project to the current one"});this.relative=Y.Boolean("-r,--relative",!1,{description:"Link workspaces using relative paths instead of absolute paths"});this.destination=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=v.resolve(this.context.cwd,M.toPortablePath(this.destination)),o=await fe.find(s,this.context.plugins,{useRc:!1,strict:!1}),{project:a,workspace:l}=await Ke.find(o,s);if(r.cwd===a.cwd)throw new me("Invalid destination; Can't link the project to itself");if(!l)throw new rt(a.cwd,s);let c=r.topLevelWorkspace,u=[];if(this.all){for(let f of a.workspaces)f.manifest.name&&(!f.manifest.private||this.private)&&u.push(f);if(u.length===0)throw new me("No workspace found to be linked in the target project")}else{if(!l.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be linked");if(l.manifest.private&&!this.private)throw new me("The target workspace is marked private - use the --private flag to link it anyway");u.push(l)}for(let f of u){let h=S.stringifyIdent(f.locator),p=this.relative?v.relative(r.cwd,f.cwd):f.cwd;c.manifest.resolutions.push({pattern:{descriptor:{fullName:h}},reference:`portal:${p}`})}return(await Fe.start({configuration:e,stdout:this.context.stdout},async f=>{await r.install({cache:n,report:f})})).exitCode()}};BC.paths=[["link"]],BC.usage=ye.Usage({description:"connect the local project to another one",details:"\n This command will set a new `resolutions` field in the project-level manifest and point it to the workspace at the specified location (even if part of another project).\n ",examples:[["Register a remote workspace for use in the current project","$0 link ~/ts-loader"],["Register all workspaces from a remote project for use in the current project","$0 link ~/jest --all"]]});var _ae=BC;var QC=class extends Be{constructor(){super(...arguments);this.args=Y.Proxy()}async execute(){return this.cli.run(["exec","node",...this.args])}};QC.paths=[["node"]],QC.usage=ye.Usage({description:"run node with the hook already setup",details:` + This command simply runs Node. It also makes sure to call it in a way that's compatible with the current project (for example, on PnP projects the environment will be setup in such a way that PnP will be correctly injected into the environment). + + The Node process will use the exact same version of Node as the one used to run Yarn itself, which might be a good way to ensure that your commands always use a consistent Node version. + `,examples:[["Run a Node script","$0 node ./my-script.js"]]});var Xae=QC;var lAe=ie(require("os"));var rAe=ie(require("os"));var V4e="https://raw.githubusercontent.com/yarnpkg/berry/master/plugins.yml";async function Kc(t){let e=await Zt.get(V4e,{configuration:t});return Ii(e.toString())}var bC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{let n=await Kc(e);for(let s of Object.entries(n)){let[l,o]=s,a=o,{experimental:c}=a,u=qr(a,["experimental"]);let g=l;c&&(g+=" [experimental]"),i.reportJson(P({name:l,experimental:c},u)),i.reportInfo(null,g)}})).exitCode()}};bC.paths=[["plugin","list"]],bC.usage=ye.Usage({category:"Plugin-related commands",description:"list the available official plugins",details:"\n This command prints the plugins available directly from the Yarn repository. Only those plugins can be referenced by name in `yarn plugin import`.\n ",examples:[["List the official plugins","$0 plugin list"]]});var Zae=bC;var $ae=ie(Or()),vC=class extends Be{constructor(){super(...arguments);this.onlyIfNeeded=Y.Boolean("--only-if-needed",!1,{description:"Only lock the Yarn version if it isn't already locked"});this.version=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);if(e.get("yarnPath")&&this.onlyIfNeeded)return 0;let r=()=>{if(typeof Zr=="undefined")throw new me("The --install flag can only be used without explicit version specifier from the Yarn CLI");return`file://${process.argv[1]}`},i;if(this.version==="self")i=r();else if(this.version==="latest"||this.version==="berry"||this.version==="stable")i=`https://repo.yarnpkg.com/${await eAe(e,"stable")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="canary")i=`https://repo.yarnpkg.com/${await eAe(e,"canary")}/packages/yarnpkg-cli/bin/yarn.js`;else if(this.version==="classic")i="https://nightly.yarnpkg.com/latest.js";else if(this.version.match(/^\.{0,2}[\\/]/)||M.isAbsolute(this.version))i=`file://${M.resolve(this.version)}`;else if(qt.satisfiesWithPrereleases(this.version,">=2.0.0"))i=`https://repo.yarnpkg.com/${this.version}/packages/yarnpkg-cli/bin/yarn.js`;else if(qt.satisfiesWithPrereleases(this.version,"^0.x || ^1.x"))i=`https://github.com/yarnpkg/yarn/releases/download/v${this.version}/yarn-${this.version}.js`;else if(qt.validRange(this.version))i=`https://repo.yarnpkg.com/${await _4e(e,this.version)}/packages/yarnpkg-cli/bin/yarn.js`;else throw new me(`Invalid version descriptor "${this.version}"`);return(await Fe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async s=>{let o="file://",a;i.startsWith(o)?(s.reportInfo(z.UNNAMED,`Downloading ${ue.pretty(e,i,ps.URL)}`),a=await T.readFilePromise(M.toPortablePath(i.slice(o.length)))):(s.reportInfo(z.UNNAMED,`Retrieving ${ue.pretty(e,i,ps.PATH)}`),a=await Zt.get(i,{configuration:e})),await XN(e,null,a,{report:s})})).exitCode()}};vC.paths=[["set","version"]],vC.usage=ye.Usage({description:"lock the Yarn version used by the project",details:"\n This command will download a specific release of Yarn directly from the Yarn GitHub repository, will store it inside your project, and will change the `yarnPath` settings from your project `.yarnrc.yml` file to point to the new file.\n\n A very good use case for this command is to enforce the version of Yarn used by the any single member of your team inside a same project - by doing this you ensure that you have control on Yarn upgrades and downgrades (including on your deployment servers), and get rid of most of the headaches related to someone using a slightly different version and getting a different behavior than you.\n\n The version specifier can be:\n\n - a tag:\n - `latest` / `berry` / `stable` -> the most recent stable berry (`>=2.0.0`) release\n - `canary` -> the most recent canary (release candidate) berry (`>=2.0.0`) release\n - `classic` -> the most recent classic (`^0.x || ^1.x`) release\n\n - a semver range (e.g. `2.x`) -> the most recent version satisfying the range (limited to berry releases)\n\n - a semver version (e.g. `2.4.1`, `1.22.1`)\n\n - a local file referenced through either a relative or absolute path\n\n - `self` -> the version used to invoke the command\n ",examples:[["Download the latest release from the Yarn repository","$0 set version latest"],["Download the latest canary release from the Yarn repository","$0 set version canary"],["Download the latest classic release from the Yarn repository","$0 set version classic"],["Download the most recent Yarn 3 build","$0 set version 3.x"],["Download a specific Yarn 2 build","$0 set version 2.0.0-rc.30"],["Switch back to a specific Yarn 1 release","$0 set version 1.22.1"],["Use a release from the local filesystem","$0 set version ./yarn.cjs"],["Download the version used to invoke the command","$0 set version self"]]});var tAe=vC;async function _4e(t,e){let i=(await Zt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0})).tags.filter(n=>qt.satisfiesWithPrereleases(n,e));if(i.length===0)throw new me(`No matching release found for range ${ue.pretty(t,e,ue.Type.RANGE)}.`);return i[0]}async function eAe(t,e){let r=await Zt.get("https://repo.yarnpkg.com/tags",{configuration:t,jsonResponse:!0});if(!r.latest[e])throw new me(`Tag ${ue.pretty(t,e,ue.Type.RANGE)} not found`);return r.latest[e]}async function XN(t,e,r,{report:i}){var g;e===null&&await T.mktempPromise(async f=>{let h=v.join(f,"yarn.cjs");await T.writeFilePromise(h,r);let{stdout:p}=await hr.execvp(process.execPath,[M.fromPortablePath(h),"--version"],{cwd:f,env:_(P({},process.env),{YARN_IGNORE_PATH:"1"})});if(e=p.trim(),!$ae.default.valid(e))throw new Error(`Invalid semver version. ${ue.pretty(t,"yarn --version",ue.Type.CODE)} returned: +${e}`)});let n=(g=t.projectCwd)!=null?g:t.startingCwd,s=v.resolve(n,".yarn/releases"),o=v.resolve(s,`yarn-${e}.cjs`),a=v.relative(t.startingCwd,o),l=v.relative(n,o),c=t.get("yarnPath"),u=c===null||c.startsWith(`${s}/`);if(i.reportInfo(z.UNNAMED,`Saving the new release in ${ue.pretty(t,a,"magenta")}`),await T.removePromise(v.dirname(o)),await T.mkdirPromise(v.dirname(o),{recursive:!0}),await T.writeFilePromise(o,r,{mode:493}),u){await fe.updateConfiguration(n,{yarnPath:l});let f=await Ze.tryFind(n)||new Ze;e&&de.isTaggedYarnVersion(e)&&(f.packageManager=`yarn@${e}`);let h={};f.exportTo(h);let p=v.join(n,Ze.fileName),d=`${JSON.stringify(h,null,f.indent)} +`;await T.changeFilePromise(p,d,{automaticNewlines:!0})}}var X4e=/^[0-9]+$/;function iAe(t){return X4e.test(t)?`pull/${t}/head`:t}var Z4e=({repository:t,branch:e},r)=>[["git","init",M.fromPortablePath(r)],["git","remote","add","origin",t],["git","fetch","origin",iAe(e)],["git","reset","--hard","FETCH_HEAD"]],$4e=({branch:t})=>[["git","fetch","origin",iAe(t),"--force"],["git","reset","--hard","FETCH_HEAD"],["git","clean","-dfx"]],eze=({plugins:t,noMinify:e},r)=>[["yarn","build:cli",...new Array().concat(...t.map(i=>["--plugin",v.resolve(r,i)])),...e?["--no-minify"]:[],"|"]],SC=class extends Be{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.plugins=Y.Array("--plugin",[],{description:"An array of additional plugins that should be included in the bundle"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a bundle for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.skipPlugins=Y.Boolean("--skip-plugins",!1,{description:"Skip updating the contrib plugins"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=typeof this.installPath!="undefined"?v.resolve(this.context.cwd,M.toPortablePath(this.installPath)):v.resolve(M.toPortablePath((0,rAe.tmpdir)()),"yarnpkg-sources",mn.makeHash(this.repository).slice(0,6));return(await Fe.start({configuration:e,stdout:this.context.stdout},async s=>{await $N(this,{configuration:e,report:s,target:i}),s.reportSeparator(),s.reportInfo(z.UNNAMED,"Building a fresh bundle"),s.reportSeparator(),await xC(eze(this,i),{configuration:e,context:this.context,target:i}),s.reportSeparator();let o=v.resolve(i,"packages/yarnpkg-cli/bundles/yarn.js"),a=await T.readFilePromise(o);await XN(e,"sources",a,{report:s}),this.skipPlugins||await tze(this,{project:r,report:s,target:i})})).exitCode()}};SC.paths=[["set","version","from","sources"]],SC.usage=ye.Usage({description:"build Yarn from master",details:` + This command will clone the Yarn repository into a temporary folder, then build it. The resulting bundle will then be copied into the local project. + + By default, it also updates all contrib plugins to the same commit the bundle is built from. This behavior can be disabled by using the \`--skip-plugins\` flag. + `,examples:[["Build Yarn from master","$0 set version from sources"]]});var nAe=SC;async function xC(t,{configuration:e,context:r,target:i}){for(let[n,...s]of t){let o=s[s.length-1]==="|";if(o&&s.pop(),o)await hr.pipevp(n,s,{cwd:i,stdin:r.stdin,stdout:r.stdout,stderr:r.stderr,strict:!0});else{r.stdout.write(`${ue.pretty(e,` $ ${[n,...s].join(" ")}`,"grey")} +`);try{await hr.execvp(n,s,{cwd:i,strict:!0})}catch(a){throw r.stdout.write(a.stdout||a.stack),a}}}}async function $N(t,{configuration:e,report:r,target:i}){let n=!1;if(!t.force&&T.existsSync(v.join(i,".git"))){r.reportInfo(z.UNNAMED,"Fetching the latest commits"),r.reportSeparator();try{await xC($4e(t),{configuration:e,context:t.context,target:i}),n=!0}catch(s){r.reportSeparator(),r.reportWarning(z.UNNAMED,"Repository update failed; we'll try to regenerate it")}}n||(r.reportInfo(z.UNNAMED,"Cloning the remote repository"),r.reportSeparator(),await T.removePromise(i),await T.mkdirPromise(i,{recursive:!0}),await xC(Z4e(t,i),{configuration:e,context:t.context,target:i}))}async function tze(t,{project:e,report:r,target:i}){let n=await Kc(e.configuration),s=new Set(Object.keys(n));for(let o of e.configuration.plugins.keys())!s.has(o)||await ZN(o,t,{project:e,report:r,target:i})}var sAe=ie(Or()),oAe=ie(require("url")),aAe=ie(require("vm"));var kC=class extends Be{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,stdout:this.context.stdout},async i=>{let{project:n}=await Ke.find(e,this.context.cwd),s,o;if(this.name.match(/^\.{0,2}[\\/]/)||M.isAbsolute(this.name)){let a=v.resolve(this.context.cwd,M.toPortablePath(this.name));i.reportInfo(z.UNNAMED,`Reading ${ue.pretty(e,a,ue.Type.PATH)}`),s=v.relative(n.cwd,a),o=await T.readFilePromise(a)}else{let a;if(this.name.match(/^https?:/)){try{new oAe.URL(this.name)}catch{throw new nt(z.INVALID_PLUGIN_REFERENCE,`Plugin specifier "${this.name}" is neither a plugin name nor a valid url`)}s=this.name,a=this.name}else{let l=S.parseLocator(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-"));if(l.reference!=="unknown"&&!sAe.default.valid(l.reference))throw new nt(z.UNNAMED,"Official plugins only accept strict version references. Use an explicit URL if you wish to download them from another location.");let c=S.stringifyIdent(l),u=await Kc(e);if(!Object.prototype.hasOwnProperty.call(u,c))throw new nt(z.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${c}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be referenced by their name; any other plugin will have to be referenced through its public url (for example https://github.com/yarnpkg/berry/raw/master/packages/plugin-typescript/bin/%40yarnpkg/plugin-typescript.js).`);s=c,a=u[c].url,l.reference!=="unknown"?a=a.replace(/\/master\//,`/${c}/${l.reference}/`):Zr!==null&&(a=a.replace(/\/master\//,`/@yarnpkg/cli/${Zr}/`))}i.reportInfo(z.UNNAMED,`Downloading ${ue.pretty(e,a,"green")}`),o=await Zt.get(a,{configuration:e})}await eL(s,o,{project:n,report:i})})).exitCode()}};kC.paths=[["plugin","import"]],kC.usage=ye.Usage({category:"Plugin-related commands",description:"download a plugin",details:` + This command downloads the specified plugin from its remote location and updates the configuration to reference it in further CLI invocations. + + Three types of plugin references are accepted: + + - If the plugin is stored within the Yarn repository, it can be referenced by name. + - Third-party plugins can be referenced directly through their public urls. + - Local plugins can be referenced by their path on the disk. + + Plugins cannot be downloaded from the npm registry, and aren't allowed to have dependencies (they need to be bundled into a single file, possibly thanks to the \`@yarnpkg/builder\` package). + `,examples:[['Download and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import @yarnpkg/plugin-exec"],['Download and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import exec"],["Download and activate a community plugin","$0 plugin import https://example.org/path/to/plugin.js"],["Activate a local plugin","$0 plugin import ./path/to/plugin.js"]]});var AAe=kC;async function eL(t,e,{project:r,report:i}){let{configuration:n}=r,s={},o={exports:s};(0,aAe.runInNewContext)(e.toString(),{module:o,exports:s});let a=o.exports.name,l=`.yarn/plugins/${a}.cjs`,c=v.resolve(r.cwd,l);i.reportInfo(z.UNNAMED,`Saving the new plugin in ${ue.pretty(n,l,"magenta")}`),await T.mkdirPromise(v.dirname(c),{recursive:!0}),await T.writeFilePromise(c,e);let u={path:l,spec:t};await fe.updateConfiguration(r.cwd,g=>{let f=[],h=!1;for(let p of g.plugins||[]){let d=typeof p!="string"?p.path:p,m=v.resolve(r.cwd,M.toPortablePath(d)),{name:I}=de.dynamicRequire(m);I!==a?f.push(p):(f.push(u),h=!0)}return h||f.push(u),_(P({},g),{plugins:f})})}var rze=({pluginName:t,noMinify:e},r)=>[["yarn",`build:${t}`,...e?["--no-minify"]:[],"|"]],PC=class extends Be{constructor(){super(...arguments);this.installPath=Y.String("--path",{description:"The path where the repository should be cloned to"});this.repository=Y.String("--repository","https://github.com/yarnpkg/berry.git",{description:"The repository that should be cloned"});this.branch=Y.String("--branch","master",{description:"The branch of the repository that should be cloned"});this.noMinify=Y.Boolean("--no-minify",!1,{description:"Build a plugin for development (debugging) - non-minified and non-mangled"});this.force=Y.Boolean("-f,--force",!1,{description:"Always clone the repository instead of trying to fetch the latest commits"});this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=typeof this.installPath!="undefined"?v.resolve(this.context.cwd,M.toPortablePath(this.installPath)):v.resolve(M.toPortablePath((0,lAe.tmpdir)()),"yarnpkg-sources",mn.makeHash(this.repository).slice(0,6));return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let{project:s}=await Ke.find(e,this.context.cwd),o=S.parseIdent(this.name.replace(/^((@yarnpkg\/)?plugin-)?/,"@yarnpkg/plugin-")),a=S.stringifyIdent(o),l=await Kc(e);if(!Object.prototype.hasOwnProperty.call(l,a))throw new nt(z.PLUGIN_NAME_NOT_FOUND,`Couldn't find a plugin named "${a}" on the remote registry. Note that only the plugins referenced on our website (https://github.com/yarnpkg/berry/blob/master/plugins.yml) can be built and imported from sources.`);let c=a;await $N(this,{configuration:e,report:n,target:r}),await ZN(c,this,{project:s,report:n,target:r})})).exitCode()}};PC.paths=[["plugin","import","from","sources"]],PC.usage=ye.Usage({category:"Plugin-related commands",description:"build a plugin from sources",details:` + This command clones the Yarn repository into a temporary folder, builds the specified contrib plugin and updates the configuration to reference it in further CLI invocations. + + The plugins can be referenced by their short name if sourced from the official Yarn repository. + `,examples:[['Build and activate the "@yarnpkg/plugin-exec" plugin',"$0 plugin import from sources @yarnpkg/plugin-exec"],['Build and activate the "@yarnpkg/plugin-exec" plugin (shorthand)',"$0 plugin import from sources exec"]]});var cAe=PC;async function ZN(t,{context:e,noMinify:r},{project:i,report:n,target:s}){let o=t.replace(/@yarnpkg\//,""),{configuration:a}=i;n.reportSeparator(),n.reportInfo(z.UNNAMED,`Building a fresh ${o}`),n.reportSeparator(),await xC(rze({pluginName:o,noMinify:r},s),{configuration:a,context:e,target:s}),n.reportSeparator();let l=v.resolve(s,`packages/${o}/bundles/${t}.js`),c=await T.readFilePromise(l);await eL(t,c,{project:i,report:n})}var DC=class extends Be{constructor(){super(...arguments);this.name=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=this.name,o=S.parseIdent(s);if(!e.plugins.has(s))throw new me(`${S.prettyIdent(e,o)} isn't referenced by the current configuration`);let a=`.yarn/plugins/${s}.cjs`,l=v.resolve(r.cwd,a);T.existsSync(l)&&(n.reportInfo(z.UNNAMED,`Removing ${ue.pretty(e,a,ue.Type.PATH)}...`),await T.removePromise(l)),n.reportInfo(z.UNNAMED,"Updating the configuration..."),await fe.updateConfiguration(r.cwd,c=>{if(!Array.isArray(c.plugins))return c;let u=c.plugins.filter(g=>g.path!==a);return c.plugins.length===u.length?c:_(P({},c),{plugins:u})})})).exitCode()}};DC.paths=[["plugin","remove"]],DC.usage=ye.Usage({category:"Plugin-related commands",description:"remove a plugin",details:` + This command deletes the specified plugin from the .yarn/plugins folder and removes it from the configuration. + + **Note:** The plugins have to be referenced by their name property, which can be obtained using the \`yarn plugin runtime\` command. Shorthands are not allowed. + `,examples:[["Remove a plugin imported from the Yarn repository","$0 plugin remove @yarnpkg/plugin-typescript"],["Remove a plugin imported from a local file","$0 plugin remove my-local-plugin"]]});var uAe=DC;var RC=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async i=>{for(let n of e.plugins.keys()){let s=this.context.plugins.plugins.has(n),o=n;s&&(o+=" [builtin]"),i.reportJson({name:n,builtin:s}),i.reportInfo(null,`${o}`)}})).exitCode()}};RC.paths=[["plugin","runtime"]],RC.usage=ye.Usage({category:"Plugin-related commands",description:"list the active plugins",details:` + This command prints the currently active plugins. Will be displayed both builtin plugins and external plugins. + `,examples:[["List the currently active plugins","$0 plugin runtime"]]});var gAe=RC;var FC=class extends Be{constructor(){super(...arguments);this.idents=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);let s=new Set;for(let a of this.idents)s.add(S.parseIdent(a).identHash);if(await r.restoreInstallState({restoreResolutions:!1}),await r.resolveEverything({cache:n,report:new ei}),s.size>0)for(let a of r.storedPackages.values())s.has(a.identHash)&&r.storedBuildState.delete(a.locatorHash);else r.storedBuildState.clear();return(await Fe.start({configuration:e,stdout:this.context.stdout,includeLogs:!this.context.quiet},async a=>{await r.install({cache:n,report:a})})).exitCode()}};FC.paths=[["rebuild"]],FC.usage=ye.Usage({description:"rebuild the project's native packages",details:` + This command will automatically cause Yarn to forget about previous compilations of the given packages and to run them again. + + Note that while Yarn forgets the compilation, the previous artifacts aren't erased from the filesystem and may affect the next builds (in good or bad). To avoid this, you may remove the .yarn/unplugged folder, or any other relevant location where packages might have been stored (Yarn may offer a way to do that automatically in the future). + + By default all packages will be rebuilt, but you can filter the list by specifying the names of the packages you want to clear from memory. + `,examples:[["Rebuild all packages","$0 rebuild"],["Rebuild fsevents only","$0 rebuild fsevents"]]});var fAe=FC;var tL=ie(Nn());Ss();var NC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Apply the operation to all workspaces from the current project"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=this.all?r.workspaces:[i],o=[vr.REGULAR,vr.DEVELOPMENT,vr.PEER],a=[],l=!1,c=[];for(let h of this.patterns){let p=!1,d=S.parseIdent(h);for(let m of s){let I=[...m.manifest.peerDependenciesMeta.keys()];for(let B of(0,tL.default)(I,h))m.manifest.peerDependenciesMeta.delete(B),l=!0,p=!0;for(let B of o){let b=m.manifest.getForScope(B),R=[...b.values()].map(H=>S.stringifyIdent(H));for(let H of(0,tL.default)(R,S.stringifyIdent(d))){let{identHash:L}=S.parseIdent(H),K=b.get(L);if(typeof K=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");m.manifest[B].delete(L),c.push([m,B,K]),l=!0,p=!0}}}p||a.push(h)}let u=a.length>1?"Patterns":"Pattern",g=a.length>1?"don't":"doesn't",f=this.all?"any":"this";if(a.length>0)throw new me(`${u} ${ue.prettyList(e,a,ps.CODE)} ${g} match any packages referenced by ${f} workspace`);return l?(await e.triggerMultipleHooks(p=>p.afterWorkspaceDependencyRemoval,c),(await Fe.start({configuration:e,stdout:this.context.stdout},async p=>{await r.install({cache:n,report:p,mode:this.mode})})).exitCode()):0}};NC.paths=[["remove"]],NC.usage=ye.Usage({description:"remove dependencies from the project",details:` + This command will remove the packages matching the specified patterns from the current workspace. + + If the \`--mode=\` option is set, Yarn will change which artifacts are generated. The modes currently supported are: + + - \`skip-build\` will not run the build scripts at all. Note that this is different from setting \`enableScripts\` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run. + + - \`update-lockfile\` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost. + + This command accepts glob patterns as arguments (if valid Idents and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them. + `,examples:[["Remove a dependency from the current project","$0 remove lodash"],["Remove a dependency from all workspaces at once","$0 remove lodash --all"],["Remove all dependencies starting with `eslint-`","$0 remove 'eslint-*'"],["Remove all dependencies with the `@babel` scope","$0 remove '@babel/*'"],["Remove all dependencies matching `react-dom` or `react-helmet`","$0 remove 'react-{dom,helmet}'"]]});var hAe=NC;var pAe=ie(require("util")),z0=class extends Be{async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);return(await Fe.start({configuration:e,stdout:this.context.stdout},async s=>{let o=i.manifest.scripts,a=de.sortMap(o.keys(),u=>u),l={breakLength:Infinity,colors:e.get("enableColors"),maxArrayLength:2},c=a.reduce((u,g)=>Math.max(u,g.length),0);for(let[u,g]of o.entries())s.reportInfo(null,`${u.padEnd(c," ")} ${(0,pAe.inspect)(g,l)}`)})).exitCode()}};z0.paths=[["run"]];var dAe=z0;var LC=class extends Be{constructor(){super(...arguments);this.inspect=Y.String("--inspect",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.inspectBrk=Y.String("--inspect-brk",!1,{tolerateBoolean:!0,description:"Forwarded to the underlying Node process when executing a binary"});this.topLevel=Y.Boolean("-T,--top-level",!1,{description:"Check the root workspace for scripts and/or binaries instead of the current one"});this.binariesOnly=Y.Boolean("-B,--binaries-only",!1,{description:"Ignore any user defined scripts and only check for binaries"});this.silent=Y.Boolean("--silent",{hidden:!0});this.scriptName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i,locator:n}=await Ke.find(e,this.context.cwd);await r.restoreInstallState();let s=this.topLevel?r.topLevelWorkspace.anchoredLocator:n;if(!this.binariesOnly&&await Kt.hasPackageScript(s,this.scriptName,{project:r}))return await Kt.executePackageScript(s,this.scriptName,this.args,{project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr});let o=await Kt.getPackageAccessibleBinaries(s,{project:r});if(o.get(this.scriptName)){let l=[];return this.inspect&&(typeof this.inspect=="string"?l.push(`--inspect=${this.inspect}`):l.push("--inspect")),this.inspectBrk&&(typeof this.inspectBrk=="string"?l.push(`--inspect-brk=${this.inspectBrk}`):l.push("--inspect-brk")),await Kt.executePackageAccessibleBinary(s,this.scriptName,this.args,{cwd:this.context.cwd,project:r,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,nodeArgs:l,packageAccessibleBinaries:o})}if(!this.topLevel&&!this.binariesOnly&&i&&this.scriptName.includes(":")){let c=(await Promise.all(r.workspaces.map(async u=>u.manifest.scripts.has(this.scriptName)?u:null))).filter(u=>u!==null);if(c.length===1)return await Kt.executeWorkspaceScript(c[0],this.scriptName,this.args,{stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})}if(this.topLevel)throw this.scriptName==="node-gyp"?new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${S.prettyLocator(e,n)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`):new me(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${S.prettyLocator(e,n)}).`);{if(this.scriptName==="global")throw new me("The 'yarn global' commands have been removed in 2.x - consider using 'yarn dlx' or a third-party plugin instead");let l=[this.scriptName].concat(this.args);for(let[c,u]of Yg)for(let g of u)if(l.length>=g.length&&JSON.stringify(l.slice(0,g.length))===JSON.stringify(g))throw new me(`Couldn't find a script named "${this.scriptName}", but a matching command can be found in the ${c} plugin. You can install it with "yarn plugin import ${c}".`);throw new me(`Couldn't find a script named "${this.scriptName}".`)}}};LC.paths=[["run"]],LC.usage=ye.Usage({description:"run a script defined in the package.json",details:` + This command will run a tool. The exact tool that will be executed will depend on the current state of your workspace: + + - If the \`scripts\` field from your local package.json contains a matching script name, its definition will get executed. + + - Otherwise, if one of the local workspace's dependencies exposes a binary with a matching name, this binary will get executed. + + - Otherwise, if the specified name contains a colon character and if one of the workspaces in the project contains exactly one script with a matching name, then this script will get executed. + + Whatever happens, the cwd of the spawned process will be the workspace that declares the script (which makes it possible to call commands cross-workspaces using the third syntax). + `,examples:[["Run the tests from the local workspace","$0 run test"],['Same thing, but without the "run" keyword',"$0 test"],["Inspect Webpack while running","$0 run --inspect-brk webpack"]]});var CAe=LC;var TC=class extends Be{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Persist the resolution inside the top-level manifest"});this.descriptor=Y.String();this.resolution=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(await r.restoreInstallState({restoreResolutions:!1}),!i)throw new rt(r.cwd,this.context.cwd);let s=S.parseDescriptor(this.descriptor,!0),o=S.makeDescriptor(s,this.resolution);return r.storedDescriptors.set(s.descriptorHash,s),r.storedDescriptors.set(o.descriptorHash,o),r.resolutionAliases.set(s.descriptorHash,o.descriptorHash),(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};TC.paths=[["set","resolution"]],TC.usage=ye.Usage({description:"enforce a package resolution",details:'\n This command updates the resolution table so that `descriptor` is resolved by `resolution`.\n\n Note that by default this command only affect the current resolution table - meaning that this "manual override" will disappear if you remove the lockfile, or if the package disappear from the table. If you wish to make the enforced resolution persist whatever happens, add the `-s,--save` flag which will also edit the `resolutions` field from your top-level manifest.\n\n Note that no attempt is made at validating that `resolution` is a valid resolution entry for `descriptor`.\n ',examples:[["Force all instances of lodash@npm:^1.2.3 to resolve to 1.5.0","$0 set resolution lodash@npm:^1.2.3 1.5.0"]]});var mAe=TC;var EAe=ie(Nn()),MC=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unlink all workspaces belonging to the target project from the current one"});this.leadingArguments=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);let s=r.topLevelWorkspace,o=new Set;if(this.leadingArguments.length===0&&this.all)for(let{pattern:l,reference:c}of s.manifest.resolutions)c.startsWith("portal:")&&o.add(l.descriptor.fullName);if(this.leadingArguments.length>0)for(let l of this.leadingArguments){let c=v.resolve(this.context.cwd,M.toPortablePath(l));if(de.isPathLike(l)){let u=await fe.find(c,this.context.plugins,{useRc:!1,strict:!1}),{project:g,workspace:f}=await Ke.find(u,c);if(!f)throw new rt(g.cwd,c);if(this.all){for(let h of g.workspaces)h.manifest.name&&o.add(S.stringifyIdent(h.locator));if(o.size===0)throw new me("No workspace found to be unlinked in the target project")}else{if(!f.manifest.name)throw new me("The target workspace doesn't have a name and thus cannot be unlinked");o.add(S.stringifyIdent(f.locator))}}else{let u=[...s.manifest.resolutions.map(({pattern:g})=>g.descriptor.fullName)];for(let g of(0,EAe.default)(u,l))o.add(g)}}return s.manifest.resolutions=s.manifest.resolutions.filter(({pattern:l})=>!o.has(l.descriptor.fullName)),(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{await r.install({cache:n,report:l})})).exitCode()}};MC.paths=[["unlink"]],MC.usage=ye.Usage({description:"disconnect the local project from another one",details:` + This command will remove any resolutions in the project-level manifest that would have been added via a yarn link with similar arguments. + `,examples:[["Unregister a remote workspace in the current project","$0 unlink ~/ts-loader"],["Unregister all workspaces from a remote project in the current project","$0 unlink ~/jest --all"],["Unregister all previously linked workspaces","$0 unlink --all"],["Unregister all workspaces matching a glob","$0 unlink '@babel/*' 'pkg-{a,b}'"]]});var IAe=MC;var yAe=ie(aC()),rL=ie(Nn());Ss();var uf=class extends Be{constructor(){super(...arguments);this.interactive=Y.Boolean("-i,--interactive",{description:"Offer various choices, depending on the detected upgrade paths"});this.exact=Y.Boolean("-E,--exact",!1,{description:"Don't use any semver modifier on the resolved range"});this.tilde=Y.Boolean("-T,--tilde",!1,{description:"Use the `~` semver modifier on the resolved range"});this.caret=Y.Boolean("-C,--caret",!1,{description:"Use the `^` semver modifier on the resolved range"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Resolve again ALL resolutions for those packages"});this.mode=Y.String("--mode",{description:"Change what artifacts installs generate",validator:Yi(li)});this.patterns=Y.Rest()}async execute(){return this.recursive?await this.executeUpRecursive():await this.executeUpClassic()}async executeUpRecursive(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=[...r.storedDescriptors.values()],o=s.map(u=>S.stringifyIdent(u)),a=new Set;for(let u of this.patterns){if(S.parseDescriptor(u).range!=="unknown")throw new me("Ranges aren't allowed when using --recursive");for(let g of(0,rL.default)(o,u)){let f=S.parseIdent(g);a.add(f.identHash)}}let l=s.filter(u=>a.has(u.identHash));for(let u of l)r.storedDescriptors.delete(u.descriptorHash),r.storedResolutions.delete(u.descriptorHash);return(await Fe.start({configuration:e,stdout:this.context.stdout},async u=>{await r.install({cache:n,report:u})})).exitCode()}async executeUpClassic(){var d;let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState({restoreResolutions:!1});let s=(d=this.interactive)!=null?d:e.get("preferInteractive"),o=AC(this,r),a=s?[Fr.KEEP,Fr.REUSE,Fr.PROJECT,Fr.LATEST]:[Fr.PROJECT,Fr.LATEST],l=[],c=[];for(let m of this.patterns){let I=!1,B=S.parseDescriptor(m);for(let b of r.workspaces)for(let R of[vr.REGULAR,vr.DEVELOPMENT]){let L=[...b.manifest.getForScope(R).values()].map(K=>S.stringifyIdent(K));for(let K of(0,rL.default)(L,S.stringifyIdent(B))){let J=S.parseIdent(K),ne=b.manifest[R].get(J.identHash);if(typeof ne=="undefined")throw new Error("Assertion failed: Expected the descriptor to be registered");let q=S.makeDescriptor(J,B.range);l.push(Promise.resolve().then(async()=>[b,R,ne,await lC(q,{project:r,workspace:b,cache:n,target:R,modifier:o,strategies:a})])),I=!0}}I||c.push(m)}if(c.length>1)throw new me(`Patterns ${ue.prettyList(e,c,ps.CODE)} don't match any packages referenced by any workspace`);if(c.length>0)throw new me(`Pattern ${ue.prettyList(e,c,ps.CODE)} doesn't match any packages referenced by any workspace`);let u=await Promise.all(l),g=await Fa.start({configuration:e,stdout:this.context.stdout,suggestInstall:!1},async m=>{for(let[,,I,{suggestions:B,rejections:b}]of u){let R=B.filter(H=>H.descriptor!==null);if(R.length===0){let[H]=b;if(typeof H=="undefined")throw new Error("Assertion failed: Expected an error to have been set");let L=this.cli.error(H);r.configuration.get("enableNetwork")?m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range + +${L}`):m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} can't be resolved to a satisfying range (note: network resolution has been disabled) + +${L}`)}else R.length>1&&!s&&m.reportError(z.CANT_SUGGEST_RESOLUTIONS,`${S.prettyDescriptor(e,I)} has multiple possible upgrade strategies; use -i to disambiguate manually`)}});if(g.hasErrors())return g.exitCode();let f=!1,h=[];for(let[m,I,,{suggestions:B}]of u){let b,R=B.filter(J=>J.descriptor!==null),H=R[0].descriptor,L=R.every(J=>S.areDescriptorsEqual(J.descriptor,H));R.length===1||L?b=H:(f=!0,{answer:b}=await(0,yAe.prompt)({type:"select",name:"answer",message:`Which range to you want to use in ${S.prettyWorkspace(e,m)} \u276F ${I}?`,choices:B.map(({descriptor:J,name:ne,reason:q})=>J?{name:ne,hint:q,descriptor:J}:{name:ne,hint:q,disabled:!0}),onCancel:()=>process.exit(130),result(J){return this.find(J,"descriptor")},stdin:this.context.stdin,stdout:this.context.stdout}));let K=m.manifest[I].get(b.identHash);if(typeof K=="undefined")throw new Error("Assertion failed: This descriptor should have a matching entry");if(K.descriptorHash!==b.descriptorHash)m.manifest[I].set(b.identHash,b),h.push([m,I,K,b]);else{let J=e.makeResolver(),ne={project:r,resolver:J},q=J.bindDescriptor(K,m.anchoredLocator,ne);r.forgetResolution(q)}}return await e.triggerMultipleHooks(m=>m.afterWorkspaceDependencyReplacement,h),f&&this.context.stdout.write(` +`),(await Fe.start({configuration:e,stdout:this.context.stdout},async m=>{await r.install({cache:n,report:m,mode:this.mode})})).exitCode()}};uf.paths=[["up"]],uf.usage=ye.Usage({description:"upgrade dependencies across the project",details:"\n This command upgrades the packages matching the list of specified patterns to their latest available version across the whole project (regardless of whether they're part of `dependencies` or `devDependencies` - `peerDependencies` won't be affected). This is a project-wide command: all workspaces will be upgraded in the process.\n\n If `-R,--recursive` is set the command will change behavior and no other switch will be allowed. When operating under this mode `yarn up` will force all ranges matching the selected packages to be resolved again (often to the highest available versions) before being stored in the lockfile. It however won't touch your manifests anymore, so depending on your needs you might want to run both `yarn up` and `yarn up -R` to cover all bases.\n\n If `-i,--interactive` is set (or if the `preferInteractive` settings is toggled on) the command will offer various choices, depending on the detected upgrade paths. Some upgrades require this flag in order to resolve ambiguities.\n\n The, `-C,--caret`, `-E,--exact` and `-T,--tilde` options have the same meaning as in the `add` command (they change the modifier used when the range is missing or a tag, and are ignored when the range is explicitly set).\n\n If the `--mode=` option is set, Yarn will change which artifacts are generated. The modes currently supported are:\n\n - `skip-build` will not run the build scripts at all. Note that this is different from setting `enableScripts` to false because the later will disable build scripts, and thus affect the content of the artifacts generated on disk, whereas the former will just disable the build step - but not the scripts themselves, which just won't run.\n\n - `update-lockfile` will skip the link step altogether, and only fetch packages that are missing from the lockfile (or that have no associated checksums). This mode is typically used by tools like Renovate or Dependabot to keep a lockfile up-to-date without incurring the full install cost.\n\n Generally you can see `yarn up` as a counterpart to what was `yarn upgrade --latest` in Yarn 1 (ie it ignores the ranges previously listed in your manifests), but unlike `yarn upgrade` which only upgraded dependencies in the current workspace, `yarn up` will upgrade all workspaces at the same time.\n\n This command accepts glob patterns as arguments (if valid Descriptors and supported by [micromatch](https://github.com/micromatch/micromatch)). Make sure to escape the patterns, to prevent your own shell from trying to expand them.\n\n **Note:** The ranges have to be static, only the package scopes and names can contain glob patterns.\n ",examples:[["Upgrade all instances of lodash to the latest release","$0 up lodash"],["Upgrade all instances of lodash to the latest release, but ask confirmation for each","$0 up lodash -i"],["Upgrade all instances of lodash to 1.2.3","$0 up lodash@1.2.3"],["Upgrade all instances of packages with the `@babel` scope to the latest release","$0 up '@babel/*'"],["Upgrade all instances of packages containing the word `jest` to the latest release","$0 up '*jest*'"],["Upgrade all instances of packages with the `@babel` scope to 7.0.0","$0 up '@babel/*@7.0.0'"]]}),uf.schema=[pv("recursive",Bl.Forbids,["interactive","exact","tilde","caret"],{ignore:[void 0,!1]})];var wAe=uf;var OC=class extends Be{constructor(){super(...arguments);this.recursive=Y.Boolean("-R,--recursive",!1,{description:"List, for each workspace, what are all the paths that lead to the dependency"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.peers=Y.Boolean("--peers",!1,{description:"Also print the peer dependencies that match the specified name"});this.package=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=S.parseIdent(this.package).identHash,s=this.recursive?nze(r,n,{configuration:e,peers:this.peers}):ize(r,n,{configuration:e,peers:this.peers});Hs.emitTree(s,{configuration:e,stdout:this.context.stdout,json:this.json,separators:1})}};OC.paths=[["why"]],OC.usage=ye.Usage({description:"display the reason why a package is needed",details:` + This command prints the exact reasons why a package appears in the dependency tree. + + If \`-R,--recursive\` is set, the listing will go in depth and will list, for each workspaces, what are all the paths that lead to the dependency. Note that the display is somewhat optimized in that it will not print the package listing twice for a single package, so if you see a leaf named "Foo" when looking for "Bar", it means that "Foo" already got printed higher in the tree. + `,examples:[["Explain why lodash is used in your project","$0 why lodash"]]});var BAe=OC;function ize(t,e,{configuration:r,peers:i}){let n=de.sortMap(t.storedPackages.values(),a=>S.stringifyLocator(a)),s={},o={children:s};for(let a of n){let l={},c=null;for(let u of a.dependencies.values()){if(!i&&a.peerDependencies.has(u.identHash))continue;let g=t.storedResolutions.get(u.descriptorHash);if(!g)throw new Error("Assertion failed: The resolution should have been registered");let f=t.storedPackages.get(g);if(!f)throw new Error("Assertion failed: The package should have been registered");if(f.identHash!==e)continue;if(c===null){let p=S.stringifyLocator(a);s[p]={value:[a,ue.Type.LOCATOR],children:l}}let h=S.stringifyLocator(f);l[h]={value:[{descriptor:u,locator:f},ue.Type.DEPENDENT]}}}return o}function nze(t,e,{configuration:r,peers:i}){let n=de.sortMap(t.workspaces,f=>S.stringifyLocator(f.anchoredLocator)),s=new Set,o=new Set,a=f=>{if(s.has(f.locatorHash))return o.has(f.locatorHash);if(s.add(f.locatorHash),f.identHash===e)return o.add(f.locatorHash),!0;let h=!1;f.identHash===e&&(h=!0);for(let p of f.dependencies.values()){if(!i&&f.peerDependencies.has(p.identHash))continue;let d=t.storedResolutions.get(p.descriptorHash);if(!d)throw new Error("Assertion failed: The resolution should have been registered");let m=t.storedPackages.get(d);if(!m)throw new Error("Assertion failed: The package should have been registered");a(m)&&(h=!0)}return h&&o.add(f.locatorHash),h};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");a(h)}let l=new Set,c={},u={children:c},g=(f,h,p)=>{if(!o.has(f.locatorHash))return;let d=p!==null?ue.tuple(ue.Type.DEPENDENT,{locator:f,descriptor:p}):ue.tuple(ue.Type.LOCATOR,f),m={},I={value:d,children:m},B=S.stringifyLocator(f);if(h[B]=I,!l.has(f.locatorHash)&&(l.add(f.locatorHash),!(p!==null&&t.tryWorkspaceByLocator(f))))for(let b of f.dependencies.values()){if(!i&&f.peerDependencies.has(b.identHash))continue;let R=t.storedResolutions.get(b.descriptorHash);if(!R)throw new Error("Assertion failed: The resolution should have been registered");let H=t.storedPackages.get(R);if(!H)throw new Error("Assertion failed: The package should have been registered");g(H,m,b)}};for(let f of n){let h=t.storedPackages.get(f.anchoredLocator.locatorHash);if(!h)throw new Error("Assertion failed: The package should have been registered");g(h,c,null)}return u}var fL={};it(fL,{default:()=>wze,gitUtils:()=>Uc});var Uc={};it(Uc,{TreeishProtocols:()=>vn,clone:()=>cL,fetchBase:()=>jAe,fetchChangedFiles:()=>YAe,fetchChangedWorkspaces:()=>Ize,fetchRoot:()=>GAe,isGitUrl:()=>ff,lsRemote:()=>HAe,normalizeLocator:()=>AL,normalizeRepoUrl:()=>KC,resolveUrl:()=>lL,splitRepoUrl:()=>UC});var oL=ie(OAe()),gf=ie(require("querystring")),aL=ie(Or()),KAe=ie(require("url"));function UAe(){return _(P({},process.env),{GIT_SSH_COMMAND:"ssh -o BatchMode=yes"})}var Eze=[/^ssh:/,/^git(?:\+[^:]+)?:/,/^(?:git\+)?https?:[^#]+\/[^#]+(?:\.git)(?:#.*)?$/,/^git@[^#]+\/[^#]+\.git(?:#.*)?$/,/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z._0-9-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z._0-9-]+?)(?:\.git)?(?:#.*)?$/,/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/],vn;(function(n){n.Commit="commit",n.Head="head",n.Tag="tag",n.Semver="semver"})(vn||(vn={}));function ff(t){return t?Eze.some(e=>!!t.match(e)):!1}function UC(t){t=KC(t);let e=t.indexOf("#");if(e===-1)return{repo:t,treeish:{protocol:vn.Head,request:"HEAD"},extra:{}};let r=t.slice(0,e),i=t.slice(e+1);if(i.match(/^[a-z]+=/)){let n=gf.default.parse(i);for(let[l,c]of Object.entries(n))if(typeof c!="string")throw new Error(`Assertion failed: The ${l} parameter must be a literal string`);let s=Object.values(vn).find(l=>Object.prototype.hasOwnProperty.call(n,l)),o,a;typeof s!="undefined"?(o=s,a=n[s]):(o=vn.Head,a="HEAD");for(let l of Object.values(vn))delete n[l];return{repo:r,treeish:{protocol:o,request:a},extra:n}}else{let n=i.indexOf(":"),s,o;return n===-1?(s=null,o=i):(s=i.slice(0,n),o=i.slice(n+1)),{repo:r,treeish:{protocol:s,request:o},extra:{}}}}function KC(t,{git:e=!1}={}){var r;if(t=t.replace(/^git\+https:/,"https:"),t=t.replace(/^(?:github:|https:\/\/github\.com\/)?(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)(?:\.git)?(#.*)?$/,"https://github.com/$1/$2.git$3"),t=t.replace(/^https:\/\/github\.com\/(?!\.{1,2}\/)([a-zA-Z0-9._-]+)\/(?!\.{1,2}(?:#|$))([a-zA-Z0-9._-]+?)\/tarball\/(.+)?$/,"https://github.com/$1/$2.git#$3"),e){t=t.replace(/^git\+([^:]+):/,"$1:");let i;try{i=KAe.default.parse(t)}catch{i=null}i&&i.protocol==="ssh:"&&((r=i.path)==null?void 0:r.startsWith("/:"))&&(t=t.replace(/^ssh:\/\//,""))}return t}function AL(t){return S.makeLocator(t,KC(t.reference))}async function HAe(t,e){let r=KC(t,{git:!0});if(!Zt.getNetworkSettings(`https://${(0,oL.default)(r).resource}`,{configuration:e}).enableNetwork)throw new Error(`Request to '${r}' has been blocked because of your configuration settings`);let n;try{n=await hr.execvp("git",["ls-remote",r],{cwd:e.startingCwd,env:UAe(),strict:!0})}catch(l){throw l.message=`Listing the refs for ${t} failed`,l}let s=new Map,o=/^([a-f0-9]{40})\t([^\n]+)/gm,a;for(;(a=o.exec(n.stdout))!==null;)s.set(a[2],a[1]);return s}async function lL(t,e){let{repo:r,treeish:{protocol:i,request:n},extra:s}=UC(t),o=await HAe(r,e),a=(c,u)=>{switch(c){case vn.Commit:{if(!u.match(/^[a-f0-9]{40}$/))throw new Error("Invalid commit hash");return gf.default.stringify(_(P({},s),{commit:u}))}case vn.Head:{let g=o.get(u==="HEAD"?u:`refs/heads/${u}`);if(typeof g=="undefined")throw new Error(`Unknown head ("${u}")`);return gf.default.stringify(_(P({},s),{commit:g}))}case vn.Tag:{let g=o.get(`refs/tags/${u}`);if(typeof g=="undefined")throw new Error(`Unknown tag ("${u}")`);return gf.default.stringify(_(P({},s),{commit:g}))}case vn.Semver:{let g=qt.validRange(u);if(!g)throw new Error(`Invalid range ("${u}")`);let f=new Map([...o.entries()].filter(([p])=>p.startsWith("refs/tags/")).map(([p,d])=>[aL.default.parse(p.slice(10)),d]).filter(p=>p[0]!==null)),h=aL.default.maxSatisfying([...f.keys()],g);if(h===null)throw new Error(`No matching range ("${u}")`);return gf.default.stringify(_(P({},s),{commit:f.get(h)}))}case null:{let g;if((g=l(vn.Commit,u))!==null||(g=l(vn.Tag,u))!==null||(g=l(vn.Head,u))!==null)return g;throw u.match(/^[a-f0-9]+$/)?new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head - if a commit, use the 40-characters commit hash`):new Error(`Couldn't resolve "${u}" as either a commit, a tag, or a head`)}default:throw new Error(`Invalid Git resolution protocol ("${c}")`)}},l=(c,u)=>{try{return a(c,u)}catch(g){return null}};return`${r}#${a(i,n)}`}async function cL(t,e){return await e.getLimit("cloneConcurrency")(async()=>{let{repo:r,treeish:{protocol:i,request:n}}=UC(t);if(i!=="commit")throw new Error("Invalid treeish protocol when cloning");let s=KC(r,{git:!0});if(Zt.getNetworkSettings(`https://${(0,oL.default)(s).resource}`,{configuration:e}).enableNetwork===!1)throw new Error(`Request to '${s}' has been blocked because of your configuration settings`);let o=await T.mktempPromise(),a={cwd:o,env:UAe(),strict:!0};try{await hr.execvp("git",["clone","-c core.autocrlf=false",s,M.fromPortablePath(o)],a),await hr.execvp("git",["checkout",`${n}`],a)}catch(l){throw l.message=`Repository clone failed: ${l.message}`,l}return o})}async function GAe(t){let e=null,r,i=t;do r=i,await T.existsPromise(v.join(r,".git"))&&(e=r),i=v.dirname(r);while(e===null&&i!==r);return e}async function jAe(t,{baseRefs:e}){if(e.length===0)throw new me("Can't run this command with zero base refs specified.");let r=[];for(let a of e){let{code:l}=await hr.execvp("git",["merge-base",a,"HEAD"],{cwd:t});l===0&&r.push(a)}if(r.length===0)throw new me(`No ancestor could be found between any of HEAD and ${e.join(", ")}`);let{stdout:i}=await hr.execvp("git",["merge-base","HEAD",...r],{cwd:t,strict:!0}),n=i.trim(),{stdout:s}=await hr.execvp("git",["show","--quiet","--pretty=format:%s",n],{cwd:t,strict:!0}),o=s.trim();return{hash:n,title:o}}async function YAe(t,{base:e,project:r}){let i=de.buildIgnorePattern(r.configuration.get("changesetIgnorePatterns")),{stdout:n}=await hr.execvp("git",["diff","--name-only",`${e}`],{cwd:t,strict:!0}),s=n.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>v.resolve(t,M.toPortablePath(c))),{stdout:o}=await hr.execvp("git",["ls-files","--others","--exclude-standard"],{cwd:t,strict:!0}),a=o.split(/\r\n|\r|\n/).filter(c=>c.length>0).map(c=>v.resolve(t,M.toPortablePath(c))),l=[...new Set([...s,...a].sort())];return i?l.filter(c=>!v.relative(r.cwd,c).match(i)):l}async function Ize({ref:t,project:e}){if(e.configuration.projectCwd===null)throw new me("This command can only be run from within a Yarn project");let r=[v.resolve(e.cwd,e.configuration.get("cacheFolder")),v.resolve(e.cwd,e.configuration.get("installStatePath")),v.resolve(e.cwd,e.configuration.get("lockfileFilename")),v.resolve(e.cwd,e.configuration.get("virtualFolder"))];await e.configuration.triggerHook(o=>o.populateYarnPaths,e,o=>{o!=null&&r.push(o)});let i=await GAe(e.configuration.projectCwd);if(i==null)throw new me("This command can only be run on Git repositories");let n=await jAe(i,{baseRefs:typeof t=="string"?[t]:e.configuration.get("changesetBaseRefs")}),s=await YAe(i,{base:n.hash,project:e});return new Set(de.mapAndFilter(s,o=>{let a=e.tryWorkspaceByFilePath(o);return a===null?de.mapAndFilter.skip:r.some(l=>o.startsWith(l))?de.mapAndFilter.skip:a}))}var uL=class{supports(e,r){return ff(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,n=AL(e),s=new Map(r.checksums);s.set(n.locatorHash,i);let o=_(P({},r),{checksums:s}),a=await this.downloadHosted(n,o);if(a!==null)return a;let[l,c,u]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote repository`),loader:()=>this.cloneFromRemote(n,o),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:l,releaseFs:c,prefixPath:S.getIdentVendorPath(e),checksum:u}}async downloadHosted(e,r){return r.project.configuration.reduceHook(i=>i.fetchHostedRepository,null,e,r)}async cloneFromRemote(e,r){let i=await cL(e.reference,r.project.configuration),n=UC(e.reference),s=v.join(i,"package.tgz");await Kt.prepareExternalProject(i,s,{configuration:r.project.configuration,report:r.report,workspace:n.extra.workspace,locator:e});let o=await T.readFilePromise(s);return await de.releaseAfterUseAsync(async()=>await Ai.convertToZip(o,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1}))}};var gL=class{supportsDescriptor(e,r){return ff(e.range)}supportsLocator(e,r){return ff(e.reference)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=await lL(e.range,i.project.configuration);return[S.makeLocator(e,n)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var yze={configuration:{changesetBaseRefs:{description:"The base git refs that the current HEAD is compared against when detecting changes. Supports git branches, tags, and commits.",type:ge.STRING,isArray:!0,isNullable:!1,default:["master","origin/master","upstream/master","main","origin/main","upstream/main"]},changesetIgnorePatterns:{description:"Array of glob patterns; files matching them will be ignored when fetching the changed files",type:ge.STRING,default:[],isArray:!0},cloneConcurrency:{description:"Maximal number of concurrent clones",type:ge.NUMBER,default:2}},fetchers:[uL],resolvers:[gL]};var wze=yze;var HC=class extends Be{constructor(){super(...arguments);this.since=Y.String("--since",{description:"Only include workspaces that have been changed since the specified ref.",tolerateBoolean:!0});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Find packages via dependencies/devDependencies instead of using the workspaces field"});this.verbose=Y.Boolean("-v,--verbose",!1,{description:"Also return the cross-dependencies between workspaces"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd);return(await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async n=>{let s=this.since?await Uc.fetchChangedWorkspaces({ref:this.since,project:r}):r.workspaces,o=new Set(s);if(this.recursive)for(let a of[...s].map(l=>l.getRecursiveWorkspaceDependents()))for(let l of a)o.add(l);for(let a of o){let{manifest:l}=a,c;if(this.verbose){let u=new Set,g=new Set;for(let f of Ze.hardDependencies)for(let[h,p]of l.getForScope(f)){let d=r.tryWorkspaceByDescriptor(p);d===null?r.workspacesByIdent.has(h)&&g.add(p):u.add(d)}c={workspaceDependencies:Array.from(u).map(f=>f.relativeCwd),mismatchedWorkspaceDependencies:Array.from(g).map(f=>S.stringifyDescriptor(f))}}n.reportInfo(null,`${a.relativeCwd}`),n.reportJson(P({location:a.relativeCwd,name:l.name?S.stringifyIdent(l.name):null},c))}})).exitCode()}};HC.paths=[["workspaces","list"]],HC.usage=ye.Usage({category:"Workspace-related commands",description:"list all available workspaces",details:"\n This command will print the list of all workspaces in the project.\n\n - If `--since` is set, Yarn will only list workspaces that have been modified since the specified ref. By default Yarn will use the refs specified by the `changesetBaseRefs` configuration option.\n\n - If `-R,--recursive` is set, Yarn will find workspaces to run the command on by recursively evaluating `dependencies` and `devDependencies` fields, instead of looking at the `workspaces` fields.\n\n - If both the `-v,--verbose` and `--json` options are set, Yarn will also return the cross-dependencies between each workspaces (useful when you wish to automatically generate Buck / Bazel rules).\n "});var qAe=HC;var GC=class extends Be{constructor(){super(...arguments);this.workspaceName=Y.String();this.commandName=Y.String();this.args=Y.Proxy()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=r.workspaces,s=new Map(n.map(a=>{let l=S.convertToIdent(a.locator);return[S.stringifyIdent(l),a]})),o=s.get(this.workspaceName);if(o===void 0){let a=Array.from(s.keys()).sort();throw new me(`Workspace '${this.workspaceName}' not found. Did you mean any of the following: + - ${a.join(` + - `)}?`)}return this.cli.run([this.commandName,...this.args],{cwd:o.cwd})}};GC.paths=[["workspace"]],GC.usage=ye.Usage({category:"Workspace-related commands",description:"run a command within the specified workspace",details:` + This command will run a given sub-command on a single workspace. + `,examples:[["Add a package to a single workspace","yarn workspace components add -D react"],["Run build script on a single workspace","yarn workspace components run build"]]});var JAe=GC;var Bze={configuration:{enableImmutableInstalls:{description:"If true (the default on CI), prevents the install command from modifying the lockfile",type:ge.BOOLEAN,default:WAe.isCI},defaultSemverRangePrefix:{description:"The default save prefix: '^', '~' or ''",type:ge.STRING,values:["^","~",""],default:Lo.CARET}},commands:[soe,aoe,wae,Nae,mAe,nAe,tAe,qAe,Uae,Hae,Gae,jae,ioe,noe,Lae,Mae,Yae,qae,Wae,zae,_ae,IAe,Xae,cAe,AAe,uAe,Zae,gAe,fAe,hAe,dAe,CAe,wAe,BAe,JAe]},Qze=Bze;var mL={};it(mL,{default:()=>vze});var Me={optional:!0},zAe=[["@tailwindcss/aspect-ratio@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@tailwindcss/line-clamp@<0.2.1",{peerDependencies:{tailwindcss:"^2.0.2"}}],["@fullhuman/postcss-purgecss@3.1.3 || 3.1.3-alpha.0",{peerDependencies:{postcss:"^8.0.0"}}],["@samverschueren/stream-to-observable@<0.3.1",{peerDependenciesMeta:{rxjs:Me,zenObservable:Me}}],["any-observable@<0.5.1",{peerDependenciesMeta:{rxjs:Me,zenObservable:Me}}],["@pm2/agent@<1.0.4",{dependencies:{debug:"*"}}],["debug@<4.2.0",{peerDependenciesMeta:{["supports-color"]:Me}}],["got@<11",{dependencies:{["@types/responselike"]:"^1.0.0",["@types/keyv"]:"^3.1.1"}}],["cacheable-lookup@<4.1.2",{dependencies:{["@types/keyv"]:"^3.1.1"}}],["http-link-dataloader@*",{peerDependencies:{graphql:"^0.13.1 || ^14.0.0"}}],["typescript-language-server@*",{dependencies:{["vscode-jsonrpc"]:"^5.0.1",["vscode-languageserver-protocol"]:"^3.15.0"}}],["postcss-syntax@*",{peerDependenciesMeta:{["postcss-html"]:Me,["postcss-jsx"]:Me,["postcss-less"]:Me,["postcss-markdown"]:Me,["postcss-scss"]:Me}}],["jss-plugin-rule-value-function@<=10.1.1",{dependencies:{["tiny-warning"]:"^1.0.2"}}],["ink-select-input@<4.1.0",{peerDependencies:{react:"^16.8.2"}}],["license-webpack-plugin@<2.3.18",{peerDependenciesMeta:{webpack:Me}}],["snowpack@>=3.3.0",{dependencies:{["node-gyp"]:"^7.1.0"}}],["promise-inflight@*",{peerDependenciesMeta:{bluebird:Me}}],["reactcss@*",{peerDependencies:{react:"*"}}],["react-color@<=2.19.0",{peerDependencies:{react:"*"}}],["gatsby-plugin-i18n@*",{dependencies:{ramda:"^0.24.1"}}],["useragent@^2.0.0",{dependencies:{request:"^2.88.0",yamlparser:"0.0.x",semver:"5.5.x"}}],["@apollographql/apollo-tools@*",{peerDependencies:{graphql:"^14.2.1 || ^15.0.0"}}],["material-table@^2.0.0",{dependencies:{"@babel/runtime":"^7.11.2"}}],["@babel/parser@*",{dependencies:{"@babel/types":"^7.8.3"}}],["fork-ts-checker-webpack-plugin@<=6.3.4",{peerDependencies:{eslint:">= 6",typescript:">= 2.7",webpack:">= 4","vue-template-compiler":"*"},peerDependenciesMeta:{eslint:Me,"vue-template-compiler":Me}}],["rc-animate@<=3.1.1",{peerDependencies:{react:">=16.9.0","react-dom":">=16.9.0"}}],["react-bootstrap-table2-paginator@*",{dependencies:{classnames:"^2.2.6"}}],["react-draggable@<=4.4.3",{peerDependencies:{react:">= 16.3.0","react-dom":">= 16.3.0"}}],["apollo-upload-client@<14",{peerDependencies:{graphql:"14 - 15"}}],["react-instantsearch-core@<=6.7.0",{peerDependencies:{algoliasearch:">= 3.1 < 5"}}],["react-instantsearch-dom@<=6.7.0",{dependencies:{"react-fast-compare":"^3.0.0"}}],["ws@<7.2.1",{peerDependencies:{bufferutil:"^4.0.1","utf-8-validate":"^5.0.2"},peerDependenciesMeta:{bufferutil:Me,"utf-8-validate":Me}}],["react-portal@*",{peerDependencies:{"react-dom":"^15.0.0-0 || ^16.0.0-0 || ^17.0.0-0"}}],["react-scripts@<=4.0.1",{peerDependencies:{react:"*"}}],["testcafe@<=1.10.1",{dependencies:{"@babel/plugin-transform-for-of":"^7.12.1","@babel/runtime":"^7.12.5"}}],["testcafe-legacy-api@<=4.2.0",{dependencies:{"testcafe-hammerhead":"^17.0.1","read-file-relative":"^1.2.0"}}],["@google-cloud/firestore@<=4.9.3",{dependencies:{protobufjs:"^6.8.6"}}],["gatsby-source-apiserver@*",{dependencies:{["babel-polyfill"]:"^6.26.0"}}],["@webpack-cli/package-utils@<=1.0.1-alpha.4",{dependencies:{["cross-spawn"]:"^7.0.3"}}],["gatsby-remark-prismjs@<3.3.28",{dependencies:{lodash:"^4"}}],["gatsby-plugin-favicon@*",{peerDependencies:{webpack:"*"}}],["gatsby-plugin-sharp@*",{dependencies:{debug:"^4.3.1"}}],["gatsby-react-router-scroll@*",{dependencies:{["prop-types"]:"^15.7.2"}}],["@rebass/forms@*",{dependencies:{["@styled-system/should-forward-prop"]:"^5.0.0"},peerDependencies:{react:"^16.8.6"}}],["rebass@*",{peerDependencies:{react:"^16.8.6"}}],["@ant-design/react-slick@<=0.28.3",{peerDependencies:{react:">=16.0.0"}}],["mqtt@<4.2.7",{dependencies:{duplexify:"^4.1.1"}}],["vue-cli-plugin-vuetify@<=2.0.3",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Me,"vuetify-loader":Me}}],["vue-cli-plugin-vuetify@<=2.0.4",{dependencies:{"null-loader":"^3.0.0"}}],["@vuetify/cli-plugin-utils@<=0.0.4",{dependencies:{semver:"^6.3.0"},peerDependenciesMeta:{"sass-loader":Me}}],["@vue/cli-plugin-typescript@<=5.0.0-alpha.0",{dependencies:{"babel-loader":"^8.1.0"}}],["@vue/cli-plugin-typescript@<=5.0.0-beta.0",{dependencies:{"@babel/core":"^7.12.16"},peerDependencies:{"vue-template-compiler":"^2.0.0"},peerDependenciesMeta:{"vue-template-compiler":Me}}],["cordova-ios@<=6.3.0",{dependencies:{underscore:"^1.9.2"}}],["cordova-lib@<=10.0.1",{dependencies:{underscore:"^1.9.2"}}],["git-node-fs@*",{peerDependencies:{"js-git":"^0.7.8"},peerDependenciesMeta:{"js-git":Me}}],["consolidate@*",{peerDependencies:{velocityjs:"^2.0.1",tinyliquid:"^0.2.34","liquid-node":"^3.0.1",jade:"^1.11.0","then-jade":"*",dust:"^0.3.0","dustjs-helpers":"^1.7.4","dustjs-linkedin":"^2.7.5",swig:"^1.4.2","swig-templates":"^2.0.3","razor-tmpl":"^1.3.1",atpl:">=0.7.6",liquor:"^0.0.5",twig:"^1.15.2",ejs:"^3.1.5",eco:"^1.1.0-rc-3",jazz:"^0.0.18",jqtpl:"~1.1.0",hamljs:"^0.6.2",hamlet:"^0.3.3",whiskers:"^0.4.0","haml-coffee":"^1.14.1","hogan.js":"^3.0.2",templayed:">=0.2.3",handlebars:"^4.7.6",underscore:"^1.11.0",lodash:"^4.17.20",pug:"^3.0.0","then-pug":"*",qejs:"^3.0.5",walrus:"^0.10.1",mustache:"^4.0.1",just:"^0.1.8",ect:"^0.5.9",mote:"^0.2.0",toffee:"^0.3.6",dot:"^1.1.3","bracket-template":"^1.1.5",ractive:"^1.3.12",nunjucks:"^3.2.2",htmling:"^0.0.8","babel-core":"^6.26.3",plates:"~0.4.11","react-dom":"^16.13.1",react:"^16.13.1","arc-templates":"^0.5.3",vash:"^0.13.0",slm:"^2.0.0",marko:"^3.14.4",teacup:"^2.0.0","coffee-script":"^1.12.7",squirrelly:"^5.1.0",twing:"^5.0.2"},peerDependenciesMeta:{velocityjs:Me,tinyliquid:Me,"liquid-node":Me,jade:Me,"then-jade":Me,dust:Me,"dustjs-helpers":Me,"dustjs-linkedin":Me,swig:Me,"swig-templates":Me,"razor-tmpl":Me,atpl:Me,liquor:Me,twig:Me,ejs:Me,eco:Me,jazz:Me,jqtpl:Me,hamljs:Me,hamlet:Me,whiskers:Me,"haml-coffee":Me,"hogan.js":Me,templayed:Me,handlebars:Me,underscore:Me,lodash:Me,pug:Me,"then-pug":Me,qejs:Me,walrus:Me,mustache:Me,just:Me,ect:Me,mote:Me,toffee:Me,dot:Me,"bracket-template":Me,ractive:Me,nunjucks:Me,htmling:Me,"babel-core":Me,plates:Me,"react-dom":Me,react:Me,"arc-templates":Me,vash:Me,slm:Me,marko:Me,teacup:Me,"coffee-script":Me,squirrelly:Me,twing:Me}}],["vue-loader@<=16.3.1",{peerDependencies:{"@vue/compiler-sfc":"^3.0.8",webpack:"^4.1.0 || ^5.0.0-0"}}],["scss-parser@*",{dependencies:{lodash:"^4.17.21"}}],["query-ast@*",{dependencies:{lodash:"^4.17.21"}}],["redux-thunk@<=2.3.0",{peerDependencies:{redux:"^4.0.0"}}],["skypack@<=0.3.2",{dependencies:{tar:"^6.1.0"}}],["@npmcli/metavuln-calculator@*",{dependencies:{"json-parse-even-better-errors":"^2.3.1"}}],["bin-links@*",{dependencies:{"mkdirp-infer-owner":"^1.0.2"}}],["rollup-plugin-polyfill-node@*",{peerDependencies:{rollup:"^1.20.0 || ^2.0.0"}}],["snowpack@*",{dependencies:{"magic-string":"^0.25.7"}}],["elm-webpack-loader@*",{dependencies:{temp:"^0.9.4"}}],["winston-transport@<=4.4.0",{dependencies:{logform:"^2.2.0"}}],["jest-vue-preprocessor@*",{dependencies:{"@babel/core":"7.8.7","@babel/template":"7.8.6"},peerDependencies:{pug:"^2.0.4"},peerDependenciesMeta:{pug:Me}}],["redux-persist@*",{peerDependencies:{react:">=16"},peerDependenciesMeta:{react:Me}}],["sodium@>=3",{dependencies:{"node-gyp":"^3.8.0"}}],["babel-plugin-graphql-tag@<=3.1.0",{peerDependencies:{graphql:"^14.0.0 || ^15.0.0"}}],["@playwright/test@<=1.14.1",{dependencies:{"jest-matcher-utils":"^26.4.2"}}],...["babel-plugin-remove-graphql-queries@<3.14.0-next.1","babel-preset-gatsby-package@<1.14.0-next.1","create-gatsby@<1.14.0-next.1","gatsby-admin@<0.24.0-next.1","gatsby-cli@<3.14.0-next.1","gatsby-core-utils@<2.14.0-next.1","gatsby-design-tokens@<3.14.0-next.1","gatsby-legacy-polyfills@<1.14.0-next.1","gatsby-plugin-benchmark-reporting@<1.14.0-next.1","gatsby-plugin-graphql-config@<0.23.0-next.1","gatsby-plugin-image@<1.14.0-next.1","gatsby-plugin-mdx@<2.14.0-next.1","gatsby-plugin-netlify-cms@<5.14.0-next.1","gatsby-plugin-no-sourcemaps@<3.14.0-next.1","gatsby-plugin-page-creator@<3.14.0-next.1","gatsby-plugin-preact@<5.14.0-next.1","gatsby-plugin-preload-fonts@<2.14.0-next.1","gatsby-plugin-schema-snapshot@<2.14.0-next.1","gatsby-plugin-styletron@<6.14.0-next.1","gatsby-plugin-subfont@<3.14.0-next.1","gatsby-plugin-utils@<1.14.0-next.1","gatsby-recipes@<0.25.0-next.1","gatsby-source-shopify@<5.6.0-next.1","gatsby-source-wikipedia@<3.14.0-next.1","gatsby-transformer-screenshot@<3.14.0-next.1","gatsby-worker@<0.5.0-next.1"].map(t=>[t,{dependencies:{"@babel/runtime":"^7.14.8"}}]),["gatsby-core-utils@<2.14.0-next.1",{dependencies:{got:"8.3.2"}}],["gatsby-plugin-gatsby-cloud@<=3.1.0-next.0",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["gatsby-plugin-gatsby-cloud@<=3.2.0-next.1",{peerDependencies:{webpack:"*"}}],["babel-plugin-remove-graphql-queries@<=3.14.0-next.1",{dependencies:{"gatsby-core-utils":"^2.8.0-next.1"}}],["gatsby-plugin-netlify@3.13.0-next.1",{dependencies:{"gatsby-core-utils":"^2.13.0-next.0"}}],["clipanion-v3-codemod@<=0.2.0",{peerDependencies:{jscodeshift:"^0.11.0"}}],["react-live@*",{peerDependencies:{"react-dom":"*",react:"*"}}],["webpack@<4.44.1",{peerDependenciesMeta:{"webpack-cli":Me,"webpack-command":Me}}],["webpack@<5.0.0-beta.23",{peerDependenciesMeta:{"webpack-cli":Me}}],["webpack-dev-server@<3.10.2",{peerDependenciesMeta:{"webpack-cli":Me}}]];var pL;function VAe(){return typeof pL=="undefined"&&(pL=require("zlib").brotliDecompressSync(Buffer.from("G7weAByFTVk3Vs7UfHhq4yykgEM7pbW7TI43SG2S5tvGrwHBAzdz+s/npQ6tgEvobvxisrPIadkXeUAJotBn5bDZ5kAhcRqsIHe3F75Walet5hNalwgFDtxb0BiDUjiUQkjG0yW2hto9HPgiCkm316d6bC0kST72YN7D7rfkhCE9x4J0XwB0yavalxpUu2t9xszHrmtwalOxT7VslsxWcB1qpqZwERUra4psWhTV8BgwWeizurec82Caf1ABL11YMfbf8FJ9JBceZOkgmvrQPbC9DUldX/yMbmX06UQluCEjSwUoyO+EZPIjofr+/oAZUck2enraRD+oWLlnlYnj8xB+gwSo9lmmks4fXv574qSqcWA6z21uYkzMu3EWj+K23RxeQlLqiE35/rC8GcS4CGkKHKKq+zAIQwD9iRDNfiAqueLLpicFFrNsAI4zeTD/eO9MHcnRa5m8UT+M2+V+AkFST4BlKneiAQRSdST8KEAIyFlULt6wa9EBd0Ds28VmpaxquJdVt+nwdEs5xUskI13OVtFyY0UrQIRAlCuvvWivvlSKQfTO+2Q8OyUR1W5RvetaPz4jD27hdtwHFFA1Ptx6Ee/t2cY2rg2G46M1pNDRf2pWhvpy8pqMnuI3++4OF3+7OFIWXGjh+o7Nr2jNvbiYcQdQS1h903/jVFgOpA0yJ78z+x759bFA0rq+6aY5qPB4FzS3oYoLupDUhD9nDz6F6H7hpnlMf18KNKDu4IKjTWwrAnY6MFQw1W6ymOALHlFyCZmQhldg1MQHaMVVQTVgDC60TfaBqG++Y8PEoFhN/PBTZT175KNP/BlHDYGOOBmnBdzqJKplZ/ljiVG0ZBzfqeBRrrUkn6rA54462SgiliKoYVnbeptMdXNfAuaupIEi0bApF10TlgHfmEJAPUVidRVFyDupSem5po5vErPqWKhKbUIp0LozpYsIKK57dM/HKr+nguF+7924IIWMICkQ8JUigs9D+W+c4LnNoRtPPKNRUiCYmP+Jfo2lfKCKw8qpraEeWU3uiNRO6zcyKQoXPR5htmzzLznke7b4YbXW3I1lIRzmgG02Udb58U+7TpwyN7XymCgH+wuPDthZVQvRZuEP+SnLtMicz9m5zASWOBiAcLmkuFlTKuHspSIhCBD0yUPKcxu81A+4YD78rA2vtwsUEday9WNyrShyrl60rWmA+SmbYZkQOwFJWArxRYYc5jGhA5ikxYw1rx3ei4NmeX/lKiwpZ9Ln1tV2Ae7sArvxuVLbJjqJRjW1vFXAyHpvLG+8MJ6T2Ubx5M2KDa2SN6vuIGxJ9WQM9Mk3Q7aCNiZONXllhqq24DmoLbQfW2rYWsOgHWjtOmIQMyMKdiHZDjoyIq5+U700nZ6odJAoYXPQBvFNiQ78d5jaXliBqLTJEqUCwi+LiH2mx92EmNKDsJL74Z613+3lf20pxkV1+erOrjj8pW00vsPaahKUM+05ssd5uwM7K482KWEf3TCwlg/o3e5ngto7qSMz7YteIgCsF1UOcsLk7F7MxWbvrPMY473ew0G+noVL8EPbkmEMftMSeL6HFub/zy+2JQ==","base64")).toString()),pL}var dL;function _Ae(){return typeof dL=="undefined"&&(dL=require("zlib").brotliDecompressSync(Buffer.from("G8MSIIzURnVBnObTcvb3XE6v2S9Qgc2K801Oa5otNKEtK8BINZNcaQHy+9/vf/WXBimwutXC33P2DPc64pps5rz7NGGWaOKNSPL4Y2KRE8twut2lFOIN+OXPtRmPMRhMTILib2bEQx43az2I5d3YS8Roa5UZpF/ujHb3Djd3GDvYUfvFYSUQ39vb2cmifp/rgB4J/65JK3wRBTvMBoNBmn3mbXC63/gbBkW/2IRPri0O8bcsRBsmarF328pAln04nyJFkwUAvNu934supAqLtyerZZpJ8I8suJHhf/ocMV+scKwa8NOiDKIPXw6Ex/EEZD6TEGaW8N5zvNHYF10l6Lfooj7D5W2k3dgvQSbp2Wv8TGOayS978gxlOLVjTGXs66ozewbrjwElLtyrYNnWTfzzdEutgROUFPVMhnMoy8EjJLLlWwIEoySxliim9kYW30JUHiPVyjt0iAw/ZpPmCbUCltYPnq6ZNblIKhTNhqS/oqC9iya5sGKZTOVsTEg34n92uZTf2iPpcZih8rPW8CzA+adIGmyCPcKdLMsBLShd+zuEbTrqpwuh+DLmracZcjPC5Sdf5odDAhKpFuOsQS67RT+1VgWWygSv3YwxDnylc04/PYuaMeIzhBkLrvs7e/OUzRTF56MmfY6rI63QtEjEQzq637zQqJ39nNhu3NmoRRhW/086bHGBUtx0PE0j3aEGvkdh9WJC8y8j8mqqke9/dQ5la+Q3ba4RlhvTbnfQhPDDab3tUifkjKuOsp13mXEmO00Mu88F/M67R7LXfoFDFLNtgCSWjWX+3Jn1371pJTK9xPBiMJafvDjtFyAzu8rxeQ0TKMQXNPs5xxiBOd+BRJP8KP88XPtJIbZKh/cdW8KvBUkpqKpGoiIaA32c3/JnQr4efXt85mXvidOvn/eU3Pase1typLYBalJ14mCso9h79nuMOuCa/kZAOkJHmTjP5RM2WNoPasZUAnT1TAE/NH25hUxcQv6hQWR/m1PKk4ooXMcM4SR1iYU3fUohvqk4RY2hbmTVVIXv6TvqO+0doOjgeVFAcom+RlwJQmOVH7pr1Q9LoJT6n1DeQEB+NHygsATbIwTcOKZlJsY8G4+suX1uQLjUWwLjjs0mvSvZcLTpIGAekeR7GCgl8eo3ndAqEe2XCav4huliHjdbIPBsGJuPX7lrO9HX1UbXRH5opOe1x6JsOSgHZR+EaxuXVhpLLxm6jk1LJtZfHSc6BKPun3CpYYVMJGwEUyk8MTGG0XL5MfEwaXpnc9TKnBmlGn6nHiGREc3ysn47XIBDzA+YvFdjZzVIEDcKGpS6PbUJehFRjEne8D0lVU1XuRtlgszq6pTNlQ/3MzNOEgCWPyTct22V2mEi2krizn5VDo9B19/X2DB3hCGRMM7ONbtnAcIx/OWB1u5uPbW1gsH8irXxT/IzG0PoXWYjhbMsH3KTuoOl5o17PulcgvsfTSnKFM354GWI8luqZnrswWjiXy3G+Vbyo1KMopFmmvBwNELgaS8z8dNZchx/Cl/xjddxhMcyqtzFyONb2Zdu90NkI8pAeufe7YlXrp53v8Dj/l8vWeVspRKBGXScBBPI/HinSTGmLDOGGOCIyH0JFdOZx0gWsacNlQLJMIrBhqRxXxHF/5pseWwejlAAvZ3klZSDSYY8mkToaWejXhgNomeGtx1DTLEUFMRkgF5yFB22WYdJnaWN14r1YJj81hGi45+jrADS5nYRhCiSlCJJ1nL8pYX+HDSMhdTEWyRcgHVp/IsUIZYMfT+YYncUQPgcxNGCHfZ88vDdrcUuaGIl6zhAsiaq7R5dfqrqXH/JcBhfjT8D0azayIyEz75Nxp6YkcyDxlJq3EXnJUpqDohJJOysL1t1uNiHESlvsxPb5cpbW0+ICZqJmUZus1BMW0F5IVBODLIo2zHHjA0=","base64")).toString()),dL}var CL;function XAe(){return typeof CL=="undefined"&&(CL=require("zlib").brotliDecompressSync(Buffer.from("m3wJE1GkN6sQTGg/U6NIb0aTKMP9bivYNuU6vRmRrSm//3UCehrg5OrrHCrSWkCREhF890RJt8fjR4A2EeX46L4IrTIWP/affkbbukX9rgdYBpRx68FI2tVZV558HxxDbdbwcwWkxS9fTf/18/XcF+clrnTSdsJrlW6VKgApOBTI2YUuI09ioW31NNUEPOEYwiH60pTg2ci7Zluqr7fVRbadjqmOuYgcHJcM4LBSeue6QXpmFJpjz6uvUY+qiVCSyyWXY8pujLb8Gjf4fk5Utq7UVA2mJ3RlmbiNgx50eZC/iKz6+5zWK7EBdVOHtfr7yYnjEryCuaayo/JNKQnrzulnbmJV2VwuioDYlbOf/59vWqYk1hgD7K7EWdmIR0GEwwFlnM2UyaNvvVeP0w4roAGcQQMcw+GsoZF19ape/d8OpJcIynmfREpSBaF8FrfDOEt5UsaYTBsEif5XtbLV8UISsUH42gBo3z5ytsc0jVR051TU7o42iUnOubqQZh0rV0okHHIbi9JVSDNXNJ27WhJJ0UFcOQCkA0A5iJRTrGzicT+2A9iMpBpP9K/HMLPdevu+NgYUUYmgecbBv1vifxR6qHpJYLfJLqGa2UoINqVGZPuVV+svIMHCEHvGtE9vL3s1v0alNAHhhbLgmAxd6s/VspNCKKOK/lVFdCXfzx14GtKyVZdT5m/8pmnQKq6SQOv3ma6/18z+LqQ/ayOsvyZQz599+mevPz784zO+/Nr6RpK55Jt68eAFQw9+E0NaYfv1P/Asy495y4oCw5cxMsZg+QUuLtAaYLSBesyzG3nPFvLjJFex/jgrj/75Kd7Ltk5WUKA7zLy+PAVaBmAze3IiIBde+dQgisrwU+TX12lQVqwPWzmaYmnbCkMSAv6tqiVy8As0b5QOuQp0k259vNcVQ4ApWBJRh4lPrUzRTjU/adf4GdE1oEp/y44CfcDw1N5oEOOyjTLOavMlwX8D7ROLrYQ/UYw/mmb82pJItiRYRaJO8b8s0MfBVXrlEVA5+VglWgcRePz+j442Cb6M/38IgrSMqTM8FKFecJcv0dD60T9ns1Q9KuNkdQmrck8g0u84adKkrELIVv3wduwxAy4mKOQ0aR7/AlZt4G0pFcLVH32jD8nFxWvUQsWTC+Z6vI78NIqFUrClUy+bg4HBYmz8WVwbJkMAJuLLLIdAwdwYqcqsvGkFHC0FTxdXv1keR/VtRgPAKkJa8dd1Yuej83EWvEJGJOhbeJqoHIHzGbu+vURKAHeFsBGqKhP7CeN4pAPuvB5XgCQFn10TZKNminVv2DpEIPmy5c1Lk2UOyR6pHLd+lzc/h5tWLt0oZ9yCcZctnS/oTKIpnIH16MI84Nr1OY5j0tAMfE58UgA3olWWCBKpaMSaKmmNVY5puvPrDruOqcrAVEb6Zj4rE6MxkOwUKJnVAzVewmCOuWOAmuauS4s8NVYNj/V4CapXcNF/2nq1tGZR6qDGr+Ipsn1MlWIBllUR9SgeHA0vtm5sI67NCaheZKqfWvIo+7ny1FSYSwymj6m+uBYWKnKFhV+ytUDfv/7w4IkXYdaLQMTFCSWzKEeUAjt7GVuASDsqGQ5Rk21EvybS+uHFBgEV0uvSakDBAtprVhl6fP1rhR/pNk5iRwqoKvbm9YlXpobk5HvZoFbqxEQgkLfYt9Iw3a5LFEhmbr6LCIRuwgCTeYw3OMsr3wYSTnDlITdO/nr6zOaMZFneF+WbzvD2+LD531wOPCo3sNF35+gsYkD4VHguM1nRJli+xP/YOAdHyFPBjV2oPB9EajQSbo3oPeY8n5IP4XqdWWjw1GvuuGzyixJ6o7lUvqFOdrgSvuFCFL6jdKnaAaXlenMB61Tl/GJc9iTUxl5TmKmde5bFx426/0/Y6KolypU6bSTX623OG+uUW5ETq7UlKedAkGMd33fr19/Qoe/Mz7XsF52rbWl+QiZxilW9YePk5s1xW/6G6hcblMlaLIghONyehPySm19qi06gBd3ddk7Vg6KZ174l1QdDLTgeQRMglOKZjlh4jTlWvRxrdGPodGm/n4vuGhR2DR8vdkdv/vCTIANK8tJiauUmFz8K34NAIYQXFHRRbxT1xT6eYj/YUw6OyC+XMu/rp8dQGDmhtVsIYV00Zps7KL818iAvq7BBNlm1yBktAsB3IHzsyn43IltDG7I4ClE2+5LA2F+36/D7Qh6bXygDlTeLzWE5YyndxucKMQptWs7UMW1agXGLp7hf2y9E8A6XbI8eZpRG3G584FaIqi09f2U2s50Od6c4uugOnmkBYbYsekjircRt5e6z6Kg+KCT9zZslC4eutoxt7dAmt+tEV7EWgPgWJsFtRXdboqFWpUV4ZuhYCKJdOUviSwMCjBHVSOKII+xbO+9hCmi7ejSlcodd0TXe6xSHTiRoGeZXaRzQeR1rl3Qd0lfNHdsGTKcwur0nACTpsZUM5aceTSDCBH9NYBFAwcikQcCmpymsCKrpXpe+XOQ+L4ElcvACWZwj0hFRYPI5I5HqBIfIr2K5xM4pwhaCxMwaafawrZzfNwP0HqChwyHe4soq6X6Gw9lQ3/RKYbYvdBIFTXlk7iDSJaT0O6QkCpQ88qpoevZfetGeXn138JG5P3rRhvwpkEXdo5eQYPKZJWeAj3l21uB7GRqemTap9ZNj0Lj3eAlMou/U8mrjpb7eIbaEYxGGur5BKo8gwOXsaAzCgsh5pXI9HL2Nzr0yqp8oX44Qe5FEqzpZ1LsJT/8XGmbZzq26apmcy3vt8Rg2iPG+3rQIVQ7GBh8i4Hnhvvsqnd7rpyCRaRdiyiZirGbWGdXMDmvDkOm2Guv/3q2lMFNyWm3XGLZemml3/ItUvf7Xim2ghSMt44+YvEFML5uqu/9cbFrVUEQLoRK8Va0e0uVjJeZwficqi2gLMDizQjmeE0EvU1sc+80ECweB3YHpY8+2GO7Ow79wnCdiwlkb6yS83Nw+UxX3NxIycFvp6G7qM9b4DQtSndZXqNaorCssJ0dZnTd7rfvb7Me82+yd9pnnfJiPbhDnHqf6sndZN+bmk962ankH/x9FnSRC+aF2l+gGnecCj/4Hm3hwxYrDwfAB+MbriENYusTJCmvcyzo9yPBeQIY2/grGj8kMCRRXsPHcqlrGioE0roE35NeD4Z1UxBcpauFgSWzjf7xZ6JeKg2zcUHGr8DDAyPFiykcaJcC0ktR+FnHTIPiFHLZ/aOLvo49vbpSBAAROFazyaSpyDPH0WNaNXbG5O5DBv3qqqKf9pCR23ys7qqRpi/qW84HnnvznBAOFcreTbFr5g07nNL7LHV1P087Jef/oO3WNaj4E9GYNzDaY/PrK8xoVxKUx1aSpT45XtiJc2tTJPP5QtMrxhaJc3j8zKG4fIuOjwgwfKAeCQHTM6QCiaq6hYxkuAHDUUifFIOSFF1tQ2iV1rhBY1wgACCrIdGk5y0DRMqvXRcG8v0redyrtI2/ijanHUGCLbjm+TNTKZYQrxQUAcDd7RhV23+xetZ17s1tljwAAc4PJEZql1MuyXNTM+yfQb/uEjzrwg+2MdwsOi7pZwtwpWAGgdj769dfn62T0ZB/MyaWict7f3Q8dVH5knSm8EF4cgyiu6U9IXRbtluECALvCm5jCey17rLTPqZM4COsaAYBjuhSO2elFmpjexO/lAr7ZUrD6jLiQlubAy2QAADhOAvnfc7Pfv3b9f5m6MWlz65/tpQiqXWdHUSKgq7kePIiNtO++Wuc7xqN7QUR4whdilQ687C0AgHGBsmQiZWNi1+kJe/45TboCspWrs2/3iayyuzIBgDVKLB/k7MN9HoQzPxv5oLLAwlXMqFhqCwAUdV9yw9Z9SbWnahy41+suAYCGaa2WvOdc0PR++uxxaAUUYt4ceBm2AEA4GXSrCkOyd3PtNYmpz16tawQAChEpGrOAP6DVj86Da+48PeFlcSXLqwAIN0ebmnGLn5nm7r6WXwb6s0lvPUFlOMx8P7NsAYDBsZEuNwzdt+n2pbLy3bfZjQAAU6VkzNLTM3M+j/YUrK5/+a1lv/VlCWruwMtkAACIpQtqjHvG/GyX3gtVZsZqu0b2qcD+IvYgPUz10vO7k0eaDwR6wleytX3gZW8BACQs62mMe2UGo0bvXStBY6XdUSetIKzNBAAO9jDhDHzO2r+6yT0XWxa7nMaotgwXAKgV3l5DeFHqrBXUXHvopBVYcwkAhP3oj7T80Bm/uDF+OPFlERcqleECACV1th3UnPDRWTOQa186aQbWbAIAC+sFV2H4nXlv7S2d6U/FXZlgBUDUOVr2mb4Khv4D6zghzxn6FL2Wxp1y8WfZuADAiNn3Whnu033Mua/u47pGAGAV+lWo8ObR6so+a/tyKFZu85LAv01spxNMZ+lRhxn/C4+mbnshp2/y/nuR4XsSytgOB0lKroEBV9KRd4Qn3bGrMix5sdCSK+hM/ML1pT8VOsHiHVcDR3798eErcRvvmRpf9oXa47tdL+x90l0XKeez+DsKHFM3Rsayb2n6ap/8CNRifpSo8o4gviONA3B+7irvo9Chf03P76E3W+xuVxGH9ydi7pPZG1skSCf9iFxtx0RpUT1B38P7e6JzrxS/O3hzhgsID8+d1n2lpuW9yDn1cycJk/HC7TI616v6rBVFOssf+fzF7zq/n+bEnAKkjwFenbdX9BtqN8GhgSJBie7a/Lkx8ifCiIqRus245NzsdyfrpY7E9MdkjqhT5b0mnawm3TFhLewL9gHbyp3892Zl0gGUpiG5tM7eKyaSAgWPLSCipRRdtYbQraAsQ6/DXgwoAu54ousxeu/5QlhAhGi8P3HFywow3ZfBDoi1Axu6SNfvJeOPdl41ZJTCfQx6ct2x+ocRx84fscJhSkgdfgx4HvBi55tvfQk75PJjH3jE+RBWODj3/MAs7UWUCr2bZiWOd5KoPgmiK2Uozr3P0Mqp5iiNscCAHMuqyfvBc8JEwKfTZAQysMEfcywLk8IKERnbqcybTcuoiUzpECXdXDkY+SnyJbzco+5+MxpIarmO0PFDWD6znZfapp1H/r09Sp1Pgvv3I06Vyce3SuLx8ueTV9dOE4cBXmvZG5AYgKgF7aiZkyASzn6k9sda5PbHiR+UJjEXs5K7hVqjpHzgI9SaOxjNLZkzv1licCDwQ071sZro0/FKbdwV+drbA6Vc5N0WpBXZksnrWcKFV2fm4f1PZOZlRaVZ23i5KLZbvHHOIYeQLl+2HL6HZD9+Ygb1osLH1c+lixsT6n1MbMLKu+Oon3648hAAxGGfQzf32uBd66Khu3H51ZaVyetua6CTF03S8tcoM/jHWOj7uFctdLL2a8dInDUbe1s3CickDPOTvd/yNcEvursIwKPJQk9V9m5Sx97sCDC9V9hCZ/L8hITgIC7OgVvTRZw3jUtQYMkywRrgScbSO4npEnwdlM5smZ0NmV0pDBHxNaDT6Lra5fdkFm0xqh5jwVQHzlWo+udmQnb1OFxOBjNk/SJDtdtHfB2at+Ha/SO+Fv+W6iuRJXc/ygj0NLMPJR+nsYsl5HZh8flVD/Ob/VBOnLV+B6FX3zbGDi2J1byDiTkX14Mj6DeoguLGudviW9pr0jlIvGUPnHd6I5Xz4D0CJBl2fdcuQeKH65NFAki0bDH/TgtAHF9XCSKoUN6OARVSWViSVWJbpxfiSJzmy+l4oCyHpAZ+uOEadNMxqje4BNdSlx5LyShnMzb19iMJ8ekLxrg0XLjDBiXzkd3oTUcqBNgwJDZuI4Zlh7GDIHrvhuguy4kx+TVhD1zC7V58Wph066fXxmaPb0yO3MY+nlmJBS+a4cyGVtjkvIZT0t+AvpxQimsKatVlTSNevWWUy+6Xr9rwkIISs4hbYClBAU/70Ff/cjYqwZuEc9HMJ47v0Bh3hciVzZbd9jpp1BSnCua6Cn4Z7LBC6hkII17itoSAkzNlAUeQHPjzuambOoSLVAcrNmVZpE0b/rpZsiTaSpt/5PO2NcNE4W/HUn5DYY9NumeBKlfy/tiVD3iV47FL52MawdJFIRrsv22WE0aNjn5JALR0vrg6alPC4GqzGi0x2dTXGeyjldAsOXqMN7vDOznP0rV2YMeH0rQByQoEYKTjM5nMAECGS0OTF06Gkmt3hrNGEwBwbJ8s32PvFAkEbpDZij7FeuRdRZNbIi6ykTfUfrvOu6zt9/HbZtp1krUOwpUzAwBDQ6VIyh2fXLsOJt9wSjQBAPlhZ2V5io0uFOi4sC7sW0FJ0VORmKJuebPVzfymt3Zwl4mpAKxWI6yIcN7UGP7O36wdzJ2sTtMuSdYStFvKDABsjJRaLi2ckyjtrAylRBMAuIqtkeUetrYYwBbVsWXZz9Zfkf2FJ+Af/MRp3SMx/K/rsMDtJCRkbi9IpWYAQBDC2tET7Bp35uQ8Nqm2kwgTN+bzQO82y4nVY/l/YK5mujxG82mIshvGBAkr4jk3HZkdbEy0GsuBqPSeskcoF8cHyGZmk/zR5KiSXsX0Qdsd1w/SLhcRMbNmLiajcM11wc2miEV7W9rZyyyWPRjhKhBUwcEvMQg2aYUjdko+M9qj08BRLBVw57j2kYaDxCxa5Whq0Zfw3LFNZiFMuJy/ajkhBp2PDNUr2jwW3AwTViZhuUNRRExoOO+5wLQsgPvnBkrpy9LHbWUJLgifj57YnOETp9/agBaJmZrr3fPWqLnv4OVU7jLBWAYORiw6I+nkyUXZr9V51cqpYWKWwesu6sze2EkioKiY07xsr9FWNFGnIoMuHQTtJtgjHpq1q5c6PYTnJHc89QVToXRia3aChNG0ozNG2p4+wWSQwrSMCNyRbGqdtGtdtBNgEmKUD13b4a/rdBHS7QXDm65jLuZWjduF/ZM7Vq0G1K48wlrQlads6tWxoxFnYePQDF9446wcGKWryN3FIoIvQWWECe0JiWSNE9Zgp8I2OO5N7rZ4j+JqLTuTcKN+N+2uJE4HdpYhHFrjqfhifG8xeLVqh2xpKW0QtH9nantgveeHMvUvqwWRHjh/fY6Fynqqus4eC/jdgzEDALvOnsrXCJ/Y6MUvvsv+bXaqQGtzH8Xw38sEAChBy9EpJvvD/+GeYu7EBb+PsawRq+QYqw/HNF+EMKeMGF5fGM82C4N1+PITrRiupxOCQZNE8Akg1vJxZE5WLh/xauyIxW1wgxsevqwup/qlcZuFo/BraGMq/0eLbJ8bHvevmtajDL1KmpQmeXhhsd6b2E0XdqMN8Tz63vX1bB51r/fDMTlU4FH4f/dW1D3GJj0X8HMIiUPfPYplmpPNhgrC3wgThAJKWxk/xWjdW80Z9rPTqRw747a1pMZklqNhdHZnzGg4vdOz3FNDUFuJCSFH1mjkdYprxdYxfrx1BgNcWLXMldhwV/DtVEYDaosrV4wbvcv4y2c2Pcv/5UI+L+pE7a2PsM6mA5duraWmpU6QX3B+fSKNtw7rHwxnigb32nfAFHA4Rf1BWRvqGccafEO4D549P94zBbClCKHppCBZU9uNQFI5MwAgsa2csAdK6XGqJ2p7L9tTpgkAeKFT1b2K0GUzSgCgLt1lVUxmAVaoaLpqURxdPjYBhTeOnj9Iv7x1ZmsR4ZNZ5QBsIyLCQ6nJtsev87rOHkHefja2GSEu2VMOwDYkoj1uuGzaPtVyc/b5lttFpO1HCM5ls7mdrB7PCJjrjcwAwJwBTznhqYqiz16r7U32TokmANB0ZU9F94kLcLlJAMAV1dGsZk/QvZ7dj762dfjFXva/+tKXzeZ2AhKXksnbOjMAYONQVoKRUJSMOzFfHLqQoCjsnjg0t32V+aqLpduDGvSXSrmATBf+6O+HktGouMEIqUXY2udqsA2OWd8VVAG2u1/zEyj+hSYNgekMCoDu5TEJTx2GL8BpN04zXUzC55u1gJNrasnMoprDvgBRza9UrGtWxQxh/wi4RUluBBlyDMp+TjcWSAdA9gxEkh0TJbwDL9rR714zz43/ox31mJgOpuVPVLiK2t0gWXff9OB84fR633LMWGqeEWn2wGBclxR+XUWHDkDfrXgCtbtocK7/GoIWkmYDx6fXhQG6fsVxXt2PuqM59ThInB6PF/V9OR/sJ17YQzOi0mEyy30a3Rh5p4a2oUTqT5/HyJrEo827ys59gXx9BYgi1SOUDvNCX1wgYyWSD20LECfbMJmBTStiTJOBwU1niV3vLy+sGHfNdjcFAHytdmbyWNw7pc46xFFh/jp+4WF1di10ZKxWS1n5QTbc6nvOH/r+wIPSEQ4IHesNx9c8+tMPaz7jgSUMoVUGncfzEPszbTCJ/aJhW4wj+ego6X+JQsUbWhAkpINJij5ooXnc6dwME2P4XC4V1+oYp8V2eEdujVankY4pLrlzMOVsoAfPsq0VnuufY9576RzaWdsBODo7JmsxsGZO4mJlhJHSkiMrizonS7H+zMtxOQ5brEAIu9tnE3GJ4gUEnwsDB+25v6JyK6cdrEpuDt123vsmKI0GRfzCBJ3dDh1S6H+vqtodowsZc/cgtMEMBxFwq16UQvaITAVz8Z/r97LjAtDxT+pavdwqZkRryrP+eFdsm2IHO2QrZbdRvZNa6mWETbK+brtQVi0QnRgLvrAgmxVz+4QYpzgghvsUN+QE792KrrMZGmGjlHU8Ehgermdt3TeAlEiVtgS87Qw3h0omSCfSsvuIMtDKnPF4vdfHkKa8uMq1zyemxnvRKwLO+lE4qvK7qFUc8w5yoekETdULJCiGs3iRHx17sRbbyoOpYQl1aALGpLn145D6PWRAahmsMjLIebGgt57Fl3UWjTN+dwaDHToY+97NZZxPFPDDQyqpB6poTRnFzQK8MUvdvNvYX4Gp4dr8ZfnV5ATTiqaKM9EopYUo4UMiVieR/9QpYMwYqIg5IxhioLTPeOl4Yy469guMzRptp+y1lKNqy2YihkQFPNr7eeZctGubRMRxZToiqh3jPnLA73yrgc9ezE8Tn4eRGZuVEwBxsSxZ4sP60HLapZWEF4vx5AoYMrcpHzCfX41SB2HanzM1YJdedN7x4NmV2jP6kTo4VVRu1jCa16yxu/JbXviYJl2N8mcBfz1teVFXwhWLD59msDQ35K12R2ub9lSNiv2IEhT8OoVJ0C8g2iCk2CH/XOyIIza6UBjdZ/LifaYST0XzQd8xMX9LigdfIe5Lr4U9fMB4J0Tj55bvDzg81o+EDNI8u7J4rXT3nr18N1LFz9VmrhHjpuNOqeputxktteBeFjMAEFJKCEZCcb7GpSoWpzzkBCXXzpWqySnhK8sEANgPj/XxbJYy2c0D/url2qnD3/ieBVYC4NoAWou3vDP06vO4oUhI3AdEHQbiObrqSWE9T/h6qNv4a08EoLpcVUdMNF0BqFXHVP+mqZjSzE34mWi8805g1AdkuGDVih2GIUKJp+giBihJZuE5jfe/ilpXdDXzj8npQ9oDgN2yXZubS1wn8UFXcNc49tyGVpyBRhTphoSxEZCs2MG2Z0snOyfc/haQaKyiNtH4Qol1P7A5jOuBidfSznB1iLFrbjTj7xUUhylGTxy7fkZw/ngeBuuh/vvrWo6q/km0/DXN67ZkiwT6sKs+VzzfP68xV/M46qEEJJ1jhq4Iaz/AG0+fOvfdR5GZi517XVc8FsAkt+sZA0kk+vVYhXtQiqf/HZh8go5+pU89qkQH7ZkFfZ41rF2b3Gbz5qGSriHY2zdw2NOWV72V+nC8c6Kb6PFk/Lsle5SHuWbP34nUYx9c/HsdTfMrRa9WA+o10BLn85kWBOvuuMOWIQ3Cde0GRJ+P7dbJAN6NKzvr2jfkO6+CQ+PkWJeQstapRj3T9Fn+WLlC/R8pcKOpztB6VdS1HbrRrDPeSTKMhgvO5tLVA3Im8KFvKvqLl/WybtFRZ4dFe7niWYsxnt74hPO6qXJ+/VOtIR7761QUDxvqtEZMI8Om9uZXzEmrV8JmVbqaAzpOEVbW313WaDLcZTCVDen6xvwFVqEcHjjglWf4O2wVdEHMvWieIzEvtIypn3YSTnANB/bLkQq9dd1xBqx3fZfCyBYBRIuiPE7XnGb8+N6+qZgaD7oAKqb7aMXAOBF8GPacE1uZtcYgCt0rWfWOa6pao8BDcyNPpw0WF6NlleV3wuv5E31jMxScOhPNypi9jL68y8nhriOHgxLTfa7nYEfziP/KS/THF7bMrP3yhsFUJvcwExYTMu6yTGc6o6CgtkUWocBZv2x05k1sAlWNG9lTMMf3RNiCu96FeYW1xASz3bEfkOU4+0IaVsvAW6EUVmbgjdHAsvPznJRdxUVPiPkpXV+FvWNsyt4ANHbHI1QR5ysbmhW5tmq22cmgr1xNkSuX8C8f7YF4T09r6Guaj4123KXT9MXCF/zGtWqDKtmmxNpz/scN803rNkr4ZBMOim8m4BPpOdTUFwrdOVuWEvgywOek4uvUa9O4CWJeAq99qBN2XuGVmagXPI4Zp1o95LQYiVdX4rqgts0bma9JXKE8C5w0AQYHXN7Fdm2Lww5HHOUsOTFNOkgvxzk2I4zD0MC6I/LPRStdegi7WOW73txGocc7IVoi3i9sVaXSEJKwwnWwoyhhJ3HaWmDadbWsYXrBabUsszzF4d66bDTxZ1ovl0YYaemAEJvAjZfN3jjDY2gqPNlfXdQ/19H7gt0QUuJit6bFMcMCvSkViiLxGAIELELsv744jl8XjcMj9t2qt3KvAwkFjK2Ye7hy4QtLNYNuI18gt6cnzOaP/ddIfB32a+mHy/jAr9km0Ie/tmKx8ENaiftoz2by3e53vDPOiSLP7gZvDL4mE85GWYTgQLy0h4ouDIyh/orkYvhV9lhw/L0lWWGAWDAGY0cndGz0sXtZ7F7k6l2oDUGj1CFxJmN576G/XgfGqbRT4e8FvEw3eqEdK0CML1OySyy33MrJIIdMwLyUQyGxYbkB79xTPAqSsB8WuGm9lfD8rCR9exnwSfjXd78NHuHw7CT1pSy5bJq8rWEGAC4Oe51grCY0bwqlLPb6gOdOZeecY3s+nHNpJgBw02fkAORo2FwW7FWFXiLdtDb1AwA3AqRNKO0A9Wk+q4GGuthbQJTx5wAsRyVIns5mAFaR31c/HAXuqlmSPYuyCk1KbBs40WZZgAm1hXyA1Wa2soBY/e0eMFRVkWZEMfBt7Do+Wyw/h70G5wn28xA+mQYSwJb7Z+P0mPiocvtOLq7MpufkayJ+Ly6ZCxLAJhKjHbZUFr3fd5rnHIy0q6Qjeiw4neuTqtenOgxlXUFaxwwAdAi7HYx8MOOQPvpUdszlkeOU+PoIH5doAgADXedUmwCKivRSLnSV9gMAUxBbiXKgpuyjIZw0tiCW+rcLTRSDFVujvX0W1agcs9uD6w+iN1/IP7gOq/uB6zII1knI+eVEaTCYa80AAIXQw2DkPzcOve2Awq6OA1oXKMy/zXvoHebgmguXGZVjcmv+dl04uAGfePzoi2MuuRTE0HiKMN84N5sLrC+Invtur/vd+CVecmPeE+q1n+LhuZvAB8HFmKwkAgTz2tel+r10fODFmt+DpA7zTGpcDz8YTzSezbGTIjZoMm8GJ0XCp4Ul8ESK6hnKmAcnZcQPBsHOcZoyp3+pCS5Yf5/ZxXwT/J74DL9vdg3P9S3dinU3KaxL2ODPspgBgBfVkhB1MHLCglxV+fLss20XHY4X3+ZMAEBzx9tmFve3XjNUz95PD7v0ZjFfN/vHxzn7OVnSZduvaxafw3F8HXXh9tRNbdqNq0fsD6taZjEA8KyO53yMksen7uZl9bv5VNYc/m5Xdftd6jXHKeFZSuG/XQ27cd5As4rfcg5/twsjvxsEs4BzGFJJ7xsO+s7pSLDU8RpolpR3UGlSkKSdjpsO4qoj/6VMKBY60m4rZgl0tKxlz7rQcdXWezZGKaCpiNsl+hE6ZjXa++V3b4oPtLc/Vg8cl63ldmIV1lP5KWWfn6xViPY/J+FzfaHhR6IaGpf9WcYMAHSHZLv0RJZPhy9dEXJ9zLnfqzZs3d1oXYYmANDJIjoSajZjat8PwO1KOdm6qt5cEAAY7VZXDxQoqJlFPkBJ7s3EB0BJ4lF8gGnVbxwfEKcUyPEBSVmupOu6ikmDwF0VSoadCqWKNsMQrFpb3BisY2afCPaovy8Ftl1VdEVRjNMx2z8HNfvzSHbwmSmr+4cMBAlg+/2zMVrHrFZGz1fLG/M79MWvVg8OGQ0SwIYSI76sQzD5qD578Tl67SmmPUYI4r57bIs58seSlYGq1zEDAHWa4QbsUj6YOSWXS64d/Sz32dkyTQAAgbiqDQuyC+XcruBcahAAtCGsEiVCVbJvALWksRqC1T8PBCoGbmhOegeiGrlj1l/sPbnhjb97H4OvWOjLtA05YoC9ubjn3CzgslxrJLLGxbeuQGUE/GhuSyTTwXZUnPLcvyQu817WiUi1MeK9/qJgUT3olcMfe5bnozvDnX/83DtdmTBoXpS2au9AnjCmENQuxgIsv9hXApuVcJ+d50z8wFan8vDuOrgrbu4rMZMfYok5RzHl4YkV/Mqj3ZLiHsl0R4ktQeQNmZGE90dgbse5UVRJNJ1PkgslNKJlp4xNYfL9C3W5GDo5N1iSOd4FaNNCGYsAxgmdQnEhp3uo4m82DMwPkTqn1YXuYyNJVYQgEvLOUMdR1P58wZMepYc6lHccJFsWn16CavVjQyfxs71IWNEARMiDtpyqWMbUAZpaPWmDVrNChcJu14uX4Yvb6gptCIK1jz/kO7CpyQV5EVOioQK9JikVhk8ufEk1XwAD6Q77IUymxVkepdKhRekIcxTkWZdO+WlEl99URtcgnLp8wEHx40aEJgY+YkF3OlTP5JORz7tSW3ReIbQg9kbrUKWTmBK+ivfMPodogfGq+U6wnVYI+WEoBDO/TLcgynGBToKWcb45N3VnpWO82/pUJJCzqez//nFrOghAJtIklGAd406zy5Ic734hMt2LOuwuMXujjjXMgZU5Xtx0tCOz7EWsu8p+9Mk6pVgcKzfmigBFfbwWgx3r7GKhdbdHKcwbrxlT/03ZbvueZq1P/wvGs4zBpNz32bPL4d8s73AWgkUzHlup9DyuMBU3MAhlI6MAzZftWHYImrPDj1NoC4NqbhbuUSiOu7Z0BAnQYb78PrYl++Lv9mwBnusQ1JHG+otTmL2m7aaz+vs6AED6sguBzr+g2F5CjhXGmNFf2olDwzMK6SltApu/b2LDZYoIp1CjF3qaQyePXOiJn1MwMalvtAmc2Q4jtcv74DMZ6lhnJYivToA7LgQJ6wlTrYUtXCgvdI828TdOttDnaYNyFVzo1fTVq/GdELyIJM4yR8UpSYapvCR1t7aaRIw8TBwvaAm+Hll3jQA2kh3SND8iOf8QknOfvDujg42UBfEackfUhO/C5c1ySXjgw1EK0rcjGGvyDmkf387gpNFoZd+/3XqiXxfJ+t4/reMeZZwj1+rqKPyX9GFmilwNC/dIYBW2HHkMrfAgqhoAdVBbxYW12UPusLvdJEXkRpfaYJMA0OLlNbACwCtDcrd0YfRERT2deNSQAGx0ANR8GOmdfQyKMXUCbbUKJQfqScIR3r4fd6DofDSMuGEe4dRS4YHz1Hl1mFXWmhClLNdSok4zKZWANUpSiWSWwhRIiQ5zTYKZ6ob2j5hogG3Q681x1rSjHBiTqu74sfQ5+ZDXaiN+cMxbM8LWW+2wAceFR+/MCe39T6ze+G+KMlN6a75HTF6KrLTXvXU3u8PKU3NZHj5qtOe9N9r3Gqqqt8Cz1N9CFjqJQqvtGrZN6I1rIj3+rRSee/Jz1NtKZkP1UxcziSI1JgGOXzs73IShzupkn/6DC2zdxnR/Ir9uTHoPZLTmDuIzj231CSzZRz9BtcCjlaEj1HWAQlkKf/XoPEHBewjX1xN9BMitB4yEoDshyv/TWYm3q1+AW4sYczu5wcDcMLdhNx/XskQQD6nF2jyKQvLxMyYCSfRmfg428lygl3b4/4Y4JiVSAYlUvs6P0gF5aditFJfbT3dy27ZT1FvlQj72e4kyMpNMVS22pRdxHBqJud24L3Z0zE8cXnReEyT2h4TX82yT6JYvD25eC/yDqU9SLqbBxxi7wFiEep8QhNZrS8+Y2uvxUieOYarVGCrOFPhdyi8H9m8aZryd3gAVBwmkjdpldG8qETJzE4MuWyA77vASFNIe9s6alecW1NndFYOqiR7gkWme0tYe6Uf5qhmV7DFhuZXNTyhs3O40WAFC23H0EPX4RrWj95GvnKRuQ/xvrsqm36feaJbnSyNDK1dnJn85ioHmU+sDCZpJX0JtgNk9kAwkFi59+w0LjfBe2SZxPy68WcWZMC8+Nrwp2hP3BvOB3wuO9/RDPUj4b/12avPIka6p0zQlJDEofS7dRVIgW4u6pZk2XgRMxbx75nrxHUspeXpIddPR5VJfZdgjnVU8G9I+5Ds8oXL4M5m43pqfpBNDgoEtdl4p9b+4P1azrekdtsVRftXXvf2mesSGzPOCpCowM/As6SyBWUhQdFoz7ETiTeiNieIcSOc6rCB5MZZVAvwHwuYA9zKtWUluBTnSsOQPDwNb8Gimp/pcY3FOCH8d/WpR59A+V1uX/b6yzTvf7nbc/7f7WVz8rL2/fuA/nc93/K93DKUf52J74P7ljp2/fnOo4/up2z3933lKdbTXVwzW32EIpMr0Bowx5U8gRqU9Zm1KMS16VrDQzgsU663fk7+cZRfGxrLXF1H3b8Fvx7SgAUFF29LFEIhwp4xvftEDshUxFFBC8Up3Q3jtzeU60dwPlaOSSMWbuVvOLgs5U8193sO9iYSTL9KMfokZqpPbjOE8wc1X/kluxjg90eXrtpiqkr1H28tjsppDA2vtaJN3OGsbK5eScwgsCag06XYlBs4zOnx3eHxA0UCjzuTRJJqyp0Lv62RFBJBOpw0YFRwvAjNLx0dmfQ4dq2G5d5M5/J7FVTJdAmCI8qE9L7NBRoQRz+Vjp2WInn4iJqLq8Q3XRfnhWQWFigohD3uBtQ1N2/QmLCJwlRjNxT89ctFtcYBpFwVHRYwTNRJwFMWgX0gXL75D8W2OaHmcq4sTBs9kSC+jW91KGC+Ek2bcPHmsmzkn/Q0CSHtkr7MdAtkiQV7KUbV+RQeChy7j2Pq0YRygKEXfvIhMtOVGwXcultKonY/zjw1R4uqRsO6Mnxfm+Sw7cUKGU3o/XonWIT+LkX85wxcwpDYoS+kfF09VskUzcV7qjjqQb5P2pGbUiNGxTY9Tvo0q/8RNG5InzFxh6TeLoHPGy+smnnutLJNg/rCTeW+KzE+pJbgovnhEGYRUlfnNLSrR7rm7adV1E6v/BmASTdac/thdDTdihISpm7p9d07xEXqW/nAlPUlnX4nqgM/sGcJLJwF3k02gxQf6Q90Q+1RVNdilCYmZs6NT+Wbl8M/EpupPdW/PAZU1jjFPCSoQi+6H+rDBWW4z9o6Tk3YupSlR3EHcMv93XWHlQtRTevBq8rhlJKF0FJFjfDCSFcXxpNW4EXdL/amdOs8pnhnC+lyp7V8Hg97uIf/5RVbb38Fj+YjGLEsvds3R2V/+FHomXLJ03FI0jXTWYKSP91NV+J3S7QbM6YGJ/qJXNzrU9xs4sAmsVQXUELkcVxgFKNcbGyHtIxAa0pd29rLdxuwJEg9AXEd4T8Adj3PA3S5P681Ru2XclM8HDGSYDb4ebQKM/+aufRPYM3LQkwlPKSsxMCCTjd01Bhq/CVhpMh1lVEfw20EzU2MPINctBsdKsgOlEYWKmtjUKg10PJVgaLnr4DhSd6qwNna9gofKWQthSHfRHSibKQS3SWzgD2HPqNmEFs6QamG992qia2MYfoYYktbjIVji8hVje2/JpPWCL+BWQHGZBWvLyiNgKQmydZTMo5jiiahr44/QlHKqVaa5bWMYpS9YzZ4fHUBxVzvsUl5dSyeISQIiPoKBNbGt5i9HjvppB614rGuwkFE7E95jTUmABD8Ysw4q4zJPtimUOlVfUBrHCYqmugcGYkehNEjdbcmA4WM7s7ZDFr/X8fuRdtHDGDEDdnKf6Sf5IUk06ZHdfpqk1tHhIy1mHVmTyQ55m3K/djny2c6pqPvCylAoqUq65/LJSY6S0eqeeQmSNDh2wadWx766QKS9SAyUbpyhd4UU4DXHl8ByTieaYRF3snlNKG/uBZccqtFpmxf0qiCgrJIDcWuRGdaixmaREebfMoC2XtlSh2oVLJFB8mHwb6wAf6mv1dGL6Sc2f0270EC+ltBTPIAYpPnH/MYoJdCdW97NX7Jb2XrlQc6/8dFZPGUsmQGKYwQwovWpDjYSVfOex5c0SoM/WTbutzo1rOsn04kF4JmLndk/WVZYFnJGqpSxOusAQCeentwjEzNjf/Tn8nOXu+46131u19xO84/rymAPn10xcw9AMSPzXx86ScxYAAuQ/IReI7nOBTfvo0j1CAYim2kKoHwyn7n9YDecheL0vrNIyThrElQfuQsOPmjHML23vpBFYuUFG7QyZj6A3aTTHYBzna/bzswvdxuiLZjn/Kcj+A4qnOAXz0SLqhyXxxCJyaqB8/FZzweJs7/r8ZdDVE42rxKJBeofynd606vz3awsI5gw/GZYyF5Xdov5UbhWeeViD1B7Lo2y8KFNH4UB9fuGT3v1xrfnV+2b8lRo4HES7UDixkYV20oRc1CPar4b8y6+KxDXPBKTd37B3OznbKaf1/C7ylYKXZXC80PfJRjFoTaC0IC/sKW0D8aPVSrts2S0JF9DYDvFoHH9G9wg/5BrkGozncbjWeUAcZteckv57+CPzBbNCdtHAsQ6pxIazHsgJ5rQgCPj/t/GJMp0oK5MMtab83RUwb3DzlSLW4DUdsAvVEPx5S2y/2q+FrHfO98fMfbHbX92yz2DN+t+8XC5+LVxhVtyYXm0WScyTjf7tq/wzuebOyC08/nmTo50Y4TDz/QCZ33/KqNJoeUD8iyFTN4bL8qEUvpcOvAms//g0NmvmL+7NtnHe4x9PoK2jjyuNilXSfQA7eoGAA5Tz0YMD07SjQs/kpwHp0faRadvQboijtXjIBRWbLJntVqqo144X6oheLqViPEkHrfUPeAqlWCrGC3zHchO9dylwNXs/AcAUEPgo/GTabA+7XZdYBM5fDNJbvG+ge6UP2rBd1srmOagU42awLQJgtG8twcyMsfuAEf9d9sBAFRVdM7zlz5UT3Rum3+pxXbc9A6V5subA3pANTQdUfDRdZVtW091uzEPAJhesLCOuxSgqWe2DzAws3cWqGI2rAcwWwG1pKkrPvVF3Pv0eeRZL31fq5M/46b//4OZAuyX0d/6FF0WSBU816UoWmzFhs79In/rDT7EL/lYC/2bbK8N4HkthS4I35fo3qfPI7tVZrkUn+qylx9D3WzlO/p7CVETvnTCbpYj7Mgfaw3x+kPsDbkrj0BZGNxkj20Au2GO+Arn8qFfkB69l1+eH6w3hQXXj7SNkasY5ArFvXXdAICGtAA3uKrr+yDN5DzYldWd75E00xVxuJsOQmHFThzu6ECRxDm4y0pEa5pIWOoemJNKoGp663wH7FTP7Qr4svMfAOjgAHPGj2EgU7ttCSijixcBOhp/y4L3UCvATVCkdtuP04mq3q1s8E9llceb/EbhJNua/vDeW4kcAsXcW9cFAFwOu7I+Hy1vxdh6wWGpfj24/CQ++JlM0+b8dEan02GoC0Je+BJvHmS4U3MeoZBxY0cBADA2kKuZLf416GjgG95m8wuhwMYPug1KqXfrAAC0B0RIGS6aoyMRYkSj/j1S3Ma4K5sOLouM+Lg2Ocxkp9cmhZ5GRqsTbcrIO7yhN8QVaa+/Gr4HRJORxZIaXG2N1JZwcG+Xx/9dpxvn07y1uR2r6rSfxyPtiaZK4Mtk9M9FitOX/N7+Gr1GXFmNQo7z8Ub5ucO3yZo+szOT1eq4suRaVcP/tJ4bAIgRqycIK4alrUngnzuJmaS+cSxHWztrUQXgpSvMsWsQhDtXrDxciV0M3EniDDfKtw4RALDRTMUkCLvmIJpro/SpcY4poMeFdv0DAIwMKoHGj2xRVlC5sL3Uclji+BFOh3+7Kl4puYJMTa89hCCRi3l+MFGFMgt0l4eBqOLSJ65GbJF1xePoHnVtXkUjnxTfTlqIXPlCX6pLxz/hfUGJPjbsdETJeuzLuZv7pn07SS41N/X6FVan3xHydjNbV9SZrcfv3NThdwHW33fuYP4T7SZfQk97xroDf+7q7MudBWF19Y2snr7C6ugrpn6+IhLrha6Xb5g6+XLlFd7F97PVvfdR18GXy2d23dTQ9e4VVOfeyVkbQrAs3k2flrjXRzRq/6+GQOqh3qv40FGiSGurO1WbdlUEcYBgeZdQxVC5BYRTg5gaWzcFAGAPOGm7N227BZyn0W565VkVpT5R/LWKyiv0WtqVBwDcrJBbYwvnqm42q+tW/JcYd9huu138O6Fi6+K4PcV/CVSGKK7h2iYoI+4TxWHojrbmsx6i69561eaCNTx9zO7xBt61hnvHmoGzs13cFpWjQx01jwVnPfwDSOh6zrrveLwvA55QvNsisGag7GggVTW3YxOu1bd/rxsAsFB4Rl14ELN5LDh7q7u7v/9NWwQDVoXhF5IXO4LBLpLAVZwVN2sTIgDQFBoVTIK4rspe871AcsVzdydbUZfXG/8BAJVQbaf2o0iBPWvNmwVBVsR3vZANQOYk/aUOrbE21DVnFLgzj3eftkuMPEElxqS71dVz0YLtqXpIpDcT6l2t9WbOxphybgwbm9oBAJf0RqDm25Ebo0G13ZJoF1hbaZBgeBvzAAD5wMkSDt3OVR/elJZBzXlC5MN7MbJRig8HNBpQGx9OdQPUlEJcO1fZFfZwUZ435Tn7WTpr+skUw/M1iqKrq6yhnib/sTf0ia/hL2v6xyyGDeC5Gc1Ow1T304p8DPrx5Hcyb/xYM0imIXYVHGHfVPdr/nwBX+qJ4WeDvq0ZHLMiNoBdCUc8QZvui664XukJFcj4h9YMlmQHq1UHi9wduLeuGwDYA+KPG2M2twv2Utpt34iVpC2CC11cUS5Iqg/XuEiiEtx9mxABgAbR4NYkCOuy1TnfCzisnttrsM2d/wAAQwH1GD9WAV1rzR0AY2TxukypII+m10asDVWGaoHuBubhtBVeViiV+JEI79PPGSE9ja1nBD//09nt0Fn8TCjXXYXbCUhcZq54W28DAEzFUg/n4NKToqUe/8SDP6R4VrdUMurWDCOOtmVqIPhEc/6uEMLblMEpI0S65sxBEBLth3ICAGA7TroKgRXz3dUnLY6F2E71h9eT6SrYt2EHAHAKWU4ZSisGr0pnrgGvRhOvBa+I144J+AC3WBxSCFy7Pv5PqPCd5v0gJTNuo8+LSFPJLtYk2Kj2/3s2u4Tp781+jd7228kdhpd74i6tLYt9VpuSrBTgvGWGAMDt8w4xDUtNsuBVE+m6aIbuIb5Jkxhpa8z59ukU/llRVdZcgSJAUK0GCZQFjN4NiAAAALhd6vO7QWTQ6FaugG5bYhJoe/M/ANAL0D1Q/UkJNhWl5GYaKCWN00Cpn9I00iU0dAvAFycaCGZB5rI6DwTW/mHj6DWc/qyTv317Vz5236atNPhAx+d/X0yEvxnElfVFpzW1esooSxPeyNhI1y+ydWPqcFWstDbO6r5e8nGdoo7S9xidl3034FBkDN/UNH+dL29y3B23ydYVADFMtqqo2uq1ihQ4fwc1+YuKGe7urcIeQpnLN5fcdARvOS/4nV3mUv6/SyKQSu/KmSHJXEid2hi05RakoQmhbdlTAEA1UalMaz6FuQVZrLZT5DlN1KmpsAyuYcFPZXkAQDzhqroeOD4Np54HVaO2MhobVU9q2ZoQVZu1BrELdStNUWaZu104n+KDe9BtxGdWyR1Woz8OL0dvcl4Y+kJYHLgur47XdEY1UffrF85S1kvLQ/i2Whyo2lbCemfh7Nrt5l6WIQAwEdwnI88jC+NgNg8ODledTy5kGj7cR1UY8wLsYkcw6qokoINnS4kgrnDBS90D22MSpQOQKZ6bmy5Juju98R8AWBJNd9SfoKaoKC03M1AgjTNQ8EAmVboAaZVA9zInA0C3PHH/EF9Cia1aFwmjxKYxkByirmS7a2yj7qramBHqudu72gEATxVqIFs+c0rPGDfbmXN65ExuxYU89eHQm/IAgClNlak+oKHjthZMU8/IBWZgZmsDRjEbXAQjFEG5Ju16cQsrWfiIPu3NK+KbF2Oxn0oxPEuhKAp5yorQuJ2fN/zTwvTnLPZP2ckawDMSmp0amrJbTs+Ib2/w94LflrU4SKUhdpAbYViCx36Uvt6ML1LVfSwOTtnOGsAOdKMtXylbcI67D3qDj+GHoc7igNUmpSrJtU4OUhk4AOA+5Pe4smZzg7AJaefczJSlLEL7chUWNQ1XsUqiRLgtJQJ9SfNf6h5QJVfkOb6Lbm2q57YzS512t2vjPwCwGHSvR/1JFbEU7cnNNJSSxmko9UA6VfoAsM2CyQLIup8VUdW3lF2uqG8wvZlt+iuCz1dG//jSXkuRNQ3f0LL/WvD2chdYeEefP464/vz2g/b8zeIvdxJN1XfWE/0VgUvqkAxpbc8aFgyP/kEg0FBFxm6+MlTDRrB49gTh61CfP0yk8q1v3gb9FduKJ9o3ysgAPWKdUUyeYjNdhce9dvEUhSMETTGVeU1O7sJjaJt8ZGf63D1jX2G40rT8RGj2SClJdV8TnhhNV0nVqL4PSG7mjzGmSVPzuuDGwfYUGBJzuUxo+TPyUE0Qvx0jW1RgnEnMBGpFvKe56o2owD//Caay1rzM0TVJbXiAPT5GeaME7MfUuN9gAXvsj2OiMvuEjTvBmDaUvkP9SLrD8vMn9oIk7IfYa3zBuO2XGVl0ZVuo6t/w94Eqncv5hbMOYXKwdn3XJrtNBMDBo7FniPC5hi2W8C16bPs0akkChRDD8Ri6C0IXmQDD9PU0+r11/EupXHJTRcGazqrDqwHCVPz+wZX5mJvoCvxxz2slk5bcE5rSYa8M/q8cVAvW82tTAyora1RPfXNmWV4SmYyFcTqLrftbLNg7zEbbf2MbGwjOXNPuYmesd9uURqhzcfnPAMu2RE4XuOJxMpmp5rvcZDAV+DJ7475G6biYPQ6uZp6E2aNzdfh0rWKIozluyrg20YWX2bNV6bsJajFsdBjwHltXTtJfx6JX6eWL5HT/BvC86PQjZlf36qn6ItY/Pj5bLfx+qmpvuOf6r4Nve3z/3jUuF6Ce1vPPuN4/golnsdTO2AnJ13/j7nXXmyD2FU3nc/eMcY+ups0kQHeEIeWI5wq+xkM2SnCWqhxSo4nXJywv5IbH7a4/2qN9IlIlXGm8sxZ9RzOLRJfxceoahJp8iZHO6OhlejRmk4Q9meH88bt49+TNrzT2HcT6BCT2B5P3YJkeZJtWP5oHQ0Q7GDfGqImAuArwEK/dmDCIj1caL+6gC2LN8Qq3/TL/xXuhq5RG0jhtkXgrNRN1i2QkQ8UPkmBgaB8Dj9FbWw/J1F8yd4Uc0RL30h3WXuie8WDBnxvV16hqmKVFCntaSqXuqkPkdLLUhpRSydSc0TZ1JXVXYsQmljRIY2K5BgFZGP+7KHhrEsEl2VR6U63pjy23iTB8Z+nfNkPJXt/MtbpkDwBYeOI1H4STiRgp4nsH5U73f20Z1BS/hfHFiyfqLjgSMzYXhb0tMYpoE5a18LartKGQTl5clKpqBShTvqkuSq2aAMoGdWFrXe4I1DXabrlvMPExD8sthJxKN6LmTQ3oxjbHUkJvE1xKOe9wyBuJGVfXxAJQZ6pgVU0IU2XqAlBk6hRKmjh6rjiOdy5W9KvcFoBWJ06uIwotMYlIpo5fE8s/8nNKx3PAMGHz13bq64/r4E2tVNVFr1JV4dKhSJnIgYLuHbd8QTV6qUKzXdAFul2qq+ygQXWjxj23GlPcwW5WhEExzf8SxyRC8Rae9moAXynvT9rrruL/h2J8qCDvOoz3ZN72bKm3cE41aFizlYlF0BBdy44XoCH39+P4guMzt1HX+P+fwXgbL8z1kX3T5+MqZhG15wiC1UdxT7Uev5lnLLnEKP73ulsOAO5ymjeXSlYeDQGL9NDKWG1V63HEy/jX4N0r7vriLL1Tj8/fjS3CUz/B27evM2HDtE4Awr/jMw7SQjRx0MSn72NNqs5K2k5iGjwAIeWHyrLhHdf03vRsqqXJr6r+8bGzdavV7dea+t6ryEMvQ1hX0GDXbjABANwNLyr3sae/dBIVPIn5xylkitd0NnWDTBn1gukmMrWsI00jMGaUNuSodS3VDvhaJdorwyo9nprszsV0NVO2BwDY82B94hwYnfHDC+Cs1lQKcEcSG++qCHzA0Cj1APioFITFWPXB1ikCcahdV+/yegPurSDclV44lrxGRVZpyJhj8XgiNLP5IQCwSi9a677N6CqsuNsDcNZUuRo9N654bzgP1affA0vpuDsB3eqZMMAtMzs2MNuAyAF4VCGWhKA3tA0MhF0vJW8mvKbC+srpH18yLDeAJ1I0G5VKZVcf7Gz2rzfWe6dosIDE/ZixuQHsXTfaArKyivxJPGLewHOMMM/6KusfXzoqSlXV+6Ww2/akKnmhCkfsQpkJAFBmt/Iemp2/EqnYGRUQYpPFZwlbqxrUsX1KEoaN5NoyK1Us144d5wr0JplvvgO4qrSbOxeQMoAAwM0WzR/cQAO5uYKcFXG/tR4JoD2lFKvLXK5gqvEaQMWVvwI=","base64")).toString()),CL}var ZAe=new Map([[S.makeIdent(null,"fsevents").identHash,VAe],[S.makeIdent(null,"resolve").identHash,_Ae],[S.makeIdent(null,"typescript").identHash,XAe]]),bze={hooks:{registerPackageExtensions:async(t,e)=>{for(let[r,i]of zAe)e(S.parseDescriptor(r,!0),i)},getBuiltinPatch:async(t,e)=>{var s;let r="compat/";if(!e.startsWith(r))return;let i=S.parseIdent(e.slice(r.length)),n=(s=ZAe.get(i.identHash))==null?void 0:s();return typeof n!="undefined"?n:null},reduceDependency:async(t,e,r,i)=>typeof ZAe.get(t.identHash)=="undefined"?t:S.makeDescriptor(t,S.makeRange({protocol:"patch:",source:S.stringifyDescriptor(t),selector:`~builtin`,params:null}))}},vze=bze;var EL={};it(EL,{default:()=>xze});var V0=class extends Be{constructor(){super(...arguments);this.pkg=Y.String("-p,--package",{description:"The package to run the provided command from"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){let e=[];this.pkg&&e.push("--package",this.pkg),this.quiet&&e.push("--quiet");let r=S.parseIdent(this.command),i=S.makeIdent(r.scope,`create-${r.name}`);return this.cli.run(["dlx",...e,S.stringifyIdent(i),...this.args])}};V0.paths=[["create"]];var $Ae=V0;var jC=class extends Be{constructor(){super(...arguments);this.packages=Y.Array("-p,--package",{description:"The package(s) to install before running the command"});this.quiet=Y.Boolean("-q,--quiet",!1,{description:"Only report critical errors instead of printing the full install logs"});this.command=Y.String();this.args=Y.Proxy()}async execute(){return fe.telemetry=null,await T.mktempPromise(async e=>{var p;let r=v.join(e,`dlx-${process.pid}`);await T.mkdirPromise(r),await T.writeFilePromise(v.join(r,"package.json"),`{} +`),await T.writeFilePromise(v.join(r,"yarn.lock"),"");let i=v.join(r,".yarnrc.yml"),n=await fe.findProjectCwd(this.context.cwd,wt.lockfile),s=!(await fe.find(this.context.cwd,null,{strict:!1})).get("enableGlobalCache"),o=n!==null?v.join(n,".yarnrc.yml"):null;o!==null&&T.existsSync(o)?(await T.copyFilePromise(o,i),await fe.updateConfiguration(r,d=>{let m=_(P({},d),{enableGlobalCache:s,enableTelemetry:!1});return Array.isArray(d.plugins)&&(m.plugins=d.plugins.map(I=>{let B=typeof I=="string"?I:I.path,b=M.isAbsolute(B)?B:M.resolve(M.fromPortablePath(n),B);return typeof I=="string"?b:{path:b,spec:I.spec}})),m})):await T.writeFilePromise(i,`enableGlobalCache: ${s} +enableTelemetry: false +`);let a=(p=this.packages)!=null?p:[this.command],l=S.parseDescriptor(this.command).name,c=await this.cli.run(["add","--",...a],{cwd:r,quiet:this.quiet});if(c!==0)return c;this.quiet||this.context.stdout.write(` +`);let u=await fe.find(r,this.context.plugins),{project:g,workspace:f}=await Ke.find(u,r);if(f===null)throw new rt(g.cwd,r);await g.restoreInstallState();let h=await Kt.getWorkspaceAccessibleBinaries(f);return h.has(l)===!1&&h.size===1&&typeof this.packages=="undefined"&&(l=Array.from(h)[0][0]),await Kt.executeWorkspaceAccessibleBinary(f,l,this.args,{packageAccessibleBinaries:h,cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr})})}};jC.paths=[["dlx"]],jC.usage=ye.Usage({description:"run a package in a temporary environment",details:"\n This command will install a package within a temporary environment, and run its binary script if it contains any. The binary will run within the current cwd.\n\n By default Yarn will download the package named `command`, but this can be changed through the use of the `-p,--package` flag which will instruct Yarn to still run the same command but from a different package.\n\n Using `yarn dlx` as a replacement of `yarn add` isn't recommended, as it makes your project non-deterministic (Yarn doesn't keep track of the packages installed through `dlx` - neither their name, nor their version).\n ",examples:[["Use create-react-app to create a new React app","yarn dlx create-react-app ./my-app"],["Install multiple packages for a single command",`yarn dlx -p typescript -p ts-node ts-node --transpile-only -e "console.log('hello!')"`]]});var ele=jC;var Sze={commands:[$Ae,ele]},xze=Sze;var xL={};it(xL,{default:()=>Dze,fileUtils:()=>IL});var hf=/^(?:[a-zA-Z]:[\\/]|\.{0,2}\/)/,YC=/^[^?]*\.(?:tar\.gz|tgz)(?:::.*)?$/,Nr="file:";var IL={};it(IL,{makeArchiveFromLocator:()=>_0,makeBufferFromLocator:()=>BL,makeLocator:()=>wL,makeSpec:()=>tle,parseSpec:()=>yL});function yL(t){let{params:e,selector:r}=S.parseRange(t),i=M.toPortablePath(r);return{parentLocator:e&&typeof e.locator=="string"?S.parseLocator(e.locator):null,path:i}}function tle({parentLocator:t,path:e,folderHash:r,protocol:i}){let n=t!==null?{locator:S.stringifyLocator(t)}:{},s=typeof r!="undefined"?{hash:r}:{};return S.makeRange({protocol:i,source:e,selector:e,params:P(P({},s),n)})}function wL(t,{parentLocator:e,path:r,folderHash:i,protocol:n}){return S.makeLocator(t,tle({parentLocator:e,path:r,folderHash:i,protocol:n}))}async function _0(t,{protocol:e,fetchOptions:r,inMemory:i=!1}){let{parentLocator:n,path:s}=S.parseFileStyleRange(t.reference,{protocol:e}),o=v.isAbsolute(s)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(n,r),a=o.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,o.localPath)}:o;o!==a&&o.releaseFs&&o.releaseFs();let l=a.packageFs,c=v.join(a.prefixPath,s);return await de.releaseAfterUseAsync(async()=>await Ai.makeArchiveFromDirectory(c,{baseFs:l,prefixPath:S.getIdentVendorPath(t),compressionLevel:r.project.configuration.get("compressionLevel"),inMemory:i}),a.releaseFs)}async function BL(t,{protocol:e,fetchOptions:r}){return(await _0(t,{protocol:e,fetchOptions:r,inMemory:!0})).getBufferAndClose()}var QL=class{supports(e,r){return!!e.reference.startsWith(Nr)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Nr});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async fetchFromDisk(e,r){return _0(e,{protocol:Nr,fetchOptions:r})}};var kze=2,bL=class{supportsDescriptor(e,r){return e.range.match(hf)?!0:!!e.range.startsWith(Nr)}supportsLocator(e,r){return!!e.reference.startsWith(Nr)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return hf.test(e.range)&&(e=S.makeDescriptor(e,`${Nr}${e.range}`)),S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{path:n,parentLocator:s}=yL(e.range);if(s===null)throw new Error("Assertion failed: The descriptor should have been bound");let o=await BL(S.makeLocator(e,S.makeRange({protocol:Nr,source:n,selector:n,params:{locator:S.stringifyLocator(s)}})),{protocol:Nr,fetchOptions:i.fetchOptions}),a=mn.makeHash(`${kze}`,o).slice(0,6);return[wL(e,{parentLocator:s,path:n,folderHash:a,protocol:Nr})]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var vL=class{supports(e,r){return YC.test(e.reference)?!!e.reference.startsWith(Nr):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.fetchFromDisk(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromDisk(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Nr}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath)}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.join(o.prefixPath,n),c=await a.readFilePromise(l);return await de.releaseAfterUseAsync(async()=>await Ai.convertToZip(c,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1}),o.releaseFs)}};var SL=class{supportsDescriptor(e,r){return YC.test(e.range)?!!(e.range.startsWith(Nr)||hf.test(e.range)):!1}supportsLocator(e,r){return YC.test(e.reference)?!!e.reference.startsWith(Nr):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return hf.test(e.range)&&(e=S.makeDescriptor(e,`${Nr}${e.range}`)),S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range;return n.startsWith(Nr)&&(n=n.slice(Nr.length)),[S.makeLocator(e,`${Nr}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var Pze={fetchers:[vL,QL],resolvers:[SL,bL]},Dze=Pze;var PL={};it(PL,{default:()=>Nze});var rle=ie(require("querystring")),ile=[/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+)\/tarball\/([^/#]+)(?:#(.*))?$/,/^https?:\/\/(?:([^/]+?)@)?github.com\/([^/#]+)\/([^/#]+?)(?:\.git)?(?:#(.*))?$/];function nle(t){return t?ile.some(e=>!!t.match(e)):!1}function sle(t){let e;for(let a of ile)if(e=t.match(a),e)break;if(!e)throw new Error(Rze(t));let[,r,i,n,s="master"]=e,{commit:o}=rle.default.parse(s);return s=o||s.replace(/[^:]*:/,""),{auth:r,username:i,reponame:n,treeish:s}}function Rze(t){return`Input cannot be parsed as a valid GitHub URL ('${t}').`}var kL=class{supports(e,r){return!!nle(e.reference)}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from GitHub`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Zt.get(this.getLocatorUrl(e,r),{configuration:r.project.configuration});return await T.mktempPromise(async n=>{let s=new Ft(n);await Ai.extractArchiveTo(i,s,{stripComponents:1});let o=Uc.splitRepoUrl(e.reference),a=v.join(n,"package.tgz");await Kt.prepareExternalProject(n,a,{configuration:r.project.configuration,report:r.report,workspace:o.extra.workspace,locator:e});let l=await T.readFilePromise(a);return await Ai.convertToZip(l,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})})}getLocatorUrl(e,r){let{auth:i,username:n,reponame:s,treeish:o}=sle(e.reference);return`https://${i?`${i}@`:""}github.com/${n}/${s}/archive/${o}.tar.gz`}};var Fze={hooks:{async fetchHostedRepository(t,e,r){if(t!==null)return t;let i=new kL;if(!i.supports(e,r))return null;try{return await i.fetch(e,r)}catch(n){return null}}}},Nze=Fze;var FL={};it(FL,{default:()=>Tze});var qC=/^[^?]*\.(?:tar\.gz|tgz)(?:\?.*)?$/,JC=/^https?:/;var DL=class{supports(e,r){return qC.test(e.reference)?!!JC.test(e.reference):!1}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i=await Zt.get(e.reference,{configuration:r.project.configuration});return await Ai.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}};var RL=class{supportsDescriptor(e,r){return qC.test(e.range)?!!JC.test(e.range):!1}supportsLocator(e,r){return qC.test(e.reference)?!!JC.test(e.reference):!1}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){return[S.convertDescriptorToLocator(e)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.HARD,conditions:n.getConditions(),dependencies:n.dependencies,peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var Lze={fetchers:[DL],resolvers:[RL]},Tze=Lze;var ML={};it(ML,{default:()=>M5e});var Rle=ie(Dle()),TL=ie(require("util")),WC=class extends Be{constructor(){super(...arguments);this.private=Y.Boolean("-p,--private",!1,{description:"Initialize a private package"});this.workspace=Y.Boolean("-w,--workspace",!1,{description:"Initialize a workspace root with a `packages/` directory"});this.install=Y.String("-i,--install",!1,{tolerateBoolean:!0,description:"Initialize a package with a specific bundle that will be locked in the project"});this.usev2=Y.Boolean("-2",!1,{hidden:!0});this.yes=Y.Boolean("-y,--yes",{hidden:!0});this.assumeFreshProject=Y.Boolean("--assume-fresh-project",!1,{hidden:!0})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=typeof this.install=="string"?this.install:this.usev2||this.install===!0?"latest":null;return r!==null?await this.executeProxy(e,r):await this.executeRegular(e)}async executeProxy(e,r){if(e.projectCwd!==null&&e.projectCwd!==this.context.cwd)throw new me("Cannot use the --install flag from within a project subdirectory");T.existsSync(this.context.cwd)||await T.mkdirPromise(this.context.cwd,{recursive:!0});let i=v.join(this.context.cwd,e.get("lockfileFilename"));T.existsSync(i)||await T.writeFilePromise(i,"");let n=await this.cli.run(["set","version",r],{quiet:!0});if(n!==0)return n;let s=[];return this.private&&s.push("-p"),this.workspace&&s.push("-w"),this.yes&&s.push("-y"),await T.mktempPromise(async o=>{let{code:a}=await hr.pipevp("yarn",["init",...s],{cwd:this.context.cwd,stdin:this.context.stdin,stdout:this.context.stdout,stderr:this.context.stderr,env:await Kt.makeScriptEnv({binFolder:o})});return a})}async executeRegular(e){var l;let r=null;try{r=(await Ke.find(e,this.context.cwd)).project}catch{r=null}T.existsSync(this.context.cwd)||await T.mkdirPromise(this.context.cwd,{recursive:!0});let i=await Ze.tryFind(this.context.cwd)||new Ze,n=Object.fromEntries(e.get("initFields").entries());i.load(n),i.name=(l=i.name)!=null?l:S.makeIdent(e.get("initScope"),v.basename(this.context.cwd)),i.packageManager=Zr&&de.isTaggedYarnVersion(Zr)?`yarn@${Zr}`:null,typeof i.raw.private=="undefined"&&(this.private||this.workspace&&i.workspaceDefinitions.length===0)&&(i.private=!0),this.workspace&&i.workspaceDefinitions.length===0&&(await T.mkdirPromise(v.join(this.context.cwd,"packages"),{recursive:!0}),i.workspaceDefinitions=[{pattern:"packages/*"}]);let s={};i.exportTo(s),TL.inspect.styles.name="cyan",this.context.stdout.write(`${(0,TL.inspect)(s,{depth:Infinity,colors:!0,compact:!1})} +`);let o=v.join(this.context.cwd,Ze.fileName);await T.changeFilePromise(o,`${JSON.stringify(s,null,2)} +`,{automaticNewlines:!0});let a=v.join(this.context.cwd,"README.md");if(T.existsSync(a)||await T.writeFilePromise(a,`# ${S.stringifyIdent(i.name)} +`),!r||r.cwd===this.context.cwd){let c=v.join(this.context.cwd,wt.lockfile);T.existsSync(c)||await T.writeFilePromise(c,"");let g=["/.yarn/*","!/.yarn/patches","!/.yarn/plugins","!/.yarn/releases","!/.yarn/sdks","","# Swap the comments on the following lines if you don't wish to use zero-installs","# Documentation here: https://yarnpkg.com/features/zero-installs","!/.yarn/cache","#/.pnp.*"].map(m=>`${m} +`).join(""),f=v.join(this.context.cwd,".gitignore");T.existsSync(f)||await T.writeFilePromise(f,g);let h={["*"]:{endOfLine:"lf",insertFinalNewline:!0},["*.{js,json,yml}"]:{charset:"utf-8",indentStyle:"space",indentSize:2}};(0,Rle.default)(h,e.get("initEditorConfig"));let p=`root = true +`;for(let[m,I]of Object.entries(h)){p+=` +[${m}] +`;for(let[B,b]of Object.entries(I))p+=`${B.replace(/[A-Z]/g,H=>`_${H.toLowerCase()}`)} = ${b} +`}let d=v.join(this.context.cwd,".editorconfig");T.existsSync(d)||await T.writeFilePromise(d,p),T.existsSync(v.join(this.context.cwd,".git"))||await hr.execvp("git",["init"],{cwd:this.context.cwd})}}};WC.paths=[["init"]],WC.usage=ye.Usage({description:"create a new package",details:"\n This command will setup a new package in your local directory.\n\n If the `-p,--private` or `-w,--workspace` options are set, the package will be private by default.\n\n If the `-w,--workspace` option is set, the package will be configured to accept a set of workspaces in the `packages/` directory.\n\n If the `-i,--install` option is given a value, Yarn will first download it using `yarn set version` and only then forward the init call to the newly downloaded bundle. Without arguments, the downloaded bundle will be `latest`.\n\n The initial settings of the manifest can be changed by using the `initScope` and `initFields` configuration values. Additionally, Yarn will generate an EditorConfig file whose rules can be altered via `initEditorConfig`, and will initialize a Git repository in the current directory.\n ",examples:[["Create a new package in the local directory","yarn init"],["Create a new private package in the local directory","yarn init -p"],["Create a new package and store the Yarn release inside","yarn init -i=latest"],["Create a new private package and defines it as a workspace root","yarn init -w"]]});var Fle=WC;var T5e={configuration:{initScope:{description:"Scope used when creating packages via the init command",type:ge.STRING,default:null},initFields:{description:"Additional fields to set when creating packages via the init command",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}},initEditorConfig:{description:"Extra rules to define in the generator editorconfig",type:ge.MAP,valueDefinition:{description:"",type:ge.ANY}}},commands:[Fle]},M5e=T5e;var GL={};it(GL,{default:()=>K5e});var Ua="portal:",Ha="link:";var OL=class{supports(e,r){return!!e.reference.startsWith(Ua)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ua});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ua}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Ft(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,localPath:l}:{packageFs:new Zo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot}}};var KL=class{supportsDescriptor(e,r){return!!e.range.startsWith(Ua)}supportsLocator(e,r){return!!e.reference.startsWith(Ua)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ua.length);return[S.makeLocator(e,`${Ua}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){if(!r.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let i=await r.fetchOptions.fetcher.fetch(e,r.fetchOptions),n=await de.releaseAfterUseAsync(async()=>await Ze.find(i.prefixPath,{baseFs:i.packageFs}),i.releaseFs);return _(P({},e),{version:n.version||"0.0.0",languageName:n.languageName||r.project.configuration.get("defaultLanguageName"),linkType:gt.SOFT,conditions:n.getConditions(),dependencies:new Map([...n.dependencies]),peerDependencies:n.peerDependencies,dependenciesMeta:n.dependenciesMeta,peerDependenciesMeta:n.peerDependenciesMeta,bin:n.bin})}};var UL=class{supports(e,r){return!!e.reference.startsWith(Ha)}getLocalPath(e,r){let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ha});if(v.isAbsolute(n))return n;let s=r.fetcher.getLocalPath(i,r);return s===null?null:v.resolve(s,n)}async fetch(e,r){var c;let{parentLocator:i,path:n}=S.parseFileStyleRange(e.reference,{protocol:Ha}),s=v.isAbsolute(n)?{packageFs:new Ft(Se.root),prefixPath:Se.dot,localPath:Se.root}:await r.fetcher.fetch(i,r),o=s.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,s.localPath),localPath:Se.root}:s;s!==o&&s.releaseFs&&s.releaseFs();let a=o.packageFs,l=v.resolve((c=o.localPath)!=null?c:o.packageFs.getRealPath(),o.prefixPath,n);return s.localPath?{packageFs:new Ft(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0,localPath:l}:{packageFs:new Zo(l,{baseFs:a}),releaseFs:o.releaseFs,prefixPath:Se.dot,discardFromLookup:!0}}};var HL=class{supportsDescriptor(e,r){return!!e.range.startsWith(Ha)}supportsLocator(e,r){return!!e.reference.startsWith(Ha)}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){return S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(Ha.length);return[S.makeLocator(e,`${Ha}${M.toPortablePath(n)}`)]}async getSatisfying(e,r,i){return null}async resolve(e,r){return _(P({},e),{version:"0.0.0",languageName:r.project.configuration.get("defaultLanguageName"),linkType:gt.SOFT,conditions:null,dependencies:new Map,peerDependencies:new Map,dependenciesMeta:new Map,peerDependenciesMeta:new Map,bin:new Map})}};var O5e={fetchers:[UL,OL],resolvers:[HL,KL]},K5e=O5e;var mT={};it(mT,{default:()=>Y6e});var Ga;(function(i){i[i.YES=0]="YES",i[i.NO=1]="NO",i[i.DEPENDS=2]="DEPENDS"})(Ga||(Ga={}));var jL=(t,e)=>`${t}@${e}`,Nle=(t,e)=>{let r=e.indexOf("#"),i=r>=0?e.substring(r+1):e;return jL(t,i)},qs;(function(s){s[s.NONE=-1]="NONE",s[s.PERF=0]="PERF",s[s.CHECK=1]="CHECK",s[s.REASONS=2]="REASONS",s[s.INTENSIVE_CHECK=9]="INTENSIVE_CHECK"})(qs||(qs={}));var Tle=(t,e={})=>{let r=e.debugLevel||Number(process.env.NM_DEBUG_LEVEL||-1),i=e.check||r>=9,n=e.hoistingLimits||new Map,s={check:i,debugLevel:r,hoistingLimits:n,fastLookupPossible:!0},o;s.debugLevel>=0&&(o=Date.now());let a=U5e(t,s),l=!1,c=0;do l=YL(a,[a],new Set([a.locator]),new Map,s).anotherRoundNeeded,s.fastLookupPossible=!1,c++;while(l);if(s.debugLevel>=0&&console.log(`hoist time: ${Date.now()-o}ms, rounds: ${c}`),s.debugLevel>=1){let u=zC(a);if(YL(a,[a],new Set([a.locator]),new Map,s).isGraphChanged)throw new Error(`The hoisting result is not terminal, prev tree: +${u}, next tree: +${zC(a)}`);let f=Lle(a);if(f)throw new Error(`${f}, after hoisting finished: +${zC(a)}`)}return s.debugLevel>=2&&console.log(zC(a)),H5e(a)},G5e=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=s=>{if(!i.has(s)){i.add(s);for(let o of s.hoistedDependencies.values())r.set(o.name,o);for(let o of s.dependencies.values())s.peerNames.has(o.name)||n(o)}};return n(e),r},j5e=t=>{let e=t[t.length-1],r=new Map,i=new Set,n=new Set,s=(o,a)=>{if(i.has(o))return;i.add(o);for(let c of o.hoistedDependencies.values())if(!a.has(c.name)){let u;for(let g of t)u=g.dependencies.get(c.name),u&&r.set(u.name,u)}let l=new Set;for(let c of o.dependencies.values())l.add(c.name);for(let c of o.dependencies.values())o.peerNames.has(c.name)||s(c,l)};return s(e,n),r},Mle=(t,e)=>{if(e.decoupled)return e;let{name:r,references:i,ident:n,locator:s,dependencies:o,originalDependencies:a,hoistedDependencies:l,peerNames:c,reasons:u,isHoistBorder:g,hoistPriority:f,isWorkspace:h,hoistedFrom:p,hoistedTo:d}=e,m={name:r,references:new Set(i),ident:n,locator:s,dependencies:new Map(o),originalDependencies:new Map(a),hoistedDependencies:new Map(l),peerNames:new Set(c),reasons:new Map(u),decoupled:!0,isHoistBorder:g,hoistPriority:f,isWorkspace:h,hoistedFrom:new Map(p),hoistedTo:new Map(d)},I=m.dependencies.get(r);return I&&I.ident==m.ident&&m.dependencies.set(r,m),t.dependencies.set(m.name,m),m},Y5e=(t,e)=>{let r=new Map([[t.name,[t.ident]]]);for(let n of t.dependencies.values())t.peerNames.has(n.name)||r.set(n.name,[n.ident]);let i=Array.from(e.keys());i.sort((n,s)=>{let o=e.get(n),a=e.get(s);return a.hoistPriority!==o.hoistPriority?a.hoistPriority-o.hoistPriority:a.peerDependents.size!==o.peerDependents.size?a.peerDependents.size-o.peerDependents.size:a.dependents.size-o.dependents.size});for(let n of i){let s=n.substring(0,n.indexOf("@",1)),o=n.substring(s.length+1);if(!t.peerNames.has(s)){let a=r.get(s);a||(a=[],r.set(s,a)),a.indexOf(o)<0&&a.push(o)}}return r},qL=t=>{let e=new Set,r=(i,n=new Set)=>{if(!n.has(i)){n.add(i);for(let s of i.peerNames)if(!t.peerNames.has(s)){let o=t.dependencies.get(s);o&&!e.has(o)&&r(o,n)}e.add(i)}};for(let i of t.dependencies.values())t.peerNames.has(i.name)||r(i);return e},YL=(t,e,r,i,n,s=new Set)=>{let o=e[e.length-1];if(s.has(o))return{anotherRoundNeeded:!1,isGraphChanged:!1};s.add(o);let a=J5e(o),l=Y5e(o,a),c=t==o?new Map:n.fastLookupPossible?G5e(e):j5e(e),u,g=!1,f=!1,h=new Map(Array.from(l.entries()).map(([d,m])=>[d,m[0]])),p=new Map;do{let d=q5e(t,e,r,c,h,l,i,p,n);d.isGraphChanged&&(f=!0),d.anotherRoundNeeded&&(g=!0),u=!1;for(let[m,I]of l)I.length>1&&!o.dependencies.has(m)&&(h.delete(m),I.shift(),h.set(m,I[0]),u=!0)}while(u);for(let d of o.dependencies.values())if(!o.peerNames.has(d.name)&&!r.has(d.locator)){r.add(d.locator);let m=YL(t,[...e,d],r,p,n);m.isGraphChanged&&(f=!0),m.anotherRoundNeeded&&(g=!0),r.delete(d.locator)}return{anotherRoundNeeded:g,isGraphChanged:f}},W5e=(t,e,r,i,n,s,o,a,{outputReason:l,fastLookupPossible:c})=>{let u,g=null,f=new Set;l&&(u=`${Array.from(e).map(m=>wi(m)).join("\u2192")}`);let h=r[r.length-1],d=!(i.ident===h.ident);if(l&&!d&&(g="- self-reference"),d&&(d=!i.isWorkspace,l&&!d&&(g="- workspace")),d&&(d=!h.isWorkspace||h.hoistedFrom.has(i.name)||e.size===1,l&&!d&&(g=h.reasons.get(i.name))),d&&(d=!t.peerNames.has(i.name),l&&!d&&(g=`- cannot shadow peer: ${wi(t.originalDependencies.get(i.name).locator)} at ${u}`)),d){let m=!1,I=n.get(i.name);if(m=!I||I.ident===i.ident,l&&!m&&(g=`- filled by: ${wi(I.locator)} at ${u}`),m)for(let B=r.length-1;B>=1;B--){let R=r[B].dependencies.get(i.name);if(R&&R.ident!==i.ident){m=!1;let H=a.get(h);H||(H=new Set,a.set(h,H)),H.add(i.name),l&&(g=`- filled by ${wi(R.locator)} at ${r.slice(0,B).map(L=>wi(L.locator)).join("\u2192")}`);break}}d=m}if(d&&(d=s.get(i.name)===i.ident,l&&!d&&(g=`- filled by: ${wi(o.get(i.name)[0])} at ${u}`)),d){let m=!0,I=new Set(i.peerNames);for(let B=r.length-1;B>=1;B--){let b=r[B];for(let R of I){if(b.peerNames.has(R)&&b.originalDependencies.has(R))continue;let H=b.dependencies.get(R);H&&t.dependencies.get(R)!==H&&(B===r.length-1?f.add(H):(f=null,m=!1,l&&(g=`- peer dependency ${wi(H.locator)} from parent ${wi(b.locator)} was not hoisted to ${u}`))),I.delete(R)}if(!m)break}d=m}if(d&&!c)for(let m of i.hoistedDependencies.values()){let I=n.get(m.name);if(!I||m.ident!==I.ident){d=!1,l&&(g=`- previously hoisted dependency mismatch, needed: ${wi(m.locator)}, available: ${wi(I==null?void 0:I.locator)}`);break}}return f!==null&&f.size>0?{isHoistable:2,dependsOn:f,reason:g}:{isHoistable:d?0:1,reason:g}},q5e=(t,e,r,i,n,s,o,a,l)=>{let c=e[e.length-1],u=new Set,g=!1,f=!1,h=(m,I,B,b)=>{if(u.has(B))return;let R=[...I,B.locator],H=new Map,L=new Map;for(let q of qL(B)){let A=W5e(c,r,[c,...m,B],q,i,n,s,a,{outputReason:l.debugLevel>=2,fastLookupPossible:l.fastLookupPossible});if(L.set(q,A),A.isHoistable===2)for(let V of A.dependsOn){let W=H.get(V.name)||new Set;W.add(q.name),H.set(V.name,W)}}let K=new Set,J=(q,A,V)=>{if(!K.has(q)){K.add(q),L.set(q,{isHoistable:1,reason:V});for(let W of H.get(q.name)||[])J(B.dependencies.get(W),A,l.debugLevel>=2?`- peer dependency ${wi(q.locator)} from parent ${wi(B.locator)} was not hoisted`:"")}};for(let[q,A]of L)A.isHoistable===1&&J(q,A,A.reason);for(let q of L.keys())if(!K.has(q)){f=!0;let A=o.get(B);A&&A.has(q.name)&&(g=!0),B.dependencies.delete(q.name),B.hoistedDependencies.set(q.name,q),B.reasons.delete(q.name);let V=c.dependencies.get(q.name);if(l.debugLevel>=2){let W=Array.from(I).concat([B.locator]).map(F=>wi(F)).join("\u2192"),X=c.hoistedFrom.get(q.name);X||(X=[],c.hoistedFrom.set(q.name,X)),X.push(W),B.hoistedTo.set(q.name,Array.from(e).map(F=>wi(F.locator)).join("\u2192"))}if(!V)c.ident!==q.ident&&(c.dependencies.set(q.name,q),b.add(q));else for(let W of q.references)V.references.add(W)}if(l.check){let q=Lle(t);if(q)throw new Error(`${q}, after hoisting dependencies of ${[c,...m,B].map(A=>wi(A.locator)).join("\u2192")}: +${zC(t)}`)}let ne=qL(B);for(let q of ne)if(K.has(q)){let A=L.get(q);if((n.get(q.name)===q.ident||!B.reasons.has(q.name))&&A.isHoistable!==0&&B.reasons.set(q.name,A.reason),!q.isHoistBorder&&R.indexOf(q.locator)<0){u.add(B);let W=Mle(B,q);h([...m,B],[...I,B.locator],W,d),u.delete(B)}}},p,d=new Set(qL(c));do{p=d,d=new Set;for(let m of p){if(m.locator===c.locator||m.isHoistBorder)continue;let I=Mle(c,m);h([],Array.from(r),I,d)}}while(d.size>0);return{anotherRoundNeeded:g,isGraphChanged:f}},Lle=t=>{let e=[],r=new Set,i=new Set,n=(s,o,a)=>{if(r.has(s)||(r.add(s),i.has(s)))return;let l=new Map(o);for(let c of s.dependencies.values())s.peerNames.has(c.name)||l.set(c.name,c);for(let c of s.originalDependencies.values()){let u=l.get(c.name),g=()=>`${Array.from(i).concat([s]).map(f=>wi(f.locator)).join("\u2192")}`;if(s.peerNames.has(c.name)){let f=o.get(c.name);(f!==u||!f||f.ident!==c.ident)&&e.push(`${g()} - broken peer promise: expected ${c.ident} but found ${f&&f.ident}`)}else{let f=a.hoistedFrom.get(s.name),h=s.hoistedTo.get(c.name),p=`${f?` hoisted from ${f.join(", ")}`:""}`,d=`${h?` hoisted to ${h}`:""}`,m=`${g()}${p}`;u?u.ident!==c.ident&&e.push(`${m} - broken require promise for ${c.name}${d}: expected ${c.ident}, but found: ${u.ident}`):e.push(`${m} - broken require promise: no required dependency ${c.name}${d} found`)}}i.add(s);for(let c of s.dependencies.values())s.peerNames.has(c.name)||n(c,l,s);i.delete(s)};return n(t,t.dependencies,t),e.join(` +`)},U5e=(t,e)=>{let{identName:r,name:i,reference:n,peerNames:s}=t,o={name:i,references:new Set([n]),locator:jL(r,n),ident:Nle(r,n),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(s),reasons:new Map,decoupled:!0,isHoistBorder:!0,hoistPriority:0,isWorkspace:!0,hoistedFrom:new Map,hoistedTo:new Map},a=new Map([[t,o]]),l=(c,u)=>{let g=a.get(c),f=!!g;if(!g){let{name:h,identName:p,reference:d,peerNames:m,hoistPriority:I,isWorkspace:B}=c,b=e.hoistingLimits.get(u.locator);g={name:h,references:new Set([d]),locator:jL(p,d),ident:Nle(p,d),dependencies:new Map,originalDependencies:new Map,hoistedDependencies:new Map,peerNames:new Set(m),reasons:new Map,decoupled:!0,isHoistBorder:b?b.has(h):!1,hoistPriority:I||0,isWorkspace:B||!1,hoistedFrom:new Map,hoistedTo:new Map},a.set(c,g)}if(u.dependencies.set(c.name,g),u.originalDependencies.set(c.name,g),f){let h=new Set,p=d=>{if(!h.has(d)){h.add(d),d.decoupled=!1;for(let m of d.dependencies.values())d.peerNames.has(m.name)||p(m)}};p(g)}else for(let h of c.dependencies)l(h,g)};for(let c of t.dependencies)l(c,o);return o},JL=t=>t.substring(0,t.indexOf("@",1)),H5e=t=>{let e={name:t.name,identName:JL(t.locator),references:new Set(t.references),dependencies:new Set},r=new Set([t]),i=(n,s,o)=>{let a=r.has(n),l;if(s===n)l=o;else{let{name:c,references:u,locator:g}=n;l={name:c,identName:JL(g),references:u,dependencies:new Set}}if(o.dependencies.add(l),!a){r.add(n);for(let c of n.dependencies.values())n.peerNames.has(c.name)||i(c,n,l);r.delete(n)}};for(let n of t.dependencies.values())i(n,t,e);return e},J5e=t=>{let e=new Map,r=new Set([t]),i=o=>`${o.name}@${o.ident}`,n=o=>{let a=i(o),l=e.get(a);return l||(l={dependents:new Set,peerDependents:new Set,hoistPriority:0},e.set(a,l)),l},s=(o,a)=>{let l=!!r.has(a);if(n(a).dependents.add(o.ident),!l){r.add(a);for(let u of a.dependencies.values()){let g=n(u);g.hoistPriority=Math.max(g.hoistPriority,u.hoistPriority),a.peerNames.has(u.name)?g.peerDependents.add(a.ident):s(a,u)}}};for(let o of t.dependencies.values())t.peerNames.has(o.name)||s(t,o);return e},wi=t=>{if(!t)return"none";let e=t.indexOf("@",1),r=t.substring(0,e);r.endsWith("$wsroot$")&&(r=`wh:${r.replace("$wsroot$","")}`);let i=t.substring(e+1);if(i==="workspace:.")return".";if(i){let n=(i.indexOf("#")>0?i.split("#")[1]:i).replace("npm:","");return i.startsWith("virtual")&&(r=`v:${r}`),n.startsWith("workspace")&&(r=`w:${r}`,n=""),`${r}${n?`@${n}`:""}`}else return`${r}`},Ole=5e4,zC=t=>{let e=0,r=(n,s,o="")=>{if(e>Ole||s.has(n))return"";e++;let a=Array.from(n.dependencies.values()).sort((c,u)=>c.name.localeCompare(u.name)),l="";s.add(n);for(let c=0;c":"")+(f!==u.name?`a:${u.name}:`:"")+wi(u.locator)+(g?` ${g}`:"")+(u!==n&&h.length>0?`, hoisted from: ${h.join(", ")}`:"")} +`,l+=r(u,s,`${o}${cOle?` +Tree is too large, part of the tree has been dunped +`:"")};var Js;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Js||(Js={}));var Sn;(function(i){i.WORKSPACES="workspaces",i.DEPENDENCIES="dependencies",i.NONE="none"})(Sn||(Sn={}));var Kle="node_modules",Hc="$wsroot$";var VC=(t,e)=>{let{packageTree:r,hoistingLimits:i,errors:n,preserveSymlinksRequired:s}=z5e(t,e),o=null;if(n.length===0){let a=Tle(r,{hoistingLimits:i});o=V5e(t,a,e)}return{tree:o,errors:n,preserveSymlinksRequired:s}},ms=t=>`${t.name}@${t.reference}`,WL=t=>{let e=new Map;for(let[r,i]of t.entries())if(!i.dirList){let n=e.get(i.locator);n||(n={target:i.target,linkType:i.linkType,locations:[],aliases:i.aliases},e.set(i.locator,n)),n.locations.push(r)}for(let r of e.values())r.locations=r.locations.sort((i,n)=>{let s=i.split(v.delimiter).length,o=n.split(v.delimiter).length;return s!==o?o-s:n.localeCompare(i)});return e},Ule=(t,e)=>{let r=S.isVirtualLocator(t)?S.devirtualizeLocator(t):t,i=S.isVirtualLocator(e)?S.devirtualizeLocator(e):e;return S.areLocatorsEqual(r,i)},zL=(t,e,r,i)=>{if(t.linkType!==Js.SOFT)return!1;let n=M.toPortablePath(r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation);return v.contains(i,n)===null},_5e=t=>{let e=t.getPackageInformation(t.topLevel);if(e===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");if(t.findPackageLocator(e.packageLocation)===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let i=M.toPortablePath(e.packageLocation.slice(0,-1)),n=new Map,s={children:new Map},o=t.getDependencyTreeRoots(),a=new Map,l=new Set,c=(f,h)=>{let p=ms(f);if(l.has(p))return;l.add(p);let d=t.getPackageInformation(f);if(d){let m=h?ms(h):"";if(ms(f)!==m&&d.linkType===Js.SOFT&&!zL(d,f,t,i)){let I=Hle(d,f,t);(!a.get(I)||f.reference.startsWith("workspace:"))&&a.set(I,f)}for(let[I,B]of d.packageDependencies)B!==null&&(d.packagePeers.has(I)||c(t.getLocator(I,B),f))}};for(let f of o)c(f,null);let u=i.split(v.sep);for(let f of a.values()){let h=t.getPackageInformation(f),d=M.toPortablePath(h.packageLocation.slice(0,-1)).split(v.sep).slice(u.length),m=s;for(let I of d){let B=m.children.get(I);B||(B={children:new Map},m.children.set(I,B)),m=B}m.workspaceLocator=f}let g=(f,h)=>{if(f.workspaceLocator){let p=ms(h),d=n.get(p);d||(d=new Set,n.set(p,d)),d.add(f.workspaceLocator)}for(let p of f.children.values())g(p,f.workspaceLocator||h)};for(let f of s.children.values())g(f,s.workspaceLocator);return n},z5e=(t,e)=>{let r=[],i=!1,n=new Map,s=_5e(t),o=t.getPackageInformation(t.topLevel);if(o===null)throw new Error("Assertion failed: Expected the top-level package to have been registered");let a=t.findPackageLocator(o.packageLocation);if(a===null)throw new Error("Assertion failed: Expected the top-level package to have a physical locator");let l=M.toPortablePath(o.packageLocation.slice(0,-1)),c={name:a.name,identName:a.name,reference:a.reference,peerNames:o.packagePeers,dependencies:new Set,isWorkspace:!0},u=new Map,g=(h,p)=>`${ms(p)}:${h}`,f=(h,p,d,m,I,B,b,R)=>{var X,F;let H=g(h,d),L=u.get(H),K=!!L;!K&&d.name===a.name&&d.reference===a.reference&&(L=c,u.set(H,c));let J=zL(p,d,t,l);if(!L){let D=p.linkType===Js.SOFT&&d.name.endsWith(Hc);L={name:h,identName:d.name,reference:d.reference,dependencies:new Set,peerNames:D?new Set:p.packagePeers,isWorkspace:D},u.set(H,L)}let ne;if(J?ne=2:I.linkType===Js.SOFT?ne=1:ne=0,L.hoistPriority=Math.max(L.hoistPriority||0,ne),R&&!J){let D=ms({name:m.identName,reference:m.reference}),he=n.get(D)||new Set;n.set(D,he),he.add(L.name)}let q=new Map(p.packageDependencies);if(e.project){let D=e.project.workspacesByCwd.get(M.toPortablePath(p.packageLocation.slice(0,-1)));if(D){let he=new Set([...Array.from(D.manifest.peerDependencies.values(),pe=>S.stringifyIdent(pe)),...Array.from(D.manifest.peerDependenciesMeta.keys())]);for(let pe of he)q.has(pe)||(q.set(pe,B.get(pe)||null),L.peerNames.add(pe))}}let A=ms({name:d.name.replace(Hc,""),reference:d.reference}),V=s.get(A);if(V)for(let D of V)q.set(`${D.name}${Hc}`,D.reference);(p!==I||p.linkType!==Js.SOFT||!e.selfReferencesByCwd||e.selfReferencesByCwd.get(b))&&m.dependencies.add(L);let W=d!==a&&p.linkType===Js.SOFT&&!d.name.endsWith(Hc)&&!J;if(!K&&!W){let D=new Map;for(let[he,pe]of q)if(pe!==null){let Ne=t.getLocator(he,pe),Pe=t.getLocator(he.replace(Hc,""),pe),qe=t.getPackageInformation(Pe);if(qe===null)throw new Error("Assertion failed: Expected the package to have been registered");let re=zL(qe,Ne,t,l);if(e.validateExternalSoftLinks&&e.project&&re){qe.packageDependencies.size>0&&(i=!0);for(let[De,$]of qe.packageDependencies)if($!==null){let G=S.parseLocator(Array.isArray($)?`${$[0]}@${$[1]}`:`${De}@${$}`);if(ms(G)!==ms(Ne)){let Ce=q.get(De);if(Ce){let ee=S.parseLocator(Array.isArray(Ce)?`${Ce[0]}@${Ce[1]}`:`${De}@${Ce}`);Ule(ee,G)||r.push({messageName:z.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${S.prettyIdent(e.project.configuration,S.parseIdent(Ne.name))} into ${S.prettyLocator(e.project.configuration,S.parseLocator(`${d.name}@${d.reference}`))} dependency ${S.prettyLocator(e.project.configuration,G)} conflicts with parent dependency ${S.prettyLocator(e.project.configuration,ee)}`})}else{let ee=D.get(De);if(ee){let Ue=ee.target,Oe=S.parseLocator(Array.isArray(Ue)?`${Ue[0]}@${Ue[1]}`:`${De}@${Ue}`);Ule(Oe,G)||r.push({messageName:z.NM_CANT_INSTALL_EXTERNAL_SOFT_LINK,text:`Cannot link ${S.prettyIdent(e.project.configuration,S.parseIdent(Ne.name))} into ${S.prettyLocator(e.project.configuration,S.parseLocator(`${d.name}@${d.reference}`))} dependency ${S.prettyLocator(e.project.configuration,G)} conflicts with dependency ${S.prettyLocator(e.project.configuration,Oe)} from sibling portal ${S.prettyIdent(e.project.configuration,S.parseIdent(ee.portal.name))}`})}else D.set(De,{target:G.reference,portal:Ne})}}}}let se=(X=e.hoistingLimitsByCwd)==null?void 0:X.get(b),be=re?b:v.relative(l,M.toPortablePath(qe.packageLocation))||Se.dot,ae=(F=e.hoistingLimitsByCwd)==null?void 0:F.get(be),Ae=se===Sn.DEPENDENCIES||ae===Sn.DEPENDENCIES||ae===Sn.WORKSPACES;f(ms(Ne)===ms(d)?h:he,qe,Ne,L,p,q,be,Ae)}}};return f(a.name,o,a,c,o,o.packageDependencies,Se.dot,!1),{packageTree:c,hoistingLimits:n,errors:r,preserveSymlinksRequired:i}};function Hle(t,e,r){let i=r.resolveVirtual&&e.reference&&e.reference.startsWith("virtual:")?r.resolveVirtual(t.packageLocation):t.packageLocation;return M.toPortablePath(i||t.packageLocation)}function X5e(t,e,r){let i=e.getLocator(t.name.replace(Hc,""),t.reference),n=e.getPackageInformation(i);if(n===null)throw new Error("Assertion failed: Expected the package to be registered");let s,o;return r.pnpifyFs?(o=M.toPortablePath(n.packageLocation),s=Js.SOFT):(o=Hle(n,t,e),s=n.linkType),{linkType:s,target:o}}var V5e=(t,e,r)=>{let i=new Map,n=(u,g,f)=>{let{linkType:h,target:p}=X5e(u,t,r);return{locator:ms(u),nodePath:g,target:p,linkType:h,aliases:f}},s=u=>{let[g,f]=u.split("/");return f?{scope:kr(g),name:kr(f)}:{scope:null,name:kr(g)}},o=new Set,a=(u,g,f)=>{if(!o.has(u)){o.add(u);for(let h of u.dependencies){if(h===u)continue;let p=Array.from(h.references).sort(),d={name:h.identName,reference:p[0]},{name:m,scope:I}=s(h.name),B=I?[I,m]:[m],b=v.join(g,Kle),R=v.join(b,...B),H=`${f}/${d.name}`,L=n(d,f,p.slice(1)),K=!1;if(L.linkType===Js.SOFT&&r.project){let J=r.project.workspacesByCwd.get(L.target.slice(0,-1));K=!!(J&&!J.manifest.name)}if(!h.name.endsWith(Hc)&&!K){let J=i.get(R);if(J){if(J.dirList)throw new Error(`Assertion failed: ${R} cannot merge dir node with leaf node`);{let V=S.parseLocator(J.locator),W=S.parseLocator(L.locator);if(J.linkType!==L.linkType)throw new Error(`Assertion failed: ${R} cannot merge nodes with different link types ${J.nodePath}/${S.stringifyLocator(V)} and ${f}/${S.stringifyLocator(W)}`);if(V.identHash!==W.identHash)throw new Error(`Assertion failed: ${R} cannot merge nodes with different idents ${J.nodePath}/${S.stringifyLocator(V)} and ${f}/s${S.stringifyLocator(W)}`);L.aliases=[...L.aliases,...J.aliases,S.parseLocator(J.locator).reference]}}i.set(R,L);let ne=R.split("/"),q=ne.indexOf(Kle),A=ne.length-1;for(;q>=0&&A>q;){let V=M.toPortablePath(ne.slice(0,A).join(v.sep)),W=kr(ne[A]),X=i.get(V);if(!X)i.set(V,{dirList:new Set([W])});else if(X.dirList){if(X.dirList.has(W))break;X.dirList.add(W)}A--}}a(h,L.linkType===Js.SOFT?L.target:R,H)}}},l=n({name:e.name,reference:Array.from(e.references)[0]},"",[]),c=l.target;return i.set(c,l),a(e,c,""),i};var oT={};it(oT,{PnpInstaller:()=>Cf,PnpLinker:()=>jc,default:()=>m6e,getPnpPath:()=>qA,jsInstallUtils:()=>Ws,pnpUtils:()=>nT,quotePathIfNeeded:()=>uce});var lce=ie(Or()),cce=ie(require("url"));var Gle;(function(r){r.HARD="HARD",r.SOFT="SOFT"})(Gle||(Gle={}));var Ht;(function(f){f.DEFAULT="DEFAULT",f.TOP_LEVEL="TOP_LEVEL",f.FALLBACK_EXCLUSION_LIST="FALLBACK_EXCLUSION_LIST",f.FALLBACK_EXCLUSION_ENTRIES="FALLBACK_EXCLUSION_ENTRIES",f.FALLBACK_EXCLUSION_DATA="FALLBACK_EXCLUSION_DATA",f.PACKAGE_REGISTRY_DATA="PACKAGE_REGISTRY_DATA",f.PACKAGE_REGISTRY_ENTRIES="PACKAGE_REGISTRY_ENTRIES",f.PACKAGE_STORE_DATA="PACKAGE_STORE_DATA",f.PACKAGE_STORE_ENTRIES="PACKAGE_STORE_ENTRIES",f.PACKAGE_INFORMATION_DATA="PACKAGE_INFORMATION_DATA",f.PACKAGE_DEPENDENCIES="PACKAGE_DEPENDENCIES",f.PACKAGE_DEPENDENCY="PACKAGE_DEPENDENCY"})(Ht||(Ht={}));var jle={[Ht.DEFAULT]:{collapsed:!1,next:{["*"]:Ht.DEFAULT}},[Ht.TOP_LEVEL]:{collapsed:!1,next:{fallbackExclusionList:Ht.FALLBACK_EXCLUSION_LIST,packageRegistryData:Ht.PACKAGE_REGISTRY_DATA,["*"]:Ht.DEFAULT}},[Ht.FALLBACK_EXCLUSION_LIST]:{collapsed:!1,next:{["*"]:Ht.FALLBACK_EXCLUSION_ENTRIES}},[Ht.FALLBACK_EXCLUSION_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.FALLBACK_EXCLUSION_DATA}},[Ht.FALLBACK_EXCLUSION_DATA]:{collapsed:!0,next:{["*"]:Ht.DEFAULT}},[Ht.PACKAGE_REGISTRY_DATA]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_REGISTRY_ENTRIES}},[Ht.PACKAGE_REGISTRY_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.PACKAGE_STORE_DATA}},[Ht.PACKAGE_STORE_DATA]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_STORE_ENTRIES}},[Ht.PACKAGE_STORE_ENTRIES]:{collapsed:!0,next:{["*"]:Ht.PACKAGE_INFORMATION_DATA}},[Ht.PACKAGE_INFORMATION_DATA]:{collapsed:!1,next:{packageDependencies:Ht.PACKAGE_DEPENDENCIES,["*"]:Ht.DEFAULT}},[Ht.PACKAGE_DEPENDENCIES]:{collapsed:!1,next:{["*"]:Ht.PACKAGE_DEPENDENCY}},[Ht.PACKAGE_DEPENDENCY]:{collapsed:!0,next:{["*"]:Ht.DEFAULT}}};function Z5e(t,e,r){let i="";i+="[";for(let n=0,s=t.length;ns(o)));let n=r.map((s,o)=>o);return n.sort((s,o)=>{for(let a of i){let l=a[s]a[o]?1:0;if(l!==0)return l}return 0}),n.map(s=>r[s])}function r6e(t){let e=new Map,r=_C(t.fallbackExclusionList||[],[({name:i,reference:n})=>i,({name:i,reference:n})=>n]);for(let{name:i,reference:n}of r){let s=e.get(i);typeof s=="undefined"&&e.set(i,s=new Set),s.add(n)}return Array.from(e).map(([i,n])=>[i,Array.from(n)])}function i6e(t){return _C(t.fallbackPool||[],([e])=>e)}function n6e(t){let e=[];for(let[r,i]of _C(t.packageRegistry,([n])=>n===null?"0":`1${n}`)){let n=[];e.push([r,n]);for(let[s,{packageLocation:o,packageDependencies:a,packagePeers:l,linkType:c,discardFromLookup:u}]of _C(i,([g])=>g===null?"0":`1${g}`)){let g=[];r!==null&&s!==null&&!a.has(r)&&g.push([r,s]);for(let[p,d]of _C(a.entries(),([m])=>m))g.push([p,d]);let f=l&&l.size>0?Array.from(l):void 0,h=u||void 0;n.push([s,{packageLocation:o,packageDependencies:g,packagePeers:f,linkType:c,discardFromLookup:h}])}}return e}function XC(t){return{__info:["This file is automatically generated. Do not touch it, or risk","your modifications being lost. We also recommend you not to read","it either without using the @yarnpkg/pnp package, as the data layout","is entirely unspecified and WILL change from a version to another."],dependencyTreeRoots:t.dependencyTreeRoots,enableTopLevelFallback:t.enableTopLevelFallback||!1,ignorePatternData:t.ignorePattern||null,fallbackExclusionList:r6e(t),fallbackPool:i6e(t),packageRegistryData:n6e(t)}}var zle=ie(Wle());function Vle(t,e){return[t?`${t} +`:"",`/* eslint-disable */ + +`,`try { +`,` Object.freeze({}).detectStrictMode = true; +`,`} catch (error) { +`," throw new Error(`The whole PnP file got strict-mode-ified, which is known to break (Emscripten libraries aren't strict mode). This usually happens when the file goes through Babel.`);\n",`} +`,` +`,`var __non_webpack_module__ = module; +`,` +`,`function $$SETUP_STATE(hydrateRuntimeState, basePath) { +`,e.replace(/^/gm," "),`} +`,` +`,(0,zle.default)()].join("")}function s6e(t){return JSON.stringify(t,null,2)}function o6e(t){return[`return hydrateRuntimeState(${qle(t)}, {basePath: basePath || __dirname}); +`].join("")}function a6e(t){return[`var path = require('path'); +`,`var dataLocation = path.resolve(__dirname, ${JSON.stringify(t)}); +`,`return hydrateRuntimeState(require(dataLocation), {basePath: basePath || path.dirname(dataLocation)}); +`].join("")}function _le(t){let e=XC(t),r=o6e(e);return Vle(t.shebang,r)}function Xle(t){let e=XC(t),r=a6e(t.dataLocation),i=Vle(t.shebang,r);return{dataFile:s6e(e),loaderFile:i}}var tce=ie(require("fs")),u6e=ie(require("path")),rce=ie(require("util"));function _L(t,{basePath:e}){let r=M.toPortablePath(e),i=v.resolve(r),n=t.ignorePatternData!==null?new RegExp(t.ignorePatternData):null,s=new Map,o=new Map(t.packageRegistryData.map(([g,f])=>[g,new Map(f.map(([h,p])=>{var b;if(g===null!=(h===null))throw new Error("Assertion failed: The name and reference should be null, or neither should");let d=(b=p.discardFromLookup)!=null?b:!1,m={name:g,reference:h},I=s.get(p.packageLocation);I?(I.discardFromLookup=I.discardFromLookup&&d,d||(I.locator=m)):s.set(p.packageLocation,{locator:m,discardFromLookup:d});let B=null;return[h,{packageDependencies:new Map(p.packageDependencies),packagePeers:new Set(p.packagePeers),linkType:p.linkType,discardFromLookup:d,get packageLocation(){return B||(B=v.join(i,p.packageLocation))}}]}))])),a=new Map(t.fallbackExclusionList.map(([g,f])=>[g,new Set(f)])),l=new Map(t.fallbackPool),c=t.dependencyTreeRoots,u=t.enableTopLevelFallback;return{basePath:r,dependencyTreeRoots:c,enableTopLevelFallback:u,fallbackExclusionList:a,fallbackPool:l,ignorePattern:n,packageLocatorsByLocations:s,packageRegistry:o}}var df=ie(require("module")),ece=ie($le()),ZL=ie(require("util"));var ur;(function(l){l.API_ERROR="API_ERROR",l.BUILTIN_NODE_RESOLUTION_FAILED="BUILTIN_NODE_RESOLUTION_FAILED",l.MISSING_DEPENDENCY="MISSING_DEPENDENCY",l.MISSING_PEER_DEPENDENCY="MISSING_PEER_DEPENDENCY",l.QUALIFIED_PATH_RESOLUTION_FAILED="QUALIFIED_PATH_RESOLUTION_FAILED",l.INTERNAL="INTERNAL",l.UNDECLARED_DEPENDENCY="UNDECLARED_DEPENDENCY",l.UNSUPPORTED="UNSUPPORTED"})(ur||(ur={}));var c6e=new Set([ur.BUILTIN_NODE_RESOLUTION_FAILED,ur.MISSING_DEPENDENCY,ur.MISSING_PEER_DEPENDENCY,ur.QUALIFIED_PATH_RESOLUTION_FAILED,ur.UNDECLARED_DEPENDENCY]);function ui(t,e,r={}){let i=c6e.has(t)?"MODULE_NOT_FOUND":t,n={configurable:!0,writable:!0,enumerable:!1};return Object.defineProperties(new Error(e),{code:_(P({},n),{value:i}),pnpCode:_(P({},n),{value:t}),data:_(P({},n),{value:r})})}function YA(t){return M.normalize(M.fromPortablePath(t))}function $L(t,e){let r=Number(process.env.PNP_ALWAYS_WARN_ON_FALLBACK)>0,i=Number(process.env.PNP_DEBUG_LEVEL),n=new Set(df.Module.builtinModules||Object.keys(process.binding("natives"))),s=re=>n.has(re)||re.startsWith("node:"),o=/^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/,a=/^(\/|\.{1,2}(\/|$))/,l=/\/$/,c=/^\.{0,2}\//,u={name:null,reference:null},g=[],f=new Set;if(t.enableTopLevelFallback===!0&&g.push(u),e.compatibilityMode!==!1)for(let re of["react-scripts","gatsby"]){let se=t.packageRegistry.get(re);if(se)for(let be of se.keys()){if(be===null)throw new Error("Assertion failed: This reference shouldn't be null");g.push({name:re,reference:be})}}let{ignorePattern:h,packageRegistry:p,packageLocatorsByLocations:d}=t;function m(re,se){return{fn:re,args:se,error:null,result:null}}function I(re){var De,$,G,Ce,ee,Ue;let se=(G=($=(De=process.stderr)==null?void 0:De.hasColors)==null?void 0:$.call(De))!=null?G:process.stdout.isTTY,be=(Oe,vt)=>`[${Oe}m${vt}`,ae=re.error;console.error(ae?be("31;1",`\u2716 ${(Ce=re.error)==null?void 0:Ce.message.replace(/\n.*/s,"")}`):be("33;1","\u203C Resolution")),re.args.length>0&&console.error();for(let Oe of re.args)console.error(` ${be("37;1","In \u2190")} ${(0,ZL.inspect)(Oe,{colors:se,compact:!0})}`);re.result&&(console.error(),console.error(` ${be("37;1","Out \u2192")} ${(0,ZL.inspect)(re.result,{colors:se,compact:!0})}`));let Ae=(Ue=(ee=new Error().stack.match(/(?<=^ +)at.*/gm))==null?void 0:ee.slice(2))!=null?Ue:[];if(Ae.length>0){console.error();for(let Oe of Ae)console.error(` ${be("38;5;244",Oe)}`)}console.error()}function B(re,se){if(e.allowDebug===!1)return se;if(Number.isFinite(i)){if(i>=2)return(...be)=>{let ae=m(re,be);try{return ae.result=se(...be)}catch(Ae){throw ae.error=Ae}finally{I(ae)}};if(i>=1)return(...be)=>{try{return se(...be)}catch(ae){let Ae=m(re,be);throw Ae.error=ae,I(Ae),ae}}}return se}function b(re){let se=W(re);if(!se)throw ui(ur.INTERNAL,"Couldn't find a matching entry in the dependency tree for the specified parent (this is probably an internal error)");return se}function R(re){if(re.name===null)return!0;for(let se of t.dependencyTreeRoots)if(se.name===re.name&&se.reference===re.reference)return!0;return!1}let H=new Set(["default","node","require"]);function L(re,se=H){let be=D(v.join(re,"internal.js"),{resolveIgnored:!0,includeDiscardFromLookup:!0});if(be===null)throw ui(ur.INTERNAL,`The locator that owns the "${re}" path can't be found inside the dependency tree (this is probably an internal error)`);let{packageLocation:ae}=b(be),Ae=v.join(ae,wt.manifest);if(!e.fakeFs.existsSync(Ae))return null;let De=JSON.parse(e.fakeFs.readFileSync(Ae,"utf8")),$=v.contains(ae,re);if($===null)throw ui(ur.INTERNAL,"unqualifiedPath doesn't contain the packageLocation (this is probably an internal error)");c.test($)||($=`./${$}`);let G=(0,ece.resolve)(De,v.normalize($),{conditions:se,unsafe:!0});return typeof G=="string"?v.join(ae,G):null}function K(re,se,{extensions:be}){let ae;try{se.push(re),ae=e.fakeFs.statSync(re)}catch(Ae){}if(ae&&!ae.isDirectory())return e.fakeFs.realpathSync(re);if(ae&&ae.isDirectory()){let Ae;try{Ae=JSON.parse(e.fakeFs.readFileSync(v.join(re,wt.manifest),"utf8"))}catch($){}let De;if(Ae&&Ae.main&&(De=v.resolve(re,Ae.main)),De&&De!==re){let $=K(De,se,{extensions:be});if($!==null)return $}}for(let Ae=0,De=be.length;Ae{let G=JSON.stringify($.name);if(ae.has(G))return;ae.add(G);let Ce=X($);for(let ee of Ce)if(b(ee).packagePeers.has(re))Ae(ee);else{let Oe=be.get(ee.name);typeof Oe=="undefined"&&be.set(ee.name,Oe=new Set),Oe.add(ee.reference)}};Ae(se);let De=[];for(let $ of[...be.keys()].sort())for(let G of[...be.get($)].sort())De.push({name:$,reference:G});return De}function D(re,{resolveIgnored:se=!1,includeDiscardFromLookup:be=!1}={}){if(q(re)&&!se)return null;let ae=v.relative(t.basePath,re);ae.match(a)||(ae=`./${ae}`),ae.endsWith("/")||(ae=`${ae}/`);do{let Ae=d.get(ae);if(typeof Ae=="undefined"||Ae.discardFromLookup&&!be){ae=ae.substring(0,ae.lastIndexOf("/",ae.length-2)+1);continue}return Ae.locator}while(ae!=="");return null}function he(re,se,{considerBuiltins:be=!0}={}){if(re==="pnpapi")return M.toPortablePath(e.pnpapiResolution);if(be&&s(re))return null;let ae=YA(re),Ae=se&&YA(se);if(se&&q(se)&&(!v.isAbsolute(re)||D(re)===null)){let G=ne(re,se);if(G===!1)throw ui(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer was explicitely ignored by the regexp) + +Require request: "${ae}" +Required by: ${Ae} +`,{request:ae,issuer:Ae});return M.toPortablePath(G)}let De,$=re.match(o);if($){if(!se)throw ui(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:ae,issuer:Ae});let[,G,Ce]=$,ee=D(se);if(!ee){let yr=ne(re,se);if(yr===!1)throw ui(ur.BUILTIN_NODE_RESOLUTION_FAILED,`The builtin node resolution algorithm was unable to resolve the requested module (it didn't go through the pnp resolver because the issuer doesn't seem to be part of the Yarn-managed dependency tree). + +Require path: "${ae}" +Required by: ${Ae} +`,{request:ae,issuer:Ae});return M.toPortablePath(yr)}let Oe=b(ee).packageDependencies.get(G),vt=null;if(Oe==null&&ee.name!==null){let yr=t.fallbackExclusionList.get(ee.name);if(!yr||!yr.has(ee.reference)){for(let Qi=0,Go=g.length;QiR(Ki))?dt=ui(ur.MISSING_PEER_DEPENDENCY,`${ee.name} tried to access ${G} (a peer dependency) but it isn't provided by your application; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) +${yr.map(Ki=>`Ancestor breaking the chain: ${Ki.name}@${Ki.reference} +`).join("")} +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G,brokenAncestors:yr}):dt=ui(ur.MISSING_PEER_DEPENDENCY,`${ee.name} tried to access ${G} (a peer dependency) but it isn't provided by its ancestors; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) + +${yr.map(Ki=>`Ancestor breaking the chain: ${Ki.name}@${Ki.reference} +`).join("")} +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G,brokenAncestors:yr})}else Oe===void 0&&(!be&&s(re)?R(ee)?dt=ui(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${G}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${G} isn't otherwise declared in your dependencies, this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${Ae} +`,{request:ae,issuer:Ae,dependencyName:G}):dt=ui(ur.UNDECLARED_DEPENDENCY,`${ee.name} tried to access ${G}. While this module is usually interpreted as a Node builtin, your resolver is running inside a non-Node resolution context where such builtins are ignored. Since ${G} isn't otherwise declared in ${ee.name}'s dependencies, this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${Ae} +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G}):R(ee)?dt=ui(ur.UNDECLARED_DEPENDENCY,`Your application tried to access ${G}, but it isn't declared in your dependencies; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${Ae} +`,{request:ae,issuer:Ae,dependencyName:G}):dt=ui(ur.UNDECLARED_DEPENDENCY,`${ee.name} tried to access ${G}, but it isn't declared in its dependencies; this makes the require call ambiguous and unsound. + +Required package: ${G}${G!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) +`,{request:ae,issuer:Ae,issuerLocator:Object.assign({},ee),dependencyName:G}));if(Oe==null){if(vt===null||dt===null)throw dt||new Error("Assertion failed: Expected an error to have been set");Oe=vt;let yr=dt.message.replace(/\n.*/g,"");dt.message=yr,!f.has(yr)&&i!==0&&(f.add(yr),process.emitWarning(dt))}let ri=Array.isArray(Oe)?{name:Oe[0],reference:Oe[1]}:{name:G,reference:Oe},ii=b(ri);if(!ii.packageLocation)throw ui(ur.MISSING_DEPENDENCY,`A dependency seems valid but didn't get installed for some reason. This might be caused by a partial install, such as dev vs prod. + +Required package: ${ri.name}@${ri.reference}${ri.name!==ae?` (via "${ae}")`:""} +Required by: ${ee.name}@${ee.reference} (via ${Ae}) +`,{request:ae,issuer:Ae,dependencyLocator:Object.assign({},ri)});let an=ii.packageLocation;Ce?De=v.join(an,Ce):De=an}else if(v.isAbsolute(re))De=v.normalize(re);else{if(!se)throw ui(ur.API_ERROR,"The resolveToUnqualified function must be called with a valid issuer when the path isn't a builtin nor absolute",{request:ae,issuer:Ae});let G=v.resolve(se);se.match(l)?De=v.normalize(v.join(G,re)):De=v.normalize(v.join(v.dirname(G),re))}return v.normalize(De)}function pe(re,se,be=H){if(a.test(re))return se;let ae=L(se,be);return ae?v.normalize(ae):se}function Ne(re,{extensions:se=Object.keys(df.Module._extensions)}={}){let be=[],ae=K(re,be,{extensions:se});if(ae)return v.normalize(ae);{let Ae=YA(re),De=D(re);if(De){let{packageLocation:$}=b(De);if(!e.fakeFs.existsSync($)){let G=$.includes("/unplugged/")?"Required unplugged package missing from disk. This may happen when switching branches without running installs (unplugged packages must be fully materialized on disk to work).":"Required package missing from disk. If you keep your packages inside your repository then restarting the Node process may be enough. Otherwise, try to run an install first.";throw ui(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`${G} + +Missing package: ${De.name}@${De.reference} +Expected package location: ${YA($)} +`,{unqualifiedPath:Ae})}}throw ui(ur.QUALIFIED_PATH_RESOLUTION_FAILED,`Qualified path resolution failed - none of those files can be found on the disk. + +Source path: ${Ae} +${be.map($=>`Not found: ${YA($)} +`).join("")}`,{unqualifiedPath:Ae})}}function Pe(re,se,{considerBuiltins:be,extensions:ae,conditions:Ae}={}){let De=he(re,se,{considerBuiltins:be});if(re==="pnpapi")return De;if(De===null)return null;let $=()=>se!==null?q(se):!1,G=(!be||!s(re))&&!$()?pe(re,De,Ae):De;try{return Ne(G,{extensions:ae})}catch(Ce){throw Ce.pnpCode==="QUALIFIED_PATH_RESOLUTION_FAILED"&&Object.assign(Ce.data,{request:YA(re),issuer:se&&YA(se)}),Ce}}function qe(re){let se=v.normalize(re),be=Pr.resolveVirtual(se);return be!==se?be:null}return{VERSIONS:A,topLevel:V,getLocator:(re,se)=>Array.isArray(se)?{name:se[0],reference:se[1]}:{name:re,reference:se},getDependencyTreeRoots:()=>[...t.dependencyTreeRoots],getAllLocators(){let re=[];for(let[se,be]of p)for(let ae of be.keys())se!==null&&ae!==null&&re.push({name:se,reference:ae});return re},getPackageInformation:re=>{let se=W(re);if(se===null)return null;let be=M.fromPortablePath(se.packageLocation);return _(P({},se),{packageLocation:be})},findPackageLocator:re=>D(M.toPortablePath(re)),resolveToUnqualified:B("resolveToUnqualified",(re,se,be)=>{let ae=se!==null?M.toPortablePath(se):null,Ae=he(M.toPortablePath(re),ae,be);return Ae===null?null:M.fromPortablePath(Ae)}),resolveUnqualified:B("resolveUnqualified",(re,se)=>M.fromPortablePath(Ne(M.toPortablePath(re),se))),resolveRequest:B("resolveRequest",(re,se,be)=>{let ae=se!==null?M.toPortablePath(se):null,Ae=Pe(M.toPortablePath(re),ae,be);return Ae===null?null:M.fromPortablePath(Ae)}),resolveVirtual:B("resolveVirtual",re=>{let se=qe(M.toPortablePath(re));return se!==null?M.fromPortablePath(se):null})}}var ISt=(0,rce.promisify)(tce.readFile);var ice=(t,e,r)=>{let i=XC(t),n=_L(i,{basePath:e}),s=M.join(e,wt.pnpCjs);return $L(n,{fakeFs:r,pnpapiResolution:s})};var tT=ie(sce());var Ws={};it(Ws,{checkAndReportManifestCompatibility:()=>oce,extractBuildScripts:()=>Z0,getExtractHint:()=>rT,hasBindingGyp:()=>iT});function oce(t,e,{configuration:r,report:i}){return S.isPackageCompatible(t,{os:[process.platform],cpu:[process.arch]})?!0:(i==null||i.reportWarningOnce(z.INCOMPATIBLE_ARCHITECTURE,`${S.prettyLocator(r,t)} The ${process.platform}-${process.arch} architecture is incompatible with this module, ${e} skipped.`),!1)}function Z0(t,e,r,{configuration:i,report:n}){let s=[];for(let a of["preinstall","install","postinstall"])e.manifest.scripts.has(a)&&s.push([Gn.SCRIPT,a]);return!e.manifest.scripts.has("install")&&e.misc.hasBindingGyp&&s.push([Gn.SHELLCODE,"node-gyp rebuild"]),s.length===0?[]:t.linkType!==gt.HARD?(n==null||n.reportWarningOnce(z.SOFT_LINK_BUILD,`${S.prettyLocator(i,t)} lists build scripts, but is referenced through a soft link. Soft links don't support build scripts, so they'll be ignored.`),[]):r&&r.built===!1?(n==null||n.reportInfoOnce(z.BUILD_DISABLED,`${S.prettyLocator(i,t)} lists build scripts, but its build has been explicitly disabled through configuration.`),[]):!i.get("enableScripts")&&!r.built?(n==null||n.reportWarningOnce(z.DISABLED_BUILD_SCRIPTS,`${S.prettyLocator(i,t)} lists build scripts, but all build scripts have been disabled.`),[]):oce(t,"build",{configuration:i,report:n})?s:[]}var g6e=new Set([".exe",".h",".hh",".hpp",".c",".cc",".cpp",".java",".jar",".node"]);function rT(t){return t.packageFs.getExtractHint({relevantExtensions:g6e})}function iT(t){let e=v.join(t.prefixPath,"binding.gyp");return t.packageFs.existsSync(e)}var nT={};it(nT,{getUnpluggedPath:()=>ZC});function ZC(t,{configuration:e}){return v.resolve(e.get("pnpUnpluggedFolder"),S.slugifyLocator(t))}var f6e=new Set([S.makeIdent(null,"nan").identHash,S.makeIdent(null,"node-gyp").identHash,S.makeIdent(null,"node-pre-gyp").identHash,S.makeIdent(null,"node-addon-api").identHash,S.makeIdent(null,"fsevents").identHash]),jc=class{constructor(){this.mode="strict";this.pnpCache=new Map}supportsPackage(e,r){return!(r.project.configuration.get("nodeLinker")!=="pnp"||r.project.configuration.get("pnpMode")!==this.mode)}async findPackageLocation(e,r){let i=qA(r.project).cjs;if(!T.existsSync(i))throw new me(`The project in ${ue.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ue.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let n=de.getFactoryWithDefault(this.pnpCache,i,()=>de.dynamicRequire(i,{cachingStrategy:de.CachingStrategy.FsTime})),s={name:S.stringifyIdent(e),reference:e.reference},o=n.getPackageInformation(s);if(!o)throw new me(`Couldn't find ${S.prettyLocator(r.project.configuration,e)} in the currently installed PnP map - running an install might help`);return M.toPortablePath(o.packageLocation)}async findPackageLocator(e,r){let i=qA(r.project).cjs;if(!T.existsSync(i))return null;let s=de.getFactoryWithDefault(this.pnpCache,i,()=>de.dynamicRequire(i,{cachingStrategy:de.CachingStrategy.FsTime})).findPackageLocator(M.fromPortablePath(e));return s?S.makeLocator(S.parseIdent(s.name),s.reference):null}makeInstaller(e){return new Cf(e)}},Cf=class{constructor(e){this.opts=e;this.mode="strict";this.packageRegistry=new Map;this.virtualTemplates=new Map;this.isESMLoaderRequired=!1;this.customData={store:new Map};this.unpluggedPaths=new Set;this.opts=e}getCustomDataKey(){return JSON.stringify({name:"PnpInstaller",version:2})}attachCustomData(e){this.customData=e}async installPackage(e,r){let i=S.stringifyIdent(e),n=e.reference,s=!!this.opts.project.tryWorkspaceByLocator(e),o=S.isVirtualLocator(e),a=e.peerDependencies.size>0&&!o,l=!a&&!s,c=!a&&e.linkType!==gt.SOFT,u,g;if(l||c){let B=o?S.devirtualizeLocator(e):e;u=this.customData.store.get(B.locatorHash),typeof u=="undefined"&&(u=await h6e(r),e.linkType===gt.HARD&&this.customData.store.set(B.locatorHash,u)),u.manifest.type==="module"&&(this.isESMLoaderRequired=!0),g=this.opts.project.getDependencyMeta(B,e.version)}let f=l?Z0(e,u,g,{configuration:this.opts.project.configuration,report:this.opts.report}):[],h=c?await this.unplugPackageIfNeeded(e,u,r,g):r.packageFs;if(v.isAbsolute(r.prefixPath))throw new Error(`Assertion failed: Expected the prefix path (${r.prefixPath}) to be relative to the parent`);let p=v.resolve(h.getRealPath(),r.prefixPath),d=sT(this.opts.project.cwd,p),m=new Map,I=new Set;if(o){for(let B of e.peerDependencies.values())m.set(S.stringifyIdent(B),null),I.add(S.stringifyIdent(B));if(!s){let B=S.devirtualizeLocator(e);this.virtualTemplates.set(B.locatorHash,{location:sT(this.opts.project.cwd,Pr.resolveVirtual(p)),locator:B})}}return de.getMapWithDefault(this.packageRegistry,i).set(n,{packageLocation:d,packageDependencies:m,packagePeers:I,linkType:e.linkType,discardFromLookup:r.discardFromLookup||!1}),{packageLocation:p,buildDirective:f.length>0?f:null}}async attachInternalDependencies(e,r){let i=this.getPackageInformation(e);for(let[n,s]of r){let o=S.areIdentsEqual(n,s)?s.reference:[S.stringifyIdent(s),s.reference];i.packageDependencies.set(S.stringifyIdent(n),o)}}async attachExternalDependents(e,r){for(let i of r)this.getDiskInformation(i).packageDependencies.set(S.stringifyIdent(e),e.reference)}async finalizeInstall(){if(this.opts.project.configuration.get("pnpMode")!==this.mode)return;let e=qA(this.opts.project);if(T.existsSync(e.cjsLegacy)&&(this.opts.report.reportWarning(z.UNNAMED,`Removing the old ${ue.pretty(this.opts.project.configuration,wt.pnpJs,ue.Type.PATH)} file. You might need to manually update existing references to reference the new ${ue.pretty(this.opts.project.configuration,wt.pnpCjs,ue.Type.PATH)} file. If you use Editor SDKs, you'll have to rerun ${ue.pretty(this.opts.project.configuration,"yarn sdks",ue.Type.CODE)}.`),await T.removePromise(e.cjsLegacy)),this.isEsmEnabled()||await T.removePromise(e.esmLoader),this.opts.project.configuration.get("nodeLinker")!=="pnp"){await T.removePromise(e.cjs),await T.removePromise(this.opts.project.configuration.get("pnpDataPath")),await T.removePromise(e.esmLoader);return}for(let{locator:u,location:g}of this.virtualTemplates.values())de.getMapWithDefault(this.packageRegistry,S.stringifyIdent(u)).set(u.reference,{packageLocation:g,packageDependencies:new Map,packagePeers:new Set,linkType:gt.SOFT,discardFromLookup:!1});this.packageRegistry.set(null,new Map([[null,this.getPackageInformation(this.opts.project.topLevelWorkspace.anchoredLocator)]]));let r=this.opts.project.configuration.get("pnpFallbackMode"),i=this.opts.project.workspaces.map(({anchoredLocator:u})=>({name:S.stringifyIdent(u),reference:u.reference})),n=r!=="none",s=[],o=new Map,a=de.buildIgnorePattern([".yarn/sdks/**",...this.opts.project.configuration.get("pnpIgnorePatterns")]),l=this.packageRegistry,c=this.opts.project.configuration.get("pnpShebang");if(r==="dependencies-only")for(let u of this.opts.project.storedPackages.values())this.opts.project.tryWorkspaceByLocator(u)&&s.push({name:S.stringifyIdent(u),reference:u.reference});return await this.finalizeInstallWithPnp({dependencyTreeRoots:i,enableTopLevelFallback:n,fallbackExclusionList:s,fallbackPool:o,ignorePattern:a,packageRegistry:l,shebang:c}),{customData:this.customData}}async transformPnpSettings(e){}isEsmEnabled(){if(this.opts.project.configuration.sources.has("pnpEnableEsmLoader"))return this.opts.project.configuration.get("pnpEnableEsmLoader");if(this.isESMLoaderRequired)return!0;for(let e of this.opts.project.workspaces)if(e.manifest.type==="module")return!0;return!1}async finalizeInstallWithPnp(e){let r=qA(this.opts.project),i=this.opts.project.configuration.get("pnpDataPath"),n=await this.locateNodeModules(e.ignorePattern);if(n.length>0){this.opts.report.reportWarning(z.DANGEROUS_NODE_MODULES,"One or more node_modules have been detected and will be removed. This operation may take some time.");for(let o of n)await T.removePromise(o)}if(await this.transformPnpSettings(e),this.opts.project.configuration.get("pnpEnableInlining")){let o=_le(e);await T.changeFilePromise(r.cjs,o,{automaticNewlines:!0,mode:493}),await T.removePromise(i)}else{let o=v.relative(v.dirname(r.cjs),i),{dataFile:a,loaderFile:l}=Xle(_(P({},e),{dataLocation:o}));await T.changeFilePromise(r.cjs,l,{automaticNewlines:!0,mode:493}),await T.changeFilePromise(i,a,{automaticNewlines:!0,mode:420})}this.isEsmEnabled()&&(this.opts.report.reportWarning(z.UNNAMED,"ESM support for PnP uses the experimental loader API and is therefore experimental"),await T.changeFilePromise(r.esmLoader,(0,tT.default)(),{automaticNewlines:!0,mode:420}));let s=this.opts.project.configuration.get("pnpUnpluggedFolder");if(this.unpluggedPaths.size===0)await T.removePromise(s);else for(let o of await T.readdirPromise(s)){let a=v.resolve(s,o);this.unpluggedPaths.has(a)||await T.removePromise(a)}}async locateNodeModules(e){let r=[],i=e?new RegExp(e):null;for(let n of this.opts.project.workspaces){let s=v.join(n.cwd,"node_modules");if(i&&i.test(v.relative(this.opts.project.cwd,n.cwd))||!T.existsSync(s))continue;let o=await T.readdirPromise(s,{withFileTypes:!0}),a=o.filter(l=>!l.isDirectory()||l.name===".bin"||!l.name.startsWith("."));if(a.length===o.length)r.push(s);else for(let l of a)r.push(v.join(s,l.name))}return r}async unplugPackageIfNeeded(e,r,i,n){return this.shouldBeUnplugged(e,r,n)?this.unplugPackage(e,i):i.packageFs}shouldBeUnplugged(e,r,i){return typeof i.unplugged!="undefined"?i.unplugged:f6e.has(e.identHash)||e.conditions!=null?!0:r.manifest.preferUnplugged!==null?r.manifest.preferUnplugged:!!(Z0(e,r,i,{configuration:this.opts.project.configuration}).length>0||r.misc.extractHint)}async unplugPackage(e,r){let i=ZC(e,{configuration:this.opts.project.configuration});if(this.opts.project.disabledLocators.has(e.locatorHash))return new Xo(i,{baseFs:r.packageFs,pathUtils:v});this.unpluggedPaths.add(i);let n=v.join(i,r.prefixPath,".ready");return await T.existsPromise(n)?new Ft(i):(this.opts.project.storedBuildState.delete(e.locatorHash),await T.mkdirPromise(i,{recursive:!0}),await T.copyPromise(i,Se.dot,{baseFs:r.packageFs,overwrite:!1}),await T.writeFilePromise(n,""),new Ft(i))}getPackageInformation(e){let r=S.stringifyIdent(e),i=e.reference,n=this.packageRegistry.get(r);if(!n)throw new Error(`Assertion failed: The package information store should have been available (for ${S.prettyIdent(this.opts.project.configuration,e)})`);let s=n.get(i);if(!s)throw new Error(`Assertion failed: The package information should have been available (for ${S.prettyLocator(this.opts.project.configuration,e)})`);return s}getDiskInformation(e){let r=de.getMapWithDefault(this.packageRegistry,"@@disk"),i=sT(this.opts.project.cwd,e);return de.getFactoryWithDefault(r,i,()=>({packageLocation:i,packageDependencies:new Map,packagePeers:new Set,linkType:gt.SOFT,discardFromLookup:!1}))}};function sT(t,e){let r=v.relative(t,e);return r.match(/^\.{0,2}\//)||(r=`./${r}`),r.replace(/\/?$/,"/")}async function h6e(t){var i;let e=(i=await Ze.tryFind(t.prefixPath,{baseFs:t.packageFs}))!=null?i:new Ze,r=new Set(["preinstall","install","postinstall"]);for(let n of e.scripts.keys())r.has(n)||e.scripts.delete(n);return{manifest:{scripts:e.scripts,preferUnplugged:e.preferUnplugged,type:e.type},misc:{extractHint:rT(t),hasBindingGyp:iT(t)}}}var ace=ie(Nn());var $C=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Unplug direct dependencies from the entire project"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Unplug both direct and transitive dependencies"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.patterns=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);if(e.get("nodeLinker")!=="pnp")throw new me("This command can only be used if the `nodeLinker` option is set to `pnp`");await r.restoreInstallState();let s=new Set(this.patterns),o=this.patterns.map(f=>{let h=S.parseDescriptor(f),p=h.range!=="unknown"?h:S.makeDescriptor(h,"*");if(!qt.validRange(p.range))throw new me(`The range of the descriptor patterns must be a valid semver range (${S.prettyDescriptor(e,p)})`);return d=>{let m=S.stringifyIdent(d);return!ace.default.isMatch(m,S.stringifyIdent(p))||d.version&&!qt.satisfiesWithPrereleases(d.version,p.range)?!1:(s.delete(f),!0)}}),a=()=>{let f=[];for(let h of r.storedPackages.values())!r.tryWorkspaceByLocator(h)&&!S.isVirtualLocator(h)&&o.some(p=>p(h))&&f.push(h);return f},l=f=>{let h=new Set,p=[],d=(m,I)=>{if(!h.has(m.locatorHash)&&(h.add(m.locatorHash),!r.tryWorkspaceByLocator(m)&&o.some(B=>B(m))&&p.push(m),!(I>0&&!this.recursive)))for(let B of m.dependencies.values()){let b=r.storedResolutions.get(B.descriptorHash);if(!b)throw new Error("Assertion failed: The resolution should have been registered");let R=r.storedPackages.get(b);if(!R)throw new Error("Assertion failed: The package should have been registered");d(R,I+1)}};for(let m of f){let I=r.storedPackages.get(m.anchoredLocator.locatorHash);if(!I)throw new Error("Assertion failed: The package should have been registered");d(I,0)}return p},c,u;if(this.all&&this.recursive?(c=a(),u="the project"):this.all?(c=l(r.workspaces),u="any workspace"):(c=l([i]),u="this workspace"),s.size>1)throw new me(`Patterns ${ue.prettyList(e,s,ue.Type.CODE)} don't match any packages referenced by ${u}`);if(s.size>0)throw new me(`Pattern ${ue.prettyList(e,s,ue.Type.CODE)} doesn't match any packages referenced by ${u}`);return c=de.sortMap(c,f=>S.stringifyLocator(f)),(await Fe.start({configuration:e,stdout:this.context.stdout,json:this.json},async f=>{var h;for(let p of c){let d=(h=p.version)!=null?h:"unknown",m=r.topLevelWorkspace.manifest.ensureDependencyMeta(S.makeDescriptor(p,d));m.unplugged=!0,f.reportInfo(z.UNNAMED,`Will unpack ${S.prettyLocator(e,p)} to ${ue.pretty(e,ZC(p,{configuration:e}),ue.Type.PATH)}`),f.reportJson({locator:S.stringifyLocator(p),version:d})}await r.topLevelWorkspace.persistManifest(),f.reportSeparator(),await r.install({cache:n,report:f})})).exitCode()}};$C.paths=[["unplug"]],$C.usage=ye.Usage({description:"force the unpacking of a list of packages",details:"\n This command will add the selectors matching the specified patterns to the list of packages that must be unplugged when installed.\n\n A package being unplugged means that instead of being referenced directly through its archive, it will be unpacked at install time in the directory configured via `pnpUnpluggedFolder`. Note that unpacking packages this way is generally not recommended because it'll make it harder to store your packages within the repository. However, it's a good approach to quickly and safely debug some packages, and can even sometimes be required depending on the context (for example when the package contains shellscripts).\n\n Running the command will set a persistent flag inside your top-level `package.json`, in the `dependenciesMeta` field. As such, to undo its effects, you'll need to revert the changes made to the manifest and run `yarn install` to apply the modification.\n\n By default, only direct dependencies from the current workspace are affected. If `-A,--all` is set, direct dependencies from the entire project are affected. Using the `-R,--recursive` flag will affect transitive dependencies as well as direct ones.\n\n This command accepts glob patterns inside the scope and name components (not the range). Make sure to escape the patterns to prevent your own shell from trying to expand them.\n ",examples:[["Unplug the lodash dependency from the active workspace","yarn unplug lodash"],["Unplug all instances of lodash referenced by any workspace","yarn unplug lodash -A"],["Unplug all instances of lodash referenced by the active workspace and its dependencies","yarn unplug lodash -R"],["Unplug all instances of lodash, anywhere","yarn unplug lodash -AR"],["Unplug one specific version of lodash","yarn unplug lodash@1.2.3"],["Unplug all packages with the `@babel` scope","yarn unplug '@babel/*'"],["Unplug all packages (only for testing, not recommended)","yarn unplug -R '*'"]]});var Ace=$C;var qA=t=>({cjs:v.join(t.cwd,wt.pnpCjs),cjsLegacy:v.join(t.cwd,wt.pnpJs),esmLoader:v.join(t.cwd,".pnp.loader.mjs")}),uce=t=>/\s/.test(t)?JSON.stringify(t):t;async function p6e(t,e,r){let i=qA(t),n=`--require ${uce(M.fromPortablePath(i.cjs))}`;if(T.existsSync(i.esmLoader)&&(n=`${n} --experimental-loader ${(0,cce.pathToFileURL)(M.fromPortablePath(i.esmLoader)).href}`),i.cjs.includes(" ")&&lce.default.lt(process.versions.node,"12.0.0"))throw new Error(`Expected the build location to not include spaces when using Node < 12.0.0 (${process.versions.node})`);if(T.existsSync(i.cjs)){let s=e.NODE_OPTIONS||"",o=/\s*--require\s+\S*\.pnp\.c?js\s*/g,a=/\s*--experimental-loader\s+\S*\.pnp\.loader\.mjs\s*/;s=s.replace(o," ").replace(a," ").trim(),s=s?`${n} ${s}`:n,e.NODE_OPTIONS=s}}async function d6e(t,e){let r=qA(t);e(r.cjs),e(r.esmLoader),e(t.configuration.get("pnpDataPath")),e(t.configuration.get("pnpUnpluggedFolder"))}var C6e={hooks:{populateYarnPaths:d6e,setupScriptEnvironment:p6e},configuration:{nodeLinker:{description:'The linker used for installing Node packages, one of: "pnp", "node-modules"',type:ge.STRING,default:"pnp"},pnpMode:{description:"If 'strict', generates standard PnP maps. If 'loose', merges them with the n_m resolution.",type:ge.STRING,default:"strict"},pnpShebang:{description:"String to prepend to the generated PnP script",type:ge.STRING,default:"#!/usr/bin/env node"},pnpIgnorePatterns:{description:"Array of glob patterns; files matching them will use the classic resolution",type:ge.STRING,default:[],isArray:!0},pnpEnableEsmLoader:{description:"If true, Yarn will generate an ESM loader (`.pnp.loader.mjs`). If this is not explicitly set Yarn tries to automatically detect whether ESM support is required.",type:ge.BOOLEAN,default:!1},pnpEnableInlining:{description:"If true, the PnP data will be inlined along with the generated loader",type:ge.BOOLEAN,default:!0},pnpFallbackMode:{description:"If true, the generated PnP loader will follow the top-level fallback rule",type:ge.STRING,default:"dependencies-only"},pnpUnpluggedFolder:{description:"Folder where the unplugged packages must be stored",type:ge.ABSOLUTE_PATH,default:"./.yarn/unplugged"},pnpDataPath:{description:"Path of the file where the PnP data (used by the loader) must be written",type:ge.ABSOLUTE_PATH,default:"./.pnp.data.json"}},linkers:[jc],commands:[Ace]},m6e=C6e;var Cce=ie(dce());var uT=ie(require("crypto")),mce=ie(require("fs")),Ece=1,gi="node_modules",gT=".bin",Ice=".yarn-state.yml",Bi;(function(i){i.CLASSIC="classic",i.HARDLINKS_LOCAL="hardlinks-local",i.HARDLINKS_GLOBAL="hardlinks-global"})(Bi||(Bi={}));var fT=class{constructor(){this.installStateCache=new Map}supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="node-modules"}async findPackageLocation(e,r){let i=r.project.tryWorkspaceByLocator(e);if(i)return i.cwd;let n=await de.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hT(r.project,{unrollAliases:!0}));if(n===null)throw new me("Couldn't find the node_modules state file - running an install might help (findPackageLocation)");let s=n.locatorMap.get(S.stringifyLocator(e));if(!s){let a=new me(`Couldn't find ${S.prettyLocator(r.project.configuration,e)} in the currently installed node_modules map - running an install might help`);throw a.code="LOCATOR_NOT_INSTALLED",a}let o=r.project.configuration.startingCwd;return s.locations.find(a=>v.contains(o,a))||s.locations[0]}async findPackageLocator(e,r){let i=await de.getFactoryWithDefault(this.installStateCache,r.project.cwd,async()=>await hT(r.project,{unrollAliases:!0}));if(i===null)return null;let{locationRoot:n,segments:s}=$0(v.resolve(e),{skipPrefix:r.project.cwd}),o=i.locationTree.get(n);if(!o)return null;let a=o.locator;for(let l of s){if(o=o.children.get(l),!o)break;a=o.locator||a}return S.parseLocator(a)}makeInstaller(e){return new yce(e)}},yce=class{constructor(e){this.opts=e;this.localStore=new Map;this.realLocatorChecksums=new Map;this.customData={store:new Map}}getCustomDataKey(){return JSON.stringify({name:"NodeModulesInstaller",version:1})}attachCustomData(e){this.customData=e}async installPackage(e,r){var u;let i=v.resolve(r.packageFs.getRealPath(),r.prefixPath),n=this.customData.store.get(e.locatorHash);if(typeof n=="undefined"&&(n=await L6e(e,r),e.linkType===gt.HARD&&this.customData.store.set(e.locatorHash,n)),!Ws.checkAndReportManifestCompatibility(e,"link",{configuration:this.opts.project.configuration,report:this.opts.report}))return{packageLocation:null,buildDirective:null};let s=new Map,o=new Set;s.has(S.stringifyIdent(e))||s.set(S.stringifyIdent(e),e.reference);let a=e;if(S.isVirtualLocator(e)){a=S.devirtualizeLocator(e);for(let g of e.peerDependencies.values())s.set(S.stringifyIdent(g),null),o.add(S.stringifyIdent(g))}let l={packageLocation:`${M.fromPortablePath(i)}/`,packageDependencies:s,packagePeers:o,linkType:e.linkType,discardFromLookup:(u=r.discardFromLookup)!=null?u:!1};this.localStore.set(e.locatorHash,{pkg:e,customPackageData:n,dependencyMeta:this.opts.project.getDependencyMeta(e,e.version),pnpNode:l});let c=r.checksum?r.checksum.substring(r.checksum.indexOf("/")+1):null;return this.realLocatorChecksums.set(a.locatorHash,c),{packageLocation:i,buildDirective:null}}async attachInternalDependencies(e,r){let i=this.localStore.get(e.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected information object to have been registered");for(let[n,s]of r){let o=S.areIdentsEqual(n,s)?s.reference:[S.stringifyIdent(s),s.reference];i.pnpNode.packageDependencies.set(S.stringifyIdent(n),o)}}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the node-modules linker")}async finalizeInstall(){if(this.opts.project.configuration.get("nodeLinker")!=="node-modules")return;let e=new Pr({baseFs:new Jn({libzip:await $i(),maxOpenFiles:80,readOnlyArchives:!0})}),r=await hT(this.opts.project),i=this.opts.project.configuration.get("nmMode");(r===null||i!==r.nmMode)&&(this.opts.project.storedBuildState.clear(),r={locatorMap:new Map,binSymlinks:new Map,locationTree:new Map,nmMode:i});let n=new Map(this.opts.project.workspaces.map(f=>{var p,d;let h=this.opts.project.configuration.get("nmHoistingLimits");try{h=de.validateEnum(Sn,(d=(p=f.manifest.installConfig)==null?void 0:p.hoistingLimits)!=null?d:h)}catch(m){let I=S.prettyWorkspace(this.opts.project.configuration,f);this.opts.report.reportWarning(z.INVALID_MANIFEST,`${I}: Invalid 'installConfig.hoistingLimits' value. Expected one of ${Object.values(Sn).join(", ")}, using default: "${h}"`)}return[f.relativeCwd,h]})),s=new Map(this.opts.project.workspaces.map(f=>{var p,d;let h=this.opts.project.configuration.get("nmSelfReferences");return h=(d=(p=f.manifest.installConfig)==null?void 0:p.selfReferences)!=null?d:h,[f.relativeCwd,h]})),o={VERSIONS:{std:1},topLevel:{name:null,reference:null},getLocator:(f,h)=>Array.isArray(h)?{name:h[0],reference:h[1]}:{name:f,reference:h},getDependencyTreeRoots:()=>this.opts.project.workspaces.map(f=>{let h=f.anchoredLocator;return{name:S.stringifyIdent(f.locator),reference:h.reference}}),getPackageInformation:f=>{let h=f.reference===null?this.opts.project.topLevelWorkspace.anchoredLocator:S.makeLocator(S.parseIdent(f.name),f.reference),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the package reference to have been registered");return p.pnpNode},findPackageLocator:f=>{let h=this.opts.project.tryWorkspaceByCwd(M.toPortablePath(f));if(h!==null){let p=h.anchoredLocator;return{name:S.stringifyIdent(p),reference:p.reference}}throw new Error("Assertion failed: Unimplemented")},resolveToUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveUnqualified:()=>{throw new Error("Assertion failed: Unimplemented")},resolveRequest:()=>{throw new Error("Assertion failed: Unimplemented")},resolveVirtual:f=>M.fromPortablePath(Pr.resolveVirtual(M.toPortablePath(f)))},{tree:a,errors:l,preserveSymlinksRequired:c}=VC(o,{pnpifyFs:!1,validateExternalSoftLinks:!0,hoistingLimitsByCwd:n,project:this.opts.project,selfReferencesByCwd:s});if(!a){for(let{messageName:f,text:h}of l)this.opts.report.reportError(f,h);return}let u=WL(a);await T6e(r,u,{baseFs:e,project:this.opts.project,report:this.opts.report,realLocatorChecksums:this.realLocatorChecksums,loadManifest:async f=>{let h=S.parseLocator(f),p=this.localStore.get(h.locatorHash);if(typeof p=="undefined")throw new Error("Assertion failed: Expected the slot to exist");return p.customPackageData.manifest}});let g=[];for(let[f,h]of u.entries()){if(wce(f))continue;let p=S.parseLocator(f),d=this.localStore.get(p.locatorHash);if(typeof d=="undefined")throw new Error("Assertion failed: Expected the slot to exist");if(this.opts.project.tryWorkspaceByLocator(d.pkg))continue;let m=Ws.extractBuildScripts(d.pkg,d.customPackageData,d.dependencyMeta,{configuration:this.opts.project.configuration,report:this.opts.report});m.length!==0&&g.push({buildLocations:h.locations,locatorHash:p.locatorHash,buildDirective:m})}return c&&this.opts.report.reportWarning(z.NM_PRESERVE_SYMLINKS_REQUIRED,`The application uses portals and that's why ${ue.pretty(this.opts.project.configuration,"--preserve-symlinks",ue.Type.CODE)} Node option is required for launching it`),{customData:this.customData,records:g}}};async function L6e(t,e){var n;let r=(n=await Ze.tryFind(e.prefixPath,{baseFs:e.packageFs}))!=null?n:new Ze,i=new Set(["preinstall","install","postinstall"]);for(let s of r.scripts.keys())i.has(s)||r.scripts.delete(s);return{manifest:{bin:r.bin,scripts:r.scripts},misc:{extractHint:Ws.getExtractHint(e),hasBindingGyp:Ws.hasBindingGyp(e)}}}async function M6e(t,e,r,i){let n="";n+=`# Warning: This file is automatically generated. Removing it is fine, but will +`,n+=`# cause your node_modules installation to become invalidated. +`,n+=` +`,n+=`__metadata: +`,n+=` version: ${Ece} +`,n+=` nmMode: ${i.value} +`;let s=Array.from(e.keys()).sort(),o=S.stringifyLocator(t.topLevelWorkspace.anchoredLocator);for(let c of s){let u=e.get(c);n+=` +`,n+=`${JSON.stringify(c)}: +`,n+=` locations: +`;for(let g of u.locations){let f=v.contains(t.cwd,g);if(f===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` - ${JSON.stringify(f)} +`}if(u.aliases.length>0){n+=` aliases: +`;for(let g of u.aliases)n+=` - ${JSON.stringify(g)} +`}if(c===o&&r.size>0){n+=` bin: +`;for(let[g,f]of r){let h=v.contains(t.cwd,g);if(h===null)throw new Error(`Assertion failed: Expected the path to be within the project (${g})`);n+=` ${JSON.stringify(h)}: +`;for(let[p,d]of f){let m=v.relative(v.join(g,gi),d);n+=` ${JSON.stringify(p)}: ${JSON.stringify(m)} +`}}}}let a=t.cwd,l=v.join(a,gi,Ice);await T.changeFilePromise(l,n,{automaticNewlines:!0})}async function hT(t,{unrollAliases:e=!1}={}){let r=t.cwd,i=v.join(r,gi,Ice);if(!T.existsSync(i))return null;let n=Ii(await T.readFilePromise(i,"utf8"));if(n.__metadata.version>Ece)return null;let s=n.__metadata.nmMode||Bi.CLASSIC,o=new Map,a=new Map;delete n.__metadata;for(let[l,c]of Object.entries(n)){let u=c.locations.map(f=>v.join(r,f)),g=c.bin;if(g)for(let[f,h]of Object.entries(g)){let p=v.join(r,M.toPortablePath(f)),d=de.getMapWithDefault(a,p);for(let[m,I]of Object.entries(h))d.set(kr(m),M.toPortablePath([p,gi,I].join(v.delimiter)))}if(o.set(l,{target:Se.dot,linkType:gt.HARD,locations:u,aliases:c.aliases||[]}),e&&c.aliases)for(let f of c.aliases){let{scope:h,name:p}=S.parseLocator(l),d=S.makeLocator(S.makeIdent(h,p),f),m=S.stringifyLocator(d);o.set(m,{target:Se.dot,linkType:gt.HARD,locations:u,aliases:[]})}}return{locatorMap:o,binSymlinks:a,locationTree:Bce(o,{skipPrefix:t.cwd}),nmMode:s}}var Ef=async(t,e)=>{if(t.split(v.sep).indexOf(gi)<0)throw new Error(`Assertion failed: trying to remove dir that doesn't contain node_modules: ${t}`);try{if(!e.innerLoop&&(await T.lstatPromise(t)).isSymbolicLink()){await T.unlinkPromise(t);return}let r=await T.readdirPromise(t,{withFileTypes:!0});for(let i of r){let n=v.join(t,kr(i.name));i.isDirectory()?(i.name!==gi||e&&e.innerLoop)&&await Ef(n,{innerLoop:!0,contentsOnly:!1}):await T.unlinkPromise(n)}e.contentsOnly||await T.rmdirPromise(t)}catch(r){if(r.code!=="ENOENT"&&r.code!=="ENOTEMPTY")throw r}},Qce=4,$0=(t,{skipPrefix:e})=>{let r=v.contains(e,t);if(r===null)throw new Error(`Assertion failed: Writing attempt prevented to ${t} which is outside project root: ${e}`);let i=r.split(v.sep).filter(l=>l!==""),n=i.indexOf(gi),s=i.slice(0,n).join(v.sep),o=v.join(e,s),a=i.slice(n);return{locationRoot:o,segments:a}},Bce=(t,{skipPrefix:e})=>{let r=new Map;if(t===null)return r;let i=()=>({children:new Map,linkType:gt.HARD});for(let[n,s]of t.entries()){if(s.linkType===gt.SOFT&&v.contains(e,s.target)!==null){let a=de.getFactoryWithDefault(r,s.target,i);a.locator=n,a.linkType=s.linkType}for(let o of s.locations){let{locationRoot:a,segments:l}=$0(o,{skipPrefix:e}),c=de.getFactoryWithDefault(r,a,i);for(let u=0;u{let r;try{process.platform==="win32"&&(r=await T.lstatPromise(t))}catch(i){}process.platform=="win32"&&(!r||r.isDirectory())?await T.symlinkPromise(t,e,"junction"):await T.symlinkPromise(v.relative(v.dirname(e),t),e)};async function bce(t,e,r){let i=v.join(t,kr(`${uT.default.randomBytes(16).toString("hex")}.tmp`));try{await T.writeFilePromise(i,r);try{await T.linkPromise(i,e)}catch(n){}}finally{await T.unlinkPromise(i)}}async function O6e({srcPath:t,dstPath:e,srcMode:r,globalHardlinksStore:i,baseFs:n,nmMode:s,digest:o}){if(s.value===Bi.HARDLINKS_GLOBAL&&i&&o){let l=v.join(i,o.substring(0,2),`${o.substring(2)}.dat`),c;try{if(await mn.checksumFile(l,{baseFs:T,algorithm:"sha1"})!==o){let g=v.join(i,kr(`${uT.default.randomBytes(16).toString("hex")}.tmp`));await T.renamePromise(l,g);let f=await n.readFilePromise(t);await T.writeFilePromise(g,f);try{await T.linkPromise(g,l),await T.unlinkPromise(g)}catch(h){}}await T.linkPromise(l,e),c=!0}catch(u){c=!1}if(!c){let u=await n.readFilePromise(t);await bce(i,l,u);try{await T.linkPromise(l,e)}catch(g){g&&g.code&&g.code=="EXDEV"&&(s.value=Bi.HARDLINKS_LOCAL,await n.copyFilePromise(t,e))}}}else await n.copyFilePromise(t,e);let a=r&511;a!==420&&await T.chmodPromise(e,a)}var JA;(function(i){i.FILE="file",i.DIRECTORY="directory",i.SYMLINK="symlink"})(JA||(JA={}));var K6e=async(t,e,{baseFs:r,globalHardlinksStore:i,nmMode:n,packageChecksum:s})=>{await T.mkdirPromise(t,{recursive:!0});let o=async(l=Se.dot)=>{let c=v.join(e,l),u=await r.readdirPromise(c,{withFileTypes:!0}),g=new Map;for(let f of u){let h=v.join(l,f.name),p,d=v.join(c,f.name);if(f.isFile()){if(p={kind:JA.FILE,mode:(await r.lstatPromise(d)).mode},n.value===Bi.HARDLINKS_GLOBAL){let m=await mn.checksumFile(d,{baseFs:r,algorithm:"sha1"});p.digest=m}}else if(f.isDirectory())p={kind:JA.DIRECTORY};else if(f.isSymbolicLink())p={kind:JA.SYMLINK,symlinkTo:await r.readlinkPromise(d)};else throw new Error(`Unsupported file type (file: ${d}, mode: 0o${await r.statSync(d).mode.toString(8).padStart(6,"0")})`);if(g.set(h,p),f.isDirectory()&&h!==gi){let m=await o(h);for(let[I,B]of m)g.set(I,B)}}return g},a;if(n.value===Bi.HARDLINKS_GLOBAL&&i&&s){let l=v.join(i,s.substring(0,2),`${s.substring(2)}.json`);try{a=new Map(Object.entries(JSON.parse(await T.readFilePromise(l,"utf8"))))}catch(c){a=await o(),await bce(i,l,Buffer.from(JSON.stringify(Object.fromEntries(a))))}}else a=await o();for(let[l,c]of a){let u=v.join(e,l),g=v.join(t,l);c.kind===JA.DIRECTORY?await T.mkdirPromise(g,{recursive:!0}):c.kind===JA.FILE?await O6e({srcPath:u,dstPath:g,srcMode:c.mode,digest:c.digest,nmMode:n,baseFs:r,globalHardlinksStore:i}):c.kind===JA.SYMLINK&&await pT(v.resolve(v.dirname(g),c.symlinkTo),g)}};function U6e(t,e){let r=new Map([...t]),i=new Map([...e]);for(let[n,s]of t){let o=v.join(n,gi);if(!T.existsSync(o)){s.children.delete(gi);for(let a of i.keys())v.contains(o,a)!==null&&i.delete(a)}}return{locationTree:r,binSymlinks:i}}function wce(t){let e=S.parseDescriptor(t);return S.isVirtualDescriptor(e)&&(e=S.devirtualizeDescriptor(e)),e.range.startsWith("link:")}async function H6e(t,e,r,{loadManifest:i}){let n=new Map;for(let[a,{locations:l}]of t){let c=wce(a)?null:await i(a,l[0]),u=new Map;if(c)for(let[g,f]of c.bin){let h=v.join(l[0],f);f!==""&&T.existsSync(h)&&u.set(g,f)}n.set(a,u)}let s=new Map,o=(a,l,c)=>{let u=new Map,g=v.contains(r,a);if(c.locator&&g!==null){let f=n.get(c.locator);for(let[h,p]of f){let d=v.join(a,M.toPortablePath(p));u.set(kr(h),d)}for(let[h,p]of c.children){let d=v.join(a,h),m=o(d,d,p);m.size>0&&s.set(a,new Map([...s.get(a)||new Map,...m]))}}else for(let[f,h]of c.children){let p=o(v.join(a,f),l,h);for(let[d,m]of p)u.set(d,m)}return u};for(let[a,l]of e){let c=o(a,a,l);c.size>0&&s.set(a,new Map([...s.get(a)||new Map,...c]))}return s}var vce=(t,e)=>{if(!t||!e)return t===e;let r=S.parseLocator(t);S.isVirtualLocator(r)&&(r=S.devirtualizeLocator(r));let i=S.parseLocator(e);return S.isVirtualLocator(i)&&(i=S.devirtualizeLocator(i)),S.areLocatorsEqual(r,i)};function dT(t){return v.join(t.get("globalFolder"),"store")}async function T6e(t,e,{baseFs:r,project:i,report:n,loadManifest:s,realLocatorChecksums:o}){let a=v.join(i.cwd,gi),{locationTree:l,binSymlinks:c}=U6e(t.locationTree,t.binSymlinks),u=Bce(e,{skipPrefix:i.cwd}),g=[],f=async({srcDir:L,dstDir:K,linkType:J,globalHardlinksStore:ne,nmMode:q,packageChecksum:A})=>{let V=(async()=>{try{J===gt.SOFT?(await T.mkdirPromise(v.dirname(K),{recursive:!0}),await pT(v.resolve(L),K)):await K6e(K,L,{baseFs:r,globalHardlinksStore:ne,nmMode:q,packageChecksum:A})}catch(W){throw W.message=`While persisting ${L} -> ${K} ${W.message}`,W}finally{B.tick()}})().then(()=>g.splice(g.indexOf(V),1));g.push(V),g.length>Qce&&await Promise.race(g)},h=async(L,K,J)=>{let ne=(async()=>{let q=async(A,V,W)=>{try{W.innerLoop||await T.mkdirPromise(V,{recursive:!0});let X=await T.readdirPromise(A,{withFileTypes:!0});for(let F of X){if(!W.innerLoop&&F.name===gT)continue;let D=v.join(A,F.name),he=v.join(V,F.name);F.isDirectory()?(F.name!==gi||W&&W.innerLoop)&&(await T.mkdirPromise(he,{recursive:!0}),await q(D,he,_(P({},W),{innerLoop:!0}))):H.value===Bi.HARDLINKS_LOCAL||H.value===Bi.HARDLINKS_GLOBAL?await T.linkPromise(D,he):await T.copyFilePromise(D,he,mce.default.constants.COPYFILE_FICLONE)}}catch(X){throw W.innerLoop||(X.message=`While cloning ${A} -> ${V} ${X.message}`),X}finally{W.innerLoop||B.tick()}};await q(L,K,J)})().then(()=>g.splice(g.indexOf(ne),1));g.push(ne),g.length>Qce&&await Promise.race(g)},p=async(L,K,J)=>{if(!J)K.children.has(gi)&&await Ef(v.join(L,gi),{contentsOnly:!1}),await Ef(L,{contentsOnly:L===a});else for(let[ne,q]of K.children){let A=J.children.get(ne);await p(v.join(L,ne),q,A)}};for(let[L,K]of l){let J=u.get(L);for(let[ne,q]of K.children){if(ne===".")continue;let A=J&&J.children.get(ne);await p(v.join(L,ne),q,A)}}let d=async(L,K,J)=>{if(!J)K.children.has(gi)&&await Ef(v.join(L,gi),{contentsOnly:!0}),await Ef(L,{contentsOnly:K.linkType===gt.HARD});else{vce(K.locator,J.locator)||await Ef(L,{contentsOnly:K.linkType===gt.HARD});for(let[ne,q]of K.children){let A=J.children.get(ne);await d(v.join(L,ne),q,A)}}};for(let[L,K]of u){let J=l.get(L);for(let[ne,q]of K.children){if(ne===".")continue;let A=J&&J.children.get(ne);await d(v.join(L,ne),q,A)}}let m=new Map,I=[];for(let[L,{locations:K}]of t.locatorMap.entries())for(let J of K){let{locationRoot:ne,segments:q}=$0(J,{skipPrefix:i.cwd}),A=u.get(ne),V=ne;if(A){for(let W of q)if(V=v.join(V,W),A=A.children.get(W),!A)break;if(A){let W=vce(A.locator,L),X=e.get(A.locator),F=X.target,D=V,he=X.linkType;if(W)m.has(F)||m.set(F,D);else if(F!==D){let pe=S.parseLocator(A.locator);S.isVirtualLocator(pe)&&(pe=S.devirtualizeLocator(pe)),I.push({srcDir:F,dstDir:D,linkType:he,realLocatorHash:pe.locatorHash})}}}}for(let[L,{locations:K}]of e.entries())for(let J of K){let{locationRoot:ne,segments:q}=$0(J,{skipPrefix:i.cwd}),A=l.get(ne),V=u.get(ne),W=ne,X=e.get(L),F=S.parseLocator(L);S.isVirtualLocator(F)&&(F=S.devirtualizeLocator(F));let D=F.locatorHash,he=X.target,pe=J;if(he===pe)continue;let Ne=X.linkType;for(let Pe of q)V=V.children.get(Pe);if(!A)I.push({srcDir:he,dstDir:pe,linkType:Ne,realLocatorHash:D});else for(let Pe of q)if(W=v.join(W,Pe),A=A.children.get(Pe),!A){I.push({srcDir:he,dstDir:pe,linkType:Ne,realLocatorHash:D});break}}let B=Xi.progressViaCounter(I.length),b=n.reportProgress(B),R=i.configuration.get("nmMode"),H={value:R};try{let L=H.value===Bi.HARDLINKS_GLOBAL?`${dT(i.configuration)}/v1`:null;if(L&&!await T.existsPromise(L)){await T.mkdirpPromise(L);for(let J=0;J<256;J++)await T.mkdirPromise(v.join(L,J.toString(16).padStart(2,"0")))}for(let J of I)(J.linkType===gt.SOFT||!m.has(J.srcDir))&&(m.set(J.srcDir,J.dstDir),await f(_(P({},J),{globalHardlinksStore:L,nmMode:H,packageChecksum:o.get(J.realLocatorHash)||null})));await Promise.all(g),g.length=0;for(let J of I){let ne=m.get(J.srcDir);J.linkType!==gt.SOFT&&J.dstDir!==ne&&await h(ne,J.dstDir,{nmMode:H})}await Promise.all(g),await T.mkdirPromise(a,{recursive:!0});let K=await H6e(e,u,i.cwd,{loadManifest:s});await G6e(c,K,i.cwd),await M6e(i,e,K,H),R==Bi.HARDLINKS_GLOBAL&&H.value==Bi.HARDLINKS_LOCAL&&n.reportWarningOnce(z.NM_HARDLINKS_MODE_DOWNGRADED,"'nmMode' has been downgraded to 'hardlinks-local' due to global cache and install folder being on different devices")}finally{b.stop()}}async function G6e(t,e,r){for(let i of t.keys()){if(v.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);if(!e.has(i)){let n=v.join(i,gi,gT);await T.removePromise(n)}}for(let[i,n]of e){if(v.contains(r,i)===null)throw new Error(`Assertion failed. Excepted bin symlink location to be inside project dir, instead it was at ${i}`);let s=v.join(i,gi,gT),o=t.get(i)||new Map;await T.mkdirPromise(s,{recursive:!0});for(let a of o.keys())n.has(a)||(await T.removePromise(v.join(s,a)),process.platform==="win32"&&await T.removePromise(v.join(s,kr(`${a}.cmd`))));for(let[a,l]of n){let c=o.get(a),u=v.join(s,a);c!==l&&(process.platform==="win32"?await(0,Cce.default)(M.fromPortablePath(l),M.fromPortablePath(u),{createPwshFile:!1}):(await T.removePromise(u),await pT(l,u),v.contains(r,await T.realpathPromise(l))!==null&&await T.chmodPromise(l,493)))}}}var CT=class extends jc{constructor(){super(...arguments);this.mode="loose"}makeInstaller(e){return new Sce(e)}},Sce=class extends Cf{constructor(){super(...arguments);this.mode="loose"}async transformPnpSettings(e){let r=new Pr({baseFs:new Jn({libzip:await $i(),maxOpenFiles:80,readOnlyArchives:!0})}),i=ice(e,this.opts.project.cwd,r),{tree:n,errors:s}=VC(i,{pnpifyFs:!1,project:this.opts.project});if(!n){for(let{messageName:u,text:g}of s)this.opts.report.reportError(u,g);return}let o=new Map;e.fallbackPool=o;let a=(u,g)=>{let f=S.parseLocator(g.locator),h=S.stringifyIdent(f);h===u?o.set(u,f.reference):o.set(u,[h,f.reference])},l=v.join(this.opts.project.cwd,wt.nodeModules),c=n.get(l);if(typeof c!="undefined"){if("target"in c)throw new Error("Assertion failed: Expected the root junction point to be a directory");for(let u of c.dirList){let g=v.join(l,u),f=n.get(g);if(typeof f=="undefined")throw new Error("Assertion failed: Expected the child to have been registered");if("target"in f)a(u,f);else for(let h of f.dirList){let p=v.join(g,h),d=n.get(p);if(typeof d=="undefined")throw new Error("Assertion failed: Expected the subchild to have been registered");if("target"in d)a(`${u}/${h}`,d);else throw new Error("Assertion failed: Expected the leaf junction to be a package")}}}}};var j6e={hooks:{cleanGlobalArtifacts:async t=>{let e=dT(t);await T.removePromise(e)}},configuration:{nmHoistingLimits:{description:"Prevent packages to be hoisted past specific levels",type:ge.STRING,values:[Sn.WORKSPACES,Sn.DEPENDENCIES,Sn.NONE],default:Sn.NONE},nmMode:{description:'If set to "hardlinks-local" Yarn will utilize hardlinks to reduce disk space consumption inside "node_modules" directories. With "hardlinks-global" Yarn will use global content addressable storage to reduce "node_modules" size across all the projects using this option.',type:ge.STRING,values:[Bi.CLASSIC,Bi.HARDLINKS_LOCAL,Bi.HARDLINKS_GLOBAL],default:Bi.CLASSIC},nmSelfReferences:{description:"If set to 'false' the workspace will not be allowed to require itself and corresponding self-referencing symlink will not be created",type:ge.BOOLEAN,default:!0}},linkers:[fT,CT]},Y6e=j6e;var yM={};it(yM,{default:()=>Z7e,npmConfigUtils:()=>gr,npmHttpUtils:()=>Lt,npmPublishUtils:()=>Rf});var Rce=ie(Or());var ir="npm:";var Lt={};it(Lt,{AuthType:()=>jn,customPackageError:()=>W6e,del:()=>_6e,get:()=>zs,getIdentUrl:()=>zA,handleInvalidAuthenticationError:()=>WA,post:()=>z6e,put:()=>V6e});var Pce=ie(aC()),Dce=ie(require("url"));var gr={};it(gr,{RegistryType:()=>ja,getAuditRegistry:()=>q6e,getAuthConfiguration:()=>IT,getDefaultRegistry:()=>eQ,getPublishRegistry:()=>xce,getRegistryConfiguration:()=>kce,getScopeConfiguration:()=>ET,getScopeRegistry:()=>Ya,normalizeRegistry:()=>To});var ja;(function(i){i.AUDIT_REGISTRY="npmAuditRegistry",i.FETCH_REGISTRY="npmRegistryServer",i.PUBLISH_REGISTRY="npmPublishRegistry"})(ja||(ja={}));function To(t){return t.replace(/\/$/,"")}function q6e(t,{configuration:e}){let r=e.get(ja.AUDIT_REGISTRY);return r!==null?To(r):xce(t,{configuration:e})}function xce(t,{configuration:e}){var r;return((r=t.publishConfig)==null?void 0:r.registry)?To(t.publishConfig.registry):t.name?Ya(t.name.scope,{configuration:e,type:ja.PUBLISH_REGISTRY}):eQ({configuration:e,type:ja.PUBLISH_REGISTRY})}function Ya(t,{configuration:e,type:r=ja.FETCH_REGISTRY}){let i=ET(t,{configuration:e});if(i===null)return eQ({configuration:e,type:r});let n=i.get(r);return n===null?eQ({configuration:e,type:r}):To(n)}function eQ({configuration:t,type:e=ja.FETCH_REGISTRY}){let r=t.get(e);return To(r!==null?r:t.get(ja.FETCH_REGISTRY))}function kce(t,{configuration:e}){let r=e.get("npmRegistries"),i=To(t),n=r.get(i);if(typeof n!="undefined")return n;let s=r.get(i.replace(/^[a-z]+:/,""));return typeof s!="undefined"?s:null}function ET(t,{configuration:e}){if(t===null)return null;let i=e.get("npmScopes").get(t);return i||null}function IT(t,{configuration:e,ident:r}){let i=r&&ET(r.scope,{configuration:e});return(i==null?void 0:i.get("npmAuthIdent"))||(i==null?void 0:i.get("npmAuthToken"))?i:kce(t,{configuration:e})||e}var jn;(function(n){n[n.NO_AUTH=0]="NO_AUTH",n[n.BEST_EFFORT=1]="BEST_EFFORT",n[n.CONFIGURATION=2]="CONFIGURATION",n[n.ALWAYS_AUTH=3]="ALWAYS_AUTH"})(jn||(jn={}));async function WA(t,{attemptedAs:e,registry:r,headers:i,configuration:n}){var s,o;if(((s=t.originalError)==null?void 0:s.name)==="HTTPError"&&((o=t.originalError)==null?void 0:o.response.statusCode)===401)throw new nt(z.AUTHENTICATION_INVALID,`Invalid authentication (${typeof e!="string"?`as ${await J6e(r,i,{configuration:n})}`:`attempted as ${e}`})`)}function W6e(t){var e;return((e=t.response)==null?void 0:e.statusCode)===404?"Package not found":null}function zA(t){return t.scope?`/@${t.scope}%2f${t.name}`:`/${t.name}`}async function zs(t,a){var l=a,{configuration:e,headers:r,ident:i,authType:n,registry:s}=l,o=qr(l,["configuration","headers","ident","authType","registry"]);if(i&&typeof s=="undefined"&&(s=Ya(i.scope,{configuration:e})),i&&i.scope&&typeof n=="undefined"&&(n=1),typeof s!="string")throw new Error("Assertion failed: The registry should be a string");let c=await tQ(s,{authType:n,configuration:e,ident:i});c&&(r=_(P({},r),{authorization:c}));try{return await Zt.get(t.charAt(0)==="/"?`${s}${t}`:t,P({configuration:e,headers:r},o))}catch(u){throw await WA(u,{registry:s,configuration:e,headers:r}),u}}async function z6e(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=qr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=Ya(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await tQ(a,{authType:o,configuration:i,ident:s});g&&(n=_(P({},n),{authorization:g}));try{return await Zt.post(a+t,e,P({configuration:i,headers:n},l))}catch(f){if(!wT(f))throw await WA(f,{attemptedAs:r,registry:a,configuration:i,headers:n}),f;let h=await yT(),p=P(P({},n),BT(h));try{return await Zt.post(`${a}${t}`,e,P({configuration:i,headers:p},l))}catch(d){throw await WA(d,{attemptedAs:r,registry:a,configuration:i,headers:n}),d}}}async function V6e(t,e,c){var u=c,{attemptedAs:r,configuration:i,headers:n,ident:s,authType:o=3,registry:a}=u,l=qr(u,["attemptedAs","configuration","headers","ident","authType","registry"]);if(s&&typeof a=="undefined"&&(a=Ya(s.scope,{configuration:i})),typeof a!="string")throw new Error("Assertion failed: The registry should be a string");let g=await tQ(a,{authType:o,configuration:i,ident:s});g&&(n=_(P({},n),{authorization:g}));try{return await Zt.put(a+t,e,P({configuration:i,headers:n},l))}catch(f){if(!wT(f))throw await WA(f,{attemptedAs:r,registry:a,configuration:i,headers:n}),f;let h=await yT(),p=P(P({},n),BT(h));try{return await Zt.put(`${a}${t}`,e,P({configuration:i,headers:p},l))}catch(d){throw await WA(d,{attemptedAs:r,registry:a,configuration:i,headers:n}),d}}}async function _6e(t,l){var c=l,{attemptedAs:e,configuration:r,headers:i,ident:n,authType:s=3,registry:o}=c,a=qr(c,["attemptedAs","configuration","headers","ident","authType","registry"]);if(n&&typeof o=="undefined"&&(o=Ya(n.scope,{configuration:r})),typeof o!="string")throw new Error("Assertion failed: The registry should be a string");let u=await tQ(o,{authType:s,configuration:r,ident:n});u&&(i=_(P({},i),{authorization:u}));try{return await Zt.del(o+t,P({configuration:r,headers:i},a))}catch(g){if(!wT(g))throw await WA(g,{attemptedAs:e,registry:o,configuration:r,headers:i}),g;let f=await yT(),h=P(P({},i),BT(f));try{return await Zt.del(`${o}${t}`,P({configuration:r,headers:h},a))}catch(p){throw await WA(p,{attemptedAs:e,registry:o,configuration:r,headers:i}),p}}}async function tQ(t,{authType:e=2,configuration:r,ident:i}){let n=IT(t,{configuration:r,ident:i}),s=X6e(n,e);if(!s)return null;let o=await r.reduceHook(a=>a.getNpmAuthenticationHeader,void 0,t,{configuration:r,ident:i});if(o)return o;if(n.get("npmAuthToken"))return`Bearer ${n.get("npmAuthToken")}`;if(n.get("npmAuthIdent")){let a=n.get("npmAuthIdent");return a.includes(":")?`Basic ${Buffer.from(a).toString("base64")}`:`Basic ${a}`}if(s&&e!==1)throw new nt(z.AUTHENTICATION_NOT_FOUND,"No authentication configured for request");return null}function X6e(t,e){switch(e){case 2:return t.get("npmAlwaysAuth");case 1:case 3:return!0;case 0:return!1;default:throw new Error("Unreachable")}}async function J6e(t,e,{configuration:r}){var i;if(typeof e=="undefined"||typeof e.authorization=="undefined")return"an anonymous user";try{return(i=(await Zt.get(new Dce.URL(`${t}/-/whoami`).href,{configuration:r,headers:e,jsonResponse:!0})).username)!=null?i:"an unknown user"}catch{return"an unknown user"}}async function yT(){if(process.env.TEST_ENV)return process.env.TEST_NPM_2FA_TOKEN||"";let{otp:t}=await(0,Pce.prompt)({type:"password",name:"otp",message:"One-time password:",required:!0,onCancel:()=>process.exit(130)});return t}function wT(t){var e,r;if(((e=t.originalError)==null?void 0:e.name)!=="HTTPError")return!1;try{return((r=t.originalError)==null?void 0:r.response.headers["www-authenticate"].split(/,\s*/).map(n=>n.toLowerCase())).includes("otp")}catch(i){return!1}}function BT(t){return{["npm-otp"]:t}}var QT=class{supports(e,r){if(!e.reference.startsWith(ir))return!1;let{selector:i,params:n}=S.parseRange(e.reference);return!(!Rce.default.valid(i)||n===null||typeof n.__archiveUrl!="string")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote server`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let{params:i}=S.parseRange(e.reference);if(i===null||typeof i.__archiveUrl!="string")throw new Error("Assertion failed: The archiveUrl querystring parameter should have been available");let n=await zs(i.__archiveUrl,{configuration:r.project.configuration,ident:e});return await Ai.convertToZip(n,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}};var bT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(ir)||!S.tryParseDescriptor(e.range.slice(ir.length),!0))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){let i=S.parseDescriptor(e.range.slice(ir.length),!0);return r.resolver.getResolutionDependencies(i,r)}async getCandidates(e,r,i){let n=S.parseDescriptor(e.range.slice(ir.length),!0);return await i.resolver.getCandidates(n,r,i)}async getSatisfying(e,r,i){let n=S.parseDescriptor(e.range.slice(ir.length),!0);return i.resolver.getSatisfying(n,r,i)}resolve(e,r){throw new Error("Unreachable")}};var vT=ie(Or()),Fce=ie(require("url"));var Vs=class{supports(e,r){if(!e.reference.startsWith(ir))return!1;let i=new Fce.URL(e.reference);return!(!vT.default.valid(i.pathname)||i.searchParams.has("__archiveUrl"))}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the remote registry`),loader:()=>this.fetchFromNetwork(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),checksum:o}}async fetchFromNetwork(e,r){let i;try{i=await zs(Vs.getLocatorUrl(e),{configuration:r.project.configuration,ident:e})}catch(n){i=await zs(Vs.getLocatorUrl(e).replace(/%2f/g,"/"),{configuration:r.project.configuration,ident:e})}return await Ai.convertToZip(i,{compressionLevel:r.project.configuration.get("compressionLevel"),prefixPath:S.getIdentVendorPath(e),stripComponents:1})}static isConventionalTarballUrl(e,r,{configuration:i}){let n=Ya(e.scope,{configuration:i}),s=Vs.getLocatorUrl(e);return r=r.replace(/^https?:(\/\/(?:[^/]+\.)?npmjs.org(?:$|\/))/,"https:$1"),n=n.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r=r.replace(/^https:\/\/registry\.npmjs\.org($|\/)/,"https://registry.yarnpkg.com$1"),r===n+s||r===n+s.replace(/%2f/g,"/")}static getLocatorUrl(e){let r=vT.default.clean(e.reference.slice(ir.length));if(r===null)throw new nt(z.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");return`${zA(e)}/-/${e.name}-${r}.tgz`}};var ST=ie(Or());var rQ=S.makeIdent(null,"node-gyp"),Z6e=/\b(node-gyp|prebuild-install)\b/,xT=class{supportsDescriptor(e,r){return e.range.startsWith(ir)?!!qt.validRange(e.range.slice(ir.length)):!1}supportsLocator(e,r){if(!e.reference.startsWith(ir))return!1;let{selector:i}=S.parseRange(e.reference);return!!ST.default.valid(i)}shouldPersistResolution(e,r){return!0}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=qt.validRange(e.range.slice(ir.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(ir.length)}`);let s=await zs(zA(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0}),o=de.mapAndFilter(Object.keys(s.versions),c=>{try{let u=new qt.SemVer(c);if(n.test(u))return u}catch{}return de.mapAndFilter.skip}),a=o.filter(c=>!s.versions[c.raw].deprecated),l=a.length>0?a:o;return l.sort((c,u)=>-c.compare(u)),l.map(c=>{let u=S.makeLocator(e,`${ir}${c.raw}`),g=s.versions[c.raw].dist.tarball;return Vs.isConventionalTarballUrl(u,g,{configuration:i.project.configuration})?u:S.bindLocator(u,{__archiveUrl:g})})}async getSatisfying(e,r,i){let n=qt.validRange(e.range.slice(ir.length));if(n===null)throw new Error(`Expected a valid range, got ${e.range.slice(ir.length)}`);return de.mapAndFilter(r,s=>{try{let{selector:o}=S.parseRange(s,{requireProtocol:ir}),a=new qt.SemVer(o);if(n.test(a))return{reference:s,version:a}}catch{}return de.mapAndFilter.skip}).sort((s,o)=>-s.version.compare(o.version)).map(({reference:s})=>S.makeLocator(e,s))}async resolve(e,r){let{selector:i}=S.parseRange(e.reference),n=ST.default.clean(i);if(n===null)throw new nt(z.RESOLVER_NOT_FOUND,"The npm semver resolver got selected, but the version isn't semver");let s=await zs(zA(e),{configuration:r.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"versions"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(!Object.prototype.hasOwnProperty.call(s.versions,n))throw new nt(z.REMOTE_NOT_FOUND,`Registry failed to return reference "${n}"`);let o=new Ze;if(o.load(s.versions[n]),!o.dependencies.has(rQ.identHash)&&!o.peerDependencies.has(rQ.identHash)){for(let a of o.scripts.values())if(a.match(Z6e)){o.dependencies.set(rQ.identHash,S.makeDescriptor(rQ,"latest")),r.report.reportWarningOnce(z.NODE_GYP_INJECTED,`${S.prettyLocator(r.project.configuration,e)}: Implicit dependencies on node-gyp are discouraged`);break}}return typeof o.raw.deprecated=="string"&&r.report.reportWarningOnce(z.DEPRECATED_PACKAGE,`${S.prettyLocator(r.project.configuration,e)} is deprecated: ${o.raw.deprecated}`),_(P({},e),{version:n,languageName:"node",linkType:gt.HARD,conditions:o.getConditions(),dependencies:o.dependencies,peerDependencies:o.peerDependencies,dependenciesMeta:o.dependenciesMeta,peerDependenciesMeta:o.peerDependenciesMeta,bin:o.bin})}};var kT=class{supportsDescriptor(e,r){return!(!e.range.startsWith(ir)||!Rg.test(e.range.slice(ir.length)))}supportsLocator(e,r){return!1}shouldPersistResolution(e,r){throw new Error("Unreachable")}bindDescriptor(e,r,i){return e}getResolutionDependencies(e,r){return[]}async getCandidates(e,r,i){let n=e.range.slice(ir.length),s=await zs(zA(e),{configuration:i.project.configuration,ident:e,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(s,"dist-tags"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data - missing "dist-tags" field');let o=s["dist-tags"];if(!Object.prototype.hasOwnProperty.call(o,n))throw new nt(z.REMOTE_NOT_FOUND,`Registry failed to return tag "${n}"`);let a=o[n],l=S.makeLocator(e,`${ir}${a}`),c=s.versions[a].dist.tarball;return Vs.isConventionalTarballUrl(l,c,{configuration:i.project.configuration})?[l]:[S.bindLocator(l,{__archiveUrl:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){throw new Error("Unreachable")}};var Rf={};it(Rf,{getGitHead:()=>_7e,makePublishBody:()=>V7e});var CM={};it(CM,{default:()=>D7e,packUtils:()=>za});var za={};it(za,{genPackList:()=>QQ,genPackStream:()=>dM,genPackageManifest:()=>age,hasPackScripts:()=>hM,prepareForPack:()=>pM});var fM=ie(Nn()),sge=ie(nge()),oge=ie(require("zlib")),I7e=["/package.json","/readme","/readme.*","/license","/license.*","/licence","/licence.*","/changelog","/changelog.*"],y7e=["/package.tgz",".github",".git",".hg","node_modules",".npmignore",".gitignore",".#*",".DS_Store"];async function hM(t){return!!(Kt.hasWorkspaceScript(t,"prepack")||Kt.hasWorkspaceScript(t,"postpack"))}async function pM(t,{report:e},r){await Kt.maybeExecuteWorkspaceLifecycleScript(t,"prepack",{report:e});try{let i=v.join(t.cwd,Ze.fileName);await T.existsPromise(i)&&await t.manifest.loadFile(i,{baseFs:T}),await r()}finally{await Kt.maybeExecuteWorkspaceLifecycleScript(t,"postpack",{report:e})}}async function dM(t,e){var s,o;typeof e=="undefined"&&(e=await QQ(t));let r=new Set;for(let a of(o=(s=t.manifest.publishConfig)==null?void 0:s.executableFiles)!=null?o:new Set)r.add(v.normalize(a));for(let a of t.manifest.bin.values())r.add(v.normalize(a));let i=sge.default.pack();process.nextTick(async()=>{for(let a of e){let l=v.normalize(a),c=v.resolve(t.cwd,l),u=v.join("package",l),g=await T.lstatPromise(c),f={name:u,mtime:new Date(mr.SAFE_TIME*1e3)},h=r.has(l)?493:420,p,d,m=new Promise((B,b)=>{p=B,d=b}),I=B=>{B?d(B):p()};if(g.isFile()){let B;l==="package.json"?B=Buffer.from(JSON.stringify(await age(t),null,2)):B=await T.readFilePromise(c),i.entry(_(P({},f),{mode:h,type:"file"}),B,I)}else g.isSymbolicLink()?i.entry(_(P({},f),{mode:h,type:"symlink",linkname:await T.readlinkPromise(c)}),I):I(new Error(`Unsupported file type ${g.mode} for ${M.fromPortablePath(l)}`));await m}i.finalize()});let n=(0,oge.createGzip)();return i.pipe(n),n}async function age(t){let e=JSON.parse(JSON.stringify(t.manifest.raw));return await t.project.configuration.triggerHook(r=>r.beforeWorkspacePacking,t,e),e}async function QQ(t){var g,f,h,p,d,m,I,B;let e=t.project,r=e.configuration,i={accept:[],reject:[]};for(let b of y7e)i.reject.push(b);for(let b of I7e)i.accept.push(b);i.reject.push(r.get("rcFilename"));let n=b=>{if(b===null||!b.startsWith(`${t.cwd}/`))return;let R=v.relative(t.cwd,b),H=v.resolve(Se.root,R);i.reject.push(H)};n(v.resolve(e.cwd,r.get("lockfileFilename"))),n(r.get("cacheFolder")),n(r.get("globalFolder")),n(r.get("installStatePath")),n(r.get("virtualFolder")),n(r.get("yarnPath")),await r.triggerHook(b=>b.populateYarnPaths,e,b=>{n(b)});for(let b of e.workspaces){let R=v.relative(t.cwd,b.cwd);R!==""&&!R.match(/^(\.\.)?\//)&&i.reject.push(`/${R}`)}let s={accept:[],reject:[]},o=(f=(g=t.manifest.publishConfig)==null?void 0:g.main)!=null?f:t.manifest.main,a=(p=(h=t.manifest.publishConfig)==null?void 0:h.module)!=null?p:t.manifest.module,l=(m=(d=t.manifest.publishConfig)==null?void 0:d.browser)!=null?m:t.manifest.browser,c=(B=(I=t.manifest.publishConfig)==null?void 0:I.bin)!=null?B:t.manifest.bin;o!=null&&s.accept.push(v.resolve(Se.root,o)),a!=null&&s.accept.push(v.resolve(Se.root,a)),typeof l=="string"&&s.accept.push(v.resolve(Se.root,l));for(let b of c.values())s.accept.push(v.resolve(Se.root,b));if(l instanceof Map)for(let[b,R]of l.entries())s.accept.push(v.resolve(Se.root,b)),typeof R=="string"&&s.accept.push(v.resolve(Se.root,R));let u=t.manifest.files!==null;if(u){s.reject.push("/*");for(let b of t.manifest.files)Age(s.accept,b,{cwd:Se.root})}return await w7e(t.cwd,{hasExplicitFileList:u,globalList:i,ignoreList:s})}async function w7e(t,{hasExplicitFileList:e,globalList:r,ignoreList:i}){let n=[],s=new Zo(t),o=[[Se.root,[i]]];for(;o.length>0;){let[a,l]=o.pop(),c=await s.lstatPromise(a);if(!cge(a,{globalList:r,ignoreLists:c.isDirectory()?null:l}))if(c.isDirectory()){let u=await s.readdirPromise(a),g=!1,f=!1;if(!e||a!==Se.root)for(let d of u)g=g||d===".gitignore",f=f||d===".npmignore";let h=f?await lge(s,a,".npmignore"):g?await lge(s,a,".gitignore"):null,p=h!==null?[h].concat(l):l;cge(a,{globalList:r,ignoreLists:l})&&(p=[...l,{accept:[],reject:["**/*"]}]);for(let d of u)o.push([v.resolve(a,d),p])}else(c.isFile()||c.isSymbolicLink())&&n.push(v.relative(Se.root,a))}return n.sort()}async function lge(t,e,r){let i={accept:[],reject:[]},n=await t.readFilePromise(v.join(e,r),"utf8");for(let s of n.split(/\n/g))Age(i.reject,s,{cwd:e});return i}function B7e(t,{cwd:e}){let r=t[0]==="!";return r&&(t=t.slice(1)),t.match(/\.{0,1}\//)&&(t=v.resolve(e,t)),r&&(t=`!${t}`),t}function Age(t,e,{cwd:r}){let i=e.trim();i===""||i[0]==="#"||t.push(B7e(i,{cwd:r}))}function cge(t,{globalList:e,ignoreLists:r}){if(bQ(t,e.accept))return!1;if(bQ(t,e.reject))return!0;if(r!==null)for(let i of r){if(bQ(t,i.accept))return!1;if(bQ(t,i.reject))return!0}return!1}function bQ(t,e){let r=e,i=[];for(let n=0;n{await pM(i,{report:l},async()=>{l.reportJson({base:M.fromPortablePath(i.cwd)});let c=await QQ(i);for(let u of c)l.reportInfo(null,M.fromPortablePath(u)),l.reportJson({location:M.fromPortablePath(u)});if(!this.dryRun){let u=await dM(i,c),g=T.createWriteStream(s);u.pipe(g),await new Promise(f=>{g.on("finish",f)})}}),this.dryRun||(l.reportInfo(z.UNNAMED,`Package archive generated in ${ue.pretty(e,s,ue.Type.PATH)}`),l.reportJson({output:M.fromPortablePath(s)}))})).exitCode()}};fm.paths=[["pack"]],fm.usage=ye.Usage({description:"generate a tarball from the active workspace",details:"\n This command will turn the active workspace into a compressed archive suitable for publishing. The archive will by default be stored at the root of the workspace (`package.tgz`).\n\n If the `-o,---out` is set the archive will be created at the specified path. The `%s` and `%v` variables can be used within the path and will be respectively replaced by the package name and version.\n ",examples:[["Create an archive from the active workspace","yarn pack"],["List the files that would be made part of the workspace's archive","yarn pack --dry-run"],["Name and output the archive in a dedicated folder","yarn pack --out /artifacts/%s-%v.tgz"]]});var gge=fm;function Q7e(t,{workspace:e}){let r=t.replace("%s",b7e(e)).replace("%v",v7e(e));return M.toPortablePath(r)}function b7e(t){return t.manifest.name!==null?S.slugifyIdent(t.manifest.name):"package"}function v7e(t){return t.manifest.version!==null?t.manifest.version:"unknown"}var S7e=["dependencies","devDependencies","peerDependencies"],x7e="workspace:",k7e=(t,e)=>{var i,n;e.publishConfig&&(e.publishConfig.main&&(e.main=e.publishConfig.main),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.module&&(e.module=e.publishConfig.module),e.publishConfig.browser&&(e.browser=e.publishConfig.browser),e.publishConfig.exports&&(e.exports=e.publishConfig.exports),e.publishConfig.bin&&(e.bin=e.publishConfig.bin));let r=t.project;for(let s of S7e)for(let o of t.manifest.getForScope(s).values()){let a=r.tryWorkspaceByDescriptor(o),l=S.parseRange(o.range);if(l.protocol===x7e)if(a===null){if(r.tryWorkspaceByIdent(o)===null)throw new nt(z.WORKSPACE_NOT_FOUND,`${S.prettyDescriptor(r.configuration,o)}: No local workspace found for this range`)}else{let c;S.areDescriptorsEqual(o,a.anchoredDescriptor)||l.selector==="*"?c=(i=a.manifest.version)!=null?i:"0.0.0":l.selector==="~"||l.selector==="^"?c=`${l.selector}${(n=a.manifest.version)!=null?n:"0.0.0"}`:c=l.selector,e[s][S.stringifyIdent(o)]=c}}},P7e={hooks:{beforeWorkspacePacking:k7e},commands:[gge]},D7e=P7e;var yge=ie(require("crypto")),wge=ie(Ige()),Bge=ie(require("url"));async function V7e(t,e,{access:r,tag:i,registry:n,gitHead:s}){let o=t.project.configuration,a=t.manifest.name,l=t.manifest.version,c=S.stringifyIdent(a),u=(0,yge.createHash)("sha1").update(e).digest("hex"),g=wge.default.fromData(e).toString();typeof r=="undefined"&&(t.manifest.publishConfig&&typeof t.manifest.publishConfig.access=="string"?r=t.manifest.publishConfig.access:o.get("npmPublishAccess")!==null?r=o.get("npmPublishAccess"):a.scope?r="restricted":r="public");let f=await za.genPackageManifest(t),h=`${c}-${l}.tgz`,p=new Bge.URL(`${To(n)}/${c}/-/${h}`);return{_id:c,_attachments:{[h]:{content_type:"application/octet-stream",data:e.toString("base64"),length:e.length}},name:c,access:r,["dist-tags"]:{[i]:l},versions:{[l]:_(P({},f),{_id:`${c}@${l}`,name:c,version:l,gitHead:s,dist:{shasum:u,integrity:g,tarball:p.toString()}})}}}async function _7e(t){try{let{stdout:e}=await hr.execvp("git",["rev-parse","--revs-only","HEAD"],{cwd:t});return e.trim()===""?void 0:e.trim()}catch{return}}var wM={npmAlwaysAuth:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.BOOLEAN,default:!1},npmAuthIdent:{description:"Authentication identity for the npm registry (_auth in npm and yarn v1)",type:ge.SECRET,default:null},npmAuthToken:{description:"Authentication token for the npm registry (_authToken in npm and yarn v1)",type:ge.SECRET,default:null}},Qge={npmAuditRegistry:{description:"Registry to query for audit reports",type:ge.STRING,default:null},npmPublishRegistry:{description:"Registry to push packages to",type:ge.STRING,default:null},npmRegistryServer:{description:"URL of the selected npm registry (note: npm enterprise isn't supported)",type:ge.STRING,default:"https://registry.yarnpkg.com"}},X7e={configuration:_(P(P({},wM),Qge),{npmScopes:{description:"Settings per package scope",type:ge.MAP,valueDefinition:{description:"",type:ge.SHAPE,properties:P(P({},wM),Qge)}},npmRegistries:{description:"Settings per registry",type:ge.MAP,normalizeKeys:To,valueDefinition:{description:"",type:ge.SHAPE,properties:P({},wM)}}}),fetchers:[QT,Vs],resolvers:[bT,xT,kT]},Z7e=X7e;var vM={};it(vM,{default:()=>a_e});Ss();var Ho;(function(i){i.All="all",i.Production="production",i.Development="development"})(Ho||(Ho={}));var Xs;(function(s){s.Info="info",s.Low="low",s.Moderate="moderate",s.High="high",s.Critical="critical"})(Xs||(Xs={}));var vQ=[Xs.Info,Xs.Low,Xs.Moderate,Xs.High,Xs.Critical];function bge(t,e){let r=[],i=new Set,n=o=>{i.has(o)||(i.add(o),r.push(o))};for(let o of e)n(o);let s=new Set;for(;r.length>0;){let o=r.shift(),a=t.storedResolutions.get(o);if(typeof a=="undefined")throw new Error("Assertion failed: Expected the resolution to have been registered");let l=t.storedPackages.get(a);if(!!l){s.add(o);for(let c of l.dependencies.values())n(c.descriptorHash)}}return s}function $7e(t,e){return new Set([...t].filter(r=>!e.has(r)))}function e_e(t,e,{all:r}){let i=r?t.workspaces:[e],n=i.map(f=>f.manifest),s=new Set(n.map(f=>[...f.dependencies].map(([h,p])=>h)).flat()),o=new Set(n.map(f=>[...f.devDependencies].map(([h,p])=>h)).flat()),a=i.map(f=>[...f.dependencies.values()]).flat(),l=a.filter(f=>s.has(f.identHash)).map(f=>f.descriptorHash),c=a.filter(f=>o.has(f.identHash)).map(f=>f.descriptorHash),u=bge(t,l),g=bge(t,c);return $7e(g,u)}function vge(t){let e={};for(let r of t)e[S.stringifyIdent(r)]=S.parseRange(r.range).selector;return e}function Sge(t){if(typeof t=="undefined")return new Set;let e=vQ.indexOf(t),r=vQ.slice(e);return new Set(r)}function t_e(t,e){let r=Sge(e),i={};for(let n of r)i[n]=t[n];return i}function xge(t,e){var i;let r=t_e(t,e);for(let n of Object.keys(r))if((i=r[n])!=null?i:0>0)return!0;return!1}function kge(t,e){var s;let r={},i={children:r},n=Object.values(t.advisories);if(e!=null){let o=Sge(e);n=n.filter(a=>o.has(a.severity))}for(let o of de.sortMap(n,a=>a.module_name))r[o.module_name]={label:o.module_name,value:ue.tuple(ue.Type.RANGE,o.findings.map(a=>a.version).join(", ")),children:{Issue:{label:"Issue",value:ue.tuple(ue.Type.NO_HINT,o.title)},URL:{label:"URL",value:ue.tuple(ue.Type.URL,o.url)},Severity:{label:"Severity",value:ue.tuple(ue.Type.NO_HINT,o.severity)},["Vulnerable Versions"]:{label:"Vulnerable Versions",value:ue.tuple(ue.Type.RANGE,o.vulnerable_versions)},["Patched Versions"]:{label:"Patched Versions",value:ue.tuple(ue.Type.RANGE,o.patched_versions)},Via:{label:"Via",value:ue.tuple(ue.Type.NO_HINT,Array.from(new Set(o.findings.map(a=>a.paths).flat().map(a=>a.split(">")[0]))).join(", "))},Recommendation:{label:"Recommendation",value:ue.tuple(ue.Type.NO_HINT,(s=o.recommendation)==null?void 0:s.replace(/\n/g," "))}}};return i}function Pge(t,e,{all:r,environment:i}){let n=r?t.workspaces:[e],s=[Ho.All,Ho.Production].includes(i),o=[];if(s)for(let c of n)for(let u of c.manifest.dependencies.values())o.push(u);let a=[Ho.All,Ho.Development].includes(i),l=[];if(a)for(let c of n)for(let u of c.manifest.devDependencies.values())l.push(u);return vge([...o,...l].filter(c=>S.parseRange(c.range).protocol===null))}function Dge(t,e,{all:r}){var s;let i=e_e(t,e,{all:r}),n={};for(let o of t.storedPackages.values())n[S.stringifyIdent(o)]={version:(s=o.version)!=null?s:"0.0.0",integrity:o.identHash,requires:vge(o.dependencies.values()),dev:i.has(S.convertLocatorToDescriptor(o).descriptorHash)};return n}var dm=class extends Be{constructor(){super(...arguments);this.all=Y.Boolean("-A,--all",!1,{description:"Audit dependencies from all workspaces"});this.recursive=Y.Boolean("-R,--recursive",!1,{description:"Audit transitive dependencies as well"});this.environment=Y.String("--environment",Ho.All,{description:"Which environments to cover",validator:Yi(Ho)});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.severity=Y.String("--severity",Xs.Info,{description:"Minimal severity requested for packages to be displayed",validator:Yi(Xs)})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=Pge(r,i,{all:this.all,environment:this.environment}),s=Dge(r,i,{all:this.all});if(!this.recursive)for(let f of Object.keys(s))Object.prototype.hasOwnProperty.call(n,f)?s[f].requires={}:delete s[f];let o={requires:n,dependencies:s},a=gr.getAuditRegistry(i.manifest,{configuration:e}),l,c=await Fa.start({configuration:e,stdout:this.context.stdout},async()=>{l=await Lt.post("/-/npm/v1/security/audits/quick",o,{authType:Lt.AuthType.BEST_EFFORT,configuration:e,jsonResponse:!0,registry:a})});if(c.hasErrors())return c.exitCode();let u=xge(l.metadata.vulnerabilities,this.severity);return!this.json&&u?(Hs.emitTree(kge(l,this.severity),{configuration:e,json:this.json,stdout:this.context.stdout,separators:2}),1):(await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async f=>{f.reportJson(l),u||f.reportInfo(z.EXCEPTION,"No audit suggestions")})).exitCode()}};dm.paths=[["npm","audit"]],dm.usage=ye.Usage({description:"perform a vulnerability audit against the installed packages",details:` + This command checks for known security reports on the packages you use. The reports are by default extracted from the npm registry, and may or may not be relevant to your actual program (not all vulnerabilities affect all code paths). + + For consistency with our other commands the default is to only check the direct dependencies for the active workspace. To extend this search to all workspaces, use \`-A,--all\`. To extend this search to both direct and transitive dependencies, use \`-R,--recursive\`. + + Applying the \`--severity\` flag will limit the audit table to vulnerabilities of the corresponding severity and above. Valid values are ${vQ.map(e=>`\`${e}\``).join(", ")}. + + If the \`--json\` flag is set, Yarn will print the output exactly as received from the registry. Regardless of this flag, the process will exit with a non-zero exit code if a report is found for the selected packages. + + To understand the dependency tree requiring vulnerable packages, check the raw report with the \`--json\` flag or use \`yarn why \` to get more information as to who depends on them. + `,examples:[["Checks for known security issues with the installed packages. The output is a list of known issues.","yarn npm audit"],["Audit dependencies in all workspaces","yarn npm audit --all"],["Limit auditing to `dependencies` (excludes `devDependencies`)","yarn npm audit --environment production"],["Show audit report as valid JSON","yarn npm audit --json"],["Audit all direct and transitive dependencies","yarn npm audit --recursive"],["Output moderate (or more severe) vulnerabilities","yarn npm audit --severity moderate"]]});var Rge=dm;var BM=ie(Or()),QM=ie(require("util")),Cm=class extends Be{constructor(){super(...arguments);this.fields=Y.String("-f,--fields",{description:"A comma-separated list of manifest fields that should be displayed"});this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.packages=Y.Rest()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r}=await Ke.find(e,this.context.cwd),i=typeof this.fields!="undefined"?new Set(["name",...this.fields.split(/\s*,\s*/)]):null,n=[],s=!1,o=await Fe.start({configuration:e,includeFooter:!1,json:this.json,stdout:this.context.stdout},async a=>{for(let l of this.packages){let c;if(l==="."){let b=r.topLevelWorkspace;if(!b.manifest.name)throw new me(`Missing 'name' field in ${M.fromPortablePath(v.join(b.cwd,wt.manifest))}`);c=S.makeDescriptor(b.manifest.name,"unknown")}else c=S.parseDescriptor(l);let u=Lt.getIdentUrl(c),g=bM(await Lt.get(u,{configuration:e,ident:c,jsonResponse:!0,customErrorMessage:Lt.customPackageError})),f=Object.keys(g.versions).sort(BM.default.compareLoose),p=g["dist-tags"].latest||f[f.length-1],d=qt.validRange(c.range);if(d){let b=BM.default.maxSatisfying(f,d);b!==null?p=b:(a.reportWarning(z.UNNAMED,`Unmet range ${S.prettyRange(e,c.range)}; falling back to the latest version`),s=!0)}else c.range!=="unknown"&&(a.reportWarning(z.UNNAMED,`Invalid range ${S.prettyRange(e,c.range)}; falling back to the latest version`),s=!0);let m=g.versions[p],I=_(P(P({},g),m),{version:p,versions:f}),B;if(i!==null){B={};for(let b of i){let R=I[b];if(typeof R!="undefined")B[b]=R;else{a.reportWarning(z.EXCEPTION,`The '${b}' field doesn't exist inside ${S.prettyIdent(e,c)}'s informations`),s=!0;continue}}}else this.json||(delete I.dist,delete I.readme,delete I.users),B=I;a.reportJson(B),this.json||n.push(B)}});QM.inspect.styles.name="cyan";for(let a of n)(a!==n[0]||s)&&this.context.stdout.write(` +`),this.context.stdout.write(`${(0,QM.inspect)(a,{depth:Infinity,colors:!0,compact:!1})} +`);return o.exitCode()}};Cm.paths=[["npm","info"]],Cm.usage=ye.Usage({category:"Npm-related commands",description:"show information about a package",details:"\n This command will fetch information about a package from the npm registry, and prints it in a tree format.\n\n The package does not have to be installed locally, but needs to have been published (in particular, local changes will be ignored even for workspaces).\n\n Append `@` to the package argument to provide information specific to the latest version that satisfies the range. If the range is invalid or if there is no version satisfying the range, the command will print a warning and fall back to the latest version.\n\n If the `-f,--fields` option is set, it's a comma-separated list of fields which will be used to only display part of the package informations.\n\n By default, this command won't return the `dist`, `readme`, and `users` fields, since they are often very long. To explicitly request those fields, explicitly list them with the `--fields` flag or request the output in JSON mode.\n ",examples:[["Show all available information about react (except the `dist`, `readme`, and `users` fields)","yarn npm info react"],["Show all available information about react as valid JSON (including the `dist`, `readme`, and `users` fields)","yarn npm info react --json"],["Show all available information about react 16.12.0","yarn npm info react@16.12.0"],["Show the description of react","yarn npm info react --fields description"],["Show all available versions of react","yarn npm info react --fields versions"],["Show the readme of react","yarn npm info react --fields readme"],["Show a few fields of react","yarn npm info react --fields homepage,repository"]]});var Fge=Cm;function bM(t){if(Array.isArray(t)){let e=[];for(let r of t)r=bM(r),r&&e.push(r);return e}else if(typeof t=="object"&&t!==null){let e={};for(let r of Object.keys(t)){if(r.startsWith("_"))continue;let i=bM(t[r]);i&&(e[r]=i)}return e}else return t||null}var Nge=ie(aC()),mm=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Login to the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Login to the publish registry"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope});return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{let s=await i_e({registry:r,report:n,stdin:this.context.stdin,stdout:this.context.stdout}),o=`/-/user/org.couchdb.user:${encodeURIComponent(s.name)}`,a=await Lt.put(o,s,{attemptedAs:s.name,configuration:e,registry:r,jsonResponse:!0,authType:Lt.AuthType.NO_AUTH});return await r_e(r,a.token,{configuration:e,scope:this.scope}),n.reportInfo(z.UNNAMED,"Successfully logged in")})).exitCode()}};mm.paths=[["npm","login"]],mm.usage=ye.Usage({category:"Npm-related commands",description:"store new login info to access the npm registry",details:"\n This command will ask you for your username, password, and 2FA One-Time-Password (when it applies). It will then modify your local configuration (in your home folder, never in the project itself) to reference the new tokens thus generated.\n\n Adding the `-s,--scope` flag will cause the authentication to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the authentication to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n ",examples:[["Login to the default registry","yarn npm login"],["Login to the registry linked to the @my-scope registry","yarn npm login --scope my-scope"],["Login to the publish registry for the current package","yarn npm login --publish"]]});var Lge=mm;async function SQ({scope:t,publish:e,configuration:r,cwd:i}){return t&&e?gr.getScopeRegistry(t,{configuration:r,type:gr.RegistryType.PUBLISH_REGISTRY}):t?gr.getScopeRegistry(t,{configuration:r}):e?gr.getPublishRegistry((await rf(r,i)).manifest,{configuration:r}):gr.getDefaultRegistry({configuration:r})}async function r_e(t,e,{configuration:r,scope:i}){let n=o=>a=>{let l=de.isIndexableObject(a)?a:{},c=l[o],u=de.isIndexableObject(c)?c:{};return _(P({},l),{[o]:_(P({},u),{npmAuthToken:e})})},s=i?{npmScopes:n(i)}:{npmRegistries:n(t)};return await fe.updateHomeConfiguration(s)}async function i_e({registry:t,report:e,stdin:r,stdout:i}){if(process.env.TEST_ENV)return{name:process.env.TEST_NPM_USER||"",password:process.env.TEST_NPM_PASSWORD||""};e.reportInfo(z.UNNAMED,`Logging in to ${t}`);let n=!1;t.match(/^https:\/\/npm\.pkg\.github\.com(\/|$)/)&&(e.reportInfo(z.UNNAMED,"You seem to be using the GitHub Package Registry. Tokens must be generated with the 'repo', 'write:packages', and 'read:packages' permissions."),n=!0),e.reportSeparator();let{username:s,password:o}=await(0,Nge.prompt)([{type:"input",name:"username",message:"Username:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i},{type:"password",name:"password",message:n?"Token:":"Password:",required:!0,onCancel:()=>process.exit(130),stdin:r,stdout:i}]);return e.reportSeparator(),{name:s,password:o}}var Ff=new Set(["npmAuthIdent","npmAuthToken"]),Em=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Logout of the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Logout of the publish registry"});this.all=Y.Boolean("-A,--all",!1,{description:"Logout of all registries"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r=async()=>{var l;let n=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish,scope:this.scope}),s=await fe.find(this.context.cwd,this.context.plugins),o=S.makeIdent((l=this.scope)!=null?l:null,"pkg");return!gr.getAuthConfiguration(n,{configuration:s,ident:o}).get("npmAuthToken")};return(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{if(this.all&&(await n_e(),n.reportInfo(z.UNNAMED,"Successfully logged out from everything")),this.scope){await Tge("npmScopes",this.scope),await r()?n.reportInfo(z.UNNAMED,`Successfully logged out from ${this.scope}`):n.reportWarning(z.UNNAMED,"Scope authentication settings removed, but some other ones settings still apply to it");return}let s=await SQ({configuration:e,cwd:this.context.cwd,publish:this.publish});await Tge("npmRegistries",s),await r()?n.reportInfo(z.UNNAMED,`Successfully logged out from ${s}`):n.reportWarning(z.UNNAMED,"Registry authentication settings removed, but some other ones settings still apply to it")})).exitCode()}};Em.paths=[["npm","logout"]],Em.usage=ye.Usage({category:"Npm-related commands",description:"logout of the npm registry",details:"\n This command will log you out by modifying your local configuration (in your home folder, never in the project itself) to delete all credentials linked to a registry.\n\n Adding the `-s,--scope` flag will cause the deletion to be done against whatever registry is configured for the associated scope (see also `npmScopes`).\n\n Adding the `--publish` flag will cause the deletion to be done against the registry used when publishing the package (see also `publishConfig.registry` and `npmPublishRegistry`).\n\n Adding the `-A,--all` flag will cause the deletion to be done against all registries and scopes.\n ",examples:[["Logout of the default registry","yarn npm logout"],["Logout of the @my-scope scope","yarn npm logout --scope my-scope"],["Logout of the publish registry for the current package","yarn npm logout --publish"],["Logout of all registries","yarn npm logout --all"]]});var Mge=Em;function s_e(t,e){let r=t[e];if(!de.isIndexableObject(r))return!1;let i=new Set(Object.keys(r));if([...Ff].every(s=>!i.has(s)))return!1;for(let s of Ff)i.delete(s);if(i.size===0)return t[e]=void 0,!0;let n=P({},r);for(let s of Ff)delete n[s];return t[e]=n,!0}async function n_e(){let t=e=>{let r=!1,i=de.isIndexableObject(e)?P({},e):{};i.npmAuthToken&&(delete i.npmAuthToken,r=!0);for(let n of Object.keys(i))s_e(i,n)&&(r=!0);if(Object.keys(i).length!==0)return r?i:e};return await fe.updateHomeConfiguration({npmRegistries:t,npmScopes:t})}async function Tge(t,e){return await fe.updateHomeConfiguration({[t]:r=>{let i=de.isIndexableObject(r)?r:{};if(!Object.prototype.hasOwnProperty.call(i,e))return r;let n=i[e],s=de.isIndexableObject(n)?n:{},o=new Set(Object.keys(s));if([...Ff].every(l=>!o.has(l)))return r;for(let l of Ff)o.delete(l);if(o.size===0)return Object.keys(i).length===1?void 0:_(P({},i),{[e]:void 0});let a={};for(let l of Ff)a[l]=void 0;return _(P({},i),{[e]:P(P({},s),a)})}})}var Im=class extends Be{constructor(){super(...arguments);this.access=Y.String("--access",{description:"The access for the published package (public or restricted)"});this.tag=Y.String("--tag","latest",{description:"The tag on the registry that the package should be attached to"});this.tolerateRepublish=Y.Boolean("--tolerate-republish",!1,{description:"Warn and exit when republishing an already existing version of a package"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);if(i.manifest.private)throw new me("Private workspaces cannot be published");if(i.manifest.name===null||i.manifest.version===null)throw new me("Workspaces must have valid names and versions to be published on an external registry");await r.restoreInstallState();let n=i.manifest.name,s=i.manifest.version,o=gr.getPublishRegistry(i.manifest,{configuration:e});return(await Fe.start({configuration:e,stdout:this.context.stdout},async l=>{var c,u;if(this.tolerateRepublish)try{let g=await Lt.get(Lt.getIdentUrl(n),{configuration:e,registry:o,ident:n,jsonResponse:!0});if(!Object.prototype.hasOwnProperty.call(g,"versions"))throw new nt(z.REMOTE_INVALID,'Registry returned invalid data for - missing "versions" field');if(Object.prototype.hasOwnProperty.call(g.versions,s)){l.reportWarning(z.UNNAMED,`Registry already knows about version ${s}; skipping.`);return}}catch(g){if(((u=(c=g.originalError)==null?void 0:c.response)==null?void 0:u.statusCode)!==404)throw g}await Kt.maybeExecuteWorkspaceLifecycleScript(i,"prepublish",{report:l}),await za.prepareForPack(i,{report:l},async()=>{let g=await za.genPackList(i);for(let m of g)l.reportInfo(null,m);let f=await za.genPackStream(i,g),h=await de.bufferStream(f),p=await Rf.getGitHead(i.cwd),d=await Rf.makePublishBody(i,h,{access:this.access,tag:this.tag,registry:o,gitHead:p});await Lt.put(Lt.getIdentUrl(n),d,{configuration:e,registry:o,ident:n,jsonResponse:!0})}),l.reportInfo(z.UNNAMED,"Package archive published")})).exitCode()}};Im.paths=[["npm","publish"]],Im.usage=ye.Usage({category:"Npm-related commands",description:"publish the active workspace to the npm registry",details:'\n This command will pack the active workspace into a fresh archive and upload it to the npm registry.\n\n The package will by default be attached to the `latest` tag on the registry, but this behavior can be overriden by using the `--tag` option.\n\n Note that for legacy reasons scoped packages are by default published with an access set to `restricted` (aka "private packages"). This requires you to register for a paid npm plan. In case you simply wish to publish a public scoped package to the registry (for free), just add the `--access public` flag. This behavior can be enabled by default through the `npmPublishAccess` settings.\n ',examples:[["Publish the active workspace","yarn npm publish"]]});var Oge=Im;var Uge=ie(Or());var ym=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String({required:!1})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n;if(typeof this.package!="undefined")n=S.parseIdent(this.package);else{if(!i)throw new rt(r.cwd,this.context.cwd);if(!i.manifest.name)throw new me(`Missing 'name' field in ${M.fromPortablePath(v.join(i.cwd,wt.manifest))}`);n=i.manifest.name}let s=await wm(n,e),a={children:de.sortMap(Object.entries(s),([l])=>l).map(([l,c])=>({value:ue.tuple(ue.Type.RESOLUTION,{descriptor:S.makeDescriptor(n,l),locator:S.makeLocator(n,c)})}))};return Hs.emitTree(a,{configuration:e,json:this.json,stdout:this.context.stdout})}};ym.paths=[["npm","tag","list"]],ym.usage=ye.Usage({category:"Npm-related commands",description:"list all dist-tags of a package",details:` + This command will list all tags of a package from the npm registry. + + If the package is not specified, Yarn will default to the current workspace. + `,examples:[["List all tags of package `my-pkg`","yarn npm tag list my-pkg"]]});var Kge=ym;async function wm(t,e){let r=`/-/package${Lt.getIdentUrl(t)}/dist-tags`;return Lt.get(r,{configuration:e,ident:t,jsonResponse:!0,customErrorMessage:Lt.customPackageError})}var Bm=class extends Be{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=S.parseDescriptor(this.package,!0),s=n.range;if(!Uge.default.valid(s))throw new me(`The range ${ue.pretty(e,n.range,ue.Type.RANGE)} must be a valid semver version`);let o=gr.getPublishRegistry(i.manifest,{configuration:e}),a=ue.pretty(e,n,ue.Type.IDENT),l=ue.pretty(e,s,ue.Type.RANGE),c=ue.pretty(e,this.tag,ue.Type.CODE);return(await Fe.start({configuration:e,stdout:this.context.stdout},async g=>{let f=await wm(n,e);Object.prototype.hasOwnProperty.call(f,this.tag)&&f[this.tag]===s&&g.reportWarning(z.UNNAMED,`Tag ${c} is already set to version ${l}`);let h=`/-/package${Lt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Lt.put(h,s,{configuration:e,registry:o,ident:n,jsonRequest:!0,jsonResponse:!0}),g.reportInfo(z.UNNAMED,`Tag ${c} added to version ${l} of package ${a}`)})).exitCode()}};Bm.paths=[["npm","tag","add"]],Bm.usage=ye.Usage({category:"Npm-related commands",description:"add a tag for a specific version of a package",details:` + This command will add a tag to the npm registry for a specific version of a package. If the tag already exists, it will be overwritten. + `,examples:[["Add a `beta` tag for version `2.3.4-beta.4` of package `my-pkg`","yarn npm tag add my-pkg@2.3.4-beta.4 beta"]]});var Hge=Bm;var Qm=class extends Be{constructor(){super(...arguments);this.package=Y.String();this.tag=Y.String()}async execute(){if(this.tag==="latest")throw new me("The 'latest' tag cannot be removed.");let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);let n=S.parseIdent(this.package),s=gr.getPublishRegistry(i.manifest,{configuration:e}),o=ue.pretty(e,this.tag,ue.Type.CODE),a=ue.pretty(e,n,ue.Type.IDENT),l=await wm(n,e);if(!Object.prototype.hasOwnProperty.call(l,this.tag))throw new me(`${o} is not a tag of package ${a}`);return(await Fe.start({configuration:e,stdout:this.context.stdout},async u=>{let g=`/-/package${Lt.getIdentUrl(n)}/dist-tags/${encodeURIComponent(this.tag)}`;await Lt.del(g,{configuration:e,registry:s,ident:n,jsonResponse:!0}),u.reportInfo(z.UNNAMED,`Tag ${o} removed from package ${a}`)})).exitCode()}};Qm.paths=[["npm","tag","remove"]],Qm.usage=ye.Usage({category:"Npm-related commands",description:"remove a tag from a package",details:` + This command will remove a tag from a package from the npm registry. + `,examples:[["Remove the `beta` tag from package `my-pkg`","yarn npm tag remove my-pkg beta"]]});var Gge=Qm;var bm=class extends Be{constructor(){super(...arguments);this.scope=Y.String("-s,--scope",{description:"Print username for the registry configured for a given scope"});this.publish=Y.Boolean("--publish",!1,{description:"Print username for the publish registry"})}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),r;return this.scope&&this.publish?r=gr.getScopeRegistry(this.scope,{configuration:e,type:gr.RegistryType.PUBLISH_REGISTRY}):this.scope?r=gr.getScopeRegistry(this.scope,{configuration:e}):this.publish?r=gr.getPublishRegistry((await rf(e,this.context.cwd)).manifest,{configuration:e}):r=gr.getDefaultRegistry({configuration:e}),(await Fe.start({configuration:e,stdout:this.context.stdout},async n=>{var o,a;let s;try{s=await Lt.get("/-/whoami",{configuration:e,registry:r,authType:Lt.AuthType.ALWAYS_AUTH,jsonResponse:!0,ident:this.scope?S.makeIdent(this.scope,""):void 0})}catch(l){if(((o=l.response)==null?void 0:o.statusCode)===401||((a=l.response)==null?void 0:a.statusCode)===403){n.reportError(z.AUTHENTICATION_INVALID,"Authentication failed - your credentials may have expired");return}else throw l}n.reportInfo(z.UNNAMED,s.username)})).exitCode()}};bm.paths=[["npm","whoami"]],bm.usage=ye.Usage({category:"Npm-related commands",description:"display the name of the authenticated user",details:"\n Print the username associated with the current authentication settings to the standard output.\n\n When using `-s,--scope`, the username printed will be the one that matches the authentication settings of the registry associated with the given scope (those settings can be overriden using the `npmRegistries` map, and the registry associated with the scope is configured via the `npmScopes` map).\n\n When using `--publish`, the registry we'll select will by default be the one used when publishing packages (`publishConfig.registry` or `npmPublishRegistry` if available, otherwise we'll fallback to the regular `npmRegistryServer`).\n ",examples:[["Print username for the default registry","yarn npm whoami"],["Print username for the registry on a given scope","yarn npm whoami --scope company"]]});var jge=bm;var o_e={configuration:{npmPublishAccess:{description:"Default access of the published packages",type:ge.STRING,default:null}},commands:[Rge,Fge,Lge,Mge,Oge,Hge,Kge,Gge,jge]},a_e=o_e;var NM={};it(NM,{default:()=>B_e,patchUtils:()=>SM});var SM={};it(SM,{applyPatchFile:()=>PQ,diffFolders:()=>DM,extractPackageToDisk:()=>PM,extractPatchFlags:()=>Xge,isParentRequired:()=>kM,loadPatchFiles:()=>km,makeDescriptor:()=>I_e,makeLocator:()=>xM,parseDescriptor:()=>Sm,parseLocator:()=>xm,parsePatchFile:()=>kQ});var vm=class extends Error{constructor(e,r){super(`Cannot apply hunk #${e+1}`);this.hunk=r}};var A_e=/^@@ -(\d+)(,(\d+))? \+(\d+)(,(\d+))? @@.*/;function Nf(t){return v.relative(Se.root,v.resolve(Se.root,M.toPortablePath(t)))}function l_e(t){let e=t.trim().match(A_e);if(!e)throw new Error(`Bad header line: '${t}'`);return{original:{start:Math.max(Number(e[1]),1),length:Number(e[3]||1)},patched:{start:Math.max(Number(e[4]),1),length:Number(e[6]||1)}}}var c_e=420,u_e=493,Lr;(function(i){i.Context="context",i.Insertion="insertion",i.Deletion="deletion"})(Lr||(Lr={}));var Yge=()=>({semverExclusivity:null,diffLineFromPath:null,diffLineToPath:null,oldMode:null,newMode:null,deletedFileMode:null,newFileMode:null,renameFrom:null,renameTo:null,beforeHash:null,afterHash:null,fromPath:null,toPath:null,hunks:null}),g_e=t=>({header:l_e(t),parts:[]}),f_e={["@"]:"header",["-"]:Lr.Deletion,["+"]:Lr.Insertion,[" "]:Lr.Context,["\\"]:"pragma",undefined:Lr.Context};function p_e(t){let e=[],r=Yge(),i="parsing header",n=null,s=null;function o(){n&&(s&&(n.parts.push(s),s=null),r.hunks.push(n),n=null)}function a(){o(),e.push(r),r=Yge()}for(let l=0;l0?"patch":"mode change",B=null;switch(I){case"rename":{if(!u||!g)throw new Error("Bad parser state: rename from & to not given");e.push({type:"rename",semverExclusivity:i,fromPath:Nf(u),toPath:Nf(g)}),B=g}break;case"file deletion":{let b=n||p;if(!b)throw new Error("Bad parse state: no path given for file deletion");e.push({type:"file deletion",semverExclusivity:i,hunk:m&&m[0]||null,path:Nf(b),mode:xQ(l),hash:f})}break;case"file creation":{let b=s||d;if(!b)throw new Error("Bad parse state: no path given for file creation");e.push({type:"file creation",semverExclusivity:i,hunk:m&&m[0]||null,path:Nf(b),mode:xQ(c),hash:h})}break;case"patch":case"mode change":B=d||s;break;default:de.assertNever(I);break}B&&o&&a&&o!==a&&e.push({type:"mode change",semverExclusivity:i,path:Nf(B),oldMode:xQ(o),newMode:xQ(a)}),B&&m&&m.length&&e.push({type:"patch",semverExclusivity:i,path:Nf(B),hunks:m,beforeHash:f,afterHash:h})}if(e.length===0)throw new Error("Unable to parse patch file: No changes found. Make sure the patch is a valid UTF8 encoded string");return e}function xQ(t){let e=parseInt(t,8)&511;if(e!==c_e&&e!==u_e)throw new Error(`Unexpected file mode string: ${t}`);return e}function kQ(t){let e=t.split(/\n/g);return e[e.length-1]===""&&e.pop(),d_e(p_e(e))}function h_e(t){let e=0,r=0;for(let{type:i,lines:n}of t.parts)switch(i){case Lr.Context:r+=n.length,e+=n.length;break;case Lr.Deletion:e+=n.length;break;case Lr.Insertion:r+=n.length;break;default:de.assertNever(i);break}if(e!==t.header.original.length||r!==t.header.patched.length){let i=n=>n<0?n:`+${n}`;throw new Error(`hunk header integrity check failed (expected @@ ${i(t.header.original.length)} ${i(t.header.patched.length)} @@, got @@ ${i(e)} ${i(r)} @@)`)}}async function Lf(t,e,r){let i=await t.lstatPromise(e),n=await r();if(typeof n!="undefined"&&(e=n),t.lutimesPromise)await t.lutimesPromise(e,i.atime,i.mtime);else if(!i.isSymbolicLink())await t.utimesPromise(e,i.atime,i.mtime);else throw new Error("Cannot preserve the time values of a symlink")}async function PQ(t,{baseFs:e=new Wt,dryRun:r=!1,version:i=null}={}){for(let n of t)if(!(n.semverExclusivity!==null&&i!==null&&!qt.satisfiesWithPrereleases(i,n.semverExclusivity)))switch(n.type){case"file deletion":if(r){if(!e.existsSync(n.path))throw new Error(`Trying to delete a file that doesn't exist: ${n.path}`)}else await Lf(e,v.dirname(n.path),async()=>{await e.unlinkPromise(n.path)});break;case"rename":if(r){if(!e.existsSync(n.fromPath))throw new Error(`Trying to move a file that doesn't exist: ${n.fromPath}`)}else await Lf(e,v.dirname(n.fromPath),async()=>{await Lf(e,v.dirname(n.toPath),async()=>{await Lf(e,n.fromPath,async()=>(await e.movePromise(n.fromPath,n.toPath),n.toPath))})});break;case"file creation":if(r){if(e.existsSync(n.path))throw new Error(`Trying to create a file that already exists: ${n.path}`)}else{let s=n.hunk?n.hunk.parts[0].lines.join(` +`)+(n.hunk.parts[0].noNewlineAtEndOfFile?"":` +`):"";await e.mkdirpPromise(v.dirname(n.path),{chmod:493,utimes:[mr.SAFE_TIME,mr.SAFE_TIME]}),await e.writeFilePromise(n.path,s,{mode:n.mode}),await e.utimesPromise(n.path,mr.SAFE_TIME,mr.SAFE_TIME)}break;case"patch":await Lf(e,n.path,async()=>{await C_e(n,{baseFs:e,dryRun:r})});break;case"mode change":{let o=(await e.statPromise(n.path)).mode;if(qge(n.newMode)!==qge(o))continue;await Lf(e,n.path,async()=>{await e.chmodPromise(n.path,n.newMode)})}break;default:de.assertNever(n);break}}function qge(t){return(t&64)>0}function Jge(t){return t.replace(/\s+$/,"")}function m_e(t,e){return Jge(t)===Jge(e)}async function C_e({hunks:t,path:e},{baseFs:r,dryRun:i=!1}){let n=await r.statSync(e).mode,o=(await r.readFileSync(e,"utf8")).split(/\n/),a=[],l=0,c=0;for(let g of t){let f=Math.max(c,g.header.patched.start+l),h=Math.max(0,f-c),p=Math.max(0,o.length-f-g.header.original.length),d=Math.max(h,p),m=0,I=0,B=null;for(;m<=d;){if(m<=h&&(I=f-m,B=Wge(g,o,I),B!==null)){m=-m;break}if(m<=p&&(I=f+m,B=Wge(g,o,I),B!==null))break;m+=1}if(B===null)throw new vm(t.indexOf(g),g);a.push(B),l+=m,c=I+g.header.original.length}if(i)return;let u=0;for(let g of a)for(let f of g)switch(f.type){case"splice":{let h=f.index+u;o.splice(h,f.numToDelete,...f.linesToInsert),u+=f.linesToInsert.length-f.numToDelete}break;case"pop":o.pop();break;case"push":o.push(f.line);break;default:de.assertNever(f);break}await r.writeFilePromise(e,o.join(` +`),{mode:n})}function Wge(t,e,r){let i=[];for(let n of t.parts)switch(n.type){case Lr.Context:case Lr.Deletion:{for(let s of n.lines){let o=e[r];if(o==null||!m_e(o,s))return null;r+=1}n.type===Lr.Deletion&&(i.push({type:"splice",index:r-n.lines.length,numToDelete:n.lines.length,linesToInsert:[]}),n.noNewlineAtEndOfFile&&i.push({type:"push",line:""}))}break;case Lr.Insertion:i.push({type:"splice",index:r,numToDelete:0,linesToInsert:n.lines}),n.noNewlineAtEndOfFile&&i.push({type:"pop"});break;default:de.assertNever(n.type);break}return i}var E_e=/^builtin<([^>]+)>$/;function zge(t,e){let{source:r,selector:i,params:n}=S.parseRange(t);if(r===null)throw new Error("Patch locators must explicitly define their source");let s=i?i.split(/&/).map(c=>M.toPortablePath(c)):[],o=n&&typeof n.locator=="string"?S.parseLocator(n.locator):null,a=n&&typeof n.version=="string"?n.version:null,l=e(r);return{parentLocator:o,sourceItem:l,patchPaths:s,sourceVersion:a}}function Sm(t){let i=zge(t.range,S.parseDescriptor),{sourceItem:e}=i,r=qr(i,["sourceItem"]);return _(P({},r),{sourceDescriptor:e})}function xm(t){let i=zge(t.reference,S.parseLocator),{sourceItem:e}=i,r=qr(i,["sourceItem"]);return _(P({},r),{sourceLocator:e})}function Vge({parentLocator:t,sourceItem:e,patchPaths:r,sourceVersion:i,patchHash:n},s){let o=t!==null?{locator:S.stringifyLocator(t)}:{},a=typeof i!="undefined"?{version:i}:{},l=typeof n!="undefined"?{hash:n}:{};return S.makeRange({protocol:"patch:",source:s(e),selector:r.join("&"),params:P(P(P({},a),l),o)})}function I_e(t,{parentLocator:e,sourceDescriptor:r,patchPaths:i}){return S.makeLocator(t,Vge({parentLocator:e,sourceItem:r,patchPaths:i},S.stringifyDescriptor))}function xM(t,{parentLocator:e,sourcePackage:r,patchPaths:i,patchHash:n}){return S.makeLocator(t,Vge({parentLocator:e,sourceItem:r,sourceVersion:r.version,patchPaths:i,patchHash:n},S.stringifyLocator))}function _ge({onAbsolute:t,onRelative:e,onBuiltin:r},i){i.startsWith("~")&&(i=i.slice(1));let s=i.match(E_e);return s!==null?r(s[1]):v.isAbsolute(i)?t(i):e(i)}function Xge(t){let e=t.startsWith("~");return e&&(t=t.slice(1)),{optional:e}}function kM(t){return _ge({onAbsolute:()=>!1,onRelative:()=>!0,onBuiltin:()=>!1},t)}async function km(t,e,r){let i=t!==null?await r.fetcher.fetch(t,r):null,n=i&&i.localPath?{packageFs:new Ft(Se.root),prefixPath:v.relative(Se.root,i.localPath)}:i;i&&i!==n&&i.releaseFs&&i.releaseFs();let s=await de.releaseAfterUseAsync(async()=>await Promise.all(e.map(async o=>{let a=Xge(o),l=await _ge({onAbsolute:async()=>await T.readFilePromise(o,"utf8"),onRelative:async()=>{if(n===null)throw new Error("Assertion failed: The parent locator should have been fetched");return await n.packageFs.readFilePromise(v.join(n.prefixPath,o),"utf8")},onBuiltin:async c=>await r.project.configuration.firstHook(u=>u.getBuiltinPatch,r.project,c)},o);return _(P({},a),{source:l})})));for(let o of s)typeof o.source=="string"&&(o.source=o.source.replace(/\r\n?/g,` +`));return s}async function PM(t,{cache:e,project:r}){let i=r.storedPackages.get(t.locatorHash);if(typeof i=="undefined")throw new Error("Assertion failed: Expected the package to be registered");let n=r.storedChecksums,s=new ei,o=r.configuration.makeFetcher(),a=await o.fetch(t,{cache:e,project:r,fetcher:o,checksums:n,report:s}),l=await T.mktempPromise(),c=v.join(l,"source"),u=v.join(l,"user"),g=v.join(l,".yarn-patch.json");return await Promise.all([T.copyPromise(c,a.prefixPath,{baseFs:a.packageFs}),T.copyPromise(u,a.prefixPath,{baseFs:a.packageFs}),T.writeJsonPromise(g,{locator:S.stringifyLocator(t),version:i.version})]),T.detachTemp(l),u}async function DM(t,e){let r=M.fromPortablePath(t).replace(/\\/g,"/"),i=M.fromPortablePath(e).replace(/\\/g,"/"),{stdout:n,stderr:s}=await hr.execvp("git",["-c","core.safecrlf=false","diff","--src-prefix=a/","--dst-prefix=b/","--ignore-cr-at-eol","--full-index","--no-index","--text",r,i],{cwd:M.toPortablePath(process.cwd()),env:_(P({},process.env),{GIT_CONFIG_NOSYSTEM:"1",HOME:"",XDG_CONFIG_HOME:"",USERPROFILE:""})});if(s.length>0)throw new Error(`Unable to diff directories. Make sure you have a recent version of 'git' available in PATH. +The following error was reported by 'git': +${s}`);let o=r.startsWith("/")?a=>a.slice(1):a=>a;return n.replace(new RegExp(`(a|b)(${de.escapeRegExp(`/${o(r)}/`)})`,"g"),"$1/").replace(new RegExp(`(a|b)${de.escapeRegExp(`/${o(i)}/`)}`,"g"),"$1/").replace(new RegExp(de.escapeRegExp(`${r}/`),"g"),"").replace(new RegExp(de.escapeRegExp(`${i}/`),"g"),"")}function Zge(t,{configuration:e,report:r}){for(let i of t.parts)for(let n of i.lines)switch(i.type){case Lr.Context:r.reportInfo(null,` ${ue.pretty(e,n,"grey")}`);break;case Lr.Deletion:r.reportError(z.FROZEN_LOCKFILE_EXCEPTION,`- ${ue.pretty(e,n,ue.Type.REMOVED)}`);break;case Lr.Insertion:r.reportError(z.FROZEN_LOCKFILE_EXCEPTION,`+ ${ue.pretty(e,n,ue.Type.ADDED)}`);break;default:de.assertNever(i.type)}}var RM=class{supports(e,r){return!!e.reference.startsWith("patch:")}getLocalPath(e,r){return null}async fetch(e,r){let i=r.checksums.get(e.locatorHash)||null,[n,s,o]=await r.cache.fetchPackageFromCache(e,i,P({onHit:()=>r.report.reportCacheHit(e),onMiss:()=>r.report.reportCacheMiss(e,`${S.prettyLocator(r.project.configuration,e)} can't be found in the cache and will be fetched from the disk`),loader:()=>this.patchPackage(e,r),skipIntegrityCheck:r.skipIntegrityCheck},r.cacheOptions));return{packageFs:n,releaseFs:s,prefixPath:S.getIdentVendorPath(e),localPath:this.getLocalPath(e,r),checksum:o}}async patchPackage(e,r){let{parentLocator:i,sourceLocator:n,sourceVersion:s,patchPaths:o}=xm(e),a=await km(i,o,r),l=await T.mktempPromise(),c=v.join(l,"current.zip"),u=await r.fetcher.fetch(n,r),g=S.getIdentVendorPath(e),f=await $i(),h=new Jr(c,{libzip:f,create:!0,level:r.project.configuration.get("compressionLevel")});await de.releaseAfterUseAsync(async()=>{await h.copyPromise(g,u.prefixPath,{baseFs:u.packageFs,stableSort:!0})},u.releaseFs),h.saveAndClose();for(let{source:p,optional:d}of a){if(p===null)continue;let m=new Jr(c,{libzip:f,level:r.project.configuration.get("compressionLevel")}),I=new Ft(v.resolve(Se.root,g),{baseFs:m});try{await PQ(kQ(p),{baseFs:I,version:s})}catch(B){if(!(B instanceof vm))throw B;let b=r.project.configuration.get("enableInlineHunks"),R=!b&&!d?" (set enableInlineHunks for details)":"",H=`${S.prettyLocator(r.project.configuration,e)}: ${B.message}${R}`,L=K=>{!b||Zge(B.hunk,{configuration:r.project.configuration,report:K})};if(m.discardAndClose(),d){r.report.reportWarningOnce(z.PATCH_HUNK_FAILED,H,{reportExtra:L});continue}else throw new nt(z.PATCH_HUNK_FAILED,H,L)}m.saveAndClose()}return new Jr(c,{libzip:f,level:r.project.configuration.get("compressionLevel")})}};var y_e=3,FM=class{supportsDescriptor(e,r){return!!e.range.startsWith("patch:")}supportsLocator(e,r){return!!e.reference.startsWith("patch:")}shouldPersistResolution(e,r){return!1}bindDescriptor(e,r,i){let{patchPaths:n}=Sm(e);return n.every(s=>!kM(s))?e:S.bindDescriptor(e,{locator:S.stringifyLocator(r)})}getResolutionDependencies(e,r){let{sourceDescriptor:i}=Sm(e);return[i]}async getCandidates(e,r,i){if(!i.fetchOptions)throw new Error("Assertion failed: This resolver cannot be used unless a fetcher is configured");let{parentLocator:n,sourceDescriptor:s,patchPaths:o}=Sm(e),a=await km(n,o,i.fetchOptions),l=r.get(s.descriptorHash);if(typeof l=="undefined")throw new Error("Assertion failed: The dependency should have been resolved");let c=mn.makeHash(`${y_e}`,...a.map(u=>JSON.stringify(u))).slice(0,6);return[xM(e,{parentLocator:n,sourcePackage:l,patchPaths:o,patchHash:c})]}async getSatisfying(e,r,i){return null}async resolve(e,r){let{sourceLocator:i}=xm(e),n=await r.resolver.resolve(i,r);return P(P({},n),e)}};var Pm=class extends Be{constructor(){super(...arguments);this.save=Y.Boolean("-s,--save",!1,{description:"Add the patch to your resolution entries"});this.patchFolder=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let n=v.resolve(this.context.cwd,M.toPortablePath(this.patchFolder)),s=v.join(n,"../source"),o=v.join(n,"../.yarn-patch.json");if(!T.existsSync(s))throw new me("The argument folder didn't get created by 'yarn patch'");let a=await DM(s,n),l=await T.readJsonPromise(o),c=S.parseLocator(l.locator,!0);if(!r.storedPackages.has(c.locatorHash))throw new me("No package found in the project for the given locator");if(!this.save){this.context.stdout.write(a);return}let u=e.get("patchFolder"),g=v.join(u,S.slugifyLocator(c));await T.mkdirPromise(u,{recursive:!0}),await T.writeFilePromise(g,a);let f=v.relative(r.cwd,g);r.topLevelWorkspace.manifest.resolutions.push({pattern:{descriptor:{fullName:S.stringifyIdent(c),description:l.version}},reference:`patch:${S.stringifyLocator(c)}#${f}`}),await r.persist()}};Pm.paths=[["patch-commit"]],Pm.usage=ye.Usage({description:"generate a patch out of a directory",details:"\n This will print a patchfile on stdout based on the diff between the folder passed in and the original version of the package. Such file is suitable for consumption with the `patch:` protocol.\n\n Only folders generated by `yarn patch` are accepted as valid input for `yarn patch-commit`.\n "});var $ge=Pm;var Dm=class extends Be{constructor(){super(...arguments);this.json=Y.Boolean("--json",!1,{description:"Format the output as an NDJSON stream"});this.package=Y.String()}async execute(){let e=await fe.find(this.context.cwd,this.context.plugins),{project:r,workspace:i}=await Ke.find(e,this.context.cwd),n=await Qt.find(e);if(!i)throw new rt(r.cwd,this.context.cwd);await r.restoreInstallState();let s=S.parseLocator(this.package);if(s.reference==="unknown"){let o=de.mapAndFilter([...r.storedPackages.values()],a=>a.identHash!==s.identHash?de.mapAndFilter.skip:S.isVirtualLocator(a)?de.mapAndFilter.skip:a);if(o.length===0)throw new me("No package found in the project for the given locator");if(o.length>1)throw new me(`Multiple candidate packages found; explicitly choose one of them (use \`yarn why \` to get more information as to who depends on them): +${o.map(a=>` +- ${S.prettyLocator(e,a)}`).join("")}`);s=o[0]}if(!r.storedPackages.has(s.locatorHash))throw new me("No package found in the project for the given locator");await Fe.start({configuration:e,json:this.json,stdout:this.context.stdout},async o=>{let a=await PM(s,{cache:n,project:r});o.reportJson({locator:S.stringifyLocator(s),path:M.fromPortablePath(a)}),o.reportInfo(z.UNNAMED,`Package ${S.prettyLocator(e,s)} got extracted with success!`),o.reportInfo(z.UNNAMED,`You can now edit the following folder: ${ue.pretty(e,M.fromPortablePath(a),"magenta")}`),o.reportInfo(z.UNNAMED,`Once you are done run ${ue.pretty(e,`yarn patch-commit ${process.platform==="win32"?'"':""}${M.fromPortablePath(a)}${process.platform==="win32"?'"':""}`,"cyan")} and Yarn will store a patchfile based on your changes.`)})}};Dm.paths=[["patch"]],Dm.usage=ye.Usage({description:"prepare a package for patching",details:'\n This command will cause a package to be extracted in a temporary directory (under a folder named "patch-workdir"). This folder will be editable at will; running `yarn patch` inside it will then cause Yarn to generate a patchfile and register it into your top-level manifest (cf the `patch:` protocol).\n '});var efe=Dm;var w_e={configuration:{enableInlineHunks:{description:"If true, the installs will print unmatched patch hunks",type:ge.BOOLEAN,default:!1},patchFolder:{description:"Folder where the patch files must be written",type:ge.ABSOLUTE_PATH,default:"./.yarn/patches"}},commands:[$ge,efe],fetchers:[RM],resolvers:[FM]},B_e=w_e;var TM={};it(TM,{default:()=>S_e});var tfe=ie(Wp()),LM=class{supportsPackage(e,r){return r.project.configuration.get("nodeLinker")==="pnpm"}async findPackageLocation(e,r){return nfe(e,{project:r.project})}async findPackageLocator(e,r){let i=ife(),n=r.project.installersCustomData.get(i);if(!n)throw new me(`The project in ${ue.pretty(r.project.configuration,`${r.project.cwd}/package.json`,ue.Type.PATH)} doesn't seem to have been installed - running an install there might help`);let s=e.match(/(^.*\/node_modules\/(@[^/]*\/)?[^/]+)(\/.*$)/);if(s){let l=n.locatorByPath.get(s[1]);if(l)return l}let o=e,a=e;do{a=o,o=v.dirname(a);let l=n.locatorByPath.get(a);if(l)return l}while(o!==a);return null}makeInstaller(e){return new rfe(e)}},rfe=class{constructor(e){this.opts=e;this.asyncActions=new afe;this.packageLocations=new Map;this.customData={locatorByPath:new Map}}getCustomDataKey(){return ife()}attachCustomData(e){this.customData=e}async installPackage(e,r,i){switch(e.linkType){case gt.SOFT:return this.installPackageSoft(e,r,i);case gt.HARD:return this.installPackageHard(e,r,i)}throw new Error("Assertion failed: Unsupported package link type")}async installPackageSoft(e,r,i){let n=v.resolve(r.packageFs.getRealPath(),r.prefixPath);return this.packageLocations.set(e.locatorHash,n),{packageLocation:n,buildDirective:null}}async installPackageHard(e,r,i){var u;let n=nfe(e,{project:this.opts.project});this.customData.locatorByPath.set(n,S.stringifyLocator(e)),this.packageLocations.set(e.locatorHash,n),i.holdFetchResult(this.asyncActions.set(e.locatorHash,async()=>{await T.mkdirPromise(n,{recursive:!0}),await T.copyPromise(n,r.prefixPath,{baseFs:r.packageFs,overwrite:!1})}));let o=S.isVirtualLocator(e)?S.devirtualizeLocator(e):e,a={manifest:(u=await Ze.tryFind(r.prefixPath,{baseFs:r.packageFs}))!=null?u:new Ze,misc:{hasBindingGyp:Ws.hasBindingGyp(r)}},l=this.opts.project.getDependencyMeta(o,e.version),c=Ws.extractBuildScripts(e,a,l,{configuration:this.opts.project.configuration,report:this.opts.report});return{packageLocation:n,buildDirective:c}}async attachInternalDependencies(e,r){this.opts.project.configuration.get("nodeLinker")==="pnpm"&&(!ofe(e,{project:this.opts.project})||this.asyncActions.reduce(e.locatorHash,async i=>{await i;let n=this.packageLocations.get(e.locatorHash);if(typeof n=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${S.stringifyLocator(e)})`);let s=v.join(n,wt.nodeModules);r.length>0&&await T.mkdirpPromise(s);let o=await Q_e(s),a=[];for(let[l,c]of r){let u=c;ofe(c,{project:this.opts.project})||(this.opts.report.reportWarning(z.UNNAMED,"The pnpm linker doesn't support providing different versions to workspaces' peer dependencies"),u=S.devirtualizeLocator(c));let g=this.packageLocations.get(u.locatorHash);if(typeof g=="undefined")throw new Error(`Assertion failed: Expected the package to have been registered (${S.stringifyLocator(c)})`);let f=S.stringifyIdent(l),h=v.join(s,f),p=v.relative(v.dirname(h),g),d=o.get(f);o.delete(f),a.push(Promise.resolve().then(async()=>{if(d){if(d.isSymbolicLink()&&await T.readlinkPromise(h)===p)return;await T.removePromise(h)}await T.mkdirpPromise(v.dirname(h)),process.platform=="win32"?await T.symlinkPromise(g,h,"junction"):await T.symlinkPromise(p,h)}))}for(let l of o.keys())a.push(T.removePromise(v.join(s,l)));await Promise.all(a)}))}async attachExternalDependents(e,r){throw new Error("External dependencies haven't been implemented for the pnpm linker")}async finalizeInstall(){let e=sfe(this.opts.project),r=new Set;for(let s of this.packageLocations.values())r.add(v.basename(s));let i;try{i=await T.readdirPromise(e)}catch{i=[]}let n=[];for(let s of i)r.has(s)||n.push(T.removePromise(v.join(e,s)));await Promise.all(n),await this.asyncActions.wait()}};function ife(){return JSON.stringify({name:"PnpmInstaller",version:1})}function sfe(t){return v.join(t.cwd,wt.nodeModules,".store")}function nfe(t,{project:e}){let r=S.slugifyLocator(t);return v.join(sfe(e),r)}function ofe(t,{project:e}){return!S.isVirtualLocator(t)||!e.tryWorkspaceByLocator(t)}async function Q_e(t){let e=new Map,r=[];try{r=await T.readdirPromise(t,{withFileTypes:!0})}catch(i){if(i.code!=="ENOENT")throw i}try{for(let i of r)if(!i.name.startsWith("."))if(i.name.startsWith("@"))for(let n of await T.readdirPromise(v.join(t,i.name),{withFileTypes:!0}))e.set(`${i.name}/${n.name}`,n);else e.set(i.name,i)}catch(i){if(i.code!=="ENOENT")throw i}return e}function b_e(){let t,e;return{promise:new Promise((i,n)=>{t=i,e=n}),resolve:t,reject:e}}var afe=class{constructor(){this.deferred=new Map;this.promises=new Map;this.limit=(0,tfe.default)(10)}set(e,r){let i=this.deferred.get(e);typeof i=="undefined"&&this.deferred.set(e,i=b_e());let n=this.limit(()=>r());return this.promises.set(e,n),n.then(()=>{this.promises.get(e)===n&&i.resolve()},s=>{this.promises.get(e)===n&&i.reject(s)}),i.promise}reduce(e,r){var n;let i=(n=this.promises.get(e))!=null?n:Promise.resolve();this.set(e,()=>r(i))}async wait(){await Promise.all(this.promises.values())}};var v_e={linkers:[LM]},S_e=v_e;var F0=()=>({modules:new Map([["@yarnpkg/cli",iC],["@yarnpkg/core",Fd],["@yarnpkg/fslib",ch],["@yarnpkg/libzip",Fp],["@yarnpkg/parsers",Hp],["@yarnpkg/shell",jp],["clipanion",F$(vh)],["semver",x_e],["typanion",lu],["yup",k_e],["@yarnpkg/plugin-essentials",hL],["@yarnpkg/plugin-compat",mL],["@yarnpkg/plugin-dlx",EL],["@yarnpkg/plugin-file",xL],["@yarnpkg/plugin-git",fL],["@yarnpkg/plugin-github",PL],["@yarnpkg/plugin-http",FL],["@yarnpkg/plugin-init",ML],["@yarnpkg/plugin-link",GL],["@yarnpkg/plugin-nm",mT],["@yarnpkg/plugin-npm",yM],["@yarnpkg/plugin-npm-cli",vM],["@yarnpkg/plugin-pack",CM],["@yarnpkg/plugin-patch",NM],["@yarnpkg/plugin-pnp",oT],["@yarnpkg/plugin-pnpm",TM]]),plugins:new Set(["@yarnpkg/plugin-essentials","@yarnpkg/plugin-compat","@yarnpkg/plugin-dlx","@yarnpkg/plugin-file","@yarnpkg/plugin-git","@yarnpkg/plugin-github","@yarnpkg/plugin-http","@yarnpkg/plugin-init","@yarnpkg/plugin-link","@yarnpkg/plugin-nm","@yarnpkg/plugin-npm","@yarnpkg/plugin-npm-cli","@yarnpkg/plugin-pack","@yarnpkg/plugin-patch","@yarnpkg/plugin-pnp","@yarnpkg/plugin-pnpm"])});i0({binaryVersion:Zr||"",pluginConfiguration:F0()});})(); +/*! + * buildToken + * Builds OAuth token prefix (helper function) + * + * @name buildToken + * @function + * @param {GitUrl} obj The parsed Git url object. + * @return {String} token prefix + */ +/*! + * fill-range + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-extglob + * + * Copyright (c) 2014-2016, Jon Schlinkert. + * Licensed under the MIT License. + */ +/*! + * is-glob + * + * Copyright (c) 2014-2017, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-number + * + * Copyright (c) 2014-present, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * is-windows + * + * Copyright © 2015-2018, Jon Schlinkert. + * Released under the MIT License. + */ +/*! + * to-regex-range + * + * Copyright (c) 2015-present, Jon Schlinkert. + * Released under the MIT License. + */ diff --git a/.yarn/sdks/eslint/bin/eslint.js b/.yarn/sdks/eslint/bin/eslint.js new file mode 100755 index 00000000000..4d327a49a06 --- /dev/null +++ b/.yarn/sdks/eslint/bin/eslint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint/bin/eslint.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real eslint/bin/eslint.js your application uses +module.exports = absRequire(`eslint/bin/eslint.js`); diff --git a/.yarn/sdks/eslint/lib/api.js b/.yarn/sdks/eslint/lib/api.js new file mode 100644 index 00000000000..fc728d952bb --- /dev/null +++ b/.yarn/sdks/eslint/lib/api.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require eslint + require(absPnpApiPath).setup(); + } +} + +// Defer to the real eslint your application uses +module.exports = absRequire(`eslint`); diff --git a/.yarn/sdks/eslint/package.json b/.yarn/sdks/eslint/package.json new file mode 100644 index 00000000000..1a0ae379cdf --- /dev/null +++ b/.yarn/sdks/eslint/package.json @@ -0,0 +1,6 @@ +{ + "name": "eslint", + "version": "7.28.0-sdk", + "main": "./lib/api.js", + "type": "commonjs" +} diff --git a/.yarn/sdks/integrations.yml b/.yarn/sdks/integrations.yml new file mode 100644 index 00000000000..7e42d1884d8 --- /dev/null +++ b/.yarn/sdks/integrations.yml @@ -0,0 +1,6 @@ +# This file is automatically generated by @yarnpkg/sdks. +# Manual changes might be lost! + +integrations: + - vscode + - vim diff --git a/.yarn/sdks/prettier/index.js b/.yarn/sdks/prettier/index.js new file mode 100755 index 00000000000..f6882d80972 --- /dev/null +++ b/.yarn/sdks/prettier/index.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require prettier/index.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real prettier/index.js your application uses +module.exports = absRequire(`prettier/index.js`); diff --git a/.yarn/sdks/prettier/package.json b/.yarn/sdks/prettier/package.json new file mode 100644 index 00000000000..045baae792b --- /dev/null +++ b/.yarn/sdks/prettier/package.json @@ -0,0 +1,6 @@ +{ + "name": "prettier", + "version": "2.2.1-sdk", + "main": "./index.js", + "type": "commonjs" +} diff --git a/.yarn/sdks/stylelint/bin/stylelint.js b/.yarn/sdks/stylelint/bin/stylelint.js new file mode 100755 index 00000000000..04ffaf8eefa --- /dev/null +++ b/.yarn/sdks/stylelint/bin/stylelint.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require stylelint/bin/stylelint.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real stylelint/bin/stylelint.js your application uses +module.exports = absRequire(`stylelint/bin/stylelint.js`); diff --git a/.yarn/sdks/stylelint/lib/index.js b/.yarn/sdks/stylelint/lib/index.js new file mode 100644 index 00000000000..1b0b443f818 --- /dev/null +++ b/.yarn/sdks/stylelint/lib/index.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require stylelint/lib/index.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real stylelint/lib/index.js your application uses +module.exports = absRequire(`stylelint/lib/index.js`); diff --git a/.yarn/sdks/stylelint/package.json b/.yarn/sdks/stylelint/package.json new file mode 100644 index 00000000000..8afaf7a3a3f --- /dev/null +++ b/.yarn/sdks/stylelint/package.json @@ -0,0 +1,6 @@ +{ + "name": "stylelint", + "version": "14.0.1-sdk", + "main": "lib/index.js", + "type": "commonjs" +} diff --git a/.yarn/sdks/typescript/bin/tsc b/.yarn/sdks/typescript/bin/tsc new file mode 100755 index 00000000000..5608e574307 --- /dev/null +++ b/.yarn/sdks/typescript/bin/tsc @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/bin/tsc + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/bin/tsc your application uses +module.exports = absRequire(`typescript/bin/tsc`); diff --git a/.yarn/sdks/typescript/bin/tsserver b/.yarn/sdks/typescript/bin/tsserver new file mode 100755 index 00000000000..cd7d557d523 --- /dev/null +++ b/.yarn/sdks/typescript/bin/tsserver @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/bin/tsserver + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/bin/tsserver your application uses +module.exports = absRequire(`typescript/bin/tsserver`); diff --git a/.yarn/sdks/typescript/lib/tsc.js b/.yarn/sdks/typescript/lib/tsc.js new file mode 100644 index 00000000000..16042d01d4f --- /dev/null +++ b/.yarn/sdks/typescript/lib/tsc.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsc.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/tsc.js your application uses +module.exports = absRequire(`typescript/lib/tsc.js`); diff --git a/.yarn/sdks/typescript/lib/tsserver.js b/.yarn/sdks/typescript/lib/tsserver.js new file mode 100644 index 00000000000..71e35cf6119 --- /dev/null +++ b/.yarn/sdks/typescript/lib/tsserver.js @@ -0,0 +1,184 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +const moduleWrapper = tsserver => { + if (!process.versions.pnp) { + return tsserver; + } + + const {isAbsolute} = require(`path`); + const pnpApi = require(`pnpapi`); + + const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); + const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); + + const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { + return `${locator.name}@${locator.reference}`; + })); + + // VSCode sends the zip paths to TS using the "zip://" prefix, that TS + // doesn't understand. This layer makes sure to remove the protocol + // before forwarding it to TS, and to add it back on all returned paths. + + function toEditorPath(str) { + // We add the `zip:` prefix to both `.zip/` paths and virtual paths + if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { + // We also take the opportunity to turn virtual paths into physical ones; + // this makes it much easier to work with workspaces that list peer + // dependencies, since otherwise Ctrl+Click would bring us to the virtual + // file instances instead of the real ones. + // + // We only do this to modules owned by the the dependency tree roots. + // This avoids breaking the resolution when jumping inside a vendor + // with peer dep (otherwise jumping into react-dom would show resolution + // errors on react). + // + const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; + if (resolved) { + const locator = pnpApi.findPackageLocator(resolved); + if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + str = resolved; + } + } + + str = normalize(str); + + if (str.match(/\.zip\//)) { + switch (hostInfo) { + // Absolute VSCode `Uri.fsPath`s need to start with a slash. + // VSCode only adds it automatically for supported schemes, + // so we have to do it manually for the `zip` scheme. + // The path needs to start with a caret otherwise VSCode doesn't handle the protocol + // + // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 + // + // Update Oct 8 2021: VSCode changed their format in 1.61. + // Before | ^zip:/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + case `vscode <1.61`: { + str = `^zip:${str}`; + } break; + + case `vscode`: { + str = `^/zip/${str}`; + } break; + + // To make "go to definition" work, + // We have to resolve the actual file system path from virtual path + // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) + case `coc-nvim`: { + str = normalize(resolved).replace(/\.zip\//, `.zip::`); + str = resolve(`zipfile:${str}`); + } break; + + // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server) + // We have to resolve the actual file system path from virtual path, + // everything else is up to neovim + case `neovim`: { + str = normalize(resolved).replace(/\.zip\//, `.zip::`); + str = `zipfile:${str}`; + } break; + + default: { + str = `zip:${str}`; + } break; + } + } + } + + return str; + } + + function fromEditorPath(str) { + switch (hostInfo) { + case `coc-nvim`: + case `neovim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for coc-nvim is in format of //zipfile://.yarn/... + // So in order to convert it back, we use .* to match all the thing + // before `zipfile:` + return process.platform === `win32` + ? str.replace(/^.*zipfile:\//, ``) + : str.replace(/^.*zipfile:/, ``); + } break; + + case `vscode`: + default: { + return process.platform === `win32` + ? str.replace(/^\^?(zip:|\/zip)\/+/, ``) + : str.replace(/^\^?(zip:|\/zip)\/+/, `/`); + } break; + } + } + + // Force enable 'allowLocalPluginLoads' + // TypeScript tries to resolve plugins using a path relative to itself + // which doesn't work when using the global cache + // https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238 + // VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but + // TypeScript already does local loads and if this code is running the user trusts the workspace + // https://github.com/microsoft/vscode/issues/45856 + const ConfiguredProject = tsserver.server.ConfiguredProject; + const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype; + ConfiguredProject.prototype.enablePluginsWithOptions = function() { + this.projectService.allowLocalPluginLoads = true; + return originalEnablePluginsWithOptions.apply(this, arguments); + }; + + // And here is the point where we hijack the VSCode <-> TS communications + // by adding ourselves in the middle. We locate everything that looks + // like an absolute path of ours and normalize it. + + const Session = tsserver.server.Session; + const {onMessage: originalOnMessage, send: originalSend} = Session.prototype; + let hostInfo = `unknown`; + + Object.assign(Session.prototype, { + onMessage(/** @type {string} */ message) { + const parsedMessage = JSON.parse(message) + + if ( + parsedMessage != null && + typeof parsedMessage === `object` && + parsedMessage.arguments && + typeof parsedMessage.arguments.hostInfo === `string` + ) { + hostInfo = parsedMessage.arguments.hostInfo; + if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK && process.env.VSCODE_IPC_HOOK.match(/Code\/1\.([1-5][0-9]|60)\./)) { + hostInfo += ` <1.61`; + } + } + + return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { + return typeof value === `string` ? fromEditorPath(value) : value; + })); + }, + + send(/** @type {any} */ msg) { + return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => { + return typeof value === `string` ? toEditorPath(value) : value; + }))); + } + }); + + return tsserver; +}; + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsserver.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/tsserver.js your application uses +module.exports = moduleWrapper(absRequire(`typescript/lib/tsserver.js`)); diff --git a/.yarn/sdks/typescript/lib/tsserverlibrary.js b/.yarn/sdks/typescript/lib/tsserverlibrary.js new file mode 100644 index 00000000000..7a2d65ea220 --- /dev/null +++ b/.yarn/sdks/typescript/lib/tsserverlibrary.js @@ -0,0 +1,184 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +const moduleWrapper = tsserver => { + if (!process.versions.pnp) { + return tsserver; + } + + const {isAbsolute} = require(`path`); + const pnpApi = require(`pnpapi`); + + const isVirtual = str => str.match(/\/(\$\$virtual|__virtual__)\//); + const normalize = str => str.replace(/\\/g, `/`).replace(/^\/?/, `/`); + + const dependencyTreeRoots = new Set(pnpApi.getDependencyTreeRoots().map(locator => { + return `${locator.name}@${locator.reference}`; + })); + + // VSCode sends the zip paths to TS using the "zip://" prefix, that TS + // doesn't understand. This layer makes sure to remove the protocol + // before forwarding it to TS, and to add it back on all returned paths. + + function toEditorPath(str) { + // We add the `zip:` prefix to both `.zip/` paths and virtual paths + if (isAbsolute(str) && !str.match(/^\^?(zip:|\/zip\/)/) && (str.match(/\.zip\//) || isVirtual(str))) { + // We also take the opportunity to turn virtual paths into physical ones; + // this makes it much easier to work with workspaces that list peer + // dependencies, since otherwise Ctrl+Click would bring us to the virtual + // file instances instead of the real ones. + // + // We only do this to modules owned by the the dependency tree roots. + // This avoids breaking the resolution when jumping inside a vendor + // with peer dep (otherwise jumping into react-dom would show resolution + // errors on react). + // + const resolved = isVirtual(str) ? pnpApi.resolveVirtual(str) : str; + if (resolved) { + const locator = pnpApi.findPackageLocator(resolved); + if (locator && dependencyTreeRoots.has(`${locator.name}@${locator.reference}`)) { + str = resolved; + } + } + + str = normalize(str); + + if (str.match(/\.zip\//)) { + switch (hostInfo) { + // Absolute VSCode `Uri.fsPath`s need to start with a slash. + // VSCode only adds it automatically for supported schemes, + // so we have to do it manually for the `zip` scheme. + // The path needs to start with a caret otherwise VSCode doesn't handle the protocol + // + // Ref: https://github.com/microsoft/vscode/issues/105014#issuecomment-686760910 + // + // Update Oct 8 2021: VSCode changed their format in 1.61. + // Before | ^zip:/c:/foo/bar.zip/package.json + // After | ^/zip//c:/foo/bar.zip/package.json + // + case `vscode <1.61`: { + str = `^zip:${str}`; + } break; + + case `vscode`: { + str = `^/zip/${str}`; + } break; + + // To make "go to definition" work, + // We have to resolve the actual file system path from virtual path + // and convert scheme to supported by [vim-rzip](https://github.com/lbrayner/vim-rzip) + case `coc-nvim`: { + str = normalize(resolved).replace(/\.zip\//, `.zip::`); + str = resolve(`zipfile:${str}`); + } break; + + // Support neovim native LSP and [typescript-language-server](https://github.com/theia-ide/typescript-language-server) + // We have to resolve the actual file system path from virtual path, + // everything else is up to neovim + case `neovim`: { + str = normalize(resolved).replace(/\.zip\//, `.zip::`); + str = `zipfile:${str}`; + } break; + + default: { + str = `zip:${str}`; + } break; + } + } + } + + return str; + } + + function fromEditorPath(str) { + switch (hostInfo) { + case `coc-nvim`: + case `neovim`: { + str = str.replace(/\.zip::/, `.zip/`); + // The path for coc-nvim is in format of //zipfile://.yarn/... + // So in order to convert it back, we use .* to match all the thing + // before `zipfile:` + return process.platform === `win32` + ? str.replace(/^.*zipfile:\//, ``) + : str.replace(/^.*zipfile:/, ``); + } break; + + case `vscode`: + default: { + return process.platform === `win32` + ? str.replace(/^\^?(zip:|\/zip)\/+/, ``) + : str.replace(/^\^?(zip:|\/zip)\/+/, `/`); + } break; + } + } + + // Force enable 'allowLocalPluginLoads' + // TypeScript tries to resolve plugins using a path relative to itself + // which doesn't work when using the global cache + // https://github.com/microsoft/TypeScript/blob/1b57a0395e0bff191581c9606aab92832001de62/src/server/project.ts#L2238 + // VSCode doesn't want to enable 'allowLocalPluginLoads' due to security concerns but + // TypeScript already does local loads and if this code is running the user trusts the workspace + // https://github.com/microsoft/vscode/issues/45856 + const ConfiguredProject = tsserver.server.ConfiguredProject; + const {enablePluginsWithOptions: originalEnablePluginsWithOptions} = ConfiguredProject.prototype; + ConfiguredProject.prototype.enablePluginsWithOptions = function() { + this.projectService.allowLocalPluginLoads = true; + return originalEnablePluginsWithOptions.apply(this, arguments); + }; + + // And here is the point where we hijack the VSCode <-> TS communications + // by adding ourselves in the middle. We locate everything that looks + // like an absolute path of ours and normalize it. + + const Session = tsserver.server.Session; + const {onMessage: originalOnMessage, send: originalSend} = Session.prototype; + let hostInfo = `unknown`; + + Object.assign(Session.prototype, { + onMessage(/** @type {string} */ message) { + const parsedMessage = JSON.parse(message) + + if ( + parsedMessage != null && + typeof parsedMessage === `object` && + parsedMessage.arguments && + typeof parsedMessage.arguments.hostInfo === `string` + ) { + hostInfo = parsedMessage.arguments.hostInfo; + if (hostInfo === `vscode` && process.env.VSCODE_IPC_HOOK && process.env.VSCODE_IPC_HOOK.match(/Code\/1\.([1-5][0-9]|60)\./)) { + hostInfo += ` <1.61`; + } + } + + return originalOnMessage.call(this, JSON.stringify(parsedMessage, (key, value) => { + return typeof value === `string` ? fromEditorPath(value) : value; + })); + }, + + send(/** @type {any} */ msg) { + return originalSend.call(this, JSON.parse(JSON.stringify(msg, (key, value) => { + return typeof value === `string` ? toEditorPath(value) : value; + }))); + } + }); + + return tsserver; +}; + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/tsserverlibrary.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/tsserverlibrary.js your application uses +module.exports = moduleWrapper(absRequire(`typescript/lib/tsserverlibrary.js`)); diff --git a/.yarn/sdks/typescript/lib/typescript.js b/.yarn/sdks/typescript/lib/typescript.js new file mode 100644 index 00000000000..cbdbf1500fb --- /dev/null +++ b/.yarn/sdks/typescript/lib/typescript.js @@ -0,0 +1,20 @@ +#!/usr/bin/env node + +const {existsSync} = require(`fs`); +const {createRequire, createRequireFromPath} = require(`module`); +const {resolve} = require(`path`); + +const relPnpApiPath = "../../../../.pnp.cjs"; + +const absPnpApiPath = resolve(__dirname, relPnpApiPath); +const absRequire = (createRequire || createRequireFromPath)(absPnpApiPath); + +if (existsSync(absPnpApiPath)) { + if (!process.versions.pnp) { + // Setup the environment to be able to require typescript/lib/typescript.js + require(absPnpApiPath).setup(); + } +} + +// Defer to the real typescript/lib/typescript.js your application uses +module.exports = absRequire(`typescript/lib/typescript.js`); diff --git a/.yarn/sdks/typescript/package.json b/.yarn/sdks/typescript/package.json new file mode 100644 index 00000000000..fae7e416784 --- /dev/null +++ b/.yarn/sdks/typescript/package.json @@ -0,0 +1,6 @@ +{ + "name": "typescript", + "version": "4.5.4-sdk", + "main": "./lib/typescript.js", + "type": "commonjs" +} diff --git a/.yarnrc.yml b/.yarnrc.yml index aaf789810bd..ec1744db672 100644 --- a/.yarnrc.yml +++ b/.yarnrc.yml @@ -1,10 +1,78 @@ enableTelemetry: false -nmHoistingLimits: workspaces +nodeLinker: pnp -nmMode: hardlinks-global - -nodeLinker: node-modules +packageExtensions: + "@grafana/slate-react@0.22.10-grafana": + peerDependencies: + slate-react: ">=0.22.0" + "@mdx-js/loader@1.6.22": + peerDependencies: + react: 17.0.1 + "@storybook/addon-docs@6.4.9": + peerDependencies: + "@storybook/manager-webpack5": 6.4.9 + "@storybook/addon-essentials@6.4.9": + peerDependencies: + "@storybook/components": 6.4.9 + "@storybook/core-events": 6.4.9 + "@storybook/manager-webpack5": 6.4.9 + "@storybook/theming": 6.4.9 + "@storybook/core-server@6.4.9": + peerDependencies: + "@babel/core": ^7.0.0 + "@storybook/core@6.4.9": + peerDependencies: + "@babel/core": ^7.0.0 + "@storybook/manager-webpack5": 6.4.9 + "@storybook/csf-tools@6.4.9": + peerDependencies: + "@babel/core": ^7.0.0 + "@storybook/react@6.4.9": + peerDependencies: + "@storybook/manager-webpack5": 6.4.9 + doctrine@3.0.0: + dependencies: + assert: 2.0.0 + moveable@0.27.3: + dependencies: + "@daybrush/utils": 1.6.0 + framework-utils: ^1.1.0 + rc-time-picker@3.7.3: + peerDependencies: + react: 17.0.1 + react-dom: 17.0.1 + rc-trigger@2.6.5: + peerDependencies: + react: 17.0.1 + react-dom: 17.0.1 + react-compat-css-styled@1.0.8: + dependencies: + react-simple-compat: 1.2.1 + react-compat-moveable@0.15.2: + dependencies: + "@egjs/agent": ^2.2.1 + "@egjs/children-differ": ^1.0.1 + "@scena/matrix": 1.1.1 + css-to-mat: ^1.0.3 + gesto: ^1.4.0 + overlap-area: ^1.0.0 + react-simple-compat: 1.2.1 + peerDependencies: + framework-utils: ^1.1.0 + react-dev-utils@11.0.4: + peerDependencies: + typescript: 4.4.3 + webpack: 5.51.1 + react-docgen-typescript-loader@3.7.2: + peerDependencies: + webpack: 4.41.5 + react-icons@2.2.7: + peerDependencies: + prop-types: "*" + react-resizable@3.0.4: + peerDependencies: + react-dom: 17.0.1 plugins: - path: .yarn/plugins/@yarnpkg/plugin-typescript.cjs @@ -14,4 +82,4 @@ plugins: - path: .yarn/plugins/@yarnpkg/plugin-outdated.cjs spec: "https://mskelton.dev/yarn-outdated/v2" -yarnPath: .yarn/releases/yarn-3.1.0-rc.5.cjs +yarnPath: .yarn/releases/yarn-3.1.1.cjs diff --git a/CHANGELOG.md b/CHANGELOG.md index e6b8c312b31..80e0d42186e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,284 @@ + + +# 8.3.3 (2021-12-10) + +### Features and enhancements + +- **BarChart:** Use new data error view component to show actions in panel edit. [#42474](https://github.com/grafana/grafana/pull/42474), [@torkelo](https://github.com/torkelo) +- **CloudMonitor:** Iterate over pageToken for resources. [#42546](https://github.com/grafana/grafana/pull/42546), [@iwysiu](https://github.com/iwysiu) +- **Macaron:** Prevent WriteHeader invalid HTTP status code panic. [#42973](https://github.com/grafana/grafana/pull/42973), [@bergquist](https://github.com/bergquist) + +### Bug fixes + +- **AnnoListPanel:** Fix interpolation of variables in tags. [#42318](https://github.com/grafana/grafana/pull/42318), [@francoisdtm](https://github.com/francoisdtm) +- **CloudWatch:** Allow queries to have no dimensions specified. [#42800](https://github.com/grafana/grafana/pull/42800), [@sunker](https://github.com/sunker) +- **CloudWatch:** Fix broken queries for users migrating from 8.2.4/8.2.5 to 8.3.0. [#42611](https://github.com/grafana/grafana/pull/42611), [@sunker](https://github.com/sunker) +- **CloudWatch:** Make sure MatchExact flag gets the right value. [#42621](https://github.com/grafana/grafana/pull/42621), [@sunker](https://github.com/sunker) +- **Dashboards:** Fix so that empty folders can be deleted from the manage dashboards/folders page. [#42527](https://github.com/grafana/grafana/pull/42527), [@ashharrison90](https://github.com/ashharrison90) +- **InfluxDB:** Improve handling of metadata query errors in InfluxQL. [#42500](https://github.com/grafana/grafana/pull/42500), [@gabor](https://github.com/gabor) +- **Loki:** Fix adding of ad hoc filters for queries with parser and line_format expressions. [#42590](https://github.com/grafana/grafana/pull/42590), [@ivanahuckova](https://github.com/ivanahuckova) +- **Prometheus:** Fix running of exemplar queries for non-histogram metrics. [#42749](https://github.com/grafana/grafana/pull/42749), [@ivanahuckova](https://github.com/ivanahuckova) +- **Prometheus:** Interpolate template variables in interval. [#42637](https://github.com/grafana/grafana/pull/42637), [@ivanahuckova](https://github.com/ivanahuckova) +- **StateTimeline:** Fix toolitp not showing when for frames with multiple fields. [#42741](https://github.com/grafana/grafana/pull/42741), [@dprokop](https://github.com/dprokop) +- **TraceView:** Fix virtualized scrolling when trace view is opened in right pane in Explore. [#42480](https://github.com/grafana/grafana/pull/42480), [@autoric](https://github.com/autoric) +- **Variables:** Fix repeating panels for on time range changed variables. [#42828](https://github.com/grafana/grafana/pull/42828), [@hugohaggmark](https://github.com/hugohaggmark) +- **Variables:** Fix so queryparam option works for scoped variables. [#42742](https://github.com/grafana/grafana/pull/42742), [@hugohaggmark](https://github.com/hugohaggmark) + + + + +# 8.3.2 (2021-12-10) + +- **Security**: Fixes CVE-2021-43813 and CVE-2021-43815. For more information, see our [blog](https://grafana.com/blog/2021/12/10/grafana-8.3.2-and-7.5.12-released-with-moderate-severity-security-fix/ + + + + + +# 8.3.1 (2021-12-07) + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) + + + + + +# 8.3.0 (2021-11-30) + +### Features and enhancements + +- **Alerting:** Prevent folders from being deleted when they contain alerts. [#42307](https://github.com/grafana/grafana/pull/42307), [@peterholmberg](https://github.com/peterholmberg) +- **Alerting:** Show full preview value in tooltip. [#42445](https://github.com/grafana/grafana/pull/42445), [@peterholmberg](https://github.com/peterholmberg) +- **BarGauge:** Limit title width when name is really long. [#42346](https://github.com/grafana/grafana/pull/42346), [@torkelo](https://github.com/torkelo) +- **CloudMonitoring:** Avoid to escape regexps in filters. [#41961](https://github.com/grafana/grafana/pull/41961), [@andresmgot](https://github.com/andresmgot) +- **CloudWatch:** Add support for AWS Metric Insights. [#42487](https://github.com/grafana/grafana/pull/42487), [@sunker](https://github.com/sunker) +- **TooltipPlugin:** Remove other panels' shared tooltip in edit panel. [#42187](https://github.com/grafana/grafana/pull/42187), [@mdvictor](https://github.com/mdvictor) +- **Visualizations:** Limit y label width to 40% of visualization width. [#42350](https://github.com/grafana/grafana/pull/42350), [@torkelo](https://github.com/torkelo) + +### Bug fixes + +- **Alerting:** Clear alerting rule evaluation errors after intermittent failures. [#42386](https://github.com/grafana/grafana/pull/42386), [@gotjosh](https://github.com/gotjosh) +- **Alerting:** Fix refresh on legacy Alert List panel. [#42322](https://github.com/grafana/grafana/pull/42322), [@peterholmberg](https://github.com/peterholmberg) +- **Dashboard:** Fix queries for panels with non-integer widths. [#42420](https://github.com/grafana/grafana/pull/42420), [@gabor](https://github.com/gabor) +- **Explore:** Fix url update inconsistency. [#42288](https://github.com/grafana/grafana/pull/42288), [@gabor](https://github.com/gabor) +- **Prometheus:** Fix range variables interpolation for time ranges smaller than 1 second. [#42242](https://github.com/grafana/grafana/pull/42242), [@ivanahuckova](https://github.com/ivanahuckova) +- **ValueMappings:** Fixes issue with regex value mapping that only sets color. [#42311](https://github.com/grafana/grafana/pull/42311), [@torkelo](https://github.com/torkelo) + + + + +# 8.3.0-beta2 (2021-11-25) + +### Features and enhancements + +- **Alerting:** Create DatasourceError alert if evaluation returns error. [#41869](https://github.com/grafana/grafana/pull/41869), [@gerobinson](https://github.com/gerobinson) +- **Alerting:** Make Unified Alerting enabled by default for those who do not use legacy alerting. [#42200](https://github.com/grafana/grafana/pull/42200), [@armandgrillet](https://github.com/armandgrillet) +- **Alerting:** Support mute timings configuration through the api for the embedded alert manager. [#41533](https://github.com/grafana/grafana/pull/41533), [@JohnnyQQQQ](https://github.com/JohnnyQQQQ) +- **CloudWatch:** Add missing AWS/Events metrics. [#42164](https://github.com/grafana/grafana/pull/42164), [@n2N8Z](https://github.com/n2N8Z) +- **Docs:** Add easier to find deprecation notices to certain data sources and to the changelog. [#41938](https://github.com/grafana/grafana/pull/41938), [@gabor](https://github.com/gabor) +- **Plugins Catalog:** Enable install controls based on the pluginAdminEnabled flag. [#41686](https://github.com/grafana/grafana/pull/41686), [@leventebalogh](https://github.com/leventebalogh) +- **Query caching:** Increase max_value_mb default to 10. (Enterprise) +- **Table:** Add space between values for the DefaultCell. [#42246](https://github.com/grafana/grafana/pull/42246), [@kirederik](https://github.com/kirederik) +- **Table:** Add space between values on JSONViewCell. [#42156](https://github.com/grafana/grafana/pull/42156), [@kirederik](https://github.com/kirederik) +- **Tracing:** Make query editors available in dashboard for Tempo and Zipkin. [#41974](https://github.com/grafana/grafana/pull/41974), [@ivanahuckova](https://github.com/ivanahuckova) + +### Bug fixes + +- **AccessControl:** Renamed `orgs` roles, removed `fixed:orgs:reader` introduced in beta1. [#42049](https://github.com/grafana/grafana/pull/42049), [@gamab](https://github.com/gamab) +- **Azure Monitor:** Add trap focus for modals in grafana/ui and other small a11y fixes for Azure Monitor. [#41449](https://github.com/grafana/grafana/pull/41449), [@sarahzinger](https://github.com/sarahzinger) +- **CodeEditor:** Prevent suggestions from being clipped. [#42120](https://github.com/grafana/grafana/pull/42120), [@kaydelaney](https://github.com/kaydelaney) +- **Dashboard:** Fix cache timeout persistence. [#42204](https://github.com/grafana/grafana/pull/42204), [@hugohaggmark](https://github.com/hugohaggmark) +- **Datasource:** Fix stable sort order of query responses. [#41868](https://github.com/grafana/grafana/pull/41868), [@marefr](https://github.com/marefr) +- **Explore:** Fix error in query history when removing last item. [#42179](https://github.com/grafana/grafana/pull/42179), [@gabor](https://github.com/gabor) +- **Logs:** Fix requesting of older logs when flipped order. [#41966](https://github.com/grafana/grafana/pull/41966), [@ivanahuckova](https://github.com/ivanahuckova) +- **Prometheus:** Fix running of health check query based on access mode. [#42189](https://github.com/grafana/grafana/pull/42189), [@ivanahuckova](https://github.com/ivanahuckova) +- **TextPanel:** Fix suggestions for existing panels. [#42195](https://github.com/grafana/grafana/pull/42195), [@hugohaggmark](https://github.com/hugohaggmark) +- **Tracing:** Fix incorrect indentations due to reoccurring spanIDs. [#41919](https://github.com/grafana/grafana/pull/41919), [@ivanahuckova](https://github.com/ivanahuckova) +- **Tracing:** Show start time of trace with milliseconds precision. [#42132](https://github.com/grafana/grafana/pull/42132), [@ivanahuckova](https://github.com/ivanahuckova) +- **Variables:** Make renamed or missing variable section expandable. [#41964](https://github.com/grafana/grafana/pull/41964), [@hugohaggmark](https://github.com/hugohaggmark) + +### Breaking changes + +### Grafana 8 Alerting enabled by default for installations that do not use legacy alerting + +Starting with Grafana v8.3.0, if you have **not** explicitly disabled unified alerting and **do not** have legacy alerts set up you are automatically "migrated" to Grafana 8 Alerting. + +A migration **from legacy to Grafana 8 Alerting** will never incur a data loss, as the previous data is kept around for rollback purposes. However, going from **Grafana 8 Alerting to legacy alerting** will delete all the data created for Grafana 8 Alerting. It is recommended that you **backup your database** before attempting a migration between systems. + +If unclear, please verify the table below: + +| `[alerting][enabled]` | `[unified_alerting][enabled]` | With Existing Legacy Alerts | Result | +| --------------------- | ----------------------------- | --------------------------- | ------------------ | +| `true` | `true` | N/A | Error | +| `true` | `false` | N/A | Legacy Alerting | +| `true` | not set | Yes | Legacy Alerting | +| `true` | not set | No | Grafana 8 Alerting | +| not set | `true` | N/A | Grafana 8 Alerting | +| not set | `false` | N/A | Legacy Alerting | +| not set | not set | Yes | Legacy Alerting | +| not set | not set | No | Grafana 8 Alerting | +| `false` | `true` | N/A | Grafana 8 Alerting | +| `false` | `false` | N/A | Alerting disabled | +| `false` | not set | N/A | Grafana 8 Alerting | + +N/A in the "With Existing Legacy Alerts" column means that it does not matter if you have legacy alerts or not. +Issue [#42200](https://github.com/grafana/grafana/issues/42200) + +### Keep Last State for "If execution error or timeout" when upgrading to Grafana 8 alerting + +In Grafana 8.3.0-beta2 we changed how alert rules that use `Keep Last State` for `If execution error or timeout` are upgraded from Legacy Alerting to Grafana 8 alerting. In 8.3.0-beta1 and earlier, alert rules with `Keep Last State` for `If execution error or timeout` were changed to `Alerting` when upgrading from Legacy Alerting to Grafana 8 alerting. However, in 8.3.0-beta2 these alert rules are now upgraded to a new option called `Error`. With this option, on encountering an error evaluating an alert rule, Grafana creates a special alert called `DatasourceError` with the `rule_uid` and `ref_id` as labels and an annotation called `Error` with the error message. Issue [#41869](https://github.com/grafana/grafana/issues/41869) + +### Deprecations + +The access mode "browser" is deprecated in the following data sources and will be removed in a later release: + +- Prometheus +- InfluxDB +- Elasticsearch Issue [#41938](https://github.com/grafana/grafana/issues/41938) + +### Plugin development fixes & changes + +- **Select:** Select menus now properly scroll during keyboard navigation. [#41917](https://github.com/grafana/grafana/pull/41917), [@ashharrison90](https://github.com/ashharrison90) + + + + +# 8.3.0-beta1 (2021-11-18) + +### Features and enhancements + +- **AccessControl:** Apply fine-grained access control to licensing. (Enterprise) +- **Alerting:** Add UI for contact point testing with custom annotations and labels. [#40491](https://github.com/grafana/grafana/pull/40491), [@nathanrodman](https://github.com/nathanrodman) +- **Alerting:** Make alert state indicator in panel header work with Grafana 8 alerts. [#38713](https://github.com/grafana/grafana/pull/38713), [@domasx2](https://github.com/domasx2) +- **Alerting:** Option for Discord notifier to use webhook name. [#40463](https://github.com/grafana/grafana/pull/40463), [@Skyebold](https://github.com/Skyebold) +- **Annotations:** Deprecate AnnotationsSrv. [#39631](https://github.com/grafana/grafana/pull/39631), [@hugohaggmark](https://github.com/hugohaggmark) +- **Auditing:** Add audit logs for unified alerting endpoints. (Enterprise) +- **Auditing:** Add endpoints (plugins, datasources, library elements). (Enterprise) +- **Auth:** Omit all base64 paddings in JWT tokens for the JWT auth. [#35602](https://github.com/grafana/grafana/pull/35602), [@gillg](https://github.com/gillg) +- **Azure Monitor:** Clean up fields when editing Metrics. [#41762](https://github.com/grafana/grafana/pull/41762), [@andresmgot](https://github.com/andresmgot) +- **AzureMonitor:** Add new starter dashboards. [#39876](https://github.com/grafana/grafana/pull/39876), [@jcolladokuri](https://github.com/jcolladokuri) +- **AzureMonitor:** Add starter dashboard for app monitoring with Application Insights. [#40725](https://github.com/grafana/grafana/pull/40725), [@jcolladokuri](https://github.com/jcolladokuri) +- **Barchart/Time series:** Allow x axis label. [#41142](https://github.com/grafana/grafana/pull/41142), [@oscarkilhed](https://github.com/oscarkilhed) +- **CLI:** Improve error handling for installing plugins. [#41257](https://github.com/grafana/grafana/pull/41257), [@marefr](https://github.com/marefr) +- **CloudMonitoring:** Migrate to use backend plugin SDK contracts. [#38650](https://github.com/grafana/grafana/pull/38650), [@idafurjes](https://github.com/idafurjes) +- **CloudWatch Logs:** Add retry strategy for hitting max concurrent queries. [#39290](https://github.com/grafana/grafana/pull/39290), [@aocenas](https://github.com/aocenas) +- **CloudWatch:** Add AWS RoboMaker metrics and dimension. [#41450](https://github.com/grafana/grafana/pull/41450), [@ilyastoli](https://github.com/ilyastoli) +- **CloudWatch:** Add AWS Transfer metrics and dimension. [#41168](https://github.com/grafana/grafana/pull/41168), [@ilyastoli](https://github.com/ilyastoli) +- **Dashboard:** replace datasource name with a reference object. [#33817](https://github.com/grafana/grafana/pull/33817), [@ryantxu](https://github.com/ryantxu) +- **Dashboards:** Show logs on time series when hovering. [#40110](https://github.com/grafana/grafana/pull/40110), [@ryantxu](https://github.com/ryantxu) +- **Elasticsearch:** Add support for Elasticsearch 8.0 (Beta). [#41729](https://github.com/grafana/grafana/pull/41729), [@Elfo404](https://github.com/Elfo404) +- **Elasticsearch:** Add time zone setting to Date Histogram aggregation. [#40882](https://github.com/grafana/grafana/pull/40882), [@Elfo404](https://github.com/Elfo404) +- **Elasticsearch:** Enable full range log volume histogram. [#41202](https://github.com/grafana/grafana/pull/41202), [@ifrost](https://github.com/ifrost) +- **Elasticsearch:** Full range logs volume. [#40700](https://github.com/grafana/grafana/pull/40700), [@ifrost](https://github.com/ifrost) +- **Explore:** Allow changing the graph type. [#40522](https://github.com/grafana/grafana/pull/40522), [@gabor](https://github.com/gabor) +- **Explore:** Show ANSI colors when highlighting matched words in the logs panel. [#40971](https://github.com/grafana/grafana/pull/40971), [@oliverfrye](https://github.com/oliverfrye) +- **Graph(old) panel:** Listen to events from Time series panel. [#41033](https://github.com/grafana/grafana/pull/41033), [@zoltanbedi](https://github.com/zoltanbedi) +- **Import:** Load gcom dashboards from URL. [#41799](https://github.com/grafana/grafana/pull/41799), [@ashharrison90](https://github.com/ashharrison90) +- **LibraryPanels:** Improves export and import of library panels between orgs. [#39214](https://github.com/grafana/grafana/pull/39214), [@hugohaggmark](https://github.com/hugohaggmark) +- **OAuth:** Support PKCE. [#39948](https://github.com/grafana/grafana/pull/39948), [@sakjur](https://github.com/sakjur) +- **Panel edit:** Overrides now highlight correctly when searching. [#41684](https://github.com/grafana/grafana/pull/41684), [@ashharrison90](https://github.com/ashharrison90) +- **PanelEdit:** Display drag indicators on draggable sections. [#41711](https://github.com/grafana/grafana/pull/41711), [@ashharrison90](https://github.com/ashharrison90) +- **Plugins:** Refactor Plugin Management. [#40477](https://github.com/grafana/grafana/pull/40477), [@wbrowne](https://github.com/wbrowne) +- **Prometheus:** Add custom query parameters when creating PromLink url. [#41213](https://github.com/grafana/grafana/pull/41213), [@Ian-Yy](https://github.com/Ian-Yy) +- **Prometheus:** Remove limits on metrics, labels, and values in Metrics Browser. [#40660](https://github.com/grafana/grafana/pull/40660), [@autoric](https://github.com/autoric) +- **StateTimeline:** Share cursor with rest of the panels. [#41038](https://github.com/grafana/grafana/pull/41038), [@zoltanbedi](https://github.com/zoltanbedi) +- **Tempo:** Add error details when json upload fails. [#41803](https://github.com/grafana/grafana/pull/41803), [@aocenas](https://github.com/aocenas) +- **Tempo:** Add filtering for service graph query. [#41162](https://github.com/grafana/grafana/pull/41162), [@aocenas](https://github.com/aocenas) +- **Tempo:** Add links to nodes in Service Graph pointing to Prometheus metrics. [#41135](https://github.com/grafana/grafana/pull/41135), [@aocenas](https://github.com/aocenas) +- **Time series/Bar chart panel:** Add ability to sort series via legend. [#40226](https://github.com/grafana/grafana/pull/40226), [@zoltanbedi](https://github.com/zoltanbedi) +- **TimeSeries:** Allow multiple axes for the same unit. [#41635](https://github.com/grafana/grafana/pull/41635), [@dprokop](https://github.com/dprokop) +- **TraceView:** Allow span links defined on dataFrame. [#40563](https://github.com/grafana/grafana/pull/40563), [@aocenas](https://github.com/aocenas) +- **Transformations:** Support a rows mode in labels to fields. [#41020](https://github.com/grafana/grafana/pull/41020), [@ryantxu](https://github.com/ryantxu) +- **ValueMappings:** Don't apply field config defaults to time fields. [#41132](https://github.com/grafana/grafana/pull/41132), [@torkelo](https://github.com/torkelo) +- **Variables:** Only update panels that are impacted by variable change. [#39420](https://github.com/grafana/grafana/pull/39420), [@hugohaggmark](https://github.com/hugohaggmark) + +### Bug fixes + +- **API:** Fix dashboard quota limit for imports. [#41495](https://github.com/grafana/grafana/pull/41495), [@yangkb09](https://github.com/yangkb09) +- **Alerting:** Fix rule editor issues with Azure Monitor data source. [#41317](https://github.com/grafana/grafana/pull/41317), [@domasx2](https://github.com/domasx2) +- **Azure monitor:** Make sure alert rule editor is not enabled when template variables are being used. [#41335](https://github.com/grafana/grafana/pull/41335), [@sunker](https://github.com/sunker) +- **CloudMonitoring:** Fix annotation queries. [#41529](https://github.com/grafana/grafana/pull/41529), [@sunker](https://github.com/sunker) +- **CodeEditor:** Trigger the latest getSuggestions() passed to CodeEditor. [#40544](https://github.com/grafana/grafana/pull/40544), [@DukeManh](https://github.com/DukeManh) +- **Dashboard:** Remove the current panel from the list of options in the Dashboard datasource. [#41826](https://github.com/grafana/grafana/pull/41826), [@ashharrison90](https://github.com/ashharrison90) +- **Encryption:** Fix decrypting secrets in alerting migration. [#41061](https://github.com/grafana/grafana/pull/41061), [@undef1nd](https://github.com/undef1nd) +- **InfluxDB:** Fix corner case where index is too large in ALIAS field. [#41562](https://github.com/grafana/grafana/pull/41562), [@gabor](https://github.com/gabor) +- **NavBar:** Order App plugins alphabetically. [#40078](https://github.com/grafana/grafana/pull/40078), [@ashharrison90](https://github.com/ashharrison90) +- **NodeGraph:** Fix zooming sensitivity on touchpads. [#40718](https://github.com/grafana/grafana/pull/40718), [@aocenas](https://github.com/aocenas) +- **Plugins:** Add OAuth pass-through logic to api/ds/query endpoint. [#41352](https://github.com/grafana/grafana/pull/41352), [@wbrowne](https://github.com/wbrowne) +- **Snapshots:** Fix panel inspector for snapshot data. [#41530](https://github.com/grafana/grafana/pull/41530), [@joshhunt](https://github.com/joshhunt) +- **Tempo:** Fix basic auth password reset on adding tag. [#41808](https://github.com/grafana/grafana/pull/41808), [@aocenas](https://github.com/aocenas) +- **ValueMapping:** Fixes issue with regex mappings. [#41515](https://github.com/grafana/grafana/pull/41515), [@mcdee](https://github.com/mcdee) + +### Plugin development fixes & changes + +- **grafana/ui:** Enable slider marks display. [#41275](https://github.com/grafana/grafana/pull/41275), [@dprokop](https://github.com/dprokop) + + + +# 8.2.7 (2021-12-07) + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) + + + + + +# 8.2.6 (2021-12-02) + +### Features and enhancements + +- **Security:** Upgrade Docker base image to Alpine 3.14.3. [#42061](https://github.com/grafana/grafana/pull/42061), [@dsotirakis](https://github.com/dsotirakis) +- **Security:** Upgrade Go to 1.17.2. [#42427](https://github.com/grafana/grafana/pull/42427), [@idafurjes](https://github.com/idafurjes) + +### Bug fixes + +- **TimeSeries:** Fix fillBelowTo wrongly affecting fills of unrelated series. [#41998](https://github.com/grafana/grafana/pull/41998), [@leeoniya](https://github.com/leeoniya) + + + + + +# 8.2.5 (2021-11-18) + +### Bug fixes + +- **Alerting:** Fix a bug where the metric in the evaluation string was not correctly populated. [#41731](https://github.com/grafana/grafana/pull/41731), [@JohnnyQQQQ](https://github.com/JohnnyQQQQ) +- **Alerting:** Fix no data behaviour in Legacy Alerting for alert rules using the AND operator. [#41305](https://github.com/grafana/grafana/pull/41305), [@gerobinson](https://github.com/gerobinson) +- **CloudMonitoring:** Ignore min and max aggregation in MQL queries. [#41302](https://github.com/grafana/grafana/pull/41302), [@sunker](https://github.com/sunker) +- **Dashboards:** 'Copy' is no longer added to new dashboard titles. [#41344](https://github.com/grafana/grafana/pull/41344), [@joshhunt](https://github.com/joshhunt) +- **DataProxy:** Fix overriding response body when response is a WebSocket upgrade. [#41364](https://github.com/grafana/grafana/pull/41364), [@marefr](https://github.com/marefr) +- **Elasticsearch:** Use field configured in query editor as field for date_histogram aggregations. [#41258](https://github.com/grafana/grafana/pull/41258), [@Elfo404](https://github.com/Elfo404) +- **Explore:** Fix running queries without a datasource property set. [#40805](https://github.com/grafana/grafana/pull/40805), [@Elfo404](https://github.com/Elfo404) +- **InfluxDB:** Fix numeric aliases in queries. [#41531](https://github.com/grafana/grafana/pull/41531), [@gabor](https://github.com/gabor) +- **Plugins:** Ensure consistent plugin settings list response. [#41346](https://github.com/grafana/grafana/pull/41346), [@wbrowne](https://github.com/wbrowne) +- **Tempo:** Fix validation of float durations. [#41400](https://github.com/grafana/grafana/pull/41400), [@ivanahuckova](https://github.com/ivanahuckova) +- **Tracing:** Correct tags for each span are shown. [#41473](https://github.com/grafana/grafana/pull/41473), [@ivanahuckova](https://github.com/ivanahuckova) + +### Breaking changes + +### Fix No Data behaviour in Legacy Alerting + +In Grafana 8.2.5 and later, this change fixes a bug in the evaluation of alert rules when using the AND operator to compare two or more conditions. In Grafana 8.2.4 and earlier such alert rules would evaluate to `OK` if at least one, but not all, conditions returned no data. This change fixes that bug such that in Grafana 8.2.5 these alert rules now evaluate to `No Data`. + +If an alert should evaluate to `OK` when one or all conditions return `No Data` then this can be done via changing `If no data or all values are null` to `OK`. However, this will not preserve the old behaviour in 8.2.4 where an alert will be `OK` if at least one, but not all, conditions return no data and then `No Data` if all conditions return `No Data`. Issue [#41305](https://github.com/grafana/grafana/issues/41305) + + + + +# 8.2.4 (2021-11-15) + +- **Security**: Fixes CVE-2021-41244. For more information, see our [blog](https://grafana.com/blog/2021/11/15/grafana-8.2.4-released-with-security-fixes/) + + + + + +# 8.2.3 (2021-11-03) + +- **Security**: Fixes CVE-2021-41174. For more information, see our [blog](https://grafana.com/blog/2021/11/03/grafana-8.2.3-released-with-medium-severity-security-fix-cve-2021-41174-grafana-xss/) + + + # 8.2.2 (2021-10-21) @@ -219,6 +500,14 @@ Panel queries and/or annotation queries that used more than one statistic will b + + +# 8.1.8 (2021-12-07) + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) + + + # 8.1.7 (2021-10-06) @@ -493,6 +782,14 @@ Issue [#33879](https://github.com/grafana/grafana/issues/33879) + + +# 8.0.7 (2021-12-07) + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) + + + # 8.0.6 (2021-07-14) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index fa22f27da04..ea19d6993c8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -46,6 +46,10 @@ If you have an idea of how to improve Grafana, submit an [enhancement request](h We want to make Grafana accessible to even more people. Submit an [accessibility issue](https://github.com/grafana/grafana/issues/new?labels=type%3A+accessibility&template=3-accessibility.md) to help us understand what we can improve. +### Write documentation + +To edit or write technical content, refer to [Contribute to our documentation](/contribute/documentation/README.md). We welcome your expertise and input as our body of technical content grows. + ### Triage issues If you don't have the knowledge or time to code, consider helping with _issue triage_. The community will thank you for saving them time by spending some of yours. diff --git a/Dockerfile b/Dockerfile index 14e4b8761ab..8dd105f442a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,17 @@ -FROM node:16-alpine3.14 as js-builder +FROM node:16-alpine3.15 as js-builder -WORKDIR /usr/src/app/ +ENV NODE_OPTIONS=--max_old_space_size=8000 -COPY package.json yarn.lock ./ +WORKDIR /grafana + +COPY package.json yarn.lock .yarnrc.yml ./ +COPY .yarn .yarn COPY packages packages +COPY plugins-bundled plugins-bundled -RUN apk --no-cache add git -RUN yarn install --pure-lockfile --no-progress +RUN yarn install -COPY tsconfig.json .eslintrc .editorconfig .browserslistrc .prettierrc.js ./ +COPY tsconfig.json .eslintrc .editorconfig .browserslistrc .prettierrc.js babel.config.json ./ COPY public public COPY tools tools COPY scripts scripts @@ -17,25 +20,26 @@ COPY emails emails ENV NODE_ENV production RUN yarn build -FROM golang:1.17.0-alpine3.14 as go-builder +FROM golang:1.17.6-alpine3.15 as go-builder -RUN apk add --no-cache gcc g++ +RUN apk add --no-cache gcc g++ make -WORKDIR $GOPATH/src/github.com/grafana/grafana +WORKDIR /grafana -COPY go.mod go.sum embed.go ./ +COPY go.mod go.sum embed.go Makefile build.go package.json ./ COPY cue cue -COPY cue.mod cue.mod COPY packages/grafana-schema packages/grafana-schema COPY public/app/plugins public/app/plugins COPY pkg pkg -COPY build.go package.json ./ +COPY scripts scripts +COPY cue.mod cue.mod +COPY .bingo .bingo RUN go mod verify -RUN go run build.go build +RUN make build-go # Final stage -FROM alpine:3.14.2 +FROM alpine:3.15 LABEL maintainer="Grafana team " @@ -43,43 +47,45 @@ ARG GF_UID="472" ARG GF_GID="0" ENV PATH="/usr/share/grafana/bin:$PATH" \ - GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \ - GF_PATHS_DATA="/var/lib/grafana" \ - GF_PATHS_HOME="/usr/share/grafana" \ - GF_PATHS_LOGS="/var/log/grafana" \ - GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ - GF_PATHS_PROVISIONING="/etc/grafana/provisioning" + GF_PATHS_CONFIG="/etc/grafana/grafana.ini" \ + GF_PATHS_DATA="/var/lib/grafana" \ + GF_PATHS_HOME="/usr/share/grafana" \ + GF_PATHS_LOGS="/var/log/grafana" \ + GF_PATHS_PLUGINS="/var/lib/grafana/plugins" \ + GF_PATHS_PROVISIONING="/etc/grafana/provisioning" WORKDIR $GF_PATHS_HOME RUN apk add --no-cache ca-certificates bash tzdata musl-utils -RUN apk add --no-cache openssl --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main +RUN apk add --no-cache openssl ncurses-libs ncurses-terminfo-base --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main +RUN apk upgrade ncurses-libs ncurses-terminfo-base --repository=http://dl-cdn.alpinelinux.org/alpine/edge/main +RUN apk info -vv | sort COPY conf ./conf RUN if [ ! $(getent group "$GF_GID") ]; then \ - addgroup -S -g $GF_GID grafana; \ - fi + addgroup -S -g $GF_GID grafana; \ + fi RUN export GF_GID_NAME=$(getent group $GF_GID | cut -d':' -f1) && \ - mkdir -p "$GF_PATHS_HOME/.aws" && \ - adduser -S -u $GF_UID -G "$GF_GID_NAME" grafana && \ - mkdir -p "$GF_PATHS_PROVISIONING/datasources" \ - "$GF_PATHS_PROVISIONING/dashboards" \ - "$GF_PATHS_PROVISIONING/notifiers" \ - "$GF_PATHS_PROVISIONING/plugins" \ - "$GF_PATHS_PROVISIONING/access-control" \ - "$GF_PATHS_LOGS" \ - "$GF_PATHS_PLUGINS" \ - "$GF_PATHS_DATA" && \ - cp "$GF_PATHS_HOME/conf/sample.ini" "$GF_PATHS_CONFIG" && \ - cp "$GF_PATHS_HOME/conf/ldap.toml" /etc/grafana/ldap.toml && \ - chown -R "grafana:$GF_GID_NAME" "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \ - chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" + mkdir -p "$GF_PATHS_HOME/.aws" && \ + adduser -S -u $GF_UID -G "$GF_GID_NAME" grafana && \ + mkdir -p "$GF_PATHS_PROVISIONING/datasources" \ + "$GF_PATHS_PROVISIONING/dashboards" \ + "$GF_PATHS_PROVISIONING/notifiers" \ + "$GF_PATHS_PROVISIONING/plugins" \ + "$GF_PATHS_PROVISIONING/access-control" \ + "$GF_PATHS_LOGS" \ + "$GF_PATHS_PLUGINS" \ + "$GF_PATHS_DATA" && \ + cp "$GF_PATHS_HOME/conf/sample.ini" "$GF_PATHS_CONFIG" && \ + cp "$GF_PATHS_HOME/conf/ldap.toml" /etc/grafana/ldap.toml && \ + chown -R "grafana:$GF_GID_NAME" "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" && \ + chmod -R 777 "$GF_PATHS_DATA" "$GF_PATHS_HOME/.aws" "$GF_PATHS_LOGS" "$GF_PATHS_PLUGINS" "$GF_PATHS_PROVISIONING" -COPY --from=go-builder /go/src/github.com/grafana/grafana/bin/*/grafana-server /go/src/github.com/grafana/grafana/bin/*/grafana-cli ./bin/ -COPY --from=js-builder /usr/src/app/public ./public -COPY --from=js-builder /usr/src/app/tools ./tools +COPY --from=go-builder /grafana/bin/*/grafana-server /grafana/bin/*/grafana-cli ./bin/ +COPY --from=js-builder /grafana/public ./public +COPY --from=js-builder /grafana/tools ./tools EXPOSE 3000 diff --git a/Dockerfile.ubuntu b/Dockerfile.ubuntu index 6552a6222fd..9323c935bdb 100644 --- a/Dockerfile.ubuntu +++ b/Dockerfile.ubuntu @@ -1,14 +1,18 @@ -FROM node:14.15.1-slim AS js-builder +FROM node:16-alpine3.15 as js-builder + +ENV NODE_OPTIONS=--max_old_space_size=8000 WORKDIR /usr/src/app/ COPY package.json yarn.lock ./ COPY packages packages +COPY .yarnrc.yml ./ +COPY .yarn .yarn +COPY plugins-bundled plugins-bundled -RUN apt-get update && apt-get install -yq git -RUN yarn install --pure-lockfile +RUN yarn install -COPY tsconfig.json .eslintrc .editorconfig .browserslistrc .prettierrc.js ./ +COPY tsconfig.json .eslintrc .editorconfig .browserslistrc .prettierrc.js babel.config.json ./ COPY public public COPY tools tools COPY scripts scripts @@ -17,12 +21,13 @@ COPY emails emails ENV NODE_ENV production RUN yarn build -FROM golang:1.17.0 AS go-builder +FROM golang:1.17.6 AS go-builder WORKDIR /src/grafana COPY go.mod go.sum embed.go ./ -COPY build.go package.json ./ +COPY Makefile build.go package.json ./ +COPY .bingo .bingo COPY pkg pkg/ COPY cue cue/ COPY cue.mod cue.mod/ @@ -30,7 +35,7 @@ COPY packages/grafana-schema packages/grafana-schema/ COPY public/app/plugins public/app/plugins/ RUN go mod verify -RUN go run build.go build +RUN make build-go FROM ubuntu:20.04 diff --git a/Makefile b/Makefile index 8daf01d7f24..45544ca5e8a 100644 --- a/Makefile +++ b/Makefile @@ -7,7 +7,7 @@ WIRE_TAGS = "oss" -include local/Makefile include .bingo/Variables.mk -.PHONY: all deps-go deps-js deps build-go build-server build-cli build-js build build-docker-dev build-docker-full lint-go golangci-lint test-go test-js test run run-frontend clean devenv devenv-down protobuf drone help +.PHONY: all deps-go deps-js deps build-go build-server build-cli build-js build build-docker-full lint-go golangci-lint test-go test-js gen-ts test run run-frontend clean devenv devenv-down protobuf drone help GO = go GO_FILES ?= ./pkg/... @@ -15,9 +15,6 @@ SH_FILES ?= $(shell find ./scripts -name *.sh) all: deps build -drone-version: - DRONE_VERSION := $(shell drone -v | cut -d' ' -f3) - ##@ Dependencies deps-go: ## Install backend dependencies. @@ -35,7 +32,7 @@ node_modules: package.json yarn.lock ## Install node modules. gen-go: $(WIRE) @echo "generate go files" - $(WIRE) gen -tags $(WIRE_TAGS) ./pkg/server + $(WIRE) gen -tags $(WIRE_TAGS) ./pkg/server ./pkg/cmd/grafana-cli/runner build-go: gen-go ## Build all Go binaries. @echo "build go files" @@ -98,13 +95,6 @@ shellcheck: $(SH_FILES) ## Run checks for shell scripts. ##@ Docker -build-docker-dev: ## Build Docker image for development (fast). - @echo "build development container" - @echo "\033[92mInfo:\033[0m the frontend code is expected to be built already." - $(GO) run build.go -goos linux -pkg-arch amd64 ${OPT} build latest - cp dist/grafana-latest.linux-x64.tar.gz packaging/docker - cd packaging/docker && docker build --tag grafana/grafana:dev . - build-docker-full: ## Build Docker image for development. @echo "build docker container" docker build --tag grafana/grafana:dev . @@ -150,15 +140,18 @@ clean: ## Clean up intermediate build artifacts. rm -rf node_modules rm -rf public/build +gen-ts: + @echo "generating TypeScript definitions" + go get github.com/tkrajina/typescriptify-golang-structs/typescriptify@v0.1.7 + tscriptify -interface -package=github.com/grafana/grafana/pkg/services/live/pipeline -import="import { FieldConfig } from '@grafana/data'" -target=public/app/features/live/pipeline/models.gen.ts pkg/services/live/pipeline/config.go + go mod tidy + # This repository's configuration is protected (https://readme.drone.io/signature/). # Use this make target to regenerate the configuration YAML files when # you modify starlark files. -drone: - @if [ "$(DRONE_VERSION)" != "1.4.0" ]; then\ - echo "WARN: You are using drone-cli ${DRONE_VERSION}. Please update your LOCAL version to 1.4.0. Using latest bingo version...";\ - fi +drone: $(DRONE) $(DRONE) starlark --format - $(DRONE) lint .drone.yml + $(DRONE) lint .drone.yml --trusted $(DRONE) --server https://drone.grafana.net sign --save grafana/grafana help: ## Display this help. diff --git a/PLUGIN_DEV.md b/PLUGIN_DEV.md index e33c8047e57..fbb2b79c0f2 100644 --- a/PLUGIN_DEV.md +++ b/PLUGIN_DEV.md @@ -6,7 +6,7 @@ upgrading Grafana please check here before creating an issue. ## Plugin development resources -- [Grafana plugin developer guide](http://docs.grafana.org/plugins/developing/development/) +- [Grafana plugin developer guide](https://grafana.com/docs/grafana/latest/developers/plugins/) - [Webpack Grafana plugin template project](https://github.com/CorpGlory/grafana-plugin-template-webpack) - [Simple JSON datasource plugin](https://github.com/grafana/simple-json-datasource) diff --git a/SECURITY.md b/SECURITY.md index b0577534339..b8697c164d6 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -14,7 +14,7 @@ Grafana Labs will send you a response indicating the next steps in handling your ## Security announcements -We maintain a category on the community site called [Security Announcements](https://community.grafana.com/c/security-announcements), +We maintain a category on the community site called [Security Announcements](https://community.grafana.com/c/support/security-announcements), where we will post a summary, remediation, and mitigation details for any patch containing security fixes. -You can also subscribe to email updates to this category if you have a grafana.com account and sign on to the community site or track updates via an [RSS feed](https://community.grafana.com/c/security-announcements.rss). +You can also subscribe to email updates to this category if you have a grafana.com account and sign on to the community site or track updates via an [RSS feed](https://community.grafana.com/c/support/security-announcements.rss). diff --git a/babel.config.json b/babel.config.json new file mode 100644 index 00000000000..4de74eb504a --- /dev/null +++ b/babel.config.json @@ -0,0 +1,59 @@ +{ + "babelrc": false, + // Note: order is bottom-to-top and/or right-to-left + "presets": [ + [ + "@babel/preset-env", + { + "bugfixes": true, + "browserslistEnv": "dev", + "useBuiltIns": "entry", + "corejs": "3.10" + } + ], + [ + "@babel/preset-typescript", + { + "allowNamespaces": true, + "allowDeclareFields": true + } + ], + [ + "@babel/preset-react", + { + "runtime": "automatic" + } + ] + ], + "plugins": [ + [ + "@babel/plugin-transform-typescript", + { + "allowNamespaces": true, + "allowDeclareFields": true + } + ], + ["@babel/plugin-proposal-object-rest-spread", { "loose": true }], + "@babel/plugin-transform-react-constant-elements", + "@babel/plugin-proposal-nullish-coalescing-operator", + "@babel/plugin-proposal-optional-chaining", + "@babel/plugin-syntax-dynamic-import", // needed for `() => import()` in routes.ts + "angularjs-annotate", + "macros" + ], + "env": { + "production": { + "presets": [ + [ + "@babel/preset-env", + { + "browserslistEnv": "production" + } + ] + ] + }, + "hot": { + "plugins": ["react-refresh/babel"] + } + } +} diff --git a/conf/defaults.ini b/conf/defaults.ini index d2cb5fc0437..207401eda1a 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -208,6 +208,12 @@ rudderstack_write_key = # Rudderstack data plane url, enabled only if rudderstack_write_key is also set rudderstack_data_plane_url = +# Rudderstack SDK url, optional, only valid if rudderstack_write_key and rudderstack_data_plane_url is also set +rudderstack_sdk_url = + +# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config +rudderstack_config_url = + # Application Insights connection string. Specify an URL string to enable this feature. application_insights_connection_string = @@ -228,6 +234,12 @@ admin_password = admin # used for signing secret_key = SW2YcwTIb9zpOOhoPsMm +# current key provider used for envelope encryption, default to static value specified by secret_key +encryption_provider = secretKey.v1 + +# list of configured key providers, space separated (Enterprise only): e.g., awskms.v1 azurekv.v1 +available_encryption_providers = + # disable gravatar profile images disable_gravatar = false @@ -732,8 +744,8 @@ global_alert_rule = -1 #################################### Unified Alerting #################### [unified_alerting] -# Enable the Unified Alerting sub-system and interface. When enabled we'll migrate all of your alert rules and notification channels to the new system. New alert rules will be created and your notification channels will be converted into an Alertmanager configuration. Previous data is preserved to enable backwards compatibility but new data is removed. -enabled = false +# Enable the Unified Alerting sub-system and interface. When enabled we'll migrate all of your alert rules and notification channels to the new system. New alert rules will be created and your notification channels will be converted into an Alertmanager configuration. Previous data is preserved to enable backwards compatibility but new data is removed when switching. When this configuration section and flag are not defined, the state is defined at runtime. See the documentation for more details. +enabled = # Comma-separated list of organization IDs for which to disable unified alerting. Only supported if unified alerting is enabled. disabled_orgs = @@ -787,8 +799,8 @@ min_interval = 10s #################################### Alerting ############################ [alerting] -# Disable legacy alerting engine & UI features -enabled = true +# Enable the legacy alerting sub-system and interface. If Unified Alerting is already enabled and you try to go back to legacy alerting, all data that is part of Unified Alerting will be deleted. When this configuration section and flag are not defined, the state is defined at runtime. See the documentation for more details. +enabled = # Makes it possible to turn off alert execution but alerting UI is visible execute_alerts = true @@ -908,6 +920,10 @@ zipkin_propagation = false # Not disabling is the most common setting when using Zipkin elsewhere in your infrastructure. disable_shared_zipkin_spans = false +[tracing.opentelemetry.jaeger] +# jaeger destination (ex http://localhost:14268/api/traces) +address = + #################################### External Image Storage ############## [external_image_storage] # Used for uploading images to public servers so they can be included in slack/email messages. @@ -965,10 +981,12 @@ enable_alpha = false app_tls_skip_verify_insecure = false # Enter a comma-separated list of plugin identifiers to identify plugins to load even if they are unsigned. Plugins with modified signatures are never loaded. allow_loading_unsigned_plugins = -# Enable or disable installing plugins directly from within Grafana. +# Enable or disable installing / uninstalling / updating plugins directly from within Grafana. plugin_admin_enabled = true plugin_admin_external_manage_enabled = false plugin_catalog_url = https://grafana.com/grafana/plugins/ +# Enter a comma-separated list of plugin identifiers to hide in the plugin catalog. +plugin_catalog_hidden_plugins = #################################### Grafana Live ########################################## [live] @@ -1035,12 +1053,14 @@ rendering_chrome_bin = # Mode 'reusable' will have one browser instance and will create a new incognito page on each request. rendering_mode = -# When rendering_mode = clustered you can instruct how many browsers or incognito pages can execute concurrently. Default is 'browser' +# When rendering_mode = clustered, you can instruct how many browsers or incognito pages can execute concurrently. Default is 'browser' # and will cluster using browser instances. # Mode 'context' will cluster using incognito pages. rendering_clustering_mode = -# When rendering_mode = clustered you can define maximum number of browser instances/incognito pages that can execute concurrently.. +# When rendering_mode = clustered, you can define the maximum number of browser instances/incognito pages that can execute concurrently. Default is '5'. rendering_clustering_max_concurrency = +# When rendering_mode = clustered, you can specify the duration a rendering request can take before it will time out. Default is `30` seconds. +rendering_clustering_timeout = # Limit the maximum viewport width, height and device scale factor that can be requested. rendering_viewport_max_width = @@ -1056,9 +1076,17 @@ grpc_port = license_path = [feature_toggles] -# enable features, separated by spaces +# there are currently two ways to enable feature toggles in the `grafana.ini`. +# you can either pass an array of feature you want to enable to the `enable` field or +# configure each toggle by setting the name of the toggle to true/false. Toggles set to true/false +# will take precedence over toggles in the `enable` list. + +# enable = feature1,feature2 enable = +# feature1 = true +# feature2 = false + [date_formats] # For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/ diff --git a/conf/sample.ini b/conf/sample.ini index d6666163af7..87ded5d82e2 100644 --- a/conf/sample.ini +++ b/conf/sample.ini @@ -208,6 +208,18 @@ # Google Tag Manager ID, only enabled if you specify an id here ;google_tag_manager_id = +# Rudderstack write key, enabled only if rudderstack_data_plane_url is also set +;rudderstack_write_key = + +# Rudderstack data plane url, enabled only if rudderstack_write_key is also set +;rudderstack_data_plane_url = + +# Rudderstack SDK url, optional, only valid if rudderstack_write_key and rudderstack_data_plane_url is also set +;rudderstack_sdk_url = + +# Rudderstack Config url, optional, used by Rudderstack SDK to fetch source config +;rudderstack_config_url = + #################################### Security #################################### [security] # disable creation of admin user on first start of grafana @@ -222,6 +234,12 @@ # used for signing ;secret_key = SW2YcwTIb9zpOOhoPsMm +# current key provider used for envelope encryption, default to static value specified by secret_key +;encryption_provider = secretKey.v1 + +# list of configured key providers, space separated (Enterprise only): e.g., awskms.v1 azurekv.v1 +;available_encryption_providers = + # disable gravatar profile images ;disable_gravatar = false @@ -710,7 +728,7 @@ #################################### Unified Alerting #################### [unified_alerting] #Enable the Unified Alerting sub-system and interface. When enabled we'll migrate all of your alert rules and notification channels to the new system. New alert rules will be created and your notification channels will be converted into an Alertmanager configuration. Previous data is preserved to enable backwards compatibility but new data is removed.``` -;enabled = false +;enabled = true # Comma-separated list of organization IDs for which to disable unified alerting. Only supported if unified alerting is enabled. ;disabled_orgs = @@ -765,7 +783,7 @@ #################################### Alerting ############################ [alerting] # Disable legacy alerting engine & UI features -;enabled = true +;enabled = false # Makes it possible to turn off alert execution but alerting UI is visible ;execute_alerts = true @@ -885,6 +903,10 @@ # Not disabling is the most common setting when using Zipkin elsewhere in your infrastructure. ;disable_shared_zipkin_spans = false +[tracing.opentelemetry.jaeger] +# jaeger destination (ex http://localhost:14268/api/traces) +; address = http://localhost:14268/api/traces + #################################### External image storage ########################## [external_image_storage] # Used for uploading images to public servers so they can be included in slack/email messages. @@ -938,10 +960,12 @@ ;app_tls_skip_verify_insecure = false # Enter a comma-separated list of plugin identifiers to identify plugins to load even if they are unsigned. Plugins with modified signatures are never loaded. ;allow_loading_unsigned_plugins = -# Enable or disable installing plugins directly from within Grafana. +# Enable or disable installing / uninstalling / updating plugins directly from within Grafana. ;plugin_admin_enabled = false ;plugin_admin_external_manage_enabled = false ;plugin_catalog_url = https://grafana.com/grafana/plugins/ +# Enter a comma-separated list of plugin identifiers to hide in the plugin catalog. +;plugin_catalog_hidden_plugins = #################################### Grafana Live ########################################## [live] @@ -1007,12 +1031,14 @@ # Mode 'reusable' will have one browser instance and will create a new incognito page on each request. ;rendering_mode = -# When rendering_mode = clustered you can instruct how many browsers or incognito pages can execute concurrently. Default is 'browser' +# When rendering_mode = clustered, you can instruct how many browsers or incognito pages can execute concurrently. Default is 'browser' # and will cluster using browser instances. # Mode 'context' will cluster using incognito pages. ;rendering_clustering_mode = -# When rendering_mode = clustered you can define maximum number of browser instances/incognito pages that can execute concurrently.. +# When rendering_mode = clustered, you can define the maximum number of browser instances/incognito pages that can execute concurrently. Default is '5'. ;rendering_clustering_max_concurrency = +# When rendering_mode = clustered, you can specify the duration a rendering request can take before it will time out. Default is `30` seconds. +;rendering_clustering_timeout = # Limit the maximum viewport width, height and device scale factor that can be requested. ;rendering_viewport_max_width = @@ -1029,8 +1055,15 @@ ;license_path = [feature_toggles] -# enable features, separated by spaces -;enable = +# there are currently two ways to enable feature toggles in the `grafana.ini`. +# you can either pass an array of feature you want to enable to the `enable` field or +# configure each toggle by setting the name of the toggle to true/false. Toggles set to true/false +# will take presidence over toggles in the `enable` list. + +;enable = feature1,feature2 + +;feature1 = true +;feature2 = false [date_formats] # For information on what formatting patterns that are supported https://momentjs.com/docs/#/displaying/ diff --git a/contribute/README.md b/contribute/README.md index 207953ac7ce..363c0168c2b 100644 --- a/contribute/README.md +++ b/contribute/README.md @@ -3,7 +3,7 @@ This directory contains guides for contributors to the Grafana project. - [Create a pull request](create-pull-request.md) -- [Contributing documentation](documentation.md) +- [Contribute documentation](../contribute/documentation/README.md) - [Developer guide](developer-guide.md) - [Triage issues](triage-issues.md) - [Merge a pull request](merge-pull-request.md) diff --git a/contribute/architecture/backend/communication.md b/contribute/architecture/backend/communication.md index bd1d9300fb4..d4836295d9e 100644 --- a/contribute/architecture/backend/communication.md +++ b/contribute/architecture/backend/communication.md @@ -109,7 +109,7 @@ ctx := req.Request.Context() query := &models.FindDashboardQuery{ ID: "foo", } -if err := bus.DispatchCtx(ctx, query); err != nil { +if err := bus.Dispatch(ctx, query); err != nil { return err } // The query now contains a result. diff --git a/contribute/architecture/backend/services.md b/contribute/architecture/backend/services.md index d5d7accf427..4a4142089fd 100644 --- a/contribute/architecture/backend/services.md +++ b/contribute/architecture/backend/services.md @@ -121,7 +121,7 @@ You can see an example implementation above of the IsDisabled method and custom ## Run Wire / generate code -When running `make run` it will call `make gen-go` on the first run. `gen-go` in turn will call the wire binary and generate the code in [wire_gen.go](/pkg/server/wire_gen.go). The wire binary is installed using [bingo](https://github.com/bwplotka/bingo) which will make sure to download and install all the tools needed, including the Wire binary at using a specific version. +When running `make run` it will call `make gen-go` on the first run. `gen-go` in turn will call the wire binary and generate the code in [wire_gen.go](/pkg/server/wire_gen.go) and [wire_gen.go](/pkg/cmd/grafana-cli/runner/wire_gen.go). The wire binary is installed using [bingo](https://github.com/bwplotka/bingo) which will make sure to download and install all the tools needed, including the Wire binary at using a specific version. ## OSS vs Enterprise diff --git a/contribute/developer-guide.md b/contribute/developer-guide.md index 911463b0b7f..ea2c2897d45 100644 --- a/contribute/developer-guide.md +++ b/contribute/developer-guide.md @@ -20,7 +20,7 @@ We recommend using [Homebrew](https://brew.sh/) for installing any missing depen ``` brew install git brew install go -brew install node@14 +brew install node@16 npm install -g yarn ``` @@ -39,6 +39,14 @@ For alternative ways of cloning the Grafana repository, please refer to [GitHub' **Warning:** Do not use `go get` to download Grafana. Recent versions of Go have added behavior which isn't compatible with the way the Grafana repository is structured. +### Configure Editors + +For some IDEs, additional configuration may be needed for Typescript to work with [Yarn plug'n'play](https://yarnpkg.com/features/pnp). +For [VSCode](https://yarnpkg.com/getting-started/editor-sdks#vscode) and [Vim](https://yarnpkg.com/getting-started/editor-sdks#vim), +it's as easy as running `yarn dlx @yarnpkg/sdks vscode` or `yarn dlx @yarnpkg/sdks vim`, respectively. + +More information can be found [here](https://yarnpkg.com/getting-started/editor-sdks). + ## Build Grafana Grafana consists of two components; the _frontend_, and the _backend_. @@ -81,7 +89,23 @@ When you log in for the first time, Grafana asks you to change your password. The Grafana backend includes SQLite which requires GCC to compile. So in order to compile Grafana on Windows you need to install GCC. We recommend [TDM-GCC](http://tdm-gcc.tdragon.net/download). Eventually, if you use [Scoop](https://scoop.sh), you can install GCC through that. -You can simply build the back-end as follows: `go run build.go build`. The Grafana binaries will be in bin\\windows-amd64. +You can build the back-end as follows: + +1. Follow the [instructions](https://github.com/google/wire#installing) to install the Wire tool. +2. Generate code using Wire: + +``` +# Normally Wire tool installed at $GOPATH/bin/wire.exe + gen -tags oss ./pkg/server ./pkg/cmd/grafana-cli/runner +``` + +3. Build the Grafana binaries: + +``` +go run build.go build +``` + +The Grafana binaries will be in bin\\windows-amd64. Alternately, if you wish to use the `make` command, install [Make for Windows](http://gnuwin32.sourceforge.net/packages/make.htm) and use it in a Unix shell (f.ex. Git Bash). ## Test Grafana @@ -188,11 +212,6 @@ make build-docker-full The resulting image will be tagged as grafana/grafana:dev. -> **Note:** If you've already set up a local development environment, and you're running a `linux/amd64` machine, you can speed up building the Docker image: - -1. Build the frontend: `go run build.go build-frontend`. -1. Build the Docker image: `make build-docker-dev`. - **Note:** If you are using Docker for macOS, be sure to set the memory limit to be larger than 2 GiB. Otherwise, `grunt build` may fail. The memory limit settings are available under **Docker Desktop** -> **Preferences** -> **Advanced**. ## Troubleshooting @@ -212,7 +231,7 @@ ulimit -a To change the number of open files allowed, run: ``` -ulimit -S -n 2048 +ulimit -S -n 4096 ``` The number of files needed may be different on your environment. To determine the number of open files needed by `make run`, run: diff --git a/contribute/documentation.md b/contribute/documentation.md deleted file mode 100644 index 2f362b022f0..00000000000 --- a/contribute/documentation.md +++ /dev/null @@ -1,42 +0,0 @@ -# Contributing to documentation - -This documents guides you through the process of contributing to the Grafana documentation. Make sure you've read the guide for [Contributing to Grafana](/CONTRIBUTING.md). - -## Your first contribution - -If you’re unsure about where to start, check out some of our [open docs issues](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3Atype%2Fdocs). - -Sometimes it can be difficult to understand an issue when you're just getting started. Refer to this list of [beginner-friendly issues](https://github.com/grafana/grafana/issues?q=is%3Aopen+is%3Aissue+label%3Atype%2Fdocs+label%3A"beginner+friendly") for tasks suitable for first-time contributors. - -When you’ve found an issue you want to work on, please comment on the issue to let other people know you intend to work on it. - -If you encounter any misspellings or violations to the style guide, please let us know by submitting an issue (or just fix them if they are minor changes). - -On every page in the [documentation](https://grafana.com/docs/) are two links in the upper right corner: - -- **Edit this page** takes you directly to the file on GitHub where you can contribute a fix. -- **Request doc changes** prepares an issue on GitHub with relevant information already filled in. - -## Join our community - -For general discussions on documentation, you’re welcome to join the `#docs` channel on our [public Grafana Slack](http://slack.raintank.io) team. - -## Style and formatting - -All Grafana documentation is written using [Markdown](https://en.wikipedia.org/wiki/Markdown), and can be found in the [docs](/docs) directory in the [Grafana GitHub repository](https://github.com/grafana/grafana). The [documentation website](https://grafana.com/docs) is generated with [Hugo](https://gohugo.io) which uses [Blackfriday](https://github.com/russross/blackfriday) as its Markdown rendering engine. - -### Documentation structure - -The Grafana documentation is organized into topics, called _sections_. You can take a look at the current build at [grafana.com/docs/](https://grafana.com/docs/). - -Each top-level section is located under the [docs/sources](/docs/sources) directory. Subsections are added by creating a subdirectory in the directory of the parent section. - -For each section, an `_index.md` file provides an overview of the topic. - -### Style guide - -Refer to the [Documentation style guide](style-guides/documentation-style-guide.md) for information about Grafana style, word choice, and grammar conventions. - -### Spelling - -The [codespell](https://github.com/codespell-project/codespell) tool is run for every change to catch common misspellings. diff --git a/contribute/documentation/README.md b/contribute/documentation/README.md new file mode 100644 index 00000000000..9fdd2492c34 --- /dev/null +++ b/contribute/documentation/README.md @@ -0,0 +1,235 @@ +# Contribute to our documentation + +We provide these guidelines to help our contributors make additions or corrections to our documentation. + +## Welcome + +Welcome. We're glad you're here to help make our technical documentation even better. We develop content that leads our users to success using Grafana products. Technical accuracy is our primary consideration, and we value the use of inclusive language. We regard your feedback as a gift - thanks for reading through these guidelines. + +### Intended audience + +We write these guidelines for contributors who are interested in improving our technical content. + +## Understanding the structure of Grafana documentation + +All Grafana Enterprise and OSS documentation is located in the [Grafana open source project](https://github.com/grafana/grafana) GitHub repository: https://github.com/grafana/grafana/tree/main/docs/sources. + +- The **sources** directory organizes content by topic areas, for example **administration** and **alerting**. +- Topic directories include an `_index.md` file, which provides an overview of the topic, and optionally includes subtopics that provide more detail. + +> The `_index.md` file is required. + +### Writing in markdown + +We write technical documentation using [Markdown](https://en.wikipedia.org/wiki/Markdown). We've put together a short guide to help you how to structure and format your content. + +To access the markdown guide, refer to [Markdown style guide](documentation-markdown-guide.md). + +## Ways to contribute + +We're thrilled that you are considering contributing to the documentation. You can contribute content in the following ways: + +- [Request a change](#request-a-change) +- [Edit a topic](#edit-a-topic) +- [Write a topic](#write-a-topic) + +### Request a change + +Request a change when you want to make a suggestion about a topic, but don't want to provide an edit that generates a pull request. Requesting a change gives you the freedom to express your ideas without committing language. Your suggestion can reflect a small change to wording or can reflect larger, more substantive changes. + +GitHub captures your request as an **Issue** logged against the repository. + +Before you begin: + +- Create a GitHub account. + +To request a change, complete the following steps: + +1. While viewing the topic, click **Request a change**. + +The Issue title auto-populates with the location of the file about which you are requesting a change. + +![Request a change](request-change.png) + +2. Enter a change request description. + +3. Add the **type/docs** label. + +4. Click **Submit new issue**. + +### Edit a topic + +If you want to recommend a small change, such as suggesting a correction to a topic, you can edit the topic directly in GitHub. You are not required to fork and clone the repo to use this approach. + +Other small changes might include: + +- Adding steps to a task +- Adding clarifying language to a concept +- Providing an example + +Before you begin: + +- Create a GitHub account. + +To edit a topic, complete the following steps: + +1. While viewing the topic you want to edit, click **Edit this page**. + +![Edit a topic](edit-file.png) + +2. Add your changes to the topic. + +3. Scroll to the bottom of the page and enter a branch name. + + For example, enter `clarified dashboard panel definition`. + +4. Click **Commit**. + + GitHub prompts you to create a PR. + +5. Complete the prompts provided in the body of the PR. + +6. Click **Create pull request**. + +### Write a topic + +At Grafana Labs, we use the principles of topic-based authoring when we write technical documentation. Topic-based authoring provides guidelines for writing three _types_ of technical documentation: concept, task, and reference. Before you begin writing, establish the topic type you want to write. + +#### Understanding topic types + +Technical content is divided into three topic types: concept, task, and reference. + +- **Concept**: A concept topic explains _what_ a feature (or idea) is, and why it is important. +- **Task**: A task topic explains _how_ to complete an end user procedure in the system. Task topics contain steps. +- **Reference** A reference topic contains lookup information that a user might consult when they complete a task. Documenting a list of values with descriptions is a common form of reference topic. + +**Example** + +Suppose you are writing content for a site called _Doggie handbook_. You might organize your topics like this: + +**Concepts** + +- What a dog is +- Brief history of dogs +- Why you might want a dog +- Tasks dogs can be trained to do + +**Tasks** + +- Feed the dog +- Groom the dog +- Train the dog + +**References** + +- List of dog equipment you will need +- Table of breeds that includes breed name, size range, short or long hair, and type of dog + +#### Prepare your environment + +Before you begin writing, we recommend that you fork and clone the Grafana repository so that you can use a text editor locally to create branches, commit your changes, and create a PR. + +While this document doesn't include git commands or descriptions of Github operations, you might find these links useful. + +- [Install git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git): We store all source code, including documentation, in Git repositories. +- [Fork a repo](https://docs.github.com/en/get-started/quickstart/fork-a-repo): Locate the repo you want to clone, and fork it. +- [Clone a repo](https://docs.github.com/en/repositories/creating-and-managing-repositories/cloning-a-repository): Clone the repository to your local machine. +- [Create a branch](https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging): Before you make change, create a branch. Do not push changes against the `main` branch. +- [Create a PR](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request): After you add, commit, and push your changes, create a PR in Github. + +#### Use a documentation template to contribute a topic + +We have provided documentation templates that align with each topic type: + +- [Concept](templates/doc-concept-template.md) +- [Task](templates/doc-task-template.md) +- [Reference](templates/doc-reference-template.md) + +Each template provides additional usage and formatting guidelines. We recommend that you make a copy of whichever template you are using, then add content. + +> Remove any unused content before you commit your changes. + +#### View a local build + +Prior to pushing your changes, you can view a local build of the documentation so that you can review your work. + +To view a local build: + +1. Install [Docker](https://www.docker.com/products/docker-desktop). + +1. Run Docker. + +1. Navigate to the **docs** root directory. + +1. Run `make build`. + +1. Open `localhost:3002` to review your changes. + +## Push changes and create a PR + +When you are ready for other people to review your work, perform the following tasks. + +1. [Add](https://git-scm.com/docs/git-add) your changes, which prepares your content for the next commit. + +1. [Commit](https://git-scm.com/docs/git-commit) your changes. + +1. [Push](https://git-scm.com/docs/git-push) your changes to Github. + +1. [Create a PR](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request) in Github. + +The docs build system automatically conducts a series of tests to ensure that the content doesn't conflict with other content in the docs repository. + +### Understanding the PR review and approval workflow + +When a PR is added to the repo with a label associated with `docs`, it will be reviewed by a member of the technical writing team. Depending on the size of the PR and the priority of other work, the PR will either be immediately reviewed and merged (minor fixes typically follow this pattern) or the PR will be triaged and placed in the backlog of work or moved into further development. + +## Join our community + +For general discussions on documentation, you’re welcome to join the `#docs` channel on our [public Grafana Slack](http://slack.raintank.io) team. + +## Reference: Top five writing tips + +While we don't provide a comprehensive style guide in this document, here's a few writing tips to help the writing process. + +### Consider the audience + +Write for an audience that is computer literate and has general technical knowledge, but is not necessarily familiar with Grafana or the finer points of observability. + +Pretend you are explaining your topic to a brand new Grafana user or developer. + +### Write clear and concise sentences and paragraphs + +Use the following sentence structure when you write: _subject_—_verb_—_object_. If you are telling a user to do something, write an imperative sentence. For example “Enter the refresh rate time interval and click Save.” + +- You can also start a sentence with an _if_ clause, which positions the condition before the action. +- Limit the number of words in a sentence to 20.. + +### Use active voice + +Active voice makes the performer of the action the subject +of the sentence. When you write in passive voice, the recipient of the action (and not the performer) becomes the subject of the sentence. + +Active-voice sentences are more direct and clearly identify _who_ is doing _what_. Not all tasks are completed by a user; sometimes the system can also be a performer (and by extension, the subject of the sentence). When you write in active voice you clearly make that distinction, which results in more engaging and less wordy content. + +| Use (active) | Avoid (passive) | +| ----------------------------------------------------- | -------------------------------------------------------------------- | --- | +| After you upgrade the software, restart the computer. | After the software has been upgraded, the computer can be restarted. | +| Click **OK** to save the dashboard. | The dashboard is saved when the **OK** button is clicked. | +| Create a dashboard. | A dashboard is created by you. | . | + +### Avoid obscure non-English words and abbreviations + +Users might be unfamiliar with some non-English words and abbreviations such as _per_, _vs_, and _via_. Latin abbreviations in particular, like _i.e._, _e.g._, and _etc._, are vague. + +| Use | Don’t use | +| ------------ | ----------- | +| through | via | +| that is | i.e. | +| according to | per, as per | +| and so on | etc. | + +### Write self-contained topics + +Thanks to search engines, every page in the documentation might be a reader's entry point. This means that each page needs to be self-contained and make sense on its own. The reader should not need to read other topics in order to perform the task or understand the concept. + +However, try to be helpful and link to related information. Using the _Doggie handbook_ example, the concept topic that explains what dogs can be trained to do might link to the Train the dog task. diff --git a/contribute/style-guides/documentation-markdown-guide.md b/contribute/documentation/documentation-markdown-guide.md similarity index 100% rename from contribute/style-guides/documentation-markdown-guide.md rename to contribute/documentation/documentation-markdown-guide.md diff --git a/contribute/documentation/edit-file.png b/contribute/documentation/edit-file.png new file mode 100644 index 00000000000..d17c18dfa63 Binary files /dev/null and b/contribute/documentation/edit-file.png differ diff --git a/contribute/documentation/request-change.png b/contribute/documentation/request-change.png new file mode 100644 index 00000000000..73b6bad3b3b Binary files /dev/null and b/contribute/documentation/request-change.png differ diff --git a/contribute/templates/doc-concept-template.md b/contribute/documentation/templates/doc-concept-template.md similarity index 100% rename from contribute/templates/doc-concept-template.md rename to contribute/documentation/templates/doc-concept-template.md diff --git a/contribute/templates/doc-reference-template.md b/contribute/documentation/templates/doc-reference-template.md similarity index 100% rename from contribute/templates/doc-reference-template.md rename to contribute/documentation/templates/doc-reference-template.md diff --git a/contribute/templates/doc-task-template.md b/contribute/documentation/templates/doc-task-template.md similarity index 100% rename from contribute/templates/doc-task-template.md rename to contribute/documentation/templates/doc-task-template.md diff --git a/contribute/merge-pull-request.md b/contribute/merge-pull-request.md index 5619aee82a8..d41d319f2e2 100644 --- a/contribute/merge-pull-request.md +++ b/contribute/merge-pull-request.md @@ -21,9 +21,13 @@ The following checklist/summary should give you a quick overview of what to ask/ Before actually merging a pull request there's a couple of things to take into consideration. +### Status checks + +Before you can merge a pull request, it must have a review approval, and all the required status checks must pass. + ### Format the pull request title -Make sure that the pull request title is properly formatted according to `: ` and try to make the summary short and understandable for the community as a whole. +The pull request title should be formatted according to `: `. Keep the summary short and understandable for the community as a whole. All commits in a pull request are squashed when merged and the pull request title will be the default subject line of the squashed commit message. It's also used for [changelog/release notes](#include-in-changelog-and-release-notes). @@ -31,9 +35,9 @@ See [formatting guidelines](create-pull-request.md#formatting-guidelines) for mo ### Assign a milestone -It's recommended to add a milestone to every pull request. This makes it easier to track what changes did go into a certain release. Without this you're basically left with going through git commits which could be a lot harder. +A milestone **should** be added to every pull request. Several things in the Grafana release process requires at least pull requests to be in a milestone, for example [generating changelog/release notes](#include-in-changelog-and-release-notes). -There's also various tooling built that in some cases requires a pull request to be assigned a milestone, for example [generating changelog/release notes](#include-in-changelog-and-release-notes). +This makes it easier to track what changes go into a certain release. Without this information, release managers have to go through git commits which is not an efficient process. ### Include in changelog and release notes? @@ -81,8 +85,21 @@ In case the pull request introduces a breaking change you should document this. ### Should the pull request be backported? +An active decision of backporting needs to be taken for every pull request. There's a pull request check named **Backport Check** that will enforce this. By adding/removing labels on the pull request the check will be re-evaluated. + +#### No backport + +If you don't want to backport you need to add a label named **no-backport** to the pull request. + +#### Backport + If your pull request has changes that need to go into one or several existing release branches you need to backport the changes. Please refer to [Backport PR](.github/bot.md#backport-pr) for detailed instructions. +The general rule of thumb regarding what changes goes into what release is: + +- bug fixes should be released in patch releases, e.g. v8.1.3, if the bug was introduced in the same major/minor or lower patch version. +- new features should go into the next major/minor version, e.g. v8.0.0, v8.2.0. + Some examples when backport is required: - The change needs to be released in the next upcoming patch release, e.g. v8.1.3, so you have to backport it, e.g. into the v8.1.x release branch. diff --git a/contribute/style-guides/documentation-style-guide.md b/contribute/style-guides/documentation-style-guide.md index f96f2c1ecc5..b5fdd7b79b4 100644 --- a/contribute/style-guides/documentation-style-guide.md +++ b/contribute/style-guides/documentation-style-guide.md @@ -119,7 +119,7 @@ If that is the case, then use the following format for headings: - Assume all graphics will be exclusively viewed on the web. - Maximum image size is 3840px X 2160px. - Screenshots should be readable, but not too large. -- _Do not_ use image shortcodes. Follow the guidance in the [Grafana markdown guide](https://github.com/grafana/grafana/blob/main/contribute/style-guides/documentation-markdown-guide.md#images). +- _Do not_ use image shortcodes. Follow the guidance in [Markdown style guide](../documentation/documentation-markdown-guide.md#Images). - Markdown image links are preferred. Only use the HTML image links if you need to style the image in ways unsupported in Markdown. - When you name a file, follow the [file naming conventions](#file-naming-conventions). Example: image-name-7-3.png diff --git a/contribute/style-guides/frontend.md b/contribute/style-guides/frontend.md index b133f1a4484..6794894f252 100644 --- a/contribute/style-guides/frontend.md +++ b/contribute/style-guides/frontend.md @@ -255,6 +255,7 @@ Organize your code in a directory that encloses feature code: - Put React components in `components` directory (i.e. `features/my-feature/components/ButtonPeopleDreamOf.tsx`). - Put test files next to the test subject. - Put containers (pages) in feature root (i.e. `features/my-feature/DashboardPage.tsx`). +- Put API function calls that isn't a redux thunk in an `api.ts` file within the same directory. - Subcomponents can live in the component folders. Small component do not need their own folder. - Component SASS styles should live in the same folder as component code. diff --git a/contribute/templates/README.md b/contribute/templates/README.md deleted file mode 100644 index 7b562678db6..00000000000 --- a/contribute/templates/README.md +++ /dev/null @@ -1,60 +0,0 @@ -# Templates - -Templates are both a starting point and an instruction manual for writing something new. They are intended to make life easier by providing a jumping-off point, something besides a blank page to start from. They are not intended to be a limitation. If the template does not work perfectly for your use case, you can adjust or change it. We will work it out in code review. - -## Create a template - -Feel free to add templates to the `templates` folder. Try to make them as generic as possible and include clear instructions for when and how to use the template. Assume that the template user is a brand new contributor and write accordingly. - -## Use a template - -1. Read the template. Make sure you understand what it is for and how it is intended to be used. -1. Copy and rename the template. Move it to where you actually need it. - You might also want to copy the content of the template and paste it into a different file. This is acceptable use. -1. Replace the template content with your own. Delete whatever is unnecessary. - -## Documentation templates - -In an ideal world, each topic will correspond to an information _type_ ([task](doc-task-template.md), [reference](doc-reference-template.md), [concept](doc-concept-template.md)) and contain only that type of information. - -However, this is not always practical. For example, you have a series of short topics, you can group them into one topic. - -Try to _chunk_ your content. This means you should organize the document so that the same kinds of content are grouped together. - -### Chunking example - -If I was writing content for a site called _Doggie handbook_, I might organize it like this. - -**Concept** - -- What a dog is -- Brief history of dogs -- Why you might want a dog -- Tasks dogs can be trained to do - -**Tasks** - -- Feed the dog -- Groom the dog -- Train the dog - -**Reference** - -- List of dog equipment you will need -- Table of breeds that includes breed name, size range, short or long hair, and type of dog - -### Audience - -Write for an audience that is computer literate and has general technical knowledge, but is not necessarily familiar with Grafana or the finer points of observability. - -Pretend you are explaining your topic to a brand new Grafana user or developer. - -### Self-contained - -Thanks to search engines, every page in the documentation might be a reader's entry point. This means that each page needs to be self-contained and make sense on its own. The reader should not need to read other topics in order to perform the task or understand the concept. - -However, try to be helpful and link to related information. Using the _Doggie handbook_ example, the concept topic that explains what dogs can be trained to do might link to the Train the dog task. - -## Code templates - -This is a placeholder for future templates. diff --git a/devenv/datasources.yaml b/devenv/datasources.yaml index 5c5f1a3ed33..883c2ef2c3b 100644 --- a/devenv/datasources.yaml +++ b/devenv/datasources.yaml @@ -34,11 +34,15 @@ datasources: type: prometheus access: proxy url: http://localhost:9090 + jsonData: + manageAlerts: false - name: gdev-slow-prometheus type: prometheus access: proxy url: http://localhost:3011 + jsonData: + manageAlerts: false - name: gdev-testdata isDefault: true @@ -293,6 +297,7 @@ datasources: url: http://localhost:3100 editable: false jsonData: + manageAlerts: false derivedFields: - name: "traceID" matcherRegex: "traceID=(\\w+)" diff --git a/devenv/dev-dashboards-without-uid/panel_tests_polystat.json b/devenv/dev-dashboards-without-uid/panel_tests_polystat.json index fd44872f36d..cb201bb47c4 100644 --- a/devenv/dev-dashboards-without-uid/panel_tests_polystat.json +++ b/devenv/dev-dashboards-without-uid/panel_tests_polystat.json @@ -815,19 +815,19 @@ "value": "Wm2" }, { - "text": "Volt-ampere (VA)", + "text": "Volt-Ampere (VA)", "value": "voltamp" }, { - "text": "Kilovolt-ampere (kVA)", + "text": "Kilovolt-Ampere (kVA)", "value": "kvoltamp" }, { - "text": "Volt-ampere reactive (var)", + "text": "Volt-Ampere reactive (VAr)", "value": "voltampreact" }, { - "text": "Kilovolt-ampere reactive (kvar)", + "text": "Kilovolt-Ampere reactive (kVAr)", "value": "kvoltampreact" }, { diff --git a/devenv/dev-dashboards/all-panels.json b/devenv/dev-dashboards/all-panels.json index 1be537a5cfe..6e4cf7cd21d 100644 --- a/devenv/dev-dashboards/all-panels.json +++ b/devenv/dev-dashboards/all-panels.json @@ -161,7 +161,8 @@ "rowHeight": 0.99, "showValue": "auto", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -545,7 +546,8 @@ "values": false }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -792,7 +794,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -861,7 +864,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -890,7 +894,7 @@ } ], "refresh": "", - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", diff --git a/devenv/dev-dashboards/datasource-elasticsearch/elasticsearch_compare.json b/devenv/dev-dashboards/datasource-elasticsearch/elasticsearch_compare.json index f0da50403d6..2ab0785563b 100644 --- a/devenv/dev-dashboards/datasource-elasticsearch/elasticsearch_compare.json +++ b/devenv/dev-dashboards/datasource-elasticsearch/elasticsearch_compare.json @@ -46,7 +46,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -144,7 +146,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -242,7 +246,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -339,7 +345,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -436,7 +444,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -534,7 +544,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -646,7 +658,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -701,8 +715,7 @@ "field": "@value", "id": "1", "meta": {}, - "settings": { - }, + "settings": {}, "type": "avg" } ], @@ -746,7 +759,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -801,8 +816,7 @@ "field": "@value", "id": "1", "meta": {}, - "settings": { - }, + "settings": {}, "type": "avg" } ], @@ -846,7 +860,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -901,8 +917,7 @@ "field": "@value", "id": "1", "meta": {}, - "settings": { - }, + "settings": {}, "type": "sum" } ], @@ -946,7 +961,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -1001,8 +1018,7 @@ "field": "@value", "id": "1", "meta": {}, - "settings": { - }, + "settings": {}, "type": "sum" } ], @@ -1046,7 +1062,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1147,7 +1165,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1248,7 +1268,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1349,7 +1371,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1450,7 +1474,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1563,7 +1589,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1676,7 +1704,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1786,7 +1816,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1896,7 +1928,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -1998,7 +2032,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "decimals": 3, "fill": 1, "fillGradient": 0, @@ -2114,7 +2150,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2234,7 +2272,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2354,7 +2394,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2474,7 +2516,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2594,7 +2638,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2714,7 +2760,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2834,7 +2882,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -2954,7 +3004,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -3074,7 +3126,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -3194,7 +3248,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -3314,7 +3370,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -3434,7 +3492,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -3568,7 +3628,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -3683,7 +3745,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -3798,7 +3862,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -3913,7 +3979,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4028,7 +4096,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4143,7 +4213,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4258,7 +4330,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4373,7 +4447,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4488,7 +4564,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4603,7 +4681,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4718,7 +4798,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4833,7 +4915,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -4962,7 +5046,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5081,7 +5167,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5200,7 +5288,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5319,7 +5409,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5438,7 +5530,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5557,7 +5651,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5676,7 +5772,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5795,7 +5893,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -5914,7 +6014,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -6033,7 +6135,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -6152,7 +6256,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -6271,7 +6377,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {}, @@ -6404,7 +6512,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -6523,7 +6633,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -6642,7 +6754,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "fieldConfig": { "defaults": { "custom": {} @@ -6773,7 +6887,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "fieldConfig": { "defaults": { "custom": {} @@ -6918,7 +7034,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_one", + "datasource": { + "uid": "$version_one" + }, "decimals": 3, "fieldConfig": { "defaults": { @@ -7071,7 +7189,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "$version_two", + "datasource": { + "uid": "$version_two" + }, "decimals": 3, "fieldConfig": { "defaults": { @@ -7238,7 +7358,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -7349,7 +7471,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -7460,7 +7584,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -7571,7 +7697,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -7682,7 +7810,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -7794,7 +7924,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -7906,7 +8038,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -8018,7 +8152,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fieldConfig": { "defaults": { "custom": {} @@ -8144,7 +8280,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8260,7 +8398,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8376,7 +8516,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8492,7 +8634,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8608,7 +8752,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8724,7 +8870,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8840,7 +8988,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -8956,7 +9106,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9072,7 +9224,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9188,7 +9342,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9304,7 +9460,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9420,7 +9578,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9536,7 +9696,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9652,7 +9814,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9768,7 +9932,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -9884,7 +10050,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -10014,7 +10182,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -10125,7 +10295,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -10236,7 +10408,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -10347,7 +10521,9 @@ "bars": false, "dashLength": 10, "dashes": false, - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fill": 1, "fillGradient": 0, "gridPos": { @@ -10471,7 +10647,9 @@ "type": "row" }, { - "datasource": "${version_one}", + "datasource": { + "uid": "${version_one}" + }, "fieldConfig": { "defaults": { "color": { @@ -10535,7 +10713,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -10583,8 +10762,8 @@ "field": "@value", "id": "1", "settings": { - "script": { - "inline": "_value * 1.5" + "script": { + "inline": "_value * 1.5" } }, "type": "avg" @@ -10599,7 +10778,9 @@ "type": "timeseries" }, { - "datasource": "${version_two}", + "datasource": { + "uid": "${version_two}" + }, "fieldConfig": { "defaults": { "color": { @@ -10663,7 +10844,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -10711,8 +10893,8 @@ "field": "@value", "id": "1", "settings": { - "script": { - "inline": "_value * 1.5" + "script": { + "inline": "_value * 1.5" } }, "type": "avg" @@ -10728,7 +10910,7 @@ } ], "refresh": false, - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "elasticsearch", diff --git a/devenv/dev-dashboards/datasource-opentsdb/opentsdb_v2.3.json b/devenv/dev-dashboards/datasource-opentsdb/opentsdb_v2.3.json index 287d5b434f1..52d14a2edc2 100644 --- a/devenv/dev-dashboards/datasource-opentsdb/opentsdb_v2.3.json +++ b/devenv/dev-dashboards/datasource-opentsdb/opentsdb_v2.3.json @@ -217,7 +217,7 @@ } } ], - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [], "templating": { diff --git a/devenv/dev-dashboards/datasource-testdata/new_features_in_v74.json b/devenv/dev-dashboards/datasource-testdata/new_features_in_v74.json index 547f8db50b0..3e8af852650 100644 --- a/devenv/dev-dashboards/datasource-testdata/new_features_in_v74.json +++ b/devenv/dev-dashboards/datasource-testdata/new_features_in_v74.json @@ -1991,7 +1991,7 @@ "axisLabel": "", "axisPlacement": "auto", "drawStyle": "line", - "fillOpacity": 29, + "fillOpacity": 0, "gradientMode": { "label": "None", "value": "none" @@ -2054,6 +2054,18 @@ "value": 0 } ] + }, + { + "matcher": { + "id": "byName", + "options": "value" + }, + "properties": [ + { + "id": "custom.fillOpacity", + "value": 0 + } + ] } ] }, @@ -2156,6 +2168,7 @@ "style": "dark", "tags": [ "gdev", + "graph-ng", "demo" ], "templating": { diff --git a/devenv/dev-dashboards/datasource-testdata/new_features_in_v8.json b/devenv/dev-dashboards/datasource-testdata/new_features_in_v8.json index 9d4ecefc336..62840ec2f87 100644 --- a/devenv/dev-dashboards/datasource-testdata/new_features_in_v8.json +++ b/devenv/dev-dashboards/datasource-testdata/new_features_in_v8.json @@ -1,2775 +1,2847 @@ { - "annotations": { - "list": [ - { - "builtIn": 1, - "datasource": "-- Grafana --", - "enable": true, - "hide": true, - "iconColor": "rgba(0, 211, 255, 1)", - "name": "Annotations & Alerts", - "type": "dashboard" - } - ] - }, - "editable": true, - "graphTooltip": 0, - "id": 625, - "links": [], - "panels": [ + "annotations": { + "list": [ { - "gridPos": { - "h": 4, - "w": 24, - "x": 0, - "y": 0 - }, - "id": 13, - "options": { - "content": "\n# Welcome to Grafana 8.0\n\nGrafana v8.0 adds many visualizations and improvements to panel edit, tracing and security. This dashboard highlights \nsome of the new visualization capabilities. There are so many new visualizations and display options so be sure to scroll down\nto see everything. \n\n[Read the what's new article](https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v8-0/)   |  \n[Download](https://grafana.com/grafana/download/beta)   |  \n[Grafana Cloud now free with 50gb logs, 10K metric series](https://grafana.com/signup/cloud/connect-account?pg=play&plcmt=whatnew)", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "refId": "A", - "target": "" - } - ], - "transparent": true, - "type": "text" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 4 - }, - "id": 61, - "links": [], - "options": { - "content": "## State timeline\n\nThe new state timeline panel is one of the new core visualizations. \nIt adds unique state over time visualization for string or boolean states. \n\n### Map strings to colors\n\nWith the new revamped value mapping feature you \ncan now easily map strings, booleans, nulls & NaN values\nto a color or new display text. \n\nThis mapping and coloring support will work in all new core panels.", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "fillOpacity": 80, - "lineWidth": 0 - }, - "mappings": [ - { - "options": { - "CRITICAL": { - "color": "red", - "index": 3 - }, - "HIGH": { - "color": "orange", - "index": 2 - }, - "LOW": { - "color": "blue", - "index": 0 - }, - "NORMAL": { - "color": "green", - "index": 1 - } - }, - "type": "value" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 18, - "x": 6, - "y": 4 - }, - "id": 63, - "options": { - "alignValue": "center", - "colWidth": 0.9, - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "right" - }, - "mergeValues": true, - "mode": "changes", - "rowHeight": 0.97, - "showValue": "always" - }, - "pluginVersion": "7.5.0-pre", - "targets": [ - { - "alias": "Level A", - "refId": "A", - "scenarioId": "csv_metric_values", - "stringInput": "LOW,HIGH,NORMAL,NORMAL,NORMAL,LOW,LOW,NORMAL,HIGH,CRITICAL" - }, - { - "alias": "Level B", - "hide": false, - "refId": "B", - "scenarioId": "csv_metric_values", - "stringInput": "NORMAL,LOW,LOW,CRITICAL,CRITICAL,LOW,LOW,NORMAL,HIGH,CRITICAL" - }, - { - "alias": "Level C", - "hide": false, - "refId": "C", - "scenarioId": "csv_metric_values", - "stringInput": "NORMAL,NORMAL,NORMAL,NORMAL,CRITICAL,LOW,NORMAL,NORMAL,NORMAL,LOW" - } - ], - "title": "State timeline strings", - "type": "state-timeline" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 15, - "w": 6, - "x": 0, - "y": 12 - }, - "id": 70, - "links": [], - "options": { - "content": "### Discrete time series\n\nIt can also transform any numerical time series into discrete states trough \nthresholds. This allow you to quickly gauge health over time and visualize\nthe duration spent in each threshold bracket. \n", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-graphite-1.0", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "fillOpacity": 100, - "lineWidth": 0 - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" - }, - { - "color": "green", - "value": 50 - }, - { - "color": "red", - "value": 300 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 18, - "x": 6, - "y": 12 - }, - "id": 65, - "maxDataPoints": 200, - "options": { - "alignValue": "left", - "legend": { - "displayMode": "list", - "placement": "bottom" - }, - "mergeValues": true, - "rowHeight": 0.96, - "showValue": "never" - }, - "targets": [ - { - "refId": "A", - "target": "aliasByNode(apps.backend.*.counters.requests.count, 2)" - } - ], - "title": "State timeline with time series + thresholds", - "type": "state-timeline" - }, - { - "datasource": "gdev-graphite-1.0", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisWidth": 85, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "area" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" - }, - { - "color": "green", - "value": 50 - }, - { - "color": "transparent", - "value": 50 - }, - { - "color": "red", - "value": 300 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 7, - "w": 18, - "x": 6, - "y": 20 - }, - "id": 66, - "maxDataPoints": 200, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "8.0.0-beta2", - "targets": [ - { - "refId": "A", - "target": "aliasByNode(apps.backend.*.counters.requests.count, 2)" - } - ], - "title": "Same query/data as above", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 13, - "w": 6, - "x": 0, - "y": 27 - }, - "id": 67, - "links": [], - "options": { - "content": "## Status history\n\nA sister panel to the state timeline is the new Status history panel. It can visualize periodic state in a \ngrid. Works with both numerical, string or boolean state. ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "continuous-GrYlRd" - }, - "custom": { - "fillOpacity": 70, - "lineWidth": 1 - }, - "mappings": [], - "max": 40, - "min": -10, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" - }, - { - "color": "#EAB839", - "value": 0 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 18, - "x": 6, - "y": 27 - }, - "id": 68, - "maxDataPoints": 10, - "options": { - "colWidth": 0.95, - "legend": { - "displayMode": "list", - "placement": "bottom" - }, - "rowHeight": 0.9, - "showValue": "auto" - }, - "targets": [ - { - "alias": "__house_locations", - "max": 40, - "min": -10, - "noise": 5, - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 4, - "spread": 20, - "startValue": 10 - } - ], - "title": "State timeline with time series + thresholds", - "type": "status-history" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "continuous-GrYlRd" - }, - "custom": { - "fillOpacity": 70, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "match": "true", - "result": { - "color": "green", - "index": 0, - "text": "True" - } - }, - "type": "special" - }, - { - "options": { - "match": "false", - "result": { - "color": "red", - "index": 1, - "text": "False" - } - }, - "type": "special" - } - ], - "max": 40, - "min": -10, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" - }, - { - "color": "#EAB839", - "value": 0 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 5, - "w": 18, - "x": 6, - "y": 35 - }, - "id": 69, - "maxDataPoints": 10, - "options": { - "colWidth": 0.95, - "legend": { - "displayMode": "list", - "placement": "bottom" - }, - "rowHeight": 0.9, - "showValue": "auto" - }, - "targets": [ - { - "alias": "SensorA", - "refId": "A", - "scenarioId": "csv_metric_values", - "stringInput": "true,false,true,false,true,true,true,true,false" - }, - { - "alias": "SensorB", - "hide": false, - "refId": "B", - "scenarioId": "csv_metric_values", - "stringInput": "true,true,true,false,true,true,false,true,false" - } - ], - "title": "Status history - boolean values", - "type": "status-history" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 40 - }, - "id": 59, - "links": [], - "options": { - "content": "## Bar chart \n\nA new bar chart panel adds new graphing capabilities to Grafana, especially for non\ntime series based data. It supports a categorical x or y field, grouped bars, horizontal \nand vertical layout. ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "fixedColor": "blue", - "mode": "fixed" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "fillOpacity": 74, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineWidth": 1 - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "pressure" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "red", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 0, - "y": 43 - }, - "id": 73, - "options": { - "barWidth": 0.81, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "right" - }, - "orientation": "horizontal", - "showValue": "auto", - "text": {}, - "tooltip": { - "mode": "single" - } - }, - "targets": [ - { - "csvFileName": "browser_marketshare.csv", - "refId": "A", - "scenarioId": "csv_file" - } - ], - "title": "Browser market share", - "transformations": [ - { - "id": "filterByValue", - "options": { - "filters": [ - { - "config": { - "id": "greater", - "options": { - "value": 0.37 - } - }, - "fieldName": "Market share" - } - ], - "match": "any", - "type": "include" - } - }, - { - "id": "sortBy", - "options": { - "fields": {}, - "sort": [ - { - "desc": true, - "field": "Market share" - } - ] - } - } - ], - "type": "barchart" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMin": 0, - "fillOpacity": 80, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineWidth": 1 - }, - "mappings": [ - { - "options": { - "match": "true", - "result": { - "color": "green", - "index": 0, - "text": "True" - } - }, - "type": "special" - }, - { - "options": { - "match": "false", - "result": { - "color": "red", - "index": 1, - "text": "False" - } - }, - "type": "special" - } - ], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "blue" - } - ] - }, - "unit": "short" - }, - "overrides": [] - }, - "gridPos": { - "h": 10, - "w": 12, - "x": 12, - "y": 43 - }, - "id": 74, - "maxDataPoints": 10, - "options": { - "barWidth": 0.97, - "groupWidth": 0.7, - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "right" - }, - "orientation": "auto", - "showValue": "auto", - "text": {}, - "tooltip": { - "mode": "single" - } - }, - "targets": [ - { - "alias": "SensorA", - "csvFileName": "js_libraries.csv", - "refId": "A", - "scenarioId": "csv_file" - } - ], - "title": "Popular JS Frameworks", - "type": "barchart" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 53 - }, - "id": 71, - "links": [], - "options": { - "content": "## Next-gen Graph\n\nThe new next-gen graphing visualization named `Time series` is now the default\nvisualization in v8. It supports many new options as well as improved performance.\nBelow we highlight some new features. ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 6, - "w": 6, - "x": 0, - "y": 56 - }, - "id": 25, - "links": [], - "options": { - "content": "### Interpolation modes\n\nThe new time series panel brings a new interpolation mode\nwhere you can choose between.\n* Linear\n* Smooth\n* Step before\n* Step after (same as old staircase option)", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 50, - "gradientMode": "hue", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "smooth", - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Requests/s" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 6, - "y": 56 - }, - "id": 23, - "maxDataPoints": 80, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "Requests/s", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 1, - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "" - } - ], - "title": "Interpolation mode: smooth", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "hue", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "stepBefore", - "lineWidth": 2, - "pointSize": 8, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Requests/s" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 12, - "y": 56 - }, - "id": 26, - "maxDataPoints": 80, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "Requests/s", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "seriesCount": 1, - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "1,20,90,30,5,0" - } - ], - "title": "Interpolation mode: Step before", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 40, - "gradientMode": "hue", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "stepAfter", - "lineWidth": 2, - "pointSize": 8, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "always", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Requests/s" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 6, - "w": 6, - "x": 18, - "y": 56 - }, - "id": 27, - "maxDataPoints": 80, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "Requests/s", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "seriesCount": 1, - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "1,20,90,30,5,0" - } - ], - "title": "Interpolation mode: Step after", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 8, - "w": 6, - "x": 0, - "y": 62 - }, - "id": 43, - "links": [], - "options": { - "content": "### Soft min and max\n\nAuto **Min** and **Max** can make small variations look much bigger than they are. This can be fixed by setting **Min** & **Max**. \nThis creates a new problem when spikes in the data occur. Because the \n**Min** and **Max** are hard the full spike cannot be seen. The **Soft min** and **Soft max** options give control over the default range of the axis but also allow going beyond this range when the data does. \n\nYou can combine both the existing standard option **Min** and **Max** and the new **Soft min**\n and **Soft max** to define both soft and hard limits. ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 6, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 6, - "y": 62 - }, - "id": 41, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "10,11,12,11,10,11,12,12,11,10,9,10,11,12,10,10,11,12,13,11,10,9,10,11,12,13,14,10,10" - } - ], - "title": "Auto min max", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 6, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "max": 30, - "min": 0, - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 12, - "y": 62 - }, - "id": 32, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "10,11,12,11,10,11,12,12,11,10,9,10,11,12,200,10,11,12,13,11,10,9,10,11,12,13,14,10,10" - } - ], - "title": "Hard min 0, max 30", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "description": "", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 30, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 10, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineWidth": 1, - "pointSize": 6, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "degree" - }, - "overrides": [] - }, - "gridPos": { - "h": 8, - "w": 6, - "x": 18, - "y": 62 - }, - "id": 44, - "options": { - "legend": { - "calcs": [], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "10,11,12,11,10,11,12,12,11,10,9,10,11,12,200,10,11,12,13,11,10,9,10,11,12,13,14,10,10" - } - ], - "title": "Soft min 0, soft max 30", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 70 - }, - "id": 55, - "links": [], - "options": { - "content": "### Multiple Y-Axes\n\nWith the new panel you can have more than 2 y-axes! ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "axisSoftMax": 60, - "axisSoftMin": 0, - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "opacity", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineWidth": 2, - "pointSize": 6, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "never", - "spanNulls": true, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - }, - "unit": "short" - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "Temperature" - }, - "properties": [ - { - "id": "unit", - "value": "celsius" - }, - { - "id": "custom.axisPlacement", - "value": "right" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Pressure" - }, - "properties": [ - { - "id": "unit", - "value": "pressurekpa" - }, - { - "id": "custom.axisPlacement", - "value": "right" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "Energy" - }, - "properties": [ - { - "id": "unit", - "value": "watt" - }, - { - "id": "custom.axisPlacement", - "value": "left" - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 18, - "x": 6, - "y": 70 - }, - "id": 54, - "maxDataPoints": 50, - "options": { - "legend": { - "calcs": [ - "last" - ], - "displayMode": "list", - "placement": "bottom" - }, - "tooltip": { - "mode": "multi" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "Temperature", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "20,25,30,18,35,20,30,25" - }, - { - "alias": "Pressure", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "hide": false, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "B", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "320,230,120,180,400,340,50,270" - }, - { - "alias": "Energy", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "hide": false, - "lines": 10, - "max": 300, - "min": 100, - "noise": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "C", - "scenarioId": "random_walk", - "spread": 100, - "startValue": 0, - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "" - } - ], - "title": "Multiple Y-Axes (more than 2!)", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 5, - "w": 6, - "x": 0, - "y": 75 - }, - "id": 51, - "links": [], - "options": { - "content": "### Richer display options\n\nThe new time series panel supports more control over lines, fill gradients that \nwork for both line, area graphs & bars. ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - }, - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "B-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 20 - ], - "fill": "dash" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "C-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 30 - ], - "fill": "dash" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "D-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 30, - 3, - 3 - ], - "fill": "dash" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "E-series" - }, - "properties": [ - { - "id": "custom.lineStyle" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "F-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 6, - "y": 75 - }, - "id": 48, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "10,10" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "B", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "9,9" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "C", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "8,8" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "D", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "7,7" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "E", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "6,6" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "F", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "5,5" - } - ], - "title": "Advanced dashed line settings", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "line", - "fillOpacity": 0, - "gradientMode": "none", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "dash" - }, - "lineWidth": 2, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "B-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 20 - ], - "fill": "dash" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "C-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 10, - 30 - ], - "fill": "dash" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "D-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 30, - 3, - 3 - ], - "fill": "dash" - } - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "E-series" - }, - "properties": [ - { - "id": "custom.lineStyle" - } - ] - }, - { - "matcher": { - "id": "byName", - "options": "F-series" - }, - "properties": [ - { - "id": "custom.lineStyle", - "value": { - "dash": [ - 0, - 10 - ], - "fill": "dot" - } - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 12, - "y": 75 - }, - "id": 76, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "10,10" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "B", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "9,9" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "C", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "8,8" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "D", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "7,7" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "E", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "6,6" - }, - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "F", - "scenarioId": "csv_metric_values", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "5,5" - } - ], - "title": "Advanced dashed line settings", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "axisLabel": "", - "axisPlacement": "auto", - "barAlignment": 0, - "drawStyle": "bars", - "fillOpacity": 82, - "gradientMode": "hue", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineInterpolation": "linear", - "lineStyle": { - "dash": [ - 10, - 10 - ], - "fill": "solid" - }, - "lineWidth": 1, - "pointSize": 5, - "scaleDistribution": { - "type": "linear" - }, - "showPoints": "auto", - "spanNulls": false, - "stacking": { - "group": "A", - "mode": "none" - }, - "thresholdsStyle": { - "mode": "off" - } - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "A-series" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "orange", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 5, - "w": 6, - "x": 18, - "y": 75 - }, - "id": 50, - "maxDataPoints": 6, - "options": { - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - }, - "tooltip": { - "mode": "single" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "hide": false, - "lines": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "random_walk", - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "1,20,90,30,5,0" - } - ], - "title": "Bars with hue gradient", - "type": "timeseries" - }, - { - "datasource": "gdev-testdata", - "gridPos": { - "h": 3, - "w": 24, - "x": 0, - "y": 80 - }, - "id": 75, - "links": [], - "options": { - "content": "## Histogram\n\nThis hidden feature of the old Graph panel is now a standalone visualization. It combines a histogram \ntransformation and bar chart visualization into single integrated easy to use panel. There is also a new standalone histogram \ntransformation that can be paired with any visualization. ", - "mode": "markdown" - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "__server_names", - "refId": "A", - "scenarioId": "random_walk", - "seriesCount": 6 - } - ], - "type": "text" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "palette-classic" - }, - "custom": { - "fillOpacity": 80, - "gradientMode": "hue", - "hideFrom": { - "viz": false, - "legend": false, - "tooltip": false - }, - "lineWidth": 1 - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "A-series" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 11, - "w": 12, - "x": 0, - "y": 83 - }, - "id": 49, - "options": { - "bucketOffset": 0, - "bucketSize": 10, - "legend": { - "calcs": [], - "displayMode": "hidden", - "placement": "bottom" - } - }, - "pluginVersion": "7.4.0-beta1", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "hide": false, - "lines": 10, - "max": 100, - "min": 1, - "noise": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "random_walk", - "spread": 10, - "startValue": 50, - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "1,20,90,30,5,0" - } - ], - "title": "Histogram visualization", - "type": "histogram" - }, - { - "datasource": "gdev-testdata", - "fieldConfig": { - "defaults": { - "color": { - "mode": "thresholds" - }, - "custom": { - "align": "auto", - "displayMode": "auto" - }, - "mappings": [], - "thresholds": { - "mode": "absolute", - "steps": [ - { - "color": "green" - }, - { - "color": "red", - "value": 80 - } - ] - } - }, - "overrides": [ - { - "matcher": { - "id": "byName", - "options": "A-series" - }, - "properties": [ - { - "id": "color", - "value": { - "fixedColor": "blue", - "mode": "fixed" - } - } - ] - } - ] - }, - "gridPos": { - "h": 11, - "w": 12, - "x": 12, - "y": 83 - }, - "id": 77, - "options": { - "showHeader": true - }, - "pluginVersion": "8.1.0-pre", - "targets": [ - { - "alias": "", - "csvWave": { - "timeStep": 60, - "valuesCSV": "0,0,2,2,1,1" - }, - "hide": false, - "lines": 10, - "max": 100, - "min": 1, - "noise": 10, - "points": [], - "pulseWave": { - "offCount": 3, - "offValue": 1, - "onCount": 3, - "onValue": 2, - "timeStep": 60 - }, - "refId": "A", - "scenarioId": "random_walk", - "spread": 10, - "startValue": 50, - "stream": { - "bands": 1, - "noise": 2.2, - "speed": 250, - "spread": 3.5, - "type": "signal" - }, - "stringInput": "1,20,90,30,5,0" - } - ], - "title": "Histogram transform ", - "transformations": [ - { - "id": "histogram", - "options": { - "bucketSize": 10, - "combine": true, - "fields": {} - } - } - ], - "type": "table" + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" } - ], - "refresh": false, - "schemaVersion": 30, - "style": "dark", - "tags": [ - "gdev", - "demo" - ], - "templating": { - "list": [] + ] + }, + "editable": true, + "graphTooltip": 0, + "id": 625, + "links": [], + "panels": [ + { + "gridPos": { + "h": 4, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 13, + "options": { + "content": "\n# Welcome to Grafana 8.0\n\nGrafana v8.0 adds many visualizations and improvements to panel edit, tracing and security. This dashboard highlights \nsome of the new visualization capabilities. There are so many new visualizations and display options so be sure to scroll down\nto see everything. \n\n[Read the what's new article](https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v8-0/)   |  \n[Download](https://grafana.com/grafana/download/beta)   |  \n[Grafana Cloud now free with 50gb logs, 10K metric series](https://grafana.com/signup/cloud/connect-account?pg=play&plcmt=whatnew)", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "refId": "A", + "target": "" + } + ], + "transparent": true, + "type": "text" }, - "time": { - "from": "now-6h", - "to": "now" + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 4 + }, + "id": 61, + "links": [], + "options": { + "content": "## State timeline\n\nThe new state timeline panel is one of the new core visualizations. \nIt adds unique state over time visualization for string or boolean states. \n\n### Map strings to colors\n\nWith the new revamped value mapping feature you \ncan now easily map strings, booleans, nulls & NaN values\nto a color or new display text. \n\nThis mapping and coloring support will work in all new core panels.", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" }, - "timepicker": { - "refresh_intervals": [ - "10s", - "30s", - "1m", - "5m", - "15m", - "30m", - "1h", - "2h", - "1d" - ] + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "fillOpacity": 80, + "lineWidth": 0 + }, + "mappings": [ + { + "options": { + "CRITICAL": { + "color": "red", + "index": 3 + }, + "HIGH": { + "color": "orange", + "index": 2 + }, + "LOW": { + "color": "blue", + "index": 0 + }, + "NORMAL": { + "color": "green", + "index": 1 + } + }, + "type": "value" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 18, + "x": 6, + "y": 4 + }, + "id": 63, + "options": { + "alignValue": "center", + "colWidth": 0.9, + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "right" + }, + "mergeValues": true, + "mode": "changes", + "rowHeight": 0.97, + "showValue": "always" + }, + "pluginVersion": "7.5.0-pre", + "targets": [ + { + "alias": "Level A", + "refId": "A", + "scenarioId": "csv_metric_values", + "stringInput": "LOW,HIGH,NORMAL,NORMAL,NORMAL,LOW,LOW,NORMAL,HIGH,CRITICAL" + }, + { + "alias": "Level B", + "hide": false, + "refId": "B", + "scenarioId": "csv_metric_values", + "stringInput": "NORMAL,LOW,LOW,CRITICAL,CRITICAL,LOW,LOW,NORMAL,HIGH,CRITICAL" + }, + { + "alias": "Level C", + "hide": false, + "refId": "C", + "scenarioId": "csv_metric_values", + "stringInput": "NORMAL,NORMAL,NORMAL,NORMAL,CRITICAL,LOW,NORMAL,NORMAL,NORMAL,LOW" + } + ], + "title": "State timeline strings", + "type": "state-timeline" }, - "timezone": "", - "title": "New Features in v8.0", - "uid": "8mux8PqGz", - "version": 17 - } + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 15, + "w": 6, + "x": 0, + "y": 12 + }, + "id": 70, + "links": [], + "options": { + "content": "### Discrete time series\n\nIt can also transform any numerical time series into discrete states trough \nthresholds. This allow you to quickly gauge health over time and visualize\nthe duration spent in each threshold bracket. \n", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "graphite" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "fillOpacity": 100, + "lineWidth": 0 + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + }, + { + "color": "green", + "value": 50 + }, + { + "color": "red", + "value": 300 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 18, + "x": 6, + "y": 12 + }, + "id": 65, + "maxDataPoints": 200, + "options": { + "alignValue": "left", + "legend": { + "displayMode": "list", + "placement": "bottom" + }, + "mergeValues": true, + "rowHeight": 0.96, + "showValue": "never" + }, + "targets": [ + { + "refId": "A", + "target": "aliasByNode(apps.backend.*.counters.requests.count, 2)" + } + ], + "title": "State timeline with time series + thresholds", + "type": "state-timeline" + }, + { + "datasource": { + "type": "graphite" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisWidth": 85, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "area" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + }, + { + "color": "green", + "value": 50 + }, + { + "color": "transparent", + "value": 50 + }, + { + "color": "red", + "value": 300 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 7, + "w": 18, + "x": 6, + "y": 20 + }, + "id": 66, + "maxDataPoints": 200, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "8.0.0-beta2", + "targets": [ + { + "refId": "A", + "target": "aliasByNode(apps.backend.*.counters.requests.count, 2)" + } + ], + "title": "Same query/data as above", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 13, + "w": 6, + "x": 0, + "y": 27 + }, + "id": 67, + "links": [], + "options": { + "content": "## Status history\n\nA sister panel to the state timeline is the new Status history panel. It can visualize periodic state in a \ngrid. Works with both numerical, string or boolean state. ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 1 + }, + "mappings": [], + "max": 40, + "min": -10, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + }, + { + "color": "#EAB839", + "value": 0 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 18, + "x": 6, + "y": 27 + }, + "id": 68, + "maxDataPoints": 10, + "options": { + "colWidth": 0.95, + "legend": { + "displayMode": "list", + "placement": "bottom" + }, + "rowHeight": 0.9, + "showValue": "auto" + }, + "targets": [ + { + "alias": "__house_locations", + "max": 40, + "min": -10, + "noise": 5, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 4, + "spread": 20, + "startValue": 10 + } + ], + "title": "State timeline with time series + thresholds", + "type": "status-history" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "continuous-GrYlRd" + }, + "custom": { + "fillOpacity": 70, + "lineWidth": 1 + }, + "mappings": [ + { + "options": { + "match": "true", + "result": { + "color": "green", + "index": 0, + "text": "True" + } + }, + "type": "special" + }, + { + "options": { + "match": "false", + "result": { + "color": "red", + "index": 1, + "text": "False" + } + }, + "type": "special" + } + ], + "max": 40, + "min": -10, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + }, + { + "color": "#EAB839", + "value": 0 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 5, + "w": 18, + "x": 6, + "y": 35 + }, + "id": 69, + "maxDataPoints": 10, + "options": { + "colWidth": 0.95, + "legend": { + "displayMode": "list", + "placement": "bottom" + }, + "rowHeight": 0.9, + "showValue": "auto" + }, + "targets": [ + { + "alias": "SensorA", + "refId": "A", + "scenarioId": "csv_metric_values", + "stringInput": "true,false,true,false,true,true,true,true,false" + }, + { + "alias": "SensorB", + "hide": false, + "refId": "B", + "scenarioId": "csv_metric_values", + "stringInput": "true,true,true,false,true,true,false,true,false" + } + ], + "title": "Status history - boolean values", + "type": "status-history" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 40 + }, + "id": 59, + "links": [], + "options": { + "content": "## Bar chart \n\nA new bar chart panel adds new graphing capabilities to Grafana, especially for non\ntime series based data. It supports a categorical x or y field, grouped bars, horizontal \nand vertical layout. ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "fixedColor": "blue", + "mode": "fixed" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 74, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineWidth": 1 + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "pressure" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "red", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 43 + }, + "id": 73, + "options": { + "barWidth": 0.81, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "right" + }, + "orientation": "horizontal", + "showValue": "auto", + "text": {}, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "csvFileName": "browser_marketshare.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Browser market share", + "transformations": [ + { + "id": "filterByValue", + "options": { + "filters": [ + { + "config": { + "id": "greater", + "options": { + "value": 0.37 + } + }, + "fieldName": "Market share" + } + ], + "match": "any", + "type": "include" + } + }, + { + "id": "sortBy", + "options": { + "fields": {}, + "sort": [ + { + "desc": true, + "field": "Market share" + } + ] + } + } + ], + "type": "barchart" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMin": 0, + "fillOpacity": 80, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineWidth": 1 + }, + "mappings": [ + { + "options": { + "match": "true", + "result": { + "color": "green", + "index": 0, + "text": "True" + } + }, + "type": "special" + }, + { + "options": { + "match": "false", + "result": { + "color": "red", + "index": 1, + "text": "False" + } + }, + "type": "special" + } + ], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "blue" + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 12, + "y": 43 + }, + "id": 74, + "maxDataPoints": 10, + "options": { + "barWidth": 0.97, + "groupWidth": 0.7, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "right" + }, + "orientation": "auto", + "showValue": "auto", + "text": {}, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "alias": "SensorA", + "csvFileName": "js_libraries.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Popular JS Frameworks", + "type": "barchart" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 53 + }, + "id": 71, + "links": [], + "options": { + "content": "## Next-gen Graph\n\nThe new next-gen graphing visualization named `Time series` is now the default\nvisualization in v8. It supports many new options as well as improved performance.\nBelow we highlight some new features. ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 0, + "y": 56 + }, + "id": 25, + "links": [], + "options": { + "content": "### Interpolation modes\n\nThe new time series panel brings a new interpolation mode\nwhere you can choose between.\n* Linear\n* Smooth\n* Step before\n* Step after (same as old staircase option)", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 50, + "gradientMode": "hue", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "smooth", + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Requests/s" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 6, + "y": 56 + }, + "id": 23, + "maxDataPoints": 80, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "Requests/s", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 1, + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "" + } + ], + "title": "Interpolation mode: smooth", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "hue", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "stepBefore", + "lineWidth": 2, + "pointSize": 8, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Requests/s" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 12, + "y": 56 + }, + "id": 26, + "maxDataPoints": 80, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "Requests/s", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "seriesCount": 1, + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "1,20,90,30,5,0" + } + ], + "title": "Interpolation mode: Step before", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 40, + "gradientMode": "hue", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "stepAfter", + "lineWidth": 2, + "pointSize": 8, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "always", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Requests/s" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 6, + "x": 18, + "y": 56 + }, + "id": 27, + "maxDataPoints": 80, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "Requests/s", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "seriesCount": 1, + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "1,20,90,30,5,0" + } + ], + "title": "Interpolation mode: Step after", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 0, + "y": 62 + }, + "id": 43, + "links": [], + "options": { + "content": "### Soft min and max\n\nAuto **Min** and **Max** can make small variations look much bigger than they are. This can be fixed by setting **Min** & **Max**. \nThis creates a new problem when spikes in the data occur. Because the \n**Min** and **Max** are hard the full spike cannot be seen. The **Soft min** and **Soft max** options give control over the default range of the axis but also allow going beyond this range when the data does. \n\nYou can combine both the existing standard option **Min** and **Max** and the new **Soft min**\n and **Soft max** to define both soft and hard limits. ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 6, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 6, + "y": 62 + }, + "id": 41, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "10,11,12,11,10,11,12,12,11,10,9,10,11,12,10,10,11,12,13,11,10,9,10,11,12,13,14,10,10" + } + ], + "title": "Auto min max", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 6, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "max": 30, + "min": 0, + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 12, + "y": 62 + }, + "id": 32, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "10,11,12,11,10,11,12,12,11,10,9,10,11,12,200,10,11,12,13,11,10,9,10,11,12,13,14,10,10" + } + ], + "title": "Hard min 0, max 30", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMax": 30, + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 6, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "degree" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 6, + "x": 18, + "y": 62 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "10,11,12,11,10,11,12,12,11,10,9,10,11,12,200,10,11,12,13,11,10,9,10,11,12,13,14,10,10" + } + ], + "title": "Soft min 0, soft max 30", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 70 + }, + "id": 55, + "links": [], + "options": { + "content": "### Multiple Y-Axes\n\nWith the new panel you can have more than 2 y-axes! ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "axisSoftMax": 60, + "axisSoftMin": 0, + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "opacity", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineWidth": 2, + "pointSize": 6, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": true, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Temperature" + }, + "properties": [ + { + "id": "unit", + "value": "celsius" + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Pressure" + }, + "properties": [ + { + "id": "unit", + "value": "pressurekpa" + }, + { + "id": "custom.axisPlacement", + "value": "right" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Energy" + }, + "properties": [ + { + "id": "unit", + "value": "watt" + }, + { + "id": "custom.axisPlacement", + "value": "left" + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 18, + "x": 6, + "y": 70 + }, + "id": 54, + "maxDataPoints": 50, + "options": { + "legend": { + "calcs": [ + "last" + ], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "Temperature", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "20,25,30,18,35,20,30,25" + }, + { + "alias": "Pressure", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "hide": false, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "B", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "320,230,120,180,400,340,50,270" + }, + { + "alias": "Energy", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "hide": false, + "lines": 10, + "max": 300, + "min": 100, + "noise": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "C", + "scenarioId": "random_walk", + "spread": 100, + "startValue": 0, + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "" + } + ], + "title": "Multiple Y-Axes (more than 2!)", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 0, + "y": 75 + }, + "id": 51, + "links": [], + "options": { + "content": "### Richer display options\n\nThe new time series panel supports more control over lines, fill gradients that \nwork for both line, area graphs & bars. ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "B-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 20 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "C-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 30 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "D-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 30, + 3, + 3 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "E-series" + }, + "properties": [ + { + "id": "custom.lineStyle" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "F-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 6, + "y": 75 + }, + "id": 48, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "10,10" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "B", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "9,9" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "C", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "8,8" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "D", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "7,7" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "E", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "6,6" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "F", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "5,5" + } + ], + "title": "Advanced dashed line settings", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 2, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "B-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 20 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "C-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 10, + 30 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "D-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 30, + 3, + 3 + ], + "fill": "dash" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "E-series" + }, + "properties": [ + { + "id": "custom.lineStyle" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "F-series" + }, + "properties": [ + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 10 + ], + "fill": "dot" + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 12, + "y": 75 + }, + "id": 76, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "10,10" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "B", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "9,9" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "C", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "8,8" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "D", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "7,7" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "E", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "6,6" + }, + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "F", + "scenarioId": "csv_metric_values", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "5,5" + } + ], + "title": "Advanced dashed line settings", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "bars", + "fillOpacity": 82, + "gradientMode": "hue", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "solid" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "A-series" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 5, + "w": 6, + "x": 18, + "y": 75 + }, + "id": 50, + "maxDataPoints": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "hide": false, + "lines": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "random_walk", + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "1,20,90,30,5,0" + } + ], + "title": "Bars with hue gradient", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "gridPos": { + "h": 3, + "w": 24, + "x": 0, + "y": 80 + }, + "id": 75, + "links": [], + "options": { + "content": "## Histogram\n\nThis hidden feature of the old Graph panel is now a standalone visualization. It combines a histogram \ntransformation and bar chart visualization into single integrated easy to use panel. There is also a new standalone histogram \ntransformation that can be paired with any visualization. ", + "mode": "markdown" + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "__server_names", + "refId": "A", + "scenarioId": "random_walk", + "seriesCount": 6 + } + ], + "type": "text" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "fillOpacity": 80, + "gradientMode": "hue", + "hideFrom": { + "viz": false, + "legend": false, + "tooltip": false + }, + "lineWidth": 1 + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "A-series" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 0, + "y": 83 + }, + "id": 49, + "options": { + "bucketOffset": 0, + "bucketSize": 10, + "legend": { + "calcs": [], + "displayMode": "hidden", + "placement": "bottom" + } + }, + "pluginVersion": "7.4.0-beta1", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "hide": false, + "lines": 10, + "max": 100, + "min": 1, + "noise": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "random_walk", + "spread": 10, + "startValue": 50, + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "1,20,90,30,5,0" + } + ], + "title": "Histogram visualization", + "type": "histogram" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "custom": { + "align": "auto", + "displayMode": "auto" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "A-series" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 11, + "w": 12, + "x": 12, + "y": 83 + }, + "id": 77, + "options": { + "showHeader": true + }, + "pluginVersion": "8.1.0-pre", + "targets": [ + { + "alias": "", + "csvWave": { + "timeStep": 60, + "valuesCSV": "0,0,2,2,1,1" + }, + "hide": false, + "lines": 10, + "max": 100, + "min": 1, + "noise": 10, + "points": [], + "pulseWave": { + "offCount": 3, + "offValue": 1, + "onCount": 3, + "onValue": 2, + "timeStep": 60 + }, + "refId": "A", + "scenarioId": "random_walk", + "spread": 10, + "startValue": 50, + "stream": { + "bands": 1, + "noise": 2.2, + "speed": 250, + "spread": 3.5, + "type": "signal" + }, + "stringInput": "1,20,90,30,5,0" + } + ], + "title": "Histogram transform ", + "transformations": [ + { + "id": "histogram", + "options": { + "bucketSize": 10, + "combine": true, + "fields": {} + } + } + ], + "type": "table" + } + ], + "refresh": false, + "schemaVersion": 33, + "style": "dark", + "tags": [ + "gdev", + "graph-ng", + "demo" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": { + "refresh_intervals": [ + "10s", + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h", + "1d" + ] + }, + "timezone": "", + "title": "New Features in v8.0", + "uid": "8mux8PqGz", + "version": 17 +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-Kitchen-Sink.json b/devenv/dev-dashboards/e2e-repeats/Repeating-Kitchen-Sink.json new file mode 100644 index 00000000000..26cd15fbc7c --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-Kitchen-Sink.json @@ -0,0 +1,486 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181282174, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 44, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Orphan non-repeating panel", + "type": "timeseries" + }, + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 8 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 9 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "horizontal", + "repeatDirection": "h", + "title": "Horizontal repeating $horizontal", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 17 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Non-repeating panel", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 17 + }, + "id": 22, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "vertical", + "repeatDirection": "v", + "title": "Vertical repeating $vertical", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating Kitchen Sink", + "uid": "hxQwTjpnk", + "version": 6, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-panel-horizontally.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-panel-horizontally.json new file mode 100644 index 00000000000..a1847c7e93a --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-panel-horizontally.json @@ -0,0 +1,204 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181116069, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "horizontal", + "repeatDirection": "h", + "title": "Panel Title $horizontal", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a panel horizontally", + "uid": "WVpf2jp7z", + "version": 3, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-panel-vertically.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-panel-vertically.json new file mode 100644 index 00000000000..7dc03da259d --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-panel-vertically.json @@ -0,0 +1,202 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "vertical", + "repeatDirection": "v", + "title": "Panel Title $vertical", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "1" + ], + "value": [ + "1" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": false, + "text": "All", + "value": "$__all" + }, + { + "selected": true, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a panel vertically", + "uid": "OY8Ghjt7k", + "version": 1, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel-and-horizontal-repeating-panel.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel-and-horizontal-repeating-panel.json new file mode 100644 index 00000000000..ff27b5edcc6 --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel-and-horizontal-repeating-panel.json @@ -0,0 +1,335 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181157128, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Panel Title", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 9 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "horizontal", + "repeatDirection": "h", + "title": "Horizontal repeating $horizontal", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a row with a non-repeating panel and horizontal repeating panel", + "uid": "k3PEoCpnk", + "version": 3, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel-and-vertical-repeating-panel.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel-and-vertical-repeating-panel.json new file mode 100644 index 00000000000..732ae4ae993 --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel-and-vertical-repeating-panel.json @@ -0,0 +1,335 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181176989, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Panel Title", + "type": "timeseries" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 8, + "y": 1 + }, + "id": 9, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "vertical", + "repeatDirection": "v", + "title": "Vertical repeating $vertical", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a row with a non-repeating panel and vertical repeating panel", + "uid": "7lS-ojt7z", + "version": 2, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel.json new file mode 100644 index 00000000000..a2dd0305f60 --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-non-repeating-panel.json @@ -0,0 +1,258 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181195825, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "title": "Panel Title", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a row with a non-repeating panel", + "uid": "ZzyTojpnz", + "version": 3, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-repeating-horizontal-panel.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-repeating-horizontal-panel.json new file mode 100644 index 00000000000..0c8cc89888d --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-repeating-horizontal-panel.json @@ -0,0 +1,260 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181211838, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + }, + { + "datasource": { + "type": "testdata" + }, + "description": "", + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 8, + "x": 0, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "horizontal", + "repeatDirection": "h", + "title": "Panel Title $horizontal", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": false, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a row with a repeating horizontal panel", + "uid": "0OmtTCtnk", + "version": 3, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-repeating-vertical-panel.json b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-repeating-vertical-panel.json new file mode 100644 index 00000000000..0547b8ba6bf --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-a-row-with-a-repeating-vertical-panel.json @@ -0,0 +1,259 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181228045, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + }, + { + "datasource": { + "type": "testdata" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 1 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "repeat": "vertical", + "repeatDirection": "v", + "title": "Panel Title $vertical", + "type": "timeseries" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": false, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating a row with a repeating vertical panel", + "uid": "I0YIojp7z", + "version": 3, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/e2e-repeats/Repeating-an-empty-row.json b/devenv/dev-dashboards/e2e-repeats/Repeating-an-empty-row.json new file mode 100644 index 00000000000..52e68bd9fd9 --- /dev/null +++ b/devenv/dev-dashboards/e2e-repeats/Repeating-an-empty-row.json @@ -0,0 +1,183 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "iteration": 1640181241284, + "links": [], + "liveNow": false, + "panels": [ + { + "collapsed": false, + "gridPos": { + "h": 1, + "w": 24, + "x": 0, + "y": 0 + }, + "id": 2, + "panels": [], + "repeat": "row", + "title": "Row title $row", + "type": "row" + } + ], + "schemaVersion": 34, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": false, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "vertical", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "horizontal", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + }, + { + "current": { + "selected": true, + "text": [ + "All" + ], + "value": [ + "$__all" + ] + }, + "hide": 0, + "includeAll": true, + "multi": true, + "name": "row", + "options": [ + { + "selected": true, + "text": "All", + "value": "$__all" + }, + { + "selected": false, + "text": "1", + "value": "1" + }, + { + "selected": false, + "text": "2", + "value": "2" + }, + { + "selected": false, + "text": "3", + "value": "3" + } + ], + "query": "1,2,3", + "queryValue": "", + "skipUrlSync": false, + "type": "custom" + } + ] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "utc", + "title": "Repeating an empty row", + "uid": "dtpl2Ctnk", + "version": 4, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/home.json b/devenv/dev-dashboards/home.json index 3fd98704fff..c59210f5874 100644 --- a/devenv/dev-dashboards/home.json +++ b/devenv/dev-dashboards/home.json @@ -189,7 +189,7 @@ "type": "dashlist" } ], - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [], "templating": { diff --git a/devenv/dev-dashboards/panel-barchart/barchart-autosizing.json b/devenv/dev-dashboards/panel-barchart/barchart-autosizing.json index 45ea89e04c3..785ad11d5d7 100644 --- a/devenv/dev-dashboards/panel-barchart/barchart-autosizing.json +++ b/devenv/dev-dashboards/panel-barchart/barchart-autosizing.json @@ -79,7 +79,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -151,7 +152,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -221,7 +223,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -291,7 +294,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -305,7 +309,10 @@ "type": "barchart" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -363,7 +370,8 @@ "valueSize": 25 }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -433,7 +441,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -504,7 +513,8 @@ "stacking": "none", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -519,12 +529,13 @@ } ], "refresh": "", - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", "panel-tests", - "barchart" + "barchart", + "graph-ng" ], "templating": { "list": [] diff --git a/devenv/dev-dashboards/panel-candlestick/candlestick.json b/devenv/dev-dashboards/panel-candlestick/candlestick.json new file mode 100644 index 00000000000..6cfaf6d95e3 --- /dev/null +++ b/devenv/dev-dashboards/panel-candlestick/candlestick.json @@ -0,0 +1,481 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineStyle": { + "dash": [ + 10, + 10 + ], + "fill": "dash" + }, + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "sma" + }, + "properties": [ + { + "id": "color", + "value": { + "fixedColor": "orange", + "mode": "fixed" + } + }, + { + "id": "custom.lineWidth", + "value": 5 + }, + { + "id": "custom.lineStyle", + "value": { + "dash": [ + 0, + 20 + ], + "fill": "dot" + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "bolup" + }, + "properties": [ + { + "id": "custom.fillBelowTo", + "value": "boldn" + }, + { + "id": "custom.fillOpacity", + "value": 8 + }, + { + "id": "color", + "value": { + "fixedColor": "blue", + "mode": "fixed" + } + } + ] + } + ] + }, + "gridPos": { + "h": 16, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "candleStyle": "candles", + "colorStrategy": "open-close", + "colors": { + "down": "red", + "up": "green" + }, + "fields": {}, + "includeAllFields": true, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "mode": "candles+volume" + }, + "targets": [ + { + "csvFileName": "ohlc_dogecoin.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Price & Volume", + "type": "candlestick" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 20, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 7, + "options": { + "candleStyle": "candles", + "colorStrategy": "close-close", + "colors": { + "down": "red", + "up": "green" + }, + "fields": {}, + "includeAllFields": false, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "mode": "candles" + }, + "targets": [ + { + "csvFileName": "ohlc_dogecoin.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Price Only, Hollow Candles", + "transformations": [], + "type": "candlestick" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [] + }, + "gridPos": { + "h": 10, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 6, + "options": { + "candleStyle": "ohlcbars", + "colorStrategy": "open-close", + "colors": { + "down": "red", + "up": "blue" + }, + "fields": {}, + "includeAllFields": false, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "mode": "candles" + }, + "targets": [ + { + "csvFileName": "ohlc_dogecoin.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Price Only, OHLC Bars", + "transformations": [], + "type": "candlestick" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 100, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green" + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "currencyUSD" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "open" + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": true + } + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "close" + }, + "properties": [ + { + "id": "custom.hideFrom", + "value": { + "legend": true, + "tooltip": true, + "viz": true + } + } + ] + } + ] + }, + "gridPos": { + "h": 6, + "w": 12, + "x": 12, + "y": 20 + }, + "id": 4, + "options": { + "candleStyle": "candles", + "colorStrategy": "open-close", + "colors": { + "down": "red", + "up": "yellow" + }, + "fields": {}, + "includeAllFields": false, + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "mode": "volume" + }, + "targets": [ + { + "csvFileName": "ohlc_dogecoin.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Volume Only, Alt Colors, 100% Opacity", + "transformations": [], + "type": "candlestick" + } + ], + "refresh": false, + "schemaVersion": 33, + "style": "dark", + "tags": [ + "gdev", + "panel-tests", + "graph-ng" + ], + "templating": { + "list": [] + }, + "time": { + "from": "2021-07-13T22:13:30.740Z", + "to": "2021-07-13T22:46:18.921Z" + }, + "timepicker": {}, + "timezone": "", + "title": "Candlestick", + "uid": "MP-Di9F7k", + "version": 2, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/panel-geomap/geomap_multi-layers.json b/devenv/dev-dashboards/panel-geomap/geomap_multi-layers.json new file mode 100644 index 00000000000..7da66da3c17 --- /dev/null +++ b/devenv/dev-dashboards/panel-geomap/geomap_multi-layers.json @@ -0,0 +1,436 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 157, + "links": [], + "liveNow": false, + "panels": [ + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 20 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 22, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "basemap": { + "config": {}, + "name": "Layer 0", + "type": "default" + }, + "controls": { + "mouseWheelZoom": true, + "showAttribution": true, + "showDebug": false, + "showScale": false, + "showZoom": true + }, + "layers": [ + { + "config": { + "rules": [ + { + "check": { + "operation": "eq", + "property": "name", + "value": "Greenland" + }, + "style": { + "color": { + "fixed": "light-blue" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + { + "check": { + "operation": "eq", + "property": "name", + "value": "Antarctica" + }, + "style": { + "color": { + "fixed": "#FCE2DE" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + { + "check": { + "operation": "eq", + "property": "name", + "value": "Canada" + }, + "style": { + "color": { + "fixed": "#37872D" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + { + "check": { + "operation": "eq", + "property": "name", + "value": "Mexico" + }, + "style": { + "color": { + "fixed": "#1F60C4" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + } + ], + "src": "public/maps/countries.geojson", + "style": { + "color": { + "fixed": "dark-green" + }, + "opacity": 0.1, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/circle.svg", + "mode": "fixed" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 0, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + "name": "Countries", + "type": "geojson" + }, + { + "config": { + "showLegend": true, + "style": { + "color": { + "fixed": "dark-blue" + }, + "opacity": 0.4, + "rotation": { + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 5, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/square.svg", + "mode": "fixed" + }, + "text": { + "field": "Count", + "fixed": "", + "mode": "field" + }, + "textConfig": { + "fontSize": 16, + "offsetX": 10, + "offsetY": 10, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + "location": { + "mode": "auto" + }, + "name": "Flights", + "type": "markers" + } + ], + "view": { + "id": "coords", + "lat": 42.826559, + "lon": -96.868893, + "zoom": 3.58 + } + }, + "pluginVersion": "8.3.0-pre", + "targets": [ + { + "csvFileName": "flight_info_by_state.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Multi layers", + "type": "geomap" + }, + { + "fieldConfig": { + "defaults": { + "color": { + "mode": "thresholds" + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": 20 + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 22, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 3, + "options": { + "basemap": { + "config": {}, + "name": "Layer 0", + "type": "default" + }, + "controls": { + "mouseWheelZoom": true, + "showAttribution": true, + "showDebug": false, + "showScale": false, + "showZoom": true + }, + "layers": [ + { + "config": { + "showLegend": true, + "style": { + "color": { + "fixed": "dark-green" + }, + "opacity": 0.7, + "rotation": { + "field": "Lng", + "fixed": 0, + "max": 360, + "min": -360, + "mode": "mod" + }, + "size": { + "fixed": 10, + "max": 15, + "min": 2 + }, + "symbol": { + "fixed": "img/icons/marker/plane.svg", + "mode": "fixed" + }, + "text": { + "field": "Lng", + "fixed": "", + "mode": "field" + }, + "textConfig": { + "fontSize": 12, + "offsetX": 0, + "offsetY": 18, + "textAlign": "center", + "textBaseline": "middle" + } + } + }, + "name": "Layer 2", + "type": "markers" + } + ], + "view": { + "id": "coords", + "lat": 42.826559, + "lon": -96.868893, + "zoom": 3.58 + } + }, + "pluginVersion": "8.3.0-pre", + "targets": [ + { + "csvFileName": "flight_info_by_state.csv", + "refId": "A", + "scenarioId": "csv_file" + } + ], + "title": "Markers", + "type": "geomap" + } + ], + "schemaVersion": 33, + "style": "dark", + "tags": [ + "gdev", + "geomap", + "panel-tests" + ], + "templating": { + "list": [] + }, + "time": { + "from": "now-6h", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Panel Tests - Geomap Multi Layers", + "uid": "2jFpEvp7z", + "version": 8, + "weekStart": "" +} diff --git a/devenv/dev-dashboards/panel-geomap/panel-geomap.json b/devenv/dev-dashboards/panel-geomap/panel-geomap.json index b00a48f33a1..5fb9d880e15 100644 --- a/devenv/dev-dashboards/panel-geomap/panel-geomap.json +++ b/devenv/dev-dashboards/panel-geomap/panel-geomap.json @@ -362,7 +362,7 @@ } ], "refresh": "", - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", diff --git a/devenv/dev-dashboards/panel-graph/graph-ng-by-value-color-schemes.json b/devenv/dev-dashboards/panel-graph/graph-ng-by-value-color-schemes.json index 9afd53a1f27..3a72b9f4608 100644 --- a/devenv/dev-dashboards/panel-graph/graph-ng-by-value-color-schemes.json +++ b/devenv/dev-dashboards/panel-graph/graph-ng-by-value-color-schemes.json @@ -95,7 +95,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -181,7 +182,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -266,7 +268,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -280,7 +283,10 @@ "type": "timeseries" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -352,7 +358,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -437,7 +444,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -455,7 +463,10 @@ "type": "timeseries" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -531,7 +542,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -544,7 +556,10 @@ "type": "timeseries" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -620,7 +635,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -633,7 +649,10 @@ "type": "timeseries" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -709,7 +728,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -797,7 +817,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -825,11 +846,12 @@ } ], "refresh": false, - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", - "panel-tests" + "panel-tests", + "graph-ng" ], "templating": { "list": [] diff --git a/devenv/dev-dashboards/panel-graph/graph-ng-nulls.json b/devenv/dev-dashboards/panel-graph/graph-ng-nulls.json index fa2c31200ac..cc454854dac 100644 --- a/devenv/dev-dashboards/panel-graph/graph-ng-nulls.json +++ b/devenv/dev-dashboards/panel-graph/graph-ng-nulls.json @@ -34,7 +34,9 @@ ], "panels": [ { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "fieldConfig": { "defaults": { "color": { @@ -100,7 +102,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.4.0-pre", @@ -138,7 +141,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "description": "Series A have no nulls and is not aligned with series B", "fieldConfig": { "defaults": { @@ -206,7 +211,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.4.0-pre", @@ -252,7 +258,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "description": "", "fieldConfig": { "defaults": { @@ -320,7 +328,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.4.0-pre", @@ -386,7 +395,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "fieldConfig": { "defaults": { "color": { @@ -452,7 +463,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.4.0-pre", @@ -490,7 +502,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "description": "Series A have no nulls and is not aligned with series B", "fieldConfig": { "defaults": { @@ -558,7 +572,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.4.0-pre", @@ -604,7 +619,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "description": "Should look the same as above\n", "fieldConfig": { "defaults": { @@ -672,7 +689,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.4.0-pre", @@ -738,7 +756,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "fieldConfig": { "defaults": { "color": { @@ -836,7 +856,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.2.0-pre", @@ -878,7 +899,9 @@ "type": "timeseries" }, { - "datasource": "gdev-testdata", + "datasource": { + "type": "testdata" + }, "fieldConfig": { "defaults": { "color": { @@ -976,7 +999,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.2.0-pre", @@ -1082,7 +1106,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.5.0-pre", @@ -1184,7 +1209,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -1198,7 +1224,7 @@ "type": "timeseries" } ], - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", diff --git a/devenv/dev-dashboards/panel-graph/graph-ng-stacking.json b/devenv/dev-dashboards/panel-graph/graph-ng-stacking.json index 97ae888c683..683c7c00fc9 100644 --- a/devenv/dev-dashboards/panel-graph/graph-ng-stacking.json +++ b/devenv/dev-dashboards/panel-graph/graph-ng-stacking.json @@ -880,7 +880,11 @@ ], "schemaVersion": 27, "style": "dark", - "tags": [], + "tags": [ + "gdev", + "panel-tests", + "graph-ng" + ], "templating": { "list": [] }, diff --git a/devenv/dev-dashboards/panel-graph/graph-ng-thresholds.json b/devenv/dev-dashboards/panel-graph/graph-ng-thresholds.json index 5ab9a8d13d6..88479202874 100644 --- a/devenv/dev-dashboards/panel-graph/graph-ng-thresholds.json +++ b/devenv/dev-dashboards/panel-graph/graph-ng-thresholds.json @@ -1231,7 +1231,8 @@ "style": "dark", "tags": [ "gdev", - "panel-tests" + "panel-tests", + "graph-ng" ], "templating": { "list": [] diff --git a/devenv/dev-dashboards/panel-graph/graph-ng.json b/devenv/dev-dashboards/panel-graph/graph-ng.json index b5a78989c28..c2c39ca6659 100644 --- a/devenv/dev-dashboards/panel-graph/graph-ng.json +++ b/devenv/dev-dashboards/panel-graph/graph-ng.json @@ -1346,7 +1346,7 @@ "axisPlacement": "auto", "drawStyle": "line", "fillGradient": "hue", - "fillOpacity": 25, + "fillOpacity": 0, "hideFrom": { "graph": false, "legend": false, @@ -1426,6 +1426,10 @@ "fixedColor": "blue", "mode": "fixed" } + }, + { + "id": "custom.fillOpacity", + "value": 0 } ] } diff --git a/devenv/dev-dashboards/panel-histogram/histogram_tests.json b/devenv/dev-dashboards/panel-histogram/histogram_tests.json index cf5adbcf6e0..49caf47b446 100644 --- a/devenv/dev-dashboards/panel-histogram/histogram_tests.json +++ b/devenv/dev-dashboards/panel-histogram/histogram_tests.json @@ -76,7 +76,10 @@ "type": "histogram" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -409,11 +412,12 @@ "type": "table" } ], - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", - "panel-tests" + "panel-tests", + "graph-ng" ], "templating": { "list": [] diff --git a/devenv/dev-dashboards/panel-polystat/polystat_test.json b/devenv/dev-dashboards/panel-polystat/polystat_test.json index 9e1d2c26b15..36eb54dc2b4 100644 --- a/devenv/dev-dashboards/panel-polystat/polystat_test.json +++ b/devenv/dev-dashboards/panel-polystat/polystat_test.json @@ -815,19 +815,19 @@ "value": "Wm2" }, { - "text": "Volt-ampere (VA)", + "text": "Volt-Ampere (VA)", "value": "voltamp" }, { - "text": "Kilovolt-ampere (kVA)", + "text": "Kilovolt-Ampere (kVA)", "value": "kvoltamp" }, { - "text": "Volt-ampere reactive (var)", + "text": "Volt-Ampere reactive (VAr)", "value": "voltampreact" }, { - "text": "Kilovolt-ampere reactive (kvar)", + "text": "Kilovolt-Ampere reactive (kVAr)", "value": "kvoltampreact" }, { diff --git a/devenv/dev-dashboards/panel-stat/panel-stat-tests.json b/devenv/dev-dashboards/panel-stat/panel-stat-tests.json index c431f93fdbe..1182fd0c0b1 100644 --- a/devenv/dev-dashboards/panel-stat/panel-stat-tests.json +++ b/devenv/dev-dashboards/panel-stat/panel-stat-tests.json @@ -772,7 +772,11 @@ ], "schemaVersion": 26, "style": "dark", - "tags": ["gdev", "panel-tests"], + "tags": [ + "gdev", + "panel-tests", + "graph-ng" + ], "templating": { "list": [] }, diff --git a/devenv/dev-dashboards/panel-timeline/timeline-demo.json b/devenv/dev-dashboards/panel-timeline/timeline-demo.json index 6830dc069ce..6dec37ab297 100644 --- a/devenv/dev-dashboards/panel-timeline/timeline-demo.json +++ b/devenv/dev-dashboards/panel-timeline/timeline-demo.json @@ -89,7 +89,8 @@ "rowHeight": 0.98, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.5.0-pre", @@ -186,7 +187,8 @@ "rowHeight": 0.98, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -287,7 +289,8 @@ "rowHeight": 0.98, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -367,7 +370,8 @@ "rowHeight": 0.98, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "asc" } }, "pluginVersion": "7.5.0-pre", @@ -410,10 +414,12 @@ } ], "refresh": false, - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", + "panel-tests", + "graph-ng", "demo" ], "templating": { diff --git a/devenv/dev-dashboards/panel-timeline/timeline-modes.json b/devenv/dev-dashboards/panel-timeline/timeline-modes.json index d76c7db9609..d1895390fbd 100644 --- a/devenv/dev-dashboards/panel-timeline/timeline-modes.json +++ b/devenv/dev-dashboards/panel-timeline/timeline-modes.json @@ -68,7 +68,8 @@ "rowHeight": 0.9, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.5.0-pre", @@ -244,7 +245,8 @@ "rowHeight": 0.9, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.5.0-pre", @@ -319,7 +321,8 @@ "rowHeight": 0.9, "showValue": "always", "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "7.5.0-pre", @@ -358,11 +361,12 @@ } ], "refresh": false, - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", - "panel-tests" + "panel-tests", + "graph-ng" ], "templating": { "list": [] diff --git a/devenv/dev-dashboards/transforms/config-from-query.json b/devenv/dev-dashboards/transforms/config-from-query.json index af802508422..c0d7e9cfff3 100644 --- a/devenv/dev-dashboards/transforms/config-from-query.json +++ b/devenv/dev-dashboards/transforms/config-from-query.json @@ -83,7 +83,8 @@ "placement": "bottom" }, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "targets": [ @@ -484,7 +485,8 @@ "showValue": "auto", "text": {}, "tooltip": { - "mode": "single" + "mode": "single", + "sort": "none" } }, "pluginVersion": "8.1.0-pre", @@ -530,7 +532,7 @@ } ], "refresh": "", - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", diff --git a/devenv/dev-dashboards/transforms/rows-to-fields.json b/devenv/dev-dashboards/transforms/rows-to-fields.json index fd3665a8be5..2f694102456 100644 --- a/devenv/dev-dashboards/transforms/rows-to-fields.json +++ b/devenv/dev-dashboards/transforms/rows-to-fields.json @@ -23,7 +23,10 @@ "links": [], "panels": [ { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -70,7 +73,10 @@ "type": "table" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -264,7 +270,10 @@ "type": "gauge" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -311,7 +320,10 @@ "type": "table" }, { - "datasource": "-- Dashboard --", + "datasource": { + "type": "datasource", + "uid": "-- Dashboard --" + }, "fieldConfig": { "defaults": { "color": { @@ -579,7 +591,7 @@ } ], "refresh": "", - "schemaVersion": 30, + "schemaVersion": 33, "style": "dark", "tags": [ "gdev", diff --git a/devenv/docker/blocks/alert_webhook_listener/main.go b/devenv/docker/blocks/alert_webhook_listener/main.go index 1f1a18df6c7..8eac84b0faa 100644 --- a/devenv/docker/blocks/alert_webhook_listener/main.go +++ b/devenv/docker/blocks/alert_webhook_listener/main.go @@ -6,6 +6,7 @@ import ( "io/ioutil" "log" "net/http" + "strings" ) func hello(w http.ResponseWriter, r *http.Request) { @@ -14,7 +15,8 @@ func hello(w http.ResponseWriter, r *http.Request) { return } - line := fmt.Sprintf("webbhook: -> %s", string(body)) + safeBody := strings.Replace(string(body), "\n", "", -1) + line := fmt.Sprintf("webbhook: -> %s", safeBody) fmt.Println(line) if _, err := io.WriteString(w, line); err != nil { log.Printf("Failed to write: %v", err) diff --git a/devenv/docker/blocks/elastic/docker-compose.yaml b/devenv/docker/blocks/elastic/docker-compose.yaml index 3ef9853f943..78c67982814 100644 --- a/devenv/docker/blocks/elastic/docker-compose.yaml +++ b/devenv/docker/blocks/elastic/docker-compose.yaml @@ -1,19 +1,22 @@ # You need to run 'sysctl -w vm.max_map_count=262144' on the host machine elasticsearch-latest: - image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2 + image: docker.elastic.co/elasticsearch/elasticsearch:8.0.0-beta1 command: elasticsearch environment: - "discovery.type=single-node" + - "xpack.license.self_generated.type=basic" + - "xpack.security.enabled=false" ports: - "14200:9200" - "14300:9300" - fake-elastic-latest-data: - image: grafana/fake-data-gen - links: - - elasticsearch-latest - environment: - FD_SERVER: elasticsearch-latest - FD_DATASOURCE: elasticsearch7 - FD_PORT: 9200 \ No newline at end of file + # TODO: uncomment when https://github.com/grafana/fake-data-gen/pull/20 is merged + # fake-elastic-latest-data: + # image: grafana/fake-data-gen + # links: + # - elasticsearch-latest + # environment: + # FD_SERVER: elasticsearch-latest + # FD_DATASOURCE: elasticsearch8 + # FD_PORT: 9200 diff --git a/devenv/docker/blocks/elastic/elasticsearch.yml b/devenv/docker/blocks/elastic/elasticsearch.yml deleted file mode 100644 index 0061758eb58..00000000000 --- a/devenv/docker/blocks/elastic/elasticsearch.yml +++ /dev/null @@ -1,3 +0,0 @@ -script.inline: on -script.indexed: on -xpack.license.self_generated.type: basic diff --git a/devenv/docker/blocks/elastic2/docker-compose.yaml b/devenv/docker/blocks/elastic2/docker-compose.yaml index 23210b7b7d6..64107c3e1e6 100644 --- a/devenv/docker/blocks/elastic2/docker-compose.yaml +++ b/devenv/docker/blocks/elastic2/docker-compose.yaml @@ -9,7 +9,7 @@ fake-elastic-data: image: grafana/fake-data-gen - network_mode: bridge environment: - FD_DATASOURCE: elasticsearch2 + FD_SERVER: elasticsearch2 + FD_DATASOURCE: elasticsearch FD_PORT: 9200 diff --git a/devenv/docker/blocks/graphite/docker-compose.yaml b/devenv/docker/blocks/graphite/docker-compose.yaml index 89122f32107..eb04bc6703e 100644 --- a/devenv/docker/blocks/graphite/docker-compose.yaml +++ b/devenv/docker/blocks/graphite/docker-compose.yaml @@ -7,7 +7,6 @@ fake-graphite11-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: graphite FD_PORT: 2103 diff --git a/devenv/docker/blocks/graphite09/docker-compose.yaml b/devenv/docker/blocks/graphite09/docker-compose.yaml index 8778dbfb638..abeb8183168 100644 --- a/devenv/docker/blocks/graphite09/docker-compose.yaml +++ b/devenv/docker/blocks/graphite09/docker-compose.yaml @@ -10,10 +10,7 @@ fake-graphite09-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: graphite FD_PORT: 2303 FD_GRAPHITE_VERSION: 0.9 - - diff --git a/devenv/docker/blocks/graphite1/docker-compose.yaml b/devenv/docker/blocks/graphite1/docker-compose.yaml index e8a59f30761..ac5fb86a3d2 100644 --- a/devenv/docker/blocks/graphite1/docker-compose.yaml +++ b/devenv/docker/blocks/graphite1/docker-compose.yaml @@ -7,7 +7,6 @@ fake-graphite1-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: graphite FD_PORT: 2203 diff --git a/devenv/docker/blocks/influxdb/docker-compose.yaml b/devenv/docker/blocks/influxdb/docker-compose.yaml index 1ba453ad52e..803eb4be511 100644 --- a/devenv/docker/blocks/influxdb/docker-compose.yaml +++ b/devenv/docker/blocks/influxdb/docker-compose.yaml @@ -5,30 +5,22 @@ - '8086:8086' environment: INFLUXD_REPORTING_DISABLED: 'true' + DOCKER_INFLUXDB_INIT_MODE: 'setup' + DOCKER_INFLUXDB_INIT_USERNAME: 'grafana' + DOCKER_INFLUXDB_INIT_PASSWORD: 'grafana12345' + DOCKER_INFLUXDB_INIT_ORG: 'myorg' + DOCKER_INFLUXDB_INIT_BUCKET: 'mybucket' + DOCKER_INFLUXDB_INIT_ADMIN_TOKEN: 'mytoken' volumes: - ./docker/blocks/influxdb/config.yaml:/etc/influxdb2/config.yaml - - # Use the influx cli to set up an influxdb instance. - influxdb_cli: - links: - - influxdb - image: influxdb:latest - # The following long command does 2 things: - # 1. It initializes the bucket - # 2. Maps bucket to database to enable backward-compatible access (influxql queries) - # Use these same configurations parameters in your telegraf configuration, mytelegraf.conf. - entrypoint: bash -c "influx setup --bucket mybucket -t mytoken -o myorg --username=grafana --password=grafana12345 --host=http://influxdb:8086 -f && influx -t mytoken -o myorg --host=http://influxdb:8086 bucket list -n mybucket --hide-headers | cut -f 1 | xargs influx -t mytoken -o myorg --host=http://influxdb:8086 v1 dbrp create --db mybucket --rp default --default --bucket-id" - # Wait for the influxd service in the influxdb container has fully bootstrapped before trying to setup an influxdb instance with the influxdb_cli service. - restart: on-failure:10 - depends_on: - - influxdb + - ./docker/blocks/influxdb/setup_influxql.sh:/docker-entrypoint-initdb.d/setup_influxql.sh telegraf: image: telegraf:latest links: - influxdb depends_on: - - influxdb_cli + - influxdb volumes: - ./docker/blocks/influxdb/telegraf.conf:/etc/telegraf/telegraf.conf:ro - /var/log:/var/log/host diff --git a/devenv/docker/blocks/influxdb/setup_influxql.sh b/devenv/docker/blocks/influxdb/setup_influxql.sh new file mode 100755 index 00000000000..1a3c3c95ccd --- /dev/null +++ b/devenv/docker/blocks/influxdb/setup_influxql.sh @@ -0,0 +1,3 @@ +#!/bin/sh + +influx v1 dbrp create --bucket-id "${DOCKER_INFLUXDB_INIT_BUCKET_ID}" --org myorg --db mybucket --rp default --default \ No newline at end of file diff --git a/devenv/docker/blocks/maildev/README.md b/devenv/docker/blocks/maildev/README.md new file mode 100644 index 00000000000..6ad77fc4935 --- /dev/null +++ b/devenv/docker/blocks/maildev/README.md @@ -0,0 +1 @@ +This block starts a test SMTP server on port 1025 and UI on port 12080 \ No newline at end of file diff --git a/devenv/docker/blocks/maildev/docker-compose.yaml b/devenv/docker/blocks/maildev/docker-compose.yaml new file mode 100644 index 00000000000..7cc648a23d1 --- /dev/null +++ b/devenv/docker/blocks/maildev/docker-compose.yaml @@ -0,0 +1,5 @@ + maildev: + image: gillesdemey/maildev + ports: + - "12080:1080" + - "1025:1025" diff --git a/devenv/docker/blocks/mssql/docker-compose.yaml b/devenv/docker/blocks/mssql/docker-compose.yaml index 05a93629e73..becb4b321b9 100644 --- a/devenv/docker/blocks/mssql/docker-compose.yaml +++ b/devenv/docker/blocks/mssql/docker-compose.yaml @@ -13,7 +13,6 @@ fake-mssql-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: mssql - FD_PORT: 1433 \ No newline at end of file + FD_PORT: 1433 diff --git a/devenv/docker/blocks/mssql_arm64/README.md b/devenv/docker/blocks/mssql_arm64/README.md new file mode 100644 index 00000000000..83c63a63fe8 --- /dev/null +++ b/devenv/docker/blocks/mssql_arm64/README.md @@ -0,0 +1,12 @@ +This build is basically a clone of the `mssql` folder but without the custom `grafana` db/user created. + +At this moment, there is no `MSSQL Server` available for `arm64` processors. The workaround is using an `azure-sql-edge` image instead. + +The `setup` files cannot be used to create a custom `grafana` db/user since `sqlcmd` does not work for `arm64` processors. +(https://docs.microsoft.com/en-us/azure/azure-sql-edge/connect) + +You can connect the Grafana MSSQL datasource to this instance by using the following credentials: + * Host: `localhost` + * Database: `master` + * User: `sa` + * Password: `Password!` or whatever is set in `docker-compose.yaml` for env var `MSSQL_SA_PASSWORD` \ No newline at end of file diff --git a/devenv/docker/blocks/mssql_arm64/build/Dockerfile b/devenv/docker/blocks/mssql_arm64/build/Dockerfile new file mode 100644 index 00000000000..db2d1ce54df --- /dev/null +++ b/devenv/docker/blocks/mssql_arm64/build/Dockerfile @@ -0,0 +1,11 @@ +FROM mcr.microsoft.com/azure-sql-edge:1.0.4 +WORKDIR /usr/setup +COPY entrypoint.sh ./ + +USER root + +RUN chown -R mssql ./ + +USER mssql + +CMD /bin/bash ./entrypoint.sh diff --git a/devenv/docker/blocks/mssql_arm64/build/entrypoint.sh b/devenv/docker/blocks/mssql_arm64/build/entrypoint.sh new file mode 100644 index 00000000000..9eb8c7eda2c --- /dev/null +++ b/devenv/docker/blocks/mssql_arm64/build/entrypoint.sh @@ -0,0 +1,2 @@ +#start SQL Server +/opt/mssql/bin/sqlservr \ No newline at end of file diff --git a/devenv/docker/blocks/mssql_arm64/docker-compose.yaml b/devenv/docker/blocks/mssql_arm64/docker-compose.yaml new file mode 100644 index 00000000000..481241951f4 --- /dev/null +++ b/devenv/docker/blocks/mssql_arm64/docker-compose.yaml @@ -0,0 +1,8 @@ + mssql: + build: + context: docker/blocks/mssql_arm64/build + environment: + ACCEPT_EULA: Y + MSSQL_SA_PASSWORD: Password! + ports: + - "1433:1433" \ No newline at end of file diff --git a/devenv/docker/blocks/mysql/docker-compose.yaml b/devenv/docker/blocks/mysql/docker-compose.yaml index d85f3db53ac..6a2083e1c7e 100644 --- a/devenv/docker/blocks/mysql/docker-compose.yaml +++ b/devenv/docker/blocks/mysql/docker-compose.yaml @@ -11,8 +11,6 @@ fake-mysql-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: mysql FD_PORT: 3306 - diff --git a/devenv/docker/blocks/opentsdb/docker-compose.yaml b/devenv/docker/blocks/opentsdb/docker-compose.yaml index d366c9b1b30..97c46ae4d76 100644 --- a/devenv/docker/blocks/opentsdb/docker-compose.yaml +++ b/devenv/docker/blocks/opentsdb/docker-compose.yaml @@ -5,7 +5,7 @@ fake-opentsdb-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: opentsdb + FD_PORT: 4242 diff --git a/devenv/docker/blocks/postgres/docker-compose.yaml b/devenv/docker/blocks/postgres/docker-compose.yaml index 7dfffdc1238..58002e14d2a 100644 --- a/devenv/docker/blocks/postgres/docker-compose.yaml +++ b/devenv/docker/blocks/postgres/docker-compose.yaml @@ -15,7 +15,6 @@ fake-postgres-data: image: grafana/fake-data-gen - network_mode: bridge environment: FD_DATASOURCE: postgres FD_PORT: 5432 diff --git a/devenv/docker/blocks/slow_proxy/main.go b/devenv/docker/blocks/slow_proxy/main.go index 4c98eb9d17c..4f83fc5fc5e 100644 --- a/devenv/docker/blocks/slow_proxy/main.go +++ b/devenv/docker/blocks/slow_proxy/main.go @@ -6,6 +6,7 @@ import ( "net/http/httputil" "net/url" "os" + "strings" "time" ) @@ -31,7 +32,17 @@ func main() { proxy := httputil.NewSingleHostReverseProxy(originURL) http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { - log.Printf("sleeping for %s then proxying request: url '%s', headers: '%v'", sleep.String(), r.RequestURI, r.Header) + safeSleep := strings.Replace(sleep.String(), "\n", "", -1) + safeRequestUri := strings.Replace(r.RequestURI, "\n", "", -1) + log.Printf("sleeping for %s then proxying request: url '%s'", safeSleep, safeRequestUri) + + // This is commented out as CodeQL flags this as vulnerability CWE-117 (https://cwe.mitre.org/data/definitions/117.html) + // If you need to debug and log the headers then use the line below instead of the log.Printf statement above + // The docker container will then need to be rebuilt after the change is made: + // Run `make devenv sources=slow_proxy` + // or run `docker-compose build` in the devenv folder + // + // log.Printf("sleeping for %s then proxying request: url '%s', headers: '%v'", safeSleep, safeRequestUri, r.Header) <-time.After(sleep) proxy.ServeHTTP(w, r) }) diff --git a/devenv/docker/loadtest/modules/client.js b/devenv/docker/loadtest/modules/client.js index 86e923823db..72e66476a46 100644 --- a/devenv/docker/loadtest/modules/client.js +++ b/devenv/docker/loadtest/modules/client.js @@ -8,7 +8,7 @@ export const UIEndpoint = class UIEndpoint { login(username, pwd) { const payload = { user: username, password: pwd }; - return this.httpClient.formPost('/login', payload); + return this.httpClient.post('/login', JSON.stringify(payload)); } }; diff --git a/devenv/docker/loadtest/run.sh b/devenv/docker/loadtest/run.sh index e4458aeb0b3..c71d9776b5c 100755 --- a/devenv/docker/loadtest/run.sh +++ b/devenv/docker/loadtest/run.sh @@ -39,7 +39,7 @@ run() { done shift $((OPTIND-1)) - docker run -t --network=host -v $PWD:/src -e URL=$url -e SLOW_QUERY=$slowQuery -e K6_OUT=$out -e API_KEY=$apiKey --rm -i loadimpact/k6:master run --vus $vus --duration $duration src/$testcase.js + docker run -t --network=host -v $PWD:/src -e URL=$url -e SLOW_QUERY=$slowQuery -e K6_OUT=$out -e API_KEY=$apiKey --rm -i loadimpact/k6:master run --vus $vus --duration $duration /src/$testcase.js } run "$@" diff --git a/docs/sources/administration/configuration.md b/docs/sources/administration/configuration.md index f421d8df4de..d802fe3ecc8 100644 --- a/docs/sources/administration/configuration.md +++ b/docs/sources/administration/configuration.md @@ -464,6 +464,27 @@ Analytics ID here. By default this feature is disabled. Google Tag Manager ID, only enabled if you enter an ID here. +### rudderstack_write_key + +If you want to track Grafana usage via Rudderstack specify _your_ Rudderstack +Write Key here. The `rudderstack_data_plane_url` must also be provided for this +feature to be enabled. By default this feature is disabled. + +### rudderstack_data_plane_url + +Rudderstack data plane url that will receive Rudderstack events. The +`rudderstack_write_key` must also be provided for this feature to be enabled. + +### rudderstack_sdk_url + +Optional. If tracking with Rudderstack is enabled, you can provide a custom +URL to load the Rudderstack SDK. + +### rudderstack_config_url + +Optional. If tracking with Rudderstack is enabled, you can provide a custom +URL to load the Rudderstack config. + ### application_insights_connection_string If you want to track Grafana usage via Azure Application Insights, then specify _your_ Application Insights connection string. Since the connection string contains semicolons, you need to wrap it in backticks (`). By default, tracking usage is disabled. @@ -1113,7 +1134,7 @@ Sets a global limit on number of alert rules that can be created. Default is -1 ## [unified_alerting] -For more information about the Grafana 8 alerts, refer to [Unified Alerting]({{< relref "../alerting/unified-alerting/_index.md" >}}). +For more information about the Grafana alerts, refer to [Unified Alerting]({{< relref "../alerting/unified-alerting/_index.md" >}}). ### enabled @@ -1197,15 +1218,15 @@ The interval string is a possibly signed sequence of decimal numbers, followed b ## [alerting] -For more information about the Alerting feature in Grafana, refer to [Alerts overview]({{< relref "../alerting/_index.md" >}}). +For more information about the legacy dashboard alerting feature in Grafana, refer to [Alerts overview]({{< relref "../alerting/_index.md" >}}). ### enabled -Set to `false` to [enable Grafana 8 alerting]({{}}) and to disable legacy alerting engine. Default is `true`. +Set to `false` to [enable Grafana alerting]({{}}) and to disable legacy alerting engine. to disable Grafana alerting, set to `true`. ### execute_alerts -Turns off alert rule execution, but Alerting is still visible in the Grafana UI. +Turns off alert rule execution, but alerting is still visible in the Grafana UI. ### error_or_timeout @@ -1582,7 +1603,7 @@ We do _not_ recommend using this option. For more information, refer to [Plugin ### plugin_admin_enabled -Available to Grafana administrators only, the plugin admin app is set to `false` by default. Set it to `true` to enable the app. +Available to Grafana administrators only, enables installing / uninstalling / updating plugins directly from the Grafana UI. Set to `true` by default. Setting it to `false` will hide the install / uninstall / update controls. For more information, refer to [Plugin catalog]({{< relref "../plugins/catalog.md" >}}). @@ -1594,6 +1615,10 @@ Set to `true` if you want to enable external management of plugins. Default is ` Custom install/learn more URL for enterprise plugins. Defaults to https://grafana.com/grafana/plugins/. +### plugin_catalog_hidden_plugins + +Enter a comma-separated list of plugin identifiers to hide in the plugin catalog. +
## [live] @@ -1707,13 +1732,19 @@ Mode `reusable` will have one browser instance and will create a new incognito p ### rendering_clustering_mode -When rendering_mode = clustered you can instruct how many browsers or incognito pages can execute concurrently. Default is `browser` and will cluster using browser instances. +When rendering_mode = clustered, you can instruct how many browsers or incognito pages can execute concurrently. Default is `browser` and will cluster using browser instances. Mode `context` will cluster using incognito pages. ### rendering_clustering_max_concurrency -When rendering_mode = clustered you can define the maximum number of browser instances/incognito pages that can execute concurrently. +When rendering_mode = clustered, you can define the maximum number of browser instances/incognito pages that can execute concurrently. Default is `5`. + +### rendering_clustering_timeout + +> **Note**: Available in grafana-image-renderer v3.3.0 and later versions. + +When rendering_mode = clustered, you can specify the duration a rendering request can take before it will time out. Default is `30` seconds. ### rendering_viewport_max_width diff --git a/docs/sources/administration/database-encryption-enterprise.md b/docs/sources/administration/database-encryption-enterprise.md new file mode 100644 index 00000000000..d0974ab581c --- /dev/null +++ b/docs/sources/administration/database-encryption-enterprise.md @@ -0,0 +1,22 @@ ++++ +title = "Database encryption (Enterprise)" +description = "Grafana Enterprise database encryption" +keywords = ["grafana", "enterprise", "database", "encryption", "documentation"] +aliases = [""] +weight = 440 ++++ + +# Grafana Enterprise database encryption + +If you are using Grafana Enterprise, you can change Grafana’s cryptographic mode of operation from AES-CFB to AES-GCM, and integrate with a key management system (KMS) provider. + +## Changing your encryption mode to AES-GCM + +Grafana encrypts secrets using Advanced Encryption Standard in Cipher +FeedBack mode (AES-CFB). You might prefer to use AES in Galois/Counter +Mode (AES-GCM) instead, to meet your company’s security requirements or +in order to maintain consistency with other services. + +To change your encryption mode, update the `algorithm` value in the +`[security.encryption]` section of your Grafana configuration file. +For details, refer to Enterprise configuration. diff --git a/docs/sources/administration/database-encryption.md b/docs/sources/administration/database-encryption.md new file mode 100644 index 00000000000..e441aa1bb63 --- /dev/null +++ b/docs/sources/administration/database-encryption.md @@ -0,0 +1,17 @@ ++++ +title = "Database encryption" +description = "Grafana database encryption" +keywords = ["grafana", "database", "encryption", "documentation"] +aliases = [""] +weight = 450 ++++ + +# Grafana database encryption + +Grafana’s database contains secrets, which are used to query data sources, send alert notifications and perform other functions within Grafana. + +Grafana encrypts these secrets before they are written to the database, by using a symmetric-key encryption algorithm called Advanced Encryption Standard (AES), and using a [secret key]({{< relref "../administration/configuration/#secret_key" >}}) that you can change when you configure a new Grafana instance. + +You can choose to use [envelope encryption]({{< relref "./envelope-encryption.md" >}}), which complements a [KMS integration]({{< relref "../enterprise/kms-integration/_index.md" >}}) in Grafana Enterprise by adding a layer of indirection to the encryption process. + +In Grafana Enterprise, you can also choose to [encrypt secrets in AES-GCM mode]({{< relref "../administration/database-encryption-enterprise.md" >}}) instead of AES-CFB. diff --git a/docs/sources/administration/envelope-encryption.md b/docs/sources/administration/envelope-encryption.md new file mode 100644 index 00000000000..db8887b51bb --- /dev/null +++ b/docs/sources/administration/envelope-encryption.md @@ -0,0 +1,21 @@ ++++ +title = "Envelope encryption" +description = "Envelope encryption" +keywords = ["grafana", "envelope encryption", "documentation"] +aliases = [""] +weight = 430 ++++ + +# Envelope encryption + +In Grafana, you can choose to use envelope encryption. Instead of +encrypting all secrets with a single key, Grafana uses a set of keys +called data encryption keys (DEKs) to encrypt them. These data +encryption keys are themselves encrypted with a single key encryption +key (KEK). + +To turn on envelope encryption, add the term `envelopeEncryption` to the list of feature toggles in your [Grafana configuration]({{< relref "../administration/configuration/#feature_toggles" >}}). + +> **Note:** Avoid turning off envelope encryption once you have turned it on, and back up your database before turning it on for the first time. If you turn envelope encryption on, create new secrets or update your existing secrets (for example, by creating a new data source or alert notification channel), and then turn envelope encryption off, then those data sources, alert notification channels, and other resources using envelope encryption will stop working and you will experience errors. This is because the secrets encrypted with envelope encryption cannot be decrypted or used by Grafana when envelope encryption is turned off. + +Refer to [Database encryption]({{< relref "../administration/database-encryption.md" >}}) to learn more about how Grafana encrypts secrets in the database. diff --git a/docs/sources/administration/provisioning.md b/docs/sources/administration/provisioning.md index 81243822598..92838238730 100644 --- a/docs/sources/administration/provisioning.md +++ b/docs/sources/administration/provisioning.md @@ -141,51 +141,54 @@ Please refer to each datasource documentation for specific provisioning examples Since not all datasources have the same configuration settings we only have the most common ones as fields. The rest should be stored as a json blob in the `jsonData` field. Here are the most common settings that the core datasources use. -| Name | Type | Datasource | Description | -| ----------------------- | ------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | -| tlsAuth | boolean | _All_ | Enable TLS authentication using client cert configured in secure json data | -| tlsAuthWithCACert | boolean | _All_ | Enable TLS authentication using CA cert | -| tlsSkipVerify | boolean | _All_ | Controls whether a client verifies the server's certificate chain and host name. | -| serverName | string | _All_ | Optional. Controls the server name used for certificate common name/subject alternative name verification. Defaults to using the data source URL. | -| timeout | string | _All_ | Request timeout in seconds. Overrides dataproxy.timeout option | -| graphiteVersion | string | Graphite | Graphite version | -| timeInterval | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source. | -| httpMode | string | Influxdb | HTTP Method. 'GET', 'POST', defaults to GET | -| maxSeries | number | Influxdb | Max number of series/tables that Grafana processes | -| httpMethod | string | Prometheus | HTTP Method. 'GET', 'POST', defaults to POST | -| customQueryParameters | string | Prometheus | Query parameters to add, as a URL-encoded string. | -| manageAlerts | boolean | Prometheus and Loki | Manage alerts via Alerting UI | -| esVersion | string | Elasticsearch | Elasticsearch version (E.g. `7.0.0`, `7.6.1`) | -| timeField | string | Elasticsearch | Which field that should be used as timestamp | -| interval | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' | -| logMessageField | string | Elasticsearch | Which field should be used as the log message | -| logLevelField | string | Elasticsearch | Which field should be used to indicate the priority of the log message | -| sigV4Auth | boolean | Elasticsearch and Prometheus | Enable usage of SigV4 | -| sigV4AuthType | string | Elasticsearch and Prometheus | SigV4 auth provider. default/credentials/keys | -| sigV4ExternalId | string | Elasticsearch and Prometheus | Optional SigV4 External ID | -| sigV4AssumeRoleArn | string | Elasticsearch and Prometheus | Optional SigV4 ARN role to assume | -| sigV4Region | string | Elasticsearch and Prometheus | SigV4 AWS region | -| sigV4Profile | string | Elasticsearch and Prometheus | Optional SigV4 credentials profile | -| authType | string | Cloudwatch | Auth provider. default/credentials/keys | -| externalId | string | Cloudwatch | Optional External ID | -| assumeRoleArn | string | Cloudwatch | Optional ARN role to assume | -| defaultRegion | string | Cloudwatch | Optional default AWS region | -| customMetricsNamespaces | string | Cloudwatch | Namespaces of Custom Metrics | -| profile | string | Cloudwatch | Optional credentials profile | -| tsdbVersion | string | OpenTSDB | Version | -| tsdbResolution | string | OpenTSDB | Resolution | -| sslmode | string | PostgreSQL | SSLmode. 'disable', 'require', 'verify-ca' or 'verify-full' | -| tlsConfigurationMethod | string | PostgreSQL | SSL Certificate configuration, either by 'file-path' or 'file-content' | -| sslRootCertFile | string | PostgreSQL | SSL server root certificate file, must be readable by the Grafana user | -| sslCertFile | string | PostgreSQL | SSL client certificate file, must be readable by the Grafana user | -| sslKeyFile | string | PostgreSQL | SSL client key file, must be readable by _only_ the Grafana user | -| encrypt | string | MSSQL | Connection SSL encryption handling. 'disable', 'false' or 'true' | -| postgresVersion | number | PostgreSQL | Postgres version as a number (903/904/905/906/1000) meaning v9.3, v9.4, ..., v10 | -| timescaledb | boolean | PostgreSQL | Enable usage of TimescaleDB extension | -| maxOpenConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of open connections to the database (Grafana v5.4+) | -| maxIdleConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of connections in the idle connection pool (Grafana v5.4+) | -| connMaxLifetime | number | MySQL, PostgreSQL and MSSQL | Maximum amount of time in seconds a connection may be reused (Grafana v5.4+) | -| keepCookies | array | _All_ | Cookies that needs to be passed along while communicating with datasources | +> **Note:** Datasources tagged with _HTTP\*_ below denotes any data source which communicates using the HTTP protocol, e.g. all core data source plugins except MySQL, PostgreSQL and MSSQL. + +| Name | Type | Datasource | Description | +| -------------------------- | ------- | ---------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| tlsAuth | boolean | _HTTP\*_, MySQL | Enable TLS authentication using client cert configured in secure json data | +| tlsAuthWithCACert | boolean | _HTTP\*_, MySQL, PostgreSQL | Enable TLS authentication using CA cert | +| tlsSkipVerify | boolean | _HTTP\*_, MySQL, PostgreSQL | Controls whether a client verifies the server's certificate chain and host name. | +| serverName | string | _HTTP\*_ | Optional. Controls the server name used for certificate common name/subject alternative name verification. Defaults to using the data source URL. | +| timeout | string | _HTTP\*_ | Request timeout in seconds. Overrides dataproxy.timeout option | +| graphiteVersion | string | Graphite | Graphite version | +| timeInterval | string | Prometheus, Elasticsearch, InfluxDB, MySQL, PostgreSQL and MSSQL | Lowest interval/step value that should be used for this data source. | +| httpMode | string | Influxdb | HTTP Method. 'GET', 'POST', defaults to GET | +| maxSeries | number | Influxdb | Max number of series/tables that Grafana processes | +| httpMethod | string | Prometheus | HTTP Method. 'GET', 'POST', defaults to POST | +| customQueryParameters | string | Prometheus | Query parameters to add, as a URL-encoded string. | +| manageAlerts | boolean | Prometheus and Loki | Manage alerts via Alerting UI | +| esVersion | string | Elasticsearch | Elasticsearch version (E.g. `7.0.0`, `7.6.1`) | +| timeField | string | Elasticsearch | Which field that should be used as timestamp | +| interval | string | Elasticsearch | Index date time format. nil(No Pattern), 'Hourly', 'Daily', 'Weekly', 'Monthly' or 'Yearly' | +| logMessageField | string | Elasticsearch | Which field should be used as the log message | +| logLevelField | string | Elasticsearch | Which field should be used to indicate the priority of the log message | +| maxConcurrentShardRequests | number | Elasticsearch | Maximum number of concurrent shard requests that each sub-search request executes per node. Defaults to 5 if esVersion is greater than or equals 7.0.0. When the esVersion is less than 7.0.0 and greater than or equals 5.6.0, then the default value is 256. Option is ignored when esVersion is less than 5.6.0. | +| sigV4Auth | boolean | Elasticsearch and Prometheus | Enable usage of SigV4 | +| sigV4AuthType | string | Elasticsearch and Prometheus | SigV4 auth provider. default/credentials/keys | +| sigV4ExternalId | string | Elasticsearch and Prometheus | Optional SigV4 External ID | +| sigV4AssumeRoleArn | string | Elasticsearch and Prometheus | Optional SigV4 ARN role to assume | +| sigV4Region | string | Elasticsearch and Prometheus | SigV4 AWS region | +| sigV4Profile | string | Elasticsearch and Prometheus | Optional SigV4 credentials profile | +| authType | string | Cloudwatch | Auth provider. default/credentials/keys | +| externalId | string | Cloudwatch | Optional External ID | +| assumeRoleArn | string | Cloudwatch | Optional ARN role to assume | +| defaultRegion | string | Cloudwatch | Optional default AWS region | +| customMetricsNamespaces | string | Cloudwatch | Namespaces of Custom Metrics | +| profile | string | Cloudwatch | Optional credentials profile | +| tsdbVersion | string | OpenTSDB | Version | +| tsdbResolution | string | OpenTSDB | Resolution | +| sslmode | string | PostgreSQL | SSLmode. 'disable', 'require', 'verify-ca' or 'verify-full' | +| tlsConfigurationMethod | string | PostgreSQL | SSL Certificate configuration, either by 'file-path' or 'file-content' | +| sslRootCertFile | string | PostgreSQL | SSL server root certificate file, must be readable by the Grafana user | +| sslCertFile | string | PostgreSQL | SSL client certificate file, must be readable by the Grafana user | +| sslKeyFile | string | PostgreSQL | SSL client key file, must be readable by _only_ the Grafana user | +| encrypt | string | MSSQL | Connection SSL encryption handling. 'disable', 'false' or 'true' | +| postgresVersion | number | PostgreSQL | Postgres version as a number (903/904/905/906/1000) meaning v9.3, v9.4, ..., v10 | +| timescaledb | boolean | PostgreSQL | Enable usage of TimescaleDB extension | +| maxOpenConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of open connections to the database (Grafana v5.4+) | +| maxIdleConns | number | MySQL, PostgreSQL and MSSQL | Maximum number of connections in the idle connection pool (Grafana v5.4+) | +| connMaxLifetime | number | MySQL, PostgreSQL and MSSQL | Maximum amount of time in seconds a connection may be reused (Grafana v5.4+) | +| keepCookies | array | _HTTP\*_ | Cookies that needs to be passed along while communicating with datasources | #### Secure Json Data @@ -193,17 +196,19 @@ Since not all datasources have the same configuration settings we only have the Secure json data is a map of settings that will be encrypted with [secret key]({{< relref "configuration.md#secret-key" >}}) from the Grafana config. The purpose of this is only to hide content from the users of the application. This should be used for storing TLS Cert and password that Grafana will append to the request on the server side. All of these settings are optional. -| Name | Type | Datasource | Description | -| ----------------- | ------ | ---------------------------- | -------------------------------------------------------- | -| tlsCACert | string | _All_ | CA cert for out going requests | -| tlsClientCert | string | _All_ | TLS Client cert for outgoing requests | -| tlsClientKey | string | _All_ | TLS Client key for outgoing requests | -| password | string | _All_ | password | -| basicAuthPassword | string | _All_ | password for basic authentication | -| accessKey | string | Cloudwatch | Access key for connecting to Cloudwatch | -| secretKey | string | Cloudwatch | Secret key for connecting to Cloudwatch | -| sigV4AccessKey | string | Elasticsearch and Prometheus | SigV4 access key. Required when using keys auth provider | -| sigV4SecretKey | string | Elasticsearch and Prometheus | SigV4 secret key. Required when using keys auth provider | +> **Note:** Datasources tagged with _HTTP\*_ below denotes any data source which communicates using the HTTP protocol, e.g. all core data source plugins except MySQL, PostgreSQL and MSSQL. + +| Name | Type | Datasource | Description | +| ----------------- | ------ | ---------------------------------- | -------------------------------------------------------- | +| tlsCACert | string | _HTTP\*_, MySQL, PostgreSQL | CA cert for out going requests | +| tlsClientCert | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client cert for outgoing requests | +| tlsClientKey | string | _HTTP\*_, MySQL, PostgreSQL | TLS Client key for outgoing requests | +| password | string | _HTTP\*_, MySQL, PostgreSQL, MSSQL | password | +| basicAuthPassword | string | _HTTP\*_ | password for basic authentication | +| accessKey | string | Cloudwatch | Access key for connecting to Cloudwatch | +| secretKey | string | Cloudwatch | Secret key for connecting to Cloudwatch | +| sigV4AccessKey | string | Elasticsearch and Prometheus | SigV4 access key. Required when using keys auth provider | +| sigV4SecretKey | string | Elasticsearch and Prometheus | SigV4 secret key. Required when using keys auth provider | #### Custom HTTP headers for datasources @@ -446,11 +451,12 @@ The following sections detail the supported settings and secure settings for eac #### Alert notification `discord` -| Name | Secure setting | -| ---------- | -------------- | -| url | yes | -| avatar_url | | -| content | | +| Name | Secure setting | +| -------------------- | -------------- | +| url | yes | +| avatar_url | | +| content | | +| use_discord_username | | #### Alert notification `slack` diff --git a/docs/sources/administration/set-up-for-high-availability.md b/docs/sources/administration/set-up-for-high-availability.md index 5796ef41a13..818986df7c8 100644 --- a/docs/sources/administration/set-up-for-high-availability.md +++ b/docs/sources/administration/set-up-for-high-availability.md @@ -22,7 +22,15 @@ Grafana will now persist all long term data in the database. How to configure th ## Alerting -Currently alerting supports a limited form of high availability. [Alert notifications]({{< relref "../alerting/old-alerting/notifications.md" >}}) are deduplicated when running multiple servers. This means all alerts are executed on every server but alert notifications are only sent once per alert. Grafana does not support load distribution between servers. +**Grafana 8 alerts** + +Grafana 8 Alerts provides a new highly-available model under the hood. It preserves the previous semantics by executing all alerts on every server and notifications are sent only once per alert. There is no support for load distribution between servers at this time. + +For configuration, [follow the guide]({{< relref "../alerting/unified-alerting/high-availability.md" >}}). + +**Legacy dashboard alerts** + +Legacy Grafana alerting supports a limited form of high availability. [Alert notifications]({{< relref "../alerting/old-alerting/notifications.md" >}}) are deduplicated when running multiple servers. This means all alerts are executed on every server but alert notifications are only sent once per alert. Grafana does not support load distribution between servers. ## Grafana Live diff --git a/docs/sources/alerting/_index.md b/docs/sources/alerting/_index.md index 51aae41f55b..ac3a4398e98 100644 --- a/docs/sources/alerting/_index.md +++ b/docs/sources/alerting/_index.md @@ -7,25 +7,28 @@ weight = 110 Alerts allow you to learn about problems in your systems moments after they occur. Robust and actionable alerts help you identify and resolve issues quickly, minimizing disruption to your services. -Grafana 8.0 has new and improved alerts that centralize alerting information for Grafana managed alerts as well as alerts from Prometheus-compatible data sources into one user interface and API. +Grafana 8.0 introduced new and improved alerting that centralizes alerting information in a single, searchable view. It allows you to: -> **Note:** Grafana 8 alerts are an [opt-in]({{< relref "./unified-alerting/opt-in.md" >}}) feature. Out of the box, Grafana still supports old [legacy dashboard alerts]({{< relref "./old-alerting/_index.md" >}}). We encourage you to create issues in the Grafana GitHub repository for bugs found while testing Grafana 8 alerts. +- Create and manage Grafana alerts +- Create and manage Cortex and Loki managed alerts +- View alerting information from Prometheus and Alertmanager compatible data sources -Alerts have four main components: +Grafana alerting is enabled by default for new OSS installations. For older installations, it is still an [opt-in]({{< relref "./unified-alerting/opt-in.md" >}}) feature. -- Alerting rule - One or more queries and/or expressions, conditions, evaluation frequencies, and the (optional) duration that a condition must be met before creating an alert. -- Contact point - A channel for sending notifications when the conditions of an alerting rule are met. -- Notification policy - A set of matching and grouping criteria used to determine where, and how frequently, to send notifications. +| Release | Cloud | Enterprise | OSS | +| ----------- | ------------- | ---------- | -------------------------------- | +| Grafana 8.2 | On by default | Opt-in | Opt-in | +| Grafana 8.3 | On by default | Opt-in | On by default for new installs\* | + +> **Note:** New installs include existing installs which do not have any alerts configured. + +Grafana alerting has four key components: + +- Alerting rule - Evaluation criteria that determine whether an alert will fire. It consists of one or more queries and expressions, a condition, the frequency of evaluation, and optionally, the duration over which the condition is met. +- Contact point - Channel for sending notifications when the conditions of an alerting rule are met. +- Notification policy - Set of matching and grouping criteria used to determine where and how frequently to send notifications. - Silences - Date and matching criteria used to silence notifications. -You can create and edit alerting rules for Grafana managed alerts, Cortex alerts, and Loki alerts, as well as see alerting information from Prometheus-compatible data sources, in a single searchable view. For more information on how to create and edit alerts and notifications, refer to [Overview of Grafana 8.0 alerts]({{< relref "../alerting/unified-alerting/_index.md" >}}). +To learn more, see [What's New with Grafana alerting]({{< relref "../alerting/unified-alerting/difference-old-new.md" >}}). -For handling notifications for Grafana managed alerts, we use an embedded alert manager. You can configure its contact points, notification policies, silences, and templates from the new Grafana alerting UI by selecting `Grafana` from the Alertmanager dropdown on the top of the respective tab. - -> **Note:** Currently the configuration of this embedded Alertmanager is shared across organisations. Therefore, users are advised to use the new Grafana 8 Alerts only if they have just one organization. Otherwise all contact points, notification policies, silences, and templates for Grafana managed alerts will be visible by all organizations. - -As part of the new alert changes, we have introduced a new data source, Alertmanager, which includes built-in support for Prometheus Alertmanager. It is presently in alpha and it is not accessible unless alpha plugins are enabled in Grafana settings. For more information, refer to [Alertmanager data source]({{< relref "../datasources/alertmanager.md" >}}). If such a data source is present, then you can view and modify its silences, contact points and notification policies from the Grafana alerting UI by selecting it from the Alertmanager dropdown on the top of the respective tab. - -> **Note:** Out of the box, Grafana still supports old Grafana alerts. They are legacy alerts at this time, and will be deprecated in a future release. For more information, refer to [Legacy Grafana alerts]({{< relref "./old-alerting/_index.md" >}}). - -To learn more about the differences between new alerts and the legacy alerts, refer to [What's New with Grafana 8 Alerts]({{< relref "../alerting/difference-old-new.md" >}}). +For information on how to create and manage Grafana alerts and notifications, refer to [Overview of Grafana alerts]({{< relref "../alerting/unified-alerting/_index.md" >}}) and [Create and manage Grafana alerting rules]({{< relref "./unified-alerting/alerting-rules/_index.md" >}}). diff --git a/docs/sources/alerting/difference-old-new.md b/docs/sources/alerting/difference-old-new.md deleted file mode 100644 index ff4f760cb73..00000000000 --- a/docs/sources/alerting/difference-old-new.md +++ /dev/null @@ -1,26 +0,0 @@ -+++ -title = "What's New with Grafana 8 alerts" -description = "What's New with Grafana 8 Alerts" -keywords = ["grafana", "alerting", "guide"] -weight = 112 -+++ - -# What's New with Grafana 8 alerts - -The alerts released with Grafana 8.0 centralizes alerting information for Grafana managed alerts and alerts from Prometheus-compatible datasources in one UI and API. You can create and edit alerting rules for Grafana managed alerts, Cortex alerts, and Loki alerts as well as see alerting information from prometheus-compatible datasources in a single, searchable view. - -## Multi-dimensional alerting - -Create alerts that will give you system-wide visibility with a single alerting rule. With Grafana 8 alerts, you are able to generate multiple alert instances from a single rule eg. creating a rule to monitor disk usage for multiple mount points on a single host. The evaluation engine is able to return multiple time series from a single query. Each time series is identified by its label set. - -## Create alerts outside of Dashboards - -Grafana legacy alerts were tied to a dashboard. Grafana 8 Alerts allow you to create queries and expressions that can combine data from multiple sources, in unique ways. You are still able to link dashboards and panels to alerting rules, allowing you to quickly troubleshoot the system under observation, by linking a dashboard and/or panel ID to the alerting rule. - -## Create Loki and Cortex alerting rules - -With Grafana 8 Alerts you are able to manage your Loki and Cortex alerting rules using the same UI and API as your Grafana managed alerts. - -## View and search for alerts from Prometheus - -You can now display all of your alerting information in one, searchable UI. Alerts for Prometheus compatible datasources are listed below Grafana managed alerts. Search for labels across multiple datasources to quickly find all of the relevant alerts. diff --git a/docs/sources/alerting/old-alerting/_index.md b/docs/sources/alerting/old-alerting/_index.md index 710cb1169ef..32695e28573 100644 --- a/docs/sources/alerting/old-alerting/_index.md +++ b/docs/sources/alerting/old-alerting/_index.md @@ -5,16 +5,11 @@ weight = 114 # Legacy Grafana alerts -Grafana 8.0 has [new and improved alerts]({{< relref "../unified-alerting/_index.md" >}}). The new alerting system are an opt-in feature that centralizes alerting information for Grafana managed alerts and alerts from Prometheus-compatible data sources in one UI and API. +Grafana alerting is enabled by default for new OSS installations. For older installations, it is still an [opt-in]({{< relref "../unified-alerting/opt-in.md" >}}) feature. -Out of the box, Grafana still supports legacy dashboard alerts. Legacy Grafana alerts consists of two parts: +> **Note**: Legacy dashboard alerts is deprecated and will be removed in a future release. We encourage you to migrate to [Grafana alerting]({{< relref "../unified-alerting/_index.md" >}}) for all existing installations. -Alert rules - When the alert is triggered. Alert rules are defined by one or more conditions that are regularly evaluated by Grafana. -Notification channel - How the alert is delivered. When the conditions of an alert rule are met, the Grafana notifies the channels configured for that alert. - -Currently only the graph panel visualization supports alerts. - -Legacy alerts have two main components: +Legacy dashboard alerts have two main components: - Alert rule - When the alert is triggered. Alert rules are defined by one or more conditions that are regularly evaluated by Grafana. - Notification channel - How the alert is delivered. When the conditions of an alert rule are met, the Grafana notifies the channels configured for that alert. @@ -28,30 +23,4 @@ You can perform the following tasks for alerts: - [Test alert rules and troubleshoot]({{< relref "troubleshoot-alerts.md" >}}) - [Add or edit an alert contact point]({{< relref "notifications.md" >}}) -## Clustering - -Currently alerting supports a limited form of high availability. Since v4.2.0 of Grafana, alert notifications are deduped when running multiple servers. This means all alerts are executed on every server but no duplicate alert notifications are sent due to the deduping logic. Proper load balancing of alerts will be introduced in the future. - -## Alert evaluation - -Grafana managed alerts are evaluated by the Grafana backend. Rule evaluations are scheduled, according to the alert rule configuration, and queries are evaluated by an engine that is part of core Grafana. - -Alert rules can only query backend data sources with alerting enabled: - -- builtin or developed and maintained by grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`, - `Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Data Explorer` -- any community backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json]({{< relref "../../developers/plugins/metadata.md" >}})) - -## Metrics from the alert engine - -The alert engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "../../administration/view-server/internal-metrics.md" >}}). - -| Metric Name | Type | Description | -| ------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- | -| `alerting.alerts` | gauge | How many alerts by state | -| `alerting.request_duration_seconds` | histogram | Histogram of requests to the Alerting API | -| `alerting.active_configurations` | gauge | The number of active, non default alertmanager configurations for grafana managed alerts | -| `alerting.rule_evaluations_total` | counter | The total number of rule evaluations | -| `alerting.rule_evaluation_failures_total` | counter | The total number of rule evaluation failures | -| `alerting.rule_evaluation_duration_seconds` | summary | The duration for a rule to execute | -| `alerting.rule_group_rules` | gauge | The number of rules | +{{< docs/shared "alerts/grafana-managed-alerts.md" >}} diff --git a/docs/sources/alerting/old-alerting/notifications.md b/docs/sources/alerting/old-alerting/notifications.md index 4a1b06d7069..9bcf5bf025e 100644 --- a/docs/sources/alerting/old-alerting/notifications.md +++ b/docs/sources/alerting/old-alerting/notifications.md @@ -227,11 +227,12 @@ In DingTalk PC Client: To set up Discord, you must create a Discord channel webhook. For instructions on how to create the channel, refer to [Intro to Webhooks](https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks). -| Setting | Description | -| --------------- | --------------------------------------------------------------------------------- | -| Webhook URL | Discord webhook URL. | -| Message Content | Mention a group using @ or a user using <@ID> when notifying in a channel. | -| Avatar URL | Optionally, provide a URL to an image to use as the avatar for the bot's message. | +| Setting | Description | +| ------------------------------ | ----------------------------------------------------------------------------------------------------- | +| Webhook URL | Discord webhook URL. | +| Message Content | Mention a group using @ or a user using <@ID> when notifying in a channel. | +| Avatar URL | Optionally, provide a URL to an image to use as the avatar for the bot's message. | +| Use Discord's Webhook Username | Use the username configured in Discord's webhook settings. Otherwise, the username will be 'Grafana.' | Alternately, use the [Slack](#slack) notifier by appending `/slack` to a Discord webhook URL. diff --git a/docs/sources/alerting/unified-alerting/_index.md b/docs/sources/alerting/unified-alerting/_index.md index 20bc47451b2..c5664fd3bbe 100644 --- a/docs/sources/alerting/unified-alerting/_index.md +++ b/docs/sources/alerting/unified-alerting/_index.md @@ -1,62 +1,26 @@ +++ -title = "Grafana 8 Alerts" +title = "Grafana alerts" aliases = ["/docs/grafana/latest/alerting/metrics/"] weight = 113 +++ -# Overview of Grafana 8 alerts +# Overview of Grafana alerting -Grafana 8.0 has a new and improved alerting sub-system that centralizes alerting information for Grafana managed alerts and alerts from Prometheus-compatible data sources into one user interface and API. +Grafana 8.0 has new and improved alerting that centralizes alerting information in a single, searchable view. It is enabled by default for all new OSS instances, and is an [opt-in]({{< relref "./opt-in.md" >}}) feature for older installations that still use legacy dashboard alerting. We encourage you to create issues in the Grafana GitHub repository for bugs found while testing Grafana alerting. See also, [What's New with Grafana alerting]({{< relref "./difference-old-new.md" >}}). -> **Note:** Grafana 8 alerts is an [opt-in]({{< relref "../unified-alerting/opt-in.md" >}}) feature. Out of the box, Grafana still supports old [legacy dashboard alerts]({{< relref "../old-alerting/_index.md" >}}). We encourage you to create issues in the Grafana GitHub repository for bugs found while testing Grafana 8 alerts. +When Grafana alerting is enabled, you can: -Grafana 8 alerts have four main components: - -- Alerting rule - One or more query and/or expression, a condition, the frequency of evaluation, and the (optional) duration that a condition must be met before creating an alert. -- Contact point - A channel for sending notifications when the conditions of an alerting rule are met. -- Notification policy - A set of matching and grouping criteria used to determine where, and how frequently, to send notifications. -- Silences - Date and matching criteria used to silence notifications. - -## Alerting tasks - -You can perform the following tasks for alerts: - -- [Create a Grafana managed alert rule]({{< relref "alerting-rules/create-grafana-managed-rule.md" >}}) -- [Create a Cortex or Loki managed alert rule]({{< relref "alerting-rules/create-cortex-loki-managed-rule.md" >}}) -- [View existing alert rules and their current state]({{< relref "alerting-rules/rule-list.md" >}}) -- [View state and health of alerting rules]({{< relref "alerting-rules/state-and-health.md" >}}) +- [Create Grafana managed alerting rules]({{< relref "alerting-rules/create-grafana-managed-rule.md" >}}) +- [Create Cortex or Loki managed alerting rules]({{< relref "alerting-rules/create-cortex-loki-managed-rule.md" >}}) +- [View existing alerting rules and manage their current state]({{< relref "alerting-rules/rule-list.md" >}}) +- [View the state and health of alerting rules]({{< relref "./fundamentals/state-and-health.md" >}}) - [Add or edit an alert contact point]({{< relref "./contact-points.md" >}}) -- [Add or edit notification policies]({{< relref "./notification-policies.md" >}}) -- [Create and edit silences]({{< relref "./silences.md" >}}) +- [Add or edit notification policies]({{< relref "./notifications/_index.md" >}}) +- [Add or edit silences]({{< relref "./silences.md" >}}) -## Clustering +Before you begin using Grafana alerting, we recommend that you familiarize yourself with some [basic concepts]({{< relref "./fundamentals/_index.md" >}}) of Grafana alerting. -The current alerting system doesn't support high availability. Alert notifications are not deduplicated and load balancing is not supported between instances e.g. silences from one instance will not appear in the other. The Grafana team aims to have this feature by Grafana version 8.1+. +## Limitations -## Alert evaluation - -Grafana managed alerts are evaluated by the Grafana backend. Rule evaluations are scheduled, according to the alert rule configuration, and queries are evaluated by an engine that is part of core Grafana. - -Alerting rules can only query backend data sources with alerting enabled: - -- builtin or developed and maintained by grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`, - `Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Data Explorer` -- any community backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json]({{< relref "../../developers/plugins/metadata.md" >}})) - -## Metrics from the alerting engine - -The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "../../administration/view-server/internal-metrics.md" >}}). See also, [View alert rules and their current state]({{< relref "alerting-rules/rule-list.md" >}}). - -| Metric Name | Type | Description | -| ------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- | -| `grafana_alerting_alerts` | gauge | How many alerts by state | -| `grafana_alerting_request_duration` | histogram | Histogram of requests to the Alerting API | -| `grafana_alerting_active_configurations` | gauge | The number of active, non default Alertmanager configurations for grafana managed alerts | -| `grafana_alerting_rule_evaluations_total` | counter | The total number of rule evaluations | -| `grafana_alerting_rule_evaluation_failures_total` | counter | The total number of rule evaluation failures | -| `grafana_alerting_rule_evaluation_duration` | summary | The duration for a rule to execute | -| `grafana_alerting_rule_group_rules` | gauge | The number of rules | - -## Limitation - -Grafana 8 alerting system can retrieve rules from all available Prometheus, Loki, and Alertmanager data sources. It might not be able to fetch rules from all other supported data sources at this time. +- The Grafana alerting system can retrieve rules from all available Prometheus, Loki, and Alertmanager data sources. It might not be able to fetch rules from other supported data sources. +- We aim to support the latest two minor versions of both Prometheus and Alertmanager. We cannot guarantee that older versions will work. As an example, if the current Prometheus version is `2.31.1`, we support >= `2.29.0`. diff --git a/docs/sources/alerting/unified-alerting/alert-groups.md b/docs/sources/alerting/unified-alerting/alert-groups.md index 3aeca4cc782..8160174c3d1 100644 --- a/docs/sources/alerting/unified-alerting/alert-groups.md +++ b/docs/sources/alerting/unified-alerting/alert-groups.md @@ -5,23 +5,22 @@ keywords = ["grafana", "alerting", "alerts", "groups"] weight = 400 +++ -# View alert groups +# Alert groups -Alert groups shows grouped alerts from an alertmanager instance. Alertmanager will group alerts based on common label values. This prevents duplicate alerts from being fired by grouping common alerts into a single alert group. By default, the alerts are grouped by the label keys for the root policy in [notification policies]({{< relref "./notification-policies.md" >}}). +Alert groups show grouped alerts from an Alertmanager instance. By default, the alerts are grouped by the label keys for the root policy in [notification policies]({{< relref "./notifications/_index.md" >}}). Grouping common alerts into a single alert group prevents duplicate alerts from being fired. -## Show alert groups for an external Alertmanager +## View alert groupings -Grafana alerting UI supports alert groups from external Alertmanager data sources. Once you add an [Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}), a dropdown displays at the top of the page where you can select either `Grafana` or an external Alertmanager as your data source. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **Alert grouping** to open the page listing existing groups. +1. From the **Alertmanager** drop-down, select an external Alertmanager as your data source. By default, the `Grafana` Alertmanager is selected. +1. From **custom group by** drop-down, select a combination of labels to view a grouping other than the default. This is useful for debugging and verifying your grouping of notification policies. -## View different alert groupings - -To view a grouping other than the default use the **custom group by** dropdown to select combinations of labels to group alerts by. This is useful for debugging and verifying your notification policies grouping. - -If an alert does not contain labels specified in the grouping of the route policy or the custom grouping it will be added to a catch all group with a header of `No grouping`. +If an alert does not contain labels specified either in the grouping of the root policy or the custom grouping, then the alert is added to a catch all group with a header of `No grouping`. ## Filter alerts -You can use the following filters to view only alerts that match specific criteria: +You can use the following filters to view alerts that match specific criteria: -- **Filter alerts by label -** Search by alert labels using label selectors in the **Search** input. eg: `environment=production,region=~US|EU,severity!=warning` -- **Filter alerts by state -** In **States** Select which alert states you want to see. All others are hidden. +- **Search by label:** In **Search**, enter an existing label to view alerts matching the label. For example, `environment=production,region=~US|EU,severity!=warning` +- **Filter alerts by state:** In **States**, select from Active, Suppressed, or Unprocessed states to view alerts matching your selected state. All other alerts are hidden. diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/_index.md b/docs/sources/alerting/unified-alerting/alerting-rules/_index.md index 57b3517b5cf..5b45b1700f3 100644 --- a/docs/sources/alerting/unified-alerting/alerting-rules/_index.md +++ b/docs/sources/alerting/unified-alerting/alerting-rules/_index.md @@ -4,13 +4,17 @@ aliases = ["/docs/grafana/latest/alerting/rules/"] weight = 130 +++ -# Create and manage alerting rules +# Create and manage Grafana alerting rules -One or more queries and/or expressions, a condition, the frequency of evaluation, and the (optional) duration that a condition must be met before creating an alert. Alerting rules are how you express the criteria for creating an alert. Queries and expressions select and can operate on the data you wish to alert on. A condition sets the threshold that an alert must meet or exceed to create an alert. The interval specifies how frequently the rule should be evaluated. The duration, when configured, sets a period that a condition must be met or exceeded before an alert is created. Alerting rules also can contain settings for what to do when your query does not return any data, or there is an error attempting to execute the query. +An alerting rule is a set of evaluation criteria that determines whether an alert will fire. The rule consists of one or more queries and expressions, a condition, the frequency of evaluation, and optionally, the duration over which the condition is met. + +While queries and expressions select the data set to evaluate, a condition sets the threshold that an alert must meet or exceed to create an alert. An interval specifies how frequently an alerting rule is evaluated. Duration, when configured, indicates how long a condition must be met. The rules can also define alerting behavior in the absence of data. + +You can: - [Create Cortex or Loki managed alert rule]({{< relref "./create-cortex-loki-managed-rule.md" >}}) - [Create Cortex or Loki managed recording rule]({{< relref "./create-cortex-loki-managed-recording-rule.md" >}}) - [Edit Cortex or Loki rule groups and namespaces]({{< relref "./edit-cortex-loki-namespace-group.md" >}}) - [Create Grafana managed alert rule]({{< relref "./create-grafana-managed-rule.md" >}}) -- [State and Health of alerting rules]({{< relref "./state-and-health.md" >}}) -- [View existing alert rules and their current state]({{< relref "./rule-list.md" >}}) +- [State and health of alerting rules]({{< relref "../fundamentals/state-and-health.md" >}}) +- [Manage alerting rules]({{< relref "./rule-list.md" >}}) diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/alert-annotation-label.md b/docs/sources/alerting/unified-alerting/alerting-rules/alert-annotation-label.md new file mode 100644 index 00000000000..c51c957447c --- /dev/null +++ b/docs/sources/alerting/unified-alerting/alerting-rules/alert-annotation-label.md @@ -0,0 +1,38 @@ ++++ +title = "Annotations and labels for alerting rules" +description = "Annotations and labels for alerting" +keywords = ["grafana", "alerting", "guide", "rules", "create"] +weight = 401 ++++ + +# Annotations and labels for alerting rules + +Annotations and labels are key value pairs associated with alerts originating from the alerting rule, datasource response, and as a result of alerting rule evaluation. They can be used in alert notifications directly or in [templates]({{< relref "../message-templating/" >}}) and [template functions]({{< relref "../message-templating/template-functions" >}}) to create notification contact dynamically. + +## Annotations + +Annotations are key-value pairs that provide additional meta-information about an alert. For example: a description, a summary, and runbook URL. These are displayed in rule and alert details in the UI and can be used in contact point message templates. + +## Labels + +Labels are key-value pairs that contain information about, and are used to uniquely identify an alert. The label set for an alert is generated and added to throughout the alerting evaluation and notification process. + +### How are labels used? + +- The complete set of labels for an alert is what uniquely identifies an alert within Grafana Alerts. +- The Alertmanager uses labels to match alerts for [silences]({{< relref "../silences/" >}}) and [alert groups]({{< relref "../alert-groups/" >}}) in [notification policies]({{< relref "../notification-policies/" >}}). +- The alerting UI displays labels for every alert instance generated by the evaluation of that rule. +- Contact points can access labels to dynamically generate notifications that contain information specific to the alert that is resulting in a notification. +- Labels can be added to an [alerting rule]({{< relref "../alerting-rules/" >}}). These manually configured labels are able to use template functions and reference other labels. Labels added to an alerting rule here take precedence in the event of a collision between labels. + +{{< figure src="/static/img/docs/alerting/unified/rule-edit-details-8-0.png" max-width="550px" caption="Alert details" >}} + +#### Variables available to alerting rule labels and annotations + +The following template variables are available when expanding annotations and labels. + +| Name | Description | +| ------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| $labels | The labels from the query or condition. For example, `{{ $labels.instance }}` and `{{ $labels.job }}`. This is unavailable when the rule uses a [classic condition]({{< relref "./create-grafana-managed-rule/#single-and-multi-dimensional-rule" >}}). | +| $values | The values of all reduce and math expressions that were evaluated for this alert rule. For example, `{{ $values.A }}`, `{{ $values.A.Labels }}` and `{{ $values.A.Value }}` where `A` is the `refID` of the expression. This is unavailable when the rule uses a classic condition | +| $value | The value string of the alert instance. For example, `[ var='A' labels={instance=foo} value=10 ]`. | diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule.md b/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule.md index 0f0380218ba..0b2dc3a6305 100644 --- a/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule.md +++ b/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-recording-rule.md @@ -9,47 +9,32 @@ weight = 400 You can create and manage recording rules for an external Cortex or Loki instance. Recording rules calculate frequently needed expressions or computationally expensive expressions in advance and save the result as a new set of time series. Querying this new time series is faster, especially for dashboards since they query the same expression every time the dashboards refresh. -For both Cortex and Loki data sources to work with Grafana 8.0 alerting, enable the ruler API by configuring their respective services. The `local` rule storage type (default for Loki data source), only supports viewing of rules. If you want to edit rules, then configure one of the other rule storage types. +## Before you begin -When configuring a Grafana Prometheus data source to point to Cortex, use the legacy /api/prom prefix, not /prometheus. Only single-binary mode is currently supported, provide a separate URL for the ruler API. +For Cortex and Loki data sources to work with Grafana 8.0 alerting, enable the ruler API by configuring their respective services. + +**Loki** - The `local` rule storage type, default for the Loki data source, supports only viewing of rules. To edit rules, configure one of the other rule storage types. + +**Cortex** - When configuring a Grafana Prometheus data source to point to Cortex, use the legacy `/api/prom` prefix, not `/prometheus`. Currently, we support only single-binary mode and you cannot provide a separate URL for the ruler API. + +> **Note:** If you do not want to manage alerting rules for a particular Loki or Prometheus data source, go to its settings page and clear the **Manage alerts via Alerting UI** checkbox. ## Add a Cortex or Loki managed recording rule -1. Hover your cursor over the Alerting (bell) icon. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. 1. Click **New alert rule**. -1. Click on the **Alert type** drop down and select **Cortex / Loki managed recording rule**. -1. Enter the recording rule details using instructions in the [Recording rule fields](#recording-rule-fields) section. -1. Click **Save** in the upper right corner to save the rule. - -## Edit a Cortex or Loki managed recording rule - -1. Hover your cursor over the Alerting (bell) icon in the side menu. -1. Expand an existing recording rule in the **Cortex / Loki** section and click **Edit**. -1. Update the recording rule details using instructions in the [Recording rule fields](#recording-rule-fields) section. -1. Click **Save and exit** to save and exit rule editing. - -## Recording rule fields - -This section describes the fields you fill out to create a recording rule. - -### Rule type - -- **Rule name -** Enter a descriptive name. The name will get displayed in the alert rule list. It will also get added as an `alertname` label to every alert instance that is created from this rule. Recording rules names must be valid [metric names](https://prometheus.io/docs/concepts/data_model/#metric-names-and-labels). -- **Rule type -** Select **Cortex / Loki managed recording rule**. -- **Data source -** Select a Prometheus or Loki data source. Only data sources that support Cortex ruler API are available. -- **Namespace -** Select an existing rule namespace or click **Add new** and enter a name to create a new one. Namespaces can contain one or more rule groups and have only organizational purpose. -- **Group -** Select an existing group within the selected namespace or click **Add new** to create a new group. Newly created rules are added to the end of this group. Rules within a group are run sequentially at a regular interval, with the same evaluation time. - -![Rule type section screenshot](/static/img/docs/alerting/unified/rule-edit-cortex-recording-rule-8-2.png 'Rule type section screenshot') - -### Query - -Enter a PromQL or LogQL expression. The result of this expression will get recorded as the value for the new metric. - -![Query section](/static/img/docs/alerting/unified/rule-edit-cortex-recording-rule-query-8-2.png 'Query section screenshot') - -### Details - -You can optionally define labels in the details section. - -![Details section](/static/img/docs/alerting/unified/rule-recording-rule-labels-8-2.png 'Details section screenshot') +1. In Step 1, add the rule name, type, and storage location. + - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule. + - From the **Rule type** drop-down, select **Cortex / Loki managed alert**. + - From the **Select data source** drop-down, select an external Prometheus, an external Loki, or a Grafana Cloud data source. + - From the **Namespace** drop-down, select an existing rule namespace. Otherwise, click **Add new** and enter a name to create a new one. Namespaces can contain one or more rule groups and only have an organizational purpose. + - From the **Group** drop-down, select an existing group within the selected namespace. Otherwise, click **Add new** and enter a name to create a new one. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time. + {{< figure src="/static/img/docs/alerting/unified/rule-edit-cortex-alert-type-8-0.png" max-width="550px" caption="Alert details" >}} +1. In Step 2, add the query to evaluate. + - Enter a PromQL or LogQL expression. The rule fires if the evaluation result has at least one series with a value that is greater than 0. An alert is created for each series. + {{< figure src="/static/img/docs/alerting/unified/rule-edit-cortex-query-8-0.png" max-width="550px" caption="Alert details" >}} +1. In Step 3, add additional metadata associated with the rule. + - Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "./alert-annotation-label.md" >}}). + - Add Runbook URL, panel, dashboard, and alert IDs. + - Add custom labels. +1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page. diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-rule.md b/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-rule.md index caa1fef9626..6af1a5c9c7f 100644 --- a/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-rule.md +++ b/docs/sources/alerting/unified-alerting/alerting-rules/create-cortex-loki-managed-rule.md @@ -7,62 +7,38 @@ weight = 400 # Create a Cortex or Loki managed alerting rule -Grafana allows you manage alerting rules for an external Cortex or Loki instance. +Grafana allows you to create alerting rules for an external Cortex or Loki instance. -In order for both Cortex and Loki data sources to work with Grafana 8.0 alerting, enable the ruler API by configuring their respective services. The`local` rule storage type, default for Loki, only supports viewing of rules. If you want to edit rules, then configure one of the other rule storage types. When configuring a Grafana Prometheus data source to point to Cortex, use the legacy `/api/prom` prefix, not `/prometheus`. Only single-binary mode is currently supported, and it is not possible to provide a separate URL for the ruler API. +## Before you begin -## Add or edit a Cortex or Loki managed alerting rule +For Cortex and Loki data sources to work with Grafana 8.0 alerting, enable the ruler API by configuring their respective services. -1. In the Grafana menu hover your cursor over the Alerting (bell) icon. -1. To create a new alert rule, click **New alert rule**. To edit an existing rule, expand one of the rules in the **Cortex / Loki** section and click **Edit**. -1. Click on the **Rule type** drop down and select **Cortex / Loki managed alert**. -1. Fill out the rest of the fields. Descriptions are listed below in [Alert rule fields](#alert-rule-fields). -1. When you have finished writing your rule, click **Save** in the upper right corner to save the rule, or **Save and exit** to save and exit rule editing. +**Loki** - The `local` rule storage type, default for the Loki data source, supports only viewing of rules. To edit rules, configure one of the other rule storage types. -## Alert rule fields +**Cortex** - When configuring a Grafana Prometheus data source to point to Cortex, use the [legacy `/api/prom` prefix](https://cortexmetrics.io/docs/api/#path-prefixes), not `/prometheus`. The Prometheus data source supports both Cortex and Prometheus, and Grafana expects that both the [Query API](https://cortexmetrics.io/docs/api/#querier--query-frontend) and [Ruler API](https://cortexmetrics.io/docs/api/#ruler) are under the same URL. You cannot provide a separate URL for the Ruler API. -This section describes the fields you fill out to create an alert. +> **Note:** If you do not want to manage alerting rules for a particular Loki or Prometheus data source, go to its settings and clear the **Manage alerts via Alerting UI** checkbox. -### Rule type +## Add a Cortex or Loki managed alerting rule -- **Rule name -** Enter a descriptive name. The name will be displayed in the alert rule list, as well as added as `alertname` label to every alert instance that is created from this rule. -- **Rule type -** Select **Cortex / Loki managed alert**. -- **Data source -** Select a Prometheus or Loki data source. Only Prometheus data sources that support Cortex ruler API will be available. -- **Namespace -** Select an existing rule namespace or click **Add new** and enter a name to create a new one. Namespaces can contain one or more rule groups and have only organizational purpose. -- **Group -** Select an existing group within the selected namespace or click **Add new** and enter a name to create a new one. Newly created rules will be added to the end of the rule group. Rules within a group are run sequentially at a regular interval, with the same evaluation time. - -![Alert type section screenshot](/static/img/docs/alerting/unified/rule-edit-cortex-alert-type-8-0.png 'Alert type section screenshot') - -### Query - -Enter a PromQL or LogQL expression. Rule will fire if evaluation result has at least one series with value > 0. An alert will be created per each such series. - -![Query section](/static/img/docs/alerting/unified/rule-edit-cortex-query-8-0.png 'Query section screenshot') - -### Conditions - -- **For -** For how long the selected condition should violated before an alert enters `Firing` state. When condition threshold is violated for the first time, an alert becomes `Pending`. If the **for** time elapses and the condition is still violated, it becomes `Firing`. Else it reverts back to `Normal`. - -![Conditions section](/static/img/docs/alerting/unified/rule-edit-cortex-conditions-8-0.png 'Conditions section screenshot') - -### Details - -Annotations and labels can be optionally added in the details section. - -#### Annotations - -Annotations are key and value pairs that provide additional meta information about the alert, for example description, summary, runbook URL. They are displayed in rule and alert details in the UI and can be used in contact type message templates. Annotations can also be templated, for example `Instance {{ $labels.instance }} down` will have the evaluated `instance` label value added for every alert this rule produces. - -#### Labels - -Labels are key value pairs that categorize or identify an alert. Labels are used to match alerts in silences or match and groups alerts in notification policies. Labels are also shown in rule or alert details in the UI and can be used in contact type message templates. For example, it is common to add a `severity` label and then configure a separate notification policy for each severity. Or one could add a `team` label and configure team specific notification policies, or silence all alerts for a particular team. - -![Details section](/static/img/docs/alerting/unified/rule-edit-details-8-0.png 'Details section screenshot') - -## Preview alerts - -To evaluate the rule and see what alerts it would produce, click **Preview alerts**. It will display a list of alerts with state and value of for each one. - -## Opt-out a Loki or Prometheus data source - -If you do not want to allow creating rules for a particular Loki or Prometheus data source, go to its settings page and clear the **Manage alerts via Alerting UI** checkbox. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **New alert rule**. +1. In Step 1, add the rule name, type, and storage location. + - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule. + - From the **Rule type** drop-down, select **Cortex / Loki managed alert**. + - From the **Select data source** drop-down, select an external Prometheus, an external Loki, or a Grafana Cloud data source. + - From the **Namespace** drop-down, select an existing rule namespace. Otherwise, click **Add new** and enter a name to create a new one. Namespaces can contain one or more rule groups and only have an organizational purpose. For more information, see [Cortex or Loki rule groups and namespaces]({{< relref "./edit-cortex-loki-namespace-group.md" >}}). + - From the **Group** drop-down, select an existing group within the selected namespace. Otherwise, click **Add new** and enter a name to create a new one. Newly created rules are appended to the end of the group. Rules within a group are run sequentially at a regular interval, with the same evaluation time. + {{< figure src="/static/img/docs/alerting/unified/rule-edit-cortex-alert-type-8-0.png" max-width="550px" caption="Alert details" >}} +1. In Step 2, add the query to evaluate. + - Enter a PromQL or LogQL expression. The rule fires if the evaluation result has at least one series with a value that is greater than 0. An alert is created for each series. + {{< figure src="/static/img/docs/alerting/unified/rule-edit-cortex-query-8-0.png" max-width="550px" caption="Alert details" >}} +1. In Step 3, add conditions. + - In the **For** text box, specify the duration for which the condition must be true before an alert fires. If you specify `5m`, the condition must be true for 5 minutes before the alert fires. + > **Note:** Once a condition is met, the alert goes into the `Pending` state. If the condition remains active for the duration specified, the alert transitions to the `Firing` state, else it reverts to the `Normal` state. +1. In Step 4, add additional metadata associated with the rule. + - Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "./alert-annotation-label.md" >}}). + - Add Runbook URL, panel, dashboard, and alert IDs. + - Add custom labels. +1. To evaluate the rule and see what alerts it would produce, click **Preview alerts**. It will display a list of alerts with state and value of for each one. +1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page. diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/create-grafana-managed-rule.md b/docs/sources/alerting/unified-alerting/alerting-rules/create-grafana-managed-rule.md index 3db8db5ddff..10c8e04a3ce 100644 --- a/docs/sources/alerting/unified-alerting/alerting-rules/create-grafana-managed-rule.md +++ b/docs/sources/alerting/unified-alerting/alerting-rules/create-grafana-managed-rule.md @@ -7,143 +7,70 @@ weight = 400 # Create a Grafana managed alerting rule -Grafana allows you to create alerting rules that query one or more data sources, reduce or transform the results and compare them to each other or to fix thresholds. These rules will be executed and notifications sent by Grafana itself. +Grafana allows you to create alerting rules that query one or more data sources, reduce or transform the results and compare them to each other or to fix thresholds. When these are executed, Grafana sends notifications to the contact point. -## Add or edit a Grafana managed alerting rule +## Add Grafana managed rule -1. In the Grafana menu hover your cursor over the Alerting (bell) icon. -1. To create a new alert rule, click **New alert rule**. To edit an existing rule, expand one of the rules in the **Grafana** section and click **Edit**. -1. Click on the **Alert type** drop down and select **Grafana managed alert**. -1. Fill out the rest of the fields. Descriptions are listed below in [Alert rule fields](#alert-rule-fields). -1. When you have finished writing your rule, click **Save** in the upper right corner to save the rule,, or **Save and exit** to save and exit rule editing. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **New alert rule**. +1. In Step 1, add the rule name, type, and storage location. + - In **Rule name**, add a descriptive name. This name is displayed in the alert rule list. It is also the `alertname` label for every alert instance that is created from this rule. + - From the **Rule type** drop-down, select **Grafana managed alert**. + - From the **Folder** drop-down, select the folder where you want to store the rule. If you do not select a folder, the rule is stored in the General folder. To create a new folder, click the drop-down and enter the new folder name. +1. In Step 2, add queries and expressions to evaluate. + - Keep the default name or hover over and click the edit icon to change the name. + - For queries, select a data source from the drop-down. + - Add one or more [queries]({{< relref "../../../panels/queries.md" >}}) or [expressions]({{< relref "../../../panels/expressions.md" >}}). + - For each expression, select either **Classic condition** to create a single alert rule, or choose from **Math**, **Reduce**, **Resample** options to generate separate alert for each series. For details on these options, see [Single and multi dimensional rule](#single-and-multi-dimensional-rule). + - Click **Run queries** to verify that the query is successful. +1. In Step 3, add conditions. + - From the **Condition** drop-down, select the query or expression to trigger the alert rule. + - For **Evaluate every**, specify the frequency of evaluation. Must be a multiple of 10 seconds. For examples, `1m`, `30s`. + - For **Evaluate for**, specify the duration for which the condition must be true before an alert fires. + > **Note:** Once a condition is breached, the alert goes into the Pending state. If the condition remains breached for the duration specified, the alert transitions to the Firing state, else it reverts back to the Normal state. + - In **Configure no data and error handling**, configure alerting behavior in the absence of data. Use the guidelines in [No data and error handling](#no-data-and-error-handling). + - Click **Preview alerts** to check the result of running the query at this moment. Preview excludes no data and error handling. +1. In Step 4, add additional metadata associated with the rule. + - Add a description and summary to customize alert messages. Use the guidelines in [Annotations and labels for alerting]({{< relref "./alert-annotation-label.md" >}}). + - Add Runbook URL, panel, dashboard, and alert IDs. + - Add custom labels. +1. Click **Save** to save the rule or **Save and exit** to save the rule and go back to the Alerting page. -## Alert rule fields +### Single and multi dimensional rule -This section describes the fields you fill out to create an alert. +For Grafana managed alerts, you can create a rule with a classic condition or you can create a multi-dimensional rule. -### Alert type +**Rule with classic condition** -- **Alert name -** Enter a descriptive name. The name will be displayed in the alert rule list, as well as added as `alertname` label to every alert instance that is created from this rule. -- **Alert type -** Select **Grafana managed alert**. -- **Folder -** Select a folder this alert rule will belong to. To create a new folder, click on the drop down and type in a new folder name. +Use the classic condition expression to create a rule that triggers a single alert when its condition is met. For a query that returns multiple series, Grafana does not track the alert state of each series. As a result, Grafana sends only a single alert even when alert conditions are met for multiple series. -![Alert type section screenshot](/static/img/docs/alerting/unified/rule-edit-grafana-alert-type-8-0.png 'Alert type section screenshot') +**Multi dimensional rule** -### Query +To generate a separate alert for each series, create a multi-dimensional rule. Use `Math`, `Reduce`, or `Resample` expressions to create a multi-dimensional rule. For example: -Add one or more [queries]({{< relref "../../../panels/queries.md" >}}) or [expressions]({{< relref "../../../panels/expressions.md" >}}). You can use classic condition expression to create a rule that will trigger a single alert if it's threshold is met, or use reduce and math expressions to create a multi dimensional alert rule that can trigger multiple alerts, one per matching series in the query result. +- Add a `Reduce` expression for each query to aggregate values in the selected time range into a single value. (Not needed for [rules using numeric data]({{< relref "../fundamentals/evaluate-grafana-alerts.md#alerting-on-numeric-data-1" >}})). +- Add a `Math` expression with the condition for the rule. Not needed in case a query or a reduce expression already returns 0 if rule should not fire, or a positive number if it should fire. Some examples: `$B > 70` if it should fire in case value of B query/expression is more than 70. `$B < $C * 100` in case it should fire if value of B is less than value of C multiplied by 100. If queries being compared have multiple series in their results, series from different queries are matched if they have the same labels or one is a subset of the other. + +![Query section multi dimensional](/static/img/docs/alerting/unified/rule-edit-multi-8-0.png 'Query section multi dimensional screenshot') > **Note:** Grafana does not support alert queries with template variables. More information is available at . #### Rule with classic condition -You can use classic condition expression to create a rule that will trigger a single alert if it's conditions is met. It works about the same way as dashboard alerts in previous versions of Grafana. +For more information, see [expressions documentation]({{< relref "../../../panels/expressions.md" >}}). -1. Add one or more queries -1. Add an expression. Click on **Operation** dropdown and select **Classic condition**. -1. Add one or more conditions. For each condition you can specify operator (`AND` / `OR`), aggregation function, query letter and threshold value. +### No data and error handling -If a query returns multiple series, then the aggregation function and threshold check will be evaluated for each series.It will not track alert state **per series**. This has implications that are detailed in the scenario below. +Configure alerting behavior in the absence of data using information in the following tables. -- Alert condition with query that returns 2 series: **server1** and **server2** -- **server1** series causes the alert rule to fire and switch to state `Firing` -- Notifications are sent out with message: _load peaking (server1)_ -- In a subsequent evaluation of the same alert rule, the **server2** series also causes the alert rule to fire -- No new notifications are sent as the alert rule is already in state `Firing`. +| No Data Option | Description | +| -------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | +| No Data | Create a new alert `DatasourceNoData` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. | +| Alerting | Set alert rule state to `Alerting`. | +| Ok | Set alert rule state to `Normal`. | -So, as you can see from the above scenario Grafana will not send out notifications when other series cause the alert to fire if the rule already is in state `Firing`. If you want to have alert per series, create a multi dimensional alert rule as described in the section below. - -![Query section classic condition](/static/img/docs/alerting/unified/rule-edit-classic-8-0.png 'Query section classic condition screenshot') - -#### Multi dimensional rule - -You can use reduce and math expressions to create a rule that will create an alert per series returned by the query. - -1. Add one or more queries -2. Add a `reduce` expression for each query to aggregate values in the selected time range into a single value. With some data sources this is not needed for [rules using numeric data]({{< relref "../grafana-managed-numeric-rule.md" >}}). -3. Add a `math` expressions with the condition for the rule. Not needed in case a query or a reduce expression already returns 0 if rule should not be firing, or > 0 if it should be firing. Some examples: `$B > 70` if it should fire in case value of B query/expression is more than 70. `$B < $C * 100` in case it should fire if value of B is less than value of C multiplied by 100. If queries being compared have multiple series in their results, series from different queries are matched if they have the same labels or one is a subset of the other. - -See or [expressions documentation]({{< relref "../../../panels/expressions.md" >}}) for in depth explanation of `math` and `reduce` expressions. - -![Query section multi dimensional](/static/img/docs/alerting/unified/rule-edit-multi-8-0.png 'Query section multi dimensional screenshot') - -### Conditions - -- **Condition -** Select the letter of the query or expression whose result will trigger the alert rule. You will likely want to select either a `classic condition` or a `math` expression. -- **Evaluate every -** How often the rule should be evaluated, executing the defined queries and expressions. Must be no less than 10 seconds and a multiple of 10 seconds. Examples: `1m`, `30s` -- **Evaluate for -** For how long the selected condition should violated before an alert enters `Alerting` state. When condition threshold is violated for the first time, an alert becomes `Pending`. If the **for** time elapses and the condition is still violated, it becomes `Alerting`. Else it reverts back to `Normal`. - -#### No Data & Error handling - -Toggle **Configure no data and error handling** switch to configure how the rule should handle cases where evaluation results in error or returns no data. - -| No Data Option | Description | -| -------------- | ----------------------------------------------------------------------------------------------------- | -| No Data | Set alert state to `NoData` and rule state to `Normal` (notifications are not sent on NoData states). | -| Alerting | Set alert rule state to `Alerting`. | -| Ok | Set alert rule state to `Normal`. | - -| Error or timeout option | Description | -| ----------------------- | ---------------------------------- | -| Alerting | Set alert rule state to `Alerting` | -| OK | Set alert rule state to `Normal` | - -![Conditions section](/static/img/docs/alerting/unified/rule-edit-grafana-conditions-8-0.png 'Conditions section screenshot') - -### Details - -Annotations and labels can be optionally added in the details section. - -#### Annotations - -Annotations are key and value pairs that provide additional meta information about the alert, for example description, summary, runbook URL. They are displayed in rule and alert details in the UI and can be used in contact type message templates. Annotations can also be templated, for example `Instance {{ $labels.instance }} down` will have the evaluated `instance` label value added for every alert this rule produces. - -#### Labels - -Labels are key value pairs that categorize or identify an alert. Labels are used to match alerts in silences or match and groups alerts in notification policies. Labels are also shown in rule or alert details in the UI and can be used in contact type message templates. For example, it is common to add a `severity` label and then configure a separate notification policy for each severity. Or one could add a `team` label and configure team specific notification policies, or silence all alerts for a particular team. Labels can also be templated like annotations, for example `{{ $labels.namespace }}/{{ $labels.job }}` will produce a new rule label that will have the evaluated `namespace` and `job` label value added for every alert this rule produces. The rule labels take precedence over the labels produced by the query/condition. - -![Details section](/static/img/docs/alerting/unified/rule-edit-details-8-0.png 'Details section screenshot') - -#### Template variables - -The following template variables are available when expanding annotations and labels. - -| Name | Description | -| ------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| $labels | The labels from the query or condition. For example, `{{ $labels.instance }}` and `{{ $labels.job }}`. This is unavailable when the rule uses a classic condition. | -| $values | The values of all reduce and math expressions that were evaluated for this alert rule. For example, `{{ $values.A }}`, `{{ $values.A.Labels }}` and `{{ $values.A.Value }}` where `A` is the `refID` of the expression. This is unavailable when the rule uses a classic condition. | -| $value | The value string of the alert instance. For example, `[ var='A' labels={instance=foo} value=10 ]`. | - -#### Template functions - -The following template functions are available when expanding annotations and labels. - -| Name | Argument | Return | Description | -| ------------------ | -------------------------- | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------- | -| humanize | number or string | string | Converts a number to a more readable format, using metric prefixes. | -| humanize1024 | number or string | string | Like humanize, but uses 1024 as the base rather than 1000. | -| humanizeDuration | number or string | string | Converts a duration in seconds to a more readable format. | -| humanizePercentage | number or string | string | Converts a ratio value to a fraction of 100. | -| humanizeTimestamp | number or string | string | Converts a Unix timestamp in seconds to a more readable format. | -| title | string | string | strings.Title, capitalises first character of each word. | -| toUpper | string | string | strings.ToUpper, converts all characters to upper case. | -| toLower | string | string | strings.ToLower, converts all characters to lower case. | -| match | pattern, text | boolean | regexp.MatchString Tests for a unanchored regexp match. | -| reReplaceAll | pattern, replacement, text | string | Regexp.ReplaceAllString Regexp substitution, unanchored. | -| graphLink | expr | string | Not supported | -| tableLink | expr | string | Not supported | -| args | []interface{} | map[string]interface{} | Converts a list of objects to a map with keys, for example, arg0, arg1. Use this function to pass multiple arguments to templates. | -| externalURL | nothing | string | Returns a string representing the external URL. | -| pathPrefix | nothing | string | Returns the path of the external URL. | -| tmpl | string, []interface{} | nothing | Not supported. | -| safeHtml | string | string | Not supported. | -| query | query string | []sample | Not supported. | -| first | []sample | sample | Not supported. | -| label | label, sample | string | Not supported. | -| strvalue | []sample | string | Not supported. | -| value | sample | float64 | Not supported. | -| sortByLabel | label, []samples | []sample | Not supported. | - -## Preview alerts - -To evaluate the rule and see what alerts it would produce, click **Preview alerts**. It will display a list of alerts with state and value for each one. +| Error or timeout option | Description | +| ----------------------- | ---------------------------------------------------------------------------------------------------------------------------------------- | +| Alerting | Set alert rule state to `Alerting` | +| OK | Set alert rule state to `Normal` | +| Error | Create a new alert `DatasourceError` with the name and UID of the alert rule, and UID of the datasource that returned no data as labels. | diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/edit-cortex-loki-namespace-group.md b/docs/sources/alerting/unified-alerting/alerting-rules/edit-cortex-loki-namespace-group.md index 5ebcbb21a0e..5c49fd4dbf3 100644 --- a/docs/sources/alerting/unified-alerting/alerting-rules/edit-cortex-loki-namespace-group.md +++ b/docs/sources/alerting/unified-alerting/alerting-rules/edit-cortex-loki-namespace-group.md @@ -1,34 +1,39 @@ +++ -title = "Edit Cortex or Loki rule groups and namespaces" +title = "Cortex or Loki rule groups and namespaces" description = "Edit Cortex or Loki rule groups and namespaces" keywords = ["grafana", "alerting", "guide", "group", "namespace", "cortex", "loki"] -weight = 400 +weight = 405 +++ -# Edit Cortex or Loki rule groups and namespaces +# Cortex or Loki rule groups and namespaces -You can rename Cortex or Loki rule namespaces and groups and edit group evaluation intervals. +A namespace contains one or more groups. The rules within a group are run sequentially at a regular interval. The default interval is one (1) minute. You can rename Cortex or Loki rule namespaces and groups, and edit group evaluation intervals. + +![Group list](/static/img/docs/alerting/unified/rule-list-edit-cortex-loki-icon-8-2.png 'Rule group list screenshot') + +{{< figure src="/static/img/docs/alerting/unified/rule-list-edit-cortex-loki-icon-8-2.png" max-width="550px" caption="Alert details" >}} ## Rename a namespace -A namespace contains one or more groups. To rename a namespace, find a group that belongs to the namespace, then update the namespace. +To rename a namespace: -1. Hover your cursor over the Alerting (bell) icon in the side menu. -1. Locate a group that belongs to the namespace you want to edit and click the edit (pen) icon. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Find a Cortex or Loki managed rule with the group that belongs to the namespace you want to edit. +1. Click the **Edit** (pen) icon. 1. Enter a new name in the **Namespace** field, then click **Save changes**. A new namespace is created and all groups are copied into this namespace from the old one. The old namespace is deleted. -## Rename rule group or change rule group evaluation interval +## Rename rule group or change the rule group evaluation interval The rules within a group are run sequentially at a regular interval, the default interval is one (1) minute. You can modify this interval using the following instructions. -1. Hover your cursor over the Alerting (bell) icon in the side menu. -1. Find the group you want to edit and click the edit (pen) icon. +1. n the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Find a Cortex or Loki managed rule with the group you want to edit. +1. Click **Edit** (pen) icon. 1. Modify the **Rule group** and **Rule group evaluation interval** information as necessary. 1. Click **Save changes**. -If you remaned the group, a new group is created that has all the rules from the old group, and the old group deleted. +When you rename the group, a new group with all the rules from the old group is created. The old group is deleted. -![Group list](/static/img/docs/alerting/unified/rule-list-edit-cortex-loki-icon-8-2.png 'Rule group list screenshot') ![Group edit modal](/static/img/docs/alerting/unified/rule-list-cortex-loki-edit-ns-group-8-2.png 'Rule group edit modal screenshot') diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/rule-list.md b/docs/sources/alerting/unified-alerting/alerting-rules/rule-list.md index 8c74162d28c..b88d31d6252 100644 --- a/docs/sources/alerting/unified-alerting/alerting-rules/rule-list.md +++ b/docs/sources/alerting/unified-alerting/alerting-rules/rule-list.md @@ -1,54 +1,55 @@ +++ -title = "View alert rules" -description = "View alert rules" +title = "Manage alerting rules" +description = "Manage alerting rules" keywords = ["grafana", "alerting", "guide", "rules", "view"] -weight = 400 +weight = 402 +++ -# View alert rules +# Manage alerting rules -To view alerts: +The Alerting page lists existing Grafana 8 alerting rules. By default, rules are grouped by types of data sources. The Grafana section lists all Grafana managed rules. Alerting rules for Prometheus compatible data sources are also listed here. You can view alerting rules for Prometheus compatible data sources but you cannot edit them. -1. In the Grafana menu hover your cursor over the Alerting (bell) icon. -1. Click **Alert Rules**. You can see all configured Grafana alert rules as well as any rules from Loki or Prometheus data sources. - By default, the group view is shown. You can toggle between group or state views by clicking the relevant **View as** buttons in the options area at the top of the page. +The Cortex/Loki rules section lists all rules for external Prometheus or Loki data sources. Cloud alerting rules are also listed in this section. + +- [View alerting rules](#view-alerting-rule) +- [Filter alerting rules](#filter-alerting-rules) +- [Edit or delete an alerting rule](#edit-or-delete-an-alerting-rule) + +## View alerting rules + +To view alerting details: + +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page. By default, the group view displays. +1. In **View as**, toggle between group or state views by clicking the relevant option. See [Group view](#group-view) and [State view](#state-view) for more information. +1. Expand the rule row to view the rule labels, annotations, data sources the rule queries, and a list of alert instances resulting from this rule. + +{{< figure src="/static/img/docs/alerting/unified/rule-details-8-0.png" max-width="650px" caption="Alerting rule details" >}} ### Group view -Group view shows Grafana alert rules grouped by folder and Loki or Prometheus alert rules grouped by `namespace` + `group`. This is the default rule list view, intended for managing rules. You can expand each group to view a list of rules in this group. Each rule can be further expanded to view its details. Action buttons and any alerts spawned by this rule, and each alert can be further expanded to view its details. +Group view shows Grafana alert rules grouped by folder and Loki or Prometheus alert rules grouped by `namespace` + `group`. This is the default rule list view, intended for managing rules. You can expand each group to view a list of rules in this group. Expand a rule further to view its details. You can also expand action buttons and alerts resulting from the rule to view their details. -![Grouped alert rule view](/static/img/docs/alerting/unified/rule-list-group-view-8-0.png 'Screenshot of grouped alert rule view') +{{< figure src="/static/img/docs/alerting/unified/rule-list-group-view-8-0.png" max-width="800px" caption="Alerting grouped view" >}} ### State view -State view shows alert rules grouped by state. Use this view to get an overview of which rules are in what state. Each rule can be expanded to view its details. Action buttons and any alerts spawned by this rule, and each alert can be further expanded to view its details. +State view shows alert rules grouped by state. Use this view to get an overview of which rules are in what state. Each rule can be expanded to view its details. Action buttons and any alerts generated by this rule, and each alert can be further expanded to view its details. -![Alert rule state view](/static/img/docs/alerting/unified/rule-list-state-view-8-0.png 'Screenshot of alert rule state view') +{{< figure src="/static/img/docs/alerting/unified/rule-list-state-view-8-0.png" max-width="800px" caption="Alerting state view" >}} -## Filter alert rules +## Filter alerting rules -You can use the following filters to view only alert rules that match specific criteria: +To filter alerting rules: -- **Filter alerts by label -** Search by alert labels using label selectors in the **Search** input. eg: `environment=production,region=~US|EU,severity!=warning` -- **Filter alerts by state -** In **States** Select which alert states you want to see. All others are hidden. -- **Filter alerts by data source -** Click the **Select data source** and select an alerting data source. Only alert rules that query selected data source will be visible. +- From **Select data sources**, select a data source. You can see alerting rules that query the selected data source. +- In the **Search by label**, enter search criteria using label selectors. For example, `environment=production,region=~US|EU,severity!=warning`. +- From **Filter alerts by state**, select an alerting state you want to see. You can see alerting rules that match the state. Rules matching other states are hidden. -## Rule details - -A rule row shows the rule state, health, and summary annotation if the rule has one. You can expand the rule row to display rule labels, all annotations, data sources this rule queries, and a list of alert instances spawned from this rule. - -![Alert rule details](/static/img/docs/alerting/unified/rule-details-8-0.png 'Screenshot of alert rule details') - -### Edit or delete rule - -Grafana rules can only be edited or deleted by users with Edit permissions for the folder which contains the rule. Prometheus or Loki rules can be edited or deleted by users with Editor or Admin roles. +## Edit or delete an alerting rule +Grafana managed alerting rules can only be edited or deleted by users with Edit permissions for the folder storing the rules. Alerting rules for an external Cortex or Loki instance can be edited or deleted by users with Editor or Admin roles. To edit or delete a rule: -1. Expand this rule to reveal rule controls. -1. Click **Edit** to go to the rule editing form. Make changes following [instructions listed here]({{< relref "./create-grafana-managed-rule.md" >}}). -1. Click **Delete"** to delete a rule. - -## Opt-out a Loki or Prometheus data source - -If you do not want rules to be loaded from a Prometheus or Loki data source, go to its settings page and clear the **Manage alerts via Alerting UI** checkbox. +1. Expand a rule row until you can see the rule controls of **View**, **Edit**, and **Delete**. +1. Click **Edit** to open the create rule page. Make updates following instructions in [Create a Grafana managed alerting rule]({{< relref "./create-grafana-managed-rule.md" >}}) or [Create a Cortex or Loki managed alerting rule]({{< relref "./create-cortex-loki-managed-rule.md" >}}). +1. Click **Delete** to delete a rule. diff --git a/docs/sources/alerting/unified-alerting/alerting-rules/state-and-health.md b/docs/sources/alerting/unified-alerting/alerting-rules/state-and-health.md deleted file mode 100644 index 76ffec61de6..00000000000 --- a/docs/sources/alerting/unified-alerting/alerting-rules/state-and-health.md +++ /dev/null @@ -1,35 +0,0 @@ -+++ -title = "State and Health of alerting rules" -description = "State and Health of alerting rules" -keywords = ["grafana", "alerting", "guide", "state"] -+++ - -# State and Health of alerting rule - -The concepts of state and health for alerting rules help you understand, at a glance, several key status indicators about your alerts. Alert state, alerting rule state, and alerting rule health are related, but they each convey subtly different information. - -## Alerting rule state - -Indicates whether any of the timeseries resulting from evaluation of the alerting rule are in an alerting state. Alerting rule state only requires a single alerting instance to be in a pending or firing state for the alerting rule state to not be normal. - -- Normal: none of the timeseries returned are in an alerting state. -- Pending: at least one of the timeseries returned are in a pending state. -- Firing: at least one of the timeseries returned are in an alerting state. - -## Alert state - -Alert state is an indication of the output of the alerting evaluation engine. - -- Normal: the condition for the alerting rule has evaluated to **false** for every timeseries returned by the evaluation engine. -- Alerting: the condition for the alerting rule has evaluated to **true** for at least one timeseries returned by the evaluation engine and the duration, if set, **has** been met or exceeded. -- Pending: the condition for the alerting rule has evaluated to **true** for at least one timeseries returned by the evaluation engine and the duration, if set, **has not** been met or exceeded. -- NoData: the alerting rule has not returned a timeseries, all values for the timeseries are null, or all values for the timeseries are zero. -- Error: There was an error encountered when attempting to evaluate the alerting rule. - -## Alerting rule health - -Indicates the status of alerting rule evaluation. - -- Ok: the rule is being evaluated, data is being returned, and no errors have been encountered. -- Error: an error was encountered when evaluating the alerting rule. -- NoData: at least one of the timeseries returned during evaluation is in a NoData state. diff --git a/docs/sources/alerting/unified-alerting/contact-points.md b/docs/sources/alerting/unified-alerting/contact-points.md index 3f947acac0b..7f094249283 100644 --- a/docs/sources/alerting/unified-alerting/contact-points.md +++ b/docs/sources/alerting/unified-alerting/contact-points.md @@ -2,65 +2,92 @@ title = "Contact points" description = "Create or edit contact point" keywords = ["grafana", "alerting", "guide", "contact point", "notification channel", "create"] -weight = 400 +weight = 430 +++ # Contact points -Contact points define where to send notifications about alerts that match a particular [notification policy]({{< relref "./notification-policies.md" >}}). A contact point can contain one or more contact point types, eg email, slack, webhook and so on. A notification will dispatched to all contact point types defined on a contact point. [Templating]({{< relref "./message-templating/_index.md" >}}) can be used to customize contact point type message with alert data. Grafana alerting UI can be used to configure both Grafana managed contact points and contact points for an [external Alertmanager if one is configured]({{< relref "../../datasources/alertmanager.md" >}}). +Use contact points to define how your contacts are notified when an alert fires. A contact point can have one or more contact point types, for example, email, slack, webhook, and so on. When an alert fires, a notification is sent to all contact point types listed for a contact point. Optionally, use [message templates]({{< relref "./message-templating/_index.md" >}}) to customize notification messages for the contact point types. -Grafana alerting UI allows you to configure contact points for the Grafana managed alerts (handled by the embedded Alertmanager) as well as contact points for an [external Alertmanager if one is configured]({{< relref "../../datasources/alertmanager.md" >}}), using the Alertmanager dropdown. - -> **Note:** In v8.0 and v8.1, the configuration of the embedded Alertmanager was shared across organisations. Users running one of these versions are advised to use the new Grafana 8 Alerts only if they have one organisation otherwise contact points for the Grafana managed alerts will be visible by all organizations. +You can configure Grafana managed contact points as well as contact points for an [external Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}). For more information, see [Alertmanager]({{< relref "./fundamentals/alertmanager.md" >}}). ## Add a contact point -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. -1. Click **Add contact point**. -1. Enter a **Name** for the contact point -1. Select contact point type and fill out mandatory fields. **Optional settings** can be expanded for more options. -1. If you'd like this contact point to notify via multiple channels, for example both email and slack, click **New contact point type** and fill out additional contact point type details. -1. Click **Save contact point** button at the bottom of the page. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **Contact points** to open the page listing existing contact points. +1. Click **New contact point**. +1. From the **Alertmanager** dropdown, select an Alertmanager. By default, Grafana Alertmanager is selected. +1. In **Name**, enter a descriptive name for the contact point. +1. From **Contact point type**, select a type and fill out mandatory fields. For example, if you choose email, enter the email addresses. Or if you choose Slack, enter the Slack channel(s) and users who should be contacted. +1. Some contact point types, like email or webhook, have optional settings. In **Optional settings**, specify additional settings for the selected contact point type. +1. In Notification settings, optionally select **Disable resolved message** if you do not want to be notified when an alert resolves. +1. To add another contact point type, click **New contact point type** and repeat steps 6 through 8. +1. Click **Save contact point** to save your changes. -## Editing a contact point +## Edit a contact point -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. -1. Find the contact point you want to edit in the contact points table and click the **pen icon** on the right side. -1. Make any changes and click **Save contact point** button at the bottom of the page. +1. In the Alerting page, click **Contact points** to open the page listing existing contact points. +1. Find the contact point to edit, then click **Edit** (pen icon). +1. Make any changes and click **Save contact point**. -## Deleting a contact point +## Test a contact point -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. -1. Find the contact point you want to edit in the contact points table and click the **trash can icon** on the right side. -1. A confirmation dialog will open. Click **Yes, delete**. +For Grafana managed contact points, you can send a test notification which helps verify a contact point is configured correctly. -**Note** You will not be able to delete contact points that are currently used by any notification policy. If you want to delete such contact point, you will have to first go to [notification policies]({{< relref "./notification-policies.md" >}}) and delete the policy or update it to use another contact point. +To send a test notification: + +1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact** points. +1. Find the contact point to test, then click **Edit** (pen icon). You can also create a new contact point if needed. +1. Click **Test** (paper airplane icon) to open the contact point testing modal. +1. Choose whether to send a predefined test notification or choose custom to add your own custom annotations and labels to include in the notification. +1. Click **Send test notification** to fire the alert. + +## Delete a contact point + +1. In the Alerting page, click **Contact points** to open the page listing existing contact points. +1. Find the contact point to delete, then click **Delete** (trash icon). +1. In the confirmation dialog, click **Yes, delete**. + +> **Note:** You cannot delete contact points that are in use by a notification policy. You will have to either delete the [notification policy]({{< relref "./notifications/_index.md" >}}) or update it to use another contact point. + +## Edit Alertmanager global config + +To edit global configuration options for an external Alertmanager, like SMTP server, that is used by default for all email contact types: + +1. In the Alerting page, click **Contact points** to open the page listing existing contact points. +1. From the **Alertmanager** drop-down, select an external Alertmanager data source. +1. Click the **Edit global config** option. +1. Add global configuration settings. +1. Click **Save global config** to save your changes. + +> **Note** This option is available only for external Alertmanagers. You can configure some global options for Grafana contact types, like email settings, via [Grafana configuration]({{< relref "../../administration/configuration.md" >}}). ## List of notifiers supported by Grafana -| Name | Type | -| --------------------------------------------- | ------------------------- | -| [DingDing](#dingdingdingtalk) | `dingding` | -| [Discord](#discord) | `discord` | -| [Email](#email) | `email` | -| [Google Hangouts Chat](#google-hangouts-chat) | `googlechat` | -| [Kafka](#kafka) | `kafka` | -| Line | `line` | -| Microsoft Teams | `teams` | -| [Opsgenie](#opsgenie) | `opsgenie` | -| [Pagerduty](#pagerduty) | `pagerduty` | -| Prometheus Alertmanager | `prometheus-alertmanager` | -| [Pushover](#pushover) | `pushover` | -| Sensu | `sensu` | -| [Sensu Go](#sensu-go) | `sensugo` | -| [Slack](#slack) | `slack` | -| Telegram | `telegram` | -| Threema | `threema` | -| VictorOps | `victorops` | -| [Webhook](#webhook) | `webhook` | -| [Zenduty](#zenduty) | `webhook` | +| Name | Type | Grafana Alertmanager | Other Alertmanagers | +| --------------------------------------------- | ------------------------- | -------------------- | -------------------------------------------------------------------------------------------------------- | +| [DingDing](#dingdingdingtalk) | `dingding` | Supported | N/A | +| [Discord](#discord) | `discord` | Supported | N/A | +| [Email](#email) | `email` | Supported | Supported | +| [Google Hangouts Chat](#google-hangouts-chat) | `googlechat` | Supported | N/A | +| [Kafka](#kafka) | `kafka` | Supported | N/A | +| Line | `line` | Supported | N/A | +| Microsoft Teams | `teams` | Supported | N/A | +| [Opsgenie](#opsgenie) | `opsgenie` | Supported | Supported | +| [Pagerduty](#pagerduty) | `pagerduty` | Supported | Supported | +| Prometheus Alertmanager | `prometheus-alertmanager` | Supported | N/A | +| [Pushover](#pushover) | `pushover` | Supported | Supported | +| Sensu | `sensu` | Supported | N/A | +| [Sensu Go](#sensu-go) | `sensugo` | Supported | N/A | +| [Slack](#slack) | `slack` | Supported | Supported | +| Telegram | `telegram` | Supported | N/A | +| Threema | `threema` | Supported | N/A | +| VictorOps | `victorops` | Supported | Supported | +| [Webhook](#webhook) | `webhook` | Supported | Supported ([different format](https://prometheus.io/docs/alerting/latest/configuration/#webhook_config)) | +| [WeCom](#wecom) | `wecom` | Supported | N/A | +| [Zenduty](#zenduty) | `webhook` | Supported | N/A | -## Webhook +### Webhook Example JSON body: @@ -166,33 +193,18 @@ Example JSON body: | dashboardURL | string | **Will be deprecated soon** | | panelURL | string | **Will be deprecated soon** | -### Breaking changes when updating to unified alerting - -Grafana 8 alerts introduce a new way to manage your alerting rules and alerts in Grafana. -As part of this change, there are some breaking changes that we will explain in details. - -#### Multiple Alerts in one payload - -As we now enable [multi dimensional alerting]({{< relref "../difference-old-new.md#multi-dimensional-alerting" >}}) a payload -consists of an array of alerts. - #### Removed fields related to dashboards Alerts are not coupled to dashboards anymore therefore the fields related to dashboards `dashboardId` and `panelId` have been removed. -## Manage contact points for an external Alertmanager +### WeCom -Grafana alerting UI supports managing external Alertmanager configuration. Once you add an [Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}), a dropdown displays at the top of the page where you can select either `Grafana` or an external Alertmanager as your data source. +WeCom contact points need a Webhook URL. These are obtained by setting up a WeCom robot on the corresponding group chat. To obtain a Webhook URL using the WeCom desktop Client please follow these steps: -{{< figure max-width="40%" src="/static/img/docs/alerting/unified/contact-points-select-am-8-0.gif" caption="Select Alertmanager" >}} +1. Click the "..." in the top right corner of a group chat that you want your alerts to be delivered to +2. Click "Add Group Robot", select "New Robot" and give your robot a name. Click "Add Robot" +3. There should be a Webhook URL in the panel. -### Edit Alertmanager global config - -To edit global configuration options for an alertmanager, like SMTP server that is used by default for all email contact types: - -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. -1. In the dropdown at the top of the page, select an Alertmanager data source. -1. Click **Edit global config** button at the bottom of the page. -1. Fill out the form and click **Save global config**. - -**Note** this is only for external Alertmanagers. Some global options for Grafana contact types, like email settings, can be configured via [Grafana configuration]({{< relref "../../administration/configuration.md" >}}). +| Setting | Description | +| ------- | ------------------ | +| Url | WeCom webhook URL. | diff --git a/docs/sources/alerting/unified-alerting/difference-old-new.md b/docs/sources/alerting/unified-alerting/difference-old-new.md new file mode 100644 index 00000000000..a5875ab4a1c --- /dev/null +++ b/docs/sources/alerting/unified-alerting/difference-old-new.md @@ -0,0 +1,41 @@ ++++ +title = "What's new in Grafana alerting" +description = "What's New with Grafana alerts" +keywords = ["grafana", "alerting", "guide"] +weight = 114 ++++ + +# What's new in Grafana alerting + +Grafana alerting has several enhancements over legacy dashboard alerting. + +## Multi-dimensional alerting + +You can now create alerts that give you system-wide visibility with a single alerting rule. Generate multiple alert instances from a single alert rule. For example, you can create a rule to monitor the disk usage of multiple mount points on a single host. The evaluation engine returns multiple time series from a single query, with each time series identified by its label set. + +## Create alerts outside of Dashboards + +Unlike legacy dashboard alerts, Grafana alerts allow you to create queries and expressions that combine data from multiple sources in unique ways. You can still link dashboards and panels to alerting rules using their ID and quickly troubleshoot the system under observation. + +Since unified alerts are no longer directly tied to panel queries, they do not include images or query values in the notification email. You can use customized notification templates to view query values. + +## Create Loki and Cortex alerting rules + +In Grafana alerting, you can manage Loki and Cortex alerting rules using the same UI and API as your Grafana managed alerts. + +## View and search for alerts from Prometheus compatible data sources + +Alerts for Prometheus compatible data sources are now listed under the Grafana alerts section. You can search for labels across multiple data sources to quickly find relevant alerts. + +## Special alerts for alert state NoData and Error + +Grafana alerting introduced a new concept of the alert states. When evaluation of an alerting rule produces state NoData or Error, Grafana alerting will generate special alerts that will have the following labels: + +- `alertname` with value DatasourceNoData or DatasourceError depending on the state. +- `rulename` name of the alert rule the special alert belongs to. +- `datasource_uid` will have the UID of the data source that caused the state. +- all labels and annotations of the original alert rule + +You can handle these alerts the same way as regular alerts by adding a silence, route to a contact point, and so on. + +> **Note:** If the rule uses many data sources and one or many returns no data, the special alert will be created for each data source that caused the alert state. diff --git a/docs/sources/alerting/unified-alerting/fundamentals/_index.md b/docs/sources/alerting/unified-alerting/fundamentals/_index.md new file mode 100644 index 00000000000..4b1cddeb243 --- /dev/null +++ b/docs/sources/alerting/unified-alerting/fundamentals/_index.md @@ -0,0 +1,13 @@ ++++ +title = "Alerting fundamentals" +aliases = ["/docs/grafana/latest/alerting/metrics/"] +weight = 120 ++++ + +# Alerting fundamentals + +This section covers the fundamental concepts of Grafana 8 alerting. + +- [Alertmanager]({{< relref "./alertmanager.md" >}}) +- [State and health of alerting rules]({{< relref "./state-and-health.md" >}}) +- [Evaluating Grafana managed alerts]({{< relref "./evaluate-grafana-alerts.md" >}}) diff --git a/docs/sources/alerting/unified-alerting/fundamentals/alertmanager.md b/docs/sources/alerting/unified-alerting/fundamentals/alertmanager.md new file mode 100644 index 00000000000..9b6fd56dc7f --- /dev/null +++ b/docs/sources/alerting/unified-alerting/fundamentals/alertmanager.md @@ -0,0 +1,39 @@ ++++ +title = "Alertmanager" +aliases = ["/docs/grafana/latest/alerting/metrics/"] +weight = 116 ++++ + +# Alertmanager + +The Alertmanager helps both group and manage alert rules, adding a layer of orchestration on top of the alerting engines. To learn more, see [Prometheus Alertmanager documentation](https://prometheus.io/docs/alerting/latest/alertmanager/). + +Grafana includes built-in support for Prometheus Alertmanager. By default, notifications for Grafana managed alerts are handled by the embedded Alertmanager that is part of core Grafana. You can configure the Alertmanager's contact points, notification policies, silences, and templates from the alerting UI by selecting the `Grafana` option from the Alertmanager drop-down. + +> **Note:** Before v8.2, the configuration of the embedded Alertmanager was shared across organizations. If you are on an older Grafana version, we recommend that you use Grafana alerts only if you have one organization. Otherwise, your contact points are visible to all organizations. + +Grafana alerting added support for external Alertmanager configuration. When you add an [Alertmanager data source]({{< relref "../../../datasources/alertmanager.md" >}}), the Alertmanager drop-down shows a list of available external Alertmanager data sources. Select a data source to create and manage alerting for standalone Cortex or Loki data sources. + +{{< figure max-width="40%" src="/static/img/docs/alerting/unified/contact-points-select-am-8-0.gif" max-width="250px" caption="Select Alertmanager" >}} + +You can configure one or several external Alertmanagers to receive alerts from Grafana. Once configured, both the embedded Alertmanager **and** any configured external Alertmanagers will receive _all_ alerts. + +You can do the setup in the "Admin" tab within the Grafana v8 Alerts UI. + +### Add a new external Alertmanager + +1. In the Grafana menu, click the Alerting (bell) icon to open the Alerting page listing existing alerts. +2. Click **Admin** and then scroll down to the External Alertmanager section. +3. Click **Add Alertmanager** and a modal opens. +4. Add the URL and the port for the external Alertmanager. You do not need to specify the path suffix, for example, `/api/v(1|2)/alerts`. Grafana automatically adds this. + +The external URL is listed in the table with a pending status. Once Grafana verifies that the Alertmanager is discovered, the status changes to active. No requests are made to the external Alertmanager at this point; the verification signals that alerts are ready to be sent. + +### Edit an external Alertmanager + +1. Click the pen symbol to the right of the Alertmanager row in the table. +2. When the edit modal opens, you can view all the URLs that were added. + +The edited URL will be pending until Grafana verifies it again. + +{{< figure max-width="40%" src="/static/img/docs/alerting/unified/ext-alertmanager-active.png" max-width="650px" caption="External Alertmanagers" >}} diff --git a/docs/sources/alerting/unified-alerting/fundamentals/evaluate-grafana-alerts.md b/docs/sources/alerting/unified-alerting/fundamentals/evaluate-grafana-alerts.md new file mode 100644 index 00000000000..8509319f4d5 --- /dev/null +++ b/docs/sources/alerting/unified-alerting/fundamentals/evaluate-grafana-alerts.md @@ -0,0 +1,95 @@ ++++ +title = "Alerting on numeric data" +aliases = ["/docs/grafana/latest/alerting/metrics/"] +weight = 116 ++++ + +# Alerting on numeric data + +This topic describes how Grafana managed alerts are evaluated by the backend engine as well as how Grafana handles alerting on numeric rather than time series data. + +- [Alert evaluation](#alert-evaluation) +- [Alerting on numeric data](#alerting-on-numeric-data) + +## Alert evaluation + +Grafana managed alerts query the following backend data sources that have alerting enabled: + +- built-in data sources or those developed and maintained by Grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`, + `Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Monitor` +- community developed backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json]({{< relref "../../../developers/plugins/metadata.md" >}})) + +### Metrics from the alerting engine + +The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "../../../administration/view-server/internal-metrics.md" >}}). See also, [View alert rules and their current state]({{< relref "../alerting-rules/rule-list.md" >}}). + +| Metric Name | Type | Description | +| ------------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- | +| `grafana_alerting_alerts` | gauge | How many alerts by state | +| `grafana_alerting_request_duration` | histogram | Histogram of requests to the Alerting API | +| `grafana_alerting_active_configurations` | gauge | The number of active, non default Alertmanager configurations for grafana managed alerts | +| `grafana_alerting_rule_evaluations_total` | counter | The total number of rule evaluations | +| `grafana_alerting_rule_evaluation_failures_total` | counter | The total number of rule evaluation failures | +| `grafana_alerting_rule_evaluation_duration` | summary | The duration for a rule to execute | +| `grafana_alerting_rule_group_rules` | gauge | The number of rules | + +## Alerting on numeric data + +Among certain data sources numeric data that is not time series can be directly alerted on, or passed into Server Side Expressions (SSE). This allows for more processing and resulting efficiency within the data source, and it can also simplify alert rules. +When alerting on numeric data instead of time series data, there is no need to reduce each labeled time series into a single number. Instead labeled numbers are returned to Grafana instead. + +### Tabular Data + +This feature is supported with backend data sources that query tabular data: + +- SQL data sources such as MySQL, Postgres, MSSQL, and Oracle. +- The Azure Kusto based services: Azure Monitor (Logs), Azure Monitor (Azure Resource Graph), and Azure Data Explorer. + +A query with Grafana managed alerts or SSE is considered numeric with these data sources, if: + +- The "Format AS" option is set to "Table" in the data source query. +- The table response returned to Grafana from the query includes only one numeric (e.g. int, double, float) column, and optionally additional string columns. + +If there are string columns then those columns become labels. The name of column becomes the label name, and the value for each row becomes the value of the corresponding label. If multiple rows are returned, then each row should be uniquely identified their labels. + +### Example + +For a MySQL table called "DiskSpace": + +| Time | Host | Disk | PercentFree | +| ----------- | ---- | ---- | ----------- | +| 2021-June-7 | web1 | /etc | 3 | +| 2021-June-7 | web2 | /var | 4 | +| 2021-June-7 | web3 | /var | 8 | +| ... | ... | ... | ... | + +You can query the data filtering on time, but without returning the time series to Grafana. For example, an alert that would trigger per Host, Disk when there is less than 5% free space: + +```sql +SELECT Host, Disk, CASE WHEN PercentFree < 5.0 THEN PercentFree ELSE 0 END FROM ( + SELECT + Host, + Disk, + Avg(PercentFree) + FROM DiskSpace + Group By + Host, + Disk + Where __timeFilter(Time) +``` + +This query returns the following Table response to Grafana: + +| Host | Disk | PercentFree | +| ---- | ---- | ----------- | +| web1 | /etc | 3 | +| web2 | /var | 4 | +| web3 | /var | 0 | + +When this query is used as the **condition** in an alert rule, then the non-zero will be alerting. As a result, three alert instances are produced: + +| Labels | Status | +| --------------------- | -------- | +| {Host=web1,disk=/etc} | Alerting | +| {Host=web2,disk=/var} | Alerting | +| {Host=web3,disk=/var} | Normal | diff --git a/docs/sources/alerting/unified-alerting/fundamentals/state-and-health.md b/docs/sources/alerting/unified-alerting/fundamentals/state-and-health.md new file mode 100644 index 00000000000..be0779aba3e --- /dev/null +++ b/docs/sources/alerting/unified-alerting/fundamentals/state-and-health.md @@ -0,0 +1,30 @@ ++++ +title = "State and health of alerting rules" +description = "State and Health of alerting rules" +keywords = ["grafana", "alerting", "guide", "state"] +aliases = ["/docs/grafana/llatest/alerting/unified-alerting/alerting-rules/state-and-health/"] ++++ + +# State and health of alerting rules + +The state and health of alerting rules help you understand several key status indicators about your alerts. There are three key components: alert state, alerting rule state, and alerting rule health. Although related, each component conveys subtly different information. + +## Alerting rule state + +- **Normal**: None of the time series returned by the evaluation engine is in a Pending or Firing state. +- **Pending**: At least one time series returned by the evaluation engine is Pending. +- **Firing**: At least one time series returned by the evaluation engine is Firing. + +## Alert state + +- **Normal**: Condition for the alerting rule is **false** for every time series returned by the evaluation engine. +- **Alerting**: Condition of the alerting rule is **true** for at least one time series returned by the evaluation engine. The duration for which the condition must be true before an alert fires, if set, is met or has exceeded. +- **Pending**: Condition of the alerting rule is **true** for at least one time series returned by the evaluation engine. The duration for which the condition must be true before an alert fires, if set, **has not** been met. +- **NoData**: the alerting rule has not returned a time series, all values for the time series are null, or all values for the time series are zero. +- **Error**: Error when attempting to evaluate an alerting rule. + +## Alerting rule health + +- **Ok**: No error when evaluating an alerting rule. +- **Error**: Error when evaluating an alerting rule. +- **NoData**: The absence of data in at least one time series returned during a rule evaluation. diff --git a/docs/sources/alerting/unified-alerting/grafana-managed-numeric-rule.md b/docs/sources/alerting/unified-alerting/grafana-managed-numeric-rule.md deleted file mode 100644 index 2b5e4727662..00000000000 --- a/docs/sources/alerting/unified-alerting/grafana-managed-numeric-rule.md +++ /dev/null @@ -1,67 +0,0 @@ -+++ -title = "Grafana managed alert rules for numeric data" -description = "Grafana managed alert rules for numeric data" -keywords = ["grafana", "alerting", "guide", "rules", "create"] -weight = 400 -+++ - -# Alerting on numeric data - -Among certain data sources numeric data that is not time series can be directly alerted on, or passed into Server Side Expressions (SSE). This allows for more processing and resulting efficiency within the data source, and it can also simplify alert rules. -When alerting on numeric data instead of time series data, there is no need to reduce each labeled time series into a single number. Instead labeled numbers are returned to Grafana instead. - -## Tabular Data - -This feature is supported with backend data sources that query tabular data: - -- SQL data sources such as MySQL, Postgres, MSSQL, and Oracle. -- The Azure Kusto based services: Azure Monitor (Logs), Azure Monitor (Azure Resource Graph), and Azure Data Explorer. - -A query with Grafana managed alerts or SSE is considered numeric with these data sources, if: - -- The "Format AS" option is set to "Table" in the data source query. -- The table response returned to Grafana from the query includes only one numeric (e.g. int, double, float) column, and optionally additional string columns. - -If there are string columns then those columns become labels. The name of column becomes the label name, and the value for each row becomes the value of the corresponding label. If multiple rows are returned, then each row should be uniquely identified their labels. - -## Example - -For a MySQL table called "DiskSpace": - -| Time | Host | Disk | PercentFree | -| ----------- | ---- | ---- | ----------- | -| 2021-June-7 | web1 | /etc | 3 | -| 2021-June-7 | web2 | /var | 4 | -| 2021-June-7 | web3 | /var | 8 | -| ... | ... | ... | ... | - -You can query the data filtering on time, but without returning the time series to Grafana. For example, an alert that would trigger per Host, Disk when there is less than 5% free space: - -```sql -SELECT Host, Disk, CASE WHEN PercentFree < 5.0 THEN PercentFree ELSE 0 END FROM ( - SELECT - Host, - Disk, - Avg(PercentFree) - FROM DiskSpace - Group By - Host, - Disk - Where __timeFilter(Time) -``` - -This query returns the following Table response to Grafana: - -| Host | Disk | PercentFree | -| ---- | ---- | ----------- | -| web1 | /etc | 3 | -| web2 | /var | 4 | -| web3 | /var | 0 | - -When this query is used as the **condition** in an alert rule, then the non-zero will be alerting. As a result, three alert instances are produced: - -| Labels | Status | -| --------------------- | -------- | -| {Host=web1,disk=/etc} | Alerting | -| {Host=web2,disk=/var} | Alerting | -| {Host=web3,disk=/var} | Normal | diff --git a/docs/sources/alerting/unified-alerting/high-availability.md b/docs/sources/alerting/unified-alerting/high-availability.md new file mode 100644 index 00000000000..242de6f32fa --- /dev/null +++ b/docs/sources/alerting/unified-alerting/high-availability.md @@ -0,0 +1,62 @@ ++++ +title = " Configure high availability" +description = "High Availability" +keywords = ["grafana", "alerting", "tutorials", "ha", "high availability"] +weight = 450 ++++ + +# High availability + +The Grafana alerting system has two main components: a `Scheduler` and an internal `Alertmanager`. The `Scheduler` is responsible for the evaluation of your [alert rules]({{< relref "./fundamentals/evaluate-grafana-alerts.md" >}}) while the internal Alertmanager takes care of the **routing** and **grouping**. + +When it comes to running Grafana alerting in high availability the operational mode of the scheduler is unaffected such that all alerts continue be evaluated in each Grafana instance. Rather the operational change happens in the Alertmanager which **deduplicates** alert notifications across Grafana instances. + +``` + .─────. + ╱ ╲ ┌────────────────┐ +( User )──────┐ ┌──────────────────────────────────┐ │ │ + `. ,' │ │┌─────────┐ ┌──────────────┐ │ │ ▼ + `───' │ ││Scheduler│──────▶Alertmananager│─┼──┘ ┌──────────────────────┐ + │ ┌───────────┐ ┌─▶│└─────────┘ ▲──────────────┤ │ │ │ + .─────. │ │ Load │ │ │Grafana │ │ │ │ │ + ╱ ╲ │ │ Balancing │ │ └─────────────────┼──────────────┼─┘ │ Integrations │ +( User )──────┼─────▶│ Reverse │──┤ ┌─────────────────┼──────────────┼─┐ │ │ + `. ,' │ │ Proxy │ │ │┌─────────┐ ├──────────────▼ │ │ │ + `───' │ └───────────┘ │ ││Scheduler│──────▶Alertmananager│─┼──┐ └──────────────────────┘ + │ └─▶│└─────────┘ └──────────────┘ │ │ ▲ + .─────. │ │Grafana │ │ │ + ╱ ╲ │ └──────────────────────────────────┘ └────────────────┘ +( User )──────┘ + `. ,' + `───' +``` + +The coordination between Grafana instances happens via [a Gossip protocol](https://en.wikipedia.org/wiki/Gossip_protocol). Alerts are not gossiped between instances. It is expected that each scheduler delivers the same alerts to each Alertmanager. + +The two types of messages that are gossiped between instances are: + +- Notification logs: Who (which instance) notified what (which alert) +- Silences: If an alert should fire or not + +These two states are persisted in the database periodically and when Grafana is gracefully shutdown. + +## Enable high availability + +To enable high availability support you need to add at least 1 Grafana instance to the [`[ha_peer]` configuration option]({{}}) within the `[unified_alerting]` section: + +1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the `[unified_alerting]` section. +2. Set `[ha_peers]` to the number of hosts for each grafana instance in the cluster (using a format of host:port) e.g. `ha_peers=10.0.0.5:9094,10.0.0.6:9094,10.0.0.7:9094` +3. Gossiping of notifications and silences uses both TCP and UDP port 9094. Each Grafana instance will need to be able to accept incoming connections on these ports. +4. Set `[ha_listen_address]` to the instance IP address using a format of host:port (or the [Pod's](https://kubernetes.io/docs/concepts/workloads/pods/) IP in the case of using Kubernetes) by default it is set to listen to all interfaces (`0.0.0.0`). + +## Kubernetes + +If you are using Kubernetes, you can expose the pod IP [through an environment variable](https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/) via the container definition such as: + +```bash +env: +- name: POD_IP + valueFrom: + fieldRef: + fieldPath: status.podIP +``` diff --git a/docs/sources/alerting/unified-alerting/message-templating/_index.md b/docs/sources/alerting/unified-alerting/message-templating/_index.md index add54eb40ff..909b1939a19 100644 --- a/docs/sources/alerting/unified-alerting/message-templating/_index.md +++ b/docs/sources/alerting/unified-alerting/message-templating/_index.md @@ -3,66 +3,90 @@ title = "Message templating" description = "Message templating" aliases = ["/docs/grafana/latest/alerting/message-templating/"] keywords = ["grafana", "alerting", "guide", "contact point", "templating"] -weight = 400 +weight = 440 +++ # Message templating -Notifications sent via [contact points]({{< relref "../contact-points.md" >}}) are built using templates. Grafana comes with default templates which you can customize. Grafana's notification templates are based on the [Go templating system](https://golang.org/pkg/text/template) where some fields are evaluated as text, while others are evaluated as HTML which can affect escaping. Since most of the contact point fields can be templated, you can create reusable templates and them in multiple contact points. See [template data reference]({{< relref "./template-data.md" >}}) to check what variables are available in the templates. The default template is defined in [default_template.go](https://github.com/grafana/grafana/blob/main/pkg/services/ngalert/notifier/channels/default_template.go) which can serve as a useful reference or starting point for custom templates. +Notifications sent via [contact points]({{< relref "../contact-points.md" >}}) are built using messaging templates. Grafana's default templates are based on the [Go templating system](https://golang.org/pkg/text/template) where some fields are evaluated as text, while others are evaluated as HTML (which can affect escaping). The default template, defined in [default_template.go](https://github.com/grafana/grafana/blob/main/pkg/services/ngalert/notifier/channels/default_template.go), is a useful reference for custom templates. -## Using templating in contact point fields +Since most of the contact point fields can be templated, you can create reusable custom templates and use them in multiple contact points. The [template data]({{< relref "./template-data.md" >}}) topic lists variables that are available for templating. The default template is defined in [default_template.go](https://github.com/grafana/grafana/blob/main/pkg/services/ngalert/notifier/channels/default_template.go) which can serve as a useful reference or starting point for custom templates. -This section shows an example of using templating to render a number of firing or resolved alerts in Slack message title, and listing alerts with status and name in the message body: +### Using templates - +The following example shows how to use default templates to render an alert message in Slack. The message title contains a count of alerts that are firing or were resolved. The message body lists the alerts and their status. -## Reusable templates + -You can create named templates and then reuse them in contact point fields or other templates. +The following example shows the use of a custom template within one of the contact point fields. -Grafana alerting UI allows you to configure templates for the Grafana managed alerts (handled by the embedded Alertmanager) as well as templates for an [external Alertmanager if one is configured]({{< relref "../../../datasources/alertmanager.md" >}}), using the Alertmanager dropdown. + -> **Note:** Currently the configuration of the embedded Alertmanager is shared across organisations. Therefore users are advised to use the new Grafana 8 Alerts only if they have one organisation otherwise templates for the Grafana managed alerts will be visible by all organizations +### Create a message template -### Create a template +> **Note:** Before Grafana v8.2, the configuration of the embedded Alertmanager was shared across organisations. Users of Grafana 8.0 and 8.1 are advised to use the new Grafana 8 alerts only if they have one organisation. Otherwise, silences for the Grafana managed alerts will be visible by all organizations. -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. In the Alerting page, click **Contact points** to open the page listing existing contact points. +1. From [Alertmanager]({{< relref "../contact-points.md/#alertmanager" >}}) drop-down, select an external Alertmanager to create and manage templates for the external data source. Otherwise, keep the default option of Grafana. + {{< figure max-width="250px" src="/static/img/docs/alerting/unified/contact-points-select-am-8-0.gif" caption="Select Alertmanager" >}} 1. Click **Add template**. -1. Fill in **Name** and **Content** fields. +1. In **Name**, add a descriptive name. +1. In **Content**, add the content of the template. 1. Click **Save template** button at the bottom of the page. + -**Note** The template name used to reference this template in templating is not the value of the **Name** field, but the parameter to `define` tag in the content. When creating a template you can omit `define` entirely and it will be added automatically with same value as **Name** field. It's recommended to use the same name for `define` and **Name** field to avoid confusion. +The `define` tag in the Content section assigns the template name. This tag is optional, and when omitted, the template name is derived from the **Name** field. When both are specified, it is a best practice to ensure that they are the same. - +### Edit a message template -### Edit a template +1. In the Alerting page, click **Contact points** to open the page listing existing contact points. +1. In the Template table, find the template you want to edit, then click the **Edit** (pen icon). +1. Make your changes, then click **Save template**. -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. -1. Find the template you want to edit in the templates table and click the **pen icon** on the right side. -1. Make any changes and click **Save template** button at the bottom of the page. +### Delete a message template -### Delete a template +1. In the Alerting page, click **Contact points** to open the page listing existing contact points. +1. In the Template table, find the template you want to delete, then click the **Delete** (trash icon). +1. In the confirmation dialog, click **Yes, delete** to delete the template. -1. In the Grafana side bar, hover your cursor over the **Alerting** (bell) icon and then click **Contact points**. -1. Find the template you want to edit in the templates table and click the **trash can icon** on the right side. -1. A confirmation dialog will open. Click **Yes, delete**. +Use caution when deleting a template since Grafana does not prevent you from deleting templates that are in use. -**Note** You are not prevented from deleting templates that are in use somewhere in contact points or other templates. Be careful! +### Nested templates -### Use a template in a contact point field +You can embed templates within other templates. -To use a template: - -Enter `{{ template "templatename" . }}` into a contact point field, where `templatename` is the `define` parameter of a template. - - - -### Template examples - -Here is an example of a template to render a single alert: +For example, you can define a template fragment using the `define` keyword: ``` -{{ define "alert" }} +{{ define "mytemplate" }} + {{ len .Alerts.Firing }} firing. {{ len .Alerts.Resolved }} resolved. +{{ end }} +``` + +You can then embed custom templates within this fragment using the `template` keyword. For example: + +``` +Alert summary: +{{ template "mytemplate" . }} +``` + +You can use any of the following built-in template options to embed custom templates. + +| Name | Notes | +| ----------------------- | ------------------------------------------------------------- | +| `default.title` | Displays high-level status information. | +| `default.message` | Provides a formatted summary of firing and resolved alerts. | +| `teams.default.message` | Similar to `default.messsage`, formatted for Microsoft Teams. | + +### Custom template examples + +Here are a few examples of how to use custom templates. + +Template to render a single alert: + +``` +{{ define "myalert" }} [{{.Status}}] {{ .Labels.alertname }} Labels: @@ -89,20 +113,20 @@ Here is an example of a template to render a single alert: Template to render entire notification message: ``` -{{ define "message" }} +{{ define "mymessage" }} {{ if gt (len .Alerts.Firing) 0 }} {{ len .Alerts.Firing }} firing: - {{ range .Alerts.Firing }} {{ template "alert" .}} {{ end }} + {{ range .Alerts.Firing }} {{ template "myalert" .}} {{ end }} {{ end }} {{ if gt (len .Alerts.Resolved) 0 }} {{ len .Alerts.Resolved }} resolved: - {{ range .Alerts.Resolved }} {{ template "alert" .}} {{ end }} + {{ range .Alerts.Resolved }} {{ template "myalert" .}} {{ end }} {{ end }} {{ end }} ``` -## Manage templates for an external Alertmanager +### HTML in Message Templates -Grafana alerting UI supports managing external Alertmanager configuration. Once you add an [Alertmanager data source]({{< relref "../../../datasources/alertmanager.md" >}}), a dropdown displays at the top of the page, allowing you to select either `Grafana` or an external Alertmanager data source. +HTML in alerting message templates is escaped. We do not support rendering of HTML in the resulting notification. -{{< figure max-width="40%" src="/static/img/docs/alerting/unified/contact-points-select-am-8-0.gif" caption="Select Alertmanager" >}} +Some notifiers support alternative methods of changing the look and feel of the resulting notification. For example, Grafana installs the base template for alerting emails to `/public/emails/ng_alert_notification.html`. You can edit this file to change the appearance of all alerting emails. diff --git a/docs/sources/alerting/unified-alerting/message-templating/template-data.md b/docs/sources/alerting/unified-alerting/message-templating/template-data.md index 22684b221c7..22423f59090 100644 --- a/docs/sources/alerting/unified-alerting/message-templating/template-data.md +++ b/docs/sources/alerting/unified-alerting/message-templating/template-data.md @@ -59,17 +59,3 @@ In addition to direct access of data (labels and annotations) stored as KeyValue | Remove | []string | KeyValue | Returns a copy of the Key/Value map without the given keys. | | Names | | []string | List of label names | | Values | | []string | List of label values | - -## Functions - -Some functions to transform values are also available, along with [default functions provided by Go templating](https://golang.org/pkg/text/template/#hdr-Functions). - -| Name | Arguments | Returns | -| ------------ | ---------------------------- | ------------------------------------------------------------------------------------------------------------ | -| title | string | Capitalizes first character of each word. | -| toUpper | string | Converts all characters to upper case. | -| match | pattern, string | Match a string using RegExp. | -| reReplaceAll | pattern, replacement, string | RegExp substitution, unanchored. | -| join | string, []string | Concatenates the elements of the second argument to create a single string. First argument is the separator. | -| safeHtml | string | Marks string as HTML, not requiring auto-escaping. | -| stringSlice | ...string | Returns passed strings as slice of strings. | diff --git a/docs/sources/alerting/unified-alerting/message-templating/template-functions.md b/docs/sources/alerting/unified-alerting/message-templating/template-functions.md new file mode 100644 index 00000000000..b018418b5fd --- /dev/null +++ b/docs/sources/alerting/unified-alerting/message-templating/template-functions.md @@ -0,0 +1,138 @@ ++++ +title = "Template functions" +keywords = ["grafana", "alerting", "guide", "contact point", "templating"] ++++ + +# Template Functions + +Template functions allow you to process labels and annotations to generate dynamic notifications. + +| Name | Argument type | Return type | Description | +| ----------------------------------------- | ------------------------------------------------------------ | ---------------------- | ------------------------------------------------------------------------------------------------------------------------------------------- | +| [humanize](#humanize) | number or string | string | Converts a number to a more readable format, using metric prefixes. | +| [humanize1024](#humanize1024) | number or string | string | Like humanize, but uses 1024 as the base rather than 1000. | +| [humanizeDuration](#humanizeduration) | number or string | string | Converts a duration in seconds to a more readable format. | +| [humanizePercentage](#humanizepercentage) | number or string | string | Converts a ratio value to a fraction of 100. | +| [humanizeTimestamp](#humanizetimestamp) | number or string | string | Converts a Unix timestamp in seconds to a more readable format. | +| [title](#title) | string | string | strings.Title, capitalises first character of each word. | +| [toUpper](#toupper) | string | string | strings.ToUpper, converts all characters to upper case. | +| [toLower](#tolower) | string | string | strings.ToLower, converts all characters to lower case. | +| [match](#match) | pattern, text | boolean | regexp.MatchString Tests for a unanchored regexp match. | +| [reReplaceAll](#rereplaceall) | pattern, replacement, text | string | Regexp.ReplaceAllString Regexp substitution, unanchored. | +| [graphLink](#graphlink) | string - JSON Object with `"expr"` and `"datasource"` fields | string | Returns the path to graphical view in [Explore](https://grafana.com/docs/grafana/latest/explore/) for the given expression and data source. | +| [tableLink](#tablelink) | string- JSON Object with `"expr"` and `"datasource"` fields | string | Returns the path to tabular view in [Explore](https://grafana.com/docs/grafana/latest/explore/) for the given expression and data source. | +| [args](#args) | []interface{} | map[string]interface{} | Converts a list of objects to a map with keys, for example, arg0, arg1. Use this function to pass multiple arguments to templates. | +| [externalURL](#externalurl) | nothing | string | Returns a string representing the external URL. | +| [pathPrefix](#pathprefix) | nothing | string | Returns the path of the external URL. | + +## Examples + +### humanize + +**Template string** `{ humanize $value }` + +**Input** `1234567.0` + +**Expected** `1.235M` + +### humanize1024 + +**TemplateString** `{ humanize1024 $value } ` + +**Input** `1048576.0` + +**Expected** `1Mi` + +### humanizeDuration + +**TemplateString** `{ humanizeDuration $value }` + +**Input** `899.99` + +**Expected** `14m 59s` + +### humanizePercentage + +**TemplateString** `{ humanizePercentage $value }` + +**Input** `0.1234567` + +**Expected** `12.35%` + +### humanizeTimestamp + +**TemplateString** `{ $value | humanizeTimestamp }` + +**Input** `1435065584.128` + +**Expected** `2015-06-23 13:19:44.128 +0000 UTC` + +### title + +**TemplateString** `{ $value | title }` + +**Input** `aa bb CC` + +**Expected** `Aa Bb Cc` + +### toUpper + +**TemplateString** `{ $value | toUpper }` + +**Input** `aa bb CC` + +**Expected** `AA BB CC` + +### toLower + +**TemplateString** `{ $value | toLower }` + +**Input** `aA bB CC` + +**Expected** `aa bb cc` + +### match + +**TemplateString** `{ match "a+" $labels.instance }` + +**Input** `aa` + +**Expected** `true` + +### reReplaceAll + +**TemplateString** `{{ reReplaceAll "localhost:(.*)" "my.domain:$1" $labels.instance }}` + +**Input** `localhost:3000` + +**Expected** `my.domain:3000` + +### graphLink + +**TemplateString** `{{ graphLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}` + +**Expected** `/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":false,"range":true}]` + +### tableLink + +**TemplateString** `{{ tableLink "{\"expr\": \"up\", \"datasource\": \"gdev-prometheus\"}" }}` + +**Expected** `/explore?left=["now-1h","now","gdev-prometheus",{"datasource":"gdev-prometheus","expr":"up","instant":true,"range":false}]` + +### args + +**TemplateString** `{{define "x"}}{{.arg0}} {{.arg1}}{{end}}{{template "x" (args 1 "2")}}` + +**Expected** `1 2` + +### externalURL + +**TemplateString** `{ externalURL }` + +**Expected** `http://localhost/path/prefix` + +### pathPrefix + +**TemplateString** `{ pathPrefix }` + +**Expected** `/path/prefix` diff --git a/docs/sources/alerting/unified-alerting/notification-policies.md b/docs/sources/alerting/unified-alerting/notification-policies.md deleted file mode 100644 index b84707ac984..00000000000 --- a/docs/sources/alerting/unified-alerting/notification-policies.md +++ /dev/null @@ -1,73 +0,0 @@ -+++ -title = "Notification policies" -description = "Notification policies" -keywords = ["grafana", "alerting", "guide", "notification policies", "routes"] -weight = 400 -+++ - -# Notification policies - -Notification policies determine how alerts are routed to contact points. Policies have a tree structure, where each policy can have one or more child policies. Each policy except for the root policy can also match specific alert labels. Each alert enters policy tree at the root and then traverses each child policy. If `Continue matching subsequent sibling nodes` is not checked, it stops at the first matching node, otherwise, it continues matching it's siblings as well. If an alert does not match any children of a policy, the alert is handled based on the configuration settings of this policy and notified to the contact point configured on this policy. Alert that does not match any specific policy is handled by the root policy. - -Grafana alerting UI allows you to configure notification policies for the Grafana managed alerts (handled by the embedded Alertmanager) as well as notification policies for an [external Alertmanager if one is configured]({{< relref "../../datasources/alertmanager.md" >}}), using the Alertmanager dropdown. - -> **Note:** Currently the configuration of the embedded Alertmanager is shared across organisations. Therefore users are advised to use the new Grafana 8 Alerts only if they have one organisation otherwise notification policies for the Grafana managed alerts will be visible by all organizations. - -## Edit notification policies - -To access notification policy editing page, In the Grafana side bar, hover your cursor over the **Alerting (bell)** icon and then click **Notification policies**. - -### Edit root notification policy - -1. Click **edit** button on the top right of the root policy box. -1. Make changes and click **save** button. - -### Add new specific policy - -To add a top level specific policy, click **New policy** button in the **Specific routing** section, fill in the form and click **Save policy**. - -To add a nested policy to an existing specific policy, expand the parent policy in specific routing table and click **Add nested policy**. fill in the form and click **Save policy**. - -### Edit specific policy - -To edit a specific policy, find it in the specific routing table and click **Edit** button. Make your changes and click **Save policy**. - -### Root policy fields - -- **Default contact point -** The [contact point]({{< relref "./contact-points.md" >}}) to send notifications to that did not match any specific policy. -- **Group by -** Labels to group alerts by. If multiple alerts are matched for this policy, they will be grouped based on these labels and a notification will be sent per group. If the field is empty (default), then all notifications are sent in a single group. Use a special label `...` to group alerts by all labels, which effectively disables grouping. - -Group timing options - -- **Group wait -** - How long to wait to buffer alerts of the same group before sending a notification initially. Default is 30 seconds. -- **Group interval -** - How long to wait before sending an notification when an alert has been added to a group for which there has already been a notification. Default is 5 minutes. -- **Repeat interval -** - How long to wait before re-sending a notification after one has already been sent and no new alerts were added to the group. Default is 4 hours. - -### Specific routing policy fields - -- **Contact point -** The [contact point]({{< relref "./contact-points.md" >}}) to send notification to if alert matched this specific policy but did not match any of it's nested policies, or there were no nested specific policies. -- **Matching labels -** Rules for matching alert labels. See ["How label matching works"](#how-label-matching-works) below for details. -- **Continue matching subsequent sibling nodes -** If not enabled and an alert matches this policy but not any of it's nested policies, matching will stop and a notification will be sent to the contact point defined on this policy. If enabled, notification will be sent but alert will continue matching subsequent siblings of this policy, thus sending more than one notification. Use this if for example you want to send notification to a catch-all contact point as well as to one of more specific contact points handled by subsequent policies. -- **Override grouping** - Toggle if you want to override grouping for this policy. If toggled, you will be able to specify grouping same as for root policy described above. If not toggled, root policy grouping will be used. -- **Override group timings** Toggle if you want to override group timings for this policy. If toggled, you will be able to specify group timings same as for root policy described above. If not toggled, root policy group timings will be used. - -### How label matching works - -A policy will match an alert if alert's labels match all of the "Matching Labels" specified on the policy. - -- The **Label** field is the name of the label to match. It must exactly match the label name. -- The **Value** field matches against the corresponding value for the specified **Label** name. How it matches depends on the **Regex** and **Equal** checkboxes. -- The **Regex** checkbox specifies if the inputted **Value** should be matched against labels as a regular expression. The regular expression is always anchored. If not selected it is an exact string match. -- The **Equal** checkbox specifies if the match should include alert instances that match or do not match. If not checked, the silence includes alert instances _do not_ match. - -## Example setup - -One usage example would be: - -- Create a "default" contact point for most alerts with a non invasive contact point type, like a slack message, and set it on root policy -- Edit root policy grouping to group alerts by `cluster`, `namespace` and `alertname` so you get a notification per alert rule and specific k8s cluster & namespace. -- Create specific route for alerts coming from development cluster with an appropriate contact point -- Create a specific route for alerts with "critical" severity with a more invasive contact point type, like pager duty notification -- Create specific routes for particular teams that handle their own onduty rotations - -![Notification policies screenshot](/static/img/docs/alerting/unified/notification-policies-8-0.png 'Notification policies screenshot') diff --git a/docs/sources/alerting/unified-alerting/notifications/_index.md b/docs/sources/alerting/unified-alerting/notifications/_index.md new file mode 100644 index 00000000000..ba1cbf0b638 --- /dev/null +++ b/docs/sources/alerting/unified-alerting/notifications/_index.md @@ -0,0 +1,94 @@ ++++ +title = "Notification policies" +description = "Notification policies" +keywords = ["grafana", "alerting", "guide", "notification policies", "routes"] +weight = 450 ++++ + +# Notification policies + +Notification policies determine how alerts are routed to contact points. Policies have a tree structure, where each policy can have one or more child policies. Each policy, except for the root policy, can also match specific alert labels. Each alert is evaluated by the root policy and subsequently by each child policy. If you enable the `Continue matching subsequent sibling nodes` option is enabled for a specific policy, then evaluation continues even after one or more matches. A parent policy’s configuration settings and contact point information govern the behavior of an alert that does not match any of the child policies. A root policy governs any alert that does not match a specific policy. + +You can configure Grafana managed notification policies as well as notification policies for an [external Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}). For more information, see [Alertmanager]({{< relref "./fundamentals/alertmanager.md" >}}). + +## Grouping + +{{< figure max-width="40%" src="/static/img/docs/alerting/unified/notification-policies-grouping.png" max-width="650px" caption="Notification policies grouping" >}} + +Grouping is a new and key concept of Grafana alerting that categorizes alert notifications of similar nature into a single funnel. This allows you to properly route alert notifications during larger outages when many parts of a system fail at once causing a high number of alerts to fire simultaneously. + +For example, suppose you have 100 services connected to a database in different environments. These services are differentiated by the label `env=environmentname`. An alert rule is in place to monitor whether your services can reach the database named `alertname=DatabaseUnreachable`. + +When a network partition occurs, half of your services can no longer reach the database. As a result, 50 different alerts (assuming half of your services) are fired. For this situation, you want to receive a single-page notification (as opposed to 50) with a list of the environments that are affected. + +You can configure grouping to be `group_by: [alertname]` (take note that the `env` label is omitted). With this configuration in place, Grafana sends a single compact notification that has all the affected environments for this alert rule. + +> **Note:** Grafana also has a special label named `...` that you can use to group all alerts by all labels (effectively disabling grouping), therefore each alert will go into its own group. It is different from the default of `group_by: null` where **all** alerts go into a single group. + +## Edit root notification policy + +> **Note:** Before Grafana v8.2, the configuration of the embedded Alertmanager was shared across organisations. Users of Grafana 8.0 and 8.1 are advised to use the new Grafana 8 Alerts only if they have one organisation. Otherwise, silences for the Grafana managed alerts will be visible by all organizations. + +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **Notification policies**. +1. From the **Alertmanager** dropdown, select an external Alertmanager. By default, the Grafana Alertmanager is selected. +1. In the Root policy section, click **Edit** (pen icon). +1. In **Default contact point**, update the [contact point]({{< relref "./contact-points.md" >}}) to whom notifications should be sent for rules when alert rules do not match any specific policy. +1. In **Group by**, choose labels to group alerts by. If multiple alerts are matched for this policy, then they are grouped by these labels. A notification is sent per group. If the field is empty (default), then all notifications are sent in a single group. Use a special label `...` to group alerts by all labels (which effectively disables grouping). +1. In **Timing options**, select from the following options: + - **Group wait** Time to wait to buffer alerts of the same group before sending an initial notification. Default is 30 seconds. + - **Group interval** Minimum time interval between two notifications for a group. Default is 5 minutes. + - **Repeat interval** Minimum time interval for re-sending a notification if no new alerts were added to the group. Default is 4 hours. +1. Click **Save** to save your changes. + +## Add new specific policy + +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **Notification policies**. +1. From the **Alertmanager** dropdown, select an Alertmanager. By default, the Grafana Alertmanager is selected. +1. To add a top level specific policy, go to the **Specific routing** section and click **New specific policy**. +1. In **Matching labels** section, add one or more rules for matching alert labels. For more information, see ["How label matching works"](#how-label-matching-works). +1. In **Contact point**, add the [contact point]({{< relref "./contact-points.md" >}}) to send notification to if alert matches only this specific policy and not any of the nested policies. +1. Optionally, enable **Continue matching subsequent sibling nodes** to continue matching nested policies even after the alert matched the parent policy. When this option is enabled, you can get more than one notification. Use it to send notification to a catch-all contact point as well as to one of more specific contact points handled by nested policies. +1. Optionally, enable **Override grouping** to specify the same grouping as the root policy. If this option is not enabled, the root policy grouping is used. +1. Optionally, enable **Override general timings** to override the timing options configured in the group notification policy. +1. Click **Save policy** to save your changes. + +## Add nested policy + +1. Expand the specific policy you want to update. +1. Click **Add nested policy**, then add the details using information in [Add new specific policy](#add-new-specific-policy). +1. Click **Save policy** to save your changes. + +## Edit specific policy + +1. In the Alerting page, click **Notification policies** to open the page listing existing policies. +1. Find the policy you want to edit, then click **Edit** (pen icon). +1. Make any changes using instructions in [Add new specific policy](#add-new-specific-policy). +1. Click **Save policy**. + +## How label matching works + +A policy will match an alert if the alert's labels match all the "Matching Labels" specified on the policy. + +- The **Label** field is the name of the label to match. It must exactly match the label name. +- The **Operator** field is the operator to match against the label value. The available operators are: + + - `=`: Select labels that are exactly equal to the provided string. + - `!=`: Select labels that are not equal to the provided string. + - `=~`: Select labels that regex-match the provided string. + - `!~`: Select labels that do not regex-match the provided string. + +- The **Value** field matches against the corresponding value for the specified **Label** name. How it matches depends on the **Operator** value. + +## Example + +An example of an alert configuration. + +- Create a "default" contact point for slack notifications, and set it on root policy. +- Edit the root policy grouping to group alerts by `cluster`, `namespace` and `severity` so that you get a notification per alert rule and specific kubernetes cluster and namespace. +- Create specific route for alerts coming from the development cluster with an appropriate contact point. +- Create a specific route for alerts with "critical" severity with a more invasive contact point type, like pager duty notification. +- Create specific routes for particular teams that handle their own onduty rotations. + +{{< figure max-width="40%" src="/static/img/docs/alerting/unified/notification-policies-8-0.png" max-width="650px" caption="Notification policies" >}} diff --git a/docs/sources/alerting/unified-alerting/notifications/mute-timings.md b/docs/sources/alerting/unified-alerting/notifications/mute-timings.md new file mode 100644 index 00000000000..a41915e1660 --- /dev/null +++ b/docs/sources/alerting/unified-alerting/notifications/mute-timings.md @@ -0,0 +1,59 @@ ++++ +title = "Mute timings" +description = "Mute timings" +keywords = ["grafana", "alerting", "guide", "mute", "mute timings", "mute time interval"] +weight = 450 ++++ + +# Mute timings + +A mute timing is a recurring interval of time when no new notifications for a policy are generated or sent. are sent for a policy. Use them to prevent alerts from firing a specific and reoccurring period, for example, a regular maintenance period. + +Similar to silences, mute timings do not prevent alert rules from being evaluated, nor do they stop alert instances from being shown in the user interface. They only prevent notifications from being created. + +You can configure Grafana managed mute timings as well as mute timings for an [external Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}). For more information, see [Alertmanager]({{< relref "./fundamentals/alertmanager.md" >}}). + +## Mute timings vs silences + +The following table highlights the key differences between mute timings and silences. + +| Mute timing | Silence | +| -------------------------------------------------- | ---------------------------------------------------------------------------- | +| Uses time interval definitions that can reoccur | Has a fixed start and end time | +| Is created and then added to notification policies | Uses labels to match against an alert to determine whether to silence or not | + +## Create a mute timing + +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. Click **Notification policies**. +1. From the **Alertmanager** dropdown, select an external Alertmanager. By default, the Grafana Alertmanager is selected. +1. At the bottom of the page there will be a section titled **Mute timings**. Click the **Add mute timing** button. +1. You will be redirected to a form to create a [time interval](#time-intervals) to match against for your mute timing. +1. Click **Submit** to create the mute timing. + +## Add mute timing to a notification policy + +1. Identify the notification policy you would like to add the mute timing to and click the **Edit** button for that policy. +1. From the Mute Timings dropdown select the mute timings you would like to add to the route. +1. Click the **Save policy** button to save. + +## Time intervals + +A time interval is a definition for a moment in time. If an alert fires during this interval it will be suppressed. All fields are lists, and at least one list element must be satisfied to match the field. Fields also support ranges using `:` (ex: `monday:thursday`). The fields available for a time interval are: mute timing can contain multiple time intervals. A time interval is a specific duration when alerts are suppressed from firing. The duration typically consists of a specific time range along with days of a week, month, or year. + + All properties for the time interval are lists, and at least one list element must be satisfied to match the field. The fields support ranges using `:` (ex: `monday:thursday`). If you leave a field blank, it will match with any moment of time. + +Supported time interval options are: + +- Time range: The time inclusive of the starting time and exclusive of the end time in UTC. - Days of the week: The day or range of days of the week. Example: `monday:thursday`. - Days of the month: The date 1-31 of a month. Negative values can also be used to represent days that begin at the end of the month. For example: `-1` for the last day of the month. - Months: The months of the year in either numerical or the full calendar month. For example: `1, may:august`. - Years: The year or years for the interval. For example: `2021:2024`. + +If a field is left blank, any moment of time will match the field. For an instant of time to match a complete time interval, all fields must match. A mute timing can contain multiple time intervals. + +If you want to specify an exact duration, specify all the options. For example, if you wanted to create a time interval for the first Monday of the month, for March, June, September, and December, between the hours of 12:00 and 24:00 UTC your time interval specification would be: + +- Time range: + - Start time: `12:00` + - End time: `24:00` +- Days of the week: `monday` +- Months: `3, 6, 9, 12` +- Days of the month: `1:7` diff --git a/docs/sources/alerting/unified-alerting/opt-in.md b/docs/sources/alerting/unified-alerting/opt-in.md index 66af3a95f27..1618d8cdeb6 100644 --- a/docs/sources/alerting/unified-alerting/opt-in.md +++ b/docs/sources/alerting/unified-alerting/opt-in.md @@ -1,58 +1,60 @@ +++ -title = "Opt-in to Grafana 8 Alerts" -description = "Enable Grafana 8 Alerts" -weight = 128 +title = "Opt-in to Grafana alerting" +description = "Enable Grafana alerts" +weight = 115 +++ -# Opt-in to Grafana 8 alerts +# Opt-in to Grafana alerting -This topic describes how to enable Grafana 8 alerts as well as the rules and restrictions that govern the migration of existing dashboard alerts to this new alerting system. You can also [disable Grafana 8 alerts]({{< relref "./opt-in.md#disable-grafana-8-alerts" >}}) if needed. +Grafana alerting is enabled by default for new Cloud and OSS installations. -Before you begin, we recommend that you backup Grafana's database. If you are using PostgreSQL as the backend data source, then the minimum required version is 9.5. +**Note:** If you are an existing Grafana Cloud user and want to explore unified alerting, contact Grafana Support. They will enable unified alerting for your Cloud stack. -## Enable Grafana 8 alerts +For older OSS installations that use legacy dashboard alerts, unified alerting is still an opt-in feature. This topic describes how to opt-in to Grafana alerting if you have an existing Grafana installation and the rules and restrictions that govern the migration of existing dashboard alerts to the new alerting system. You can [disable Grafana alerts]({{< relref "./opt-in.md#disable-grafana-alerts" >}}) and use the legacy dashboard alerting if needed. -To enable Grafana 8 alerts: +Before you begin, we recommend that you backup Grafana's database. If you are using PostgreSQL as the backend database, then the minimum required version is 9.5. -1. Go to your custom configuration file located in $WORKING_DIR/conf/custom.ini. -1. In the [unified alerts]({{< relref "../../administration/configuration.md#unified_alerting" >}}) section, set the `enabled` property to `true`. -1. Next, in the [alerting]({{< relref "../../administration/configuration.md#alerting" >}}) section of the configuration file, update the configuration for the legacy dashboard alerts by setting the `enabled` property to `false`. +## Enable Grafana alerting + +To enable Grafana alerts: + +1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the [unified alerts]({{< relref "../../administration/configuration.md#unified_alerting" >}}) section. +1. Set the `enabled` property to `true`. +1. Next, for [legacy dashboard alerting]({{< relref "../../administration/configuration.md#alerting" >}}), set the `enabled` flag to `false`. 1. Restart Grafana for the configuration changes to take effect. -> **Note:** Before Grafana v8.2, to enable or disable Grafana 8 alerts, users configured the `ngalert` feature toggle. This toggle option is no longer available. +> **Note:** The `ngalert` toggle previously used to enable or disable Grafana alerting is no longer available. -> **Note:** There is no `Keep Last State` option for [`No Data` and `Error handling`]({{< relref "./alerting-rules/create-grafana-managed-rule/#no-data--error-handling" >}}) in Grafana 8 alerts. This option becomes `Alerting` during the legacy rule migration. +Before v8.2, notification logs and silences were stored on a disk. If you did not use persistent disks, you would have lost any configured silences and logs on a restart, resulting in unwanted or duplicate notifications. We no longer require the use of a persistent disk. Instead, the notification logs and silences are stored regularly (every 15 minutes). If you used the file-based approach, Grafana reads the existing file and persists it eventually. -Moreover, before v8.2, notification logs and silences were stored on a disk. If you did not use persistent disks, any configured silences and logs would get lost on a restart, resulting in unwanted or duplicate notifications. +## Migrating legacy alerts to Grafana alerting system -As of Grafana 8.2, we no longer require the use of a persistent disk. Instead, the notification logs and silences are stored regularly (every 15 minutes), and a clean shutdown to the database. If you used the file-based approach, Grafana will read the existing file and persisting it eventually. +When Grafana alerting is enabled or Grafana is upgraded to version 8.3, existing legacy dashboard alerts migrate in a format compatible with the Grafana alerting. In the Alerting page of your Grafana instance, you can view the migrated alerts alongside new alerts. -## Migrating legacy alerts to Grafana 8 alerting system - -When Grafana 8 alerting is enabled, existing legacy dashboard alerts migrate in a format compatible with the Grafana 8 alerting system. In the Alerting page of your Grafana instance, you can view the migrated alerts alongside new alerts. - -Read and write access to legacy dashboard alerts was governed by the dashboard and folder permissions storing them. In Grafana 8, alerts inherit the permissions of the folders they are stored in. During migration, legacy dashboard alert permissions are matched to the new rules permissions as follows: +Read and write access to legacy dashboard alerts and Grafana alerts are governed by the permissions of the folders storing them. During migration, legacy dashboard alert permissions are matched to the new rules permissions as follows: - If alert's dashboard has permissions, it will create a folder named like `Migrated {"dashboardUid": "UID", "panelId": 1, "alertId": 1}` to match permissions of the dashboard (including the inherited permissions from the folder). - If there are no dashboard permissions and the dashboard is under a folder, then the rule is linked to this folder and inherits its permissions. - If there are no dashboard permissions and the dashboard is under the General folder, then the rule is linked to the `General Alerting` folder, and the rule inherits the default permissions. +> **Note:** Since there is no `Keep Last State` option for [`No Data`]({{< relref "./alerting-rules/create-grafana-managed-rule/#no-data--error-handling" >}}) in Grafana alerting, this option becomes `NoData` during the legacy rules migration. Option "Keep Last State" for [`Error handling`]({{< relref "./alerting-rules/create-grafana-managed-rule/#no-data--error-handling" >}}) is migrated to a new option `Error`. To match the behavior of the `Keep Last State`, in both cases, during the migration Grafana automatically creates a [silence]({{< relref "./silences.md" >}}) for each alert rule with a duration of 1 year. + Notification channels are migrated to an Alertmanager configuration with the appropriate routes and receivers. Default notification channels are added as contact points to the default route. Notification channels not associated with any Dashboard alert go to the `autogen-unlinked-channel-recv` route. -Since `Hipchat` and `Sensu` notification channels are no longer supported, legacy alerts associated with these channels are not automatically migrated to Grafana 8 alerting. Assign the legacy alerts to a supported notification channel so that you continue to receive notifications for those alerts. +Since `Hipchat` and `Sensu` notification channels are no longer supported, legacy alerts associated with these channels are not automatically migrated to Grafana alerting. Assign the legacy alerts to a supported notification channel so that you continue to receive notifications for those alerts. Silences (expiring after one year) are created for all paused dashboard alerts. ### Limitation -Grafana 8 alerting system can retrieve rules from all available Prometheus, Loki, and Alertmanager data sources. It might not be able to fetch rules from all other supported data sources at this time. +Grafana alerting system can retrieve rules from all available Prometheus, Loki, and Alertmanager data sources. It might not be able to fetch alerting rules from all other supported data sources at this time. -## Disable Grafana 8 alerts +## Disable Grafana alerts -To disable Grafana 8 alerts and enable legacy dashboard alerts: +To disable Grafana alerts and enable legacy dashboard alerts: -1. Go to your custom configuration file located in $WORKING_DIR/conf/custom.ini. -1. In the [unified alerts]({{< relref "../../administration/configuration.md#unified_alerting" >}}) section, set the `enabled` property to `false`. -1. Next, in the [alerting]({{< relref "../../administration/configuration.md#alerting" >}}) section of the configuration file, update the configuration for the legacy dashboard alerts by setting the `enabled` property to `true`. +1. In your custom configuration file ($WORKING_DIR/conf/custom.ini), go to the [Grafana alerting]({{< relref "../../administration/configuration.md#unified_alerting" >}}) section. +1. Set the `enabled` property to `false`. +1. For [legacy dashboard alerting]({{< relref "../../administration/configuration.md#alerting" >}}), set the `enabled` flag to `true`. 1. Restart Grafana for the configuration changes to take effect. -> **Note:** If you choose to migrate from Grafana 8 alerts to legacy dashboard alerts, you will lose any new alerts that you created in the Grafana 8 alerting system. +> **Note:** Switching from one flavor of alerting to another can result in data loss. This is applicable to the fresh installation as well as upgraded setups. diff --git a/docs/sources/alerting/unified-alerting/silences.md b/docs/sources/alerting/unified-alerting/silences.md index 8686e806064..6804cd6fddc 100644 --- a/docs/sources/alerting/unified-alerting/silences.md +++ b/docs/sources/alerting/unified-alerting/silences.md @@ -1,36 +1,38 @@ +++ -title = "Silence alert notifications" -description = "Silence alert notifications" +title = "Silences" +description = "Silences alert notifications" keywords = ["grafana", "alerting", "silence", "mute"] weight = 400 +++ -# Silence alert notifications +# Silences -Grafana allows to you to prevent notifications from one or more alert rules by creating a silence. This silence lasts for a specified window of time. +Use silences to stop notifications from one or more alerting rules. Silences do not prevent alert rules from being evaluated. Nor do they not stop alerting instances from being shown in the user interface. Silences only stop notifications from getting created. A silence lasts for only a specified window of time. Silences do not prevent alert rules from being evaluated. They also do not stop alert instances being shown in the user interface. Silences only prevent notifications from being created. -Grafana alerting UI allows you to configure silences for the Grafana managed alerts (handled by the embedded Alertmanager) as well as silences for an [external Alertmanager if one is configured]({{< relref "../../datasources/alertmanager.md" >}}), using the Alertmanager dropdown. +You can configure Grafana managed silences as well as silences for an [external Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}). For more information, see [Alertmanager]({{< relref "./fundamentals/alertmanager.md" >}}). -> **Note:** Currently the configuration of the embedded Alertmanager is shared across organisations. Therefore users are advised to use the new Grafana 8 Alerts only if they have one organisation otherwise silences for the Grafana managed alerts will be visible by all organizations. +> **Note:** Before Grafana v8.2, the configuration of the embedded Alertmanager was shared across organisations. Users of Grafana 8.0 and 8.1 are advised to use the new Grafana 8 Alerts only if they have one organisation. Otherwise, silences for the Grafana managed alerts will be visible by all organizations. ## Add a silence To add a silence: -1. In the Grafana menu, hover your cursor over the **Alerting** (bell) icon and then select **Silences** (crossed out bell icon). -1. Click the **New Silence** button. -1. Select the start and end date in **Silence start and end** to indicate when the silence should go into effect and expire. -1. Optionally, update the **Duration** to alter the time for the end of silence in the previous step to correspond to the start plus the duration. -1. Enter one or more _Matching Labels_ by filling out the **Name** and **Value** fields. Matchers determine which rules the silence will apply to. -1. Enter a **Comment**. -1. Enter the name of the owner in **Creator**. +1. In the Grafana menu, click the **Alerting** (bell) icon to open the Alerting page listing existing alerts. +1. In the Alerting page, click **Silences** to open the page listing existing contact points. +1. From [Alertmanager]({{< relref "./contact-points.md/#alertmanager" >}}) drop-down, select an external Alertmanager to create and manage silences for the external data source. Otherwise, keep the default option of Grafana. +1. Click **New Silence** to open the Create silence page. +1. In **Silence start and end**, select the start and end date to indicate when the silence should go into effect and expire. +1. Optionally, in **Duration**, specify how long the silence is enforced. This automatically updates the end time in the **Silence start and end** field. +1. In the **Name** and **Value** fields, enter one or more _Matching Labels_. Matchers determine which rules the silence will apply to. For more information, see [Label matching for alert suppression](#label-matching-for-alert-suppression). +1. In **Comment**, add details about the silence. +1. In **Creator**, enter the name of the silence owner or keep the default owner. 1. Click **Create**. -## How label matching works +### Label matching for alert suppression -Alert instances that have labels that match all of the "Matching Labels" specified in the silence will have their notifications suppressed. +Grafana suppresses notifications only for alerts with labels that match all the "Matching Labels" specified in the silence. - The **Label** field is the name of the label to match. It must exactly match the label name. - The **Operator** field is the operator to match against the label value. The available operators are: @@ -42,16 +44,16 @@ Alert instances that have labels that match all of the "Matching Labels" specifi - The **Value** field matches against the corresponding value for the specified **Label** name. How it matches depends on the **Operator** value. -## Viewing and editing silences +1. In the Alerting page, click **Silences** to view the list of existing silences. +1. Find the silence you want to edit, then click **Edit** (pen icon). +1. Make changes, then click **Submit** to save your changes. -1. In the Grafana menu hover your cursor over the **Alerting** (bell) icon, then select **Silences** (crossed out bell icon). -1. To end the silence, click the **Unsilence** option next to the listed silence. Silences that have ended are still listed and are automatically removed after 5 days. There is no method for manual removal. -1. To edit a silence, click the pencil icon next to the listed silence. Edit the silence using instructions on how to create a silence. -1. Click **Submit** to save your changes. +## Remove silences -## Manage silences for an external Alertmanager +1. In the Alerting page, click **Silences** to view the list of existing silences. +1. Find the silence you want to end, then click **Unsilence**. -Grafana alerting UI supports managing external Alertmanager silences. Once you add an [Alertmanager data source]({{< relref "../../datasources/alertmanager.md" >}}), a dropdown displays at the top of the page where you can select either `Grafana` or an external Alertmanager as your data source. +> **Note:** Silences that have ended are retained and listed for five days. You cannot remove a silence manually. ## Create a URL to silence form with defaults filled in diff --git a/docs/sources/dashboards/playlist.md b/docs/sources/dashboards/playlist.md index 51bea340289..054547f6ea1 100644 --- a/docs/sources/dashboards/playlist.md +++ b/docs/sources/dashboards/playlist.md @@ -51,7 +51,7 @@ You can control a playlist in **Normal** or **TV** mode after it's started, usin | Stop (square) | Ends the playlist, and exits to the current dashboard. | | Cycle view mode (monitor icon) | Rotates the display of the dashboards in different view modes. | | Time range | Displays data within a time range. It can be set to display the last 5 minutes up to 5 years ago, or a custom time range, using the down arrow. | -| Refresh (circle arrow) | Reloads the dashboard, to display the current data. It can be set to reload automatically every 5 seconds to 1 day, using the drop down arrow. | +| Refresh (circle arrow) | Reloads the dashboard, to display the current data. It can be set to reload automatically every 5 seconds to 1 day, using the drop-down arrow. | ## Create a playlist @@ -59,7 +59,7 @@ You can create a playlist to present dashboards in a sequence, with a set order 1. In the playlist page, click **New playlist**. The New playlist page opens. 1. In the **Name** text box, enter a descriptive name. -1. In the **Interval** text bos, enter a time interval. Grafana displays a particular dashboard for the interval of time specified here before moving on to the next dashboard. +1. In the **Interval** text box, enter a time interval. Grafana displays a particular dashboard for the interval of time specified here before moving on to the next dashboard. 1. In Dashboards, add existing dashboards to the playlist using **Add by title** and **Add by tag** drop-down options. The dashboards you add are listed in a sequential order. 1. If needed: - Search for a dashboard by its name, a regular expression, or a tag. diff --git a/docs/sources/dashboards/time-range-controls.md b/docs/sources/dashboards/time-range-controls.md index f0859f053f5..3bc88cf25e0 100644 --- a/docs/sources/dashboards/time-range-controls.md +++ b/docs/sources/dashboards/time-range-controls.md @@ -105,13 +105,15 @@ For more advanced time settings, click the **Dashboard settings** (gear) icon at - **Local browser time -** The time zone configured for the viewing user browser is used. This is usually the same time zone as set on the computer. - Standard [ISO 8601 time zones](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones), including UTC. - **Auto-refresh -** Customize the options displayed for relative time and the auto-refresh options. Entries are comma separated and accept any valid time unit. -- **Now delay now- -** Override the `now` value by entering a time delay. Most commonly, this feature is used to accommodate known delays in data aggregation to avoid null values. +- **Now delay -** Override the `now` time by entering a time delay. Use this option to accommodate known delays in data aggregation to avoid null values. - **Hide time picker -** Select this option if you do not want Grafana to display the time picker. ## Panel time overrides and timeshift In [Query options]({{< relref "../panels/queries.md#query-options" >}}), you can override the relative time range for individual panels, causing them to be different than what is selected in the dashboard time picker in the upper right. This allows you to show metrics from different time periods or days at the same time. +> **Note:** Panel time overrides have no effect when the time range for the dashboard is absolute. + ## Control the time range using a URL Time range of a dashboard can be controlled by providing following query parameters in the dashboard URL: diff --git a/docs/sources/datasources/alertmanager.md b/docs/sources/datasources/alertmanager.md index 76ac065fff9..f3bcc5505c7 100644 --- a/docs/sources/datasources/alertmanager.md +++ b/docs/sources/datasources/alertmanager.md @@ -8,9 +8,11 @@ weight = 150 # Alertmanager data source -Grafana includes built-in support for Prometheus Alertmanager. It is presently in alpha and not accessible unless [alpha plugins are enabled in Grafana settings](https://grafana.com/docs/grafana/latest/administration/configuration/#enable_alpha). Once you add it as a data source, you can use the [Grafana alerting UI](https://grafana.com/docs/grafana/latest/alerting/) to manage silences, contact points as well as notification policies. A drop down option in these pages allows you to switch between Grafana and any configured Alertmanager data sources . +Grafana includes built-in support for Prometheus Alertmanager. It is presently in alpha and not accessible unless [alpha plugins are enabled in Grafana settings](https://grafana.com/docs/grafana/latest/administration/configuration/#enable_alpha). Once you add it as a data source, you can use the [Grafana alerting UI](https://grafana.com/docs/grafana/latest/alerting/) to manage silences, contact points as well as notification policies. A drop-down option in these pages allows you to switch between Grafana and any configured Alertmanager data sources. -> **Note:** Currently, the [Cortex implementation of Prometheus Alertmanager](https://cortexmetrics.io/docs/proposals/scalable-alertmanager/) is required to edit rules. +## Alertmanager implementations + +[Prometheus](https://prometheus.io/) and [Cortex](https://cortexmetrics.io/) (default) implementations of Alertmanager are supported. You can specify implementation in the data source settings page. In case of Prometheus contact points and notification policies are read-only in the Grafana alerting UI, as it does not support updating configuration via HTTP API. ## Provision the Alertmanager data source @@ -26,6 +28,8 @@ datasources: type: alertmanager url: http://localhost:9090 access: proxy + jsonData: + implementation: 'prometheus' # alternatively 'cortex' # optionally basicAuth: true basicAuthUser: my_user diff --git a/docs/sources/datasources/aws-cloudwatch/_index.md b/docs/sources/datasources/aws-cloudwatch/_index.md index 2cb8a0aae70..7311be8cec5 100644 --- a/docs/sources/datasources/aws-cloudwatch/_index.md +++ b/docs/sources/datasources/aws-cloudwatch/_index.md @@ -8,48 +8,23 @@ weight = 200 # AWS CloudWatch data source -Grafana ships with built-in support for CloudWatch. Add it as a data source, then you are ready to build dashboards or use Explore with CloudWatch metrics and CloudWatch Logs. +Grafana ships with built-in support for CloudWatch. This topic describes queries, templates, variables, and other configuration specific to the CloudWatch data source. For instructions on how to add a data source to Grafana, refer to [Add a data source]({{< relref "../add-a-data-source.md" >}}). Only users with the organization admin role can add data sources. -This topic describes queries, templates, variables, and other configuration specific to the CloudWatch data source. For instructions on how to add a data source to Grafana, refer to [Add a data source]({{< relref "../add-a-data-source.md" >}}). Only users with the organization admin role can add data sources. +Once you have added the Cloudwatch data source, you can build dashboards or use Explore with CloudWatch metrics and CloudWatch Logs. -> **Note:** If you are having issues setting up the data source and Grafana is returning undescriptive errors, then check the log file located in /var/log/grafana/grafana.log). +> **Note:** For troubleshooting issues when setting up the Cloudwatch data source, check the `/var/log/grafana/grafana.log` file. -## Cloudwatch settings +## Configure the CloudWatch data source To access data source settings, hover your mouse over the **Configuration** (gear) icon, then click **Data Sources**, and then click the AWS Cloudwatch data source. -| Name | Description | -| -------------------------- | ----------------------------------------------------------------------------------------------------------------------- | -| `Name` | The data source name. This is how you refer to the data source in panels and queries. | -| `Default` | Default data source means that it will be pre-selected for new panels. | -| `Default Region` | Used in query editor to set region (can be changed on per query basis) | -| `Custom Metrics namespace` | Specify the CloudWatch namespace of Custom metrics | -| `Auth Provider` | Specify the provider to get credentials. | -| `Credentials` profile name | Specify the name of the profile to use (if you use `~/.aws/credentials` file), leave blank for default. | -| `Assume Role Arn` | Specify the ARN of the role to assume | -| `External ID` | If you are assuming a role in another account, that has been created with an external ID, specify the external ID here. | - -### X-Ray trace links - -Link an X-Ray data source in the "X-Ray trace link" section of the configuration page to automatically add links in your logs when the log contains `@xrayTraceId` field. - -![Trace link configuration](/static/img/docs/cloudwatch/xray-trace-link-configuration-8-2.png 'Trace link configuration') - -The data source select will contain only existing data source instances of type X-Ray so in order to use this feature you need to have existing X-Ray data source already configured, see [X-Ray docs](https://grafana.com/grafana/plugins/grafana-x-ray-datasource/) for details. - -The X-Ray link will then appear in the log details section which is accessible by clicking on the log row either in Explore or in dashboard [Logs panel]({{< relref "../../visualizations/logs-panel.md" >}}). To log the `@xrayTraceId` in your logs see the [AWS X-Ray documentation](https://docs.amazonaws.cn/en_us/xray/latest/devguide/xray-services.html). To provide the field to Grafana your log queries also have to contain the `@xrayTraceId` field, for example using query `fields @message, @xrayTraceId`. - -![Trace link in log details](/static/img/docs/cloudwatch/xray-link-log-details-8-2.png 'Trace link in log details') - -## Authentication - For authentication options and configuration details, see [AWS authentication]({{< relref "aws-authentication.md" >}}) topic. -## IAM policies +### CloudWatch specific data source configuration -Grafana needs permissions granted via IAM to be able to read CloudWatch metrics -and EC2 tags/instances/regions. You can attach these permissions to IAM roles and -utilize Grafana's built-in support for assuming roles. +#### IAM policies + +Grafana needs permissions granted via IAM to be able to read CloudWatch metrics and EC2 tags/instances/regions/alarms. You can attach these permissions to the IAM role or IAM user configured in the previous step. Here is a minimal policy example: @@ -100,30 +75,57 @@ Here is a minimal policy example: } ``` -## Using the Query Editor +#### Namespaces of Custom Metrics + +Grafana is not able to load custom namespaces through the GetMetricData API. If you still want your custom metrics to show up in the fields in the query editor, you can specify the names of the namespaces containing the custom metrics in the _Namespaces of Custom Metrics_ field. The field accepts a multiple namespaces, separated by a comma. + +#### Timeout + +Timeout specifically, for CloudWatch Logs queries. Log queries don't recognize standard Grafana query timeout as they don't keep a single request open and instead periodically poll for results. Because of limits on concurrently running queries in CloudWatch they can also take a longer time to finish. + +#### X-Ray trace links + +Link an X-Ray data source in the "X-Ray trace link" section of the configuration page to automatically add links in your logs when the log contains `@xrayTraceId` field. + +![Trace link configuration](/static/img/docs/cloudwatch/xray-trace-link-configuration-8-2.png 'Trace link configuration') + +The data source select will contain only existing data source instances of type X-Ray so in order to use this feature you need to have existing X-Ray data source already configured, see [X-Ray docs](https://grafana.com/grafana/plugins/grafana-x-ray-datasource/) for details. + +The X-Ray link will then appear in the log details section which is accessible by clicking on the log row either in Explore or in dashboard [Logs panel]({{< relref "../../visualizations/logs-panel.md" >}}). To log the `@xrayTraceId` in your logs see the [AWS X-Ray documentation](https://docs.amazonaws.cn/en_us/xray/latest/devguide/xray-services.html). To provide the field to Grafana your log queries also have to contain the `@xrayTraceId` field, for example using query `fields @message, @xrayTraceId`. + +![Trace link in log details](/static/img/docs/cloudwatch/xray-link-log-details-8-2.png 'Trace link in log details') + +## CloudWatch query editor The CloudWatch data source can query data from both CloudWatch metrics and CloudWatch Logs APIs, each with its own specialized query editor. You select which API you want to query with using the query mode switch on top of the editor. -{{< figure src="/static/img/docs/v70/cloudwatch-metrics-query-field.png" max-width="800px" class="docs-image--left" caption="CloudWatch metrics query field" >}} -{{< figure src="/static/img/docs/v70/cloudwatch-logs-query-field.png" max-width="800px" class="docs-image--right" caption="CloudWatch Logs query field" >}} +![CloudWatch API modes](/static/img/docs/cloudwatch/cloudwatch-query-editor-api-modes-8.3.0.png) -## Using the Metric Query Editor +### Metrics query editor -To create a valid query, you need to specify the namespace, metric name and at least one statistic. If `Match Exact` is enabled, you also need to specify all the dimensions of the metric you’re querying, so that the [metric schema](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/search-expression-syntax.html) matches exactly. If `Match Exact` is off, you can specify any number of dimensions by which you’d like to filter. Up to 100 metrics matching your filter criteria will be returned. +The metrics query editor allows you to build two types of queries - **Metric Search** and **Metric Query**. -### Dynamic queries using dimension wildcards +#### Using the Metric Search option + +To create a valid Metric Search query specify the namespace, metric name and at least one statistic. + +If `Match Exact` is enabled, you also need to specify all the dimensions of the metric you’re querying, so that the [metric schema](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/search-expression-syntax.html) matches exactly. If `Match Exact` is disabled, you can specify any number of dimensions by which you’d like to filter. Up to 100 metrics matching your filter criteria will be returned. + +##### Dynamic queries using dimension wildcards You can monitor a dynamic list of metrics by using the asterisk (\*) wildcard for one or more dimension values. -{{< figure src="/static/img/docs/v65/cloudwatch-dimension-wildcard.png" max-width="800px" class="docs-image--right" caption="CloudWatch dimension wildcard" >}} +![CloudWatch dimension wildcard](/static/img/docs/cloudwatch/cloudwatch-dimension-wildcard-8.3.0.png) -In this example, the query returns all metrics in the namespace `AWS/EC2` with a metric name of `CPUUtilization` and ANY value for the `InstanceId` dimension are queried. This can help you monitor metrics for AWS resources, like EC2 instances or containers. For example, when new instances are created as part of an auto scaling event, they will automatically appear in the graph without needing to track the new instance IDs. This capability is currently limited to retrieving up to 100 metrics. +In this example, the query returns all metrics in the namespace `AWS/EC2` with a metric name of `CPUUtilization` and ANY value for the `InstanceId` dimension are queried. This can help you monitor metrics for AWS resources, like EC2 instances or containers. When new instances are created as part of an auto scaling event, they will automatically appear in the graph without you having to track the new instance IDs. This capability is currently limited to retrieving up to 100 metrics. -Click on `Show Query Preview` to see the search expression that is automatically built to support wildcards. To learn more about search expressions, visit the [CloudWatch documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/search-expression-syntax.html). By default, the search expression is defined in such a way that the queried metrics must match the defined dimension names exactly. This means that in the example only metrics with exactly one dimension with name ‘InstanceId’ will be returned. +You can expand the [Query inspector](https://grafana.com/docs/grafana/latest/panels/queries/#query-inspector-button) button and click `Meta Data` to see the search expression that is automatically built to support wildcards. To learn more about search expressions, visit the [CloudWatch documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/search-expression-syntax.html). By default, the search expression is defined in such a way that the queried metrics must match the defined dimension names exactly. This means that in the example only metrics with exactly one dimension with the name ‘InstanceId’ will be returned. -You can untoggle `Match Exact` to include metrics that have other dimensions defined. Disabling `Match Exact` also creates a search expression even if you don’t use wildcards. We simply search for any metric that matches at least the namespace, metric name, and all defined dimensions. +![CloudWatch Meta Inspector](/static/img/docs/cloudwatch/cloudwatch-meta-inspector-8.3.0.png) -### Multi-value template variables +You can disable `Match Exact` to include metrics that have other dimensions defined. Disabling `Match Exact` also creates a search expression even if you don’t use wildcards. We simply search for any metric that matches at least the namespace, metric name, and all defined dimensions. + +##### Multi-value template variables When defining dimension values based on multi-valued template variables, a search expression is used to query for the matching metrics. This enables the use of multiple template variables in one query and also allows you to use template variables for queries that have the `Match Exact` option disabled. @@ -131,7 +133,7 @@ Search expressions are currently limited to 1024 characters, so your query may f The use of multi-valued template variables is only supported for dimension values. Using multi-valued template variables for `Region`, `Namespace`, or `Metric Name` is not supported. -### Metric math expressions +##### Metric math expressions You can create new time series metrics by operating on top of CloudWatch metrics using mathematical functions. Arithmetic operators, unary subtraction and other functions are supported and can be applied to CloudWatch metrics. More details on the available functions can be found on [AWS Metric Math](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/using-metric-math.html) @@ -139,13 +141,7 @@ As an example, if you want to apply arithmetic operations on a metric, you can d Please note that in the case you use the expression field to reference another query, like `queryA * 2`, it will not be possible to create an alert rule based on that query. -### Period - -A period is the length of time associated with a specific Amazon CloudWatch statistic. Periods are defined in numbers of seconds, and valid values for period are 1, 5, 10, 30, or any multiple of 60. - -If the period field is left blank or set to `auto`, then it calculates automatically based on the time range and [cloudwatch's retention policy](https://aws.amazon.com/about-aws/whats-new/2016/11/cloudwatch-extends-metrics-retention-and-new-user-interface/). The formula used is `time range in seconds / 2000`, and then it snaps to the next higher value in an array of predefined periods `[60, 300, 900, 3600, 21600, 86400]` after removing periods based on retention. By clicking `Show Query Preview` in the query editor, you can see what period Grafana used. - -### Deep linking from Grafana panels to the CloudWatch console +##### Deep linking from Grafana panels to the CloudWatch console {{< figure src="/static/img/docs/v65/cloudwatch-deep-linking.png" max-width="500px" class="docs-image--right" caption="CloudWatch deep linking" >}} @@ -153,257 +149,140 @@ Left clicking a time series in the panel shows a context menu with a link to `Vi This feature is not available for metrics that are based on metric math expressions. -## Using the Logs Query Editor +### Using the Metric Query option -To query CloudWatch Logs, select the region and up to 20 log groups which you want to query. Use the main input area to write your query in [CloudWatch Logs Query Language](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html) +> **Note:** This query option is available in Grafana 8.3 and higher versions only. + +Metrics Query in the CloudWatch plugin is what is referred to as **Metric Insights** in the AWS console. It's a fast, flexible, SQL-based query engine that enables you to identify trends and patterns across millions of operational metrics in real time. It uses a dialect of SQL. The query syntax is as follows. + +``` + +SELECT FUNCTION(MetricName) +FROM Namespace | SCHEMA(...) +[ WHERE labelKey OPERATOR labelValue [AND|...]] +[ GROUP BY labelKey [, ...]] +[ ORDER BY FUNCTION() [DESC | ASC] ] +[ LIMIT number] + +``` + +The following table provides basic explanation of the query keywords. For details about the Metrics Insights syntax, refer to the [AWS documentation](https://docs.aws.amazon.com/console/cloudwatch/metricsinsights-syntax). + +| Keyword | Description | +| ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `FUNCTION` | Required. Specifies the aggregate function to use, and also specifies the name of the metric that is to be queried. Valid values are AVG, COUNT, MAX, MIN, and SUM | +| `MetricName` | Required. For example, `CPUUtilization`. | +| `FROM` | Required. Specifies the source of the metric. You can specify either the metric namespace that contains the metric that is to be queried, or a SCHEMA table function. Some namespace examples are 1`AWS/EC2`, `AWS/Lambda`. | +| `SCHEMA` | Optional. Allows you to narrow down the query results to only the metrics that is an exact match or to metrics that do noy match. | +| `WHERE` | Optional. Filters the results to only those metrics that match your specified expression. For example, `WHERE InstanceType != 'c3.4xlarge'`. | +| `GROUP BY` | Optional. Groups the query results into multiple time series. For example, `GROUP BY ServiceName`. | +| `ORDER BY` | Optional. Specifies the order of time series that are returned. Options are `ASC`, `DESC`. | +| `LIMIT` | Optional. Limits the number of time series returned. | + +For information about limits for the Metrics Insights, please refer to the [AWS documentation](https://docs.aws.amazon.com/console/cloudwatch/metricsinsights). + +**Builder mode** + +To create a query in Builder mode: + +1. Browse and select a metric namespace, metric name, filter, group, and order options using information from the table above. +1. For each of these options, choose from the list of possible options. + +Grafana automatically constructs a SQL query based on your selections. + +**Code mode** + +To create a query in the Code mode: + +1. Write your SQL query. +1. To run the query, click the **Run query** above the code editor. + +The code editor has a built in autocomplete feature that gives suggestions for keywords, aggregations, namespaces, metrics, labels and label values. The suggestions are shown when hitting space, comma or dollar character. You can also use the keyboard combination CTRL+Space. + +![Code editor autocomplete](/static/img/docs/cloudwatch/cloudwatch-code-editor-autocomplete-8.3.0.gif) + +> **Note:** Usage of template variables in the code editor might interfere the autocompletion. + +### Common metric query editor fields + +At the bottom of the metric query editor, you'll find three fields that are common to both _Metric Search_ and _Metric Query_. + +#### Id + +The GetMetricData API requires that all queries have a unique ID. Use this field to specify an ID of choice. The ID can include numbers, letters, and underscore, and must start with a lowercase letter. If no ID is specified, grafana will generate an ID using the following pattern `query[refId of the current query row]`, e.g `queryA` for the first query row in the panel editor. + +The ID can be used to reference queries in Metric Math expressions. + +#### Period + +A period is the length of time associated with a specific Amazon CloudWatch statistic. Periods are defined in numbers of seconds, and valid values for period are 1, 5, 10, 30, or any multiple of 60. + +If the period field is left blank or set to `auto`, then it calculates automatically based on the time range and [cloudwatch's retention policy](https://aws.amazon.com/about-aws/whats-new/2016/11/cloudwatch-extends-metrics-retention-and-new-user-interface/). The formula used is `time range in seconds / 2000`, and then it snaps to the next higher value in an array of predefined periods `[60, 300, 900, 3600, 21600, 86400]` after removing periods based on retention. By clicking `Show Query Preview` in the query editor, you can see what period Grafana used. + +#### Alias + +The alias field allows you to override the default name of the metric legend. + +##### Alias patterns + +| Alias Pattern | Description | Example Result | +| ---------------------- | ------------------------------------------------------------- | ---------------- | +| `{{region}}` | returns the region | `us-east-1` | +| `{{period}}` | returns the period | `3000` | +| `{{metric}}` | returns the metric | `CPUUtilization` | +| `{{label}}` | returns the label returned by the API (only in Metric Search) | `i-01343` | +| `{{namespace}}` | returns the namespace (only in Metric Search) | `AWS/EC2` | +| `{{stat}}` | returns the statistic (only in Metric Search) | `Average` | +| `{{[dimension name]}}` | returns the dimension name (only in Metric Search) | `i-01343` | + +## Using the Logs query editor + +To query CloudWatch Logs: + +1. Select the region and up to 20 log groups which you want to query. +1. Use the main input area to write your query in [CloudWatch Logs Query Language](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_QuerySyntax.html). You can also write queries returning time series data by using the [`stats` command](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/CWL_Insights-Visualizing-Log-Data.html). When making `stats` queries in Explore, you have to make sure you are in Metrics Explore mode. {{< figure src="/static/img/docs/v70/explore-mode-switcher.png" max-width="500px" class="docs-image--right" caption="Explore mode switcher" >}} -To the right of the query input field is a CloudWatch Logs Insights link that opens the CloudWatch Logs Insights console with your query. You can continue exploration there if necessary. - -{{< figure src="/static/img/docs/v70/cloudwatch-logs-deep-linking.png" max-width="500px" class="docs-image--right" caption="CloudWatch Logs deep linking" >}} - -### Using template variables - -The CloudWatch data source supports use of template variables in queries. -For an introduction to templating and template variables, refer to the [Templating]({{< relref "../../variables/_index.md" >}}) documentation. - ### Deep linking from Grafana panels to the CloudWatch console {{< figure src="/static/img/docs/v70/cloudwatch-logs-deep-linking.png" max-width="500px" class="docs-image--right" caption="CloudWatch Logs deep linking" >}} If you'd like to view your query in the CloudWatch Logs Insights console, simply click the `CloudWatch Logs Insights` button next to the query editor. If you're not currently logged in to the CloudWatch console, the link will forward you to the login page. The provided link is valid for any account but will only display the right metrics if you're logged in to the account that corresponds to the selected data source in Grafana. -### Alerting +## Alerting Since CloudWatch Logs queries can return numeric data, for example through the use of the `stats` command, alerts are supported. For more information on Grafana alerts, refer to [Alerting]({{< relref "../../alerting/_index.md" >}}) documentation. -## Curated dashboards +## Configure CloudWatch with grafana.ini -The updated CloudWatch data source ships with pre-configured dashboards for five of the most popular AWS services: +The Grafana [configuration]({{< relref "../../administration/configuration.md#aws" >}}) file includes an `AWS` section where you can customize the data source. -- Amazon Elastic Compute Cloud `Amazon EC2`, -- Amazon Elastic Block Store `Amazon EBS`, -- AWS Lambda `AWS Lambda`, -- Amazon CloudWatch Logs `Amazon CloudWatch Logs`, and -- Amazon Relational Database Service `Amazon RDS`. - -To import the pre-configured dashboards, go to the configuration page of your CloudWatch data source and click on the `Dashboards` tab. Click `Import` for the dashboard you would like to use. To customize the dashboard, we recommend saving the dashboard under a different name, because otherwise the dashboard will be overwritten when a new version of the dashboard is released. - -{{< figure src="/static/img/docs/v65/cloudwatch-dashboard-import.png" caption="CloudWatch dashboard import" >}} - -## Templated queries - -Instead of hard-coding server, application, and sensor names in your metric queries, you can use variables. The variables are listed as dropdown select boxes at the top of the dashboard. These dropdowns make it easy to change the display of data in your dashboard. - -For an introduction to templating and template variables, refer to the [Templating]({{< relref "../../variables/_index.md" >}}) documentation. - -### Query variable - -The CloudWatch data source provides the following queries that you can specify in the `Query` field in the Variable edit view. They allow you to fill a variable's options list with things like `region`, `namespaces`, `metric names` and `dimension keys/values`. - -In place of `region` you can specify `default` to use the default region configured in the data source for the query, -e.g. `metrics(AWS/DynamoDB, default)` or `dimension_values(default, ..., ..., ...)`. - -Read more about the available dimensions in the [CloudWatch Metrics and Dimensions Reference](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CW_Support_For_AWS.html). - -| Name | Description | -| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `regions()` | Returns a list of all AWS regions | -| `namespaces()` | Returns a list of namespaces CloudWatch support. | -| `metrics(namespace, [region])` | Returns a list of metrics in the namespace. (specify region or use "default" for custom metrics) | -| `dimension_keys(namespace)` | Returns a list of dimension keys in the namespace. | -| `dimension_values(region, namespace, metric, dimension_key, [filters])` | Returns a list of dimension values matching the specified `region`, `namespace`, `metric`, `dimension_key` or you can use dimension `filters` to get more specific result as well. | -| `ebs_volume_ids(region, instance_id)` | Returns a list of volume ids matching the specified `region`, `instance_id`. | -| `ec2_instance_attribute(region, attribute_name, filters)` | Returns a list of attributes matching the specified `region`, `attribute_name`, `filters`. | -| `resource_arns(region, resource_type, tags)` | Returns a list of ARNs matching the specified `region`, `resource_type` and `tags`. | -| `statistics()` | Returns a list of all the standard statistics | - -For details about the metrics CloudWatch provides, please refer to the [CloudWatch documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html). - -#### Examples templated queries - -Example dimension queries which will return list of resources for individual AWS Services: - -| Query | Service | -| ----------------------------------------------------------------------------------------------------------------------------- | ---------------- | -| `dimension_values(us-east-1,AWS/ELB,RequestCount,LoadBalancerName)` | ELB | -| `dimension_values(us-east-1,AWS/ElastiCache,CPUUtilization,CacheClusterId)` | ElastiCache | -| `dimension_values(us-east-1,AWS/Redshift,CPUUtilization,ClusterIdentifier)` | RedShift | -| `dimension_values(us-east-1,AWS/RDS,CPUUtilization,DBInstanceIdentifier)` | RDS | -| `dimension_values(us-east-1,AWS/S3,BucketSizeBytes,BucketName)` | S3 | -| `dimension_values(us-east-1,CWAgent,disk_used_percent,device,{"InstanceId":"$instance_id"})` | CloudWatch Agent | -| `resource_arns(eu-west-1,elasticloadbalancing:loadbalancer,{"elasticbeanstalk:environment-name":["myApp-dev","myApp-prod"]})` | ELB | -| `resource_arns(eu-west-1,elasticloadbalancing:loadbalancer,{"Component":["$service"],"Environment":["$environment"]})` | ELB | -| `resource_arns(eu-west-1,ec2:instance,{"elasticbeanstalk:environment-name":["myApp-dev","myApp-prod"]})` | EC2 | - -## ec2_instance_attribute examples - -### JSON filters - -The `ec2_instance_attribute` query takes `filters` in JSON format. -You can specify [pre-defined filters of ec2:DescribeInstances](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html). -Note that the actual filtering takes place on Amazon's servers, not in Grafana. - -Filters syntax: - -```javascript -{ "filter_name1": [ "filter_value1" ], "filter_name2": [ "filter_value2" ] } -``` - -Example `ec2_instance_attribute()` query - -```javascript -ec2_instance_attribute(us - east - 1, InstanceId, { 'tag:Environment': ['production'] }); -``` - -### Selecting attributes - -Only 1 attribute per instance can be returned. Any flat attribute can be selected (i.e. if the attribute has a single value and isn't an object or array). Below is a list of available flat attributes: - -- `AmiLaunchIndex` -- `Architecture` -- `ClientToken` -- `EbsOptimized` -- `EnaSupport` -- `Hypervisor` -- `IamInstanceProfile` -- `ImageId` -- `InstanceId` -- `InstanceLifecycle` -- `InstanceType` -- `KernelId` -- `KeyName` -- `LaunchTime` -- `Platform` -- `PrivateDnsName` -- `PrivateIpAddress` -- `PublicDnsName` -- `PublicIpAddress` -- `RamdiskId` -- `RootDeviceName` -- `RootDeviceType` -- `SourceDestCheck` -- `SpotInstanceRequestId` -- `SriovNetSupport` -- `SubnetId` -- `VirtualizationType` -- `VpcId` - -Tags can be selected by prepending the tag name with `Tags.` - -Example `ec2_instance_attribute()` query - -```javascript -ec2_instance_attribute(us - east - 1, Tags.Name, { 'tag:Team': ['sysops'] }); -``` - -## Using JSON format template variables - -Some queries accept filters in JSON format and Grafana supports the conversion of template variables to JSON. - -If `env = 'production', 'staging'`, following query will return ARNs of EC2 instances which `Environment` tag is `production` or `staging`. - -```javascript -resource_arns(us-east-1, ec2:instance, {"Environment":${env:json}}) -``` +| Configuration option | Description | +| ------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `allowed_auth_providers` | Specifies which authentication providers are allowed for the CloudWatch data source. The following providers are enabled by default in OSS Grafana: `default` (AWS SDK default), keys (Access and secret key), credentials (Credentials file), ec2_IAM_role (EC2 IAM role). | +| `assume_role_enabled` | Allows you to disable `assume role (ARN)` in the CloudWatch data source. By default, assume role (ARN) is enabled for OSS Grafana. | +| `list_metrics_page_limit` | When a custom namespace is specified in the query editor, the [List Metrics API](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html) is used to populate the _Metrics_ field and the _Dimension_ fields. The API is paginated and returns up to 500 results per page. The CloudWatch data source also limits the number of pages to 500. However, you can change this limit using the `list_metrics_page_limit` variable in the [grafana configuration file](https://grafana.com/docs/grafana/latest/administration/configuration/#aws). | ## Pricing The Amazon CloudWatch data source for Grafana uses the `ListMetrics` and `GetMetricData` CloudWatch API calls to list and retrieve metrics. Pricing for CloudWatch Logs is based on the amount of data ingested, archived, and analyzed via CloudWatch Logs Insights queries. -Please see the [CloudWatch pricing page](https://aws.amazon.com/cloudwatch/pricing/) for more details. +Every time you pick a dimension in the query editor Grafana will issue a ListMetrics request. Whenever you make a change to the queries in the query editor, one new request to GetMetricData will be issued. -Every time you pick a dimension in the query editor Grafana will issue a ListMetrics request. -Whenever you make a change to the queries in the query editor, one new request to GetMetricData will be issued. +In Grafana version 6.5 or higher, all API requests to GetMetricStatistics have been replaced with calls to GetMetricData to provide better support for CloudWatch metric math and enables the automatic generation of search expressions when using wildcards or disabling the `Match Exact` option. While GetMetricStatistics qualified for the CloudWatch API free tier, this is not the case for GetMetricData calls. -Please note that for Grafana version 6.5 or higher, all API requests to GetMetricStatistics have been replaced with calls to GetMetricData. This change enables better support for CloudWatch metric math and enables the automatic generation of search expressions when using wildcards or disabling the `Match Exact` option. While GetMetricStatistics qualified for the CloudWatch API free tier, this is not the case for GetMetricData calls. For more information, please refer to the [CloudWatch pricing page](https://aws.amazon.com/cloudwatch/pricing/). +For more information, please refer to the [CloudWatch pricing page](https://aws.amazon.com/cloudwatch/pricing/). ## Service quotas AWS defines quotas, or limits, for resources, actions, and items in your AWS account. Depending on the number of queries in your dashboard and the number of users accessing the dashboard, you may reach the usage limits for various CloudWatch and CloudWatch Logs resources. Note that quotas are defined per account and per region. If you're using multiple regions or have set up more than one CloudWatch data source to query against multiple accounts, you need to request a quota increase for each account and each region in which you hit the limit. -To request a quota increase, visit the [AWS Service Quotas console](https://console.aws.amazon.com/servicequotas/home?r#!/services/monitoring/quotas/L-5E141212). +To request a quota increase, visit the [AWS Service Quotas console](https://console.aws.amazon.com/servicequotas/home?r#!/services/monitoring/quotas/L-5E141212). For more information, refer to the AWS documentation for [Service Quotas](https://docs.aws.amazon.com/servicequotas/latest/userguide/intro.html) and [CloudWatch limits](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_limits.html). -Please see the AWS documentation for [Service Quotas](https://docs.aws.amazon.com/servicequotas/latest/userguide/intro.html) and [CloudWatch limits](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch_limits.html) for more information. - -## Configure the data source with grafana.ini - -The Grafana [configuration]({{< relref "../../administration/configuration.md#aws" >}}) file includes an `AWS` section where you can customize the data source. - -### allowed_auth_providers - -Specify which authentication providers are allowed for the CloudWatch data source. The following providers are enabled by default in OSS Grafana: `default` (AWS SDK default), keys (Access and secret key), credentials (Credentials file), ec2_IAM_role (EC2 IAM role). - -### assume_role_enabled - -Allows you to disable `assume role (ARN)` in the CloudWatch data source. By default, assume role (ARN) is enabled for OSS Grafana. - -### list_metrics_page_limit - -When a custom namespace is specified in the query editor, the [List Metrics API](https://docs.aws.amazon.com/AmazonCloudWatch/latest/APIReference/API_ListMetrics.html) is used to populate the _Metrics_ field and the _Dimension_ fields. The API is paginated and returns up to 500 results per page. The CloudWatch data source also limits the number of pages to 500. However, you can change this limit using the `list_metrics_page_limit` variable in the [grafana configuration file](https://grafana.com/docs/grafana/latest/administration/configuration/#aws). - -## Configure the data source with provisioning - -You can configure the CloudWatch data source by customizing configuration files in Grafana's provisioning system. To know more about provisioning and learn about available configuration options, refer to the [Provisioning Grafana]({{< relref "../../administration/provisioning/#datasources" >}}) topic. - -Here are some provisioning examples for this data source. - -### Using AWS SDK (default) - -```yaml -apiVersion: 1 -datasources: - - name: CloudWatch - type: cloudwatch - jsonData: - authType: default - defaultRegion: eu-west-2 ``` -### Using credentials' profile name (non-default) - -```yaml -apiVersion: 1 - -datasources: - - name: CloudWatch - type: cloudwatch - jsonData: - authType: credentials - defaultRegion: eu-west-2 - customMetricsNamespaces: 'CWAgent,CustomNameSpace' - profile: secondary -``` - -### Using `accessKey` and `secretKey` - -```yaml -apiVersion: 1 - -datasources: - - name: CloudWatch - type: cloudwatch - jsonData: - authType: keys - defaultRegion: eu-west-2 - secureJsonData: - accessKey: '' - secretKey: '' -``` - -### Using AWS SDK Default and ARN of IAM Role to Assume - -```yaml -apiVersion: 1 -datasources: - - name: CloudWatch - type: cloudwatch - jsonData: - authType: default - assumeRoleArn: arn:aws:iam::123456789012:root - defaultRegion: eu-west-2 ``` diff --git a/docs/sources/datasources/aws-cloudwatch/aws-authentication.md b/docs/sources/datasources/aws-cloudwatch/aws-authentication.md index bddf485610b..3d4a2fe19c3 100644 --- a/docs/sources/datasources/aws-cloudwatch/aws-authentication.md +++ b/docs/sources/datasources/aws-cloudwatch/aws-authentication.md @@ -3,7 +3,7 @@ title = "Authentication" description = "AWS authentication" keywords = ["grafana", "aws", "authentication"] aliases = ["/docs/grafana/latest/datasources/cloudwatch"] -weight = 205 +weight = 5 +++ # AWS authentication @@ -12,6 +12,14 @@ Requests from a Grafana plugin to AWS are made on behalf of an IAM role or an IA All requests to AWS APIs are performed on the server side by the Grafana backend using the official AWS SDK. +This topic has the following sections: + +- [Authentication methods](#authentication-methods) +- [Assuming a role](#assuming-a-role) +- [Endpoint](#endpoint) +- [AWS credentials file](#aws-credentials-file) +- [EKS IAM roles for service accounts](#eks-iam-roles-for-service-accounts) + ## Authentication methods You can use one of the following authentication methods. Currently, `AWS SDK Default`, `Credentials file` and `Access and secret key` are enabled by default in open source Grafana. You can enable/disable them if necessary if you have server configuration access. For more information, refer to [allowed_auth_providers]({{< relref "../../administration/configuration.md#allowed_auth_providers" >}}) documentation. @@ -36,18 +44,7 @@ If you are assuming a role in another account that was created with an external ## Endpoint -The `Endpoint` field allows you to specify a custom endpoint URL that overrides the default generated endpoint for the CloudWatch API. Leave this field blank if you want to use the default generated endpoint. For more information on why and how to use Service endpoints, refer to the [AWS service endpoints documentation](https://docs.aws.amazon.com/general/latest/gr/rande.html). - -## EKS IAM roles for service accounts - -The Grafana process in the container runs as user 472 (called "grafana"). When Kubernetes mounts your projected credentials, they will by default only be available to the root user. To allow user 472 to access the credentials (and avoid falling back to the IAM role attached to the EC2 instance), you need to provide a [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for your pod. - -```yaml -securityContext: - fsGroup: 472 - runAsUser: 472 - runAsGroup: 472 -``` +The `Endpoint` field allows you to specify a custom endpoint URL that overrides the default generated endpoint for the AWS service API. Leave this field blank if you want to use the default generated endpoint. For more information on why and how to use Service endpoints, refer to the [AWS service endpoints documentation](https://docs.aws.amazon.com/general/latest/gr/rande.html). ## AWS credentials file @@ -63,3 +60,14 @@ aws_access_key_id = asdsadasdasdasd aws_secret_access_key = dasdasdsadasdasdasdsa region = us-west-2 ``` + +## EKS IAM roles for service accounts + +The Grafana process in the container runs as user 472 (called "grafana"). When Kubernetes mounts your projected credentials, they will by default only be available to the root user. To allow user 472 to access the credentials (and avoid falling back to the IAM role attached to the EC2 instance), you need to provide a [security context](https://kubernetes.io/docs/tasks/configure-pod-container/security-context/) for your pod. + +```yaml +securityContext: + fsGroup: 472 + runAsUser: 472 + runAsGroup: 472 +``` diff --git a/docs/sources/datasources/aws-cloudwatch/preconfig-cloudwatch-dashboards.md b/docs/sources/datasources/aws-cloudwatch/preconfig-cloudwatch-dashboards.md new file mode 100644 index 00000000000..528b699df67 --- /dev/null +++ b/docs/sources/datasources/aws-cloudwatch/preconfig-cloudwatch-dashboards.md @@ -0,0 +1,27 @@ ++++ +title = "Curated CloudWatch dashboards" +description = "Guide for using AWS CloudWatch in Grafana" +keywords = ["grafana", "stackdriver", "google", "guide", "cloud", "monitoring"] +aliases = ["/docs/grafana/latest/datasources/cloudwatch"] +weight = 15 ++++ + +# Curated CloudWatch dashboards + +The updated CloudWatch data source ships with pre-configured dashboards for five of the most popular AWS services: + +- Amazon Elastic Compute Cloud `Amazon EC2`, +- Amazon Elastic Block Store `Amazon EBS`, +- AWS Lambda `AWS Lambda`, +- Amazon CloudWatch Logs `Amazon CloudWatch Logs`, and +- Amazon Relational Database Service `Amazon RDS`. + +To import curatedd dashboards: + +1. On the configuration page of your CloudWatch data source, click the **Dashboards** tab. + +1. Click **Import** for the dashboard you would like to use. + +In case you want to customize a dashboard, we recommend that you save it under a different name. Otherwise the dashboard will be overwritten when a new version of the dashboard is released. + +{{< figure src="/static/img/docs/v65/cloudwatch-dashboard-import.png" caption="CloudWatch dashboard import" >}} diff --git a/docs/sources/datasources/aws-cloudwatch/provision-cloudwatch.md b/docs/sources/datasources/aws-cloudwatch/provision-cloudwatch.md new file mode 100644 index 00000000000..6f0f67659cc --- /dev/null +++ b/docs/sources/datasources/aws-cloudwatch/provision-cloudwatch.md @@ -0,0 +1,68 @@ ++++ +title = "Provision CloudWatch" +description = "Guide for provisioning CloudWatch" +weight = 400 +aliases = ["/docs/grafana/latest/datasources/cloudwatch"] ++++ + +# Provision CloudWatch data source + +You can configure the CloudWatch data source by customizing configuration files in Grafana's provisioning system. To know more about provisioning and learn about available configuration options, refer to the [Provisioning Grafana]({{< relref "../../administration/provisioning/#datasources" >}}) topic. + +Here are some provisioning examples for this data source. + +## Using AWS SDK (default) + +```yaml +apiVersion: 1 +datasources: + - name: CloudWatch + type: cloudwatch + jsonData: + authType: default + defaultRegion: eu-west-2 +``` + +## Using credentials' profile name (non-default) + +```yaml +apiVersion: 1 + +datasources: + - name: CloudWatch + type: cloudwatch + jsonData: + authType: credentials + defaultRegion: eu-west-2 + customMetricsNamespaces: 'CWAgent,CustomNameSpace' + profile: secondary +``` + +## Using accessKey and secretKey + +```yaml +apiVersion: 1 + +datasources: + - name: CloudWatch + type: cloudwatch + jsonData: + authType: keys + defaultRegion: eu-west-2 + secureJsonData: + accessKey: '' + secretKey: '' +``` + +## Using AWS SDK Default and ARN of IAM Role to Assume + +```yaml +apiVersion: 1 +datasources: + - name: CloudWatch + type: cloudwatch + jsonData: + authType: default + assumeRoleArn: arn:aws:iam::123456789012:root + defaultRegion: eu-west-2 +``` diff --git a/docs/sources/datasources/aws-cloudwatch/template-queries-cloudwatch.md b/docs/sources/datasources/aws-cloudwatch/template-queries-cloudwatch.md new file mode 100644 index 00000000000..e0448a0d70b --- /dev/null +++ b/docs/sources/datasources/aws-cloudwatch/template-queries-cloudwatch.md @@ -0,0 +1,122 @@ ++++ +title = "Template variables in CloudWatch query" +description = "Template variables in CloudWatch queryh" +weight = 10 +aliases = ["/docs/grafana/latest/datasources/cloudwatch"] ++++ + +# Using template variables in CloudWatch queries + +Instead of hard-coding server, application, and sensor names in your metric queries, you can use variables. The variables are listed as dropdown select boxes at the top of the dashboard. These dropdowns make it easy to change the display of data in your dashboard. + +For an introduction to templating and template variables, refer to the [Templating]({{< relref "../../variables/_index.md" >}}) documentation. + +## Query variable + +The CloudWatch data source provides the following queries that you can specify in the `Query` field in the Variable edit view. They allow you to fill a variable's options list with things like `region`, `namespaces`, `metric names` and `dimension keys/values`. + +In place of `region` you can specify `default` to use the default region configured in the data source for the query, +e.g. `metrics(AWS/DynamoDB, default)` or `dimension_values(default, ..., ..., ...)`. + +Read more about the available dimensions in the [CloudWatch Metrics and Dimensions Reference](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CW_Support_For_AWS.html). + +| Name | Description | +| ----------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `regions()` | Returns a list of all AWS regions | +| `namespaces()` | Returns a list of namespaces CloudWatch support. | +| `metrics(namespace, [region])` | Returns a list of metrics in the namespace. (specify region or use "default" for custom metrics) | +| `dimension_keys(namespace)` | Returns a list of dimension keys in the namespace. | +| `dimension_values(region, namespace, metric, dimension_key, [filters])` | Returns a list of dimension values matching the specified `region`, `namespace`, `metric`, `dimension_key` or you can use dimension `filters` to get more specific result as well. | +| `ebs_volume_ids(region, instance_id)` | Returns a list of volume ids matching the specified `region`, `instance_id`. | +| `ec2_instance_attribute(region, attribute_name, filters)` | Returns a list of attributes matching the specified `region`, `attribute_name`, `filters`. | +| `resource_arns(region, resource_type, tags)` | Returns a list of ARNs matching the specified `region`, `resource_type` and `tags`. | +| `statistics()` | Returns a list of all the standard statistics | + +For details about the metrics CloudWatch provides, please refer to the [CloudWatch documentation](https://docs.aws.amazon.com/AmazonCloudWatch/latest/DeveloperGuide/CW_Support_For_AWS.html). + +## Example of templated queries + +Here is an example of the dimension queries which will return list of resources for individual AWS Services: + +| Query | Service | +| ----------------------------------------------------------------------------------------------------------------------------- | ---------------- | +| `dimension_values(us-east-1,AWS/ELB,RequestCount,LoadBalancerName)` | ELB | +| `dimension_values(us-east-1,AWS/ElastiCache,CPUUtilization,CacheClusterId)` | ElastiCache | +| `dimension_values(us-east-1,AWS/Redshift,CPUUtilization,ClusterIdentifier)` | RedShift | +| `dimension_values(us-east-1,AWS/RDS,CPUUtilization,DBInstanceIdentifier)` | RDS | +| `dimension_values(us-east-1,AWS/S3,BucketSizeBytes,BucketName)` | S3 | +| `dimension_values(us-east-1,CWAgent,disk_used_percent,device,{"InstanceId":"$instance_id"})` | CloudWatch Agent | +| `resource_arns(eu-west-1,elasticloadbalancing:loadbalancer,{"elasticbeanstalk:environment-name":["myApp-dev","myApp-prod"]})` | ELB | +| `resource_arns(eu-west-1,elasticloadbalancing:loadbalancer,{"Component":["$service"],"Environment":["$environment"]})` | ELB | +| `resource_arns(eu-west-1,ec2:instance,{"elasticbeanstalk:environment-name":["myApp-dev","myApp-prod"]})` | EC2 | + +## Using JSON format template variables + +Some queries accept filters in JSON format and Grafana supports the conversion of template variables to JSON. + +If `env = 'production', 'staging'`, following query will return ARNs of EC2 instances which `Environment` tag is `production` or `staging`. + +```javascript +resource_arns(us-east-1, ec2:instance, {"Environment":${env:json}}) +``` + +## ec2_instance_attribute examples + +### JSON filters + +The `ec2_instance_attribute` query takes `filters` in JSON format. +You can specify [pre-defined filters of ec2:DescribeInstances](http://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeInstances.html). +Note that the actual filtering takes place on Amazon's servers, not in Grafana. + +Filters syntax: + +```javascript +{ "filter_name1": [ "filter_value1" ], "filter_name2": [ "filter_value2" ] } +``` + +Example `ec2_instance_attribute()` query + +```javascript +ec2_instance_attribute(us - east - 1, InstanceId, { 'tag:Environment': ['production'] }); +``` + +### Selecting attributes + +Only 1 attribute per instance can be returned. Any flat attribute can be selected (i.e. if the attribute has a single value and isn't an object or array). Below is a list of available flat attributes: + +- `AmiLaunchIndex` +- `Architecture` +- `ClientToken` +- `EbsOptimized` +- `EnaSupport` +- `Hypervisor` +- `IamInstanceProfile` +- `ImageId` +- `InstanceId` +- `InstanceLifecycle` +- `InstanceType` +- `KernelId` +- `KeyName` +- `LaunchTime` +- `Platform` +- `PrivateDnsName` +- `PrivateIpAddress` +- `PublicDnsName` +- `PublicIpAddress` +- `RamdiskId` +- `RootDeviceName` +- `RootDeviceType` +- `SourceDestCheck` +- `SpotInstanceRequestId` +- `SriovNetSupport` +- `SubnetId` +- `VirtualizationType` +- `VpcId` + +Tags can be selected by prepending the tag name with `Tags.` + +Example `ec2_instance_attribute()` query + +```javascript +ec2_instance_attribute(us - east - 1, Tags.Name, { 'tag:Team': ['sysops'] }); +``` diff --git a/docs/sources/datasources/elasticsearch.md b/docs/sources/datasources/elasticsearch.md index 2365423e602..07a46386c94 100644 --- a/docs/sources/datasources/elasticsearch.md +++ b/docs/sources/datasources/elasticsearch.md @@ -20,12 +20,12 @@ visualize logs or metrics stored in Elasticsearch. You can also annotate your gr > **Note:** If you're not seeing the `Data Sources` link in your side menu it means that your current user does not have the `Admin` role for the current organization. -| Name | Description | -| --------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `Name` | The data source name. This is how you refer to the data source in panels and queries. | -| `Default` | Default data source means that it will be pre-selected for new panels. | -| `Url` | The HTTP protocol, IP, and port of your Elasticsearch server. | -| `Access` | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser. | +| Name | Description | +| --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `Name` | The data source name. This is how you refer to the data source in panels and queries. | +| `Default` | Default data source means that it will be pre-selected for new panels. | +| `Url` | The HTTP protocol, IP, and port of your Elasticsearch server. | +| `Access` | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser. **Note**: Browser (direct) access is deprecated and will be removed in a future release. | Access mode controls how requests to the data source will be handled. Server should be the preferred way if nothing else stated. diff --git a/docs/sources/datasources/google-cloud-monitoring/_index.md b/docs/sources/datasources/google-cloud-monitoring/_index.md index c93ce340c77..38f1a0e8351 100644 --- a/docs/sources/datasources/google-cloud-monitoring/_index.md +++ b/docs/sources/datasources/google-cloud-monitoring/_index.md @@ -12,25 +12,18 @@ Grafana ships with built-in support for Google Cloud Monitoring. Add it as a dat > **Note** Before Grafana v7.1, Google Cloud Monitoring was referred to as Google Stackdriver. -## Google Cloud Monitoring settings +## Configure the Google Cloud Monitoring data source -To access Google Cloud Monitoring settings, hover your mouse over the **Configuration** (gear) icon, then click **Data Sources**, and then click the Google Cloud Monitoring data source. +To access Google Cloud Monitoring settings, hover your mouse over the **Configuration** (gear) icon, then click **Data Sources**, and click **Add data source**, then click the Google Cloud Monitoring data source. -| Name | Description | -| --------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `Name` | The data source name. This is how you refer to the data source in panels and queries. | -| `Default` | Default data source means that it is pre-selected for new panels. | -| `Service Account Key` | Upload or paste in the Service Account Key file for a GCP Project. For more information, refer to [Using a Google Service Account Key File](#using-a-google-service-account-key-file). | +| Name | Description | +| --------- | ------------------------------------------------------------------------------------- | +| `Name` | The data source name. This is how you refer to the data source in panels and queries. | +| `Default` | Default data source means that it is pre-selected for new panels. | -## Authentication +For authentication options and configuration details, see the [Google authentication]({{< relref "google-authentication.md" >}}) documentation. -There are two ways to authenticate the Google Cloud Monitoring plugin - either by uploading a Google JWT file, or by automatically retrieving credentials from Google metadata server. The latter option is only available when running Grafana on GCE virtual machine. - -### Using a Google Service Account Key File - -To authenticate with the Google Cloud Monitoring API, you need to create a Google Cloud Platform (GCP) Service Account for the Project you want to show data for. A Grafana data source integrates with one GCP Project. If you want to visualize data from multiple GCP Projects then you need to create one data source per GCP Project. - -#### Enable APIs +### Google Cloud Monitoring specific data source configuration The following APIs need to be enabled first: @@ -41,39 +34,15 @@ Click on the links above and click the `Enable` button: {{< figure src="/static/img/docs/v71/cloudmonitoring_enable_api.png" max-width="450px" class="docs-image--no-shadow" caption="Enable GCP APIs" >}} -#### Create a GCP Service Account for a Project +#### Using GCP Service Account Key File -1. Navigate to the [APIs and Services Credentials page](https://console.cloud.google.com/apis/credentials). -1. Click on the `Create credentials` dropdown/button and choose the `Service account key` option. +The GCP Service Account must have the **Monitoring Viewer** role as shown in the image below: - {{< figure src="/static/img/docs/v71/cloudmonitoring_create_service_account_button.png" max-width="500px" class="docs-image--no-shadow" caption="Create service account button" >}} +{{< figure src="/static/img/docs/v71/cloudmonitoring_service_account_choose_role.png" max-width="600px" class="docs-image--no-shadow" caption="Choose role" >}} -1. On the `Create service account key` page, choose key type `JSON`. Then in the `Service Account` dropdown, choose the `New service account` option: +#### Using GCE Default Service Account - {{< figure src="/static/img/docs/v71/cloudmonitoring_create_service_account_key.png" max-width="500px" class="docs-image--no-shadow" caption="Create service account key" >}} - -1. Some new fields will appear. Fill in a name for the service account in the `Service account name` field and then choose the `Monitoring Viewer` role from the `Role` dropdown: - - {{< figure src="/static/img/docs/v71/cloudmonitoring_service_account_choose_role.png" max-width="600px" class="docs-image--no-shadow" caption="Choose role" >}} - -1. Click the Create button. A JSON key file will be created and downloaded to your computer. Store this file in a secure place as it allows access to your Google Cloud Monitoring data. -1. Upload it to Grafana on the data source Configuration page. You can either upload the file or paste in the contents of the file. - - {{< figure src="/static/img/docs/v71/cloudmonitoring_grafana_upload_key.png" max-width="550px" class="docs-image--no-shadow" caption="Upload service key file to Grafana" >}} - -1. The file contents will be encrypted and saved in the Grafana database. Don't forget to save after uploading the file! - - {{< figure src="/static/img/docs/v71/cloudmonitoring_grafana_key_uploaded.png" max-width="600px" class="docs-image--no-shadow" caption="Service key file is uploaded to Grafana" >}} - -### Using GCE Default Service Account - -If Grafana is running on a Google Compute Engine (GCE) virtual machine, it is possible for Grafana to automatically retrieve default credentials from the metadata server. This has the advantage of not needing to generate a private key file for the service account and also not having to upload the file to Grafana. However for this to work, there are a few preconditions that need to be met. - -1. First of all, you need to create a Service Account that can be used by the GCE virtual machine. For more information, refer to [Create new service account](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#createanewserviceaccount). -1. Make sure the GCE virtual machine instance is being run as the service account that you just created. For more information, refer to [using service account for instance](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#using). -1. Allow access to the `Cloud Monitoring API` scope. - -For more information about creating and enabling service accounts for GCE VM instances, refer to [enable service accounts for instances](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances). +If Grafana is running on a Google Compute Engine (GCE) virtual machine, the service account in use must have access to the `Cloud Monitoring API` scope. ## Using the Query Editor @@ -150,7 +119,7 @@ The option is called `cloud monitoring auto` and the defaults are: - 5m for time ranges >= 23 hours and < 6 days - 1h for time ranges >= 6 days -The other automatic option is `grafana auto`. This will automatically set the group by time depending on the time range chosen and the width of the time series panel. For more information about grafana auto, refer to the [interval variable](http://docs.grafana.org/variables/templates-and-variables/#the-interval-variable). +The other automatic option is `grafana auto`. This will automatically set the group by time depending on the time range chosen and the width of the time series panel. For more information about grafana auto, refer to the [interval variable]({{< relref "../../variables/variable-types/add-interval-variable.md" >}}). You can also choose fixed time intervals to group by, like `1h` or `1d`. @@ -220,7 +189,7 @@ To create an SLO query, follow these steps: 1. Choose a project from the **Project** dropdown. 1. Choose an [SLO service](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/services) from the **Service** dropdown. 1. Choose an [SLO](https://cloud.google.com/monitoring/api/ref_v3/rest/v3/services.serviceLevelObjectives) from the **SLO** dropdown. -1. Choose a [time series selector](https://cloud.google.com/monitoring/service-monitoring/timeseries-selectors#ts-selector-list) from the **Selector** dropdown. +1. Choose a [time series selector](https://cloud.google.com/stackdriver/docs/solutions/slo-monitoring/api/timeseries-selectors#ts-selector-list) from the **Selector** dropdown. The friendly names for the time series selectors are shown in Grafana. Here is the mapping from the friendly name to the system name that is used in the Service Monitoring documentation: @@ -294,12 +263,7 @@ Variable of the type _Query_ allows you to query Google Cloud Monitoring for var ### Using variables in queries -There are two syntaxes: - -- `$` Example: `metric.label.$metric_label` -- `[[varname]]` Example: `metric.label.[[metric_label]]` - -Why two ways? The first syntax is easier to read and write but does not allow you to use a variable in the middle of a word. When the _Multi-value_ or _Include all value_ options are enabled, Grafana converts the labels from plain text to a regex compatible string, which means you have to use `=~` instead of `=`. +Refer to the [variable syntax documentation]({{< relref "../../variables/syntax.md" >}}). ## Annotations @@ -327,7 +291,7 @@ Example Result: `monitoring.googleapis.com/uptime_check/http_status has this val ## Configure the data source with provisioning -You can configure data sources using config files with Grafana's provisioning system. Read more about how it works and all the settings you can set for data sources on the [provisioning docs page]({{< relref "../../administration/provisioning/#datasources" >}}) +You can provision CloudWatch data source by modifying Grafana's configuration files. To learn more about provisioning and all the settings you can set, see the [provisioning documentation]({{< relref "../../administration/provisioning/#data-sources" >}}) Here is a provisioning example using the JWT (Service Account key file) authentication type. diff --git a/docs/sources/datasources/google-cloud-monitoring/google-authentication.md b/docs/sources/datasources/google-cloud-monitoring/google-authentication.md new file mode 100644 index 00000000000..18b54ff350f --- /dev/null +++ b/docs/sources/datasources/google-cloud-monitoring/google-authentication.md @@ -0,0 +1,39 @@ ++++ +title = "Authentication" +description = "Google authentication" +keywords = ["grafana", "google", "authentication"] +aliases = ["/docs/grafana/next/datasources/cloudmonitoring/"] +weight = 5 ++++ + +# Google authentication + +Requests from a Grafana plugin to Google are made on behalf of an IAM role or an IAM user. The IAM user or IAM role must have the associated policies to perform certain API actions. Since these policies are specific to each data source, refer to the data source documentation for details. All requests to Google APIs are performed on the server-side by the Grafana backend. + +You can authenticate a Grafana plugin to Google by uploading a Google JWT file or by automatically retrieving credentials from the Google metadata server. The latter option is only available when running Grafana on GCE virtual machine. + +## Using Google Service Account Key File + +To authenticate the Grafana plugin with the Google API, create a Google Cloud Platform (GCP) Service Account for the Project you want to show data. A Grafana data source integrates with one GCP Project. If you want to visualize data from multiple GCP Projects, then create one data source per GCP Project. + +### Create a GCP Service Account for a Project + +1. Navigate to the [APIs and Services Credentials page](https://console.cloud.google.com/apis/credentials). +1. Click on the **Create credentials** dropdown and select the **Service account** option. +1. In **Service account name**, enter a name for the account. +1. From the **Role** dropdown, choose the roles required by the specific plugin. +1. Click **Done**. +1. Use the newly created account to [create a service account key](https://cloud.google.com/iam/docs/creating-managing-service-account-keys#iam-service-account-keys-create-console). A JSON key file is created and downloaded to your computer. +1. Store this file in a secure place as it allows access to your Google data. +1. Upload the key to Grafana via the data source configuration page. + The file contents is encrypted and saved in the Grafana database. Don't forget to save the file after uploading! + +## Using GCE Default Service Account + +When Grafana is running on a Google Compute Engine (GCE) virtual machine, Grafana can automatically retrieve default credentials from the metadata server. As a result, there is no need to generate a private key file for the service account. You also do not need to upload the file to Grafana. The following preconditions must be met before Grafana can retrieve default credentials. + +- You must create a Service Account for use by the GCE virtual machine. For more information, refer to [Create new service account](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#createanewserviceaccount). +- Verify that the GCE virtual machine instance is running as the service account that you created. For more information, refer to [setting up an instance to run as a service account](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances#using). +- Allow access to the specified API scope. + +For more information about creating and enabling service accounts for GCE instances, refer to [enabling service accounts for instances in Google documentation](https://cloud.google.com/compute/docs/access/create-enable-service-accounts-for-instances). diff --git a/docs/sources/datasources/influxdb/_index.md b/docs/sources/datasources/influxdb/_index.md index 5a11458f3be..e9a0b3e477d 100644 --- a/docs/sources/datasources/influxdb/_index.md +++ b/docs/sources/datasources/influxdb/_index.md @@ -27,21 +27,19 @@ InfluxDB data source options differ depending on which [query language](#query-l These options apply if you are using the InfluxQL query language. If you are using Flux, refer to [Flux support in Grafana]({{< relref "influxdb-flux.md" >}}). -| Name | Description | -| --------- | -------------------------------------------------------------------------------------------------------------------------------------- | -| `Name` | The data source name. This is how you refer to the data source in panels and queries. We recommend something like `InfluxDB-InfluxQL`. | -| `Default` | Default data source means that it will be pre-selected for new panels. | -| `URL` | The HTTP protocol, IP address and port of your InfluxDB API. InfluxDB API port is by default 8086. | -| `Access` | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser. | - -**Note**: Browser access is deprecated and will be removed in a future release. -`Allowed cookies`| Cookies that will be forwarded to the data source. All other cookies will be deleted. -`Database` | The ID of the bucket you want to query from, copied from the [Buckets page](https://docs.influxdata.com/influxdb/v2.0/organizations/buckets/view-buckets/) of the InfluxDB UI. -`User` | The username you use to sign into InfluxDB. -`Password` | The token you use to query the bucket above, copied from the [Tokens page](https://docs.influxdata.com/influxdb/v2.0/security/tokens/view-tokens/) of the InfluxDB UI. -`HTTP mode` | How to query the database (`GET` or `POST` HTTP verb). The `POST` verb allows heavy queries that would return an error using the `GET` verb. Default is `GET`. -`Min time interval` | (Optional) Refer to [Min time interval]({{< relref "#min-time-interval" >}}). -`Max series`| (Optional) Limits the number of series/tables that Grafana processes. Lower this number to prevent abuse, and increase it if you have lots of small time series and not all are shown. Defaults to 1000. +| Name | Description | +| ------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `Name` | The data source name. This is how you refer to the data source in panels and queries. We recommend something like `InfluxDB-InfluxQL`. | +| `Default` | Default data source means that it will be pre-selected for new panels. | +| `URL` | The HTTP protocol, IP address and port of your InfluxDB API. InfluxDB API port is by default 8086. | +| `Access` | Server (default) = URL needs to be accessible from the Grafana backend/server, Browser = URL needs to be accessible from the browser. **Note**: Browser (direct) access is deprecated and will be removed in a future release. | +| `Allowed cookies` | Cookies that will be forwarded to the data source. All other cookies will be deleted. | +| `Database` | The ID of the bucket you want to query from, copied from the [Buckets page](https://docs.influxdata.com/influxdb/v2.0/organizations/buckets/view-buckets/) of the InfluxDB UI. | +| `User` | The username you use to sign into InfluxDB. | +| `Password` | The token you use to query the bucket above, copied from the [Tokens page](https://docs.influxdata.com/influxdb/v2.0/security/tokens/view-tokens/) of the InfluxDB UI. | +| `HTTP mode` | How to query the database (`GET` or `POST` HTTP verb). The `POST` verb allows heavy queries that would return an error using the `GET` verb. Default is `GET`. | +| `Min time interval` | (Optional) Refer to [Min time interval]({{< relref "#min-time-interval" >}}). | +| `Max series` | (Optional) Limits the number of series/tables that Grafana processes. Lower this number to prevent abuse, and increase it if you have lots of small time series and not all are shown. Defaults to 1000. | ### Flux @@ -120,6 +118,7 @@ You can switch to raw query mode by clicking hamburger icon and then `Switch edi - $m = replaced with measurement name - $measurement = replaced with measurement name +- $1 - $9 = replaced with part of measurement name (if you separate your measurement name with dots) - $col = replaced with column name - $tag_exampletag = replaced with the value of the `exampletag` tag. The syntax is `$tag*yourTagName`(must start with`$tag*`). To use your tag as an alias in the ALIAS BY field then the tag must be used to group by in the query. - You can also use [[tag_hostname]] pattern replacement syntax. For example, in the ALIAS BY field using this text `Host: [[tag_hostname]]` would substitute in the `hostname` tag value for each legend value and an example legend value would be: `Host: server1`. diff --git a/docs/sources/datasources/loki.md b/docs/sources/datasources/loki.md index 54ce2b1b6ee..ada73be0f69 100644 --- a/docs/sources/datasources/loki.md +++ b/docs/sources/datasources/loki.md @@ -66,7 +66,7 @@ You can use the Loki query editor to create log and metric queries. ### Log browser -With Loki log browser you can easily navigate trough your list of labels and values and construct the query of your choice. Log browser has multi-step selection: +With Loki log browser you can easily navigate through your list of labels and values and construct the query of your choice. Log browser has multi-step selection: 1. Choose the labels you would like to consider for your search. 2. Pick the values for selected labels. Log browser supports facetting and therefore it shows you only possible label combinations. diff --git a/docs/sources/datasources/mssql.md b/docs/sources/datasources/mssql.md index c17da7d81ce..89b04ec23ac 100644 --- a/docs/sources/datasources/mssql.md +++ b/docs/sources/datasources/mssql.md @@ -14,19 +14,19 @@ Grafana ships with a built-in Microsoft SQL Server (MS SQL) data source plugin t To access data source settings, hover your mouse over the **Configuration** (gear) icon, then click **Data Sources**, and then click the data source. -| Name | Description | -| ---------------- | ------------------------------------------------------------------------------------------------------------------------------------- | -| `Name` | The data source name. This is how you refer to the data source in panels and queries. | -| `Default` | Default data source means that it will be pre-selected for new panels. | -| `Host` | The IP address/hostname and optional port of your MS SQL instance. If the port is omitted, the driver default will be used (0). | -| `Database` | Name of your MS SQL database. | -| `Authentication` | Authentication mode. Either using SQL Server Authentication or Windows Authentication (single sign on for Windows users). | -| `User` | Database user's login/username | -| `Password` | Database user's password | -| `Encrypt` | This option determines whether or to which extent a secure SSL TCP/IP connection will be negotiated with the server, default `false`. | -| `Max open` | The maximum number of open connections to the database, default `unlimited`. | -| `Max idle` | The maximum number of connections in the idle connection pool, default `2`. | -| `Max lifetime` | The maximum amount of time in seconds a connection may be reused, default `14400`/4 hours. | +| Name | Description | +| ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `Name` | The data source name. This is how you refer to the data source in panels and queries. | +| `Default` | Default data source means that it will be pre-selected for new panels. | +| `Host` | The IP address/hostname and optional port of your MS SQL instance. If you omit the port, then the driver default is used (0). You can specify multiple connection properties such as ApplicationIntent using ';' character to separate each property. | +| `Database` | Name of your MS SQL database. | +| `Authentication` | Authentication mode. Either using SQL Server Authentication or Windows Authentication (single sign on for Windows users). | +| `User` | Database user's login/username | +| `Password` | Database user's password | +| `Encrypt` | This option determines whether or to which extent a secure SSL TCP/IP connection will be negotiated with the server, default `false`. | +| `Max open` | The maximum number of open connections to the database, default `unlimited`. | +| `Max idle` | The maximum number of connections in the idle connection pool, default `2`. | +| `Max lifetime` | The maximum amount of time in seconds a connection may be reused, default `14400`/4 hours. | ### Min time interval diff --git a/docs/sources/datasources/prometheus.md b/docs/sources/datasources/prometheus.md index e69be72ac45..ed3148eecfe 100644 --- a/docs/sources/datasources/prometheus.md +++ b/docs/sources/datasources/prometheus.md @@ -10,9 +10,7 @@ weight = 1300 Grafana includes built-in support for Prometheus. This topic explains options, variables, querying, and other options specific to the Prometheus data source. Refer to [Add a data source]({{< relref "add-a-data-source.md" >}}) for instructions on how to add a data source to Grafana. Only users with the organization admin role can add data sources. -## Hosted Prometheus - -Run Prometheus on your own hardware or use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-dashboards-grafana). The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs and more. [Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=doc-grafana-&plcmt=in-text). +> **Note:** You can use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-logs) to avoid the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs, and more.[Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-install&plcmt=in-text). ## Prometheus settings diff --git a/docs/sources/datasources/tempo.md b/docs/sources/datasources/tempo.md index 3886ee6640b..eeb5ad5d77e 100644 --- a/docs/sources/datasources/tempo.md +++ b/docs/sources/datasources/tempo.md @@ -36,7 +36,19 @@ This is a configuration for the [trace to logs feature]({{< relref "../explore/t - **Filter by Trace ID -** Toggle to append the trace ID to the Loki query. - **Filter by Span ID -** Toggle to append the span ID to the Loki query. -![Trace to logs settings](/static/img/docs/explore/trace-to-logs-settings-8-2.png 'Screenshot of the trace to logs settings') +{{< figure src="/static/img/docs/explore/traces-to-logs-settings-8-2.png" class="docs-image--no-shadow" caption="Screenshot of the trace to logs settings" >}} + +### Service Graph + +This is a configuration for the Service Graph feature. + +-- **Data source -** Prometheus instance where the Service Graph data is stored. + +### Search + +This is a configuration for Tempo search. + +-- **Hide search -** Optionally, hide the search query option in Explore in cases where search is not configured in the Tempo instance. ### Node Graph @@ -49,18 +61,16 @@ This is a configuration for the beta Node Graph visualization. The Node Graph is You can query and display traces from Tempo via [Explore]({{< relref "../explore/_index.md" >}}). You can search for traces if you set up the trace to logs setting in the data source configuration page. To find traces to visualize, use the [Loki query editor]({{< relref "loki.md#loki-query-editor" >}}). To get search results, you must have [derived fields]({{< relref "loki.md#derived-fields" >}}) configured, which point to this data source. -{{< figure src="/static/img/docs/tempo/query-editor-search.png" class="docs-image--no-shadow" caption="Screenshot of the Tempo query editor showing the search tab" >}} +{{< figure src="/static/img/docs/tempo/query-editor-search.png" class="docs-image--no-shadow" max-width="750px" caption="Screenshot of the Tempo query editor showing the search tab" >}} To query a particular trace, select the **TraceID** query type, and then put the ID into the Trace ID field. -{{< figure src="/static/img/docs/tempo/query-editor-traceid.png" class="docs-image--no-shadow" caption="Screenshot of the Tempo TraceID query type" >}} +{{< figure src="/static/img/docs/tempo/query-editor-traceid.png" class="docs-image--no-shadow" max-width="750px" caption="Screenshot of the Tempo TraceID query type" >}} ## Upload JSON trace file You can upload a JSON file that contains a single trace to visualize it. If the file has multiple traces then the first trace is used for visualization. -{{< figure src="/static/img/docs/explore/tempo-upload-json.png" class="docs-image--no-shadow" caption="Screenshot of the Tempo data source in explore with upload selected" >}} - Here is an example JSON: ```json @@ -105,6 +115,67 @@ Here is an example JSON: } ``` +## Service Graph + +A service graph is a visual representation of the relationships between services. Each node on the graph represents a service such as an API or database. With this graph, customers can easily detect performance issues, increases in error, fault, or throttle rates in any of their services, and dive deep into corresponding traces and root causes. + +![Node graph panel](/static/img/docs/node-graph/node-graph-8-0.png 'Node graph') + +To display the service graph: + +- [Configure the Grafana Agent](https://grafana.com/docs/tempo/next/grafana-agent/service-graphs/#quickstart) to generate service graph data +- Link a Prometheus datasource in the Tempo datasource settings. +- Navigate to [Explore]({{< relref "../explore/_index.md" >}}) +- Select the Tempo datasource +- Select the **Service Graph** query type and run the query +- Optionally, filter by service name + +You can pan and zoom the view with buttons or you mouse. For details about the visualization, refer to [Node graph panel](https://grafana.com/docs/grafana/latest/panels/visualizations/node-graph/). + +Each service in the graph is represented as a circle. Numbers on the inside shows average time per request and request per second. + +The color of each circle represents the percentage of requests in each of the following states: + +- green = success +- red = fault +- yellow = errors +- purple = throttled responses + +Click on the service to see a context menu with additional links for quick navigation to other relevant information. + ## Linking Trace ID from logs You can link to Tempo trace from logs in Loki or Elastic by configuring an internal link. See the [Derived fields]({{< relref "loki.md#derived-fields" >}}) section in the [Loki data source]({{< relref "loki.md" >}}) or [Data links]({{< relref "elasticsearch.md#data-links" >}}) section in the [Elastic data source]({{< relref "elasticsearch.md" >}}) for configuration instructions. + +## Provision the Tempo data source + +You can modify the Grafana configuration files to provision the Tempo data source. Read more about how it works and all the settings you can set for data sources on the [provisioning]({{< relref "../administration/provisioning/#datasources" >}}) topic. + +Here is an example config: + +```yaml +apiVersion: 1 + +datasources: + - name: Tempo + type: tempo + # Access mode - proxy (server in the UI) or direct (browser in the UI). + access: proxy + url: http://localhost:3200 + jsonData: + httpMethod: GET + tracesToLogs: + datasourceUid: 'loki' + tags: ['job', 'instance', 'pod', 'namespace'] + spanStartTimeShift: '1h' + spanEndTimeShift: '1h' + filterByTraceID: false + filterBySpanID: false + lokiSearch: true + serviceMap: + datasourceUid: 'prometheus' + search: + hide: false + nodeGraph: + enabled: true +``` diff --git a/docs/sources/developers/plugins/_index.md b/docs/sources/developers/plugins/_index.md index b5cbf57da68..cd20612d542 100644 --- a/docs/sources/developers/plugins/_index.md +++ b/docs/sources/developers/plugins/_index.md @@ -76,9 +76,9 @@ Learn more about Grafana options and packages. #### Typescript -- [Grafana Data]({{< relref "../../packages_api/data/_index.md" >}}) -- [Grafana Runtime]({{< relref "../../packages_api/runtime/_index.md" >}}) -- [Grafana UI]({{< relref "../../packages_api/ui/_index.md" >}}) +- Grafana Data +- Grafana Runtime +- Grafana UI #### Go diff --git a/docs/sources/developers/plugins/add-support-for-annotations.md b/docs/sources/developers/plugins/add-support-for-annotations.md index 201cf5bab50..d9c980a2986 100644 --- a/docs/sources/developers/plugins/add-support-for-annotations.md +++ b/docs/sources/developers/plugins/add-support-for-annotations.md @@ -24,7 +24,7 @@ To enable annotation support for your data source, add the following two lines o } ``` -2. In `datasource.ts`, override the `annotations` property from `DataSourceApi`. For the default behavior, you can set `annotations` to an empty object. +2. In `datasource.ts`, override the `annotations` property from `DataSourceApi` (or `DataSourceWithBackend` for backend data sources). For the default behavior, you can set `annotations` to an empty object. **datasource.ts** diff --git a/docs/sources/developers/plugins/add-support-for-explore-queries.md b/docs/sources/developers/plugins/add-support-for-explore-queries.md index 0a842a84960..be4ef28037f 100644 --- a/docs/sources/developers/plugins/add-support-for-explore-queries.md +++ b/docs/sources/developers/plugins/add-support-for-explore-queries.md @@ -46,7 +46,7 @@ The query editor for Explore is similar to the query editor for the data source .setExploreQueryField(ExploreQueryEditor); ``` -1. Add a [QueryField]({{< relref "../../packages_api/ui/queryfield.md" >}}) to `ExploreQueryEditor`. +1. Add a `QueryField` to `ExploreQueryEditor`. ```ts import { QueryField } from '@grafana/ui'; diff --git a/docs/sources/developers/plugins/add-support-for-variables.md b/docs/sources/developers/plugins/add-support-for-variables.md index 02b8ce0576f..ee2916dea19 100644 --- a/docs/sources/developers/plugins/add-support-for-variables.md +++ b/docs/sources/developers/plugins/add-support-for-variables.md @@ -24,7 +24,7 @@ Grafana provides a couple of helper functions to interpolate variables in a stri ## Interpolate variables in panel plugins -For panels, the [replaceVariables]({{< relref "../../packages_api/data/panelprops.md#replacevariables-property" >}}) function is available in the [PanelProps]({{< relref "../../packages_api/data/panelprops.md" >}}). +For panels, the `replaceVariables` function is available in the PanelProps. Add `replaceVariables` to the argument list, and pass it a user-defined template string. @@ -38,7 +38,7 @@ export const SimplePanel: React.FC = ({ options, data, width, height, rep ## Interpolate variables in data source plugins -For data sources, you need to use the [getTemplateSrv]({{< relref "../../packages_api/runtime/gettemplatesrv.md" >}}), which returns an instance of [TemplateSrv]({{< relref "../../packages_api/runtime/templatesrv.md" >}}). +For data sources, you need to use the getTemplateSrv, which returns an instance of TemplateSrv. 1. Import `getTemplateSrv` from the `runtime` package. @@ -80,7 +80,7 @@ For more information on the available variable formats, refer to [Advanced varia ## Set a variable from your plugin -Not only can you read the value of a variable, you can also update the variable from your plugin. Use [LocationSrv.update()]({{< relref "../../packages_api/runtime/locationsrv.md/#update-method" >}}) to update a variable using query parameters. +Not only can you read the value of a variable, you can also update the variable from your plugin. Use LocationSrv.update() The following example shows how to update a variable called `service`. @@ -117,7 +117,7 @@ export interface MyVariableQuery { } ``` -For a data source to support query variables, you must override the [`metricFindQuery`]({{< relref "../../packages_api/data/datasourceapi.md#metricfindquery-method" >}}) in your `DataSourceApi` class. `metricFindQuery` returns an array of [`MetricFindValue`]({{< relref "../../packages_api/data/metricfindvalue.md" >}}) which has a single property, `text`: +For a data source to support query variables, you must override the `metricFindQuery` in your `DataSourceApi` class. `metricFindQuery` returns an array of `MetricFindValue` which has a single property, `text`: ```ts async metricFindQuery(query: MyVariableQuery, options?: any) { diff --git a/docs/sources/developers/plugins/build-a-logs-data-source-plugin.md b/docs/sources/developers/plugins/build-a-logs-data-source-plugin.md index 74706101655..698820ebc54 100644 --- a/docs/sources/developers/plugins/build-a-logs-data-source-plugin.md +++ b/docs/sources/developers/plugins/build-a-logs-data-source-plugin.md @@ -74,7 +74,7 @@ const frame = new MutableDataFrame({ To help filter log lines, many log systems let you query logs based on metadata, or _labels_. -You can add labels to a stream of logs by setting the [labels](../../packages_api/data/field.md#labels-property) property on the [Field]({{< relref "../../packages_api/data/field.md" >}}). +You can add labels to a stream of logs by setting the labels property on the Field. **Example**: diff --git a/docs/sources/developers/plugins/legacy/defaults-and-editor-mode.md b/docs/sources/developers/plugins/legacy/defaults-and-editor-mode.md index 682e250ac01..a4648e67f25 100644 --- a/docs/sources/developers/plugins/legacy/defaults-and-editor-mode.md +++ b/docs/sources/developers/plugins/legacy/defaults-and-editor-mode.md @@ -104,9 +104,9 @@ Note that there are some Angular attributes here. _ng-model_ will update the pan {{< figure class="float-right" src="/assets/img/blog/clock-panel-editor.png" caption="Panel Editor" >}} -On the editor tab we use a drop down for 12/24 hour clock, an input field for font size and a color picker for the background color. +On the editor tab we use a drop-down for 12/24 hour clock, an input field for font size and a color picker for the background color. -The drop down/select has its own _gf-form-select-wrapper_ css class and looks like this: +The drop-down/select has its own _gf-form-select-wrapper_ css class and looks like this: ```html
diff --git a/docs/sources/developers/plugins/migration-guide.md b/docs/sources/developers/plugins/migration-guide.md index 1b49382b2f7..8261bc77b7f 100644 --- a/docs/sources/developers/plugins/migration-guide.md +++ b/docs/sources/developers/plugins/migration-guide.md @@ -17,7 +17,7 @@ This guide helps you identify the steps you need to take based on the Grafana ve - [1. Add dependency on grafana-plugin-sdk-go](#1-add-dependency-on-grafana-plugin-sdk-go) - [2. Update the way you bootstrap your plugin](#2-update-the-way-you-bootstrap-your-plugin) - [3. Update the plugin package](#3-update-the-plugin-package) - - [Unsigned backend plugins will not be loaded](#unsigned-backend-plugins-will-not-be-loaded) + - [Sign and load backend plugins](#sign-and-load-backend-plugins) - [Update react-hook-form from v6 to v7](#update-react-hook-form-from-v6-to-v7) - [Update the plugin.json](#update-the-pluginjson) - [Update imports to match emotion 11](#update-imports-to-match-emotion-11) diff --git a/docs/sources/developers/plugins/package-a-plugin.md b/docs/sources/developers/plugins/package-a-plugin.md index 0a4a37094ba..790b6aab620 100644 --- a/docs/sources/developers/plugins/package-a-plugin.md +++ b/docs/sources/developers/plugins/package-a-plugin.md @@ -40,8 +40,62 @@ There are three steps needed to package a plugin: zip myorg-simple-panel-1.0.0.zip myorg-simple-panel -r ``` -## Publish your plugin on Grafana.com +# Publish your plugin on Grafana.com The best way to share your plugin with the world is to publish it on [Grafana Plugins](https://grafana.com/plugins). By having your plugin published on Grafana.com, more users will be able to discover your plugin. -To publish a plugin to [Grafana Plugins](https://grafana.com/grafana/plugins), create a pull request to the [Grafana Plugin Repository](https://github.com/grafana/grafana-plugin-repository). Please note that both the source code and the packaged plugin archive need to be publicly available. +Before you submit your plugin, we ask that you read our guidelines and frequently asked questions. + +## Guidelines + +To speed up the time it takes to review your plugin: + +- Check that your plugin is ready for review using the [plugin validator](https://github.com/grafana/plugin-validator). +- Read our [6 tips for improving your Grafana plugin before you publish](https://grafana.com/blog/2021/01/21/6-tips-for-improving-your-grafana-plugin-before-you-publish/). + +## Frequently Asked Questions + +**Do I need to submit a private plugin?** + +- No. Please only submit plugins that you wish to make publicly available for the Grafana community. + +**How long does it take to review my submission?** + +- We're not able to give an estimate at this time, though we're constantly working on improving the time it takes to review a plugin. + +## Publishing your plugin for the first time + +{{< figure src="/static/img/docs/plugins/plugins-submission-create.png" class="docs-image--no-shadow" max-width="850px" >}} + +1. [Sign in](https://grafana.com/auth/sign-in) to your Grafana Cloud account. +1. In the left menu, under **Org settings**, click **My Plugins**. +1. Click **Submit Plugin**. +1. Enter the information requested by the form. + - **OS & Architecture:** + - Select **Single** if your plugin archive contains binaries for multiple architectures. + - Select **Multiple** if you'd like to submit separate plugin archives for each architecture. This can lead to faster downloads since users can select the specific architecture on which they want to install the plugin. + - **URL:** A URL that points to a ZIP archive of your packaged plugin. + - **MD5:** The MD5 hash of the plugin specified by the **URL**. + - The remaining questions help us determine the [signature level](https://grafana.com/docs/grafana/latest/plugins/plugin-signatures/#plugin-signature-levels) for your plugin. +1. Click **Submit**. + After you have submitted your plugin, we run an automated validation to make sure it adheres to our guidelines. Once your submission passes the validation, it's placed in a review queue. + +All submissions are manually inspected by a plugin reviewer. For every new plugin, we perform a manual review that includes the following checks: + +- **Code review:** For quality and security purposes, we review the source code for the plugin. If you're unable to make the source code publicly available, let us know in a comment on your plugin submission. +- **Tests:** We install your plugin on one of our Grafana instances to test it for basic use. For more advanced plugins, we may ask you to assist us in configuring a test environment for the plugin. This test environment will be used whenever you submit an plugin update. + +## Maintain your plugin + +To submit an **update** for an already published plugin: + +1. [Sign in](https://grafana.com/auth/sign-in) to your Grafana Cloud account. +1. In the left menu, under **Org settings**, click **My Plugins**. +1. Click **Submit Update** for the plugin you want to update. +1. Enter the information requested by the form. + - **OS & Architecture:** + - Select **Single** if your plugin archive contains binaries for multiple architectures. + - Select **Multiple** if you'd like to submit separate plugin archives for each architecture. This can lead to faster downloads since users can select the specific architecture they want to install the plugin on. + - **URL:** A URL that points to a ZIP archive of your packaged plugin. + - **MD5:** The MD5 hash of the plugin specified by the **URL**. +1. Click **Submit**. diff --git a/docs/sources/developers/plugins/publishing-and-signing-criteria.md b/docs/sources/developers/plugins/publishing-and-signing-criteria.md new file mode 100644 index 00000000000..46b81fe9875 --- /dev/null +++ b/docs/sources/developers/plugins/publishing-and-signing-criteria.md @@ -0,0 +1,27 @@ ++++ +title = "Plugin publishing and signing criteria" ++++ + +# Plugin publishing and signing criteria + +Grafana plugins must adhere to the following criteria when being reviewed for publishing and signing. + +## Privacy and security + +- Plugins cannot collect usage or user information. Violations of this include but is not limited to: + - Directly collecting installation and user statistics + - Sending data to 3rd parties for analytics purposes + - Embedding tracking code +- Data at rest: sensitive data such as credentials and user information, must be encrypted using industry standards. + - Use secureJsonData to store data source credentials + - Secrets cannot be stored in panel options +- Data transmission: secure methods that meet industry standard encryption levels should be used, such as Secure Sockets Layer (SSL) or Transport Layer Security (TLS) +- Abuse: plugins should not perform actions beyond the scope of the intended use. + - Do not include hidden files + - Do not manipulate the underlying environment, privileges, or related processes + +## Commercial + +- Usage of 3rd party software or dependencies within the plugin must be licensed for the intended use. For example, using open source dependencies must be credited/licensed; embedding logos or trademarks; + +Grafana Labs reserves the right to decline or remove any plugin at its discretion. Failure to comply with publishing and signing criteria may result in immediate removal from the Grafana plugin catalog. diff --git a/docs/sources/developers/plugins/working-with-data-frames.md b/docs/sources/developers/plugins/working-with-data-frames.md index 1c67a8c7aba..1cfc9eead04 100644 --- a/docs/sources/developers/plugins/working-with-data-frames.md +++ b/docs/sources/developers/plugins/working-with-data-frames.md @@ -6,7 +6,7 @@ title = "Working with data frames" The data frame is a columnar data structure which allows efficient querying of large amounts of data. Since data frames are a central concept when developing plugins for Grafana, in this guide we'll look at some ways you can use them. -The [DataFrame]({{< relref "../../packages_api/data/dataframe.md" >}}) interface contains a `name` and an array of `fields` where each field contains the name, type, and the values for the field. +The DataFrame interface contains a `name` and an array of `fields` where each field contains the name, type, and the values for the field. > **Note:** If you're looking to migrate an existing plugin to use the data frame format, refer to [Migrate to data frames]({{< relref "migration-guide.md#migrate-to-data-frames" >}}). @@ -14,7 +14,7 @@ The [DataFrame]({{< relref "../../packages_api/data/dataframe.md" >}}) interface If you build a data source plugin, then you'll most likely want to convert a response from an external API to a data frame. Let's look at how to create a data frame. -Let's start with creating a simple data frame that represents a time series. The easiest way to create a data frame is to use the [toDataFrame]({{< relref "../../packages_api/data/todataframe.md" >}}) function. +Let's start with creating a simple data frame that represents a time series. The easiest way to create a data frame is to use the toDataFrame function. ```ts // Need to be of the same length. @@ -78,7 +78,7 @@ for (let i = 0; i < frame.length; i++) { } ``` -Alternatively, you can use the [DataFrameView]({{< relref "../../packages_api/data/dataframeview.md" >}}), which gives you an array of objects that contain a property for each field in the frame. +Alternatively, you can use the DataFrameView, which gives you an array of objects that contain a property for each field in the frame. ```ts const view = new DataFrameView(frame); @@ -113,7 +113,7 @@ return ( ); ``` -To apply field options to the name of a field, use [getFieldDisplayName]({{< relref "../../packages_api/data/getfielddisplayname.md" >}}). +To apply field options to the name of a field, use getFieldDisplayName. ```ts const valueField = frame.fields.find((field) => field.type === FieldType.number); diff --git a/docs/sources/enterprise/access-control/_index.md b/docs/sources/enterprise/access-control/_index.md index 14b959bb0d7..7cb95a794bb 100644 --- a/docs/sources/enterprise/access-control/_index.md +++ b/docs/sources/enterprise/access-control/_index.md @@ -21,18 +21,23 @@ Fine-grained access control considers a) _who_ has an access (`identity`), and b You can grant, change, or revoke access to _users_ (`identity`). When an authenticated user tries to access a Grafana resource, the authorization system checks the required fine-grained permissions for the resource and determines whether or not the action is allowed. Refer to [Fine-grained permissions]({{< relref "./permissions.md" >}}) for a complete list of available permissions. -To grant or revoke access to your users, create or remove built-in role assignments. For more information, refer to [Built-in role assignments]({{< relref "./roles.md#built-in-role-assignments" >}}). +Refer to [Assign roles]({{< relref "./roles.md#assign-roles" >}}) to learn about grant or revoke access to your users. ## Resources with fine-grained permissions -Fine-grained access control is currently available for [Reporting]({{< relref "../reporting.md" >}}) and [Managing Users]({{< relref "../../manage-users/_index.md" >}}). -To learn more about specific endpoints where you can use access control, refer to [Permissions]({{< relref "./permissions.md" >}}) and to the relevant API guide: +Fine-grained access control is available for the following capabilities: -- [Fine-grained access control API]({{< relref "../../http_api/access_control.md" >}}) -- [Admin API]({{< relref "../../http_api/admin.md" >}}) -- [Organization API]({{< relref "../../http_api/org.md" >}}) -- [Reporting API]({{< relref "../../http_api/reporting.md" >}}) -- [User API]({{< relref "../../http_api/user.md" >}}) +- [Use Explore mode]({{< relref "../../explore/_index.md" >}}) +- [Manage users]({{< relref "../../manage-users/_index.md" >}}) +- [Manage LDAP authentication]({{< relref "../../auth/ldap/_index.md" >}}) +- [Manage data sources]({{< relref "../../datasources/_index.md" >}}) +- [Manage data source permissions]({{< relref "../datasource_permissions.md" >}}) +- [Manage a Grafana Enterprise license]({{< relref "../license/_index.md" >}}) +- [Provision Grafana]({{< relref "../../administration/provisioning/_index.md" >}}) +- [Manage reports]({{< relref "../reporting.md" >}}) +- [View server information]({{< relref "../../administration/view-server/_index.md" >}}) + +To learn about specific endpoints where you can use fine-grained access control, refer to [Permissions]({{< relref "./permissions.md" >}}) and to the relevant [API]({{< relref "../../http_api/_index.md" >}}) documentation. ## Enable fine-grained access control diff --git a/docs/sources/enterprise/access-control/fine-grained-access-control-references.md b/docs/sources/enterprise/access-control/fine-grained-access-control-references.md index cfcefde765f..36e1e83342b 100644 --- a/docs/sources/enterprise/access-control/fine-grained-access-control-references.md +++ b/docs/sources/enterprise/access-control/fine-grained-access-control-references.md @@ -11,34 +11,40 @@ The reference information that follows complements conceptual information about ## Fine-grained access fixed roles -| Fixed roles | Permissions | Descriptions | -| ------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------- | -| `fixed:permissions:admin:read` | `roles:read`
`roles:list`
`roles.builtin:list` | Allows to list and get available roles and built-in role assignments. | -| `fixed:permissions:admin:edit` | All permissions from `fixed:permissions:admin:read` and
`roles:write`
`roles:delete`
`roles.builtin:add`
`roles.builtin:remove` | Allows every read action and in addition allows to create, change and delete custom roles and create or remove built-in role assignments. | -| `fixed:provisioning:admin` | `provisioning:reload` | Allow provisioning configurations to be reloaded. | -| `fixed:reporting:admin:read` | `reports:read`
`reports:send`
`reports.settings:read` | Allows to read reports and report settings. | -| `fixed:reporting:admin:edit` | All permissions from `fixed:reporting:admin:read` and
`reports.admin:write`
`reports:delete`
`reports.settings:write` | Allows every read action for reports and in addition allows to administer reports. | -| `fixed:users:admin:read` | `users.authtoken:list`
`users.quotas:list`
`users:read`
`users.teams:read` | Allows to list and get users and related information. | -| `fixed:users:admin:edit` | All permissions from `fixed:users:admin:read` and
`users.password:update`
`users:write`
`users:create`
`users:delete`
`users:enable`
`users:disable`
`users.permissions:update`
`users:logout`
`users.authtoken:update`
`users.quotas:update` | Allows every read action for users and in addition allows to administer users. | -| `fixed:users:org:read` | `org.users:read` | Allows to get user organizations. | -| `fixed:users:org:edit` | All permissions from `fixed:users:org:read` and
`org.users:add`
`org.users:remove`
`org.users.role:update` | Allows every read action for user organizations and in addition allows to administer user organizations. | -| `fixed:ldap:admin:read` | `ldap.user:read`
`ldap.status:read` | Allows to read LDAP information and status. | -| `fixed:ldap:admin:edit` | All permissions from `fixed:ldap:admin:read` and
`ldap.user:sync`
`ldap.config:reload` | Allows every read action for LDAP and in addition allows to administer LDAP. | -| `fixed:server:admin:read` | `server.stats:read` | Read server stats | -| `fixed:settings:admin:read` | `settings:read` | Read settings | -| `fixed:settings:admin:edit` | All permissions from `fixed:settings:admin:read` and
`settings:write` | Update settings | -| `fixed:datasources:editor:read` | `datasources:explore` | Allows to access the **Explore** tab | -| `fixed:datasources:admin` | `datasources:read`
`datasources:create`
`datasources:write`
`datasources:delete` | Allows to create, read, update, delete data sources. | -| `fixed:datasources:id:viewer` | `datasources.id:read` | Allows to read data source IDs. | -| `fixed:datasources:permissions:admin` | `datasources.permissions:create`
`datasources.permissions:read`
`datasources.permissions:delete`
`datasources.permissions:toggle` | Allows to create, read, delete, enable, or disable data source permissions | -| `fixed:licensing:viewer` | `licensing:read`
`licensing.reports:read` | Read licensing information and custom permission reports. | -| `fixed:licensing:editor` | All permissions from `fixed:licensing:viewer` and
`licensing:update`
`licensing:delete` | Read licensing information and custom permission reports, and update and delete the license token. | +| Fixed roles | Permissions | Descriptions | +| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `fixed:roles:reader` | `roles:read`
`roles:list`
`users.roles:list`
`users.permissions:list`
`roles.builtin:list` | Read all access control roles, roles and permissions assigned to users and built-in role assignments. | +| `fixed:roles:writer` | All permissions from `fixed:roles:reader` and
`roles:write`
`roles:delete`
`users.roles:add`
`users.roles:remove`
`roles.builtin:add`
`roles.builtin:remove` | Create, read, update, or delete all roles, assign or unassign roles to users and built-in role assignments. | +| `fixed:reports:reader` | `reports:read`
`reports:send`
`reports.settings:read` | Read all reports and shared report settings. | +| `fixed:reports:writer` | All permissions from `fixed:reports:reader` and
`reports.admin:write`
`reports:delete`
`reports.settings:write` | Create, read, update, or delete all reports and shared report settings. | +| `fixed:users:reader` | `users:read`
`users.quotas:list`
`users.authtoken:list`
`users.teams:read` | Read all users and their information, such as team memberships, authentication tokens, and quotas. | +| `fixed:users:writer` | All permissions from `fixed:users:reader` and
`users:write`
`users:create`
`users:delete`
`users:enable`
`users:disable`
`users.password:update`
`users.permissions:update`
`users:logout`
`users.authtoken:update`
`users.quotas:update` | Read and update all attributes and settings for all users in Grafana: update user information, read user information, create or enable or disable a user, make a user a Grafana administrator, sign out a user, update a user’s authentication token, or update quotas for all users. | +| `fixed:org.users:reader` | `org.users:read` | Read users within a single organization. | +| `fixed:org.users:writer` | All permissions from `fixed:org.users:reader` and
`org.users:add`
`org.users:remove`
`org.users.role:update` | Within a single organization, add a user, invite a user, read information about a user and their role, remove a user from that organization, or change the role of a user. | +| `fixed:ldap:reader` | `ldap.user:read`
`ldap.status:read` | Read the LDAP configuration and LDAP status information. | +| `fixed:ldap:writer` | All permissions from `fixed:ldap:reader` and
`ldap.user:sync`
`ldap.config:reload` | Read and update the LDAP configuration, and read LDAP status information. | +| `fixed:stats:reader` | `server.stats:read` | Read Grafana instance statistics. | +| `fixed:settings:reader` | `settings:read` | Read Grafana instance settings. | +| `fixed:settings:writer` | All permissions from `fixed:settings:reader` and
`settings:write` | Read and update Grafana instance settings. | +| `fixed:datasources:explorer` | `datasources:explore` | Enable the Explore feature. Data source permissions still apply, you can only query data sources for which you have query permissions. | +| `fixed:datasources:reader` | `datasources:read`
`datasources:query` | Read and query data sources. | +| `fixed:datasources:writer` | All permissions from `fixed:datasources:reader` and
`datasources:create`
`datasources:write`
`datasources:delete` | Read, query, create, delete, or update a data source. | +| `fixed:datasources:id:reader` | `datasources.id:read` | Read the ID of a data source based on its name. | +| `fixed:datasources.permissions:reader` | `datasources.permissions:read` | Read data source permissions. | +| `fixed:datasources.permissions:writer` | All permissions from `fixed:datasources.permissions:reader` and
`datasources.permissions:write` | Create, read, or delete permissions of a data source. | +| `fixed:licensing:reader` | `licensing:read`
`licensing.reports:read` | Read licensing information and licensing reports. | +| `fixed:licensing:writer` | All permissions from `fixed:licensing:viewer` and
`licensing:update`
`licensing:delete` | Read licensing information and licensing reports, update and delete the license token. | +| `fixed:provisioning:writer` | `provisioning:reload` | Reload provisioning. | +| `fixed:organization:reader` | `orgs:read`
`orgs.quotas:read` | Read an organization and its quotas. | +| `fixed:organization:writer` | All permissions from `fixed:organization:reader` and
`orgs:write`
`orgs.preferences:read`
`orgs.preferences:write` | Read an organization, its quotas, or its preferences. Update organization properties, or its preferences. | +| `fixed:organization:maintainer` | All permissions from `fixed:organization:reader` and
`orgs:write`
`orgs:create`
`orgs:delete`
`orgs.quotas:write` | Create, read, write, or delete an organization. Read or write its quotas. This role needs to be assigned globally. | +| | ## Default built-in role assignments -| Built-in role | Associated role | Description | -| ------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | -| Grafana Admin | `fixed:permissions:admin:edit`
`fixed:permissions:admin:read`
`fixed:provisioning:admin`
`fixed:reporting:admin:edit`
`fixed:reporting:admin:read`
`fixed:users:admin:edit`
`fixed:users:admin:read`
`fixed:users:org:edit`
`fixed:users:org:read`
`fixed:ldap:admin:edit`
`fixed:ldap:admin:read`
`fixed:server:admin:read`
`fixed:settings:admin:read`
`fixed:settings:admin:edit`
`fixed:licensing:editor` | Default [Grafana server administrator]({{< relref "../../permissions/_index.md#grafana-server-admin-role" >}}) assignments. | -| Admin | `fixed:users:org:edit`
`fixed:users:org:read`
`fixed:reporting:admin:edit`
`fixed:reporting:admin:read`
`fixed:datasources:admin`
`fixed:datasources:permissions:admin` | Default [Grafana organization administrator]({{< relref "../../permissions/organization_roles.md" >}}) assignments. | -| Editor | `fixed:datasources:editor:read` | Default [Editor]({{< relref "../../permissions/organization_roles.md" >}}) assignments. | -| Viewer | `fixed:datasources:id:viewer` | Default [Viewer]({{< relref "../../permissions/organization_roles.md" >}}) assignments. | +| Built-in role | Associated role | Description | +| ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Grafana Admin | `fixed:roles:reader`
`fixed:roles:writer`
`fixed:users:reader`
`fixed:users:writer`
`fixed:org.users:reader`
`fixed:org.users:writer`
`fixed:ldap:reader`
`fixed:ldap:writer`
`fixed:stats:reader`
`fixed:settings:reader`
`fixed:settings:writer`
`fixed:provisioning:writer`
`fixed:organization:reader`
`fixed:organization:maintainer`
`fixed:licensing:reader`
`fixed:licensing:writer` | Default [Grafana server administrator]({{< relref "../../permissions/_index.md#grafana-server-admin-role" >}}) assignments. | +| Admin | `fixed:reports:reader`
`fixed:reports:writer`
`fixed:datasources:reader`
`fixed:datasources:writer`
`fixed:organization:writer`
`fixed:datasources.permissions:reader`
`fixed:datasources.permissions:writer`
| Default [Grafana organization administrator]({{< relref "../../permissions/organization_roles.md" >}}) assignments. | +| Editor | `fixed:datasources:explorer` | Default [Editor]({{< relref "../../permissions/organization_roles.md" >}}) assignments. | +| Viewer | `fixed:datasources:id:reader`
`fixed:organization:reader` | Default [Viewer]({{< relref "../../permissions/organization_roles.md" >}}) assignments. | diff --git a/docs/sources/enterprise/access-control/manage-role-assignments/_index.md b/docs/sources/enterprise/access-control/manage-role-assignments/_index.md new file mode 100644 index 00000000000..25b93e3abe1 --- /dev/null +++ b/docs/sources/enterprise/access-control/manage-role-assignments/_index.md @@ -0,0 +1,15 @@ ++++ +title = "Manage role assignments" +description = "" +keywords = ["grafana", "fine-grained-access-control", "roles", "permissions", "enterprise"] +weight = 115 ++++ + +# Manage role assignments + +To grant or revoke access to your users, you can assign [Roles]({{< relref "../roles.md" >}}) to users, [Organization roles]({{< relref "../../../permissions/organization_roles.md" >}}) and [Grafana Server Admin]({{< relref "../../../permissions/_index.md#grafana-server-admin-role" >}}) role. + +The following pages provide more information on how to manage role assignments: + +- [Manage user role assignments]({{< relref "manage-user-role-assignments.md" >}}). +- [Manage role assignments to Organization roles and Grafana Server Admin role]({{< relref "manage-built-in-role-assignments.md" >}}). diff --git a/docs/sources/enterprise/access-control/manage-role-assignments/manage-built-in-role-assignments.md b/docs/sources/enterprise/access-control/manage-role-assignments/manage-built-in-role-assignments.md new file mode 100644 index 00000000000..1409b7bcad1 --- /dev/null +++ b/docs/sources/enterprise/access-control/manage-role-assignments/manage-built-in-role-assignments.md @@ -0,0 +1,19 @@ ++++ +title = "Manage built-in role assignments" +description = "Manage built-in role assignments" +keywords = ["grafana", "fine-grained-access-control", "roles", "permissions", "fine-grained-access-control-usage", "enterprise"] +weight = 210 ++++ + +# Built-in role assignments + +To control what your users can access or not, you can assign or unassign [Custom roles]({{< ref "#custom-roles" >}}) or [Fixed roles]({{< ref "#fixed-roles" >}}) to the existing [Organization roles]({{< relref "../../../permissions/organization_roles.md" >}}) or to [Grafana Server Admin]({{< relref "../../../permissions/_index.md#grafana-server-admin-role" >}}) role. +These assignments are called built-in role assignments. + +During startup, Grafana will create default assignments for you. When you make any changes to the built-on role assignments, Grafana will take them into account and won’t overwrite during next start. + +For more information, refer to [Fine-grained access control references]({{< relref "../fine-grained-access-control-references.md#default-built-in-role-assignments" >}}). + +# Manage built-in role assignments + +You can create or remove built-in role assignments using [Fine-grained access control API]({{< relref "../../../http_api/access_control.md#create-and-remove-built-in-role-assignments" >}}) or using [Grafana Provisioning]({{< relref "../provisioning.md#manage-default-built-in-role-assignments" >}}). diff --git a/docs/sources/enterprise/access-control/manage-role-assignments/manage-user-role-assignments.md b/docs/sources/enterprise/access-control/manage-role-assignments/manage-user-role-assignments.md new file mode 100644 index 00000000000..e537fe6d2bd --- /dev/null +++ b/docs/sources/enterprise/access-control/manage-role-assignments/manage-user-role-assignments.md @@ -0,0 +1,64 @@ ++++ +title = "Manage user role assignments" +description = "Manage user role assignments" +keywords = ["grafana", "fine-grained-access-control", "roles", "permissions", "fine-grained-access-control-usage", "enterprise"] +weight = 200 ++++ + +# Manage user role assignments + +There are two ways to assign roles directly to users: in the UI using the role picker, and using the API. + +## Manage users' roles within a specific Organization using the role picker + +In order to assign roles to a user within a specific Organization using the role picker, you must have a user account with one of the following: + +- The Admin built-in role. +- The Server Admin role. +- The fixed role `fixed:permissions:writer`, [assigned for the given Organization]({{< relref "../roles/#scope-of-assignments" >}}). +- A custom role with `users.roles:add` and `users.roles:remove` permissions. + +You must also have the permissions granted by the roles that you want to assign or revoke. + +Steps: + +1. Navigate to the Users Configuration page by hovering over **Configuration** (the gear icon) in the left navigation menu and selecting **Users**. +1. Click on the **Role** column in the row for the user whose role you would like to edit. +1. Deselect one or more selected roles that you would like to remove from that user. +1. Select one or more roles that you would like to assign to that user. +1. Click the **Apply** button to apply the selected roles to that user. + +![User role picker in Organization](/static/img/docs/enterprise/user_role_picker_global.png) + +The user's permissions will update immediately, and the UI will reflect their new permissions the next time they reload their browser or visit a new page. + +**Note**: The roles that you select will be assigned only within the given Organization. For example, if you grant the user the "Data source editor" role while you are in the main Organization, then that user will be able to edit data source in the main Organization but not in others. + +## Manage users' roles in multiple Organizations using the role picker + +In order to assign roles across multiple Organizations to a user using the role picker, you must have a user account with one of the following: + +- The Server Admin built-in role +- The fixed role `fixed:permissions:writer`, [assigned globally]({{< relref "../roles/#scope-of-assignments" >}}). +- A custom role with `users.roles:add` and `users.roles:remove` permissions, [assigned globally]({{< relref "../roles/#scope-of-assignments" >}}). + +You must also have the permissions granted by the roles that you want to assign or revoke within the Organization in which you're making changes. + +Steps: + +1. Navigate to the Users Admin page by hovering over **Server Admin** (the shield icon) in the left navigation menu and selecting **Users**. +1. Click on a user row to edit that user's roles. +1. Under the **Organizations** header, you will see a list of roles assigned to that user within each of their Organizations. Click on the roles in an organization to open the role picker. +1. Deselect one or more selected roles that you would like to remove from that user. +1. Select one or more roles that you would like to assign to that user. +1. Click the **Apply** button to apply the selected roles to that user. + +![User role picker in Organization](/static/img/docs/enterprise/user_role_picker_in_org.png) + +The user's permissions will update immediately, and the UI will reflect their new permissions the next time they reload their browser or visit a new page. + +**Note**: The roles that you select will be assigned only within one Organization. For example, if you grant the user the "Data source editor" role in the row for the main Organization, then that user will be able to edit data source in the main Organization but not in others. + +## Manage users' roles via API + +To manage user role assignment via API, refer to the [fine-grained access control HTTP API docs]({{< relref "../../../http_api/access_control.md#create-and-remove-user-role-assignments" >}}). diff --git a/docs/sources/enterprise/access-control/permissions.md b/docs/sources/enterprise/access-control/permissions.md index ec28407b873..b5bb0df11ea 100644 --- a/docs/sources/enterprise/access-control/permissions.md +++ b/docs/sources/enterprise/access-control/permissions.md @@ -2,7 +2,7 @@ title = "Permissions" description = "Understand fine-grained access control permissions" keywords = ["grafana", "fine-grained access-control", "roles", "permissions", "enterprise"] -weight = 115 +weight = 110 +++ # Permissions @@ -23,63 +23,75 @@ scope The following list contains fine-grained access control actions. -| Action | Applicable scope | Description | -| -------------------------------- | ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `roles:list` | `roles:*` | List available roles without permissions. | -| `roles:read` | `roles:*`
`roles:uid:*` | Read a specific role with its permissions. | -| `roles:write` | `permissions:delegate` | Create or update a custom role. | -| `roles:delete` | `permissions:delegate` | Delete a custom role. | -| `roles.builtin:list` | `roles:*` | List built-in role assignments. | -| `roles.builtin:add` | `permissions:delegate` | Create a built-in role assignment. | -| `roles.builtin:remove` | `permissions:delegate` | Delete a built-in role assignment. | -| `reports.admin:create` | n/a | Create reports. | -| `reports.admin:write` | `reports:*`
`reports:id:*` | Update reports. | -| `reports:delete` | `reports:*`
`reports:id:*` | Delete reports. | -| `reports:read` | `reports:*` | List all available reports or get a specific report. | -| `reports:send` | `reports:*` | Send a report email. | -| `reports.settings:write` | n/a | Update report settings. | -| `reports.settings:read` | n/a | Read report settings. | -| `provisioning:reload` | `provisioners:*` | Reload provisioning files. To find the exact scope for specific provisioner, see [Scope definitions]({{< relref "./permissions.md#scope-definitions" >}}). | -| `users:read` | `global:users:*` | Read or search user profiles. | -| `users:write` | `global:users:*`
`global:users:id` | Update a user’s profile. | -| `users.teams:read` | `global:users:*`
`global:users:id:*` | Read a user’s teams. | -| `users.authtoken:list` | `global:users:*`
`global:users:id:*` | List authentication tokens that are assigned to a user. | -| `users.authtoken:update` | `global:users:*`
`global:users:id:*` | Update authentication tokens that are assigned to a user. | -| `users.password:update` | `global:users:*`
`global:users:id:*` | Update a user’s password. | -| `users:delete` | `global:users:*`
`global:users:id:*` | Delete a user. | -| `users:create` | n/a | Create a user. | -| `users:enable` | `global:users:*`
`global:users:id:*` | Enable a user. | -| `users:disable` | `global:users:*`
`global:users:id:*` | Disable a user. | -| `users.permissions:update` | `global:users:*`
`global:users:id:*` | Update a user’s organization-level permissions. | -| `users:logout` | `global:users:*`
`global:users:id:*` | Sign out a user. | -| `users.quotas:list` | `global:users:*`
`global:users:id:*` | List a user’s quotas. | -| `users.quotas:update` | `global:users:*`
`global:users:id:*` | Update a user’s quotas. | -| `org.users:read` | `users:*`
`users:id:*` | Get user profiles within an organization. | -| `org.users:add` | `users:*` | Add a user to an organization. | -| `org.users:remove` | `users:*`
`users:id:*` | Remove a user from an organization. | -| `org.users.role:update` | `users:*`
`users:id:*` | Update the organization role (`Viewer`, `Editor`, or `Admin`) of an organization. | -| `ldap.user:read` | n/a | Get a user via LDAP. | -| `ldap.user:sync` | n/a | Sync a user via LDAP. | -| `ldap.status:read` | n/a | Verify the availability of the LDAP server or servers. | -| `ldap.config:reload` | n/a | Reload the LDAP configuration. | -| `status:accesscontrol` | `services:accesscontrol` | Get access-control enabled status. | -| `settings:read` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Read the [Grafana configuration settings]({{< relref "../../administration/configuration/_index.md" >}}) | -| `settings:write` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Update any Grafana configuration settings that can be [updated at runtime]({{< relref "../../enterprise/settings-updates/_index.md" >}}). | -| `server.stats:read` | n/a | Read server stats | -| `datasources:explore` | n/a | Enable access to the **Explore** tab. | -| `datasources:read` | n/a
`datasources:*`
`datasources:id:*`
`datasources:uid:*`
`datasources:name:*` | List data sources. | -| `datasources.id:read` | `datasources:*`
`datasources:name:*` | Read data source IDs. | -| `datasources:create` | n/a | Create data sources. | -| `datasources:write` | `datasources:*`
`datasources:id:*` | Update data sources. | -| `datasources:delete` | `datasources:id:*`
`datasources:uid:*`
`datasources:name:*` | Delete data sources. | -| `datasources.permissions:read` | `datasources:*`
`datasources:id:*` | List data source permissions. | -| `datasources.permissions:create` | `datasources:*`
`datasources:id:*` | Create data source permissions. | -| `datasources.permissions:delete` | `datasources:*`
`datasources:id:*` | Delete data source permissions. | -| `datasources.permissions:toggle` | `datasources:*`
`datasources:id:*` | Enable or disable data source permissions. | -| `licensing:read` | n/a | Read licensing information. | -| `licensing:update` | n/a | Update the license token. | -| `licensing:delete` | n/a | Delete the license token. | -| `licensing.reports:read` | n/a | Get custom permission reports. | +| Action | Applicable scope | Description | +| ------------------------------- | ------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `roles:list` | `roles:*` | List available roles without permissions. | +| `roles:read` | `roles:*`
`roles:uid:*` | Read a specific role with its permissions. | +| `roles:write` | `permissions:delegate` | Create or update a custom role. | +| `roles:delete` | `permissions:delegate` | Delete a custom role. | +| `roles.builtin:list` | `roles:*` | List built-in role assignments. | +| `roles.builtin:add` | `permissions:delegate` | Create a built-in role assignment. | +| `roles.builtin:remove` | `permissions:delegate` | Delete a built-in role assignment. | +| `reports.admin:create` | n/a | Create reports. | +| `reports.admin:write` | `reports:*`
`reports:id:*` | Update reports. | +| `reports:delete` | `reports:*`
`reports:id:*` | Delete reports. | +| `reports:read` | `reports:*` | List all available reports or get a specific report. | +| `reports:send` | `reports:*` | Send a report email. | +| `reports.settings:write` | n/a | Update report settings. | +| `reports.settings:read` | n/a | Read report settings. | +| `provisioning:reload` | `provisioners:*` | Reload provisioning files. To find the exact scope for specific provisioner, see [Scope definitions]({{< relref "./permissions.md#scope-definitions" >}}). | +| `users:read` | `global:users:*` | Read or search user profiles. | +| `users:write` | `global:users:*`
`global:users:id` | Update a user’s profile. | +| `users.teams:read` | `global:users:*`
`global:users:id:*` | Read a user’s teams. | +| `users.authtoken:list` | `global:users:*`
`global:users:id:*` | List authentication tokens that are assigned to a user. | +| `users.authtoken:update` | `global:users:*`
`global:users:id:*` | Update authentication tokens that are assigned to a user. | +| `users.password:update` | `global:users:*`
`global:users:id:*` | Update a user’s password. | +| `users:delete` | `global:users:*`
`global:users:id:*` | Delete a user. | +| `users:create` | n/a | Create a user. | +| `users:enable` | `global:users:*`
`global:users:id:*` | Enable a user. | +| `users:disable` | `global:users:*`
`global:users:id:*` | Disable a user. | +| `users.permissions:update` | `global:users:*`
`global:users:id:*` | Update a user’s organization-level permissions. | +| `users:logout` | `global:users:*`
`global:users:id:*` | Sign out a user. | +| `users.quotas:list` | `global:users:*`
`global:users:id:*` | List a user’s quotas. | +| `users.quotas:update` | `global:users:*`
`global:users:id:*` | Update a user’s quotas. | +| `users.roles:list` | `users:*` | List roles assigned directly to a user. | +| `users.roles:add` | `permissions:delegate` | Assign a role to a user. | +| `users.roles:remove` | `permissions:delegate` | Unassign a role from a auser. | +| `users.permissions:list` | `users:*` | List permissions of a user. | +| `org.users:read` | `users:*`
`users:id:*` | Get user profiles within an organization. | +| `org.users:add` | `users:*` | Add a user to an organization. | +| `org.users:remove` | `users:*`
`users:id:*` | Remove a user from an organization. | +| `org.users.role:update` | `users:*`
`users:id:*` | Update the organization role (`Viewer`, `Editor`, or `Admin`) of an organization. | +| `orgs:read` | `orgs:*`
`orgs:id:*` | Read one or more organizations. | +| `orgs:write` | `orgs:*`
`orgs:id:*` | Update one or more organizations. | +| `org:create` | n/a | Create an organization. | +| `orgs:delete` | `orgs:*`
`orgs:id:*` | Delete one or more organizations. | +| `orgs.quotas:read` | `orgs:*`
`orgs:id:*` | Read organization quotas. | +| `orgs.quotas:write` | `orgs:*`
`orgs:id:*` | Update organization quotas. | +| `orgs.preferences:read` | `orgs:*`
`orgs:id:*` | Read organization preferences. | +| `orgs.preferences:write` | `orgs:*`
`orgs:id:*` | Update organization preferences. | +| `ldap.user:read` | n/a | Read users via LDAP. | +| `ldap.user:sync` | n/a | Sync users via LDAP. | +| `ldap.status:read` | n/a | Verify the availability of the LDAP server or servers. | +| `ldap.config:reload` | n/a | Reload the LDAP configuration. | +| `status:accesscontrol` | `services:accesscontrol` | Get access-control enabled status. | +| `settings:read` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Read the [Grafana configuration settings]({{< relref "../../administration/configuration/_index.md" >}}) | +| `settings:write` | `settings:*`
`settings:auth.saml:*`
`settings:auth.saml:enabled` (property level) | Update any Grafana configuration settings that can be [updated at runtime]({{< relref "../../enterprise/settings-updates/_index.md" >}}). | +| `server.stats:read` | n/a | Read Grafana instance statistics. | +| `datasources:explore` | n/a | Enable access to the **Explore** tab. | +| `datasources:read` | n/a
`datasources:*`
`datasources:id:*`
`datasources:uid:*`
`datasources:name:*` | List data sources. | +| `datasources:query` | n/a
`datasources:*`
`datasources:id:*` | Query data sources. | +| `datasources.id:read` | `datasources:*`
`datasources:name:*` | Read data source IDs. | +| `datasources:create` | n/a | Create data sources. | +| `datasources:write` | `datasources:*`
`datasources:id:*` | Update data sources. | +| `datasources:delete` | `datasources:id:*`
`datasources:uid:*`
`datasources:name:*` | Delete data sources. | +| `datasources.permissions:read` | `datasources:*`
`datasources:id:*` | List data source permissions. | +| `datasources.permissions:write` | `datasources:*`
`datasources:id:*` | Update data source permissions. | +| `licensing:read` | n/a | Read licensing information. | +| `licensing:update` | n/a | Update the license token. | +| `licensing:delete` | n/a | Delete the license token. | +| `licensing.reports:read` | n/a | Get custom permission reports. | +| `serviceaccounts:delete` | `serviceaccounts:*`
`serviceaccounts:id:*` | Delete one or more service accounts. | ## Scope definitions @@ -87,12 +99,14 @@ The following list contains fine-grained access control scopes. | Scopes | Descriptions | | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| `roles:*` | Restrict an action to a set of roles. For example, `roles:*` matches any role, `roles:uid:randomuid` matches only the role with UID `randomuid` | | `permissions:delegate` | The scope is only applicable for roles associated with the Access Control itself and indicates that you can delegate your permissions only, or a subset of it, by creating a new role or making an assignment. | -| `reports:*` | Restrict an action to a set of reports. For example, `reports:*` matches any report and `reports:id:1` matches the report with id `1`. | +| `roles:*`
`roles:uid:*` | Restrict an action to a set of roles. For example, `roles:*` matches any role and `roles:uid:randomuid` matches only the role whose UID is `randomuid`. | +| `reports:*`
`reports:id:*` | Restrict an action to a set of reports. For example, `reports:*` matches any report and `reports:id:1` matches the report whose ID is `1`. | | `services:accesscontrol` | Restrict an action to target only the fine-grained access control service. You can use this in conjunction with the `status:accesscontrol` actions. | -| `global:users:*` | Restrict an action to a set of global users. | -| `users:*` | Restrict an action to a set of users from an organization. | +| `global:users:*`
`global:users:id:*` | Restrict an action to a set of global users. For example, `global:users:*` matches any user and `global:users:id:1` matches the user whose ID is `1`. | +| `users:*`
`users:id:*` | Restrict an action to a set of users from an organization. For example, `users:*` matches any user and `users:id:1` matches the user whose ID is `1`. | +| `orgs:*`
`orgs:id:*` | Restrict an action to a set of organizations. For example, `orgs:*` matches any organization and `orgs:id:1` matches the organization whose ID is `1`. | | `settings:*` | Restrict an action to a subset of settings. For example, `settings:*` matches all settings, `settings:auth.saml:*` matches all SAML settings, and `settings:auth.saml:enabled` matches the enable property on the SAML settings. | | `provisioners:*` | Restrict an action to a set of provisioners. For example, `provisioners:*` matches any provisioner, and `provisioners:accesscontrol` matches the fine-grained access control [provisioner]({{< relref "./provisioning.md" >}}). | | `datasources:*`
`datasources:id:*`
`datasources:uid:*`
`datasources:name:*` | Restrict an action to a set of data sources. For example, `datasources:*` matches any data source, and `datasources:name:postgres` matches the data source named `postgres`. | +| `serviceaccounts:*`
`serviceaccounts:id:*` | Restrict an action to a set of service accounts. For example, `serviceaccounts:*` matches any service account and `serviceaccounts:id:1` matches the service account whose ID is `1`. | diff --git a/docs/sources/enterprise/access-control/provisioning.md b/docs/sources/enterprise/access-control/provisioning.md index 2c096b9cd19..6601812e545 100644 --- a/docs/sources/enterprise/access-control/provisioning.md +++ b/docs/sources/enterprise/access-control/provisioning.md @@ -25,7 +25,7 @@ You can create, update, and delete custom roles, as well as create and remove bu To create or update custom roles, you can add a list of `roles` in the configuration. -Every role has a [version]({{< relref "./roles.md#custom-roles" >}}) number. For each role you update, you must remember to increment it, otherwise changes won't be accounted for. +Every role has a [version]({{< relref "./roles.md#custom-roles" >}}) number. For each role you update, you must remember to increment it, otherwise changes won't be applied. When you update a role, the existing role inside Grafana is altered to be exactly what is specified in the YAML file, including permissions. diff --git a/docs/sources/enterprise/access-control/roles.md b/docs/sources/enterprise/access-control/roles.md index f8578088820..a89a0cd4b3b 100644 --- a/docs/sources/enterprise/access-control/roles.md +++ b/docs/sources/enterprise/access-control/roles.md @@ -44,6 +44,18 @@ Role names must be unique within an organization. Roles with names prefixed by `fixed:` are fixed roles created by Grafana and cannot be created or modified by users. +### Role display name + +A role’s display name is human friendly text that is displayed in the UI. When you create a display name for a role, use up to 190 ASCII-based characters. For fixed roles, the display name is shown as specified. If the display name has not been set the display name replace any `:` (a colon) with ` ` (a space). + +### Display name + +A role’s display name is a human-friendly identifier for the role, so that users more easily understand the purpose of a role. You can see the display name in the role picker in the UI. + +### Group + +A role’s group organizes roles in the role picker in the UI. + ### Role version The version of a role is a positive integer which defines the current version of the role. When updating a role, you can either omit the version field to increment the previous value by 1 or set a new version which must be strictly larger than the previous version for the update to succeed. @@ -67,20 +79,13 @@ If a Grafana Server Admin wants to delegate that privilege to other users, they Note that you won't be able to create, update or delete a custom role with permissions which you yourself do not have. For example, if the only permission you have is a `users:create`, you won't be able to create a role with other permissions. -## Built-in role assignments +## Assign roles -To control what your users can access or not, you can assign or unassign [Custom roles]({{< ref "#custom-roles" >}}) or [Fixed roles]({{< ref "#fixed-roles" >}}) to the existing [Organization roles]({{< relref "../../permissions/organization_roles.md" >}}) or to [Grafana Server Admin]({{< relref "../../permissions/_index.md#grafana-server-admin-role" >}}) role. -These assignments are called built-in role assignments. +[Custom roles]({{< ref "#custom-roles" >}}) and [Fixed roles]({{< ref "#fixed-roles" >}}) can be assigned to users, the existing [Organization roles]({{< relref "../../permissions/organization_roles.md" >}}) and to [Grafana Server Admin]({{< relref "../../permissions/_index.md#grafana-server-admin-role" >}}) role. -During startup, Grafana will create default assignments for you. When you make any changes to the built-on role assignments, Grafana will take them into account and won’t overwrite during next start. - -For more information, refer to [Fine-grained access control references]({{< relref "./fine-grained-access-control-references.md#default-built-in-role-assignments" >}}). - -## Create and remove built-in role assignments - -You can create or remove built-in role assignments using [Fine-grained access control API]({{< relref "../../http_api/access_control.md" >}}) or using [Grafana Provisioning]({{< relref "./provisioning" >}}). +Visit [Manage role assignments]({{< relref "manage-role-assignments/_index.md" >}}) page for more details. ### Scope of assignments -A built-in role assignment can be either _global_ or _organization local_. _Global_ assignments are not mapped to any specific organization and will be applied to all organizations, whereas _organization local_ assignments are only applied for that specific organization. +A role assignment can be either _global_ or _organization local_. _Global_ assignments are not mapped to any specific organization and will be applied to all organizations, whereas _organization local_ assignments are only applied for that specific organization. You can only create _organization local_ assignments for _organization local_ roles. diff --git a/docs/sources/enterprise/access-control/usage-scenarios.md b/docs/sources/enterprise/access-control/usage-scenarios.md index 7f8f9703e65..b0f9200f3e4 100644 --- a/docs/sources/enterprise/access-control/usage-scenarios.md +++ b/docs/sources/enterprise/access-control/usage-scenarios.md @@ -33,8 +33,9 @@ Example response: { "version": 2, "uid": "qQui_LCMk", - "name": "fixed:users:org:edit", - "description": "Allows every read action for user organizations and in addition allows to administer user organizations.", + "name": "fixed:users:org:writer", + "displayName": "Users Organization writer", + "description": "Within a single organization, add a user, invite a user, read information about a user and their role, remove a user from that organization, or change the role of a user.", "global": true, "updated": "2021-05-17T20:49:18+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -42,8 +43,9 @@ Example response: { "version": 1, "uid": "Kz9m_YjGz", - "name": "fixed:reporting:admin:edit", - "description": "Gives access to edit any report or the organization's general reporting settings.", + "name": "fixed:reports:writer", + "displayName": "Report writer", + "description": "Create, read, update, or delete all reports and shared report settings.", "global": true, "updated": "2021-05-13T16:24:26+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -55,8 +57,9 @@ Example response: { "version": 2, "uid": "qQui_LCMk", - "name": "fixed:users:org:edit", - "description": "Allows every read action for user organizations and in addition allows to administer user organizations.", + "name": "fixed:users:writer", + "displayName": "User writer", + "description": "Read and update all attributes and settings for all users in Grafana: update user information, read user information, create or enable or disable a user, make a user a Grafana administrator, sign out a user, update a user’s authentication token, or update quotas for all users.", "global": true, "updated": "2021-05-17T20:49:18+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -64,17 +67,9 @@ Example response: { "version": 2, "uid": "ajum_YjGk", - "name": "fixed:users:admin:read", - "description": "Allows to list and get users and related information.", - "global": true, - "updated": "2021-05-17T20:49:17+02:00", - "created": "2021-05-13T16:24:26+02:00" - }, - { - "version": 2, - "uid": "K3um_LCMk", - "name": "fixed:users:admin:edit", - "description": "Allows every read action for users and in addition allows to administer users.", + "name": "fixed:users:reader", + "displayName": "User reader", + "description": "Allows every read action for user organizations and in addition allows to administer user organizations.", "global": true, "updated": "2021-05-17T20:49:17+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -98,8 +93,9 @@ Example response: { "version": 2, "uid": "qQui_LCMk", - "name": "fixed:users:org:edit", - "description": "Allows every read action for user organizations and in addition allows to administer user organizations.", + "name": "fixed:users:writer", + "displayName": "User writer", + "description": "Read and update all attributes and settings for all users in Grafana: update user information, read user information, create or enable or disable a user, make a user a Grafana administrator, sign out a user, update a user’s authentication token, or update quotas for all users.", "global": true, "permissions": [ { @@ -132,6 +128,10 @@ Example response: } ``` +## Manage roles granted directly to users + +To learn about granting roles to users, refer to [Manage user role assignments]({{< relref "manage-role-assignments/manage-user-role-assignments.md" >}}) page. + ## Create your first custom role You can create your custom role by either using an [HTTP API]({{< relref "../../http_api/access_control.md#create-a-new-custom-role" >}}) or by using [Grafana provisioning]({{< relref "./provisioning.md" >}}). @@ -147,6 +147,7 @@ curl --location --request POST '/api/access-control/roles/' \ "version": 1, "uid": "jZrmlLCkGksdka", "name": "custom:users:admin", + "displayName": "custom users admin", "description": "My custom role which gives users permissions to create users", "global": true, "permissions": [ @@ -164,6 +165,7 @@ Example response: "version": 1, "uid": "jZrmlLCkGksdka", "name": "custom:users:admin", + "displayName": "custom users admin", "description": "My custom role which gives users permissions to create users", "global": true, "permissions": [ diff --git a/docs/sources/enterprise/auditing.md b/docs/sources/enterprise/auditing.md index f651acd23fa..01982586f82 100644 --- a/docs/sources/enterprise/auditing.md +++ b/docs/sources/enterprise/auditing.md @@ -62,62 +62,232 @@ The `additionalData` field can contain the following information: ### Recorded actions -The audit logs include records about the following categories of actions: +The audit logs include records about the following categories of actions. Each action is +distinguished by the `action` and `resources[...].type` fields in the JSON record. -**Sessions** +For example, creating an API key produces an audit log like this: -- Log in. -- Log out (manual log out, token expired/revoked, [SAML Single Logout]({{< relref "saml.md#single-logout" >}})). -- Revoke a user authentication token. -- Create or delete an API key. +```json {hl_lines=4} +{ + "action": "create", + "resources": [ + { + "id": 1, + "type": "api-key" + } + ], + "timestamp": "2021-11-12T22:12:36.144795692Z", + "user": { + "userId": 1, + "orgId": 1, + "orgRole": "Admin", + "username": "admin", + "isAnonymous": false, + "authTokenId": 1 + }, + "request": { + "body": "{\"name\":\"example\",\"role\":\"Viewer\",\"secondsToLive\":null}" + }, + "result": { + "statusType": "success", + "statusCode": 200, + "responseBody": "{\"id\":1,\"name\":\"example\"}" + }, + "resources": [ + { + "id": 1, + "type": "api-key" + } + ], + "requestUri": "/api/auth/keys", + "ipAddress": "127.0.0.1:54652", + "userAgent": "Mozilla/5.0 (X11; Linux x86_64; rv:94.0) Gecko/20100101 Firefox/94.0", + "grafanaVersion": "8.3.0-pre" +} +``` -**User management** +Some actions can only be distinguished by their `requestUri` fields. For those actions, the relevant +pattern of the `requestUri` field is given. -- Create, update, or delete a user. -- Enable or disable a user. -- Manage user role and permissions. -- LDAP sync or information access. +#### Sessions -**Team and organization management** +| Action | Distinguishing fields | +| -------------------------------- | ------------------------------------------------------------------------------------------ | +| Log in | `{"action": "login-AUTH-MODULE"}` \* | +| Log out \*\* | `{"action": "logout"}` | +| Force logout for user | `{"action": "logout-user"}` | +| Remove user authentication token | `{"action": "revoke-auth-token", "resources": [{"type": "auth-token"}, {"type": "user"}]}` | +| Create API key | `{"action": "create", "resources": [{"type": "api-key"}]}` | +| Delete API key | `{"action": "delete", "resources": [{"type": "api-key"}]}` | -- Create, update, or delete a team or organization. -- Add or remove a member of a team or organization. -- Manage organization members roles. -- Manage team members permissions. -- Invite an external member to an organization. -- Revoke a pending invitation to an organization. -- Add or remove an external group to sync with a team. +\* Where `AUTH-MODULE` is the name of the authentication module: `grafana`, `saml`, +`ldap`, etc. \ +\*\* Includes manual log out, token expired/revoked, and [SAML Single Logout]({{< relref "saml.md#single-logout" >}}). -**Folder and dashboard management** +#### User management -- Create, update, or delete a folder. -- Manage folder permissions. -- Create, import, update, or delete a dashboard. -- Restore an old dashboard version. -- Manage dashboard permissions. +| Action | Distinguishing fields | +| ------------------------- | ------------------------------------------------------------------- | +| Create user | `{"action": "create", "resources": [{"type": "user"}]}` | +| Update user | `{"action": "update", "resources": [{"type": "user"}]}` | +| Delete user | `{"action": "delete", "resources": [{"type": "user"}]}` | +| Disable user | `{"action": "disable", "resources": [{"type": "user"}]}` | +| Enable user | `{"action": "enable", "resources": [{"type": "user"}]}` | +| Update password | `{"action": "update-password", "resources": [{"type": "user"}]}` | +| Send password reset email | `{"action": "send-reset-email"}` | +| Reset password | `{"action": "reset-password"}` | +| Update permissions | `{"action": "update-permissions", "resources": [{"type": "user"}]}` | +| Send signup email | `{"action": "signup-email"}` | +| Click signup link | `{"action": "signup"}` | +| Reload LDAP configuration | `{"action": "ldap-reload"}` | +| Get user in LDAP | `{"action": "ldap-search"}` | +| Sync user with LDAP | `{"action": "ldap-sync", "resources": [{"type": "user"}]` | -**Data sources management** +#### Team and organization management -- Create, update, or delete a data source. -- Manage data source permissions. +| Action | Distinguishing fields | +| ------------------------------------ | ---------------------------------------------------------------------------- | +| Add team | `{"action": "create", "requestUri": "/api/teams"}` | +| Update team | `{"action": "update", "requestUri": "/api/teams/TEAM-ID"}`\* | +| Delete team | `{"action": "delete", "requestUri": "/api/teams/TEAM-ID"}`\* | +| Add external group for team | `{"action": "create", "requestUri": "/api/teams/TEAM-ID/groups"}`\* | +| Remove external group for team | `{"action": "delete", "requestUri": "/api/teams/TEAM-ID/groups/GROUP-ID"}`\* | +| Add user to team | `{"action": "create", "resources": [{"type": "user"}, {"type": "team"}]}` | +| Update team member permissions | `{"action": "update", "resources": [{"type": "user"}, {"type": "team"}]}` | +| Remove user from team | `{"action": "delete", "resources": [{"type": "user"}, {"type": "team"}]}` | +| Create organization | `{"action": "create", "resources": [{"type": "org"}]}` | +| Update organization | `{"action": "update", "resources": [{"type": "org"}]}` | +| Delete organization | `{"action": "delete", "resources": [{"type": "org"}]}` | +| Add user to organization | `{"action": "create", "resources": [{"type": "org"}, {"type": "user"}]}` | +| Change user role in organization | `{"action": "update", "resources": [{"type": "user"}, {"type": "org"}]}` | +| Remove user from organization | `{"action": "delete", "resources": [{"type": "user"}, {"type": "org"}]}` | +| Invite external user to organization | `{"action": "org-invite", "resources": [{"type": "org"}, {"type": "user"}]}` | +| Revoke invitation | `{"action": "revoke-org-invite", "resources": [{"type": "org"}]}` | -**Alerts and notification channels management** +\* Where `TEAM-ID` is the ID of the affected team, and `GROUP-ID` (if present) is the ID of the +external group. -- Create, update, or delete a notification channel. -- Test an alert or a notification channel. -- Pause an alert. +#### Folder and dashboard management -**Reporting** +| Action | Distinguishing fields | +| ----------------------------- | ------------------------------------------------------------------------ | +| Create folder | `{"action": "create", "resources": [{"type": "folder"}]}` | +| Update folder | `{"action": "update", "resources": [{"type": "folder"}]}` | +| Update folder permissions | `{"action": "manage-permissions", "resources": [{"type": "folder"}]}` | +| Delete folder | `{"action": "delete", "resources": [{"type": "folder"}]}` | +| Create/update dashboard | `{"action": "create-update", "resources": [{"type": "dashboard"}]}` | +| Import dashboard | `{"action": "create", "resources": [{"type": "dashboard"}]}` | +| Update dashboard permissions | `{"action": "manage-permissions", "resources": [{"type": "dashboard"}]}` | +| Restore old dashboard version | `{"action": "restore", "resources": [{"type": "dashboard"}]}` | +| Delete dashboard | `{"action": "delete", "resources": [{"type": "dashboard"}]}` | -- Create, update, or delete a report. -- Update reporting settings. -- Send reporting email. +#### Library elements management -**Annotations, playlists and snapshots management** +| Action | Distinguishing fields | +| ---------------------- | ------------------------------------------------------------------ | +| Create library element | `{"action": "create", "resources": [{"type": "library-element"}]}` | +| Update library element | `{"action": "update", "resources": [{"type": "library-element"}]}` | +| Delete library element | `{"action": "delete", "resources": [{"type": "library-element"}]}` | -- Create, update, or delete an annotation. -- Create, update, or delete a playlist. -- Create or delete a snapshot. +#### Data sources management + +| Action | Distinguishing fields | +| -------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| Create datasource | `{"action": "create", "resources": [{"type": "datasource"}]}` | +| Update datasource | `{"action": "update", "resources": [{"type": "datasource"}]}` | +| Delete datasource | `{"action": "delete", "resources": [{"type": "datasource"}]}` | +| Enable permissions for datasource | `{"action": "enable-permissions", "resources": [{"type": "datasource"}]}` | +| Disable permissions for datasource | `{"action": "disable-permissions", "resources": [{"type": "datasource"}]}` | +| Grant datasource permission to role, team, or user | `{"action": "create", "resources": [{"type": "datasource"}, {"type": "dspermission"}]}`\* | +| Remove datasource permission | `{"action": "delete", "resources": [{"type": "datasource"}, {"type": "dspermission"}]}` | +| Enable caching for datasource | `{"action": "enable-cache", "resources": [{"type": "datasource"}]}` | +| Disable caching for datasource | `{"action": "disable-cache", "resources": [{"type": "datasource"}]}` | +| Update datasource caching configuration | `{"action": "update", "resources": [{"type": "datasource"}]}` | + +\* `resources` may also contain a third item with `"type":` set to `"user"` or `"team"`. + +#### Alerts and notification channels management + +| Action | Distinguishing fields | +| --------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- | +| Save alert manager configuration | `{"action": "update", "requestUri": "/api/alertmanager/RECIPIENT/config/api/v1/alerts"}` | +| Reset alert manager configuration | `{"action": "delete", "requestUri": "/api/alertmanager/RECIPIENT/config/api/v1/alerts"}` | +| Create silence | `{"action": "create", "requestUri": "/api/alertmanager/RECIPIENT/api/v2/silences"}` | +| Delete silence | `{"action": "delete", "requestUri": "/api/alertmanager/RECIPIENT/api/v2/silences/SILENCE-ID"}` | +| Create alert | `{"action": "create", "requestUri": "/api/ruler/RECIPIENT/api/v2/alerts"}` | +| Create or update rule group | `{"action": "create-update", "requestUri": "/api/ruler/RECIPIENT/api/v1/rules/NAMESPACE"}` | +| Delete rule group | `{"action": "delete", "requestUri": "/api/ruler/RECIPIENT/api/v1/rules/NAMESPACE/GROUP-NAME"}` | +| Delete namespace | `{"action": "delete", "requestUri": "/api/ruler/RECIPIENT/api/v1/rules/NAMESPACE"}` | +| Test Grafana managed receivers | `{"action": "test", "requestUri": "/api/alertmanager/RECIPIENT/config/api/v1/receivers/test"}` | +| Create or update the NGalert configuration of the user's organization | `{"action": "create-update", "requestUri": "/api/v1/ngalert/admin_config"}` | +| Delete the NGalert configuration of the user's organization | `{"action": "delete", "requestUri": "/api/v1/ngalert/admin_config"}` | + +Where the following: + +- `RECIPIENT` is `grafana` for requests handled by Grafana or the numeric data source ID for requests forwarded to a data source. +- `NAMESPACE` is the string identifier for the rules namespace. +- `GROUP-NAME` is the string identifier for the rules group. +- `SILENCE-ID` is the ID of the affected silence. + +The following legacy alerting actions are still supported: + +| Action | Distinguishing fields | +| --------------------------------- | --------------------------------------------------------------------- | +| Test alert rule | `{"action": "test", "resources": [{"type": "panel"}]}` | +| Pause alert | `{"action": "pause", "resources": [{"type": "alert"}]}` | +| Pause all alerts | `{"action": "pause-all"}` | +| Test alert notification channel | `{"action": "test", "resources": [{"type": "alert-notification"}]}` | +| Create alert notification channel | `{"action": "create", "resources": [{"type": "alert-notification"}]}` | +| Update alert notification channel | `{"action": "update", "resources": [{"type": "alert-notification"}]}` | +| Delete alert notification channel | `{"action": "delete", "resources": [{"type": "alert-notification"}]}` | + +#### Reporting + +| Action | Distinguishing fields | +| ------------------------- | -------------------------------------------------------------------------------- | +| Create report | `{"action": "create", "resources": [{"type": "report"}, {"type": "dashboard"}]}` | +| Update report | `{"action": "update", "resources": [{"type": "report"}, {"type": "dashboard"}]}` | +| Delete report | `{"action": "delete", "resources": [{"type": "report"}]}` | +| Send report by email | `{"action": "email", "resources": [{"type": "report"}]}` | +| Update reporting settings | `{"action": "change-settings"}` | + +#### Annotations, playlists and snapshots management + +| Action | Distinguishing fields | +| --------------------------------- | ------------------------------------------------------------------------------------ | +| Create annotation | `{"action": "create", "resources": [{"type": "annotation"}]}` | +| Create Graphite annotation | `{"action": "create-graphite", "resources": [{"type": "annotation"}]}` | +| Update annotation | `{"action": "update", "resources": [{"type": "annotation"}]}` | +| Patch annotation | `{"action": "patch", "resources": [{"type": "annotation"}]}` | +| Delete annotation | `{"action": "delete", "resources": [{"type": "annotation"}]}` | +| Delete all annotations from panel | `{"action": "mass-delete", "resources": [{"type": "dashboard"}, {"type": "panel"}]}` | +| Create playlist | `{"action": "create", "resources": [{"type": "playlist"}]}` | +| Update playlist | `{"action": "update", "resources": [{"type": "playlist"}]}` | +| Delete playlist | `{"action": "delete", "resources": [{"type": "playlist"}]}` | +| Create a snapshot | `{"action": "create", "resources": [{"type": "dashboard"}, {"type": "snapshot"}]}` | +| Delete a snapshot | `{"action": "delete", "resources": [{"type": "snapshot"}]}` | + +#### Provisioning + +| Action | Distinguishing fields | +| -------------------------------- | ------------------------------------------ | +| Reload provisioned dashboards | `{"action": "provisioning-dashboards"}` | +| Reload provisioned datasources | `{"action": "provisioning-datasources"}` | +| Reload provisioned plugins | `{"action": "provisioning-plugins"}` | +| Reload provisioned notifications | `{"action": "provisioning-notifications"}` | + +#### Plugins management + +| Action | Distinguishing fields | +| ---------------- | ------------------------- | +| Install plugin | `{"action": "install"}` | +| Uninstall plugin | `{"action": "uninstall"}` | + +#### Miscellaneous + +| Action | Distinguishing fields | +| ------------------- | ------------------------------------------------------------ | +| Set licensing token | `{"action": "create", "requestUri": "/api/licensing/token"}` | ## Configuration diff --git a/docs/sources/enterprise/enterprise-configuration.md b/docs/sources/enterprise/enterprise-configuration.md index 8ac095f1f67..459a21e527e 100644 --- a/docs/sources/enterprise/enterprise-configuration.md +++ b/docs/sources/enterprise/enterprise-configuration.md @@ -34,6 +34,12 @@ side to be valid for a different number of users or a new duration, your Grafana instance will be updated with the new terms automatically. Defaults to `true`. +### license_validation_type + +> **Note:** Available in Grafana Enterprise v8.3+. + +When set to `aws`, Grafana will validate its license status with Amazon Web Services (AWS) instead of with Grafana Labs. Only use this setting if you purchased an Enterprise license from AWS Marketplace. Defaults to empty, which means that by default Grafana Enterprise will validate using a license issued by Grafana Labs. For details about licenses issued by AWS, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace]({{< relref "../enterprise/license/activate-aws-marketplace-license/" >}}). + ## [white_labeling] ### app_title @@ -331,6 +337,12 @@ A list of headers that are stripped from the outgoing data source and alerting r A list of cookies that are stripped from the outgoing data source and alerting requests. +## [security.encryption] + +### algorithm + +Encryption algorithm used to encrypt secrets stored in the database and cookies. Possible values are `aes-cfb` (default) and `aes-gcm`. AES-CFB stands for _Advanced Encryption Standard_ in _cipher feedback_ mode, and AES-GCM stands for _Advanced Encryption Standard_ in _Galois/Counter Mode_. + ## [caching] > **Note:** Available in Grafana Enterprise v7.5 and later versions. @@ -353,7 +365,15 @@ This value is `true` by default. ### ttl -_Time to live_ (TTL) is the time that a query result is stored in the caching system before it is deleted or refreshed. This setting defines the time to live for query caching, when TTL is not configured in data source settings. The default value is `5m` (5 minutes). +_Time to live_ (TTL) is the time that a query result is stored in the caching system before it is deleted or refreshed. This setting defines the time to live for query caching, when TTL is not configured in data source settings. The default value is `1m` (1 minute). + +### max_ttl + +The max duration that a query result is stored in the caching system before it is deleted or refreshed. This value will override `ttl` config option or data source setting if the `ttl` value is greater than `max_ttl`. To disable this constraint, set this value to `0s`. + +The default is `0s` (disabled). + +> **Note:** Disabling this constraint is not recommended in production environments. ### max_value_mb @@ -361,6 +381,28 @@ This value limits the size of a single cache value. If a cache value (or query r The default is `1`. +### connection_timeout + +This setting defines the duration to wait for a connection to the caching backend. + +The default is `5s`. + +### read_timeout + +This setting defines the duration to wait for the caching backend to return a cached result. To disable this timeout, set this value to `0s`. + +The default is `0s` (disabled). + +> **Note:** Disabling this timeout is not recommended in production environments. + +### write_timeout + +This setting defines the number of seconds to wait for the caching backend to store a result. To disable this timeout, set this value to `0s`. + +The default is `0s` (disabled). + +> **Note:** Disabling this timeout is not recommended in production environments. + ## [caching.encryption] ### enabled @@ -420,3 +462,48 @@ The default is `"grafana"`. A space-separated list of memcached servers. Example: `memcached-server-1:11211 memcached-server-2:11212 memcached-server-3:11211`. Or if there's only one server: `memcached-server:11211`. The default is `"localhost:11211"`. + +## [recorded_queries] + +### enabled + +Whether the recorded queries feature is enabled + +### min_interval + +Sets the minimum interval to enforce between query evaluations. The default value is `10s`. Query evaluation will be +adjusted if they are less than this value. Higher values can help with resource management. + +The interval string is a possibly signed sequence of decimal numbers, followed by a unit suffix (ms, s, m, h, d), e.g. +30s or 1m. + +### max_queries + +The maximum number of recorded queries that can exist. + +### default_remote_write_datasource_uid + +The UID of the datasource where the query data will be written. + +If all `default_remote_write_*` properties are set, this information will be populated at startup. If a remote write target has +already been configured, nothing will happen. + +### default_remote_write_path + +The api path where metrics will be written + +If all `default_remote_write_*` properties are set, this information will be populated at startup. If a remote write target has +already been configured, nothing will happen. + +### default_remote_write_datasource_org_id + +The org id of the datasource where the query data will be written. + +If all `default_remote_write_*` properties are set, this information will be populated at startup. If a remote write target has +already been configured, nothing will happen. + +## [feature_highlights] + +### enabled + +Whether the feature highlights feature is enabled diff --git a/docs/sources/enterprise/kms-integration/_index.md b/docs/sources/enterprise/kms-integration/_index.md new file mode 100644 index 00000000000..786b9959471 --- /dev/null +++ b/docs/sources/enterprise/kms-integration/_index.md @@ -0,0 +1,17 @@ ++++ +title = "KMS integration" +description = "" +keywords = ["grafana", "kms", "key management system integration"] +weight = 1200 ++++ + +# Key management systems (KMSs) + +You can choose to encrypt secrets stored in the Grafana database using a key from a KMS, which is a secure central storage location that is designed to help you to create and manage cryptographic keys and control their use across many services. When you integrate with a KMS, Grafana does not directly store your encryption key. Instead, Grafana stores KMS credentials and the identifier of the key, which Grafana uses to encrypt the database. + +Grafana integrates with the following key management systems: + +- [AWS KMS]({{< relref "/using-aws-kms-to-encrypt-database-secrets.md" >}}) +- [Azure Key Vault]({{< relref "/using-azure-key-vault-to-encrypt-database-secrets.md" >}}) + +Refer to [Database encryption]({{< relref "../../administration/database-encryption.md" >}}) to learn more about how Grafana encrypts secrets in the database. diff --git a/docs/sources/enterprise/kms-integration/using-aws-kms-to-encrypt-database-secrets.md b/docs/sources/enterprise/kms-integration/using-aws-kms-to-encrypt-database-secrets.md new file mode 100644 index 00000000000..0b49a16a217 --- /dev/null +++ b/docs/sources/enterprise/kms-integration/using-aws-kms-to-encrypt-database-secrets.md @@ -0,0 +1,86 @@ ++++ +title = "AMS KMS" +description = "Using AWS KMS to encrypt database secrets" +keywords = ["grafana", "AWS KMS integration"] +weight = 3 ++++ + +# Using AWS KMS to encrypt database secrets + +You can use an encryption key from AWS Key Management Service to encrypt secrets in the Grafana database. + +**Prerequisites:** + +- An AWS account with permission to view and create KMS keys and programmatic credentials to access those keys +- Access to the Grafana [configuration]({{< relref "../../administration/configuration/#config-file-locations" >}}) file + +1. Create a symmetric API key either from the AWS Management Console or by using the AWS KMS API. +

For detailed instructions, refer to [Creating keys](https://docs.aws.amazon.com/kms/latest/developerguide/create-keys.html). + +2. Retrieve the Key ID. +

In AWS terms, this can be a key ID, a key ARN (Amazon Resource Name), an alias name, or an alias ARN. For more information about how to retrieve a key ID from AWS, refer to [Finding the key ID and key ARN](https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html). + +3. Create a [programmatic credential](https://docs.aws.amazon.com/general/latest/gr/aws-sec-cred-types.html#access-keys-and-secret-access-keys) (access key ID and secret access key), which has permission to view the key that you created. +

In AWS, you can control access to your KMS keys by using [key policies](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html), [IAM policies](https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html), and [grants](https://docs.aws.amazon.com/kms/latest/developerguide/grants.html). You can also create [temporary credentials](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_use-resources.html), which must provide a session token along with an access key ID and a secret access key. + +4. From within Grafana, turn on [envelope encryption]({{< relref "../../administration/envelope-encryption.md" >}}). +5. Add your AWS KMS details to the Grafana configuration file; depending on your operating system, it is usually named `grafana.ini`: +

a. Add a new section to the configuration file, with a name in the format of `[security.encryption.awskms.]`, where `` is any name that uniquely identifies this key among other provider keys. +

b. Fill in the section with the following values: +
+ + - `key_id`: a reference to a key stored in the KMS. This can be a key ID, a key Amazon Resource Name (ARN), an alias name, or an alias ARN. If you are using an alias, use the prefix `alias/`. To specify a KMS key in a different AWS account, use its ARN or alias. For more information about how to retrieve a key ID from AWS, refer to [Finding the key ID and key ARN](https://docs.aws.amazon.com/kms/latest/developerguide/find-cmk-id-arn.html).
+ | `key_id` option | Example value | + | --- | --- | + | Key ID | `1234abcd-12ab-34cd-56ef-1234567890ab` | + | Key ARN | `arn:aws:kms:us-east-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab` | + | Alias name | `alias/ExampleAlias` | + | Alias ARN | `arn:aws:kms:us-east-2:111122223333:alias/ExampleAlias` | + + - `access_key_id`: The AWS Access Key ID that you previously generated. + - `secret_access_key`: The AWS Secret Access Key you previously generated. + - `token`: (Optional) An AWS Session Token, which you must provide if you created temporary credentials. + - `region`: The AWS region where you created the KMS key. The region is contained in the key’s ARN. For example: `arn:aws:kms:*us-east-2*:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab` + + An example of an AWS KMS provider section in the `grafana.ini` file is as follows: + + ``` + # AWS key management service provider setup + ;[security.encryption.awskms.example-encryption-key] + # Reference to a KMS key - either key ID, key ARN, alias name, or ARN + ;key_id = 1234abcd-12ab-34cd-56ef-1234567890ab + # AWS access key ID + ;access_key_id = AKIAIOSFODNN7EXAMPLE + # AWS secret access key + ;secret_access_key = wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY + # AWS session token, optional + ;token = AQoDYXdzEJr... + # AWS region, for example eu-north-1 + ;region = eu-north-1 + ``` + +6. Update the `[security]` section of the `grafana.ini` configuration file with the new Encryption Provider key that you created: + + ``` + [security] + # previous encryption key, used for legacy alerts, decrypting existing secrets or used as default provider when external providers are not configured + secret_key = AaaaAaaa + # encryption provider key in the format . + encryption_provider = awskms.example-encryption-key + # list of configured key providers, space separated + available_encryption_providers = awskms.example-encryption-key + ``` + + **> Note:** The encryption key that is stored in the `secret_key` field is still used by Grafana’s legacy alerting system to encrypt secrets, for decrypting existing secrets, or it is used as the default provider when external providers are not configured. Do not change or remove that value when adding a new KMS provider. + +7. [Restart Grafana](https://grafana.com/docs/grafana/latest/installation/restart-grafana/). + +8. (Optional) From the command line and the root directory of Grafana, re-encrypt all of the secrets within the Grafana database with the new key using the following command: + + `grafana-cli admin secrets-migration re-encrypt` + + If you do not re-encrypt existing secrets, then they will remain encrypted by the previous encryption key. Users will still be able to access them. + + **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources or alert notification channels) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. + + **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources, alert notification channels, or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. diff --git a/docs/sources/enterprise/kms-integration/using-azure-key-vault-to-encrypt-database-secrets.md b/docs/sources/enterprise/kms-integration/using-azure-key-vault-to-encrypt-database-secrets.md new file mode 100644 index 00000000000..8747fa81394 --- /dev/null +++ b/docs/sources/enterprise/kms-integration/using-azure-key-vault-to-encrypt-database-secrets.md @@ -0,0 +1,81 @@ ++++ +title = "Azure Key Vault" +description = "Using Azure Key Vault to encrypt database secrets" +keywords = ["grafana", "Azure key vault"] +weight = 2 ++++ + +# Using Azure Key Vault to encrypt database secrets + +You can use an encryption key from Azure Key Vault to encrypt secrets in the Grafana database. + +**Prerequisites:** + +- An Azure account with permission to view and create Key Vault keys and programmatic credentials to access those keys +- Access to the Grafana [configuration]({{< relref "../../administration/configuration/#config-file-locations" >}}) file + +1. [Create a vault](https://docs.microsoft.com/en-us/azure/key-vault/general/quick-create-portal#create-a-vault). + +2. Create a key in the **Key Vault** with the name that you want by using **RSA** as the type and `2048` as the size with encrypt and decrypt permissions. + +3. [Register an application](https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-register-app#register-an-application) and generate a client secret for it. + +4. [Assign a Key Vault access policy](https://docs.microsoft.com/en-us/azure/key-vault/general/assign-access-policy?tabs=azure-portal) for the key vault that you created: + +5. In the Key Permissions section, set encrypt and decrypt permissions, and click **Save**. + +6. From within Grafana, turn on [envelope encryption]({{< relref "../../administration/envelope-encryption.md" >}}). + +7. Add your Azure Key Vault details to the Grafana configuration file; depending on your operating system, is usually named `grafana.ini`: +

a. Add a new section to the configuration file, with a name in the format of `[security.encryption.azurekv.]`, where `` is any name that uniquely identifies this key among other provider keys. +

b. Fill in the section with the following values: +
+ + - `tenant_id`: the **Directory ID** (tenant) from the application that you registered. + - `client_id`: the **Application ID** (client) from the application that you registered. + - `client_secret`: the VALUE of the secret that you generated in your app. (Don't use the Secret ID). + - `key_id`: the key name that you created in the key vault. + - `vault_uri`: the URL of your key vault. + + An example of an Azure Key Vault provider section in the `grafana.ini` file is as follows: + + ``` + # Azure Key Vault provider setup + ;[security.encryption.azurekv.example-encryption-key] + # Azure Application directory ID (tenant) + tenant_id = 1234abcd-12ab-34cd-56ef-1234567890ab + # Azure Application application ID (client). + client_id = 1356dfgh-12ab-34cd-56ef-3322114455cc + # Azure Application client secret. + client_secret = FbE4X~4Jq45ERKxx823Aheb9plBjQqHHe81Sc + # Azure Key Vault key name. + key_id = mysecretkey + # Azure Key Vault uri. + vault_uri = https://my-vault-name.vault.azure.net + ``` + +8. Update the `[security]` section of the `grafana.ini` configuration file with the new Encryption Provider key that you created: + + ``` + [security] + # previous encryption key, used for legacy alerts, decrypting existing secrets or used as default provider when external providers are not configured + secret_key = AaaaAaaa + # encryption provider key in the format . + encryption_provider = azurekv.example-encryption-key + # list of configured key providers, space separated + available_encryption_providers = azurekv.example-encryption-key + ``` + + **> Note:** The encryption key stored in the `secret_key` field is still used by Grafana’s legacy alerting system to encrypt secrets. Do not change or remove that value. + +9. [Restart Grafana](https://grafana.com/docs/grafana/latest/installation/restart-grafana/). + +10. (Optional) From the command line and the root directory of Grafana Enterprise, re-encrypt all of the secrets within the Grafana database with the new key using the following command: + + `grafana-cli admin secrets-migration re-encrypt` + + If you do not re-encrypt existing secrets, then they will remain encrypted by the previous encryption key. Users will still be able to access them. + + **> Note:** This process could take a few minutes to complete, depending on the number of secrets (such as data sources or alert notification channels) in your database. Users might experience errors while this process is running, and alert notifications might not be sent. + + **> Note:** If you are updating this encryption key during the initial setup of Grafana before any data sources, alert notification channels, or dashboards have been created, then this step is not necessary because there are no secrets in Grafana to migrate. diff --git a/docs/sources/enterprise/license/_index.md b/docs/sources/enterprise/license/_index.md index 108927e7d5c..f3595fbfc04 100644 --- a/docs/sources/enterprise/license/_index.md +++ b/docs/sources/enterprise/license/_index.md @@ -7,9 +7,10 @@ weight = 10 # Grafana Enterprise license -To run Grafana Enterprise, you need a valid license. [Contact a Grafana Labs representative](https://grafana.com/contact?about=grafana-enterprise) to obtain the license. For information on how to activate your license, refer to [Activate an Enterprise license]({{< relref "./activate-license.md" >}}). +When you become a Grafana Enterprise customer, you gain access to Grafana's premium observability features, including enterprise data source plugins, reporting, and fine-grained access control. In order to use these [enhanced features of Grafana Enterprise]({{< relref "../_index.md" >}}), you must purchase and activate a Grafana Enterprise license. -See also: +To purchase a license directly from Grafana Labs, [Contact a Grafana Labs representative](https://grafana.com/contact?about=grafana-enterprise). To activate an Enterprise license purchased from Grafana Labs, refer to [Activate an Enterprise license]({{< relref "./activate-license.md" >}}). -- [License expiration]({{< relref "./license-expiration.md" >}}) -- [License restrictions]({{< relref "./license-restrictions.md" >}}) +You can also purchase a Grafana Enterprise license through the AWS Marketplace. To learn more about activating a license purchased through AWS, refer to [Activate a Grafana Enterprise license purchased through AWS Marketplace]({{< relref "../license/activate-aws-marketplace-license" >}}). + +{{< section >}} diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/_index.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/_index.md new file mode 100644 index 00000000000..06f7c4655c2 --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/_index.md @@ -0,0 +1,12 @@ ++++ +title = "Activate a Grafana Enterprise license purchased through AWS Marketplace" +description = "Activate Enterprise license purchased through AWS Marketplace" +keywords = ["grafana", "aws", "marketplace", "enterprise", "license"] +weight = 400 ++++ + +# Activate a Grafana Enterprise license purchased through AWS Marketplace + +AWS Marketplace is a convenient place for AWS customers to buy and manage a license for Grafana Enterprise versions 8.3.0 and later. + +{{< section >}} diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/about-ge-license-through-aws.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/about-ge-license-through-aws.md new file mode 100644 index 00000000000..d1dff4cfa13 --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/about-ge-license-through-aws.md @@ -0,0 +1,24 @@ ++++ +title = "About Grafana Enterprise licenses from AWS Marketplace" +description = "About Grafana Enterprise licenses from AWS Marketplace" +keywords = ["grafana", "about", "enterprise", "overview", "aws", "marketplace"] +aliases = ["/docs/grafana/latest/enterprise/activate-aws-marketplace-license/about-ge-license-through-aws"] +weight = 100 ++++ + +# About Grafana Enterprise licenses from AWS Marketplace + +AWS Marketplace is a convenient place for AWS customers to buy and manage a license for Grafana Enterprise versions 8.3.0 and later. + +You can deploy Grafana Enterprise in the following ways: + +- Using AWS services like ECS, EKS or EC2. +- In an instance outside AWS. + +In each case, you must activate the Grafana Enterprise license purchased in AWS Marketplace to take advantage of Grafana Enterprise observability features. Grafana Enterprise licenses purchased through AWS Marketplace are subject to the same [restrictions]({{< relref "../license-restrictions.md" >}}) as Grafana Enterprise licensed purchased directly from Grafana Labs. + +> To purchase a license directly from Grafana Labs or learn more about other Grafana offerings, [Contact a Grafana Labs representative](https://grafana.com/contact?about=grafana-enterprise). + +## Before you begin + +Become an AWS customer. Only AWS customers have access to purchase services through AWS Marketplace. To learn more about becoming an AWS customer, refer to [Sign up for AWS](https://portal.aws.amazon.com/billing/signup#/start). diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-ecs.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-ecs.md new file mode 100644 index 00000000000..e308a24253b --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-ecs.md @@ -0,0 +1,105 @@ ++++ +title = "Activate a Grafana Enterprise license from AWS Marketplace on ECS" +description = "Activate a Grafana Enterprise license from AWS Marketplace on ECS" +keywords = ["grafana", "ecs", "enterprise", "aws", "marketplace", "activate"] +aliases = ["/docs/grafana/latest/enterprise/activate-aws-marketplace-license/activate-license-on-ecs"] +weight = 250 ++++ + +# Activate a Grafana Enterprise license from AWS Marketplace on ECS + +If you have purchased a Grafana Enterprise subscription through AWS Marketplace, you must activate it in order to use Grafana Enterprise data source plugins and features in Grafana. + +## Before you begin + +- Purchase a subscription to [Grafana Enterprise from AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-dlncd4kzt5kx6). +- Be sure that the IAM user that was used to purchase Grafana Enterprise has permission to manage subscriptions, create new IAM users and roles, and create access policies. + +To activate your license, complete the following tasks. + +## Task 1: Deploy Grafana Enterprise on Amazon ECS + +1. Deploy Grafana Enterprise on Amazon ECS. + + For more information about deploying an application on Amazon ECS, refer to [Creating an Amazon ECS service](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service.html). + +1. As you create the Amazon ECS service, use the Grafana Enterprise version 8.3.0 or later container image. + + For example, enter `grafana/grafana-enterprise:8.3.3`. + + > Only Grafana Enterprise versions 8.3.0 and later support licenses granted through AWS Marketplace. + +## Task 2: Configure Grafana for high availability + +Grafana requires that you configure a database to hold dashboards, users, and other persistent data. + +### Before you begin + +- Ensure that you have a supported Grafana database available. + - For a list of supported databases, refer to [Supported databases]({{< relref "../../../installation/requirements.md#supported-databases" >}}). + - For information about creating a database, refer to [Creating an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html). +- Review the information required to connect to the RDS DB instance. For more information, refer to [Connecting to an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.Connect.html). + +To configure Grafana for high availability: + +1. In AWS ECS, use environment variables to update the `database` parameters. + + For a list of database parameters, refer to [Configuration]({{< relref "../../../administration/configuration.md#database" >}}). + +1. Create a revision of the task definition for the ECS Task that runs Grafana Enterprise. + + For more information about creating a task, refer to [Updating a task definition using the classic console](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-task-definition.html). + +1. Within the new revision, edit the Grafana Enterprise container for this task, and add the following environment variables to the container: + + ``` + GF_DATABASE_TYPE=[database type] + GF_DATABASE_HOST=[database address and port] + GF_DATABASE_NAME=[database name] + GF_DATABASE_USER=[database username] + GF_DATABASE_PASSWORD=[database password] + ``` + +> For more information about how to update your ECS service with an environment variable, refer to [Updating a service using the new console](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service-console-v2.html). + +## Task 3: Configure Grafana Enterprise to validate its license with AWS + +In this task you configure Grafana Enterprise to validate the license with AWS instead of Grafana Labs. + +1. In AWS IAM, create an access policy with the following permissions: + + - `"license-manager:CheckoutLicense"` + - `"license-manager:ListReceivedLicenses"` + - `"license-manager:GetLicenseUsage"` + - `"license-manager:CheckInLicense"` + + For more information about creating an access policy, refer to [Creating IAM policies (console)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html). + + For more information about AWS license permissions, refer to [Actions, resources, and condition keys for AWS License Manager](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslicensemanager.html). + +1. Create an Elastic Container Service task role and attach the policy you created in the previous step. + + For more information about creating a task role, refer to [IAM Roles for Tasks](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html). + +1. Create a revision of the task definition for the ECS Task that runs Grafana Enterprise. + + For more information about creating a revision of the task definition, refer to [Updating a task definition using the classic console](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-task-definition.html). + +1. Within the new revision, perform the following steps: + + a. Update the Task Role of your ECS Task to the role that you created, with permission to access license information. + + b. Edit the Grafana Enterprise container for this task, and add the following environment variable to the container: + + ``` + GF_ENTERPRISE_LICENSE_VALIDATION_TYPE=aws + ``` + + For more information about how to update your ECS service with an environment variable, refer to [Updating a service using the new console](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/update-service-console-v2.html). + +### Task 4: Start or restart Grafana + +1. To restart Grafana and activate your license, update the service running Grafana to use the latest revision of the task definition that you created. +1. After you update the service, navigate to your Grafana instance, sign in with Grafana Admin credentials, and navigate to the **Statistics and Licensing** page to validate that your license is active. + +For more information about validating that your license is active, refer to [Determine the number of active users for each licensed role](../../license-restrictions/#determine-the-number-of-active-users-for-each-licensed-role). diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-eks.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-eks.md new file mode 100644 index 00000000000..aa3800ad75d --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-eks.md @@ -0,0 +1,118 @@ ++++ +title = "Activate a Grafana Enterprise license from AWS Marketplace on EKS" +description = "Activate a Grafana Enterprise license from AWS Marketplace on EKS" +keywords = ["grafana", "enterprise", "aws", "marketplace", "eks", "activate"] +aliases = ["/docs/grafana/latest/enterprise/activate-aws-marketplace-license/activate-license-on-eks"] +weight = 200 ++++ + +# Activate a Grafana Enterprise license from AWS Marketplace on EKS + +If you have purchased a Grafana Enterprise subscription through AWS Marketplace, you must activate it in order to use Grafana Enterprise data source plugins and features in Grafana. + +## Before you begin: + +- Purchase a subscription to [Grafana Enterprise from AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-dlncd4kzt5kx6). +- Be sure that the IAM user that was used to purchase Grafana Enterprise has permission to manage subscriptions, create new IAM users and roles, and create access policies. + +To activate your license, complete the following tasks: + +## Task 1: Deploy Grafana Enterprise on Amazon EKS + +1. Deploy Grafana Enterprise on Amazon EKS. + + For more information about deploying an application on Amazon EKS, refer to [Getting started with Amazon EKS – AWS Management Console and AWS CLI](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html). + + For more information about installing Grafana on Kubernetes using the Helm Chart, refer to the [Grafana Helm Chart](https://github.com/grafana/helm-charts/tree/main/charts/grafana#readme). + +1. Use `kubectl set image deployment/my-release grafana=grafana/grafana-enterprise:` to update the container image to Grafana Enterprise version 8.3.0 or later. + + For example, enter `grafana/grafana-enterprise:8.3.3`. + +> Only Grafana Enterprise versions 8.3.0 and later support licenses granted through AWS Marketplace. + +## Task 2: Configure Grafana for high availability + +Grafana requires that you configure a database to hold dashboards, users, and other persistent data. + +### Before you begin + +- Ensure that you have a supported Grafana database available. + - For a list of supported databases, refer to [Supported databases]({{< relref "../../../installation/requirements.md#supported-databases" >}}). + - For information about creating a database, refer to [Creating an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html). +- Review the information required to connect to the RDS DB instance. For more information, refer to [Connecting to an Amazon RDS DB instance](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_CommonTasks.Connect.html). + +To configure Grafana for high availability, choose **one** of the following options: + +- **Option 1:** Use `kubectl edit configmap grafana` to edit `grafana.ini` add the following section to the configuration: + + ``` + [database] + type = [database type] + host = [database address and port] + name = [database name] + user = [database username] + password = [database password] + ``` + +- **Option 2:** use `kubectl edit deployment my-release` to edit the pod `env` variables and add the following database variables: + + ``` + - name: GF_DATABASE_TYPE + value: [database type] + - name: GF_DATABASE_HOST + value: [database address and port] + - name: GF_DATABASE_NAME + value: [database name] + - name: GF_DATABASE_USER + value: [database username] + - name: GF_DATABASE_PASSWORD + value: [database password] + ``` + +For more information on Grafana High Availability setup, refer to [Set up Grafana for high availability]({{< relref "../../../administration/set-up-for-high-availability.md" >}}). + +## Task 3: Configure Grafana Enterprise to validate its license with AWS + +In this task, you configure Grafana Enterprise to validate the license with AWS instead of Grafana Labs. + +1. In AWS IAM, assign the following permissions to the Node IAM role (if you are using a Node Group), or the Pod Execution role (if you are using a Fargate profile): + + - `"license-manager:CheckoutLicense"` + - `"license-manager:ListReceivedLicenses"` + - `"license-manager:GetLicenseUsage"` + - `"license-manager:CheckInLicense"` + + For more information about creating an access policy, refer to [Creating IAM policies (console)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create-console.html). + + For more information about AWS license permissions, refer to [Actions, resources, and condition keys for AWS License Manager](https://docs.aws.amazon.com/service-authorization/latest/reference/list_awslicensemanager.html). + +1. Choose **one** of the following options to update the [license_validation_type]({{< relref "../../enterprise-configuration.md#license_validation_type" >}}) configuration to `aws`: + + - **Option 1:** Use `kubectl edit configmap grafana` to edit `grafana.ini` add the following section to the configuration: + + ``` + [enterprise] + license_validation_type=aws + ``` + + - **Option 2:** Use `kubectl edit deployment my-release` to edit the pod `env` variables and add the following variable: + + ``` + name: GF_ENTERPRISE_LICENSE_VALIDATION_TYPE + value: aws + ``` + +### Task 4: Start or restart Grafana + +To activate Grafana Enterprise features, you must start (or restart) Grafana. + +To restart Grafana on a Kubernetes cluster, + +1. Run the command `kubectl rollout restart deployment my-release`. + +1. After you update the service, navigate to your Grafana instance, sign in with Grafana Admin credentials, and navigate to the Statistics and Licensing page to validate that your license is active. + +For more information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../installation/restart-grafana" >}}). + +> If you experience issues when you update the EKS cluster, refer to [Amazon EKS troubleshooting](https://docs.aws.amazon.com/eks/latest/userguide/troubleshooting.html). diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-instance-outside-aws.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-instance-outside-aws.md new file mode 100644 index 00000000000..7005d31a9c6 --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/activate-license-on-instance-outside-aws.md @@ -0,0 +1,121 @@ ++++ +title = "Activate a Grafana Enterprise license from AWS on an instance deployed outside of AWS" +description = "Activate a Grafana Enterprise license from AWS on an instance deployed outside of AWS" +keywords = ["grafana", "enterprise", "aws", "marketplace", "activate"] +aliases = ["/docs/grafana/latest/enterprise/activate-aws-marketplace-license/activate-license-on-instance-outside-aws"] +weight = 300 ++++ + +# Activate a Grafana Enterprise license from AWS on an instance deployed outside of AWS + +While AWS Marketplace lists ECS and EKS as the supported environments for Grafana Enterprise, you can apply a Grafana Enterprise license from AWS Marketplace to any Grafana instance with network access to the AWS licensing service. + +## Before you begin + +- Purchase a subscription to [Grafana Enterprise from AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-dlncd4kzt5kx6). +- Be sure that the IAM user that was used to purchase Grafana Enterprise has permission to manage subscriptions, create new IAM users, and create access policies. +- Be sure there is network access between AWS and the environment where you intend to run Grafana. Network access is required because your Grafana instance communicates with the [AWS License Manager endpoints and quotas](https://docs.aws.amazon.com/general/latest/gr/licensemanager.html) to retrieve license and subscription information. Grafana instances with access to the public internet will have access to AWS license manager. + +To activate a Grafana Enterprise license from AWS on a Grafana Enterprise instance deployed outside of AWS, complete the following tasks. + +## Task 1: Install Grafana Enterprise + +To install Grafana, refer to the documentation specific to your implementation. + +- [Install Grafana]({{< relref "../../../installation/" >}}). +- [Run Grafana Docker image]({{< relref "../../../installation/docker" >}}). +- [Deploy Grafana on Kubernetes]({{< relref "../../../installation/kubernetes/#deploy-grafana-enterprise-on-kubernetes" >}}). + +## Task 2: Create an AWS IAM user with access to your Grafana Enterprise license + +To retrieve your license, Grafana Enterprise requires access to your AWS account and license information. To grant access, create an IAM user in AWS with access to the license, and pass its credentials as environment variables on the host or container where Grafana is running. These environment variables allow Grafana to retrieve license details from AWS. + +1. In the AWS License Manager service, create an IAM policy with the following permissions: + + - `"license-manager:CheckoutLicense"` + - `"license-manager:ListReceivedLicenses"` + - `"license-manager:GetLicenseUsage"` + - `"license-manager:CheckInLicense"` + + For more information about creating a policy in AWS, refer to [Creating IAM policies](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html). + + For more information about AWS Identity and Access Management, refer to [IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html). + +1. To limit the policy to obtain usage data just for Grafana Enterprise, in the **Resources** section of the policy, specify your license ARN. + + You can find your license ID in the **Granted Licenses** section of [AWS License Manager](https://console.aws.amazon.com/license-manager/home). + + The policy JSON should look similar to the following example: + + ``` + { + "Version": "2012-10-17", + "Statement": [ + { + "Sid": "VisualEditor0", + "Effect": "Allow", + "Action": "license-manager:GetLicenseUsage", + "Resource": "arn:aws:license-manager::[YOUR_ACCOUNT]:license:[YOUR_LICENSE_ID]" + }, + { + "Sid": "VisualEditor1", + "Effect": "Allow", + "Action": [ + "license-manager:CheckoutLicense", + "license-manager:ListReceivedLicenses", + "license-manager:CheckInLicense" + ], + "Resource": "*" + } + ] + } + ``` + +1. Create an IAM user and choose access key credentials as its authentication method. + + For more information about creating an IAM user, refer to [IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users.html). + + For more information about access key credentials, refer to [Managing access keys for IAM users](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_access-keys.html). + +1. Attach the policy you created to the IAM user. + +1. Add the following values as environment variables to the host or container running Grafana: + + - AWS region + - IAM user's access key ID + - IAM user's secret access key + + The environment variables should look similar to the following example: + + ``` + AWS_ACCESS_KEY_ID=ABCD5E75FGHIJKTM7 + AWS_SECRET_ACCESS_KEY=k8fhYAQVy+5NhCejhe6HeSjSphjRuy+12C06 + AWS_REGION=us-east-1 + ``` + +## Task 3: Configure Grafana Enterprise to validate its license with AWS + +In this task you configure Grafana Enterprise to validate the license with AWS instead of Grafana Labs. + +Choose one of the following options to update the [license_validation_type]({{< relref "../../enterprise-configuration.md#license_validation_type" >}}) configuration to `aws`: + +- **Option 1:** In the `[enterprise]` section of the grafana.ini configuration file, add `license_validation_type=aws`. + + For example: + + ``` + [enterprise] + license_validation_type=aws + ``` + +- **Option 2:** Add the following environment variable to the container or host: + + ``` + GF_ENTERPRISE_LICENSE_VALIDATION_TYPE=aws + ``` + +## Task 4: Start or restart Grafana + +To activate Grafana Enterprise features, start (or restart) Grafana. + +For information about restarting Grafana, refer to [Restart Grafana]({{< relref "../../../installation/restart-grafana" >}}). diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/manage-license-in-aws-marketplace.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/manage-license-in-aws-marketplace.md new file mode 100644 index 00000000000..0c7b7695973 --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/manage-license-in-aws-marketplace.md @@ -0,0 +1,31 @@ ++++ +title = "Manage your Grafana Enterprise license in AWS Marketplace" +description = "Manage your Grafana Enterprise license in AWS Marketplace" +keywords = ["grafana", "enterprise", "aws", "marketplace", "manage", "add", "remove", "users"] +aliases = ["/docs/grafana/latest/enterprise/activate-aws-marketplace-license/manage-license-in-aws-marketplace"] +weight = 400 ++++ + +## Manage your Grafana Enterprise license in AWS Marketplace + +You can use AWS Marketplace to make the following modifications to your Grafana Enterprise license: + +- Add active users +- Remove active users +- Cancel your subscription to Grafana Enterprise. + +**To modify your Grafana Enterprise subscription in AWS Marketplace:** + +1. Open the AWS Console and navigate to [Subscription Management](https://console.aws.amazon.com/marketplace/home/subscriptions#/subscriptions). + +1. Update your license. + +1. Sign in to Grafana as a Server Administrator. + +1. Hover over **Server Admin** in the navigation bar and click **Statistics and Licensing**. + +1. In the **Token** section under **Enterprise License**, click **Renew License**. + + This action retrieves updated license information from AWS. + +> To learn more about licensing and active users, refer to [Understanding Grafana Enterprise licensing]({{< relref "../../license/license-restrictions" >}}). diff --git a/docs/sources/enterprise/license/activate-aws-marketplace-license/transfer-ge-license.md b/docs/sources/enterprise/license/activate-aws-marketplace-license/transfer-ge-license.md new file mode 100644 index 00000000000..22c71027c55 --- /dev/null +++ b/docs/sources/enterprise/license/activate-aws-marketplace-license/transfer-ge-license.md @@ -0,0 +1,22 @@ ++++ +title = "Transfer your AWS Marketplace Grafana Enterprise license" +description = "Transfer your AWS Marketplace Grafana Enterprise license" +keywords = ["grafana", "enterprise", "aws", "marketplace", "transfer", "move"] +aliases = ["/docs/grafana/latest/enterprise/activate-aws-marketplace-license/transfer-ge-license"] +weight = 400 ++++ + +# Transfer your AWS Marketplace Grafana Enterprise license + +You can transfer your AWS Marketplace Grafana Enterprise license to another Grafana Enterprise instance. The transfer process requires that you first remove your license from one instance, and then apply the license to another instance. + +> When you remove an Enterprise license, the system immediately disables all Grafana Enterprise features. + +To remove an Enterprise license from a Grafana Enterprise instance, perform one of the following steps: + +- If you are using Amazon ECS or Amazon EKS, remove the `GF_ENTERPRISE_LICENSE_VALIDATION_TYPE` environment variable from the container. +- If you have deployed Grafana Enterprise outside of AWS, remove the `aws` license_validation_type value from the grafana.ini configuration file. + +It can take the system up to one hour to clear the license. After the system clears the license, you can apply the same license to another Grafana Enterprise instance. + +To determine that the system has returned your license, check the license details in AWS License Manager. diff --git a/docs/sources/enterprise/license/license-restrictions.md b/docs/sources/enterprise/license/license-restrictions.md index 023c7a138d2..b820c798eb6 100644 --- a/docs/sources/enterprise/license/license-restrictions.md +++ b/docs/sources/enterprise/license/license-restrictions.md @@ -6,66 +6,168 @@ aliases = ["/docs/grafana/latest/enterprise/license-restrictions"] weight = 300 +++ -# License restrictions +# Understanding Grafana Enterprise licensing -Enterprise licenses are limited by the number of active users, the license expiration date, and the URL of the Grafana instance. +When you become a Grafana Enterprise customer, you receive a license that governs your use of Grafana Enterprise. -## User limits +You either have: -Users are limited by the number of active users and the number of concurrent sessions for a given account. +- tiered licensing, or +- combined licensing + +To understand which license type you have, refer to [Determine the number of active users for each licensed role](#determine-the-number-of-active-users-for-each-licensed-role). + +## Tiered licensing + +Tiered licensing defines dashboard viewers, and dashboard editors and administrators, as two distinct user types that each have their own user limit. + +For example, your license might include 300 viewers and 50 editors or administrators. Although editors and administrators have separate permissions and can do different things, Grafana counts them together as a single licensed role. ### Active users limit -Grafana licenses allow for a certain number of active users per instance. An active user is any user that has signed in to Grafana within the past 30 days. +Your Grafana license includes a maximum number of _Viewer_ and _Editor/Admin_ active users. For example, your license can include a maximum of 500 viewers and 100 editor/admins. -In the context of licensing, each user is classified as either a viewer or an editor/admin. This classification is the user's **licensed role**, and it can be different from that user's [organization role]({{< relref "../../permissions/organization_roles.md" >}}) in Grafana. +- An _active user_ is a user who has signed in to Grafana within the last 30 days. This is a rolling window that is updated daily. +- When you reach the number of maximum active viewers or editor/admins, only currently active users can sign in; new users and non-active users cannot sign in when you reach the limit. +- Grafana applies sign-in restrictions separately for viewers and editor/admins. If your Grafana license reaches its limit of active viewers but not its limit of active editor/ddmins, new editors and admins can still sign in. +- The number of dashboards that a user can view or edit, and the number of organizations that they can access does not affect the active user count. A user with editor permissions for many dashboards across many different organizations counts as one editor. +- A license limit banner appears to administrators when Grafana reaches its active user limit; editors and viewers do not see the banner. + To change user roles to make better use of your licenses, refer to [Optimize your tiered license](#optimize-your-tiered-license). -- An editor/admin is a user who has permission to edit and save a dashboard. Examples of editors are as follows: - - Grafana server administrators. - - Users who are assigned an organization role of Editor or Admin. - - Users who have been granted admin or edit permissions at the dashboard or folder level. Refer to [Dashboard and folder permissions]({{< relref "../../permissions/dashboard-folder-permissions.md" >}}). This means that even if a user is assigned to an organization role of Viewer they will be counted as an editor. -- A viewer is a user with the Viewer role, which does not permit the user to save a dashboard. +### Permission domains -Additional details: +You can assign role permissions _globally_ and restrict access to a specific dashboard or set of dashboards. -- When the number of maximum active viewers or editor/admins is reached, only those currently active users can sign in. New users or non-active users cannot sign in. -- A license limit banner will appear to admins when Grafana reaches its active user limit. Editor/admins and viewers will not see the banner. -- To see how many active users you have in each licensed role (Viewer or Editor/Admin), refer to the Licensing page in the Server Admin section of Grafana, which is located at `[your-grafana-url.com]/admin/licensing`. Please note that _licensed_ roles can differ from the Active Viewer/Editor/Admin counts on the /admin/stats page in Grafana. This is because the Stats page only counts a user's assigned organization role and does not account for dashboard and folder permissions. -- Restrictions are applied separately for viewers and editor/admins. If a Grafana instance reaches its limit of active viewers but not its limit of active editor/admins, new editors and admins will still be able to sign in. -- You can change a user's licensed role by updating their permissions in Grafana (their role or their dashboard/folder permissions). Their new role will go into effect the next time that user signs in. -- Active user counts are not affected by the number of dashboards, folders, or organizations a user can edit or admin. An active user who can edit many dashboards or folders in many different orgs is still counted as a single editor. +**Organization permissions**: When you create a user, you select a role on the user details page. Your selection applies to all Grafana dashboards within the Organization. For example, a user with the viewer role can see all dashboards, but cannot create or edit dashboards. For more information about user roles and permissions, refer to +[Organization roles]({{< relref "../../permissions/organization_roles.md" >}}). -### Concurrent sessions limit +**Dashboard permissions**: You can also assign permissions to dashboards or groups (folders) of dashboards. For example, you might want a viewer to also have editor permissions for a specific dashboard. While that user can see _all_ dashboards, they can only update one of them. For more information about dashboard permissions, refer to [Dashboard and Folder Permissions]({{< relref "../../permissions/dashboard-folder-permissions.md" >}}). -Sometimes it is useful to sign in to an account from multiple locations simultaneously. As of Grafana Enterprise 7.5+, accounts are limited to the number of concurrent sessions authorized in each license, which is typically three. A new session is created when a user signs in to Grafana from a new device, a different browser, or an incognito window. If a user signs in to Grafana from another tab or window within the same browser, then only one session is used. +When you grant editor/admin dashboard permissions to a viewer, the editor/admin active-user count increases by one as shown on the **Utilization** panel of the **Statistics and licensing** page, and the user’s licensed role changes to editor/admin. -Given a limit of three sessions, the longest inactive session is signed out of Grafana when a fourth person signs in to the same account. +> The editor/admin count increases because the user can edit and save a dashboard. -### Usage billing +### Grant dashboard edit without save permissions -You can request Grafana Labs to turn on usage billing to allow an unlimited number of active users. When usage billing is enabled, Grafana does not enforce active user limits or display warning banners. Instead, you are charged for active users above the limit, according to your customer contract. +You can grant viewers the ability to edit but not save a dashboard. This setting is useful when you have users that want to explore dashboards, but only need the generated view temporarily and do not require an editor/admin license. -Usage billing involves a contractual agreement between you and Grafana Labs, and it is only available if Grafana Enterprise is configured to [automatically refresh its license]({{< relref "../enterprise-configuration.md#auto_refresh_license" >}}). +> This setting does not affect viewers’ license role billing. -## Expiration date +To grant dashboard edit without save permissions: -The license expiration date is the date when a license is no longer active. As the license expiration date approaches, Grafana Enterprise displays a banner. +1. Open the `grafana.ini` file that contains default configurations. -## License URL + The name and location of the file depends on your installation. For information about locating + the default configurations file, refer to [Configuration]({{< relref "../../administration/configuration.md" >}}). -License URL is the root URL of your Grafana instance. The license will not work on an instance of Grafana with a different root URL. +1. Change the `viewers-can-edit` setting to `true`. +1. Restart Grafana Enterprise. -## Download a dashboard and folder permissions report +### Determine the number of active users for each licensed role -This CSV report helps to identify users, teams, and roles that have been granted Admin or Edit permissions at the dashboard or folder level. +Because you can assign a user global permissions while also enhancing (or limiting) their access to specific dashboards, it might be helpful for you to periodically check license counts. -To download the report: +To determine the number of active users for each licensed role: -1. Hover your cursor over the **Server Admin** (shield) icon in the side menu and then click **Licensing**. -1. At the bottom of the page, click **Download report**. +1. Sign in to Grafana Enterprise as a System Administrator. -## Update license restrictions +1. Click **Server Admin** (the shield icon). + +1. Click **Statistics and licensing**. + +1. Review the role utilization count on the **Utilization** panel. + +> Utilization data updates when the user signs back in to Grafana after you change their permissions. + +### Optimize your tiered license + +Grafana counts viewer users separately from editor/admin users. If you reach the limit imposed by your license for either of these user types, use the following techniques to make optimum use of the licenses you purchased. + +- **Review and update organization permissions.** You can modify organization permissions to reduce the count of one type of user. For example, if you reach the limit of editor/admin users, assign viewer permissions to one (or more) editor/admin users who agree to read-only access to dashboards. The license count updates when a user signs back in to Grafana. +- **Review and update dashboard permissions.** Because viewers can also count toward editor/admin usage, if they are granted access to edit specific dashboards, review your dashboard permissions and adjust accordingly. Remove editor or admin permissions where necessary. +- **Delete users.** Review the number of users you have for each type of permission and remove inactive users. Removing users immediately frees up space for new users. + +> When you delete a user you also delete their preferences, dashboard and folder permissions, and references to that user from the dashboard versions they have updated. + +Users who are synced via SAML, Oauth, or LDAP will also lose these attributes. + +### Update user permissions for dashboards + +You can change the access a user has to specific dashboards. For billing purposes, Grafana charges for the highest level permission assigned to the user. For example, if you assign editor/admin dashboard permissions to a viewer user, Grafana counts that user as an editor/admin. + +To change user permissions for dashboards: + +1. Sign in to Grafana as a system administrator. + +1. Hover your mouse over **Server Admin** (the shield icon) and click **Statistics and licensing**. + +1. In the **Dashboard and Folder Permissions** area, click the dashboard in the \*\*Resource title (URL) column. + + The **Permission** page opens. + +1. Use the dropdown list to select a role. + +The next time the user signs in, the **Utilization** panel on the **Statistics and licensing** page displays updated data. + +## Combined licensing + +As of Grafana Enterprise Version 8.3, you can purchase (or transition to) combined licensing. With combined licensing, you purchase a specific number of users, and you are free to distribute those users across all roles, in any combination. +For example, if you purchase 150 licenses, you can have 20 admins, 70 editors, and 60 viewers, or you can have 10 admins, 100 editors, and 40 viewers. This change reduces license complexity. + +### Transition to combined license model + +To transition from the tiered licensing model to the combined license model, contact your Grafana account team and request to switch to combined user pricing. Once you update your contract with the account team, they will issue you a new license token. +For instructions about how to update your license, refer to [Activate an Enterprise license]({{< relref "./activate-license.md" >}}). + +After you apply the token, Grafana Enterprise resets your license and updates the user counts on the **Utilization** panel. + +> If you are running Grafana Enterprise 8.2 or earlier, the license grants you the total number of licensed users _for each user type_. + +For example, if your current license includes 60 viewers and 40 dditor/admins, the new license includes 100 viewers and 100 editor/admins. Grafana Enterprise 8.3 removes the distinction between viewers and editor/admins as shown on the **Utilization** panel. + +Before you upgrade to Grafana 8.3, ensure that the total number of active users in Grafana does not exceed the number of users in your combined license. If it does, then new users cannot sign in to Grafana 8.3 until the active user count returns below the licensed limit. + +## Determining your current license type + +You can identify your license type in Grafana 8.3 and higher. If you are running Grafana 8.2 or older, refer to your contract to determine your license type. + +To determine if you have tiered pricing or combined pricing, complete the following steps in Grafana v8.3 or higher: + +1. Sign in to Grafana as a system administrator. + +1. Hover your mouse over **Server Admin** (the shield icon), and click **Statistics and licensing**. + +1. In the **Utilization** panel, review the license count data. + + - If you see **Admins & Editors** and **Viewers**, then you have a tiered license. + - If you only see **Users**, then you have a combined license. + +## License restrictions common to both license types + +Your license is controlled by the following rules: + +**License expiration date:** The license includes an expiration date, which is the date when a license becomes inactive. + +As the license expiration date approaches, you will see a banner in Grafana that encourages you to renew. To learn about how to renew your license and what happens in Grafana when a license expires, refer to [License expiration]({{< relref "./license-expiration.md" >}}). + +**Grafana License URL:** Your license does not work with an instance of Grafana with a different root URL. + +The License URL is the root URL of your Grafana instance. + +**Concurrent sessions limit**: As of Grafana Enterprise 7.5, users can initiate up to three concurrent sessions of Grafana. + +The system creates a session when a user signs in to Grafana from a new device, a different browser, or an incognito window. If a user signs in to Grafana from another tab or window within the same browser, only one session is used. + +When a user reaches the session limit, the fourth connection succeeds and the longest inactive session is signed out. + +## Request usage billing + +You can request Grafana Labs to activate usage billing which allows an unlimited number of active users. When usage billing is enabled, Grafana does not enforce active user limits or display warning banners. Instead, you are charged for active users that exceed the limit, according to your customer contract. + +Usage billing involves a contractual agreement between you and Grafana Labs, and it is only available if Grafana Enterprise is configured to [automatically refresh its license token]({{< relref "../enterprise-configuration.md#auto_refresh_license" >}}). + +## Request a change to your license To increase the number of licensed users within Grafana, extend a license, or change your licensed URL, contact [Grafana support](https://grafana.com/profile/org#support) or your Grafana Labs account team. They will update your license, which you can activate from within Grafana. -For instructions on how to activate your license after it is updated, refer to [Activate an Enterprise license]({{< relref "./activate-license.md" >}}). +For instructions about how to activate your license after it is updated, refer to [Activate an Enterprise license]({{< relref "./activate-license.md" >}}). diff --git a/docs/sources/enterprise/query-caching.md b/docs/sources/enterprise/query-caching.md index a5cd8c244c5..bab8740d919 100644 --- a/docs/sources/enterprise/query-caching.md +++ b/docs/sources/enterprise/query-caching.md @@ -53,7 +53,6 @@ By default, data source queries are not cached. To enable query caching for a si 1. On the side menu, click Configuration > Data Sources. 1. In the data source list, click the data source that you want to turn on caching for. -1. In the Cache tab, click Enable. 1. Open the Cache tab. 1. Press the Enable button. 1. (Optional) Choose a custom TTL for that data source. If you skip this step, then Grafana uses the default TTL. diff --git a/docs/sources/enterprise/recorded-queries.md b/docs/sources/enterprise/recorded-queries.md new file mode 100644 index 00000000000..2990f0bf46b --- /dev/null +++ b/docs/sources/enterprise/recorded-queries.md @@ -0,0 +1,66 @@ ++++ +title = "Recorded queries" +description = "Grafana Enterprise recorded queries" +keywords = ["grafana", "query", "queries", "recorded"] +weight = 300 ++++ + +# Recorded queries + +Recorded queries allow you to see trends over time by taking a snapshot of a data point on a set interval. This can give you insight into historic trends. + +For our plugins that do not return time series, it might be useful to plot historical data. For example, you might want to query ServiceNow to see a history of request response times but it can only return current point-in-time metrics. + +## How recorded queries work + +> **Note:** An administrator must configure a Prometheus data source and associate it with a [Remote write target](#remote-write-target) before recorded queries can be used. + +Recorded queries only work with backend data source plugins. Refer to [Backend data source plugin](https://grafana.com/tutorials/build-a-data-source-backend-plugin/) for more information about backend data source plugins. You can recorded three types of queries: + +- single row and column - A query that returns a single row and column. +- row count - A query that returns meaningful rows to be counted. +- expression - Any expression. To learn more about creating and using expressions, see [Expressions](https://grafana.com/docs/grafana/latest/panels/expressions/). + +After a recorded query is created or enabled, it immediately creates a snapshot and continues to create snapshots at the set interval. The recorded query stops taking snapshots when it is disabled, deleted, or when Grafana is not running. Data points are gathered in the backend by running the recorded query and forwarding each result to a remote-write enabled Prometheus instance. + +## Using a recorded query + +To use a recorded query, create one and add it to a dashboard. After that, it can be managed in **Preferences** from the **Recorded queries** tab. + +### Create a recorded query + +1. Find/create a query you want to record on a dashboard in an edit panel. The query must only return one row and column. If it returns more, you can still record the number of results returned using the “count” option. + - The query's data source must be a backend data source. + - Expressions can be used to aggregate data from a time series query. Refer to [Expressions](https://grafana.com/docs/grafana/latest/panels/expressions/) to learn more about creating and using expressions. +1. Click the record query button located in the top right of the query editor. +1. Enter recorded query information. All fields are required unless otherwise indicated. + - Name - Name of the recorded query. + - Description - (optional) Describe the recorded query as you want it to appear in the recorded query list. + - Interval - The interval on which the snapshot will be taken. The interval starts when you create the recorded query and will stop if you pause or delete the recorded query. Refer to [Managing recorded queries](#manage-recorded-queries) for more information on pausing and deleting recorded queries. + - Range - The relative time range of the query. If you select a range of `30m` and an interval of `1h` the query will take a snapshot every hour of the past 30 minutes. + - Count query results - If you want to count the rows returned from your query toggle this option on. If this option is off, your query must return one row with one value. +1. Test your recorded query by clicking the test recorded query button. +1. Click `Start recording query` to start recording your query. + +### Add a recorded query + +You can add existing recorded queries to panels in a dashboard. For each recorded query that you add, a Prometheus query is created: `generated_recorded_query_name{id="generated_id", name="recorded query name"}`. The created query from Prometheus returns all the recorded query’s gathered snapshots. + +1. Navigate to a panel in a dashboard where you wish to add a recorded query. +1. Click the `+ Recorded query` button located below the queries. +1. If you want to filter recorded queries by data source, select a data source from the filter by data source drop down menu. +1. Click the `Add` button on your recorded query to add it to the panel. + +After adding your recorded query to the panel, the panel data source will become `-- Mixed --`. Your recorded query is represented by a `Prometheus` query with a name label matching your recorded query name. Refer to [Prometheus](https://grafana.com/docs/grafana/latest/datasources/prometheus/) to learn more about the `Prometheus` data source. + +If after adding a recorded query, a query with a `-- Mixed --` data source instead of `Prometheus` data source appears, this could mean that a Prometheus remote write target was not set up for recorded queries. Refer to [Remote write target](#remote-write-target) to set up a remote write point. + +### Manage recorded queries + +Recorded queries can be paused/activated and deleted from the Recorded queries tab in Preferences. Deleting a recorded query will remove it from Grafana, but the information that was gathered in Prometheus will still be there. Pausing a recorded query will no longer gather new data points until it is resumed. + +### Remote write target + +The remote write target is the Prometheus data source that recorded query data points are written to. You will need a Prometheus with remote write enabled and you will need to create a data source for this Prometheus. + +The remote write target can be edited by clicking `Edit Remote Write Target` in the upper right on the Recorded Queries tab in Preferences. Select the Prometheus data source that has remote write enabled and enter the remote write path. diff --git a/docs/sources/explore/logs-integration.md b/docs/sources/explore/logs-integration.md index 940fa111bca..e62035b2698 100644 --- a/docs/sources/explore/logs-integration.md +++ b/docs/sources/explore/logs-integration.md @@ -21,11 +21,15 @@ During an infrastructure monitoring and incident response, you can dig deeper in ### Logs visualization -Results of log queries are shown as histograms in the graph and individual logs are displayed below. If the data source does not send histogram data for the requested time range, the logs model computes a time series based on the log row counts bucketed by an automatically calculated time interval and the start of the histogram is then anchored by the first log row's timestamp from the result. The end of the time series is anchored to the time picker's **To** range. +Results of log queries are shown as histograms in the graph and individual logs are explained in the following sections. + +If the data source supports a full range log volume histogram, the graph with log distribution for all entered log queries is shown automatically. This feature is currently supported by Elasticsearch data source. + +If the data source does not support loading full range log volume histogram, the logs model computes a time series based on the log row counts bucketed by an automatically calculated time interval, and the first log row's timestamp then anchors the start of the histogram from the result. The end of the time series is anchored to the time picker's **To** range. #### Log level -For logs where a **level** label is specified, we use the value of the label to determine the log level and update color accordingly. If the log doesn't have a level label specified, we parse the log to find out if its content matches any of the supported expressions (see below for more information). The log level is always determined by the first match. In case Grafana is not able to determine a log level, it will be visualized with **unknown** log level. +For logs where a level label is specified, we use the value of the label to determine the log level and update color accordingly. If the log doesn't have a level label specified, we try to parse the log using logfmt and JSON parsers to find out if its content matches any of the supported expressions (see below for more information). The log level is always determined by the first match. In case Grafana is not able to determine a log level, it will be visualized with an unknown log level. **Supported log levels and mapping of log level abbreviation and expressions:** diff --git a/docs/sources/getting-started/getting-started-prometheus.md b/docs/sources/getting-started/getting-started-prometheus.md index ab6ae5c7b1a..35366e296d3 100644 --- a/docs/sources/getting-started/getting-started-prometheus.md +++ b/docs/sources/getting-started/getting-started-prometheus.md @@ -8,7 +8,7 @@ weight = 300 # Getting started with Grafana and Prometheus -Prometheus is an open source systems monitoring system for which Grafana provides out-of-the-box support. This topic walks you through the steps to create a series of dashboards in Grafana to display system metrics for a server monitored by Prometheus. +Prometheus is an open source monitoring system for which Grafana provides out-of-the-box support. This topic walks you through the steps to create a series of dashboards in Grafana to display system metrics for a server monitored by Prometheus. > **Note:** You can configure a [Grafana Cloud](https://grafana.com/docs/grafana-cloud/) instance to display system metrics without having to host Grafana yourself. A [free forever plan](https://grafana.com/signup/cloud/connect-account?pg=gsdocs) provides 10,000 active series for metrics. diff --git a/docs/sources/http_api/_index.md b/docs/sources/http_api/_index.md index c5873e0eb3e..67b048d7bd8 100644 --- a/docs/sources/http_api/_index.md +++ b/docs/sources/http_api/_index.md @@ -6,27 +6,27 @@ aliases = ["/docs/grafana/latest/overview"] weight = 170 +++ -# HTTP API Reference +# HTTP API reference -The Grafana backend exposes an HTTP API, the same API is used by the frontend to do everything from saving -dashboards, creating users and updating data sources. +The Grafana backend exposes an HTTP API, which is the same API that is used by the frontend to do everything from saving +dashboards, creating users, and updating data sources. ## HTTP APIs - [Authentication API]({{< relref "auth.md" >}}) - [Dashboard API]({{< relref "dashboard.md" >}}) -- [Dashboard Versions API]({{< relref "dashboard_versions.md" >}}) -- [Dashboard Permissions API]({{< relref "dashboard_permissions.md" >}}) +- [Dashboard versions API]({{< relref "dashboard_versions.md" >}}) +- [Dashboard permissions API]({{< relref "dashboard_permissions.md" >}}) - [Folder API]({{< relref "folder.md" >}}) -- [Folder Permissions API]({{< relref "folder_permissions.md" >}}) +- [Folder permissions API]({{< relref "folder_permissions.md" >}}) - [Folder/dashboard search API]({{< relref "folder_dashboard_search.md" >}}) -- [Data Source API]({{< relref "data_source.md" >}}) +- [Data source API]({{< relref "data_source.md" >}}) - [Organization API]({{< relref "org.md" >}}) - [Snapshot API]({{< relref "snapshot.md" >}}) - [Annotations API]({{< relref "annotations.md" >}}) - [Playlists API]({{< relref "playlist.md" >}}) - [Alerting API]({{< relref "alerting.md" >}}) -- [Alert Notification Channels API]({{< relref "alerting_notification_channels.md" >}}) +- [Alert notification channels API]({{< relref "alerting_notification_channels.md" >}}) - [User API]({{< relref "user.md" >}}) - [Team API]({{< relref "team.md" >}}) - [Admin API]({{< relref "admin.md" >}}) @@ -37,8 +37,8 @@ dashboards, creating users and updating data sources. Grafana Enterprise includes all of the Grafana OSS APIs as well as those that follow: -- [Fine-Grained Access Control API]({{< relref "access_control.md" >}}) -- [Data Source Permissions API]({{< relref "datasource_permissions.md" >}}) -- [External Group Sync API]({{< relref "external_group_sync.md" >}}) +- [Fine-grained access control API]({{< relref "access_control.md" >}}) +- [Data source permissions API]({{< relref "datasource_permissions.md" >}}) +- [External group sync API]({{< relref "external_group_sync.md" >}}) - [License API]({{< relref "licensing.md" >}}) - [Reporting API]({{< relref "reporting.md" >}}) diff --git a/docs/sources/http_api/access_control.md b/docs/sources/http_api/access_control.md index a69718203a0..f9b5f9a0dda 100644 --- a/docs/sources/http_api/access_control.md +++ b/docs/sources/http_api/access_control.md @@ -86,19 +86,21 @@ Content-Type: application/json; charset=UTF-8 [ { - "version": 1, - "uid": "Kz9m_YjGz", - "name": "fixed:reporting:admin:edit", - "description": "Gives access to edit any report or the organization's general reporting settings.", - "global": true, - "updated": "2021-05-13T16:24:26+02:00", - "created": "2021-05-13T16:24:26+02:00" + "version": 3, + "uid": "XvHQJq57z", + "name": "fixed:reports:reader", + "displayName": "Report reader", + "description": "Read all reports and shared report settings.", + "group": "Reports", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00", + "global": false }, { "version": 5, "uid": "vi9mlLjGz", - "name": "fixed:permissions:admin:read", - "description": "Gives access to read and list roles and permissions, as well as built-in role assignments.", + "name": "fixed:datasources.permissions:writer", + "description: "Create, read or delete data source permissions.", "global": true, "updated": "2021-05-13T22:41:49+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -141,27 +143,59 @@ HTTP/1.1 200 OK Content-Type: application/json; charset=UTF-8 { - "version": 2, - "uid": "jZrmlLCGk", - "name": "fixed:permissions:admin:edit", - "description": "Gives access to create, update and delete roles, as well as manage built-in role assignments.", - "global": true, + "version": 4, + "uid": "6dNwJq57z", + "name": "fixed:reports:writer", + "displayName": "Report writer", + "description": "Create, read, update, or delete all reports and shared report settings.", + "group": "Reports", "permissions": [ { - "action": "roles:delete", - "scope": "permissions:delegate", - "updated": "2021-05-13T16:24:26+02:00", - "created": "2021-05-13T16:24:26+02:00" + "action": "reports:delete", + "scope": "reports:*", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" }, { - "action": "roles:list", - "scope": "roles:*", - "updated": "2021-05-13T16:24:26+02:00", - "created": "2021-05-13T16:24:26+02:00" + "action": "reports:read", + "scope": "reports:*", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" + }, + { + "action": "reports:send", + "scope": "reports:*", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" + }, + { + "action": "reports.admin:create", + "scope": "", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" + }, + { + "action": "reports.admin:write", + "scope": "reports:*", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" + }, + { + "action": "reports.settings:read", + "scope": "", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" + }, + { + "action": "reports.settings:write", + "scope": "", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00" } ], - "updated": "2021-05-13T16:24:26+02:00", - "created": "2021-05-13T16:24:26+02:00" + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00", + "global": false } ``` @@ -170,7 +204,7 @@ Content-Type: application/json; charset=UTF-8 | Code | Description | | ---- | -------------------------------------------------------------------- | | 200 | Role is returned. | -| 403 | Access denied | +| 403 | Access denied. | | 500 | Unexpected error. Refer to body and/or server logs for more details. | ### Create a new custom role @@ -199,8 +233,11 @@ Content-Type: application/json "version": 1, "uid": "jZrmlLCGka", "name": "custom:delete:roles", + "displayName": "custom delete roles", "description": "My custom role which gives users permissions to delete roles", - "global": true, + "group":"My Group", + "displayName": "My Custom Role", + "global": false, "permissions": [ { "action": "roles:delete", @@ -219,6 +256,8 @@ Content-Type: application/json | version | number | No | Version of the role. If not present, version 0 will be assigned to the role and returned in the response. Refer to the [Custom roles]({{< relref "../enterprise/access-control/roles.md#custom-roles" >}}) for more information. | | name | string | Yes | Name of the role. Refer to [Custom roles]({{< relref "../enterprise/access-control/roles.md#custom-roles" >}}) for more information. | | description | string | No | Description of the role. | +| displayName | string | No | Display name of the role, visible in the UI. | +| group | string | No | The group name the role belongs to. | | permissions | Permission | No | If not present, the role will be created without any permissions. | **Permission** @@ -238,8 +277,11 @@ Content-Type: application/json; charset=UTF-8 "version": 2, "uid": "jZrmlLCGka", "name": "custom:delete:create:roles", + "displayName": "custom delete create roles", "description": "My custom role which gives users permissions to delete and create roles", - "global": true, + "group":"My Group", + "displayName": "My Custom Role", + "global": false, "permissions": [ { "action": "roles:delete", @@ -287,8 +329,11 @@ Content-Type: application/json { "version": 3, "name": "custom:delete:write:roles", + "displayName": "custom delete write roles", "description": "My custom role which gives users permissions to delete and write roles", - "global": true, + "group":"My Group", + "displayName": "My Custom Role", + "global": false, "permissions": [ { "action": "roles:delete", @@ -309,6 +354,8 @@ Content-Type: application/json | version | number | Yes | Version of the role. Must be incremented for update to work. | | name | string | Yes | Name of the role. | | description | string | No | Description of the role. | +| displayName | string | No | Display name of the role, visible in the UI. | +| group | string | No | The group name the role belongs to. | | permissions | List of Permissions | No | The full list of permissions the role should have after the update. | **Permission** @@ -328,7 +375,10 @@ Content-Type: application/json; charset=UTF-8 "version":3, "uid":"jZrmlLCGka", "name":"custom:delete:write:roles", + "displayName":"custom delete write roles", "description":"My custom role which gives users permissions to delete and write roles", + "group":"My Group", + "displayName": "My Custom Role", "permissions":[ { "action":"roles:delete", @@ -345,7 +395,7 @@ Content-Type: application/json; charset=UTF-8 ], "updated":"2021-08-06T18:27:41+02:00", "created":"2021-08-06T18:27:40+02:00", - "global":true + "global":false } ``` @@ -377,7 +427,7 @@ For example, if a user does not have required permissions for creating users, th #### Example request ```http -DELETE /api/access-control/roles/jZrmlLCGka?force=true&global=true +DELETE /api/access-control/roles/jZrmlLCGka?force=true&global=false Accept: application/json ``` @@ -407,6 +457,275 @@ Content-Type: application/json; charset=UTF-8 | 403 | Access denied | | 500 | Unexpected error. Refer to body and/or server logs for more details. | +## Create and remove user role assignments + +### List roles assigned to a user + +`GET /api/access-control/users/:userId/roles` + +Lists the roles that have been directly assigned to a given user. The list does not include built-in roles (Viewer, Editor, Admin or Grafana Admin), and it does not include roles that have been inherited from a team. + +#### Required permissions + +| Action | Scope | +| ---------------- | -------------------- | +| users.roles:list | users:id:`` | + +#### Example request + +```http +GET /api/access-control/users/1/roles +Accept: application/json +``` + +#### Example response + +```http +HTTP/1.1 200 OK +Content-Type: application/json; charset=UTF-8 + +[ + { + "version": 4, + "uid": "6dNwJq57z", + "name": "fixed:reports:writer", + "displayName": "Report writer", + "description": "Create, read, update, or delete all reports and shared report settings.", + "group": "Reports", + "updated": "2021-11-19T10:48:00+01:00", + "created": "2021-11-19T10:48:00+01:00", + "global": false + } +] +``` + +#### Status codes + +| Code | Description | +| ---- | -------------------------------------------------------------------- | +| 200 | Set of assigned roles is returned. | +| 403 | Access denied. | +| 500 | Unexpected error. Refer to body and/or server logs for more details. | + +### List permissions assigned to a user + +`GET /api/access-control/users/:userId/permissions` + +Lists the permissions that a given user has. + +#### Required permissions + +| Action | Scope | +| ---------------------- | -------------------- | +| users.permissions:list | users:id:`` | + +#### Example request + +```http +GET /api/access-control/users/1/permissions +Accept: application/json +``` + +#### Example response + +```http +HTTP/1.1 200 OK +Content-Type: application/json; charset=UTF-8 + +[ + { + "action": "ldap.status:read", + "scope": "" + }, + { + "action": "ldap.user:read", + "scope": "" + } +] +``` + +#### Status codes + +| Code | Description | +| ---- | -------------------------------------------------------------------- | +| 200 | Set of assigned permissions is returned. | +| 403 | Access denied. | +| 500 | Unexpected error. Refer to body and/or server logs for more details. | + +### Add a user role assignment + +`POST /api/access-control/users/:userId/roles` + +Assign a role to a specific user. + +For bulk updates consider +[Set user role assignments]({{< ref "#set-user-role-assignments" >}}). + +#### Required permissions + +`permission:delegate` scope ensures that users can only assign roles which have same, or a subset of permissions which the user has. +For example, if a user does not have required permissions for creating users, they won't be able to assign a role which will allow to do that. This is done to prevent escalation of privileges. + +| Action | Scope | +| --------------- | -------------------- | +| users.roles:add | permissions:delegate | + +#### Example request + +```http +POST /api/access-control/users/1/roles +Accept: application/json +Content-Type: application/json + +{ + "global": false, + "roleUid": "XvHQJq57z" +} +``` + +#### JSON body schema + +| Field Name | Data Type | Required | Description | +| ---------- | --------- | -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| roleUid | string | Yes | UID of the role. | +| global | boolean | No | A flag indicating if the assignment is global or not. If set to `false`, the default org ID of the authenticated user will be used from the request to create organization local assignment. | + +#### Example response + +```http +HTTP/1.1 200 OK +Content-Type: application/json; charset=UTF-8 + +{ + "message": "Role added to the user." +} +``` + +#### Status codes + +| Code | Description | +| ---- | -------------------------------------------------------------------- | +| 200 | Role is assigned to a user. | +| 403 | Access denied. | +| 404 | Role not found. | +| 500 | Unexpected error. Refer to body and/or server logs for more details. | + +## Remove a user role assignment + +`DELETE /api/access-control/users/:userId/roles/:roleUID` + +Revoke a role from a user. + +For bulk updates consider +[Set user role assignments]({{< ref "#set-user-role-assignments" >}}). + +#### Required permissions + +`permission:delegate` scope ensures that users can only unassign roles which have same, or a subset of permissions which the user has. +For example, if a user does not have required permissions for creating users, they won't be able to unassign a role which will allow to do that. This is done to prevent escalation of privileges. + +| Action | Scope | +| ------------------ | -------------------- | +| users.roles:remove | permissions:delegate | + +#### Query parameters + +| Param | Type | Required | Description | +| ------ | ------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| global | boolean | No | A flag indicating if the assignment is global or not. If set to `false`, the default org ID of the authenticated user will be used from the request to remove assignment. | + +#### Example request + +```http +DELETE /api/access-control/users/1/roles/AFUXBHKnk +Accept: application/json +``` + +#### Example response + +```http +HTTP/1.1 200 OK +Content-Type: application/json; charset=UTF-8 + +{ + "message": "Role removed from user." +} +``` + +#### Status codes + +| Code | Description | +| ---- | -------------------------------------------------------------------- | +| 200 | Role is unassigned. | +| 403 | Access denied. | +| 500 | Unexpected error. Refer to body and/or server logs for more details. | + +### Set user role assignments + +`PUT /api/access-control/users/:userId/roles` + +Update the user's role assignments to match the provided set of UIDs. +This will remove any assigned roles that aren't in the request and add +roles that are in the set but are not already assigned to the user. + +If you want to add or remove a single role, consider using +[Add a user role assignment]({{< ref "#add-a-user-role-assignment" >}}) or +[Remove a user role assignment]({{< ref "#remove-a-user-role-assignment" >}}) +instead. + +#### Required permissions + +`permission:delegate` scope ensures that users can only assign or unassign roles which have same, or a subset of permissions which the user has. +For example, if a user does not have required permissions for creating users, they won't be able to assign or unassign a role which will allow to do that. This is done to prevent escalation of privileges. + +| Action | Scope | +| ------------------ | -------------------- | +| users.roles:add | permissions:delegate | +| users.roles:remove | permissions:delegate | + +#### Example request + +```http +PUT /api/access-control/users/1/roles +Accept: application/json +Content-Type: application/json + +{ + "global": false, + "roleUids": [ + "ZiHQJq5nk", + "GzNQ1357k" + ] +} +``` + +#### JSON body schema + +| Field Name | Date Type | Required | Description | +| ---------- | --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | +| global | boolean | No | A flag indicating if the assignment is global or not. If set to `false`, the default org ID of the authenticated user will be used from the request. | +| roleUids | list | Yes | List of role UIDs. | + +#### Example response + +```http +HTTP/1.1 200 OK +Content-Type: application/json; charset=UTF-8 + +{ + "message": "User roles have been updated." +} +``` + +#### Status codes + +| Code | Description | +| ---- | -------------------------------------------------------------------- | +| 200 | Roles have been assigned. | +| 403 | Access denied. | +| 404 | Role not found. | +| 500 | Unexpected error. Refer to body and/or server logs for more details. | + ## Create and remove built-in role assignments API set allows to create or remove [built-in role assignments]({{< relref "../enterprise/access-control/roles.md#built-in-role-assignments" >}}) and list current assignments. @@ -442,8 +761,9 @@ Content-Type: application/json; charset=UTF-8 { "version": 1, "uid": "qQui_LCMk", - "name": "fixed:users:org:edit", - "description": "", + "name": "fixed:users:writer", + "name": "User writer", + "description": "Read and update all attributes and settings for all users in Grafana: update user information, read user information, create or enable or disable a user, make a user a Grafana administrator, sign out a user, update a user’s authentication token, or update quotas for all users", "global": true, "updated": "2021-05-13T16:24:26+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -451,8 +771,9 @@ Content-Type: application/json; charset=UTF-8 { "version": 1, "uid": "PeXmlYjMk", - "name": "fixed:users:org:read", - "description": "", + "name": "fixed:users:reader", + "displayName": "User reader", + "description": "Allows every read action for user organizations and in addition allows to administer user organizations", "global": true, "updated": "2021-05-13T16:24:26+02:00", "created": "2021-05-13T16:24:26+02:00" @@ -462,8 +783,9 @@ Content-Type: application/json; charset=UTF-8 { "version": 1, "uid": "qQui_LCMk", - "name": "fixed:users:org:edit", - "description": "", + "name": "fixed:users:writer", + "displayName": "User writer", + "description": "Read and update all attributes and settings for all users in Grafana: update user information, read user information, create or enable or disable a user, make a user a Grafana administrator, sign out a user, update a user’s authentication token, or update quotas for all users", "global": true, "updated": "2021-05-13T16:24:26+02:00", "created": "2021-05-13T16:24:26+02:00" diff --git a/docs/sources/http_api/data_source.md b/docs/sources/http_api/data_source.md index 902d1030a7b..d9f96d411a7 100644 --- a/docs/sources/http_api/data_source.md +++ b/docs/sources/http_api/data_source.md @@ -557,7 +557,10 @@ Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk HTTP/1.1 200 Content-Type: application/json -{"message":"Data source deleted"} +{ + "message": "Data source deleted", + "id": 1 +} ``` ## Delete an existing data source by name diff --git a/docs/sources/http_api/datasource_permissions.md b/docs/sources/http_api/datasource_permissions.md index dc7e2d970f9..bc8acd8dd4a 100644 --- a/docs/sources/http_api/datasource_permissions.md +++ b/docs/sources/http_api/datasource_permissions.md @@ -30,9 +30,9 @@ Enables permissions for the data source with the given `id`. No one except Org A See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation. -| Action | Scope | -| ------------------------------ | ---------------------------------------------------------------------------- | -| datasources.permissions:toggle | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | +| Action | Scope | +| ----------------------------- | ---------------------------------------------------------------------------- | +| datasources.permissions:write | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | ### Examples @@ -75,9 +75,9 @@ Disables permissions for the data source with the given `id`. All existing permi See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation. -| Action | Scope | -| ------------------------------ | ---------------------------------------------------------------------------- | -| datasources.permissions:toggle | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | +| Action | Scope | +| ----------------------------- | ---------------------------------------------------------------------------- | +| datasources.permissions:write | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | ### Examples @@ -191,9 +191,9 @@ Adds a user permission for the data source with the given `id`. See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation. -| Action | Scope | -| ------------------------------ | ---------------------------------------------------------------------------- | -| datasources.permissions:create | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | +| Action | Scope | +| ----------------------------- | ---------------------------------------------------------------------------- | +| datasources.permissions:write | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | ### Examples @@ -265,9 +265,9 @@ Removes the permission with the given `permissionId` for the data source with th See note in the [introduction]({{< ref "#data-source-permissions-api" >}}) for an explanation. -| Action | Scope | -| ------------------------------ | ---------------------------------------------------------------------------- | -| datasources.permissions:delete | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | +| Action | Scope | +| ----------------------------- | ---------------------------------------------------------------------------- | +| datasources.permissions:write | datasources:\*
datasources:id:\*
datasources:id:1 (single data source) | ### Examples diff --git a/docs/sources/http_api/library_element.md b/docs/sources/http_api/library_element.md index 521a44dfaed..3060a3ed80a 100644 --- a/docs/sources/http_api/library_element.md +++ b/docs/sources/http_api/library_element.md @@ -442,7 +442,8 @@ HTTP/1.1 200 Content-Type: application/json { - "message": "Library element deleted" + "message": "Library element deleted", + "id": 28 } ``` diff --git a/docs/sources/http_api/org.md b/docs/sources/http_api/org.md index 16da11450dc..f2d963d7bac 100644 --- a/docs/sources/http_api/org.md +++ b/docs/sources/http_api/org.md @@ -20,6 +20,14 @@ the admin of all organizations API only works with basic authentication, see [Ad `GET /api/org/` +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | +| --------- | ----- | +| orgs:read | N/A | + **Example Request**: ```http @@ -94,6 +102,14 @@ Accessible to users with org admin role, admin in any folder or admin of any tea Mainly used by Grafana UI for providing list of users when adding team members and when editing folder/dashboard permissions. +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | +| -------------- | -------- | +| org.users:read | users:\* | + **Example Request**: ```http @@ -186,6 +202,14 @@ Content-Type: application/json `PUT /api/org` +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | +| ---------- | ----- | +| orgs:write | N/A | + **Example Request**: ```http @@ -259,6 +283,14 @@ is called `admin` and has permission to use this API). Only works with Basic Authentication (username and password), see [introduction](#admin-organizations-api). +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | +| --------- | ----- | +| orgs:read | N/A | + **Example Request**: ```http @@ -293,6 +325,14 @@ Content-Type: application/json Only works with Basic Authentication (username and password), see [introduction](#admin-organizations-api). +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | Note | +| --------- | ----- | ------------------------------ | +| orgs:read | N/A | Needs to be assigned globally. | + **Example Request**: ```http @@ -327,6 +367,14 @@ Content-Type: application/json Only works with Basic Authentication (username and password), see [introduction](#admin-organizations-api). +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | Note | +| ----------- | ----- | ------------------------------ | +| orgs:create | N/A | Needs to be assigned globally. | + **Example Request**: ```http @@ -362,6 +410,14 @@ Content-Type: application/json Only works with Basic Authentication (username and password), see [introduction](#admin-organizations-api). +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | Note | +| --------- | ----- | ------------------------------ | +| orgs:read | N/A | Needs to be assigned globally. | + **Example Request**: ```http @@ -396,6 +452,14 @@ Content-Type: application/json Update Organization, fields _Address 1_, _Address 2_, _City_ are not implemented yet. Only works with Basic Authentication (username and password), see [introduction](#admin-organizations-api). +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | +| ---------- | ----- | +| orgs:write | N/A | + **Example Request**: ```http @@ -423,6 +487,14 @@ Content-Type: application/json Only works with Basic Authentication (username and password), see [introduction](#admin-organizations-api). +#### Required permissions + +See note in the [introduction]({{< ref "#organization-api" >}}) for an explanation. + +| Action | Scope | +| ----------- | ----- | +| orgs:delete | N/A | + **Example Request**: ```http diff --git a/docs/sources/http_api/serviceaccount.md b/docs/sources/http_api/serviceaccount.md new file mode 100644 index 00000000000..eec9127b4a2 --- /dev/null +++ b/docs/sources/http_api/serviceaccount.md @@ -0,0 +1,44 @@ ++++ +title = "Service account HTTP API" +description = "Grafana Service account HTTP API" +keywords = ["grafana", "http", "documentation", "api", "service account"] +aliases = ["/docs/grafana/latest/http_api/serviceaccount/"] ++++ + +# Service account API + +This API allows you to interact programmatically with the [Service accounts]({{< relref "../manage-users/serviceaccount/_index.md" >}}). + +**> Note:** If you are using Grafana Enterprise and have [Fine-grained access control]({{< relref "../enterprise/access-control/_index.md" >}}) enabled, for some endpoints you need to have relevant permissions. Refer to specific resources to understand what permissions are required. + +## Delete a service account + +`DELETE /api/serviceaccounts/:serviceaccountId` + +#### Required permissions + +For details, see the [introduction]({{< ref "#user-api" >}}). + +| Action | Scope | +| ---------------------- | ------------------ | +| serviceaccounts:delete | serviceaccounts:\* | + +Deletes the given service account if it exists. + +**Example request**: + +```http +DELETE /api/serviceaccounts/1 HTTP/1.1 +Accept: application/json +Content-Type: application/json +Authorization: Bearer eyJrIjoiT0tTcG1pUlY2RnVKZTFVaDFsNFZXdE9ZWmNrMkZYbk +``` + +**Example response**: + +```http +HTTP/1.1 200 +Content-Type: application/json + +{"message":"Service account deleted"} +``` diff --git a/docs/sources/image-rendering/_index.md b/docs/sources/image-rendering/_index.md index 8bb9130431a..93efc8bccde 100644 --- a/docs/sources/image-rendering/_index.md +++ b/docs/sources/image-rendering/_index.md @@ -72,7 +72,7 @@ RENDERING_MODE=default #### Clustered -With the `clustered` mode, you can configure how many browser instances or incognito pages can execute concurrently. Default is `browser` and will ensure a maximum amount of browser instances can execute concurrently. Mode `context` will ensure a maximum amount of incognito pages can execute concurrently. You can also configure the maximum concurrency allowed, which per default is `5`. +With the `clustered` mode, you can configure how many browser instances or incognito pages can execute concurrently. Default is `browser` and will ensure a maximum amount of browser instances can execute concurrently. Mode `context` will ensure a maximum amount of incognito pages can execute concurrently. You can also configure the maximum concurrency allowed, which per default is `5`, and the maximum duration of a rendering request, which per default is `30` seconds. Using a cluster of incognito pages is more performant and consumes less CPU and memory than a cluster of browsers. However, if one page crashes it can bring down the entire browser with it (making all the rendering requests happening at the same time fail). Also, each page isn't guaranteed to be totally clean (cookies and storage might bleed-through as seen [here](https://bugs.chromium.org/p/chromium/issues/detail?id=754576)). @@ -80,6 +80,7 @@ Using a cluster of incognito pages is more performant and consumes less CPU and RENDERING_MODE=clustered RENDERING_CLUSTERING_MODE=browser RENDERING_CLUSTERING_MAX_CONCURRENCY=5 +RENDERING_CLUSTERING_TIMEOUT=30 ``` ```json @@ -88,7 +89,8 @@ RENDERING_CLUSTERING_MAX_CONCURRENCY=5 "mode": "clustered", "clustering": { "mode": "browser", - "maxConcurrency": 5 + "maxConcurrency": 5, + "timeout": 30 } } } diff --git a/docs/sources/installation/debian.md b/docs/sources/installation/debian.md index ad0bc53c541..e497b01038b 100644 --- a/docs/sources/installation/debian.md +++ b/docs/sources/installation/debian.md @@ -10,11 +10,11 @@ weight = 200 This page explains how to install Grafana dependencies, download and install Grafana, get the service up and running on your Debian or Ubuntu system, and also describes the installation package details. -**Note on upgrading:** While the process for upgrading Grafana is very similar to installing Grafana, there are some key backup steps you should perform. Read [Upgrading Grafana]({{< relref "upgrading.md" >}}) for tips and guidance on updating an existing installation. +## Note on upgrading -## Hosted Grafana +While the process for upgrading Grafana is very similar to installing Grafana, there are some key backup steps you should perform. Read [Upgrading Grafana]({{< relref "upgrading.md" >}}) for tips and guidance on updating an existing installation. -You can run Grafana on your own hardware or use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-dashboards-grafana) and get Grafana without the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs and more. [Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-install&plcmt=in-text). +> **Note:** You can use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-logs) to avoid the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs, and more.[Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-install&plcmt=in-text). ## 1. Download and install @@ -101,7 +101,7 @@ If you install the `.deb` package, then you will need to manually update Grafana 1. Copy and paste the code from the installation page into your command line and run. It follows the pattern shown below. ```bash -sudo apt-get install -y adduser libfontconfig1 +sudo apt-get install -y adduser wget <.deb package url> sudo dpkg -i grafana__amd64.deb ``` diff --git a/docs/sources/installation/docker.md b/docs/sources/installation/docker.md index 4e950373b18..fbb80fa3eed 100755 --- a/docs/sources/installation/docker.md +++ b/docs/sources/installation/docker.md @@ -16,11 +16,9 @@ You can install and run Grafana using the official Docker images. Our docker ima Each edition is available in two variants: Alpine and Ubuntu. See below. -This page also contains important information about [migrating from earlier Docker image versions](#migrate-from-previous-docker-containers-versions). +This topic also contains important information about [migrating from earlier Docker image versions](#migrate-from-previous-docker-containers-versions). -## Hosted Grafana - -You can run Grafana on your own hardware or use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-dashboards-grafana) and get Grafana without the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs and more. [Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-docker&plcmt=in-text). +> **Note:** You can use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-logs) to avoid the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs, and more.[Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-install&plcmt=in-text). ## Alpine image (recommended) @@ -56,7 +54,7 @@ docker run -d -p 3000:3000 grafana/grafana-enterprise ### Run a specific version of Grafana -> **Note:** If you are on a Linux system, you might need to add `sudo` before the command add your user to the `docker` group. +> **Note:** If you are on a Linux system, you might need to add `sudo` before the command or add your user to the `docker` group. ```bash docker run -d -p 3000:3000 --name grafana grafana/grafana-enterprise: diff --git a/docs/sources/installation/mac.md b/docs/sources/installation/mac.md index 7ee862a79cd..722eb3d2fd4 100755 --- a/docs/sources/installation/mac.md +++ b/docs/sources/installation/mac.md @@ -23,7 +23,10 @@ Use [Homebrew](http://brew.sh/) to install the most recent released version of G brew install grafana ``` - The brew page downloads and untars the files into `/usr/local/Cellar/grafana/version`. + The brew page downloads and untars the files into: + + - `/usr/local/Cellar/grafana/[version]` (Homebrew v2) + - `/opt/homebrew/Cellar/grafana/[version]` (Homebrew v3) 1. Start Grafana using the command: ```bash diff --git a/docs/sources/installation/rpm.md b/docs/sources/installation/rpm.md index e02a71e8375..b4a94f1728f 100755 --- a/docs/sources/installation/rpm.md +++ b/docs/sources/installation/rpm.md @@ -8,13 +8,13 @@ weight = 300 # Install on RPM-based Linux (CentOS, Fedora, OpenSuse, Red Hat) -This page explains how to install Grafana dependencies, download and install Grafana, get the service up and running on your RPM-based Linux system, and the installation package details. +This topic explains how to install Grafana dependencies, download and install Grafana, get the service up and running on your RPM-based Linux system, and the installation package details. -**Note on upgrading:** While the process for upgrading Grafana is very similar to installing Grafana, there are some key backup steps you should perform. Read [Upgrading Grafana]({{< relref "upgrading.md" >}}) for tips and guidance on updating an existing installation. +## Note on upgrading -## Hosted Grafana +While the process for upgrading Grafana is very similar to installing Grafana, there are some key backup steps you should perform. Read [Upgrading Grafana]({{< relref "upgrading.md" >}}) for tips and guidance on updating an existing installation. -You can run Grafana on your own hardware or use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-dashboards-grafana) and get Grafana without the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs and more. [Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-install&plcmt=in-text). +> **Note:** You can use [Grafana Cloud](https://grafana.com/products/cloud/features/#cloud-logs) to avoid the overhead of installing, maintaining, and scaling your observability stack. The free forever plan includes Grafana, 10K Prometheus series, 50 GB logs, and more.[Create a free account to get started](https://grafana.com/auth/sign-up/create-user?pg=docs-grafana-install&plcmt=in-text). ## 1. Download and install @@ -172,6 +172,30 @@ sudo systemctl enable grafana-server {{< docs/shared "systemd/bind-net-capabilities.md" >}} +#### Serving Grafana behind a proxy + +When serving Grafana behind a proxy, you need to configure the `http_proxy` and `https_proxy` environment variables. + +##### Centos 6 + +If you are on Centos 6, add the following lines to the `/etc/sysconfig/grafana-server` file. + +``` +export no_proxy=internal.domain,127.0.0.1 +export http_proxy=http://proxy.domain:3128/ +export https_proxy=http://proxy.domain:3128/ +``` + +##### Centos 7 + +If you are on Centos 7, add the following lines to the `/etc/sysconfig/grafana-server` file. + +``` +http_proxy=http://proxy.domain:3128/ +https_proxy=http://proxy.domain:3128/ +no_proxy=internal.domain,127.0.0.1 +``` + ### Start the server with init.d To start the service and verify that the service has started: diff --git a/docs/sources/installation/upgrading.md b/docs/sources/installation/upgrading.md index acbd2337f19..0c6f289d8c8 100755 --- a/docs/sources/installation/upgrading.md +++ b/docs/sources/installation/upgrading.md @@ -62,7 +62,7 @@ links. ```bash wget -sudo apt-get install -y adduser libfontconfig1 +sudo apt-get install -y adduser sudo dpkg -i grafana__amd64.deb ``` diff --git a/docs/sources/manage-users/serviceaccount/_index.md b/docs/sources/manage-users/serviceaccount/_index.md new file mode 100644 index 00000000000..39ba3e854c0 --- /dev/null +++ b/docs/sources/manage-users/serviceaccount/_index.md @@ -0,0 +1,11 @@ ++++ +title = "Service accounts" +weight = 100 ++++ + +# Service accounts + +A service account represents a Grafana service identity, which are users that are intended for programmatic use either internally for a Grafana feature or through an API key, such as timely reporting, automatic provisioning or systems interacting with Grafana. See [service account] for more information + +- [Service account]({{< relref "serviceaccount.md" >}}) - Describes service account in detail. +- [Service account API]({{< relref "../../http_api/serviceaccount.md" >}}) - Manage users or change passwords programmatically. diff --git a/docs/sources/manage-users/serviceaccount/serviceaccount.md b/docs/sources/manage-users/serviceaccount/serviceaccount.md new file mode 100644 index 00000000000..f999756976d --- /dev/null +++ b/docs/sources/manage-users/serviceaccount/serviceaccount.md @@ -0,0 +1,20 @@ ++++ +title = "What are service accounts" +weight = 200 ++++ + +What are service accounts? + +A service account is a special kind of user used by an application or compute workload, which are users that are intended for programmatic use either internally for a Grafana feature or through an API key. Applications use service accounts to make authorized API calls, authorized as the service account itself. + +For example, all reporting could be setup and run as a service account from your application, and that account can be given permissions to access the resources it needs. This way the service account is the identity of the service, and the service account's permissions control which resources the service can access. + +A service account is identified by its login name, which is unique to the entire suite of organizations. The name is set upon creation of the service account. + +Differences between a service account and a user account +Service accounts differ from user accounts in a few key ways: + +- Service accounts do not have passwords, and cannot log in via browsers or cookies. +- Service accounts are associated with private/public RSA key-pairs that are used for authentication to Grafana. +- You can let other users or service accounts impersonate a service account. +- Service accounts lives on a organizational level, but it does not restrict them from acting cross organizational, such as adding or editing user information. diff --git a/docs/sources/panels/add-a-panel.md b/docs/sources/panels/add-a-panel.md index d0525455184..dbf6b0fa19f 100644 --- a/docs/sources/panels/add-a-panel.md +++ b/docs/sources/panels/add-a-panel.md @@ -25,12 +25,11 @@ Each panel needs at least one query to display a visualization. You write querie 1. Choose a data source. In the first line of the Query tab, click the drop-down list to see all available data sources. This list includes all data sources you added. Refer to [Add a data source]({{< relref "../datasources/add-a-data-source.md" >}}) if you need instructions. 1. Write or construct a query in the query language of your data source. Options will vary. Refer to your specific [data source documentation]({{< relref "../datasources/_index.md" >}}) for specific guidelines. -## 3. Choose a visualization type - -In the Visualization list, click a visualization type. Grafana displays a preview of your query results with that visualization applied. +## 3. Choose a visualization ![](/static/img/docs/panel-editor/select-visualization-8-0.png) +When you choose a visualization, Grafana will offer visualization suggestions based on your query. You can select from the available suggestions or you can pick a visualization from the complete list of supported visualizations. When you select a visualization, Grafana will show a preview of your query results with that visualization applied. For more information about individual visualizations, refer to [Visualizations options]({{< relref "../visualizations/_index.md" >}}). ## 4. (Optional) Edit panel settings diff --git a/docs/sources/panels/expressions.md b/docs/sources/panels/expressions.md index 91286a3a4b9..7883c45602b 100644 --- a/docs/sources/panels/expressions.md +++ b/docs/sources/panels/expressions.md @@ -101,13 +101,31 @@ While most functions exist in the own expression operations, the math operation abs returns the absolute value of its argument which can be a number or a series. For example `abs(-1)` or `abs($A)`. +##### is_inf + +is_inf takes a number or a series and returns `1` for `Inf` values (negative or positive) and `0` for other values. For example `is_inf($A)`. + +> **Note:** If you need to specifically check for negative infinity for example, you can do a comparison like `$A == infn()`. + +##### is_nan + +is_nan takes a number or a series and returns `1` for `NaN` values and `0` for other values. For example `is_nan($A)`. This function exists because `NaN` is not equal to `NaN`. + +##### is_null + +is_nan takes a number or a series and returns `1` for `null` values and `0` for other values. For example `is_null($A)`. + +##### is_number + +is_number takes a number or a series and returns `1` for all real number values and `0` for other values (which are `null`, `Inf+`, `Inf-`, and `NaN`). For example `is_number($A)`. + ##### log Log returns the natural logarithm of of its argument which can be a number or a series. If the value is less than 0, NaN is returned. For example `log(-1)` or `log($A)`. -##### inf, nan, and null +##### inf, infn, nan, and null -The inf, nan, and null functions all return a single value of the name. They primarily exist for testing. Example: `null()`. (Note: inf always returns positive infinity, should probably change this to take an argument so it can return negative infinity). +The inf, infn, nan, and null functions all return a single value of the name. They primarily exist for testing. Example: `null()`. ### Reduce diff --git a/docs/sources/panels/legend-options.md b/docs/sources/panels/legend-options.md index 9e8822f39ea..69a42224da6 100644 --- a/docs/sources/panels/legend-options.md +++ b/docs/sources/panels/legend-options.md @@ -10,8 +10,13 @@ Use the legend to adjust how a visualization displays series. This legend functi This topic currently applies to the following visualizations: +- [Bar chart panel]({{< relref "../visualizations/bar-chart.md">}}) +- [Histogram panel]({{< relref "../visualizations/histogram.md">}}) - [Pie chart panel]({{< relref "../visualizations/pie-chart-panel.md">}}) +- [State timeline panel]({{< relref "../visualizations/state-timeline.md">}}) +- [Status history panel]({{< relref "../visualizations/status-history.md">}}) - [Time series panel]({{< relref "../visualizations/time-series/_index.md" >}}) +- XY chart panel ## Toggle series @@ -34,3 +39,12 @@ This creates a system override that hides the other series. You can view this ov Click on the series icon (colored line beside the series label) in the legend to change selected series color. ![Change legend series color](/static/img/docs/legend/legend-series-color-7-5.png) + +## Sort series + +Change legend mode to **Table** and choose [calculations]({{< relref "./calculations-list.md" >}}) to be displayed in the legend. Click the calculation name header in the legend table to sort the values in the table in ascending or descending order. +The sort order affects the positions of the bars in the Bar chart panel as well as the order of stacked series in the Time series and Bar chart panels. + +> **Note:** This feature is only supported in these panels: Bar chart, Histogram, Time series, XY Chart. + +![Sort legend series](/static/img/docs/legend/legend-series-sort-8-3.png) diff --git a/docs/sources/panels/panel-library.md b/docs/sources/panels/panel-library.md index 03868e8c2b1..b3bdd019236 100644 --- a/docs/sources/panels/panel-library.md +++ b/docs/sources/panels/panel-library.md @@ -38,7 +38,7 @@ Once created, you can modify the library panel using any dashboard on which it a To add a library panel to a dashboard: -1. Hover over the **+** option on the left menu, then select **Create** from the drop down options. The Add panel dialog opens. +1. Hover over the **+** option on the left menu, then select **Create** from the drop-down options. The Add panel dialog opens. {{< figure src="/static/img/docs/library-panels/add-library-panel-8-0.png" class="docs-image--no-shadow" max-width= "900px" caption="Screenshot of the edit panel" >}} 1. Click the **Add a panel from the panel library** option. You will see a list of your library panels. 1. Filter the list or search to find the panel you want to add. @@ -71,7 +71,7 @@ Before you delete a library panel, verify that it is no longer in use on any das To delete a library panel: -1. Hover over **Dashboard** on the left menu, and select Library panels from the drop down options. +1. Hover over **Dashboard** on the left menu, and select Library panels from the drop-down options. 1. Select a library panel that is being used in different dashboards. You will see a list of all the dashboards. 1. Select the panel you want to delete. 1. Click the delete icon next to the library panel name. diff --git a/docs/sources/panels/queries.md b/docs/sources/panels/queries.md index 1fd4d97d0a5..141d1388211 100644 --- a/docs/sources/panels/queries.md +++ b/docs/sources/panels/queries.md @@ -95,6 +95,8 @@ Panel data source query options: - **Relative time -** You can override the relative time range for individual panels, causing them to be different than what is selected in the dashboard time picker in the top right corner of the dashboard. This allows you to show metrics from different time periods or days on the same dashboard. + > **Note:** Panel time overrides have no effect when the time range for the dashboard is absolute. + - **Time shift -** The time shift function is another way to override the time range for individual panels. It only works with relative time ranges and allows you to adjust the time range. For example, you could shift the time range for the panel to be two hours earlier than the dashboard time picker. For more information, refer to [Time range controls]({{< relref "../dashboards/time-range-controls.md" >}}). diff --git a/docs/sources/panels/transformations/_index.md b/docs/sources/panels/transformations/_index.md index d19e4b5e98a..73bea335b8a 100644 --- a/docs/sources/panels/transformations/_index.md +++ b/docs/sources/panels/transformations/_index.md @@ -29,6 +29,7 @@ Before you can configure and apply transformations: - [Add field from calculation]({{< relref "./types-options.md#add-field-from-calculation" >}}) - [Concatenate fields]({{< relref "./types-options.md#concatenate-fields" >}}) - [Config from query results]({{< relref "./config-from-query.md" >}}) +- [Convert field type]({{< relref "./types-options.md#convert-field-type" >}}) - [Filter data by name]({{< relref "./types-options.md#filter-data-by-name" >}}) - [Filter data by query]({{< relref "./types-options.md#filter-data-by-query" >}}) - [Filter data by value]({{< relref "./types-options.md#filter-data-by-value" >}}) diff --git a/docs/sources/panels/transformations/config-from-query.md b/docs/sources/panels/transformations/config-from-query.md index 19103263aa7..6f639d45aef 100644 --- a/docs/sources/panels/transformations/config-from-query.md +++ b/docs/sources/panels/transformations/config-from-query.md @@ -13,7 +13,7 @@ If you want to extract a unique config for every row in the config query result ### Options -- **Config query**: Selet the query that returns the data you want to use as configuration. +- **Config query**: Select the query that returns the data you want to use as configuration. - **Apply to**: Select what fields or series to apply the configuration to. - **Apply to options**: Usually a field type or field name regex depending on what option you selected in **Apply to**. diff --git a/docs/sources/panels/transformations/types-options.md b/docs/sources/panels/transformations/types-options.md index 500166ef2df..a898d213524 100644 --- a/docs/sources/panels/transformations/types-options.md +++ b/docs/sources/panels/transformations/types-options.md @@ -192,20 +192,33 @@ In the example below, I added two fields together and named them Sum. ## Labels to fields -This transformation changes time series results that include labels or tags into to a table structure where each label becomes its own field. +This transformation changes time series results that include labels or tags into to a table structure where each label keys and values +are included in the table result. The labels can be displayed either as columns or as row values. Given a query result of two time series: - Series 1: labels Server=Server A, Datacenter=EU - Series 2: labels Server=Server B, Datacenter=EU -This would result in a table like this: +In "Columns" mode, the result looks like this: | Time | Server | Datacenter | Value | | ------------------- | -------- | ---------- | ----- | | 2020-07-07 11:34:20 | Server A | EU | 1 | | 2020-07-07 11:34:20 | Server B | EU | 2 | +In "Rows" mode, the result has a table for each series and show each label value like this: + +| label | value | +| ---------- | -------- | +| Server | Server A | +| Datacenter | EU | + +| label | value | +| ---------- | -------- | +| Server | Server B | +| Datacenter | EU | + ### Value field name If you selected Server as the **Value field name**, then you would get one field for every value of the Server label. @@ -334,26 +347,30 @@ This transformation changes the field type of the specified field. - **Numeric -** attempts to make the values numbers - **String -** will make the values strings - **Time -** attempts to parse the values as time - - Will show an option to specify a DateFormat as input by a string like yyyy-mm-dd or DD MM YYYY hh:mm:ss + - Will show an option to specify a DateFormat for the input field like yyyy-mm-dd or DD MM YYYY hh:mm:ss - **Boolean -** will make the values booleans + - **JSON -** attempts to parse the values as JSON, potentially resulting in complex objects or arrays -For example the following query could be modified by selecting the time field, as Time, and Date Format as YYYY. +For example the following query could be modified by: -| Time | Mark | Value | -| ---------- | ----- | ----- | -| 2017-07-01 | above | 25 | -| 2018-08-02 | below | 22 | -| 2019-09-02 | below | 29 | -| 2020-10-04 | above | 22 | +- selecting the time field as Time, and Input format as YYYY +- selecting the JSON field as JSON + +| Time | Mark | Value | JSON | +| ---------- | ----- | ----- | -------- | +| 2017-07-01 | above | 25 | "[0, 1]" | +| 2018-08-02 | below | 22 | "[2, 3]" | +| 2019-09-02 | below | 29 | "[4, 5]" | +| 2020-10-04 | above | 22 | "[6, 7]" | The result: -| Time | Mark | Value | -| ------------------- | ----- | ----- | -| 2017-01-01 00:00:00 | above | 25 | -| 2018-01-01 00:00:00 | below | 22 | -| 2019-01-01 00:00:00 | below | 29 | -| 2020-01-01 00:00:00 | above | 22 | +| Time | Mark | Value | JSON | +| ------------------- | ----- | ----- | ------ | +| 2017-01-01 00:00:00 | above | 25 | [0, 1] | +| 2018-01-01 00:00:00 | below | 22 | [2, 3] | +| 2019-01-01 00:00:00 | below | 29 | [4, 5] | +| 2020-01-01 00:00:00 | above | 22 | [6, 7] | ## Series to rows diff --git a/docs/sources/plugins/catalog.md b/docs/sources/plugins/catalog.md index edfe3a1e298..f73b5e49017 100644 --- a/docs/sources/plugins/catalog.md +++ b/docs/sources/plugins/catalog.md @@ -23,7 +23,7 @@ The Plugin catalog allows you to browse and manage plugins from within Grafana.
-Before you can use the Plugin catalog, you must enable it in the Grafana [configuration]({{< relref "../administration/configuration.md#plugin_admin_enabled" >}}) file. +In order to be able to install / uninstall / update plugins using plugin catalog, you must enable it via the `plugin_admin_enabled` flag in the [configuration]({{< relref "../administration/configuration.md#plugin_admin_enabled" >}}) file. Before following the steps below, make sure you are logged in as a Grafana administrator. diff --git a/docs/sources/plugins/plugin-signatures.md b/docs/sources/plugins/plugin-signatures.md index b0c81e5df59..c20ee236692 100644 --- a/docs/sources/plugins/plugin-signatures.md +++ b/docs/sources/plugins/plugin-signatures.md @@ -38,7 +38,9 @@ All plugins is signed under a _signature level_. The signature level determines ## Allow unsigned plugins -We strongly recommend that you don't run unsigned plugins in your Grafana installation. If you're aware of the risks and you still want to load an unsigned plugin, refer to [Configuration]({{< relref "../administration/configuration.md#allow_loading_unsigned_plugins" >}}). +> **Note:** Unsigned plugins are not supported in Grafana Cloud. + +We strongly recommend that you don't run unsigned plugins in your Grafana instance. If you're aware of the risks and you still want to load an unsigned plugin, refer to [Configuration]({{< relref "../administration/configuration.md#allow_loading_unsigned_plugins" >}}). If you've allowed loading of an unsigned plugin, then Grafana writes a warning message to the server log: diff --git a/docs/sources/release-notes/_index.md b/docs/sources/release-notes/_index.md index ad8996429c0..143c051f4fd 100644 --- a/docs/sources/release-notes/_index.md +++ b/docs/sources/release-notes/_index.md @@ -8,11 +8,23 @@ weight = 10000 Here you can find detailed release notes that list everything that is included in every release as well as notices about deprecations, breaking changes as well as changes that relate to plugin development. +- [Release notes for 8.3.3]({{< relref "release-notes-8-3-3" >}}) +- [Release notes for 8.3.2]({{< relref "release-notes-8-3-2" >}}) +- [Release notes for 8.3.1]({{< relref "release-notes-8-3-1" >}}) +- [Release notes for 8.3.0]({{< relref "release-notes-8-3-0" >}}) +- [Release notes for 8.3.0-beta2]({{< relref "release-notes-8-3-0-beta2" >}}) +- [Release notes for 8.3.0-beta1]({{< relref "release-notes-8-3-0-beta1" >}}) +- [Release notes for 8.2.7]({{< relref "release-notes-8-2-7" >}}) +- [Release notes for 8.2.6]({{< relref "release-notes-8-2-6" >}}) +- [Release notes for 8.2.5]({{< relref "release-notes-8-2-5" >}}) +- [Release notes for 8.2.4]({{< relref "release-notes-8-2-4" >}}) +- [Release notes for 8.2.3]({{< relref "release-notes-8-2-3" >}}) - [Release notes for 8.2.2]({{< relref "release-notes-8-2-2" >}}) - [Release notes for 8.2.1]({{< relref "release-notes-8-2-1" >}}) - [Release notes for 8.2.0]({{< relref "release-notes-8-2-0" >}}) - [Release notes for 8.2.0-beta2]({{< relref "release-notes-8-2-0-beta2" >}}) - [Release notes for 8.2.0-beta1]({{< relref "release-notes-8-2-0-beta1" >}}) +- [Release notes for 8.1.8]({{< relref "release-notes-8-1-8" >}}) - [Release notes for 8.1.7]({{< relref "release-notes-8-1-7" >}}) - [Release notes for 8.1.6]({{< relref "release-notes-8-1-6" >}}) - [Release notes for 8.1.5]({{< relref "release-notes-8-1-5" >}}) @@ -24,6 +36,7 @@ about deprecations, breaking changes as well as changes that relate to plugin de - [Release notes for 8.1.0-beta3]({{< relref "release-notes-8-1-0-beta3" >}}) - [Release notes for 8.1.0-beta2]({{< relref "release-notes-8-1-0-beta2" >}}) - [Release notes for 8.1.0-beta1]({{< relref "release-notes-8-1-0-beta1" >}}) +- [Release notes for 8.0.7]({{< relref "release-notes-8-0-7" >}}) - [Release notes for 8.0.6]({{< relref "release-notes-8-0-6" >}}) - [Release notes for 8.0.5]({{< relref "release-notes-8-0-5" >}}) - [Release notes for 8.0.4]({{< relref "release-notes-8-0-4" >}}) @@ -34,6 +47,7 @@ about deprecations, breaking changes as well as changes that relate to plugin de - [Release notes for 8.0.0-beta3]({{< relref "release-notes-8-0-0-beta3" >}}) - [Release notes for 8.0.0-beta2]({{< relref "release-notes-8-0-0-beta2" >}}) - [Release notes for 8.0.0-beta1]({{< relref "release-notes-8-0-0-beta1" >}}) +- [Release notes for 7.5.12]({{< relref "release-notes-7-5-12" >}}) - [Release notes for 7.5.11]({{< relref "release-notes-7-5-11" >}}) - [Release notes for 7.5.10]({{< relref "release-notes-7-5-10" >}}) - [Release notes for 7.5.9]({{< relref "release-notes-7-5-9" >}}) diff --git a/docs/sources/release-notes/release-notes-7-3-0.md b/docs/sources/release-notes/release-notes-7-3-0.md index 9eb98b4a3c6..16f0149c6fa 100644 --- a/docs/sources/release-notes/release-notes-7-3-0.md +++ b/docs/sources/release-notes/release-notes-7-3-0.md @@ -44,7 +44,7 @@ list = false - **API**: Fix short URLs. [#28300](https://github.com/grafana/grafana/pull/28300), [@aknuds1](https://github.com/aknuds1) - **BackendSrv**: Fixes queue countdown when unsubscribe is before response. [#28323](https://github.com/grafana/grafana/pull/28323), [@hugohaggmark](https://github.com/hugohaggmark) - **CloudWatch/Athena - valid metrics and dimensions.**. [#28436](https://github.com/grafana/grafana/pull/28436), [@kwarunek](https://github.com/kwarunek) -- **Dashboard links**: Places drop down list so it's always visible. [#28330](https://github.com/grafana/grafana/pull/28330), [@maknik](https://github.com/maknik) +- **Dashboard links**: Places drop-down list so it's always visible. [#28330](https://github.com/grafana/grafana/pull/28330), [@maknik](https://github.com/maknik) - **Graph**: Fix for graph size not taking up full height or width. [#28314](https://github.com/grafana/grafana/pull/28314), [@jackw](https://github.com/jackw) - **Loki**: Base maxDataPoints limits on query type. [#28298](https://github.com/grafana/grafana/pull/28298), [@aocenas](https://github.com/aocenas) - **Loki**: Run instant query only when doing metric query. [#28325](https://github.com/grafana/grafana/pull/28325), [@aocenas](https://github.com/aocenas) diff --git a/docs/sources/release-notes/release-notes-7-4-0.md b/docs/sources/release-notes/release-notes-7-4-0.md index 3c6d8931d2b..11e2a455c9f 100644 --- a/docs/sources/release-notes/release-notes-7-4-0.md +++ b/docs/sources/release-notes/release-notes-7-4-0.md @@ -20,7 +20,7 @@ list = false ### Bug fixes - **Admin**: Fixes so form values are filled in from backend. [#30544](https://github.com/grafana/grafana/pull/30544), [@hugohaggmark](https://github.com/hugohaggmark) -- **Admin**: Fixes so whole org drop down is visible when adding users to org. [#30481](https://github.com/grafana/grafana/pull/30481), [@hugohaggmark](https://github.com/hugohaggmark) +- **Admin**: Fixes so whole org drop-down is visible when adding users to org. [#30481](https://github.com/grafana/grafana/pull/30481), [@hugohaggmark](https://github.com/hugohaggmark) - **Alerting**: Hides threshold handle for percentual thresholds. [#30431](https://github.com/grafana/grafana/pull/30431), [@hugohaggmark](https://github.com/hugohaggmark) - **CloudWatch**: Prevent field config from being overwritten. [#30437](https://github.com/grafana/grafana/pull/30437), [@sunker](https://github.com/sunker) - **Decimals**: Big Improvements to auto decimals and fixes to auto decimals bug found in 7.4-beta1. [#30519](https://github.com/grafana/grafana/pull/30519), [@torkelo](https://github.com/torkelo) @@ -33,7 +33,7 @@ list = false - **Panels**: Fixes so panels are refreshed when scrolling past them fast. [#30784](https://github.com/grafana/grafana/pull/30784), [@hugohaggmark](https://github.com/hugohaggmark) - **Prometheus**: Fix show query instead of Value if no **name** and metric. [#30511](https://github.com/grafana/grafana/pull/30511), [@zoltanbedi](https://github.com/zoltanbedi) - **TimeSeriesPanel**: Fixes default value for Gradient mode. [#30484](https://github.com/grafana/grafana/pull/30484), [@torkelo](https://github.com/torkelo) -- **Variables**: Clears drop down state when leaving dashboard. [#30810](https://github.com/grafana/grafana/pull/30810), [@hugohaggmark](https://github.com/hugohaggmark) +- **Variables**: Clears drop-down state when leaving dashboard. [#30810](https://github.com/grafana/grafana/pull/30810), [@hugohaggmark](https://github.com/hugohaggmark) - **Variables**: Fixes display value when using capture groups in regex. [#30636](https://github.com/grafana/grafana/pull/30636), [@hugohaggmark](https://github.com/hugohaggmark) - **Variables**: Fixes so queries work for numbers values too. [#30602](https://github.com/grafana/grafana/pull/30602), [@hugohaggmark](https://github.com/hugohaggmark) - **Variables**: Fixes so text format will show All instead of custom all value. [#30730](https://github.com/grafana/grafana/pull/30730), [@hugohaggmark](https://github.com/hugohaggmark) @@ -145,7 +145,7 @@ list = false - **Variables**: Fixes Constant variable persistence confusion. [#29407](https://github.com/grafana/grafana/pull/29407), [@hugohaggmark](https://github.com/hugohaggmark) - **Variables**: Fixes Textbox current value persistence. [#29481](https://github.com/grafana/grafana/pull/29481), [@hugohaggmark](https://github.com/hugohaggmark) - **Variables**: Fixes loading with a custom all value in url. [#28958](https://github.com/grafana/grafana/pull/28958), [@hugohaggmark](https://github.com/hugohaggmark) -- **Variables**: Fixes so clicking on Selected in drop down will exclude All value from selection. [#29844](https://github.com/grafana/grafana/pull/29844), [@hugohaggmark](https://github.com/hugohaggmark) +- **Variables**: Fixes so clicking on Selected in drop-down will exclude All value from selection. [#29844](https://github.com/grafana/grafana/pull/29844), [@hugohaggmark](https://github.com/hugohaggmark) ### Breaking changes diff --git a/docs/sources/release-notes/release-notes-7-5-12.md b/docs/sources/release-notes/release-notes-7-5-12.md new file mode 100644 index 00000000000..b8c7f3fe775 --- /dev/null +++ b/docs/sources/release-notes/release-notes-7-5-12.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 7.5.12" +[_build] +list = false ++++ + + + +# Release notes for Grafana 7.5.12 + +### Bug fixes + +- **Security**: Fixes CVE-2021-43813 and CVE-2021-PENDING. For more information, see our [blog](https://grafana.com/blog/2021/12/10/grafana-8.3.2-and-7.5.12-released-with-moderate-severity-security-fix/) diff --git a/docs/sources/release-notes/release-notes-8-0-7.md b/docs/sources/release-notes/release-notes-8-0-7.md new file mode 100644 index 00000000000..90db9f569b6 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-0-7.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.0.7" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.0.7 + +### Bug fixes + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) diff --git a/docs/sources/release-notes/release-notes-8-1-2.md b/docs/sources/release-notes/release-notes-8-1-2.md index eb0deb6ae30..d7cb57ac301 100644 --- a/docs/sources/release-notes/release-notes-8-1-2.md +++ b/docs/sources/release-notes/release-notes-8-1-2.md @@ -31,7 +31,7 @@ list = false - **Explore:** Fix showing of full log context. [#37442](https://github.com/grafana/grafana/pull/37442), [@ivanahuckova](https://github.com/ivanahuckova) - **PanelEdit:** Fix 'Actual' size by passing the correct panel size to Das…. [#37885](https://github.com/grafana/grafana/pull/37885), [@ashharrison90](https://github.com/ashharrison90) - **Plugins:** Fix TLS data source settings. [#37797](https://github.com/grafana/grafana/pull/37797), [@wbrowne](https://github.com/wbrowne) -- **Variables:** Fix issue with empty drop downs on navigation. [#37776](https://github.com/grafana/grafana/pull/37776), [@hugohaggmark](https://github.com/hugohaggmark) +- **Variables:** Fix issue with empty drop-downs on navigation. [#37776](https://github.com/grafana/grafana/pull/37776), [@hugohaggmark](https://github.com/hugohaggmark) - **Variables:** Fix URL util converting `false` into `true`. [#37402](https://github.com/grafana/grafana/pull/37402), [@simPod](https://github.com/simPod) ### Plugin development fixes & changes diff --git a/docs/sources/release-notes/release-notes-8-1-8.md b/docs/sources/release-notes/release-notes-8-1-8.md new file mode 100644 index 00000000000..c5209baab4e --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-1-8.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.1.8" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.1.8 + +### Bug fixes + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) diff --git a/docs/sources/release-notes/release-notes-8-2-3.md b/docs/sources/release-notes/release-notes-8-2-3.md new file mode 100644 index 00000000000..2f1fb78d495 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-2-3.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.2.3" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.2.3 + +### Bug fixes + +- **Security**: Fixes CVE-2021-41174. For more information, see our [blog](https://grafana.com/blog/2021/11/03/grafana-8.2.3-released-with-medium-severity-security-fix-cve-2021-41174-grafana-xss/) diff --git a/docs/sources/release-notes/release-notes-8-2-4.md b/docs/sources/release-notes/release-notes-8-2-4.md new file mode 100644 index 00000000000..ed9600f1d1c --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-2-4.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.2.4" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.2.4 + +### Bug fixes + +- **Security**: Fixes CVE-2021-41244. For more information, see our [blog](https://grafana.com/blog/2021/11/15/grafana-8.2.4-released-with-security-fixes/) diff --git a/docs/sources/release-notes/release-notes-8-2-5.md b/docs/sources/release-notes/release-notes-8-2-5.md new file mode 100644 index 00000000000..2bc0e1f130a --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-2-5.md @@ -0,0 +1,31 @@ ++++ +title = "Release notes for Grafana 8.2.5" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.2.5 + +### Bug fixes + +- **Alerting:** Fix a bug where the metric in the evaluation string was not correctly populated. [#41731](https://github.com/grafana/grafana/pull/41731), [@JohnnyQQQQ](https://github.com/JohnnyQQQQ) +- **Alerting:** Fix no data behaviour in Legacy Alerting for alert rules using the AND operator. [#41305](https://github.com/grafana/grafana/pull/41305), [@gerobinson](https://github.com/gerobinson) +- **CloudMonitoring:** Ignore min and max aggregation in MQL queries. [#41302](https://github.com/grafana/grafana/pull/41302), [@sunker](https://github.com/sunker) +- **Dashboards:** 'Copy' is no longer added to new dashboard titles. [#41344](https://github.com/grafana/grafana/pull/41344), [@joshhunt](https://github.com/joshhunt) +- **DataProxy:** Fix overriding response body when response is a WebSocket upgrade. [#41364](https://github.com/grafana/grafana/pull/41364), [@marefr](https://github.com/marefr) +- **Elasticsearch:** Use field configured in query editor as field for date_histogram aggregations. [#41258](https://github.com/grafana/grafana/pull/41258), [@Elfo404](https://github.com/Elfo404) +- **Explore:** Fix running queries without a datasource property set. [#40805](https://github.com/grafana/grafana/pull/40805), [@Elfo404](https://github.com/Elfo404) +- **InfluxDB:** Fix numeric aliases in queries. [#41531](https://github.com/grafana/grafana/pull/41531), [@gabor](https://github.com/gabor) +- **Plugins:** Ensure consistent plugin settings list response. [#41346](https://github.com/grafana/grafana/pull/41346), [@wbrowne](https://github.com/wbrowne) +- **Tempo:** Fix validation of float durations. [#41400](https://github.com/grafana/grafana/pull/41400), [@ivanahuckova](https://github.com/ivanahuckova) +- **Tracing:** Correct tags for each span are shown. [#41473](https://github.com/grafana/grafana/pull/41473), [@ivanahuckova](https://github.com/ivanahuckova) + +### Breaking changes + +### Fix No Data behaviour in Legacy Alerting + +In Grafana 8.2.5 and later, this change fixes a bug in the evaluation of alert rules when using the AND operator to compare two or more conditions. In Grafana 8.2.4 and earlier such alert rules would evaluate to `OK` if at least one, but not all, conditions returned no data. This change fixes that bug such that in Grafana 8.2.5 these alert rules now evaluate to `No Data`. + +If an alert should evaluate to `OK` when one or all conditions return `No Data` then this can be done via changing `If no data or all values are null` to `OK`. However, this will not preserve the old behaviour in 8.2.4 where an alert will be `OK` if at least one, but not all, conditions return no data and then `No Data` if all conditions return `No Data`. Issue [#41305](https://github.com/grafana/grafana/issues/41305) diff --git a/docs/sources/release-notes/release-notes-8-2-6.md b/docs/sources/release-notes/release-notes-8-2-6.md new file mode 100644 index 00000000000..db4c762e020 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-2-6.md @@ -0,0 +1,18 @@ ++++ +title = "Release notes for Grafana 8.2.6" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.2.6 + +### Features and enhancements + +- **Security:** Upgrade Docker base image to Alpine 3.14.3. [#42061](https://github.com/grafana/grafana/pull/42061), [@dsotirakis](https://github.com/dsotirakis) +- **Security:** Upgrade Go to 1.17.2. [#42427](https://github.com/grafana/grafana/pull/42427), [@idafurjes](https://github.com/idafurjes) + +### Bug fixes + +- **TimeSeries:** Fix fillBelowTo wrongly affecting fills of unrelated series. [#41998](https://github.com/grafana/grafana/pull/41998), [@leeoniya](https://github.com/leeoniya) diff --git a/docs/sources/release-notes/release-notes-8-2-7.md b/docs/sources/release-notes/release-notes-8-2-7.md new file mode 100644 index 00000000000..13869639240 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-2-7.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.2.7" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.2.7 + +### Bug fixes + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) diff --git a/docs/sources/release-notes/release-notes-8-3-0-beta1.md b/docs/sources/release-notes/release-notes-8-3-0-beta1.md new file mode 100644 index 00000000000..7e74c6d0cf8 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-3-0-beta1.md @@ -0,0 +1,77 @@ ++++ +title = "Release notes for Grafana 8.3.0-beta1" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.3.0-beta1 + +### Features and enhancements + +- **AccessControl:** Apply fine-grained access control to licensing. (Enterprise) +- **Alerting:** Add UI for contact point testing with custom annotations and labels. [#40491](https://github.com/grafana/grafana/pull/40491), [@nathanrodman](https://github.com/nathanrodman) +- **Alerting:** Make alert state indicator in panel header work with Grafana 8 alerts. [#38713](https://github.com/grafana/grafana/pull/38713), [@domasx2](https://github.com/domasx2) +- **Alerting:** Option for Discord notifier to use webhook name. [#40463](https://github.com/grafana/grafana/pull/40463), [@Skyebold](https://github.com/Skyebold) +- **Annotations:** Deprecate AnnotationsSrv. [#39631](https://github.com/grafana/grafana/pull/39631), [@hugohaggmark](https://github.com/hugohaggmark) +- **Auditing:** Add audit logs for unified alerting endpoints. (Enterprise) +- **Auditing:** Add endpoints (plugins, datasources, library elements). (Enterprise) +- **Auth:** Omit all base64 paddings in JWT tokens for the JWT auth. [#35602](https://github.com/grafana/grafana/pull/35602), [@gillg](https://github.com/gillg) +- **Azure Monitor:** Clean up fields when editing Metrics. [#41762](https://github.com/grafana/grafana/pull/41762), [@andresmgot](https://github.com/andresmgot) +- **AzureMonitor:** Add new starter dashboards. [#39876](https://github.com/grafana/grafana/pull/39876), [@jcolladokuri](https://github.com/jcolladokuri) +- **AzureMonitor:** Add starter dashboard for app monitoring with Application Insights. [#40725](https://github.com/grafana/grafana/pull/40725), [@jcolladokuri](https://github.com/jcolladokuri) +- **Barchart/Time series:** Allow x axis label. [#41142](https://github.com/grafana/grafana/pull/41142), [@oscarkilhed](https://github.com/oscarkilhed) +- **CLI:** Improve error handling for installing plugins. [#41257](https://github.com/grafana/grafana/pull/41257), [@marefr](https://github.com/marefr) +- **CloudMonitoring:** Migrate to use backend plugin SDK contracts. [#38650](https://github.com/grafana/grafana/pull/38650), [@idafurjes](https://github.com/idafurjes) +- **CloudWatch Logs:** Add retry strategy for hitting max concurrent queries. [#39290](https://github.com/grafana/grafana/pull/39290), [@aocenas](https://github.com/aocenas) +- **CloudWatch:** Add AWS RoboMaker metrics and dimension. [#41450](https://github.com/grafana/grafana/pull/41450), [@ilyastoli](https://github.com/ilyastoli) +- **CloudWatch:** Add AWS Transfer metrics and dimension. [#41168](https://github.com/grafana/grafana/pull/41168), [@ilyastoli](https://github.com/ilyastoli) +- **Dashboard:** replace datasource name with a reference object. [#33817](https://github.com/grafana/grafana/pull/33817), [@ryantxu](https://github.com/ryantxu) +- **Dashboards:** Show logs on time series when hovering. [#40110](https://github.com/grafana/grafana/pull/40110), [@ryantxu](https://github.com/ryantxu) +- **Elasticsearch:** Add support for Elasticsearch 8.0 (Beta). [#41729](https://github.com/grafana/grafana/pull/41729), [@Elfo404](https://github.com/Elfo404) +- **Elasticsearch:** Add time zone setting to Date Histogram aggregation. [#40882](https://github.com/grafana/grafana/pull/40882), [@Elfo404](https://github.com/Elfo404) +- **Elasticsearch:** Enable full range log volume histogram. [#41202](https://github.com/grafana/grafana/pull/41202), [@ifrost](https://github.com/ifrost) +- **Elasticsearch:** Full range logs volume. [#40700](https://github.com/grafana/grafana/pull/40700), [@ifrost](https://github.com/ifrost) +- **Explore:** Allow changing the graph type. [#40522](https://github.com/grafana/grafana/pull/40522), [@gabor](https://github.com/gabor) +- **Explore:** Show ANSI colors when highlighting matched words in the logs panel. [#40971](https://github.com/grafana/grafana/pull/40971), [@oliverfrye](https://github.com/oliverfrye) +- **Graph(old) panel:** Listen to events from Time series panel. [#41033](https://github.com/grafana/grafana/pull/41033), [@zoltanbedi](https://github.com/zoltanbedi) +- **Import:** Load gcom dashboards from URL. [#41799](https://github.com/grafana/grafana/pull/41799), [@ashharrison90](https://github.com/ashharrison90) +- **LibraryPanels:** Improves export and import of library panels between orgs. [#39214](https://github.com/grafana/grafana/pull/39214), [@hugohaggmark](https://github.com/hugohaggmark) +- **OAuth:** Support PKCE. [#39948](https://github.com/grafana/grafana/pull/39948), [@sakjur](https://github.com/sakjur) +- **Panel edit:** Overrides now highlight correctly when searching. [#41684](https://github.com/grafana/grafana/pull/41684), [@ashharrison90](https://github.com/ashharrison90) +- **PanelEdit:** Display drag indicators on draggable sections. [#41711](https://github.com/grafana/grafana/pull/41711), [@ashharrison90](https://github.com/ashharrison90) +- **Plugins:** Refactor Plugin Management. [#40477](https://github.com/grafana/grafana/pull/40477), [@wbrowne](https://github.com/wbrowne) +- **Prometheus:** Add custom query parameters when creating PromLink url. [#41213](https://github.com/grafana/grafana/pull/41213), [@Ian-Yy](https://github.com/Ian-Yy) +- **Prometheus:** Remove limits on metrics, labels, and values in Metrics Browser. [#40660](https://github.com/grafana/grafana/pull/40660), [@autoric](https://github.com/autoric) +- **StateTimeline:** Share cursor with rest of the panels. [#41038](https://github.com/grafana/grafana/pull/41038), [@zoltanbedi](https://github.com/zoltanbedi) +- **Tempo:** Add error details when json upload fails. [#41803](https://github.com/grafana/grafana/pull/41803), [@aocenas](https://github.com/aocenas) +- **Tempo:** Add filtering for service graph query. [#41162](https://github.com/grafana/grafana/pull/41162), [@aocenas](https://github.com/aocenas) +- **Tempo:** Add links to nodes in Service Graph pointing to Prometheus metrics. [#41135](https://github.com/grafana/grafana/pull/41135), [@aocenas](https://github.com/aocenas) +- **Time series/Bar chart panel:** Add ability to sort series via legend. [#40226](https://github.com/grafana/grafana/pull/40226), [@zoltanbedi](https://github.com/zoltanbedi) +- **TimeSeries:** Allow multiple axes for the same unit. [#41635](https://github.com/grafana/grafana/pull/41635), [@dprokop](https://github.com/dprokop) +- **TraceView:** Allow span links defined on dataFrame. [#40563](https://github.com/grafana/grafana/pull/40563), [@aocenas](https://github.com/aocenas) +- **Transformations:** Support a rows mode in labels to fields. [#41020](https://github.com/grafana/grafana/pull/41020), [@ryantxu](https://github.com/ryantxu) +- **ValueMappings:** Don't apply field config defaults to time fields. [#41132](https://github.com/grafana/grafana/pull/41132), [@torkelo](https://github.com/torkelo) +- **Variables:** Only update panels that are impacted by variable change. [#39420](https://github.com/grafana/grafana/pull/39420), [@hugohaggmark](https://github.com/hugohaggmark) + +### Bug fixes + +- **API:** Fix dashboard quota limit for imports. [#41495](https://github.com/grafana/grafana/pull/41495), [@yangkb09](https://github.com/yangkb09) +- **Alerting:** Fix rule editor issues with Azure Monitor data source. [#41317](https://github.com/grafana/grafana/pull/41317), [@domasx2](https://github.com/domasx2) +- **Azure monitor:** Make sure alert rule editor is not enabled when template variables are being used. [#41335](https://github.com/grafana/grafana/pull/41335), [@sunker](https://github.com/sunker) +- **CloudMonitoring:** Fix annotation queries. [#41529](https://github.com/grafana/grafana/pull/41529), [@sunker](https://github.com/sunker) +- **CodeEditor:** Trigger the latest getSuggestions() passed to CodeEditor. [#40544](https://github.com/grafana/grafana/pull/40544), [@DukeManh](https://github.com/DukeManh) +- **Dashboard:** Remove the current panel from the list of options in the Dashboard datasource. [#41826](https://github.com/grafana/grafana/pull/41826), [@ashharrison90](https://github.com/ashharrison90) +- **Encryption:** Fix decrypting secrets in alerting migration. [#41061](https://github.com/grafana/grafana/pull/41061), [@undef1nd](https://github.com/undef1nd) +- **InfluxDB:** Fix corner case where index is too large in ALIAS field. [#41562](https://github.com/grafana/grafana/pull/41562), [@gabor](https://github.com/gabor) +- **NavBar:** Order App plugins alphabetically. [#40078](https://github.com/grafana/grafana/pull/40078), [@ashharrison90](https://github.com/ashharrison90) +- **NodeGraph:** Fix zooming sensitivity on touchpads. [#40718](https://github.com/grafana/grafana/pull/40718), [@aocenas](https://github.com/aocenas) +- **Plugins:** Add OAuth pass-through logic to api/ds/query endpoint. [#41352](https://github.com/grafana/grafana/pull/41352), [@wbrowne](https://github.com/wbrowne) +- **Snapshots:** Fix panel inspector for snapshot data. [#41530](https://github.com/grafana/grafana/pull/41530), [@joshhunt](https://github.com/joshhunt) +- **Tempo:** Fix basic auth password reset on adding tag. [#41808](https://github.com/grafana/grafana/pull/41808), [@aocenas](https://github.com/aocenas) +- **ValueMapping:** Fixes issue with regex mappings. [#41515](https://github.com/grafana/grafana/pull/41515), [@mcdee](https://github.com/mcdee) + +### Plugin development fixes & changes + +- **grafana/ui:** Enable slider marks display. [#41275](https://github.com/grafana/grafana/pull/41275), [@dprokop](https://github.com/dprokop) diff --git a/docs/sources/release-notes/release-notes-8-3-0-beta2.md b/docs/sources/release-notes/release-notes-8-3-0-beta2.md new file mode 100644 index 00000000000..b9ca672a98c --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-3-0-beta2.md @@ -0,0 +1,80 @@ ++++ +title = "Release notes for Grafana 8.3.0-beta2" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.3.0-beta2 + +### Features and enhancements + +- **Alerting:** Create DatasourceError alert if evaluation returns error. [#41869](https://github.com/grafana/grafana/pull/41869), [@gerobinson](https://github.com/gerobinson) +- **Alerting:** Make Unified Alerting enabled by default for those who do not use legacy alerting. [#42200](https://github.com/grafana/grafana/pull/42200), [@armandgrillet](https://github.com/armandgrillet) +- **Alerting:** Support mute timings configuration through the api for the embedded alert manager. [#41533](https://github.com/grafana/grafana/pull/41533), [@JohnnyQQQQ](https://github.com/JohnnyQQQQ) +- **CloudWatch:** Add missing AWS/Events metrics. [#42164](https://github.com/grafana/grafana/pull/42164), [@n2N8Z](https://github.com/n2N8Z) +- **Docs:** Add easier to find deprecation notices to certain data sources and to the changelog. [#41938](https://github.com/grafana/grafana/pull/41938), [@gabor](https://github.com/gabor) +- **Plugins Catalog:** Enable install controls based on the pluginAdminEnabled flag. [#41686](https://github.com/grafana/grafana/pull/41686), [@leventebalogh](https://github.com/leventebalogh) +- **Query caching:** Increase max_value_mb default to 10. (Enterprise) +- **Table:** Add space between values for the DefaultCell. [#42246](https://github.com/grafana/grafana/pull/42246), [@kirederik](https://github.com/kirederik) +- **Table:** Add space between values on JSONViewCell. [#42156](https://github.com/grafana/grafana/pull/42156), [@kirederik](https://github.com/kirederik) +- **Tracing:** Make query editors available in dashboard for Tempo and Zipkin. [#41974](https://github.com/grafana/grafana/pull/41974), [@ivanahuckova](https://github.com/ivanahuckova) + +### Bug fixes + +- **AccessControl:** Renamed `orgs` roles, removed `fixed:orgs:reader` introduced in beta1. [#42049](https://github.com/grafana/grafana/pull/42049), [@gamab](https://github.com/gamab) +- **Azure Monitor:** Add trap focus for modals in grafana/ui and other small a11y fixes for Azure Monitor. [#41449](https://github.com/grafana/grafana/pull/41449), [@sarahzinger](https://github.com/sarahzinger) +- **CodeEditor:** Prevent suggestions from being clipped. [#42120](https://github.com/grafana/grafana/pull/42120), [@kaydelaney](https://github.com/kaydelaney) +- **Dashboard:** Fix cache timeout persistence. [#42204](https://github.com/grafana/grafana/pull/42204), [@hugohaggmark](https://github.com/hugohaggmark) +- **Datasource:** Fix stable sort order of query responses. [#41868](https://github.com/grafana/grafana/pull/41868), [@marefr](https://github.com/marefr) +- **Explore:** Fix error in query history when removing last item. [#42179](https://github.com/grafana/grafana/pull/42179), [@gabor](https://github.com/gabor) +- **Logs:** Fix requesting of older logs when flipped order. [#41966](https://github.com/grafana/grafana/pull/41966), [@ivanahuckova](https://github.com/ivanahuckova) +- **Prometheus:** Fix running of health check query based on access mode. [#42189](https://github.com/grafana/grafana/pull/42189), [@ivanahuckova](https://github.com/ivanahuckova) +- **TextPanel:** Fix suggestions for existing panels. [#42195](https://github.com/grafana/grafana/pull/42195), [@hugohaggmark](https://github.com/hugohaggmark) +- **Tracing:** Fix incorrect indentations due to reoccurring spanIDs. [#41919](https://github.com/grafana/grafana/pull/41919), [@ivanahuckova](https://github.com/ivanahuckova) +- **Tracing:** Show start time of trace with milliseconds precision. [#42132](https://github.com/grafana/grafana/pull/42132), [@ivanahuckova](https://github.com/ivanahuckova) +- **Variables:** Make renamed or missing variable section expandable. [#41964](https://github.com/grafana/grafana/pull/41964), [@hugohaggmark](https://github.com/hugohaggmark) + +### Breaking changes + +### Grafana 8 Alerting enabled by default for installations that do not use legacy alerting + +Starting with Grafana v8.3.0, if you have **not** explicitly disabled unified alerting and **do not** have legacy alerts set up you are automatically "migrated" to Grafana 8 Alerting. + +A migration **from legacy to Grafana 8 Alerting** will never incur a data loss, as the previous data is kept around for rollback purposes. However, going from **Grafana 8 Alerting to legacy alerting** will delete all the data created for Grafana 8 Alerting. It is recommended that you **backup your database** before attempting a migration between systems. + +If unclear, please verify the table below: + +| `[alerting][enabled]` | `[unified_alerting][enabled]` | With Existing Legacy Alerts | Result | +| --------------------- | ----------------------------- | --------------------------- | ------------------ | +| `true` | `true` | N/A | Error | +| `true` | `false` | N/A | Legacy Alerting | +| `true` | not set | Yes | Legacy Alerting | +| `true` | not set | No | Grafana 8 Alerting | +| not set | `true` | N/A | Grafana 8 Alerting | +| not set | `false` | N/A | Legacy Alerting | +| not set | not set | Yes | Legacy Alerting | +| not set | not set | No | Grafana 8 Alerting | +| `false` | `true` | N/A | Grafana 8 Alerting | +| `false` | `false` | N/A | Alerting disabled | +| `false` | not set | N/A | Grafana 8 Alerting | + +N/A in the "With Existing Legacy Alerts" column means that it does not matter if you have legacy alerts or not. +Issue [#42200](https://github.com/grafana/grafana/issues/42200) + +### Keep Last State for "If execution error or timeout" when upgrading to Grafana 8 alerting + +In Grafana 8.3.0-beta2 we changed how alert rules that use `Keep Last State` for `If execution error or timeout` are upgraded from Legacy Alerting to Grafana 8 alerting. In 8.3.0-beta1 and earlier, alert rules with `Keep Last State` for `If execution error or timeout` were changed to `Alerting` when upgrading from Legacy Alerting to Grafana 8 alerting. However, in 8.3.0-beta2 these alert rules are now upgraded to a new option called `Error`. With this option, on encountering an error evaluating an alert rule, Grafana creates a special alert called `DatasourceError` with the `rule_uid` and `ref_id` as labels and an annotation called `Error` with the error message. Issue [#41869](https://github.com/grafana/grafana/issues/41869) + +### Deprecations + +The access mode "browser" is deprecated in the following data sources and will be removed in a later release: + +- Prometheus +- InfluxDB +- Elasticsearch Issue [#41938](https://github.com/grafana/grafana/issues/41938) + +### Plugin development fixes & changes + +- **Select:** Select menus now properly scroll during keyboard navigation. [#41917](https://github.com/grafana/grafana/pull/41917), [@ashharrison90](https://github.com/ashharrison90) diff --git a/docs/sources/release-notes/release-notes-8-3-0.md b/docs/sources/release-notes/release-notes-8-3-0.md new file mode 100644 index 00000000000..de72f4fafa3 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-3-0.md @@ -0,0 +1,28 @@ ++++ +title = "Release notes for Grafana 8.3.0" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.3.0 + +### Features and enhancements + +- **Alerting:** Prevent folders from being deleted when they contain alerts. [#42307](https://github.com/grafana/grafana/pull/42307), [@peterholmberg](https://github.com/peterholmberg) +- **Alerting:** Show full preview value in tooltip. [#42445](https://github.com/grafana/grafana/pull/42445), [@peterholmberg](https://github.com/peterholmberg) +- **BarGauge:** Limit title width when name is really long. [#42346](https://github.com/grafana/grafana/pull/42346), [@torkelo](https://github.com/torkelo) +- **CloudMonitoring:** Avoid to escape regexps in filters. [#41961](https://github.com/grafana/grafana/pull/41961), [@andresmgot](https://github.com/andresmgot) +- **CloudWatch:** Add support for AWS Metric Insights. [#42487](https://github.com/grafana/grafana/pull/42487), [@sunker](https://github.com/sunker) +- **TooltipPlugin:** Remove other panels' shared tooltip in edit panel. [#42187](https://github.com/grafana/grafana/pull/42187), [@mdvictor](https://github.com/mdvictor) +- **Visualizations:** Limit y label width to 40% of visualization width. [#42350](https://github.com/grafana/grafana/pull/42350), [@torkelo](https://github.com/torkelo) + +### Bug fixes + +- **Alerting:** Clear alerting rule evaluation errors after intermittent failures. [#42386](https://github.com/grafana/grafana/pull/42386), [@gotjosh](https://github.com/gotjosh) +- **Alerting:** Fix refresh on legacy Alert List panel. [#42322](https://github.com/grafana/grafana/pull/42322), [@peterholmberg](https://github.com/peterholmberg) +- **Dashboard:** Fix queries for panels with non-integer widths. [#42420](https://github.com/grafana/grafana/pull/42420), [@gabor](https://github.com/gabor) +- **Explore:** Fix url update inconsistency. [#42288](https://github.com/grafana/grafana/pull/42288), [@gabor](https://github.com/gabor) +- **Prometheus:** Fix range variables interpolation for time ranges smaller than 1 second. [#42242](https://github.com/grafana/grafana/pull/42242), [@ivanahuckova](https://github.com/ivanahuckova) +- **ValueMappings:** Fixes issue with regex value mapping that only sets color. [#42311](https://github.com/grafana/grafana/pull/42311), [@torkelo](https://github.com/torkelo) diff --git a/docs/sources/release-notes/release-notes-8-3-1.md b/docs/sources/release-notes/release-notes-8-3-1.md new file mode 100644 index 00000000000..9dd1e259082 --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-3-1.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.3.1" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.3.1 + +### Bug fixes + +- **Security**: Fixes CVE-2021-43798. For more information, see our [blog](https://grafana.com/blog/2021/12/07/grafana-8.3.1-8.2.7-8.1.8-and-8.0.7-released-with-high-severity-security-fix/) diff --git a/docs/sources/release-notes/release-notes-8-3-2.md b/docs/sources/release-notes/release-notes-8-3-2.md new file mode 100644 index 00000000000..e6937deec6b --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-3-2.md @@ -0,0 +1,13 @@ ++++ +title = "Release notes for Grafana 8.3.2" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.3.2 + +### Bug fixes + +- **Security**: Fixes CVE-2021-43813 and CVE-2021-PENDING. For more information, see our [blog](https://grafana.com/blog/2021/12/10/grafana-8.3.2-and-7.5.12-released-with-moderate-severity-security-fix/) diff --git a/docs/sources/release-notes/release-notes-8-3-3.md b/docs/sources/release-notes/release-notes-8-3-3.md new file mode 100644 index 00000000000..f8e9ff36cef --- /dev/null +++ b/docs/sources/release-notes/release-notes-8-3-3.md @@ -0,0 +1,31 @@ ++++ +title = "Release notes for Grafana 8.3.3" +[_build] +list = false ++++ + + + +# Release notes for Grafana 8.3.3 + +### Features and enhancements + +- **BarChart:** Use new data error view component to show actions in panel edit. [#42474](https://github.com/grafana/grafana/pull/42474), [@torkelo](https://github.com/torkelo) +- **CloudMonitor:** Iterate over pageToken for resources. [#42546](https://github.com/grafana/grafana/pull/42546), [@iwysiu](https://github.com/iwysiu) +- **Macaron:** Prevent WriteHeader invalid HTTP status code panic. [#42973](https://github.com/grafana/grafana/pull/42973), [@bergquist](https://github.com/bergquist) + +### Bug fixes + +- **AnnoListPanel:** Fix interpolation of variables in tags. [#42318](https://github.com/grafana/grafana/pull/42318), [@francoisdtm](https://github.com/francoisdtm) +- **CloudWatch:** Allow queries to have no dimensions specified. [#42800](https://github.com/grafana/grafana/pull/42800), [@sunker](https://github.com/sunker) +- **CloudWatch:** Fix broken queries for users migrating from 8.2.4/8.2.5 to 8.3.0. [#42611](https://github.com/grafana/grafana/pull/42611), [@sunker](https://github.com/sunker) +- **CloudWatch:** Make sure MatchExact flag gets the right value. [#42621](https://github.com/grafana/grafana/pull/42621), [@sunker](https://github.com/sunker) +- **Dashboards:** Fix so that empty folders can be deleted from the manage dashboards/folders page. [#42527](https://github.com/grafana/grafana/pull/42527), [@ashharrison90](https://github.com/ashharrison90) +- **InfluxDB:** Improve handling of metadata query errors in InfluxQL. [#42500](https://github.com/grafana/grafana/pull/42500), [@gabor](https://github.com/gabor) +- **Loki:** Fix adding of ad hoc filters for queries with parser and line_format expressions. [#42590](https://github.com/grafana/grafana/pull/42590), [@ivanahuckova](https://github.com/ivanahuckova) +- **Prometheus:** Fix running of exemplar queries for non-histogram metrics. [#42749](https://github.com/grafana/grafana/pull/42749), [@ivanahuckova](https://github.com/ivanahuckova) +- **Prometheus:** Interpolate template variables in interval. [#42637](https://github.com/grafana/grafana/pull/42637), [@ivanahuckova](https://github.com/ivanahuckova) +- **StateTimeline:** Fix toolitp not showing when for frames with multiple fields. [#42741](https://github.com/grafana/grafana/pull/42741), [@dprokop](https://github.com/dprokop) +- **TraceView:** Fix virtualized scrolling when trace view is opened in right pane in Explore. [#42480](https://github.com/grafana/grafana/pull/42480), [@autoric](https://github.com/autoric) +- **Variables:** Fix repeating panels for on time range changed variables. [#42828](https://github.com/grafana/grafana/pull/42828), [@hugohaggmark](https://github.com/hugohaggmark) +- **Variables:** Fix so queryparam option works for scoped variables. [#42742](https://github.com/grafana/grafana/pull/42742), [@hugohaggmark](https://github.com/hugohaggmark) diff --git a/docs/sources/shared/alerts/grafana-managed-alerts.md b/docs/sources/shared/alerts/grafana-managed-alerts.md new file mode 100644 index 00000000000..3df2ec2a06b --- /dev/null +++ b/docs/sources/shared/alerts/grafana-managed-alerts.md @@ -0,0 +1,31 @@ +--- +title: Grafana managed alerts +--- + +## Clustering + +The current alerting system doesn't support high availability. Alert notifications are not deduplicated and load balancing is not supported between instances; for example, silences from one instance will not appear in the other. + +## Alert evaluation + +Grafana managed alerts are evaluated by the Grafana backend. Rule evaluations are scheduled, according to the alert rule configuration, and queries are evaluated by an engine that is part of core Grafana. + +Alerting rules can only query backend data sources with alerting enabled: + +- builtin or developed and maintained by grafana: `Graphite`, `Prometheus`, `Loki`, `InfluxDB`, `Elasticsearch`, + `Google Cloud Monitoring`, `Cloudwatch`, `Azure Monitor`, `MySQL`, `PostgreSQL`, `MSSQL`, `OpenTSDB`, `Oracle`, and `Azure Data Explorer` +- any community backend data sources with alerting enabled (`backend` and `alerting` properties are set in the [plugin.json]({{< relref "../../developers/plugins/metadata.md" >}})) + +## Metrics from the alerting engine + +The alerting engine publishes some internal metrics about itself. You can read more about how Grafana publishes [internal metrics]({{< relref "../../administration/view-server/internal-metrics.md" >}}). See also, [View alert rules and their current state]({{< relref "../../alerting/old-alerting/view-alerts.md" >}}). + +| Metric Name | Type | Description | +| ------------------------------------------- | --------- | ---------------------------------------------------------------------------------------- | +| `alerting.alerts` | gauge | How many alerts by state | +| `alerting.request_duration_seconds` | histogram | Histogram of requests to the Alerting API | +| `alerting.active_configurations` | gauge | The number of active, non default alertmanager configurations for grafana managed alerts | +| `alerting.rule_evaluations_total` | counter | The total number of rule evaluations | +| `alerting.rule_evaluation_failures_total` | counter | The total number of rule evaluation failures | +| `alerting.rule_evaluation_duration_seconds` | summary | The duration for a rule to execute | +| `alerting.rule_group_rules` | gauge | The number of rules | diff --git a/docs/sources/sharing/playlists.md b/docs/sources/sharing/playlists.md index 6e8891275cb..6963bdf88cd 100644 --- a/docs/sources/sharing/playlists.md +++ b/docs/sources/sharing/playlists.md @@ -132,7 +132,7 @@ You can control a playlist in **Normal** or **TV** mode after it's started, usin | Stop (square) | Ends the playlist, and exits to the current dashboard. | | Cycle view mode (monitor icon) | Rotates the display of the dashboards in different view modes. | | Time range | Displays data within a time range. It can be set to display the last 5 minutes up to 5 years ago, or a custom time range, using the down arrow. | -| Refresh (circle arrow) | Reloads the dashboard, to display the current data. It can be set to reload automatically every 5 seconds to 1 day, using the drop down arrow. | +| Refresh (circle arrow) | Reloads the dashboard, to display the current data. It can be set to reload automatically every 5 seconds to 1 day, using the drop-down arrow. | > Shortcut: Press the Esc key to stop the playlist from your keyboard. diff --git a/docs/sources/variables/manage-variable.md b/docs/sources/variables/manage-variable.md index b25c3a0a0b6..e3d6be887c1 100644 --- a/docs/sources/variables/manage-variable.md +++ b/docs/sources/variables/manage-variable.md @@ -11,7 +11,7 @@ The variables page lets you [add]({{< relref "variable-types/_index.md" >}}) var ## Move -You can move a variable up or down the list using the up and down arrows respectively. +You can move a variable up or down the list using drag and drop. ## Clone diff --git a/docs/sources/variables/variable-types/add-query-variable.md b/docs/sources/variables/variable-types/add-query-variable.md index 47f7a17ae80..947b0ba082d 100644 --- a/docs/sources/variables/variable-types/add-query-variable.md +++ b/docs/sources/variables/variable-types/add-query-variable.md @@ -8,6 +8,8 @@ weight = 100 Query variables allow you to write a data source query that can return a list of metric names, tag values, or keys. For example, a query variable might return a list of server names, sensor IDs, or data centers. The variable values change as they dynamically fetch options with a data source query. +Query variables are generally only supported for strings. If your query return numbers or any other data type, you may need to convert them to strings in order to use them as variables. For the Azure data source, for example, you can use the [tostring](https://docs.microsoft.com/en-us/azure/data-explorer/kusto/query/tostringfunction) function for this purpose. + Query expressions can contain references to other variables and in effect create linked variables. Grafana detects this and automatically refreshes a variable when one of its linked variables change. ## Query expressions diff --git a/docs/sources/variables/variable-types/global-variables.md b/docs/sources/variables/variable-types/global-variables.md index c7656ce3009..ab02f3ae6d6 100644 --- a/docs/sources/variables/variable-types/global-variables.md +++ b/docs/sources/variables/variable-types/global-variables.md @@ -15,11 +15,11 @@ Grafana has global built-in variables that can be used in expressions in the que This variable is the name of the current dashboard. -## $**from and $**to +## $\_\_from and $\_\_to Grafana has two built in time range variables: `$__from` and `$__to`. They are currently always interpolated as epoch milliseconds by default but you can control date formatting. -> This special formatting syntax is only available in Grafan a 7.1.2+ +> This special formatting syntax is only available in Grafana 7.1.2+ | Syntax | Example result | Description | | ------------------------ | ------------------------ | --------------------------------------------------------------------------------------------------------- | diff --git a/docs/sources/visualizations/_index.md b/docs/sources/visualizations/_index.md index baa08e3e75a..d9b8bc0d8d0 100644 --- a/docs/sources/visualizations/_index.md +++ b/docs/sources/visualizations/_index.md @@ -8,14 +8,17 @@ aliases = ["/docs/grafana/latest/panels/visualizations/"] Grafana offers a variety of visualizations to support different use cases. This section of the documentation highlights the built-in panels, their options and typical usage. +> **Note:** If you are unsure which visualization to pick, Grafana can provide visualization suggestions based on the panel query. When you select a visualization, Grafana will show a preview with that visualization applied. For more information, see the [add a panel]({{< relref "../panels/add-a-panel.md" >}}) documentation. + - Graphs & charts - [Time series]({{< relref "./time-series/_index.md" >}}) is the default and main Graph visualization. - [State timeline]({{< relref "./state-timeline.md" >}}) for state changes over time. - [Status history]({{< relref "./status-history.md" >}}) for periodic state over time. - [Bar chart]({{< relref "./bar-chart.md" >}}) shows any categorical data. - [Histogram]({{< relref "./histogram.md" >}}) calculates and shows value distribution in a bar chart. - - [Heatmap]({{< relref "./heatmap.md" >}}). - - [Pie chart]({{< relref "./pie-chart-panel.md" >}}). + - [Heatmap]({{< relref "./heatmap.md" >}}) visualizes data in two dimensions, used typically for the magnitude of a phenomenon. + - [Pie chart]({{< relref "./pie-chart-panel.md" >}}) is typically used where proportionality is important. + - [Candlestick]({{< relref "./candlestick.md" >}}) is typically for financial data where the focus is price/data movement. - Stats & numbers - [Stat]({{< relref "./stat-panel.md" >}}) for big stats and optional sparkline. - [Gauge]({{< relref "./gauge-panel.md" >}}) is a normal radial gauge. @@ -27,7 +30,7 @@ Grafana offers a variety of visualizations to support different use cases. This - Widgets - [Dashboard list]({{< relref "./dashboard-list-panel.md" >}}) can list dashboards. - [Alert list]({{< relref "./alert-list-panel.md" >}}) can list alerts. - - [Text panel]({{< relref "./alert-list-panel.md" >}}) can show markdown and html. + - [Text panel]({{< relref "./text-panel.md" >}}) can show markdown and html. - [News panel]({{< relref "./news-panel.md" >}}) can show RSS feeds. ## Get more diff --git a/docs/sources/visualizations/bar-chart.md b/docs/sources/visualizations/bar-chart.md index 74467399c19..c918ab65b31 100644 --- a/docs/sources/visualizations/bar-chart.md +++ b/docs/sources/visualizations/bar-chart.md @@ -42,6 +42,14 @@ Use these options to refine your visualization. - **Horizontal** - Will make the X axis the category axis. - **Vertical** - Will make the Y axis the category axis. +### Rotate bar labels + +When the graph is in vertical orientation you can use this setting to rotate the labels under the bars. Useful if the labels are long and overlap. + +### Bar label max length + +Sets the max length of the bar label. Labels longer than the max length will be truncated and `...` will be appended to the end. + ### Show values This controls whether values are shown on top or to the left of bars. diff --git a/docs/sources/visualizations/candlestick.md b/docs/sources/visualizations/candlestick.md new file mode 100644 index 00000000000..632dfb13409 --- /dev/null +++ b/docs/sources/visualizations/candlestick.md @@ -0,0 +1,51 @@ ++++ +title = "Candlestick" +description = "Candlestick visualization documentation" +keywords = ["grafana", "Candlestick", "OHLC", "panel", "documentation"] +aliases = ["/docs/grafana/latest/features/panels/candlestick/", "/docs/grafana/latest/panels/visualizations/candlestick/"] +weight = 600 ++++ + +# Candlestick + +The Candlestick panel allows you to visualize data that includes a number of consistent dimensions focused on price movement. The Candlestick panel includes an Open-High-Low-Close (OHLC) mode, as well as support for additional dimensions based on time series data. + +{{< figure src="/static/img/docs/candlestick-panel/candlestick-panel-8-3.png" max-width="1200px" caption="Candlestick panel" >}} + +The Candlestick panel builds upon the foundation of the [time series]({{< relref "./time-series/_index.md" >}}) panel and includes many common configuration settings. + +## Mode + +The mode options allow you to toggle which dimensions are used for the visualization. + +- **Candles** limits the panel dimensions to the open, high, low, and close dimensions used by candlestick visualizations. +- **Volume** limits the panel dimension to the volume dimension. +- **Both** is the default behavior for the candlestick panel. It includes both candlestick and volume visualizations. + +## Candle style + +- **Candles** is the default display style and creates candle-style visualizations between the open and close dimensions. +- **OHLC Bars** displays the four core dimensions open, high, low, and close values. + +## Color strategy + +- **Since Open** is the default behavior. This mode will utilize the _Up_ color (below) if the intra-period price movement is positive. In other words, if the value on close is greater or equal to the value on open, the _Up_ color is used. +- **Since Prior Close** is an alternative display method based where the color of the candle is based on the inter-period price movement or change in value. In other words, if the value on open is greater than the previous value on close, the _Up_ color is used. If the value on open is lower than the previous value on close, the _Down_ color is used. _This option also triggers the hollow candlestick visualization mode_. Hollow candlesticks indicate that the intra-period movement is positive (value is higher on close than on open), filled candlesticks indicate the intra-period change is negative (value is lower on close than on open). To learn more, see the [explanation of the differences](https://thetradingbible.com/how-to-read-hollow-candlesticks). + +## Up & Down Colors + +The **Up color** and **Down color** options select which colors are used when the price movement is up or down. Please note that the _Color strategy_ above will determine if intra-period or inter-period price movement is used to select the candle or OHLC bar color. + +## Open, High, Low, Close + +The candlestick panel will attempt to map fields to the appropriate dimension. The **Open**, **High**, **Low**, and **Close** options allow you to map your data to these dimensions if the panel is unable to do so. + +- **Open** corresponds to the starting value of the given period. +- **High** corresponds to the highest value of the given period. +- **Low** corresponds to the lowest value of the given period. +- **Close** corresponds to the final (end) value of the given period. +- **Volume** corresponds to the sample count in the given period. (e.g. number of trades) + +## Additional fields + +The candlestick panel is based on the time series panel. It can visualization additional data dimensions beyond open, high, low, close, and volume The **Include** and **Ignore** options allow the panel to visualize other included data such as simple moving averages, Bollinger bands and more, using the same styles and configurations available in the [time series]({{< relref "./time-series/_index.md" >}}) panel. diff --git a/docs/sources/visualizations/geomap.md b/docs/sources/visualizations/geomap.md index 55946519b3f..4124d468d8a 100644 --- a/docs/sources/visualizations/geomap.md +++ b/docs/sources/visualizations/geomap.md @@ -12,6 +12,100 @@ The Geomap panel visualization allows you to view and customize the world map us {{< figure src="/static/img/docs/geomap-panel/geomap-example-8-1-0.png" max-width="1200px" caption="Geomap panel" >}} +## Map View + +The map view controls the initial view of the map when the dashboard loads. + +### Initial View + +The initial view configures how the GeoMap panel renders when the panel is first loaded. + +- **View** sets the center for the map when the panel first loads. +- **Latitude** (available when the **View** mode is _Coordinates_) +- **Longitude** (available when the **View** mode is _Coordinates_) +- **Zoom** sets the initial zoom level for the GeoMap panel. + +## Data layer + +The Geomap visualization supports multiple Data Layers. Each data layer determines how you visualize geospatial data on top of the base map. + +### Layer Types + +There are four-layer types to choose from in the Geomap visualization. + +- **Marker** renders a marker at each data point. +- **Heatmap** visualizes a heatmap of the data. +- **GeoJSON** renders static data from a geojson file. + +### Layer Controls + +The layer controls allow you to create layers, change their name, reorder and delete layers. + +- **Add layer** creates an additional, configurable data layer for the Geomap visualization. When you add a layer, you are prompted to select a layer type. You can change the layer type at any point during panel configuration. See the **Layer Types** section above for details on each layer type. +- The layer controls allow you to rename, delete, and reorder the layers of the panel. + - **Edit layer name (pencil icon)** renames the layer. + - **Trash Bin** deletes the layer. + - **Reorder (six dots/grab handle)** allows you to change the layer order. Data on higher layers will appear above data on lower layers. The panel will update the layer order as you drag and drop to help simplify choosing a layer order. + +You can add multiple layers of data to a single Geomap panel in order to create rich, detailed visualizations. + +### Location + +The Geomap panel needs a source of geographical data. This data comes from a database query, and there are four mapping options for your data. + +- **Auto** automatically searches for location data. Use this option when your query is based on one of the following names for data fields. + - geohash: “geohash” + - latitude: “latitude”, “lat” + - longitude: “longitude”, “lng”, “lon” + - lookup: “lookup” +- **Coords** specifies that your query holds coordinate data. You will get prompted to select numeric data fields for latitude and longitude from your database query. +- **Geohash** specifies that your query holds geohash data. You will get prompted to select a string data field for the geohash from your database query. +- **Lookup** specifies that your query holds location name data that needs to be mapped to a value. You will get prompted to select the lookup field from your database query and a gazetteer. The gazetteer is the directory that is used to map your queried data to a geographical point. + +### Markers layer + +The markers layer allows you to display data points as different marker shapes such as circles, squares, triangles, stars, and more. + +![Markers Layer](/static/img/docs/geomap-panel/geomap-markers-8-1-0.png) + +![Markers Layer Options](/static/img/docs/geomap-panel/geomap-markers-options-8-1-0.png) + +- **Marker Color** configures the color of the marker. The default `Fixed size` keeps all points a single color. There is an alternate option to have multiple colors depending on the data point values and the threshold set at the `Thresholds` section. +- **Marker Size** configures the size of the marker. Default is `Fixed size`, making all marker size the same regardless of the data points. However, there is also an option to scale the circles to the corresponding data points. `Min` and `Max` marker size has to be set such that the Marker layer can scale within this range. +- **Marker Shape** allows you to choose the shape, icon, or graphic to aid in providing additional visual context to your data. Choose from assets that are included with Grafana such as simple shapes or the Unicon library. You can also specify a URL containing an image asset. The image must be a scalable vector graphic (SVG). +- **Fill opacity** configures the transparency of each marker. + +### Heatmap layer + +The heatmap layer clusters various data points to visualize locations with different densities. +To add a heatmap layer: + +Click on the drop-down menu under Data Layer and choose `Heatmap`. + +Similar to `Markers`, you are prompted with various options to determine which data points to visualize and how. + +![Heatmap Layer](/static/img/docs/geomap-panel/geomap-heatmap-8-1-0.png) + +![Heatmap Layer Options](/static/img/docs/geomap-panel/geomap-heatmap-options-8-1-0.png) + +- **Weight values** configure the intensity of the heatmap clusters. `Fixed value` keeps a constant weight value throughout all data points. This value should be in the range of 0~1. Similar to Markers, there is an alternate option in the drop-down to automatically scale the weight values depending on data values. +- **Radius** configures the size of the heatmap clusters. +- **Blur** configures the amount of blur on each cluster. + +### GeoJSON layer + +The GeoJSON layer allows you to select and load a static GeoJSON file from the filesystem. + +- **GeoJSON URL** provides a choice of GeoJSON files that ship with Grafana. +- **Default Style** controls which styles to apply when no rules above match. + - **Color** configures the color of the default style + - **Opacity** configures the default opacity +- **Style Rules** apply styles based on feature properties + - **Rule** allows you to select a _feature_, _condition_, and _value_ from the GeoJSON file in order to define a rule. The trash bin icon can be used to delete the current rule. + - **Color** configures the color of the style for the current rule + - **Opacity** configures the transparency level for the current rule +- **Add style rule** creates additional style rules. + ## Base layer The base layer loads in a blank world map from the tile server to the Grafana panel. Several base layer options are available each with specific configuration options to style the base map. The default base layer is CartoDB base map. Custom default base layers can be defined in the `.ini` configuration file. @@ -80,56 +174,3 @@ default_baselayer_config = `{ ``` `enable_custom_baselayers` allows you to enable or disable custom open source base maps that are already implemented. The default is `true`. - -## Data layer - -The data layer in the Geomap plugin determines how you visualize geospatial data on top of the base map. - -### Location - -The Geomap panel needs a source of geographical data. This data comes from a database query, and there are four mapping options for your data. - -- **Auto** automatically searches for location data. Use this option when your query is based on one of the following names for data fields. - - geohash: “geohash” - - latitude: “latitude”, “lat” - - longitude: “longitude”, “lng”, “lon” - - lookup: “lookup” -- **Coords** specifies that your query holds coordinate data. You will get prompted to select numeric data fields for latitude and longitude from your database query. -- **Geohash** specifies that your query holds geohash data. You will get prompted to select a string data field for the geohash from your database query. -- **Lookup** specifies that your query holds location name data that needs to be mapped to a value. You will get prompted to select the lookup field from your database query and a gazetteer. The gazetteer is the directory that is used to map your queried data to a geographical point. - -### Markers layer - -The markers layer allows you to display data points as different marker shapes such as circle, squares, triangles, stars, and more. - -![Markers Layer](/static/img/docs/geomap-panel/geomap-markers-8-1-0.png) - -![Markers Layer Options](/static/img/docs/geomap-panel/geomap-markers-options-8-1-0.png) - -- **Marker Color** configures the color of the marker. The default `Fixed size` keeps all points a single color. There is an alternate option to have multiple colors depending on the data point values and the threshold set at the `Thresholds` section. -- **Marker Size** configures the size of the marker. Default is `Fixed size`, making all marker size the same regardless of the data points. However, there is also an option to scale the circles to the corresponding data points. `Min` and `Max` marker size has to be set such that the Marker layer can scale within these range. -- **Marker Shape** provides you with the flexibility to visualize the data points differently. - - Circle - - Square - - Triangle - - Star - - Cross - - X -- **Fill opacity** configures the transparency of each marker. - -### Heatmap layer - -The heatmap layer clusters various data points to visualize locations with different densities. -To add a heatmap layer: - -Click on the drop down menu under Data Layer and choose `Heatmap`. - -Similar to `Markers`, you are prompted with various options to determine which data points to visualize and how. - -![Heatmap Layer](/static/img/docs/geomap-panel/geomap-heatmap-8-1-0.png) - -![Heatmap Layer Options](/static/img/docs/geomap-panel/geomap-heatmap-options-8-1-0.png) - -- **Weight values** configures the intensity of the heatmap clusters. `Fixed value` keeps a constant weight value throughout all data points. This value should be in the range of 0~1. Similar to Markers, there is an alternate option in the drop down to automatically scale the weight values depending on data values. -- **Radius** configures the size of the heatmap clusters. -- **Blur** configures the amount of blur on each cluster. diff --git a/docs/sources/visualizations/table/_index.md b/docs/sources/visualizations/table/_index.md index 4255995eefa..8a43c64df62 100644 --- a/docs/sources/visualizations/table/_index.md +++ b/docs/sources/visualizations/table/_index.md @@ -41,6 +41,8 @@ By default, the minimum width of the table column is 150 pixels. This field opti For example, if you enter `75` in the field, then when you click outside the field, all the columns will scale to no smaller than 75 pixels wide. +For small-screen devices, such as smartphones or tablets, reduce the default `150` pixel value to`50` to allow table based panels to render correctly in dashboards. + ## Column alignment Choose how Grafana should align cell contents: diff --git a/docs/sources/whatsnew/_index.md b/docs/sources/whatsnew/_index.md index 1de6833f5c2..de3a4f91f66 100644 --- a/docs/sources/whatsnew/_index.md +++ b/docs/sources/whatsnew/_index.md @@ -11,6 +11,7 @@ as info on deprecations, breaking changes and plugin development read the [relea ## Grafana 8 +- [What's new in 8.3]({{< relref "whats-new-in-v8-3" >}}) - [What's new in 8.2]({{< relref "whats-new-in-v8-2" >}}) - [What's new in 8.1]({{< relref "whats-new-in-v8-1" >}}) - [What's new in 8.0]({{< relref "whats-new-in-v8-0" >}}) diff --git a/docs/sources/whatsnew/whats-new-in-v5-4.md b/docs/sources/whatsnew/whats-new-in-v5-4.md index e069f066190..db0b137b684 100644 --- a/docs/sources/whatsnew/whats-new-in-v5-4.md +++ b/docs/sources/whatsnew/whats-new-in-v5-4.md @@ -37,7 +37,7 @@ Additionally, there's now support for disable the sending of `OK` alert notifica Grafana v5.3 included built-in support for [Google Stackdriver](https://cloud.google.com/stackdriver/) which enables you to visualize your Stackdriver metrics in Grafana. One important feature missing was support for templating queries. This is now included together with a brand new templating query editor for Stackdriver. -The Stackdriver templating query editor lets you choose from a set of different Query Types. This will in turn reveal additional drop downs to help you +The Stackdriver templating query editor lets you choose from a set of different Query Types. This will in turn reveal additional drop-downs to help you find, filter and select the templating values you're interested in, see screenshot for details. The templating query editor also supports chaining multiple variables making it easy to define variables that's dependent on other variables. diff --git a/docs/sources/whatsnew/whats-new-in-v7-1.md b/docs/sources/whatsnew/whats-new-in-v7-1.md index a5a917a9a3e..1d3fd56569b 100644 --- a/docs/sources/whatsnew/whats-new-in-v7-1.md +++ b/docs/sources/whatsnew/whats-new-in-v7-1.md @@ -79,7 +79,7 @@ Grafana v7.1 adds support for provisioning of app plugins. This allows app plugi Support for multiple dimensions has been added to all services in the Azure Monitor datasource. This means you can now group by more than one dimension with time series queries. With the Kusto based services, Log Analytics and Application Insights Analytics, you can also select multiple metrics as well as multiple dimensions. -Additionally, the Raw Edit mode for Application Insights Analytics has been replaced with a new service in the drop down for the data source and is called Insights Analytics. The new query editor behaves in the same way as Log Analytics. +Additionally, the Raw Edit mode for Application Insights Analytics has been replaced with a new service in the drop-down for the data source and is called Insights Analytics. The new query editor behaves in the same way as Log Analytics. ## Deep linking for Google Cloud Monitoring (formerly named Google Stackdriver) data source diff --git a/docs/sources/whatsnew/whats-new-in-v7-5.md b/docs/sources/whatsnew/whats-new-in-v7-5.md index 77c18fc1507..f66b95827f0 100644 --- a/docs/sources/whatsnew/whats-new-in-v7-5.md +++ b/docs/sources/whatsnew/whats-new-in-v7-5.md @@ -64,7 +64,7 @@ Previously, when users wanted to configure the Postgres data source to connect w Instead of the file path, users can now paste the SSL certification content in the UI. This allows them to configure the certification even when they do not have access to the server. -> **Note:** It remains as limitation for the hosted Grafana, because the user doesn't have access to the server configuration. +> **Note:** It remains as limitation for the Grafana Cloud, as users may not have access to the server configuration. [Postgres data source]({{< relref "../datasources/postgres.md" >}}) and [Provisioning]({{< relref "../administration/provisioning.md" >}}) were updated as a result of this change. diff --git a/docs/sources/whatsnew/whats-new-in-v8-0.md b/docs/sources/whatsnew/whats-new-in-v8-0.md index 391f22ebbc9..a5e73e63e28 100644 --- a/docs/sources/whatsnew/whats-new-in-v8-0.md +++ b/docs/sources/whatsnew/whats-new-in-v8-0.md @@ -24,7 +24,7 @@ As part of the new alert changes, we have introduced a new data source, Alertman > **Note:** Out of the box, Grafana still supports old Grafana alerts. They are legacy alerts at this time, and will be deprecated in a future release. -To learn more about the differences between new alerts and the legacy alerts, refer to [What's New with Grafana 8 Alerts]({{< relref "../alerting/difference-old-new.md" >}}). +To learn more about the differences between new alerts and the legacy alerts, refer to [What's New with Grafana 8 Alerts]({{< relref "../alerting/unified-alerting/difference-old-new.md" >}}). ### Library panels diff --git a/docs/sources/whatsnew/whats-new-in-v8-2.md b/docs/sources/whatsnew/whats-new-in-v8-2.md index e7e9f5a3bb2..4a37020a09c 100644 --- a/docs/sources/whatsnew/whats-new-in-v8-2.md +++ b/docs/sources/whatsnew/whats-new-in-v8-2.md @@ -40,13 +40,13 @@ We have continued to improve how you manage your plugins within Grafana. The new {{< figure src="/static/img/docs/plugins/plugins-catalog-browse-8-1.png" max-width="1200px" caption="Plugins Catalog Browsers" >}} -## Grafana 8 Alerting +## Grafana Alerting We’ve continued to bolster the new, unified alerting system launched in Grafana 8. This update includes the addition of a UI to edit the Cortex/Loki namespace, edit the alert group name, and edit the alert group evaluation interval. We've also added a Test button to test an alert notification contact point. There's even more to explore here including custom grouping for alert manager notifications and several small but significant changes to improve creation editing and managing alert rules. Please see the [alerting documentation](https://grafana.com/docs/grafana/latest/alerting/unified-alerting/) for more details and information on how you can enable the unified alerting system in your instance of Grafana. ## Image Renderer performance improvements and measurement -You can use Grafana’s image renderer to generate JPEG and PDF images of panels and dashboards. Use these images for alert notifications, PDF exports, and reports sent by Grafana. We’ve added additional metrics to the image renderer to help you diagnose its performance, and [included guidance in our documentation](https://grafana.com/docs/grafana/next/image-rendering/#rendering-mode) to help you configure it for the best mix of performance and resource usage. Tests show that we have reduced image load time from the 95th percentile of 10 seconds to less than 3 seconds under normal load. +You can use Grafana’s image renderer to generate images of panels and dashboards. Grafana uses these images for alert notifications, PDF exports (Grafana Enterprise), and reports sent by Grafana (Grafana Enterprise). We’ve added additional metrics to the image renderer to help you diagnose its performance, and [included guidance in our documentation](https://grafana.com/docs/grafana/next/image-rendering/#rendering-mode) to help you configure it for the best mix of performance and resource usage. Tests show that we have reduced image load time from the 95th percentile of 10 seconds to less than 3 seconds under normal load. # Grafana Enterprise diff --git a/docs/sources/whatsnew/whats-new-in-v8-3.md b/docs/sources/whatsnew/whats-new-in-v8-3.md new file mode 100644 index 00000000000..d2cbec7c658 --- /dev/null +++ b/docs/sources/whatsnew/whats-new-in-v8-3.md @@ -0,0 +1,103 @@ ++++ +title = "What's new in Grafana v8.3" +description = "Feature and improvement highlights for Grafana v8.3" +keywords = ["grafana", "new", "documentation", "8.3", "release notes"] +weight = -33 +aliases = ["/docs/grafana/latest/guides/whats-new-in-v8-3/"] +[_build] +list = false ++++ + +# What’s new in Grafana v8.3 + +Grafana 8.3 is an exciting release for Grafana Labs. This release includes the new Candlestick Panel, a new visualization suggestions engine and, for enterprise users, Recorded Queries. + +For Open Source users it also marks the first time Grafana Alerting, formerly unified alerting, is enabled by default for new Grafana installations. Grafana Alerting in 8.3 is the flexible, single pane of glass for all your alerts. Included in this release is expanded provisioning support for notifiers, contact points, and alert rules, alongside auditing and fine-grained access control for our Enterprise customers. + +We’ve summarized what’s new in the release here, but you might also be interested in the announcement blog post as well. If you’d like all the details you can check out the complete [CHANGELOG.md](https://github.com/grafana/grafana/blob/master/CHANGELOG.md). + +# Grafana OSS + +## Community Contributions + +Grafana 8.3 includes many community contributions including the ability to interpolate variables in tags ([#42318](https://github.com/grafana/grafana/pull/42318)), fly-out sub-menu support ([#41647](https://github.com/grafana/grafana/pull/42318)), the addition of AWS RoboMaker & AWS Global Accelerator metrics to the AWS CloudWatch data source ([#41450](https://github.com/grafana/grafana/pull/41450), [#41236](https://github.com/grafana/grafana/pull/41236)), as well as updates to the news panel ([#41193](https://github.com/grafana/grafana/pull/41193)), the plugin catalog ([#40917](https://github.com/grafana/grafana/pull/40917)), and many more. The Grafana Labs team is deeply grateful for all those who take the time to contribute and participate in the development of Grafana. + +## Accessibility + +We’ve continued to make progress on improving Grafana’s accessibility. In Grafana 8.3 we’ve updated the main menu with improved keyboard navigation. We’ve also improved Grafana’s behavior when navigating through elements with the tab key (tab stops) and finished our work to make Grafana’s viewer roles compatible with assistive technologies such as screen readers. You can read our accessibility statement here and reach out to us with accessibility issues using our community Slack or our community forums. + +## Dashboards and Visualizations + +### Panel Suggestions + +Grafana will now make suggestions for visualization types based on the current data surfaced by a query or queries in a panel. This makes seeing available, possible interpretations of your data more straightforward and can be a useful jumping-off point when building panels and dashboards with specific goals in mind. + +{{< figure src="/static/img/docs/panels/panel_suggestions_8_3.png" max-width="1200px" caption="Panel suggestionss" >}} + +### Candlestick Panel (Beta) + +Grafana 8.3 includes a new Candlestick panel that is so much more. Beyond candlesticks and open, high, low, close, behaviors, it includes customizable up/down colors, bar color determined by intra-period or inter-period movement of the data, volume histogram with matching colors, and the ability to detach or create a separate volume histogram to allow for more flexible dashboard design. The candlestick panel is based upon our time series panel meaning it also has support for additional data with the same configuration options and styles. + +{{< figure src="/static/img/docs/candlestick-panel/candlestick-panel-8-3.png" max-width="1200px" caption="Candlestick panel" >}} + +### Geomap updates + +The Geomap panel has been updated to support multiple data layers. The panel can now be configured with multiple markers, heatmaps & GeoJSON layers. The layers can be individually configured, named, and re-ordered to create rich, multidimensional visualizations. Please see the documentation for details on how you can set up and configure these new configuration options. + +{{< figure src="/static/img/docs/geomap-panel/geomap_8_3.png" max-width="1200px" caption="Geomap panel updates" >}} + +## Grafana Alerting + +Grafana Alerting is now the default alerting experience for all new Open Source installations of Grafana 8.3. Grafana Alerting in 8.3 includes the ability to test contact points and notification routing. Grafana 8.3 also adds the ability to configure and use external, Prometheus-style alert managers from within the Grafana Alerting workflow. + +{{< figure src="/static/img/docs/alerting/alerting_8_0.png" max-width="1200px" caption="Grafana Alerting" >}} + +## Support for AWS CloudWatch Metrics Insights + +Grafana and Amazon Managed Grafana now support AWS Metrics Insights – a fast, flexible, SQL-based query engine that enables you to identify trends and patterns across millions of operational metrics in real time. + +You can use Metrics Insights in the AWS CloudWatch plugin. Using this new feature is as simple as selecting the Metric Query type. The Metric Query type has two different modes: a Builder mode and a Code editor mode. + +The example below demonstrates using the new Metrics Insight capability to view the top 5 instances with the highest average CPU Utilization, ordered by maximum, in descending order. The code editor has built-in autocompletion support that gives suggestions throughout the composition of the query. + +{{< figure src="/static/img/docs/cloudwatch/cloudwatch-code-editor-autocomplete-8.3.0.gif" max-width="1200px" caption="Grafana Alerting" >}} + +# Grafana Enterprise + +## Recorded Queries + +Recorded queries turn “point in time” data into time series. + +Recorded queries allow you to export the results of certain non-time series queries to the Enterprise backend in order to store data over time and allow customers to construct their own time series. + +This new feature is especially helpful for Enterprise customers using plugins because many new plugins, like ServiceNow and Jira, don’t return time series so customers weren’t able to plot historical data over time. With recorded queries, now they can! For more information + +## Assign fine-grained permissions directly to users with the new role picker (beta) + +Sometimes the Viewer, Editor, and Admin roles just don’t fit what a certain user needs to do in Grafana. Now you can assign fine-grained roles directly to users, so they can create reports, use Explore mode, create data sources, and perform other specific actions in Grafana. The role picker can be access from the Grafana Admin user management page. + +{{< figure src="/static/img/docs/enterprise/enterprise_role_picker_8_3.png" max-width="1200px" caption="Grafana Enterprise Role Picker" >}} + +## Use fine-grained access control for Organizations and Licensing (beta) + +We’ve added new permissions to fine-grained access control to help you specify actions that users can perform. Now you can assign permissions to manage Organizations and License functions in Grafana, in addition to Users, Data Sources, Reports, and other resources. Fine-grained access control remains in beta and we will continue to add new permissions until all of Grafana’s endpoints are covered. For a complete list of the actions you can permit using fine-grained access control, see the [reference](https://grafana.com/docs/grafana/next/enterprise/access-control/fine-grained-access-control-references/). + +## Get your encryption key from a Key Management Service + +Grafana’s database contains secrets, like the credentials used to query data sources, send alert notifications and perform other functions within Grafana. These secrets are encrypted using keys, which are usually stored in Grafana’s configuration file. Now you can get your encryption key from Amazon KMS, Azure Key Vault, or Hashicorp Vault. This allows you to centrally manage your Grafana encryption key and reduce the chances it will leak. + +In order to support this, we’ve upgraded Grafana Enterprise to use envelope encryption, which complements the KMS integration by adding a layer of indirection to the encryption process. Instead of encrypting all secrets with a single key, Grafana uses a set of keys called data encryption keys (DEKs) to encrypt them. These data encryption keys are themselves encrypted with a single key encryption key (KEK). With envelope encryption, you can store a KEK in your KMS, and still quickly encrypt and decrypt data using DEKs stored within the Grafana database. + +## Pay the same for all users, regardless of their permissions + +Are you tired of managing user permissions because your license only allows a certain number of Viewers and Editors or Admins? So were we. We’ve added support for combined user pricing, where all users cost the same and fall into the same license bucket in Grafana Enterprise. This is a specific license option and must be updated in your contract. To learn more, refer to our [licensing docs](https://grafana.com/docs/grafana/latest/enterprise/license/license-restrictions/). To switch to combined user pricing, contact your Grafana Labs account team. + +{{< figure src="/static/img/docs/enterprise/enterprise_users_8_3.png" max-width="1200px" caption="Grafana Enterprise User Pricing" >}} + +## Author dashboards faster with resource caching + +Your query editor just became faster. [Query caching](https://grafana.com/docs/grafana/latest/enterprise/query-caching/) improves query performance and sometimes reduces cost, by reducing the number of repetitive queries performed against data sources. Resource caching does the same thing but for resource calls, like retrieving the list of applications in the AppDynamics editor, the list of metrics from Datadog, or the list of values in a template variable dropdown. This makes for a zippier user experience for everyone writing queries in Grafana. + +## Review audit logs for more services, like alerting + +[Audit logs](https://grafana.com/docs/grafana/latest/enterprise/auditing/) are a record of the actions users perform in Grafana, which you can investigate in case of a security incident or to understand Grafana usage better. We’ve added audit logs for new actions performed against plugins, data sources, library elements, and Grafana’s new alerting service. This ensures that if a user makes a change anywhere in Grafana Enterprise, you’ll have a record of it. For details, refer to the [Auditing docs](https://grafana.com/docs/grafana/latest/enterprise/auditing/). diff --git a/e2e/benchmarks/dashboards/live/4-20hz-panels.json b/e2e/benchmarks/dashboards/live/4-20hz-panels.json new file mode 100644 index 00000000000..aed51ce308b --- /dev/null +++ b/e2e/benchmarks/dashboards/live/4-20hz-panels.json @@ -0,0 +1,399 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 82, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 10, + "maxDataPoints": 1500, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "channel": "plugin/testdata/random-20Hz-stream-5", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "measurements", + "refId": "A" + } + ], + "title": "5", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 6, + "maxDataPoints": 1500, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "channel": "plugin/testdata/random-20Hz-stream-2", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "measurements", + "refId": "A" + } + ], + "title": "2", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 8, + "maxDataPoints": 1500, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "single" + } + }, + "targets": [ + { + "channel": "plugin/testdata/random-20Hz-stream-4", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "queryType": "measurements", + "refId": "A" + } + ], + "title": "4", + "type": "timeseries" + }, + { + "datasource": { + "type": "grafana", + "uid": "grafana" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 3, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "auto", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 9, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 2, + "maxDataPoints": 1500, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom" + }, + "tooltip": { + "mode": "none" + } + }, + "targets": [ + { + "buffer": 60000, + "channel": "plugin/testdata/random-20Hz-stream", + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "filter": { + "fields": [] + }, + "queryType": "measurements", + "refId": "A" + } + ], + "title": "1", + "transparent": true, + "type": "timeseries" + } + ], + "refresh": "", + "schemaVersion": 33, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-60s", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "Grafana Live performance benchmarking", + "uid": "S4M5r9cnk", + "version": 9, + "weekStart": "" +} diff --git a/e2e/benchmarks/live/4-20hz-panels.spec.ts b/e2e/benchmarks/live/4-20hz-panels.spec.ts new file mode 100644 index 00000000000..1531d4cc567 --- /dev/null +++ b/e2e/benchmarks/live/4-20hz-panels.spec.ts @@ -0,0 +1,41 @@ +import { e2e } from '@grafana/e2e'; + +type WithGrafanaRuntime = T & { + grafanaRuntime: { + livePerformance: { + start: () => void; + getStats: () => Record; + }; + }; +}; + +const hasGrafanaRuntime = (obj: T): obj is WithGrafanaRuntime => { + return typeof (obj as any)?.grafanaRuntime === 'object'; +}; + +e2e.benchmark({ + name: 'Live performance benchmarking - 4x20hz panels', + dashboard: { + folder: '/dashboards/live', + delayAfterOpening: 1000, + skipPanelValidation: true, + }, + repeat: 10, + duration: 120000, + appStats: { + startCollecting: (window) => { + if (!hasGrafanaRuntime(window)) { + return; + } + + return window.grafanaRuntime.livePerformance.start(); + }, + collect: (window) => { + if (!hasGrafanaRuntime(window)) { + return {}; + } + + return window.grafanaRuntime.livePerformance.getStats() ?? {}; + }, + }, +}); diff --git a/e2e/suite1/tsconfig.json b/e2e/benchmarks/tsconfig.json similarity index 100% rename from e2e/suite1/tsconfig.json rename to e2e/benchmarks/tsconfig.json diff --git a/e2e/build_results.zip b/e2e/build_results.zip new file mode 100644 index 00000000000..10ef9d01697 Binary files /dev/null and b/e2e/build_results.zip differ diff --git a/e2e/custom.ini b/e2e/custom.ini new file mode 100644 index 00000000000..cd4f4c9103d --- /dev/null +++ b/e2e/custom.ini @@ -0,0 +1,2 @@ +[feature_toggles] +enable = diff --git a/e2e/dashboards-suite/Repeating_a_panel_horizontally.spec.ts b/e2e/dashboards-suite/Repeating_a_panel_horizontally.spec.ts new file mode 100644 index 00000000000..cb1418e4466 --- /dev/null +++ b/e2e/dashboards-suite/Repeating_a_panel_horizontally.spec.ts @@ -0,0 +1,29 @@ +import { e2e } from '@grafana/e2e'; +const PAGE_UNDER_TEST = 'WVpf2jp7z/repeating-a-panel-horizontally'; + +describe('Repeating a panel horizontally', () => { + it('should be able to repeat a panel horizontally', () => { + e2e.flows.login('admin', 'admin'); + e2e.flows.openDashboard({ uid: PAGE_UNDER_TEST }); + + let prevLeft = Number.NEGATIVE_INFINITY; + let prevTop = null; + const panelTitles = ['Panel Title 1', 'Panel Title 2', 'Panel Title 3']; + panelTitles.forEach((title) => { + e2e.components.Panels.Panel.title(title) + .should('be.visible') + .then(($el) => { + const { left, top } = $el[0].getBoundingClientRect(); + expect(left).to.be.greaterThan(prevLeft); + if (prevTop !== null) { + expect(top).to.be.equal(prevTop); + } + + prevLeft = left; + prevTop = top; + }); + }); + }); + + // TODO: Add test for the case when we pass variables in the url +}); diff --git a/e2e/dashboards-suite/Repeating_a_panel_vertically.spec.ts b/e2e/dashboards-suite/Repeating_a_panel_vertically.spec.ts new file mode 100644 index 00000000000..c12052278bc --- /dev/null +++ b/e2e/dashboards-suite/Repeating_a_panel_vertically.spec.ts @@ -0,0 +1,28 @@ +import { e2e } from '@grafana/e2e'; +const PAGE_UNDER_TEST = 'OY8Ghjt7k/repeating-a-panel-vertically'; + +describe('Repeating a panel vertically', () => { + it('should be able to repeat a panel vertically', () => { + e2e.flows.login('admin', 'admin'); + e2e.flows.openDashboard({ uid: PAGE_UNDER_TEST }); + + let prevTop = Number.NEGATIVE_INFINITY; + let prevLeft = null; + const panelTitles = ['Panel Title 1', 'Panel Title 2', 'Panel Title 3']; + panelTitles.forEach((title) => { + e2e.components.Panels.Panel.title(title) + .should('be.visible') + .then(($el) => { + const { left, top } = $el[0].getBoundingClientRect(); + expect(top).to.be.greaterThan(prevTop); + if (prevLeft !== null) { + expect(left).to.be.equal(prevLeft); + } + prevLeft = left; + prevTop = top; + }); + }); + }); + + // TODO: Add test for the case when we pass variables in the url +}); diff --git a/e2e/dashboards-suite/Repeating_an_empty_row.spec.ts b/e2e/dashboards-suite/Repeating_an_empty_row.spec.ts new file mode 100644 index 00000000000..002eae58da8 --- /dev/null +++ b/e2e/dashboards-suite/Repeating_an_empty_row.spec.ts @@ -0,0 +1,23 @@ +import { e2e } from '@grafana/e2e'; +const PAGE_UNDER_TEST = 'dtpl2Ctnk/repeating-an-empty-row'; + +describe('Repeating empty rows', () => { + it('should be able to repeat empty rows vertically', () => { + e2e.flows.login('admin', 'admin'); + e2e.flows.openDashboard({ uid: PAGE_UNDER_TEST }); + + let prevTop = Number.NEGATIVE_INFINITY; + const rowTitles = ['Row title 1', 'Row title 2', 'Row title 3']; + rowTitles.forEach((title) => { + e2e.components.DashboardRow.title(title) + .should('be.visible') + .then(($el) => { + const { top } = $el[0].getBoundingClientRect(); + expect(top).to.be.greaterThan(prevTop); + prevTop = top; + }); + }); + }); + + // TODO: Add test for the case when we pass variables in the url +}); diff --git a/e2e/suite1/specs/dashboard-templating.spec.ts b/e2e/dashboards-suite/dashboard-templating.spec.ts similarity index 100% rename from e2e/suite1/specs/dashboard-templating.spec.ts rename to e2e/dashboards-suite/dashboard-templating.spec.ts diff --git a/e2e/suite1/specs/dashboard-time-zone.spec.ts b/e2e/dashboards-suite/dashboard-time-zone.spec.ts similarity index 69% rename from e2e/suite1/specs/dashboard-time-zone.spec.ts rename to e2e/dashboards-suite/dashboard-time-zone.spec.ts index e0be47065e0..e2e8a69432e 100644 --- a/e2e/suite1/specs/dashboard-time-zone.spec.ts +++ b/e2e/dashboards-suite/dashboard-time-zone.spec.ts @@ -1,5 +1,14 @@ import { e2e } from '@grafana/e2e'; -import { addDays, addHours, differenceInCalendarDays, differenceInMinutes, format, isBefore, parse } from 'date-fns'; +import { + addDays, + addHours, + differenceInCalendarDays, + differenceInMinutes, + format, + isBefore, + parseISO, + toDate, +} from 'date-fns'; e2e.scenario({ describeName: 'Dashboard time zone support', @@ -10,9 +19,9 @@ e2e.scenario({ scenario: () => { e2e.flows.openDashboard({ uid: '5SdHCasdf' }); - const fromTimeZone = 'Coordinated Universal Time'; + const fromTimeZone = 'UTC'; const toTimeZone = 'America/Chicago'; - const offset = -5; + const offset = offsetBetweenTimeZones(toTimeZone, fromTimeZone); const panelsToCheck = [ 'Random walk series', @@ -41,11 +50,10 @@ e2e.scenario({ e2e.components.PageToolbar.item('Dashboard settings').click(); - e2e.components.TimeZonePicker.container() + e2e.components.TimeZonePicker.containerV2() .should('be.visible') .within(() => { - e2e.components.Select.singleValue().should('be.visible').should('have.text', fromTimeZone); - + e2e.components.Select.singleValue().should('have.text', 'Coordinated Universal Time'); e2e.components.Select.input().should('be.visible').click(); }); @@ -79,14 +87,27 @@ const isTimeCorrect = (inUtc: string, inTz: string, offset: number): boolean => return false; } - const reference = format(new Date(), 'YYYY-MM-DD'); + const reference = format(new Date(), 'yyyy-LL-dd'); - const utcDate = parse(`${reference} ${inUtc}`); - const utcDateWithOffset = addHours(parse(`${reference} ${inUtc}`), offset); + const utcDate = toDate(parseISO(`${reference} ${inUtc}`)); + const utcDateWithOffset = addHours(toDate(parseISO(`${reference} ${inUtc}`)), offset); const dayDifference = differenceInCalendarDays(utcDate, utcDateWithOffset); // if the utcDate +/- offset is the day before/after then we need to adjust reference const dayOffset = isBefore(utcDateWithOffset, utcDate) ? dayDifference * -1 : dayDifference; - const tzDate = addDays(parse(`${reference} ${inTz}`), dayOffset); // adjust tzDate with any dayOffset + const tzDate = addDays(toDate(parseISO(`${reference} ${inTz}`)), dayOffset); // adjust tzDate with any dayOffset const diff = Math.abs(differenceInMinutes(utcDate, tzDate)); // use Math.abs if tzDate is in future return diff <= Math.abs(offset * 60); }; + +const offsetBetweenTimeZones = (timeZone1: string, timeZone2: string, when: Date = new Date()): number => { + const t1 = convertDateToAnotherTimeZone(when, timeZone1); + const t2 = convertDateToAnotherTimeZone(when, timeZone2); + return (t1.getTime() - t2.getTime()) / (1000 * 60 * 60); +}; + +const convertDateToAnotherTimeZone = (date: Date, timeZone: string): Date => { + const dateString = date.toLocaleString('en-US', { + timeZone: timeZone, + }); + return new Date(dateString); +}; diff --git a/e2e/suite1/specs/import-dashboard.spec.ts b/e2e/dashboards-suite/import-dashboard.spec.ts similarity index 93% rename from e2e/suite1/specs/import-dashboard.spec.ts rename to e2e/dashboards-suite/import-dashboard.spec.ts index 477a64587c3..e4307ff1c38 100644 --- a/e2e/suite1/specs/import-dashboard.spec.ts +++ b/e2e/dashboards-suite/import-dashboard.spec.ts @@ -5,7 +5,7 @@ e2e.scenario({ itName: 'Ensure you can import a number of json test dashboards from a specific test directory', addScenarioDataSource: false, addScenarioDashBoard: false, - skipScenario: false, + skipScenario: true, scenario: () => { e2e.flows.importDashboards('/dashboards', 1000); }, diff --git a/e2e/suite1/specs/templating-dashboard-links-and-variables.ts b/e2e/dashboards-suite/templating-dashboard-links-and-variables.ts similarity index 100% rename from e2e/suite1/specs/templating-dashboard-links-and-variables.ts rename to e2e/dashboards-suite/templating-dashboard-links-and-variables.ts diff --git a/e2e/suite1/dashboards/TestDashboard.json b/e2e/dashboards/TestDashboard.json similarity index 100% rename from e2e/suite1/dashboards/TestDashboard.json rename to e2e/dashboards/TestDashboard.json diff --git a/e2e/suite1/specs/panelEdit_base.spec.ts b/e2e/panels-suite/panelEdit_base.spec.ts similarity index 91% rename from e2e/suite1/specs/panelEdit_base.spec.ts rename to e2e/panels-suite/panelEdit_base.spec.ts index b34acb1bc3c..5bc8545c12f 100644 --- a/e2e/suite1/specs/panelEdit_base.spec.ts +++ b/e2e/panels-suite/panelEdit_base.spec.ts @@ -7,9 +7,11 @@ e2e.scenario({ itName: 'Tests various Panel edit scenarios', addScenarioDataSource: false, addScenarioDashBoard: false, - skipScenario: false, + skipScenario: true, scenario: () => { + e2e().intercept('/api/ds/query').as('query'); e2e.flows.openDashboard({ uid: 'TkZXxlNG3' }); + e2e().wait('@query'); e2e.flows.openPanelMenuItem(e2e.flows.PanelMenuItems.Edit, PANEL_UNDER_TEST); @@ -43,13 +45,12 @@ e2e.scenario({ // Can change to Alerts tab (graph panel is the default vis so the alerts tab should be rendered) e2e.components.Tab.title('Alert').should('be.visible').click(); - e2e.components.Tab.active().within((li: JQuery) => { - expect(li.text()).equals('Alert0'); // there's no alert so therefore Alert + 0 - }); - e2e.components.AlertTab.content().should('be.visible'); + e2e.components.Tab.active().should('have.text', 'Alert0'); // there's no alert so therefore Alert + 0 + e2e.components.AlertTab.content().should('not.exist'); e2e.components.QueryTab.content().should('not.exist'); e2e.components.TransformTab.content().should('not.exist'); - e2e.components.PanelAlertTabContent.content().should('not.exist'); + e2e.components.PanelAlertTabContent.content().should('exist'); + e2e.components.PanelAlertTabContent.content().should('be.visible'); e2e.components.Tab.title('Query').should('be.visible').click(); }); diff --git a/e2e/suite1/specs/panelEdit_queries.spec.ts b/e2e/panels-suite/panelEdit_queries.spec.ts similarity index 93% rename from e2e/suite1/specs/panelEdit_queries.spec.ts rename to e2e/panels-suite/panelEdit_queries.spec.ts index 9708204c8a0..0276011ae2f 100644 --- a/e2e/suite1/specs/panelEdit_queries.spec.ts +++ b/e2e/panels-suite/panelEdit_queries.spec.ts @@ -1,7 +1,6 @@ import { e2e } from '@grafana/e2e'; -import { expect } from '../../../public/test/lib/common'; +import { expect } from '../../public/test/lib/common'; -const PANEL_UNDER_TEST = 'Random walk series'; const flakyTimeout = 10000; e2e.scenario({ @@ -11,9 +10,7 @@ e2e.scenario({ addScenarioDashBoard: false, skipScenario: false, scenario: () => { - e2e.flows.openDashboard({ uid: '5SdHCadmz' }); - - e2e.flows.openPanelMenuItem(e2e.flows.PanelMenuItems.Edit, PANEL_UNDER_TEST); + e2e.flows.openDashboard({ uid: '5SdHCadmz', queryParams: { editPanel: 3 } }); // New panel editor opens when navigating from Panel menu e2e.components.PanelEditor.General.content().should('be.visible'); diff --git a/e2e/suite1/specs/panelEdit_transforms.spec.ts b/e2e/panels-suite/panelEdit_transforms.spec.ts similarity index 74% rename from e2e/suite1/specs/panelEdit_transforms.spec.ts rename to e2e/panels-suite/panelEdit_transforms.spec.ts index 48cf725def1..9a4be955e7b 100644 --- a/e2e/suite1/specs/panelEdit_transforms.spec.ts +++ b/e2e/panels-suite/panelEdit_transforms.spec.ts @@ -1,7 +1,5 @@ import { e2e } from '@grafana/e2e'; -const PANEL_UNDER_TEST = 'Random walk series'; - e2e.scenario({ describeName: 'Panel edit tests - transformations', itName: 'Tests transformations editor', @@ -9,9 +7,7 @@ e2e.scenario({ addScenarioDashBoard: false, skipScenario: false, scenario: () => { - e2e.flows.openDashboard({ uid: '5SdHCadmz' }); - - e2e.flows.openPanelMenuItem(e2e.flows.PanelMenuItems.Edit, PANEL_UNDER_TEST); + e2e.flows.openDashboard({ uid: '5SdHCadmz', queryParams: { editPanel: 3 } }); e2e.components.Tab.title('Transform').should('be.visible').click(); diff --git a/e2e/run-suite b/e2e/run-suite index f9fad1f8da3..ce9707169c3 100755 --- a/e2e/run-suite +++ b/e2e/run-suite @@ -1,32 +1,96 @@ -#!/bin/bash +#!/usr/bin/env bash set -xeo pipefail . e2e/variables +if ((BASH_VERSINFO[0] < 4)); then + echo "Bash ver >= 4 is needed to run this script" + echo "Please upgrade your bash - run 'brew install bash' if you use Homebrew on MacOS" + exit 1; +fi + HOST=${HOST:-$DEFAULT_HOST} PORT=${PORT:-$DEFAULT_PORT} echo -e "Starting Cypress scenarios" +args=("$@") + CMD="start" PARAMS="" -SLOWMO=0 -URL=${BASE_URL:-"http://$HOST:$PORT"} -SUITE=${SUITE:-$DEFAULT_SUITE} -if [ "$1" == "debug" ]; then - echo -e "Debug mode" - SLOWMO=1 - PARAMS="--no-exit" -fi +declare -A env=( + [BASE_URL]=${BASE_URL:-"http://$HOST:$PORT"} + [SLOWMO]=0 +) + +testFilesForSingleSuite="*.spec.ts" + +declare -A cypressConfig=( + [integrationFolder]=../../e2e + [screenshotsFolder]=../../e2e/"${args[0]}"/screenshots + [videosFolder]=../../e2e/"${args[0]}"/videos + [fileServerFolder]=./cypress + [testFiles]=*-suite/*spec.ts + [defaultCommandTimeout]=30000 + [viewportWidth]=1920 + [viewportHeight]=1080 + [trashAssetsBeforeRuns]=false + [videoUploadOnPasses]=false +) -if [ "$1" == "dev" ]; then - echo "Dev mode" - CMD="open" -fi cd packages/grafana-e2e -yarn $CMD --env BASE_URL=$URL,SLOWMO=$SLOWMO \ - --config defaultCommandTimeout=30000,integrationFolder=../../e2e/$SUITE/specs,screenshotsFolder=../../e2e/$SUITE/screenshots,videosFolder=../../e2e/$SUITE/videos,fileServerFolder=./cypress,viewportWidth=1920,viewportHeight=1080,trashAssetsBeforeRuns=false,videoUploadOnPasses=false \ +case "$1" in + "debug") + echo -e "Debug mode" + env[SLOWMO]=1 + PARAMS="--no-exit" + ;; + "dev") + echo "Dev mode" + CMD="open" + ;; + "benchmark") + echo "Benchmark" + PARAMS="--headed" + CMD="start-benchmark" + env[BENCHMARK_PLUGIN_ENABLED]=true + env[BENCHMARK_PLUGIN_RESULTS_FOLDER]=../../e2e/benchmarks/"${args[1]}"/results + cypressConfig[video]=false + cypressConfig[integrationFolder]=../../e2e/benchmarks/"${args[1]}" + cypressConfig[screenshotsFolder]=../../e2e/benchmarks/"${args[1]}"/screenshots + cypressConfig[testFiles]=$testFilesForSingleSuite + ;; + "") + ;; + *) + cypressConfig[integrationFolder]=../../e2e/"${args[0]}" + cypressConfig[testFiles]=$testFilesForSingleSuite + ;; +esac + +function join () { + local -n map=$1 + local delimiter="," + + local res="" + + for key in "${!map[@]}" + do + value=${map[$key]} + if [ -z "${res}" ]; then + res=$key=$value + else + res=$res$delimiter$key=$value + fi + done + + echo "$res" +} + + +yarn $CMD --env "$(join env)" \ + --config "$(join cypressConfig)" \ $PARAMS diff --git a/e2e/shared/smokeTestScenario.ts b/e2e/shared/smokeTestScenario.ts index fa129cd5a14..b5c0a4bb28e 100644 --- a/e2e/shared/smokeTestScenario.ts +++ b/e2e/shared/smokeTestScenario.ts @@ -6,6 +6,7 @@ export const smokeTestScenario = { addScenarioDataSource: true, addScenarioDashBoard: true, skipScenario: false, + loginViaApi: false, scenario: () => { e2e.flows.openDashboard(); e2e.components.PageToolbar.item('Add panel').click(); diff --git a/e2e/shared/tsconfig.json b/e2e/shared/tsconfig.json new file mode 100644 index 00000000000..546c7ef03e2 --- /dev/null +++ b/e2e/shared/tsconfig.json @@ -0,0 +1,5 @@ +{ + "extends": "../../tsconfig.json", + "include": ["**/*.ts", "../../packages/grafana-e2e/cypress/support/index.d.ts"], + "resolveJsonModule": true +} diff --git a/e2e/suite1/specs/1-smoketests.spec.ts b/e2e/smoke-tests-suite/1-smoketests.spec.ts similarity index 50% rename from e2e/suite1/specs/1-smoketests.spec.ts rename to e2e/smoke-tests-suite/1-smoketests.spec.ts index 185eb389e0f..2049b329695 100644 --- a/e2e/suite1/specs/1-smoketests.spec.ts +++ b/e2e/smoke-tests-suite/1-smoketests.spec.ts @@ -1,4 +1,4 @@ import { e2e } from '@grafana/e2e'; -import { smokeTestScenario } from '../../shared/smokeTestScenario'; +import { smokeTestScenario } from '../shared/smokeTestScenario'; e2e.scenario(smokeTestScenario); diff --git a/e2e/suite1/specs/variables/load-options-from-url.ts b/e2e/smoke-tests-suite/variables/load-options-from-url.ts similarity index 100% rename from e2e/suite1/specs/variables/load-options-from-url.ts rename to e2e/smoke-tests-suite/variables/load-options-from-url.ts diff --git a/e2e/suite1/specs/variables/new-query-variable.ts b/e2e/smoke-tests-suite/variables/new-query-variable.ts similarity index 95% rename from e2e/suite1/specs/variables/new-query-variable.ts rename to e2e/smoke-tests-suite/variables/new-query-variable.ts index 8139c62ed3f..4efd16bd1bf 100644 --- a/e2e/suite1/specs/variables/new-query-variable.ts +++ b/e2e/smoke-tests-suite/variables/new-query-variable.ts @@ -18,7 +18,7 @@ describe('Variables - Add variable', () => { e2e.pages.Dashboard.Settings.Variables.Edit.General.generalTypeSelect() .should('be.visible') .within((select) => { - e2e.components.Select.singleValue().should('be.visible').should('have.text', 'Query'); + e2e.components.Select.singleValue().should('have.text', 'Query'); }); e2e.pages.Dashboard.Settings.Variables.Edit.General.generalLabelInput() .should('be.visible') @@ -82,7 +82,7 @@ describe('Variables - Add variable', () => { e2e().get('#Description').should('be.visible').clear().type('a description'); - e2e.components.DataSourcePicker.inputV2().should('be.visible').type('gdev-testdata').type('{enter}'); + e2e.components.DataSourcePicker.container().should('be.visible').type('gdev-testdata{enter}'); e2e.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsQueryInput() .should('be.visible') @@ -132,7 +132,7 @@ describe('Variables - Add variable', () => { e2e().get('#Description').should('be.visible').clear().type('a description'); - e2e.components.DataSourcePicker.inputV2().should('be.visible').type('gdev-testdata').type('{enter}'); + e2e.components.DataSourcePicker.container().type('gdev-testdata{enter}'); e2e.pages.Dashboard.Settings.Variables.Edit.QueryVariable.queryOptionsQueryInput() .should('be.visible') diff --git a/e2e/suite1/specs/variables/set-options-from-ui.ts b/e2e/smoke-tests-suite/variables/set-options-from-ui.ts similarity index 100% rename from e2e/suite1/specs/variables/set-options-from-ui.ts rename to e2e/smoke-tests-suite/variables/set-options-from-ui.ts diff --git a/e2e/suite1/specs/variables/textbox-variables.ts b/e2e/smoke-tests-suite/variables/textbox-variables.ts similarity index 100% rename from e2e/suite1/specs/variables/textbox-variables.ts rename to e2e/smoke-tests-suite/variables/textbox-variables.ts diff --git a/e2e/start-server b/e2e/start-server index 059085268f7..8d25be26d1e 100755 --- a/e2e/start-server +++ b/e2e/start-server @@ -36,6 +36,7 @@ else mkdir $PROV_DIR/datasources mkdir $PROV_DIR/dashboards + cp ./e2e/custom.ini $RUNDIR/conf/custom.ini cp ./conf/defaults.ini $RUNDIR/conf/defaults.ini fi @@ -49,7 +50,7 @@ cp -r devenv $RUNDIR echo -e "Starting Grafana Server port $PORT" $RUNDIR/bin/grafana-server \ - --homepath=$RUNDIR \ + --homepath=$HOME_PATH \ --pidfile=$RUNDIR/pid \ cfg:server.http_port=$PORT \ cfg:server.router_logging=1 \ diff --git a/e2e/suite1/screenshots/bar-gauge.spec.ts/bar-gauge-gradient (1).png b/e2e/suite1/screenshots/bar-gauge.spec.ts/bar-gauge-gradient (1).png deleted file mode 100644 index 08b192e69a3..00000000000 Binary files a/e2e/suite1/screenshots/bar-gauge.spec.ts/bar-gauge-gradient (1).png and /dev/null differ diff --git a/e2e/suite1/screenshots/bar-gauge.spec.ts/bar-gauge-gradient.png b/e2e/suite1/screenshots/bar-gauge.spec.ts/bar-gauge-gradient.png deleted file mode 100644 index e15f82cb14b..00000000000 Binary files a/e2e/suite1/screenshots/bar-gauge.spec.ts/bar-gauge-gradient.png and /dev/null differ diff --git a/e2e/suite1/screenshots/expected/bar-gauge-gradient.png b/e2e/suite1/screenshots/expected/bar-gauge-gradient.png deleted file mode 100644 index e15f82cb14b..00000000000 Binary files a/e2e/suite1/screenshots/expected/bar-gauge-gradient.png and /dev/null differ diff --git a/e2e/suite1/specs/query-editor.spec.ts b/e2e/suite1/specs/query-editor.spec.ts deleted file mode 100644 index 626228d8e36..00000000000 --- a/e2e/suite1/specs/query-editor.spec.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { e2e } from '@grafana/e2e'; - -e2e.scenario({ - describeName: 'Query editor', - itName: 'Undo should work in query editor for prometheus.', - addScenarioDataSource: false, - addScenarioDashBoard: false, - skipScenario: false, - scenario: () => { - e2e.pages.Explore.visit(); - e2e.components.DataSourcePicker.inputV2().should('be.visible').click(); - - cy.contains('gdev-prometheus').scrollIntoView().should('be.visible').click(); - const queryText = 'http_requests_total'; - - e2e.components.QueryField.container().should('be.visible').type(queryText).type('{backspace}'); - - cy.contains(queryText.slice(0, -1)).should('be.visible'); - - e2e.components.QueryField.container().type(e2e.typings.undo()); - - cy.contains(queryText).should('be.visible'); - }, -}); diff --git a/e2e/variables b/e2e/variables index 8a76f6134d3..13fa4bf360b 100644 --- a/e2e/variables +++ b/e2e/variables @@ -2,9 +2,9 @@ DEFAULT_RUNDIR=e2e/tmp RUNDIR=${RUNDIR:-$DEFAULT_RUNDIR} +HOME_PATH=$PWD/$RUNDIR PIDFILE=$RUNDIR/pid DEFAULT_PACKAGE_FILE=dist/grafana-*linux-amd64.tar.gz PROV_DIR=$RUNDIR/conf/provisioning DEFAULT_HOST=localhost DEFAULT_PORT=3001 -DEFAULT_SUITE=suite1 diff --git a/e2e/suite1/specs/bar-gauge.spec.ts b/e2e/various-suite/bar-gauge.spec.ts similarity index 81% rename from e2e/suite1/specs/bar-gauge.spec.ts rename to e2e/various-suite/bar-gauge.spec.ts index cdc469cb2b9..8881dde4e17 100644 --- a/e2e/suite1/specs/bar-gauge.spec.ts +++ b/e2e/various-suite/bar-gauge.spec.ts @@ -12,7 +12,7 @@ e2e.scenario({ e2e.flows.openDashboard({ uid: 'O6f11TZWk' }); e2e() - .get(`[data-panelid=6] [aria-label^="${selectors.components.Panels.Visualization.BarGauge.value}"]`) + .get(`[data-panelid=6] [data-testid^="${selectors.components.Panels.Visualization.BarGauge.valueV2}"]`) .should('have.css', 'color', 'rgb(242, 73, 92)') .contains('100'); }, diff --git a/e2e/suite1/specs/exemplars.spec.ts b/e2e/various-suite/exemplars.spec.ts similarity index 73% rename from e2e/suite1/specs/exemplars.spec.ts rename to e2e/various-suite/exemplars.spec.ts index bd466c56d7b..f75faa114d2 100644 --- a/e2e/suite1/specs/exemplars.spec.ts +++ b/e2e/various-suite/exemplars.spec.ts @@ -4,7 +4,7 @@ const dataSourceName = 'PromExemplar'; const addDataSource = () => { e2e.flows.addDataSource({ type: 'Prometheus', - expectedAlertMessage: 'Bad Gateway', + expectedAlertMessage: 'Error reading Prometheus', name: dataSourceName, form: () => { e2e.components.DataSource.Prometheus.configPage.exemplarsAddButton().click(); @@ -21,7 +21,7 @@ describe('Exemplars', () => { e2e.flows.login('admin', 'admin'); e2e() - .request({ url: `/api/datasources/name/${dataSourceName}`, failOnStatusCode: false }) + .request({ url: `${e2e.env('BASE_URL')}/api/datasources/name/${dataSourceName}`, failOnStatusCode: false }) .then((response) => { if (response.isOkStatusCode) { return; @@ -44,8 +44,16 @@ describe('Exemplars', () => { e2e.pages.Explore.visit(); - e2e.components.DataSourcePicker.input().should('be.visible').click(); + e2e.components.DataSourcePicker.container().should('be.visible').click(); e2e().contains(dataSourceName).scrollIntoView().should('be.visible').click(); + + // we need to wait for the query-field being lazy-loaded, in two steps: + // 1. first we wait for the text 'Loading...' to appear + // 1. then we wait for the text 'Loading...' to disappear + const monacoLoadingText = 'Loading...'; + e2e.components.QueryField.container().should('be.visible').should('have.text', monacoLoadingText); + e2e.components.QueryField.container().should('be.visible').should('not.have.text', monacoLoadingText); + e2e.components.TimePicker.openButton().click(); e2e.components.TimePicker.fromField().clear().type('2021-07-10 17:10:00'); e2e.components.TimePicker.toField().clear().type('2021-07-10 17:30:00'); diff --git a/e2e/suite1/specs/explore.spec.ts b/e2e/various-suite/explore.spec.ts similarity index 90% rename from e2e/suite1/specs/explore.spec.ts rename to e2e/various-suite/explore.spec.ts index 91872ff59cd..4e089a27b79 100644 --- a/e2e/suite1/specs/explore.spec.ts +++ b/e2e/various-suite/explore.spec.ts @@ -9,7 +9,7 @@ e2e.scenario({ scenario: () => { e2e.pages.Explore.visit(); e2e.pages.Explore.General.container().should('have.length', 1); - e2e.components.RefreshPicker.runButton().should('have.length', 1); + e2e.components.RefreshPicker.runButtonV2().should('have.length', 1); e2e.components.DataSource.TestData.QueryTab.scenarioSelectContainer() .should('be.visible') diff --git a/e2e/suite1/specs/gauge.spec.ts b/e2e/various-suite/gauge.spec.ts similarity index 100% rename from e2e/suite1/specs/gauge.spec.ts rename to e2e/various-suite/gauge.spec.ts diff --git a/e2e/suite1/specs/inspect-drawer.spec.ts b/e2e/various-suite/inspect-drawer.spec.ts similarity index 100% rename from e2e/suite1/specs/inspect-drawer.spec.ts rename to e2e/various-suite/inspect-drawer.spec.ts diff --git a/e2e/suite1/specs/pie-chart.spec.ts b/e2e/various-suite/pie-chart.spec.ts similarity index 100% rename from e2e/suite1/specs/pie-chart.spec.ts rename to e2e/various-suite/pie-chart.spec.ts diff --git a/e2e/various-suite/query-editor.spec.ts b/e2e/various-suite/query-editor.spec.ts new file mode 100644 index 00000000000..90afade11d3 --- /dev/null +++ b/e2e/various-suite/query-editor.spec.ts @@ -0,0 +1,32 @@ +import { e2e } from '@grafana/e2e'; + +e2e.scenario({ + describeName: 'Query editor', + itName: 'Undo should work in query editor for prometheus.', + addScenarioDataSource: false, + addScenarioDashBoard: false, + skipScenario: false, + scenario: () => { + e2e.pages.Explore.visit(); + e2e.components.DataSourcePicker.container().should('be.visible').click(); + + cy.contains('gdev-prometheus').scrollIntoView().should('be.visible').click(); + const queryText = 'http_requests_total'; + + // we need to wait for the query-field being lazy-loaded, in two steps: + // it is a two-step process: + // 1. first we wait for the text 'Loading...' to appear + // 1. then we wait for the text 'Loading...' to disappear + const monacoLoadingText = 'Loading...'; + e2e.components.QueryField.container().should('be.visible').should('have.text', monacoLoadingText); + e2e.components.QueryField.container().should('be.visible').should('not.have.text', monacoLoadingText); + + e2e.components.QueryField.container().type(queryText).type('{backspace}'); + + cy.contains(queryText.slice(0, -1)).should('be.visible'); + + e2e.components.QueryField.container().type(e2e.typings.undo()); + + cy.contains(queryText).should('be.visible'); + }, +}); diff --git a/e2e/suite1/specs/select-focus.spec.ts b/e2e/various-suite/select-focus.spec.ts similarity index 87% rename from e2e/suite1/specs/select-focus.spec.ts rename to e2e/various-suite/select-focus.spec.ts index 1a6f2e9ae25..1a83d956c5c 100644 --- a/e2e/suite1/specs/select-focus.spec.ts +++ b/e2e/various-suite/select-focus.spec.ts @@ -10,7 +10,7 @@ e2e.scenario({ e2e.flows.openDashboard({ uid: '5SdHCadmz' }); e2e.components.PageToolbar.item('Dashboard settings').click(); - e2e.components.FolderPicker.container() + e2e.components.FolderPicker.containerV2() .should('be.visible') .within(() => { e2e().get('#dashboard-folder-input').should('be.visible').click(); @@ -18,7 +18,7 @@ e2e.scenario({ e2e.components.Select.option().should('be.visible').first().click(); - e2e.components.FolderPicker.container() + e2e.components.FolderPicker.containerV2() .should('be.visible') .within(() => { e2e().get('#dashboard-folder-input').should('exist').should('have.focus'); @@ -26,7 +26,7 @@ e2e.scenario({ e2e.pages.Dashboard.Settings.General.title().click(); - e2e.components.FolderPicker.container() + e2e.components.FolderPicker.containerV2() .should('be.visible') .within(() => { e2e().get('#dashboard-folder-input').should('exist').should('not.have.focus'); diff --git a/e2e/suite1/specs/solo-route.spec.ts b/e2e/various-suite/solo-route.spec.ts similarity index 100% rename from e2e/suite1/specs/solo-route.spec.ts rename to e2e/various-suite/solo-route.spec.ts diff --git a/e2e/suite1/specs/trace-view-scrolling.spec.ts b/e2e/various-suite/trace-view-scrolling.spec.ts similarity index 78% rename from e2e/suite1/specs/trace-view-scrolling.spec.ts rename to e2e/various-suite/trace-view-scrolling.spec.ts index b7436dc6e6c..69a8bb191f8 100644 --- a/e2e/suite1/specs/trace-view-scrolling.spec.ts +++ b/e2e/various-suite/trace-view-scrolling.spec.ts @@ -11,15 +11,13 @@ describe('Trace view', () => { e2e.pages.Explore.visit(); - e2e.components.DataSourcePicker.inputV2().should('be.visible').click(); - - e2e().contains('gdev-jaeger').scrollIntoView().should('be.visible').click(); + e2e.components.DataSourcePicker.container().should('be.visible').type('gdev-jaeger{enter}'); e2e.components.QueryField.container().should('be.visible').type('long-trace'); e2e().wait(500); - e2e.components.RefreshPicker.runButton().should('be.visible').click(); + e2e.components.RefreshPicker.runButtonV2().should('be.visible').click(); e2e().wait('@longTrace'); diff --git a/e2e/various-suite/visualization-suggestions.spec.ts b/e2e/various-suite/visualization-suggestions.spec.ts new file mode 100644 index 00000000000..6de162cd24d --- /dev/null +++ b/e2e/various-suite/visualization-suggestions.spec.ts @@ -0,0 +1,29 @@ +import { e2e } from '@grafana/e2e'; + +e2e.scenario({ + describeName: 'Visualization suggestions', + itName: 'Should be shown and clickable', + addScenarioDataSource: false, + addScenarioDashBoard: false, + skipScenario: false, + scenario: () => { + e2e.flows.openDashboard({ uid: 'aBXrJ0R7z', queryParams: { editPanel: 9 } }); + + // Try visualization suggestions + e2e.components.PanelEditor.toggleVizPicker().click(); + e2e().contains('Suggestions').click(); + cy.wait(3000); + + // Verify we see suggestions + e2e.components.VisualizationPreview.card('Line chart').should('be.visible'); + + // Verify search works + e2e().get('[placeholder="Search for..."]').type('Table'); + // Should no longer see line chart + e2e.components.VisualizationPreview.card('Line chart').should('not.exist'); + + // Select a visualisation + e2e.components.VisualizationPreview.card('Table').click(); + e2e.components.Panels.Visualization.Table.header().should('be.visible'); + }, +}); diff --git a/e2e/verify-release b/e2e/verify-release index fb923d5d874..3e40a635741 100755 --- a/e2e/verify-release +++ b/e2e/verify-release @@ -2,4 +2,4 @@ . e2e/variables -SUITE=verify ./e2e/run-suite +./e2e/run-suite verify/specs diff --git a/emails/assets/css/style.css b/emails/assets/css/style.css index 83f8d2c67a6..065421a173d 100644 --- a/emails/assets/css/style.css +++ b/emails/assets/css/style.css @@ -91,7 +91,8 @@ margin-bottom: 25px; .footer { background-color: #2e2e2e; color: #999999; - margin-top: 20px; + margin: 0 auto; + width: 100%; } @media only screen and (max-width: 600px) { diff --git a/emails/templates/ng_alert_notification.html b/emails/templates/ng_alert_notification.html index d68c13e9b02..1f967e53353 100644 --- a/emails/templates/ng_alert_notification.html +++ b/emails/templates/ng_alert_notification.html @@ -1,25 +1,30 @@ [[Subject .Subject "[[.Title]]"]] [[ define "alert" ]] + + + Value: [[ .ValueString ]] + + [[ if gt (len .Annotations.SortedPairs) 0 ]] [[ range .Annotations.SortedPairs ]] -

[[ .Name ]]: [[ .Value ]]

+

[[ .Name ]]: [[ .Value ]]

[[ end ]] [[ end ]] - Labels: - + + Labels:
    [[ range .Labels.SortedPairs ]]
  • [[ .Name ]]: [[ .Value ]]
  • [[ end ]]
- + [[ if .SilenceURL ]] - + -[[ end ]] \ No newline at end of file +[[ end ]] diff --git a/go.mod b/go.mod index 2bf2fdb90f6..a6b10ddbae9 100644 --- a/go.mod +++ b/go.mod @@ -13,15 +13,13 @@ replace k8s.io/client-go => k8s.io/client-go v0.22.1 replace github.com/russellhaering/goxmldsig@v1.1.0 => github.com/russellhaering/goxmldsig v1.1.1 -// For now we are using a Grafana fork of alertmanager until the ability to bypass label name/key validation -// is merged into upstream (2021-10-01). -replace github.com/prometheus/alertmanager => github.com/grafana/alertmanager v0.21.1-0.20210929114340-613e5cc2a4ee - require ( cloud.google.com/go/storage v1.14.0 cuelang.org/go v0.4.0 + github.com/Azure/azure-sdk-for-go v57.1.0+incompatible github.com/Azure/azure-sdk-for-go/sdk/azcore v0.19.0 github.com/Azure/azure-sdk-for-go/sdk/azidentity v0.10.0 + github.com/Azure/go-autorest/autorest v0.11.20 github.com/BurntSushi/toml v0.3.1 github.com/Masterminds/semver v1.5.0 github.com/VividCortex/mysqlerr v0.0.0-20170204212430-6c6b55f8796f @@ -29,7 +27,7 @@ require ( github.com/beevik/etree v1.1.0 github.com/benbjohnson/clock v1.1.0 github.com/bradfitz/gomemcache v0.0.0-20190913173617-a41fca850d0b - github.com/centrifugal/centrifuge v0.18.4 + github.com/centrifugal/centrifuge v0.19.0 github.com/cortexproject/cortex v1.10.1-0.20211014125347-85c378182d0d github.com/crewjam/saml v0.4.6-0.20210521115923-29c6295245bd github.com/davecgh/go-spew v1.1.1 @@ -39,7 +37,6 @@ require ( github.com/gchaincl/sqlhooks v1.3.0 github.com/getsentry/sentry-go v0.10.0 github.com/go-kit/kit v0.11.0 - github.com/go-macaron/binding v0.0.0-20190806013118-0b4f37bab25b github.com/go-openapi/strfmt v0.20.2 github.com/go-redis/redis/v8 v8.11.4 github.com/go-sourcemap/sourcemap v2.1.3+incompatible @@ -55,19 +52,19 @@ require ( github.com/google/wire v0.5.0 github.com/gorilla/websocket v1.4.2 github.com/gosimple/slug v1.9.0 - github.com/grafana/cuetsy v0.0.0-20210928021233-5ddfb47f9a7d + github.com/grafana/cuetsy v0.0.0-20211119211437-8c25464cc9bf github.com/grafana/grafana-aws-sdk v0.7.0 - github.com/grafana/grafana-plugin-sdk-go v0.114.0 + github.com/grafana/grafana-plugin-sdk-go v0.121.0 github.com/grafana/loki v1.6.2-0.20211015002020-7832783b1caa github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 github.com/hashicorp/go-hclog v0.16.1 - github.com/hashicorp/go-plugin v1.4.2 + github.com/hashicorp/go-plugin v1.4.3 github.com/hashicorp/go-version v1.3.0 github.com/inconshreveable/log15 v0.0.0-20180818164646-67afb5ed74ec github.com/influxdata/influxdb-client-go/v2 v2.3.1-0.20210518120617-5d1fff431040 github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 github.com/jmespath/go-jmespath v0.4.0 - github.com/json-iterator/go v1.1.11 + github.com/json-iterator/go v1.1.12 github.com/jung-kurt/gofpdf v1.16.2 github.com/laher/mergefs v0.1.1 github.com/lib/pq v1.10.0 @@ -78,36 +75,35 @@ require ( github.com/mattn/go-sqlite3 v1.14.7 github.com/matttproud/golang_protobuf_extensions v1.0.2-0.20181231171920-c182affec369 github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f + github.com/ohler55/ojg v1.12.9 github.com/opentracing/opentracing-go v1.2.0 github.com/patrickmn/go-cache v2.1.0+incompatible github.com/pkg/browser v0.0.0-20210904010418-6d279e18f982 // indirect github.com/pkg/errors v0.9.1 - github.com/prometheus/alertmanager v0.23.1-0.20210914172521-e35efbddb66a + github.com/prometheus/alertmanager v0.23.1-0.20211116083607-e2a10119aaf7 github.com/prometheus/client_golang v1.11.0 github.com/prometheus/client_model v0.2.0 - github.com/prometheus/common v0.31.1 + github.com/prometheus/common v0.32.1 github.com/prometheus/prometheus v1.8.2-0.20211011171444-354d8d2ecfac github.com/robfig/cron v0.0.0-20180505203441-b41be1df6967 github.com/robfig/cron/v3 v3.0.1 github.com/russellhaering/goxmldsig v1.1.1 - github.com/smartystreets/goconvey v1.6.4 - github.com/spyzhov/ajson v0.4.2 github.com/stretchr/testify v1.7.0 github.com/teris-io/shortid v0.0.0-20171029131806-771a37caa5cf - github.com/timberio/go-datemath v0.1.1-0.20200323150745-74ddef604fff - github.com/ua-parser/uap-go v0.0.0-20190826212731-daf92ba38329 + github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f github.com/uber/jaeger-client-go v2.29.1+incompatible github.com/unknwon/com v1.0.1 github.com/urfave/cli/v2 v2.3.0 + github.com/vectordotdev/go-datemath v0.1.1-0.20211214152759-c03a58217724 github.com/weaveworks/common v0.0.0-20210913144402-035033b78a78 github.com/xorcare/pointer v1.1.0 github.com/yudai/gojsondiff v1.0.0 go.opentelemetry.io/collector v0.31.0 go.opentelemetry.io/collector/model v0.31.0 - go.opentelemetry.io/otel v1.0.0 + go.opentelemetry.io/otel v1.2.0 go.opentelemetry.io/otel/exporters/jaeger v1.0.0 go.opentelemetry.io/otel/sdk v1.0.0 - go.opentelemetry.io/otel/trace v1.0.0 + go.opentelemetry.io/otel/trace v1.2.0 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e golang.org/x/exp v0.0.0-20210220032938-85be41e4509f // indirect golang.org/x/net v0.0.0-20210903162142-ad29c8ab022f @@ -116,13 +112,12 @@ require ( golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac golang.org/x/tools v0.1.5 gonum.org/v1/gonum v0.9.1 - google.golang.org/api v0.57.0 - google.golang.org/grpc v1.40.0 + google.golang.org/api v0.58.0 + google.golang.org/grpc v1.41.0 google.golang.org/protobuf v1.27.1 gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect gopkg.in/ini.v1 v1.62.0 gopkg.in/ldap.v3 v3.1.0 - gopkg.in/macaron.v1 v1.4.0 gopkg.in/mail.v2 v2.3.1 gopkg.in/square/go-jose.v2 v2.5.1 gopkg.in/yaml.v2 v2.4.0 @@ -133,22 +128,28 @@ require ( ) require ( - cloud.google.com/go v0.94.1 // indirect + cloud.google.com/go v0.97.0 // indirect github.com/Azure/azure-sdk-for-go/sdk/internal v0.7.0 // indirect + github.com/Azure/go-autorest v14.2.0+incompatible // indirect + github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect + github.com/Azure/go-autorest/autorest/to v0.4.0 // indirect + github.com/Azure/go-autorest/autorest/validation v0.3.1 // indirect + github.com/Azure/go-autorest/logger v0.2.1 // indirect + github.com/Azure/go-autorest/tracing v0.6.0 // indirect github.com/FZambia/eagle v0.0.1 // indirect github.com/FZambia/sentinel v1.1.0 // indirect github.com/PuerkitoBio/purell v1.1.1 // indirect github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect github.com/alecthomas/units v0.0.0-20210912230133-d1bdfacee922 // indirect + github.com/andybalholm/brotli v1.0.3 github.com/apache/arrow/go/arrow v0.0.0-20210223225224-5bea62493d91 // indirect - github.com/armon/go-metrics v0.3.6 // indirect + github.com/armon/go-metrics v0.3.8 // indirect github.com/asaskevich/govalidator v0.0.0-20210307081110-f21760c49a8d // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/buger/jsonparser v1.1.1 // indirect github.com/c2h5oh/datasize v0.0.0-20200112174442-28bbd4740fee // indirect github.com/cenkalti/backoff/v4 v4.1.1 // indirect - github.com/centrifugal/protocol v0.7.3 // indirect - github.com/cespare/xxhash v1.1.0 // indirect + github.com/centrifugal/protocol v0.7.6 // indirect github.com/cespare/xxhash/v2 v2.1.2 // indirect github.com/cheekybits/genny v1.0.0 // indirect github.com/cockroachdb/apd/v2 v2.0.2 // indirect @@ -162,7 +163,7 @@ require ( github.com/edsrzf/mmap-go v1.0.0 // indirect github.com/emicklei/proto v1.6.15 // indirect github.com/felixge/httpsnoop v1.0.2 // indirect - github.com/go-kit/log v0.1.0 // indirect + github.com/go-kit/log v0.1.0 github.com/go-logfmt/logfmt v0.5.1 // indirect github.com/go-openapi/analysis v0.20.1 // indirect github.com/go-openapi/errors v0.20.0 // indirect @@ -175,6 +176,7 @@ require ( github.com/go-openapi/validate v0.20.2 // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/status v1.1.0 // indirect + github.com/golang-jwt/jwt/v4 v4.0.0 // indirect github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b // indirect github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect @@ -182,10 +184,9 @@ require ( github.com/gomodule/redigo v2.0.0+incompatible // indirect github.com/google/btree v1.0.1 // indirect github.com/google/flatbuffers v2.0.0+incompatible // indirect - github.com/googleapis/gax-go/v2 v2.1.0 // indirect - github.com/gopherjs/gopherjs v0.0.0-20191106031601-ce3c9ade29de // indirect + github.com/googleapis/gax-go/v2 v2.1.1 github.com/gorilla/mux v1.8.0 // indirect - github.com/grafana/dskit v0.0.0-20211011144203-3a88ec0b675f // indirect + github.com/grafana/grafana-google-sdk-go v0.0.0-20211104130251-b190293eaf58 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect github.com/hashicorp/errwrap v1.0.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.0 // indirect @@ -194,14 +195,12 @@ require ( github.com/hashicorp/go-sockaddr v1.0.2 // indirect github.com/hashicorp/golang-lru v0.5.4 // indirect github.com/hashicorp/memberlist v0.2.4 // indirect - github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce // indirect - github.com/igm/sockjs-go/v3 v3.0.0 // indirect + github.com/hashicorp/yamux v0.0.0-20210826001029-26ff87cf9493 // indirect + github.com/igm/sockjs-go/v3 v3.0.1 // indirect github.com/jessevdk/go-flags v1.5.0 // indirect github.com/jonboulle/clockwork v0.2.2 // indirect github.com/josharian/intern v1.0.0 // indirect github.com/jpillora/backoff v1.0.0 // indirect - github.com/jtolds/gls v4.20.0+incompatible // indirect - github.com/klauspost/cpuid/v2 v2.0.5 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect github.com/mattetti/filebuffer v1.0.1 // indirect @@ -210,9 +209,9 @@ require ( github.com/miekg/dns v1.1.43 // indirect github.com/mitchellh/go-testing-interface v1.14.0 // indirect github.com/mitchellh/mapstructure v1.4.1 // indirect - github.com/mna/redisc v1.2.1 // indirect + github.com/mna/redisc v1.3.2 // indirect github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de // indirect github.com/oklog/run v1.1.0 // indirect github.com/oklog/ulid v1.3.1 // indirect @@ -221,7 +220,7 @@ require ( github.com/opentracing-contrib/go-stdlib v1.0.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/prometheus/common/sigv4 v0.1.0 // indirect - github.com/prometheus/exporter-toolkit v0.6.1 // indirect + github.com/prometheus/exporter-toolkit v0.7.0 // indirect github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 // indirect github.com/prometheus/procfs v0.6.0 // indirect github.com/protocolbuffers/txtpbfmt v0.0.0-20201118171849-f6a6b3f636fc // indirect @@ -229,14 +228,13 @@ require ( github.com/rs/cors v1.8.0 // indirect github.com/russross/blackfriday/v2 v2.0.1 // indirect github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect - github.com/segmentio/encoding v0.2.19 // indirect + github.com/segmentio/encoding v0.3.2 // indirect github.com/sercand/kuberesolver v2.4.0+incompatible // indirect github.com/sergi/go-diff v1.0.0 // indirect github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 // indirect github.com/shurcooL/sanitized_anchor_name v1.0.0 // indirect github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 // indirect github.com/sirupsen/logrus v1.8.1 // indirect - github.com/smartystreets/assertions v1.0.1 // indirect github.com/stretchr/objx v0.2.0 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/valyala/bytebufferpool v1.0.0 // indirect @@ -247,21 +245,30 @@ require ( go.uber.org/atomic v1.9.0 // indirect go.uber.org/goleak v1.1.10 // indirect golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 // indirect - golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365 // indirect + golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 // indirect golang.org/x/text v0.3.7 // indirect golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 // indirect google.golang.org/appengine v1.6.7 // indirect - google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6 // indirect + google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2 gopkg.in/asn1-ber.v1 v1.0.0-20181015200546-f715ec2f112d // indirect ) +require ( + cloud.google.com/go/kms v1.1.0 + github.com/Azure/go-autorest/autorest/adal v0.9.15 + github.com/grafana/dskit v0.0.0-20211011144203-3a88ec0b675f +) + +require ( + github.com/containerd/containerd v1.5.8 // indirect + github.com/imdario/mergo v0.3.12 // indirect + github.com/opencontainers/image-spec v1.0.2 // indirect + github.com/segmentio/asm v1.1.1 // indirect +) + // Use fork of crewjam/saml with fixes for some issues until changes get merged into upstream replace github.com/crewjam/saml => github.com/grafana/saml v0.0.0-20211007135653-aed1b2edd86b replace github.com/apache/thrift => github.com/apache/thrift v0.14.1 -replace gopkg.in/macaron.v1 => ./pkg/macaron - -replace github.com/go-macaron/binding => ./pkg/macaron/binding - -replace github.com/hashicorp/consul => github.com/hashicorp/consul v1.9.8 +replace github.com/hashicorp/consul => github.com/hashicorp/consul v1.10.2 diff --git a/go.sum b/go.sum index 1d9f5ec86b5..8ee7b4e3291 100644 --- a/go.sum +++ b/go.sum @@ -29,8 +29,9 @@ cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSU cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY= cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ= cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI= -cloud.google.com/go v0.94.1 h1:DwuSvDZ1pTYGbXo8yOJevCTr3BoBlE+OVkHAKiYQUXc= cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4= +cloud.google.com/go v0.97.0 h1:3DXvAyifywvq64LfkKaMOmkWPS1CikIQdMe2lY9vxU8= +cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc= cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o= cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE= cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc= @@ -44,6 +45,8 @@ cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7 cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk= cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/kms v1.0.0/go.mod h1:nhUehi+w7zht2XrUfvTRNpxrfayBHqP4lu2NSywui/0= +cloud.google.com/go/kms v1.1.0 h1:1yc4rLqCkVDS9Zvc7m+3mJ47kw0Uo5Q5+sMjcmUVUeM= +cloud.google.com/go/kms v1.1.0/go.mod h1:WdbppnCDMDpOvoYBMn1+gNmOeEoZYqAv+HeuKARGCXI= cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I= cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw= cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA= @@ -148,6 +151,7 @@ github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxB github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM= github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= github.com/Azure/go-autorest/autorest/to v0.3.1-0.20191028180845-3492b2aff503/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA= @@ -213,6 +217,7 @@ github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2 github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= github.com/Microsoft/hcsshim v0.8.18/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= +github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= @@ -221,7 +226,6 @@ github.com/NYTimes/gziphandler v1.1.1/go.mod h1:n/CVRwUEOgIxrgPvAQhUUr9oeUtvrhMo github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5/go.mod h1:lmUJ/7eu/Q8D7ML55dXQrVaamCz2vxCfdQBasLZfHKk= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/OneOfOne/xxhash v1.2.5/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= -github.com/OneOfOne/xxhash v1.2.6 h1:U68crOE3y3MPttCMQGywZOLrTeF5HHJ3/vDBCJn9/bA= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= @@ -265,6 +269,8 @@ github.com/alicebob/miniredis/v2 v2.14.3/go.mod h1:gquAfGbzn92jvtrSC69+6zZnwSODV github.com/aliyun/aliyun-oss-go-sdk v2.0.4+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= github.com/amir/raidman v0.0.0-20170415203553-1ccc43bfb9c9/go.mod h1:eliMa/PW+RDr2QLWRmLH1R1ZA4RInpmvOzDDXtaIZkc= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.3 h1:fpcw+r1N1h0Poc1F/pHbW40cUm/lMEQslZtCkBQ0UnM= +github.com/andybalholm/brotli v1.0.3/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/antonmedv/expr v1.8.9/go.mod h1:5qsM3oLGDND7sDmQGDXHkYfkjYMUX14qsgqmHhwGEk8= @@ -283,8 +289,9 @@ github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmV github.com/armon/go-metrics v0.0.0-20190430140413-ec5e00d3c878/go.mod h1:3AMJUQhVx52RsWOnlkpikZr01T/yAVN2gn0861vByNg= github.com/armon/go-metrics v0.3.0/go.mod h1:zXjbSimjXTd7vOpY8B0/2LpvNvDoXBuplAD+gJD3GYs= github.com/armon/go-metrics v0.3.3/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= -github.com/armon/go-metrics v0.3.6 h1:x/tmtOF9cDBoXH7XoAGOz2qqm1DknFD1590XmD/DUJ8= github.com/armon/go-metrics v0.3.6/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +github.com/armon/go-metrics v0.3.8 h1:oOxq3KPj0WhCuy50EhzwiyMyG2ovRQZpZLXQuOh2a/M= +github.com/armon/go-metrics v0.3.8/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= @@ -347,6 +354,7 @@ github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kB github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k= github.com/bitly/go-hostpool v0.1.0/go.mod h1:4gOCgp6+NZnVqlKyZ/iBZFTAJKembaVENUpMkpg42fw= github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= +github.com/bits-and-blooms/bitset v1.2.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= @@ -376,19 +384,23 @@ github.com/cactus/go-statsd-client/statsd v0.0.0-20191106001114-12b4e2b38748/go. github.com/caio/go-tdigest v2.3.0+incompatible/go.mod h1:sHQM/ubZStBUmF1WbB8FAm8q9GjDajLC5T7ydxE3JHI= github.com/casbin/casbin/v2 v2.1.2/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n9yuLkIJQ= github.com/casbin/casbin/v2 v2.31.6/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= +github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v1.0.0/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.0.0+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= +github.com/cenkalti/backoff/v4 v4.0.2/go.mod h1:eEew/i+1Q6OrCDZh3WiXYv3+nJwBASZ8Bog/87DQnVg= +github.com/cenkalti/backoff/v4 v4.1.0/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/cenkalti/backoff/v4 v4.1.1 h1:G2HAfAmvm/GcKan2oOQpBXOd2tT2G57ZnZGWa1PxPBQ= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/centrifugal/centrifuge v0.18.4 h1:BDSRblSQfYmNSydueaJHrJaLUVU5KVvzp+VW53ebYfE= -github.com/centrifugal/centrifuge v0.18.4/go.mod h1:t/PkawecPuBBOhyuNbrTQSCQutmEMrQiiuRkQ7c4w0Y= -github.com/centrifugal/protocol v0.7.3 h1:XEBDwfWuUWj0L/ZVKUsf0K8TKjsOTbtKIMq84+r5aTU= -github.com/centrifugal/protocol v0.7.3/go.mod h1:qoeBHrRCi5mJ5XZfrKHnedz9UWpYbDLXr8iZUO3pTtc= +github.com/centrifugal/centrifuge v0.19.0 h1:YHws0dRpgsBiI73tRl1wwaB13gzuaI1AM4IFcQQQqcw= +github.com/centrifugal/centrifuge v0.19.0/go.mod h1:O2elf8q3Qkie3z97wkqVqxB52pnOpPsfFUa7L88Lpy0= +github.com/centrifugal/protocol v0.7.6 h1:AfMwTZfwnFwZslIzQL4QtRnWSVO32RPSuk4iNS/V9tg= +github.com/centrifugal/protocol v0.7.6/go.mod h1:cJo0/BuXglhPfg0fgSgTXvBZ7y+9rdg4+nPbIDOVmlA= github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= +github.com/cespare/xxhash v0.0.0-20181017004759-096ff4a8a059/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= @@ -396,6 +408,7 @@ github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cbYE= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= +github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= github.com/chromedp/cdproto v0.0.0-20200116234248-4da64dd111ac/go.mod h1:PfAWWKJqjlGFYJEidUM6aVIWPr0EpobeyVWEEmplX7g= @@ -408,6 +421,7 @@ github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmE github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= +github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/cisco-ie/nx-telemetry-proto v0.0.0-20190531143454-82441e232cf6/go.mod h1:ugEfq4B8T8ciw/h5mCkgdiDRFS4CkqqhH2dymDB4knc= @@ -417,8 +431,9 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/udpa/go v0.0.0-20200313221541-5f7e5dd04533/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed h1:OZmjad4L3H8ncOIR8rnb5MREYqG8ixi5+WbeUsquF0c= github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158 h1:CevA8fI91PAnP8vpnXuB8ZYAZ5wqY86nAbxfgK8tWO4= +github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/cockroachdb/apd/v2 v2.0.1/go.mod h1:DDxRlzC2lo3/vSlmSoS7JkqbbrARPuFOGr0B9pvN3Gw= @@ -461,13 +476,15 @@ github.com/containerd/containerd v1.3.4/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMX github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= +github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.4 h1:uPF0og3ByFzDnaStfiQj3fVGTEtaSNyU+bW7GR/nqGA= github.com/containerd/containerd v1.5.4/go.mod h1:sx18RgvW6ABJ4iYUw7Q5x7bgFOAB9B6G7+yO0XBc4zw= +github.com/containerd/containerd v1.5.8 h1:NmkCC1/QxyZFBny8JogwLpOy2f+VEbO/f6bV2Mqtwuw= +github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= @@ -500,6 +517,7 @@ github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDG github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= +github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= @@ -701,8 +719,9 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= -github.com/envoyproxy/go-control-plane v0.9.9 h1:vQLjymTobffN2R0F8eTqw6q7iozfRO5Z0m+/4Vw+/uA= github.com/envoyproxy/go-control-plane v0.9.9/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021 h1:fP+fF0up6oPY49OrjPrhIJ8yQfdIM85NXMLkMg1EXVs= +github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v0.6.1 h1:4CF52PCseTFt4bE+Yk3dIpdVi7XWuPVMhPtm4FaIJPM= github.com/envoyproxy/protoc-gen-validate v0.6.1/go.mod h1:txg5va2Qkip90uYoSKH+nkAAmXrb2j3iq4FLwdrCbXQ= @@ -805,6 +824,7 @@ github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNI github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-openapi/analysis v0.0.0-20180825180245-b006789cd277/go.mod h1:k70tL6pCuVxPJOHXQ+wIac1FUrvNkHolPie/cLEU6hI= github.com/go-openapi/analysis v0.17.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= +github.com/go-openapi/analysis v0.17.2/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.18.0/go.mod h1:IowGgpVeD0vNm45So8nr+IcQ3pxVtpRoBWb8PVZO0ik= github.com/go-openapi/analysis v0.19.2/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= github.com/go-openapi/analysis v0.19.4/go.mod h1:3P1osvZa9jKjb8ed2TPng3f0i/UY9snX6gxi44djMjk= @@ -816,6 +836,7 @@ github.com/go-openapi/analysis v0.20.0/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxl github.com/go-openapi/analysis v0.20.1 h1:zdVbw8yoD4SWZeq+cWdGgquaB0W4VrsJvDJHJND/Ktc= github.com/go-openapi/analysis v0.20.1/go.mod h1:BMchjvaHDykmRMsK40iPtvyOfFdMMxlOmQr9FBZk+Og= github.com/go-openapi/errors v0.17.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= +github.com/go-openapi/errors v0.17.2/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.18.0/go.mod h1:LcZQpmvG4wyF5j4IhA73wkLFQg+QJXOQHVjmcZxhka0= github.com/go-openapi/errors v0.19.2/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= github.com/go-openapi/errors v0.19.3/go.mod h1:qX0BLWsyaKfvhluLejVpVNwNRdXZhEbTA4kxxpKBC94= @@ -828,6 +849,7 @@ github.com/go-openapi/errors v0.20.0 h1:Sxpo9PjEHDzhs3FbnGNonvDgWcMW2U7wGTcDDSFS github.com/go-openapi/errors v0.20.0/go.mod h1:cM//ZKUKyO06HSwqAelJ5NsEMMcpa6VpXe8DOa1Mi1M= github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= +github.com/go-openapi/jsonpointer v0.17.2/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.18.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M= github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= @@ -835,6 +857,7 @@ github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUe github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= +github.com/go-openapi/jsonreference v0.17.2/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.18.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I= github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= @@ -842,6 +865,7 @@ github.com/go-openapi/jsonreference v0.19.4/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE github.com/go-openapi/jsonreference v0.19.5 h1:1WJP/wi4OjB4iV8KVbH73rQaoialJrqv8gitZLxGLtM= github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= github.com/go-openapi/loads v0.17.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= +github.com/go-openapi/loads v0.17.2/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.18.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.0/go.mod h1:72tmFy5wsWx89uEVddd0RjRWPZm92WRLhf7AC+0+OOU= github.com/go-openapi/loads v0.19.2/go.mod h1:QAskZPMX5V0C2gvfkGZzJlINuP7Hx/4+ix5jWFxsNPs= @@ -854,17 +878,20 @@ github.com/go-openapi/loads v0.20.0/go.mod h1:2LhKquiE513rN5xC6Aan6lYOSddlL8Mp20 github.com/go-openapi/loads v0.20.2 h1:z5p5Xf5wujMxS1y8aP+vxwW5qYT2zdJBbXKmQUG3lcc= github.com/go-openapi/loads v0.20.2/go.mod h1:hTVUotJ+UonAMMZsvakEgmWKgtulweO9vYP2bQYKA/o= github.com/go-openapi/runtime v0.0.0-20180920151709-4f900dc2ade9/go.mod h1:6v9a6LTXWQCdL8k1AO3cvqx5OtZY/Y9wKTgaoP6YRfA= +github.com/go-openapi/runtime v0.18.0/go.mod h1:uI6pHuxWYTy94zZxgcwJkUWa9wbIlhteGfloI10GD4U= github.com/go-openapi/runtime v0.19.0/go.mod h1:OwNfisksmmaZse4+gpV3Ne9AyMOlP1lt4sK4FXt0O64= github.com/go-openapi/runtime v0.19.3/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.19.4/go.mod h1:X277bwSUBxVlCYR3r7xgZZGKVvBd/29gLDlFGtJ8NL4= github.com/go-openapi/runtime v0.19.15/go.mod h1:dhGWCTKRXlAfGnQG0ONViOZpjfg0m2gUt9nTQPQZuoo= github.com/go-openapi/runtime v0.19.16/go.mod h1:5P9104EJgYcizotuXhEuUrzVc+j1RiSjahULvYmlv98= github.com/go-openapi/runtime v0.19.24/go.mod h1:Lm9YGCeecBnUUkFTxPC4s1+lwrkJ0pthx8YvyjCfkgk= +github.com/go-openapi/runtime v0.19.26/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= github.com/go-openapi/runtime v0.19.28/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= github.com/go-openapi/runtime v0.19.29 h1:5IIvCaIDbxetN674vX9eOxvoZ9mYGQ16fV1Q0VSG+NA= github.com/go-openapi/runtime v0.19.29/go.mod h1:BvrQtn6iVb2QmiVXRsFAm6ZCAZBpbVKFfN6QWCp582M= github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= github.com/go-openapi/spec v0.17.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= +github.com/go-openapi/spec v0.17.2/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.18.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI= github.com/go-openapi/spec v0.19.2/go.mod h1:sCxk3jxKgioEJikev4fgkNmwS+3kuYdJtcsZsD5zxMY= github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= @@ -878,6 +905,7 @@ github.com/go-openapi/spec v0.20.1/go.mod h1:93x7oh+d+FQsmsieroS4cmR3u0p/ywH649a github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ= github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg= github.com/go-openapi/strfmt v0.17.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= +github.com/go-openapi/strfmt v0.17.2/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.18.0/go.mod h1:P82hnJI0CXkErkXi8IKjPbNBM6lV6+5pLP5l494TcyU= github.com/go-openapi/strfmt v0.19.0/go.mod h1:+uW+93UVvGGq2qGaZxdDeJqSAqBqBdl+ZPMF/cC8nDY= github.com/go-openapi/strfmt v0.19.2/go.mod h1:0yX7dbo8mKIvc3XSKp7MNfxw4JytCfCD6+bY1AVL9LU= @@ -891,6 +919,7 @@ github.com/go-openapi/strfmt v0.20.2 h1:6XZL+fF4VZYFxKQGLAUB358hOrRh/wS51uWEtlON github.com/go-openapi/strfmt v0.20.2/go.mod h1:43urheQI9dNtE5lTZQfuFJvjYJKPrxicATpEfZwHUNk= github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= +github.com/go-openapi/swag v0.17.2/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.18.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg= github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.4/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= @@ -903,6 +932,7 @@ github.com/go-openapi/swag v0.19.13/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/ github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= +github.com/go-openapi/validate v0.17.2/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.18.0/go.mod h1:Uh4HdOzKt19xGIGm1qHf/ofbX1YQ4Y+MYsct2VUrAJ4= github.com/go-openapi/validate v0.19.2/go.mod h1:1tRCw7m3jtI8eNWEEliiAqUIcBztB2KDnRCRMUi7GTA= github.com/go-openapi/validate v0.19.3/go.mod h1:90Vh6jjkTn+OT1Eefm0ZixWNFjhtOH7vS9k0lo6zwJo= @@ -1133,6 +1163,7 @@ github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm4 github.com/google/subcommands v1.0.1/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= github.com/google/tcpproxy v0.0.0-20180808230851-dfa16c61dad2/go.mod h1:DavVbd41y+b7ukKDmlnPR4nGYmkWXR6vHUkjQNiHPBs= github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/google/uuid v1.1.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -1144,8 +1175,9 @@ github.com/googleapis/gax-go v2.0.2+incompatible h1:silFMLAnr330+NRuag/VjIGF7TLp github.com/googleapis/gax-go v2.0.2+incompatible/go.mod h1:SFVmujtThgffbyetf+mdk2eWhX2bMyUtNHzFKcPA9HY= github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk= -github.com/googleapis/gax-go/v2 v2.1.0 h1:6DWmvNpomjL1+3liNSZbVns3zsYzzCjm6pRBO1tLeso= github.com/googleapis/gax-go/v2 v2.1.0/go.mod h1:Q3nei7sK6ybPYH7twZdmQpAd1MKb7pfu6SK+H1/DsU0= +github.com/googleapis/gax-go/v2 v2.1.1 h1:dp3bWCh+PPO1zjRRiCSczJav13sBvG4UhNyVTa1KqdU= +github.com/googleapis/gax-go/v2 v2.1.1/go.mod h1:hddJymUZASv3XPyGkUpKj8pPO47Rmb0eJc8R6ouapiM= github.com/googleapis/gnostic v0.0.0-20170426233943-68f4ded48ba9/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= github.com/googleapis/gnostic v0.1.0/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= @@ -1194,19 +1226,20 @@ github.com/gorilla/websocket v1.4.2 h1:+/TMaTYc4QFitKJxsQ7Yye35DkWvkdLcvGKqM+x0U github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gosimple/slug v1.9.0 h1:r5vDcYrFz9BmfIAMC829un9hq7hKM4cHUrsv36LbEqs= github.com/gosimple/slug v1.9.0/go.mod h1:AMZ+sOVe65uByN3kgEyf9WEBKBCSS+dJjMX9x4vDJbg= -github.com/grafana/alertmanager v0.21.1-0.20210929114340-613e5cc2a4ee h1:iGtJW4VSG/YF6y2rQICOeLjv6qJZsul8CbqS/6KPKLA= -github.com/grafana/alertmanager v0.21.1-0.20210929114340-613e5cc2a4ee/go.mod h1:U7pGu+z7A9ZKhK8lq1MvIOp5GdVlZjwOYk+S0h3LSbA= -github.com/grafana/cuetsy v0.0.0-20210928021233-5ddfb47f9a7d h1:vYCNM25g5aEactkMiILJvm2jW2BVGYB1QzLx7lAhMLw= -github.com/grafana/cuetsy v0.0.0-20210928021233-5ddfb47f9a7d/go.mod h1:H9Ei+Q808FCWyeEzpaW5GMfBvXCuFOfQa4x/vzKY+Fg= +github.com/grafana/cuetsy v0.0.0-20211119211437-8c25464cc9bf h1:RY69RBqlr3yWNgpAqrSRiUvqa/Jw6uqVqiHNHLzifhU= +github.com/grafana/cuetsy v0.0.0-20211119211437-8c25464cc9bf/go.mod h1:H9Ei+Q808FCWyeEzpaW5GMfBvXCuFOfQa4x/vzKY+Fg= github.com/grafana/dskit v0.0.0-20211011144203-3a88ec0b675f h1:FvvSVEbnGeM2bUivGmsiXTi8URJyBU7TcFEEoRe5wWI= github.com/grafana/dskit v0.0.0-20211011144203-3a88ec0b675f/go.mod h1:uPG2nyK4CtgNDmWv7qyzYcdI+S90kHHRWvHnBtEMBXM= github.com/grafana/go-mssqldb v0.0.0-20210326084033-d0ce3c521036 h1:GplhUk6Xes5JIhUUrggPcPBhOn+eT8+WsHiebvq7GgA= github.com/grafana/go-mssqldb v0.0.0-20210326084033-d0ce3c521036/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/grafana/grafana-aws-sdk v0.7.0 h1:D+Lhxi3P/7vpyDHUK/fdX9bL2mRz8hLG04ucNf1E02o= github.com/grafana/grafana-aws-sdk v0.7.0/go.mod h1:+pPo5U+pX0zWimR7YBc7ASeSQfbRkcTyQYqMiAj7G5U= +github.com/grafana/grafana-google-sdk-go v0.0.0-20211104130251-b190293eaf58 h1:2ud7NNM7LrGPO4x0NFR8qLq68CqI4SmB7I2yRN2w9oE= +github.com/grafana/grafana-google-sdk-go v0.0.0-20211104130251-b190293eaf58/go.mod h1:Vo2TKWfDVmNTELBUM+3lkrZvFtBws0qSZdXhQxRdJrE= github.com/grafana/grafana-plugin-sdk-go v0.79.0/go.mod h1:NvxLzGkVhnoBKwzkst6CFfpMFKwAdIUZ1q8ssuLeF60= -github.com/grafana/grafana-plugin-sdk-go v0.114.0 h1:9I55IXw7mOT71tZ/pdqCaWGz8vxfz31CXjaDtBV9ZBo= github.com/grafana/grafana-plugin-sdk-go v0.114.0/go.mod h1:D7x3ah+1d4phNXpbnOaxa/osSaZlwh9/ZUnGGzegRbk= +github.com/grafana/grafana-plugin-sdk-go v0.121.0 h1:4+dXoezL9L40iu7ym4u7ZJ4OE57NaVc4WSHlbxtCtGM= +github.com/grafana/grafana-plugin-sdk-go v0.121.0/go.mod h1:Mhy+5mC6rSqEhnzop1wEh//n/fgkzNK5pRgg3DfCp4g= github.com/grafana/loki v1.6.2-0.20211015002020-7832783b1caa h1:+pXjAxavVR2FKKNsuuCXGCWEj8XGc1Af6SPiyBpzU2A= github.com/grafana/loki v1.6.2-0.20211015002020-7832783b1caa/go.mod h1:0O8o/juxNSKN/e+DzWDTRkl7Zm8CkZcz0NDqEdojlrk= github.com/grafana/saml v0.0.0-20211007135653-aed1b2edd86b h1:YiSGp34F4V0G08HHx1cJBf2GVgwYAkXQjzuVs1t8jYk= @@ -1237,8 +1270,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/harlow/kinesis-consumer v0.3.1-0.20181230152818-2f58b136fee0/go.mod h1:dk23l2BruuUzRP8wbybQbPn3J7sZga2QHICCeaEy5rQ= -github.com/hashicorp/consul v1.9.8 h1:8F6xy+Z6SDXPWHiAOMHJpjSmAnTvNWqgMkVC34D3V34= -github.com/hashicorp/consul v1.9.8/go.mod h1:f46H8b+DWANZCGCfNSTicy/qIlJ0DHYO6FacE6bQlzM= +github.com/hashicorp/consul v1.10.2 h1:9YX5SX3hMifrXIt9wqN2jJsMnESSHfxEjW5N7qMAdjo= +github.com/hashicorp/consul v1.10.2/go.mod h1:EJMYpT39ZL2BnxjGRNTjfTH3s9893yd/DCX60PUnGUY= github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= github.com/hashicorp/consul/api v1.3.0/go.mod h1:MmDNSzIMUjNpY/mQ398R4bk2FnqQLoPndWW5VkKPlCE= github.com/hashicorp/consul/api v1.4.0/go.mod h1:xc8u05kyMa3Wjr9eEAsIAo3dg8+LywT5E/Cl7cNS5nU= @@ -1247,6 +1280,7 @@ github.com/hashicorp/consul/api v1.6.0/go.mod h1:1NSuaUUkFaJzMasbfq/11wKYWSR67Xn github.com/hashicorp/consul/api v1.7.0/go.mod h1:1NSuaUUkFaJzMasbfq/11wKYWSR67Xn6r2DXKhuDNFg= github.com/hashicorp/consul/api v1.8.1/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= github.com/hashicorp/consul/api v1.9.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= +github.com/hashicorp/consul/api v1.10.0/go.mod h1:sDjTOq0yUyv5G4h+BqSea7Fn6BU+XbolEz1952UB+mk= github.com/hashicorp/consul/api v1.10.1 h1:MwZJp86nlnL+6+W1Zly4JUuVn9YHhMggBirMpHGD7kw= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= @@ -1281,7 +1315,7 @@ github.com/hashicorp/go-immutable-radix v1.2.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjh github.com/hashicorp/go-immutable-radix v1.3.0 h1:8exGP7ego3OmkfksihtSouGMZ+hQrhxx+FVELeXpVPE= github.com/hashicorp/go-immutable-radix v1.3.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-kms-wrapping/entropy v0.1.0/go.mod h1:d1g9WGtAunDNpek8jUIEJnBlbgKS1N2Q61QkHiZyR1g= -github.com/hashicorp/go-memdb v1.3.0/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= +github.com/hashicorp/go-memdb v1.3.1/go.mod h1:Mluclgwib3R93Hk5fxEfiRhB+6Dar64wWh71LpNSe3g= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-msgpack v0.5.5 h1:i9R9JSrqIz0QVLz3sz+i3YJdT7TTSLcfLLzJi9aZTuI= github.com/hashicorp/go-msgpack v0.5.5/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= @@ -1291,8 +1325,9 @@ github.com/hashicorp/go-multierror v1.1.0 h1:B9UzwGQJehnUY1yNrnwREHc3fGbC2xefo8g github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= github.com/hashicorp/go-plugin v1.0.1/go.mod h1:++UyYGoz3o5w9ZzAdZxtQKrWWP+iqPBn3cQptSMzBuY= github.com/hashicorp/go-plugin v1.2.2/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYtXdgmf1AVNs0= -github.com/hashicorp/go-plugin v1.4.2 h1:yFvG3ufXXpqiMiZx9HLcaK3XbIqQ1WJFR/F1a2CuVw0= github.com/hashicorp/go-plugin v1.4.2/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= +github.com/hashicorp/go-plugin v1.4.3 h1:DXmvivbWD5qdiBts9TpBC7BYL1Aia5sxbRgQB+v6UZM= +github.com/hashicorp/go-plugin v1.4.3/go.mod h1:5fGEH17QVwTTcR0zV7yhDPLLmFX9YSZ38b18Udy6vYQ= github.com/hashicorp/go-raftchunking v0.6.1/go.mod h1:cGlg3JtDy7qy6c/3Bu660Mic1JF+7lWqIwCFSb08fX0= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.5.4/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= @@ -1339,6 +1374,7 @@ github.com/hashicorp/memberlist v0.2.4/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOn github.com/hashicorp/net-rpc-msgpackrpc v0.0.0-20151116020338-a14192a58a69/go.mod h1:/z+jUGRBlwVpUZfjute9jWaF6/HuhjuFQuL1YXzVD1Q= github.com/hashicorp/raft v1.1.1/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= github.com/hashicorp/raft v1.2.0/go.mod h1:vPAJM8Asw6u8LxC3eJCUZmRP/E4QmUGE1R7g7k8sG/8= +github.com/hashicorp/raft v1.3.1/go.mod h1:4Ak7FSPnuvmb0GV6vgIAJ4vYT4bek9bb6Q+7HVbyzqM= github.com/hashicorp/raft-autopilot v0.1.5/go.mod h1:Af4jZBwaNOI+tXfIqIdbcAnh/UyyqIMj/pOISIfhArw= github.com/hashicorp/raft-boltdb v0.0.0-20171010151810-6e5ba93211ea/go.mod h1:pNv7Wc3ycL6F5oOWn+tPGo2gWD4a5X+yp/ntwdKLjRk= github.com/hashicorp/serf v0.8.1/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE= @@ -1357,8 +1393,8 @@ github.com/hashicorp/vic v1.5.1-0.20190403131502-bbfe86ec9443/go.mod h1:bEpDU35n github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hashicorp/yamux v0.0.0-20190923154419-df201c70410d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= -github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce h1:7UnVY3T/ZnHUrfviiAgIUjg2PXxsQfs5bphsG8F7Keo= -github.com/hashicorp/yamux v0.0.0-20200609203250-aecfd211c9ce/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= +github.com/hashicorp/yamux v0.0.0-20210826001029-26ff87cf9493 h1:brI5vBRUlAlM34VFmnLPwjnCL/FxAJp9XvOdX6Zt+XE= +github.com/hashicorp/yamux v0.0.0-20210826001029-26ff87cf9493/go.mod h1:CtWFDAQgb7dxtzFs4tWbplKIe2jSi3+5vKbgIO0SLnQ= github.com/hetznercloud/hcloud-go v1.21.1/go.mod h1:xng8lbDUg+xM1dgc0yGHX5EeqbwIq7UYlMWMTx3SQVg= github.com/hetznercloud/hcloud-go v1.22.0/go.mod h1:xng8lbDUg+xM1dgc0yGHX5EeqbwIq7UYlMWMTx3SQVg= github.com/hetznercloud/hcloud-go v1.23.1/go.mod h1:xng8lbDUg+xM1dgc0yGHX5EeqbwIq7UYlMWMTx3SQVg= @@ -1375,15 +1411,16 @@ github.com/hudl/fargo v1.3.0/go.mod h1:y3CKSmjA+wD2gak7sUSXTAoopbhU08POFhmITJgmK github.com/iancoleman/strcase v0.0.0-20180726023541-3605ed457bf7/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/igm/sockjs-go/v3 v3.0.0 h1:4wLoB9WCnQ8RI87cmqUH778ACDFVmRpkKRCWBeuc+Ww= -github.com/igm/sockjs-go/v3 v3.0.0/go.mod h1:UqchsOjeagIBFHvd+RZpLaVRbCwGilEC08EDHsD1jYE= +github.com/igm/sockjs-go/v3 v3.0.1 h1:rmgEkeKqBHCFf7uIAipYrYSX8x9LBB2nOxAac2sooak= +github.com/igm/sockjs-go/v3 v3.0.1/go.mod h1:UqchsOjeagIBFHvd+RZpLaVRbCwGilEC08EDHsD1jYE= github.com/imdario/mergo v0.3.4/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.6/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.11 h1:3tnifQM4i+fbajXKBHXWEH+KvNHqojZ778UH75j3bGA= github.com/imdario/mergo v0.3.11/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= +github.com/imdario/mergo v0.3.12 h1:b6R2BslTbIEToALKP7LxUvijTsNI9TAe80pLWN2g/HU= +github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/imkira/go-interpol v1.1.0/go.mod h1:z0h2/2T3XF8kyEPpRgJ3kmNv+C43p+I/CoI+jC3w2iA= github.com/inconshreveable/log15 v0.0.0-20180818164646-67afb5ed74ec h1:CGkYB1Q7DSsH/ku+to+foV4agt2F2miquaLUgF6L178= github.com/inconshreveable/log15 v0.0.0-20180818164646-67afb5ed74ec/go.mod h1:cOaXtrgN4ScfRrD9Bre7U1thNq5RtJ8ZoP4iXVGRj6o= @@ -1444,6 +1481,7 @@ github.com/jcmturner/gofork v1.0.0/go.mod h1:MK8+TM0La+2rjBD4jE12Kj1pCCxK7d2LK/U github.com/jcmturner/goidentity/v6 v6.0.1/go.mod h1:X1YW3bgtvwAXju7V3LCIMpY0Gbxyjn/mY9zx4tFonSg= github.com/jcmturner/gokrb5/v8 v8.4.2/go.mod h1:sb+Xq/fTY5yktf/VxLsE3wlfPqQjp0aWNYyvBVK62bc= github.com/jcmturner/rpc/v2 v2.0.3/go.mod h1:VUJYCIDm3PVOEHw8sgt091/20OJjskO/YJki3ELg/Hc= +github.com/jessevdk/go-flags v0.0.0-20180331124232-1c38ed7ad0cc/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0 h1:1jKYvbxEjfUl0fmqTCOfonvskHHXMjBySTLW4y9LFvc= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= @@ -1481,8 +1519,9 @@ github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/u github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= -github.com/json-iterator/go v1.1.11 h1:uVUAXhF2To8cbw/3xN3pxj6kk7TYKs98NIrTqPlMWAQ= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= @@ -1526,10 +1565,8 @@ github.com/klauspost/compress v1.13.1/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8 github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.1/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= -github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= -github.com/klauspost/cpuid/v2 v2.0.5 h1:qnfhwbFriwDIX51QncuNU5mEMf+6KE3t7O8V2KQl3Dg= -github.com/klauspost/cpuid/v2 v2.0.5/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= @@ -1554,6 +1591,7 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kshvakov/clickhouse v1.3.5/go.mod h1:DMzX7FxRymoNkVgizH0DWAL8Cur7wHLgx3MUnGwJqpE= github.com/kubernetes/apimachinery v0.0.0-20190119020841-d41becfba9ee/go.mod h1:Pe/YBTPc3vqoMkbuIWPH8CF9ehINdvNyS0dP3J6HC0s= +github.com/kylelemons/godebug v0.0.0-20160406211939-eadb3ce320cb/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= @@ -1717,6 +1755,7 @@ github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RR github.com/mitchellh/mapstructure v1.3.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.3.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.4.1-0.20210112042008-8ebf2d61a8b4/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.4.1 h1:CpVNEelQCZBooIPDn+AR3NpivK/TIKU8bDxdASFVQag= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= @@ -1726,8 +1765,8 @@ github.com/mitchellh/reflectwalk v1.0.1/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/mjibson/esc v0.2.0/go.mod h1:9Hw9gxxfHulMF5OJKCyhYD7PzlSdhzXyaGEBRPH1OPs= -github.com/mna/redisc v1.2.1 h1:7rI/qv2sa0OT8rsxDbKg7XPysr5AIDeXwL0T0vFOvlM= -github.com/mna/redisc v1.2.1/go.mod h1:OxLEDNNDFOYJBo7MuSC+SEoP3k8bZY2dFW7T12TzX4c= +github.com/mna/redisc v1.3.2 h1:sc9C+nj6qmrTFnsXb70xkjAHpXKtjjBuE6v2UcQV0ZE= +github.com/mna/redisc v1.3.2/go.mod h1:CplIoaSTDi5h9icnj4FLbRgHoNKCHDNJDVRztWDGeSQ= github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= github.com/moby/spdystream v0.2.0/go.mod h1:f7i0iNDQJ059oMTcWxx8MA/zKFIuD/lY+0GqbN2Wy8c= github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= @@ -1740,8 +1779,9 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8= github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/morikuni/aec v0.0.0-20170113033406-39771216ff4c/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= @@ -1788,10 +1828,13 @@ github.com/nsqio/go-nsq v1.0.7/go.mod h1:XP5zaUs3pqf+Q71EqUJs3HYfBIqfK6G83WQMdNN github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/ohler55/ojg v1.12.9 h1:HIHORjvA/i2IyDGgf9zzkFZc0yhEZIi3Tte+m+XBzTs= +github.com/ohler55/ojg v1.12.9/go.mod h1:LBbIVRAgoFbYBXQhRhuEpaJIqq+goSO63/FQ+nyJU88= github.com/oklog/oklog v0.3.2/go.mod h1:FCV+B7mhrz4o+ueLpx+KqkyXRGMWOYEvfiXtdGtbWGs= github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA= github.com/oklog/run v1.1.0 h1:GEenZ1cK0+q0+wsJew9qUg/DyD8k3JzYsZAi5gYi2mA= github.com/oklog/run v1.1.0/go.mod h1:sVPdnTZT1zYwAJeCMu2Th4T21pA3FPOQRfWjQlk7DVU= +github.com/oklog/ulid v0.0.0-20170117200651-66bb6560562f/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= github.com/olekukonko/tablewriter v0.0.0-20170122224234-a0225b3f23b5/go.mod h1:vsDQFd/mU46D+Z4whnwzcISnGGzXWMclvtLoiIKAKIo= @@ -1838,21 +1881,25 @@ github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go. github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.1 h1:JMemWkRwHx4Zj+fVxWoMCFm/8sYGGrUVojFA6h/TRcI= github.com/opencontainers/image-spec v1.0.1/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= +github.com/opencontainers/image-spec v1.0.2 h1:9yCKha/T5XdGtO0q9Q9a6T5NUCsTn/DrBg0D7ufOcFM= +github.com/opencontainers/image-spec v1.0.2/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= +github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= +github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= +github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= github.com/opentracing-contrib/go-grpc v0.0.0-20180928155321-4b5a12d3ff02/go.mod h1:JNdpVEzCpXBgIiv4ds+TzhN1hrtxq6ClLrTlT9OQRSc= github.com/opentracing-contrib/go-grpc v0.0.0-20191001143057-db30781987df/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= @@ -1923,6 +1970,19 @@ github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSg github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.0.0-20180517163645-1555304b9b35/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= +github.com/prometheus/alertmanager v0.18.0/go.mod h1:WcxHBl40VSPuOaqWae6l6HpnEOVRIycEJ7i9iYkadEE= +github.com/prometheus/alertmanager v0.19.0/go.mod h1:Eyp94Yi/T+kdeb2qvq66E3RGuph5T/jm/RBVh4yz1xo= +github.com/prometheus/alertmanager v0.20.0/go.mod h1:9g2i48FAyZW6BtbsnvHtMHQXl2aVtrORKwKVCQ+nbrg= +github.com/prometheus/alertmanager v0.21.0/go.mod h1:h7tJ81NA0VLWvWEayi1QltevFkLF3KxmC/malTcT8Go= +github.com/prometheus/alertmanager v0.21.1-0.20200911160112-1fdff6b3f939/go.mod h1:imXRHOP6QTsE0fFsIsAV/cXimS32m7gVZOiUj11m6Ig= +github.com/prometheus/alertmanager v0.21.1-0.20201106142418-c39b78780054/go.mod h1:imXRHOP6QTsE0fFsIsAV/cXimS32m7gVZOiUj11m6Ig= +github.com/prometheus/alertmanager v0.21.1-0.20210310093010-0f9cab6991e6/go.mod h1:MTqVn+vIupE0dzdgo+sMcNCp37SCAi8vPrvKTTnTz9g= +github.com/prometheus/alertmanager v0.21.1-0.20210422101724-8176f78a70e1/go.mod h1:gsEqwD5BHHW9RNKvCuPOrrTMiP5I+faJUyLXvnivHik= +github.com/prometheus/alertmanager v0.22.2/go.mod h1:rYinOWxFuCnNssc3iOjn2oMTlhLaPcUuqV5yk5JKUAE= +github.com/prometheus/alertmanager v0.23.0/go.mod h1:0MLTrjQI8EuVmvykEhcfr/7X0xmaDAZrqMgxIq3OXHk= +github.com/prometheus/alertmanager v0.23.1-0.20210914172521-e35efbddb66a/go.mod h1:U7pGu+z7A9ZKhK8lq1MvIOp5GdVlZjwOYk+S0h3LSbA= +github.com/prometheus/alertmanager v0.23.1-0.20211116083607-e2a10119aaf7 h1:OMwDo53awRp+UzaBrwmVC7HJiAMYP/niBJfKcGpPiac= +github.com/prometheus/alertmanager v0.23.1-0.20211116083607-e2a10119aaf7/go.mod h1:1UH4XA4DAXzsvofKVzcXmC0mqt6Y8BZP9JcQWKDmbFc= github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.8.0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= @@ -1966,22 +2026,27 @@ github.com/prometheus/common v0.8.0/go.mod h1:PC/OgXc+UN7B4ALwvn1yzVZmVwvhXp5Jsb github.com/prometheus/common v0.9.1/go.mod h1:yhUN8i9wzaXS3w1O07YhxHEBxD+W35wd8bs7vj7HSQ4= github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.11.1/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.12.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.14.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.15.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.18.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.20.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= +github.com/prometheus/common v0.21.0/go.mod h1:U+gB1OBLb1lF3O42bTCL+FK18tX9Oar16Clt/msog/s= github.com/prometheus/common v0.23.0/go.mod h1:H6QK/N6XVT42whUeIdI3dp36w49c+/iMDk7UAI2qm7Q= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.28.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.29.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common v0.30.0/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.31.1 h1:d18hG4PkHnNAKNMOmFuXFaiY8Us0nird/2m60uS1AMs= github.com/prometheus/common v0.31.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= +github.com/prometheus/common v0.32.1 h1:hWIdL3N2HoUx3B8j3YN9mWor0qhY/NlEKZEaXxuIRh4= +github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= github.com/prometheus/common/sigv4 v0.1.0 h1:qoVebwtwwEhS85Czm2dSROY5fTo2PAPEVdDeppTwGX4= github.com/prometheus/common/sigv4 v0.1.0/go.mod h1:2Jkxxk9yYvCkE5G1sQT7GuEXm57JrvHu9k5YwTjsNtI= +github.com/prometheus/exporter-toolkit v0.5.0/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= github.com/prometheus/exporter-toolkit v0.5.1/go.mod h1:OCkM4805mmisBhLmVFw858QYi3v0wKdY6/UxrT0pZVg= -github.com/prometheus/exporter-toolkit v0.6.1 h1:Aqk75wQD92N9CqmTlZwjKwq6272nOGrWIbc8Z7+xQO0= github.com/prometheus/exporter-toolkit v0.6.1/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= +github.com/prometheus/exporter-toolkit v0.7.0 h1:XtYeVeeC5daG4txbc9+mieKq+/AK4gtIBLl9Mulrjnk= +github.com/prometheus/exporter-toolkit v0.7.0/go.mod h1:ZUBIj498ePooX9t/2xtDjeQYwvRpiPP2lh5u4iblj2g= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289 h1:dTUS1vaLWq+Y6XKOTnrFpoVsQKLCbCp1OLj24TDi7oM= github.com/prometheus/node_exporter v1.0.0-rc.0.0.20200428091818-01054558c289/go.mod h1:FGbBv5OPKjch+jNUJmEQpMZytIdyW0NdBtWFcfSKusc= github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -2002,6 +2067,7 @@ github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= github.com/prometheus/procfs v0.6.0 h1:mxy4L2jP6qMonqmq+aTtOx1ifVWUgG/TAmntgbh3xv4= github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= +github.com/prometheus/prometheus v0.0.0-20180315085919-58e2a31db8de/go.mod h1:oAIUtOny2rjMX0OWN5vPR5/q/twIROJvdqnQKDdil/s= github.com/prometheus/prometheus v0.0.0-20190818123050-43acd0e2e93f/go.mod h1:rMTlmxGCvukf2KMu3fClMDKLLoJ5hl61MhcJ7xKakf0= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= github.com/prometheus/prometheus v1.8.2-0.20200107122003-4708915ac6ef/go.mod h1:7U90zPoLkWjEIQcy/rweQla82OCTUzxVHE51G3OhJbI= @@ -2052,6 +2118,8 @@ github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFR github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= +github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= +github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/cors v1.8.0 h1:P2KMzcFwrPoSjkF1WLRPsp3UMLyql8L4v9hQpVeK5so= github.com/rs/cors v1.8.0/go.mod h1:EBwu+T5AvHOcXwvZIkQFjUN6s8Czyqw12GL/Y0tUyRM= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -2076,6 +2144,7 @@ github.com/samuel/go-zookeeper v0.0.0-20200724154423-2164a8ac840e/go.mod h1:gi+0 github.com/samuel/go-zookeeper v0.0.0-20201211165307-7117e9ea2414/go.mod h1:gi+0XIa01GRL2eRQVjQkKGqKF3SF9vZR/HnPullcV2E= github.com/sanity-io/litter v1.2.0/go.mod h1:JF6pZUFgu2Q0sBZ+HSV35P8TVPI1TTzEwyu9FXAw2W4= github.com/santhosh-tekuri/jsonschema v1.2.4/go.mod h1:TEAUOeZSmIxTTuHatJzrvARHiuO9LYd+cIxzgEHCQI4= +github.com/satori/go.uuid v0.0.0-20160603004225-b111a074d5ef/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/satori/go.uuid v1.2.1-0.20181028125025-b2ce2384e17b/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/scaleway/scaleway-sdk-go v1.0.0-beta.7.0.20210223165440-c65ae3540d44 h1:3egqo0Vut6daANFm7tOXdNAa8v5/uLU+sgCJrc88Meo= @@ -2087,8 +2156,11 @@ github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUt github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= github.com/securego/gosec v0.0.0-20200203094520-d13bb6d2420c/go.mod h1:gp0gaHj0WlmPh9BdsTmo1aq6C27yIPWdxCKGFGdVKBE= -github.com/segmentio/encoding v0.2.19 h1:Kshkmoz080qvUtdtakR8Bjk2sIlLS8wSvijFMEHRGow= -github.com/segmentio/encoding v0.2.19/go.mod h1:7E68jTSWMnNoYhHi1JbLd7NBSB6XfE4vzqhR88hDBQc= +github.com/segmentio/asm v1.1.0/go.mod h1:4EUJGaKsB8ImLUwOGORVsNd9vTRDeh44JGsY4aKp5I4= +github.com/segmentio/asm v1.1.1 h1:WzUpP9BRnRgoP+v8qywthpSe9U5KLq1uDGdJBEcSeQo= +github.com/segmentio/asm v1.1.1/go.mod h1:VCkA6aQH8usgIAUp4QMLQsAeaMl6iW7+VMLrW9Vkv0Y= +github.com/segmentio/encoding v0.3.2 h1:gkXXteOfNaPPlrXTEf/e5tWvaQGVJWnvT3LqMzUeH7U= +github.com/segmentio/encoding v0.3.2/go.mod h1:waft2p6XI4z2pk07M0YzZV4wEiqaRvsBSyWNHxVx4gU= github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e/go.mod h1:tm/wZFQ8e24NYaBGIlnO2WGCAi67re4HHuOm0sftE/M= github.com/segmentio/fasthash v1.0.2/go.mod h1:waKX8l2N8yckOgmSsXJi7x1ZfdKZ4x7KRMzBtS3oedY= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= @@ -2104,10 +2176,12 @@ github.com/shirou/gopsutil/v3 v3.20.10/go.mod h1:igHnfak0qnw1biGeI2qKQvu0ZkwvEkU github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v0.0.0-20200105231215-408a2507e114/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= +github.com/shurcooL/httpfs v0.0.0-20171119174359-809beceb2371/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20180825020608-02ddb050ef6b/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20200627165143-92b8a710ab6c/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= @@ -2142,7 +2216,6 @@ github.com/soniah/gosnmp v1.25.0/go.mod h1:8YvfZxH388NIIw2A+X5z2Oh97VcNhtmxDLt5Q github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/soundcloud/go-runit v0.0.0-20150630195641-06ad41a06c4a/go.mod h1:LeFCbQYJ3KJlPs/FvPz2dy1tkpxyeNESVyCNNzRXFR0= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= github.com/spf13/afero v1.2.1/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= @@ -2171,8 +2244,6 @@ github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DM github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= -github.com/spyzhov/ajson v0.4.2 h1:JMByd/jZApPKDvNsmO90X2WWGbmT2ahDFp73QhZbg3s= -github.com/spyzhov/ajson v0.4.2/go.mod h1:63V+CGM6f1Bu/p4nLIN8885ojBdt88TbLoSFzyqMuVA= github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v0.0.0-20180528204448-e5adc2ada8b8/go.mod h1:1WNBiOZtZQLpVAyu0iTduoJL9hEsMloAK5XWrtW0xdY= @@ -2228,8 +2299,6 @@ github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU= github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tidwall/tinylru v1.0.2/go.mod h1:HDVL7TsWeezQ4g44Um84TOVBMFcq7Xa9giqNc805KJ8= github.com/tidwall/wal v0.1.4/go.mod h1:ww7Pd44/KnyETODJPUPKrzLlYjI72GZWlucNKt7pOt0= -github.com/timberio/go-datemath v0.1.1-0.20200323150745-74ddef604fff h1:QCdUBuN+iKWAB9HqPTkBwyKPPUHDobJ2AuELSNZwd4o= -github.com/timberio/go-datemath v0.1.1-0.20200323150745-74ddef604fff/go.mod h1:m7kjsbCuO4QKP3KLfnxiUZWiOiFXmxj30HeexjL3lc0= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.0/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tinylib/msgp v1.1.5/go.mod h1:eQsjooMTnV42mHu917E26IogZ2930nFyBQdofk10Udg= @@ -2241,8 +2310,8 @@ github.com/tmc/grpc-websocket-proxy v0.0.0-20200427203606-3cfed13b9966/go.mod h1 github.com/tonistiigi/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:Q5IRRDY+cjIaiOjTAnXN5LKQV5MPqVx5ofQn85Jy5Yw= github.com/ttacon/chalk v0.0.0-20160626202418-22c06c80ed31/go.mod h1:onvgF043R+lC5RZ8IT9rBXDaEDnpnw/Cl+HFiw+v/7Q= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= -github.com/ua-parser/uap-go v0.0.0-20190826212731-daf92ba38329 h1:VBsKFh4W1JEMz3eLCmM9zOJKZdDkP5W4b3Y4hc7SbZc= -github.com/ua-parser/uap-go v0.0.0-20190826212731-daf92ba38329/go.mod h1:OBcG9bn7sHtXgarhUEb3OfCnNsgtGnkVf41ilSZ3K3E= +github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f h1:A+MmlgpvrHLeUP8dkBVn4Pnf5Bp5Yk2OALm7SEJLLE8= +github.com/ua-parser/uap-go v0.0.0-20211112212520-00c877edfe0f/go.mod h1:OBcG9bn7sHtXgarhUEb3OfCnNsgtGnkVf41ilSZ3K3E= github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixUabHkC1K/E= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -2280,6 +2349,8 @@ github.com/valyala/fasthttp v1.6.0/go.mod h1:FstJa9V+Pj9vQ7OJie2qMHdwemEDaDiSdBn github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio= +github.com/vectordotdev/go-datemath v0.1.1-0.20211214152759-c03a58217724 h1:v2/Zact72KD/a+HJNb0ES/8JV0Lhlp9PjPdZQGiaBoQ= +github.com/vectordotdev/go-datemath v0.1.1-0.20211214152759-c03a58217724/go.mod h1:PnwzbSst7KD3vpBzzlntZU5gjVa455Uqa5QPiKSYJzQ= github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv3vaXspKw= github.com/vektra/mockery v0.0.0-20181123154057-e78b021dcbb5/go.mod h1:ppEjwdhyy7Y31EnHRDm1JkChoC7LXIJ7Ex0VYLWtZtQ= github.com/vishvananda/netlink v0.0.0-20171020171820-b2de5d10e38e/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= @@ -2325,6 +2396,7 @@ github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= +github.com/xlab/treeprint v1.0.0/go.mod h1:IoImgRak9i3zJyuxOKUP1v4UZd1tMoKkq/Cimt1uhCg= github.com/xlab/treeprint v1.1.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= github.com/xorcare/pointer v1.1.0 h1:sFwXOhRF8QZ0tyVZrtxWGIoVZNEmRzBCaFWdONPQIUM= github.com/xorcare/pointer v1.1.0/go.mod h1:6KLhkOh6YbuvZkT4YbxIbR/wzLBjyMxOiNzZhJTor2Y= @@ -2415,8 +2487,9 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.21.0/go.mod h1: go.opentelemetry.io/contrib/zpages v0.0.0-20210722161726-7668016acb73/go.mod h1:NAkejuYm41lpyL43Fu1XdnCOYxN5NVV80/MJ03JQ/X8= go.opentelemetry.io/otel v0.11.0/go.mod h1:G8UCk+KooF2HLkgo8RHX9epABH/aRGYET7gQOqBVdB0= go.opentelemetry.io/otel v1.0.0-RC1/go.mod h1:x9tRa9HK4hSSq7jf2TKbqFbtt58/TGk0f9XiEYISI1I= -go.opentelemetry.io/otel v1.0.0 h1:qTTn6x71GVBvoafHK/yaRUmFzI4LcONZD0/kXxl5PHI= go.opentelemetry.io/otel v1.0.0/go.mod h1:AjRVh9A5/5DE7S+mZtTR6t8vpKKryam+0lREnfmS4cg= +go.opentelemetry.io/otel v1.2.0 h1:YOQDvxO1FayUcT9MIhJhgMyNO1WqoduiyvQHzGN0kUQ= +go.opentelemetry.io/otel v1.2.0/go.mod h1:aT17Fk0Z1Nor9e0uisf98LrntPGMnk4frBO9+dkf69I= go.opentelemetry.io/otel/exporters/jaeger v1.0.0 h1:cLhx8llHw02h5JTqGqaRbYn+QVKHmrzD9vEbKnSPk5U= go.opentelemetry.io/otel/exporters/jaeger v1.0.0/go.mod h1:q10N1AolE1JjqKrFJK2tYw0iZpmX+HBaXBtuCzRnBGQ= go.opentelemetry.io/otel/internal/metric v0.21.0/go.mod h1:iOfAaY2YycsXfYD4kaRSbLx2LKmfpKObWBEv9QK5zFo= @@ -2426,8 +2499,9 @@ go.opentelemetry.io/otel/sdk v1.0.0-RC1/go.mod h1:kj6yPn7Pgt5ByRuwesbaWcRLA+V7BS go.opentelemetry.io/otel/sdk v1.0.0 h1:BNPMYUONPNbLneMttKSjQhOTlFLOD9U22HNG1KrIN2Y= go.opentelemetry.io/otel/sdk v1.0.0/go.mod h1:PCrDHlSy5x1kjezSdL37PhbFUMjrsLRshJ2zCzeXwbM= go.opentelemetry.io/otel/trace v1.0.0-RC1/go.mod h1:86UHmyHWFEtWjfWPSbu0+d0Pf9Q6e1U+3ViBOc+NXAg= -go.opentelemetry.io/otel/trace v1.0.0 h1:TSBr8GTEtKevYMG/2d21M989r5WJYVimhTHBKVEZuh4= go.opentelemetry.io/otel/trace v1.0.0/go.mod h1:PXTWqayeFUlJV1YDNhsJYB184+IvAH814St6o6ajzIs= +go.opentelemetry.io/otel/trace v1.2.0 h1:Ys3iqbqZhcf28hHzrm5WAquMkDHNZTUkw7KHbuNjej0= +go.opentelemetry.io/otel/trace v1.2.0/go.mod h1:N5FLswTubnxKxOJHM7XZC074qpeEdLy3CgAVsdMucK0= go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= go.starlark.net v0.0.0-20200901195727-6e684ef5eeee/go.mod h1:f0znQkUKRrkk36XxWbGjMqQM8wGv/xHBVE2qc3B5oFU= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= @@ -2638,6 +2712,7 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210324051636-2c4c8ecb7826/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= +golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210505214959-0714010a04ed/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2817,8 +2892,10 @@ golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503080704-8803ae5d1324/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210503173754-0981d6026fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -2833,8 +2910,11 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210906170528-6f6e22806c34/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365 h1:6wSTsvPddg9gc/mVEEyk9oOAoxn+bT4Z9q1zx+4RwA4= golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211110154304-99a53858aa08/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881 h1:TyHqChC80pFkXWraUUf6RuB5IqFdQieMLwwCJokV2pc= +golang.org/x/sys v0.0.0-20211124211545-fe61309f8881/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d h1:SZxvLBoTP5yHO3Frd4z4vrF+DBX9vMVanchswa69toE= @@ -2842,6 +2922,7 @@ golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180805044716-cb6730876b98/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.1-0.20181227161524-e6919f6577db/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= @@ -2871,6 +2952,7 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20181112210238-4b1f3b6b1646/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20181221001348-537d06c36207/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190118193359-16909d206f00/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190125232054-d66bd3c5d5a6/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -2937,7 +3019,7 @@ golang.org/x/tools v0.0.0-20200422205258-72e4a01eba43/go.mod h1:EkVYQZoAsY45+roY golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200509030707-2212a7e161a5/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200513154647-78b527d18275/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200513201620-d5fe73897c97/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200522201501-cb1345f3a375/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200603131246-cc40288be839/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= @@ -3026,8 +3108,9 @@ google.golang.org/api v0.51.0/go.mod h1:t4HdrdoNgyN5cbEfm7Lum0lcLDLiise1F8qDKX00 google.golang.org/api v0.54.0/go.mod h1:7C4bFFOvVDGXjfDTAsgGwDgAxRDeQ4X8NvUedIt6z3k= google.golang.org/api v0.55.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= google.golang.org/api v0.56.0/go.mod h1:38yMfeP1kfjsl8isn0tliTjIb1rJXcQi4UXlbqivdVE= -google.golang.org/api v0.57.0 h1:4t9zuDlHLcIx0ZEhmXEeFVCRsiOgpgn2QOH9N0MNjPI= google.golang.org/api v0.57.0/go.mod h1:dVPlbZyBo2/OjBpmvNdpn2GRm6rPy75jyU7bmhdrMgI= +google.golang.org/api v0.58.0 h1:MDkAbYIB1JpSgCTOCYYoIec/coMlKK4oVbpnBLLcyT0= +google.golang.org/api v0.58.0/go.mod h1:cAbP2FsxoGVNwtgNAmmn3y5G1TWAiVYRmg4yku3lv+E= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.2.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.3.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= @@ -3119,8 +3202,12 @@ google.golang.org/genproto v0.0.0-20210821163610-241b8fcbd6c8/go.mod h1:eFjDcFEc google.golang.org/genproto v0.0.0-20210828152312-66f60bf46e71/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210831024726-fe130286e0e2/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= -google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6 h1:2ncG/LajxmrclaZH+ppVi02rQxz4eXYJzGHdFN4Y9UA= +google.golang.org/genproto v0.0.0-20210909211513-a8c4777a87af/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= +google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20210921142501-181ce0d877f6/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20210924002016-3dee208752a0/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2 h1:CUp93KYgL06Y/PdI8aRJaFiAHevPIGWQmijSqaUhue8= +google.golang.org/genproto v0.0.0-20211018162055-cf77aa76bad2/go.mod h1:5CzLGKJ67TSI2B9POpiiyGha0AjJvZIUgRMt1dSmuhc= google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.8.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= google.golang.org/grpc v1.12.0/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= @@ -3159,8 +3246,9 @@ google.golang.org/grpc v1.37.1/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.39.0/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= google.golang.org/grpc v1.39.1/go.mod h1:PImNr+rS9TWYb2O4/emRugxiyHZ5JyHW5F+RPnDzfrE= -google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q= google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= +google.golang.org/grpc v1.41.0 h1:f+PlOh7QV4iIJkPrx5NQ7qaNGFQ3OTse67yaDHfju4E= +google.golang.org/grpc v1.41.0/go.mod h1:U3l9uK9J0sini8mHphKoXyaqDA/8VyGnDee1zzIUK6k= google.golang.org/grpc/cmd/protoc-gen-go-grpc v0.0.0-20200910201057-6591123024b3/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= diff --git a/grafana-mixin/alerts/alerts.libsonnet b/grafana-mixin/alerts/alerts.libsonnet new file mode 100644 index 00000000000..e38f2a4a72a --- /dev/null +++ b/grafana-mixin/alerts/alerts.libsonnet @@ -0,0 +1,31 @@ +{ + _config+:: { + grafanaRequestsFailingThresholdPercent: 50, + }, + + prometheusAlerts+:: { + groups+: [ + { + name: 'GrafanaAlerts', + rules: [ + { + alert: 'GrafanaRequestsFailing', + expr: ||| + 100 * namespace_job_handler_statuscode:grafana_http_request_duration_seconds_count:rate5m{handler!~"/api/datasources/proxy/:id.*|/api/ds/query|/api/tsdb/query", status_code=~"5.."} + / ignoring (status_code) + sum without (status_code) (namespace_job_handler_statuscode:grafana_http_request_duration_seconds_count:rate5m{handler!~"/api/datasources/proxy/:id.*|/api/ds/query|/api/tsdb/query"}) + > %(grafanaRequestsFailingThresholdPercent)s + ||| % $._config, + labels: { + severity: 'warning', + }, + annotations: { + message: '{{ $labels.namespace }}/{{ $labels.job }}/{{ $labels.handler }} is experiencing {{ $value | humanize }}% errors', + }, + 'for': '5m', + }, + ], + }, + ], + }, +} diff --git a/grafana-mixin/alerts/alerts.yaml b/grafana-mixin/alerts/alerts.yaml deleted file mode 100644 index 2acc9d0794b..00000000000 --- a/grafana-mixin/alerts/alerts.yaml +++ /dev/null @@ -1,14 +0,0 @@ -groups: - - name: GrafanaAlerts - rules: - - alert: GrafanaRequestsFailing - for: 5m - expr: | - 100 * namespace_job_handler_statuscode:grafana_http_request_duration_seconds_count:rate5m{handler!~"/api/datasources/proxy/:id.*|/api/ds/query|/api/tsdb/query", status_code=~"5.."} - / - namespace_job_handler_statuscode:grafana_http_request_duration_seconds_count:rate5m{handler!~"/api/datasources/proxy/:id.*|/api/ds/query|/api/tsdb/query"} - > 0.5 - labels: - severity: 'warning' - annotations: - message: "'{{ $labels.namespace }}' / '{{ $labels.job }}' / '{{ $labels.handler }}' is experiencing {{ $value | humanize }}% errors" diff --git a/grafana-mixin/dashboards/dashboards.libsonnet b/grafana-mixin/dashboards/dashboards.libsonnet new file mode 100644 index 00000000000..e7589aaedfb --- /dev/null +++ b/grafana-mixin/dashboards/dashboards.libsonnet @@ -0,0 +1,5 @@ +{ + grafanaDashboards+:: { + 'grafana-overview.json': (import 'grafana-overview.json'), + }, +} diff --git a/grafana-mixin/mixin.libsonnet b/grafana-mixin/mixin.libsonnet index c60e0e736c5..4a7437b948c 100644 --- a/grafana-mixin/mixin.libsonnet +++ b/grafana-mixin/mixin.libsonnet @@ -1,15 +1,3 @@ -{ - grafanaDashboards: { - 'grafana-overview.json': (import 'dashboards/grafana-overview.json'), - }, - - // Helper function to ensure that we don't override other rules, by forcing - // the patching of the groups list, and not the overall rules object. - local importRules(rules) = { - groups+: std.native('parseYaml')(rules)[0].groups, - }, - - prometheusRules+: importRules(importstr 'rules/rules.yaml'), - - prometheusAlerts+: importRules(importstr 'alerts/alerts.yaml'), -} +(import 'alerts/alerts.libsonnet') + +(import 'dashboards/dashboards.libsonnet') + +(import 'rules/rules.libsonnet') diff --git a/grafana-mixin/rules/rules.libsonnet b/grafana-mixin/rules/rules.libsonnet new file mode 100644 index 00000000000..8cb28433929 --- /dev/null +++ b/grafana-mixin/rules/rules.libsonnet @@ -0,0 +1,17 @@ +{ + prometheusRules+:: { + groups+: [ + { + name: 'grafana_rules', + rules: [ + { + record: 'namespace_job_handler_statuscode:grafana_http_request_duration_seconds_count:rate5m', + expr: ||| + sum by (namespace, job, handler, status_code) (rate(grafana_http_request_duration_seconds_count[5m])) + |||, + }, + ], + }, + ], + }, +} diff --git a/grafana-mixin/rules/rules.yaml b/grafana-mixin/rules/rules.yaml deleted file mode 100644 index f1fe8fb2e94..00000000000 --- a/grafana-mixin/rules/rules.yaml +++ /dev/null @@ -1,7 +0,0 @@ -groups: - - name: grafana_rules - rules: - # Record error rate of http requests excluding dataproxy, /ds/query and /tsdb/query requests - - record: namespace_job_handler_statuscode:grafana_http_request_duration_seconds_count:rate5m - expr: | - sum by (namespace, job, handler, status_code) (rate(grafana_http_request_duration_seconds_count[5m])) diff --git a/grafana-mixin/scripts/lint.sh b/grafana-mixin/scripts/lint.sh index f6fbeb1229c..fc7d2eed19c 100755 --- a/grafana-mixin/scripts/lint.sh +++ b/grafana-mixin/scripts/lint.sh @@ -10,4 +10,4 @@ find . -name 'vendor' -prune -o -name '*.libsonnet' -print -o -name '*.jsonnet' ${JSONNET_FMT} "$f" | diff -u "$f" -; \ done -mixtool lint mixin.libsonnet +#mixtool lint mixin.libsonnet diff --git a/jest.config.js b/jest.config.js index fdd703c1ffb..8218dcb3be6 100644 --- a/jest.config.js +++ b/jest.config.js @@ -5,8 +5,9 @@ process.env.TZ = 'Pacific/Easter'; module.exports = { verbose: false, + testEnvironment: 'jsdom', transform: { - '^.+\\.(ts|tsx|js|jsx)$': 'ts-jest', + '^.+\\.(ts|tsx|js|jsx)$': require.resolve('ts-jest'), }, transformIgnorePatterns: [ 'node_modules/(?!(ol)/)', // <- exclude the open layers library @@ -27,11 +28,14 @@ module.exports = { '\\.svg': '/public/test/mocks/svg.ts', '\\.css': '/public/test/mocks/style.ts', 'monaco-editor/esm/vs/editor/editor.api': '/public/test/mocks/monaco.ts', - '^react($|/.+)$': '/node_modules/react$1', - '^react-router(.+)$': '/node_modules/react-router$1', - '^react-hook-form$': '/node_modules/react-hook-form', - '^enzyme($|/.+)$': '/node_modules/enzyme$1', - '^jquery$': '/node_modules/jquery', + + // lingui-macro (for i18n) makes use of babel-macro, which we do not enable in tests, so we + // provide our own mock component + '@lingui/macro': '/public/test/mocks/linguiMacro.tsx', + + // i18n messages.js files are auto-generated, and may not exist when the tests are ran. + // Because we mock out anyway, we can mock the messages also + 'locales/\\w+/messages$': '/public/test/mocks/i18nMessages.ts', }, watchPathIgnorePatterns: ['/node_modules/'], }; diff --git a/latest.json b/latest.json index 32de21fec7a..d403ab4ea75 100644 --- a/latest.json +++ b/latest.json @@ -1,4 +1,4 @@ { - "stable": "8.2.2", - "testing": "8.2.2" + "stable": "8.3.3", + "testing": "8.3.3" } diff --git a/lerna.json b/lerna.json index feff3a7f8d2..ea302e8c442 100644 --- a/lerna.json +++ b/lerna.json @@ -2,5 +2,5 @@ "npmClient": "yarn", "useWorkspaces": true, "packages": ["packages/*"], - "version": "8.3.0-pre" + "version": "8.4.0-pre" } diff --git a/pkg/macaron/binding/go.sum b/log similarity index 100% rename from pkg/macaron/binding/go.sum rename to log diff --git a/package.json b/package.json index ac64f90fa16..63891ce2606 100644 --- a/package.json +++ b/package.json @@ -3,19 +3,18 @@ "license": "AGPL-3.0-only", "private": true, "name": "grafana", - "version": "8.3.0-pre", + "version": "8.4.0-pre", "repository": "github:grafana/grafana", "scripts": { "api-tests": "jest --notify --watch --config=devenv/e2e-api-tests/jest.js", - "build": "node ./node_modules/webpack/bin/webpack.js --config scripts/webpack/webpack.prod.js", - "check-strict": "./scripts/ci-check-strict.sh", - "dev": "webpack --progress --color --config scripts/webpack/webpack.dev.js", + "build": "yarn i18n:compile && NODE_ENV=production webpack --config scripts/webpack/webpack.prod.js", + "build:nominify": "yarn run build --env noMinify=1", + "dev": "yarn i18n:compile && webpack --progress --color --config scripts/webpack/webpack.dev.js", "e2e": "./e2e/start-and-run-suite", "e2e:debug": "./e2e/start-and-run-suite debug", "e2e:dev": "./e2e/start-and-run-suite dev", + "e2e:benchmark:live": "./e2e/start-and-run-suite benchmark live", "test": "jest --notify --watch", - "test:accessibility": "pa11y-ci --config .pa11yci.conf.js", - "test:accessibility-pr": "pa11y-ci --config .pa11yci-pr.conf.js", "test:accessibility-report": "./scripts/generate-a11y-report.sh", "lint": "yarn run lint:ts && yarn run lint:sass", "lint:ts": "eslint . --ext .js,.tsx,.ts --cache", @@ -30,15 +29,17 @@ "packages:publishCanary": "lerna publish from-package --contents dist --dist-tag canary --yes", "packages:publishLatest": "lerna publish from-package --contents dist --yes", "packages:publishNext": "lerna publish from-package --contents dist --dist-tag next --yes", + "packages:publishTest": "lerna publish from-package --contents dist --dist-tag test --yes", + "packages:publishPrevious": "lerna publish from-package --contents dist --dist-tag previous --yes", "packages:publishDev": "lerna publish from-package --contents dist --dist-tag dev --yes --registry http://grafana-npm.local:4873 --force-publish=*", "packages:typecheck": "lerna run typecheck", "packages:clean": "lerna run clean", "precommit": "yarn run lint-staged", - "prettier:check": "prettier --list-different \"**/*.{ts,tsx,scss,md,mdx}\"", - "prettier:write": "prettier --list-different \"**/*.{ts,tsx,scss,js,md,mdx}\" --write", - "start": "yarn themes:generate && webpack --progress --color --watch --env noTsCheck=0 --config scripts/webpack/webpack.dev.js", - "start:hot": "yarn themes:generate && webpack serve --progress --color --config scripts/webpack/webpack.hot.js", - "start:noTsCheck": "yarn themes:generate && webpack --progress --color --watch --env noTsCheck=1 --config scripts/webpack/webpack.dev.js", + "prettier:check": "prettier --list-different \"**/*.{scss,md,mdx}\"", + "prettier:write": "prettier --list-different \"**/*.{scss,md,mdx}\" --write", + "start": "yarn themes:generate && yarn dev --watch", + "start:noTsCheck": "yarn start --env noTsCheck=1", + "start:hot": "yarn themes:generate && NODE_ENV=hot yarn dev --config scripts/webpack/webpack.hot.js", "stats": "webpack --mode production --config scripts/webpack/webpack.prod.js --profile --json > compilation-stats.json", "storybook": "yarn workspace @grafana/ui storybook --ci", "storybook:build": "yarn workspace @grafana/ui storybook:build", @@ -46,17 +47,15 @@ "typecheck": "tsc --noEmit && yarn run packages:typecheck", "plugins:build-bundled": "grafana-toolkit plugin:bundle-managed", "watch": "yarn start -d watch,start core:start --watchTheme", - "ci:test-frontend": "yarn run test:ci && yarn grafana-toolkit node-version-check" + "ci:test-frontend": "yarn run test:ci && yarn grafana-toolkit node-version-check", + "i18n:extract": "lingui extract", + "i18n:compile": "lingui compile", + "postinstall": "husky install" }, "grafana": { - "whatsNewUrl": "https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v8-2/", + "whatsNewUrl": "https://grafana.com/docs/grafana/next/whatsnew/whats-new-in-v8-3/", "releaseNotesUrl": "https://grafana.com/docs/grafana/next/release-notes/" }, - "husky": { - "hooks": { - "pre-commit": "yarn run precommit" - } - }, "lint-staged": { "*.{js,ts,tsx}": [ "eslint --ext .js,.tsx,.ts --cache --fix" @@ -69,219 +68,235 @@ ] }, "devDependencies": { - "@babel/core": "7.14.6", - "@babel/plugin-proposal-nullish-coalescing-operator": "7.14.5", - "@babel/plugin-proposal-object-rest-spread": "7.14.7", - "@babel/plugin-proposal-optional-chaining": "7.14.5", + "@babel/core": "7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "7.16.7", + "@babel/plugin-proposal-object-rest-spread": "7.16.7", + "@babel/plugin-proposal-optional-chaining": "7.16.7", "@babel/plugin-syntax-dynamic-import": "7.8.3", - "@babel/plugin-transform-react-constant-elements": "7.14.5", - "@babel/plugin-transform-runtime": "^7.14.5", - "@babel/preset-env": "7.14.7", - "@babel/preset-react": "7.14.5", - "@babel/preset-typescript": "7.14.5", - "@emotion/eslint-plugin": "11.2.0", + "@babel/plugin-transform-react-constant-elements": "7.16.7", + "@babel/plugin-transform-runtime": "7.16.7", + "@babel/plugin-transform-typescript": "7.16.7", + "@babel/preset-env": "7.16.7", + "@babel/preset-react": "7.16.7", + "@babel/preset-typescript": "7.16.7", + "@emotion/eslint-plugin": "11.7.0", "@grafana/api-documenter": "7.11.2", "@grafana/e2e": "workspace:*", - "@grafana/eslint-config": "2.5.0", + "@grafana/eslint-config": "2.5.1", "@grafana/toolkit": "workspace:*", "@grafana/tsconfig": "^1.0.0-rc1", - "@kusto/monaco-kusto": "4.0.6", - "@microsoft/api-extractor": "7.18.16", - "@pmmmwh/react-refresh-webpack-plugin": "^0.5.0-rc.6", - "@testing-library/jest-dom": "5.11.5", + "@lingui/cli": "3.13.0", + "@lingui/macro": "3.13.0", + "@microsoft/api-extractor": "7.19.4", + "@pmmmwh/react-refresh-webpack-plugin": "0.5.4", + "@react-types/button": "3.4.1", + "@react-types/menu": "3.4.1", + "@react-types/overlays": "3.5.1", + "@react-types/shared": "3.10.1", + "@rtsao/plugin-proposal-class-properties": "7.0.1-patch.1", + "@swc/core": "1.2.127", + "@swc/helpers": "0.3.2", + "@testing-library/dom": "8.11.1", + "@testing-library/jest-dom": "5.16.1", "@testing-library/react": "12.1.2", "@testing-library/react-hooks": "7.0.2", - "@testing-library/user-event": "13.3.0", - "@types/angular": "1.6.56", - "@types/angular-route": "1.7.0", - "@types/classnames": "2.2.9", - "@types/clipboard": "2.0.1", + "@testing-library/user-event": "13.5.0", + "@types/angular": "1.8.4", + "@types/angular-route": "1.7.2", + "@types/classnames": "2.3.0", "@types/common-tags": "^1.8.0", - "@types/d3": "7.0.0", + "@types/d3": "7.1.0", "@types/d3-force": "^2.1.0", "@types/d3-scale-chromatic": "1.3.1", - "@types/debounce-promise": "3.1.3", - "@types/enzyme": "3.10.5", + "@types/debounce-promise": "3.1.4", + "@types/enzyme": "3.10.11", "@types/enzyme-adapter-react-16": "1.0.6", - "@types/file-saver": "2.0.1", + "@types/file-saver": "2.0.4", + "@types/google.analytics": "^0.0.42", + "@types/grafana__slate-react": "npm:@types/slate-react@0.22.5", "@types/history": "^4.7.8", "@types/hoist-non-react-statics": "3.3.1", - "@types/jest": "26.0.15", - "@types/jquery": "3.3.38", + "@types/jest": "27.4.0", + "@types/jquery": "3.5.11", "@types/jsurl": "^1.2.28", + "@types/lingui__macro": "^3", "@types/lodash": "4.14.149", "@types/logfmt": "^1.2.1", "@types/lru-cache": "^5.1.0", "@types/mousetrap": "1.6.3", - "@types/node": "14.17.27", - "@types/papaparse": "5.2.0", + "@types/node": "16.11.19", + "@types/ol": "^6.5.1", + "@types/papaparse": "5.3.1", "@types/pluralize": "^0.0.29", - "@types/prismjs": "1.16.0", + "@types/prismjs": "1.16.6", "@types/rc-time-picker": "^3", - "@types/react": "17.0.30", - "@types/react-beautiful-dnd": "13.1.1", - "@types/react-dom": "17.0.10", - "@types/react-grid-layout": "1.1.1", - "@types/react-highlight-words": "^0.16.2", - "@types/react-loadable": "5.5.2", - "@types/react-redux": "7.1.18", + "@types/react": "17.0.38", + "@types/react-beautiful-dnd": "13.1.2", + "@types/react-dom": "17.0.11", + "@types/react-grid-layout": "1.3.0", + "@types/react-highlight-words": "0.16.4", + "@types/react-loadable": "5.5.6", + "@types/react-redux": "7.1.21", "@types/react-router-dom": "^5.1.7", - "@types/react-select": "4.0.13", "@types/react-test-renderer": "17.0.1", - "@types/react-transition-group": "4.4.0", - "@types/react-virtualized-auto-sizer": "1.0.0", - "@types/react-window": "1.8.1", - "@types/redux-mock-store": "1.0.2", + "@types/react-transition-group": "4.4.4", + "@types/react-virtualized-auto-sizer": "1.0.1", + "@types/react-window": "1.8.5", + "@types/redux-mock-store": "1.0.3", "@types/reselect": "2.2.0", - "@types/semver": "7.3.8", + "@types/semver": "7.3.9", "@types/slate": "0.47.2", - "@types/slate-plain-serializer": "0.6.1", + "@types/slate-plain-serializer": "0.7.2", "@types/slate-react": "0.22.5", - "@types/testing-library__jest-dom": "5.9.5", + "@types/testing-library__jest-dom": "5.14.2", "@types/testing-library__react-hooks": "^3.2.0", - "@types/tinycolor2": "1.4.2", - "@types/uuid": "8.3.0", - "@typescript-eslint/eslint-plugin": "4.28.0", - "@typescript-eslint/parser": "4.28.0", - "@wojtekmaj/enzyme-adapter-react-17": "0.6.2", - "angular-mocks": "1.6.6", - "autoprefixer": "10.2.6", - "axios": "0.21.2", - "babel-jest": "26.6.3", - "babel-loader": "8.2.2", + "@types/tinycolor2": "1.4.3", + "@types/uuid": "8.3.4", + "@typescript-eslint/eslint-plugin": "5.9.0", + "@typescript-eslint/parser": "5.9.0", + "@wojtekmaj/enzyme-adapter-react-17": "0.6.6", + "autoprefixer": "10.4.1", + "axios": "0.24.0", + "babel-jest": "27.4.6", + "babel-loader": "8.2.3", "babel-plugin-angularjs-annotate": "0.10.0", + "babel-plugin-macros": "3.1.0", "copy-webpack-plugin": "9.0.1", - "css-loader": "6.4.0", - "css-minimizer-webpack-plugin": "^3.1.1", - "cypress": "8.4.1", + "css-loader": "6.5.1", + "css-minimizer-webpack-plugin": "3.3.1", + "cypress": "9.2.0", "enzyme": "3.11.0", - "enzyme-to-json": "3.4.4", - "es-abstract": "1.18.0-next.1", - "es6-promise": "4.2.8", - "es6-shim": "0.35.5", - "eslint": "7.21.0", - "eslint-config-prettier": "7.2.0", - "eslint-plugin-jsdoc": "36.1.0", + "enzyme-to-json": "3.6.2", + "eslint": "7.28.0", + "eslint-config-prettier": "8.3.0", + "eslint-plugin-jsdoc": "37.6.1", "eslint-plugin-lodash": "^7.2.0", - "eslint-plugin-no-only-tests": "2.4.0", - "eslint-plugin-prettier": "3.3.1", - "eslint-plugin-react": "7.22.0", - "eslint-plugin-react-hooks": "4.2.0", - "eslint-webpack-plugin": "3.0.1", - "expect.js": "0.3.1", - "expose-loader": "3.0.0", + "eslint-plugin-no-only-tests": "2.6.0", + "eslint-plugin-prettier": "4.0.0", + "eslint-plugin-react": "7.28.0", + "eslint-plugin-react-hooks": "4.3.0", + "eslint-webpack-plugin": "3.1.1", + "expose-loader": "3.1.0", "file-loader": "6.2.0", - "fork-ts-checker-webpack-plugin": "6.3.4", + "fork-ts-checker-webpack-plugin": "6.5.0", "fs-extra": "10.0.0", - "gaze": "1.1.3", - "glob": "7.1.6", - "html-loader": "2.1.2", - "html-webpack-harddisk-plugin": "2.0.0", - "html-webpack-plugin": "5.3.2", - "http-server": "13.0.1", - "husky": "4.2.1", + "glob": "7.2.0", + "html-loader": "3.1.0", + "html-webpack-plugin": "5.5.0", + "http-server": "14.1.0", + "husky": "^7.0.0", "iconscout-unicons-tarball": "https://github.com/grafana/icons/tarball/63056cd833ba7ee4e94904492b3a8c0cabc38d28", - "jest": "26.6.3", - "jest-canvas-mock": "2.3.0", + "jest": "27.4.7", + "jest-canvas-mock": "2.3.1", "jest-date-mock": "1.0.8", - "jest-junit": "^6.4.0", - "jest-matcher-utils": "26.0.0", + "jest-junit": "13.0.0", + "jest-matcher-utils": "27.4.6", "lerna": "^4.0.0", - "lint-staged": "10.0.7", - "mini-css-extract-plugin": "2.4.2", - "module-alias": "2.2.2", - "mutationobserver-shim": "0.3.3", + "lint-staged": "12.1.6", + "mini-css-extract-plugin": "2.4.6", + "mutationobserver-shim": "0.3.7", "ngtemplate-loader": "2.1.0", - "nodemon": "2.0.2", - "pa11y-ci": "pa11y/pa11y-ci#5c842cf1b9fe2867b70ff5354851d985be8d71c4", - "postcss": "8.3.6", - "postcss-loader": "6.1.1", - "postcss-reporter": "7.0.2", + "node-notifier": "^10.0.0", + "nodemon": "2.0.15", + "postcss": "8.4.5", + "postcss-loader": "6.2.1", + "postcss-reporter": "7.0.5", + "postcss-scss": "4.0.2", "prettier": "2.2.1", "raw-loader": "4.0.2", - "react-refresh": "^0.10.0", + "react-refresh": "0.11.0", "react-select-event": "^5.1.0", - "react-test-renderer": "17.0.1", + "react-test-renderer": "17.0.2", "redux-mock-store": "1.5.4", - "regexp-replace-loader": "1.0.1", - "rimraf": "3.0.1", - "rxjs-spy": "8.0.0", - "sass": "1.32.13", - "sass-loader": "12.1.0", - "sinon": "8.1.1", - "style-loader": "3.3.0", - "stylelint": "13.13.1", + "rimraf": "3.0.2", + "sass": "1.47.0", + "sass-loader": "12.4.0", + "sinon": "12.0.1", + "style-loader": "3.3.1", + "stylelint": "14.2.0", "stylelint-config-prettier": "9.0.3", - "stylelint-config-sass-guidelines": "8.0.0", - "terser-webpack-plugin": "5.2.4", - "testing-library-selector": "^0.1.3", - "ts-jest": "26.4.4", - "ts-loader": "8.3.0", - "ts-node": "9.0.0", - "tslib": "2.3.1", - "typescript": "4.4.3", + "stylelint-config-sass-guidelines": "9.0.1", + "terser-webpack-plugin": "5.3.0", + "testing-library-selector": "0.2.1", + "ts-jest": "27.1.2", + "ts-loader": "9.2.6", + "ts-node": "10.4.0", + "typescript": "4.5.4", "wait-on": "6.0.0", - "webpack": "5.58.1", - "webpack-bundle-analyzer": "4.4.2", - "webpack-cleanup-plugin": "0.5.1", - "webpack-cli": "4.9.0", - "webpack-dev-server": "4.3.1", - "webpack-merge": "5.8.0", - "worker-loader": "^3.0.8" + "webpack": "5.66.0", + "webpack-bundle-analyzer": "4.5.0", + "webpack-cli": "4.9.1", + "webpack-dev-server": "4.7.2", + "webpack-merge": "5.8.0" }, "dependencies": { - "@emotion/css": "11.1.3", - "@emotion/react": "11.1.5", - "@grafana/aws-sdk": "0.0.3", + "@emotion/css": "11.7.1", + "@emotion/react": "11.7.1", + "@grafana/aws-sdk": "0.0.31", "@grafana/data": "workspace:*", "@grafana/e2e-selectors": "workspace:*", + "@grafana/experimental": "0.0.2-canary.11", "@grafana/runtime": "workspace:*", "@grafana/schema": "workspace:*", "@grafana/slate-react": "0.22.10-grafana", "@grafana/ui": "workspace:*", "@jaegertracing/jaeger-ui-components": "workspace:*", - "@opentelemetry/api": "1.0.2", - "@opentelemetry/exporter-collector": "0.23.0", - "@opentelemetry/semantic-conventions": "1.0.0", - "@popperjs/core": "2.5.4", - "@reduxjs/toolkit": "1.6.1", - "@sentry/browser": "5.25.0", - "@sentry/types": "5.24.2", - "@sentry/utils": "6.13.2", - "@types/ol": "^6.5.1", - "@visx/event": "2.1.0", + "@kusto/monaco-kusto": "4.1.2", + "@lingui/core": "3.13.0", + "@lingui/react": "3.13.0", + "@opentelemetry/api": "1.0.4", + "@opentelemetry/exporter-collector": "0.25.0", + "@opentelemetry/semantic-conventions": "1.0.1", + "@popperjs/core": "2.11.2", + "@react-aria/button": "3.3.4", + "@react-aria/focus": "3.5.0", + "@react-aria/interactions": "3.7.0", + "@react-aria/menu": "3.3.0", + "@react-aria/overlays": "3.7.3", + "@react-aria/utils": "3.11.0", + "@react-stately/collections": "3.3.4", + "@react-stately/menu": "3.2.3", + "@react-stately/tree": "3.2.0", + "@reduxjs/toolkit": "1.7.1", + "@sentry/browser": "6.16.1", + "@sentry/types": "6.16.1", + "@sentry/utils": "6.16.1", + "@visx/event": "2.1.2", "@visx/gradient": "2.1.0", - "@visx/scale": "2.1.0", - "@visx/shape": "2.1.0", - "@visx/tooltip": "2.1.0", - "@welldone-software/why-did-you-render": "6.2.1", - "abortcontroller-polyfill": "1.4.0", + "@visx/group": "2.1.0", + "@visx/scale": "2.2.2", + "@visx/shape": "2.4.0", + "@visx/tooltip": "2.2.2", + "@welldone-software/why-did-you-render": "6.2.3", "angular": "1.8.2", "angular-bindonce": "0.3.1", "angular-route": "1.8.2", "angular-sanitize": "1.8.2", + "app": "link:./public/app", "baron": "3.0.3", "brace": "0.11.1", "calculate-size": "1.1.1", - "centrifuge": "2.7.5", - "classnames": "2.2.6", - "clipboard": "2.0.4", - "common-tags": "^1.8.0", - "core-js": "3.10.0", + "centrifuge": "2.8.4", + "classnames": "2.3.1", + "comlink": "4.3.1", + "common-tags": "1.8.2", + "core-js": "3.20.2", "d3": "5.15.0", "d3-force": "^2.1.1", "d3-scale-chromatic": "1.5.0", "dangerously-set-html-content": "1.0.9", + "date-fns": "2.28.0", "debounce-promise": "3.1.2", - "eventemitter3": "4.0.0", + "emotion": "11.0.0", + "eventemitter3": "4.0.7", "fast-deep-equal": "^3.1.3", - "fast-json-patch": "2.2.1", - "fast-text-encoding": "^1.0.0", - "file-saver": "2.0.2", + "fast-json-patch": "3.1.0", + "file-saver": "2.0.5", "history": "4.10.1", "hoist-non-react-statics": "3.3.2", - "immer": "9.0.6", - "jquery": "3.5.1", + "immer": "9.0.7", + "immutable": "4.0.0", + "jquery": "3.6.0", "json-source-map": "0.6.1", "jsurl": "^0.1.5", "lezer": "0.13.5", @@ -289,70 +304,78 @@ "lezer-tree": "0.13.2", "lodash": "4.17.21", "logfmt": "^1.3.2", - "lru-cache": "^5.1.1", - "memoize-one": "5.1.1", + "lru-cache": "6.0.0", + "memoize-one": "6.0.0", "moment": "2.29.1", - "moment-timezone": "0.5.33", - "monaco-editor": "0.27.0", + "moment-timezone": "0.5.34", + "monaco-editor": "^0.31.1", "monaco-promql": "^1.7.2", "mousetrap": "1.6.5", "mousetrap-global-bind": "1.1.0", - "moveable": "0.26.0", - "ol": "6.7.0", - "papaparse": "5.3.0", + "moveable": "0.27.3", + "ol": "6.9.0", + "papaparse": "5.3.1", "pluralize": "^8.0.0", - "prismjs": "1.25.0", - "prop-types": "15.7.2", + "prismjs": "1.26.0", + "prop-types": "15.8.1", "rc-cascader": "1.5.0", - "rc-drawer": "4.4.0", - "rc-slider": "9.6.4", - "rc-time-picker": "^3.7.3", + "rc-drawer": "4.4.3", + "rc-slider": "9.7.5", + "rc-time-picker": "3.7.3", "re-resizable": "^6.2.0", - "react": "17.0.1", + "react": "17.0.2", "react-beautiful-dnd": "13.1.0", "react-diff-viewer": "^3.1.1", - "react-dom": "17.0.1", - "react-grid-layout": "1.2.5", + "react-dom": "17.0.2", + "react-draggable": "4.4.4", + "react-grid-layout": "1.3.0", "react-highlight-words": "0.17.0", "react-hook-form": "7.5.3", "react-inlinesvg": "2.3.0", "react-loadable": "5.5.0", - "react-popper": "2.2.4", - "react-redux": "7.2.5", + "react-moveable": "0.30.3", + "react-popper": "2.2.5", + "react-redux": "7.2.6", + "react-resizable": "3.0.4", "react-reverse-portal": "^2.0.1", "react-router-dom": "^5.2.0", - "react-select": "4.3.0", - "react-split-pane": "0.1.89", - "react-transition-group": "4.4.1", - "react-use": "17.2.4", - "react-virtualized-auto-sizer": "1.0.2", - "react-window": "1.8.5", - "redux": "4.1.1", - "redux-thunk": "2.3.0", - "regenerator-runtime": "0.13.3", - "reselect": "4.0.0", + "react-select": "5.2.1", + "react-split-pane": "0.1.92", + "react-transition-group": "4.4.2", + "react-use": "17.3.2", + "react-virtualized-auto-sizer": "1.0.6", + "react-window": "1.8.6", + "redux": "4.1.2", + "redux-thunk": "2.4.1", + "regenerator-runtime": "0.13.9", + "reselect": "4.1.5", "rst2html": "github:thoward/rst2html#990cb89f2a300cdd9151790be377c4c0840df809", - "rxjs": "7.3.0", - "search-query-parser": "1.5.4", - "selecto": "1.13.0", + "rxjs": "7.5.1", + "sass": "link:./public/sass", + "search-query-parser": "1.6.0", + "selecto": "1.13.2", "semver": "^7.1.3", "slate": "0.47.8", "slate-plain-serializer": "0.7.10", - "tether": "1.4.7", + "symbol-observable": "4.0.0", + "test": "link:./public/test", "tether-drop": "https://github.com/torkelo/drop", - "tinycolor2": "1.4.1", - "uplot": "1.6.16", - "uuid": "8.3.0", + "tinycolor2": "1.4.2", + "tslib": "2.3.1", + "uplot": "1.6.18", + "uuid": "8.3.2", + "vendor": "link:./public/vendor", "visjs-network": "4.25.0", - "whatwg-fetch": "3.1.0" + "whatwg-fetch": "3.6.2" }, "resolutions": { - "underscore": "1.12.1", + "underscore": "1.13.2", "@types/slate": "0.47.2", - "@microsoft/api-extractor-model": "7.13.13", - "@rushstack/node-core-library": "3.42.3", - "@rushstack/rig-package": "0.3.3", - "@rushstack/ts-command-line": "4.10.2" + "@microsoft/api-extractor-model": "7.15.3", + "@rushstack/node-core-library": "3.45.0", + "@rushstack/rig-package": "0.3.7", + "@rushstack/ts-command-line": "4.10.6", + "@storybook/react/webpack": "5.66.0" }, "workspaces": { "packages": [ @@ -361,7 +384,7 @@ ] }, "engines": { - "node": ">= 14" + "node": ">= 16" }, - "packageManager": "yarn@3.1.0-rc.5" + "packageManager": "yarn@3.1.1" } diff --git a/packages/README.md b/packages/README.md index 8fe4b89b63e..a31f196a7de 100644 --- a/packages/README.md +++ b/packages/README.md @@ -32,30 +32,6 @@ Every commit to main that has changes within the `packages` directory is a subje - ``` -Automatic prereleases are published under the `canary` dist tag to the [github package registry](https://docs.github.com/en/free-pro-team@latest/packages/publishing-and-managing-packages/about-github-packages). - -#### Consuming prereleases - -As mentioned above the `canary` releases are published to the Github package registry rather than the NPM registry. If you wish to make use of these prereleases please follow these steps: - -1. You must use a personal access token to install packages from Github. To create an access token [click here](https://github.com/settings/tokens) and create a token with the `read:packages` scope. Make a copy of the token. -2. Create / modify your `~/.npmrc` file with the following: - -``` -@grafana:registry=https://npm.pkg.github.com -//npm.pkg.github.com/:_authToken={INSERT_GH_TOKEN_HERE} -``` - -3. Update the package.json of your project to use either the `canary` channel or a version of the `canary` channel - -```json -// plugin's package.json -{ - ... - "@grafana/data": "canary" -} -``` - ### Manual release > All of the steps below must be performed on a release branch, according to Grafana Release Guide. @@ -71,6 +47,7 @@ As mentioned above the `canary` releases are published to the Github package reg - When releasing a prerelease run `packages:publishNext` to publish new versions. - When releasing a stable version run `packages:publishLatest` to publish new versions. + - When releasing a test version run `packages:publishTest` to publish test versions. 5. Push version commit to the release branch. diff --git a/packages/grafana-data/package.json b/packages/grafana-data/package.json index b66359958f9..047ceef1562 100644 --- a/packages/grafana-data/package.json +++ b/packages/grafana-data/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/data", - "version": "8.3.0-pre", + "version": "8.4.0-pre", "description": "Grafana Data Library", "keywords": [ "typescript" @@ -13,7 +13,6 @@ "directory": "packages/grafana-data" }, "main": "src/index.ts", - "types": "src/index.ts", "scripts": { "build": "grafana-toolkit package:build --scope=data", "bundle": "rollup -c rollup.config.ts", @@ -23,38 +22,56 @@ }, "dependencies": { "@braintree/sanitize-url": "5.0.2", - "@grafana/schema": "8.3.0-pre", - "@types/d3-interpolate": "^1.3.1", - "date-fns": "2.21.3", + "@grafana/schema": "8.4.0-pre", + "@types/d3-interpolate": "^1.4.0", + "d3-interpolate": "1.4.0", + "date-fns": "2.28.0", "eventemitter3": "4.0.7", "lodash": "4.17.21", - "marked": "2.0.1", - "rxjs": "7.3.0", - "xss": "1.0.6" + "marked": "4.0.9", + "moment": "2.29.1", + "moment-timezone": "0.5.34", + "ol": "6.9.0", + "papaparse": "5.3.1", + "react": "17.0.2", + "react-dom": "17.0.2", + "regenerator-runtime": "0.13.9", + "rxjs": "7.5.1", + "tslib": "2.3.1", + "uplot": "1.6.18", + "xss": "1.0.10" }, "devDependencies": { "@grafana/tsconfig": "^1.0.0-rc1", - "@rollup/plugin-commonjs": "16.0.0", + "@rollup/plugin-commonjs": "21.0.1", "@rollup/plugin-json": "4.1.0", - "@rollup/plugin-node-resolve": "10.0.0", + "@rollup/plugin-node-resolve": "13.1.3", + "@swc/helpers": "0.3.2", + "@testing-library/dom": "8.11.1", + "@testing-library/jest-dom": "5.16.1", + "@testing-library/react": "12.1.2", + "@testing-library/react-hooks": "7.0.2", + "@testing-library/user-event": "13.5.0", "@types/braintree__sanitize-url": "4.1.0", - "@types/jest": "26.0.15", - "@types/jquery": "3.3.38", - "@types/lodash": "4.14.123", - "@types/marked": "1.1.0", - "@types/node": "14.17.27", - "@types/papaparse": "5.2.0", - "@types/react": "17.0.30", - "@types/rollup-plugin-visualizer": "4.2.1", + "@types/jest": "27.4.0", + "@types/jquery": "3.5.11", + "@types/lodash": "4.14.149", + "@types/marked": "4.0.1", + "@types/node": "16.11.19", + "@types/papaparse": "5.3.1", + "@types/react": "17.0.38", + "@types/react-dom": "17.0.11", "@types/sinon": "^10.0.4", - "rollup": "2.33.3", + "@types/testing-library__jest-dom": "5.14.2", + "@types/testing-library__react-hooks": "^3.2.0", + "@types/tinycolor2": "1.4.3", + "react-test-renderer": "17.0.2", + "rimraf": "3.0.2", + "rollup": "2.63.0", "rollup-plugin-sourcemaps": "0.6.3", "rollup-plugin-terser": "7.0.2", - "rollup-plugin-typescript2": "0.29.0", - "rollup-plugin-visualizer": "4.2.0", - "sinon": "8.1.1", - "tinycolor2": "1.4.1", - "tslib": "2.3.1", - "typescript": "4.4.3" + "sinon": "12.0.1", + "tinycolor2": "1.4.2", + "typescript": "4.5.4" } } diff --git a/packages/grafana-data/rollup.config.ts b/packages/grafana-data/rollup.config.ts index 64c9c3c9457..980cb3e04e7 100644 --- a/packages/grafana-data/rollup.config.ts +++ b/packages/grafana-data/rollup.config.ts @@ -3,6 +3,7 @@ import commonjs from '@rollup/plugin-commonjs'; import sourceMaps from 'rollup-plugin-sourcemaps'; import json from '@rollup/plugin-json'; import { terser } from 'rollup-plugin-terser'; +import path from 'path'; const pkg = require('./package.json'); @@ -27,8 +28,9 @@ const buildCjsPackage = ({ env }) => { '@grafana/schema', // Load from host ], plugins: [ + resolve(), json({ - include: ['../../node_modules/moment-timezone/data/packed/latest.json'], + include: [path.relative('.', require.resolve('moment-timezone/data/packed/latest.json'))], // absolute path throws an error for whatever reason }), commonjs({ include: /node_modules/, diff --git a/packages/grafana-data/src/dataframe/StreamingDataFrame.ts b/packages/grafana-data/src/dataframe/StreamingDataFrame.ts deleted file mode 100644 index dbcfe20e916..00000000000 --- a/packages/grafana-data/src/dataframe/StreamingDataFrame.ts +++ /dev/null @@ -1,365 +0,0 @@ -import { Field, DataFrame, FieldType, Labels, QueryResultMeta } from '../types'; -import { ArrayVector } from '../vector'; -import { DataFrameJSON, decodeFieldValueEntities, FieldSchema } from './DataFrameJSON'; -import { guessFieldTypeFromValue } from './processDataFrame'; -import { join } from '../transformations/transformers/joinDataFrames'; -import { AlignedData } from 'uplot'; - -/** - * Indicate if the frame is appened or replace - * - * @public -- but runtime - */ -export enum StreamingFrameAction { - Append = 'append', - Replace = 'replace', -} - -/** - * Stream packet info is attached to StreamingDataFrames and indicate how many - * rows were added to the end of the frame. The number of discarded rows can be - * calculated from previous state - * - * @public -- but runtime - */ -export interface StreamPacketInfo { - number: number; - action: StreamingFrameAction; - length: number; -} - -/** - * @alpha - */ -export interface StreamingFrameOptions { - maxLength?: number; // 1000 - maxDelta?: number; // how long to keep things - action?: StreamingFrameAction; // default will append -} - -enum PushMode { - wide, - labels, - // long -} - -/** - * Unlike a circular buffer, this will append and periodically slice the front - * - * @alpha - */ -export class StreamingDataFrame implements DataFrame { - name?: string; - refId?: string; - meta: QueryResultMeta = {}; - - fields: Array>> = []; - length = 0; - - options: StreamingFrameOptions; - - private schemaFields: FieldSchema[] = []; - private timeFieldIndex = -1; - private pushMode = PushMode.wide; - private alwaysReplace = false; - - // current labels - private labels: Set = new Set(); - readonly packetInfo: StreamPacketInfo = { - number: 0, - action: StreamingFrameAction.Replace, - length: 0, - }; - - constructor(frame: DataFrameJSON, opts?: StreamingFrameOptions) { - this.options = { - maxLength: 1000, - maxDelta: Infinity, - ...opts, - }; - this.alwaysReplace = this.options.action === StreamingFrameAction.Replace; - - this.push(frame); - } - - /** - * apply the new message to the existing data. This will replace the existing schema - * if a new schema is included in the message, or append data matching the current schema - */ - push(msg: DataFrameJSON) { - const { schema, data } = msg; - - this.packetInfo.number++; - - if (schema) { - this.pushMode = PushMode.wide; - this.timeFieldIndex = schema.fields.findIndex((f) => f.type === FieldType.time); - if ( - this.timeFieldIndex === 1 && - schema.fields[0].name === 'labels' && - schema.fields[0].type === FieldType.string - ) { - this.pushMode = PushMode.labels; - this.timeFieldIndex = 0; // after labels are removed! - } - - const niceSchemaFields = this.pushMode === PushMode.labels ? schema.fields.slice(1) : schema.fields; - - this.refId = schema.refId; - if (schema.meta) { - this.meta = { ...schema.meta }; - } - - if (hasSameStructure(this.schemaFields, niceSchemaFields)) { - const len = niceSchemaFields.length; - this.fields.forEach((f, idx) => { - const sf = niceSchemaFields[idx % len]; - f.config = sf.config ?? {}; - f.labels = sf.labels; - }); - } else { - const isWide = this.pushMode === PushMode.wide; - this.fields = niceSchemaFields.map((f) => { - return { - config: f.config ?? {}, - name: f.name, - labels: f.labels, - type: f.type ?? FieldType.other, - // transfer old values by type & name, unless we relied on labels to match fields - values: isWide - ? this.fields.find((of) => of.name === f.name && f.type === of.type)?.values ?? new ArrayVector() - : new ArrayVector(), - }; - }); - } - - this.schemaFields = niceSchemaFields; - } - - if (data && data.values.length && data.values[0].length) { - let { values, entities } = data; - - if (entities) { - entities.forEach((ents, i) => { - if (ents) { - decodeFieldValueEntities(ents, values[i]); - // TODO: append replacements to field - } - }); - } - - if (this.pushMode === PushMode.labels) { - // augment and transform data to match current schema for standard circPush() path - const labeledTables = transpose(values); - - // make sure fields are initalized for each label - for (const label of labeledTables.keys()) { - if (!this.labels.has(label)) { - this.addLabel(label); - } - } - - // TODO: cache higher up - let dummyTable = Array(this.schemaFields.length).fill([]); - - let tables: AlignedData[] = []; - this.labels.forEach((label) => { - tables.push(labeledTables.get(label) ?? dummyTable); - }); - - values = join(tables); - } - - if (values.length !== this.fields.length) { - if (this.fields.length) { - throw new Error( - `push message mismatch. Expected: ${this.fields.length}, recieved: ${values.length} (labels=${ - this.pushMode === PushMode.labels - })` - ); - } - - this.fields = values.map((vals, idx) => { - let name = `Field ${idx}`; - let type = guessFieldTypeFromValue(vals[0]); - const isTime = idx === 0 && type === FieldType.number && vals[0] > 1600016688632; - if (isTime) { - type = FieldType.time; - name = 'Time'; - } - - return { - name, - type, - config: {}, - values: new ArrayVector([]), - }; - }); - } - - let appended = values; - this.packetInfo.length = values[0].length; - - if (this.alwaysReplace || !this.length) { - this.packetInfo.action = StreamingFrameAction.Replace; - } else { - this.packetInfo.action = StreamingFrameAction.Append; - - // mutates appended - appended = this.fields.map((f) => f.values.buffer); - circPush(appended, values, this.options.maxLength, this.timeFieldIndex, this.options.maxDelta); - } - - appended.forEach((v, i) => { - const { state, values } = this.fields[i]; - values.buffer = v; - if (state) { - state.calcs = undefined; - } - }); - - // Update the frame length - this.length = appended[0].length; - } - } - - // adds a set of fields for a new label - private addLabel(label: string) { - let labelCount = this.labels.size; - - // parse labels - const parsedLabels: Labels = {}; - if (label.length) { - label.split(',').forEach((kv) => { - const [key, val] = kv.trim().split('='); - parsedLabels[key] = val; - }); - } - - if (labelCount === 0) { - // mutate existing fields and add labels - this.fields.forEach((f, i) => { - if (i > 0) { - f.labels = parsedLabels; - } - }); - } else { - for (let i = 1; i < this.schemaFields.length; i++) { - let proto = this.schemaFields[i] as Field; - - this.fields.push({ - ...proto, - config: proto.config ?? {}, - labels: parsedLabels, - values: new ArrayVector(Array(this.length).fill(undefined)), - }); - } - } - - this.labels.add(label); - } -} - -// converts vertical insertion records with table keys in [0] and column values in [1...N] -// to join()-able tables with column arrays -export function transpose(vrecs: any[][]) { - let tableKeys = new Set(vrecs[0]); - let tables = new Map(); - - tableKeys.forEach((key) => { - let cols = Array(vrecs.length - 1) - .fill(null) - .map(() => []); - - tables.set(key, cols); - }); - - for (let r = 0; r < vrecs[0].length; r++) { - let table = tables.get(vrecs[0][r]); - for (let c = 1; c < vrecs.length; c++) { - table[c - 1].push(vrecs[c][r]); - } - } - - return tables; -} - -// binary search for index of closest value -function closestIdx(num: number, arr: number[], lo?: number, hi?: number) { - let mid; - lo = lo || 0; - hi = hi || arr.length - 1; - let bitwise = hi <= 2147483647; - - while (hi - lo > 1) { - mid = bitwise ? (lo + hi) >> 1 : Math.floor((lo + hi) / 2); - - if (arr[mid] < num) { - lo = mid; - } else { - hi = mid; - } - } - - if (num - arr[lo] <= arr[hi] - num) { - return lo; - } - - return hi; -} - -/** - * @internal // not exported in yet - */ -export function getLastStreamingDataFramePacket(frame: DataFrame) { - const pi = (frame as StreamingDataFrame).packetInfo; - return pi?.action ? pi : undefined; -} - -// mutable circular push -function circPush(data: number[][], newData: number[][], maxLength = Infinity, deltaIdx = 0, maxDelta = Infinity) { - for (let i = 0; i < data.length; i++) { - data[i] = data[i].concat(newData[i]); - } - - const nlen = data[0].length; - - let sliceIdx = 0; - - if (nlen > maxLength) { - sliceIdx = nlen - maxLength; - } - - if (maxDelta !== Infinity && deltaIdx >= 0) { - const deltaLookup = data[deltaIdx]; - - const low = deltaLookup[sliceIdx]; - const high = deltaLookup[nlen - 1]; - - if (high - low > maxDelta) { - sliceIdx = closestIdx(high - maxDelta, deltaLookup, sliceIdx); - } - } - - if (sliceIdx) { - for (let i = 0; i < data.length; i++) { - data[i] = data[i].slice(sliceIdx); - } - } - - return sliceIdx; -} - -function hasSameStructure(a: FieldSchema[], b: FieldSchema[]): boolean { - if (a?.length !== b.length) { - return false; - } - for (let i = 0; i < a.length; i++) { - const fA = a[i]; - const fB = b[i]; - if (fA.name !== fB.name || fA.type !== fB.type) { - return false; - } - } - return true; -} diff --git a/packages/grafana-data/src/dataframe/index.ts b/packages/grafana-data/src/dataframe/index.ts index 1839b8af10f..3267885b2c0 100644 --- a/packages/grafana-data/src/dataframe/index.ts +++ b/packages/grafana-data/src/dataframe/index.ts @@ -6,6 +6,5 @@ export * from './processDataFrame'; export * from './dimensions'; export * from './ArrayDataFrame'; export * from './DataFrameJSON'; -export { StreamingDataFrame, StreamingFrameOptions, StreamingFrameAction } from './StreamingDataFrame'; export * from './frameComparisons'; export { anySeriesWithTimeField } from './utils'; diff --git a/packages/grafana-data/src/dataframe/processDataFrame.test.ts b/packages/grafana-data/src/dataframe/processDataFrame.test.ts index 7de45a267c1..29bc386967e 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.test.ts @@ -11,6 +11,7 @@ import { DataFrameDTO, FieldType, TableData, TimeSeries } from '../types/index'; import { dateTime } from '../datetime/moment_wrapper'; import { MutableDataFrame } from './MutableDataFrame'; import { ArrayDataFrame } from './ArrayDataFrame'; +import { getFieldTypeFromValue } from '.'; describe('toDataFrame', () => { it('converts timeseries to series', () => { @@ -118,15 +119,13 @@ describe('toDataFrame', () => { expect(guessFieldTypeFromValue('xxxx')).toBe(FieldType.string); }); - it('Guess Column Types from strings', () => { - expect(guessFieldTypeFromValue('1')).toBe(FieldType.number); - expect(guessFieldTypeFromValue('1.234')).toBe(FieldType.number); - expect(guessFieldTypeFromValue('NaN')).toBe(FieldType.number); - expect(guessFieldTypeFromValue('3.125e7')).toBe(FieldType.number); - expect(guessFieldTypeFromValue('True')).toBe(FieldType.boolean); - expect(guessFieldTypeFromValue('FALSE')).toBe(FieldType.boolean); - expect(guessFieldTypeFromValue('true')).toBe(FieldType.boolean); - expect(guessFieldTypeFromValue('xxxx')).toBe(FieldType.string); + it('Get column types from values', () => { + expect(getFieldTypeFromValue(1)).toBe(FieldType.number); + expect(getFieldTypeFromValue(1.234)).toBe(FieldType.number); + expect(getFieldTypeFromValue(NaN)).toBe(FieldType.number); + expect(getFieldTypeFromValue(3.125e7)).toBe(FieldType.number); + expect(getFieldTypeFromValue(true)).toBe(FieldType.boolean); + expect(getFieldTypeFromValue('xxxx')).toBe(FieldType.string); }); it('Guess Column Types from series', () => { @@ -174,6 +173,48 @@ describe('toDataFrame', () => { expect(v0.length).toEqual(1); expect(v0.get(0)).toEqual(input1.datapoints[0]); }); + + it('converts JSON response to dataframes', () => { + const msg = { + schema: { + fields: [ + { + name: 'First', + type: 'string', + }, + { + name: 'Second', + type: 'number', + }, + ], + }, + data: { + values: [ + ['2019-02-15', '2019-03-15', '2019-04-15'], + [3, 9, 16], + ], + }, + }; + const dataFrame = toDataFrame(msg); + expect(dataFrame.fields.map((f) => ({ [f.name]: f.values.toArray() }))).toMatchInlineSnapshot(` + Array [ + Object { + "First": Array [ + "2019-02-15", + "2019-03-15", + "2019-04-15", + ], + }, + Object { + "Second": Array [ + 3, + 9, + 16, + ], + }, + ] + `); + }); }); describe('SeriesData backwards compatibility', () => { diff --git a/packages/grafana-data/src/dataframe/processDataFrame.ts b/packages/grafana-data/src/dataframe/processDataFrame.ts index 33fe81aa8bb..954e6f29780 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.ts @@ -25,13 +25,14 @@ import { ArrayDataFrame } from './ArrayDataFrame'; import { getFieldDisplayName } from '../field/fieldState'; import { fieldIndexComparer } from '../field/fieldComparers'; import { vectorToArray } from '../vector/vectorToArray'; +import { dataFrameFromJSON } from './DataFrameJSON'; function convertTableToDataFrame(table: TableData): DataFrame { const fields = table.columns.map((c) => { // TODO: should be Column but type does not exists there so not sure whats up here. const { text, type, ...disp } = c as any; return { - name: text, // rename 'text' to the 'name' field + name: text?.length ? text : c, // rename 'text' to the 'name' field config: (disp || {}) as FieldConfig, values: new ArrayVector(), type: type && Object.values(FieldType).includes(type as FieldType) ? (type as FieldType) : FieldType.other, @@ -188,10 +189,33 @@ export function guessFieldTypeFromNameAndValue(name: string, v: any): FieldType return guessFieldTypeFromValue(v); } +/** + * Check the field type to see what the contents are + */ +export function getFieldTypeFromValue(v: any): FieldType { + if (v instanceof Date || isDateTime(v)) { + return FieldType.time; + } + + if (isNumber(v)) { + return FieldType.number; + } + + if (isString(v)) { + return FieldType.string; + } + + if (isBoolean(v)) { + return FieldType.boolean; + } + + return FieldType.other; +} + /** * Given a value this will guess the best column type * - * TODO: better Date/Time support! Look for standard date strings? + * NOTE: this is will try to see if string values can be mapped to other types (like number) */ export function guessFieldTypeFromValue(v: any): FieldType { if (v instanceof Date || isDateTime(v)) { @@ -236,7 +260,7 @@ export function guessFieldTypeForField(field: Field): FieldType | undefined { // 2. Check the first non-null value for (let i = 0; i < field.values.length; i++) { const v = field.values.get(i); - if (v !== null) { + if (v != null) { return guessFieldTypeFromValue(v); } } @@ -302,6 +326,9 @@ export function toDataFrame(data: any): DataFrame { } if (data.hasOwnProperty('data')) { + if (data.hasOwnProperty('schema')) { + return dataFrameFromJSON(data); + } return convertGraphSeriesToDataFrame(data); } @@ -443,7 +470,12 @@ export function getDataFrameRow(data: DataFrame, row: number): any[] { * Returns a copy that does not include functions */ export function toDataFrameDTO(data: DataFrame): DataFrameDTO { - const fields: FieldDTO[] = data.fields.map((f) => { + return toFilteredDataFrameDTO(data); +} + +export function toFilteredDataFrameDTO(data: DataFrame, fieldPredicate?: (f: Field) => boolean): DataFrameDTO { + const filteredFields = fieldPredicate ? data.fields.filter(fieldPredicate) : data.fields; + const fields: FieldDTO[] = filteredFields.map((f) => { let values = f.values.toArray(); // The byte buffers serialize like objects if (values instanceof Float64Array) { diff --git a/packages/grafana-data/src/datetime/datemath.ts b/packages/grafana-data/src/datetime/datemath.ts index 99dceeb4044..a14aceeb7e9 100644 --- a/packages/grafana-data/src/datetime/datemath.ts +++ b/packages/grafana-data/src/datetime/datemath.ts @@ -1,9 +1,13 @@ import { includes, isDate } from 'lodash'; -import { DateTime, dateTime, dateTimeForTimeZone, ISO_8601, isDateTime, DurationUnit } from './moment_wrapper'; +import { DateTime, dateTime, dateTimeForTimeZone, DurationUnit, isDateTime, ISO_8601 } from './moment_wrapper'; import { TimeZone } from '../types/index'; const units: DurationUnit[] = ['y', 'M', 'w', 'd', 'h', 'm', 's', 'Q']; +/** + * Determine if a string contains a relative date time. + * @param text + */ export function isMathString(text: string | DateTime | Date): boolean { if (!text) { return false; diff --git a/packages/grafana-data/src/datetime/durationutil.test.ts b/packages/grafana-data/src/datetime/durationutil.test.ts index e4c86091edd..c5b861191a2 100644 --- a/packages/grafana-data/src/datetime/durationutil.test.ts +++ b/packages/grafana-data/src/datetime/durationutil.test.ts @@ -18,12 +18,12 @@ describe('Duration util', () => { describe('parseDuration', () => { it('parses a duration string', () => { const durationString = '3M 5d 20m'; - expect(parseDuration(durationString)).toEqual({ months: '3', days: '5', minutes: '20' }); + expect(parseDuration(durationString)).toEqual({ months: 3, days: 5, minutes: 20 }); }); it('strips out non valid durations', () => { const durationString = '3M 6v 5b 4m'; - expect(parseDuration(durationString)).toEqual({ months: '3', minutes: '4' }); + expect(parseDuration(durationString)).toEqual({ months: 3, minutes: 4 }); }); }); @@ -45,9 +45,19 @@ describe('Duration util', () => { expect(isValidGoDuration(durationString)).toEqual(true); }); + it('valid float number duration string returns true', () => { + const durationString = '3.1h 4.0m 0.1s 2.11ms 0.03us 5.3333ns'; + expect(isValidGoDuration(durationString)).toEqual(true); + }); + it('invalid duration string returns false', () => { const durationString = '3M 6v 5b 4m'; expect(isValidGoDuration(durationString)).toEqual(false); }); + + it('invalid float number duration string returns false', () => { + const durationString = '3.h -4.0m 0.s 2.ms -0.us 5.ns'; + expect(isValidGoDuration(durationString)).toEqual(false); + }); }); }); diff --git a/packages/grafana-data/src/datetime/durationutil.ts b/packages/grafana-data/src/datetime/durationutil.ts index 9b318804936..73185a2c29b 100644 --- a/packages/grafana-data/src/datetime/durationutil.ts +++ b/packages/grafana-data/src/datetime/durationutil.ts @@ -35,19 +35,25 @@ export function intervalToAbbreviatedDurationString(interval: Interval, includeS /** * parseDuration parses duration string into datefns Duration object * - * @param duration - string to convert. For example '2m', '5h 20s' + * @param durationString - string to convert. For example '2m', '5h 20s' * * @public */ -export function parseDuration(duration: string): Duration { - return duration.split(' ').reduce((acc, value) => { +export function parseDuration(durationString: string): Duration { + return durationString.split(' ').reduce((acc, value) => { const match = value.match(/(\d+)(.+)/); - if (match === null || match.length !== 3) { + + const rawLength = match?.[1]; + const unit = match?.[2]; + + if (!(rawLength && unit)) { return acc; } - const key = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2]))?.[0]; - return !key ? acc : { ...acc, [key]: match[1] }; + const mapping = Object.entries(durationMap).find(([_, abbreviations]) => abbreviations?.includes(match[2])); + const length = parseInt(rawLength, 10); + + return mapping ? { ...acc, [mapping[0]]: length } : acc; }, {}); } @@ -124,7 +130,7 @@ export function isValidDuration(durationString: string): boolean { export function isValidGoDuration(durationString: string): boolean { const timeUnits = ['h', 'm', 's', 'ms', 'us', 'µs', 'ns']; for (const value of durationString.trim().split(' ')) { - const match = value.match(/(\d+)(.+)/); + const match = value.match(/([0-9]*[.]?[0-9]+)(.+)/); if (match === null || match.length !== 3) { return false; } diff --git a/packages/grafana-data/src/datetime/timezones.ts b/packages/grafana-data/src/datetime/timezones.ts index 2d89ff3d141..b1528a66aaa 100644 --- a/packages/grafana-data/src/datetime/timezones.ts +++ b/packages/grafana-data/src/datetime/timezones.ts @@ -48,11 +48,13 @@ export const getTimeZoneInfo = (zone: string, timestamp: number): TimeZoneInfo | return mapToInfo(zone, timestamp); }; -export const getTimeZones = memoize((includeInternal = false): TimeZone[] => { +export const getTimeZones = memoize((includeInternal: boolean | InternalTimeZones[] = false): TimeZone[] => { const initial: TimeZone[] = []; - if (includeInternal) { - initial.push.apply(initial, [InternalTimeZones.default, InternalTimeZones.localBrowserTime, InternalTimeZones.utc]); + if (includeInternal === true) { + initial.push(InternalTimeZones.default, InternalTimeZones.localBrowserTime, InternalTimeZones.utc); + } else if (includeInternal) { + initial.push(...includeInternal); } return moment.tz.names().reduce((zones: TimeZone[], zone: string) => { @@ -67,32 +69,34 @@ export const getTimeZones = memoize((includeInternal = false): TimeZone[] => { }, initial); }); -export const getTimeZoneGroups = memoize((includeInternal = false): GroupedTimeZones[] => { - const timeZones = getTimeZones(includeInternal); +export const getTimeZoneGroups = memoize( + (includeInternal: boolean | InternalTimeZones[] = false): GroupedTimeZones[] => { + const timeZones = getTimeZones(includeInternal); - const groups = timeZones.reduce((groups: Record, zone: TimeZone) => { - const delimiter = zone.indexOf('/'); + const groups = timeZones.reduce((groups: Record, zone: TimeZone) => { + const delimiter = zone.indexOf('/'); - if (delimiter === -1) { - const group = ''; + if (delimiter === -1) { + const group = ''; + groups[group] = groups[group] ?? []; + groups[group].push(zone); + + return groups; + } + + const group = zone.substr(0, delimiter); groups[group] = groups[group] ?? []; groups[group].push(zone); return groups; - } + }, {}); - const group = zone.substr(0, delimiter); - groups[group] = groups[group] ?? []; - groups[group].push(zone); - - return groups; - }, {}); - - return Object.keys(groups).map((name) => ({ - name, - zones: groups[name], - })); -}); + return Object.keys(groups).map((name) => ({ + name, + zones: groups[name], + })); + } +); const mapInternal = (zone: string, timestamp: number): TimeZoneInfo | undefined => { switch (zone) { diff --git a/packages/grafana-data/src/field/displayProcessor.test.ts b/packages/grafana-data/src/field/displayProcessor.test.ts index c28c2f87be8..0c301915ba8 100644 --- a/packages/grafana-data/src/field/displayProcessor.test.ts +++ b/packages/grafana-data/src/field/displayProcessor.test.ts @@ -70,11 +70,11 @@ describe('Process simple display values', () => { }); it('array of text', () => { - assertSame(['a', 'b', 'c'], processors, { text: 'a,b,c', numeric: NaN }); + assertSame(['a', 'b', 'c'], processors, { text: 'a, b, c', numeric: NaN }); }); it('array of numbers', () => { - assertSame([1, 2, 3], processors, { text: '1,2,3', numeric: NaN }); + assertSame([1, 2, 3], processors, { text: '1, 2, 3', numeric: NaN }); }); it('empty object', () => { diff --git a/packages/grafana-data/src/field/displayProcessor.ts b/packages/grafana-data/src/field/displayProcessor.ts index 28db9b6611f..6abc7202714 100644 --- a/packages/grafana-data/src/field/displayProcessor.ts +++ b/packages/grafana-data/src/field/displayProcessor.ts @@ -1,5 +1,5 @@ // Libraries -import { toString, toNumber as _toNumber, isEmpty, isBoolean } from 'lodash'; +import { toString, toNumber as _toNumber, isEmpty, isBoolean, isArray, join } from 'lodash'; // Types import { Field, FieldType } from '../types/dataFrame'; @@ -116,6 +116,10 @@ export function getDisplayProcessor(options?: DisplayProcessorOptions): DisplayP } } + if (text == null && isArray(value)) { + text = join(value, ', '); + } + if (text == null) { text = toString(value); if (!text) { diff --git a/packages/grafana-data/src/field/fieldOverrides.ts b/packages/grafana-data/src/field/fieldOverrides.ts index d0a1e9d56ef..157277be009 100644 --- a/packages/grafana-data/src/field/fieldOverrides.ts +++ b/packages/grafana-data/src/field/fieldOverrides.ts @@ -209,7 +209,7 @@ export function applyFieldOverrides(options: ApplyFieldOverrideOptions): DataFra // via field.display(value). this can potentially be removed once we... // 1. process data packets incrementally and/if cache the results in the streaming datafame (maybe by buffer index) // 2. have the ability to selectively get display color or text (but not always both, which are each quite expensive) -// 3. sufficently optimize text formating and threshold color determinitation +// 3. sufficently optimize text formatting and threshold color determinitation function cachingDisplayProcessor(disp: DisplayProcessor, maxCacheSize = 2500): DisplayProcessor { const cache = new Map(); diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx index 685824158c5..0efbb4e1ffd 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.test.tsx @@ -1,6 +1,6 @@ import { getFieldDisplayValuesProxy } from './getFieldDisplayValuesProxy'; import { applyFieldOverrides } from './fieldOverrides'; -import { toDataFrame } from '../dataframe'; +import { MutableDataFrame, toDataFrame } from '../dataframe'; import { createTheme } from '../themes'; describe('getFieldDisplayValuesProxy', () => { @@ -81,4 +81,14 @@ describe('getFieldDisplayValuesProxy', () => { expect(p.xyz).toBeUndefined(); expect(p[100]).toBeUndefined(); }); + + it('should use default display processor if display is not defined', () => { + const p = getFieldDisplayValuesProxy({ + frame: new MutableDataFrame({ fields: [{ name: 'test', values: [1, 2] }] }), + rowIndex: 0, + }); + expect(p.test.text).toBe('1'); + expect(p.test.numeric).toBe(1); + expect(p.test.toString()).toBe('1'); + }); }); diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts index 255cc7b5714..4faec716e4a 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts @@ -1,11 +1,14 @@ import { toNumber } from 'lodash'; import { DataFrame, DisplayValue, TimeZone } from '../types'; import { formattedValueToString } from '../valueFormats'; +import { getDisplayProcessor } from './displayProcessor'; /** + * Creates a proxy object that allows accessing fields on dataFrame through various means and then returns it's + * display value. This is mainly useful for example in data links interpolation where you can easily create a scoped + * variable that will allow you to access dataFrame data with ${__data.fields.fieldName}. + * Allows accessing fields by name, index, displayName or 'name' label * - * @param frame - * @param rowIndex * @param options * @internal */ @@ -15,7 +18,7 @@ export function getFieldDisplayValuesProxy(options: { timeZone?: TimeZone; }): Record { return new Proxy({} as Record, { - get: (obj: any, key: string) => { + get: (obj: any, key: string): DisplayValue | undefined => { // 1. Match the name let field = options.frame.fields.find((f) => key === f.name); if (!field) { @@ -39,11 +42,11 @@ export function getFieldDisplayValuesProxy(options: { if (!field) { return undefined; } - if (!field.display) { - throw new Error('Field missing display processor ' + field.name); - } + // TODO: we could supply the field here for the getDisplayProcessor fallback but we would also need theme which + // we do not have access to here + const displayProcessor = field.display ?? getDisplayProcessor(); const raw = field.values.get(options.rowIndex); - const disp = field.display(raw); + const disp = displayProcessor(raw); disp.toString = () => formattedValueToString(disp); return disp; }, diff --git a/packages/grafana-data/src/field/overrides/processors.ts b/packages/grafana-data/src/field/overrides/processors.ts index 55d16aa4b6d..1ba88fab1a9 100644 --- a/packages/grafana-data/src/field/overrides/processors.ts +++ b/packages/grafana-data/src/field/overrides/processors.ts @@ -1,5 +1,12 @@ -import { ComponentType } from 'react'; -import { DataLink, Field, FieldOverrideContext, SelectableValue, ThresholdsConfig, ValueMapping } from '../../types'; +import { + DataLink, + Field, + FieldOverrideContext, + SelectableValue, + SliderMarks, + ThresholdsConfig, + ValueMapping, +} from '../../types'; export const identityOverrideProcessor = (value: T, _context: FieldOverrideContext, _settings: any) => { return value; @@ -39,6 +46,8 @@ export interface SliderFieldConfigSettings { min: number; max: number; step?: number; + included?: boolean; + marks?: SliderMarks; ariaLabelForHandle?: string; } @@ -163,11 +172,6 @@ export interface StatsPickerConfigSettings { defaultStat?: string; } -interface FieldNamePickerInfoProps { - name?: string; - field?: Field; -} - export interface FieldNamePickerConfigSettings { /** * Function is a predicate, to test each element of the array. @@ -180,13 +184,7 @@ export interface FieldNamePickerConfigSettings { */ noFieldsMessage?: string; - /** - * When a field is selected, this component can show aditional - * information, including validation etc - */ - info?: ComponentType | null; - - /** + /**addFieldNamePicker * Sets the width to a pixel value. */ width?: number; diff --git a/packages/grafana-data/src/geo/layer.ts b/packages/grafana-data/src/geo/layer.ts index c954c495d96..48757bcebd4 100644 --- a/packages/grafana-data/src/geo/layer.ts +++ b/packages/grafana-data/src/geo/layer.ts @@ -49,7 +49,7 @@ export interface FrameGeometrySource { */ export interface MapLayerOptions { type: string; - name?: string; // configured display name + name: string; // configured unique display name // Custom options depending on the type config?: TConfig; @@ -61,15 +61,23 @@ export interface MapLayerOptions { // https://openlayers.org/en/latest/apidoc/module-ol_layer_Base-BaseLayer.html // Layer opacity (0-1) opacity?: number; + + //Check tooltip + tooltip?: boolean; } /** * @alpha */ -export interface MapLayerHandler { +export interface MapLayerHandler { init: () => BaseLayer; update?: (data: PanelData) => void; legend?: ReactNode; + + /** + * Show custom elements in the panel edit UI + */ + registerOptionsUI?: (builder: PanelOptionsEditorBuilder>) => void; } /** @@ -98,9 +106,4 @@ export interface MapLayerRegistryItem extends Registr * @param options */ create: (map: Map, options: MapLayerOptions, theme: GrafanaTheme2) => Promise; - - /** - * Show custom elements in the panel edit UI - */ - registerOptionsUI?: (builder: PanelOptionsEditorBuilder>) => void; } diff --git a/packages/grafana-data/src/panel/PanelPlugin.ts b/packages/grafana-data/src/panel/PanelPlugin.ts index 8ad6ea3ce18..a2efd5cb665 100644 --- a/packages/grafana-data/src/panel/PanelPlugin.ts +++ b/packages/grafana-data/src/panel/PanelPlugin.ts @@ -8,6 +8,7 @@ import { PanelTypeChangedHandler, FieldConfigProperty, PanelPluginDataSupport, + VisualizationSuggestionsSupplier, } from '../types'; import { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders'; import { ComponentClass, ComponentType } from 'react'; @@ -104,6 +105,7 @@ export class PanelPlugin< }; private optionsSupplier?: PanelOptionsSupplier; + private suggestionsSupplier?: VisualizationSuggestionsSupplier; panel: ComponentType> | null; editor?: ComponentClass>; @@ -354,4 +356,21 @@ export class PanelPlugin< return this; } + + /** + * Sets function that can return visualization examples and suggestions. + * @alpha + */ + setSuggestionsSupplier(supplier: VisualizationSuggestionsSupplier) { + this.suggestionsSupplier = supplier; + return this; + } + + /** + * Returns the suggestions supplier + * @alpha + */ + getSuggestionsSupplier(): VisualizationSuggestionsSupplier | undefined { + return this.suggestionsSupplier; + } } diff --git a/packages/grafana-data/src/text/index.ts b/packages/grafana-data/src/text/index.ts index bece68920ac..76470eaa838 100644 --- a/packages/grafana-data/src/text/index.ts +++ b/packages/grafana-data/src/text/index.ts @@ -1,11 +1,12 @@ export * from './string'; export * from './markdown'; export * from './text'; -import { escapeHtml, hasAnsiCodes, sanitize, sanitizeUrl } from './sanitize'; +import { escapeHtml, hasAnsiCodes, sanitize, sanitizeUrl, sanitizeTextPanelContent } from './sanitize'; export const textUtil = { escapeHtml, hasAnsiCodes, sanitize, + sanitizeTextPanelContent, sanitizeUrl, }; diff --git a/packages/grafana-data/src/text/markdown.test.ts b/packages/grafana-data/src/text/markdown.test.ts index ed51f2c28a2..b9e7052c3ef 100644 --- a/packages/grafana-data/src/text/markdown.test.ts +++ b/packages/grafana-data/src/text/markdown.test.ts @@ -1,4 +1,5 @@ import { renderMarkdown } from './markdown'; +import { sanitizeTextPanelContent } from './sanitize'; describe('Markdown wrapper', () => { it('should be able to handle undefined value', () => { @@ -10,4 +11,13 @@ describe('Markdown wrapper', () => { const str = renderMarkdown(''); expect(str).toBe('<script>alert()</script>'); }); + + it('should allow whitelisted styles in text panel', () => { + const html = + '
'; + const str = sanitizeTextPanelContent(html); + expect(str).toBe( + '
' + ); + }); }); diff --git a/packages/grafana-data/src/text/markdown.ts b/packages/grafana-data/src/text/markdown.ts index 4c9b369e291..a87d0f0bb54 100644 --- a/packages/grafana-data/src/text/markdown.ts +++ b/packages/grafana-data/src/text/markdown.ts @@ -1,5 +1,5 @@ -import marked from 'marked'; -import { sanitize } from './sanitize'; +import { marked } from 'marked'; +import { sanitize, sanitizeTextPanelContent } from './sanitize'; let hasInitialized = false; @@ -7,15 +7,17 @@ export interface RenderMarkdownOptions { noSanitize?: boolean; } +const markdownOptions = { + pedantic: false, + gfm: true, + smartLists: true, + smartypants: false, + xhtml: false, +}; + export function renderMarkdown(str?: string, options?: RenderMarkdownOptions): string { if (!hasInitialized) { - marked.setOptions({ - pedantic: false, - gfm: true, - smartLists: true, - smartypants: false, - xhtml: false, - }); + marked.setOptions({ ...markdownOptions }); hasInitialized = true; } @@ -26,3 +28,17 @@ export function renderMarkdown(str?: string, options?: RenderMarkdownOptions): s return sanitize(html); } + +export function renderTextPanelMarkdown(str?: string, options?: RenderMarkdownOptions): string { + if (!hasInitialized) { + marked.setOptions({ ...markdownOptions }); + hasInitialized = true; + } + + const html = marked(str || ''); + if (options?.noSanitize) { + return html; + } + + return sanitizeTextPanelContent(html); +} diff --git a/packages/grafana-data/src/text/sanitize.ts b/packages/grafana-data/src/text/sanitize.ts index d32c4a96178..4a298f88db7 100644 --- a/packages/grafana-data/src/text/sanitize.ts +++ b/packages/grafana-data/src/text/sanitize.ts @@ -1,16 +1,38 @@ -import xss from 'xss'; +import * as xss from 'xss'; import { sanitizeUrl as braintreeSanitizeUrl } from '@braintree/sanitize-url'; const XSSWL = Object.keys(xss.whiteList).reduce((acc, element) => { - // @ts-ignore - acc[element] = xss.whiteList[element].concat(['class', 'style']); + acc[element] = xss.whiteList[element]?.concat(['class', 'style']); return acc; -}, {}); +}, {} as xss.IWhiteList); const sanitizeXSS = new xss.FilterXSS({ whiteList: XSSWL, }); +const sanitizeTextPanelWhitelist = new xss.FilterXSS({ + whiteList: XSSWL, + css: { + whiteList: { + ...xss.getDefaultCSSWhiteList(), + 'flex-direction': true, + 'flex-wrap': true, + 'flex-basis': true, + 'flex-grow': true, + 'flex-shrink': true, + 'flex-flow': true, + gap: true, + order: true, + 'justify-content': true, + 'justify-items': true, + 'justify-self': true, + 'align-items': true, + 'align-content': true, + 'align-self': true, + }, + }, +}); + /** * Returns string safe from XSS attacks. * @@ -27,6 +49,15 @@ export function sanitize(unsanitizedString: string): string { } } +export function sanitizeTextPanelContent(unsanitizedString: string): string { + try { + return sanitizeTextPanelWhitelist.process(unsanitizedString); + } catch (error) { + console.error('String could not be sanitized', unsanitizedString); + return 'Text string could not be sanitized'; + } +} + export function sanitizeUrl(url: string): string { return braintreeSanitizeUrl(url); } diff --git a/packages/grafana-data/src/themes/createColors.ts b/packages/grafana-data/src/themes/createColors.ts index aaee1dc9a71..c98098d54f8 100644 --- a/packages/grafana-data/src/themes/createColors.ts +++ b/packages/grafana-data/src/themes/createColors.ts @@ -96,7 +96,7 @@ class DarkColors implements ThemeColorsBase> { text = { primary: `rgb(${this.whiteBase})`, secondary: `rgba(${this.whiteBase}, 0.65)`, - disabled: `rgba(${this.whiteBase}, 0.57)`, + disabled: `rgba(${this.whiteBase}, 0.6)`, link: palette.blueDarkText, maxContrast: palette.white, }; diff --git a/packages/grafana-data/src/themes/createSpacing.ts b/packages/grafana-data/src/themes/createSpacing.ts index 9953c915f09..57f35b90b2d 100644 --- a/packages/grafana-data/src/themes/createSpacing.ts +++ b/packages/grafana-data/src/themes/createSpacing.ts @@ -17,7 +17,7 @@ export type ThemeSpacingArgument = number | string; * tslint:disable:unified-signatures */ export interface ThemeSpacing { (): string; - (value: number): string; + (value: ThemeSpacingArgument): string; (topBottom: ThemeSpacingArgument, rightLeft: ThemeSpacingArgument): string; (top: ThemeSpacingArgument, rightLeft: ThemeSpacingArgument, bottom: ThemeSpacingArgument): string; ( diff --git a/packages/grafana-data/src/themes/palette.ts b/packages/grafana-data/src/themes/palette.ts index bbe04cf1264..2ac623b3da0 100644 --- a/packages/grafana-data/src/themes/palette.ts +++ b/packages/grafana-data/src/themes/palette.ts @@ -1,6 +1,6 @@ export const palette = { - white: '#fff', - black: '#000', + white: '#FFFFFF', + black: '#000000', gray25: '#2c3235', gray15: '#22252b', //'#202226', diff --git a/packages/grafana-data/src/transformations/matchers/valueMatchers/numericMatchers.ts b/packages/grafana-data/src/transformations/matchers/valueMatchers/numericMatchers.ts index 129b659884f..339cb0554dc 100644 --- a/packages/grafana-data/src/transformations/matchers/valueMatchers/numericMatchers.ts +++ b/packages/grafana-data/src/transformations/matchers/valueMatchers/numericMatchers.ts @@ -26,7 +26,7 @@ const isGreaterValueMatcher: ValueMatcherInfo> const isGreaterOrEqualValueMatcher: ValueMatcherInfo> = { id: ValueMatcherID.greaterOrEqual, name: 'Is greater or equal', - description: 'Match when field value is lower or greater than option.', + description: 'Match when field value is greater than or equal to option.', get: (options) => { return (valueIndex: number, field: Field) => { const value = field.values.get(valueIndex); @@ -37,7 +37,7 @@ const isGreaterOrEqualValueMatcher: ValueMatcherInfo { - return `Matches all rows where field value is lower or greater than: ${options.value}.`; + return `Matches all rows where field value is greater than or equal to: ${options.value}.`; }, isApplicable: (field) => field.type === FieldType.number, getDefaultOptions: () => ({ value: 0 }), diff --git a/packages/grafana-data/src/transformations/transformers/convertFieldType.test.ts b/packages/grafana-data/src/transformations/transformers/convertFieldType.test.ts index cccbfb63b2f..8c74f1edbcd 100644 --- a/packages/grafana-data/src/transformations/transformers/convertFieldType.test.ts +++ b/packages/grafana-data/src/transformations/transformers/convertFieldType.test.ts @@ -1,8 +1,14 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType } from '../../types/dataFrame'; +import { Field, FieldType } from '../../types/dataFrame'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { ArrayVector } from '../../vector'; -import { ensureTimeField, convertFieldType, convertFieldTypes, convertFieldTypeTransformer } from './convertFieldType'; +import { + ensureTimeField, + convertFieldType, + convertFieldTypes, + convertFieldTypeTransformer, + fieldToTimeField, +} from './convertFieldType'; describe('field convert type', () => { it('will parse properly formatted strings to time', () => { @@ -177,6 +183,87 @@ describe('field convert types transformer', () => { ]); }); + it('will convert field to complex objects', () => { + const options = { + conversions: [ + { targetField: 'numbers', destinationType: FieldType.other }, + { targetField: 'objects', destinationType: FieldType.other }, + { targetField: 'arrays', destinationType: FieldType.other }, + { targetField: 'invalids', destinationType: FieldType.other }, + { targetField: 'mixed', destinationType: FieldType.other }, + ], + }; + + const comboTypes = toDataFrame({ + fields: [ + { + name: 'numbers', + type: FieldType.number, + values: [-1, 1, null], + }, + { + name: 'objects', + type: FieldType.string, + values: [ + '{ "neg": -100, "zero": 0, "pos": 1, "null": null, "array": [0, 1, 2], "nested": { "number": 1 } }', + '{ "string": "abcd" }', + '{}', + ], + }, + { + name: 'arrays', + type: FieldType.string, + values: ['[true]', '[99]', '["2021-08-02 00:00:00.000"]'], + }, + { + name: 'invalids', + type: FieldType.string, + values: ['abcd', '{ invalidJson }', '[unclosed array'], + }, + { + name: 'mixed', + type: FieldType.string, + values: [ + '{ "neg": -100, "zero": 0, "pos": 1, "null": null, "array": [0, 1, 2], "nested": { "number": 1 } }', + '["a string", 1234, {"a complex": "object"}]', + '["this is invalid JSON]', + ], + }, + ], + }); + + const complex = convertFieldTypes(options, [comboTypes]); + expect( + complex[0].fields.map((f) => ({ + type: f.type, + values: f.values.toArray(), + })) + ).toEqual([ + { + type: FieldType.other, + values: [-1, 1, null], + }, + { + type: FieldType.other, + values: [ + { neg: -100, zero: 0, pos: 1, null: null, array: [0, 1, 2], nested: { number: 1 } }, + { string: 'abcd' }, + {}, + ], + }, + { type: FieldType.other, values: [[true], [99], ['2021-08-02 00:00:00.000']] }, + { type: FieldType.other, values: [null, null, null] }, + { + type: FieldType.other, + values: [ + { neg: -100, zero: 0, pos: 1, null: null, array: [0, 1, 2], nested: { number: 1 } }, + ['a string', 1234, { 'a complex': 'object' }], + null, + ], + }, + ]); + }); + it('will convert field to strings', () => { const options = { conversions: [{ targetField: 'numbers', destinationType: FieldType.string }], @@ -233,3 +320,24 @@ describe('ensureTimeField', () => { }); }); }); + +describe('fieldToTimeField', () => { + // this needs to run in a non-UTC timezone env to ensure the parsing is not dependent on env tz settings + //process.env.TZ = 'Pacific/Easter'; + + it('should always parse ISO 8601 date strings in UTC timezone (e.g. 2011-10-05T14:48:00.000Z)', () => { + const stringTimeField: Field = { + config: {}, + name: 'ISO 8601 date strings', + type: FieldType.time, + values: new ArrayVector(['2021-11-11T19:45:00.000Z']), + }; + + expect(fieldToTimeField(stringTimeField)).toEqual({ + config: {}, + name: 'ISO 8601 date strings', + type: FieldType.time, + values: new ArrayVector([1636659900000]), + }); + }); +}); diff --git a/packages/grafana-data/src/transformations/transformers/convertFieldType.ts b/packages/grafana-data/src/transformations/transformers/convertFieldType.ts index 8cb8c95b454..967bdccaa38 100644 --- a/packages/grafana-data/src/transformations/transformers/convertFieldType.ts +++ b/packages/grafana-data/src/transformations/transformers/convertFieldType.ts @@ -99,11 +99,16 @@ export function convertFieldType(field: Field, opts: ConvertFieldTypeOptions): F return fieldToStringField(field); case FieldType.boolean: return fieldToBooleanField(field); + case FieldType.other: + return fieldToComplexField(field); default: return field; } } +// matches ISO 8601, e.g. 2021-11-11T19:45:00.000Z (float portion optional) +const iso8601Regex = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{3})?Z$/; + /** * @internal */ @@ -112,9 +117,13 @@ export function fieldToTimeField(field: Field, dateFormat?: string): Field { const timeValues = field.values.toArray().slice(); + let firstDefined = timeValues.find((v) => v != null); + + let isISO8601 = typeof firstDefined === 'string' && iso8601Regex.test(firstDefined); + for (let t = 0; t < timeValues.length; t++) { if (timeValues[t]) { - let parsed = dateTimeParse(timeValues[t], opts).valueOf(); + let parsed = isISO8601 ? Date.parse(timeValues[t]) : dateTimeParse(timeValues[t], opts).valueOf(); timeValues[t] = Number.isFinite(parsed) ? parsed : null; } else { timeValues[t] = null; @@ -171,6 +180,24 @@ function fieldToStringField(field: Field): Field { }; } +function fieldToComplexField(field: Field): Field { + const complexValues = field.values.toArray().slice(); + + for (let s = 0; s < complexValues.length; s++) { + try { + complexValues[s] = JSON.parse(complexValues[s]); + } catch { + complexValues[s] = null; + } + } + + return { + ...field, + type: FieldType.other, + values: new ArrayVector(complexValues), + }; +} + /** * Checks the first value. Assumes any number should be time fieldtype. Otherwise attempts to make the fieldtype time. * @param field - field to ensure is a time fieldtype diff --git a/packages/grafana-data/src/transformations/transformers/groupBy.test.ts b/packages/grafana-data/src/transformations/transformers/groupBy.test.ts index 337de2f9b26..76e420f61f6 100644 --- a/packages/grafana-data/src/transformations/transformers/groupBy.test.ts +++ b/packages/grafana-data/src/transformations/transformers/groupBy.test.ts @@ -260,4 +260,50 @@ describe('GroupBy transformer', () => { expect(result[1].fields).toEqual(expectedB); }); }); + + it('should group values and keep the order of the fields', async () => { + const testSeries = toDataFrame({ + name: 'A', + fields: [ + { name: 'message', type: FieldType.string, values: ['500', '404', '404', 'one', 'one', 'two', '200'] }, + { name: 'values', type: FieldType.number, values: [1, 2, 2, 3, 3, 3, 4] }, + ], + }); + + const cfg: DataTransformerConfig = { + id: DataTransformerID.groupBy, + options: { + fields: { + message: { + operation: GroupByOperationID.groupBy, + aggregations: [], + }, + values: { + operation: GroupByOperationID.aggregate, + aggregations: [ReducerID.sum], + }, + }, + }, + }; + + await expect(transformDataFrame([cfg], [testSeries])).toEmitValuesWith((received) => { + const result = received[0]; + const expected: Field[] = [ + { + name: 'message', + type: FieldType.string, + values: new ArrayVector(['500', '404', 'one', 'two', '200']), + config: {}, + }, + { + name: 'values (sum)', + type: FieldType.number, + values: new ArrayVector([1, 4, 6, 3, 4]), + config: {}, + }, + ]; + + expect(result[0].fields).toEqual(expected); + }); + }); }); diff --git a/packages/grafana-data/src/transformations/transformers/groupBy.ts b/packages/grafana-data/src/transformations/transformers/groupBy.ts index ae70dbab820..be1763833d2 100644 --- a/packages/grafana-data/src/transformations/transformers/groupBy.ts +++ b/packages/grafana-data/src/transformations/transformers/groupBy.ts @@ -63,13 +63,13 @@ export const groupByTransformer: DataTransformerInfo // Group the values by fields and groups so we can get all values for a // group for a given field. - const valuesByGroupKey: Record> = {}; + const valuesByGroupKey = new Map>(); for (let rowIndex = 0; rowIndex < frame.length; rowIndex++) { const groupKey = String(groupByFields.map((field) => field.values.get(rowIndex))); - const valuesByField = valuesByGroupKey[groupKey] ?? {}; + const valuesByField = valuesByGroupKey.get(groupKey) ?? {}; - if (!valuesByGroupKey[groupKey]) { - valuesByGroupKey[groupKey] = valuesByField; + if (!valuesByGroupKey.has(groupKey)) { + valuesByGroupKey.set(groupKey, valuesByField); } for (let field of frame.fields) { @@ -89,16 +89,14 @@ export const groupByTransformer: DataTransformerInfo } const fields: Field[] = []; - const groupKeys = Object.keys(valuesByGroupKey); for (const field of groupByFields) { const values = new ArrayVector(); const fieldName = getFieldDisplayName(field); - for (let key of groupKeys) { - const valuesByField = valuesByGroupKey[key]; - values.add(valuesByField[fieldName].values.get(0)); - } + valuesByGroupKey.forEach((value) => { + values.add(value[fieldName].values.get(0)); + }); fields.push({ name: field.name, @@ -120,8 +118,8 @@ export const groupByTransformer: DataTransformerInfo const aggregations = options.fields[fieldName].aggregations; const valuesByAggregation: Record = {}; - for (const groupKey of groupKeys) { - const fieldWithValuesForGroup = valuesByGroupKey[groupKey][fieldName]; + valuesByGroupKey.forEach((value) => { + const fieldWithValuesForGroup = value[fieldName]; const results = reduceField({ field: fieldWithValuesForGroup, reducers: aggregations, @@ -133,7 +131,7 @@ export const groupByTransformer: DataTransformerInfo } valuesByAggregation[aggregation].push(results[aggregation]); } - } + }); for (const aggregation of aggregations) { const aggregationField: Field = { @@ -150,7 +148,7 @@ export const groupByTransformer: DataTransformerInfo processed.push({ fields, - length: groupKeys.length, + length: valuesByGroupKey.size, }); } diff --git a/packages/grafana-data/src/transformations/transformers/ids.ts b/packages/grafana-data/src/transformations/transformers/ids.ts index 67f9a8cdc4c..6652199abb6 100644 --- a/packages/grafana-data/src/transformations/transformers/ids.ts +++ b/packages/grafana-data/src/transformations/transformers/ids.ts @@ -27,4 +27,6 @@ export enum DataTransformerID { rowsToFields = 'rowsToFields', prepareTimeSeries = 'prepareTimeSeries', convertFieldType = 'convertFieldType', + fieldLookup = 'fieldLookup', + extractFields = 'extractFields', } diff --git a/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts b/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts index 164da1cc347..515b39c42ae 100644 --- a/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts +++ b/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts @@ -1,5 +1,5 @@ import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; -import { LabelsToFieldsOptions, labelsToFieldsTransformer } from './labelsToFields'; +import { LabelsToFieldsMode, LabelsToFieldsOptions, labelsToFieldsTransformer } from './labelsToFields'; import { DataFrame, DataTransformerConfig, FieldDTO, FieldType } from '../../types'; import { DataTransformerID } from './ids'; import { toDataFrame, toDataFrameDTO } from '../../dataframe'; @@ -145,6 +145,248 @@ describe('Labels as Columns', () => { `); }); }); + + it('data frame with labels and multiple fields', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.labelsToFields, + options: {}, + }; + + const source = toDataFrame({ + name: 'A', + fields: [ + { name: 'time', type: FieldType.time, values: [1000, 2000] }, + { name: 'a', type: FieldType.number, values: [1, 3], labels: { name: 'thing' } }, + { name: 'b', type: FieldType.number, values: [2, 4], labels: { name: 'thing' } }, + ], + }); + + await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => { + const data = received[0]; + const result = toDataFrameDTO(data[0]); + + const expected: FieldDTO[] = [ + { name: 'time', type: FieldType.time, values: [1000, 2000], config: {} }, + { name: 'a', type: FieldType.number, values: [1, 3], config: {} }, + { name: 'b', type: FieldType.number, values: [2, 4], config: {} }, + { name: 'name', type: FieldType.string, values: ['thing', 'thing'], config: {} }, + ]; + + expect(result.fields).toEqual(expected); + }); + }); + + it('filter labels from source', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.labelsToFields, + options: { + keepLabels: ['foo', 'bar'], + }, + }; + + const source = toDataFrame({ + name: 'A', + fields: [ + { name: 'time', type: FieldType.time, values: [1000, 2000] }, + { name: 'a', type: FieldType.number, values: [1, 3], labels: { foo: 'thing', x: 'hide', y: 'z' } }, + { name: 'b', type: FieldType.number, values: [2, 4], labels: { bar: 'thing', a: 'nope' } }, + ], + }); + + await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => { + expect(received[0][0].fields.map((f) => ({ [f.name]: f.values.toArray() }))).toMatchInlineSnapshot(` + Array [ + Object { + "time": Array [ + 1000, + 2000, + ], + }, + Object { + "a": Array [ + 1, + 3, + ], + }, + Object { + "b": Array [ + 2, + 4, + ], + }, + Object { + "foo": Array [ + "thing", + "thing", + ], + }, + Object { + "bar": Array [ + "thing", + "thing", + ], + }, + ] + `); + }); + }); + + it('data frame with labels and multiple fields with different labels', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.labelsToFields, + options: {}, + }; + + const source = toDataFrame({ + name: 'A', + fields: [ + { name: 'time', type: FieldType.time, values: [1000, 2000] }, + { name: 'a', type: FieldType.number, values: [1, 3], labels: { name: 'thing', field: 'a' } }, + { name: 'b', type: FieldType.number, values: [2, 4], labels: { name: 'thing', field: 'b' } }, + ], + }); + + await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => { + const data = received[0]; + const result = toDataFrameDTO(data[0]); + + const expected: FieldDTO[] = [ + { name: 'time', type: FieldType.time, values: [1000, 2000], config: {} }, + { name: 'a', type: FieldType.number, values: [1, 3], config: {} }, + { name: 'b', type: FieldType.number, values: [2, 4], config: {} }, + { name: 'name', type: FieldType.string, values: ['thing', 'thing'], config: {} }, + { name: 'field', type: FieldType.string, values: ['a', 'a'], config: {} }, + { name: 'field', type: FieldType.string, values: ['b', 'b'], config: {} }, + ]; + + expect(result.fields).toEqual(expected); + }); + }); + + it('Show labels as rows', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.labelsToFields, + options: { + mode: LabelsToFieldsMode.Rows, + }, + }; + + const source = toDataFrame({ + name: 'A', + fields: [ + { name: 'time', type: FieldType.time, values: [1000, 2000] }, + { name: 'a', type: FieldType.number, values: [1, 3], labels: { foo: 'thing', bar: 'a', zaz: 'xyz' } }, + { name: 'b', type: FieldType.number, values: [2, 4], labels: { foo: 'thing', bar: 'b' } }, + ], + }); + + await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => { + expect( + received[0].map((f) => ({ name: f.name, fields: f.fields.map((v) => ({ [v.name]: v.values.toArray() })) })) + ).toMatchInlineSnapshot(` + Array [ + Object { + "fields": Array [ + Object { + "label": Array [ + "foo", + "bar", + "zaz", + ], + }, + Object { + "value": Array [ + "thing", + "a", + "xyz", + ], + }, + ], + "name": "a {bar=\\"a\\", foo=\\"thing\\", zaz=\\"xyz\\"}", + }, + Object { + "fields": Array [ + Object { + "label": Array [ + "foo", + "bar", + ], + }, + Object { + "value": Array [ + "thing", + "b", + ], + }, + ], + "name": "b {bar=\\"b\\", foo=\\"thing\\"}", + }, + ] + `); + }); + }); + + it('Show labels as rows (and filter)', async () => { + const cfg: DataTransformerConfig = { + id: DataTransformerID.labelsToFields, + options: { + mode: LabelsToFieldsMode.Rows, + keepLabels: ['zaz', 'bar'], + }, + }; + + const source = toDataFrame({ + name: 'A', + fields: [ + { name: 'time', type: FieldType.time, values: [1000, 2000] }, + { name: 'a', type: FieldType.number, values: [1, 3], labels: { foo: 'thing', bar: 'a', zaz: 'xyz' } }, + { name: 'b', type: FieldType.number, values: [2, 4], labels: { foo: 'thing', bar: 'b' } }, + ], + }); + + await expect(transformDataFrame([cfg], [source])).toEmitValuesWith((received) => { + expect( + received[0].map((f) => ({ name: f.name, fields: f.fields.map((v) => ({ [v.name]: v.values.toArray() })) })) + ).toMatchInlineSnapshot(` + Array [ + Object { + "fields": Array [ + Object { + "label": Array [ + "zaz", + "bar", + ], + }, + Object { + "value": Array [ + "xyz", + "a", + ], + }, + ], + "name": "a {bar=\\"a\\", foo=\\"thing\\", zaz=\\"xyz\\"}", + }, + Object { + "fields": Array [ + Object { + "label": Array [ + "zaz", + "bar", + ], + }, + Object { + "value": Array [ + undefined, + "b", + ], + }, + ], + "name": "b {bar=\\"b\\", foo=\\"thing\\"}", + }, + ] + `); + }); + }); }); function toSimpleObject(frame: DataFrame) { diff --git a/packages/grafana-data/src/transformations/transformers/labelsToFields.ts b/packages/grafana-data/src/transformations/transformers/labelsToFields.ts index fb930d5968c..b203c6f6d91 100644 --- a/packages/grafana-data/src/transformations/transformers/labelsToFields.ts +++ b/packages/grafana-data/src/transformations/transformers/labelsToFields.ts @@ -3,10 +3,20 @@ import { map } from 'rxjs/operators'; import { DataFrame, Field, FieldType, SynchronousDataTransformerInfo } from '../../types'; import { DataTransformerID } from './ids'; import { ArrayVector } from '../../vector'; +import { getFieldDisplayName } from '../..'; +export enum LabelsToFieldsMode { + Columns = 'columns', // default mode + Rows = 'rows', +} export interface LabelsToFieldsOptions { - /* - * If set this will use this label's value as the value field name. + mode?: LabelsToFieldsMode; + + /** When empty, this will keep all labels, otherise it will keep only labels matching the value */ + keepLabels?: string[]; + + /** + * When in column mode and if set this will use this label's value as the value field name. */ valueLabel?: string; } @@ -14,17 +24,23 @@ export interface LabelsToFieldsOptions { export const labelsToFieldsTransformer: SynchronousDataTransformerInfo = { id: DataTransformerID.labelsToFields, name: 'Labels to fields', - description: 'Extract time series labels to fields (columns)', + description: 'Extract time series labels to fields (columns or rows)', defaultOptions: {}, operator: (options) => (source) => source.pipe(map((data) => labelsToFieldsTransformer.transformer(options)(data))), transformer: (options: LabelsToFieldsOptions) => (data: DataFrame[]) => { + // Show each label as a field row + if (options.mode === LabelsToFieldsMode.Rows) { + return convertLabelsToRows(data, options.keepLabels); + } + const result: DataFrame[] = []; + const keepLabels = options.keepLabels?.length ? new Set(options.keepLabels) : undefined; for (const frame of data) { const newFields: Field[] = []; - + const uniqueLabels: Record> = {}; for (const field of frame.fields) { if (!field.labels) { newFields.push(field); @@ -44,15 +60,26 @@ export const labelsToFieldsTransformer: SynchronousDataTransformerInfo { "CA", "NY", "CA", - undefined, + , ], }, Object { @@ -425,8 +425,8 @@ describe('Reducer Transformer', () => { "name": "country", "type": "string", "values": Array [ - undefined, - undefined, + , + , "USA", "USA", ], diff --git a/packages/grafana-data/src/types/accesscontrol.ts b/packages/grafana-data/src/types/accesscontrol.ts new file mode 100644 index 00000000000..75fc32d69ca --- /dev/null +++ b/packages/grafana-data/src/types/accesscontrol.ts @@ -0,0 +1,14 @@ +import { KeyValue } from '.'; + +/** + * With FGAC, the backend will return additional access control metadata to objects. + * These metadata will contain user permissions associated to a given resource. + * + * For example: + * { + * accessControl: { "datasources:read": true, "datasources:write": true } + * } + */ +export interface WithAccessControlMetadata { + accessControl?: KeyValue; +} diff --git a/packages/grafana-data/src/types/annotations.ts b/packages/grafana-data/src/types/annotations.ts index 559504ee7b9..5cae3e72d25 100644 --- a/packages/grafana-data/src/types/annotations.ts +++ b/packages/grafana-data/src/types/annotations.ts @@ -3,13 +3,13 @@ import { ComponentType } from 'react'; import { QueryEditorProps } from './datasource'; import { DataFrame } from './dataFrame'; -import { DataQuery, DatasourceRef } from './query'; +import { DataQuery, DataSourceRef } from './query'; /** * This JSON object is stored in the dashboard json model. */ export interface AnnotationQuery { - datasource?: DatasourceRef | string | null; + datasource?: DataSourceRef | string | null; enable: boolean; name: string; @@ -25,7 +25,7 @@ export interface AnnotationQuery { // Convert a dataframe to an AnnotationEvent mappings?: AnnotationEventMappings; - // Sadly plugins can set any propery directly on the main object + // Sadly plugins can set any property directly on the main object [key: string]: any; } diff --git a/packages/grafana-data/src/types/app.ts b/packages/grafana-data/src/types/app.ts index 252393230fa..d2cee306a28 100644 --- a/packages/grafana-data/src/types/app.ts +++ b/packages/grafana-data/src/types/app.ts @@ -9,6 +9,7 @@ import { PluginMeta, GrafanaPlugin, PluginIncludeType } from './plugin'; * */ export enum CoreApp { CloudAlerting = 'cloud-alerting', + UnifiedAlerting = 'unified-alerting', Dashboard = 'dashboard', Explore = 'explore', Unknown = 'unknown', @@ -50,9 +51,6 @@ export class AppPlugin extends GrafanaPlugin> { root?: ComponentClass>; rootNav?: NavModel; // Initial navigation model - // Old style pages - angularPages?: { [component: string]: any }; - /** * Called after the module has loaded, and before the app is used. * This function may be called multiple times on the same instance. @@ -88,12 +86,6 @@ export class AppPlugin extends GrafanaPlugin> { console.warn('App Page uses unknown component: ', include.component, this.meta); continue; } - - if (!this.angularPages) { - this.angularPages = {}; - } - - this.angularPages[include.component] = exp; } } } diff --git a/packages/grafana-data/src/types/config.ts b/packages/grafana-data/src/types/config.ts index c69f4e4dbd9..b1d519c8b12 100644 --- a/packages/grafana-data/src/types/config.ts +++ b/packages/grafana-data/src/types/config.ts @@ -4,6 +4,7 @@ import { GrafanaTheme } from './theme'; import { SystemDateFormatSettings } from '../datetime'; import { GrafanaTheme2 } from '../themes'; import { MapLayerOptions } from '../geo/layer'; +import { FeatureToggles } from './featureToggles.gen'; /** * Describes the build information that will be available via the Grafana configuration. @@ -13,12 +14,6 @@ import { MapLayerOptions } from '../geo/layer'; export interface BuildInfo { version: string; commit: string; - /** - * Is set to true when running Grafana Enterprise edition. - * - * @deprecated use `licenseInfo.hasLicense` instead - */ - isEnterprise: boolean; env: string; edition: GrafanaEdition; latestVersion: string; @@ -35,39 +30,17 @@ export enum GrafanaEdition { Enterprise = 'Enterprise', } -/** - * Describes available feature toggles in Grafana. These can be configured via the - * `conf/custom.ini` to enable features under development or not yet available in - * stable version. - * - * @public - */ -export interface FeatureToggles { - [name: string]: boolean; - - trimDefaults: boolean; - accesscontrol: boolean; - tempoServiceGraph: boolean; - tempoSearch: boolean; - recordedQueries: boolean; - prometheusMonaco: boolean; - newNavigation: boolean; - fullRangeLogsVolume: boolean; - autoLoadFullRangeLogsVolume: boolean; -} - /** * Describes the license information about the current running instance of Grafana. * * @public */ export interface LicenseInfo { - hasLicense: boolean; expiry: number; licenseUrl: string; stateInfo: string; - hasValidLicense: boolean; edition: GrafanaEdition; + enabledFeatures: { [key: string]: boolean }; } /** @@ -82,6 +55,16 @@ export interface SentryConfig { sampleRate: number; } +/** + * Describes the plugins that should be preloaded prior to start Grafana. + * + * @public + */ +export type PreloadPlugin = { + path: string; + version: string; +}; + /** * Describes all the different Grafana configuration values available for an instance. * @@ -125,7 +108,7 @@ export interface GrafanaConfig { liveEnabled: boolean; theme: GrafanaTheme; theme2: GrafanaTheme2; - pluginsToPreload: string[]; + pluginsToPreload: PreloadPlugin[]; featureToggles: FeatureToggles; licenseInfo: LicenseInfo; http2Enabled: boolean; diff --git a/packages/grafana-data/src/types/dashboard.ts b/packages/grafana-data/src/types/dashboard.ts index df1af6165a7..12ce41cbd69 100644 --- a/packages/grafana-data/src/types/dashboard.ts +++ b/packages/grafana-data/src/types/dashboard.ts @@ -1,5 +1,5 @@ import { FieldConfigSource } from './fieldOverrides'; -import { DataQuery, DatasourceRef } from './query'; +import { DataQuery, DataSourceRef } from './query'; export enum DashboardCursorSync { Off, @@ -10,7 +10,7 @@ export enum DashboardCursorSync { /** * @public */ -export interface PanelModel { +export interface PanelModel { /** ID of the panel within the current dashboard */ id: number; @@ -30,7 +30,7 @@ export interface PanelModel PanelPluginDataSupport; getTransformations: () => DataTransformerConfig[] | undefined; getFieldOverrideOptions: () => ApplyFieldOverrideOptions | undefined; + snapshotData?: DataFrameDTO[]; } diff --git a/packages/grafana-data/src/types/dataFrame.ts b/packages/grafana-data/src/types/dataFrame.ts index 3b055ba84d9..0190e75fbfc 100644 --- a/packages/grafana-data/src/types/dataFrame.ts +++ b/packages/grafana-data/src/types/dataFrame.ts @@ -24,7 +24,7 @@ export enum FieldType { * * Plugins may extend this with additional properties. Something like series overrides */ -export interface FieldConfig { +export interface FieldConfig { /** * The display value for this field. This supports template variables blank is auto */ diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index 64c4151af46..94276a9114d 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -9,10 +9,10 @@ import { DataFrame, DataFrameDTO } from './dataFrame'; import { RawTimeRange, TimeRange } from './time'; import { ScopedVars } from './ScopedVars'; import { CoreApp } from './app'; -import { LiveChannelSupport } from './live'; import { CustomVariableSupport, DataSourceVariableSupport, StandardVariableSupport } from './variables'; import { makeClassES5Compatible } from '../utils/makeClassES5Compatible'; import { DataQuery } from './query'; +import { DataSourceRef, WithAccessControlMetadata } from '.'; export interface DataSourcePluginOptionsEditorProps { options: DataSourceSettings; @@ -128,6 +128,7 @@ export interface DataSourcePluginMeta extends PluginMet sort?: number; streaming?: boolean; unlicensed?: boolean; + backend?: boolean; isBackend?: boolean; } @@ -204,15 +205,12 @@ abstract class DataSourceApi< this.name = instanceSettings.name; this.id = instanceSettings.id; this.type = instanceSettings.type; - this.meta = {} as DataSourcePluginMeta; + this.meta = instanceSettings.meta; this.uid = instanceSettings.uid; - if (!this.uid) { - this.uid = this.name; // Internal datasources do not have a UID (-- Grafana --) - } } /** - * Imports queries from a different datasource + * @deprecated use DataSourceWithQueryImportSupport and DataSourceWithQueryExportSupport */ async importQueries?(queries: DataQuery[], originDataSource: DataSourceApi): Promise; @@ -240,6 +238,15 @@ abstract class DataSourceApi< */ abstract testDatasource(): Promise; + /** + * Override to skip executing a query + * + * @returns false if the query should be skipped + * + * @virtual + */ + filterQuery?(query: TQuery): boolean; + /** * Get hints for query improvements */ @@ -315,6 +322,11 @@ abstract class DataSourceApi< */ getHighlighterExpression?(query: TQuery): string[]; + /** Get an identifier object for this datasource instance */ + getRef(): DataSourceRef { + return { type: this.type, uid: this.uid }; + } + /** * Used in explore */ @@ -340,15 +352,6 @@ abstract class DataSourceApi< */ annotationQuery?(options: AnnotationQueryRequest): Promise; - /** - * Define live streaming behavior within this datasource settings - * - * Note: `plugin.json` must also define `live: true` - * - * @alpha -- experimental - */ - channelSupport?: LiveChannelSupport; - /** * Defines new variable support * @alpha -- experimental @@ -484,7 +487,7 @@ export interface DataQueryRequest { timezone: string; app: CoreApp | string; - cacheTimeout?: string; + cacheTimeout?: string | null; rangeRaw?: RawTimeRange; timeInfo?: string; // The query time description (blue text in the upper right) panelId?: number; @@ -537,7 +540,8 @@ export interface DataSourceJsonData { * Data Source instance edit model. This is returned from: * /api/datasources */ -export interface DataSourceSettings { +export interface DataSourceSettings + extends WithAccessControlMetadata { id: number; uid: string; orgId: number; @@ -589,6 +593,9 @@ export interface DataSourceInstanceSettings { +export interface FieldConfigSource { // Defaults applied to all numeric fields defaults: FieldConfig; diff --git a/packages/grafana-data/src/types/index.ts b/packages/grafana-data/src/types/index.ts index 480c79ede20..05287ffa6bd 100644 --- a/packages/grafana-data/src/types/index.ts +++ b/packages/grafana-data/src/types/index.ts @@ -36,5 +36,8 @@ export * from './live'; export * from './variables'; export * from './geometry'; export { isUnsignedPluginSignature } from './pluginSignature'; -export { GrafanaConfig, BuildInfo, FeatureToggles, LicenseInfo } from './config'; +export { GrafanaConfig, BuildInfo, LicenseInfo, PreloadPlugin } from './config'; +export { FeatureToggles } from './featureToggles.gen'; export * from './alerts'; +export * from './slider'; +export * from './accesscontrol'; diff --git a/packages/grafana-data/src/types/live.ts b/packages/grafana-data/src/types/live.ts index 3c924d554ca..f4cb0618e33 100644 --- a/packages/grafana-data/src/types/live.ts +++ b/packages/grafana-data/src/types/live.ts @@ -25,31 +25,6 @@ export enum LiveChannelType { JSON = 'json', // arbitray json message } -/** - * @alpha -- experimental - */ -export interface LiveChannelConfig { - /** - * An optional description for the channel - */ - description?: string; - - /** - * What kind of data do you expect - */ - type?: LiveChannelType; - - /** - * The channel keeps track of who else is connected to the same channel - */ - hasPresence?: boolean; - - /** - * Allow users to write to the connection - */ - canPublish?: boolean; -} - export enum LiveChannelConnectionState { /** The connection is not yet established */ Pending = 'pending', @@ -150,6 +125,11 @@ export interface LiveChannelPresenceStatus { users: any; // @alpha -- experimental -- will be filled in when we improve the UI } +/** + * @alpha -- experimental + */ +export type LiveChannelId = string; + /** * @alpha -- experimental */ @@ -157,6 +137,13 @@ export interface LiveChannelAddress { scope: LiveChannelScope; namespace: string; // depends on the scope path: string; + + /** + * Additional metadata passed to a channel. The backend will propigate this JSON object to + * each OnSubscribe and RunStream calls. This value should be constant across multiple requests + * to the same channel path + */ + data?: any; } /** @@ -192,7 +179,7 @@ export function isValidLiveChannelAddress(addr?: LiveChannelAddress): addr is Li * * @alpha -- experimental */ -export function toLiveChannelId(addr: LiveChannelAddress): string { +export function toLiveChannelId(addr: LiveChannelAddress): LiveChannelId { if (!addr.scope) { return ''; } @@ -206,13 +193,3 @@ export function toLiveChannelId(addr: LiveChannelAddress): string { } return id + '/' + addr.path; } - -/** - * @alpha -- experimental - */ -export interface LiveChannelSupport { - /** - * Get the channel handler for the path, or throw an error if invalid - */ - getChannelConfig(path: string): LiveChannelConfig | undefined; -} diff --git a/packages/grafana-data/src/types/navModel.ts b/packages/grafana-data/src/types/navModel.ts index 814e648985d..23457500d37 100644 --- a/packages/grafana-data/src/types/navModel.ts +++ b/packages/grafana-data/src/types/navModel.ts @@ -13,8 +13,21 @@ export interface NavModelItem { breadcrumbs?: NavModelBreadcrumb[]; target?: string; parentItem?: NavModelItem; + section?: NavSection; showOrgSwitcher?: boolean; onClick?: () => void; + menuItemType?: NavMenuItemType; +} + +export enum NavSection { + Core = 'core', + Plugin = 'plugin', + Config = 'config', +} + +export enum NavMenuItemType { + Section = 'section', + Item = 'item', } /** diff --git a/packages/grafana-data/src/types/panel.ts b/packages/grafana-data/src/types/panel.ts index 6b9f6406091..b5a0dbdd534 100644 --- a/packages/grafana-data/src/types/panel.ts +++ b/packages/grafana-data/src/types/panel.ts @@ -1,8 +1,8 @@ import { DataQueryError, DataQueryRequest, DataQueryTimings } from './datasource'; import { PluginMeta } from './plugin'; import { ScopedVars } from './ScopedVars'; -import { LoadingState } from './data'; -import { DataFrame } from './dataFrame'; +import { LoadingState, PreferredVisualisationType } from './data'; +import { DataFrame, FieldType } from './dataFrame'; import { AbsoluteTimeRange, TimeRange, TimeZone } from './time'; import { EventBus } from '../events'; import { FieldConfigSource } from './fieldOverrides'; @@ -12,6 +12,8 @@ import { OptionsEditorItem } from './OptionsUIRegistryBuilder'; import { OptionEditorConfig } from './options'; import { AlertStateInfo } from './alerts'; import { PanelModel } from './dashboard'; +import { DataTransformerConfig } from './transformations'; +import { defaultsDeep } from 'lodash'; export type InterpolateFunction = (value: string, scopedVars?: ScopedVars, format?: string | Function) => string; @@ -58,7 +60,7 @@ export interface PanelData { timeRange: TimeRange; } -export interface PanelProps { +export interface PanelProps { /** ID of the panel within the current dashboard */ id: number; @@ -182,3 +184,169 @@ export interface PanelPluginDataSupport { annotations: boolean; alertStates: boolean; } + +/** + * @alpha + */ +export interface VisualizationSuggestion { + /** Name of suggestion */ + name: string; + /** Description */ + description?: string; + /** Panel plugin id */ + pluginId: string; + /** Panel plugin options */ + options?: Partial; + /** Panel plugin field options */ + fieldConfig?: FieldConfigSource>; + /** Data transformations */ + transformations?: DataTransformerConfig[]; + /** Options for how to render suggestion card */ + cardOptions?: { + /** Tweak for small preview */ + previewModifier?: (suggestion: VisualizationSuggestion) => void; + icon?: string; + imgSrc?: string; + }; + /** A value between 0-100 how suitable suggestion is */ + score?: VisualizationSuggestionScore; +} + +/** + * @alpha + */ +export enum VisualizationSuggestionScore { + /** We are pretty sure this is the best possible option */ + Best = 100, + /** Should be a really good option */ + Good = 70, + /** Can be visualized but there are likely better options. If no score is set this score is assumed */ + OK = 50, +} + +/** + * @alpha + */ +export interface PanelDataSummary { + hasData?: boolean; + rowCountTotal: number; + rowCountMax: number; + frameCount: number; + fieldCount: number; + numberFieldCount: number; + timeFieldCount: number; + stringFieldCount: number; + hasNumberField?: boolean; + hasTimeField?: boolean; + hasStringField?: boolean; + /** The first frame that set's this value */ + preferredVisualisationType?: PreferredVisualisationType; +} + +/** + * @alpha + */ +export class VisualizationSuggestionsBuilder { + /** Current data */ + data?: PanelData; + /** Current panel & options */ + panel?: PanelModel; + /** Summary stats for current data */ + dataSummary: PanelDataSummary; + + private list: VisualizationSuggestion[] = []; + + constructor(data?: PanelData, panel?: PanelModel) { + this.data = data; + this.panel = panel; + this.dataSummary = this.computeDataSummary(); + } + + getListAppender(defaults: VisualizationSuggestion) { + return new VisualizationSuggestionsListAppender(this.list, defaults); + } + + private computeDataSummary() { + const frames = this.data?.series || []; + + let numberFieldCount = 0; + let timeFieldCount = 0; + let stringFieldCount = 0; + let rowCountTotal = 0; + let rowCountMax = 0; + let fieldCount = 0; + let preferredVisualisationType: PreferredVisualisationType | undefined; + + for (const frame of frames) { + rowCountTotal += frame.length; + + if (frame.meta?.preferredVisualisationType) { + preferredVisualisationType = frame.meta.preferredVisualisationType; + } + + for (const field of frame.fields) { + fieldCount++; + + switch (field.type) { + case FieldType.number: + numberFieldCount += 1; + break; + case FieldType.time: + timeFieldCount += 1; + break; + case FieldType.string: + stringFieldCount += 1; + break; + } + } + + if (frame.length > rowCountMax) { + rowCountMax = frame.length; + } + } + + return { + numberFieldCount, + timeFieldCount, + stringFieldCount, + rowCountTotal, + rowCountMax, + fieldCount, + preferredVisualisationType, + frameCount: frames.length, + hasData: rowCountTotal > 0, + hasTimeField: timeFieldCount > 0, + hasNumberField: numberFieldCount > 0, + hasStringField: stringFieldCount > 0, + }; + } + + getList() { + return this.list; + } +} + +/** + * @alpha + */ +export type VisualizationSuggestionsSupplier = { + /** + * Adds good suitable suggestions for the current data + */ + getSuggestionsForData: (builder: VisualizationSuggestionsBuilder) => void; +}; + +/** + * Helps with typings and defaults + * @alpha + */ +export class VisualizationSuggestionsListAppender { + constructor( + private list: VisualizationSuggestion[], + private defaults: VisualizationSuggestion + ) {} + + append(overrides: Partial>) { + this.list.push(defaultsDeep(overrides, this.defaults)); + } +} diff --git a/packages/grafana-data/src/types/plugin.ts b/packages/grafana-data/src/types/plugin.ts index 94d037cea5e..e663be6a0d8 100644 --- a/packages/grafana-data/src/types/plugin.ts +++ b/packages/grafana-data/src/types/plugin.ts @@ -1,6 +1,5 @@ import { ComponentClass } from 'react'; import { KeyValue } from './data'; -import { LiveChannelSupport } from './live'; /** Describes plugins life cycle status */ export enum PluginState { @@ -170,13 +169,6 @@ export class GrafanaPlugin { // This is set if the plugin system had errors loading the plugin loadError?: boolean; - /** - * Live streaming support - * - * Note: `plugin.json` must also define `live: true` - */ - channelSupport?: LiveChannelSupport; - // Config control (app/datasource) angularConfigCtrl?: any; @@ -193,10 +185,10 @@ export class GrafanaPlugin { } /** - * Specify how the plugin should support paths within the live streaming environment + * @deprecated -- this is no longer necessary and will be removed */ - setChannelSupport(support: LiveChannelSupport) { - this.channelSupport = support; + setChannelSupport(support: any) { + console.warn('[deprecation] plugin is using ignored option: setChannelSupport', this.meta); return this; } diff --git a/packages/grafana-data/src/types/query.ts b/packages/grafana-data/src/types/query.ts index 84025ce1bb0..1f13c56e770 100644 --- a/packages/grafana-data/src/types/query.ts +++ b/packages/grafana-data/src/types/query.ts @@ -8,11 +8,15 @@ export enum DataTopic { } /** - * In 8.2, this will become an interface - * * @public */ -export type DatasourceRef = string; +export interface DataSourceRef { + /** The plugin type-id */ + type?: string; + + /** Specific datasource instance */ + uid?: string; +} /** * These are the common properties available to all queries in all datasources @@ -46,5 +50,64 @@ export interface DataQuery { * For mixed data sources the selected datasource is on the query level. * For non mixed scenarios this is undefined. */ - datasource?: DatasourceRef; + datasource?: DataSourceRef | null; } + +/** + * Abstract representation of any label-based query + * @internal + */ +export interface AbstractQuery extends DataQuery { + labelMatchers: AbstractLabelMatcher[]; +} + +/** + * @internal + */ +export enum AbstractLabelOperator { + Equal = 'Equal', + NotEqual = 'NotEqual', + EqualRegEx = 'EqualRegEx', + NotEqualRegEx = 'NotEqualRegEx', +} + +/** + * @internal + */ +export type AbstractLabelMatcher = { + name: string; + value: string; + operator: AbstractLabelOperator; +}; + +/** + * @internal + */ +export interface DataSourceWithQueryImportSupport { + importFromAbstractQueries(labelBasedQuery: AbstractQuery[]): Promise; +} + +/** + * @internal + */ +export interface DataSourceWithQueryExportSupport { + exportToAbstractQueries(query: TQuery[]): Promise; +} + +/** + * @internal + */ +export const hasQueryImportSupport = ( + datasource: any +): datasource is DataSourceWithQueryImportSupport => { + return (datasource as DataSourceWithQueryImportSupport).importFromAbstractQueries !== undefined; +}; + +/** + * @internal + */ +export const hasQueryExportSupport = ( + datasource: any +): datasource is DataSourceWithQueryExportSupport => { + return (datasource as DataSourceWithQueryExportSupport).exportToAbstractQueries !== undefined; +}; diff --git a/packages/grafana-data/src/types/queryRunner.ts b/packages/grafana-data/src/types/queryRunner.ts index ff526eb8dbd..ef5a9100d79 100644 --- a/packages/grafana-data/src/types/queryRunner.ts +++ b/packages/grafana-data/src/types/queryRunner.ts @@ -1,5 +1,5 @@ import { Observable } from 'rxjs'; -import { DataQuery, DatasourceRef } from './query'; +import { DataQuery, DataSourceRef } from './query'; import { DataSourceApi } from './datasource'; import { PanelData } from './panel'; import { ScopedVars } from './ScopedVars'; @@ -11,7 +11,7 @@ import { TimeRange, TimeZone } from './time'; * @internal */ export interface QueryRunnerOptions { - datasource: DatasourceRef | DataSourceApi | null; + datasource: DataSourceRef | DataSourceApi | null; queries: DataQuery[]; panelId?: number; dashboardId?: number; diff --git a/packages/grafana-data/src/types/slider.ts b/packages/grafana-data/src/types/slider.ts new file mode 100644 index 00000000000..b263b191e8b --- /dev/null +++ b/packages/grafana-data/src/types/slider.ts @@ -0,0 +1 @@ +export type SliderMarks = Record; diff --git a/packages/grafana-data/src/utils/OptionsUIBuilders.ts b/packages/grafana-data/src/utils/OptionsUIBuilders.ts index 1317997db3c..d6c760f04ea 100644 --- a/packages/grafana-data/src/utils/OptionsUIBuilders.ts +++ b/packages/grafana-data/src/utils/OptionsUIBuilders.ts @@ -16,6 +16,7 @@ import { UnitFieldConfigSettings, unitOverrideProcessor, FieldNamePickerConfigSettings, + StandardEditorContext, } from '../field'; import { PanelOptionsSupplier } from '../panel/PanelPlugin'; @@ -133,6 +134,7 @@ export class FieldConfigEditorBuilder extends OptionsUIRegistryBuilder export interface NestedValueAccess { getValue: (path: string) => any; onChange: (path: string, value: any) => void; + getContext?: (parent: StandardEditorContext) => StandardEditorContext; } export interface NestedPanelOptions { path: string; diff --git a/packages/grafana-data/src/utils/arrayUtils.test.ts b/packages/grafana-data/src/utils/arrayUtils.test.ts new file mode 100644 index 00000000000..6f7c81aa8ea --- /dev/null +++ b/packages/grafana-data/src/utils/arrayUtils.test.ts @@ -0,0 +1,29 @@ +import { SortOrder } from '@grafana/schema'; +import { sortValues } from './arrayUtils'; + +describe('arrayUtils', () => { + describe('sortValues', () => { + const testArrayNumeric = [1, 10, null, 2, undefined, 5, 6, ' ', 7, 9, 8, 3, 4]; + const testArrayString = ['1', '10', null, '2', undefined, '5', '6', ' ', '7', '9', '8', '3', '4']; + const testArrayFloatingPoint = ['1.0', '2.7', '0.5', ' ', null, '2', undefined]; + const testArrayText = ['baz', ' ', 'foo', null, 'bar', undefined]; + const testArrayMixed = ['baz', ' ', 1, 'foo', '1.5', '0.5', null, 'bar', undefined]; + + it.each` + order | testArray | expected + ${SortOrder.Ascending} | ${testArrayNumeric} | ${[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ' ', null, undefined]} + ${SortOrder.Descending} | ${testArrayNumeric} | ${[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, ' ', null, undefined]} + ${SortOrder.Ascending} | ${testArrayString} | ${['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', ' ', null, undefined]} + ${SortOrder.Descending} | ${testArrayString} | ${['10', '9', '8', '7', '6', '5', '4', '3', '2', '1', ' ', null, undefined]} + ${SortOrder.Ascending} | ${testArrayFloatingPoint} | ${['0.5', '1.0', '2', '2.7', null, ' ', undefined]} + ${SortOrder.Descending} | ${testArrayFloatingPoint} | ${['2.7', '2', '1.0', '0.5', null, ' ', undefined]} + ${SortOrder.Ascending} | ${testArrayText} | ${['bar', 'baz', 'foo', null, ' ', undefined]} + ${SortOrder.Descending} | ${testArrayText} | ${['foo', 'baz', 'bar', null, ' ', undefined]} + ${SortOrder.Ascending} | ${testArrayMixed} | ${['0.5', 1, '1.5', 'bar', 'baz', 'foo', null, ' ', undefined]} + ${SortOrder.Descending} | ${testArrayMixed} | ${['foo', 'baz', 'bar', '1.5', 1, '0.5', null, ' ', undefined]} + `('$order', ({ order, testArray, expected }) => { + const sorted = [...testArray].sort(sortValues(order)); + expect(sorted).toEqual(expected); + }); + }); +}); diff --git a/packages/grafana-data/src/utils/arrayUtils.ts b/packages/grafana-data/src/utils/arrayUtils.ts index 2ad7e7dda07..e8f4ab405d3 100644 --- a/packages/grafana-data/src/utils/arrayUtils.ts +++ b/packages/grafana-data/src/utils/arrayUtils.ts @@ -1,6 +1,33 @@ +import { SortOrder } from '@grafana/schema'; + /** @internal */ export function moveItemImmutably(arr: T[], from: number, to: number) { const clone = [...arr]; Array.prototype.splice.call(clone, to, 0, Array.prototype.splice.call(clone, from, 1)[0]); return clone; } + +/** + * Given a sort order and a value, return a function that can be used to sort values + * Null/undefined/empty string values are always sorted to the end regardless of the sort order provided + */ +const collator = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' }); +export function sortValues(sort: SortOrder.Ascending | SortOrder.Descending) { + return (a: any, b: any) => { + if (a === b) { + return 0; + } + + if (b == null || (typeof b === 'string' && b.trim() === '')) { + return -1; + } + if (a == null || (typeof a === 'string' && a?.trim() === '')) { + return 1; + } + + if (sort === SortOrder.Descending) { + return collator.compare(b, a); + } + return collator.compare(a, b); + }; +} diff --git a/packages/grafana-data/src/utils/datasource.ts b/packages/grafana-data/src/utils/datasource.ts index 3697a132005..31055d595d6 100644 --- a/packages/grafana-data/src/utils/datasource.ts +++ b/packages/grafana-data/src/utils/datasource.ts @@ -1,4 +1,45 @@ -import { DataSourcePluginOptionsEditorProps, SelectableValue, KeyValue, DataSourceSettings } from '../types'; +import { isString } from 'lodash'; +import { + DataSourcePluginOptionsEditorProps, + SelectableValue, + KeyValue, + DataSourceSettings, + DataSourceInstanceSettings, + DataSourceRef, +} from '../types'; + +/** + * Convert instance settings to a reference + * + * @public + */ +export function getDataSourceRef(ds: DataSourceInstanceSettings): DataSourceRef { + return { uid: ds.uid, type: ds.type }; +} + +/** + * Returns true if the argument is a DataSourceRef + * + * @public + */ +export function isDataSourceRef(ref: DataSourceRef | string | null): ref is DataSourceRef { + return typeof ref === 'object' && (typeof ref?.uid === 'string' || typeof ref?.uid === 'undefined'); +} + +/** + * Get the UID from a string of reference + * + * @public + */ +export function getDataSourceUID(ref: DataSourceRef | string | null): string | undefined { + if (isDataSourceRef(ref)) { + return ref.uid; + } + if (isString(ref)) { + return ref; + } + return undefined; +} export const onUpdateDatasourceOption = (props: DataSourcePluginOptionsEditorProps, key: keyof DataSourceSettings) => ( event: React.SyntheticEvent @@ -82,14 +123,11 @@ export const updateDatasourcePluginSecureJsonDataOption = { const config = props.options; - if (!config.secureJsonData) { - return; - } props.onOptionsChange({ ...config, secureJsonData: { - ...config.secureJsonData, + ...(config.secureJsonData ? config.secureJsonData : ({} as S)), [key]: val, }, }); @@ -100,14 +138,10 @@ export const updateDatasourcePluginResetOption = ( key: string ) => { const config = props.options; - if (!config.secureJsonData) { - return; - } - props.onOptionsChange({ ...config, secureJsonData: { - ...config.secureJsonData, + ...(config.secureJsonData ? config.secureJsonData : ({} as S)), [key]: '', }, secureJsonFields: { diff --git a/packages/grafana-data/src/utils/index.ts b/packages/grafana-data/src/utils/index.ts index 1c7a9f001c7..61444ab922d 100644 --- a/packages/grafana-data/src/utils/index.ts +++ b/packages/grafana-data/src/utils/index.ts @@ -12,6 +12,7 @@ export * from './namedColorsPalette'; export * from './series'; export * from './binaryOperators'; export * from './nodeGraph'; +export * from './selectUtils'; export { PanelOptionsEditorBuilder, FieldConfigEditorBuilder } from './OptionsUIBuilders'; export { arrayUtils }; export { getFlotPairs, getFlotPairsConstant } from './flotPairs'; diff --git a/packages/grafana-data/src/utils/location.ts b/packages/grafana-data/src/utils/location.ts index ac07baa4d94..fa9c2b45d24 100644 --- a/packages/grafana-data/src/utils/location.ts +++ b/packages/grafana-data/src/utils/location.ts @@ -36,12 +36,25 @@ const assureBaseUrl = (url: string): string => { return url; }; -const updateSearchParams = (href: string, searchParams: string) => { - const curURL = new URL(href); - const urlSearchParams = new URLSearchParams(searchParams); - urlSearchParams.forEach((val, key) => curURL.searchParams.set(key, val)); +/** + * Update URL or search param string `init` with new params `partial`. + */ +const updateSearchParams = (init: string, partial: string) => { + const urlSearchParams = new URLSearchParams(partial); - return curURL.href; + // Check if full URL + try { + const curURL = new URL(init); + urlSearchParams.forEach((val, key) => curURL.searchParams.set(key, val)); + return curURL.href; + } catch { + // assume search params + const newSearchParams = new URLSearchParams(init); + urlSearchParams.forEach((v, k) => { + newSearchParams.set(k, v); + }); + return '?' + newSearchParams.toString(); + } }; interface LocationUtilDependencies { diff --git a/packages/grafana-data/src/utils/selectUtils.ts b/packages/grafana-data/src/utils/selectUtils.ts new file mode 100644 index 00000000000..8c682fba762 --- /dev/null +++ b/packages/grafana-data/src/utils/selectUtils.ts @@ -0,0 +1,3 @@ +import { SelectableValue } from '../types'; + +export const toOption = (value: string): SelectableValue => ({ label: value, value }); diff --git a/packages/grafana-data/src/utils/valueMappings.test.ts b/packages/grafana-data/src/utils/valueMappings.test.ts index f6fe0bee6d2..11e76aefc94 100644 --- a/packages/grafana-data/src/utils/valueMappings.test.ts +++ b/packages/grafana-data/src/utils/valueMappings.test.ts @@ -6,6 +6,14 @@ const testSet1: ValueMapping[] = [ type: MappingType.ValueToText, options: { '11': { text: 'elva' } }, }, + { + type: MappingType.ValueToText, + options: { Infinity: { text: 'wow infinity!' } }, + }, + { + type: MappingType.ValueToText, + options: { '-Infinity': { text: 'wow negative infinity!' } }, + }, { type: MappingType.RangeToText, options: { @@ -52,6 +60,30 @@ const testSet1: ValueMapping[] = [ }, ]; +const testSet2: ValueMapping[] = [ + { + type: MappingType.RegexToText, + options: { + pattern: '^([^.]*).foo.com$', + result: { text: 'Hostname $1' }, + }, + }, + { + type: MappingType.RegexToText, + options: { + pattern: '^([^.]*).bar.com$', + result: { text: 'Hostname $1' }, + }, + }, + { + type: MappingType.RegexToText, + options: { + pattern: '/hello/', + result: { color: 'red' }, + }, + }, +]; + describe('Format value with value mappings', () => { it('should return null with no valuemappings', () => { const valueMappings: ValueMapping[] = []; @@ -70,6 +102,16 @@ describe('Format value with value mappings', () => { expect(getValueMappingResult(testSet1, value)).toEqual({ text: 'elva' }); }); + it('should return match result for Infinity', () => { + const value = Infinity; + expect(getValueMappingResult(testSet1, value)).toEqual({ text: 'wow infinity!' }); + }); + + it('should return match result for -Infinity', () => { + const value = -Infinity; + expect(getValueMappingResult(testSet1, value)).toEqual({ text: 'wow negative infinity!' }); + }); + it('should return match result with number value', () => { const value = 11; expect(getValueMappingResult(testSet1, value)).toEqual({ text: 'elva' }); @@ -132,6 +174,27 @@ describe('Format value with value mappings', () => { }); }); +describe('Format value with regex mappings', () => { + it('should return correct regular expression result', () => { + const value = 'www.foo.com'; + expect(getValueMappingResult(testSet2, value)).toEqual({ text: 'Hostname www' }); + }); + + it('should return correct regular expression result on second regex', () => { + const value = 'ftp.bar.com'; + expect(getValueMappingResult(testSet2, value)).toEqual({ text: 'Hostname ftp' }); + }); + + it('should return null with unmatched value', () => { + const value = 'www.baz.com'; + expect(getValueMappingResult(testSet2, value)).toBeNull(); + }); + + it('should not replace match when replace text is null', () => { + expect(getValueMappingResult(testSet2, 'hello my name is')).toEqual({ color: 'red' }); + }); +}); + describe('isNumeric', () => { it.each` value | expected diff --git a/packages/grafana-data/src/utils/valueMappings.ts b/packages/grafana-data/src/utils/valueMappings.ts index 56812a75e8c..e774d058016 100644 --- a/packages/grafana-data/src/utils/valueMappings.ts +++ b/packages/grafana-data/src/utils/valueMappings.ts @@ -1,4 +1,12 @@ -import { MappingType, SpecialValueMatch, ThresholdsConfig, ValueMap, ValueMapping, ValueMappingResult } from '../types'; +import { + MappingType, + SpecialValueMatch, + ThresholdsConfig, + ValueMap, + ValueMapping, + ValueMappingResult, + SpecialValueOptions, +} from '../types'; import { getActiveThreshold } from '../field'; import { stringToJsRegex } from '../text/string'; @@ -41,22 +49,26 @@ export function getValueMappingResult(valueMappings: ValueMapping[], value: any) case MappingType.RegexToText: if (value == null) { - console.log('null value'); continue; } if (typeof value !== 'string') { - console.log('non-string value', typeof value); continue; } const regex = stringToJsRegex(vm.options.pattern); - const thisResult = Object.create(vm.options.result); - thisResult.text = value.replace(regex, vm.options.result.text || ''); - return thisResult; + if (value.match(regex)) { + const res = { ...vm.options.result }; + + if (res.text != null) { + res.text = value.replace(regex, vm.options.result.text || ''); + } + + return res; + } case MappingType.SpecialValue: - switch (vm.options.match) { + switch ((vm.options as SpecialValueOptions).match) { case SpecialValueMatch.Null: { if (value == null) { return vm.options.result; diff --git a/packages/grafana-data/src/valueFormats/categories.ts b/packages/grafana-data/src/valueFormats/categories.ts index 34cf8e711af..1bc51510107 100644 --- a/packages/grafana-data/src/valueFormats/categories.ts +++ b/packages/grafana-data/src/valueFormats/categories.ts @@ -215,10 +215,10 @@ export const getCategories = (): ValueFormatCategory[] => [ { name: 'Gigawatt (GW)', id: 'gwatt', fn: SIPrefix('W', 3) }, { name: 'Milliwatt (mW)', id: 'mwatt', fn: SIPrefix('W', -1) }, { name: 'Watt per square meter (W/m²)', id: 'Wm2', fn: toFixedUnit('W/m²') }, - { name: 'Volt-ampere (VA)', id: 'voltamp', fn: SIPrefix('VA') }, - { name: 'Kilovolt-ampere (kVA)', id: 'kvoltamp', fn: SIPrefix('VA', 1) }, - { name: 'Volt-ampere reactive (var)', id: 'voltampreact', fn: SIPrefix('var') }, - { name: 'Kilovolt-ampere reactive (kVAr)', id: 'kvoltampreact', fn: SIPrefix('VAr', 1) }, + { name: 'Volt-Ampere (VA)', id: 'voltamp', fn: SIPrefix('VA') }, + { name: 'Kilovolt-Ampere (kVA)', id: 'kvoltamp', fn: SIPrefix('VA', 1) }, + { name: 'Volt-Ampere reactive (VAr)', id: 'voltampreact', fn: SIPrefix('VAr') }, + { name: 'Kilovolt-Ampere reactive (kVAr)', id: 'kvoltampreact', fn: SIPrefix('VAr', 1) }, { name: 'Watt-hour (Wh)', id: 'watth', fn: SIPrefix('Wh') }, { name: 'Watt-hour per Kilogram (Wh/kg)', id: 'watthperkg', fn: SIPrefix('Wh/kg') }, { name: 'Kilowatt-hour (kWh)', id: 'kwatth', fn: SIPrefix('Wh', 1) }, diff --git a/packages/grafana-data/src/valueFormats/dateTimeFormatters.test.ts b/packages/grafana-data/src/valueFormats/dateTimeFormatters.test.ts index c40d7dd3d7b..80b6b9123b5 100644 --- a/packages/grafana-data/src/valueFormats/dateTimeFormatters.test.ts +++ b/packages/grafana-data/src/valueFormats/dateTimeFormatters.test.ts @@ -79,31 +79,31 @@ describe('date time formats', () => { it('should format as local date', () => { const dateTimeObject = browserTime.toDate(); const formattedDateText = getDateTimeAsLocalFormat()(epoch, 0, 0).text; - expect(formattedDateText).toContain(dateTimeObject.getFullYear()); - expect(formattedDateText).toContain(dateTimeObject.getSeconds()); + expect(formattedDateText).toContain(dateTimeObject.getFullYear().toString()); + expect(formattedDateText).toContain(dateTimeObject.getSeconds().toString()); }); it('should format as local date and skip date when today', () => { const now = dateTime(); const dateTimeObject = now.toDate(); const formattedDateText = getDateTimeAsLocalFormatNoDateIfToday()(now.valueOf(), 0, 0).text; - expect(formattedDateText).not.toContain(dateTimeObject.getFullYear()); - expect(formattedDateText).toContain(dateTimeObject.getSeconds()); + expect(formattedDateText).not.toContain(dateTimeObject.getFullYear().toString()); + expect(formattedDateText).toContain(dateTimeObject.getSeconds().toString()); }); it('should format as local date (in UTC)', () => { const dateTimeObject = utcTime.toDate(); const formattedDateText = getDateTimeAsLocalFormat()(epoch, 0, 0, 'utc').text; - expect(formattedDateText).toContain(dateTimeObject.getFullYear()); - expect(formattedDateText).toContain(dateTimeObject.getSeconds()); + expect(formattedDateText).toContain(dateTimeObject.getFullYear().toString()); + expect(formattedDateText).toContain(dateTimeObject.getSeconds().toString()); }); it('should format as local date (in UTC) and skip date when today', () => { const now = toUtc(); const dateTimeObject = now.toDate(); const formattedDateText = getDateTimeAsLocalFormatNoDateIfToday()(now.valueOf(), 0, 0, 'utc').text; - expect(formattedDateText).not.toContain(dateTimeObject.getFullYear()); - expect(formattedDateText).toContain(dateTimeObject.getSeconds()); + expect(formattedDateText).not.toContain(dateTimeObject.getFullYear().toString()); + expect(formattedDateText).toContain(dateTimeObject.getSeconds().toString()); }); it('should format as from now with days', () => { diff --git a/packages/grafana-data/tsconfig.json b/packages/grafana-data/tsconfig.json index b2ebe333aea..d56edaaf559 100644 --- a/packages/grafana-data/tsconfig.json +++ b/packages/grafana-data/tsconfig.json @@ -3,7 +3,9 @@ "declarationDir": "dist", "outDir": "compiled", "rootDirs": ["."], - "typeRoots": ["node_modules/@types", "types"] + "paths": { + "@grafana/data": ["."] + } }, "exclude": ["dist", "node_modules"], "extends": "@grafana/tsconfig", @@ -11,6 +13,7 @@ "src/**/*.ts*", "typings/jest", "../../public/app/types/jquery/*.ts", + "../../public/app/types/*.d.ts", "../../public/app/types/sanitize-url.d.ts" ] } diff --git a/packages/grafana-e2e-selectors/package.json b/packages/grafana-e2e-selectors/package.json index 2240d60ba10..cbdda684be3 100644 --- a/packages/grafana-e2e-selectors/package.json +++ b/packages/grafana-e2e-selectors/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/e2e-selectors", - "version": "8.3.0-pre", + "version": "8.4.0-pre", "description": "Grafana End-to-End Test Selectors Library", "keywords": [ "cli", @@ -24,25 +24,18 @@ "typecheck": "tsc --noEmit" }, "devDependencies": { - "@rollup/plugin-commonjs": "16.0.0", - "@rollup/plugin-node-resolve": "10.0.0", - "@types/node": "14.17.27", - "@types/rollup-plugin-visualizer": "4.2.1", - "@types/systemjs": "^0.20.6", - "rollup": "2.33.3", + "@rollup/plugin-commonjs": "21.0.1", + "@rollup/plugin-node-resolve": "13.1.3", + "@types/node": "16.11.19", + "rimraf": "3.0.2", + "rollup": "2.63.0", "rollup-plugin-sourcemaps": "0.6.3", - "rollup-plugin-terser": "7.0.2", - "rollup-plugin-typescript2": "0.29.0", - "rollup-plugin-visualizer": "4.2.0", - "ts-loader": "6.2.1", - "ts-node": "9.0.0" + "rollup-plugin-terser": "7.0.2" }, "types": "src/index.ts", "dependencies": { "@grafana/tsconfig": "^1.0.0-rc1", - "commander": "5.0.0", - "execa": "5.1.1", - "typescript": "4.4.3", - "yaml": "^1.8.3" + "tslib": "2.3.1", + "typescript": "4.5.4" } } diff --git a/packages/grafana-e2e-selectors/src/selectors/components.ts b/packages/grafana-e2e-selectors/src/selectors/components.ts index 037a7a04caa..a69a6b0c36a 100644 --- a/packages/grafana-e2e-selectors/src/selectors/components.ts +++ b/packages/grafana-e2e-selectors/src/selectors/components.ts @@ -50,6 +50,10 @@ export const Components = { MenuComponent: (title: string) => `${title} menu`, MenuGroup: (title: string) => `${title} menu group`, MenuItem: (title: string) => `${title} menu item`, + SubMenu: { + container: 'SubMenu container', + icon: 'SubMenu icon', + }, }, Panels: { Panel: { @@ -72,7 +76,11 @@ export const Components = { }, }, BarGauge: { + /** + * @deprecated use valueV2 from Grafana 8.3 instead + */ value: 'Bar gauge value', + valueV2: 'data-testid Bar gauge value', }, PieChart: { svgSlice: 'Pie Chart Slice', @@ -137,8 +145,16 @@ export const Components = { active: () => '[class*="-activeTabStyle"]', }, RefreshPicker: { + /** + * @deprecated use runButtonV2 from Grafana 8.3 instead + */ runButton: 'RefreshPicker run button', + /** + * @deprecated use intervalButtonV2 from Grafana 8.3 instead + */ intervalButton: 'RefreshPicker interval button', + runButtonV2: 'data-testid RefreshPicker run button', + intervalButtonV2: 'data-testid RefreshPicker interval button', }, QueryTab: { content: 'Query editor tab content', @@ -156,7 +172,11 @@ export const Components = { content: 'Alert editor tab content', }, Alert: { + /** + * @deprecated use alertV2 from Grafana 8.3 instead + */ alert: (severity: string) => `Alert ${severity}`, + alertV2: (severity: string) => `data-testid Alert ${severity}`, }, TransformTab: { content: 'Transform editor tab content', @@ -192,7 +212,7 @@ export const Components = { }, Select: { option: 'Select option', - input: () => 'input[id*="react-select-"]', + input: () => 'input[id*="time-options-input"]', singleValue: () => 'div[class*="-singleValue"]', }, FieldConfigEditor: { @@ -202,7 +222,11 @@ export const Components = { content: 'Field overrides editor content', }, FolderPicker: { + /** + * @deprecated use containerV2 from Grafana 8.3 instead + */ container: 'Folder picker select container', + containerV2: 'data-testid Folder picker select container', input: 'Select a folder', }, ReadonlyFolderPicker: { @@ -217,10 +241,19 @@ export const Components = { inputV2: 'Select a data source', }, TimeZonePicker: { + /** + * @deprecated use TimeZonePicker.containerV2 from Grafana 8.3 instead + */ container: 'Time zone picker select container', + containerV2: 'data-testid Time zone picker select container', }, WeekStartPicker: { + /** + * @deprecated use WeekStartPicker.containerV2 from Grafana 8.3 instead + */ container: 'Choose starting day of the week', + containerV2: 'data-testid Choose starting day of the week', + placeholder: 'Choose starting day of the week', }, TraceViewer: { spanBar: () => '[data-test-id="SpanBar--wrapper"]', @@ -231,8 +264,22 @@ export const Components = { select: (name: string) => `Value picker select ${name}`, }, Search: { + /** + * @deprecated use sectionV2 from Grafana 8.3 instead + */ section: 'Search section', + sectionV2: 'data-testid Search section', + /** + * @deprecated use itemsV2 from Grafana 8.3 instead + */ items: 'Search items', + itemsV2: 'data-testid Search items', + cards: 'data-testid Search cards', + collapseFolder: (sectionId: string) => `data-testid Collapse folder ${sectionId}`, + expandFolder: (sectionId: string) => `data-testid Expand folder ${sectionId}`, + dashboardItem: (item: string) => `${Components.Search.dashboardItems} ${item}`, + dashboardCard: (item: string) => `data-testid Search card ${item}`, + dashboardItems: 'data-testid Dashboard search item', }, DashboardLinks: { container: 'data-testid Dashboard link container', @@ -243,7 +290,11 @@ export const Components = { icon: 'Loading indicator', }, CallToActionCard: { + /** + * @deprecated use buttonV2 from Grafana 8.3 instead + */ button: (name: string) => `Call to action button ${name}`, + buttonV2: (name: string) => `data-testid Call to action button ${name}`, }, DataLinksContextMenu: { singleLink: 'Data link', @@ -262,4 +313,13 @@ export const Components = { PanelAlertTabContent: { content: 'Unified alert editor tab content', }, + VisualizationPreview: { + card: (name: string) => `data-testid suggestion-${name}`, + }, + ColorSwatch: { + name: `data-testid-colorswatch`, + }, + DashboardRow: { + title: (title: string) => `data-testid dashboard-row-title-${title}`, + }, }; diff --git a/packages/grafana-e2e-selectors/src/selectors/pages.ts b/packages/grafana-e2e-selectors/src/selectors/pages.ts index ea064f58f97..842d47e33c7 100644 --- a/packages/grafana-e2e-selectors/src/selectors/pages.ts +++ b/packages/grafana-e2e-selectors/src/selectors/pages.ts @@ -29,7 +29,9 @@ export const Pages = { }, AddDataSource: { url: '/datasources/new', + /** @deprecated Use dataSourcePluginsV2 */ dataSourcePlugins: (pluginName: string) => `Data source plugin item ${pluginName}`, + dataSourcePluginsV2: (pluginName: string) => `Add data source ${pluginName}`, }, ConfirmModal: { delete: 'Confirm Modal Danger Button', @@ -43,7 +45,11 @@ export const Pages = { Dashboard: { url: (uid: string) => `/d/${uid}`, DashNav: { + /** + * @deprecated use navV2 from Grafana 8.3 instead + */ nav: 'Dashboard navigation', + navV2: 'data-testid Dashboard navigation', }, SubMenu: { submenu: 'Dashboard submenu', @@ -61,12 +67,19 @@ export const Pages = { sectionItems: (item: string) => `Dashboard settings section item ${item}`, saveDashBoard: 'Dashboard settings aside actions Save button', saveAsDashBoard: 'Dashboard settings aside actions Save As button', + /** + * @deprecated use components.TimeZonePicker.containerV2 from Grafana 8.3 instead + */ timezone: 'Time zone picker select container', title: 'Dashboard settings page title', }, Annotations: { List: { + /** + * @deprecated use addAnnotationCTAV2 from Grafana 8.3 instead + */ addAnnotationCTA: Components.CallToActionCard.button('Add annotation query'), + addAnnotationCTAV2: Components.CallToActionCard.buttonV2('Add annotation query'), }, Settings: { name: 'Annotations settings name input', @@ -74,7 +87,11 @@ export const Pages = { }, Variables: { List: { + /** + * @deprecated use addVariableCTAV2 from Grafana 8.3 instead + */ addVariableCTA: Components.CallToActionCard.button('Add variable'), + addVariableCTAV2: Components.CallToActionCard.buttonV2('Add variable'), newButton: 'Variable editor New variable button', table: 'Variable editor Table', tableRowNameFields: (variableName: string) => `Variable editor Table Name field ${variableName}`, @@ -124,6 +141,9 @@ export const Pages = { }, Dashboards: { url: '/dashboards', + /** + * @deprecated use components.Search.dashboardItem from Grafana 8.3 instead + */ dashboards: (title: string) => `Dashboard search item ${title}`, }, SaveDashboardAsModal: { @@ -146,9 +166,6 @@ export const Pages = { table: 'Explore Table', scrollBar: () => '.scrollbar-view', }, - Toolbar: { - navBar: () => '.explore-toolbar', - }, }, SoloPanel: { url: (page: string) => `/d-solo/${page}`, diff --git a/packages/grafana-e2e-selectors/tsconfig.json b/packages/grafana-e2e-selectors/tsconfig.json index a0cb12dae6b..8a293c016ad 100644 --- a/packages/grafana-e2e-selectors/tsconfig.json +++ b/packages/grafana-e2e-selectors/tsconfig.json @@ -2,8 +2,7 @@ "compilerOptions": { "declarationDir": "dist", "outDir": "compiled", - "rootDirs": ["."], - "typeRoots": ["node_modules/@types"] + "rootDirs": ["."] }, "exclude": ["dist", "node_modules"], "extends": "@grafana/tsconfig", diff --git a/packages/grafana-e2e/cli.js b/packages/grafana-e2e/cli.js index 32f3a697346..88dedf61da9 100644 --- a/packages/grafana-e2e/cli.js +++ b/packages/grafana-e2e/cli.js @@ -1,5 +1,5 @@ const execa = require('execa'); -const program = require('commander'); +const { program } = require('commander'); const resolveBin = require('resolve-as-bin'); const { resolve, sep } = require('path'); diff --git a/packages/grafana-e2e/cypress/plugins/benchmark/CDPDataCollector.ts b/packages/grafana-e2e/cypress/plugins/benchmark/CDPDataCollector.ts new file mode 100644 index 00000000000..b3f59028d06 --- /dev/null +++ b/packages/grafana-e2e/cypress/plugins/benchmark/CDPDataCollector.ts @@ -0,0 +1,136 @@ +import CDP from 'chrome-remote-interface'; +import Tracelib, { TraceEvent } from 'tracelib'; + +import { countBy, mean } from 'lodash'; +import ProtocolProxyApi from 'devtools-protocol/types/protocol-proxy-api'; +import { CollectedData, DataCollector, DataCollectorName } from './DataCollector'; + +type CDPDataCollectorDeps = { + port: number; +}; + +export class CDPDataCollector implements DataCollector { + private tracingCategories: string[]; + + private state: { + client?: CDP.Client; + tracingPromise?: Promise; + traceEvents: TraceEvent[]; + }; + + constructor(private deps: CDPDataCollectorDeps) { + this.state = this.getDefaultState(); + this.tracingCategories = [ + 'disabled-by-default-v8.cpu_profile', + 'disabled-by-default-v8.cpu_profiler', + 'disabled-by-default-v8.cpu_profiler.hires', + 'disabled-by-default-devtools.timeline.frame', + 'disabled-by-default-devtools.timeline', + 'disabled-by-default-devtools.timeline.inputs', + 'disabled-by-default-devtools.timeline.stack', + 'disabled-by-default-devtools.timeline.invalidationTracking', + 'disabled-by-default-layout_shift.debug', + 'disabled-by-default-cc.debug.scheduler.frames', + 'disabled-by-default-blink.debug.display_lock', + ]; + } + + getName = () => DataCollectorName.CDP; + + private resetState = async () => { + if (this.state.client) { + await this.state.client.close(); + } + this.state = this.getDefaultState(); + }; + + private getDefaultState = () => ({ + traceEvents: [], + }); + + // workaround for type declaration issues in cdp lib + private asApis = ( + client: CDP.Client + ): { + Profiler: ProtocolProxyApi.ProfilerApi; + Page: ProtocolProxyApi.PageApi; + Tracing: ProtocolProxyApi.TracingApi; + } => client; + + private getClientApis = async () => this.asApis(await this.getClient()); + + private getClient = async () => { + if (this.state.client) { + return this.state.client; + } + + const client = await CDP({ port: this.deps.port }); + + const { Profiler, Page } = this.asApis(client); + await Promise.all([Page.enable(), Profiler.enable(), Profiler.setSamplingInterval({ interval: 100 })]); + + this.state.client = client; + + return client; + }; + + start: DataCollector['start'] = async ({ id }) => { + if (this.state.tracingPromise) { + throw new Error(`collection in progress - can't start another one! ${id}`); + } + + const { Tracing, Profiler } = await this.getClientApis(); + + await Promise.all([ + Tracing.start({ + bufferUsageReportingInterval: 1000, + traceConfig: { + includedCategories: this.tracingCategories, + }, + }), + Profiler.start(), + ]); + + Tracing.on('dataCollected', ({ value: events }) => { + this.state.traceEvents.push(...events); + }); + + let resolveFn: (data: CollectedData) => void; + this.state.tracingPromise = new Promise((resolve) => { + resolveFn = resolve; + }); + Tracing.on('tracingComplete', ({ dataLossOccurred }) => { + const t = new Tracelib(this.state.traceEvents); + + const eventCounts = countBy(this.state.traceEvents, (ev) => ev.name); + + const fps = t.getFPS(); + + resolveFn({ + eventCounts, + fps: mean(fps.values), + tracingDataLoss: dataLossOccurred ? 1 : 0, + warnings: t.getWarningCounts(), + }); + }); + }; + + stop: DataCollector['stop'] = async (req) => { + if (!this.state.tracingPromise) { + throw new Error(`collection was never started - there is nothing to stop!`); + } + + const { Tracing, Profiler } = await this.getClientApis(); + + // TODO: capture profiler data + const [, , traceData] = await Promise.all([Profiler.stop(), Tracing.end(), this.state.tracingPromise]); + + await this.resetState(); + + return traceData; + }; + + close: DataCollector['close'] = async () => { + await this.resetState(); + }; +} diff --git a/packages/grafana-e2e/cypress/plugins/benchmark/DataCollector.ts b/packages/grafana-e2e/cypress/plugins/benchmark/DataCollector.ts new file mode 100644 index 00000000000..bfff10312e2 --- /dev/null +++ b/packages/grafana-e2e/cypress/plugins/benchmark/DataCollector.ts @@ -0,0 +1,14 @@ +export type CollectedData = Record; + +export enum DataCollectorName { + CDP = 'CDP', +} + +type DataCollectorRequest = { id: string }; + +export type DataCollector = { + start: (input: DataCollectorRequest) => Promise; + stop: (input: DataCollectorRequest) => Promise; + getName: () => DataCollectorName; + close: () => Promise; +}; diff --git a/packages/grafana-e2e/cypress/plugins/benchmark/formatting.ts b/packages/grafana-e2e/cypress/plugins/benchmark/formatting.ts new file mode 100644 index 00000000000..8372309f50f --- /dev/null +++ b/packages/grafana-e2e/cypress/plugins/benchmark/formatting.ts @@ -0,0 +1,138 @@ +import { CollectedData, DataCollectorName } from './DataCollector'; +import { fromPairs } from 'lodash'; + +type Stats = { + sum: number; + min: number; + max: number; + count: number; + avg: number; + time: number; +}; + +export enum MeasurementName { + DataRenderDelay = 'DataRenderDelay', +} + +type LivePerformanceAppStats = Record; + +const isLivePerformanceAppStats = (data: CollectedData[]): data is LivePerformanceAppStats[] => + data.some((st) => { + const stat = st?.[MeasurementName.DataRenderDelay]; + return Array.isArray(stat) && Boolean(stat?.length); + }); + +type FormattedStats = { + total: { + count: number[]; + avg: number[]; + }; + lastInterval: { + avg: number[]; + min: number[]; + max: number[]; + count: number[]; + }; +}; + +export const formatAppStats = (allStats: CollectedData[]) => { + if (!isLivePerformanceAppStats(allStats)) { + return {}; + } + + const names = Object.keys(MeasurementName) as MeasurementName[]; + + return fromPairs( + names.map((name) => { + const statsForMeasurement = allStats.map((s) => s[name]); + const res: FormattedStats = { + total: { + count: [], + avg: [], + }, + lastInterval: { + avg: [], + min: [], + max: [], + count: [], + }, + }; + + statsForMeasurement.forEach((s) => { + const total = s.reduce( + (prev, next) => { + prev.count += next.count; + prev.avg += next.avg; + return prev; + }, + { count: 0, avg: 0 } + ); + res.total.count.push(Math.round(total.count)); + res.total.avg.push(Math.round(total.avg / s.length)); + + const lastInterval = s[s.length - 1]; + + res.lastInterval.avg.push(Math.round(lastInterval?.avg)); + res.lastInterval.min.push(Math.round(lastInterval?.min)); + res.lastInterval.max.push(Math.round(lastInterval?.max)); + res.lastInterval.count.push(Math.round(lastInterval?.count)); + }); + + return [name, res]; + }) + ); +}; + +type CDPData = { + eventCounts: Record; + fps: number; + tracingDataLoss: number; + warnings: Record; +}; + +const isCDPData = (data: any[]): data is CDPData[] => data.every((d) => typeof d.eventCounts === 'object'); + +type FormattedCDPData = { + minorGC: number[]; + majorGC: number[]; + droppedFrames: number[]; + fps: number[]; + tracingDataLossOccurred: boolean; + longTaskWarnings: number[]; +}; + +const emptyFormattedCDPData = (): FormattedCDPData => ({ + minorGC: [], + majorGC: [], + droppedFrames: [], + fps: [], + tracingDataLossOccurred: false, + longTaskWarnings: [], +}); + +const formatCDPData = (data: any): FormattedCDPData => { + if (!isCDPData(data)) { + return emptyFormattedCDPData(); + } + + return data.reduce((acc, next) => { + acc.majorGC.push((next.eventCounts.MajorGC as number) ?? 0); + acc.minorGC.push((next.eventCounts.MinorGC as number) ?? 0); + acc.fps.push(Math.round(next.fps) ?? 0); + acc.tracingDataLossOccurred = acc.tracingDataLossOccurred || Boolean(next.tracingDataLoss); + acc.droppedFrames.push((next.eventCounts.DroppedFrame as number) ?? 0); + acc.longTaskWarnings.push((next.warnings.LongTask as number) ?? 0); + return acc; + }, emptyFormattedCDPData()); +}; + +export const formatResults = ( + results: Array<{ appStats: CollectedData; collectorsData: CollectedData }> +): CollectedData => { + return { + ...formatAppStats(results.map(({ appStats }) => appStats)), + ...formatCDPData(results.map(({ collectorsData }) => collectorsData[DataCollectorName.CDP])), + + __raw: results, + }; +}; diff --git a/packages/grafana-e2e/cypress/plugins/benchmark/index.ts b/packages/grafana-e2e/cypress/plugins/benchmark/index.ts new file mode 100644 index 00000000000..d822b40dc67 --- /dev/null +++ b/packages/grafana-e2e/cypress/plugins/benchmark/index.ts @@ -0,0 +1,87 @@ +import { CollectedData, DataCollector } from './DataCollector'; +import { CDPDataCollector } from './CDPDataCollector'; +import { fromPairs } from 'lodash'; +import fs from 'fs'; +import { formatResults } from './formatting'; +const remoteDebuggingPortOptionPrefix = '--remote-debugging-port='; + +const getOrAddRemoteDebuggingPort = (args: string[]) => { + const existing = args.find((arg) => arg.startsWith(remoteDebuggingPortOptionPrefix)); + + if (existing) { + return Number(existing.substring(remoteDebuggingPortOptionPrefix.length)); + } + + const port = 40000 + Math.round(Math.random() * 25000); + args.push(`${remoteDebuggingPortOptionPrefix}${port}`); + return port; +}; + +let collectors: DataCollector[] = []; +let results: Array<{ appStats: CollectedData; collectorsData: CollectedData }> = []; + +const startBenchmarking = async ({ testName }: { testName: string }) => { + await Promise.all(collectors.map((coll) => coll.start({ id: testName }))); + + return true; +}; + +const stopBenchmarking = async ({ testName, appStats }: { testName: string; appStats: CollectedData }) => { + const data = await Promise.all(collectors.map(async (coll) => [coll.getName(), await coll.stop({ id: testName })])); + + results.push({ + collectorsData: fromPairs(data), + appStats: appStats, + }); + + return true; +}; +const afterRun = async () => { + await Promise.all(collectors.map((coll) => coll.close())); + collectors = []; + results = []; +}; + +const afterSpec = (resultsFolder: string) => async (spec: { name: string }) => { + fs.writeFileSync(`${resultsFolder}/${spec.name}-${Date.now()}.json`, JSON.stringify(formatResults(results), null, 2)); + + results = []; +}; + +export const initialize: Cypress.PluginConfig = (on, config) => { + const resultsFolder = config.env['BENCHMARK_PLUGIN_RESULTS_FOLDER']; + + if (!fs.existsSync(resultsFolder)) { + fs.mkdirSync(resultsFolder, { recursive: true }); + console.log(`Created folder for benchmark results ${resultsFolder}`); + } + + on('before:browser:launch', async (browser, options) => { + if (browser.family !== 'chromium' || browser.name === 'electron') { + throw new Error('benchmarking plugin requires chrome'); + } + + const { args } = options; + + const port = getOrAddRemoteDebuggingPort(args); + collectors.push(new CDPDataCollector({ port })); + + args.push('--start-fullscreen'); + + console.log( + `initialized benchmarking plugin with ${collectors.length} collectors: ${collectors + .map((col) => col.getName()) + .join(', ')}` + ); + + return options; + }); + + on('task', { + startBenchmarking, + stopBenchmarking, + }); + + on('after:run', afterRun); + on('after:spec', afterSpec(resultsFolder)); +}; diff --git a/packages/grafana-e2e/cypress/plugins/benchmark/tracelib.d.ts b/packages/grafana-e2e/cypress/plugins/benchmark/tracelib.d.ts new file mode 100644 index 00000000000..2ba83b35594 --- /dev/null +++ b/packages/grafana-e2e/cypress/plugins/benchmark/tracelib.d.ts @@ -0,0 +1,15 @@ +type TraceEvent = { + name: string; +}; + +declare class Tracelib { + constructor(private events: TraceEvent[]) {} + + getFPS: () => { times: number[]; values: number[] }; + getWarningCounts: () => Record; +} +declare module 'tracelib' { + export = Tracelib; + + export { TraceEvent }; +} diff --git a/packages/grafana-e2e/cypress/plugins/index.js b/packages/grafana-e2e/cypress/plugins/index.js index 8b0f5dfdb46..d9c4eebba76 100644 --- a/packages/grafana-e2e/cypress/plugins/index.js +++ b/packages/grafana-e2e/cypress/plugins/index.js @@ -5,8 +5,13 @@ const compareScreenshots = require('./compareScreenshots'); const extendConfig = require('./extendConfig'); const readProvisions = require('./readProvisions'); const typescriptPreprocessor = require('./typescriptPreprocessor'); +const benchmarkPlugin = require('./benchmark'); module.exports = (on, config) => { + if (config.env['BENCHMARK_PLUGIN_ENABLED'] === true) { + benchmarkPlugin.initialize(on, config); + } + on('file:preprocessor', typescriptPreprocessor); on('task', { compareScreenshots, readProvisions }); on('task', { diff --git a/packages/grafana-e2e/cypress/support/commands.ts b/packages/grafana-e2e/cypress/support/commands.ts index 48e933bf34c..ce386d11d8f 100644 --- a/packages/grafana-e2e/cypress/support/commands.ts +++ b/packages/grafana-e2e/cypress/support/commands.ts @@ -31,3 +31,11 @@ Cypress.Commands.add('getJSONFilesFromDir', (dirPath: string) => { relativePath: dirPath, }); }); + +Cypress.Commands.add('startBenchmarking', (testName: string) => { + return cy.task('startBenchmarking', { testName }); +}); + +Cypress.Commands.add('stopBenchmarking', (testName: string, appStats: Record) => { + return cy.task('stopBenchmarking', { testName, appStats }); +}); diff --git a/packages/grafana-e2e/cypress/support/index.d.ts b/packages/grafana-e2e/cypress/support/index.d.ts index 224b21bd339..3f8d1975936 100644 --- a/packages/grafana-e2e/cypress/support/index.d.ts +++ b/packages/grafana-e2e/cypress/support/index.d.ts @@ -6,5 +6,7 @@ declare namespace Cypress { logToConsole(message: string, optional?: any): void; readProvisions(filePaths: string[]): Chainable; getJSONFilesFromDir(dirPath: string): Chainable; + startBenchmarking(testName: string): void; + stopBenchmarking(testName: string, appStats: Record): void; } } diff --git a/packages/grafana-e2e/cypress/tsconfig.json b/packages/grafana-e2e/cypress/tsconfig.json index c7e1a52579e..b3f735c508e 100644 --- a/packages/grafana-e2e/cypress/tsconfig.json +++ b/packages/grafana-e2e/cypress/tsconfig.json @@ -2,7 +2,7 @@ "compilerOptions": { "declaration": false, "module": "commonjs", - "types": ["cypress", "cypress-file-upload"] + "types": ["cypress", "cypress-file-upload", "node"] }, "extends": "@grafana/tsconfig", "include": ["**/*.ts"] diff --git a/packages/grafana-e2e/package.json b/packages/grafana-e2e/package.json index 180dfad5559..ad965d1c0c8 100644 --- a/packages/grafana-e2e/package.json +++ b/packages/grafana-e2e/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/e2e", - "version": "8.3.0-pre", + "version": "8.4.0-pre", "description": "Grafana End-to-End Test Library", "keywords": [ "cli", @@ -26,37 +26,48 @@ "docsExtract": "mkdir -p ../../reports/docs && api-extractor run 2>&1 | tee ../../reports/docs/$(basename $(pwd)).log", "open": "cypress open", "start": "cypress run --browser=chrome", + "start-benchmark": "CYPRESS_NO_COMMAND_LOG=1 yarn start", "test": "pushd test && node ../dist/bin/grafana-e2e.js run", "typecheck": "tsc --noEmit" }, "devDependencies": { - "@rollup/plugin-commonjs": "16.0.0", - "@rollup/plugin-node-resolve": "10.0.0", - "@types/node": "14.17.27", - "@types/rollup-plugin-visualizer": "4.2.1", - "date-fns": "2.21.3", - "rollup": "2.33.3", - "rollup-plugin-copy": "3.3.0", + "@rollup/plugin-commonjs": "21.0.1", + "@rollup/plugin-node-resolve": "13.1.3", + "@types/chrome-remote-interface": "0.31.4", + "@types/lodash": "4.14.149", + "@types/node": "16.11.19", + "@types/uuid": "8.3.4", + "rollup": "2.63.0", + "rollup-plugin-copy": "3.4.0", "rollup-plugin-sourcemaps": "0.6.3", "rollup-plugin-terser": "7.0.2", - "rollup-plugin-typescript2": "0.29.0", - "rollup-plugin-visualizer": "4.2.0" + "webpack": "5.66.0" }, "types": "src/index.ts", "dependencies": { - "@cypress/webpack-preprocessor": "5.9.1", - "@grafana/e2e-selectors": "8.3.0-pre", + "@babel/core": "7.16.7", + "@babel/preset-env": "7.16.7", + "@cypress/webpack-preprocessor": "5.11.0", + "@grafana/e2e-selectors": "8.4.0-pre", "@grafana/tsconfig": "^1.0.0-rc1", "@mochajs/json-file-reporter": "^1.2.0", + "babel-loader": "8.2.3", "blink-diff": "1.0.13", - "commander": "5.0.0", - "cypress": "8.4.1", + "chrome-remote-interface": "0.31.1", + "commander": "8.3.0", + "cypress": "9.2.0", "cypress-file-upload": "5.0.8", + "devtools-protocol": "0.0.927104", "execa": "5.1.1", + "lodash": "4.17.21", + "mocha": "9.1.3", "resolve-as-bin": "2.1.0", + "rimraf": "3.0.2", + "tracelib": "1.0.1", "ts-loader": "6.2.1", "tslib": "2.3.1", - "typescript": "4.4.3", + "typescript": "4.5.4", + "uuid": "8.3.2", "yaml": "^1.8.3" } } diff --git a/packages/grafana-e2e/src/flows/addDashboard.ts b/packages/grafana-e2e/src/flows/addDashboard.ts index a0be67e10cb..2d4b089c6b4 100644 --- a/packages/grafana-e2e/src/flows/addDashboard.ts +++ b/packages/grafana-e2e/src/flows/addDashboard.ts @@ -70,7 +70,7 @@ export const addDashboard = (config?: Partial) => { setDashboardTimeRange(timeRange); e2e.components.PageToolbar.item('Save dashboard').click(); - e2e.pages.SaveDashboardAsModal.newName().clear().type(title); + e2e.pages.SaveDashboardAsModal.newName().clear().type(title, { force: true }); e2e.pages.SaveDashboardAsModal.save().click(); e2e.flows.assertSuccessNotification(); @@ -101,7 +101,11 @@ export const addDashboard = (config?: Partial) => { const addAnnotation = (config: AddAnnotationConfig, isFirst: boolean) => { if (isFirst) { - e2e.pages.Dashboard.Settings.Annotations.List.addAnnotationCTA().click(); + if (e2e.pages.Dashboard.Settings.Annotations.List.addAnnotationCTAV2) { + e2e.pages.Dashboard.Settings.Annotations.List.addAnnotationCTAV2().click(); + } else { + e2e.pages.Dashboard.Settings.Annotations.List.addAnnotationCTA().click(); + } } else { cy.contains('New query').click(); } @@ -145,7 +149,11 @@ const addVariable = (config: PartialAddVariableConfig, isFirst: boolean): AddVar }; if (isFirst) { - e2e.pages.Dashboard.Settings.Variables.List.addVariableCTA().click(); + if (e2e.pages.Dashboard.Settings.Variables.List.addVariableCTAV2) { + e2e.pages.Dashboard.Settings.Variables.List.addVariableCTAV2().click(); + } else { + e2e.pages.Dashboard.Settings.Variables.List.addVariableCTA().click(); + } } else { e2e.pages.Dashboard.Settings.Variables.List.newButton().click(); } diff --git a/packages/grafana-e2e/src/flows/addDataSource.ts b/packages/grafana-e2e/src/flows/addDataSource.ts index 2522cf16c9a..bb507f12c49 100644 --- a/packages/grafana-e2e/src/flows/addDataSource.ts +++ b/packages/grafana-e2e/src/flows/addDataSource.ts @@ -47,7 +47,7 @@ export const addDataSource = (config?: Partial) => { e2e().logToConsole('Adding data source with name:', name); e2e.pages.AddDataSource.visit(); - e2e.pages.AddDataSource.dataSourcePlugins(type) + e2e.pages.AddDataSource.dataSourcePluginsV2(type) .scrollIntoView() .should('be.visible') // prevents flakiness .click(); diff --git a/packages/grafana-e2e/src/flows/addPanel.ts b/packages/grafana-e2e/src/flows/addPanel.ts index 9e1907f09bb..f24029c400b 100644 --- a/packages/grafana-e2e/src/flows/addPanel.ts +++ b/packages/grafana-e2e/src/flows/addPanel.ts @@ -9,6 +9,5 @@ export const addPanel = (config?: Partial) => panelTitle: `e2e-${uuidv4()}`, ...config, isEdit: false, - isExplore: false, }) ); diff --git a/packages/grafana-e2e/src/flows/assertSuccessNotification.ts b/packages/grafana-e2e/src/flows/assertSuccessNotification.ts index c86f4cc0b98..25f9228683c 100644 --- a/packages/grafana-e2e/src/flows/assertSuccessNotification.ts +++ b/packages/grafana-e2e/src/flows/assertSuccessNotification.ts @@ -1,5 +1,9 @@ import { e2e } from '../index'; export const assertSuccessNotification = () => { - e2e().get('[aria-label^="Alert success"]').should('exist'); + if (e2e.components.Alert.alertV2) { + e2e.components.Alert.alertV2('success').should('exist'); + } else { + e2e.components.Alert.alert('success').should('exist'); + } }; diff --git a/packages/grafana-e2e/src/flows/configurePanel.ts b/packages/grafana-e2e/src/flows/configurePanel.ts index c4b75ff55ec..182bdaab287 100644 --- a/packages/grafana-e2e/src/flows/configurePanel.ts +++ b/packages/grafana-e2e/src/flows/configurePanel.ts @@ -2,7 +2,7 @@ import { e2e } from '../index'; import { getScenarioContext } from '../support/scenarioContext'; import { selectOption } from './selectOption'; import { setDashboardTimeRange } from './setDashboardTimeRange'; -import { setTimeRange, TimeRangeConfig } from './setTimeRange'; +import { TimeRangeConfig } from './setTimeRange'; interface AddPanelOverrides { dataSourceName: string; @@ -33,12 +33,10 @@ interface ConfigurePanelOptional { panelTitle?: string; timeRange?: TimeRangeConfig; visualizationName?: string; - matchExploreTable?: boolean; } interface ConfigurePanelRequired { isEdit: boolean; - isExplore: boolean; } export type PartialConfigurePanelConfig = Partial & @@ -74,8 +72,6 @@ export const configurePanel = (config: PartialAddPanelConfig | PartialEditPanelC dashboardUid, dataSourceName, isEdit, - isExplore, - matchExploreTable, matchScreenshot, panelTitle, queriesForm, @@ -85,32 +81,20 @@ export const configurePanel = (config: PartialAddPanelConfig | PartialEditPanelC visualizationName, } = fullConfig; - if (isEdit && isExplore) { - throw new TypeError('Invalid configuration'); + if (visitDashboardAtStart) { + e2e.flows.openDashboard({ uid: dashboardUid }); } - if (isExplore) { - e2e.pages.Explore.visit(); + if (isEdit) { + e2e.components.Panels.Panel.title(panelTitle).click(); + e2e.components.Panels.Panel.headerItems('Edit').click(); } else { - if (visitDashboardAtStart) { - e2e.flows.openDashboard({ uid: dashboardUid }); - } - - if (isEdit) { - e2e.components.Panels.Panel.title(panelTitle).click(); - e2e.components.Panels.Panel.headerItems('Edit').click(); - } else { - e2e.components.PageToolbar.item('Add panel').click(); - e2e.pages.AddDashboard.addNewPanel().click(); - } + e2e.components.PageToolbar.item('Add panel').click(); + e2e.pages.AddDashboard.addNewPanel().click(); } if (timeRange) { - if (isExplore) { - e2e.pages.Explore.Toolbar.navBar().within(() => setTimeRange(timeRange)); - } else { - setDashboardTimeRange(timeRange); - } + setDashboardTimeRange(timeRange); } // @todo alias '/**/*.js*' as '@pluginModule' when possible: https://github.com/cypress-io/cypress/issues/1296 @@ -127,25 +111,23 @@ export const configurePanel = (config: PartialAddPanelConfig | PartialEditPanelC // @todo instead wait for '@pluginModule' if not already loaded e2e().wait(2000); - if (!isExplore) { - // `panelTitle` is needed to edit the panel, and unlikely to have its value changed at that point - const changeTitle = panelTitle && !isEdit; + // `panelTitle` is needed to edit the panel, and unlikely to have its value changed at that point + const changeTitle = panelTitle && !isEdit; - if (changeTitle || visualizationName) { - if (changeTitle && panelTitle) { - e2e.components.PanelEditor.OptionsPane.fieldLabel('Panel options Title').type(`{selectall}${panelTitle}`); - } - - if (visualizationName) { - e2e.components.PluginVisualization.item(visualizationName).scrollIntoView().click(); - - // @todo wait for '@pluginModule' if not a core visualization and not already loaded - e2e().wait(2000); - } - } else { - // Consistently closed - closeOptions(); + if (changeTitle || visualizationName) { + if (changeTitle && panelTitle) { + e2e.components.PanelEditor.OptionsPane.fieldLabel('Panel options Title').type(`{selectall}${panelTitle}`); } + + if (visualizationName) { + e2e.components.PluginVisualization.item(visualizationName).scrollIntoView().click(); + + // @todo wait for '@pluginModule' if not a core visualization and not already loaded + e2e().wait(2000); + } + } else { + // Consistently closed + closeOptions(); } if (queriesForm) { @@ -164,11 +146,6 @@ export const configurePanel = (config: PartialAddPanelConfig | PartialEditPanelC //e2e.components.QueryEditorRow.actionButton('Disable/enable query').click(); //e2e().wait('@chartData'); - if (!isExplore) { - e2e().get('button[title="Apply changes and go back to dashboard"]').click(); - e2e().url().should('include', `/d/${dashboardUid}`); - } - // Avoid annotations flakiness e2e.components.RefreshPicker.runButton().should('be.visible').click(); @@ -180,11 +157,7 @@ export const configurePanel = (config: PartialAddPanelConfig | PartialEditPanelC if (matchScreenshot) { let visualization; - if (isExplore) { - visualization = matchExploreTable ? e2e.pages.Explore.General.table() : e2e.pages.Explore.General.graph(); - } else { - visualization = e2e.components.Panels.Panel.containerByTitle(panelTitle).find('.panel-content'); - } + visualization = e2e.components.Panels.Panel.containerByTitle(panelTitle).find('.panel-content'); visualization.scrollIntoView().screenshot(screenshotName); e2e().compareScreenshots(screenshotName); diff --git a/packages/grafana-e2e/src/flows/deleteDashboard.ts b/packages/grafana-e2e/src/flows/deleteDashboard.ts index 9bb90a6412e..d69c3da7146 100644 --- a/packages/grafana-e2e/src/flows/deleteDashboard.ts +++ b/packages/grafana-e2e/src/flows/deleteDashboard.ts @@ -41,7 +41,11 @@ const uiDelete = (uid: string, title: string) => { e2e.pages.Dashboards.visit(); // @todo replace `e2e.pages.Dashboards.dashboards` with this when argument is empty - e2e() - .get('[aria-label^="Dashboard search item "]') - .each((item) => e2e().wrap(item).should('not.contain', title)); + if (e2e.components.Search.dashboardItems) { + e2e.components.Search.dashboardItems().each((item) => e2e().wrap(item).should('not.contain', title)); + } else { + e2e() + .get('[aria-label^="Dashboard search item "]') + .each((item) => e2e().wrap(item).should('not.contain', title)); + } }; diff --git a/packages/grafana-e2e/src/flows/editPanel.ts b/packages/grafana-e2e/src/flows/editPanel.ts index c003d4729a5..c213465902a 100644 --- a/packages/grafana-e2e/src/flows/editPanel.ts +++ b/packages/grafana-e2e/src/flows/editPanel.ts @@ -4,5 +4,4 @@ export const editPanel = (config: Partial) => configurePanel({ ...config, isEdit: true, - isExplore: false, }); diff --git a/packages/grafana-e2e/src/flows/explore.ts b/packages/grafana-e2e/src/flows/explore.ts deleted file mode 100644 index cc9dd1047c2..00000000000 --- a/packages/grafana-e2e/src/flows/explore.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { configurePanel, PartialConfigurePanelConfig } from './configurePanel'; -import { getScenarioContext } from '../support/scenarioContext'; - -export const explore = (config: Partial) => - getScenarioContext().then(({ lastAddedDataSource }: any) => - configurePanel({ - dataSourceName: lastAddedDataSource, - screenshotName: 'explore-graph', - ...config, - isEdit: false, - isExplore: true, - timeRange: { - from: '2020-01-01 00:00:00', - to: '2020-01-01 06:00:00', - zone: 'Coordinated Universal Time', - ...config.timeRange, - }, - }) - ); diff --git a/packages/grafana-e2e/src/flows/importDashboard.ts b/packages/grafana-e2e/src/flows/importDashboard.ts index d4eadd1c412..c054dd4ad3a 100644 --- a/packages/grafana-e2e/src/flows/importDashboard.ts +++ b/packages/grafana-e2e/src/flows/importDashboard.ts @@ -13,8 +13,9 @@ export type Dashboard = { title: string; panels: Panel[]; uid: string; [key: str * Smoke test a particular dashboard by quickly importing a json file and validate that all the panels finish loading * @param dashboardToImport a sample dashboard * @param queryTimeout a number of ms to wait for the imported dashboard to finish loading + * @param skipPanelValidation skip panel validation */ -export const importDashboard = (dashboardToImport: Dashboard, queryTimeout?: number) => { +export const importDashboard = (dashboardToImport: Dashboard, queryTimeout?: number, skipPanelValidation?: boolean) => { e2e().visit(fromBaseUrl('/dashboard/import')); // Note: normally we'd use 'click' and then 'type' here, but the json object is so big that using 'val' is much faster @@ -45,21 +46,25 @@ export const importDashboard = (dashboardToImport: Dashboard, queryTimeout?: num expect(dashboardToImport.uid).to.equal(uid); }); - dashboardToImport.panels.forEach((panel) => { - // Look at the json data - e2e.components.Panels.Panel.title(panel.title).should('be.visible').click(); - e2e.components.Panels.Panel.headerItems('Inspect').should('be.visible').click(); - e2e.components.Tab.title('JSON').should('be.visible').click(); - e2e.components.PanelInspector.Json.content().should('be.visible').contains('Panel JSON').click(); - e2e.components.Select.option().should('be.visible').contains('Data').click(); + if (!skipPanelValidation) { + dashboardToImport.panels.forEach((panel) => { + // Look at the json data + e2e.components.Panels.Panel.title(panel.title).should('be.visible').click(); + e2e.components.Panels.Panel.headerItems('Inspect').should('be.visible').click(); + e2e.components.Tab.title('JSON').should('be.visible').click(); + e2e.components.PanelInspector.Json.content().should('be.visible').contains('Panel JSON').click({ force: true }); + e2e.components.Select.option().should('be.visible').contains('Data').click(); - // ensures that panel has loaded without knowingly hitting an error - // note: this does not prove that data came back as we expected it, - // it could get `state: Done` for no data for example - // but it ensures we didn't hit a 401 or 500 or something like that - e2e.components.CodeEditor.container().should('be.visible').contains('"state": "Done"'); + // ensures that panel has loaded without knowingly hitting an error + // note: this does not prove that data came back as we expected it, + // it could get `state: Done` for no data for example + // but it ensures we didn't hit a 401 or 500 or something like that + e2e.components.CodeEditor.container() + .should('be.visible') + .contains(/"state": "(Done|Streaming)"/); - // need to close panel - e2e.components.Drawer.General.close().click(); - }); + // need to close panel + e2e.components.Drawer.General.close().click(); + }); + } }; diff --git a/packages/grafana-e2e/src/flows/importDashboards.ts b/packages/grafana-e2e/src/flows/importDashboards.ts index 6a4c2a5de85..24b7bd356f8 100644 --- a/packages/grafana-e2e/src/flows/importDashboards.ts +++ b/packages/grafana-e2e/src/flows/importDashboards.ts @@ -7,13 +7,14 @@ import { e2e } from '../index'; * @param dirPath the relative path to a directory which contains json files representing dashboards, * for example if your dashboards live in `cypress/testDashboards` you can pass `/testDashboards` * @param queryTimeout a number of ms to wait for the imported dashboard to finish loading + * @param skipPanelValidation skips panel validation */ -export const importDashboards = async (dirPath: string, queryTimeout?: number) => { +export const importDashboards = async (dirPath: string, queryTimeout?: number, skipPanelValidation?: boolean) => { e2e() .getJSONFilesFromDir(dirPath) .then((jsonFiles: Dashboard[]) => { jsonFiles.forEach((file) => { - importDashboard(file, queryTimeout || 6000); + importDashboard(file, queryTimeout || 6000, skipPanelValidation); }); }); }; diff --git a/packages/grafana-e2e/src/flows/index.ts b/packages/grafana-e2e/src/flows/index.ts index 83ba4e5a8b4..1fc8212c628 100644 --- a/packages/grafana-e2e/src/flows/index.ts +++ b/packages/grafana-e2e/src/flows/index.ts @@ -5,7 +5,6 @@ export * from './assertSuccessNotification'; export * from './deleteDashboard'; export * from './deleteDataSource'; export * from './editPanel'; -export * from './explore'; export * from './login'; export * from './openDashboard'; export * from './openPanelMenuItem'; diff --git a/packages/grafana-e2e/src/flows/login.ts b/packages/grafana-e2e/src/flows/login.ts index 300d8fed5c4..744e4332754 100644 --- a/packages/grafana-e2e/src/flows/login.ts +++ b/packages/grafana-e2e/src/flows/login.ts @@ -1,9 +1,21 @@ import { e2e } from '../index'; +import { fromBaseUrl } from '../support/url'; const DEFAULT_USERNAME = 'admin'; const DEFAULT_PASSWORD = 'admin'; -export const login = (username = DEFAULT_USERNAME, password = DEFAULT_PASSWORD) => { +const loginApi = (username: string, password: string) => { + cy.request({ + method: 'POST', + url: fromBaseUrl('/login'), + body: { + user: username, + password, + }, + }); +}; + +const loginUi = (username: string, password: string) => { e2e().logToConsole('Logging in with username:', username); e2e.pages.Login.visit(); e2e.pages.Login.username() @@ -18,5 +30,13 @@ export const login = (username = DEFAULT_USERNAME, password = DEFAULT_PASSWORD) } e2e().get('.login-page').should('not.exist'); +}; + +export const login = (username = DEFAULT_USERNAME, password = DEFAULT_PASSWORD, loginViaApi = true) => { + if (loginViaApi) { + loginApi(username, password); + } else { + loginUi(username, password); + } e2e().logToConsole('Logged in with username:', username); }; diff --git a/packages/grafana-e2e/src/flows/openDashboard.ts b/packages/grafana-e2e/src/flows/openDashboard.ts index 3bbcec024c5..67c9544b8fe 100644 --- a/packages/grafana-e2e/src/flows/openDashboard.ts +++ b/packages/grafana-e2e/src/flows/openDashboard.ts @@ -8,6 +8,7 @@ interface OpenDashboardDefault { interface OpenDashboardOptional { timeRange?: TimeRangeConfig; + queryParams?: object; } export type PartialOpenDashboardConfig = Partial & OpenDashboardOptional; @@ -21,9 +22,9 @@ export const openDashboard = (config?: PartialOpenDashboardConfig) => ...config, }; - const { timeRange, uid } = fullConfig; + const { timeRange, uid, queryParams } = fullConfig; - e2e.pages.Dashboard.visit(uid); + e2e.pages.Dashboard.visit(uid, queryParams); if (timeRange) { setDashboardTimeRange(timeRange); diff --git a/packages/grafana-e2e/src/flows/setTimeRange.ts b/packages/grafana-e2e/src/flows/setTimeRange.ts index 8f79bc1d6c4..bcf719087d8 100644 --- a/packages/grafana-e2e/src/flows/setTimeRange.ts +++ b/packages/grafana-e2e/src/flows/setTimeRange.ts @@ -13,11 +13,19 @@ export const setTimeRange = ({ from, to, zone }: TimeRangeConfig) => { if (zone) { e2e().contains('button', 'Change time settings').click(); - selectOption({ - clickToOpen: true, - container: e2e.components.TimeZonePicker.container(), - optionText: zone, - }); + if (e2e.components.TimeZonePicker.containerV2) { + selectOption({ + clickToOpen: true, + container: e2e.components.TimeZonePicker.containerV2(), + optionText: zone, + }); + } else { + selectOption({ + clickToOpen: true, + container: e2e.components.TimeZonePicker.container(), + optionText: zone, + }); + } } // For smaller screens diff --git a/packages/grafana-e2e/src/index.ts b/packages/grafana-e2e/src/index.ts index 87a0a6a8f25..b4c62c16352 100644 --- a/packages/grafana-e2e/src/index.ts +++ b/packages/grafana-e2e/src/index.ts @@ -4,6 +4,7 @@ * @packageDocumentation */ import { e2eScenario, ScenarioArguments } from './support/scenario'; +import { benchmark } from './support/benchmark'; import { getScenarioContext, setScenarioContext } from './support/scenarioContext'; import { e2eFactory } from './support'; import { E2ESelectors, Selectors, selectors } from '@grafana/e2e-selectors'; @@ -16,6 +17,7 @@ const e2eObject = { blobToBase64String: (blob: any) => Cypress.Blob.blobToBase64String(blob), imgSrcToBlob: (url: string) => Cypress.Blob.imgSrcToBlob(url), scenario: (args: ScenarioArguments) => e2eScenario(args), + benchmark, pages: e2eFactory({ selectors: selectors.pages }), typings, components: e2eFactory({ selectors: selectors.components }), diff --git a/packages/grafana-e2e/src/support/benchmark.ts b/packages/grafana-e2e/src/support/benchmark.ts new file mode 100644 index 00000000000..70dbfb45028 --- /dev/null +++ b/packages/grafana-e2e/src/support/benchmark.ts @@ -0,0 +1,81 @@ +import { e2e } from '../'; + +export interface BenchmarkArguments { + name: string; + dashboard: { + folder: string; + delayAfterOpening: number; + skipPanelValidation: boolean; + }; + repeat: number; + duration: number; + appStats?: { + startCollecting?: (window: Window) => void; + collect: (window: Window) => Record; + }; + skipScenario?: boolean; +} + +export const benchmark = ({ + name, + skipScenario = false, + repeat, + duration, + appStats, + dashboard, +}: BenchmarkArguments) => { + if (skipScenario) { + describe(name, () => { + it.skip(name, () => {}); + }); + } + + describe(name, () => { + before(() => { + e2e.flows.login(e2e.env('USERNAME'), e2e.env('PASSWORD')); + }); + + beforeEach(() => { + e2e.flows.importDashboards(dashboard.folder, 1000, dashboard.skipPanelValidation); + Cypress.Cookies.preserveOnce('grafana_session'); + }); + + afterEach(() => e2e.flows.revertAllChanges()); + after(() => { + e2e().clearCookies(); + }); + + Array(repeat) + .fill(0) + .map((_, i) => { + const testName = `${name}-${i}`; + return it(testName, () => { + e2e.flows.openDashboard(); + + e2e().wait(dashboard.delayAfterOpening); + + if (appStats) { + const startCollecting = appStats.startCollecting; + if (startCollecting) { + e2e() + .window() + .then((win) => startCollecting(win)); + } + + e2e().startBenchmarking(testName); + e2e().wait(duration); + + e2e() + .window() + .then((win) => { + e2e().stopBenchmarking(testName, appStats.collect(win)); + }); + } else { + e2e().startBenchmarking(testName); + e2e().wait(duration); + e2e().stopBenchmarking(testName, {}); + } + }); + }); + }); +}; diff --git a/packages/grafana-e2e/src/support/scenario.ts b/packages/grafana-e2e/src/support/scenario.ts index 1a499c8218a..b4926b5bfbc 100644 --- a/packages/grafana-e2e/src/support/scenario.ts +++ b/packages/grafana-e2e/src/support/scenario.ts @@ -7,6 +7,7 @@ export interface ScenarioArguments { skipScenario?: boolean; addScenarioDataSource?: boolean; addScenarioDashBoard?: boolean; + loginViaApi?: boolean; } export const e2eScenario = ({ @@ -16,12 +17,13 @@ export const e2eScenario = ({ skipScenario = false, addScenarioDataSource = false, addScenarioDashBoard = false, + loginViaApi = true, }: ScenarioArguments) => { describe(describeName, () => { if (skipScenario) { it.skip(itName, () => scenario()); } else { - before(() => e2e.flows.login(e2e.env('USERNAME'), e2e.env('PASSWORD'))); + before(() => e2e.flows.login(e2e.env('USERNAME'), e2e.env('PASSWORD'), loginViaApi)); beforeEach(() => { Cypress.Cookies.preserveOnce('grafana_session'); diff --git a/packages/grafana-e2e/src/support/types.ts b/packages/grafana-e2e/src/support/types.ts index 5ec63229821..dc63400cd96 100644 --- a/packages/grafana-e2e/src/support/types.ts +++ b/packages/grafana-e2e/src/support/types.ts @@ -3,7 +3,7 @@ import { e2e } from '../index'; import { Selector } from './selector'; import { fromBaseUrl } from './url'; -export type VisitFunction = (args?: string) => Cypress.Chainable; +export type VisitFunction = (args?: string, queryParams?: object) => Cypress.Chainable; export type E2EVisit = { visit: VisitFunction }; export type E2EFunction = ((text?: string, options?: CypressOptions) => Cypress.Chainable>) & E2EFunctionWithOnlyOptions; @@ -40,7 +40,7 @@ const processSelectors = (e2eObjects: E2EFunctions, sele if (key === 'url') { // @ts-ignore - e2eObjects['visit'] = (args?: string) => { + e2eObjects['visit'] = (args?: string, queryParams?: object) => { let parsedUrl = ''; if (typeof value === 'string') { parsedUrl = fromBaseUrl(value); @@ -51,7 +51,11 @@ const processSelectors = (e2eObjects: E2EFunctions, sele } e2e().logToConsole('Visiting', parsedUrl); - return e2e().visit(parsedUrl); + if (queryParams) { + return e2e().visit({ url: parsedUrl, qs: queryParams }); + } else { + return e2e().visit(parsedUrl); + } }; continue; diff --git a/packages/grafana-e2e/tsconfig.json b/packages/grafana-e2e/tsconfig.json index 7e51e9fbda7..9936ed1fd49 100644 --- a/packages/grafana-e2e/tsconfig.json +++ b/packages/grafana-e2e/tsconfig.json @@ -3,7 +3,6 @@ "declarationDir": "dist", "outDir": "compiled", "rootDirs": ["."], - "typeRoots": ["node_modules/@types"], "types": ["cypress"] }, "exclude": ["dist", "node_modules"], diff --git a/packages/grafana-runtime/package.json b/packages/grafana-runtime/package.json index 2f325dd228a..9a573c347e2 100644 --- a/packages/grafana-runtime/package.json +++ b/packages/grafana-runtime/package.json @@ -2,7 +2,7 @@ "author": "Grafana Labs", "license": "Apache-2.0", "name": "@grafana/runtime", - "version": "8.3.0-pre", + "version": "8.4.0-pre", "description": "Grafana Runtime Library", "keywords": [ "grafana", @@ -22,30 +22,38 @@ "typecheck": "tsc --noEmit" }, "dependencies": { - "@emotion/css": "11.1.3", - "@grafana/data": "8.3.0-pre", - "@grafana/e2e-selectors": "8.3.0-pre", - "@grafana/ui": "8.3.0-pre", + "@grafana/data": "8.4.0-pre", + "@grafana/e2e-selectors": "8.4.0-pre", + "@grafana/ui": "8.4.0-pre", + "@sentry/browser": "6.16.1", "history": "4.10.1", + "lodash": "4.17.21", + "react": "17.0.2", + "react-dom": "17.0.2", + "rxjs": "7.5.1", "systemjs": "0.20.19", - "systemjs-plugin-css": "0.1.37", "tslib": "2.3.1" }, "devDependencies": { "@grafana/tsconfig": "^1.0.0-rc1", - "@rollup/plugin-commonjs": "16.0.0", - "@rollup/plugin-node-resolve": "10.0.0", + "@rollup/plugin-commonjs": "21.0.1", + "@rollup/plugin-node-resolve": "13.1.3", + "@testing-library/dom": "^8.11.1", + "@testing-library/react": "^12.1.2", + "@testing-library/user-event": "^13.5.0", + "@types/angular": "1.8.4", "@types/history": "^4.7.8", - "@types/jest": "26.0.15", - "@types/rollup-plugin-visualizer": "4.2.1", + "@types/jest": "27.4.0", + "@types/lodash": "4.14.149", + "@types/react": "17.0.38", + "@types/react-dom": "17.0.11", "@types/systemjs": "^0.20.6", "lodash": "4.17.21", - "rollup": "2.33.3", + "rimraf": "3.0.2", + "rollup": "2.63.0", "rollup-plugin-sourcemaps": "0.6.3", "rollup-plugin-terser": "7.0.2", - "rollup-plugin-typescript2": "0.29.0", - "rollup-plugin-visualizer": "4.2.0", - "typescript": "4.4.3" + "typescript": "4.5.4" }, "types": "src/index.ts" } diff --git a/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx b/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx new file mode 100644 index 00000000000..6f18fe2141a --- /dev/null +++ b/packages/grafana-runtime/src/components/DataSourcePicker.test.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { DataSourcePicker } from './DataSourcePicker'; +import { render } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; + +jest.mock('../services/dataSourceSrv'); + +describe('DataSourcePicker', () => { + describe('onClear', () => { + it('should call onClear when function is passed', async () => { + const onClear = jest.fn(); + const select = render(); + + const clearButton = select.getByLabelText('select-clear-value'); + userEvent.click(clearButton); + expect(onClear).toHaveBeenCalled(); + }); + + it('should not render clear button when no onClear function is passed', async () => { + const select = render(); + + expect(() => { + select.getByLabelText('select-clear-value'); + }).toThrowError(); + }); + }); +}); diff --git a/packages/grafana-runtime/src/components/DataSourcePicker.tsx b/packages/grafana-runtime/src/components/DataSourcePicker.tsx index 334f7cd1dbe..3e1bff0ad29 100644 --- a/packages/grafana-runtime/src/components/DataSourcePicker.tsx +++ b/packages/grafana-runtime/src/components/DataSourcePicker.tsx @@ -2,11 +2,16 @@ import React, { PureComponent } from 'react'; // Components -import { HorizontalGroup, PluginSignatureBadge, Select, stylesFactory } from '@grafana/ui'; -import { DataSourceInstanceSettings, isUnsignedPluginSignature, SelectableValue } from '@grafana/data'; +import { ActionMeta, HorizontalGroup, PluginSignatureBadge, Select } from '@grafana/ui'; +import { + DataSourceInstanceSettings, + DataSourceRef, + getDataSourceUID, + isUnsignedPluginSignature, + SelectableValue, +} from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { getDataSourceSrv } from '../services/dataSourceSrv'; -import { css, cx } from '@emotion/css'; /** * Component props description for the {@link DataSourcePicker} @@ -15,7 +20,7 @@ import { css, cx } from '@emotion/css'; */ export interface DataSourcePickerProps { onChange: (ds: DataSourceInstanceSettings) => void; - current: string | null; + current: DataSourceRef | string | null; // uid hideTextValue?: boolean; onBlur?: () => void; autoFocus?: boolean; @@ -33,7 +38,9 @@ export interface DataSourcePickerProps { // If set to true and there is no value select will be empty, otherwise it will preselect default data source noDefault?: boolean; width?: number; + inputId?: string; filter?: (dataSource: DataSourceInstanceSettings) => boolean; + onClear?: () => void; } /** @@ -74,7 +81,12 @@ export class DataSourcePicker extends PureComponent) => { + onChange = (item: SelectableValue, actionMeta: ActionMeta) => { + if (actionMeta.action === 'clear' && this.props.onClear) { + this.props.onClear(); + return; + } + const dsSettings = this.dataSourceSrv.getInstanceSettings(item.value); if (dsSettings) { @@ -85,7 +97,6 @@ export class DataSourcePicker extends PureComponent | undefined { const { current, hideTextValue, noDefault } = this.props; - if (!current && noDefault) { return; } @@ -95,16 +106,17 @@ export class DataSourcePicker extends PureComponent o.value === dataSourceConfig.access)[0] || DEFAULT_ACCESS_OPTION} onChange={(selectedValue) => onSettingsChange({ access: selectedValue.value })} @@ -180,6 +181,8 @@ export const DataSourceHttpSettings: React.FC = (props) => { labelWidth={13} inputWidth={20} tooltip="HTTP request timeout in seconds" + placeholder="Timeout in seconds" + aria-label="Timeout in seconds" value={dataSourceConfig.jsonData.timeout} onChange={(event) => { onSettingsChange({ diff --git a/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx index 5e99390677d..7fdc9dba1a0 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DatePicker/DatePicker.tsx @@ -1,6 +1,6 @@ import React, { memo } from 'react'; import Calendar from 'react-calendar'; -import { css } from 'emotion'; +import { css } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { useStyles2 } from '../../../themes'; import { ClickOutsideWrapper } from '../../ClickOutsideWrapper/ClickOutsideWrapper'; diff --git a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx index 9df4a280f93..e375170e4b8 100644 --- a/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx +++ b/packages/grafana-ui/src/components/DateTimePickers/DateTimePicker/DateTimePicker.tsx @@ -135,7 +135,7 @@ const DateTimeInput: FC = ({ date, label, onChange, isFullscreen, on } }, [internalDate.value, onChange]); - const icon = - ) : null; +export const FilterInput = React.forwardRef( + ({ value, width, onChange, ...restProps }, ref) => { + const innerRef = React.useRef(null); + const combinedRef = useCombinedRefs(ref, innerRef) as React.Ref; - return ( - } - ref={inputRef} - suffix={suffix} - width={width} - type="text" - value={value ? unEscapeStringFromRegex(value) : ''} - onChange={(event) => onChange(escapeStringForRegex(event.currentTarget.value))} - onKeyDown={onKeyDown} - placeholder={placeholder} - /> - ); -}; + const suffix = + value !== '' ? ( + + ) : null; + + return ( + } + suffix={suffix} + width={width} + type="text" + value={value ? unEscapeStringFromRegex(value) : ''} + onChange={(event) => onChange(escapeStringForRegex(event.currentTarget.value))} + {...restProps} + ref={combinedRef} + /> + ); + } +); + +FilterInput.displayName = 'FilterInput'; diff --git a/packages/grafana-ui/src/components/Forms/Field.tsx b/packages/grafana-ui/src/components/Forms/Field.tsx index 2f1d1230ede..490a0d0f09e 100644 --- a/packages/grafana-ui/src/components/Forms/Field.tsx +++ b/packages/grafana-ui/src/components/Forms/Field.tsx @@ -4,7 +4,7 @@ import { stylesFactory, useTheme2 } from '../../themes'; import { css, cx } from '@emotion/css'; import { GrafanaTheme2 } from '@grafana/data'; import { FieldValidationMessage } from './FieldValidationMessage'; -import { getChildId } from '../../utils/children'; +import { getChildId } from '../../utils/reactUtils'; export interface FieldProps extends HTMLAttributes { /** Form input element, i.e Input or Switch */ @@ -22,7 +22,7 @@ export interface FieldProps extends HTMLAttributes { /** Indicates if field is required */ required?: boolean; /** Error message to display */ - error?: string | null; + error?: React.ReactNode; /** Indicates horizontal layout of the field */ horizontal?: boolean; /** make validation message overflow horizontally. Prevents pushing out adjacent inline components */ diff --git a/packages/grafana-ui/src/components/Forms/FieldSet.tsx b/packages/grafana-ui/src/components/Forms/FieldSet.tsx index a4affa49407..0749e9856de 100644 --- a/packages/grafana-ui/src/components/Forms/FieldSet.tsx +++ b/packages/grafana-ui/src/components/Forms/FieldSet.tsx @@ -4,10 +4,10 @@ import { GrafanaTheme2 } from '@grafana/data'; import { stylesFactory, useTheme2 } from '../../themes'; import { Legend } from './Legend'; -export interface Props extends HTMLProps { +export interface Props extends Omit, 'label'> { children: React.ReactNode[] | React.ReactNode; - /** Text for the fieldset's legend */ - label?: string; + /** Label for the fieldset's legend */ + label?: React.ReactNode; } export const FieldSet: FC = ({ label, children, className, ...rest }) => { diff --git a/packages/grafana-ui/src/components/Forms/FieldValidationMessage.story.tsx b/packages/grafana-ui/src/components/Forms/FieldValidationMessage.story.tsx index 15ab04e1b06..d5d162062d8 100644 --- a/packages/grafana-ui/src/components/Forms/FieldValidationMessage.story.tsx +++ b/packages/grafana-ui/src/components/Forms/FieldValidationMessage.story.tsx @@ -1,9 +1,9 @@ import React from 'react'; import { Meta, Story } from '@storybook/react'; -import { FieldValidationMessage, FieldValidationMessageProps } from './FieldValidationMessage'; +import { FieldValidationMessage } from './FieldValidationMessage'; import mdx from './FieldValidationMessage.mdx'; -export default { +const story = { title: 'Forms/FieldValidationMessage', component: FieldValidationMessage, parameters: { @@ -21,8 +21,12 @@ export default { argTypes: { children: { name: 'message' }, }, -} as Meta; +}; -export const Basic: Story = (args) => { +export default story as Meta; + +type Args = typeof story['args']; + +export const Basic: Story = (args) => { return {args.children}; }; diff --git a/packages/grafana-ui/src/components/Forms/FieldValidationMessage.tsx b/packages/grafana-ui/src/components/Forms/FieldValidationMessage.tsx index 5cf178469ec..2e551d7b764 100644 --- a/packages/grafana-ui/src/components/Forms/FieldValidationMessage.tsx +++ b/packages/grafana-ui/src/components/Forms/FieldValidationMessage.tsx @@ -5,7 +5,6 @@ import { Icon } from '../Icon/Icon'; import { stylesFactory, useTheme2 } from '../../themes'; export interface FieldValidationMessageProps { - children: string; /** Override component style */ className?: string; horizontal?: boolean; diff --git a/packages/grafana-ui/src/components/Forms/InlineField.tsx b/packages/grafana-ui/src/components/Forms/InlineField.tsx index 583af8b9b80..60ff61e36a5 100644 --- a/packages/grafana-ui/src/components/Forms/InlineField.tsx +++ b/packages/grafana-ui/src/components/Forms/InlineField.tsx @@ -1,11 +1,12 @@ import React, { FC } from 'react'; import { cx, css } from '@emotion/css'; -import { GrafanaTheme } from '@grafana/data'; -import { useTheme } from '../../themes'; +import { GrafanaTheme2 } from '@grafana/data'; +import { useTheme2 } from '../../themes'; import { InlineLabel } from './InlineLabel'; import { PopoverContent } from '../Tooltip/Tooltip'; import { FieldProps } from './Field'; -import { getChildId } from '../../utils/children'; +import { getChildId } from '../../utils/reactUtils'; +import { FieldValidationMessage } from './FieldValidationMessage'; export interface Props extends Omit { /** Content for the label's tooltip */ @@ -16,6 +17,8 @@ export interface Props extends Omit = ({ className, htmlFor, grow, + error, transparent, ...htmlProps }) => { - const theme = useTheme(); + const theme = useTheme2(); const styles = getStyles(theme, grow); const inputId = htmlFor ?? getChildId(children); @@ -49,14 +53,21 @@ export const InlineField: FC = ({ return (
{labelElement} - {React.cloneElement(children, { invalid, disabled, loading })} +
+ {React.cloneElement(children, { invalid, disabled, loading })} + {invalid && error && ( +
+ {error} +
+ )} +
); }; InlineField.displayName = 'InlineField'; -const getStyles = (theme: GrafanaTheme, grow?: boolean) => { +const getStyles = (theme: GrafanaTheme2, grow?: boolean) => { return { container: css` display: flex; @@ -65,7 +76,13 @@ const getStyles = (theme: GrafanaTheme, grow?: boolean) => { text-align: left; position: relative; flex: ${grow ? 1 : 0} 0 auto; - margin: 0 ${theme.spacing.xs} ${theme.spacing.xs} 0; + margin: 0 ${theme.spacing(0.5)} ${theme.spacing(0.5)} 0; + `, + childContainer: css` + flex: ${grow ? 1 : 0} 0 auto; + `, + fieldValidationWrapper: css` + margin-top: ${theme.spacing(0.5)}; `, }; }; diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx index 609757a49a6..077199661ed 100644 --- a/packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx +++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/NoOptionsMessage.tsx @@ -1,18 +1,17 @@ import React from 'react'; -import { components, OptionProps } from 'react-select'; +import { components, NoticeProps, GroupBase } from 'react-select'; +import { SelectableValue } from '@grafana/data'; -export interface Props { - children: Element; -} +export type Props = NoticeProps, boolean, GroupBase>>; -export const NoOptionsMessage = (props: OptionProps) => { +export const NoOptionsMessage = (props: Props) => { const { children } = props; return ( - +
{children}
-
+ ); }; diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx index 35bc7f3be08..348914dc44e 100644 --- a/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx +++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/Select.tsx @@ -15,7 +15,8 @@ import NoOptionsMessage from './NoOptionsMessage'; import resetSelectStyles from '../../../Select/resetSelectStyles'; import { CustomScrollbar } from '../../../CustomScrollbar/CustomScrollbar'; import { PopoverContent, Tooltip } from '../../../Tooltip/Tooltip'; -import { SelectableValue } from '@grafana/data'; +import { GrafanaTheme2, SelectableValue } from '@grafana/data'; +import { ThemeContext } from '../../../../themes'; /** * Changes in new selects: @@ -49,6 +50,8 @@ export const MenuList = (props: any) => { ); }; export class Select extends PureComponent> { + static contextType = ThemeContext; + static defaultProps: Partial> = { className: '', isDisabled: false, @@ -101,6 +104,7 @@ export class Select extends PureComponent> { onOpenMenu, allowCustomValue, formatCreateLabel, + 'aria-label': ariaLabel, } = this.props; let widthClass = ''; @@ -136,7 +140,7 @@ export class Select extends PureComponent> { onChange={onChange} options={options} placeholder={placeholder || 'Choose'} - styles={resetSelectStyles()} + styles={resetSelectStyles(this.context as GrafanaTheme2)} isDisabled={isDisabled} isLoading={isLoading} isClearable={isClearable} @@ -151,6 +155,7 @@ export class Select extends PureComponent> { onMenuOpen={onOpenMenuInternal} onMenuClose={onCloseMenuInternal} tabSelectsValue={tabSelectsValue} + aria-label={ariaLabel} {...creatableOptions} /> ); @@ -216,7 +221,6 @@ export class AsyncSelect extends PureComponent> { {(onOpenMenuInternal, onCloseMenuInternal) => { return ( - //@ts-expect-error extends PureComponent> { }} defaultValue={defaultValue} value={value} + //@ts-expect-error getOptionLabel={getOptionLabel} getOptionValue={getOptionValue} menuShouldScrollIntoView={false} @@ -237,6 +242,7 @@ export class AsyncSelect extends PureComponent> { isLoading={isLoading} defaultOptions={defaultOptions} placeholder={placeholder || 'Choose'} + //@ts-expect-error styles={resetSelectStyles()} loadingMessage={() => loadingMessage} noOptionsMessage={noOptionsMessage} diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.test.tsx b/packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.test.tsx index 381743328cd..aa68baed4c6 100644 --- a/packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.test.tsx +++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/SelectOption.test.tsx @@ -1,9 +1,8 @@ import React from 'react'; import renderer from 'react-test-renderer'; import SelectOption from './SelectOption'; -import { OptionProps } from 'react-select/src/components/Option'; +import { OptionProps } from 'react-select'; -// @ts-ignore const model: OptionProps = { data: jest.fn(), cx: jest.fn(), @@ -14,12 +13,13 @@ const model: OptionProps = { isMulti: false, options: [], selectOption: jest.fn(), + // @ts-ignore selectProps: {}, setValue: jest.fn(), isDisabled: false, isFocused: false, isSelected: false, - innerRef: null, + innerRef: jest.fn(), innerProps: { id: '', key: '', diff --git a/packages/grafana-ui/src/components/Forms/Legacy/Select/__snapshots__/SelectOption.test.tsx.snap b/packages/grafana-ui/src/components/Forms/Legacy/Select/__snapshots__/SelectOption.test.tsx.snap index 393d101afd2..c5a0bd370a0 100644 --- a/packages/grafana-ui/src/components/Forms/Legacy/Select/__snapshots__/SelectOption.test.tsx.snap +++ b/packages/grafana-ui/src/components/Forms/Legacy/Select/__snapshots__/SelectOption.test.tsx.snap @@ -2,6 +2,7 @@ exports[`SelectOption renders correctly 1`] = `
void; + onClick: () => void; fullWidth?: boolean; 'aria-label'?: StringSelector; + children?: React.ReactNode; } -export const RadioButton: React.FC = ({ - children, - active = false, - disabled = false, - size = 'md', - onChange, - id, - name = undefined, - description, - fullWidth, - 'aria-label': ariaLabel, -}) => { - const theme = useTheme2(); - const styles = getRadioButtonStyles(theme, size, fullWidth); +export const RadioButton = React.forwardRef( + ( + { + children, + active = false, + disabled = false, + size = 'md', + onChange, + onClick, + id, + name = undefined, + description, + fullWidth, + 'aria-label': ariaLabel, + }, + ref + ) => { + const theme = useTheme2(); + const styles = getRadioButtonStyles(theme, size, fullWidth); - return ( - <> - - - - ); -}; + return ( + <> + + + + ); + } +); RadioButton.displayName = 'RadioButton'; diff --git a/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.tsx b/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.tsx index c8bc83deff4..dacd001a8a1 100644 --- a/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.tsx +++ b/packages/grafana-ui/src/components/Forms/RadioButtonGroup/RadioButtonGroup.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useRef } from 'react'; +import React, { useCallback, useEffect, useRef } from 'react'; import { css, cx } from '@emotion/css'; import { uniqueId } from 'lodash'; import { GrafanaTheme2, SelectableValue } from '@grafana/data'; @@ -13,20 +13,24 @@ export interface RadioButtonGroupProps { disabledOptions?: T[]; options: Array>; onChange?: (value: T) => void; + onClick?: (value: T) => void; size?: RadioButtonSize; fullWidth?: boolean; className?: string; + autoFocus?: boolean; } export function RadioButtonGroup({ options, value, onChange, + onClick, disabled, disabledOptions, size = 'md', className, fullWidth = false, + autoFocus = false, }: RadioButtonGroupProps) { const handleOnChange = useCallback( (option: SelectableValue) => { @@ -38,10 +42,27 @@ export function RadioButtonGroup({ }, [onChange] ); + const handleOnClick = useCallback( + (option: SelectableValue) => { + return () => { + if (onClick) { + onClick(option.value); + } + }; + }, + [onClick] + ); const id = uniqueId('radiogroup-'); const groupName = useRef(id); const styles = useStyles2(getStyles); + const activeButtonRef = useRef(null); + useEffect(() => { + if (autoFocus && activeButtonRef.current) { + activeButtonRef.current.focus(); + } + }, [autoFocus]); + return (
{options.map((o, i) => { @@ -54,10 +75,12 @@ export function RadioButtonGroup({ key={`o.label-${i}`} aria-label={o.ariaLabel} onChange={handleOnChange(o)} + onClick={handleOnClick(o)} id={`option-${o.value}-${id}`} name={groupName.current} description={o.description} fullWidth={fullWidth} + ref={value === o.value ? activeButtonRef : undefined} > {o.icon && } {o.imgUrl && {o.label}} diff --git a/packages/grafana-ui/src/components/Graph/Graph.story.internal.tsx b/packages/grafana-ui/src/components/Graph/Graph.story.internal.tsx deleted file mode 100644 index 08b1451d6c1..00000000000 --- a/packages/grafana-ui/src/components/Graph/Graph.story.internal.tsx +++ /dev/null @@ -1,149 +0,0 @@ -import React from 'react'; -import { TooltipDisplayMode } from '@grafana/schema'; -import { dateTime, ArrayVector, FieldType, GraphSeriesXY, FieldColorModeId, getDisplayProcessor } from '@grafana/data'; -import { Story } from '@storybook/react'; -import { useTheme2 } from '../../themes'; -import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; -import { VizTooltip, VizTooltipContentProps } from '../VizTooltip'; -import { JSONFormatter } from '../JSONFormatter/JSONFormatter'; -import { GraphProps, Graph } from './Graph'; - -const series: GraphSeriesXY[] = [ - { - data: [ - [1546372800000, 10], - [1546376400000, 20], - [1546380000000, 10], - ], - color: 'red', - isVisible: true, - label: 'A-series', - seriesIndex: 0, - timeField: { - type: FieldType.time, - name: 'time', - values: new ArrayVector([1546372800000, 1546376400000, 1546380000000]), - config: {}, - }, - valueField: { - type: FieldType.number, - name: 'a-series', - values: new ArrayVector([10, 20, 10]), - config: { - color: { - mode: FieldColorModeId.Fixed, - fixedColor: 'red', - }, - }, - }, - timeStep: 3600000, - yAxis: { - index: 0, - }, - }, - { - data: [ - [1546372800000, 20], - [1546376400000, 30], - [1546380000000, 40], - ], - color: 'blue', - isVisible: true, - label: - "B-series with an ultra wide label that probably gonna make the tooltip to overflow window. This situation happens, so let's better make sure it behaves nicely :)", - seriesIndex: 1, - timeField: { - type: FieldType.time, - name: 'time', - values: new ArrayVector([1546372800000, 1546376400000, 1546380000000]), - config: {}, - }, - valueField: { - type: FieldType.number, - name: - "B-series with an ultra wide label that is probably going go make the tooltip overflow window. This situation happens, so let's better make sure it behaves nicely :)", - values: new ArrayVector([20, 30, 40]), - config: { - color: { - mode: FieldColorModeId.Fixed, - fixedColor: 'blue', - }, - }, - }, - timeStep: 3600000, - yAxis: { - index: 0, - }, - }, -]; - -export default { - title: 'Visualizations/Graph', - component: Graph, - decorators: [withCenteredStory], - parameters: { - controls: { - exclude: ['className', 'ariaLabel'], - }, - }, - args: { - series: series, - height: 300, - width: 600, - timeRange: { - from: dateTime(1546372800000), - to: dateTime(1546380000000), - raw: { - from: dateTime(1546372800000), - to: dateTime(1546380000000), - }, - }, - timeZone: 'browser', - tooltipMode: 'single', - }, - argTypes: { - tooltipMode: { control: { type: 'radio', options: ['multi', 'single'] } }, - timeZone: { control: { type: 'radio', options: ['browser', 'utc'] } }, - width: { control: { type: 'range', min: 200, max: 800 } }, - height: { control: { type: 'range', min: 200, max: 1700, step: 300 } }, - lineWidth: { control: { type: 'range', min: 1, max: 10 } }, - }, -}; - -export const WithTooltip: Story = ({ - tooltipMode, - series, - ...args -}) => { - const theme = useTheme2(); - const seriesWithDisplay = series.map((data) => ({ - ...data, - valueField: { ...data.valueField, display: getDisplayProcessor({ field: data.valueField, theme }) }, - })); - - return ( - - - - ); -}; - -const CustomGraphTooltip = ({ activeDimensions }: VizTooltipContentProps) => { - return ( -
-
Showing currently active active dimensions:
- -
- ); -}; - -export const WithCustomTooltip: Story = ({ - tooltipMode, - ...args -}) => { - return ( - - - - ); -}; diff --git a/packages/grafana-ui/src/components/Graph/Graph.tsx b/packages/grafana-ui/src/components/Graph/Graph.tsx index 9ab60ab6b61..9938e158cf8 100644 --- a/packages/grafana-ui/src/components/Graph/Graph.tsx +++ b/packages/grafana-ui/src/components/Graph/Graph.tsx @@ -37,6 +37,13 @@ interface GraphState { contextItem?: FlotItem; } +/** + * This is a react wrapper for the angular, flot based graph visualization. + * Rather than using this component, you should use the ` with + * timeseries panel configs. + * + * @deprecated + */ export class Graph extends PureComponent { static defaultProps = { showLines: true, diff --git a/packages/grafana-ui/src/components/GraphNG/GraphNG.story.internal.tsx b/packages/grafana-ui/src/components/GraphNG/GraphNG.story.internal.tsx deleted file mode 100644 index ae37418ac46..00000000000 --- a/packages/grafana-ui/src/components/GraphNG/GraphNG.story.internal.tsx +++ /dev/null @@ -1,84 +0,0 @@ -import { FieldColorModeId, toDataFrame, dateTime } from '@grafana/data'; -import React from 'react'; -import { withCenteredStory } from '../../utils/storybook/withCenteredStory'; -import { GraphNGProps } from './GraphNG'; -import { LegendDisplayMode, LegendPlacement } from '@grafana/schema'; -import { prepDataForStorybook } from '../../utils/storybook/data'; -import { useTheme2 } from '../../themes'; -import { Story } from '@storybook/react'; -import { TimeSeries } from '../TimeSeries/TimeSeries'; - -export default { - title: 'Visualizations/GraphNG', - component: TimeSeries, - decorators: [withCenteredStory], - parameters: { - controls: { - exclude: ['className', 'data', 'legend', 'fields', 'structureRev', 'onLegendClick', 'preparePlotFrame'], - }, - }, - argTypes: { - legendDisplayMode: { control: { type: 'radio', options: ['table', 'list', 'hidden'] } }, - placement: { control: { type: 'radio', options: ['bottom', 'right'] } }, - timeZone: { control: { type: 'radio', options: ['browser', 'utc'] } }, - width: { control: { type: 'range', min: 200, max: 800 } }, - height: { control: { type: 'range', min: 200, max: 800 } }, - }, -}; - -interface StoryProps extends GraphNGProps { - legendDisplayMode: string; - placement: LegendPlacement; - unit: string; -} -export const Lines: Story = ({ placement, unit, legendDisplayMode, ...args }) => { - const theme = useTheme2(); - const seriesA = toDataFrame({ - target: 'SeriesA', - datapoints: [ - [10, 1546372800000], - [20, 1546376400000], - [10, 1546380000000], - ], - }); - - seriesA.fields[1].config.custom = { line: { show: true } }; - seriesA.fields[1].config.color = { mode: FieldColorModeId.PaletteClassic }; - seriesA.fields[1].config.unit = unit; - - const data = prepDataForStorybook([seriesA], theme); - - return ( - - ); -}; -Lines.args = { - width: 600, - height: 400, - timeRange: { - from: dateTime(1546372800000), - to: dateTime(1546380000000), - raw: { - from: dateTime(1546372800000), - to: dateTime(1546380000000), - }, - }, - legendDisplayMode: 'list', - placement: 'bottom', - unit: 'short', - timeZone: 'browser', -}; diff --git a/packages/grafana-ui/src/components/GraphNG/GraphNG.tsx b/packages/grafana-ui/src/components/GraphNG/GraphNG.tsx index 2cb1f678d8b..e33de639ef2 100755 --- a/packages/grafana-ui/src/components/GraphNG/GraphNG.tsx +++ b/packages/grafana-ui/src/components/GraphNG/GraphNG.tsx @@ -1,11 +1,12 @@ import React from 'react'; -import { AlignedData } from 'uplot'; +import uPlot, { AlignedData } from 'uplot'; import { Themeable2 } from '../../types'; import { findMidPointYPosition, pluginLog } from '../uPlot/utils'; import { DataFrame, DataHoverClearEvent, DataHoverEvent, + Field, FieldMatcherID, fieldMatchers, LegacyGraphHoverEvent, @@ -18,9 +19,11 @@ import { PanelContext, PanelContextRoot } from '../PanelChrome/PanelContext'; import { Subscription } from 'rxjs'; import { throttleTime } from 'rxjs/operators'; import { GraphNGLegendEvent, XYFieldMatchers } from './types'; -import { UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder'; +import { Renderers, UPlotConfigBuilder } from '../uPlot/config/UPlotConfigBuilder'; import { VizLayout } from '../VizLayout/VizLayout'; import { UPlotChart } from '../uPlot/Plot'; +import { ScaleProps } from '../uPlot/config/UPlotScaleBuilder'; +import { AxisProps } from '../uPlot/config/UPlotAxisBuilder'; /** * @internal -- not a public API @@ -41,12 +44,23 @@ export interface GraphNGProps extends Themeable2 { timeZone: TimeZone; legend: VizLegendOptions; fields?: XYFieldMatchers; // default will assume timeseries data + renderers?: Renderers; + tweakScale?: (opts: ScaleProps, forField: Field) => ScaleProps; + tweakAxis?: (opts: AxisProps, forField: Field) => AxisProps; onLegendClick?: (event: GraphNGLegendEvent) => void; children?: (builder: UPlotConfigBuilder, alignedFrame: DataFrame) => React.ReactNode; prepConfig: (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => UPlotConfigBuilder; propsToDiff?: Array; preparePlotFrame?: (frames: DataFrame[], dimFields: XYFieldMatchers) => DataFrame; renderLegend: (config: UPlotConfigBuilder) => React.ReactElement | null; + + /** + * needed for propsToDiff to re-init the plot & config + * this is a generic approach to plot re-init, without having to specify which panel-level options + * should cause invalidation. we can drop this in favor of something like panelOptionsRev that gets passed in + * similar to structureRev. then we can drop propsToDiff entirely. + */ + options?: Record; } function sameProps(prevProps: any, nextProps: any, propsToDiff: Array = []) { diff --git a/packages/grafana-ui/src/components/GraphNG/__snapshots__/utils.test.ts.snap b/packages/grafana-ui/src/components/GraphNG/__snapshots__/utils.test.ts.snap index 62c51603c9d..8128c4dd89a 100644 --- a/packages/grafana-ui/src/components/GraphNG/__snapshots__/utils.test.ts.snap +++ b/packages/grafana-ui/src/components/GraphNG/__snapshots__/utils.test.ts.snap @@ -4,6 +4,7 @@ exports[`GraphNG utils preparePlotConfigBuilder 1`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -12,6 +13,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "x", "show": true, "side": 2, @@ -29,6 +31,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -37,7 +40,8 @@ Object { "width": 1, }, "labelGap": 0, - "scale": "__fixed", + "rotate": undefined, + "scale": "__fixed/na-na/na-na/auto/linear/na", "show": true, "side": 3, "size": [Function], @@ -93,7 +97,7 @@ Object { ], "scales": Array [ "x", - "__fixed", + null, ], }, }, @@ -101,7 +105,7 @@ Object { "mode": 1, "padding": undefined, "scales": Object { - "__fixed": Object { + "__fixed/na-na/na-na/auto/linear/na": Object { "auto": true, "dir": 1, "distr": 1, @@ -139,7 +143,7 @@ Object { "stroke": "#ff0000", }, "pxAlign": undefined, - "scale": "__fixed", + "scale": "__fixed/na-na/na-na/auto/linear/na", "show": true, "spanGaps": false, "stroke": "#ff0000", @@ -162,7 +166,7 @@ Object { "stroke": "#ff0000", }, "pxAlign": undefined, - "scale": "__fixed", + "scale": "__fixed/na-na/na-na/auto/linear/na", "show": true, "spanGaps": false, "stroke": "#ff0000", @@ -185,7 +189,7 @@ Object { "stroke": "#ff0000", }, "pxAlign": undefined, - "scale": "__fixed", + "scale": "__fixed/na-na/na-na/auto/linear/na", "show": true, "spanGaps": false, "stroke": "#ff0000", @@ -208,7 +212,7 @@ Object { "stroke": "#ff0000", }, "pxAlign": undefined, - "scale": "__fixed", + "scale": "__fixed/na-na/na-na/auto/linear/na", "show": true, "spanGaps": false, "stroke": "#ff0000", @@ -231,7 +235,7 @@ Object { "stroke": "#ff0000", }, "pxAlign": undefined, - "scale": "__fixed", + "scale": "__fixed/na-na/na-na/auto/linear/na", "show": true, "spanGaps": false, "stroke": "#ff0000", diff --git a/packages/grafana-ui/src/components/GraphNG/utils.ts b/packages/grafana-ui/src/components/GraphNG/utils.ts index dd07370a82c..fe733543086 100644 --- a/packages/grafana-ui/src/components/GraphNG/utils.ts +++ b/packages/grafana-ui/src/components/GraphNG/utils.ts @@ -1,6 +1,8 @@ import { XYFieldMatchers } from './types'; -import { ArrayVector, DataFrame, FieldType, outerJoinDataFrames } from '@grafana/data'; +import { ArrayVector, DataFrame, FieldConfig, FieldType, outerJoinDataFrames } from '@grafana/data'; import { nullToUndefThreshold } from './nullToUndefThreshold'; +import { AxisPlacement, GraphFieldConfig, ScaleDistribution, ScaleDistributionConfig } from '@grafana/schema'; +import { FIXED_UNIT } from './GraphNG'; // will mutate the DataFrame's fields' values function applySpanNullsThresholds(frame: DataFrame) { @@ -38,3 +40,36 @@ export function preparePlotFrame(frames: DataFrame[], dimFields: XYFieldMatchers return alignedFrame && applySpanNullsThresholds(alignedFrame); } + +export function buildScaleKey(config: FieldConfig) { + const defaultPart = 'na'; + + const scaleRange = `${config.min !== undefined ? config.min : defaultPart}-${ + config.max !== undefined ? config.max : defaultPart + }`; + + const scaleSoftRange = `${config.custom?.axisSoftMin !== undefined ? config.custom.axisSoftMin : defaultPart}-${ + config.custom?.axisSoftMax !== undefined ? config.custom.axisSoftMax : defaultPart + }`; + + const scalePlacement = `${ + config.custom?.axisPlacement !== undefined ? config.custom?.axisPlacement : AxisPlacement.Auto + }`; + + const scaleUnit = config.unit ?? FIXED_UNIT; + + const scaleDistribution = config.custom?.scaleDistribution + ? getScaleDistributionPart(config.custom.scaleDistribution) + : ScaleDistribution.Linear; + + const scaleLabel = Boolean(config.custom?.axisLabel) ? config.custom!.axisLabel : defaultPart; + + return `${scaleUnit}/${scaleRange}/${scaleSoftRange}/${scalePlacement}/${scaleDistribution}/${scaleLabel}`; +} + +function getScaleDistributionPart(config: ScaleDistributionConfig) { + if (config.type === ScaleDistribution.Log) { + return `${config.type}${config.log}`; + } + return config.type; +} diff --git a/packages/grafana-ui/src/components/Icon/Icon.mdx b/packages/grafana-ui/src/components/Icon/Icon.mdx index ea3e936ca70..a4c5bedda8e 100644 --- a/packages/grafana-ui/src/components/Icon/Icon.mdx +++ b/packages/grafana-ui/src/components/Icon/Icon.mdx @@ -12,7 +12,7 @@ Grafana's wrapper component over [Font Awesome](https://fontawesome.com/) and Un By default `Icon` has width and height of `16px` and font-size of `14px`. Pass `className` to control icon's size: ```jsx -import { css } from 'emotion'; +import { css } from '@emotion/css'; ; ``` diff --git a/packages/grafana-ui/src/components/Icon/iconBundle.ts b/packages/grafana-ui/src/components/Icon/iconBundle.ts index 4bbe54eabb9..3d7d280c83e 100644 --- a/packages/grafana-ui/src/components/Icon/iconBundle.ts +++ b/packages/grafana-ui/src/components/Icon/iconBundle.ts @@ -6,6 +6,10 @@ import { cacheStore } from 'react-inlinesvg'; export let cacheInitialized = false; export let iconRoot = 'public/img/icons'; +function cacheItem(content: string, path: string) { + cacheStore[iconRoot + path] = { content, status: 'loaded', queue: [] }; +} + import u1001 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-double-down.svg'; import u1002 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-double-right.svg'; import u1003 from '!!raw-loader!../../../../../public/img/icons/unicons/angle-down.svg'; @@ -127,24 +131,40 @@ import u1118 from '!!raw-loader!../../../../../public/img/icons/unicons/upload.s import u1119 from '!!raw-loader!../../../../../public/img/icons/unicons/user.svg'; import u1120 from '!!raw-loader!../../../../../public/img/icons/unicons/users-alt.svg'; import u1121 from '!!raw-loader!../../../../../public/img/icons/unicons/wrap-text.svg'; -import u1122 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-after.svg'; -import u1123 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-before.svg'; -import u1124 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-center.svg'; -import u1125 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-linear.svg'; -import u1126 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-smooth.svg'; -import u1127 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-step-after.svg'; -import u1128 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-step-before.svg'; -import u1129 from '!!raw-loader!../../../../../public/img/icons/custom/gf-logs.svg'; -import u1130 from '!!raw-loader!../../../../../public/img/icons/mono/favorite.svg'; -import u1131 from '!!raw-loader!../../../../../public/img/icons/mono/grafana.svg'; -import u1132 from '!!raw-loader!../../../../../public/img/icons/mono/heart.svg'; -import u1133 from '!!raw-loader!../../../../../public/img/icons/mono/heart-break.svg'; -import u1134 from '!!raw-loader!../../../../../public/img/icons/mono/panel-add.svg'; -import u1135 from '!!raw-loader!../../../../../public/img/icons/mono/library-panel.svg'; - -function cacheItem(content: string, path: string) { - cacheStore[iconRoot + path] = { content, status: 'loaded', queue: [] }; -} +import u1122 from '!!raw-loader!../../../../../public/img/icons/unicons/cloud-upload.svg'; +import u1123 from '!!raw-loader!../../../../../public/img/icons/unicons/credit-card.svg'; +import u1124 from '!!raw-loader!../../../../../public/img/icons/unicons/file-copy-alt.svg'; +import u1125 from '!!raw-loader!../../../../../public/img/icons/unicons/fire.svg'; +import u1126 from '!!raw-loader!../../../../../public/img/icons/unicons/hourglass.svg'; +import u1127 from '!!raw-loader!../../../../../public/img/icons/unicons/layer-group.svg'; +import u1128 from '!!raw-loader!../../../../../public/img/icons/unicons/line-alt.svg'; +import u1129 from '!!raw-loader!../../../../../public/img/icons/unicons/list-ui-alt.svg'; +import u1130 from '!!raw-loader!../../../../../public/img/icons/unicons/message.svg'; +import u1131 from '!!raw-loader!../../../../../public/img/icons/unicons/palette.svg'; +import u1132 from '!!raw-loader!../../../../../public/img/icons/unicons/percentage.svg'; +import u1133 from '!!raw-loader!../../../../../public/img/icons/unicons/shield-exclamation.svg'; +import u1134 from '!!raw-loader!../../../../../public/img/icons/unicons/plus-square.svg'; +import u1135 from '!!raw-loader!../../../../../public/img/icons/unicons/x.svg'; +import u1136 from '!!raw-loader!../../../../../public/img/icons/unicons/capture.svg'; +import u1137 from '!!raw-loader!../../../../../public/img/icons/custom/gf-grid.svg'; +import u1138 from '!!raw-loader!../../../../../public/img/icons/custom/gf-landscape.svg'; +import u1139 from '!!raw-loader!../../../../../public/img/icons/custom/gf-layout-simple.svg'; +import u1140 from '!!raw-loader!../../../../../public/img/icons/custom/gf-portrait.svg'; +import u1141 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-after.svg'; +import u1142 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-before.svg'; +import u1143 from '!!raw-loader!../../../../../public/img/icons/custom/gf-bar-alignment-center.svg'; +import u1144 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-linear.svg'; +import u1145 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-smooth.svg'; +import u1146 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-step-after.svg'; +import u1147 from '!!raw-loader!../../../../../public/img/icons/custom/gf-interpolation-step-before.svg'; +import u1148 from '!!raw-loader!../../../../../public/img/icons/custom/gf-logs.svg'; +import u1149 from '!!raw-loader!../../../../../public/img/icons/mono/favorite.svg'; +import u1150 from '!!raw-loader!../../../../../public/img/icons/mono/grafana.svg'; +import u1151 from '!!raw-loader!../../../../../public/img/icons/mono/heart.svg'; +import u1152 from '!!raw-loader!../../../../../public/img/icons/mono/heart-break.svg'; +import u1153 from '!!raw-loader!../../../../../public/img/icons/mono/panel-add.svg'; +import u1154 from '!!raw-loader!../../../../../public/img/icons/mono/library-panel.svg'; +import u1155 from '!!raw-loader!../../../../../public/img/icons/unicons/record-audio.svg'; export function initIconCache() { cacheInitialized = true; @@ -155,7 +175,6 @@ export function initIconCache() { if (grafanaPublicPath) { iconRoot = grafanaPublicPath + 'img/icons/'; } - cacheItem(u1001, 'unicons/angle-double-down.svg'); cacheItem(u1002, 'unicons/angle-double-right.svg'); cacheItem(u1003, 'unicons/angle-down.svg'); @@ -277,18 +296,38 @@ export function initIconCache() { cacheItem(u1119, 'unicons/user.svg'); cacheItem(u1120, 'unicons/users-alt.svg'); cacheItem(u1121, 'unicons/wrap-text.svg'); - cacheItem(u1122, 'custom/gf-bar-alignment-after.svg'); - cacheItem(u1123, 'custom/gf-bar-alignment-before.svg'); - cacheItem(u1124, 'custom/gf-bar-alignment-center.svg'); - cacheItem(u1125, 'custom/gf-interpolation-linear.svg'); - cacheItem(u1126, 'custom/gf-interpolation-smooth.svg'); - cacheItem(u1127, 'custom/gf-interpolation-step-after.svg'); - cacheItem(u1128, 'custom/gf-interpolation-step-before.svg'); - cacheItem(u1129, 'custom/gf-logs.svg'); - cacheItem(u1130, 'mono/favorite.svg'); - cacheItem(u1131, 'mono/grafana.svg'); - cacheItem(u1132, 'mono/heart.svg'); - cacheItem(u1133, 'mono/heart-break.svg'); - cacheItem(u1134, 'mono/panel-add.svg'); - cacheItem(u1135, 'mono/library-panel.svg'); + cacheItem(u1122, 'unicons/cloud-upload.svg'); + cacheItem(u1123, 'unicons/credit-card.svg'); + cacheItem(u1124, 'unicons/file-copy-alt.svg'); + cacheItem(u1125, 'unicons/fire.svg'); + cacheItem(u1126, 'unicons/hourglass.svg'); + cacheItem(u1127, 'unicons/layer-group.svg'); + cacheItem(u1128, 'unicons/line-alt.svg'); + cacheItem(u1129, 'unicons/list-ui-alt.svg'); + cacheItem(u1130, 'unicons/message.svg'); + cacheItem(u1131, 'unicons/palette.svg'); + cacheItem(u1132, 'unicons/percentage.svg'); + cacheItem(u1133, 'unicons/shield-exclamation.svg'); + cacheItem(u1134, 'unicons/plus-square.svg'); + cacheItem(u1135, 'unicons/x.svg'); + cacheItem(u1136, 'unicons/capture.svg'); + cacheItem(u1137, 'custom/gf-grid.svg'); + cacheItem(u1138, 'custom/gf-landscape.svg'); + cacheItem(u1139, 'custom/gf-layout-simple.svg'); + cacheItem(u1140, 'custom/gf-portrait.svg'); + cacheItem(u1141, 'custom/gf-bar-alignment-after.svg'); + cacheItem(u1142, 'custom/gf-bar-alignment-before.svg'); + cacheItem(u1143, 'custom/gf-bar-alignment-center.svg'); + cacheItem(u1144, 'custom/gf-interpolation-linear.svg'); + cacheItem(u1145, 'custom/gf-interpolation-smooth.svg'); + cacheItem(u1146, 'custom/gf-interpolation-step-after.svg'); + cacheItem(u1147, 'custom/gf-interpolation-step-before.svg'); + cacheItem(u1148, 'custom/gf-logs.svg'); + cacheItem(u1149, 'mono/favorite.svg'); + cacheItem(u1150, 'mono/grafana.svg'); + cacheItem(u1151, 'mono/heart.svg'); + cacheItem(u1152, 'mono/heart-break.svg'); + cacheItem(u1153, 'mono/panel-add.svg'); + cacheItem(u1154, 'mono/library-panel.svg'); + cacheItem(u1155, 'unicons/record-audio.svg'); } diff --git a/packages/grafana-ui/src/components/IconButton/IconButton.tsx b/packages/grafana-ui/src/components/IconButton/IconButton.tsx index 43c000d9d94..c52de18b45b 100644 --- a/packages/grafana-ui/src/components/IconButton/IconButton.tsx +++ b/packages/grafana-ui/src/components/IconButton/IconButton.tsx @@ -5,7 +5,7 @@ import { stylesFactory } from '../../themes/stylesFactory'; import { css, cx } from '@emotion/css'; import { useTheme2 } from '../../themes/ThemeContext'; import { GrafanaTheme2, colorManipulator } from '@grafana/data'; -import { Tooltip } from '../Tooltip/Tooltip'; +import { PopoverContent, Tooltip } from '../Tooltip/Tooltip'; import { TooltipPlacement } from '../Tooltip/PopoverController'; import { getFocusStyles, getMouseFocusStyles } from '../../themes/mixins'; @@ -21,7 +21,7 @@ export interface Props extends React.ButtonHTMLAttributes { /** Type od the icon - mono or default */ iconType?: IconType; /** Tooltip content to display on hover */ - tooltip?: string; + tooltip?: PopoverContent; /** Position of the tooltip */ tooltipPlacement?: TooltipPlacement; /** Variant to change the color of the Icon */ @@ -49,9 +49,10 @@ export const IconButton = React.forwardRef( ) => { const theme = useTheme2(); const styles = getStyles(theme, size, variant); + const tooltipString = typeof tooltip === 'string' ? tooltip : ''; const button = ( - ); diff --git a/packages/grafana-ui/src/components/InfoTooltip/InfoTooltip.tsx b/packages/grafana-ui/src/components/InfoTooltip/InfoTooltip.tsx index a9cb129e9fc..75536701d35 100644 --- a/packages/grafana-ui/src/components/InfoTooltip/InfoTooltip.tsx +++ b/packages/grafana-ui/src/components/InfoTooltip/InfoTooltip.tsx @@ -1,15 +1,11 @@ import React from 'react'; -import { Tooltip, TooltipProps, PopoverContent } from '../Tooltip/Tooltip'; -import { Icon } from '../Icon/Icon'; +import { PopoverContent, TooltipProps } from '../Tooltip/Tooltip'; +import { IconButton } from '../IconButton/IconButton'; interface InfoTooltipProps extends Omit { children: PopoverContent; } export const InfoTooltip = ({ children, ...restProps }: InfoTooltipProps) => { - return ( - - - - ); + return ; }; diff --git a/packages/grafana-ui/src/components/Input/Input.tsx b/packages/grafana-ui/src/components/Input/Input.tsx index 1fbd49fa6bb..4f2eb4664b2 100644 --- a/packages/grafana-ui/src/components/Input/Input.tsx +++ b/packages/grafana-ui/src/components/Input/Input.tsx @@ -25,7 +25,7 @@ export interface Props extends Omit, 'prefix' | 'siz interface StyleDeps { theme: GrafanaTheme2; - invalid: boolean; + invalid?: boolean; width?: number; } @@ -58,8 +58,8 @@ export const Input = React.forwardRef((props, ref) => { className={styles.input} {...restProps} style={{ - paddingLeft: prefixRect ? prefixRect.width + 12 : undefined, - paddingRight: suffixRect && (suffix || loading) ? suffixRect.width + 12 : undefined, + paddingLeft: prefix ? prefixRect.width + 12 : undefined, + paddingRight: suffix || loading ? suffixRect.width + 12 : undefined, }} /> diff --git a/packages/grafana-ui/src/components/LoadingPlaceholder/LoadingPlaceholder.tsx b/packages/grafana-ui/src/components/LoadingPlaceholder/LoadingPlaceholder.tsx index 14b0fc8f086..233a14020a3 100644 --- a/packages/grafana-ui/src/components/LoadingPlaceholder/LoadingPlaceholder.tsx +++ b/packages/grafana-ui/src/components/LoadingPlaceholder/LoadingPlaceholder.tsx @@ -8,7 +8,7 @@ import { useStyles } from '../../themes'; * @public */ export interface LoadingPlaceholderProps extends HTMLAttributes { - text: string; + text: React.ReactNode; } /** diff --git a/packages/grafana-ui/src/components/Logs/LogMessageAnsi.test.tsx b/packages/grafana-ui/src/components/Logs/LogMessageAnsi.test.tsx index 4764c87abe6..4dac18ce2e8 100644 --- a/packages/grafana-ui/src/components/Logs/LogMessageAnsi.test.tsx +++ b/packages/grafana-ui/src/components/Logs/LogMessageAnsi.test.tsx @@ -1,19 +1,18 @@ -import React from 'react'; +import { createTheme } from '@grafana/data'; import { shallow } from 'enzyme'; - -import { LogMessageAnsi } from './LogMessageAnsi'; +import React from 'react'; +import { UnThemedLogMessageAnsi as LogMessageAnsi } from './LogMessageAnsi'; describe('', () => { it('renders string without ANSI codes', () => { - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('span').exists()).toBe(false); expect(wrapper.text()).toBe('Lorem ipsum'); }); - it('renders string with ANSI codes', () => { const value = 'Lorem \u001B[31mipsum\u001B[0m et dolor'; - const wrapper = shallow(); + const wrapper = shallow(); expect(wrapper.find('span')).toHaveLength(1); expect(wrapper.find('span').first().prop('style')).toMatchObject( @@ -24,8 +23,8 @@ describe('', () => { expect(wrapper.find('span').first().text()).toBe('ipsum'); }); it('renders string with ANSI codes with correctly converted css classnames', () => { - const value = 'Lorem Ipsum'; - const wrapper = shallow(); + const value = 'Lorem \u001B[1;32mIpsum'; + const wrapper = shallow(); expect(wrapper.find('span')).toHaveLength(1); expect(wrapper.find('span').first().prop('style')).toMatchObject( @@ -34,4 +33,16 @@ describe('', () => { }) ); }); + it('renders string with ANSI dim code with appropriate themed color', () => { + const value = 'Lorem \u001B[1;2mIpsum'; + const theme = createTheme(); + const wrapper = shallow(); + + expect(wrapper.find('span')).toHaveLength(1); + expect(wrapper.find('span').first().prop('style')).toMatchObject( + expect.objectContaining({ + color: theme.colors.text.secondary, + }) + ); + }); }); diff --git a/packages/grafana-ui/src/components/Logs/LogMessageAnsi.tsx b/packages/grafana-ui/src/components/Logs/LogMessageAnsi.tsx index 22002e78eab..478b4f68236 100644 --- a/packages/grafana-ui/src/components/Logs/LogMessageAnsi.tsx +++ b/packages/grafana-ui/src/components/Logs/LogMessageAnsi.tsx @@ -1,5 +1,10 @@ -import React, { PureComponent } from 'react'; +import { findHighlightChunksInText, GrafanaTheme2 } from '@grafana/data'; import ansicolor from 'ansicolor'; +import React, { PureComponent } from 'react'; +// @ts-ignore +import Highlighter from 'react-highlight-words'; +import { withTheme2 } from '../../themes'; +import { Themeable2 } from '../../types'; interface Style { [key: string]: string; @@ -10,13 +15,19 @@ interface ParsedChunk { text: string; } -function convertCSSToStyle(css: string): Style { - return css.split(/;\s*/).reduce((accumulated, line) => { +function convertCSSToStyle(theme: GrafanaTheme2, css: string): Style { + return css.split(/;\s*/).reduce \ No newline at end of file diff --git a/public/app/plugins/panel/alertGroups/plugin.json b/public/app/plugins/panel/alertGroups/plugin.json index 9e566d71d1c..4b86aae539e 100644 --- a/public/app/plugins/panel/alertGroups/plugin.json +++ b/public/app/plugins/panel/alertGroups/plugin.json @@ -10,6 +10,10 @@ "author": { "name": "Grafana Labs", "url": "https://grafana.com" + }, + "logos": { + "small": "img/icn-alertgroups-panel.svg", + "large": "img/icn-alertgroups-panel.svg" } } } diff --git a/public/app/plugins/panel/alertlist/AlertInstances.tsx b/public/app/plugins/panel/alertlist/AlertInstances.tsx index 51729730c82..1b5a049b1d7 100644 --- a/public/app/plugins/panel/alertlist/AlertInstances.tsx +++ b/public/app/plugins/panel/alertlist/AlertInstances.tsx @@ -2,35 +2,30 @@ import React, { useEffect, useMemo, useState } from 'react'; import pluralize from 'pluralize'; import { Icon, useStyles2 } from '@grafana/ui'; import { Alert, PromRuleWithLocation } from 'app/types/unified-alerting'; -import { AlertLabels } from 'app/features/alerting/unified/components/AlertLabels'; -import { AlertStateTag } from 'app/features/alerting/unified/components/rules/AlertStateTag'; -import { dateTime, GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2, PanelProps } from '@grafana/data'; import { css } from '@emotion/css'; -import { PromAlertingRuleState } from 'app/types/unified-alerting-dto'; -import { omit } from 'lodash'; -import { alertInstanceKey } from 'app/features/alerting/unified/utils/rules'; +import { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto'; +import { UnifiedAlertListOptions } from './types'; +import { AlertInstancesTable } from 'app/features/alerting/unified/components/rules/AlertInstancesTable'; +import { sortAlerts } from 'app/features/alerting/unified/utils/misc'; interface Props { ruleWithLocation: PromRuleWithLocation; - showInstances: boolean; + options: PanelProps['options']; } -export const AlertInstances = ({ ruleWithLocation, showInstances }: Props) => { +export const AlertInstances = ({ ruleWithLocation, options }: Props) => { const { rule } = ruleWithLocation; - const [displayInstances, setDisplayInstances] = useState(showInstances); + const [displayInstances, setDisplayInstances] = useState(options.showInstances); const styles = useStyles2(getStyles); useEffect(() => { - setDisplayInstances(showInstances); - }, [showInstances]); + setDisplayInstances(options.showInstances); + }, [options.showInstances]); - // sort instances, because API returns them in random order every time - const sortedAlerts = useMemo( - (): Alert[] => - displayInstances - ? rule.alerts.slice().sort((a, b) => alertInstanceKey(a).localeCompare(alertInstanceKey(b))) - : [], - [rule, displayInstances] + const alerts = useMemo( + (): Alert[] => (displayInstances ? filterAlerts(options, sortAlerts(options.sortOrder, rule.alerts)) : []), + [rule, options, displayInstances] ); return ( @@ -42,37 +37,33 @@ export const AlertInstances = ({ ruleWithLocation, showInstances }: Props) => {
)} - {!!sortedAlerts.length && ( -
    - {sortedAlerts.map((alert, index) => { - return ( -
  1. -
    - - {dateTime(alert.activeAt).format('YYYY-MM-DD HH:mm:ss')} -
    - -
  2. - ); - })} -
- )} + {!!alerts.length && }
); }; -const getStyles = (theme: GrafanaTheme2) => ({ +function filterAlerts(options: PanelProps['options'], alerts: Alert[]): Alert[] { + const hasAlertState = Object.values(options.stateFilter).some((value) => value); + let filteredAlerts = [...alerts]; + if (hasAlertState) { + filteredAlerts = filteredAlerts.filter((alert) => { + return ( + (options.stateFilter.firing && + (alert.state === GrafanaAlertState.Alerting || alert.state === PromAlertingRuleState.Firing)) || + (options.stateFilter.pending && + (alert.state === GrafanaAlertState.Pending || alert.state === PromAlertingRuleState.Pending)) || + (options.stateFilter.noData && alert.state === GrafanaAlertState.NoData) || + (options.stateFilter.normal && alert.state === GrafanaAlertState.Normal) || + (options.stateFilter.error && alert.state === GrafanaAlertState.Error) || + (options.stateFilter.inactive && alert.state === PromAlertingRuleState.Inactive) + ); + }); + } + return filteredAlerts; +} + +const getStyles = (_: GrafanaTheme2) => ({ instance: css` cursor: pointer; `, - list: css` - list-style-type: none; - `, - listItem: css` - margin-top: ${theme.spacing(1)}; - `, - date: css` - font-size: ${theme.typography.bodySmall.fontSize}; - padding-left: ${theme.spacing(0.5)}; - `, }); diff --git a/public/app/plugins/panel/alertlist/AlertList.tsx b/public/app/plugins/panel/alertlist/AlertList.tsx index 43f0750127b..b2f6abe28bb 100644 --- a/public/app/plugins/panel/alertlist/AlertList.tsx +++ b/public/app/plugins/panel/alertlist/AlertList.tsx @@ -78,6 +78,7 @@ export function AlertList(props: PanelProps) { props.options.folderId, props.options.alertName, props.options.sortOrder, + props.timeRange, ]); const recentStateChanges = useAsync(async () => { @@ -144,11 +145,8 @@ export function AlertList(props: PanelProps) { currentAlertState.value && currentAlertState.value!.map((alert) => (
  • - + + {alert.name} @@ -165,7 +163,8 @@ export function AlertList(props: PanelProps) { recentStateChanges.value && recentStateChanges.value.map((alert) => (
  • - + + {alert.alertName} diff --git a/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx b/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx index f475c490535..e532878c896 100644 --- a/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx +++ b/public/app/plugins/panel/alertlist/UnifiedAlertList.tsx @@ -13,10 +13,15 @@ import { flattenRules, alertStateToState, getFirstActiveAt } from 'app/features/ import { PromRuleWithLocation } from 'app/types/unified-alerting'; import { fetchAllPromRulesAction } from 'app/features/alerting/unified/state/actions'; import { useUnifiedAlertingSelector } from 'app/features/alerting/unified/hooks/useUnifiedAlertingSelector'; -import { getAllRulesSourceNames } from 'app/features/alerting/unified/utils/datasource'; +import { + getAllRulesSourceNames, + GRAFANA_DATASOURCE_NAME, + GRAFANA_RULES_SOURCE_NAME, +} from 'app/features/alerting/unified/utils/datasource'; import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv'; import { Annotation, RULE_LIST_POLL_INTERVAL_MS } from 'app/features/alerting/unified/utils/constants'; import { PromAlertingRuleState } from 'app/types/unified-alerting-dto'; +import { labelsMatchMatchers, parseMatchers } from 'app/features/alerting/unified/utils/alertmanager'; export function UnifiedAlertList(props: PanelProps) { const dispatch = useDispatch(); @@ -100,7 +105,7 @@ export function UnifiedAlertList(props: PanelProps) { )} - +
  • ); @@ -151,11 +156,31 @@ function filterRules(options: PanelProps['options'], ru ); }); } + if (options.alertInstanceLabelFilter) { + const matchers = parseMatchers(options.alertInstanceLabelFilter); + // Reduce rules and instances to only those that match + filteredRules = filteredRules.reduce((rules, rule) => { + const filteredAlerts = rule.rule.alerts.filter(({ labels }) => labelsMatchMatchers(labels, matchers)); + if (filteredAlerts.length) { + rules.push({ ...rule, rule: { ...rule.rule, alerts: filteredAlerts } }); + } + return rules; + }, [] as PromRuleWithLocation[]); + } if (options.folder) { filteredRules = filteredRules.filter((rule) => { return rule.namespaceName === options.folder.title; }); } + if (options.datasource) { + const isGrafanaDS = options.datasource === GRAFANA_DATASOURCE_NAME; + + filteredRules = filteredRules.filter( + isGrafanaDS + ? ({ dataSourceName }) => dataSourceName === GRAFANA_RULES_SOURCE_NAME + : ({ dataSourceName }) => dataSourceName === options.datasource + ); + } return filteredRules; } diff --git a/public/app/plugins/panel/alertlist/module.tsx b/public/app/plugins/panel/alertlist/module.tsx index abea5ee8835..823495fd48e 100644 --- a/public/app/plugins/panel/alertlist/module.tsx +++ b/public/app/plugins/panel/alertlist/module.tsx @@ -5,13 +5,14 @@ import { AlertList } from './AlertList'; import { UnifiedAlertList } from './UnifiedAlertList'; import { AlertListOptions, ShowOption, SortOrder, UnifiedAlertListOptions } from './types'; import { alertListPanelMigrationHandler } from './AlertListMigrationHandler'; -import { config } from '@grafana/runtime'; +import { config, DataSourcePicker } from '@grafana/runtime'; import { RuleFolderPicker } from 'app/features/alerting/unified/components/rule-editor/RuleFolderPicker'; import { ALL_FOLDER, GENERAL_FOLDER, ReadonlyFolderPicker, } from '../../../core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker'; +import { AlertListSuggestionsSupplier } from './suggestions'; function showIfCurrentState(options: AlertListOptions) { return options.showOptions === ShowOption.Current; @@ -145,19 +146,22 @@ const alertList = new PanelPlugin(AlertList) showIf: showIfCurrentState, }); }) - .setMigrationHandler(alertListPanelMigrationHandler); + .setMigrationHandler(alertListPanelMigrationHandler) + .setSuggestionsSupplier(new AlertListSuggestionsSupplier()); const unifiedAlertList = new PanelPlugin(UnifiedAlertList).setPanelOptions((builder) => { builder .addNumberInput({ name: 'Max items', path: 'maxItems', + description: 'Maximum alerts to display', defaultValue: 20, category: ['Options'], }) .addSelect({ name: 'Sort order', path: 'sortOrder', + description: 'Sort order of alerts and alert instances', settings: { options: [ { label: 'Alphabetical (asc)', value: SortOrder.AlphaAsc }, @@ -173,24 +177,35 @@ const unifiedAlertList = new PanelPlugin(UnifiedAlertLi .addBooleanSwitch({ path: 'dashboardAlerts', name: 'Alerts from this dashboard', + description: 'Show alerts from this dashboard', defaultValue: false, category: ['Options'], }) .addBooleanSwitch({ path: 'showInstances', name: 'Show alert instances', + description: 'Show individual alert instances for multi-dimensional rules', defaultValue: false, category: ['Options'], }) .addTextInput({ path: 'alertName', name: 'Alert name', + description: 'Filter for alerts containing this text', + defaultValue: '', + category: ['Filter'], + }) + .addTextInput({ + path: 'alertInstanceLabelFilter', + name: 'Alert instance label', + description: 'Filter alert instances using label querying, ex: {severity="critical", instance=~"cluster-us-.+"}', defaultValue: '', category: ['Filter'], }) .addCustomEditor({ path: 'folder', name: 'Folder', + description: 'Filter for alerts in the selected folder', id: 'folder', defaultValue: null, editor: function RenderFolderPicker(props) { @@ -206,23 +221,61 @@ const unifiedAlertList = new PanelPlugin(UnifiedAlertLi }, category: ['Filter'], }) + .addCustomEditor({ + path: 'datasource', + name: 'Datasource', + description: 'Filter alerts from selected datasource', + id: 'datasource', + defaultValue: null, + editor: function RenderDatasourcePicker(props) { + return ( + props.onChange(ds.name)} + onClear={() => props.onChange('')} + /> + ); + }, + category: ['Filter'], + }) .addBooleanSwitch({ path: 'stateFilter.firing', - name: 'Alerting', + name: 'Alerting / Firing', defaultValue: true, - category: ['State filter'], + category: ['Alert state filter'], }) .addBooleanSwitch({ path: 'stateFilter.pending', name: 'Pending', defaultValue: true, - category: ['State filter'], + category: ['Alert state filter'], }) .addBooleanSwitch({ path: 'stateFilter.inactive', name: 'Inactive', defaultValue: false, - category: ['State filter'], + category: ['Alert state filter'], + }) + .addBooleanSwitch({ + path: 'stateFilter.noData', + name: 'No Data', + defaultValue: false, + category: ['Alert state filter'], + }) + .addBooleanSwitch({ + path: 'stateFilter.normal', + name: 'Normal', + defaultValue: false, + category: ['Alert state filter'], + }) + .addBooleanSwitch({ + path: 'stateFilter.error', + name: 'Error', + defaultValue: true, + category: ['Alert state filter'], }); }); diff --git a/public/app/plugins/panel/alertlist/suggestions.ts b/public/app/plugins/panel/alertlist/suggestions.ts new file mode 100644 index 00000000000..7c70b648898 --- /dev/null +++ b/public/app/plugins/panel/alertlist/suggestions.ts @@ -0,0 +1,20 @@ +import { VisualizationSuggestionsBuilder } from '@grafana/data'; +import { AlertListOptions } from './types'; + +export class AlertListSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary } = builder; + + if (dataSummary.hasData) { + return; + } + + const list = builder.getListAppender({ + name: 'Dashboard list', + pluginId: 'dashlist', + options: {}, + }); + + list.append({}); + } +} diff --git a/public/app/plugins/panel/alertlist/types.ts b/public/app/plugins/panel/alertlist/types.ts index 17d8e6699d3..4b2d313bcb3 100644 --- a/public/app/plugins/panel/alertlist/types.ts +++ b/public/app/plugins/panel/alertlist/types.ts @@ -1,5 +1,3 @@ -import { PromAlertingRuleState } from 'app/types/unified-alerting-dto'; - export enum SortOrder { AlphaAsc = 1, AlphaDesc, @@ -32,6 +30,15 @@ export interface AlertListOptions { folderId: number; } +interface StateFilter { + firing: boolean; + pending: boolean; + inactive: boolean; + noData: boolean; + normal: boolean; + error: boolean; +} + export interface UnifiedAlertListOptions { maxItems: number; sortOrder: SortOrder; @@ -39,7 +46,7 @@ export interface UnifiedAlertListOptions { alertName: string; showInstances: boolean; folder: { id: number; title: string }; - stateFilter: { - [K in PromAlertingRuleState]: boolean; - }; + stateFilter: StateFilter; + alertInstanceLabelFilter: string; + datasource: string; } diff --git a/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx b/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx index 97e931d7819..64a30151979 100644 --- a/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx +++ b/public/app/plugins/panel/annolist/AnnoListPanel.test.tsx @@ -8,6 +8,7 @@ import { backendSrv } from '../../../core/services/backend_srv'; import userEvent from '@testing-library/user-event'; import { silenceConsoleOutput } from '../../../../test/core/utils/silenceConsoleOutput'; import { setDashboardSrv } from '../../../features/dashboard/services/DashboardSrv'; +import { locationService } from '@grafana/runtime'; jest.mock('@grafana/runtime', () => ({ ...((jest.requireActual('@grafana/runtime') as unknown) as object), @@ -17,7 +18,7 @@ jest.mock('@grafana/runtime', () => ({ const defaultOptions: AnnoOptions = { limit: 10, navigateAfter: '10m', - navigateBefore: '20m', + navigateBefore: '10m', navigateToPanel: true, onlyFromThisDashboard: true, onlyInTimeRange: false, @@ -27,7 +28,7 @@ const defaultOptions: AnnoOptions = { tags: ['tag A', 'tag B'], }; -const defaultResult: AnnotationEvent = { +const defaultResult: any = { text: 'Result text', userId: 1, login: 'Result login', @@ -37,6 +38,8 @@ const defaultResult: AnnotationEvent = { time: Date.UTC(2021, 0, 1, 0, 0, 0, 0), panelId: 13, dashboardId: 14, // deliberately different from panelId + id: 14, + url: '/d/asdkjhajksd/some-dash', }; async function setupTestContext({ @@ -51,6 +54,7 @@ async function setupTestContext({ const dash: any = { id: 1, formatDate: (time: number) => new Date(time).toISOString() }; const dashSrv: any = { getCurrent: () => dash }; setDashboardSrv(dashSrv); + const pushSpy = jest.spyOn(locationService, 'push'); const props: Props = { data: { state: LoadingState.Done, timeRange: getDefaultTimeRange(), series: [] }, @@ -72,7 +76,7 @@ async function setupTestContext({ onOptionsChange: jest.fn(), options, renderCounter: 1, - replaceVariables: jest.fn(), + replaceVariables: (str: string) => str, timeRange: getDefaultTimeRange(), timeZone: 'utc', title: 'Test Title', @@ -82,7 +86,7 @@ async function setupTestContext({ const { rerender } = render(); await waitFor(() => expect(getMock).toHaveBeenCalledTimes(1)); - return { props, rerender, getMock }; + return { props, rerender, getMock, pushSpy }; } describe('AnnoListPanel', () => { @@ -192,14 +196,16 @@ describe('AnnoListPanel', () => { describe('and the user clicks on the annotation', () => { it('then it should navigate to the dashboard connected to the annotation', async () => { - const { getMock } = await setupTestContext(); + const { getMock, pushSpy } = await setupTestContext(); getMock.mockClear(); expect(screen.getByText(/result text/i)).toBeInTheDocument(); userEvent.click(screen.getByText(/result text/i)); + await waitFor(() => expect(getMock).toHaveBeenCalledTimes(1)); - expect(getMock).toHaveBeenCalledTimes(1); expect(getMock).toHaveBeenCalledWith('/api/search', { dashboardIds: 14 }); + expect(pushSpy).toHaveBeenCalledTimes(1); + expect(pushSpy).toHaveBeenCalledWith('/d/asdkjhajksd/some-dash?from=1609458600000&to=1609459800000'); }); }); diff --git a/public/app/plugins/panel/annolist/AnnoListPanel.tsx b/public/app/plugins/panel/annolist/AnnoListPanel.tsx index cfc88503004..c858d51171d 100644 --- a/public/app/plugins/panel/annolist/AnnoListPanel.tsx +++ b/public/app/plugins/panel/annolist/AnnoListPanel.tsx @@ -113,7 +113,7 @@ export class AnnoListPanel extends PureComponent { } if (options.tags && options.tags.length) { - params.tags = options.tags; + params.tags = options.tags.map((tag) => this.props.replaceVariables(tag)); } if (queryTags.length) { @@ -129,7 +129,7 @@ export class AnnoListPanel extends PureComponent { }); } - onAnnoClick = (anno: AnnotationEvent) => { + onAnnoClick = async (anno: AnnotationEvent) => { if (!anno.time) { return; } @@ -152,17 +152,16 @@ export class AnnoListPanel extends PureComponent { return; } - getBackendSrv() - .get('/api/search', { dashboardIds: anno.dashboardId }) - .then((res: any[]) => { - if (res && res.length && res[0].id === anno.dashboardId) { - const dash = res[0]; - const newUrl = locationUtil.stripBaseFromUrl(dash.url); - locationService.push(newUrl); - return; - } - appEvents.emit(AppEvents.alertWarning, ['Unknown Dashboard: ' + anno.dashboardId]); - }); + const result = await getBackendSrv().get('/api/search', { dashboardIds: anno.dashboardId }); + if (result && result.length && result[0].id === anno.dashboardId) { + const dash = result[0]; + const url = new URL(dash.url, window.location.origin); + url.searchParams.set('from', params.from); + url.searchParams.set('to', params.to); + locationService.push(locationUtil.stripBaseFromUrl(url.toString())); + return; + } + appEvents.emit(AppEvents.alertWarning, ['Unknown Dashboard: ' + anno.dashboardId]); }; _timeOffset(time: number, offset: string, subtract = false): number { diff --git a/public/app/plugins/panel/barchart/BarChart.tsx b/public/app/plugins/panel/barchart/BarChart.tsx deleted file mode 100644 index bc7fcafaefa..00000000000 --- a/public/app/plugins/panel/barchart/BarChart.tsx +++ /dev/null @@ -1,83 +0,0 @@ -import React, { useRef } from 'react'; -import { cloneDeep } from 'lodash'; -import { DataFrame, FieldType, TimeRange } from '@grafana/data'; -import { GraphNG, GraphNGProps, PlotLegend, UPlotConfigBuilder, usePanelContext, useTheme2 } from '@grafana/ui'; -import { LegendDisplayMode } from '@grafana/schema'; -import { BarChartOptions } from './types'; -import { preparePlotConfigBuilder, preparePlotFrame } from './utils'; -import { PropDiffFn } from '../../../../../packages/grafana-ui/src/components/GraphNG/GraphNG'; - -/** - * @alpha - */ -export interface BarChartProps - extends BarChartOptions, - Omit {} - -const propsToDiff: Array = [ - 'orientation', - 'barWidth', - 'groupWidth', - 'stacking', - 'showValue', - (prev: BarChartProps, next: BarChartProps) => next.text?.valueSize === prev.text?.valueSize, -]; - -export const BarChart: React.FC = (props) => { - const theme = useTheme2(); - const { eventBus } = usePanelContext(); - - const frame0Ref = useRef(); - frame0Ref.current = props.frames[0]; - - const renderLegend = (config: UPlotConfigBuilder) => { - if (!config || props.legend.displayMode === LegendDisplayMode.Hidden) { - return null; - } - - return ; - }; - - const rawValue = (seriesIdx: number, valueIdx: number) => { - let field = frame0Ref.current!.fields.find( - (f) => f.type === FieldType.number && f.state?.seriesIndex === seriesIdx - 1 - ); - return field!.values.get(valueIdx); - }; - - const prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => { - const { timeZone, orientation, barWidth, showValue, groupWidth, stacking, legend, tooltip, text } = props; - - return preparePlotConfigBuilder({ - frame: alignedFrame, - getTimeRange, - theme, - timeZone, - eventBus, - orientation, - barWidth, - showValue, - groupWidth, - stacking, - legend, - tooltip, - text, - rawValue, - allFrames: props.frames, - }); - }; - - return ( - - ); -}; -BarChart.displayName = 'BarChart'; diff --git a/public/app/plugins/panel/barchart/BarChartPanel.tsx b/public/app/plugins/panel/barchart/BarChartPanel.tsx index f766626c92d..e529d616be1 100755 --- a/public/app/plugins/panel/barchart/BarChartPanel.tsx +++ b/public/app/plugins/panel/barchart/BarChartPanel.tsx @@ -1,32 +1,104 @@ -import React, { useMemo } from 'react'; -import { TooltipDisplayMode, StackingMode } from '@grafana/schema'; -import { PanelProps, TimeRange, VizOrientation } from '@grafana/data'; -import { TooltipPlugin, useTheme2 } from '@grafana/ui'; -import { BarChartOptions } from './types'; -import { BarChart } from './BarChart'; -import { prepareGraphableFrames } from './utils'; - -interface Props extends PanelProps {} +import React, { useMemo, useRef } from 'react'; +import { TooltipDisplayMode, StackingMode, LegendDisplayMode } from '@grafana/schema'; +import { + compareDataFrameStructures, + DataFrame, + getFieldDisplayName, + PanelProps, + TimeRange, + VizOrientation, +} from '@grafana/data'; +import { + GraphNG, + GraphNGProps, + measureText, + PlotLegend, + TooltipPlugin, + UPlotConfigBuilder, + UPLOT_AXIS_FONT_SIZE, + usePanelContext, + useTheme2, + VizLayout, + VizLegend, +} from '@grafana/ui'; +import { PanelOptions } from './models.gen'; +import { prepareBarChartDisplayValues, preparePlotConfigBuilder } from './utils'; +import { PanelDataErrorView } from '@grafana/runtime'; +import { DataHoverView } from '../geomap/components/DataHoverView'; +import { getFieldLegendItem } from '../state-timeline/utils'; +import { PropDiffFn } from '@grafana/ui/src/components/GraphNG/GraphNG'; /** * @alpha */ -export const BarChartPanel: React.FunctionComponent = ({ data, options, width, height, timeZone }) => { +export interface BarChartProps + extends PanelOptions, + Omit {} + +const propsToDiff: Array = [ + 'orientation', + 'barWidth', + 'barRadius', + 'xTickLabelRotation', + 'xTickLabelMaxLength', + 'xTickLabelSpacing', + 'groupWidth', + 'stacking', + 'showValue', + 'xField', + 'colorField', + 'legend', + (prev: BarChartProps, next: BarChartProps) => next.text?.valueSize === prev.text?.valueSize, +]; + +interface Props extends PanelProps {} + +export const BarChartPanel: React.FunctionComponent = ({ data, options, width, height, timeZone, id }) => { const theme = useTheme2(); + const { eventBus } = usePanelContext(); + + const frame0Ref = useRef(); + const info = useMemo(() => prepareBarChartDisplayValues(data?.series, theme, options), [data, theme, options]); + const structureRef = useRef(10000); + useMemo(() => { + structureRef.current++; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [options]); // change every time the options object changes (while editing) + + const structureRev = useMemo(() => { + const f0 = info.viz; + const f1 = frame0Ref.current; + if (!(f0 && f1 && compareDataFrameStructures(f0, f1, true))) { + structureRef.current++; + } + frame0Ref.current = f0; + return (data.structureRev ?? 0) + structureRef.current; + }, [info, data.structureRev]); - const { frames, warn } = useMemo(() => prepareGraphableFrames(data?.series, theme, options.stacking), [ - data, - theme, - options.stacking, - ]); const orientation = useMemo(() => { if (!options.orientation || options.orientation === VizOrientation.Auto) { return width < height ? VizOrientation.Horizontal : VizOrientation.Vertical; } - return options.orientation; }, [width, height, options.orientation]); + const xTickLabelMaxLength = useMemo(() => { + // If no max length is set, limit the number of characters to a length where it will use a maximum of half of the height of the viz. + if (!options.xTickLabelMaxLength) { + const rotationAngle = options.xTickLabelRotation; + const textSize = measureText('M', UPLOT_AXIS_FONT_SIZE).width; // M is usually the widest character so let's use that as an aproximation. + const maxHeightForValues = height / 2; + + return ( + maxHeightForValues / + (Math.sin(((rotationAngle >= 0 ? rotationAngle : rotationAngle * -1) * Math.PI) / 180) * textSize) - + 3 //Subtract 3 for the "..." added to the end. + ); + } else { + return options.xTickLabelMaxLength; + } + }, [height, options.xTickLabelRotation, options.xTickLabelMaxLength]); + // Force 'multi' tooltip setting or stacking mode const tooltip = useMemo(() => { if (options.stacking === StackingMode.Normal || options.stacking === StackingMode.Percent) { @@ -35,28 +107,129 @@ export const BarChartPanel: React.FunctionComponent = ({ data, options, w return options.tooltip; }, [options.tooltip, options.stacking]); - if (!frames || warn) { - return ( -
    -

    {warn ?? 'No data found in response'}

    -
    - ); + if (!info.viz?.fields.length) { + return ; } + const renderTooltip = (alignedFrame: DataFrame, seriesIdx: number | null, datapointIdx: number | null) => { + const field = seriesIdx == null ? null : alignedFrame.fields[seriesIdx]; + if (field) { + const disp = getFieldDisplayName(field, alignedFrame); + seriesIdx = info.aligned.fields.findIndex((f) => disp === getFieldDisplayName(f, info.aligned)); + } + + return ( + + ); + }; + + const renderLegend = (config: UPlotConfigBuilder) => { + const { legend } = options; + if (!config || legend.displayMode === LegendDisplayMode.Hidden) { + return null; + } + + if (info.colorByField) { + const items = getFieldLegendItem([info.colorByField], theme); + if (items?.length) { + return ( + + + + ); + } + } + + return ; + }; + + const rawValue = (seriesIdx: number, valueIdx: number) => { + return frame0Ref.current!.fields[seriesIdx].values.get(valueIdx); + }; + + // Color by value + let getColor: ((seriesIdx: number, valueIdx: number) => string) | undefined = undefined; + + let fillOpacity = 1; + + if (info.colorByField) { + const colorByField = info.colorByField; + const disp = colorByField.display!; + fillOpacity = (colorByField.config.custom.fillOpacity ?? 100) / 100; + // gradientMode? ignore? + getColor = (seriesIdx: number, valueIdx: number) => disp(colorByField.values.get(valueIdx)).color!; + } + + const prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => { + const { + barWidth, + barRadius = 0, + showValue, + groupWidth, + stacking, + legend, + tooltip, + text, + xTickLabelRotation, + xTickLabelSpacing, + } = options; + + return preparePlotConfigBuilder({ + frame: alignedFrame, + getTimeRange, + theme, + timeZone, + eventBus, + orientation, + barWidth, + barRadius, + showValue, + groupWidth, + xTickLabelRotation, + xTickLabelMaxLength, + xTickLabelSpacing, + stacking, + legend, + tooltip, + text, + rawValue, + getColor, + fillOpacity, + allFrames: [info.viz], + }); + }; + return ( - f[0]} // already processed in by the panel above! + renderLegend={renderLegend} + legend={options.legend} timeZone={timeZone} timeRange={({ from: 1, to: 1 } as unknown) as TimeRange} // HACK - structureRev={data.structureRev} + structureRev={structureRev} width={width} height={height} - {...options} - orientation={orientation} > {(config, alignedFrame) => { - return ; + return ( + + ); }} - +
    ); }; diff --git a/public/app/plugins/panel/barchart/TickSpacingEditor.tsx b/public/app/plugins/panel/barchart/TickSpacingEditor.tsx new file mode 100644 index 00000000000..01168ab0fc0 --- /dev/null +++ b/public/app/plugins/panel/barchart/TickSpacingEditor.tsx @@ -0,0 +1,62 @@ +import React from 'react'; +import { SelectableValue, StandardEditorProps } from '@grafana/data'; +import { Checkbox, HorizontalGroup, RadioButtonGroup, Tooltip } from '@grafana/ui'; + +const GAPS_OPTIONS: Array> = [ + { + label: 'None', + value: 0, + description: 'Show all tick marks', + }, + { + label: 'Small', + value: 100, + description: 'Require 100px spacing', + }, + { + label: 'Medium', + value: 200, + description: 'Require 200px spacing', + }, + { + label: 'Large', + value: 300, + description: 'Require 300px spacing', + }, +]; + +export const TickSpacingEditor: React.FC> = (props) => { + let value = props.value ?? 0; + const isRTL = value < 0; + if (isRTL) { + value *= -1; + } + let gap = GAPS_OPTIONS[0]; + for (const v of GAPS_OPTIONS) { + gap = v; + if (value <= gap.value!) { + break; + } + } + + const onSpacingChange = (val: number) => { + props.onChange(val * (isRTL ? -1 : 1)); + }; + + const onRTLChange = () => { + props.onChange(props.value * -1); + }; + + return ( + + + {value !== 0 && ( + +
    + +
    +
    + )} +
    + ); +}; diff --git a/public/app/plugins/panel/barchart/__snapshots__/utils.test.ts.snap b/public/app/plugins/panel/barchart/__snapshots__/utils.test.ts.snap index 9c1dfd74b93..300a917e722 100644 --- a/public/app/plugins/panel/barchart/__snapshots__/utils.test.ts.snap +++ b/public/app/plugins/panel/barchart/__snapshots__/utils.test.ts.snap @@ -4,6 +4,7 @@ exports[`BarChart utils preparePlotConfigBuilder orientation 1`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -12,6 +13,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -29,6 +31,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -37,6 +40,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, @@ -136,6 +140,7 @@ exports[`BarChart utils preparePlotConfigBuilder orientation 2`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -144,6 +149,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -161,6 +167,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -169,6 +176,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, @@ -268,6 +276,7 @@ exports[`BarChart utils preparePlotConfigBuilder orientation 3`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -276,6 +285,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 2, @@ -293,6 +303,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -301,6 +312,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 3, @@ -400,6 +412,7 @@ exports[`BarChart utils preparePlotConfigBuilder stacking 1`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -408,6 +421,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -425,6 +439,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -433,6 +448,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, @@ -532,6 +548,7 @@ exports[`BarChart utils preparePlotConfigBuilder stacking 2`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -540,6 +557,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -557,6 +575,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -565,6 +584,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, @@ -664,6 +684,7 @@ exports[`BarChart utils preparePlotConfigBuilder stacking 3`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -672,6 +693,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -689,6 +711,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -697,6 +720,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, @@ -796,6 +820,7 @@ exports[`BarChart utils preparePlotConfigBuilder value visibility 1`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -804,6 +829,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -821,6 +847,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -829,6 +856,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, @@ -928,6 +956,7 @@ exports[`BarChart utils preparePlotConfigBuilder value visibility 2`] = ` Object { "axes": Array [ Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 15, "grid": Object { @@ -936,6 +965,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": -0, "scale": "x", "show": true, "side": 3, @@ -953,6 +983,7 @@ Object { "values": [Function], }, Object { + "filter": undefined, "font": "12px \\"Roboto\\", \\"Helvetica\\", \\"Arial\\", sans-serif", "gap": 5, "grid": Object { @@ -961,6 +992,7 @@ Object { "width": 1, }, "labelGap": 0, + "rotate": undefined, "scale": "m/s", "show": true, "side": 2, diff --git a/public/app/plugins/panel/barchart/bars.ts b/public/app/plugins/panel/barchart/bars.ts index 51c7c907f68..eb9437b53e9 100644 --- a/public/app/plugins/panel/barchart/bars.ts +++ b/public/app/plugins/panel/barchart/bars.ts @@ -1,10 +1,19 @@ -import uPlot, { Axis, AlignedData } from 'uplot'; +import uPlot, { Axis, AlignedData, Scale } from 'uplot'; import { pointWithin, Quadtree, Rect } from './quadtree'; import { distribute, SPACE_BETWEEN } from './distribute'; import { DataFrame, GrafanaTheme2 } from '@grafana/data'; import { calculateFontSize, PlotTooltipInterpolator } from '@grafana/ui'; -import { StackingMode, VisibilityMode, ScaleDirection, ScaleOrientation, VizTextDisplayOptions } from '@grafana/schema'; +import { + StackingMode, + VisibilityMode, + ScaleDirection, + ScaleOrientation, + VizTextDisplayOptions, + VizLegendOptions, +} from '@grafana/schema'; import { preparePlotData } from '../../../../../packages/grafana-ui/src/components/uPlot/utils'; +import { alpha } from '@grafana/data/src/themes/colorManipulator'; +import { formatTime } from '@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder'; const groupDistr = SPACE_BETWEEN; const barDistr = SPACE_BETWEEN; @@ -33,26 +42,32 @@ export interface BarsOptions { xDir: ScaleDirection; groupWidth: number; barWidth: number; + barRadius: number; showValue: VisibilityMode; stacking: StackingMode; rawValue: (seriesIdx: number, valueIdx: number) => number | null; + getColor?: (seriesIdx: number, valueIdx: number, value: any) => string | null; + fillOpacity?: number; formatValue: (seriesIdx: number, value: any) => string; text?: VizTextDisplayOptions; onHover?: (seriesIdx: number, valueIdx: number) => void; onLeave?: (seriesIdx: number, valueIdx: number) => void; + legend?: VizLegendOptions; + xSpacing?: number; + xTimeAuto?: boolean; } /** * @internal */ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { - const { xOri, xDir: dir, rawValue, formatValue, showValue } = opts; + const { xOri, xDir: dir, rawValue, getColor, formatValue, fillOpacity = 1, showValue, xSpacing = 0 } = opts; const isXHorizontal = xOri === ScaleOrientation.Horizontal; const hasAutoValueSize = !Boolean(opts.text?.valueSize); const isStacked = opts.stacking !== StackingMode.None; const pctStacked = opts.stacking === StackingMode.Percent; - let { groupWidth, barWidth } = opts; + let { groupWidth, barWidth, barRadius = 0 } = opts; if (isStacked) { [groupWidth, barWidth] = [barWidth, groupWidth]; @@ -70,21 +85,79 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { const dim = isXHorizontal ? u.bbox.width : u.bbox.height; const _dir = dir * (isXHorizontal ? 1 : -1); + let dataLen = u.data[0].length; + let lastIdx = dataLen - 1; + + let skipMod = 0; + + if (xSpacing !== 0) { + let cssDim = dim / devicePixelRatio; + let maxTicks = Math.abs(Math.floor(cssDim / xSpacing)); + + skipMod = dataLen < maxTicks ? 0 : Math.ceil(dataLen / maxTicks); + } + let splits: number[] = []; - distribute(u.data[0].length, groupWidth, groupDistr, null, (di, leftPct, widPct) => { - let groupLftPx = (dim * leftPct) / devicePixelRatio; - let groupWidPx = (dim * widPct) / devicePixelRatio; + // for distr: 2 scales, the splits array should contain indices into data[0] rather than values + u.data[0].forEach((v, i) => { + let shouldSkip = skipMod !== 0 && (xSpacing > 0 ? i : lastIdx - i) % skipMod > 0; - let groupCenterPx = groupLftPx + groupWidPx / 2; - - splits.push(u.posToVal(groupCenterPx, 'x')); + if (!shouldSkip) { + splits.push(i); + } }); return _dir === 1 ? splits : splits.reverse(); }; - const xValues: Axis.Values = (u) => u.data[0].map((x) => formatValue(0, x)); + // the splits passed into here are data[0] values looked up by the indices returned from splits() + const xValues: Axis.Values = (u, splits, axisIdx, foundSpace, foundIncr) => { + if (opts.xTimeAuto) { + // bit of a hack: + // temporarily set x scale range to temporal (as expected by formatTime()) rather than ordinal + let xScale = u.scales.x; + let oMin = xScale.min; + let oMax = xScale.max; + + xScale.min = u.data[0][0]; + xScale.max = u.data[0][u.data[0].length - 1]; + + let vals = formatTime(u, splits, axisIdx, foundSpace, foundIncr); + + // revert + xScale.min = oMin; + xScale.max = oMax; + + return vals; + } + + return splits.map((v) => formatValue(0, v)); + }; + + // this expands the distr: 2 scale so that the indicies of each data[0] land at the proper justified positions + const xRange: Scale.Range = (u, min, max) => { + min = 0; + max = u.data[0].length - 1; + + let pctOffset = 0; + + // how far in is the first tick in % of full dimension + distribute(u.data[0].length, groupWidth, groupDistr, 0, (di, lftPct, widPct) => { + pctOffset = lftPct + widPct / 2; + }); + + // expand scale range by equal amounts on both ends + let rn = max - min; // TODO: clamp to 1? + + let upScale = 1 / (1 - pctOffset * 2); + let offset = (upScale * rn - rn) / 2; + + min -= offset; + max += offset; + + return [min, max]; + }; let distrTwo = (groupCount: number, barCount: number) => { let out = Array.from({ length: barCount }, () => ({ @@ -119,13 +192,30 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { }; let barsPctLayout: Array = []; + let barsColors: Array; stroke: Array }> = []; let barRects: Rect[] = []; // minimum available space for labels between bar end and plotting area bound (in canvas pixels) let vSpace = Infinity; let hSpace = Infinity; + let useMappedColors = getColor != null; + + let mappedColorDisp = useMappedColors + ? { + fill: { + unit: 3, + values: (u: uPlot, seriesIdx: number) => barsColors[seriesIdx]!.fill, + }, + stroke: { + unit: 3, + values: (u: uPlot, seriesIdx: number) => barsColors[seriesIdx]!.stroke, + }, + } + : {}; + let barsBuilder = uPlot.paths.bars!({ + radius: barRadius, disp: { x0: { unit: 2, @@ -135,6 +225,7 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { unit: 2, values: (u, seriesIdx) => barsPctLayout[seriesIdx]!.size, }, + ...mappedColorDisp, }, // collect rendered bar geometry each: (u, seriesIdx, dataIdx, lft, top, wid, hgt) => { @@ -184,6 +275,27 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { } else { barsPctLayout = [null as any].concat(distrTwo(u.data[0].length, u.data.length - 1)); } + + if (useMappedColors) { + barsColors = [null]; + + // map per-bar colors + for (let i = 1; i < u.data.length; i++) { + let colors = u.data[i].map((value, valueIdx) => { + if (value != null) { + return getColor!(i, valueIdx, value); + } + + return null; + }); + + barsColors.push({ + fill: fillOpacity < 1 ? colors.map((c) => (c != null ? alpha(c, fillOpacity) : null)) : colors, + stroke: colors, + }); + } + } + barRects.length = 0; vSpace = hSpace = Infinity; }; @@ -311,9 +423,13 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { function prepData(frames: DataFrame[]) { alignedTotals = null; - return preparePlotData(frames, ({ totals }) => { - alignedTotals = totals; - }); + return preparePlotData( + frames, + ({ totals }) => { + alignedTotals = totals; + }, + opts.legend + ); } return { @@ -323,6 +439,7 @@ export function getConfig(opts: BarsOptions, theme: GrafanaTheme2) { points: { show: false }, }, // scale & axis opts + xRange, xValues, xSplits, diff --git a/public/app/plugins/panel/barchart/models.gen.ts b/public/app/plugins/panel/barchart/models.gen.ts new file mode 100644 index 00000000000..8068fa61aa3 --- /dev/null +++ b/public/app/plugins/panel/barchart/models.gen.ts @@ -0,0 +1,49 @@ +import { + OptionsWithLegend, + OptionsWithTextFormatting, + OptionsWithTooltip, + AxisConfig, + VisibilityMode, + GraphGradientMode, + HideableFieldConfig, + StackingMode, +} from '@grafana/schema'; +import { VizOrientation } from '@grafana/data'; + +export interface PanelOptions extends OptionsWithLegend, OptionsWithTooltip, OptionsWithTextFormatting { + xField?: string; + colorByField?: string; + orientation: VizOrientation; + stacking: StackingMode; + showValue: VisibilityMode; + barWidth: number; + barRadius?: number; + groupWidth: number; + xTickLabelRotation: number; + xTickLabelMaxLength: number; + xTickLabelSpacing?: number; // negative values indicate backwards skipping behavior +} + +export const defaultPanelOptions: Partial = { + stacking: StackingMode.None, + orientation: VizOrientation.Auto, + xTickLabelRotation: 0, + xTickLabelSpacing: 0, + showValue: VisibilityMode.Auto, + groupWidth: 0.7, + barWidth: 0.97, + barRadius: 0, +}; + +export interface BarChartFieldConfig extends AxisConfig, HideableFieldConfig { + lineWidth?: number; // 0 + fillOpacity?: number; // 100 + gradientMode?: GraphGradientMode; +} + +export const defaultBarChartFieldConfig: BarChartFieldConfig = { + lineWidth: 1, + fillOpacity: 80, + gradientMode: GraphGradientMode.None, + axisSoftMin: 0, +}; diff --git a/public/app/plugins/panel/barchart/module.tsx b/public/app/plugins/panel/barchart/module.tsx index 9dd8271b548..3efced85fb8 100755 --- a/public/app/plugins/panel/barchart/module.tsx +++ b/public/app/plugins/panel/barchart/module.tsx @@ -3,21 +3,26 @@ import { FieldColorModeId, FieldConfigProperty, FieldType, + getFieldDisplayName, PanelPlugin, VizOrientation, } from '@grafana/data'; import { BarChartPanel } from './BarChartPanel'; import { StackingMode, VisibilityMode } from '@grafana/schema'; import { graphFieldOptions, commonOptionsBuilder } from '@grafana/ui'; +import { BarChartFieldConfig, PanelOptions, defaultBarChartFieldConfig, defaultPanelOptions } from './models.gen'; +import { BarChartSuggestionsSupplier } from './suggestions'; +import { prepareBarChartDisplayValues } from './utils'; +import { config } from '@grafana/runtime'; +import { TickSpacingEditor } from './TickSpacingEditor'; -import { BarChartFieldConfig, BarChartOptions, defaultBarChartFieldConfig } from 'app/plugins/panel/barchart/types'; - -export const plugin = new PanelPlugin(BarChartPanel) +export const plugin = new PanelPlugin(BarChartPanel) .useFieldConfig({ standardOptions: { [FieldConfigProperty.Color]: { settings: { byValueSupport: true, + preferThresholdsMode: false, }, defaultValue: { mode: FieldColorModeId.PaletteClassic, @@ -57,12 +62,26 @@ export const plugin = new PanelPlugin(BarC }, }); - commonOptionsBuilder.addAxisConfig(builder, cfg, true); + commonOptionsBuilder.addAxisConfig(builder, cfg, false); commonOptionsBuilder.addHideFrom(builder); }, }) - .setPanelOptions((builder) => { + .setPanelOptions((builder, context) => { + const disp = prepareBarChartDisplayValues(context.data, config.theme2, context.options ?? ({} as any)); + let xaxisPlaceholder = 'First string or time field'; + if (disp.viz?.fields?.length) { + const first = disp.viz.fields[0]; + xaxisPlaceholder += ` (${getFieldDisplayName(first, disp.viz)})`; + } + builder + .addFieldNamePicker({ + path: 'xField', + name: 'X Axis', + settings: { + placeholderText: xaxisPlaceholder, + }, + }) .addRadio({ path: 'orientation', name: 'Orientation', @@ -73,7 +92,38 @@ export const plugin = new PanelPlugin(BarC { value: VizOrientation.Vertical, label: 'Vertical' }, ], }, - defaultValue: VizOrientation.Auto, + defaultValue: defaultPanelOptions.orientation, + }) + .addSliderInput({ + path: 'xTickLabelRotation', + name: 'Rotate bar labels', + defaultValue: defaultPanelOptions.xTickLabelRotation, + settings: { + min: -90, + max: 90, + step: 15, + marks: { '-90': '-90°', '-45': '-45°', 0: '0°', 45: '45°', 90: '90°' }, + included: false, + }, + showIf: (opts) => { + return opts.orientation === VizOrientation.Auto || opts.orientation === VizOrientation.Vertical; + }, + }) + .addNumberInput({ + path: 'xTickLabelMaxLength', + name: 'Bar label max length', + description: 'Bar labels will be truncated to the length provided', + settings: { + placeholder: 'None', + min: 0, + }, + }) + .addCustomEditor({ + id: 'xTickLabelSpacing', + path: 'xTickLabelSpacing', + name: 'Bar labels minimum spacing', + defaultValue: defaultPanelOptions.xTickLabelSpacing, + editor: TickSpacingEditor, }) .addRadio({ path: 'showValue', @@ -85,7 +135,7 @@ export const plugin = new PanelPlugin(BarC { value: VisibilityMode.Never, label: 'Never' }, ], }, - defaultValue: VisibilityMode.Auto, + defaultValue: defaultPanelOptions.showValue, }) .addRadio({ path: 'stacking', @@ -93,12 +143,12 @@ export const plugin = new PanelPlugin(BarC settings: { options: graphFieldOptions.stacking, }, - defaultValue: StackingMode.None, + defaultValue: defaultPanelOptions.stacking, }) .addSliderInput({ path: 'groupWidth', name: 'Group width', - defaultValue: 0.7, + defaultValue: defaultPanelOptions.groupWidth, settings: { min: 0, max: 1, @@ -114,18 +164,35 @@ export const plugin = new PanelPlugin(BarC .addSliderInput({ path: 'barWidth', name: 'Bar width', - defaultValue: 0.97, + defaultValue: defaultPanelOptions.barWidth, settings: { min: 0, max: 1, step: 0.01, }, + }) + .addSliderInput({ + path: 'barRadius', + name: 'Bar radius', + defaultValue: defaultPanelOptions.barRadius, + settings: { + min: 0, + max: 0.5, + step: 0.05, + }, }); + builder.addFieldNamePicker({ + path: 'colorByField', + name: 'Color by field', + description: 'Use the color value for a sibling field to color each bar value.', + }); + commonOptionsBuilder.addTooltipOptions(builder); commonOptionsBuilder.addLegendOptions(builder); commonOptionsBuilder.addTextSizeOptions(builder, false); - }); + }) + .setSuggestionsSupplier(new BarChartSuggestionsSupplier()); function countNumberFields(data?: DataFrame[]): number { let count = 0; diff --git a/public/app/plugins/panel/barchart/suggestions.ts b/public/app/plugins/panel/barchart/suggestions.ts new file mode 100644 index 00000000000..850435df26d --- /dev/null +++ b/public/app/plugins/panel/barchart/suggestions.ts @@ -0,0 +1,96 @@ +import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data'; +import { LegendDisplayMode, StackingMode, VisibilityMode } from '@grafana/schema'; +import { SuggestionName } from 'app/types/suggestions'; +import { BarChartFieldConfig, PanelOptions } from './models.gen'; + +export class BarChartSuggestionsSupplier { + getListWithDefaults(builder: VisualizationSuggestionsBuilder) { + return builder.getListAppender({ + name: SuggestionName.BarChart, + pluginId: 'barchart', + options: { + showValue: VisibilityMode.Never, + legend: { + displayMode: LegendDisplayMode.Hidden, + placement: 'right', + } as any, + }, + fieldConfig: { + defaults: { + unit: 'short', + custom: {}, + }, + overrides: [], + }, + cardOptions: { + previewModifier: (s) => { + s.options!.barWidth = 0.8; + }, + }, + }); + } + + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const list = this.getListWithDefaults(builder); + const { dataSummary } = builder; + + if (dataSummary.frameCount !== 1) { + return; + } + + if (!dataSummary.hasNumberField || !dataSummary.hasStringField) { + return; + } + + // if you have this many rows barchart might not be a good fit + if (dataSummary.rowCountTotal > 50) { + return; + } + + // Vertical bars + list.append({ + name: SuggestionName.BarChart, + }); + + if (dataSummary.numberFieldCount > 1) { + list.append({ + name: SuggestionName.BarChartStacked, + options: { + stacking: StackingMode.Normal, + }, + }); + list.append({ + name: SuggestionName.BarChartStackedPercent, + options: { + stacking: StackingMode.Percent, + }, + }); + } + + // horizontal bars + list.append({ + name: SuggestionName.BarChartHorizontal, + options: { + orientation: VizOrientation.Horizontal, + }, + }); + + if (dataSummary.numberFieldCount > 1) { + list.append({ + name: SuggestionName.BarChartHorizontalStacked, + options: { + stacking: StackingMode.Normal, + orientation: VizOrientation.Horizontal, + }, + }); + + list.append({ + name: SuggestionName.BarChartHorizontalStackedPercent, + options: { + orientation: VizOrientation.Horizontal, + stacking: StackingMode.Percent, + }, + }); + } + } +} diff --git a/public/app/plugins/panel/barchart/types.ts b/public/app/plugins/panel/barchart/types.ts index 4d12c1b960e..ba8cb9f69b9 100644 --- a/public/app/plugins/panel/barchart/types.ts +++ b/public/app/plugins/panel/barchart/types.ts @@ -1,42 +1,15 @@ -import { - OptionsWithLegend, - OptionsWithTextFormatting, - OptionsWithTooltip, - AxisConfig, - VisibilityMode, - GraphGradientMode, - HideableFieldConfig, - StackingMode, -} from '@grafana/schema'; -import { VizOrientation } from '@grafana/data'; +import { DataFrame, Field } from '@grafana/data'; -/** - * @alpha - */ -export interface BarChartOptions extends OptionsWithLegend, OptionsWithTooltip, OptionsWithTextFormatting { - orientation: VizOrientation; - stacking: StackingMode; - showValue: VisibilityMode; - barWidth: number; - groupWidth: number; - rawValue: (seriesIdx: number, valueIdx: number) => number; +export interface BarChartDisplayValues { + /** When the data can not display, this will be returned */ + warn?: string; + + /** All fields joined */ + aligned: DataFrame; + + /** The fields we can display, first field is X axis */ + viz: DataFrame; + + /** Potentialy color by a field value */ + colorByField?: Field; } - -/** - * @alpha - */ -export interface BarChartFieldConfig extends AxisConfig, HideableFieldConfig { - lineWidth?: number; // 0 - fillOpacity?: number; // 100 - gradientMode?: GraphGradientMode; -} - -/** - * @alpha - */ -export const defaultBarChartFieldConfig: BarChartFieldConfig = { - lineWidth: 1, - fillOpacity: 80, - gradientMode: GraphGradientMode.None, - axisSoftMin: 0, -}; diff --git a/public/app/plugins/panel/barchart/utils.test.ts b/public/app/plugins/panel/barchart/utils.test.ts index 0b1333f4f22..482c9c09f47 100644 --- a/public/app/plugins/panel/barchart/utils.test.ts +++ b/public/app/plugins/panel/barchart/utils.test.ts @@ -1,10 +1,11 @@ -import { prepareGraphableFrames, preparePlotConfigBuilder, preparePlotFrame } from './utils'; +import { BarChartOptionsEX, prepareBarChartDisplayValues, preparePlotConfigBuilder } from './utils'; import { LegendDisplayMode, TooltipDisplayMode, VisibilityMode, GraphGradientMode, StackingMode, + SortOrder, } from '@grafana/schema'; import { createTheme, @@ -16,7 +17,7 @@ import { MutableDataFrame, VizOrientation, } from '@grafana/data'; -import { BarChartFieldConfig, BarChartOptions } from './types'; +import { BarChartFieldConfig } from './models.gen'; function mockDataFrame() { const df1 = new MutableDataFrame({ @@ -65,7 +66,7 @@ function mockDataFrame() { state: {}, }); - return preparePlotFrame([df1, df2]); + return prepareBarChartDisplayValues([df1], createTheme(), {} as any).aligned; } jest.mock('@grafana/data', () => ({ @@ -77,7 +78,7 @@ describe('BarChart utils', () => { describe('preparePlotConfigBuilder', () => { const frame = mockDataFrame(); - const config: BarChartOptions = { + const config: BarChartOptionsEX = { orientation: VizOrientation.Auto, groupWidth: 20, barWidth: 2, @@ -87,9 +88,12 @@ describe('BarChart utils', () => { placement: 'bottom', calcs: [], }, + xTickLabelRotation: 0, + xTickLabelMaxLength: 20, stacking: StackingMode.None, tooltip: { mode: TooltipDisplayMode.None, + sort: SortOrder.None, }, text: { valueSize: 10, @@ -144,20 +148,20 @@ describe('BarChart utils', () => { describe('prepareGraphableFrames', () => { it('will warn when there is no data in the response', () => { - const result = prepareGraphableFrames([], createTheme(), StackingMode.None); + const result = prepareBarChartDisplayValues([], createTheme(), { stacking: StackingMode.None } as any); expect(result.warn).toEqual('No data in response'); }); - it('will warn when there is no string field in the response', () => { + it('will warn when there is no string or time field', () => { const df = new MutableDataFrame({ fields: [ - { name: 'a', type: FieldType.time, values: [1, 2, 3, 4, 5] }, + { name: 'a', type: FieldType.other, values: [1, 2, 3, 4, 5] }, { name: 'value', values: [1, 2, 3, 4, 5] }, ], }); - const result = prepareGraphableFrames([df], createTheme(), StackingMode.None); - expect(result.warn).toEqual('Bar charts requires a string field'); - expect(result.frames).toBeUndefined(); + const result = prepareBarChartDisplayValues([df], createTheme(), { stacking: StackingMode.None } as any); + expect(result.warn).toEqual('Bar charts requires a string or time field'); + expect(result.viz).toBeUndefined(); }); it('will warn when there are no numeric fields in the response', () => { @@ -167,9 +171,9 @@ describe('BarChart utils', () => { { name: 'value', type: FieldType.boolean, values: [true, true, true, true, true] }, ], }); - const result = prepareGraphableFrames([df], createTheme(), StackingMode.None); + const result = prepareBarChartDisplayValues([df], createTheme(), { stacking: StackingMode.None } as any); expect(result.warn).toEqual('No numeric fields found'); - expect(result.frames).toBeUndefined(); + expect(result.viz).toBeUndefined(); }); it('will convert NaN and Infinty to nulls', () => { @@ -179,9 +183,9 @@ describe('BarChart utils', () => { { name: 'value', values: [-10, NaN, 10, -Infinity, +Infinity] }, ], }); - const result = prepareGraphableFrames([df], createTheme(), StackingMode.None); + const result = prepareBarChartDisplayValues([df], createTheme(), { stacking: StackingMode.None } as any); - const field = result.frames![0].fields[1]; + const field = result.viz.fields[1]; expect(field!.values.toArray()).toMatchInlineSnapshot(` Array [ -10, @@ -192,5 +196,32 @@ describe('BarChart utils', () => { ] `); }); + + it('should sort fields when legend sortBy and sortDesc are set', () => { + const frame = new MutableDataFrame({ + fields: [ + { name: 'string', type: FieldType.string, values: ['a', 'b', 'c'] }, + { name: 'a', values: [-10, 20, 10], state: { calcs: { min: -10 } } }, + { name: 'b', values: [20, 20, 20], state: { calcs: { min: 20 } } }, + { name: 'c', values: [10, 10, 10], state: { calcs: { min: 10 } } }, + ], + }); + + const resultAsc = prepareBarChartDisplayValues([frame], createTheme(), { + legend: { sortBy: 'Min', sortDesc: false }, + } as any); + expect(resultAsc.viz.fields[0].type).toBe(FieldType.string); + expect(resultAsc.viz.fields[1].name).toBe('a'); + expect(resultAsc.viz.fields[2].name).toBe('c'); + expect(resultAsc.viz.fields[3].name).toBe('b'); + + const resultDesc = prepareBarChartDisplayValues([frame], createTheme(), { + legend: { sortBy: 'Min', sortDesc: true }, + } as any); + expect(resultDesc.viz.fields[0].type).toBe(FieldType.string); + expect(resultDesc.viz.fields[1].name).toBe('b'); + expect(resultDesc.viz.fields[2].name).toBe('c'); + expect(resultDesc.viz.fields[3].name).toBe('a'); + }); }); }); diff --git a/public/app/plugins/panel/barchart/utils.ts b/public/app/plugins/panel/barchart/utils.ts index 9254d0c2018..4c21c6fa17e 100644 --- a/public/app/plugins/panel/barchart/utils.ts +++ b/public/app/plugins/panel/barchart/utils.ts @@ -8,16 +8,27 @@ import { getFieldColorModeForField, getFieldSeriesColor, GrafanaTheme2, - MutableDataFrame, + outerJoinDataFrames, + reduceField, VizOrientation, } from '@grafana/data'; -import { BarChartFieldConfig, BarChartOptions, defaultBarChartFieldConfig } from './types'; +import { BarChartFieldConfig, PanelOptions, defaultBarChartFieldConfig } from './models.gen'; +import { BarChartDisplayValues } from './types'; import { BarsOptions, getConfig } from './bars'; -import { AxisPlacement, ScaleDirection, ScaleDistribution, ScaleOrientation, StackingMode } from '@grafana/schema'; -import { FIXED_UNIT, UPlotConfigBuilder, UPlotConfigPrepFn } from '@grafana/ui'; -import { collectStackingGroups } from '../../../../../packages/grafana-ui/src/components/uPlot/utils'; +import { FIXED_UNIT, measureText, UPlotConfigBuilder, UPlotConfigPrepFn, UPLOT_AXIS_FONT_SIZE } from '@grafana/ui'; +import { Padding } from 'uplot'; +import { + AxisPlacement, + ScaleDirection, + ScaleDistribution, + ScaleOrientation, + StackingMode, + VizLegendOptions, +} from '@grafana/schema'; +import { collectStackingGroups, orderIdsByCalcs } from '../../../../../packages/grafana-ui/src/components/uPlot/utils'; +import { orderBy } from 'lodash'; +import { findField } from 'app/features/dimensions'; -/** @alpha */ function getBarCharScaleOrientation(orientation: VizOrientation) { if (orientation === VizOrientation.Vertical) { return { @@ -36,21 +47,35 @@ function getBarCharScaleOrientation(orientation: VizOrientation) { }; } -export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ +export interface BarChartOptionsEX extends PanelOptions { + rawValue: (seriesIdx: number, valueIdx: number) => number | null; + getColor?: (seriesIdx: number, valueIdx: number, value: any) => string | null; + fillOpacity?: number; +} + +export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ frame, theme, orientation, showValue, groupWidth, barWidth, + barRadius = 0, stacking, text, rawValue, + getColor, + fillOpacity, allFrames, + xTickLabelRotation, + xTickLabelMaxLength, + xTickLabelSpacing = 0, + legend, }) => { const builder = new UPlotConfigBuilder(); - const defaultValueFormatter = (seriesIdx: number, value: any) => - formattedValueToString(frame.fields[seriesIdx].display!(value)); + const defaultValueFormatter = (seriesIdx: number, value: any) => { + return shortenValue(formattedValueToString(frame.fields[seriesIdx].display!(value)), xTickLabelMaxLength); + }; // bar orientation -> x scale orientation & direction const vizOrientation = getBarCharScaleOrientation(orientation); @@ -68,11 +93,17 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ xDir: vizOrientation.xDir, groupWidth, barWidth, + barRadius, stacking, rawValue, + getColor, + fillOpacity, formatValue, text, showValue, + legend, + xSpacing: xTickLabelSpacing, + xTimeAuto: frame.fields[0]?.type === FieldType.time && !frame.fields[0].config.unit?.startsWith('time:'), }; const config = getConfig(opts, theme); @@ -85,11 +116,16 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ builder.setTooltipInterpolator(config.interpolateTooltip); + if (vizOrientation.xOri === ScaleOrientation.Horizontal && xTickLabelRotation !== 0) { + builder.setPadding(getRotationPadding(frame, xTickLabelRotation, xTickLabelMaxLength)); + } + builder.setPrepData(config.prepData); builder.addScale({ scaleKey: 'x', isTime: false, + range: config.xRange, distribution: ScaleDistribution.Ordinal, orientation: vizOrientation.xOri, direction: vizOrientation.xDir, @@ -99,23 +135,25 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ scaleKey: 'x', isTime: false, placement: vizOrientation.xOri === 0 ? AxisPlacement.Bottom : AxisPlacement.Left, + label: frame.fields[0].config.custom?.axisLabel, splits: config.xSplits, values: config.xValues, grid: { show: false }, - ticks: false, + ticks: { show: false }, gap: 15, + tickLabelRotation: xTickLabelRotation * -1, theme, }); let seriesIndex = 0; - + const legendOrdered = isLegendOrdered(legend); const stackingGroups: Map = new Map(); // iterate the y values for (let i = 1; i < frame.fields.length; i++) { const field = frame.fields[i]; - field.state!.seriesIndex = seriesIndex++; + seriesIndex++; const customConfig: BarChartFieldConfig = { ...defaultBarChartFieldConfig, ...field.config.custom }; @@ -144,9 +182,11 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ // The following properties are not used in the uPlot config, but are utilized as transport for legend config // PlotLegend currently gets unfiltered DataFrame[], so index must be into that field array, not the prepped frame's which we're iterating here dataFrameFieldIndex: { - fieldIndex: allFrames[0].fields.findIndex( - (f) => f.type === FieldType.number && f.state?.seriesIndex === seriesIndex - 1 - ), + fieldIndex: legendOrdered + ? i + : allFrames[0].fields.findIndex( + (f) => f.type === FieldType.number && f.state?.seriesIndex === seriesIndex - 1 + ), frameIndex: 0, }, }); @@ -160,6 +200,8 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ softMax: customConfig.axisSoftMax, orientation: vizOrientation.yOri, direction: vizOrientation.yDir, + distribution: customConfig.scaleDistribution?.type, + log: customConfig.scaleDistribution?.log, }); if (customConfig.axisPlacement !== AxisPlacement.Hidden) { @@ -191,8 +233,8 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ } if (stackingGroups.size !== 0) { - builder.setStacking(true); - for (const [_, seriesIdxs] of stackingGroups.entries()) { + for (const [_, seriesIds] of stackingGroups.entries()) { + const seriesIdxs = orderIdsByCalcs({ ids: seriesIds, legend, frame }); for (let j = seriesIdxs.length - 1; j > 0; j--) { builder.addBand({ series: [seriesIdxs[j], seriesIdxs[j - 1]], @@ -204,71 +246,119 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ return builder; }; -/** @internal */ -export function preparePlotFrame(data: DataFrame[]) { - const firstFrame = data[0]; - const firstString = firstFrame.fields.find((f) => f.type === FieldType.string); +function shortenValue(value: string, length: number) { + if (value.length > length) { + return value.substring(0, length).concat('...'); + } else { + return value; + } +} - if (!firstString) { - throw new Error('No string field in DF'); +function getRotationPadding(frame: DataFrame, rotateLabel: number, valueMaxLength: number): Padding { + const values = frame.fields[0].values; + const fontSize = UPLOT_AXIS_FONT_SIZE; + const displayProcessor = frame.fields[0].display ?? ((v) => v); + let maxLength = 0; + for (let i = 0; i < values.length; i++) { + let size = measureText( + shortenValue(formattedValueToString(displayProcessor(values.get(i))), valueMaxLength), + fontSize + ); + maxLength = size.width > maxLength ? size.width : maxLength; } - const resultFrame = new MutableDataFrame(); - resultFrame.addField(firstString); + // Add padding to the right if the labels are rotated in a way that makes the last label extend outside the graph. + const paddingRight = + rotateLabel > 0 + ? Math.cos((rotateLabel * Math.PI) / 180) * + measureText( + shortenValue(formattedValueToString(displayProcessor(values.get(values.length - 1))), valueMaxLength), + fontSize + ).width + : 0; - for (const f of firstFrame.fields) { - if (f.type === FieldType.number) { - resultFrame.addField(f); - } - } + // Add padding to the left if the labels are rotated in a way that makes the first label extend outside the graph. + const paddingLeft = + rotateLabel < 0 + ? Math.cos((rotateLabel * -1 * Math.PI) / 180) * + measureText(shortenValue(formattedValueToString(displayProcessor(values.get(0))), valueMaxLength), fontSize) + .width + : 0; - return resultFrame; + // Add padding to the bottom to avoid clipping the rotated labels. + const paddingBottom = Math.sin(((rotateLabel >= 0 ? rotateLabel : rotateLabel * -1) * Math.PI) / 180) * maxLength; + + return [0, paddingRight, paddingBottom, paddingLeft]; } /** @internal */ -export function prepareGraphableFrames( +export function prepareBarChartDisplayValues( series: DataFrame[], theme: GrafanaTheme2, - stacking: StackingMode -): { frames?: DataFrame[]; warn?: string } { + options: PanelOptions +): BarChartDisplayValues { if (!series?.length) { - return { warn: 'No data in response' }; + return { warn: 'No data in response' } as BarChartDisplayValues; } - const frames: DataFrame[] = []; - const firstFrame = series[0]; - - if (!firstFrame.fields.some((f) => f.type === FieldType.string)) { - return { - warn: 'Bar charts requires a string field', - }; + // Bar chart requires a single frame + const frame = series.length === 1 ? series[0] : outerJoinDataFrames({ frames: series, enforceSort: false }); + if (!frame) { + return { warn: 'Unable to join data' } as BarChartDisplayValues; } - if (!firstFrame.fields.some((f) => f.type === FieldType.number)) { - return { - warn: 'No numeric fields found', - }; + // Color by a field different than the input + let colorByField: Field | undefined = undefined; + if (options.colorByField) { + colorByField = findField(frame, options.colorByField); + if (!colorByField) { + return { warn: 'Color field not found' } as BarChartDisplayValues; + } } - let seriesIndex = 0; + let xField: Field | undefined = undefined; + if (options.xField) { + xField = findField(frame, options.xField); + if (!xField) { + return { warn: 'Configured x field not found' } as BarChartDisplayValues; + } + } - for (let frame of series) { - const fields: Field[] = []; - for (const field of frame.fields) { - if (field.type === FieldType.number) { - field.state = field.state ?? {}; + let stringField: Field | undefined = undefined; + let timeField: Field | undefined = undefined; + let fields: Field[] = []; + for (const field of frame.fields) { + if (field === xField) { + continue; + } - field.state.seriesIndex = seriesIndex++; + switch (field.type) { + case FieldType.string: + if (!stringField) { + stringField = field; + } + break; - let copy = { + case FieldType.time: + if (!timeField) { + timeField = field; + } + break; + + case FieldType.number: { + const copy = { ...field, + state: { + ...field.state, + seriesIndex: fields.length, // off by one? + }, config: { ...field.config, custom: { ...field.config.custom, stacking: { group: '_', - mode: stacking, + mode: options.stacking, }, }, }, @@ -282,22 +372,64 @@ export function prepareGraphableFrames( ), }; - if (stacking === StackingMode.Percent) { + if (options.stacking === StackingMode.Percent) { copy.config.unit = 'percentunit'; copy.display = getDisplayProcessor({ field: copy, theme }); } fields.push(copy); - } else { - fields.push({ ...field }); } } - - frames.push({ - ...frame, - fields, - }); } - return { frames }; + let firstField = xField; + if (!firstField) { + firstField = stringField || timeField; + } + + if (!firstField) { + return { + warn: 'Bar charts requires a string or time field', + } as BarChartDisplayValues; + } + + if (!fields.length) { + return { + warn: 'No numeric fields found', + } as BarChartDisplayValues; + } + + // Show the first number value + if (colorByField && fields.length > 1) { + const firstNumber = fields.find((f) => f !== colorByField); + if (firstNumber) { + fields = [firstNumber]; + } + } + + if (isLegendOrdered(options.legend)) { + const sortKey = options.legend.sortBy!.toLowerCase(); + const reducers = options.legend.calcs ?? [sortKey]; + fields = orderBy( + fields, + (field) => { + return reduceField({ field, reducers })[sortKey]; + }, + options.legend.sortDesc ? 'desc' : 'asc' + ); + } + + // String field is first + fields.unshift(firstField); + + return { + aligned: frame, + colorByField, + viz: { + length: firstField.values.length, + fields: fields, // ideally: fields.filter((f) => !Boolean(f.config.custom?.hideFrom?.viz)), + }, + }; } + +export const isLegendOrdered = (options: VizLegendOptions) => Boolean(options?.sortBy && options.sortDesc !== null); diff --git a/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx b/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx index 3b1f4e6fa9f..df1441b4b90 100644 --- a/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx +++ b/public/app/plugins/panel/bargauge/BarGaugePanel.test.tsx @@ -1,15 +1,15 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { - PanelData, dateMath, - TimeRange, - VizOrientation, - PanelProps, - LoadingState, dateTime, FieldConfigSource, + LoadingState, + PanelData, + PanelProps, + TimeRange, toDataFrame, + VizOrientation, } from '@grafana/data'; import { BarGaugeDisplayMode } from '@grafana/ui'; import { selectors } from '@grafana/e2e-selectors'; @@ -17,7 +17,7 @@ import { selectors } from '@grafana/e2e-selectors'; import { BarGaugePanel } from './BarGaugePanel'; import { BarGaugeOptions } from './types'; -const valueSelector = selectors.components.Panels.Visualization.BarGauge.value; +const valueSelector = selectors.components.Panels.Visualization.BarGauge.valueV2; describe('BarGaugePanel', () => { describe('when empty result is rendered', () => { @@ -28,7 +28,7 @@ describe('BarGaugePanel', () => { }); it('should render with title "No data"', () => { - const displayValue = wrapper.find(`div[aria-label="${valueSelector}"]`).text(); + const displayValue = wrapper.find(`div[data-testid="${valueSelector}"]`).text(); expect(displayValue).toBe('No data'); }); }); @@ -49,7 +49,7 @@ describe('BarGaugePanel', () => { }); it('should render with title "No data"', () => { - const displayValue = wrapper.find(`div[aria-label="${valueSelector}"]`).text(); + const displayValue = wrapper.find(`div[data-testid="${valueSelector}"]`).text(); expect(displayValue).toBe('100'); }); }); diff --git a/public/app/plugins/panel/bargauge/BarGaugePanel.tsx b/public/app/plugins/panel/bargauge/BarGaugePanel.tsx index 2288c95b756..0930d6c6d4a 100644 --- a/public/app/plugins/panel/bargauge/BarGaugePanel.tsx +++ b/public/app/plugins/panel/bargauge/BarGaugePanel.tsx @@ -8,6 +8,7 @@ import { FieldConfig, DisplayProcessor, DisplayValue, + VizOrientation, } from '@grafana/data'; import { BarGauge, DataLinksContextMenu, VizRepeater, VizRepeaterRenderValueProps } from '@grafana/ui'; @@ -28,7 +29,7 @@ export class BarGaugePanel extends PureComponent> { let processor: DisplayProcessor | undefined = undefined; if (view && isNumber(colIndex)) { - processor = view!.getFieldDisplayProcessor(colIndex as number); + processor = view.getFieldDisplayProcessor(colIndex); } return ( @@ -52,18 +53,19 @@ export class BarGaugePanel extends PureComponent> { }; renderValue = (valueProps: VizRepeaterRenderValueProps): JSX.Element => { - const { value } = valueProps; + const { value, orientation } = valueProps; const { hasLinks, getLinks } = value; if (hasLinks && getLinks) { return ( - - {(api) => { - return this.renderComponent(valueProps, api); - }} - +
    + + {(api) => this.renderComponent(valueProps, api)} + +
    ); } + return this.renderComponent(valueProps, {}); }; diff --git a/public/app/plugins/panel/bargauge/module.tsx b/public/app/plugins/panel/bargauge/module.tsx index c869d5a40da..6f0c06e8d72 100644 --- a/public/app/plugins/panel/bargauge/module.tsx +++ b/public/app/plugins/panel/bargauge/module.tsx @@ -4,6 +4,7 @@ import { BarGaugePanel } from './BarGaugePanel'; import { BarGaugeOptions, displayModes } from './types'; import { addOrientationOption, addStandardDataReduceOptions } from '../stat/types'; import { barGaugePanelMigrationHandler } from './BarGaugeMigrations'; +import { BarGaugeSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(BarGaugePanel) .useFieldConfig() @@ -30,4 +31,5 @@ export const plugin = new PanelPlugin(BarGaugePanel) }); }) .setPanelChangeHandler(sharedSingleStatPanelChangedHandler) - .setMigrationHandler(barGaugePanelMigrationHandler); + .setMigrationHandler(barGaugePanelMigrationHandler) + .setSuggestionsSupplier(new BarGaugeSuggestionsSupplier()); diff --git a/public/app/plugins/panel/bargauge/suggestions.ts b/public/app/plugins/panel/bargauge/suggestions.ts new file mode 100644 index 00000000000..be937485b4f --- /dev/null +++ b/public/app/plugins/panel/bargauge/suggestions.ts @@ -0,0 +1,114 @@ +import { VisualizationSuggestionsBuilder, VizOrientation } from '@grafana/data'; +import { BarGaugeDisplayMode } from '@grafana/ui'; +import { SuggestionName } from 'app/types/suggestions'; +import { BarGaugeOptions } from './types'; + +export class BarGaugeSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary } = builder; + + if (!dataSummary.hasData || !dataSummary.hasNumberField) { + return; + } + + const list = builder.getListAppender({ + name: '', + pluginId: 'bargauge', + options: {}, + fieldConfig: { + defaults: { + custom: {}, + }, + overrides: [], + }, + }); + + // This is probably not a good option for many numeric fields + if (dataSummary.numberFieldCount > 50) { + return; + } + + // To use show individual row values we also need a string field to give each value a name + if (dataSummary.hasStringField && dataSummary.frameCount === 1 && dataSummary.rowCountTotal < 30) { + list.append({ + name: SuggestionName.BarGaugeBasic, + options: { + reduceOptions: { + values: true, + calcs: [], + }, + displayMode: BarGaugeDisplayMode.Basic, + orientation: VizOrientation.Horizontal, + }, + fieldConfig: { + defaults: { + color: { + mode: 'continuous-GrYlRd', + }, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.BarGaugeLCD, + options: { + reduceOptions: { + values: true, + calcs: [], + }, + displayMode: BarGaugeDisplayMode.Lcd, + orientation: VizOrientation.Horizontal, + }, + fieldConfig: { + defaults: { + color: { + mode: 'continuous-GrYlRd', + }, + }, + overrides: [], + }, + }); + } else { + list.append({ + name: SuggestionName.BarGaugeBasic, + options: { + displayMode: BarGaugeDisplayMode.Basic, + orientation: VizOrientation.Horizontal, + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + }, + fieldConfig: { + defaults: { + color: { + mode: 'continuous-GrYlRd', + }, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.BarGaugeLCD, + options: { + displayMode: BarGaugeDisplayMode.Lcd, + orientation: VizOrientation.Horizontal, + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + }, + fieldConfig: { + defaults: { + color: { + mode: 'continuous-GrYlRd', + }, + }, + overrides: [], + }, + }); + } + } +} diff --git a/public/app/plugins/panel/candlestick/CandlestickPanel.tsx b/public/app/plugins/panel/candlestick/CandlestickPanel.tsx new file mode 100644 index 00000000000..28fd8f6cfa3 --- /dev/null +++ b/public/app/plugins/panel/candlestick/CandlestickPanel.tsx @@ -0,0 +1,301 @@ +// this file is pretty much a copy-paste of TimeSeriesPanel.tsx :( +// with some extra renderers passed to the component + +import React, { useMemo } from 'react'; +import { Field, getDisplayProcessor, PanelProps } from '@grafana/data'; +import { TooltipDisplayMode } from '@grafana/schema'; +import { usePanelContext, TimeSeries, TooltipPlugin, ZoomPlugin, UPlotConfigBuilder, useTheme2 } from '@grafana/ui'; +import { getFieldLinksForExplore } from 'app/features/explore/utils/links'; +import { AnnotationsPlugin } from '../timeseries/plugins/AnnotationsPlugin'; +import { ContextMenuPlugin } from '../timeseries/plugins/ContextMenuPlugin'; +import { ExemplarsPlugin } from '../timeseries/plugins/ExemplarsPlugin'; +import { AnnotationEditorPlugin } from '../timeseries/plugins/AnnotationEditorPlugin'; +import { ThresholdControlsPlugin } from '../timeseries/plugins/ThresholdControlsPlugin'; +import { config } from 'app/core/config'; +import { drawMarkers, FieldIndices } from './utils'; +import { defaultColors, CandlestickOptions, VizDisplayMode } from './models.gen'; +import { ScaleProps } from '@grafana/ui/src/components/uPlot/config/UPlotScaleBuilder'; +import { AxisProps } from '@grafana/ui/src/components/uPlot/config/UPlotAxisBuilder'; +import { prepareCandlestickFields } from './fields'; +import uPlot from 'uplot'; +import { PanelDataErrorView } from '@grafana/runtime'; + +interface CandlestickPanelProps extends PanelProps {} + +export const CandlestickPanel: React.FC = ({ + data, + id, + timeRange, + timeZone, + width, + height, + options, + fieldConfig, + onChangeTimeRange, + replaceVariables, +}) => { + const { sync, canAddAnnotations, onThresholdsChange, canEditThresholds, onSplitOpen } = usePanelContext(); + + const getFieldLinks = (field: Field, rowIndex: number) => { + return getFieldLinksForExplore({ field, rowIndex, splitOpenFn: onSplitOpen, range: timeRange }); + }; + + const theme = useTheme2(); + + const info = useMemo(() => prepareCandlestickFields(data?.series, options, theme), [data, options, theme]); + + const { renderers, tweakScale, tweakAxis } = useMemo(() => { + let tweakScale = (opts: ScaleProps, forField: Field) => opts; + let tweakAxis = (opts: AxisProps, forField: Field) => opts; + + let doNothing = { + renderers: [], + tweakScale, + tweakAxis, + }; + + if (!info) { + return doNothing; + } + + // Un-encoding the already parsed special fields + // This takes currently matched fields and saves the name so they can be looked up by name later + // ¯\_(ツ)_/¯ someday this can make more sense! + const fieldMap = info.names; + + if (!Object.keys(fieldMap).length) { + return doNothing; + } + + const { mode, candleStyle, colorStrategy } = options; + const colors = { ...defaultColors, ...options.colors }; + let { open, high, low, close, volume } = fieldMap; // names from matched fields + + if (open == null || close == null) { + return doNothing; + } + + let volumeAlpha = 0.5; + + let volumeIdx = -1; + + let shouldRenderVolume = false; + + // find volume field and set overrides + if (volume != null && mode !== VizDisplayMode.Candles) { + let volumeField = info.volume!; + + if (volumeField != null) { + shouldRenderVolume = true; + + let { fillOpacity } = volumeField.config.custom; + + if (fillOpacity) { + volumeAlpha = fillOpacity / 100; + } + + // we only want to put volume on own shorter axis when rendered with price + if (mode !== VizDisplayMode.Volume) { + volumeField.config = { ...volumeField.config }; + volumeField.config.unit = 'short'; + volumeField.display = getDisplayProcessor({ + field: volumeField, + theme: config.theme2, + }); + + tweakAxis = (opts: AxisProps, forField: Field) => { + // we can't do forField === info.volume because of copies :( + if (forField.name === info.volume?.name) { + let filter = (u: uPlot, splits: number[]) => { + let _splits = []; + let max = u.series[volumeIdx].max as number; + + for (let i = 0; i < splits.length; i++) { + _splits.push(splits[i]); + + if (splits[i] > max) { + break; + } + } + + return _splits; + }; + + opts.space = 20; // reduce tick spacing + opts.filter = filter; // hide tick labels + opts.ticks = { ...opts.ticks, filter }; // hide tick marks + } + + return opts; + }; + + tweakScale = (opts: ScaleProps, forField: Field) => { + // we can't do forField === info.volume because of copies :( + if (forField.name === info.volume?.name) { + opts.range = (u: uPlot, min: number, max: number) => [0, max * 7]; + } + + return opts; + }; + } + } + } + + let shouldRenderPrice = mode !== VizDisplayMode.Volume && high != null && low != null; + + if (!shouldRenderPrice && !shouldRenderVolume) { + return doNothing; + } + + let fields: Record = {}; + let indicesOnly = []; + + if (shouldRenderPrice) { + fields = { open, high: high!, low: low!, close }; + + // hide series from legend that are rendered as composite markers + for (let key in fields) { + let field = (info as any)[key] as Field; + field.config = { + ...field.config, + custom: { + ...field.config.custom, + hideFrom: { legend: true, tooltip: false, viz: false }, + }, + }; + } + } else { + // these fields should not be omitted from normal rendering if they arent rendered + // as part of price markers. they're only here so we can get back their indicies in the + // init callback below. TODO: remove this when field mapping happens in the panel instead of deep + indicesOnly.push(open, close); + } + + if (shouldRenderVolume) { + fields.volume = volume!; + fields.open = open; + fields.close = close; + } + + return { + renderers: [ + { + fieldMap: fields, + indicesOnly, + init: (builder: UPlotConfigBuilder, fieldIndices: FieldIndices) => { + volumeIdx = fieldIndices.volume!; + + builder.addHook( + 'drawAxes', + drawMarkers({ + mode, + fields: fieldIndices, + upColor: config.theme2.visualization.getColorByName(colors.up), + downColor: config.theme2.visualization.getColorByName(colors.down), + flatColor: config.theme2.visualization.getColorByName(colors.flat), + volumeAlpha, + colorStrategy, + candleStyle, + flatAsUp: true, + }) + ); + }, + }, + ], + tweakScale, + tweakAxis, + }; + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [options, data.structureRev]); + + if (!info) { + return ; + } + + const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations()); + + return ( + + {(config, alignedDataFrame) => { + return ( + <> + + + {/* Renders annotation markers*/} + {data.annotations && ( + + )} + {/* Enables annotations creation*/} + + {({ startAnnotating }) => { + return ( + { + if (!p) { + return; + } + startAnnotating({ coords: p.coords }); + }, + }, + ], + }, + ] + : [] + } + /> + ); + }} + + {data.annotations && ( + + )} + + {canEditThresholds && onThresholdsChange && ( + + )} + + ); + }} + + ); +}; diff --git a/public/app/plugins/panel/candlestick/README.md b/public/app/plugins/panel/candlestick/README.md new file mode 100644 index 00000000000..78d1d3841aa --- /dev/null +++ b/public/app/plugins/panel/candlestick/README.md @@ -0,0 +1,9 @@ +# Candlestick + +The candlestick panel shows a chart that is typically used to describe price movements of a security, derivative, or currency. + +This chart is **included** with Grafana. + +Read more about it here: + +[https://grafana.com/docs/grafana/latest/visualizations/candlestick/](https://grafana.com/docs/grafana/latest/visualizations/candlestick/) diff --git a/public/app/plugins/panel/candlestick/fields.test.ts b/public/app/plugins/panel/candlestick/fields.test.ts new file mode 100644 index 00000000000..01e8abd6e7b --- /dev/null +++ b/public/app/plugins/panel/candlestick/fields.test.ts @@ -0,0 +1,295 @@ +import { createTheme, toDataFrame } from '@grafana/data'; +import { prepareCandlestickFields } from './fields'; +import { CandlestickOptions, VizDisplayMode } from './models.gen'; + +const theme = createTheme(); + +describe('Candlestick data', () => { + const options: CandlestickOptions = {} as CandlestickOptions; + + it('require a time field', () => { + const info = prepareCandlestickFields( + [ + toDataFrame({ + name: 'hello', + columns: ['a', 'b', 'c'], + rows: [ + ['A', 2, 3], + ['B', 4, 5], + ['C', 6, 7], + ], + }), + ], + options, + theme + ); + expect(info).toBeNull(); + }); + + it('will match common names by default', () => { + const info = prepareCandlestickFields( + [ + toDataFrame({ + fields: [ + { name: 'time', values: [1] }, + { name: 'a', values: [1] }, + { name: 'min', values: [1] }, + { name: 'MAX', values: [1] }, + { name: 'v', values: [1] }, + ], + }), + ], + options, + theme + ); + expect(info?.names).toMatchInlineSnapshot(` + Object { + "close": "Next open", + "high": "MAX", + "low": "min", + "open": "a", + "volume": "v", + } + `); + }); + + it('will support simple timeseries (poorly)', () => { + const info = prepareCandlestickFields( + [ + toDataFrame({ + fields: [ + { + name: 'time', + values: [1, 2, 3], + }, + { + name: 'value', + values: [4, 5, 6], + }, + ], + }), + ], + options, + theme + )!; + + expect(info.open).toBeDefined(); + expect(info.open).toEqual(info.high); + expect(info.open).toEqual(info.low); + expect(info.open).not.toEqual(info.close); + expect(info.names.close).toMatchInlineSnapshot(`"Next open"`); + + // Close should be offset by one and dupliate last point + expect({ open: info.open!.values.toArray(), close: info.close!.values.toArray() }).toMatchInlineSnapshot(` + Object { + "close": Array [ + 5, + 6, + 6, + ], + "open": Array [ + 4, + 5, + 6, + ], + } + `); + }); + + it('will create open from previous close', () => { + const info = prepareCandlestickFields( + [ + toDataFrame({ + fields: [ + { + name: 'time', + values: [1, 2, 3, 4, 5], + }, + { + name: 'close', + values: [1, 2, 3, 4, 5], + }, + ], + }), + ], + options, + theme + )!; + + expect(info.open!.values.toArray()).toEqual([1, 1, 2, 3, 4]); + expect(info.close!.values.toArray()).toEqual([1, 2, 3, 4, 5]); + }); + + it('will unmap high & low fields in volume-only mode', () => { + const options: CandlestickOptions = { + mode: VizDisplayMode.Volume, + includeAllFields: true, + } as CandlestickOptions; + + const info = prepareCandlestickFields( + [ + toDataFrame({ + fields: [ + { + name: 'time', + values: [1, 2, 3], + }, + { + name: 'low', + values: [4, 5, 6], + }, + { + name: 'high', + values: [7, 8, 9], + }, + { + name: 'open', + values: [4, 5, 6], + }, + { + name: 'close', + values: [7, 8, 9], + }, + { + name: 'volume', + values: [70, 80, 90], + }, + { + name: 'extra', + values: [10, 20, 30], + }, + ], + }), + ], + options, + theme + )!; + + expect(info.open).toBeDefined(); + expect(info.close).toBeDefined(); + expect(info.volume).toBeDefined(); + + expect(info.frame.fields).toContain(info.open); + expect(info.frame.fields).toContain(info.close); + expect(info.frame.fields).toContain(info.volume); + + expect(info.high).toBeUndefined(); + expect(info.low).toBeUndefined(); + + // includeAllFields: true + expect(info.frame.fields.find((f) => f.name === 'high')).toBeDefined(); + expect(info.frame.fields.find((f) => f.name === 'low')).toBeDefined(); + expect(info.frame.fields.find((f) => f.name === 'extra')).toBeDefined(); + }); + + it('will unmap volume field in candles-only mode', () => { + const options: CandlestickOptions = { + mode: VizDisplayMode.Candles, + includeAllFields: false, + } as CandlestickOptions; + + const info = prepareCandlestickFields( + [ + toDataFrame({ + fields: [ + { + name: 'time', + values: [1, 2, 3], + }, + { + name: 'low', + values: [4, 5, 6], + }, + { + name: 'high', + values: [7, 8, 9], + }, + { + name: 'open', + values: [4, 5, 6], + }, + { + name: 'close', + values: [7, 8, 9], + }, + { + name: 'volume', + values: [70, 80, 90], + }, + { + name: 'extra', + values: [10, 20, 30], + }, + ], + }), + ], + options, + theme + )!; + + expect(info.open).toBeDefined(); + expect(info.close).toBeDefined(); + expect(info.high).toBeDefined(); + expect(info.low).toBeDefined(); + + expect(info.volume).toBeUndefined(); + + expect(info.frame.fields).toContain(info.open); + expect(info.frame.fields).toContain(info.close); + expect(info.frame.fields).toContain(info.high); + expect(info.frame.fields).toContain(info.low); + + // includeAllFields: false + expect(info.frame.fields.find((f) => f.name === 'volume')).toBeUndefined(); + expect(info.frame.fields.find((f) => f.name === 'extra')).toBeUndefined(); + }); + + it("will not remove open field from frame when it's also mapped to high in volume-only mode", () => { + const options: CandlestickOptions = { + mode: VizDisplayMode.Volume, + includeAllFields: false, + } as CandlestickOptions; + + const info = prepareCandlestickFields( + [ + toDataFrame({ + fields: [ + { + name: 'time', + values: [1, 2, 3], + }, + { + name: 'open', + values: [4, 5, 6], + }, + { + name: 'close', + values: [7, 8, 9], + }, + { + name: 'volume', + values: [70, 80, 90], + }, + { + name: 'extra', + values: [10, 20, 30], + }, + ], + }), + ], + options, + theme + )!; + + expect(info.open).toBeDefined(); + expect(info.close).toBeDefined(); + expect(info.volume).toBeDefined(); + + expect(info.frame.fields).toContain(info.open); + expect(info.frame.fields).toContain(info.close); + expect(info.frame.fields).toContain(info.volume); + + // includeAllFields: false + expect(info.frame.fields.find((f) => f.name === 'extra')).toBeUndefined(); + }); +}); diff --git a/public/app/plugins/panel/candlestick/fields.ts b/public/app/plugins/panel/candlestick/fields.ts new file mode 100644 index 00000000000..b81b98af79b --- /dev/null +++ b/public/app/plugins/panel/candlestick/fields.ts @@ -0,0 +1,246 @@ +import { + ArrayVector, + DataFrame, + Field, + FieldType, + getFieldDisplayName, + GrafanaTheme2, + outerJoinDataFrames, +} from '@grafana/data'; +import { findField } from 'app/features/dimensions'; +import { prepareGraphableFields } from '../timeseries/utils'; +import { CandlestickOptions, CandlestickFieldMap, VizDisplayMode } from './models.gen'; + +export interface FieldPickerInfo { + /** property name */ + key: keyof CandlestickFieldMap; + + /** The display name */ + name: string; + + /** by default pick these fields */ + defaults: string[]; + + /** How is the field used */ + description: string; +} + +export const candlestickFieldsInfo: Record = { + open: { + key: 'open', + name: 'Open', + defaults: ['open', 'o'], + description: 'Value at the start of the period', + }, + high: { + key: 'high', + name: 'High', + defaults: ['high', 'h', 'max'], + description: 'Maximum value within the period', + }, + low: { + key: 'low', + name: 'Low', + defaults: ['low', 'l', 'min'], + description: 'Minimum value within the period', + }, + close: { + key: 'close', + name: 'Close', + defaults: ['close', 'c'], + description: 'Value at the end of the period', + }, + volume: { + key: 'volume', + name: 'Volume', + defaults: ['volume', 'v'], + description: 'Sample count within the period', + }, +}; + +export interface CandlestickData { + autoOpenClose?: boolean; + + // Special fields + open?: Field; + high?: Field; + low?: Field; + close?: Field; + volume?: Field; + + // All incoming values + aligned: DataFrame; + + // The stuff passed to GraphNG + frame: DataFrame; + + // The real names used + names: CandlestickFieldMap; +} + +function findFieldOrAuto(frame: DataFrame, info: FieldPickerInfo, options: CandlestickFieldMap): Field | undefined { + const field = findField(frame, options[info.key]); + if (!field) { + for (const field of frame.fields) { + const name = getFieldDisplayName(field, frame).toLowerCase(); + if (info.defaults.includes(name) || info.defaults.includes(field.name)) { + return field; + } + } + } + return field; +} + +export function prepareCandlestickFields( + series: DataFrame[] | undefined, + options: CandlestickOptions, + theme: GrafanaTheme2 +): CandlestickData | null { + if (!series?.length) { + return null; + } + + // All fields + const fieldMap = options.fields ?? {}; + const aligned = series.length === 1 ? series[0] : outerJoinDataFrames({ frames: series, enforceSort: true }); + if (!aligned?.length) { + return null; + } + + const data: CandlestickData = { aligned, frame: aligned, names: {} }; + + // Apply same filter as everythign else in timeseries + const timeSeriesFrames = prepareGraphableFields([aligned], theme); + if (!timeSeriesFrames) { + return null; + } + + const frame = (data.frame = timeSeriesFrames[0]); + const timeIndex = frame.fields.findIndex((f) => f.type === FieldType.time); + + if (timeIndex < 0) { + return null; + } + + // Find the known fields + const used = new Set(); + for (const info of Object.values(candlestickFieldsInfo)) { + const field = findFieldOrAuto(frame, info, fieldMap); + if (field) { + data[info.key] = field; + used.add(field); + } + } + + // Use first numeric value as open + if (!data.open && !data.close) { + data.open = frame.fields.find((f) => f.type === FieldType.number); + if (data.open) { + used.add(data.open); + } + } + + // Use next open as 'close' value + if (data.open && !data.close && !fieldMap.close) { + const values = data.open.values.toArray().slice(1); + values.push(values[values.length - 1]); // duplicate last value + data.close = { + ...data.open, + values: new ArrayVector(values), + name: 'Next open', + state: undefined, + }; + used.add(data.close); + frame.fields.push(data.close); + data.autoOpenClose = true; + } + + // Use previous close as 'open' value + if (data.close && !data.open && !fieldMap.open) { + const values = data.close.values.toArray().slice(); + values.unshift(values[0]); // duplicate first value + values.length = frame.length; + data.open = { + ...data.close, + values: new ArrayVector(values), + name: 'Previous close', + state: undefined, + }; + used.add(data.open); + frame.fields.push(data.open); + data.autoOpenClose = true; + } + + // Use the open field for min/max if nothing is set + if (!data.high && !fieldMap.high) { + data.high = data.open; + } + if (!data.low && !fieldMap.low) { + data.low = data.open; + } + + // unmap low and high fields in volume-only mode, and volume field in candles-only mode + // so they fall through to unmapped fields and get appropriate includeAllFields treatment + if (options.mode === VizDisplayMode.Volume) { + if (data.high) { + if (data.high !== data.open) { + used.delete(data.high); + } + data.high = undefined; + } + if (data.low) { + if (data.low !== data.open) { + used.delete(data.low); + } + data.low = undefined; + } + } else if (options.mode === VizDisplayMode.Candles) { + if (data.volume) { + used.delete(data.volume); + data.volume = undefined; + } + } + + // Register the name of each mapped field + for (const info of Object.values(candlestickFieldsInfo)) { + const f = data[info.key]; + if (f) { + data.names[info.key] = getFieldDisplayName(f, data.frame); + } + } + + const timeField = frame.fields[timeIndex]; + + // Make sure first field is time! + const fields: Field[] = [timeField]; + + if (!options.includeAllFields) { + fields.push(...used); + } else { + fields.push(...frame.fields.filter((f) => f !== timeField)); + } + + data.frame = { + ...data.frame, + fields, + }; + + // Force update all the indicies + for (let i = 0; i < data.frame.fields.length; i++) { + const field = data.frame.fields[i]; + + field.state = { + ...field.state, + + // time is unused (-1), y series enumerate from 0 + seriesIndex: i - 1, + + origin: { + fieldIndex: i, + frameIndex: 0, + }, + }; + } + + return data; +} diff --git a/public/app/plugins/panel/candlestick/img/candlestick.svg b/public/app/plugins/panel/candlestick/img/candlestick.svg new file mode 100644 index 00000000000..17ec18ffe43 --- /dev/null +++ b/public/app/plugins/panel/candlestick/img/candlestick.svg @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/public/app/plugins/panel/candlestick/models.cue b/public/app/plugins/panel/candlestick/models.cue new file mode 100644 index 00000000000..1bb9205ed9a --- /dev/null +++ b/public/app/plugins/panel/candlestick/models.cue @@ -0,0 +1,33 @@ +// Copyright 2021 Grafana Labs +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package grafanaschema + +Panel: { + lineages: [ + [ + { + PanelOptions: { + // anything for now + ... + } + PanelFieldConfig: { + // anything for now + ... + } + } + ] + ] + migrations: [] +} diff --git a/public/app/plugins/panel/candlestick/models.gen.ts b/public/app/plugins/panel/candlestick/models.gen.ts new file mode 100644 index 00000000000..892e420befa --- /dev/null +++ b/public/app/plugins/panel/candlestick/models.gen.ts @@ -0,0 +1,73 @@ +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +// NOTE: This file will be auto generated from models.cue +// It is currenty hand written but will serve as the target for cuetsy +//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +import { LegendDisplayMode, OptionsWithLegend } from '@grafana/schema'; + +export const modelVersion = Object.freeze([1, 0]); + +export enum VizDisplayMode { + CandlesVolume = 'candles+volume', + Candles = 'candles', + Volume = 'volume', +} + +export enum CandleStyle { + Candles = 'candles', + OHLCBars = 'ohlcbars', +} + +export enum ColorStrategy { + // up/down color depends on current close vs current open + // filled always + OpenClose = 'open-close', + // up/down color depends on current close vs prior close + // filled/hollow depends on current close vs current open + CloseClose = 'close-close', +} + +export interface CandlestickFieldMap { + open?: string; + high?: string; + low?: string; + close?: string; + volume?: string; +} + +export interface CandlestickColors { + up: string; + down: string; + flat: string; +} + +export const defaultColors: CandlestickColors = { + up: 'green', + down: 'red', + flat: 'gray', +}; + +export interface CandlestickOptions extends OptionsWithLegend { + mode: VizDisplayMode; + candleStyle: CandleStyle; + colorStrategy: ColorStrategy; + fields: CandlestickFieldMap; + colors: CandlestickColors; + + // When enabled, all fields will be sent to the graph + includeAllFields?: boolean; +} + +export const defaultPanelOptions: CandlestickOptions = { + mode: VizDisplayMode.CandlesVolume, + candleStyle: CandleStyle.Candles, + colorStrategy: ColorStrategy.OpenClose, + colors: defaultColors, + fields: {}, + legend: { + displayMode: LegendDisplayMode.List, + placement: 'bottom', + calcs: [], + }, + includeAllFields: false, +}; diff --git a/public/app/plugins/panel/candlestick/module.tsx b/public/app/plugins/panel/candlestick/module.tsx new file mode 100644 index 00000000000..c7cf322dc3e --- /dev/null +++ b/public/app/plugins/panel/candlestick/module.tsx @@ -0,0 +1,149 @@ +import { GraphFieldConfig } from '@grafana/schema'; +import { + Field, + FieldType, + getFieldDisplayName, + PanelOptionsEditorBuilder, + PanelPlugin, + SelectableValue, +} from '@grafana/data'; +import { commonOptionsBuilder } from '@grafana/ui'; +import { CandlestickPanel } from './CandlestickPanel'; +import { + defaultColors, + CandlestickOptions, + VizDisplayMode, + ColorStrategy, + defaultPanelOptions, + CandleStyle, +} from './models.gen'; +import { defaultGraphConfig, getGraphFieldConfig } from '../timeseries/config'; +import { CandlestickData, candlestickFieldsInfo, FieldPickerInfo, prepareCandlestickFields } from './fields'; +import { config } from '@grafana/runtime'; +import { CandlestickSuggestionsSupplier } from './suggestions'; + +const modeOptions = [ + { label: 'Candles', value: VizDisplayMode.Candles }, + { label: 'Volume', value: VizDisplayMode.Volume }, + { label: 'Both', value: VizDisplayMode.CandlesVolume }, +] as Array>; + +const candleStyles = [ + { label: 'Candles', value: CandleStyle.Candles }, + { label: 'OHLC Bars', value: CandleStyle.OHLCBars }, +] as Array>; + +const colorStrategies = [ + { label: 'Since Open', value: ColorStrategy.OpenClose }, + { label: 'Since Prior Close', value: ColorStrategy.CloseClose }, +] as Array>; + +const numericFieldFilter = (f: Field) => f.type === FieldType.number; + +function addFieldPicker( + builder: PanelOptionsEditorBuilder, + info: FieldPickerInfo, + data: CandlestickData | null +) { + let placeholderText = 'Auto '; + + if (data) { + const current = data[info.key] as Field; + + if (current?.config) { + placeholderText += '= ' + getFieldDisplayName(current); + + if (current === data?.open && info.key !== 'open') { + placeholderText += ` (${info.defaults.join(',')})`; + } + } else { + placeholderText += `(${info.defaults.join(',')})`; + } + } + + builder.addFieldNamePicker({ + path: `fields.${info.key}`, + name: info.name, + description: info.description, + settings: { + filter: numericFieldFilter, + placeholderText, + }, + }); +} + +export const plugin = new PanelPlugin(CandlestickPanel) + .useFieldConfig(getGraphFieldConfig(defaultGraphConfig)) + .setPanelOptions((builder, context) => { + const opts = context.options ?? defaultPanelOptions; + const info = prepareCandlestickFields(context.data, opts, config.theme2); + + builder + .addRadio({ + path: 'mode', + name: 'Mode', + description: '', + defaultValue: defaultPanelOptions.mode, + settings: { + options: modeOptions, + }, + }) + .addRadio({ + path: 'candleStyle', + name: 'Candle style', + description: '', + defaultValue: defaultPanelOptions.candleStyle, + settings: { + options: candleStyles, + }, + showIf: (opts) => opts.mode !== VizDisplayMode.Volume, + }) + .addRadio({ + path: 'colorStrategy', + name: 'Color strategy', + description: '', + defaultValue: defaultPanelOptions.colorStrategy, + settings: { + options: colorStrategies, + }, + }) + .addColorPicker({ + path: 'colors.up', + name: 'Up color', + defaultValue: defaultColors.up, + }) + .addColorPicker({ + path: 'colors.down', + name: 'Down color', + defaultValue: defaultColors.down, + }); + + addFieldPicker(builder, candlestickFieldsInfo.open, info); + if (opts.mode !== VizDisplayMode.Volume) { + addFieldPicker(builder, candlestickFieldsInfo.high, info); + addFieldPicker(builder, candlestickFieldsInfo.low, info); + } + addFieldPicker(builder, candlestickFieldsInfo.close, info); + + if (opts.mode !== VizDisplayMode.Candles) { + addFieldPicker(builder, candlestickFieldsInfo.volume, info); + } + + builder.addRadio({ + path: 'includeAllFields', + name: 'Additional fields', + description: 'Use standard timeseries options to configure any fields not mapped above', + defaultValue: defaultPanelOptions.includeAllFields, + settings: { + options: [ + { label: 'Ignore', value: false }, + { label: 'Include', value: true }, + ], + }, + }); + + // commonOptionsBuilder.addTooltipOptions(builder); + commonOptionsBuilder.addLegendOptions(builder); + }) + .setDataSupport({ annotations: true, alertStates: true }) + .setSuggestionsSupplier(new CandlestickSuggestionsSupplier()); diff --git a/public/app/plugins/panel/candlestick/plugin.json b/public/app/plugins/panel/candlestick/plugin.json new file mode 100644 index 00000000000..02e96ad07bf --- /dev/null +++ b/public/app/plugins/panel/candlestick/plugin.json @@ -0,0 +1,17 @@ +{ + "type": "panel", + "name": "Candlestick", + "id": "candlestick", + "state": "beta", + + "info": { + "author": { + "name": "Grafana Labs", + "url": "https://grafana.com" + }, + "logos": { + "small": "img/candlestick.svg", + "large": "img/candlestick.svg" + } + } +} diff --git a/public/app/plugins/panel/candlestick/suggestions.ts b/public/app/plugins/panel/candlestick/suggestions.ts new file mode 100644 index 00000000000..19b304e6f3f --- /dev/null +++ b/public/app/plugins/panel/candlestick/suggestions.ts @@ -0,0 +1,53 @@ +import { VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data'; +import { config } from '@grafana/runtime'; +import { SuggestionName } from 'app/types/suggestions'; +import { prepareCandlestickFields } from './fields'; +import { CandlestickOptions, defaultPanelOptions } from './models.gen'; + +export class CandlestickSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary } = builder; + + if ( + !builder.data?.series || + !dataSummary.hasData || + dataSummary.timeFieldCount < 1 || + dataSummary.numberFieldCount < 2 || + dataSummary.numberFieldCount > 10 + ) { + return; + } + + const info = prepareCandlestickFields(builder.data.series, defaultPanelOptions, config.theme2); + if (!info) { + return; + } + + // Regular timeseries + if (info.open === info.high && info.open === info.low) { + return; + } + + const list = builder.getListAppender({ + name: '', + pluginId: 'candlestick', + options: {}, + fieldConfig: { + defaults: { + custom: {}, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.Candlestick, + options: defaultPanelOptions, + fieldConfig: { + defaults: {}, + overrides: [], + }, + score: info.autoOpenClose ? VisualizationSuggestionScore.Good : VisualizationSuggestionScore.Best, + }); + } +} diff --git a/public/app/plugins/panel/candlestick/utils.ts b/public/app/plugins/panel/candlestick/utils.ts new file mode 100644 index 00000000000..91317119e72 --- /dev/null +++ b/public/app/plugins/panel/candlestick/utils.ts @@ -0,0 +1,207 @@ +import { VizDisplayMode, ColorStrategy, CandleStyle } from './models.gen'; +import uPlot from 'uplot'; +import { colorManipulator } from '@grafana/data'; + +const { alpha } = colorManipulator; + +export type FieldIndices = Record; + +interface RendererOpts { + mode: VizDisplayMode; + candleStyle: CandleStyle; + fields: FieldIndices; + colorStrategy: ColorStrategy; + upColor: string; + downColor: string; + flatColor: string; + volumeAlpha: number; + flatAsUp: boolean; +} + +export function drawMarkers(opts: RendererOpts) { + let { mode, candleStyle, fields, colorStrategy, upColor, downColor, flatColor, volumeAlpha, flatAsUp = true } = opts; + + const drawPrice = mode !== VizDisplayMode.Volume && fields.high != null && fields.low != null; + const asCandles = drawPrice && candleStyle === CandleStyle.Candles; + const drawVolume = mode !== VizDisplayMode.Candles && fields.volume != null; + + function selectPath(priceDir: number, flatPath: Path2D, upPath: Path2D, downPath: Path2D, flatAsUp: boolean) { + return priceDir > 0 ? upPath : priceDir < 0 ? downPath : flatAsUp ? upPath : flatPath; + } + + let tIdx = 0, + oIdx = fields.open, + hIdx = fields.high, + lIdx = fields.low, + cIdx = fields.close, + vIdx = fields.volume; + + return (u: uPlot) => { + // split by discrete color to reduce draw calls + let downPath, upPath, flatPath; + // with adjusted reduced + let downPathVol, upPathVol, flatPathVol; + + if (drawPrice) { + flatPath = new Path2D(); + upPath = new Path2D(); + downPath = new Path2D(); + } + + if (drawVolume) { + downPathVol = new Path2D(); + upPathVol = new Path2D(); + flatPathVol = new Path2D(); + } + + let hollowPath = new Path2D(); + + let ctx = u.ctx; + + let tData = u.data[tIdx!]; + + let oData = u.data[oIdx!]; + let cData = u.data[cIdx!]; + + let hData = drawPrice ? u.data[hIdx!] : null; + let lData = drawPrice ? u.data[lIdx!] : null; + let vData = drawVolume ? u.data[vIdx!] : null; + + let zeroPx = vIdx != null ? Math.round(u.valToPos(0, u.series[vIdx!].scale!, true)) : null; + + let [idx0, idx1] = u.series[0].idxs!; + + let dataX = u.data[0]; + let dataY = oData; + + let colWidth = u.bbox.width; + + if (dataX.length > 1) { + // prior index with non-undefined y data + let prevIdx = null; + + // scan full dataset for smallest adjacent delta + // will not work properly for non-linear x scales, since does not do expensive valToPosX calcs till end + for (let i = 0, minDelta = Infinity; i < dataX.length; i++) { + if (dataY[i] !== undefined) { + if (prevIdx != null) { + let delta = Math.abs(dataX[i] - dataX[prevIdx]); + + if (delta < minDelta) { + minDelta = delta; + colWidth = Math.abs(u.valToPos(dataX[i], 'x') - u.valToPos(dataX[prevIdx], 'x')); + } + } + + prevIdx = i; + } + } + } + + let barWidth = Math.round(0.6 * colWidth); + + let stickWidth = 2; + let outlineWidth = 2; + + if (barWidth <= 12) { + stickWidth = outlineWidth = 1; + } + + let halfWidth = Math.floor(barWidth / 2); + + for (let i = idx0; i <= idx1; i++) { + let tPx = Math.round(u.valToPos(tData[i]!, 'x', true)); + + // current close vs prior close + let interDir = i === idx0 ? 0 : Math.sign(cData[i]! - cData[i - 1]!); + // current close vs current open + let intraDir = Math.sign(cData[i]! - oData[i]!); + + // volume + if (drawVolume) { + let outerPath = selectPath( + colorStrategy === ColorStrategy.CloseClose ? interDir : intraDir, + flatPathVol as Path2D, + upPathVol as Path2D, + downPathVol as Path2D, + i === idx0 && ColorStrategy.CloseClose ? false : flatAsUp + ); + + let vPx = Math.round(u.valToPos(vData![i]!, u.series[vIdx!].scale!, true)); + outerPath.rect(tPx - halfWidth, vPx, barWidth, zeroPx! - vPx); + } + + if (drawPrice) { + let outerPath = selectPath( + colorStrategy === ColorStrategy.CloseClose ? interDir : intraDir, + flatPath as Path2D, + upPath as Path2D, + downPath as Path2D, + i === idx0 && ColorStrategy.CloseClose ? false : flatAsUp + ); + + // stick + let hPx = Math.round(u.valToPos(hData![i]!, u.series[hIdx!].scale!, true)); + let lPx = Math.round(u.valToPos(lData![i]!, u.series[lIdx!].scale!, true)); + outerPath.rect(tPx - Math.floor(stickWidth / 2), hPx, stickWidth, lPx - hPx); + + let oPx = Math.round(u.valToPos(oData[i]!, u.series[oIdx!].scale!, true)); + let cPx = Math.round(u.valToPos(cData[i]!, u.series[cIdx!].scale!, true)); + + if (asCandles) { + // rect + let top = Math.min(oPx, cPx); + let btm = Math.max(oPx, cPx); + let hgt = Math.max(1, btm - top); + outerPath.rect(tPx - halfWidth, top, barWidth, hgt); + + if (colorStrategy === ColorStrategy.CloseClose) { + if (intraDir >= 0 && hgt > outlineWidth * 2) { + hollowPath.rect( + tPx - halfWidth + outlineWidth, + top + outlineWidth, + barWidth - outlineWidth * 2, + hgt - outlineWidth * 2 + ); + } + } + } else { + outerPath.rect(tPx - halfWidth, oPx, halfWidth, stickWidth); + outerPath.rect(tPx, cPx, halfWidth, stickWidth); + } + } + } + + ctx.save(); + + ctx.rect(u.bbox.left, u.bbox.top, u.bbox.width, u.bbox.height); + ctx.clip(); + + if (drawVolume) { + ctx.fillStyle = alpha(upColor, volumeAlpha); + ctx.fill(upPathVol as Path2D); + + ctx.fillStyle = alpha(downColor, volumeAlpha); + ctx.fill(downPathVol as Path2D); + + ctx.fillStyle = alpha(flatColor, volumeAlpha); + ctx.fill(flatPathVol as Path2D); + } + + if (drawPrice) { + ctx.fillStyle = upColor; + ctx.fill(upPath as Path2D); + + ctx.fillStyle = downColor; + ctx.fill(downPath as Path2D); + + ctx.fillStyle = flatColor; + ctx.fill(flatPath as Path2D); + + ctx.globalCompositeOperation = 'destination-out'; + ctx.fill(hollowPath); + } + + ctx.restore(); + }; +} diff --git a/public/app/plugins/panel/canvas/CanvasPanel.tsx b/public/app/plugins/panel/canvas/CanvasPanel.tsx index 330019f0d8f..31e5d4aeb02 100644 --- a/public/app/plugins/panel/canvas/CanvasPanel.tsx +++ b/public/app/plugins/panel/canvas/CanvasPanel.tsx @@ -7,7 +7,6 @@ import { CanvasGroupOptions } from 'app/features/canvas'; import { Scene } from 'app/features/canvas/runtime/scene'; import { PanelContext, PanelContextRoot } from '@grafana/ui'; import { ElementState } from 'app/features/canvas/runtime/element'; -import { GroupState } from 'app/features/canvas/runtime/group'; interface Props extends PanelProps {} @@ -18,7 +17,6 @@ interface State { export interface InstanceState { scene: Scene; selected: ElementState[]; - layer: GroupState; } export class CanvasPanel extends Component { @@ -44,8 +42,7 @@ export class CanvasPanel extends Component { this.subs.add( this.props.eventBus.subscribe(PanelEditEnteredEvent, (evt) => { // Remove current selection when entering edit mode for any panel in dashboard - let event: MouseEvent = new MouseEvent('click'); - this.scene?.selecto?.clickTarget(event, this.scene?.div); + this.scene.clearCurrentSelection(); }) ); @@ -96,7 +93,7 @@ export class CanvasPanel extends Component { // console.log('send changes', root); }; - shouldComponentUpdate(nextProps: Props) { + shouldComponentUpdate(nextProps: Props, nextState: State) { const { width, height, data } = this.props; let changed = false; @@ -109,6 +106,10 @@ export class CanvasPanel extends Component { changed = true; } + if (this.state.refresh !== nextState.refresh) { + changed = true; + } + // After editing, the options are valid, but the scene was in a different panel or inline editing mode has changed const shouldUpdateSceneAndPanel = (this.needsReload && this.props.options !== nextProps.options) || diff --git a/public/app/plugins/panel/canvas/editor/APIEditor.tsx b/public/app/plugins/panel/canvas/editor/APIEditor.tsx new file mode 100644 index 00000000000..85ddf302ee2 --- /dev/null +++ b/public/app/plugins/panel/canvas/editor/APIEditor.tsx @@ -0,0 +1,114 @@ +import React, { FC, useCallback } from 'react'; +import { Button, InlineField, InlineFieldRow, JSONFormatter, StringValueEditor } from '@grafana/ui'; +import { AppEvents, StandardEditorProps, StandardEditorsRegistryItem, StringFieldConfigSettings } from '@grafana/data'; +import { config, getBackendSrv } from '@grafana/runtime'; +import { appEvents } from 'app/core/core'; + +export interface APIEditorConfig { + endpoint: string; + data?: string; +} + +const dummyStringSettings: StandardEditorsRegistryItem = { + settings: {}, +} as any; + +export const callApi = (api: APIEditorConfig, isTest = false) => { + if (api) { + getBackendSrv() + .fetch({ + url: api.endpoint!, + method: 'POST', + data: api.data ?? {}, + }) + .subscribe({ + error: (error: any) => { + if (isTest) { + appEvents.emit(AppEvents.alertError, ['Error has occurred: ', JSON.stringify(error)]); + console.error(error); + } + }, + complete: () => { + if (isTest) { + appEvents.emit(AppEvents.alertSuccess, ['Test successful']); + } + }, + }); + } +}; + +export const APIEditor: FC> = (props) => { + const { value, context, onChange } = props; + const labelWidth = 9; + + const onEndpointChange = useCallback( + (endpoint) => { + onChange({ + ...value, + endpoint, + }); + }, + [onChange, value] + ); + + const onDataChange = useCallback( + (data) => { + onChange({ + ...value, + data, + }); + }, + [onChange, value] + ); + + const renderJSON = (data: string) => { + try { + const json = JSON.parse(data); + return ; + } catch (error) { + return `Invalid JSON provided: ${error.message}`; + } + }; + + const renderTestAPIButton = (api: APIEditorConfig) => { + if (api && api.endpoint) { + return ( + + ); + } + + return; + }; + + return config.disableSanitizeHtml ? ( + <> + + + + + + + + + + + {renderTestAPIButton(value)} +
    + {renderJSON(value?.data ?? '{}')} + + ) : ( + <>Must enable disableSanitizeHtml feature flag to access + ); +}; diff --git a/public/app/plugins/panel/canvas/editor/LayerElementListEditor.tsx b/public/app/plugins/panel/canvas/editor/LayerElementListEditor.tsx index a374bdbcf33..492504ddf17 100644 --- a/public/app/plugins/panel/canvas/editor/LayerElementListEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/LayerElementListEditor.tsx @@ -1,52 +1,87 @@ import React, { PureComponent } from 'react'; -import { css, cx } from '@emotion/css'; -import { Button, Container, Icon, IconButton, stylesFactory, ValuePicker } from '@grafana/ui'; -import { AppEvents, GrafanaTheme, SelectableValue, StandardEditorProps } from '@grafana/data'; -import { config } from '@grafana/runtime'; -import { DragDropContext, Droppable, Draggable, DropResult } from 'react-beautiful-dnd'; +import { Button, HorizontalGroup } from '@grafana/ui'; +import { AppEvents, SelectableValue, StandardEditorProps } from '@grafana/data'; +import { DropResult } from 'react-beautiful-dnd'; import { PanelOptions } from '../models.gen'; -import { InstanceState } from '../CanvasPanel'; import { LayerActionID } from '../types'; -import { canvasElementRegistry } from 'app/features/canvas'; +import { CanvasElementOptions, canvasElementRegistry } from 'app/features/canvas'; import appEvents from 'app/core/app_events'; +import { ElementState } from 'app/features/canvas/runtime/element'; +import { notFoundItem } from 'app/features/canvas/elements/notFound'; +import { GroupState } from 'app/features/canvas/runtime/group'; +import { LayerEditorProps } from './layerEditor'; +import { SelectionParams } from 'app/features/canvas/runtime/scene'; +import { ShowConfirmModalEvent } from 'app/types/events'; +import { LayerDragDropList } from 'app/core/components/Layers/LayerDragDropList'; +import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; -type Props = StandardEditorProps; +type Props = StandardEditorProps; export class LayerElementListEditor extends PureComponent { - style = getStyles(config.theme); + getScene = () => { + const { settings } = this.props.item; + if (!settings?.layer) { + return; + } + return settings.layer.scene; + }; onAddItem = (sel: SelectableValue) => { - // const reg = drawItemsRegistry.getIfExists(sel.value); - // if (!reg) { - // console.error('NOT FOUND', sel); - // return; - // } - // const layer = this.props.value; - // const item = newItem(reg, layer.items.length); - // const isList = this.props.context.options?.mode === LayoutMode.List; - // const items = isList ? [item, ...layer.items] : [...layer.items, item]; - // this.props.onChange({ - // ...layer, - // items, - // }); - // this.onSelect(item); + const { settings } = this.props.item; + if (!settings?.layer) { + return; + } + const { layer } = settings; + + const item = canvasElementRegistry.getIfExists(sel.value) ?? notFoundItem; + const newElementOptions = item.getNewOptions() as CanvasElementOptions; + newElementOptions.type = item.id; + const newElement = new ElementState(item, newElementOptions, layer); + newElement.updateSize(newElement.width, newElement.height); + newElement.updateData(layer.scene.context); + layer.elements.push(newElement); + layer.scene.save(); + + layer.reinitializeMoveable(); }; onSelect = (item: any) => { const { settings } = this.props.item; - if (settings?.scene && settings?.scene?.selecto) { + if (settings?.scene) { try { - settings.scene.selecto.clickTarget(item, item?.div); + let selection: SelectionParams = { targets: [] }; + if (item instanceof GroupState) { + const targetElements: HTMLDivElement[] = []; + item.elements.forEach((element: ElementState) => { + targetElements.push(element.div!); + }); + + selection.targets = targetElements; + selection.group = item; + settings.scene.select(selection); + } else if (item instanceof ElementState) { + const targetElement = [item?.div!]; + selection.targets = targetElement; + settings.scene.select(selection); + } } catch (error) { - appEvents.emit(AppEvents.alertError, ['Unable to select element with inline editing disabled']); + appEvents.emit(AppEvents.alertError, ['Unable to select element, try selecting element in panel instead']); } } }; - getRowStyle = (sel: boolean) => { - return sel ? `${this.style.row} ${this.style.sel}` : this.style.row; + onClearSelection = () => { + const { settings } = this.props.item; + + if (!settings?.layer) { + return; + } + + const { layer } = settings; + + layer.scene.clearCurrentSelection(); }; onDragEnd = (result: DropResult) => { @@ -68,6 +103,92 @@ export class LayerElementListEditor extends PureComponent { layer.reorder(src, dst); }; + goUpLayer = () => { + const settings = this.props.item.settings; + + if (!settings?.layer || !settings?.scene) { + return; + } + + const { scene, layer } = settings; + + if (layer.parent) { + scene.updateCurrentLayer(layer.parent); + } + }; + + private decoupleGroup = () => { + const settings = this.props.item.settings; + + if (!settings?.layer) { + return; + } + + const { layer } = settings; + + this.deleteGroup(); + layer.elements.forEach((element: ElementState) => { + layer.parent?.doAction(LayerActionID.Duplicate, element, false); + }); + }; + + private onDecoupleGroup = () => { + appEvents.publish( + new ShowConfirmModalEvent({ + title: 'Decouple group', + text: `Are you sure you want to decouple this group?`, + text2: 'This will remove the group and push nested elements in the next level up.', + confirmText: 'Yes', + yesText: 'Decouple', + onConfirm: async () => { + this.decoupleGroup(); + }, + }) + ); + }; + + private deleteGroup = () => { + const settings = this.props.item.settings; + + if (!settings?.layer) { + return; + } + + const { layer } = settings; + + const scene = this.getScene(); + scene?.byName.delete(layer.getName()); + layer.elements.forEach((element) => scene?.byName.delete(element.getName())); + layer.parent?.doAction(LayerActionID.Delete, layer); + + this.goUpLayer(); + }; + + private onGroupSelection = () => { + const scene = this.getScene(); + if (scene) { + scene.groupSelection(); + } else { + console.warn('no scene!'); + } + }; + + private onDeleteGroup = () => { + appEvents.publish( + new ShowConfirmModalEvent({ + title: 'Delete group', + text: `Are you sure you want to delete this group?`, + text2: 'This will delete the group and all nested elements.', + icon: 'trash-alt', + confirmText: 'Delete', + yesText: 'Delete', + onConfirm: async () => { + this.deleteGroup(); + }, + }) + ); + }; + render() { const settings = this.props.item.settings; if (!settings) { @@ -78,134 +199,83 @@ export class LayerElementListEditor extends PureComponent { return
    Missing layer?
    ; } - const styles = this.style; - const selection: number[] = settings.selected ? settings.selected.map((v) => v.UID) : []; + const onDelete = (element: ElementState) => { + layer.doAction(LayerActionID.Delete, element); + }; + + const onDuplicate = (element: ElementState) => { + layer.doAction(LayerActionID.Duplicate, element); + }; + + const getLayerInfo = (element: ElementState) => { + return element.options.type; + }; + + const onNameChange = (element: ElementState, name: string) => { + element.onChange({ ...element.options, name }); + }; + + const isGroup = (element: ElementState) => { + return element instanceof GroupState; + }; + + const verifyLayerNameUniqueness = (nameToVerify: string) => { + const scene = this.getScene(); + + return Boolean(scene?.canRename(nameToVerify)); + }; + + const selection: string[] = settings.selected ? settings.selected.map((v) => v.getName()) : []; return ( <> - - - {(provided, snapshot) => ( -
    - {(() => { - // reverse order - const rows: any = []; - for (let i = layer.elements.length - 1; i >= 0; i--) { - const element = layer.elements[i]; - rows.push( - - {(provided, snapshot) => ( -
    this.onSelect(element)} - > - {element.item.name} -
    -   {element.UID} ({i}) -
    - - layer.doAction(LayerActionID.Duplicate, element)} - surface="header" - /> - - layer.doAction(LayerActionID.Delete, element)} - surface="header" - /> - -
    - )} -
    - ); - } - return rows; - })()} - - {provided.placeholder} -
    - )} -
    -
    + {!layer.isRoot() && ( + <> + + + + + + )} +
    - - + {selection.length > 0 && ( - )} - + {selection.length > 1 && ( + + )} + ); } } - -const getStyles = stylesFactory((theme: GrafanaTheme) => ({ - wrapper: css` - margin-bottom: ${theme.spacing.md}; - `, - row: css` - padding: ${theme.spacing.xs} ${theme.spacing.sm}; - border-radius: ${theme.border.radius.sm}; - background: ${theme.colors.bg2}; - min-height: ${theme.spacing.formInputHeight}px; - display: flex; - align-items: center; - justify-content: space-between; - margin-bottom: 3px; - cursor: pointer; - - border: 1px solid ${theme.colors.formInputBorder}; - &:hover { - border: 1px solid ${theme.colors.formInputBorderHover}; - } - `, - sel: css` - border: 1px solid ${theme.colors.formInputBorderActive}; - &:hover { - border: 1px solid ${theme.colors.formInputBorderActive}; - } - `, - dragIcon: css` - cursor: drag; - `, - actionIcon: css` - color: ${theme.colors.textWeak}; - &:hover { - color: ${theme.colors.text}; - } - `, - typeWrapper: css` - color: ${theme.colors.textBlue}; - margin-right: 5px; - `, - textWrapper: css` - display: flex; - align-items: center; - flex-grow: 1; - overflow: hidden; - margin-right: ${theme.spacing.sm}; - `, -})); diff --git a/public/app/plugins/panel/canvas/editor/elementEditor.tsx b/public/app/plugins/panel/canvas/editor/elementEditor.tsx index 9ba38ec3167..6a5ce60757a 100644 --- a/public/app/plugins/panel/canvas/editor/elementEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/elementEditor.tsx @@ -1,4 +1,4 @@ -import { cloneDeep, get as lodashGet } from 'lodash'; +import { get as lodashGet } from 'lodash'; import { optionBuilder } from './options'; import { CanvasElementOptions, canvasElementRegistry, DEFAULT_CANVAS_ELEMENT_CONFIG } from 'app/features/canvas'; import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/OptionsUIBuilders'; @@ -32,21 +32,20 @@ export function getElementEditor(opts: CanvasEditorOptions): NestedPanelOptions< return; } options = { - ...options, // keep current options + ...options, + ...layer.getNewOptions(options), type: layer.id, - config: cloneDeep(layer.defaultConfig ?? {}), }; } else { options = setOptionImmutably(options, path, value); } - opts.scene.onChange(opts.element.UID, options); + opts.element.onChange(options); + opts.element.updateData(opts.scene.context); }, }), // Dynamically fill the selected element build: (builder, context) => { - console.log('MAKE element editor', opts.element.UID); - const { options } = opts.element; const layerTypes = canvasElementRegistry.selectOptions( options?.type // the selected value @@ -64,10 +63,17 @@ export function getElementEditor(opts: CanvasEditorOptions): NestedPanelOptions< // force clean layer configuration const layer = canvasElementRegistry.getIfExists(options?.type ?? DEFAULT_CANVAS_ELEMENT_CONFIG.type)!; - const currentOptions = { ...options, type: layer.id, config: { ...layer.defaultConfig, ...options?.config } }; + let currentOptions = options; + if (!currentOptions) { + currentOptions = { + ...layer.getNewOptions(options), + type: layer.id, + name: `Element ${Date.now()}.${Math.floor(Math.random() * 100)}`, + }; + } const ctx = { ...context, options: currentOptions }; - if (layer.registerOptionsUI) { + if (layer?.registerOptionsUI) { layer.registerOptionsUI(builder, ctx); } diff --git a/public/app/plugins/panel/canvas/editor/layerEditor.tsx b/public/app/plugins/panel/canvas/editor/layerEditor.tsx index 0b311369288..ded0763413d 100644 --- a/public/app/plugins/panel/canvas/editor/layerEditor.tsx +++ b/public/app/plugins/panel/canvas/editor/layerEditor.tsx @@ -4,10 +4,39 @@ import { NestedPanelOptions, NestedValueAccess } from '@grafana/data/src/utils/O import { setOptionImmutably } from 'app/features/dashboard/components/PanelEditor/utils'; import { InstanceState } from '../CanvasPanel'; import { LayerElementListEditor } from './LayerElementListEditor'; +import { GroupState } from 'app/features/canvas/runtime/group'; +import { Scene } from 'app/features/canvas/runtime/scene'; +import { ElementState } from 'app/features/canvas/runtime/element'; +import { PlacementEditor } from './PlacementEditor'; -export function getLayerEditor(opts: InstanceState): NestedPanelOptions { - const { layer, scene } = opts; - const options = layer.options || { elements: [] }; +export interface LayerEditorProps { + scene: Scene; + layer: GroupState; + selected: ElementState[]; +} + +export function getLayerEditor(opts: InstanceState): NestedPanelOptions { + const { selected, scene } = opts; + + if (!scene.currentLayer) { + scene.currentLayer = scene.root as GroupState; + } + + if (selected) { + for (const element of selected) { + if (element instanceof GroupState) { + scene.currentLayer = element; + break; + } + + if (element.parent) { + scene.currentLayer = element.parent; + break; + } + } + } + + const options = scene.currentLayer.options || { elements: [] }; return { category: ['Layer'], @@ -24,33 +53,42 @@ export function getLayerEditor(opts: InstanceState): NestedPanelOptions { - console.log('MAKE layer editor', layer.UID); + const currentLayer = scene.currentLayer; + if (currentLayer && !currentLayer.isRoot()) { + // TODO: the non-root nav option + } builder.addCustomEditor({ id: 'content', path: 'root', name: 'Elements', editor: LayerElementListEditor, - settings: opts, + settings: { scene, layer: scene.currentLayer, selected }, }); - // // force clean layer configuration - // const layer = canvasElementRegistry.getIfExists(options?.type ?? DEFAULT_CANVAS_ELEMENT_CONFIG.type)!; - //const currentOptions = { ...options, type: layer.id, config: { ...layer.defaultConfig, ...options?.config } }; const ctx = { ...context, options }; - - // if (layer.registerOptionsUI) { - // layer.registerOptionsUI(builder, ctx); - // } - optionBuilder.addBackground(builder as any, ctx); optionBuilder.addBorder(builder as any, ctx); + + if (currentLayer && !currentLayer.isRoot()) { + builder.addCustomEditor({ + category: ['Layout'], + id: 'content', + path: '__', // not used + name: 'Anchor', + editor: PlacementEditor, + settings: { + scene: opts.scene, + element: currentLayer, + }, + }); + } }, }; } diff --git a/public/app/plugins/panel/canvas/module.tsx b/public/app/plugins/panel/canvas/module.tsx index 0525400ee02..9b00e40f7a0 100644 --- a/public/app/plugins/panel/canvas/module.tsx +++ b/public/app/plugins/panel/canvas/module.tsx @@ -4,6 +4,7 @@ import { CanvasPanel, InstanceState } from './CanvasPanel'; import { PanelOptions } from './models.gen'; import { getElementEditor } from './editor/elementEditor'; import { getLayerEditor } from './editor/layerEditor'; +import { GroupState } from 'app/features/canvas/runtime/group'; export const plugin = new PanelPlugin(CanvasPanel) .setNoPadding() // extend to panel edges @@ -19,19 +20,20 @@ export const plugin = new PanelPlugin(CanvasPanel) }); if (state) { + builder.addNestedOptions(getLayerEditor(state)); + const selection = state.selected; if (selection?.length === 1) { - builder.addNestedOptions( - getElementEditor({ - category: [`Selected element (id: ${selection[0].UID})`], // changing the ID forces are reload - element: selection[0], - scene: state.scene, - }) - ); - } else { - console.log('NO Single seleciton', selection?.length); + const element = selection[0]; + if (!(element instanceof GroupState)) { + builder.addNestedOptions( + getElementEditor({ + category: [`Selected element (${element.options.name})`], + element, + scene: state.scene, + }) + ); + } } - - builder.addNestedOptions(getLayerEditor(state)); } }); diff --git a/public/app/plugins/panel/dashlist/DashList.tsx b/public/app/plugins/panel/dashlist/DashList.tsx index 098df52154b..b31f6eaa1c1 100644 --- a/public/app/plugins/panel/dashlist/DashList.tsx +++ b/public/app/plugins/panel/dashlist/DashList.tsx @@ -1,15 +1,18 @@ -import React, { useEffect, useMemo, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { take } from 'lodash'; +import { css, cx } from '@emotion/css'; -import { InterpolateFunction, PanelProps } from '@grafana/data'; -import { CustomScrollbar, Icon, useStyles2 } from '@grafana/ui'; - +import { GrafanaTheme2, InterpolateFunction, PanelProps } from '@grafana/data'; +import { CustomScrollbar, stylesFactory, useStyles2 } from '@grafana/ui'; +import { Icon, IconProps } from '@grafana/ui/src/components/Icon/Icon'; +import { getFocusStyles } from '@grafana/ui/src/themes/mixins'; import { getBackendSrv } from 'app/core/services/backend_srv'; import { getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv'; import impressionSrv from 'app/core/services/impression_srv'; import { DashboardSearchHit } from 'app/features/search/types'; -import { DashListOptions } from './types'; import { getStyles } from './styles'; +import { PanelLayout, PanelOptions } from './models.gen'; +import { SearchCard } from 'app/features/search/components/SearchCard'; type Dashboard = DashboardSearchHit & { isSearchResult?: boolean; isRecent?: boolean }; @@ -19,7 +22,7 @@ interface DashboardGroup { dashboards: Dashboard[]; } -async function fetchDashboards(options: DashListOptions, replaceVars: InterpolateFunction) { +async function fetchDashboards(options: PanelOptions, replaceVars: InterpolateFunction) { let starredDashboards: Promise = Promise.resolve([]); if (options.showStarred) { const params = { limit: options.maxItems, starred: 'true' }; @@ -76,7 +79,7 @@ async function fetchDashboards(options: DashListOptions, replaceVars: Interpolat return dashMap; } -export function DashList(props: PanelProps) { +export function DashList(props: PanelProps) { const [dashboards, setDashboards] = useState(new Map()); useEffect(() => { fetchDashboards(props.options, props.replaceVariables).then((dashes) => { @@ -103,7 +106,7 @@ export function DashList(props: PanelProps) { ]; }, [dashboards]); - const { showStarred, showRecentlyViewed, showHeadings, showSearch } = props.options; + const { showStarred, showRecentlyViewed, showHeadings, showSearch, layout } = props.options; const dashboardGroups: DashboardGroup[] = [ { @@ -124,6 +127,42 @@ export function DashList(props: PanelProps) { ]; const css = useStyles2(getStyles); + + const renderList = (dashboards: Dashboard[]) => ( +
    + ); + + const renderPreviews = (dashboards: Dashboard[]) => ( +
      + {dashboards.map((dash) => ( +
    • + +
    • + ))} +
    + ); + return ( {dashboardGroups.map( @@ -131,26 +170,75 @@ export function DashList(props: PanelProps) { show && (
    {showHeadings &&
    {header}
    } -
      - {dashboards.map((dash) => ( -
    • -
      -
      - - {dash.title} - - {dash.folderTitle &&
      {dash.folderTitle}
      } -
      - toggleDashboardStar(e, dash)}> - - -
      -
    • - ))} -
    + {layout === PanelLayout.Previews ? renderPreviews(dashboards) : renderList(dashboards)}
    ) )}
    ); } + +interface IconToggleProps extends Partial { + enabled: IconProps; + disabled: IconProps; + checked: boolean; +} + +function IconToggle({ + enabled, + disabled, + checked, + onClick, + className, + 'aria-label': ariaLabel, + ...otherProps +}: IconToggleProps) { + const toggleCheckbox = useCallback( + (e: React.MouseEvent) => { + e.preventDefault(); + e.stopPropagation(); + + onClick?.(e); + }, + [onClick] + ); + + const iconPropsOverride = checked ? enabled : disabled; + const iconProps = { ...otherProps, ...iconPropsOverride }; + const styles = useStyles2(getCheckboxStyles); + return ( + + ); +} + +export const getCheckboxStyles = stylesFactory((theme: GrafanaTheme2) => { + return { + wrapper: css({ + display: 'flex', + alignSelf: 'center', + cursor: 'pointer', + zIndex: 100, + }), + checkBox: css({ + appearance: 'none', + '&:focus-visible + *': { + ...getFocusStyles(theme), + borderRadius: theme.shape.borderRadius(1), + }, + }), + icon: css({ + marginBottom: 0, + verticalAlign: 'baseline', + display: 'flex', + }), + }; +}); diff --git a/public/app/plugins/panel/dashlist/models.cue b/public/app/plugins/panel/dashlist/models.cue index 731e1d07dc3..153f609e9c9 100644 --- a/public/app/plugins/panel/dashlist/models.cue +++ b/public/app/plugins/panel/dashlist/models.cue @@ -19,6 +19,7 @@ Panel: { [ { PanelOptions: { + layout?: *"list" | "previews" showStarred: bool | *true showRecentlyViewed: bool | *false showSearch: bool | *false diff --git a/public/app/plugins/panel/dashlist/models.gen.ts b/public/app/plugins/panel/dashlist/models.gen.ts index c42634e997b..013e89cdd44 100644 --- a/public/app/plugins/panel/dashlist/models.gen.ts +++ b/public/app/plugins/panel/dashlist/models.gen.ts @@ -1,27 +1,33 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// NOTE: This file will be auto generated from models.cue -// It is currenty hand written but will serve as the target for cuetsy +// This file was almost autogenerated by cuetsy. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -export const modelVersion = Object.freeze([1, 0]); +export const modelVersion = Object.freeze([0, 0]); + +export enum PanelLayout { + List = 'list', + Previews = 'previews', +} export interface PanelOptions { - showStarred: boolean; + layout?: PanelLayout; + folderId?: number; + maxItems: number; + query: string; + showHeadings: boolean; showRecentlyViewed: boolean; showSearch: boolean; - showHeadings: boolean; - maxItems: number; - query?: string; - folderId?: number; + showStarred: boolean; tags: string[]; } export const defaultPanelOptions: PanelOptions = { - showStarred: true, - showRecentlyViewed: false, - showSearch: false, - showHeadings: true, + layout: PanelLayout.List, maxItems: 10, query: '', + showHeadings: true, + showRecentlyViewed: false, + showSearch: false, + showStarred: true, tags: [], }; diff --git a/public/app/plugins/panel/dashlist/module.tsx b/public/app/plugins/panel/dashlist/module.tsx index f57f224f948..742e48d2eb0 100644 --- a/public/app/plugins/panel/dashlist/module.tsx +++ b/public/app/plugins/panel/dashlist/module.tsx @@ -1,6 +1,5 @@ import { PanelModel, PanelPlugin } from '@grafana/data'; import { DashList } from './DashList'; -import { DashListOptions } from './types'; import React from 'react'; import { TagsInput } from '@grafana/ui'; import { @@ -8,39 +7,55 @@ import { GENERAL_FOLDER, ReadonlyFolderPicker, } from '../../../core/components/Select/ReadonlyFolderPicker/ReadonlyFolderPicker'; +import { config } from '@grafana/runtime'; +import { defaultPanelOptions, PanelLayout, PanelOptions } from './models.gen'; -export const plugin = new PanelPlugin(DashList) +export const plugin = new PanelPlugin(DashList) .setPanelOptions((builder) => { + if (config.featureToggles.dashboardPreviews) { + builder.addRadio({ + path: 'layout', + name: 'Layout', + defaultValue: PanelLayout.List, + settings: { + options: [ + { value: PanelLayout.List, label: 'List' }, + { value: PanelLayout.Previews, label: 'Preview' }, + ], + }, + }); + } + builder .addBooleanSwitch({ path: 'showStarred', name: 'Starred', - defaultValue: true, + defaultValue: defaultPanelOptions.showStarred, }) .addBooleanSwitch({ path: 'showRecentlyViewed', name: 'Recently viewed', - defaultValue: false, + defaultValue: defaultPanelOptions.showRecentlyViewed, }) .addBooleanSwitch({ path: 'showSearch', name: 'Search', - defaultValue: false, + defaultValue: defaultPanelOptions.showSearch, }) .addBooleanSwitch({ path: 'showHeadings', name: 'Show headings', - defaultValue: true, + defaultValue: defaultPanelOptions.showHeadings, }) .addNumberInput({ path: 'maxItems', name: 'Max items', - defaultValue: 10, + defaultValue: defaultPanelOptions.maxItems, }) .addTextInput({ path: 'query', name: 'Query', - defaultValue: '', + defaultValue: defaultPanelOptions.query, }) .addCustomEditor({ path: 'folderId', @@ -62,13 +77,13 @@ export const plugin = new PanelPlugin(DashList) path: 'tags', name: 'Tags', description: '', - defaultValue: [], + defaultValue: defaultPanelOptions.tags, editor(props) { return ; }, }); }) - .setMigrationHandler((panel: PanelModel & Record) => { + .setMigrationHandler((panel: PanelModel & Record) => { const newOptions = { showStarred: panel.options.showStarred ?? panel.starred, showRecentlyViewed: panel.options.showRecentlyViewed ?? panel.recent, diff --git a/public/app/plugins/panel/dashlist/styles.ts b/public/app/plugins/panel/dashlist/styles.ts index 8e4af44e766..c97c5fb410d 100644 --- a/public/app/plugins/panel/dashlist/styles.ts +++ b/public/app/plugins/panel/dashlist/styles.ts @@ -23,10 +23,9 @@ export const getStyles = (theme: GrafanaTheme2) => ({ `, dashlistStar: css` - display: flex; - align-items: center; + align-self: center; + margin-right: 0px; color: ${theme.colors.secondary.text}; - cursor: pointer; z-index: 1; `, @@ -55,4 +54,12 @@ export const getStyles = (theme: GrafanaTheme2) => ({ position: relative; list-style: none; `, + + gridContainer: css` + display: grid; + gap: ${theme.spacing(1)}; + grid-template-columns: repeat(auto-fill, minmax(240px, 1fr)); + list-style: none; + margin-bottom: ${theme.spacing(1)}; + `, }); diff --git a/public/app/plugins/panel/dashlist/types.ts b/public/app/plugins/panel/dashlist/types.ts deleted file mode 100644 index 7456b335869..00000000000 --- a/public/app/plugins/panel/dashlist/types.ts +++ /dev/null @@ -1,10 +0,0 @@ -export interface DashListOptions { - showStarred: boolean; - showRecentlyViewed: boolean; - showSearch: boolean; - showHeadings: boolean; - maxItems: number; - query: string; - folderId: number; - tags: string[]; -} diff --git a/public/app/plugins/panel/debug/DebugPanel.tsx b/public/app/plugins/panel/debug/DebugPanel.tsx index aabd71c4f00..dc964027353 100644 --- a/public/app/plugins/panel/debug/DebugPanel.tsx +++ b/public/app/plugins/panel/debug/DebugPanel.tsx @@ -13,18 +13,17 @@ export class DebugPanel extends Component { render() { const { options } = this.props; - if (options.mode === DebugMode.Events) { - return ; + switch (options.mode) { + case DebugMode.Events: + return ; + case DebugMode.Cursor: + return ; + case DebugMode.State: + return ; + case DebugMode.ThrowError: + throw new Error('I failed you and for that i am deeply sorry'); + default: + return ; } - - if (options.mode === DebugMode.Cursor) { - return ; - } - - if (options.mode === DebugMode.State) { - return ; - } - - return ; } } diff --git a/public/app/plugins/panel/debug/module.tsx b/public/app/plugins/panel/debug/module.tsx index a5169af95fe..a2bfecebece 100644 --- a/public/app/plugins/panel/debug/module.tsx +++ b/public/app/plugins/panel/debug/module.tsx @@ -5,7 +5,7 @@ import { DebugMode, DebugPanelOptions } from './types'; export const plugin = new PanelPlugin(DebugPanel).useFieldConfig().setPanelOptions((builder) => { builder - .addRadio({ + .addSelect({ path: 'mode', name: 'Mode', defaultValue: DebugMode.Render, @@ -14,7 +14,9 @@ export const plugin = new PanelPlugin(DebugPanel).useFieldCon { label: 'Render', value: DebugMode.Render }, { label: 'Events', value: DebugMode.Events }, { label: 'Cursor', value: DebugMode.Cursor }, + { label: 'Cursor', value: DebugMode.Cursor }, { label: 'Share state', value: DebugMode.State }, + { label: 'Throw error', value: DebugMode.ThrowError }, ], }, }) diff --git a/public/app/plugins/panel/debug/types.ts b/public/app/plugins/panel/debug/types.ts index 0db4d56f237..d4563b13826 100644 --- a/public/app/plugins/panel/debug/types.ts +++ b/public/app/plugins/panel/debug/types.ts @@ -13,6 +13,7 @@ export enum DebugMode { Events = 'events', Cursor = 'cursor', State = 'State', + ThrowError = 'ThrowError', } export interface DebugPanelOptions { diff --git a/public/app/plugins/panel/gauge/module.tsx b/public/app/plugins/panel/gauge/module.tsx index 5658c9d4569..4b1cd0d52fa 100644 --- a/public/app/plugins/panel/gauge/module.tsx +++ b/public/app/plugins/panel/gauge/module.tsx @@ -4,6 +4,7 @@ import { GaugeOptions } from './types'; import { addOrientationOption, addStandardDataReduceOptions } from '../stat/types'; import { gaugePanelMigrationHandler, gaugePanelChangedHandler } from './GaugeMigrations'; import { commonOptionsBuilder } from '@grafana/ui'; +import { GaugeSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(GaugePanel) .useFieldConfig() @@ -28,4 +29,5 @@ export const plugin = new PanelPlugin(GaugePanel) commonOptionsBuilder.addTextSizeOptions(builder); }) .setPanelChangeHandler(gaugePanelChangedHandler) + .setSuggestionsSupplier(new GaugeSuggestionsSupplier()) .setMigrationHandler(gaugePanelMigrationHandler); diff --git a/public/app/plugins/panel/gauge/suggestions.ts b/public/app/plugins/panel/gauge/suggestions.ts new file mode 100644 index 00000000000..5863509b416 --- /dev/null +++ b/public/app/plugins/panel/gauge/suggestions.ts @@ -0,0 +1,87 @@ +import { ThresholdsMode, VisualizationSuggestionsBuilder } from '@grafana/data'; +import { SuggestionName } from 'app/types/suggestions'; +import { GaugeOptions } from './types'; + +export class GaugeSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary } = builder; + + if (!dataSummary.hasData || !dataSummary.hasNumberField) { + return; + } + + // for many fields / series this is probably not a good fit + if (dataSummary.numberFieldCount >= 50) { + return; + } + + const list = builder.getListAppender({ + name: SuggestionName.Gauge, + pluginId: 'gauge', + options: {}, + fieldConfig: { + defaults: { + thresholds: { + steps: [ + { value: -Infinity, color: 'green' }, + { value: 70, color: 'orange' }, + { value: 85, color: 'red' }, + ], + mode: ThresholdsMode.Percentage, + }, + custom: {}, + }, + overrides: [], + }, + cardOptions: { + previewModifier: (s) => { + if (s.options!.reduceOptions.values) { + s.options!.reduceOptions.limit = 2; + } + }, + }, + }); + + if (dataSummary.hasStringField && dataSummary.frameCount === 1 && dataSummary.rowCountTotal < 10) { + list.append({ + name: SuggestionName.Gauge, + options: { + reduceOptions: { + values: true, + calcs: [], + }, + }, + }); + list.append({ + name: SuggestionName.GaugeNoThresholds, + options: { + reduceOptions: { + values: true, + calcs: [], + }, + showThresholdMarkers: false, + }, + }); + } else { + list.append({ + name: SuggestionName.Gauge, + options: { + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + }, + }); + list.append({ + name: SuggestionName.GaugeNoThresholds, + options: { + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + showThresholdMarkers: false, + }, + }); + } + } +} diff --git a/public/app/plugins/panel/geomap/GeomapPanel.tsx b/public/app/plugins/panel/geomap/GeomapPanel.tsx index 1522919d4ce..77f7042f033 100644 --- a/public/app/plugins/panel/geomap/GeomapPanel.tsx +++ b/public/app/plugins/panel/geomap/GeomapPanel.tsx @@ -1,16 +1,14 @@ import React, { Component, ReactNode } from 'react'; -import { DEFAULT_BASEMAP_CONFIG, geomapLayerRegistry, defaultBaseLayer } from './layers/registry'; -import { Map, MapBrowserEvent, View } from 'ol'; +import { DEFAULT_BASEMAP_CONFIG, geomapLayerRegistry } from './layers/registry'; +import { Map as OpenLayersMap, MapBrowserEvent, View } from 'ol'; import Attribution from 'ol/control/Attribution'; import Zoom from 'ol/control/Zoom'; import ScaleLine from 'ol/control/ScaleLine'; -import BaseLayer from 'ol/layer/Base'; import { defaults as interactionDefaults } from 'ol/interaction'; import MouseWheelZoom from 'ol/interaction/MouseWheelZoom'; import { PanelData, - MapLayerHandler, MapLayerOptions, PanelProps, GrafanaTheme, @@ -20,7 +18,7 @@ import { } from '@grafana/data'; import { config } from '@grafana/runtime'; -import { ControlsOptions, GeomapPanelOptions, MapViewConfig } from './types'; +import { ControlsOptions, GeomapPanelOptions, MapLayerState, MapViewConfig } from './types'; import { centerPointRegistry, MapCenterID } from './view'; import { fromLonLat, toLonLat } from 'ol/proj'; import { Coordinate } from 'ol/coordinate'; @@ -32,12 +30,10 @@ import { getGlobalStyles } from './globalStyles'; import { Global } from '@emotion/react'; import { GeomapHoverFeature, GeomapHoverPayload } from './event'; import { DataHoverView } from './components/DataHoverView'; - -interface MapLayerState { - config: MapLayerOptions; - handler: MapLayerHandler; - layer: BaseLayer; // used to add|remove -} +import { Subscription } from 'rxjs'; +import { PanelEditExitedEvent } from 'app/types/events'; +import { defaultMarkersConfig, MARKERS_LAYER_ID } from './layers/data/markersLayer'; +import { cloneDeep } from 'lodash'; // Allows multiple panels to share the same view instance let sharedView: View | undefined = undefined; @@ -47,36 +43,57 @@ interface State extends OverlayProps { ttip?: GeomapHoverPayload; } +export interface GeomapLayerActions { + selectLayer: (uid: string) => void; + deleteLayer: (uid: string) => void; + addlayer: (type: string) => void; + reorder: (src: number, dst: number) => void; + canRename: (v: string) => boolean; +} + +export interface GeomapInstanceState { + map?: OpenLayersMap; + layers: MapLayerState[]; + selected: number; + actions: GeomapLayerActions; +} + export class GeomapPanel extends Component { static contextType = PanelContextRoot; panelContext: PanelContext = {} as PanelContext; + private subs = new Subscription(); globalCSS = getGlobalStyles(config.theme2); - counter = 0; - map?: Map; - basemap?: BaseLayer; - layers: MapLayerState[] = []; mouseWheelZoom?: MouseWheelZoom; style = getStyles(config.theme); hoverPayload: GeomapHoverPayload = { point: {}, pageX: -1, pageY: -1 }; readonly hoverEvent = new DataHoverEvent(this.hoverPayload); + map?: OpenLayersMap; + mapDiv?: HTMLDivElement; + layers: MapLayerState[] = []; + readonly byName = new Map(); + constructor(props: Props) { super(props); this.state = {}; + this.subs.add( + this.props.eventBus.subscribe(PanelEditExitedEvent, (evt) => { + if (this.mapDiv && this.props.id === evt.payload) { + this.initMapRef(this.mapDiv); + } + }) + ); } componentDidMount() { this.panelContext = this.context as PanelContext; - if (this.panelContext.onInstanceStateChange) { - this.panelContext.onInstanceStateChange(this); - } } shouldComponentUpdate(nextProps: Props) { if (!this.map) { - return true; // not yet initalized + return true; // not yet initialized } // Check for resize @@ -84,25 +101,116 @@ export class GeomapPanel extends Component { this.map.updateSize(); } - // External configuration changed - let layersChanged = false; - if (this.props.options !== nextProps.options) { - layersChanged = this.optionsChanged(nextProps.options); - } - // External data changed - if (layersChanged || this.props.data !== nextProps.data) { + if (this.props.data !== nextProps.data) { this.dataChanged(nextProps.data); } return true; // always? } + /** This funciton will actually update the JSON model */ + private doOptionsUpdate(selected: number) { + const { options, onOptionsChange } = this.props; + const layers = this.layers; + onOptionsChange({ + ...options, + basemap: layers[0].options, + layers: layers.slice(1).map((v) => v.options), + }); + + // Notify the the panel editor + if (this.panelContext.onInstanceStateChange) { + this.panelContext.onInstanceStateChange({ + map: this.map, + layers: layers, + selected, + actions: this.actions, + }); + } + } + + getNextLayerName = () => { + let idx = this.layers.length; // since basemap is 0, this looks right + while (true && idx < 100) { + const name = `Layer ${idx++}`; + if (!this.byName.has(name)) { + return name; + } + } + return `Layer ${Date.now()}`; + }; + + actions: GeomapLayerActions = { + selectLayer: (uid: string) => { + const selected = this.layers.findIndex((v) => v.options.name === uid); + if (this.panelContext.onInstanceStateChange) { + this.panelContext.onInstanceStateChange({ + map: this.map, + layers: this.layers, + selected, + actions: this.actions, + }); + } + }, + canRename: (v: string) => { + return !this.byName.has(v); + }, + deleteLayer: (uid: string) => { + const layers: MapLayerState[] = []; + for (const lyr of this.layers) { + if (lyr.options.name === uid) { + this.map?.removeLayer(lyr.layer); + } else { + layers.push(lyr); + } + } + this.layers = layers; + this.doOptionsUpdate(0); + }, + addlayer: (type: string) => { + const item = geomapLayerRegistry.getIfExists(type); + if (!item) { + return; // ignore empty request + } + this.initLayer( + this.map!, + { + type: item.id, + name: this.getNextLayerName(), + config: cloneDeep(item.defaultOptions), + tooltip: true, + }, + false + ).then((lyr) => { + this.layers = this.layers.slice(0); + this.layers.push(lyr); + this.map?.addLayer(lyr.layer); + + this.doOptionsUpdate(this.layers.length - 1); + }); + }, + reorder: (startIndex: number, endIndex: number) => { + const result = Array.from(this.layers); + const [removed] = result.splice(startIndex, 1); + result.splice(endIndex, 0, removed); + this.layers = result; + + this.doOptionsUpdate(endIndex); + + // Add the layers in the right order + const group = this.map?.getLayers()!; + group.clear(); + this.layers.forEach((v) => group.push(v.layer)); + }, + }; + /** * Called when the panel options change + * + * NOTE: changes to basemap and layers are handled independently */ - optionsChanged(options: GeomapPanelOptions): boolean { - let layersChanged = false; + optionsChanged(options: GeomapPanelOptions) { const oldOptions = this.props.options; console.log('options changed!', options); @@ -115,19 +223,6 @@ export class GeomapPanel extends Component { console.log('Controls changed'); this.initControls(options.controls ?? { showZoom: true, showAttribution: true }); } - - if (options.basemap !== oldOptions.basemap) { - console.log('Basemap changed'); - this.initBasemap(options.basemap); - layersChanged = true; - } - - if (options.layers !== oldOptions.layers) { - console.log('layers changed'); - this.initLayers(options.layers ?? []); // async - layersChanged = true; - } - return layersChanged; } /** @@ -142,16 +237,18 @@ export class GeomapPanel extends Component { } initMapRef = async (div: HTMLDivElement) => { + this.mapDiv = div; if (this.map) { this.map.dispose(); } if (!div) { - this.map = (undefined as unknown) as Map; + this.map = (undefined as unknown) as OpenLayersMap; return; } const { options } = this.props; - this.map = new Map({ + + const map = (this.map = new OpenLayersMap({ view: this.initMapView(options.view), pixelRatio: 1, // or zoom? layers: [], // loaded explicitly below @@ -160,12 +257,34 @@ export class GeomapPanel extends Component { interactions: interactionDefaults({ mouseWheelZoom: false, // managed by initControls }), - }); + })); + + this.byName.clear(); + const layers: MapLayerState[] = []; + try { + layers.push(await this.initLayer(map, options.basemap ?? DEFAULT_BASEMAP_CONFIG, true)); + + // Default layer values + let layerOptions = options.layers; + if (!layerOptions) { + layerOptions = [defaultMarkersConfig]; + } + + for (const lyr of layerOptions) { + layers.push(await this.initLayer(map, lyr, false)); + } + } catch (ex) { + console.error('error loading layers', ex); + } + + this.layers = layers; + for (const lyr of layers) { + this.map.addLayer(lyr.layer); + } + this.mouseWheelZoom = new MouseWheelZoom(); this.map.addInteraction(this.mouseWheelZoom); this.initControls(options.controls); - this.initBasemap(options.basemap); - await this.initLayers(options.layers); this.forceUpdate(); // first render // Tooltip listener @@ -173,6 +292,22 @@ export class GeomapPanel extends Component { this.map.getViewport().addEventListener('mouseout', (evt) => { this.props.eventBus.publish(new DataHoverClearEvent()); }); + + // Notify the the panel editor + if (this.panelContext.onInstanceStateChange) { + this.panelContext.onInstanceStateChange({ + map: this.map, + layers: layers, + selected: layers.length - 1, // the top layer + actions: this.actions, + }); + } + }; + + clearTooltip = () => { + if (this.state.ttip) { + this.setState({ ttip: undefined }); + } }; pointerMoveListener = (evt: MapBrowserEvent) => { @@ -197,19 +332,31 @@ export class GeomapPanel extends Component { let ttip: GeomapHoverPayload = {} as GeomapHoverPayload; const features: GeomapHoverFeature[] = []; - this.map.forEachFeatureAtPixel(pixel, (feature, layer, geo) => { - if (!hoverPayload.data) { - const props = feature.getProperties(); - const frame = props['frame']; - if (frame) { - hoverPayload.data = ttip.data = frame as DataFrame; - hoverPayload.rowIndex = ttip.rowIndex = props['rowIndex']; - } else { - hoverPayload.feature = ttip.feature = feature; + this.map.forEachFeatureAtPixel( + pixel, + (feature, layer, geo) => { + //match hover layer to layer in layers + //check if the layer show tooltip is enabled + //then also pass the list of tooltip fields if exists + if (!hoverPayload.data) { + const props = feature.getProperties(); + const frame = props['frame']; + if (frame) { + hoverPayload.data = ttip.data = frame as DataFrame; + hoverPayload.rowIndex = ttip.rowIndex = props['rowIndex']; + } else { + hoverPayload.feature = ttip.feature = feature; + } } + features.push({ feature, layer, geo }); + }, + { + layerFilter: (l) => { + const hoverLayerState = (l as any).__state as MapLayerState; + return hoverLayerState.options.tooltip !== false; + }, } - features.push({ feature, layer, geo }); - }); + ); this.hoverPayload.features = features.length ? features : undefined; this.props.eventBus.publish(this.hoverEvent); @@ -223,70 +370,119 @@ export class GeomapPanel extends Component { } }; - async initBasemap(cfg: MapLayerOptions) { + private updateLayer = async (uid: string, newOptions: MapLayerOptions): Promise => { if (!this.map) { - return; + return false; + } + const current = this.byName.get(uid); + if (!current) { + return false; } - if (!cfg?.type || config.geomapDisableCustomBaseLayer) { - cfg = DEFAULT_BASEMAP_CONFIG; + let layerIndex = -1; + const group = this.map?.getLayers()!; + for (let i = 0; i < group?.getLength(); i++) { + if (group.item(i) === current.layer) { + layerIndex = i; + break; + } } - const item = geomapLayerRegistry.getIfExists(cfg.type) ?? defaultBaseLayer; - const handler = await item.create(this.map, cfg, config.theme2); + + // Special handling for rename + if (newOptions.name !== uid) { + if (!newOptions.name) { + newOptions.name = uid; + } else if (this.byName.has(newOptions.name)) { + return false; + } + console.log('Layer name changed', uid, '>>>', newOptions.name); + this.byName.delete(uid); + + uid = newOptions.name; + this.byName.set(uid, current); + } + + // Type changed -- requires full re-initalization + if (current.options.type !== newOptions.type) { + // full init + } else { + // just update options + } + + const layers = this.layers.slice(0); + try { + const info = await this.initLayer(this.map, newOptions, current.isBasemap); + layers[layerIndex] = info; + group.setAt(layerIndex, info.layer); + + // initialize with new data + if (info.handler.update) { + info.handler.update(this.props.data); + } + } catch (err) { + console.warn('ERROR', err); + return false; + } + + this.layers = layers; + this.doOptionsUpdate(layerIndex); + return true; + }; + + async initLayer(map: OpenLayersMap, options: MapLayerOptions, isBasemap?: boolean): Promise { + if (isBasemap && (!options?.type || config.geomapDisableCustomBaseLayer)) { + options = DEFAULT_BASEMAP_CONFIG; + } + + // Use default makers layer + if (!options?.type) { + options = { + type: MARKERS_LAYER_ID, + name: this.getNextLayerName(), + config: {}, + }; + } + + const item = geomapLayerRegistry.getIfExists(options.type); + if (!item) { + return Promise.reject('unknown layer: ' + options.type); + } + + const handler = await item.create(map, options, config.theme2); const layer = handler.init(); - if (this.basemap) { - this.map.removeLayer(this.basemap); - this.basemap.dispose(); - } - this.basemap = layer; - this.map.getLayers().insertAt(0, this.basemap); - } - async initLayers(layers: MapLayerOptions[]) { - // 1st remove existing layers - for (const state of this.layers) { - this.map!.removeLayer(state.layer); - state.layer.dispose(); + if (handler.update) { + handler.update(this.props.data); } - if (!layers) { - layers = []; + if (!options.name) { + options.name = this.getNextLayerName(); } + const UID = options.name; + const state = { + UID, // unique name when added to the map (it may change and will need special handling) + isBasemap, + options, + layer, + handler, - const legends: React.ReactNode[] = []; - this.layers = []; - for (const overlay of layers) { - const item = geomapLayerRegistry.getIfExists(overlay.type); - if (!item) { - console.warn('unknown layer type: ', overlay); - continue; // TODO -- panel warning? - } + getName: () => UID, - const handler = await item.create(this.map!, overlay, config.theme2); - const layer = handler.init(); - (layer as any).___handler = handler; - this.map!.addLayer(layer); - this.layers.push({ - config: overlay, - layer, - handler, - }); - - if (handler.legend) { - legends.push(
    {handler.legend}
    ); - } - } - this.setState({ bottomLeft: legends }); - - // Update data after init layers - this.dataChanged(this.props.data); + // Used by the editors + onChange: (cfg: MapLayerOptions) => { + this.updateLayer(UID, cfg); + }, + }; + this.byName.set(UID, state); + (state.layer as any).__state = state; + return state; } initMapView(config: MapViewConfig): View { let view = new View({ center: [0, 0], zoom: 1, - showFullExtent: true, // alows zooming so the full range is visiable + showFullExtent: true, // allows zooming so the full range is visible }); // With shared views, all panels use the same view instance @@ -367,7 +563,7 @@ export class GeomapPanel extends Component { return ( <> -
    +
    diff --git a/public/app/plugins/panel/geomap/components/DataHoverView.tsx b/public/app/plugins/panel/geomap/components/DataHoverView.tsx index 5f9be545374..cdc5f1efdcf 100644 --- a/public/app/plugins/panel/geomap/components/DataHoverView.tsx +++ b/public/app/plugins/panel/geomap/components/DataHoverView.tsx @@ -1,52 +1,68 @@ import React, { PureComponent } from 'react'; import { stylesFactory } from '@grafana/ui'; -import { DataFrame, Field, formattedValueToString, getFieldDisplayName, GrafanaTheme2 } from '@grafana/data'; +import { + ArrayDataFrame, + arrayUtils, + DataFrame, + Field, + formattedValueToString, + getFieldDisplayName, + GrafanaTheme2, +} from '@grafana/data'; import { css } from '@emotion/css'; import { config } from 'app/core/config'; import { FeatureLike } from 'ol/Feature'; +import { SortOrder } from '@grafana/schema'; export interface Props { data?: DataFrame; // source data feature?: FeatureLike; - rowIndex?: number; // the hover row - columnIndex?: number; // the hover column + rowIndex?: number | null; // the hover row + columnIndex?: number | null; // the hover column + sortOrder?: SortOrder; } export class DataHoverView extends PureComponent { style = getStyles(config.theme2); render() { - const { data, feature, rowIndex, columnIndex } = this.props; - + const { feature, columnIndex, sortOrder } = this.props; + let { data, rowIndex } = this.props; if (feature) { - return ( - - - {Object.entries(feature.getProperties()).map( - (e, i) => - e[0] === 'geometry' || ( //don't include geojson feature geometry - - - - - ) - )} - -
    {`${e[0]}: `}{`${e[1]}`}
    - ); + const { geometry, ...properties } = feature.getProperties(); + data = new ArrayDataFrame([properties]); + rowIndex = 0; } if (!data || rowIndex == null) { return null; } + const displayValues: Array<[string, any, string]> = []; + const visibleFields = data.fields.filter((f) => !Boolean(f.config.custom?.hideFrom?.tooltip)); + + if (visibleFields.length === 0) { + return null; + } + for (let i = 0; i < visibleFields.length; i++) { + displayValues.push([ + getFieldDisplayName(visibleFields[i], data), + visibleFields[i].values.get(rowIndex!), + fmt(visibleFields[i], rowIndex), + ]); + } + + if (sortOrder && sortOrder !== SortOrder.None) { + displayValues.sort((a, b) => arrayUtils.sortValues(sortOrder)(a[1], b[1])); + } + return ( - {data.fields.map((f, i) => ( + {displayValues.map((v, i) => ( - - + + ))} diff --git a/public/app/plugins/panel/geomap/editor/GazetteerPathEditor.tsx b/public/app/plugins/panel/geomap/editor/GazetteerPathEditor.tsx index dd75f7ab9a5..e9e8d006e78 100644 --- a/public/app/plugins/panel/geomap/editor/GazetteerPathEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/GazetteerPathEditor.tsx @@ -3,8 +3,9 @@ import { StandardEditorProps, SelectableValue, GrafanaTheme2 } from '@grafana/da import { Alert, Select, stylesFactory, useTheme2 } from '@grafana/ui'; import { COUNTRIES_GAZETTEER_PATH, Gazetteer, getGazetteer } from '../gazetteer/gazetteer'; import { css } from '@emotion/css'; +import { GazetteerPathEditorConfigSettings } from '../types'; -const paths: Array> = [ +const defaultPaths: Array> = [ { label: 'Countries', description: 'Lookup countries by name, two letter code, or three letter code', @@ -22,9 +23,15 @@ const paths: Array> = [ }, ]; -export const GazetteerPathEditor: FC> = ({ value, onChange, context }) => { +export const GazetteerPathEditor: FC> = ({ + value, + onChange, + context, + item, +}) => { const styles = getStyles(useTheme2()); const [gaz, setGaz] = useState(); + const settings = item.settings as any; useEffect(() => { async function fetchData() { @@ -35,8 +42,8 @@ export const GazetteerPathEditor: FC> = ({ }, [value, setGaz]); const { current, options } = useMemo(() => { - let options = [...paths]; - let current = options.find((f) => f.value === gaz?.path); + let options = settings?.options ? [...settings.options] : [...defaultPaths]; + let current = options?.find((f) => f.value === gaz?.path); if (!current && gaz) { current = { label: gaz.path, @@ -45,7 +52,7 @@ export const GazetteerPathEditor: FC> = ({ options.push(current); } return { options, current }; - }, [gaz]); + }, [gaz, settings?.options]); return ( <> diff --git a/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx b/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx new file mode 100644 index 00000000000..c3d1cf1f7f1 --- /dev/null +++ b/public/app/plugins/panel/geomap/editor/GeomapStyleRulesEditor.tsx @@ -0,0 +1,66 @@ +import React, { FC, useCallback } from 'react'; +import { Button, useTheme2 } from '@grafana/ui'; +import { StandardEditorProps, StandardEditorsRegistryItem } from '@grafana/data'; + +import { FeatureStyleConfig } from '../types'; +import { DEFAULT_STYLE_RULE } from '../layers/data/geojsonLayer'; +import { StyleRuleEditor, StyleRuleEditorSettings } from './StyleRuleEditor'; +import { defaultStyleConfig } from '../style/types'; + +export const GeomapStyleRulesEditor: FC> = (props) => { + const { value, onChange, context, item } = props; + const theme = useTheme2(); + + const settings = item.settings; + const onAddRule = useCallback(() => { + const { palette } = theme.visualization; + const color = { + fixed: palette[Math.floor(Math.random() * palette.length)], + }; + + const newRule = [...value, { ...DEFAULT_STYLE_RULE, style: { ...defaultStyleConfig, color } }]; + + onChange(newRule); + }, [onChange, value, theme.visualization]); + + const onRuleChange = useCallback( + (idx) => (style: FeatureStyleConfig | undefined) => { + const copyStyles = [...value]; + if (style) { + copyStyles[idx] = style; + } else { + //assume undefined is only returned on delete + copyStyles.splice(idx, 1); + } + onChange(copyStyles); + }, + [onChange, value] + ); + + const styleOptions = + value && + value.map((style, idx: number) => { + const itemSettings: StandardEditorsRegistryItem = { + settings, + } as any; + + return ( + + ); + }); + + return ( + <> + {styleOptions} + + + ); +}; diff --git a/public/app/plugins/panel/geomap/editor/LayersEditor.tsx b/public/app/plugins/panel/geomap/editor/LayersEditor.tsx new file mode 100644 index 00000000000..c2cfccc89dc --- /dev/null +++ b/public/app/plugins/panel/geomap/editor/LayersEditor.tsx @@ -0,0 +1,81 @@ +import React from 'react'; +import { Container } from '@grafana/ui'; +import { StandardEditorProps } from '@grafana/data'; +import { DropResult } from 'react-beautiful-dnd'; + +import { GeomapPanelOptions, MapLayerState } from '../types'; +import { GeomapInstanceState } from '../GeomapPanel'; +import { geomapLayerRegistry } from '../layers/registry'; +import { dataLayerFilter } from './layerEditor'; +import { AddLayerButton } from 'app/core/components/Layers/AddLayerButton'; +import { LayerDragDropList } from 'app/core/components/Layers/LayerDragDropList'; + +type LayersEditorProps = StandardEditorProps; + +export const LayersEditor = (props: LayersEditorProps) => { + const { layers, selected, actions } = props.context.instanceState ?? {}; + if (!layers || !actions) { + return
    No layers?
    ; + } + + const onDragEnd = (result: DropResult) => { + if (!result.destination) { + return; + } + + const { layers, actions } = props.context.instanceState ?? {}; + if (!layers || !actions) { + return; + } + + // account for the reverse order and offset (0 is baselayer) + const count = layers.length - 1; + const src = (result.source.index - count) * -1; + const dst = (result.destination.index - count) * -1; + + actions.reorder(src, dst); + }; + + const onSelect = (element: MapLayerState) => { + actions.selectLayer(element.options.name); + }; + + const onDelete = (element: MapLayerState) => { + actions.deleteLayer(element.options.name); + }; + + const getLayerInfo = (element: MapLayerState) => { + return element.options.type; + }; + + const onNameChange = (element: MapLayerState, name: string) => { + element.onChange({ ...element.options, name }); + }; + + const selection = selected ? [layers[selected]?.getName()] : []; + + return ( + <> + + actions.addlayer(v.value!)} + options={geomapLayerRegistry.selectOptions(undefined, dataLayerFilter).options} + label={'Add layer'} + /> + +
    + + + + ); +}; diff --git a/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx b/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx index bfa6fb1a4cc..de640f515f4 100644 --- a/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx +++ b/public/app/plugins/panel/geomap/editor/MapViewEditor.tsx @@ -5,9 +5,9 @@ import { GeomapPanelOptions, MapViewConfig } from '../types'; import { centerPointRegistry, MapCenterID } from '../view'; import { NumberInput } from 'app/features/dimensions/editors/NumberInput'; import { toLonLat } from 'ol/proj'; -import { GeomapPanel } from '../GeomapPanel'; +import { GeomapInstanceState } from '../GeomapPanel'; -export const MapViewEditor: FC> = ({ +export const MapViewEditor: FC> = ({ value, onChange, context, diff --git a/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx b/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx new file mode 100644 index 00000000000..a63c15f69db --- /dev/null +++ b/public/app/plugins/panel/geomap/editor/StyleRuleEditor.tsx @@ -0,0 +1,225 @@ +import React, { FC, useCallback, useMemo } from 'react'; +import { GrafanaTheme2, SelectableValue, StandardEditorProps } from '@grafana/data'; +import { ComparisonOperation, FeatureStyleConfig } from '../types'; +import { Button, InlineField, InlineFieldRow, Select, useStyles2 } from '@grafana/ui'; +import { css } from '@emotion/css'; +import { StyleEditor } from '../layers/data/StyleEditor'; +import { defaultStyleConfig, StyleConfig } from '../style/types'; +import { DEFAULT_STYLE_RULE } from '../layers/data/geojsonLayer'; +import { Observable } from 'rxjs'; +import { useObservable } from 'react-use'; +import { getUniqueFeatureValues, LayerContentInfo } from '../utils/getFeatures'; +import { FeatureLike } from 'ol/Feature'; +import { getSelectionInfo } from '../utils/selection'; +import { NumberInput } from 'app/features/dimensions/editors/NumberInput'; + +export interface StyleRuleEditorSettings { + features: Observable; + layerInfo: Observable; +} + +const comparators = [ + { label: '==', value: ComparisonOperation.EQ }, + { label: '!=', value: ComparisonOperation.NEQ }, + { label: '>', value: ComparisonOperation.GT }, + { label: '>=', value: ComparisonOperation.GTE }, + { label: '<', value: ComparisonOperation.LT }, + { label: '<=', value: ComparisonOperation.LTE }, +]; + +export const StyleRuleEditor: FC> = ( + props +) => { + const { value, onChange, item, context } = props; + const settings: StyleRuleEditorSettings = item.settings; + const { features, layerInfo } = settings; + + const propertyOptions = useObservable(layerInfo); + const feats = useObservable(features); + + const uniqueSelectables = useMemo(() => { + const key = value?.check?.property; + if (key && feats && value.check?.operation === ComparisonOperation.EQ) { + return getUniqueFeatureValues(feats, key).map((v) => { + let newValue; + let isNewValueNumber = !isNaN(Number(v)); + + if (isNewValueNumber) { + newValue = { + value: Number(v), + label: v, + }; + } else { + newValue = { value: v, label: v }; + } + + return newValue; + }); + } + return []; + }, [feats, value]); + + const styles = useStyles2(getStyles); + + const LABEL_WIDTH = 10; + + const onChangeProperty = useCallback( + (selection?: SelectableValue) => { + onChange({ + ...value, + check: { + ...value.check!, + property: selection?.value, + }, + }); + }, + [onChange, value] + ); + + const onChangeComparison = useCallback( + (selection: SelectableValue) => { + onChange({ + ...value, + check: { + ...value.check!, + operation: selection.value ?? ComparisonOperation.EQ, + }, + }); + }, + [onChange, value] + ); + + const onChangeValue = useCallback( + (selection?: SelectableValue) => { + onChange({ + ...value, + check: { + ...value.check!, + value: selection?.value, + }, + }); + }, + [onChange, value] + ); + + const onChangeNumericValue = useCallback( + (v?: number) => { + onChange({ + ...value, + check: { + ...value.check!, + value: v!, + }, + }); + }, + [onChange, value] + ); + + const onChangeStyle = useCallback( + (style?: StyleConfig) => { + onChange({ ...value, style }); + }, + [onChange, value] + ); + + const onDelete = useCallback(() => { + onChange(undefined); + }, [onChange]); + + const check = value.check ?? DEFAULT_STYLE_RULE.check!; + const propv = getSelectionInfo(check.property, propertyOptions?.propertes); + const valuev = getSelectionInfo(check.value, uniqueSelectables); + + return ( +
    + + + v.value === check.operation)} + options={comparators} + onChange={onChangeComparison} + aria-label={'Comparison operator'} + width={8} + /> + + + <> + {(check.operation === ComparisonOperation.EQ || check.operation === ComparisonOperation.NEQ) && ( +
    - +
    - +
    + >
    diff --git a/public/app/features/annotations/event_editor.ts b/public/app/plugins/panel/graph/event_editor.ts similarity index 92% rename from public/app/features/annotations/event_editor.ts rename to public/app/plugins/panel/graph/event_editor.ts index 1839c01a6a2..a02ef28e89d 100644 --- a/public/app/features/annotations/event_editor.ts +++ b/public/app/plugins/panel/graph/event_editor.ts @@ -1,9 +1,9 @@ import { cloneDeep, isNumber } from 'lodash'; -import { coreModule } from 'app/core/core'; +import { coreModule } from 'app/angular/core_module'; import { AnnotationEvent, dateTime } from '@grafana/data'; import { MetricsPanelCtrl } from 'app/angular/panel/metrics_panel_ctrl'; -import { deleteAnnotation, saveAnnotation, updateAnnotation } from './api'; -import { getDashboardQueryRunner } from '../query/state/DashboardQueryRunner/DashboardQueryRunner'; +import { deleteAnnotation, saveAnnotation, updateAnnotation } from '../../../features/annotations/api'; +import { getDashboardQueryRunner } from '../../../features/query/state/DashboardQueryRunner/DashboardQueryRunner'; export class EventEditorCtrl { // @ts-ignore initialized through Angular not constructor diff --git a/public/app/features/annotations/event_manager.ts b/public/app/plugins/panel/graph/event_manager.ts similarity index 100% rename from public/app/features/annotations/event_manager.ts rename to public/app/plugins/panel/graph/event_manager.ts diff --git a/public/app/plugins/panel/graph/graph.ts b/public/app/plugins/panel/graph/graph.ts index bd1897557dc..55692cf35be 100644 --- a/public/app/plugins/panel/graph/graph.ts +++ b/public/app/plugins/panel/graph/graph.ts @@ -11,11 +11,12 @@ import './jquery.flot.events'; import $ from 'jquery'; import { clone, find, flatten, isUndefined, map, max as _max, min as _min, sortBy as _sortBy, toNumber } from 'lodash'; import { tickStep } from 'app/core/utils/ticks'; -import { coreModule, updateLegendValues } from 'app/core/core'; +import { updateLegendValues } from 'app/core/core'; +import { coreModule } from 'app/angular/core_module'; import GraphTooltip from './graph_tooltip'; import { ThresholdManager } from './threshold_manager'; import { TimeRegionManager } from './time_region_manager'; -import { EventManager } from 'app/features/annotations/all'; +import { EventManager } from './event_manager'; import { convertToHistogramData } from './histogram'; import { alignYLevel } from './align_yaxes'; import config from 'app/core/config'; @@ -29,6 +30,9 @@ import { provideTheme } from 'app/core/utils/ConfigProvider'; import { DataFrame, DataFrameView, + DataHoverClearEvent, + DataHoverEvent, + DataHoverPayload, FieldDisplay, FieldType, formattedValueToString, @@ -40,6 +44,7 @@ import { LegacyEventHandler, LegacyGraphHoverClearEvent, LegacyGraphHoverEvent, + LegacyGraphHoverEventPayload, LinkModelSupplier, PanelEvents, toUtc, @@ -47,8 +52,9 @@ import { import { GraphContextMenuCtrl } from './GraphContextMenuCtrl'; import { TimeSrv } from 'app/features/dashboard/services/TimeSrv'; import { ContextSrv } from 'app/core/services/context_srv'; -import { getFieldLinksSupplier } from 'app/angular/panel/panellinks/linkSuppliers'; +import { getFieldLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers'; import { DashboardModel } from '../../../features/dashboard/state'; +import { isLegacyGraphHoverEvent } from './utils'; const LegendWithThemeProvider = provideTheme(Legend); @@ -99,6 +105,9 @@ class GraphElement { this.ctrl.dashboard.events.on(LegacyGraphHoverEvent.type, this.onGraphHover.bind(this), this.scope); this.ctrl.dashboard.events.on(LegacyGraphHoverClearEvent.type, this.onGraphHoverClear.bind(this), this.scope); + this.ctrl.dashboard.events.on(DataHoverEvent.type, this.onGraphHover.bind(this), this.scope); + this.ctrl.dashboard.events.on(DataHoverClearEvent.type, this.onGraphHoverClear.bind(this), this.scope); + // plot events this.elem.bind('plotselected', this.onPlotSelected.bind(this)); this.elem.bind('plotclick', this.onPlotClick.bind(this)); @@ -147,18 +156,27 @@ class GraphElement { ReactDOM.render(legendReactElem, this.legendElem, () => this.renderPanel()); } - onGraphHover(evt: any) { + onGraphHover(evt: LegacyGraphHoverEventPayload | DataHoverPayload) { // ignore other graph hover events if shared tooltip is disabled if (!this.dashboard.sharedTooltipModeEnabled()) { return; } - // ignore if we are the emitter - if (!this.plot || evt.panel.id === this.panel.id || this.ctrl.otherPanelInFullscreenMode()) { + if (isLegacyGraphHoverEvent(evt)) { + // ignore if we are the emitter + if (!this.plot || evt.panel?.id === this.panel.id || this.ctrl.otherPanelInFullscreenMode()) { + return; + } + + this.tooltip.show(evt.pos); + } + + // DataHoverEvent can come from multiple panels that doesn't include x position + if (!evt.point?.time) { return; } - this.tooltip.show(evt.pos); + this.tooltip.show({ x: evt.point.time, panelRelY: evt.point.panelRelY ?? 1 }); } onPanelTeardown() { diff --git a/public/app/plugins/panel/graph/graph_tooltip.ts b/public/app/plugins/panel/graph/graph_tooltip.ts index b1281eb6588..fcdef4e8078 100644 --- a/public/app/plugins/panel/graph/graph_tooltip.ts +++ b/public/app/plugins/panel/graph/graph_tooltip.ts @@ -166,11 +166,13 @@ export default function GraphTooltip(this: any, elem: any, dashboard: any, scope self.show(pos, item); // broadcast to other graph panels that we are hovering! - pos.panelRelY = (pos.pageY - elem.offset().top) / elem.height(); - hoverEvent.payload.pos = pos; - hoverEvent.payload.panel = panel; - hoverEvent.payload.point['time'] = (pos as any).x; - dashboard.events.publish(hoverEvent); + if (!dashboard.panelInEdit) { + pos.panelRelY = (pos.pageY - elem.offset().top) / elem.height(); + hoverEvent.payload.pos = pos; + hoverEvent.payload.panel = panel; + hoverEvent.payload.point['time'] = (pos as any).x; + dashboard.events.publish(hoverEvent); + } }); elem.bind('plotclick', (event: any, pos: any, item: any) => { diff --git a/public/app/plugins/panel/graph/jquery.flot.events.ts b/public/app/plugins/panel/graph/jquery.flot.events.ts index 2818e3b2461..af0b37248c1 100644 --- a/public/app/plugins/panel/graph/jquery.flot.events.ts +++ b/public/app/plugins/panel/graph/jquery.flot.events.ts @@ -1,13 +1,13 @@ -import angular from 'angular'; import $ from 'jquery'; import { partition, each } from 'lodash'; //@ts-ignore import Drop from 'tether-drop'; import { CreatePlotOverlay } from '@grafana/data'; +import { getLegacyAngularInjector } from '@grafana/runtime'; /** @ngInject */ const createAnnotationToolip: CreatePlotOverlay = (element, event, plot) => { - const injector = angular.element(document).injector(); + const injector = getLegacyAngularInjector(); const content = document.createElement('div'); content.innerHTML = ''; @@ -68,7 +68,7 @@ const createEditPopover: CreatePlotOverlay = (element, event, plot) => { // wait for element to be attached and positioned setTimeout(() => { - const injector = angular.element(document).injector(); + const injector = getLegacyAngularInjector(); const content = document.createElement('div'); content.innerHTML = ''; diff --git a/public/app/plugins/panel/graph/module.ts b/public/app/plugins/panel/graph/module.ts index d4e7568bbd7..fdc09d85613 100644 --- a/public/app/plugins/panel/graph/module.ts +++ b/public/app/plugins/panel/graph/module.ts @@ -2,6 +2,8 @@ import './graph'; import './series_overrides_ctrl'; import './thresholds_form'; import './time_regions_form'; +import './annotation_tooltip'; +import './event_editor'; import template from './template'; import { defaults, find, without } from 'lodash'; @@ -233,7 +235,7 @@ export class GraphCtrl extends MetricsPanelCtrl { tip: 'Data exists, but is not timeseries', actionText: 'Switch to table view', action: () => { - dispatch(changePanelPlugin(this.panel, 'table')); + dispatch(changePanelPlugin({ panel: this.panel, pluginId: 'table' })); }, }; } @@ -354,6 +356,10 @@ export class GraphCtrl extends MetricsPanelCtrl { getDataFrameByRefId = (refId: string) => { return this.dataList.filter((dataFrame) => dataFrame.refId === refId)[0]; }; + + migrateToReact() { + this.onPluginTypeChange(config.panels['timeseries']); + } } // Use new react style configuration diff --git a/public/app/plugins/panel/graph/series_overrides_ctrl.ts b/public/app/plugins/panel/graph/series_overrides_ctrl.ts index ab8313e9724..21f9e4cde90 100644 --- a/public/app/plugins/panel/graph/series_overrides_ctrl.ts +++ b/public/app/plugins/panel/graph/series_overrides_ctrl.ts @@ -1,5 +1,5 @@ import { map, each, isUndefined } from 'lodash'; -import coreModule from 'app/core/core_module'; +import coreModule from 'app/angular/core_module'; import { textUtil } from '@grafana/data'; /** @ngInject */ diff --git a/public/app/plugins/panel/graph/specs/graph.test.ts b/public/app/plugins/panel/graph/specs/graph.test.ts index 8b0c4815c1e..105b1c47769 100644 --- a/public/app/plugins/panel/graph/specs/graph.test.ts +++ b/public/app/plugins/panel/graph/specs/graph.test.ts @@ -9,7 +9,7 @@ import { graphDirective, GraphElement } from '../graph'; import { dateTime, EventBusSrv } from '@grafana/data'; import { DashboardModel } from '../../../../features/dashboard/state'; -jest.mock('app/features/annotations/all', () => ({ +jest.mock('../event_manager', () => ({ EventManager: () => { return { on: () => {}, @@ -23,6 +23,7 @@ jest.mock('app/core/core', () => ({ directive: () => {}, }, appEvents: { + subscribe: () => {}, on: () => {}, }, })); diff --git a/public/app/plugins/panel/graph/specs/graph_ctrl.test.ts b/public/app/plugins/panel/graph/specs/graph_ctrl.test.ts index ab4a2e10a4f..9bab71987be 100644 --- a/public/app/plugins/panel/graph/specs/graph_ctrl.test.ts +++ b/public/app/plugins/panel/graph/specs/graph_ctrl.test.ts @@ -1,6 +1,5 @@ import { GraphCtrl } from '../module'; import { dateTime } from '@grafana/data'; -import TimeSeries from 'app/core/time_series2'; jest.mock('../graph', () => ({})); @@ -110,40 +109,4 @@ describe.skip('GraphCtrl', () => { expect(ctx.ctrl.dataWarning.title).toBe('No data'); }); }); - - describe('when data is exported to CSV', () => { - const appEventMock = jest.fn(); - - beforeEach(() => { - appEventMock.mockReset(); - scope.$root = { appEvent: appEventMock }; - scope.$new = () => ({}); - const data = [ - { - target: 'test.normal', - datapoints: [ - [10, 1], - [10, 2], - ], - }, - { - target: 'test.nulls', - datapoints: [ - [null, 1], - [null, 2], - ], - }, - { - target: 'test.zeros', - datapoints: [ - [0, 1], - [0, 2], - ], - }, - ]; - ctx.ctrl.onDataSnapshotLoad(data); - // allIsNull / allIsZero are set by getFlotPairs - ctx.ctrl.seriesList.forEach((series: TimeSeries) => series.getFlotPairs('')); - }); - }); }); diff --git a/public/app/plugins/panel/graph/specs/graph_tooltip.test.ts b/public/app/plugins/panel/graph/specs/graph_tooltip.test.ts index cba2a692e04..62e4c9a5cd2 100644 --- a/public/app/plugins/panel/graph/specs/graph_tooltip.test.ts +++ b/public/app/plugins/panel/graph/specs/graph_tooltip.test.ts @@ -3,43 +3,20 @@ jest.mock('app/core/core', () => ({})); import $ from 'jquery'; import GraphTooltip from '../graph_tooltip'; -const scope = { +const scope: any = { appEvent: jest.fn(), onAppEvent: jest.fn(), - ctrl: {}, + ctrl: { + panel: { + tooltip: {}, + }, + }, }; const elem = $('
    '); const dashboard = {}; const getSeriesFn = () => {}; -function describeSharedTooltip(desc: string, fn: any) { - const ctx: any = {}; - ctx.ctrl = scope.ctrl; - ctx.ctrl.panel = { - tooltip: { - shared: true, - }, - legend: {}, - stack: false, - }; - - ctx.setup = (setupFn: any) => { - ctx.setupFn = setupFn; - }; - - describe(desc, () => { - beforeEach(() => { - ctx.setupFn(); - // @ts-ignore - const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); - ctx.results = tooltip.getMultiSeriesPlotHoverInfo(ctx.data, ctx.pos); - }); - - fn(ctx); - }); -} - describe('findHoverIndexFromData', () => { // @ts-ignore const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); @@ -77,9 +54,19 @@ describe('findHoverIndexFromData', () => { }); }); -describeSharedTooltip('steppedLine false, stack false', (ctx: any) => { - ctx.setup(() => { - ctx.data = [ +describe('with a shared tooltip', () => { + beforeEach(() => { + scope.ctrl.panel = { + tooltip: { + shared: true, + }, + legend: {}, + stack: false, + }; + }); + + describe('steppedLine false, stack false', () => { + const data = [ { data: [ [10, 15], @@ -97,42 +84,34 @@ describeSharedTooltip('steppedLine false, stack false', (ctx: any) => { hideTooltip: false, }, ]; - ctx.pos = { x: 11 }; + const pos = { x: 11 }; + + it('should return 2 series', () => { + // @ts-ignore + const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); + const results = tooltip.getMultiSeriesPlotHoverInfo(data, pos); + expect(results.length).toBe(2); + }); + + it('should add time to results array', () => { + // @ts-ignore + const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); + const results = tooltip.getMultiSeriesPlotHoverInfo(data, pos); + expect(results.time).toBe(10); + }); + + it('should set value and hoverIndex', () => { + // @ts-ignore + const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); + const results = tooltip.getMultiSeriesPlotHoverInfo(data, pos); + expect(results[0].value).toBe(15); + expect(results[1].value).toBe(2); + expect(results[0].hoverIndex).toBe(0); + }); }); - it('should return 2 series', () => { - expect(ctx.results.length).toBe(2); - }); - - it('should add time to results array', () => { - expect(ctx.results.time).toBe(10); - }); - - it('should set value and hoverIndex', () => { - expect(ctx.results[0].value).toBe(15); - expect(ctx.results[1].value).toBe(2); - expect(ctx.results[0].hoverIndex).toBe(0); - }); -}); - -describeSharedTooltip('one series is hidden', (ctx: any) => { - ctx.setup(() => { - ctx.data = [ - { - data: [ - [10, 15], - [12, 20], - ], - }, - { data: [] }, - ]; - ctx.pos = { x: 11 }; - }); -}); - -describeSharedTooltip('steppedLine false, stack true, individual false', (ctx: any) => { - ctx.setup(() => { - ctx.data = [ + describe('steppedLine false, stack true, individual false', () => { + const data = [ { data: [ [10, 15], @@ -166,18 +145,19 @@ describeSharedTooltip('steppedLine false, stack true, individual false', (ctx: a hideTooltip: false, }, ]; - ctx.ctrl.panel.stack = true; - ctx.pos = { x: 11 }; + scope.ctrl.panel.stack = true; + const pos = { x: 11 }; + + it('should show stacked value', () => { + // @ts-ignore + const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); + const results = tooltip.getMultiSeriesPlotHoverInfo(data, pos); + expect(results[1].value).toBe(17); + }); }); - it('should show stacked value', () => { - expect(ctx.results[1].value).toBe(17); - }); -}); - -describeSharedTooltip('steppedLine false, stack true, individual false, series stack false', (ctx: any) => { - ctx.setup(() => { - ctx.data = [ + describe('steppedLine false, stack true, individual false, series stack false', () => { + const data = [ { data: [ [10, 15], @@ -211,18 +191,19 @@ describeSharedTooltip('steppedLine false, stack true, individual false, series s hideTooltip: false, }, ]; - ctx.ctrl.panel.stack = true; - ctx.pos = { x: 11 }; + scope.ctrl.panel.stack = true; + const pos = { x: 11 }; + + it('should not show stacked value', () => { + // @ts-ignore + const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); + const results = tooltip.getMultiSeriesPlotHoverInfo(data, pos); + expect(results[1].value).toBe(2); + }); }); - it('should not show stacked value', () => { - expect(ctx.results[1].value).toBe(2); - }); -}); - -describeSharedTooltip('steppedLine false, stack true, individual true', (ctx: any) => { - ctx.setup(() => { - ctx.data = [ + describe('steppedLine false, stack true, individual true', () => { + const data = [ { data: [ [10, 15], @@ -256,12 +237,15 @@ describeSharedTooltip('steppedLine false, stack true, individual true', (ctx: an hideTooltip: false, }, ]; - ctx.ctrl.panel.stack = true; - ctx.ctrl.panel.tooltip.value_type = 'individual'; - ctx.pos = { x: 11 }; - }); + scope.ctrl.panel.stack = true; + scope.ctrl.panel.tooltip.value_type = 'individual'; + const pos = { x: 11 }; - it('should not show stacked value', () => { - expect(ctx.results[1].value).toBe(2); + it('should not show stacked value', () => { + // @ts-ignore + const tooltip = new GraphTooltip(elem, dashboard, scope, getSeriesFn); + const results = tooltip.getMultiSeriesPlotHoverInfo(data, pos); + expect(results[1].value).toBe(2); + }); }); }); diff --git a/public/app/plugins/panel/graph/tab_display.html b/public/app/plugins/panel/graph/tab_display.html index 407c6a01bf0..c8d91f352f8 100644 --- a/public/app/plugins/panel/graph/tab_display.html +++ b/public/app/plugins/panel/graph/tab_display.html @@ -1,4 +1,17 @@
    +
    +
    Migration
    +

    + Consider switching to the Time series visualization type. It is a more capable and performant version of this panel. +

    +

    + +

    +

    Some features like colored time regions and negative transforms are not supported in the new panel yet.

    +
    + Math.round((d - rangeFrom) * widthFactor)) - .attr('y', 0) - .attr('width', Math.round(rangeStep * widthFactor + 1)) // Overlap rectangles to prevent gaps - .attr('height', legendHeight) - .attr('stroke-width', 0) - .attr('fill', (d) => colorScale(d)); + const colorScale = getColorScale(colorScheme, contextSrv.user.lightTheme, rangeTo, rangeFrom); + legend + .append('g') + .attr('class', 'legend-color-bar') + .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)') + .selectAll('.heatmap-color-legend-rect') + .data(valuesRange) + .enter() + .append('rect') + .attr('x', (d) => Math.round((d - rangeFrom) * widthFactor)) + .attr('y', 0) + .attr('width', Math.round(rangeStep * widthFactor + 1)) // Overlap rectangles to prevent gaps + .attr('height', legendHeight) + .attr('stroke-width', 0) + .attr('fill', (d) => colorScale(d)); - drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange); + drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange); + } } function drawOpacityLegend( @@ -138,34 +141,37 @@ function drawOpacityLegend( minValue: number ) { const legendElem = $(elem).find('svg'); - const legend = d3.select(legendElem.get(0)); - clearLegend(elem); + const legendDomElement = legendElem.get(0); + if (legendDomElement) { + const legend = d3.select(legendDomElement); + clearLegend(elem); - const legendWidth = Math.floor(legendElem.outerWidth() ?? 30) - 30; - const legendHeight = legendElem.attr('height') as any; + const legendWidth = Math.floor(legendElem.outerWidth() ?? 30) - 30; + const legendHeight = legendElem.attr('height') as any; - const rangeStep = ((rangeTo - rangeFrom) / legendWidth) * LEGEND_SEGMENT_WIDTH; - const widthFactor = legendWidth / (rangeTo - rangeFrom); - const valuesRange = d3.range(rangeFrom, rangeTo, rangeStep); + const rangeStep = ((rangeTo - rangeFrom) / legendWidth) * LEGEND_SEGMENT_WIDTH; + const widthFactor = legendWidth / (rangeTo - rangeFrom); + const valuesRange = d3.range(rangeFrom, rangeTo, rangeStep); - const opacityScale = getOpacityScale(options, rangeTo, rangeFrom); - legend - .append('g') - .attr('class', 'legend-color-bar') - .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)') - .selectAll('.heatmap-opacity-legend-rect') - .data(valuesRange) - .enter() - .append('rect') - .attr('x', (d) => Math.round((d - rangeFrom) * widthFactor)) - .attr('y', 0) - .attr('width', Math.round(rangeStep * widthFactor)) - .attr('height', legendHeight) - .attr('stroke-width', 0) - .attr('fill', options.cardColor) - .style('opacity', (d) => opacityScale(d)); + const opacityScale = getOpacityScale(options, rangeTo, rangeFrom); + legend + .append('g') + .attr('class', 'legend-color-bar') + .attr('transform', 'translate(' + LEGEND_PADDING_LEFT + ',0)') + .selectAll('.heatmap-opacity-legend-rect') + .data(valuesRange) + .enter() + .append('rect') + .attr('x', (d) => Math.round((d - rangeFrom) * widthFactor)) + .attr('y', 0) + .attr('width', Math.round(rangeStep * widthFactor)) + .attr('height', legendHeight) + .attr('stroke-width', 0) + .attr('fill', options.cardColor) + .style('opacity', (d) => opacityScale(d)); - drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange); + drawLegendValues(elem, rangeFrom, rangeTo, maxValue, minValue, legendWidth, valuesRange); + } } function drawLegendValues( @@ -178,28 +184,31 @@ function drawLegendValues( valuesRange: number[] ) { const legendElem = $(elem).find('svg'); - const legend = d3.select(legendElem.get(0)); + const legendDomElement = legendElem.get(0); + if (legendDomElement) { + const legend = d3.select(legendDomElement); - if (legendWidth <= 0 || legendElem.get(0).childNodes.length === 0) { - return; + if (legendWidth <= 0 || legendDomElement.childNodes.length === 0) { + return; + } + + const legendValueScale = d3.scaleLinear().domain([rangeFrom, rangeTo]).range([0, legendWidth]); + + const ticks = buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue); + const xAxis = d3.axisBottom(legendValueScale).tickValues(ticks).tickSize(LEGEND_TICK_SIZE); + + const colorRect = legendElem.find(':first-child'); + const posY = getSvgElemHeight(legendElem) + LEGEND_VALUE_MARGIN; + const posX = getSvgElemX(colorRect) + LEGEND_PADDING_LEFT; + + d3.select(legendDomElement) + .append('g') + .attr('class', 'axis') + .attr('transform', 'translate(' + posX + ',' + posY + ')') + .call(xAxis); + + legend.select('.axis').select('.domain').remove(); } - - const legendValueScale = d3.scaleLinear().domain([rangeFrom, rangeTo]).range([0, legendWidth]); - - const ticks = buildLegendTicks(rangeFrom, rangeTo, maxValue, minValue); - const xAxis = d3.axisBottom(legendValueScale).tickValues(ticks).tickSize(LEGEND_TICK_SIZE); - - const colorRect = legendElem.find(':first-child'); - const posY = getSvgElemHeight(legendElem) + LEGEND_VALUE_MARGIN; - const posX = getSvgElemX(colorRect) + LEGEND_PADDING_LEFT; - - d3.select(legendElem.get(0)) - .append('g') - .attr('class', 'axis') - .attr('transform', 'translate(' + posX + ',' + posY + ')') - .call(xAxis); - - legend.select('.axis').select('.domain').remove(); } function drawSimpleColorLegend(elem: JQuery, colorScale: any) { @@ -214,51 +223,57 @@ function drawSimpleColorLegend(elem: JQuery, colorScale: any) { const rangeStep = Math.floor(legendWidth / valuesNumber); const valuesRange = d3.range(0, legendWidth, rangeStep); - const legend = d3.select(legendElem.get(0)); - const legendRects = legend.selectAll('.heatmap-color-legend-rect').data(valuesRange); + const legendDomElement = legendElem.get(0); + if (legendDomElement) { + const legend = d3.select(legendDomElement); + const legendRects = legend.selectAll('.heatmap-color-legend-rect').data(valuesRange); - legendRects - .enter() - .append('rect') - .attr('x', (d) => d) - .attr('y', 0) - .attr('width', rangeStep + 1) // Overlap rectangles to prevent gaps - .attr('height', legendHeight) - .attr('stroke-width', 0) - .attr('fill', (d) => colorScale(d)); + legendRects + .enter() + .append('rect') + .attr('x', (d) => d) + .attr('y', 0) + .attr('width', rangeStep + 1) // Overlap rectangles to prevent gaps + .attr('height', legendHeight) + .attr('stroke-width', 0) + .attr('fill', (d) => colorScale(d)); + } } } function drawSimpleOpacityLegend(elem: JQuery, options: { colorScale: string; exponent: number; cardColor: string }) { const legendElem = $(elem).find('svg'); - clearLegend(elem); + const legendDomElement = legendElem.get(0); + if (legendDomElement) { + clearLegend(elem); - const legend = d3.select(legendElem.get(0)); - const legendWidth = Math.floor(legendElem.outerWidth() ?? 30); - const legendHeight = legendElem.attr('height') as any; + const legend = d3.select(legendDomElement); + const legendWidth = Math.floor(legendElem.outerWidth() ?? 30); + const legendHeight = legendElem.attr('height') as any; - if (legendWidth) { - let legendOpacityScale: any; - if (options.colorScale === 'linear') { - legendOpacityScale = d3.scaleLinear().domain([0, legendWidth]).range([0, 1]); - } else if (options.colorScale === 'sqrt') { - legendOpacityScale = d3.scalePow().exponent(options.exponent).domain([0, legendWidth]).range([0, 1]); + if (legendWidth) { + let legendOpacityScale: any; + if (options.colorScale === 'linear') { + legendOpacityScale = d3.scaleLinear().domain([0, legendWidth]).range([0, 1]); + } else if (options.colorScale === 'sqrt') { + legendOpacityScale = d3.scalePow().exponent(options.exponent).domain([0, legendWidth]).range([0, 1]); + } + + const rangeStep = 10; + const valuesRange = d3.range(0, legendWidth, rangeStep); + const legendRects = legend.selectAll('.heatmap-opacity-legend-rect').data(valuesRange); + + legendRects + .enter() + .append('rect') + .attr('x', (d) => d) + .attr('y', 0) + .attr('width', rangeStep) + .attr('height', legendHeight) + .attr('stroke-width', 0) + .attr('fill', getColorForTheme(options.cardColor, config.theme)) + .style('opacity', (d) => legendOpacityScale(d)); } - - const rangeStep = 10; - const valuesRange = d3.range(0, legendWidth, rangeStep); - const legendRects = legend.selectAll('.heatmap-opacity-legend-rect').data(valuesRange); - - legendRects - .enter() - .append('rect') - .attr('x', (d) => d) - .attr('y', 0) - .attr('width', rangeStep) - .attr('height', legendHeight) - .attr('stroke-width', 0) - .attr('fill', getColorForTheme(options.cardColor, config.theme)) - .style('opacity', (d) => legendOpacityScale(d)); } } diff --git a/public/app/plugins/panel/histogram/models.gen.ts b/public/app/plugins/panel/histogram/models.gen.ts index 8b1c0cfb095..1b1b9315c44 100644 --- a/public/app/plugins/panel/histogram/models.gen.ts +++ b/public/app/plugins/panel/histogram/models.gen.ts @@ -10,6 +10,7 @@ import { TooltipDisplayMode, GraphGradientMode, HideableFieldConfig, + SortOrder, } from '@grafana/schema'; export const modelVersion = Object.freeze([1, 0]); @@ -29,6 +30,7 @@ export const defaultPanelOptions: PanelOptions = { }, tooltip: { mode: TooltipDisplayMode.Multi, + sort: SortOrder.None, }, }; diff --git a/public/app/plugins/panel/icon/IconPanel.tsx b/public/app/plugins/panel/icon/IconPanel.tsx index 7e4cced6a90..41f244db6b8 100644 --- a/public/app/plugins/panel/icon/IconPanel.tsx +++ b/public/app/plugins/panel/icon/IconPanel.tsx @@ -8,9 +8,11 @@ import { DimensionContext, getColorDimensionFromData, getResourceDimensionFromData, + getScalarDimensionFromData, getScaleDimensionFromData, getTextDimensionFromData, ResourceDimensionConfig, + ScalarDimensionConfig, ScaleDimensionConfig, TextDimensionConfig, } from 'app/features/dimensions'; @@ -27,14 +29,30 @@ export class IconPanel extends Component { initElement = (props: Props) => { this.element = new ElementState(iconItem, props.options.root as any); - this.element.updateSize(props.width, props.height); + this.updateSize(props); this.element.updateData(this.dims); return this.element; }; + updateSize = (props: Props) => { + const { width, height } = props; + this.element.anchor = { + top: true, + left: true, + }; + this.element.placement = { + left: 0, + top: 0, + width, + height, + }; + this.element.updateSize(width, height); + }; + dims: DimensionContext = { getColor: (color: ColorDimensionConfig) => getColorDimensionFromData(this.props.data, color), getScale: (scale: ScaleDimensionConfig) => getScaleDimensionFromData(this.props.data, scale), + getScalar: (scalar: ScalarDimensionConfig) => getScalarDimensionFromData(this.props.data, scalar), getText: (text: TextDimensionConfig) => getTextDimensionFromData(this.props.data, text), getResource: (res: ResourceDimensionConfig) => getResourceDimensionFromData(this.props.data, res), }; @@ -44,7 +62,7 @@ export class IconPanel extends Component { let changed = false; if (width !== nextProps.width || height !== nextProps.height) { - this.element.updateSize(nextProps.width, nextProps.height); + this.updateSize(nextProps); changed = true; } if (data !== nextProps.data) { diff --git a/public/app/plugins/panel/icon/models.gen.ts b/public/app/plugins/panel/icon/models.gen.ts index e5809913201..88be0c8b337 100644 --- a/public/app/plugins/panel/icon/models.gen.ts +++ b/public/app/plugins/panel/icon/models.gen.ts @@ -8,7 +8,7 @@ import { IconConfig } from 'app/features/canvas/elements/icon'; import { ResourceDimensionMode } from 'app/features/dimensions'; export interface PanelOptions { - root: Omit, 'type'>; // type is forced + root: Omit, 'type' | 'name'>; // type is forced } export const defaultPanelOptions: PanelOptions = { diff --git a/public/app/plugins/panel/live/LiveChannelEditor.tsx b/public/app/plugins/panel/live/LiveChannelEditor.tsx index b347248df00..987ea44efa3 100644 --- a/public/app/plugins/panel/live/LiveChannelEditor.tsx +++ b/public/app/plugins/panel/live/LiveChannelEditor.tsx @@ -4,14 +4,12 @@ import { Select, Alert, Label, stylesFactory } from '@grafana/ui'; import { LiveChannelScope, LiveChannelAddress, - LiveChannelSupport, SelectableValue, StandardEditorProps, GrafanaTheme, } from '@grafana/data'; import { LivePanelOptions } from './types'; -import { getGrafanaLiveCentrifugeSrv } from 'app/features/live/live'; import { config } from 'app/core/config'; type Props = StandardEditorProps; @@ -25,7 +23,6 @@ const scopes: Array> = [ interface State { namespaces: Array>; paths: Array>; - support?: LiveChannelSupport; } export class LiveChannelEditor extends PureComponent { @@ -45,15 +42,8 @@ export class LiveChannelEditor extends PureComponent { } async updateSelectOptions() { - const { value } = this.props; - const { scope, namespace } = value; - const srv = getGrafanaLiveCentrifugeSrv(); - const namespaces = await srv.scopes[scope].listNamespaces(); - const support = namespace ? await srv.scopes[scope].getChannelSupport(namespace) : undefined; - this.setState({ - namespaces, - support, + namespaces: [], paths: [], }); } diff --git a/public/app/plugins/panel/live/LivePanel.tsx b/public/app/plugins/panel/live/LivePanel.tsx index 33ec45ca85e..b84332f7729 100755 --- a/public/app/plugins/panel/live/LivePanel.tsx +++ b/public/app/plugins/panel/live/LivePanel.tsx @@ -13,7 +13,6 @@ import { PanelData, LoadingState, applyFieldOverrides, - StreamingDataFrame, LiveChannelAddress, } from '@grafana/data'; import { TablePanel } from '../table/TablePanel'; @@ -21,6 +20,7 @@ import { LivePanelOptions, MessageDisplayMode } from './types'; import { config, getGrafanaLiveSrv } from '@grafana/runtime'; import { css, cx } from '@emotion/css'; import { isEqual } from 'lodash'; +import { StreamingDataFrame } from 'app/features/live/data/StreamingDataFrame'; interface Props extends PanelProps {} diff --git a/public/app/plugins/panel/logs/LogsPanel.tsx b/public/app/plugins/panel/logs/LogsPanel.tsx index 7df81c7b65f..d5cc9973979 100644 --- a/public/app/plugins/panel/logs/LogsPanel.tsx +++ b/public/app/plugins/panel/logs/LogsPanel.tsx @@ -15,6 +15,7 @@ import { Options } from './types'; import { dataFrameToLogsModel, dedupLogRows } from 'app/core/logs_model'; import { getFieldLinksForExplore } from 'app/features/explore/utils/links'; import { COMMON_LABELS } from '../../../core/logs_model'; +import { PanelDataErrorView } from 'app/features/panel/components/PanelDataErrorView'; interface LogsPanelProps extends PanelProps {} @@ -32,6 +33,7 @@ export const LogsPanel: React.FunctionComponent = ({ enableLogDetails, }, title, + id, }) => { const isAscending = sortOrder === LogsSortOrder.Ascending; const style = useStyles2(getStyles(title, isAscending)); @@ -80,12 +82,8 @@ export const LogsPanel: React.FunctionComponent = ({ [data] ); - if (!data) { - return ( -
    -

    No data found in response

    -
    - ); + if (!data || logRows.length === 0) { + return ; } const renderCommonLabels = () => ( diff --git a/public/app/plugins/panel/logs/module.tsx b/public/app/plugins/panel/logs/module.tsx index 158ac5ffcf7..d27bf0dc627 100644 --- a/public/app/plugins/panel/logs/module.tsx +++ b/public/app/plugins/panel/logs/module.tsx @@ -1,81 +1,84 @@ import { PanelPlugin, LogsSortOrder, LogsDedupStrategy, LogsDedupDescription } from '@grafana/data'; import { Options } from './types'; import { LogsPanel } from './LogsPanel'; +import { LogsPanelSuggestionsSupplier } from './suggestions'; -export const plugin = new PanelPlugin(LogsPanel).setPanelOptions((builder) => { - builder - .addBooleanSwitch({ - path: 'showTime', - name: 'Time', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'showLabels', - name: 'Unique labels', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'showCommonLabels', - name: 'Common labels', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'wrapLogMessage', - name: 'Wrap lines', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'prettifyLogMessage', - name: 'Prettify JSON', - description: '', - defaultValue: false, - }) - .addBooleanSwitch({ - path: 'enableLogDetails', - name: 'Enable log details', - description: '', - defaultValue: true, - }) - .addRadio({ - path: 'dedupStrategy', - name: 'Deduplication', - description: '', - settings: { - options: [ - { value: LogsDedupStrategy.none, label: 'None', description: LogsDedupDescription[LogsDedupStrategy.none] }, - { - value: LogsDedupStrategy.exact, - label: 'Exact', - description: LogsDedupDescription[LogsDedupStrategy.exact], - }, - { - value: LogsDedupStrategy.numbers, - label: 'Numbers', - description: LogsDedupDescription[LogsDedupStrategy.numbers], - }, - { - value: LogsDedupStrategy.signature, - label: 'Signature', - description: LogsDedupDescription[LogsDedupStrategy.signature], - }, - ], - }, - defaultValue: LogsDedupStrategy.none, - }) - .addRadio({ - path: 'sortOrder', - name: 'Order', - description: '', - settings: { - options: [ - { value: LogsSortOrder.Descending, label: 'Descending' }, - { value: LogsSortOrder.Ascending, label: 'Ascending' }, - ], - }, - defaultValue: LogsSortOrder.Descending, - }); -}); +export const plugin = new PanelPlugin(LogsPanel) + .setPanelOptions((builder) => { + builder + .addBooleanSwitch({ + path: 'showTime', + name: 'Time', + description: '', + defaultValue: false, + }) + .addBooleanSwitch({ + path: 'showLabels', + name: 'Unique labels', + description: '', + defaultValue: false, + }) + .addBooleanSwitch({ + path: 'showCommonLabels', + name: 'Common labels', + description: '', + defaultValue: false, + }) + .addBooleanSwitch({ + path: 'wrapLogMessage', + name: 'Wrap lines', + description: '', + defaultValue: false, + }) + .addBooleanSwitch({ + path: 'prettifyLogMessage', + name: 'Prettify JSON', + description: '', + defaultValue: false, + }) + .addBooleanSwitch({ + path: 'enableLogDetails', + name: 'Enable log details', + description: '', + defaultValue: true, + }) + .addRadio({ + path: 'dedupStrategy', + name: 'Deduplication', + description: '', + settings: { + options: [ + { value: LogsDedupStrategy.none, label: 'None', description: LogsDedupDescription[LogsDedupStrategy.none] }, + { + value: LogsDedupStrategy.exact, + label: 'Exact', + description: LogsDedupDescription[LogsDedupStrategy.exact], + }, + { + value: LogsDedupStrategy.numbers, + label: 'Numbers', + description: LogsDedupDescription[LogsDedupStrategy.numbers], + }, + { + value: LogsDedupStrategy.signature, + label: 'Signature', + description: LogsDedupDescription[LogsDedupStrategy.signature], + }, + ], + }, + defaultValue: LogsDedupStrategy.none, + }) + .addRadio({ + path: 'sortOrder', + name: 'Order', + description: '', + settings: { + options: [ + { value: LogsSortOrder.Descending, label: 'Descending' }, + { value: LogsSortOrder.Ascending, label: 'Ascending' }, + ], + }, + defaultValue: LogsSortOrder.Descending, + }); + }) + .setSuggestionsSupplier(new LogsPanelSuggestionsSupplier()); diff --git a/public/app/plugins/panel/logs/suggestions.ts b/public/app/plugins/panel/logs/suggestions.ts new file mode 100644 index 00000000000..5a0562a4296 --- /dev/null +++ b/public/app/plugins/panel/logs/suggestions.ts @@ -0,0 +1,32 @@ +import { VisualizationSuggestionsBuilder, VisualizationSuggestionScore } from '@grafana/data'; +import { SuggestionName } from 'app/types/suggestions'; +import { Options } from './types'; + +export class LogsPanelSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const list = builder.getListAppender({ + name: '', + pluginId: 'logs', + options: {}, + fieldConfig: { + defaults: { + custom: {}, + }, + overrides: [], + }, + }); + + const { dataSummary: ds } = builder; + + // Require a string & time field + if (!ds.hasData || !ds.hasTimeField || !ds.hasStringField) { + return; + } + + if (ds.preferredVisualisationType === 'logs') { + list.append({ name: SuggestionName.Logs, score: VisualizationSuggestionScore.Best }); + } else { + list.append({ name: SuggestionName.Logs }); + } + } +} diff --git a/public/app/plugins/panel/news/NewsPanel.tsx b/public/app/plugins/panel/news/NewsPanel.tsx index 6903840fc0e..e44151cf27a 100755 --- a/public/app/plugins/panel/news/NewsPanel.tsx +++ b/public/app/plugins/panel/news/NewsPanel.tsx @@ -14,6 +14,8 @@ import { NewsItem } from './types'; import { PanelOptions } from './models.gen'; import { DEFAULT_FEED_URL, PROXY_PREFIX } from './constants'; import { css, cx } from '@emotion/css'; +import { RefreshEvent } from '@grafana/runtime'; +import { Unsubscribable } from 'rxjs'; interface Props extends PanelProps {} @@ -23,9 +25,11 @@ interface State { } export class NewsPanel extends PureComponent { + private refreshSubscription: Unsubscribable; + constructor(props: Props) { super(props); - + this.refreshSubscription = this.props.eventBus.subscribe(RefreshEvent, this.loadChannel.bind(this)); this.state = {}; } @@ -33,6 +37,10 @@ export class NewsPanel extends PureComponent { this.loadChannel(); } + componentWillUnmount(): void { + this.refreshSubscription.unsubscribe(); + } + componentDidUpdate(prevProps: Props): void { if (this.props.options.feedUrl !== prevProps.options.feedUrl) { this.loadChannel(); @@ -164,7 +172,6 @@ const getStyles = stylesFactory((theme: GrafanaTheme2) => ({ } `, title: css` - max-width: calc(100% - 70px); font-size: 16px; margin-bottom: ${theme.spacing(0.5)}; `, diff --git a/public/app/plugins/panel/nodeGraph/Marker.tsx b/public/app/plugins/panel/nodeGraph/Marker.tsx index cee0ff33b93..89ef5c9512f 100644 --- a/public/app/plugins/panel/nodeGraph/Marker.tsx +++ b/public/app/plugins/panel/nodeGraph/Marker.tsx @@ -1,7 +1,7 @@ import React, { MouseEvent, memo } from 'react'; import { NodesMarker } from './types'; import { GrafanaTheme } from '@grafana/data'; -import { css } from 'emotion'; +import { css } from '@emotion/css'; import { stylesFactory, useTheme } from '@grafana/ui'; const nodeR = 40; diff --git a/public/app/plugins/panel/nodeGraph/Node.tsx b/public/app/plugins/panel/nodeGraph/Node.tsx index d0c712f65ee..44772bad586 100644 --- a/public/app/plugins/panel/nodeGraph/Node.tsx +++ b/public/app/plugins/panel/nodeGraph/Node.tsx @@ -3,7 +3,7 @@ import cx from 'classnames'; import { Field, getFieldColorModeForField, GrafanaTheme2 } from '@grafana/data'; import { useStyles2, useTheme2 } from '@grafana/ui'; import { NodeDatum } from './types'; -import { css } from 'emotion'; +import { css } from '@emotion/css'; import tinycolor from 'tinycolor2'; import { statToString } from './utils'; @@ -87,7 +87,7 @@ export const Node = memo(function Node(props: { {hovering && } - +
    {node.mainStat && statToString(node.mainStat, node.dataFrameRowIndex)}
    @@ -98,7 +98,7 @@ export const Node = memo(function Node(props: { x={node.x - (hovering ? 100 : 50)} y={node.y + nodeR + 5} width={hovering ? '200' : '100'} - height="30" + height="40" >
    {node.title} diff --git a/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx b/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx index 19b562191dc..58fa20e928f 100644 --- a/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx +++ b/public/app/plugins/panel/nodeGraph/NodeGraph.test.tsx @@ -3,7 +3,6 @@ import { render, screen, fireEvent, waitFor, getByText } from '@testing-library/ import userEvent from '@testing-library/user-event'; import { NodeGraph } from './NodeGraph'; import { makeEdgesDataFrame, makeNodesDataFrame } from './utils'; -jest.mock('./layout.worker.js'); jest.mock('react-use/lib/useMeasure', () => { return { @@ -15,12 +14,14 @@ jest.mock('react-use/lib/useMeasure', () => { }); describe('NodeGraph', () => { - it('doesnt fail without any data', async () => { + it('shows no data message without any data', async () => { render( []} />); + + await screen.findByText('No data'); }); it('can zoom in and out', async () => { - render( []} />); + render( []} />); const zoomIn = await screen.findByTitle(/Zoom in/); const zoomOut = await screen.findByTitle(/Zoom out/); diff --git a/public/app/plugins/panel/nodeGraph/NodeGraph.tsx b/public/app/plugins/panel/nodeGraph/NodeGraph.tsx index bbd682ca892..7e011c9d322 100644 --- a/public/app/plugins/panel/nodeGraph/NodeGraph.tsx +++ b/public/app/plugins/panel/nodeGraph/NodeGraph.tsx @@ -44,6 +44,15 @@ const getStyles = (theme: GrafanaTheme2) => ({ user-select: none; `, + noDataMsg: css` + height: 100%; + width: 100%; + display: grid; + place-items: center; + font-size: ${theme.typography.h4.fontSize}; + color: ${theme.colors.text.secondary}; + `, + mainGroup: css` label: mainGroup; will-change: transform; @@ -67,6 +76,9 @@ const getStyles = (theme: GrafanaTheme2) => ({ padding-bottom: 5px; margin-right: 10px; `, + viewControlsWrapper: css` + margin-left: auto; + `, alert: css` label: alert; padding: 5px 8px; @@ -177,42 +189,46 @@ export function NodeGraph({ getLinks, dataFrames, nodeLimit }: Props) {
    ) : null} - - - - {!config.gridLayout && ( - + + {!config.gridLayout && ( + + )} + - )} - - - {/*We split the labels from edges so that they are shown on top of everything else*/} - {!config.gridLayout && } - - + + {/*We split the labels from edges so that they are shown on top of everything else*/} + {!config.gridLayout && } + + + ) : ( +
    No data
    + )}
    - {nodes.length && ( + {nodes.length ? (
    - )} + ) : null} - - config={config} - onConfigChange={(cfg) => { - if (cfg.gridLayout !== config.gridLayout) { - setFocusedNodeId(undefined); - } - setConfig(cfg); - }} - onMinus={onStepDown} - onPlus={onStepUp} - scale={scale} - disableZoomIn={isMaxZoom} - disableZoomOut={isMinZoom} - /> +
    + + config={config} + onConfigChange={(cfg) => { + if (cfg.gridLayout !== config.gridLayout) { + setFocusedNodeId(undefined); + } + setConfig(cfg); + }} + onMinus={onStepDown} + onPlus={onStepUp} + scale={scale} + disableZoomIn={isMaxZoom} + disableZoomOut={isMinZoom} + /> +
    {hiddenNodesCount > 0 && ( diff --git a/public/app/plugins/panel/nodeGraph/__mocks__/layout.worker.js b/public/app/plugins/panel/nodeGraph/__mocks__/layout.worker.js index 39c401010e6..e69de29bb2d 100644 --- a/public/app/plugins/panel/nodeGraph/__mocks__/layout.worker.js +++ b/public/app/plugins/panel/nodeGraph/__mocks__/layout.worker.js @@ -1,12 +0,0 @@ -const { layout } = jest.requireActual('../layout.worker.js'); - -export default class TestWorker { - constructor() {} - postMessage(data) { - const { nodes, edges, config } = data; - setTimeout(() => { - layout(nodes, edges, config); - this.onmessage({ data: { nodes, edges } }); - }, 1); - } -} diff --git a/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts b/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts new file mode 100644 index 00000000000..1aa1f1e9083 --- /dev/null +++ b/public/app/plugins/panel/nodeGraph/createLayoutWorker.ts @@ -0,0 +1,3 @@ +import { CorsWorker as Worker } from 'app/core/utils/CorsWorker'; + +export const createWorker = () => new Worker(new URL('./layout.worker.js', import.meta.url)); diff --git a/public/app/plugins/panel/nodeGraph/layout.test.ts b/public/app/plugins/panel/nodeGraph/layout.test.ts new file mode 100644 index 00000000000..4783832bfad --- /dev/null +++ b/public/app/plugins/panel/nodeGraph/layout.test.ts @@ -0,0 +1,88 @@ +import { renderHook } from '@testing-library/react-hooks'; +import { useLayout } from './layout'; +import { EdgeDatum, NodeDatum } from './types'; + +let onmessage: jest.MockedFunction; +let postMessage: jest.MockedFunction; +let terminate: jest.MockedFunction; + +jest.mock('./createLayoutWorker', () => { + return { + __esModule: true, + createWorker: () => { + onmessage = jest.fn(); + postMessage = jest.fn(); + terminate = jest.fn(); + return { + onmessage: onmessage, + postMessage: postMessage, + terminate: terminate, + }; + }, + }; +}); + +describe('layout', () => { + it('doesnt fail without any data', async () => { + const nodes: NodeDatum[] = []; + const edges: EdgeDatum[] = []; + + const { result } = renderHook(() => { + return useLayout(nodes, edges, undefined, 100, 1000); + }); + expect(result.current.nodes).toEqual([]); + expect(result.current.edges).toEqual([]); + expect(postMessage).toBeUndefined(); + }); + + it('cancels worker', async () => { + const { result, rerender } = renderHook( + ({ nodes, edges }) => { + return useLayout(nodes, edges, undefined, 100, 1000); + }, + { + initialProps: { + nodes: [makeNode(0, 0), makeNode(1, 1)], + edges: [makeEdge(0, 1)], + }, + } + ); + expect(postMessage).toBeCalledTimes(1); + // Bit convoluted but we cannot easily access the worker instance as we only export constructor so the default + // export is class and we only store latest instance of the methods as jest.fn here as module local variables. + // So we capture the terminate function from current worker so that when we call rerender and new worker is created + // we can still access and check the method from the old one that we assume should be canceled. + const localTerminate = terminate; + + rerender({ + nodes: [], + edges: [], + }); + + expect(result.current.nodes).toEqual([]); + expect(result.current.edges).toEqual([]); + expect(localTerminate).toBeCalledTimes(1); + }); +}); + +function makeNode(index: number, incoming: number): NodeDatum { + return { + id: `n${index}`, + title: `n${index}`, + subTitle: '', + dataFrameRowIndex: 0, + incoming, + arcSections: [], + }; +} + +function makeEdge(source: number, target: number): EdgeDatum { + return { + id: `${source}-${target}`, + source: 'n' + source, + target: 'n' + target, + mainStat: '', + secondaryStat: '', + dataFrameRowIndex: 0, + }; +} diff --git a/public/app/plugins/panel/nodeGraph/layout.ts b/public/app/plugins/panel/nodeGraph/layout.ts index 6087c04f6f2..2745e686fcb 100644 --- a/public/app/plugins/panel/nodeGraph/layout.ts +++ b/public/app/plugins/panel/nodeGraph/layout.ts @@ -1,11 +1,11 @@ -import { useEffect, useMemo, useState } from 'react'; +import { useEffect, useMemo, useRef, useState } from 'react'; import { EdgeDatum, EdgeDatumLayout, NodeDatum } from './types'; import { Field } from '@grafana/data'; import { useNodeLimit } from './useNodeLimit'; import useMountedState from 'react-use/lib/useMountedState'; import { graphBounds } from './utils'; -// @ts-ignore -import LayoutWorker from './layout.worker.js'; +import { createWorker } from './createLayoutWorker'; +import { useUnmount } from 'react-use'; export interface Config { linkDistance: number; @@ -53,6 +53,13 @@ export function useLayout( const [loading, setLoading] = useState(false); const isMounted = useMountedState(); + const layoutWorkerCancelRef = useRef<(() => void) | undefined>(); + + useUnmount(() => { + if (layoutWorkerCancelRef.current) { + layoutWorkerCancelRef.current(); + } + }); // Also we compute both layouts here. Grid layout should not add much time and we can more easily just cache both // so this should happen only once for a given response data. @@ -70,6 +77,7 @@ export function useLayout( if (rawNodes.length === 0) { setNodesGraph([]); setEdgesGraph([]); + setLoading(false); return; } @@ -77,14 +85,15 @@ export function useLayout( // This is async but as I wanted to still run the sync grid layout and you cannot return promise from effect so // having callback seems ok here. - defaultLayout(rawNodes, rawEdges, ({ nodes, edges }) => { - // TODO: it would be better to cancel the worker somehow but probably not super important right now. + const cancel = defaultLayout(rawNodes, rawEdges, ({ nodes, edges }) => { if (isMounted()) { setNodesGraph(nodes); setEdgesGraph(edges as EdgeDatumLayout[]); setLoading(false); } }); + layoutWorkerCancelRef.current = cancel; + return cancel; }, [rawNodes, rawEdges, isMounted]); // Compute grid separately as it is sync and do not need to be inside effect. Also it is dependant on width while @@ -129,13 +138,14 @@ export function useLayout( /** * Wraps the layout code in a worker as it can take long and we don't want to block the main thread. + * Returns a cancel function to terminate the worker. */ function defaultLayout( nodes: NodeDatum[], edges: EdgeDatum[], done: (data: { nodes: NodeDatum[]; edges: EdgeDatum[] }) => void ) { - const worker = new LayoutWorker(); + const worker = createWorker(); worker.onmessage = (event: MessageEvent<{ nodes: NodeDatum[]; edges: EdgeDatumLayout[] }>) => { for (let i = 0; i < nodes.length; i++) { // These stats needs to be Field class but the data is stringified over the worker boundary @@ -155,6 +165,10 @@ function defaultLayout( edges, config: defaultConfig, }); + + return () => { + worker.terminate(); + }; } /** diff --git a/public/app/plugins/panel/nodeGraph/useZoom.ts b/public/app/plugins/panel/nodeGraph/useZoom.ts index 0c157f41943..9eb924fae58 100644 --- a/public/app/plugins/panel/nodeGraph/useZoom.ts +++ b/public/app/plugins/panel/nodeGraph/useZoom.ts @@ -53,14 +53,18 @@ export function useZoom({ stepUp, stepDown, min, max } = defaultOptions) { if (wheelEvent.ctrlKey || wheelEvent.metaKey) { event.preventDefault(); + setScale(Math.min(Math.max(min ?? -Infinity, scale + Math.min(wheelEvent.deltaY, 2) * -0.01), max ?? Infinity)); + if (wheelEvent.deltaY < 0) { - onStepUp(); + const newScale = scale + Math.max(wheelEvent.deltaY, -4) * -0.015; + setScale(Math.max(min ?? -Infinity, newScale)); } else if (wheelEvent.deltaY > 0) { - onStepDown(); + const newScale = scale + Math.min(wheelEvent.deltaY, 4) * -0.015; + setScale(Math.min(max ?? Infinity, newScale)); } } }, - [onStepDown, onStepUp] + [min, max, scale] ); useEffect(() => { diff --git a/public/app/plugins/panel/piechart/PieChart.tsx b/public/app/plugins/panel/piechart/PieChart.tsx index c0d53ec1a16..f264034a7bd 100644 --- a/public/app/plugins/panel/piechart/PieChart.tsx +++ b/public/app/plugins/panel/piechart/PieChart.tsx @@ -299,7 +299,7 @@ function PieLabel({ arc, outerRadius, innerRadius, displayLabels, total, color, )} {displayLabels.includes(PieChartLabels.Percent) && ( - {((arc.data.display.numeric / total) * 100).toFixed(0) + '%'} + {((arc.data.display.numeric / total) * 100).toFixed(arc.data.field.decimals ?? 0) + '%'} )} diff --git a/public/app/plugins/panel/piechart/PieChartPanel.tsx b/public/app/plugins/panel/piechart/PieChartPanel.tsx index b8e87a8cd72..a1ba2a08a3a 100644 --- a/public/app/plugins/panel/piechart/PieChartPanel.tsx +++ b/public/app/plugins/panel/piechart/PieChartPanel.tsx @@ -123,7 +123,7 @@ function getLegend(props: Props, displayValues: FieldDisplay[]) { text: hidden || isNaN(fractionOfTotal) ? props.fieldConfig.defaults.noValue ?? '-' - : percentOfTotal.toFixed(0) + '%', + : percentOfTotal.toFixed(value.field.decimals ?? 0) + '%', title: valuesToShow.length > 1 ? 'Percent' : '', }); } diff --git a/public/app/plugins/panel/piechart/module.tsx b/public/app/plugins/panel/piechart/module.tsx index b9daf3a5bf4..57c1ec8d209 100644 --- a/public/app/plugins/panel/piechart/module.tsx +++ b/public/app/plugins/panel/piechart/module.tsx @@ -5,6 +5,7 @@ import { LegendDisplayMode } from '@grafana/schema'; import { commonOptionsBuilder } from '@grafana/ui'; import { PieChartPanelChangedHandler } from './migrations'; import { addStandardDataReduceOptions } from '../stat/types'; +import { PieChartSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(PieChartPanel) .setPanelChangeHandler(PieChartPanelChangedHandler) @@ -69,4 +70,5 @@ export const plugin = new PanelPlugin(PieChartPanel) }, showIf: (c) => c.legend.displayMode !== LegendDisplayMode.Hidden, }); - }); + }) + .setSuggestionsSupplier(new PieChartSuggestionsSupplier()); diff --git a/public/app/plugins/panel/piechart/suggestions.ts b/public/app/plugins/panel/piechart/suggestions.ts new file mode 100644 index 00000000000..aa3f0b055cc --- /dev/null +++ b/public/app/plugins/panel/piechart/suggestions.ts @@ -0,0 +1,81 @@ +import { VisualizationSuggestionsBuilder } from '@grafana/data'; +import { LegendDisplayMode } from '@grafana/schema'; +import { SuggestionName } from 'app/types/suggestions'; +import { PieChartLabels, PieChartOptions, PieChartType } from './types'; + +export class PieChartSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const list = builder.getListAppender({ + name: SuggestionName.PieChart, + pluginId: 'piechart', + options: { + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + displayLabels: [PieChartLabels.Percent], + legend: { + placement: 'right', + values: [], + } as any, + }, + cardOptions: { + previewModifier: (s) => { + // Hide labels in preview + s.options!.legend.displayMode = LegendDisplayMode.Hidden; + }, + }, + }); + + const { dataSummary } = builder; + + if (!dataSummary.hasNumberField) { + return; + } + + if (dataSummary.hasStringField && dataSummary.frameCount === 1) { + // if many values this or single value PieChart is not a good option + if (dataSummary.rowCountTotal > 30 || dataSummary.rowCountTotal < 2) { + return; + } + + list.append({ + name: SuggestionName.PieChart, + options: { + reduceOptions: { + values: true, + calcs: [], + }, + }, + }); + + list.append({ + name: SuggestionName.PieChartDonut, + options: { + reduceOptions: { + values: true, + calcs: [], + }, + pieType: PieChartType.Donut, + }, + }); + + return; + } + + if (dataSummary.numberFieldCount > 30 || dataSummary.numberFieldCount < 2) { + return; + } + + list.append({ + name: SuggestionName.PieChart, + }); + + list.append({ + name: SuggestionName.PieChartDonut, + options: { + pieType: PieChartType.Donut, + }, + }); + } +} diff --git a/public/app/plugins/panel/stat/module.tsx b/public/app/plugins/panel/stat/module.tsx index ecec3308d9d..411a5607ee4 100644 --- a/public/app/plugins/panel/stat/module.tsx +++ b/public/app/plugins/panel/stat/module.tsx @@ -8,6 +8,7 @@ import { PanelPlugin } from '@grafana/data'; import { addOrientationOption, addStandardDataReduceOptions, StatPanelOptions } from './types'; import { StatPanel } from './StatPanel'; import { statPanelChangedHandler } from './StatMigrations'; +import { StatSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(StatPanel) .useFieldConfig() @@ -77,4 +78,5 @@ export const plugin = new PanelPlugin(StatPanel) }) .setNoPadding() .setPanelChangeHandler(statPanelChangedHandler) + .setSuggestionsSupplier(new StatSuggestionsSupplier()) .setMigrationHandler(sharedSingleStatMigrationHandler); diff --git a/public/app/plugins/panel/stat/suggestions.ts b/public/app/plugins/panel/stat/suggestions.ts new file mode 100644 index 00000000000..b94620205d4 --- /dev/null +++ b/public/app/plugins/panel/stat/suggestions.ts @@ -0,0 +1,97 @@ +import { VisualizationSuggestionsBuilder } from '@grafana/data'; +import { BigValueColorMode, BigValueGraphMode } from '@grafana/ui'; +import { SuggestionName } from 'app/types/suggestions'; +import { StatPanelOptions } from './types'; + +export class StatSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary: ds } = builder; + + if (!ds.hasData) { + return; + } + + const list = builder.getListAppender({ + name: SuggestionName.Stat, + pluginId: 'stat', + options: {}, + fieldConfig: { + defaults: { + unit: 'short', + custom: {}, + }, + overrides: [], + }, + cardOptions: { + previewModifier: (s) => { + if (s.options!.reduceOptions.values) { + s.options!.reduceOptions.limit = 1; + } + }, + }, + }); + + // String and number field with low row count show individual rows + if (ds.hasStringField && ds.hasNumberField && ds.frameCount === 1 && ds.rowCountTotal < 10) { + list.append({ + name: SuggestionName.Stat, + options: { + reduceOptions: { + values: true, + calcs: [], + fields: '/.*/', + }, + }, + }); + list.append({ + name: SuggestionName.StatColoredBackground, + options: { + reduceOptions: { + values: true, + calcs: [], + fields: '/.*/', + }, + colorMode: BigValueColorMode.Background, + }, + }); + } + + // Just a single string field + if (ds.stringFieldCount === 1 && ds.frameCount === 1 && ds.rowCountTotal < 10 && ds.fieldCount === 1) { + list.append({ + name: SuggestionName.Stat, + options: { + reduceOptions: { + values: true, + calcs: [], + fields: '/.*/', + }, + colorMode: BigValueColorMode.None, + }, + }); + } + + if (ds.hasNumberField && ds.hasTimeField) { + list.append({ + options: { + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + }, + }); + + list.append({ + name: SuggestionName.StatColoredBackground, + options: { + reduceOptions: { + values: false, + calcs: ['lastNotNull'], + }, + graphMode: BigValueGraphMode.None, + colorMode: BigValueColorMode.Background, + }, + }); + } + } +} diff --git a/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx b/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx index ba9cb48851a..f998bbaf660 100755 --- a/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx +++ b/public/app/plugins/panel/state-timeline/StateTimelinePanel.tsx @@ -1,11 +1,11 @@ import React, { useCallback, useMemo } from 'react'; -import { DataFrame, PanelProps } from '@grafana/data'; -import { TooltipPlugin, useTheme2, ZoomPlugin } from '@grafana/ui'; +import { DataFrame, FieldType, PanelProps } from '@grafana/data'; +import { TooltipPlugin, useTheme2, ZoomPlugin, usePanelContext } from '@grafana/ui'; import { TimelineMode, TimelineOptions } from './types'; import { TimelineChart } from './TimelineChart'; import { prepareTimelineFields, prepareTimelineLegendItems } from './utils'; import { StateTimelineTooltip } from './StateTimelineTooltip'; -import { getLastStreamingDataFramePacket } from '@grafana/data/src/dataframe/StreamingDataFrame'; +import { getLastStreamingDataFramePacket } from 'app/features/live/data/StreamingDataFrame'; interface TimelinePanelProps extends PanelProps {} @@ -22,6 +22,7 @@ export const StateTimelinePanel: React.FC = ({ onChangeTimeRange, }) => { const theme = useTheme2(); + const { sync } = usePanelContext(); const { frames, warn } = useMemo(() => prepareTimelineFields(data?.series, options.mergeValues ?? true, theme), [ data, @@ -38,6 +39,12 @@ export const StateTimelinePanel: React.FC = ({ const renderCustomTooltip = useCallback( (alignedData: DataFrame, seriesIdx: number | null, datapointIdx: number | null) => { const data = frames ?? []; + // Count value fields in the state-timeline-ready frame + const valueFieldsCount = data.reduce( + (acc, frame) => acc + frame.fields.filter((field) => field.type !== FieldType.time).length, + 0 + ); + // Not caring about multi mode in StateTimeline if (seriesIdx === null || datapointIdx === null) { return null; @@ -50,7 +57,7 @@ export const StateTimelinePanel: React.FC = ({ * See https://github.com/grafana/support-escalations/issues/932 */ if ( - (!alignedData.meta?.transformations?.length && alignedData.fields.length - 1 !== data.length) || + (!alignedData.meta?.transformations?.length && alignedData.fields.length - 1 !== valueFieldsCount) || !alignedData.fields[seriesIdx] ) { return null; @@ -103,6 +110,7 @@ export const StateTimelinePanel: React.FC = ({ { prepConfig = (alignedFrame: DataFrame, allFrames: DataFrame[], getTimeRange: () => TimeRange) => { this.panelContext = this.context as PanelContext; - const { eventBus } = this.panelContext; + const { eventBus, sync } = this.panelContext; return preparePlotConfigBuilder({ frame: alignedFrame, getTimeRange, eventBus, + sync, allFrames: this.props.frames, ...this.props, diff --git a/public/app/plugins/panel/state-timeline/module.tsx b/public/app/plugins/panel/state-timeline/module.tsx index b4a2791c29b..e45c66fceab 100755 --- a/public/app/plugins/panel/state-timeline/module.tsx +++ b/public/app/plugins/panel/state-timeline/module.tsx @@ -4,6 +4,7 @@ import { TimelineOptions, TimelineFieldConfig, defaultPanelOptions, defaultTimel import { VisibilityMode } from '@grafana/schema'; import { commonOptionsBuilder } from '@grafana/ui'; import { timelinePanelChangedHandler } from './migrations'; +import { StatTimelineSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(StateTimelinePanel) .setPanelChangeHandler(timelinePanelChangedHandler) @@ -86,4 +87,5 @@ export const plugin = new PanelPlugin(Stat commonOptionsBuilder.addLegendOptions(builder, false); commonOptionsBuilder.addTooltipOptions(builder, true); - }); + }) + .setSuggestionsSupplier(new StatTimelineSuggestionsSupplier()); diff --git a/public/app/plugins/panel/state-timeline/suggestions.ts b/public/app/plugins/panel/state-timeline/suggestions.ts new file mode 100644 index 00000000000..1fe768bf381 --- /dev/null +++ b/public/app/plugins/panel/state-timeline/suggestions.ts @@ -0,0 +1,42 @@ +import { VisualizationSuggestionsBuilder } from '@grafana/data'; +import { SuggestionName } from 'app/types/suggestions'; +import { TimelineFieldConfig, TimelineOptions } from './types'; + +export class StatTimelineSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary: ds } = builder; + + if (!ds.hasData) { + return; + } + + // This panel needs a time field and a string or number field + if (!ds.hasTimeField || (!ds.hasStringField && !ds.hasNumberField)) { + return; + } + + // If there are many series then they won't fit on y-axis so this panel is not good fit + if (ds.numberFieldCount >= 30) { + return; + } + + // Probably better ways to filter out this by inspecting the types of string values so view this as temporary + if (ds.preferredVisualisationType === 'logs') { + return; + } + + const list = builder.getListAppender({ + name: '', + pluginId: 'state-timeline', + options: {}, + fieldConfig: { + defaults: { + custom: {}, + }, + overrides: [], + }, + }); + + list.append({ name: SuggestionName.StateTimeline }); + } +} diff --git a/public/app/plugins/panel/state-timeline/types.ts b/public/app/plugins/panel/state-timeline/types.ts index b9a8d011eb9..c5d672e15dd 100644 --- a/public/app/plugins/panel/state-timeline/types.ts +++ b/public/app/plugins/panel/state-timeline/types.ts @@ -1,4 +1,5 @@ -import { OptionsWithTooltip, OptionsWithLegend, HideableFieldConfig, VisibilityMode } from '@grafana/schema'; +import { DashboardCursorSync } from '@grafana/data'; +import { HideableFieldConfig, OptionsWithLegend, OptionsWithTooltip, VisibilityMode } from '@grafana/schema'; /** * @alpha @@ -15,6 +16,8 @@ export interface TimelineOptions extends OptionsWithLegend, OptionsWithTooltip { mergeValues?: boolean; // only used in "changes" mode (state-timeline) alignValue?: TimelineValueAlignment; + + sync?: DashboardCursorSync; } export type TimelineValueAlignment = 'center' | 'left' | 'right'; diff --git a/public/app/plugins/panel/state-timeline/utils.ts b/public/app/plugins/panel/state-timeline/utils.ts index e060c2180be..ab5c6ba524b 100644 --- a/public/app/plugins/panel/state-timeline/utils.ts +++ b/public/app/plugins/panel/state-timeline/utils.ts @@ -3,6 +3,10 @@ import { XYFieldMatchers } from '@grafana/ui/src/components/GraphNG/types'; import { ArrayVector, DataFrame, + DashboardCursorSync, + DataHoverPayload, + DataHoverEvent, + DataHoverClearEvent, FALLBACK_COLOR, Field, FieldColorModeId, @@ -30,6 +34,7 @@ import { VizLegendOptions, AxisPlacement, ScaleDirection, ScaleOrientation } fro import { TimelineFieldConfig, TimelineOptions } from './types'; import { PlotTooltipInterpolator } from '@grafana/ui/src/components/uPlot/types'; import { preparePlotData } from '../../../../../packages/grafana-ui/src/components/uPlot/utils'; +import uPlot from 'uplot'; const defaultConfig: TimelineFieldConfig = { lineWidth: 0, @@ -58,6 +63,8 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ timeZone, getTimeRange, mode, + eventBus, + sync, rowHeight, colWidth, showValue, @@ -65,6 +72,9 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ }) => { const builder = new UPlotConfigBuilder(timeZone); + const xScaleUnit = 'time'; + const xScaleKey = 'x'; + const isDiscrete = (field: Field) => { const mode = field.config?.color?.mode; return !(mode && field.display && mode.startsWith('continuous-')); @@ -116,6 +126,13 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ let hoveredDataIdx: number | null = null; const coreConfig = getConfig(opts); + const payload: DataHoverPayload = { + point: { + [xScaleUnit]: null, + [FIXED_UNIT]: null, + }, + data: frame, + }; builder.addHook('init', coreConfig.init); builder.addHook('drawClear', coreConfig.drawClear); @@ -148,7 +165,7 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ builder.setCursor(coreConfig.cursor); builder.addScale({ - scaleKey: 'x', + scaleKey: xScaleKey, isTime: true, orientation: ScaleOrientation.Horizontal, direction: ScaleDirection.Right, @@ -164,7 +181,7 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ }); builder.addAxis({ - scaleKey: 'x', + scaleKey: xScaleKey, isTime: true, splits: coreConfig.xSplits!, placement: AxisPlacement.Bottom, @@ -180,7 +197,7 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ splits: coreConfig.ySplits, values: coreConfig.yValues, grid: { show: false }, - ticks: false, + ticks: { show: false }, gap: 16, theme, }); @@ -219,6 +236,34 @@ export const preparePlotConfigBuilder: UPlotConfigPrepFn = ({ }); } + if (sync !== DashboardCursorSync.Off) { + let cursor: Partial = {}; + + cursor.sync = { + key: '__global_', + filters: { + pub: (type: string, src: uPlot, x: number, y: number, w: number, h: number, dataIdx: number) => { + payload.rowIndex = dataIdx; + if (x < 0 && y < 0) { + payload.point[xScaleUnit] = null; + payload.point[FIXED_UNIT] = null; + eventBus.publish(new DataHoverClearEvent()); + } else { + payload.point[xScaleUnit] = src.posToVal(x, xScaleKey); + payload.point.panelRelY = y > 0 ? y / h : 1; // used for old graph panel to position tooltip + payload.down = undefined; + eventBus.publish(new DataHoverEvent(payload)); + } + return true; + }, + }, + //TODO: remove any once https://github.com/leeoniya/uPlot/pull/611 got merged or the typing is fixed + scales: [xScaleKey, null as any], + }; + builder.setSync(); + builder.setCursor(cursor); + } + return builder; }; @@ -440,7 +485,10 @@ export function prepareTimelineLegendItems( return undefined; } - const fields = allNonTimeFields(frames); + return getFieldLegendItem(allNonTimeFields(frames), theme); +} + +export function getFieldLegendItem(fields: Field[], theme: GrafanaTheme2): VizLegendItem[] | undefined { if (!fields.length) { return undefined; } diff --git a/public/app/plugins/panel/status-history/module.tsx b/public/app/plugins/panel/status-history/module.tsx index 76c02ad2c6a..65be04c368b 100755 --- a/public/app/plugins/panel/status-history/module.tsx +++ b/public/app/plugins/panel/status-history/module.tsx @@ -3,6 +3,7 @@ import { StatusHistoryPanel } from './StatusHistoryPanel'; import { StatusPanelOptions, StatusFieldConfig, defaultStatusFieldConfig } from './types'; import { VisibilityMode } from '@grafana/schema'; import { commonOptionsBuilder } from '@grafana/ui'; +import { StatusHistorySuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(StatusHistoryPanel) .useFieldConfig({ @@ -77,4 +78,5 @@ export const plugin = new PanelPlugin(Sta commonOptionsBuilder.addLegendOptions(builder, false); commonOptionsBuilder.addTooltipOptions(builder, true); - }); + }) + .setSuggestionsSupplier(new StatusHistorySuggestionsSupplier()); diff --git a/public/app/plugins/panel/status-history/suggestions.ts b/public/app/plugins/panel/status-history/suggestions.ts new file mode 100644 index 00000000000..cac89f49d8c --- /dev/null +++ b/public/app/plugins/panel/status-history/suggestions.ts @@ -0,0 +1,55 @@ +import { FieldColorModeId, VisualizationSuggestionsBuilder } from '@grafana/data'; +import { SuggestionName } from 'app/types/suggestions'; +import { StatusPanelOptions, StatusFieldConfig } from './types'; + +export class StatusHistorySuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary: ds } = builder; + + if (!ds.hasData) { + return; + } + + // This panel needs a time field and a string or number field + if (!ds.hasTimeField || (!ds.hasStringField && !ds.hasNumberField)) { + return; + } + + // If there are many series then they won't fit on y-axis so this panel is not good fit + if (ds.numberFieldCount >= 30) { + return; + } + + // if there a lot of data points for each series then this is not a good match + if (ds.rowCountMax > 100) { + return; + } + + // Probably better ways to filter out this by inspecting the types of string values so view this as temporary + if (ds.preferredVisualisationType === 'logs') { + return; + } + + const list = builder.getListAppender({ + name: '', + pluginId: 'status-history', + options: {}, + fieldConfig: { + defaults: { + color: { + mode: FieldColorModeId.ContinuousGrYlRd, + }, + custom: {}, + }, + overrides: [], + }, + cardOptions: { + previewModifier: (s) => { + s.options!.colWidth = 0.7; + }, + }, + }); + + list.append({ name: SuggestionName.StatusHistory }); + } +} diff --git a/public/app/plugins/panel/table/models.cue b/public/app/plugins/panel/table/models.cue index 1a4d7049249..5d4b481ec8a 100644 --- a/public/app/plugins/panel/table/models.cue +++ b/public/app/plugins/panel/table/models.cue @@ -28,13 +28,7 @@ Panel: { showTypeIcons: bool | *false sortBy?: [...ui.TableSortByFieldState] } - PanelFieldConfig: { - width?: int - minWidth?: int - align?: string | *"auto" - displayMode?: string | *"auto" // TODO? TableCellDisplayMode - filterable?: bool - } + PanelFieldConfig: ui.TableFieldOptions }, ] ] diff --git a/public/app/plugins/panel/table/models.gen.ts b/public/app/plugins/panel/table/models.gen.ts index 9a2f5462fbb..a1eee4e24f8 100644 --- a/public/app/plugins/panel/table/models.gen.ts +++ b/public/app/plugins/panel/table/models.gen.ts @@ -4,6 +4,7 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ import { TableCellDisplayMode, TableSortByFieldState } from '@grafana/ui'; +import { TableFieldOptions } from '@grafana/schema'; // Only the latest schema version is translated to TypeScript, on the premise // that either the dashboard loading process, or (eventually) CUE-defined @@ -35,15 +36,7 @@ export const defaultPanelOptions: PanelOptions = { }, }; -export interface PanelFieldConfig { - width?: number; - minWidth?: number; - align?: string; - displayMode?: TableCellDisplayMode; - filterable?: boolean; -} - -export const defaultPanelFieldConfig: PanelFieldConfig = { +export const defaultPanelFieldConfig: TableFieldOptions = { displayMode: TableCellDisplayMode.Auto, align: 'auto', }; diff --git a/public/app/plugins/panel/table/module.tsx b/public/app/plugins/panel/table/module.tsx index 94f78b415d7..dbf33ba6187 100644 --- a/public/app/plugins/panel/table/module.tsx +++ b/public/app/plugins/panel/table/module.tsx @@ -7,11 +7,13 @@ import { standardEditorsRegistry, } from '@grafana/data'; import { TablePanel } from './TablePanel'; -import { PanelOptions, PanelFieldConfig, defaultPanelOptions, defaultPanelFieldConfig } from './models.gen'; +import { PanelOptions, defaultPanelOptions, defaultPanelFieldConfig } from './models.gen'; +import { TableFieldOptions } from '@grafana/schema'; import { tableMigrationHandler, tablePanelChangedHandler } from './migrations'; import { TableCellDisplayMode } from '@grafana/ui'; +import { TableSuggestionsSupplier } from './suggestions'; -export const plugin = new PanelPlugin(TablePanel) +export const plugin = new PanelPlugin(TablePanel) .setPanelChangeHandler(tablePanelChangedHandler) .setMigrationHandler(tableMigrationHandler) .setNoPadding() @@ -78,6 +80,12 @@ export const plugin = new PanelPlugin(TablePanel name: 'Column filter', description: 'Enables/disables field filters in table', defaultValue: defaultPanelFieldConfig.filterable, + }) + .addBooleanSwitch({ + path: 'hidden', + name: 'Hide in table', + defaultValue: undefined, + hideFromDefaults: true, }); }, }) @@ -130,4 +138,5 @@ export const plugin = new PanelPlugin(TablePanel defaultValue: '', showIf: (cfg) => cfg.footer?.show, }); - }); + }) + .setSuggestionsSupplier(new TableSuggestionsSupplier()); diff --git a/public/app/plugins/panel/table/suggestions.ts b/public/app/plugins/panel/table/suggestions.ts new file mode 100644 index 00000000000..3294de7839d --- /dev/null +++ b/public/app/plugins/panel/table/suggestions.ts @@ -0,0 +1,36 @@ +import { VisualizationSuggestionsBuilder } from '@grafana/data'; +import { TableFieldOptions } from '@grafana/schema'; +import { SuggestionName } from 'app/types/suggestions'; +import { PanelOptions } from './models.gen'; + +export class TableSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const list = builder.getListAppender({ + name: SuggestionName.Table, + pluginId: 'table', + options: {}, + fieldConfig: { + defaults: { + custom: {}, + }, + overrides: [], + }, + cardOptions: { + previewModifier: (s) => { + s.fieldConfig!.defaults.custom!.minWidth = 50; + }, + }, + }); + + // If there are not data suggest table anyway but use icon instead of real preview + if (builder.dataSummary.fieldCount === 0) { + list.append({ + cardOptions: { + imgSrc: 'public/app/plugins/panel/table/img/icn-table-panel.svg', + }, + }); + } else { + list.append({}); + } + } +} diff --git a/public/app/plugins/panel/text/TextPanel.tsx b/public/app/plugins/panel/text/TextPanel.tsx index 6828fba9a22..f0251f9d658 100644 --- a/public/app/plugins/panel/text/TextPanel.tsx +++ b/public/app/plugins/panel/text/TextPanel.tsx @@ -1,7 +1,7 @@ // Libraries import React, { PureComponent } from 'react'; import { debounce } from 'lodash'; -import { PanelProps, renderMarkdown, textUtil } from '@grafana/data'; +import { PanelProps, renderTextPanelMarkdown, textUtil } from '@grafana/data'; // Utils import config from 'app/core/config'; // Types @@ -44,7 +44,9 @@ export class TextPanel extends PureComponent { prepareMarkdown(content: string): string { // Sanitize is disabled here as we handle that after variable interpolation - return renderMarkdown(this.interpolateAndSanitizeString(content), { noSanitize: config.disableSanitizeHtml }); + return renderTextPanelMarkdown(this.interpolateAndSanitizeString(content), { + noSanitize: config.disableSanitizeHtml, + }); } interpolateAndSanitizeString(content: string): string { @@ -52,7 +54,7 @@ export class TextPanel extends PureComponent { content = replaceVariables(content, {}, 'html'); - return config.disableSanitizeHtml ? content : textUtil.sanitize(content); + return config.disableSanitizeHtml ? content : textUtil.sanitizeTextPanelContent(content); } processContent(options: PanelOptions): string { diff --git a/public/app/plugins/panel/text/TextPanelEditor.tsx b/public/app/plugins/panel/text/TextPanelEditor.tsx index 6493c4c387b..a8c1a351c2f 100644 --- a/public/app/plugins/panel/text/TextPanelEditor.tsx +++ b/public/app/plugins/panel/text/TextPanelEditor.tsx @@ -40,7 +40,7 @@ export const TextPanelEditor: FC> width={width} showMiniMap={false} showLineNumbers={false} - height="200px" + height="500px" getSuggestions={getSuggestions} /> ); diff --git a/public/app/plugins/panel/text/models.gen.ts b/public/app/plugins/panel/text/models.gen.ts index 5654a59f145..987d6913eae 100644 --- a/public/app/plugins/panel/text/models.gen.ts +++ b/public/app/plugins/panel/text/models.gen.ts @@ -1,9 +1,8 @@ //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -// NOTE: This file will be auto generated from models.cue -// It is currenty hand written but will serve as the target for cuetsy +// This file was almost autogenerated by cuetsy. //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -export const modelVersion = Object.freeze([1, 0]); +export const modelVersion = Object.freeze([0, 0]); export enum TextMode { HTML = 'html', @@ -11,14 +10,13 @@ export enum TextMode { } export interface PanelOptions { - mode: TextMode; content: string; + mode: TextMode; } export const defaultPanelOptions: PanelOptions = { - mode: TextMode.Markdown, content: `# Title - For markdown syntax help: [commonmark.org/help](https://commonmark.org/help/) - `, +For markdown syntax help: [commonmark.org/help](https://commonmark.org/help/)`, + mode: TextMode.Markdown, }; diff --git a/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx b/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx index fc5cbd3c3e9..d347abe441a 100644 --- a/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx +++ b/public/app/plugins/panel/timeseries/TimeSeriesPanel.tsx @@ -1,9 +1,8 @@ +import React, { useMemo } from 'react'; import { Field, PanelProps } from '@grafana/data'; -import { config } from '@grafana/runtime'; import { TooltipDisplayMode } from '@grafana/schema'; import { usePanelContext, TimeSeries, TooltipPlugin, ZoomPlugin } from '@grafana/ui'; import { getFieldLinksForExplore } from 'app/features/explore/utils/links'; -import React, { useMemo } from 'react'; import { AnnotationsPlugin } from './plugins/AnnotationsPlugin'; import { ContextMenuPlugin } from './plugins/ContextMenuPlugin'; import { ExemplarsPlugin } from './plugins/ExemplarsPlugin'; @@ -11,6 +10,8 @@ import { TimeSeriesOptions } from './types'; import { prepareGraphableFields } from './utils'; import { AnnotationEditorPlugin } from './plugins/AnnotationEditorPlugin'; import { ThresholdControlsPlugin } from './plugins/ThresholdControlsPlugin'; +import { config } from 'app/core/config'; +import { PanelDataErrorView } from '@grafana/runtime'; interface TimeSeriesPanelProps extends PanelProps {} @@ -24,6 +25,7 @@ export const TimeSeriesPanel: React.FC = ({ fieldConfig, onChangeTimeRange, replaceVariables, + id, }) => { const { sync, canAddAnnotations, onThresholdsChange, canEditThresholds, onSplitOpen } = usePanelContext(); @@ -31,14 +33,10 @@ export const TimeSeriesPanel: React.FC = ({ return getFieldLinksForExplore({ field, rowIndex, splitOpenFn: onSplitOpen, range: timeRange }); }; - const { frames, warn } = useMemo(() => prepareGraphableFields(data?.series, config.theme2), [data]); + const frames = useMemo(() => prepareGraphableFields(data.series, config.theme2), [data]); - if (!frames || warn) { - return ( -
    -

    {warn ?? 'No data found in response'}

    -
    - ); + if (!frames) { + return ; } const enableAnnotationCreation = Boolean(canAddAnnotations && canAddAnnotations()); @@ -62,6 +60,7 @@ export const TimeSeriesPanel: React.FC = ({ data={alignedDataFrame} config={config} mode={options.tooltip.mode} + sortOrder={options.tooltip.sort} sync={sync} timeZone={timeZone} /> @@ -71,39 +70,45 @@ export const TimeSeriesPanel: React.FC = ({ )} {/* Enables annotations creation*/} - - {({ startAnnotating }) => { - return ( - + {({ startAnnotating }) => { + return ( + { - if (!p) { - return; - } - startAnnotating({ coords: p.coords }); - }, - }, - ], + label: 'Add annotation', + ariaLabel: 'Add annotation', + icon: 'comment-alt', + onClick: (e, p) => { + if (!p) { + return; + } + startAnnotating({ coords: p.coords }); + }, }, - ] - : [] - } - /> - ); - }} - + ], + }, + ]} + /> + ); + }} + + ) : ( + + )} {data.annotations && ( { let prevFieldConfig: FieldConfigSource; @@ -308,6 +309,87 @@ describe('Graph Migrations', () => { expect(panel.fieldConfig.overrides[0].properties[0].value).toEqual({ viz: true, legend: false, tooltip: false }); }); }); + + describe('tooltip', () => { + test('tooltip mode', () => { + const single: any = { + angular: { + tooltip: { + shared: false, + }, + }, + }; + const multi: any = { + angular: { + tooltip: { + shared: true, + }, + }, + }; + + const panel1 = {} as PanelModel; + const panel2 = {} as PanelModel; + + panel1.options = graphPanelChangedHandler(panel1, 'graph', single, prevFieldConfig); + panel2.options = graphPanelChangedHandler(panel2, 'graph', multi, prevFieldConfig); + + expect(panel1.options.tooltip.mode).toBe(TooltipDisplayMode.Single); + expect(panel2.options.tooltip.mode).toBe(TooltipDisplayMode.Multi); + }); + + test('sort order', () => { + const none: any = { + angular: { + tooltip: { + shared: true, + sort: 0, + }, + }, + }; + + const asc: any = { + angular: { + tooltip: { + shared: true, + sort: 1, + }, + }, + }; + + const desc: any = { + angular: { + tooltip: { + shared: true, + sort: 2, + }, + }, + }; + + const singleModeWithUnnecessaryOption: any = { + angular: { + tooltip: { + shared: false, + sort: 2, + }, + }, + }; + + const panel1 = {} as PanelModel; + const panel2 = {} as PanelModel; + const panel3 = {} as PanelModel; + const panel4 = {} as PanelModel; + + panel1.options = graphPanelChangedHandler(panel1, 'graph', none, prevFieldConfig); + panel2.options = graphPanelChangedHandler(panel2, 'graph', asc, prevFieldConfig); + panel3.options = graphPanelChangedHandler(panel3, 'graph', desc, prevFieldConfig); + panel4.options = graphPanelChangedHandler(panel4, 'graph', singleModeWithUnnecessaryOption, prevFieldConfig); + + expect(panel1.options.tooltip.sort).toBe(SortOrder.None); + expect(panel2.options.tooltip.sort).toBe(SortOrder.Ascending); + expect(panel3.options.tooltip.sort).toBe(SortOrder.Descending); + expect(panel4.options.tooltip.sort).toBe(SortOrder.None); + }); + }); }); const customColor = { diff --git a/public/app/plugins/panel/timeseries/migrations.ts b/public/app/plugins/panel/timeseries/migrations.ts index 8e80f853389..91d01aa2957 100644 --- a/public/app/plugins/panel/timeseries/migrations.ts +++ b/public/app/plugins/panel/timeseries/migrations.ts @@ -25,6 +25,7 @@ import { VisibilityMode, ScaleDistribution, StackingMode, + SortOrder, } from '@grafana/schema'; import { TimeSeriesOptions } from './types'; import { omitBy, pickBy, isNil, isNumber, isString } from 'lodash'; @@ -313,6 +314,7 @@ export function flotToGraphOptions(angular: any): { fieldConfig: FieldConfigSour }, tooltip: { mode: TooltipDisplayMode.Single, + sort: SortOrder.None, }, }; @@ -335,6 +337,26 @@ export function flotToGraphOptions(angular: any): { fieldConfig: FieldConfigSour } } + const tooltipConfig = angular.tooltip; + if (tooltipConfig) { + if (tooltipConfig.shared !== undefined) { + options.tooltip.mode = tooltipConfig.shared ? TooltipDisplayMode.Multi : TooltipDisplayMode.Single; + } + + if (tooltipConfig.sort !== undefined && tooltipConfig.shared) { + switch (tooltipConfig.sort) { + case 1: + options.tooltip.sort = SortOrder.Ascending; + break; + case 2: + options.tooltip.sort = SortOrder.Descending; + break; + default: + options.tooltip.sort = SortOrder.None; + } + } + } + if (angular.thresholds && angular.thresholds.length > 0) { let steps: Threshold[] = []; let area = false; diff --git a/public/app/plugins/panel/timeseries/module.tsx b/public/app/plugins/panel/timeseries/module.tsx index a6dc76b8940..230a985cae6 100644 --- a/public/app/plugins/panel/timeseries/module.tsx +++ b/public/app/plugins/panel/timeseries/module.tsx @@ -5,6 +5,7 @@ import { TimeSeriesPanel } from './TimeSeriesPanel'; import { graphPanelChangedHandler } from './migrations'; import { TimeSeriesOptions } from './types'; import { defaultGraphConfig, getGraphFieldConfig } from './config'; +import { TimeSeriesSuggestionsSupplier } from './suggestions'; export const plugin = new PanelPlugin(TimeSeriesPanel) .setPanelChangeHandler(graphPanelChangedHandler) @@ -13,4 +14,5 @@ export const plugin = new PanelPlugin(TimeS commonOptionsBuilder.addTooltipOptions(builder); commonOptionsBuilder.addLegendOptions(builder); }) + .setSuggestionsSupplier(new TimeSeriesSuggestionsSupplier()) .setDataSupport({ annotations: true, alertStates: true }); diff --git a/public/app/plugins/panel/timeseries/plugins/AnnotationEditorPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/AnnotationEditorPlugin.tsx index e082454e80a..43d0e6e8bc0 100644 --- a/public/app/plugins/panel/timeseries/plugins/AnnotationEditorPlugin.tsx +++ b/public/app/plugins/panel/timeseries/plugins/AnnotationEditorPlugin.tsx @@ -3,6 +3,7 @@ import { PlotSelection, UPlotConfigBuilder } from '@grafana/ui'; import React, { useCallback, useLayoutEffect, useRef, useState } from 'react'; import { useMountedState } from 'react-use'; import { AnnotationEditor } from './annotations/AnnotationEditor'; +import uPlot from 'uplot'; type StartAnnotatingFn = (props: { // pixel coordinates of the clicked point on the uPlot canvas diff --git a/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin.tsx index d9a24dd3234..ad6a58b8ac8 100644 --- a/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin.tsx +++ b/public/app/plugins/panel/timeseries/plugins/AnnotationsPlugin.tsx @@ -2,6 +2,7 @@ import { colorManipulator, DataFrame, DataFrameFieldIndex, DataFrameView, TimeZo import { EventsCanvas, UPlotConfigBuilder, useTheme2 } from '@grafana/ui'; import React, { useCallback, useEffect, useLayoutEffect, useRef } from 'react'; import { AnnotationMarker } from './annotations/AnnotationMarker'; +import uPlot from 'uplot'; interface AnnotationsPluginProps { config: UPlotConfigBuilder; diff --git a/public/app/plugins/panel/timeseries/plugins/ContextMenuPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/ContextMenuPlugin.tsx index 0412c089f21..d5fbcd2e92b 100644 --- a/public/app/plugins/panel/timeseries/plugins/ContextMenuPlugin.tsx +++ b/public/app/plugins/panel/timeseries/plugins/ContextMenuPlugin.tsx @@ -136,7 +136,7 @@ export const ContextMenuPlugin: React.FC = ({ const seriesIdx = i + 1; const dataIdx = u.cursor.idx; pluginLog('ContextMenuPlugin', false, seriesIdx, dataIdx); - setPoint({ seriesIdx, dataIdx: dataIdx || null }); + setPoint({ seriesIdx, dataIdx: dataIdx ?? null }); }); }); } @@ -239,7 +239,7 @@ export const ContextMenuView: React.FC = ({ const { seriesIdx, dataIdx } = selection.point; const xFieldFmt = xField.display!; - if (seriesIdx && dataIdx) { + if (seriesIdx && dataIdx !== null) { const field = data.fields[seriesIdx]; const displayValue = field.display!(field.values.get(dataIdx)); diff --git a/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx index 31ef89bef67..ea22594b674 100644 --- a/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx +++ b/public/app/plugins/panel/timeseries/plugins/ExemplarsPlugin.tsx @@ -10,6 +10,7 @@ import { import { EventsCanvas, FIXED_UNIT, UPlotConfigBuilder } from '@grafana/ui'; import React, { useCallback, useLayoutEffect, useRef } from 'react'; import { ExemplarMarker } from './ExemplarMarker'; +import uPlot from 'uplot'; interface ExemplarsPluginProps { config: UPlotConfigBuilder; diff --git a/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx b/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx index 51ab192d152..34cb44742a1 100644 --- a/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx +++ b/public/app/plugins/panel/timeseries/plugins/ThresholdControlsPlugin.tsx @@ -1,7 +1,8 @@ import React, { useState, useLayoutEffect, useMemo, useRef } from 'react'; import { FieldConfigSource, ThresholdsConfig, getValueFormat } from '@grafana/data'; -import { UPlotConfigBuilder, FIXED_UNIT } from '@grafana/ui'; +import { UPlotConfigBuilder, buildScaleKey } from '@grafana/ui'; import { ThresholdDragHandle } from './ThresholdDragHandle'; +import uPlot from 'uplot'; const GUTTER_SIZE = 60; @@ -41,8 +42,8 @@ export const ThresholdControlsPlugin: React.FC = ( if (!thresholds) { return null; } + const scale = buildScaleKey(fieldConfig.defaults); - const scale = fieldConfig.defaults.unit ?? FIXED_UNIT; const decimals = fieldConfig.defaults.decimals; const handles = []; @@ -53,16 +54,15 @@ export const ThresholdControlsPlugin: React.FC = ( if (Number.isNaN(yPos) || !Number.isFinite(yPos)) { continue; } - if (yPos < 0 || yPos > plot.bbox.height / window.devicePixelRatio) { - continue; - } + + const height = plot.bbox.height / window.devicePixelRatio; const handle = ( plot.posToVal(y, scale)} formatValue={(v) => getValueFormat(scale)(v, decimals).text} onChange={(value) => { @@ -79,6 +79,7 @@ export const ThresholdControlsPlugin: React.FC = ( }} /> ); + handles.push(handle); } diff --git a/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx b/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx index 7bc93429fc7..33430101ad8 100644 --- a/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx +++ b/public/app/plugins/panel/timeseries/plugins/ThresholdDragHandle.tsx @@ -4,6 +4,8 @@ import { Threshold, GrafanaTheme2 } from '@grafana/data'; import { useStyles2, useTheme2 } from '@grafana/ui'; import Draggable, { DraggableBounds } from 'react-draggable'; +type OutOfBounds = 'top' | 'bottom' | 'none'; + interface ThresholdDragHandleProps { step: Threshold; y: number; @@ -22,7 +24,28 @@ export const ThresholdDragHandle: React.FC = ({ onChange, }) => { const theme = useTheme2(); - const styles = useStyles2(getStyles); + let yPos = y; + let outOfBounds: OutOfBounds = 'none'; + + if (y < (dragBounds.top ?? 0)) { + outOfBounds = 'top'; + } + + // there seems to be a 22px offset at the bottom where the threshold line is still drawn + // this is probably offset by the size of the x-axis component + if (y > (dragBounds.bottom ?? 0) + 22) { + outOfBounds = 'bottom'; + } + + if (outOfBounds === 'bottom') { + yPos = dragBounds.bottom ?? y; + } + + if (outOfBounds === 'top') { + yPos = dragBounds.top ?? y; + } + + const styles = useStyles2((theme) => getStyles(theme, step, outOfBounds)); const [currentValue, setCurrentValue] = useState(step.value); const textColor = useMemo(() => { @@ -39,13 +62,10 @@ export const ThresholdDragHandle: React.FC = ({ return false; }} onDrag={(_e, d) => setCurrentValue(mapPositionToValue(d.lastY))} - position={{ x: 0, y }} + position={{ x: 0, y: yPos }} bounds={dragBounds} > -
    +
    {formatValue(currentValue)}
    @@ -54,32 +74,38 @@ export const ThresholdDragHandle: React.FC = ({ ThresholdDragHandle.displayName = 'ThresholdDragHandle'; -const getStyles = (theme: GrafanaTheme2) => { +const getStyles = (theme: GrafanaTheme2, step: Threshold, outOfBounds: OutOfBounds) => { + const mainColor = theme.visualization.getColorByName(step.color); + const arrowStyles = getArrowStyles(outOfBounds); + const isOutOfBounds = outOfBounds !== 'none'; + return { handle: css` + display: flex; + align-items: center; position: absolute; left: 0; width: calc(100% - 9px); height: 18px; - margin-left: 9px; margin-top: -9px; + border-color: ${mainColor}; cursor: grab; + border-top-right-radius: ${theme.shape.borderRadius(1)}; + border-bottom-right-radius: ${theme.shape.borderRadius(1)}; + ${isOutOfBounds && + css` + margin-top: 0; + border-radius: ${theme.shape.borderRadius(1)}; + `} + background: ${mainColor}; font-size: ${theme.typography.bodySmall.fontSize}; &:before { - content: ''; - position: absolute; - left: -9px; - bottom: 0; - width: 0; - height: 0; - border-right-style: solid; - border-right-width: 9px; - border-right-color: inherit; - border-top: 9px solid transparent; - border-bottom: 9px solid transparent; + ${arrowStyles}; } `, handleText: css` + text-align: center; + width: 100%; display: block; text-overflow: ellipsis; white-space: nowrap; @@ -87,3 +113,51 @@ const getStyles = (theme: GrafanaTheme2) => { `, }; }; + +function getArrowStyles(outOfBounds: OutOfBounds) { + const inBounds = outOfBounds === 'none'; + + const triangle = (size: number) => css` + content: ''; + position: absolute; + + bottom: 0; + top: 0; + width: 0; + height: 0; + left: 0; + + border-right-style: solid; + border-right-width: ${size}px; + border-right-color: inherit; + border-top: ${size}px solid transparent; + border-bottom: ${size}px solid transparent; + `; + + if (inBounds) { + return css` + ${triangle(9)}; + left: -9px; + `; + } + + if (outOfBounds === 'top') { + return css` + ${triangle(5)}; + left: calc(50% - 2.5px); + top: -7px; + transform: rotate(90deg); + `; + } + + if (outOfBounds === 'bottom') { + return css` + ${triangle(5)}; + left: calc(50% - 2.5px); + top: calc(100% - 2.5px); + transform: rotate(-90deg); + `; + } + + return ''; +} diff --git a/public/app/plugins/panel/timeseries/suggestions.ts b/public/app/plugins/panel/timeseries/suggestions.ts new file mode 100644 index 00000000000..72d1c020c11 --- /dev/null +++ b/public/app/plugins/panel/timeseries/suggestions.ts @@ -0,0 +1,208 @@ +import { FieldColorModeId, VisualizationSuggestionsBuilder } from '@grafana/data'; +import { + GraphDrawStyle, + GraphFieldConfig, + GraphGradientMode, + LegendDisplayMode, + LineInterpolation, + StackingMode, +} from '@grafana/schema'; +import { SuggestionName } from 'app/types/suggestions'; +import { TimeSeriesOptions } from './types'; + +export class TimeSeriesSuggestionsSupplier { + getSuggestionsForData(builder: VisualizationSuggestionsBuilder) { + const { dataSummary } = builder; + + if (!dataSummary.hasTimeField || !dataSummary.hasNumberField || dataSummary.rowCountTotal < 2) { + return; + } + + const list = builder.getListAppender({ + name: SuggestionName.LineChart, + pluginId: 'timeseries', + options: { + legend: {} as any, + }, + fieldConfig: { + defaults: { + custom: {}, + }, + overrides: [], + }, + cardOptions: { + previewModifier: (s) => { + s.options!.legend.displayMode = LegendDisplayMode.Hidden; + + if (s.fieldConfig?.defaults.custom?.drawStyle !== GraphDrawStyle.Bars) { + s.fieldConfig!.defaults.custom!.lineWidth = Math.max(s.fieldConfig!.defaults.custom!.lineWidth ?? 1, 2); + } + }, + }, + }); + + const maxBarsCount = 100; + + list.append({ + name: SuggestionName.LineChart, + }); + + if (dataSummary.rowCountMax < 200) { + list.append({ + name: SuggestionName.LineChartSmooth, + fieldConfig: { + defaults: { + custom: { + lineInterpolation: LineInterpolation.Smooth, + }, + }, + overrides: [], + }, + }); + } + + // Single series suggestions + if (dataSummary.numberFieldCount === 1) { + list.append({ + name: SuggestionName.AreaChart, + fieldConfig: { + defaults: { + custom: { + fillOpacity: 25, + }, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.LineChartGradientColorScheme, + fieldConfig: { + defaults: { + color: { + mode: FieldColorModeId.ContinuousGrYlRd, + }, + custom: { + gradientMode: GraphGradientMode.Scheme, + lineInterpolation: LineInterpolation.Smooth, + lineWidth: 3, + fillOpacity: 20, + }, + }, + overrides: [], + }, + }); + + if (dataSummary.rowCountMax < maxBarsCount) { + list.append({ + name: SuggestionName.BarChart, + fieldConfig: { + defaults: { + custom: { + drawStyle: GraphDrawStyle.Bars, + fillOpacity: 100, + lineWidth: 1, + gradientMode: GraphGradientMode.Hue, + }, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.BarChartGradientColorScheme, + fieldConfig: { + defaults: { + color: { + mode: FieldColorModeId.ContinuousGrYlRd, + }, + custom: { + drawStyle: GraphDrawStyle.Bars, + fillOpacity: 90, + lineWidth: 1, + gradientMode: GraphGradientMode.Scheme, + }, + }, + overrides: [], + }, + }); + } + + return; + } + + // Multiple series suggestions + + list.append({ + name: SuggestionName.AreaChartStacked, + fieldConfig: { + defaults: { + custom: { + fillOpacity: 25, + stacking: { + mode: StackingMode.Normal, + group: 'A', + }, + }, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.AreaChartStackedPercent, + fieldConfig: { + defaults: { + custom: { + fillOpacity: 25, + stacking: { + mode: StackingMode.Percent, + group: 'A', + }, + }, + }, + overrides: [], + }, + }); + + if (dataSummary.rowCountTotal / dataSummary.numberFieldCount < maxBarsCount) { + list.append({ + name: SuggestionName.BarChartStacked, + fieldConfig: { + defaults: { + custom: { + drawStyle: GraphDrawStyle.Bars, + fillOpacity: 100, + lineWidth: 1, + gradientMode: GraphGradientMode.Hue, + stacking: { + mode: StackingMode.Normal, + group: 'A', + }, + }, + }, + overrides: [], + }, + }); + + list.append({ + name: SuggestionName.BarChartStackedPercent, + fieldConfig: { + defaults: { + custom: { + drawStyle: GraphDrawStyle.Bars, + fillOpacity: 100, + lineWidth: 1, + gradientMode: GraphGradientMode.Hue, + stacking: { + mode: StackingMode.Percent, + group: 'A', + }, + }, + }, + overrides: [], + }, + }); + } + } +} diff --git a/public/app/plugins/panel/timeseries/utils.test.ts b/public/app/plugins/panel/timeseries/utils.test.ts index a1544dd9297..0d2065a8bff 100644 --- a/public/app/plugins/panel/timeseries/utils.test.ts +++ b/public/app/plugins/panel/timeseries/utils.test.ts @@ -3,7 +3,7 @@ import { prepareGraphableFields } from './utils'; describe('prepare timeseries graph', () => { it('errors with no time fields', () => { - const frames = [ + const input = [ toDataFrame({ fields: [ { name: 'a', values: [1, 2, 3] }, @@ -11,12 +11,12 @@ describe('prepare timeseries graph', () => { ], }), ]; - const info = prepareGraphableFields(frames, createTheme()); - expect(info.warn).toEqual('Data does not have a time field'); + const frames = prepareGraphableFields(input, createTheme()); + expect(frames).toBeNull(); }); it('requires a number or boolean value', () => { - const frames = [ + const input = [ toDataFrame({ fields: [ { name: 'a', type: FieldType.time, values: [1, 2, 3] }, @@ -24,12 +24,12 @@ describe('prepare timeseries graph', () => { ], }), ]; - const info = prepareGraphableFields(frames, createTheme()); - expect(info.warn).toEqual('No graphable fields'); + const frames = prepareGraphableFields(input, createTheme()); + expect(frames).toBeNull(); }); it('will graph numbers and boolean values', () => { - const frames = [ + const input = [ toDataFrame({ fields: [ { name: 'a', type: FieldType.time, values: [1, 2, 3] }, @@ -39,10 +39,9 @@ describe('prepare timeseries graph', () => { ], }), ]; - const info = prepareGraphableFields(frames, createTheme()); - expect(info.warn).toBeUndefined(); + const frames = prepareGraphableFields(input, createTheme()); + const out = frames![0]; - const out = info.frames![0]; expect(out.fields.map((f) => f.name)).toEqual(['a', 'c', 'd']); const field = out.fields.find((f) => f.name === 'c'); @@ -66,9 +65,9 @@ describe('prepare timeseries graph', () => { { name: 'a', values: [-10, NaN, 10, -Infinity, +Infinity] }, ], }); - const result = prepareGraphableFields([df], createTheme()); + const frames = prepareGraphableFields([df], createTheme()); - const field = result.frames![0].fields.find((f) => f.name === 'a'); + const field = frames![0].fields.find((f) => f.name === 'a'); expect(field!.values.toArray()).toMatchInlineSnapshot(` Array [ -10, diff --git a/public/app/plugins/panel/timeseries/utils.ts b/public/app/plugins/panel/timeseries/utils.ts index da4cdee11a1..b38e34cd238 100644 --- a/public/app/plugins/panel/timeseries/utils.ts +++ b/public/app/plugins/panel/timeseries/utils.ts @@ -7,34 +7,34 @@ import { GrafanaTheme2, isBooleanUnit, } from '@grafana/data'; -import { GraphFieldConfig, LineInterpolation, StackingMode } from '@grafana/schema'; +import { GraphFieldConfig, LineInterpolation } from '@grafana/schema'; -// This will return a set of frames with only graphable values included -export function prepareGraphableFields( - series: DataFrame[] | undefined, - theme: GrafanaTheme2 -): { frames?: DataFrame[]; warn?: string } { +/** + * Returns null if there are no graphable fields + */ +export function prepareGraphableFields(series: DataFrame[], theme: GrafanaTheme2): DataFrame[] | null { if (!series?.length) { - return { warn: 'No data in response' }; + return null; } + let copy: Field; - let hasTimeseries = false; + const frames: DataFrame[] = []; for (let frame of series) { - let isTimeseries = false; - let changed = false; const fields: Field[] = []; + let hasTimeField = false; + let hasValueField = false; + for (const field of frame.fields) { switch (field.type) { case FieldType.time: - isTimeseries = true; - hasTimeseries = true; + hasTimeField = true; fields.push(field); break; case FieldType.number: - changed = true; + hasValueField = true; copy = { ...field, values: new ArrayVector( @@ -47,15 +47,10 @@ export function prepareGraphableFields( ), }; - if (copy.config.custom?.stacking?.mode === StackingMode.Percent) { - copy.config.unit = 'percentunit'; - copy.display = getDisplayProcessor({ field: copy, theme }); - } - fields.push(copy); break; // ok case FieldType.boolean: - changed = true; + hasValueField = true; const custom: GraphFieldConfig = field.config?.custom ?? {}; const config = { ...field.config, @@ -63,10 +58,12 @@ export function prepareGraphableFields( min: 0, custom, }; + // smooth and linear do not make sense if (custom.lineInterpolation !== LineInterpolation.StepBefore) { custom.lineInterpolation = LineInterpolation.StepAfter; } + copy = { ...field, config, @@ -80,35 +77,28 @@ export function prepareGraphableFields( }) ), }; + if (!isBooleanUnit(config.unit)) { config.unit = 'bool'; copy.display = getDisplayProcessor({ field: copy, theme }); } + fields.push(copy); break; - default: - changed = true; } } - if (isTimeseries && fields.length > 1) { - hasTimeseries = true; - if (changed) { - frames.push({ - ...frame, - fields, - }); - } else { - frames.push(frame); - } + if (hasTimeField && hasValueField) { + frames.push({ + ...frame, + fields, + }); } } - if (!hasTimeseries) { - return { warn: 'Data does not have a time field' }; + if (frames.length) { + return frames; } - if (!frames.length) { - return { warn: 'No graphable fields' }; - } - return { frames }; + + return null; } diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index bc85a765316..54870b3872d 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -8,9 +8,10 @@ import { SafeDynamicImport } from '../core/components/DynamicImports/SafeDynamic import { RouteDescriptor } from '../core/navigation/types'; import { Redirect } from 'react-router-dom'; import ErrorPage from 'app/core/components/ErrorPage/ErrorPage'; -import { getPluginsAdminRoutes } from 'app/features/plugins/routes'; +import { getRoutes as getPluginCatalogRoutes } from 'app/features/plugins/admin/routes'; import { contextSrv } from 'app/core/services/context_srv'; import { getLiveRoutes } from 'app/features/live/pages/routes'; +import { getAlertingRoutes } from 'app/features/alerting/routes'; export const extraRoutes: RouteDescriptor[] = []; @@ -149,7 +150,7 @@ export function getAppRoutes(): RouteDescriptor[] { exact: false, // Someday * and will get a ReactRouter under that path! component: SafeDynamicImport( - () => import(/* webpackChunkName: "AppRootPage" */ 'app/features/plugins/AppRootPage') + () => import(/* webpackChunkName: "AppRootPage" */ 'app/features/plugins/components/AppRootPage') ), }, { @@ -181,6 +182,14 @@ export function getAppRoutes(): RouteDescriptor[] { () => import(/* webpackChunkName: "ApiKeysPage" */ 'app/features/api-keys/ApiKeysPage') ), }, + { + path: '/org/serviceaccounts', + roles: () => ['Editor', 'Admin'], + component: SafeDynamicImport( + () => + import(/* webpackChunkName: "ServiceAccountsPage" */ 'app/features/serviceaccounts/ServiceAccountsListPage') + ), + }, { path: '/org/teams', roles: () => (config.editorsCanAdmin ? [] : ['Editor', 'Admin']), @@ -323,155 +332,6 @@ export function getAppRoutes(): RouteDescriptor[] { () => import(/* webpackChunkName: "SnapshotListPage" */ 'app/features/manage-dashboards/SnapshotListPage') ), }, - // TODO[Router] - // { - // path: '/plugins/:pluginId/page/:slug', - // templateUrl: 'public/app/features/plugins/partials/plugin_page.html', - // controller: 'AppPageCtrl', - // controllerAs: 'ctrl', - // }, - { - path: '/alerting', - // eslint-disable-next-line react/display-name - component: () => , - }, - { - path: '/alerting/list', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertRuleListIndex" */ 'app/features/alerting/AlertRuleListIndex') - ), - }, - { - path: '/alerting/ng/list', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertRuleList" */ 'app/features/alerting/AlertRuleList') - ), - }, - { - path: '/alerting/routes', - roles: () => ['Admin', 'Editor'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertAmRoutes" */ 'app/features/alerting/unified/AmRoutes') - ), - }, - { - path: '/alerting/silences', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') - ), - }, - { - path: '/alerting/silence/new', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') - ), - }, - { - path: '/alerting/silence/:id/edit', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertSilences" */ 'app/features/alerting/unified/Silences') - ), - }, - { - path: '/alerting/notifications', - roles: config.unifiedAlertingEnabled ? () => ['Editor', 'Admin'] : undefined, - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/templates/new', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/templates/:id/edit', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/receivers/new', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/receivers/:id/edit', - roles: () => ['Editor', 'Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notifications/global-config', - roles: () => ['Admin', 'Editor'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "NotificationsListPage" */ 'app/features/alerting/NotificationsIndex') - ), - }, - { - path: '/alerting/notification/new', - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "NewNotificationChannel" */ 'app/features/alerting/NewNotificationChannelPage') - ), - }, - { - path: '/alerting/notification/:id/edit', - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "EditNotificationChannel"*/ 'app/features/alerting/EditNotificationChannelPage') - ), - }, - { - path: '/alerting/groups/', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertGroups" */ 'app/features/alerting/unified/AlertGroups') - ), - }, - { - path: '/alerting/new', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingRuleForm"*/ 'app/features/alerting/unified/RuleEditor') - ), - }, - { - path: '/alerting/:id/edit', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingRuleForm"*/ 'app/features/alerting/unified/RuleEditor') - ), - }, - { - path: '/alerting/:sourceName/:id/view', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingRule"*/ 'app/features/alerting/unified/RuleViewer') - ), - }, - { - path: '/alerting/:sourceName/:name/find', - pageClass: 'page-alerting', - component: SafeDynamicImport( - () => - import(/* webpackChunkName: "AlertingRedirectToRule"*/ 'app/features/alerting/unified/RedirectToRuleViewer') - ), - }, - { - path: '/alerting/admin', - roles: () => ['Admin'], - component: SafeDynamicImport( - () => import(/* webpackChunkName: "AlertingAdmin" */ 'app/features/alerting/unified/Admin') - ), - }, { path: '/playlists', component: SafeDynamicImport( @@ -502,6 +362,12 @@ export function getAppRoutes(): RouteDescriptor[] { () => import(/* webpackChunkName: "BenchmarksPage"*/ 'app/features/sandbox/BenchmarksPage') ), }, + { + path: '/sandbox/test', + component: SafeDynamicImport( + () => import(/* webpackChunkName: "TestStuffPage"*/ 'app/features/sandbox/TestStuffPage') + ), + }, { path: '/dashboards/f/:uid/:slug/library-panels', component: SafeDynamicImport( @@ -514,8 +380,9 @@ export function getAppRoutes(): RouteDescriptor[] { () => import(/* webpackChunkName: "LibraryPanelsPage"*/ 'app/features/library-panels/LibraryPanelsPage') ), }, - ...getPluginsAdminRoutes(), + ...getPluginCatalogRoutes(), ...getLiveRoutes(), + ...getAlertingRoutes(), ...extraRoutes, { path: '/*', diff --git a/public/app/types/accessControl.ts b/public/app/types/accessControl.ts index b036281d6aa..4aead88c760 100644 --- a/public/app/types/accessControl.ts +++ b/public/app/types/accessControl.ts @@ -25,6 +25,12 @@ export enum AccessControlAction { UsersQuotasList = 'users.quotas:list', UsersQuotasUpdate = 'users.quotas:update', + OrgsRead = 'orgs:read', + OrgsPreferencesRead = 'orgs.preferences:read', + OrgsWrite = 'orgs:write', + OrgsPreferencesWrite = 'orgs.preferences:write', + OrgsCreate = 'orgs:create', + OrgsDelete = 'orgs:delete', OrgUsersRead = 'org.users:read', OrgUsersAdd = 'org.users:add', OrgUsersRemove = 'org.users:remove', @@ -42,4 +48,19 @@ export enum AccessControlAction { DataSourcesPermissionsRead = 'datasources.permissions:read', ActionServerStatsRead = 'server.stats:read', + + ActionTeamsCreate = 'teams:create', +} + +export interface Role { + uid: string; + name: string; + displayName: string; + description: string; + group: string; + global: boolean; + delegatable?: boolean; + version: number; + created: string; + updated: string; } diff --git a/public/app/types/apiKeys.ts b/public/app/types/apiKeys.ts index 693852c34b0..ec370a96521 100644 --- a/public/app/types/apiKeys.ts +++ b/public/app/types/apiKeys.ts @@ -15,7 +15,9 @@ export interface NewApiKey { } export interface ApiKeysState { + includeExpired: boolean; keys: ApiKey[]; + keysIncludingExpired: ApiKey[]; searchQuery: string; hasFetched: boolean; } diff --git a/public/app/types/events.ts b/public/app/types/events.ts index 7311feb048f..1acce376945 100644 --- a/public/app/types/events.ts +++ b/public/app/types/events.ts @@ -85,7 +85,6 @@ export interface PanelChangeViewPayload {} export const dsRequestResponse = eventFactory('ds-request-response'); export const dsRequestError = eventFactory('ds-request-error'); -export const toggleSidemenuMobile = eventFactory('toggle-sidemenu-mobile'); export const toggleSidemenuHidden = eventFactory('toggle-sidemenu-hidden'); export const templateVariableValueUpdated = eventFactory('template-variable-value-updated'); export const graphClicked = eventFactory('graph-click'); @@ -145,6 +144,10 @@ export class ShiftTimeEvent extends BusEventWithPayload { static type = 'shift-time'; } +export class AbsoluteTimeEvent extends BusEventBase { + static type = 'absolute-time'; +} + export class RemovePanelEvent extends BusEventWithPayload { static type = 'remove-panel'; } diff --git a/public/app/types/explore.ts b/public/app/types/explore.ts index 0544a8d0255..0414bec869a 100644 --- a/public/app/types/explore.ts +++ b/public/app/types/explore.ts @@ -14,6 +14,7 @@ import { EventBusExtended, DataQueryResponse, } from '@grafana/data'; +import { ExploreGraphStyle } from 'app/core/utils/explore'; export enum ExploreId { left = 'left', @@ -167,6 +168,9 @@ export interface ExploreItemState { logsVolumeDataProvider?: Observable; logsVolumeDataSubscription?: SubscriptionLike; logsVolumeData?: DataQueryResponse; + + /* explore graph style */ + graphStyle: ExploreGraphStyle; } export interface ExploreUpdateState { diff --git a/public/app/types/index.ts b/public/app/types/index.ts index 1a566ab71b1..275bafc09af 100644 --- a/public/app/types/index.ts +++ b/public/app/types/index.ts @@ -6,6 +6,7 @@ export * from './dashboard'; export * from './acl'; export * from './apiKeys'; export * from './user'; +export * from './serviceaccount'; export * from './datasources'; export * from './plugins'; export * from './organization'; diff --git a/public/app/types/organization.ts b/public/app/types/organization.ts index da67ead34ae..926bced7bd5 100644 --- a/public/app/types/organization.ts +++ b/public/app/types/organization.ts @@ -1,3 +1,5 @@ +import { UserOrg } from 'app/types'; + export interface Organization { name: string; id: number; @@ -5,4 +7,5 @@ export interface Organization { export interface OrganizationState { organization: Organization; + userOrgs: UserOrg[]; } diff --git a/public/app/types/query.ts b/public/app/types/query.ts index e7f97e92523..bfa859ae135 100644 --- a/public/app/types/query.ts +++ b/public/app/types/query.ts @@ -1,4 +1,4 @@ -import { DataQuery } from '@grafana/data'; +import { DataQuery, DataSourceRef } from '@grafana/data'; import { ExpressionQuery } from '../features/expressions/types'; export interface QueryGroupOptions { @@ -14,8 +14,7 @@ export interface QueryGroupOptions { }; } -export interface QueryGroupDataSource { +export interface QueryGroupDataSource extends DataSourceRef { name?: string | null; - uid?: string; default?: boolean; } diff --git a/public/app/types/serviceaccount.ts b/public/app/types/serviceaccount.ts new file mode 100644 index 00000000000..7b16ab24231 --- /dev/null +++ b/public/app/types/serviceaccount.ts @@ -0,0 +1,49 @@ +import { OrgRole, Unit } from '.'; + +export interface OrgServiceAccount { + serviceAccountId: number; + avatarUrl: string; + email: string; + login: string; + name: string; + displayName: string; + orgId: number; + role: OrgRole; + tokens: number[]; +} + +export interface ServiceAccount { + id: number; + label: string; + avatarUrl: string; + login: string; + email: string; + name: string; + displayName: string; + orgId?: number; +} + +export interface ServiceAccountDTO { + id: number; + login: string; + email: string; + name: string; + isGrafanaAdmin: boolean; + isDisabled: boolean; + isAdmin?: boolean; + updatedAt?: string; + authLabels?: string[]; + avatarUrl?: string; + orgId?: number; + licensedRole?: string; + permissions?: string[]; + teams?: Unit[]; + orgs?: Unit[]; +} + +export interface ServiceAccountsState { + serviceAccounts: OrgServiceAccount[]; + searchQuery: string; + searchPage: number; + isLoading: boolean; +} diff --git a/public/app/types/suggestions.ts b/public/app/types/suggestions.ts new file mode 100644 index 00000000000..22889b632d9 --- /dev/null +++ b/public/app/types/suggestions.ts @@ -0,0 +1,30 @@ +export enum SuggestionName { + LineChart = 'Line chart', + LineChartSmooth = 'Line chart smooth', + LineChartGradientColorScheme = 'Line chart with gradient color scheme', + AreaChart = 'Area chart', + AreaChartStacked = 'Area chart stacked', + AreaChartStackedPercent = 'Area chart 100% stacked', + BarChart = 'Bar chart', + BarChartGradientColorScheme = 'Bar chart with gradient color scheme', + BarChartStacked = 'Bar chart stacked', + BarChartStackedPercent = 'Bar chart 100% stacked', + BarChartHorizontal = 'Bar chart horizontal', + BarChartHorizontalStacked = 'Bar chart horizontal stacked', + BarChartHorizontalStackedPercent = 'Bar chart horizontal 100% stacked', + Candlestick = 'Candlestick', + PieChart = 'Pie chart', + PieChartDonut = 'Pie chart donut', + Stat = 'Stat', + StatColoredBackground = 'Stat colored background', + Gauge = 'Gauge', + GaugeNoThresholds = 'Gauge no thresholds', + BarGaugeBasic = 'Bar gauge basic', + BarGaugeLCD = 'Bar gauge LCD', + Table = 'Table', + StateTimeline = 'State timeline', + StatusHistory = 'Status history', + TextPanel = 'Text', + DashboardList = 'Dashboard list', + Logs = 'Logs', +} diff --git a/public/app/types/unified-alerting-dto.ts b/public/app/types/unified-alerting-dto.ts index cd04d4050ab..94ffff70b43 100644 --- a/public/app/types/unified-alerting-dto.ts +++ b/public/app/types/unified-alerting-dto.ts @@ -99,6 +99,7 @@ export enum GrafanaAlertStateDecision { NoData = 'NoData', KeepLastState = 'KeepLastState', OK = 'OK', + Error = 'Error', } interface AlertDataQuery extends DataQuery { @@ -123,6 +124,7 @@ export interface PostableGrafanaRuleDefinition { data: AlertQuery[]; } export interface GrafanaRuleDefinition extends PostableGrafanaRuleDefinition { + id?: string; uid: string; namespace_uid: string; namespace_id: number; diff --git a/public/app/types/unified-alerting.ts b/public/app/types/unified-alerting.ts index c6861069254..2ee1d9213ed 100644 --- a/public/app/types/unified-alerting.ts +++ b/public/app/types/unified-alerting.ts @@ -1,6 +1,6 @@ /* Prometheus internal models */ -import { DataSourceInstanceSettings } from '@grafana/data'; +import { AlertState, DataSourceInstanceSettings } from '@grafana/data'; import { PromAlertingRuleState, PromRuleType, @@ -140,3 +140,35 @@ export interface SilenceFilterState { queryString?: string; silenceState?: string; } + +interface EvalMatch { + metric: string; + tags?: any; + value: number; +} + +export interface StateHistoryItemData { + noData: boolean; + evalMatches?: EvalMatch[]; +} + +export interface StateHistoryItem { + id: number; + alertId: number; + alertName: string; + dashboardId: number; + panelId: number; + userId: number; + newState: AlertState; + prevState: AlertState; + created: number; + updated: number; + time: number; + timeEnd: number; + text: string; + tags: any[]; + login: string; + email: string; + avatarUrl: string; + data: StateHistoryItemData; +} diff --git a/public/app/types/user.ts b/public/app/types/user.ts index df2dd4129cb..2983c53a781 100644 --- a/public/app/types/user.ts +++ b/public/app/types/user.ts @@ -1,7 +1,6 @@ import { OrgRole } from '.'; -import { SelectableValue } from '@grafana/data'; - -export interface OrgUser { +import { SelectableValue, WithAccessControlMetadata } from '@grafana/data'; +export interface OrgUser extends WithAccessControlMetadata { avatarUrl: string; email: string; lastSeenAt: string; @@ -25,7 +24,7 @@ export interface User { export type Unit = { name: string; url: string }; -export interface UserDTO { +export interface UserDTO extends WithAccessControlMetadata { id: number; login: string; email: string; diff --git a/public/app/types/window.d.ts b/public/app/types/window.d.ts index 43b9b281ea1..94bf02f0026 100644 --- a/public/app/types/window.d.ts +++ b/public/app/types/window.d.ts @@ -1,6 +1,8 @@ export declare global { interface Window { + __grafana_app_bundle_loaded: boolean; __grafana_public_path__: string; + __grafana_load_failed: () => void; public_cdn_path: string; } } diff --git a/public/emails/alert_notification.html b/public/emails/alert_notification.html index 1ffbd182400..8d7917c92d4 100644 --- a/public/emails/alert_notification.html +++ b/public/emails/alert_notification.html @@ -344,7 +344,7 @@ text-decoration: underline;
    {getFieldDisplayName(f, data)}:{fmt(f, rowIndex)}{v[0]}:{v[2]}
    - + - +