From 228c294ffa30b191c50ac147af319c8990a9395e Mon Sep 17 00:00:00 2001 From: Raghavan Date: Wed, 7 Feb 2024 04:55:44 +0530 Subject: [PATCH] Workflow to check JS and PY code format (#242) * fix css files * create workflow * format code using prettier * black ignore 3rd party folder * format py code using black * black exclude option in workflow * Don't format workflow files * Add contributing instructions to readme --------- Co-authored-by: WithoutPants <53250216+WithoutPants@users.noreply.github.com> --- .editorconfig | 12 + .github/workflows/check_code_format.yml | 50 + .github/workflows/deploy.yml | 45 +- .gitignore | 3 +- .prettierignore | 11 + .../Contents/DefaultPrefs.json | 288 +- README.md | 22 + package-lock.json | 29 + package.json | 12 + plugins/CropperJS/CropperJS.yml | 7 +- plugins/CropperJS/cropper.css | 257 +- plugins/CropperJS/cropper.js | 1954 +- plugins/DateParser/date_parser.py | 92 +- plugins/DateParser/date_parser.yml | 26 +- .../stashBatchResultToggle.js | 685 +- .../stashBatchResultToggle.yml | 18 +- plugins/TPBDMarkers/TPDBMarkers.yml | 2 +- plugins/TPBDMarkers/tpdbMarkers.py | 113 +- .../comicInfoExtractor/comicInfoExtractor.py | 96 +- .../defaultDataForPath/defaultDataForPath.js | 636 +- .../defaultDataForPath/defaultDataForPath.yml | 2 +- plugins/dupeMarker/dupeMarker.py | 90 +- plugins/dupeMarker/dupeMarker.yml | 4 +- plugins/filenameParser/filenameParser.js | 568 +- plugins/markerTagToScene/markerTagToScene.js | 96 +- plugins/markerTagToScene/markerTagToScene.yml | 2 +- plugins/miscTags/miscTags.py | 233 +- plugins/pathParser/pathParser.js | 583 +- plugins/pathParser/pathParser.yml | 14 +- plugins/phashDuplicateTagger/config.py | 87 +- .../phashDuplicateTagger.py | 400 +- .../phashDuplicateTagger.yml | 24 +- plugins/renamerOnUpdate/log.py | 31 +- plugins/renamerOnUpdate/renamerOnUpdate.py | 646 +- plugins/renamerOnUpdate/renamerOnUpdate.yml | 9 +- .../renamerOnUpdate/renamerOnUpdate_config.py | 78 +- .../sceneCoverCropper/sceneCoverCropper.js | 278 +- .../sceneCoverCropper/sceneCoverCropper.yml | 4 +- plugins/setSceneCoverFromFile/set_cover.py | 99 +- .../setSceneCoverFromFile/set_scene_cover.yml | 4 +- plugins/stashAI/stashai.css | 156 +- plugins/stashAI/stashai.js | 6056 ++-- plugins/stashAI/stashai.yml | 10 +- plugins/stashRealbooru/stash-realbooru.css | 82 +- plugins/stashRealbooru/stash-realbooru.js | 20027 ++++++++------ plugins/stashRealbooru/stash-realbooru.yml | 10 +- .../StashUserscriptLibrary.yml | 12 +- .../stashUserscriptLibrary.js | 3472 +-- .../stashdb-performer-gallery.py | 316 +- .../stashdb-performer-gallery.yml | 5 +- plugins/stats/stats.js | 292 +- plugins/stats/stats.yml | 18 +- plugins/tagGraph/config.py | 8 +- plugins/tagGraph/tag_graph.py | 405 +- plugins/tagGraph/tag_graph.yml | 2 +- plugins/timestampTrade/timestampTrade.py | 657 +- plugins/timestampTrade/timestampTrade.yml | 10 +- plugins/titleFromFilename/config.py | 2 +- plugins/titleFromFilename/graphql.py | 63 +- plugins/titleFromFilename/log.py | 31 +- .../titleFromFilename/titleFromFilename.py | 41 +- plugins/visage/visage.css | 133 +- plugins/visage/visage.js | 23015 +++++++++------- plugins/visage/visage.yml | 28 +- requirements.txt | 1 + .../Sqlite_Renamer/Stash_Sqlite_Renamer.py | 147 +- scripts/kodi-helper/kodi-helper.py | 178 +- scripts/stash-watcher/watcher.py | 123 +- themes/Theme-BlackHole/Theme-BlackHole.css | 29 +- themes/Theme-BlackHole/Theme-BlackHole.yml | 4 +- themes/Theme-ModernDark/Theme-ModernDark.css | 828 +- themes/Theme-ModernDark/Theme-ModernDark.yml | 2 +- themes/Theme-NeonDark/Theme-NeonDark.css | 1519 +- themes/Theme-NeonDark/Theme-NeonDark.yml | 2 +- themes/Theme-Night/Theme-Night.css | 142 +- themes/Theme-Night/Theme-Night.yml | 2 +- themes/Theme-Plex/Theme-Plex.css | 159 +- themes/Theme-Plex/Theme-Plex.yml | 2 +- themes/Theme-PornHub/Theme-PornHub.css | 67 +- themes/Theme-PornHub/Theme-PornHub.yml | 2 +- themes/Theme-Pulsar/Theme-Pulsar.css | 3316 ++- themes/Theme-Pulsar/Theme-Pulsar.yml | 2 +- .../Theme-PulsarLight/Theme-PulsarLight.css | 3360 ++- .../Theme-PulsarLight/Theme-PulsarLight.yml | 2 +- .../Theme-RoundedYellow.css | 352 +- .../Theme-RoundedYellow.yml | 2 +- .../stashdb_submission_helper.user.js | 347 +- 87 files changed, 42300 insertions(+), 30749 deletions(-) create mode 100644 .editorconfig create mode 100644 .github/workflows/check_code_format.yml create mode 100644 .prettierignore create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 requirements.txt diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..8f1d938 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false \ No newline at end of file diff --git a/.github/workflows/check_code_format.yml b/.github/workflows/check_code_format.yml new file mode 100644 index 0000000..1c82e7a --- /dev/null +++ b/.github/workflows/check_code_format.yml @@ -0,0 +1,50 @@ +name: Check Code Format + +on: + push: + branches: + - main + pull_request: + branches: + - main + +permissions: + contents: write + +jobs: + check_js_code_format: + name: Check JS code format + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.head_ref }} + + - name: Check format + uses: creyD/prettier_action@v4.3 + with: + prettier_options: --check + dry: true + only_changed: true + github_token: ${{ secrets.GITHUB_TOKEN }} + + check_py_code_format: + name: Check PY code format + runs-on: ubuntu-latest + needs: check_js_code_format + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + ref: ${{ github.head_ref }} + + - name: Check format + uses: psf/black@stable + with: + options: '--exclude="3rd party"' + src: "." diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 74b7f1e..dd668df 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -2,7 +2,7 @@ name: Deploy repository to Github Pages on: push: - branches: [ main, stable ] + branches: [main, stable] # Allows you to run this workflow manually from the Actions tab workflow_dispatch: @@ -17,27 +17,27 @@ jobs: build: runs-on: ubuntu-22.04 steps: - - name: Checkout main - uses: actions/checkout@v2 - with: - path: main - ref: main - fetch-depth: '0' - - run: | - cd main - ./build_site.sh ../_site/stable - - name: Checkout dev - uses: actions/checkout@v2 - with: - path: dev - # change this ref to whatever dev branch/tag we need when necessary - ref: main - fetch-depth: '0' - - run: | - cd dev - ../main/build_site.sh ../_site/develop - - uses: actions/upload-pages-artifact@v2 - + - name: Checkout main + uses: actions/checkout@v2 + with: + path: main + ref: main + fetch-depth: "0" + - run: | + cd main + ./build_site.sh ../_site/stable + - name: Checkout dev + uses: actions/checkout@v2 + with: + path: dev + # change this ref to whatever dev branch/tag we need when necessary + ref: main + fetch-depth: "0" + - run: | + cd dev + ../main/build_site.sh ../_site/develop + - uses: actions/upload-pages-artifact@v2 + deploy: environment: name: github-pages @@ -48,4 +48,3 @@ jobs: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v2 - diff --git a/.gitignore b/.gitignore index 16182c5..0320849 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -/_site \ No newline at end of file +/_site +node_modules \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..af4db47 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,11 @@ +*.md + +# dependencies +node_modules +package-lock.json + +# production +dist + +# workflows +.github \ No newline at end of file diff --git a/3rd party/StashPlexAgent.bundle/Contents/DefaultPrefs.json b/3rd party/StashPlexAgent.bundle/Contents/DefaultPrefs.json index 27fb244..6176182 100644 --- a/3rd party/StashPlexAgent.bundle/Contents/DefaultPrefs.json +++ b/3rd party/StashPlexAgent.bundle/Contents/DefaultPrefs.json @@ -1,146 +1,146 @@ [ - { - "id": "Hostname", - "label": "The host for Stash", - "type": "text", - "default": "127.0.0.1" - }, - { - "id": "Port", - "label": "The port for Stash", - "type": "text", - "default": "9999" - }, - { - "id": "UseHTTPS", - "label": "Use HTTPS instead of HTTP to connect", - "type": "bool", - "default": false - }, - { - "id": "APIKey", - "label": "The API Key for Stash if Authentication is enabled", - "type": "text", - "default": "" - }, - { - "id": "IncludeGalleryImages", - "label": "Include attached Gallery images in addition to default poster?", - "type": "bool", - "default": false - }, - { - "id": "SortGalleryImages", - "label": "If including gallery images, auto sort into poster/background based on orientation?", - "type": "bool", - "default": false - }, - { - "id": "AppendPerformerTags", - "label": "Include Performer Tags with the scraped scene tags?", - "type": "bool", - "default": false - }, - { - "id": "IgnoreTags", - "label": "Stash Tag ID numbers to ignore (comma separated, 0 to disable)", - "type": "text", - "default": "1,2,3318,6279" - }, - { - "id": "CreateTagCollectionTags", - "label": "Stash Tag ID numbers create Collections from (comma separated, 0 to disable)", - "type": "text", - "default": "0" - }, - { - "id": "CreateAllTagCollectionTags", - "label": "Create Collections from ALL Tags (If TRUE then option above will exclude instead of include tags)", - "type": "bool", - "default": false - }, - { - "id": "CreateSiteCollectionTags", - "label": "Auto create Plex Collection tags for scene Site", - "type": "bool", - "default": true - }, - { - "id": "PrefixSiteCollectionTags", - "label": "Prefix for Site Collection Names (The Site name will be appended to this value)", - "type": "text", - "default": "Site: " - }, - { - "id": "CreateStudioCollectionTags", - "label": "Auto create Plex Collection tags for scene Studio", - "type": "bool", - "default": true - }, - { - "id": "UseSiteForStudioCollectionTags", - "label": "If Studio is not defined, use Site instead (In Stash, Studio is the parent of the scene Studio)", - "type": "bool", - "default": false - }, - { - "id": "PrefixStudioCollectionTags", - "label": "Prefix for Studio Collection Names (The Studio name (if available) will be appended to this value)", - "type": "text", - "default": "Studio: " - }, - { - "id": "CreateMovieCollectionTags", - "label": "Auto create Plex Collection tags for associated scene Movie", - "type": "bool", - "default": false - }, - { - "id": "PrefixMovieCollectionTags", - "label": "Prefix for Movie Collection Names (The Movie title (if available) will be appended to this value)", - "type": "text", - "default": "Movie: " - }, - { - "id": "CreatePerformerCollectionTags", - "label": "Auto create Plex Collection tags for associated Performers", - "type": "bool", - "default": false - }, - { - "id": "PrefixPerformerCollectionTags", - "label": "Prefix for Performer Collection Names (The performer (if available) will be appended to this value)", - "type": "text", - "default": "Actor: " - }, - { - "id": "CreateRatingTags", - "label": "Auto create Plex Collection tags for Stash star rating", - "type": "bool", - "default": false - }, - { - "id": "RequireOrganized", - "label": "Require Organized flag to be set in Stash to pull metadata", - "type": "bool", - "default": false - }, - { - "id": "RequireURL", - "label": "Require scene URL to be set in Stash to pull metadata", - "type": "bool", - "default": false - }, - { - "id": "RequireStashID", - "label": "Require a scene StashID to be set in Stash to pull metadata", - "type": "bool", - "default": false - }, - { - "id": "debug", - "label": "Use debug logging", - "type": "bool", - "default": false - }, + { + "id": "Hostname", + "label": "The host for Stash", + "type": "text", + "default": "127.0.0.1" + }, + { + "id": "Port", + "label": "The port for Stash", + "type": "text", + "default": "9999" + }, + { + "id": "UseHTTPS", + "label": "Use HTTPS instead of HTTP to connect", + "type": "bool", + "default": false + }, + { + "id": "APIKey", + "label": "The API Key for Stash if Authentication is enabled", + "type": "text", + "default": "" + }, + { + "id": "IncludeGalleryImages", + "label": "Include attached Gallery images in addition to default poster?", + "type": "bool", + "default": false + }, + { + "id": "SortGalleryImages", + "label": "If including gallery images, auto sort into poster/background based on orientation?", + "type": "bool", + "default": false + }, + { + "id": "AppendPerformerTags", + "label": "Include Performer Tags with the scraped scene tags?", + "type": "bool", + "default": false + }, + { + "id": "IgnoreTags", + "label": "Stash Tag ID numbers to ignore (comma separated, 0 to disable)", + "type": "text", + "default": "1,2,3318,6279" + }, + { + "id": "CreateTagCollectionTags", + "label": "Stash Tag ID numbers create Collections from (comma separated, 0 to disable)", + "type": "text", + "default": "0" + }, + { + "id": "CreateAllTagCollectionTags", + "label": "Create Collections from ALL Tags (If TRUE then option above will exclude instead of include tags)", + "type": "bool", + "default": false + }, + { + "id": "CreateSiteCollectionTags", + "label": "Auto create Plex Collection tags for scene Site", + "type": "bool", + "default": true + }, + { + "id": "PrefixSiteCollectionTags", + "label": "Prefix for Site Collection Names (The Site name will be appended to this value)", + "type": "text", + "default": "Site: " + }, + { + "id": "CreateStudioCollectionTags", + "label": "Auto create Plex Collection tags for scene Studio", + "type": "bool", + "default": true + }, + { + "id": "UseSiteForStudioCollectionTags", + "label": "If Studio is not defined, use Site instead (In Stash, Studio is the parent of the scene Studio)", + "type": "bool", + "default": false + }, + { + "id": "PrefixStudioCollectionTags", + "label": "Prefix for Studio Collection Names (The Studio name (if available) will be appended to this value)", + "type": "text", + "default": "Studio: " + }, + { + "id": "CreateMovieCollectionTags", + "label": "Auto create Plex Collection tags for associated scene Movie", + "type": "bool", + "default": false + }, + { + "id": "PrefixMovieCollectionTags", + "label": "Prefix for Movie Collection Names (The Movie title (if available) will be appended to this value)", + "type": "text", + "default": "Movie: " + }, + { + "id": "CreatePerformerCollectionTags", + "label": "Auto create Plex Collection tags for associated Performers", + "type": "bool", + "default": false + }, + { + "id": "PrefixPerformerCollectionTags", + "label": "Prefix for Performer Collection Names (The performer (if available) will be appended to this value)", + "type": "text", + "default": "Actor: " + }, + { + "id": "CreateRatingTags", + "label": "Auto create Plex Collection tags for Stash star rating", + "type": "bool", + "default": false + }, + { + "id": "RequireOrganized", + "label": "Require Organized flag to be set in Stash to pull metadata", + "type": "bool", + "default": false + }, + { + "id": "RequireURL", + "label": "Require scene URL to be set in Stash to pull metadata", + "type": "bool", + "default": false + }, + { + "id": "RequireStashID", + "label": "Require a scene StashID to be set in Stash to pull metadata", + "type": "bool", + "default": false + }, + { + "id": "debug", + "label": "Use debug logging", + "type": "bool", + "default": false + } ] diff --git a/README.md b/README.md index 1945069..0f357c8 100644 --- a/README.md +++ b/README.md @@ -51,3 +51,25 @@ We welcome new themes, as well as patches to existing themes. ---------|---------------|-----------|---- StashDB |[StashDB Submission Helper](/userscripts/StashDB_Submission_Helper)|Adds handy functions for StashDB submissions like buttons to add aliases in bulk to a performer|:x: Kodi|[Kodi Helper](scripts/kodi-helper)|Generates `nfo` and `strm` for use with Kodi.|v0.7|:x: + +## Contributing + +Formatting is enforced on all files. + +[Yarn](https://yarnpkg.com/en/docs/install) must be installed to run the formatting tools. Python dependencies must also be installed to format `py` files. + +### Formatting non-`py` files + +For non-`py` files, files may be formatted using `prettier` + +After installing `yarn` and before running prettier for the first time, `prettier` must be installed by running: `yarn install --frozen-lockfile` + +To run `prettier` to format non-`py` files, run the following: `yarn run format` + +### Formatting `py` files + +`py` files are formatted using `black` which must be installed first. + +After installing `yarn` and before formatting for the first time, `black` must be installed by running: `pip install -r requirements.txt` + +To run `black` to format `py` files, run the following: `yarn run format-py` diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..5306f64 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,29 @@ +{ + "name": "community-scripts", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "community-scripts", + "license": "AGPL-3.0-only", + "devDependencies": { + "prettier": "^3.2.5" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..1691a6b --- /dev/null +++ b/package.json @@ -0,0 +1,12 @@ +{ + "name": "community-scripts", + "description": "This repository contains plugin and utility scripts created by the Stash community and hosted on the official GitHub repo.", + "license": "AGPL-3.0-only", + "scripts": { + "format": "prettier --write .", + "format-py": "black --exclude=\"3rd party\" ." + }, + "devDependencies": { + "prettier": "^3.2.5" + } +} diff --git a/plugins/CropperJS/CropperJS.yml b/plugins/CropperJS/CropperJS.yml index 7b5b6cb..38fb2e0 100644 --- a/plugins/CropperJS/CropperJS.yml +++ b/plugins/CropperJS/CropperJS.yml @@ -3,9 +3,8 @@ description: Exports cropper.js functionality for JS/Userscripts version: 1.6.1 ui: css: - - cropper.css + - cropper.css javascript: - - cropper.js - + - cropper.js # note - not minimized for more transparency around updates & diffs against source code -# https://github.com/fengyuanchen/cropperjs/tree/main/dist \ No newline at end of file +# https://github.com/fengyuanchen/cropperjs/tree/main/dist diff --git a/plugins/CropperJS/cropper.css b/plugins/CropperJS/cropper.css index 98a40ab..74935b2 100644 --- a/plugins/CropperJS/cropper.css +++ b/plugins/CropperJS/cropper.css @@ -14,24 +14,24 @@ line-height: 0; position: relative; -ms-touch-action: none; - touch-action: none; + touch-action: none; -webkit-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } .cropper-container img { - backface-visibility: hidden; - display: block; - height: 100%; - image-orientation: 0deg; - max-height: none !important; - max-width: none !important; - min-height: 0 !important; - min-width: 0 !important; - width: 100%; - } + backface-visibility: hidden; + display: block; + height: 100%; + image-orientation: 0deg; + max-height: none !important; + max-width: none !important; + min-height: 0 !important; + min-width: 0 !important; + width: 100%; +} .cropper-wrap-box, .cropper-canvas, @@ -77,22 +77,22 @@ } .cropper-dashed.dashed-h { - border-bottom-width: 1px; - border-top-width: 1px; - height: calc(100% / 3); - left: 0; - top: calc(100% / 3); - width: 100%; - } + border-bottom-width: 1px; + border-top-width: 1px; + height: calc(100% / 3); + left: 0; + top: calc(100% / 3); + width: 100%; +} .cropper-dashed.dashed-v { - border-left-width: 1px; - border-right-width: 1px; - height: 100%; - left: calc(100% / 3); - top: 0; - width: calc(100% / 3); - } + border-left-width: 1px; + border-right-width: 1px; + height: 100%; + left: calc(100% / 3); + top: 0; + width: calc(100% / 3); +} .cropper-center { display: block; @@ -105,26 +105,26 @@ } .cropper-center::before, - .cropper-center::after { - background-color: #eee; - content: ' '; - display: block; - position: absolute; - } +.cropper-center::after { + background-color: #eee; + content: " "; + display: block; + position: absolute; +} .cropper-center::before { - height: 1px; - left: -3px; - top: 0; - width: 7px; - } + height: 1px; + left: -3px; + top: 0; + width: 7px; +} .cropper-center::after { - height: 7px; - left: 0; - top: -3px; - width: 1px; - } + height: 7px; + left: 0; + top: -3px; + width: 1px; +} .cropper-face, .cropper-line, @@ -147,32 +147,32 @@ } .cropper-line.line-e { - cursor: ew-resize; - right: -3px; - top: 0; - width: 5px; - } + cursor: ew-resize; + right: -3px; + top: 0; + width: 5px; +} .cropper-line.line-n { - cursor: ns-resize; - height: 5px; - left: 0; - top: -3px; - } + cursor: ns-resize; + height: 5px; + left: 0; + top: -3px; +} .cropper-line.line-w { - cursor: ew-resize; - left: -3px; - top: 0; - width: 5px; - } + cursor: ew-resize; + left: -3px; + top: 0; + width: 5px; +} .cropper-line.line-s { - bottom: -3px; - cursor: ns-resize; - height: 5px; - left: 0; - } + bottom: -3px; + cursor: ns-resize; + height: 5px; + left: 0; +} .cropper-point { background-color: #39f; @@ -182,103 +182,100 @@ } .cropper-point.point-e { - cursor: ew-resize; - margin-top: -3px; - right: -3px; - top: 50%; - } + cursor: ew-resize; + margin-top: -3px; + right: -3px; + top: 50%; +} .cropper-point.point-n { - cursor: ns-resize; - left: 50%; - margin-left: -3px; - top: -3px; - } + cursor: ns-resize; + left: 50%; + margin-left: -3px; + top: -3px; +} .cropper-point.point-w { - cursor: ew-resize; - left: -3px; - margin-top: -3px; - top: 50%; - } + cursor: ew-resize; + left: -3px; + margin-top: -3px; + top: 50%; +} .cropper-point.point-s { - bottom: -3px; - cursor: s-resize; - left: 50%; - margin-left: -3px; - } + bottom: -3px; + cursor: s-resize; + left: 50%; + margin-left: -3px; +} .cropper-point.point-ne { - cursor: nesw-resize; - right: -3px; - top: -3px; - } + cursor: nesw-resize; + right: -3px; + top: -3px; +} .cropper-point.point-nw { - cursor: nwse-resize; - left: -3px; - top: -3px; - } + cursor: nwse-resize; + left: -3px; + top: -3px; +} .cropper-point.point-sw { - bottom: -3px; - cursor: nesw-resize; - left: -3px; - } + bottom: -3px; + cursor: nesw-resize; + left: -3px; +} .cropper-point.point-se { - bottom: -3px; - cursor: nwse-resize; - height: 20px; - opacity: 1; - right: -3px; - width: 20px; - } + bottom: -3px; + cursor: nwse-resize; + height: 20px; + opacity: 1; + right: -3px; + width: 20px; +} @media (min-width: 768px) { - -.cropper-point.point-se { - height: 15px; - width: 15px; + .cropper-point.point-se { + height: 15px; + width: 15px; } - } +} @media (min-width: 992px) { - -.cropper-point.point-se { - height: 10px; - width: 10px; + .cropper-point.point-se { + height: 10px; + width: 10px; } - } +} @media (min-width: 1200px) { - -.cropper-point.point-se { - height: 5px; - opacity: 0.75; - width: 5px; + .cropper-point.point-se { + height: 5px; + opacity: 0.75; + width: 5px; } - } +} .cropper-point.point-se::before { - background-color: #39f; - bottom: -50%; - content: ' '; - display: block; - height: 200%; - opacity: 0; - position: absolute; - right: -50%; - width: 200%; - } + background-color: #39f; + bottom: -50%; + content: " "; + display: block; + height: 200%; + opacity: 0; + position: absolute; + right: -50%; + width: 200%; +} .cropper-invisible { opacity: 0; } .cropper-bg { - background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC'); + background-image: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC"); } .cropper-hide { diff --git a/plugins/CropperJS/cropper.js b/plugins/CropperJS/cropper.js index 55a50c8..8d321c7 100644 --- a/plugins/CropperJS/cropper.js +++ b/plugins/CropperJS/cropper.js @@ -9,40 +9,66 @@ */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Cropper = factory()); -})(this, (function () { 'use strict'; + typeof exports === "object" && typeof module !== "undefined" + ? (module.exports = factory()) + : typeof define === "function" && define.amd + ? define(factory) + : ((global = + typeof globalThis !== "undefined" ? globalThis : global || self), + (global.Cropper = factory())); +})(this, function () { + "use strict"; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); - r && (o = o.filter(function (r) { - return Object.getOwnPropertyDescriptor(e, r).enumerable; - })), t.push.apply(t, o); + r && + (o = o.filter(function (r) { + return Object.getOwnPropertyDescriptor(e, r).enumerable; + })), + t.push.apply(t, o); } return t; } function _objectSpread2(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; - r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { - _defineProperty(e, r, t[r]); - }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { - Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); - }); + r % 2 + ? ownKeys(Object(t), !0).forEach(function (r) { + _defineProperty(e, r, t[r]); + }) + : Object.getOwnPropertyDescriptors + ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) + : ownKeys(Object(t)).forEach(function (r) { + Object.defineProperty( + e, + r, + Object.getOwnPropertyDescriptor(t, r), + ); + }); } return e; } function _typeof(o) { "@babel/helpers - typeof"; - return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { - return typeof o; - } : function (o) { - return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; - }, _typeof(o); + return ( + (_typeof = + "function" == typeof Symbol && "symbol" == typeof Symbol.iterator + ? function (o) { + return typeof o; + } + : function (o) { + return o && + "function" == typeof Symbol && + o.constructor === Symbol && + o !== Symbol.prototype + ? "symbol" + : typeof o; + }), + _typeof(o) + ); } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { @@ -62,7 +88,7 @@ if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { - writable: false + writable: false, }); return Constructor; } @@ -73,7 +99,7 @@ value: value, enumerable: true, configurable: true, - writable: true + writable: true, }); } else { obj[key] = value; @@ -81,13 +107,22 @@ return obj; } function _toConsumableArray(arr) { - return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); + return ( + _arrayWithoutHoles(arr) || + _iterableToArray(arr) || + _unsupportedIterableToArray(arr) || + _nonIterableSpread() + ); } function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); } function _iterableToArray(iter) { - if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); + if ( + (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null) || + iter["@@iterator"] != null + ) + return Array.from(iter); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; @@ -95,7 +130,8 @@ var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); - if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); + if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) + return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; @@ -103,7 +139,9 @@ return arr2; } function _nonIterableSpread() { - throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); + throw new TypeError( + "Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.", + ); } function _toPrimitive(input, hint) { if (typeof input !== "object" || input === null) return input; @@ -120,25 +158,29 @@ return typeof key === "symbol" ? key : String(key); } - var IS_BROWSER = typeof window !== 'undefined' && typeof window.document !== 'undefined'; + var IS_BROWSER = + typeof window !== "undefined" && typeof window.document !== "undefined"; var WINDOW = IS_BROWSER ? window : {}; - var IS_TOUCH_DEVICE = IS_BROWSER && WINDOW.document.documentElement ? 'ontouchstart' in WINDOW.document.documentElement : false; - var HAS_POINTER_EVENT = IS_BROWSER ? 'PointerEvent' in WINDOW : false; - var NAMESPACE = 'cropper'; + var IS_TOUCH_DEVICE = + IS_BROWSER && WINDOW.document.documentElement + ? "ontouchstart" in WINDOW.document.documentElement + : false; + var HAS_POINTER_EVENT = IS_BROWSER ? "PointerEvent" in WINDOW : false; + var NAMESPACE = "cropper"; // Actions - var ACTION_ALL = 'all'; - var ACTION_CROP = 'crop'; - var ACTION_MOVE = 'move'; - var ACTION_ZOOM = 'zoom'; - var ACTION_EAST = 'e'; - var ACTION_WEST = 'w'; - var ACTION_SOUTH = 's'; - var ACTION_NORTH = 'n'; - var ACTION_NORTH_EAST = 'ne'; - var ACTION_NORTH_WEST = 'nw'; - var ACTION_SOUTH_EAST = 'se'; - var ACTION_SOUTH_WEST = 'sw'; + var ACTION_ALL = "all"; + var ACTION_CROP = "crop"; + var ACTION_MOVE = "move"; + var ACTION_ZOOM = "zoom"; + var ACTION_EAST = "e"; + var ACTION_WEST = "w"; + var ACTION_SOUTH = "s"; + var ACTION_NORTH = "n"; + var ACTION_NORTH_EAST = "ne"; + var ACTION_NORTH_WEST = "nw"; + var ACTION_SOUTH_EAST = "se"; + var ACTION_SOUTH_WEST = "sw"; // Classes var CLASS_CROP = "".concat(NAMESPACE, "-crop"); @@ -154,29 +196,33 @@ var DATA_PREVIEW = "".concat(NAMESPACE, "Preview"); // Drag modes - var DRAG_MODE_CROP = 'crop'; - var DRAG_MODE_MOVE = 'move'; - var DRAG_MODE_NONE = 'none'; + var DRAG_MODE_CROP = "crop"; + var DRAG_MODE_MOVE = "move"; + var DRAG_MODE_NONE = "none"; // Events - var EVENT_CROP = 'crop'; - var EVENT_CROP_END = 'cropend'; - var EVENT_CROP_MOVE = 'cropmove'; - var EVENT_CROP_START = 'cropstart'; - var EVENT_DBLCLICK = 'dblclick'; - var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? 'touchstart' : 'mousedown'; - var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? 'touchmove' : 'mousemove'; - var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? 'touchend touchcancel' : 'mouseup'; - var EVENT_POINTER_DOWN = HAS_POINTER_EVENT ? 'pointerdown' : EVENT_TOUCH_START; - var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? 'pointermove' : EVENT_TOUCH_MOVE; - var EVENT_POINTER_UP = HAS_POINTER_EVENT ? 'pointerup pointercancel' : EVENT_TOUCH_END; - var EVENT_READY = 'ready'; - var EVENT_RESIZE = 'resize'; - var EVENT_WHEEL = 'wheel'; - var EVENT_ZOOM = 'zoom'; + var EVENT_CROP = "crop"; + var EVENT_CROP_END = "cropend"; + var EVENT_CROP_MOVE = "cropmove"; + var EVENT_CROP_START = "cropstart"; + var EVENT_DBLCLICK = "dblclick"; + var EVENT_TOUCH_START = IS_TOUCH_DEVICE ? "touchstart" : "mousedown"; + var EVENT_TOUCH_MOVE = IS_TOUCH_DEVICE ? "touchmove" : "mousemove"; + var EVENT_TOUCH_END = IS_TOUCH_DEVICE ? "touchend touchcancel" : "mouseup"; + var EVENT_POINTER_DOWN = HAS_POINTER_EVENT + ? "pointerdown" + : EVENT_TOUCH_START; + var EVENT_POINTER_MOVE = HAS_POINTER_EVENT ? "pointermove" : EVENT_TOUCH_MOVE; + var EVENT_POINTER_UP = HAS_POINTER_EVENT + ? "pointerup pointercancel" + : EVENT_TOUCH_END; + var EVENT_READY = "ready"; + var EVENT_RESIZE = "resize"; + var EVENT_WHEEL = "wheel"; + var EVENT_ZOOM = "zoom"; // Mime types - var MIME_TYPE_JPEG = 'image/jpeg'; + var MIME_TYPE_JPEG = "image/jpeg"; // RegExps var REGEXP_ACTIONS = /^e|w|s|n|se|sw|ne|nw|all|crop|move|zoom$/; @@ -205,7 +251,7 @@ // An object with the previous cropping result data data: null, // A selector for adding extra containers to preview - preview: '', + preview: "", // Re-render the cropper when resize the window responsive: true, // Restore the cropped area after resize the window @@ -261,10 +307,35 @@ cropmove: null, cropend: null, crop: null, - zoom: null + zoom: null, }; - var TEMPLATE = '
' + '
' + '
' + '
' + '
' + '
' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '' + '
' + '
'; + var TEMPLATE = + '
' + + '
' + + '
' + + "
" + + '
' + + '
' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + '' + + "
" + + "
"; /** * Check if the given value is not a number. @@ -277,7 +348,7 @@ * @returns {boolean} Returns `true` if the given value is a number, else `false`. */ function isNumber(value) { - return typeof value === 'number' && !isNaN(value); + return typeof value === "number" && !isNaN(value); } /** @@ -295,7 +366,7 @@ * @returns {boolean} Returns `true` if the given value is undefined, else `false`. */ function isUndefined(value) { - return typeof value === 'undefined'; + return typeof value === "undefined"; } /** @@ -304,7 +375,7 @@ * @returns {boolean} Returns `true` if the given value is an object, else `false`. */ function isObject(value) { - return _typeof(value) === 'object' && value !== null; + return _typeof(value) === "object" && value !== null; } var hasOwnProperty = Object.prototype.hasOwnProperty; @@ -320,7 +391,11 @@ try { var _constructor = value.constructor; var prototype = _constructor.prototype; - return _constructor && prototype && hasOwnProperty.call(prototype, 'isPrototypeOf'); + return ( + _constructor && + prototype && + hasOwnProperty.call(prototype, "isPrototypeOf") + ); } catch (error) { return false; } @@ -332,7 +407,7 @@ * @returns {boolean} Returns `true` if the given value is a function, else `false`. */ function isFunction(value) { - return typeof value === 'function'; + return typeof value === "function"; } var slice = Array.prototype.slice; @@ -372,21 +447,29 @@ * @param {*} args - The rest objects for merging to the target object. * @returns {Object} The extended object. */ - var assign = Object.assign || function assign(target) { - for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) { - args[_key - 1] = arguments[_key]; - } - if (isObject(target) && args.length > 0) { - args.forEach(function (arg) { - if (isObject(arg)) { - Object.keys(arg).forEach(function (key) { - target[key] = arg[key]; - }); - } - }); - } - return target; - }; + var assign = + Object.assign || + function assign(target) { + for ( + var _len = arguments.length, + args = new Array(_len > 1 ? _len - 1 : 0), + _key = 1; + _key < _len; + _key++ + ) { + args[_key - 1] = arguments[_key]; + } + if (isObject(target) && args.length > 0) { + args.forEach(function (arg) { + if (isObject(arg)) { + Object.keys(arg).forEach(function (key) { + target[key] = arg[key]; + }); + } + }); + } + return target; + }; var REGEXP_DECIMALS = /\.\d*(?:0|9){12}\d*$/; /** @@ -397,8 +480,13 @@ * @returns {number} Returns the normalized number. */ function normalizeDecimalNumber(value) { - var times = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 100000000000; - return REGEXP_DECIMALS.test(value) ? Math.round(value * times) / times : value; + var times = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : 100000000000; + return REGEXP_DECIMALS.test(value) + ? Math.round(value * times) / times + : value; } var REGEXP_SUFFIX = /^width|height|left|top|marginLeft|marginTop$/; @@ -424,7 +512,9 @@ * @returns {boolean} Returns `true` if the special class was found. */ function hasClass(element, value) { - return element.classList ? element.classList.contains(value) : element.className.indexOf(value) > -1; + return element.classList + ? element.classList.contains(value) + : element.className.indexOf(value) > -1; } /** @@ -474,7 +564,7 @@ return; } if (element.className.indexOf(value) >= 0) { - element.className = element.className.replace(value, ''); + element.className = element.className.replace(value, ""); } } @@ -510,7 +600,7 @@ * @returns {string} The transformed value. */ function toParamCase(value) { - return value.replace(REGEXP_CAMEL_CASE, '$1-$2').toLowerCase(); + return value.replace(REGEXP_CAMEL_CASE, "$1-$2").toLowerCase(); } /** @@ -569,12 +659,12 @@ } } var REGEXP_SPACES = /\s\s*/; - var onceSupported = function () { + var onceSupported = (function () { var supported = false; if (IS_BROWSER) { var once = false; var listener = function listener() {}; - var options = Object.defineProperty({}, 'once', { + var options = Object.defineProperty({}, "once", { get: function get() { supported = true; return once; @@ -586,13 +676,13 @@ */ set: function set(value) { once = value; - } + }, }); - WINDOW.addEventListener('test', listener, options); - WINDOW.removeEventListener('test', listener, options); + WINDOW.addEventListener("test", listener, options); + WINDOW.removeEventListener("test", listener, options); } return supported; - }(); + })(); /** * Remove event listener from the target element. @@ -602,24 +692,28 @@ * @param {Object} options - The event options. */ function removeListener(element, type, listener) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var options = + arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var handler = listener; - type.trim().split(REGEXP_SPACES).forEach(function (event) { - if (!onceSupported) { - var listeners = element.listeners; - if (listeners && listeners[event] && listeners[event][listener]) { - handler = listeners[event][listener]; - delete listeners[event][listener]; - if (Object.keys(listeners[event]).length === 0) { - delete listeners[event]; - } - if (Object.keys(listeners).length === 0) { - delete element.listeners; + type + .trim() + .split(REGEXP_SPACES) + .forEach(function (event) { + if (!onceSupported) { + var listeners = element.listeners; + if (listeners && listeners[event] && listeners[event][listener]) { + handler = listeners[event][listener]; + delete listeners[event][listener]; + if (Object.keys(listeners[event]).length === 0) { + delete listeners[event]; + } + if (Object.keys(listeners).length === 0) { + delete element.listeners; + } } } - } - element.removeEventListener(event, handler, options); - }); + element.removeEventListener(event, handler, options); + }); } /** @@ -630,31 +724,43 @@ * @param {Object} options - The event options. */ function addListener(element, type, listener) { - var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; + var options = + arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {}; var _handler = listener; - type.trim().split(REGEXP_SPACES).forEach(function (event) { - if (options.once && !onceSupported) { - var _element$listeners = element.listeners, - listeners = _element$listeners === void 0 ? {} : _element$listeners; - _handler = function handler() { - delete listeners[event][listener]; - element.removeEventListener(event, _handler, options); - for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; + type + .trim() + .split(REGEXP_SPACES) + .forEach(function (event) { + if (options.once && !onceSupported) { + var _element$listeners = element.listeners, + listeners = _element$listeners === void 0 ? {} : _element$listeners; + _handler = function handler() { + delete listeners[event][listener]; + element.removeEventListener(event, _handler, options); + for ( + var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; + _key2 < _len2; + _key2++ + ) { + args[_key2] = arguments[_key2]; + } + listener.apply(element, args); + }; + if (!listeners[event]) { + listeners[event] = {}; } - listener.apply(element, args); - }; - if (!listeners[event]) { - listeners[event] = {}; + if (listeners[event][listener]) { + element.removeEventListener( + event, + listeners[event][listener], + options, + ); + } + listeners[event][listener] = _handler; + element.listeners = listeners; } - if (listeners[event][listener]) { - element.removeEventListener(event, listeners[event][listener], options); - } - listeners[event][listener] = _handler; - element.listeners = listeners; - } - element.addEventListener(event, _handler, options); - }); + element.addEventListener(event, _handler, options); + }); } /** @@ -672,10 +778,10 @@ event = new CustomEvent(type, { detail: data, bubbles: true, - cancelable: true + cancelable: true, }); } else { - event = document.createEvent('CustomEvent'); + event = document.createEvent("CustomEvent"); event.initCustomEvent(type, true, true, data); } return element.dispatchEvent(event); @@ -689,8 +795,9 @@ function getOffset(element) { var box = element.getBoundingClientRect(); return { - left: box.left + (window.pageXOffset - document.documentElement.clientLeft), - top: box.top + (window.pageYOffset - document.documentElement.clientTop) + left: + box.left + (window.pageXOffset - document.documentElement.clientLeft), + top: box.top + (window.pageYOffset - document.documentElement.clientTop), }; } var location = WINDOW.location; @@ -703,7 +810,12 @@ */ function isCrossOriginURL(url) { var parts = url.match(REGEXP_ORIGINS); - return parts !== null && (parts[1] !== location.protocol || parts[2] !== location.hostname || parts[3] !== location.port); + return ( + parts !== null && + (parts[1] !== location.protocol || + parts[2] !== location.hostname || + parts[3] !== location.port) + ); } /** @@ -713,7 +825,7 @@ */ function addTimestamp(url) { var timestamp = "timestamp=".concat(new Date().getTime()); - return url + (url.indexOf('?') === -1 ? '?' : '&') + timestamp; + return url + (url.indexOf("?") === -1 ? "?" : "&") + timestamp; } /** @@ -745,11 +857,11 @@ if (isNumber(scaleY) && scaleY !== 1) { values.push("scaleY(".concat(scaleY, ")")); } - var transform = values.length ? values.join(' ') : 'none'; + var transform = values.length ? values.join(" ") : "none"; return { WebkitTransform: transform, msTransform: transform, - transform: transform + transform: transform, }; } @@ -790,12 +902,17 @@ pageY = _ref2.pageY; var end = { endX: pageX, - endY: pageY + endY: pageY, }; - return endOnly ? end : _objectSpread2({ - startX: pageX, - startY: pageY - }, end); + return endOnly + ? end + : _objectSpread2( + { + startX: pageX, + startY: pageY, + }, + end, + ); } /** @@ -818,7 +935,7 @@ pageY /= count; return { pageX: pageX, - pageY: pageY + pageY: pageY, }; } @@ -832,12 +949,18 @@ var aspectRatio = _ref4.aspectRatio, height = _ref4.height, width = _ref4.width; - var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'contain'; + var type = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : "contain"; var isValidWidth = isPositiveNumber(width); var isValidHeight = isPositiveNumber(height); if (isValidWidth && isValidHeight) { var adjustedWidth = height * aspectRatio; - if (type === 'contain' && adjustedWidth > width || type === 'cover' && adjustedWidth < width) { + if ( + (type === "contain" && adjustedWidth > width) || + (type === "cover" && adjustedWidth < width) + ) { height = width / aspectRatio; } else { width = height * aspectRatio; @@ -849,7 +972,7 @@ } return { width: width, - height: height + height: height, }; } @@ -866,21 +989,23 @@ if (degree === 90) { return { width: height, - height: width + height: width, }; } - var arc = degree % 90 * Math.PI / 180; + var arc = ((degree % 90) * Math.PI) / 180; var sinArc = Math.sin(arc); var cosArc = Math.cos(arc); var newWidth = width * cosArc + height * sinArc; var newHeight = width * sinArc + height * cosArc; - return degree > 90 ? { - width: newHeight, - height: newWidth - } : { - width: newWidth, - height: newHeight - }; + return degree > 90 + ? { + width: newHeight, + height: newWidth, + } + : { + width: newWidth, + height: newHeight, + }; } /** @@ -905,11 +1030,13 @@ naturalWidth = _ref7.naturalWidth, naturalHeight = _ref7.naturalHeight; var _ref8$fillColor = _ref8.fillColor, - fillColor = _ref8$fillColor === void 0 ? 'transparent' : _ref8$fillColor, + fillColor = _ref8$fillColor === void 0 ? "transparent" : _ref8$fillColor, _ref8$imageSmoothingE = _ref8.imageSmoothingEnabled, - imageSmoothingEnabled = _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE, + imageSmoothingEnabled = + _ref8$imageSmoothingE === void 0 ? true : _ref8$imageSmoothingE, _ref8$imageSmoothingQ = _ref8.imageSmoothingQuality, - imageSmoothingQuality = _ref8$imageSmoothingQ === void 0 ? 'low' : _ref8$imageSmoothingQ, + imageSmoothingQuality = + _ref8$imageSmoothingQ === void 0 ? "low" : _ref8$imageSmoothingQ, _ref8$maxWidth = _ref8.maxWidth, maxWidth = _ref8$maxWidth === void 0 ? Infinity : _ref8$maxWidth, _ref8$maxHeight = _ref8.maxHeight, @@ -918,35 +1045,53 @@ minWidth = _ref8$minWidth === void 0 ? 0 : _ref8$minWidth, _ref8$minHeight = _ref8.minHeight, minHeight = _ref8$minHeight === void 0 ? 0 : _ref8$minHeight; - var canvas = document.createElement('canvas'); - var context = canvas.getContext('2d'); + var canvas = document.createElement("canvas"); + var context = canvas.getContext("2d"); var maxSizes = getAdjustedSizes({ aspectRatio: aspectRatio, width: maxWidth, - height: maxHeight + height: maxHeight, }); - var minSizes = getAdjustedSizes({ - aspectRatio: aspectRatio, - width: minWidth, - height: minHeight - }, 'cover'); - var width = Math.min(maxSizes.width, Math.max(minSizes.width, naturalWidth)); - var height = Math.min(maxSizes.height, Math.max(minSizes.height, naturalHeight)); + var minSizes = getAdjustedSizes( + { + aspectRatio: aspectRatio, + width: minWidth, + height: minHeight, + }, + "cover", + ); + var width = Math.min( + maxSizes.width, + Math.max(minSizes.width, naturalWidth), + ); + var height = Math.min( + maxSizes.height, + Math.max(minSizes.height, naturalHeight), + ); // Note: should always use image's natural sizes for drawing as // imageData.naturalWidth === canvasData.naturalHeight when rotate % 180 === 90 var destMaxSizes = getAdjustedSizes({ aspectRatio: imageAspectRatio, width: maxWidth, - height: maxHeight + height: maxHeight, }); - var destMinSizes = getAdjustedSizes({ - aspectRatio: imageAspectRatio, - width: minWidth, - height: minHeight - }, 'cover'); - var destWidth = Math.min(destMaxSizes.width, Math.max(destMinSizes.width, imageNaturalWidth)); - var destHeight = Math.min(destMaxSizes.height, Math.max(destMinSizes.height, imageNaturalHeight)); + var destMinSizes = getAdjustedSizes( + { + aspectRatio: imageAspectRatio, + width: minWidth, + height: minHeight, + }, + "cover", + ); + var destWidth = Math.min( + destMaxSizes.width, + Math.max(destMinSizes.width, imageNaturalWidth), + ); + var destHeight = Math.min( + destMaxSizes.height, + Math.max(destMinSizes.height, imageNaturalHeight), + ); var params = [-destWidth / 2, -destHeight / 2, destWidth, destHeight]; canvas.width = normalizeDecimalNumber(width); canvas.height = normalizeDecimalNumber(height); @@ -954,13 +1099,20 @@ context.fillRect(0, 0, width, height); context.save(); context.translate(width / 2, height / 2); - context.rotate(rotate * Math.PI / 180); + context.rotate((rotate * Math.PI) / 180); context.scale(scaleX, scaleY); context.imageSmoothingEnabled = imageSmoothingEnabled; context.imageSmoothingQuality = imageSmoothingQuality; - context.drawImage.apply(context, [image].concat(_toConsumableArray(params.map(function (param) { - return Math.floor(normalizeDecimalNumber(param)); - })))); + context.drawImage.apply( + context, + [image].concat( + _toConsumableArray( + params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + }), + ), + ), + ); context.restore(); return canvas; } @@ -974,7 +1126,7 @@ * @returns {string} The read result. */ function getStringFromCharCode(dataView, start, length) { - var str = ''; + var str = ""; length += start; for (var i = start; i < length; i += 1) { str += fromCharCode(dataView.getUint8(i)); @@ -989,7 +1141,7 @@ * @returns {ArrayBuffer} The result array buffer. */ function dataURLToArrayBuffer(dataURL) { - var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ''); + var base64 = dataURL.replace(REGEXP_DATA_URL_HEAD, ""); var binary = atob(base64); var arrayBuffer = new ArrayBuffer(binary.length); var uint8 = new Uint8Array(arrayBuffer); @@ -1014,10 +1166,12 @@ while (uint8.length > 0) { // XXX: Babel's `toConsumableArray` helper will throw error in IE or Safari 9 // eslint-disable-next-line prefer-spread - chunks.push(fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize)))); + chunks.push( + fromCharCode.apply(null, toArray(uint8.subarray(0, chunkSize))), + ); uint8 = uint8.subarray(chunkSize); } - return "data:".concat(mimeType, ";base64,").concat(btoa(chunks.join(''))); + return "data:".concat(mimeType, ";base64,").concat(btoa(chunks.join(""))); } /** @@ -1036,11 +1190,14 @@ var ifdStart; // Only handle JPEG image (start by 0xFFD8) - if (dataView.getUint8(0) === 0xFF && dataView.getUint8(1) === 0xD8) { + if (dataView.getUint8(0) === 0xff && dataView.getUint8(1) === 0xd8) { var length = dataView.byteLength; var offset = 2; while (offset + 1 < length) { - if (dataView.getUint8(offset) === 0xFF && dataView.getUint8(offset + 1) === 0xE1) { + if ( + dataView.getUint8(offset) === 0xff && + dataView.getUint8(offset + 1) === 0xe1 + ) { app1Start = offset; break; } @@ -1050,12 +1207,15 @@ if (app1Start) { var exifIDCode = app1Start + 4; var tiffOffset = app1Start + 10; - if (getStringFromCharCode(dataView, exifIDCode, 4) === 'Exif') { + if (getStringFromCharCode(dataView, exifIDCode, 4) === "Exif") { var endianness = dataView.getUint16(tiffOffset); littleEndian = endianness === 0x4949; - if (littleEndian || endianness === 0x4D4D /* bigEndian */) { - if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002A) { - var firstIFDOffset = dataView.getUint32(tiffOffset + 4, littleEndian); + if (littleEndian || endianness === 0x4d4d /* bigEndian */) { + if (dataView.getUint16(tiffOffset + 2, littleEndian) === 0x002a) { + var firstIFDOffset = dataView.getUint32( + tiffOffset + 4, + littleEndian, + ); if (firstIFDOffset >= 0x00000008) { ifdStart = tiffOffset + firstIFDOffset; } @@ -1069,7 +1229,10 @@ var i; for (i = 0; i < _length; i += 1) { _offset = ifdStart + i * 12 + 2; - if (dataView.getUint16(_offset, littleEndian) === 0x0112 /* Orientation */) { + if ( + dataView.getUint16(_offset, littleEndian) === + 0x0112 /* Orientation */ + ) { // 8 is the offset of the current tag's value _offset += 8; @@ -1138,7 +1301,7 @@ return { rotate: rotate, scaleX: scaleX, - scaleY: scaleY + scaleY: scaleY, }; } @@ -1162,13 +1325,19 @@ addClass(cropper, CLASS_HIDDEN); removeClass(element, CLASS_HIDDEN); var containerData = { - width: Math.max(container.offsetWidth, minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH), - height: Math.max(container.offsetHeight, minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT) + width: Math.max( + container.offsetWidth, + minWidth >= 0 ? minWidth : MIN_CONTAINER_WIDTH, + ), + height: Math.max( + container.offsetHeight, + minHeight >= 0 ? minHeight : MIN_CONTAINER_HEIGHT, + ), }; this.containerData = containerData; setStyle(cropper, { width: containerData.width, - height: containerData.height + height: containerData.height, }); addClass(element, CLASS_HIDDEN); removeClass(cropper, CLASS_HIDDEN); @@ -1179,8 +1348,12 @@ imageData = this.imageData; var viewMode = this.options.viewMode; var rotated = Math.abs(imageData.rotate) % 180 === 90; - var naturalWidth = rotated ? imageData.naturalHeight : imageData.naturalWidth; - var naturalHeight = rotated ? imageData.naturalWidth : imageData.naturalHeight; + var naturalWidth = rotated + ? imageData.naturalHeight + : imageData.naturalWidth; + var naturalHeight = rotated + ? imageData.naturalWidth + : imageData.naturalHeight; var aspectRatio = naturalWidth / naturalHeight; var canvasWidth = containerData.width; var canvasHeight = containerData.height; @@ -1200,13 +1373,19 @@ naturalWidth: naturalWidth, naturalHeight: naturalHeight, width: canvasWidth, - height: canvasHeight + height: canvasHeight, }; this.canvasData = canvasData; this.limited = viewMode === 1 || viewMode === 2; this.limitCanvas(true, true); - canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth); - canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight); + canvasData.width = Math.min( + Math.max(canvasData.width, canvasData.minWidth), + canvasData.maxWidth, + ); + canvasData.height = Math.min( + Math.max(canvasData.height, canvasData.minHeight), + canvasData.maxHeight, + ); canvasData.left = (containerData.width - canvasData.width) / 2; canvasData.top = (containerData.height - canvasData.height) / 2; canvasData.oldLeft = canvasData.left; @@ -1236,9 +1415,15 @@ } } else if (viewMode > 0) { if (minCanvasWidth) { - minCanvasWidth = Math.max(minCanvasWidth, cropped ? cropBoxData.width : 0); + minCanvasWidth = Math.max( + minCanvasWidth, + cropped ? cropBoxData.width : 0, + ); } else if (minCanvasHeight) { - minCanvasHeight = Math.max(minCanvasHeight, cropped ? cropBoxData.height : 0); + minCanvasHeight = Math.max( + minCanvasHeight, + cropped ? cropBoxData.height : 0, + ); } else if (cropped) { minCanvasWidth = cropBoxData.width; minCanvasHeight = cropBoxData.height; @@ -1252,7 +1437,7 @@ var _getAdjustedSizes = getAdjustedSizes({ aspectRatio: aspectRatio, width: minCanvasWidth, - height: minCanvasHeight + height: minCanvasHeight, }); minCanvasWidth = _getAdjustedSizes.width; minCanvasHeight = _getAdjustedSizes.height; @@ -1270,8 +1455,14 @@ canvasData.maxLeft = Math.max(0, newCanvasLeft); canvasData.maxTop = Math.max(0, newCanvasTop); if (cropped && this.limited) { - canvasData.minLeft = Math.min(cropBoxData.left, cropBoxData.left + (cropBoxData.width - canvasData.width)); - canvasData.minTop = Math.min(cropBoxData.top, cropBoxData.top + (cropBoxData.height - canvasData.height)); + canvasData.minLeft = Math.min( + cropBoxData.left, + cropBoxData.left + (cropBoxData.width - canvasData.width), + ); + canvasData.minTop = Math.min( + cropBoxData.top, + cropBoxData.top + (cropBoxData.height - canvasData.height), + ); canvasData.maxLeft = cropBoxData.left; canvasData.maxTop = cropBoxData.top; if (viewMode === 2) { @@ -1300,12 +1491,13 @@ var _getRotatedSizes = getRotatedSizes({ width: imageData.naturalWidth * Math.abs(imageData.scaleX || 1), height: imageData.naturalHeight * Math.abs(imageData.scaleY || 1), - degree: imageData.rotate || 0 + degree: imageData.rotate || 0, }), naturalWidth = _getRotatedSizes.width, naturalHeight = _getRotatedSizes.height; var width = canvasData.width * (naturalWidth / canvasData.naturalWidth); - var height = canvasData.height * (naturalHeight / canvasData.naturalHeight); + var height = + canvasData.height * (naturalHeight / canvasData.naturalHeight); canvasData.left -= (width - canvasData.width) / 2; canvasData.top -= (height - canvasData.height) / 2; canvasData.width = width; @@ -1315,26 +1507,50 @@ canvasData.naturalHeight = naturalHeight; this.limitCanvas(true, false); } - if (canvasData.width > canvasData.maxWidth || canvasData.width < canvasData.minWidth) { + if ( + canvasData.width > canvasData.maxWidth || + canvasData.width < canvasData.minWidth + ) { canvasData.left = canvasData.oldLeft; } - if (canvasData.height > canvasData.maxHeight || canvasData.height < canvasData.minHeight) { + if ( + canvasData.height > canvasData.maxHeight || + canvasData.height < canvasData.minHeight + ) { canvasData.top = canvasData.oldTop; } - canvasData.width = Math.min(Math.max(canvasData.width, canvasData.minWidth), canvasData.maxWidth); - canvasData.height = Math.min(Math.max(canvasData.height, canvasData.minHeight), canvasData.maxHeight); + canvasData.width = Math.min( + Math.max(canvasData.width, canvasData.minWidth), + canvasData.maxWidth, + ); + canvasData.height = Math.min( + Math.max(canvasData.height, canvasData.minHeight), + canvasData.maxHeight, + ); this.limitCanvas(false, true); - canvasData.left = Math.min(Math.max(canvasData.left, canvasData.minLeft), canvasData.maxLeft); - canvasData.top = Math.min(Math.max(canvasData.top, canvasData.minTop), canvasData.maxTop); + canvasData.left = Math.min( + Math.max(canvasData.left, canvasData.minLeft), + canvasData.maxLeft, + ); + canvasData.top = Math.min( + Math.max(canvasData.top, canvasData.minTop), + canvasData.maxTop, + ); canvasData.oldLeft = canvasData.left; canvasData.oldTop = canvasData.top; - setStyle(this.canvas, assign({ - width: canvasData.width, - height: canvasData.height - }, getTransforms({ - translateX: canvasData.left, - translateY: canvasData.top - }))); + setStyle( + this.canvas, + assign( + { + width: canvasData.width, + height: canvasData.height, + }, + getTransforms({ + translateX: canvasData.left, + translateY: canvasData.top, + }), + ), + ); this.renderImage(changed); if (this.cropped && this.limited) { this.limitCropBox(true, true); @@ -1343,21 +1559,35 @@ renderImage: function renderImage(changed) { var canvasData = this.canvasData, imageData = this.imageData; - var width = imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth); - var height = imageData.naturalHeight * (canvasData.height / canvasData.naturalHeight); + var width = + imageData.naturalWidth * (canvasData.width / canvasData.naturalWidth); + var height = + imageData.naturalHeight * + (canvasData.height / canvasData.naturalHeight); assign(imageData, { width: width, height: height, left: (canvasData.width - width) / 2, - top: (canvasData.height - height) / 2 + top: (canvasData.height - height) / 2, }); - setStyle(this.image, assign({ - width: imageData.width, - height: imageData.height - }, getTransforms(assign({ - translateX: imageData.left, - translateY: imageData.top - }, imageData)))); + setStyle( + this.image, + assign( + { + width: imageData.width, + height: imageData.height, + }, + getTransforms( + assign( + { + translateX: imageData.left, + translateY: imageData.top, + }, + imageData, + ), + ), + ), + ); if (changed) { this.output(); } @@ -1369,7 +1599,7 @@ var autoCropArea = Number(options.autoCropArea) || 0.8; var cropBoxData = { width: canvasData.width, - height: canvasData.height + height: canvasData.height, }; if (aspectRatio) { if (canvasData.height * aspectRatio > canvasData.width) { @@ -1382,14 +1612,28 @@ this.limitCropBox(true, true); // Initialize auto crop area - cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); - cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + cropBoxData.width = Math.min( + Math.max(cropBoxData.width, cropBoxData.minWidth), + cropBoxData.maxWidth, + ); + cropBoxData.height = Math.min( + Math.max(cropBoxData.height, cropBoxData.minHeight), + cropBoxData.maxHeight, + ); // The width/height of auto crop area must large than "minWidth/Height" - cropBoxData.width = Math.max(cropBoxData.minWidth, cropBoxData.width * autoCropArea); - cropBoxData.height = Math.max(cropBoxData.minHeight, cropBoxData.height * autoCropArea); - cropBoxData.left = canvasData.left + (canvasData.width - cropBoxData.width) / 2; - cropBoxData.top = canvasData.top + (canvasData.height - cropBoxData.height) / 2; + cropBoxData.width = Math.max( + cropBoxData.minWidth, + cropBoxData.width * autoCropArea, + ); + cropBoxData.height = Math.max( + cropBoxData.minHeight, + cropBoxData.height * autoCropArea, + ); + cropBoxData.left = + canvasData.left + (canvasData.width - cropBoxData.width) / 2; + cropBoxData.top = + canvasData.top + (canvasData.height - cropBoxData.height) / 2; cropBoxData.oldLeft = cropBoxData.left; cropBoxData.oldTop = cropBoxData.top; this.initialCropBoxData = assign({}, cropBoxData); @@ -1404,8 +1648,22 @@ if (sizeLimited) { var minCropBoxWidth = Number(options.minCropBoxWidth) || 0; var minCropBoxHeight = Number(options.minCropBoxHeight) || 0; - var maxCropBoxWidth = limited ? Math.min(containerData.width, canvasData.width, canvasData.width + canvasData.left, containerData.width - canvasData.left) : containerData.width; - var maxCropBoxHeight = limited ? Math.min(containerData.height, canvasData.height, canvasData.height + canvasData.top, containerData.height - canvasData.top) : containerData.height; + var maxCropBoxWidth = limited + ? Math.min( + containerData.width, + canvasData.width, + canvasData.width + canvasData.left, + containerData.width - canvasData.left, + ) + : containerData.width; + var maxCropBoxHeight = limited + ? Math.min( + containerData.height, + canvasData.height, + canvasData.height + canvasData.top, + containerData.height - canvasData.top, + ) + : containerData.height; // The min/maxCropBoxWidth/Height must be less than container's width/height minCropBoxWidth = Math.min(minCropBoxWidth, containerData.width); @@ -1439,8 +1697,12 @@ if (limited) { cropBoxData.minLeft = Math.max(0, canvasData.left); cropBoxData.minTop = Math.max(0, canvasData.top); - cropBoxData.maxLeft = Math.min(containerData.width, canvasData.left + canvasData.width) - cropBoxData.width; - cropBoxData.maxTop = Math.min(containerData.height, canvasData.top + canvasData.height) - cropBoxData.height; + cropBoxData.maxLeft = + Math.min(containerData.width, canvasData.left + canvasData.width) - + cropBoxData.width; + cropBoxData.maxTop = + Math.min(containerData.height, canvasData.top + canvasData.height) - + cropBoxData.height; } else { cropBoxData.minLeft = 0; cropBoxData.minTop = 0; @@ -1453,30 +1715,61 @@ var options = this.options, containerData = this.containerData, cropBoxData = this.cropBoxData; - if (cropBoxData.width > cropBoxData.maxWidth || cropBoxData.width < cropBoxData.minWidth) { + if ( + cropBoxData.width > cropBoxData.maxWidth || + cropBoxData.width < cropBoxData.minWidth + ) { cropBoxData.left = cropBoxData.oldLeft; } - if (cropBoxData.height > cropBoxData.maxHeight || cropBoxData.height < cropBoxData.minHeight) { + if ( + cropBoxData.height > cropBoxData.maxHeight || + cropBoxData.height < cropBoxData.minHeight + ) { cropBoxData.top = cropBoxData.oldTop; } - cropBoxData.width = Math.min(Math.max(cropBoxData.width, cropBoxData.minWidth), cropBoxData.maxWidth); - cropBoxData.height = Math.min(Math.max(cropBoxData.height, cropBoxData.minHeight), cropBoxData.maxHeight); + cropBoxData.width = Math.min( + Math.max(cropBoxData.width, cropBoxData.minWidth), + cropBoxData.maxWidth, + ); + cropBoxData.height = Math.min( + Math.max(cropBoxData.height, cropBoxData.minHeight), + cropBoxData.maxHeight, + ); this.limitCropBox(false, true); - cropBoxData.left = Math.min(Math.max(cropBoxData.left, cropBoxData.minLeft), cropBoxData.maxLeft); - cropBoxData.top = Math.min(Math.max(cropBoxData.top, cropBoxData.minTop), cropBoxData.maxTop); + cropBoxData.left = Math.min( + Math.max(cropBoxData.left, cropBoxData.minLeft), + cropBoxData.maxLeft, + ); + cropBoxData.top = Math.min( + Math.max(cropBoxData.top, cropBoxData.minTop), + cropBoxData.maxTop, + ); cropBoxData.oldLeft = cropBoxData.left; cropBoxData.oldTop = cropBoxData.top; if (options.movable && options.cropBoxMovable) { // Turn to move the canvas when the crop box is equal to the container - setData(this.face, DATA_ACTION, cropBoxData.width >= containerData.width && cropBoxData.height >= containerData.height ? ACTION_MOVE : ACTION_ALL); + setData( + this.face, + DATA_ACTION, + cropBoxData.width >= containerData.width && + cropBoxData.height >= containerData.height + ? ACTION_MOVE + : ACTION_ALL, + ); } - setStyle(this.cropBox, assign({ - width: cropBoxData.width, - height: cropBoxData.height - }, getTransforms({ - translateX: cropBoxData.left, - translateY: cropBoxData.top - }))); + setStyle( + this.cropBox, + assign( + { + width: cropBoxData.width, + height: cropBoxData.height, + }, + getTransforms({ + translateX: cropBoxData.left, + translateY: cropBoxData.top, + }), + ), + ); if (this.cropped && this.limited) { this.limitCanvas(true, true); } @@ -1487,7 +1780,7 @@ output: function output() { this.preview(); dispatchEvent(this.element, EVENT_CROP, this.getData()); - } + }, }; var preview = { @@ -1496,8 +1789,8 @@ crossOrigin = this.crossOrigin; var preview = this.options.preview; var url = crossOrigin ? this.crossOriginUrl : this.url; - var alt = element.alt || 'The image to preview'; - var image = document.createElement('img'); + var alt = element.alt || "The image to preview"; + var image = document.createElement("img"); if (crossOrigin) { image.crossOrigin = crossOrigin; } @@ -1509,20 +1802,20 @@ return; } var previews = preview; - if (typeof preview === 'string') { + if (typeof preview === "string") { previews = element.ownerDocument.querySelectorAll(preview); } else if (preview.querySelector) { previews = [preview]; } this.previews = previews; forEach(previews, function (el) { - var img = document.createElement('img'); + var img = document.createElement("img"); // Save the original size for recover setData(el, DATA_PREVIEW, { width: el.offsetWidth, height: el.offsetHeight, - html: el.innerHTML + html: el.innerHTML, }); if (crossOrigin) { img.crossOrigin = crossOrigin; @@ -1536,8 +1829,16 @@ * Add `height:auto` to override `height` attribute on IE8 * (Occur only when margin-top <= -height) */ - img.style.cssText = 'display:block;' + 'width:100%;' + 'height:auto;' + 'min-width:0!important;' + 'min-height:0!important;' + 'max-width:none!important;' + 'max-height:none!important;' + 'image-orientation:0deg!important;"'; - el.innerHTML = ''; + img.style.cssText = + "display:block;" + + "width:100%;" + + "height:auto;" + + "min-width:0!important;" + + "min-height:0!important;" + + "max-width:none!important;" + + "max-height:none!important;" + + 'image-orientation:0deg!important;"'; + el.innerHTML = ""; el.appendChild(img); }); }, @@ -1546,7 +1847,7 @@ var data = getData(element, DATA_PREVIEW); setStyle(element, { width: data.width, - height: data.height + height: data.height, }); element.innerHTML = data.html; removeData(element, DATA_PREVIEW); @@ -1565,13 +1866,24 @@ if (!this.cropped || this.disabled) { return; } - setStyle(this.viewBoxImage, assign({ - width: width, - height: height - }, getTransforms(assign({ - translateX: -left, - translateY: -top - }, imageData)))); + setStyle( + this.viewBoxImage, + assign( + { + width: width, + height: height, + }, + getTransforms( + assign( + { + translateX: -left, + translateY: -top, + }, + imageData, + ), + ), + ), + ); forEach(this.previews, function (element) { var data = getData(element, DATA_PREVIEW); var originalWidth = data.width; @@ -1590,17 +1902,28 @@ } setStyle(element, { width: newWidth, - height: newHeight + height: newHeight, }); - setStyle(element.getElementsByTagName('img')[0], assign({ - width: width * ratio, - height: height * ratio - }, getTransforms(assign({ - translateX: -left * ratio, - translateY: -top * ratio - }, imageData)))); + setStyle( + element.getElementsByTagName("img")[0], + assign( + { + width: width * ratio, + height: height * ratio, + }, + getTransforms( + assign( + { + translateX: -left * ratio, + translateY: -top * ratio, + }, + imageData, + ), + ), + ), + ); }); - } + }, }; var events = { @@ -1623,20 +1946,45 @@ if (isFunction(options.zoom)) { addListener(element, EVENT_ZOOM, options.zoom); } - addListener(cropper, EVENT_POINTER_DOWN, this.onCropStart = this.cropStart.bind(this)); + addListener( + cropper, + EVENT_POINTER_DOWN, + (this.onCropStart = this.cropStart.bind(this)), + ); if (options.zoomable && options.zoomOnWheel) { - addListener(cropper, EVENT_WHEEL, this.onWheel = this.wheel.bind(this), { - passive: false, - capture: true - }); + addListener( + cropper, + EVENT_WHEEL, + (this.onWheel = this.wheel.bind(this)), + { + passive: false, + capture: true, + }, + ); } if (options.toggleDragModeOnDblclick) { - addListener(cropper, EVENT_DBLCLICK, this.onDblclick = this.dblclick.bind(this)); + addListener( + cropper, + EVENT_DBLCLICK, + (this.onDblclick = this.dblclick.bind(this)), + ); } - addListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove = this.cropMove.bind(this)); - addListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd = this.cropEnd.bind(this)); + addListener( + element.ownerDocument, + EVENT_POINTER_MOVE, + (this.onCropMove = this.cropMove.bind(this)), + ); + addListener( + element.ownerDocument, + EVENT_POINTER_UP, + (this.onCropEnd = this.cropEnd.bind(this)), + ); if (options.responsive) { - addListener(window, EVENT_RESIZE, this.onResize = this.resize.bind(this)); + addListener( + window, + EVENT_RESIZE, + (this.onResize = this.resize.bind(this)), + ); } }, unbind: function unbind() { @@ -1662,18 +2010,22 @@ if (options.zoomable && options.zoomOnWheel) { removeListener(cropper, EVENT_WHEEL, this.onWheel, { passive: false, - capture: true + capture: true, }); } if (options.toggleDragModeOnDblclick) { removeListener(cropper, EVENT_DBLCLICK, this.onDblclick); } - removeListener(element.ownerDocument, EVENT_POINTER_MOVE, this.onCropMove); + removeListener( + element.ownerDocument, + EVENT_POINTER_MOVE, + this.onCropMove, + ); removeListener(element.ownerDocument, EVENT_POINTER_UP, this.onCropEnd); if (options.responsive) { removeListener(window, EVENT_RESIZE, this.onResize); } - } + }, }; var handlers = { @@ -1698,12 +2050,16 @@ } this.render(); if (options.restore) { - this.setCanvasData(forEach(canvasData, function (n, i) { - canvasData[i] = n * ratio; - })); - this.setCropBoxData(forEach(cropBoxData, function (n, i) { - cropBoxData[i] = n * ratio; - })); + this.setCanvasData( + forEach(canvasData, function (n, i) { + canvasData[i] = n * ratio; + }), + ); + this.setCropBoxData( + forEach(cropBoxData, function (n, i) { + cropBoxData[i] = n * ratio; + }), + ); } } }, @@ -1711,7 +2067,9 @@ if (this.disabled || this.options.dragMode === DRAG_MODE_NONE) { return; } - this.setDragMode(hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP); + this.setDragMode( + hasClass(this.dragBox, CLASS_CROP) ? DRAG_MODE_MOVE : DRAG_MODE_CROP, + ); }, wheel: function wheel(event) { var _this = this; @@ -1742,15 +2100,17 @@ cropStart: function cropStart(event) { var buttons = event.buttons, button = event.button; - if (this.disabled - - // Handle mouse event and pointer event and ignore touch event - || (event.type === 'mousedown' || event.type === 'pointerdown' && event.pointerType === 'mouse') && ( - // No primary button (Usually the left button) - isNumber(buttons) && buttons !== 1 || isNumber(button) && button !== 0 - - // Open context menu - || event.ctrlKey)) { + if ( + this.disabled || + // Handle mouse event and pointer event and ignore touch event + ((event.type === "mousedown" || + (event.type === "pointerdown" && event.pointerType === "mouse")) && + // No primary button (Usually the left button) + ((isNumber(buttons) && buttons !== 1) || + (isNumber(button) && button !== 0) || + // Open context menu + event.ctrlKey)) + ) { return; } var options = this.options, @@ -1765,7 +2125,11 @@ // Handle mouse event and pointer event pointers[event.pointerId || 0] = getPointer(event); } - if (Object.keys(pointers).length > 1 && options.zoomable && options.zoomOnTouch) { + if ( + Object.keys(pointers).length > 1 && + options.zoomable && + options.zoomOnTouch + ) { action = ACTION_ZOOM; } else { action = getData(event.target, DATA_ACTION); @@ -1773,10 +2137,12 @@ if (!REGEXP_ACTIONS.test(action)) { return; } - if (dispatchEvent(this.element, EVENT_CROP_START, { - originalEvent: event, - action: action - }) === false) { + if ( + dispatchEvent(this.element, EVENT_CROP_START, { + originalEvent: event, + action: action, + }) === false + ) { return; } @@ -1796,10 +2162,12 @@ } var pointers = this.pointers; event.preventDefault(); - if (dispatchEvent(this.element, EVENT_CROP_MOVE, { - originalEvent: event, - action: action - }) === false) { + if ( + dispatchEvent(this.element, EVENT_CROP_MOVE, { + originalEvent: event, + action: action, + }) === false + ) { return; } if (event.changedTouches) { @@ -1830,17 +2198,21 @@ } event.preventDefault(); if (!Object.keys(pointers).length) { - this.action = ''; + this.action = ""; } if (this.cropping) { this.cropping = false; - toggleClass(this.dragBox, CLASS_MODAL, this.cropped && this.options.modal); + toggleClass( + this.dragBox, + CLASS_MODAL, + this.cropped && this.options.modal, + ); } dispatchEvent(this.element, EVENT_CROP_END, { originalEvent: event, - action: action + action: action, }); - } + }, }; var change = { @@ -1872,13 +2244,25 @@ if (this.limited) { minLeft = cropBoxData.minLeft; minTop = cropBoxData.minTop; - maxWidth = minLeft + Math.min(containerData.width, canvasData.width, canvasData.left + canvasData.width); - maxHeight = minTop + Math.min(containerData.height, canvasData.height, canvasData.top + canvasData.height); + maxWidth = + minLeft + + Math.min( + containerData.width, + canvasData.width, + canvasData.left + canvasData.width, + ); + maxHeight = + minTop + + Math.min( + containerData.height, + canvasData.height, + canvasData.top + canvasData.height, + ); } var pointer = pointers[Object.keys(pointers)[0]]; var range = { x: pointer.endX - pointer.startX, - y: pointer.endY - pointer.startY + y: pointer.endY - pointer.startY, }; var check = function check(side) { switch (side) { @@ -1913,7 +2297,11 @@ // Resize crop box case ACTION_EAST: - if (range.x >= 0 && (right >= maxWidth || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + if ( + range.x >= 0 && + (right >= maxWidth || + (aspectRatio && (top <= minTop || bottom >= maxHeight))) + ) { renderable = false; break; } @@ -1930,7 +2318,11 @@ } break; case ACTION_NORTH: - if (range.y <= 0 && (top <= minTop || aspectRatio && (left <= minLeft || right >= maxWidth))) { + if ( + range.y <= 0 && + (top <= minTop || + (aspectRatio && (left <= minLeft || right >= maxWidth))) + ) { renderable = false; break; } @@ -1948,7 +2340,11 @@ } break; case ACTION_WEST: - if (range.x <= 0 && (left <= minLeft || aspectRatio && (top <= minTop || bottom >= maxHeight))) { + if ( + range.x <= 0 && + (left <= minLeft || + (aspectRatio && (top <= minTop || bottom >= maxHeight))) + ) { renderable = false; break; } @@ -1966,7 +2362,11 @@ } break; case ACTION_SOUTH: - if (range.y >= 0 && (bottom >= maxHeight || aspectRatio && (left <= minLeft || right >= maxWidth))) { + if ( + range.y >= 0 && + (bottom >= maxHeight || + (aspectRatio && (left <= minLeft || right >= maxWidth))) + ) { renderable = false; break; } @@ -2232,7 +2632,7 @@ p.startX = p.endX; p.startY = p.endY; }); - } + }, }; var methods = { @@ -2269,7 +2669,7 @@ left: 0, top: 0, width: 0, - height: 0 + height: 0, }); this.cropped = false; this.renderCropBox(); @@ -2289,7 +2689,10 @@ * @returns {Cropper} this */ replace: function replace(url) { - var hasSameSize = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false; + var hasSameSize = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : false; if (!this.disabled && url) { if (this.isImg) { this.element.src = url; @@ -2300,7 +2703,7 @@ if (this.ready) { this.viewBoxImage.src = url; forEach(this.previews, function (element) { - element.getElementsByTagName('img')[0].src = url; + element.getElementsByTagName("img")[0].src = url; }); } } else { @@ -2353,11 +2756,17 @@ * @returns {Cropper} this */ move: function move(offsetX) { - var offsetY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : offsetX; + var offsetY = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : offsetX; var _this$canvasData = this.canvasData, left = _this$canvasData.left, top = _this$canvasData.top; - return this.moveTo(isUndefined(offsetX) ? offsetX : left + Number(offsetX), isUndefined(offsetY) ? offsetY : top + Number(offsetY)); + return this.moveTo( + isUndefined(offsetX) ? offsetX : left + Number(offsetX), + isUndefined(offsetY) ? offsetY : top + Number(offsetY), + ); }, /** * Move the canvas to an absolute point @@ -2366,7 +2775,8 @@ * @returns {Cropper} this */ moveTo: function moveTo(x) { - var y = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x; + var y = + arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : x; var canvasData = this.canvasData; var changed = false; x = Number(x); @@ -2400,7 +2810,11 @@ } else { ratio = 1 + ratio; } - return this.zoomTo(canvasData.width * ratio / canvasData.naturalWidth, null, _originalEvent); + return this.zoomTo( + (canvasData.width * ratio) / canvasData.naturalWidth, + null, + _originalEvent, + ); }, /** * Zoom the canvas to an absolute ratio @@ -2420,27 +2834,42 @@ if (ratio >= 0 && this.ready && !this.disabled && options.zoomable) { var newWidth = naturalWidth * ratio; var newHeight = naturalHeight * ratio; - if (dispatchEvent(this.element, EVENT_ZOOM, { - ratio: ratio, - oldRatio: width / naturalWidth, - originalEvent: _originalEvent - }) === false) { + if ( + dispatchEvent(this.element, EVENT_ZOOM, { + ratio: ratio, + oldRatio: width / naturalWidth, + originalEvent: _originalEvent, + }) === false + ) { return this; } if (_originalEvent) { var pointers = this.pointers; var offset = getOffset(this.cropper); - var center = pointers && Object.keys(pointers).length ? getPointersCenter(pointers) : { - pageX: _originalEvent.pageX, - pageY: _originalEvent.pageY - }; + var center = + pointers && Object.keys(pointers).length + ? getPointersCenter(pointers) + : { + pageX: _originalEvent.pageX, + pageY: _originalEvent.pageY, + }; // Zoom from the triggering point of the event - canvasData.left -= (newWidth - width) * ((center.pageX - offset.left - canvasData.left) / width); - canvasData.top -= (newHeight - height) * ((center.pageY - offset.top - canvasData.top) / height); - } else if (isPlainObject(pivot) && isNumber(pivot.x) && isNumber(pivot.y)) { - canvasData.left -= (newWidth - width) * ((pivot.x - canvasData.left) / width); - canvasData.top -= (newHeight - height) * ((pivot.y - canvasData.top) / height); + canvasData.left -= + (newWidth - width) * + ((center.pageX - offset.left - canvasData.left) / width); + canvasData.top -= + (newHeight - height) * + ((center.pageY - offset.top - canvasData.top) / height); + } else if ( + isPlainObject(pivot) && + isNumber(pivot.x) && + isNumber(pivot.y) + ) { + canvasData.left -= + (newWidth - width) * ((pivot.x - canvasData.left) / width); + canvasData.top -= + (newHeight - height) * ((pivot.y - canvasData.top) / height); } else { // Zoom from the center of the canvas canvasData.left -= (newWidth - width) / 2; @@ -2467,7 +2896,12 @@ */ rotateTo: function rotateTo(degree) { degree = Number(degree); - if (isNumber(degree) && this.ready && !this.disabled && this.options.rotatable) { + if ( + isNumber(degree) && + this.ready && + !this.disabled && + this.options.rotatable + ) { this.imageData.rotate = degree % 360; this.renderCanvas(true, true); } @@ -2498,7 +2932,10 @@ * @returns {Cropper} this */ scale: function scale(scaleX) { - var scaleY = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : scaleX; + var scaleY = + arguments.length > 1 && arguments[1] !== undefined + ? arguments[1] + : scaleX; var imageData = this.imageData; var transformed = false; scaleX = Number(scaleX); @@ -2524,7 +2961,10 @@ * @returns {Object} The result cropped data. */ getData: function getData() { - var rounded = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; + var rounded = + arguments.length > 0 && arguments[0] !== undefined + ? arguments[0] + : false; var options = this.options, imageData = this.imageData, canvasData = this.canvasData, @@ -2535,7 +2975,7 @@ x: cropBoxData.left - canvasData.left, y: cropBoxData.top - canvasData.top, width: cropBoxData.width, - height: cropBoxData.height + height: cropBoxData.height, }; var ratio = imageData.width / imageData.naturalWidth; forEach(data, function (n, i) { @@ -2556,7 +2996,7 @@ x: 0, y: 0, width: 0, - height: 0 + height: 0, }; } if (options.rotatable) { @@ -2638,9 +3078,12 @@ var canvasData = this.canvasData; var data = {}; if (this.ready) { - forEach(['left', 'top', 'width', 'height', 'naturalWidth', 'naturalHeight'], function (n) { - data[n] = canvasData[n]; - }); + forEach( + ["left", "top", "width", "height", "naturalWidth", "naturalHeight"], + function (n) { + data[n] = canvasData[n]; + }, + ); } return data; }, @@ -2682,7 +3125,7 @@ left: cropBoxData.left, top: cropBoxData.top, width: cropBoxData.width, - height: cropBoxData.height + height: cropBoxData.height, }; } return data || {}; @@ -2729,12 +3172,18 @@ * @returns {HTMLCanvasElement} - The result canvas. */ getCroppedCanvas: function getCroppedCanvas() { - var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; + var options = + arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}; if (!this.ready || !window.HTMLCanvasElement) { return null; } var canvasData = this.canvasData; - var source = getSourceCanvas(this.image, this.imageData, canvasData, options); + var source = getSourceCanvas( + this.image, + this.imageData, + canvasData, + options, + ); // Returns the source canvas if it is not cropped. if (!this.cropped) { @@ -2756,30 +3205,35 @@ var maxSizes = getAdjustedSizes({ aspectRatio: aspectRatio, width: options.maxWidth || Infinity, - height: options.maxHeight || Infinity + height: options.maxHeight || Infinity, }); - var minSizes = getAdjustedSizes({ - aspectRatio: aspectRatio, - width: options.minWidth || 0, - height: options.minHeight || 0 - }, 'cover'); + var minSizes = getAdjustedSizes( + { + aspectRatio: aspectRatio, + width: options.minWidth || 0, + height: options.minHeight || 0, + }, + "cover", + ); var _getAdjustedSizes = getAdjustedSizes({ aspectRatio: aspectRatio, width: options.width || (ratio !== 1 ? source.width : initialWidth), - height: options.height || (ratio !== 1 ? source.height : initialHeight) + height: + options.height || (ratio !== 1 ? source.height : initialHeight), }), width = _getAdjustedSizes.width, height = _getAdjustedSizes.height; width = Math.min(maxSizes.width, Math.max(minSizes.width, width)); height = Math.min(maxSizes.height, Math.max(minSizes.height, height)); - var canvas = document.createElement('canvas'); - var context = canvas.getContext('2d'); + var canvas = document.createElement("canvas"); + var context = canvas.getContext("2d"); canvas.width = normalizeDecimalNumber(width); canvas.height = normalizeDecimalNumber(height); - context.fillStyle = options.fillColor || 'transparent'; + context.fillStyle = options.fillColor || "transparent"; context.fillRect(0, 0, width, height); var _options$imageSmoothi = options.imageSmoothingEnabled, - imageSmoothingEnabled = _options$imageSmoothi === void 0 ? true : _options$imageSmoothi, + imageSmoothingEnabled = + _options$imageSmoothi === void 0 ? true : _options$imageSmoothi, imageSmoothingQuality = options.imageSmoothingQuality; context.imageSmoothingEnabled = imageSmoothingEnabled; if (imageSmoothingQuality) { @@ -2836,14 +3290,26 @@ // Avoid "IndexSizeError" if (dstWidth > 0 && dstHeight > 0) { var scale = width / initialWidth; - params.push(dstX * scale, dstY * scale, dstWidth * scale, dstHeight * scale); + params.push( + dstX * scale, + dstY * scale, + dstWidth * scale, + dstHeight * scale, + ); } // All the numerical parameters should be integer for `drawImage` // https://github.com/fengyuanchen/cropper/issues/476 - context.drawImage.apply(context, [source].concat(_toConsumableArray(params.map(function (param) { - return Math.floor(normalizeDecimalNumber(param)); - })))); + context.drawImage.apply( + context, + [source].concat( + _toConsumableArray( + params.map(function (param) { + return Math.floor(normalizeDecimalNumber(param)); + }), + ), + ), + ); return canvas; }, /** @@ -2890,21 +3356,24 @@ } } return this; - } + }, }; var AnotherCropper = WINDOW.Cropper; - var Cropper = /*#__PURE__*/function () { + var Cropper = /*#__PURE__*/ (function () { /** * Create a new Cropper. * @param {Element} element - The target element for cropping. * @param {Object} [options={}] - The configuration options. */ function Cropper(element) { - var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; + var options = + arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; _classCallCheck(this, Cropper); if (!element || !REGEXP_TAG_NAME.test(element.tagName)) { - throw new Error('The first argument is required and must be an or element.'); + throw new Error( + "The first argument is required and must be an or element.", + ); } this.element = element; this.options = assign({}, DEFAULTS, isPlainObject(options) && options); @@ -2918,357 +3387,414 @@ this.sizing = false; this.init(); } - _createClass(Cropper, [{ - key: "init", - value: function init() { - var element = this.element; - var tagName = element.tagName.toLowerCase(); - var url; - if (element[NAMESPACE]) { - return; - } - element[NAMESPACE] = this; - if (tagName === 'img') { - this.isImg = true; + _createClass( + Cropper, + [ + { + key: "init", + value: function init() { + var element = this.element; + var tagName = element.tagName.toLowerCase(); + var url; + if (element[NAMESPACE]) { + return; + } + element[NAMESPACE] = this; + if (tagName === "img") { + this.isImg = true; - // e.g.: "img/picture.jpg" - url = element.getAttribute('src') || ''; - this.originalUrl = url; + // e.g.: "img/picture.jpg" + url = element.getAttribute("src") || ""; + this.originalUrl = url; - // Stop when it's a blank image - if (!url) { - return; - } + // Stop when it's a blank image + if (!url) { + return; + } - // e.g.: "https://example.com/img/picture.jpg" - url = element.src; - } else if (tagName === 'canvas' && window.HTMLCanvasElement) { - url = element.toDataURL(); - } - this.load(url); - } - }, { - key: "load", - value: function load(url) { - var _this = this; - if (!url) { - return; - } - this.url = url; - this.imageData = {}; - var element = this.element, - options = this.options; - if (!options.rotatable && !options.scalable) { - options.checkOrientation = false; - } + // e.g.: "https://example.com/img/picture.jpg" + url = element.src; + } else if (tagName === "canvas" && window.HTMLCanvasElement) { + url = element.toDataURL(); + } + this.load(url); + }, + }, + { + key: "load", + value: function load(url) { + var _this = this; + if (!url) { + return; + } + this.url = url; + this.imageData = {}; + var element = this.element, + options = this.options; + if (!options.rotatable && !options.scalable) { + options.checkOrientation = false; + } - // Only IE10+ supports Typed Arrays - if (!options.checkOrientation || !window.ArrayBuffer) { - this.clone(); - return; - } + // Only IE10+ supports Typed Arrays + if (!options.checkOrientation || !window.ArrayBuffer) { + this.clone(); + return; + } - // Detect the mime type of the image directly if it is a Data URL - if (REGEXP_DATA_URL.test(url)) { - // Read ArrayBuffer from Data URL of JPEG images directly for better performance - if (REGEXP_DATA_URL_JPEG.test(url)) { - this.read(dataURLToArrayBuffer(url)); - } else { - // Only a JPEG image may contains Exif Orientation information, - // the rest types of Data URLs are not necessary to check orientation at all. + // Detect the mime type of the image directly if it is a Data URL + if (REGEXP_DATA_URL.test(url)) { + // Read ArrayBuffer from Data URL of JPEG images directly for better performance + if (REGEXP_DATA_URL_JPEG.test(url)) { + this.read(dataURLToArrayBuffer(url)); + } else { + // Only a JPEG image may contains Exif Orientation information, + // the rest types of Data URLs are not necessary to check orientation at all. + this.clone(); + } + return; + } + + // 1. Detect the mime type of the image by a XMLHttpRequest. + // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image. + var xhr = new XMLHttpRequest(); + var clone = this.clone.bind(this); + this.reloading = true; + this.xhr = xhr; + + // 1. Cross origin requests are only supported for protocol schemes: + // http, https, data, chrome, chrome-extension. + // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy + // in some browsers as IE11 and Safari. + xhr.onabort = clone; + xhr.onerror = clone; + xhr.ontimeout = clone; + xhr.onprogress = function () { + // Abort the request directly if it not a JPEG image for better performance + if (xhr.getResponseHeader("content-type") !== MIME_TYPE_JPEG) { + xhr.abort(); + } + }; + xhr.onload = function () { + _this.read(xhr.response); + }; + xhr.onloadend = function () { + _this.reloading = false; + _this.xhr = null; + }; + + // Bust cache when there is a "crossOrigin" property to avoid browser cache error + if ( + options.checkCrossOrigin && + isCrossOriginURL(url) && + element.crossOrigin + ) { + url = addTimestamp(url); + } + + // The third parameter is required for avoiding side-effect (#682) + xhr.open("GET", url, true); + xhr.responseType = "arraybuffer"; + xhr.withCredentials = element.crossOrigin === "use-credentials"; + xhr.send(); + }, + }, + { + key: "read", + value: function read(arrayBuffer) { + var options = this.options, + imageData = this.imageData; + + // Reset the orientation value to its default value 1 + // as some iOS browsers will render image with its orientation + var orientation = resetAndGetOrientation(arrayBuffer); + var rotate = 0; + var scaleX = 1; + var scaleY = 1; + if (orientation > 1) { + // Generate a new URL which has the default orientation value + this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG); + var _parseOrientation = parseOrientation(orientation); + rotate = _parseOrientation.rotate; + scaleX = _parseOrientation.scaleX; + scaleY = _parseOrientation.scaleY; + } + if (options.rotatable) { + imageData.rotate = rotate; + } + if (options.scalable) { + imageData.scaleX = scaleX; + imageData.scaleY = scaleY; + } this.clone(); - } - return; - } + }, + }, + { + key: "clone", + value: function clone() { + var element = this.element, + url = this.url; + var crossOrigin = element.crossOrigin; + var crossOriginUrl = url; + if (this.options.checkCrossOrigin && isCrossOriginURL(url)) { + if (!crossOrigin) { + crossOrigin = "anonymous"; + } - // 1. Detect the mime type of the image by a XMLHttpRequest. - // 2. Load the image as ArrayBuffer for reading orientation if its a JPEG image. - var xhr = new XMLHttpRequest(); - var clone = this.clone.bind(this); - this.reloading = true; - this.xhr = xhr; + // Bust cache when there is not a "crossOrigin" property (#519) + crossOriginUrl = addTimestamp(url); + } + this.crossOrigin = crossOrigin; + this.crossOriginUrl = crossOriginUrl; + var image = document.createElement("img"); + if (crossOrigin) { + image.crossOrigin = crossOrigin; + } + image.src = crossOriginUrl || url; + image.alt = element.alt || "The image to crop"; + this.image = image; + image.onload = this.start.bind(this); + image.onerror = this.stop.bind(this); + addClass(image, CLASS_HIDE); + element.parentNode.insertBefore(image, element.nextSibling); + }, + }, + { + key: "start", + value: function start() { + var _this2 = this; + var image = this.image; + image.onload = null; + image.onerror = null; + this.sizing = true; - // 1. Cross origin requests are only supported for protocol schemes: - // http, https, data, chrome, chrome-extension. - // 2. Access to XMLHttpRequest from a Data URL will be blocked by CORS policy - // in some browsers as IE11 and Safari. - xhr.onabort = clone; - xhr.onerror = clone; - xhr.ontimeout = clone; - xhr.onprogress = function () { - // Abort the request directly if it not a JPEG image for better performance - if (xhr.getResponseHeader('content-type') !== MIME_TYPE_JPEG) { - xhr.abort(); - } - }; - xhr.onload = function () { - _this.read(xhr.response); - }; - xhr.onloadend = function () { - _this.reloading = false; - _this.xhr = null; - }; + // Match all browsers that use WebKit as the layout engine in iOS devices, + // such as Safari for iOS, Chrome for iOS, and in-app browsers. + var isIOSWebKit = + WINDOW.navigator && + /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test( + WINDOW.navigator.userAgent, + ); + var done = function done(naturalWidth, naturalHeight) { + assign(_this2.imageData, { + naturalWidth: naturalWidth, + naturalHeight: naturalHeight, + aspectRatio: naturalWidth / naturalHeight, + }); + _this2.initialImageData = assign({}, _this2.imageData); + _this2.sizing = false; + _this2.sized = true; + _this2.build(); + }; - // Bust cache when there is a "crossOrigin" property to avoid browser cache error - if (options.checkCrossOrigin && isCrossOriginURL(url) && element.crossOrigin) { - url = addTimestamp(url); - } + // Most modern browsers (excepts iOS WebKit) + if (image.naturalWidth && !isIOSWebKit) { + done(image.naturalWidth, image.naturalHeight); + return; + } + var sizingImage = document.createElement("img"); + var body = document.body || document.documentElement; + this.sizingImage = sizingImage; + sizingImage.onload = function () { + done(sizingImage.width, sizingImage.height); + if (!isIOSWebKit) { + body.removeChild(sizingImage); + } + }; + sizingImage.src = image.src; - // The third parameter is required for avoiding side-effect (#682) - xhr.open('GET', url, true); - xhr.responseType = 'arraybuffer'; - xhr.withCredentials = element.crossOrigin === 'use-credentials'; - xhr.send(); - } - }, { - key: "read", - value: function read(arrayBuffer) { - var options = this.options, - imageData = this.imageData; + // iOS WebKit will convert the image automatically + // with its orientation once append it into DOM (#279) + if (!isIOSWebKit) { + sizingImage.style.cssText = + "left:0;" + + "max-height:none!important;" + + "max-width:none!important;" + + "min-height:0!important;" + + "min-width:0!important;" + + "opacity:0;" + + "position:absolute;" + + "top:0;" + + "z-index:-1;"; + body.appendChild(sizingImage); + } + }, + }, + { + key: "stop", + value: function stop() { + var image = this.image; + image.onload = null; + image.onerror = null; + image.parentNode.removeChild(image); + this.image = null; + }, + }, + { + key: "build", + value: function build() { + if (!this.sized || this.ready) { + return; + } + var element = this.element, + options = this.options, + image = this.image; - // Reset the orientation value to its default value 1 - // as some iOS browsers will render image with its orientation - var orientation = resetAndGetOrientation(arrayBuffer); - var rotate = 0; - var scaleX = 1; - var scaleY = 1; - if (orientation > 1) { - // Generate a new URL which has the default orientation value - this.url = arrayBufferToDataURL(arrayBuffer, MIME_TYPE_JPEG); - var _parseOrientation = parseOrientation(orientation); - rotate = _parseOrientation.rotate; - scaleX = _parseOrientation.scaleX; - scaleY = _parseOrientation.scaleY; - } - if (options.rotatable) { - imageData.rotate = rotate; - } - if (options.scalable) { - imageData.scaleX = scaleX; - imageData.scaleY = scaleY; - } - this.clone(); - } - }, { - key: "clone", - value: function clone() { - var element = this.element, - url = this.url; - var crossOrigin = element.crossOrigin; - var crossOriginUrl = url; - if (this.options.checkCrossOrigin && isCrossOriginURL(url)) { - if (!crossOrigin) { - crossOrigin = 'anonymous'; - } + // Create cropper elements + var container = element.parentNode; + var template = document.createElement("div"); + template.innerHTML = TEMPLATE; + var cropper = template.querySelector( + ".".concat(NAMESPACE, "-container"), + ); + var canvas = cropper.querySelector( + ".".concat(NAMESPACE, "-canvas"), + ); + var dragBox = cropper.querySelector( + ".".concat(NAMESPACE, "-drag-box"), + ); + var cropBox = cropper.querySelector( + ".".concat(NAMESPACE, "-crop-box"), + ); + var face = cropBox.querySelector(".".concat(NAMESPACE, "-face")); + this.container = container; + this.cropper = cropper; + this.canvas = canvas; + this.dragBox = dragBox; + this.cropBox = cropBox; + this.viewBox = cropper.querySelector( + ".".concat(NAMESPACE, "-view-box"), + ); + this.face = face; + canvas.appendChild(image); - // Bust cache when there is not a "crossOrigin" property (#519) - crossOriginUrl = addTimestamp(url); - } - this.crossOrigin = crossOrigin; - this.crossOriginUrl = crossOriginUrl; - var image = document.createElement('img'); - if (crossOrigin) { - image.crossOrigin = crossOrigin; - } - image.src = crossOriginUrl || url; - image.alt = element.alt || 'The image to crop'; - this.image = image; - image.onload = this.start.bind(this); - image.onerror = this.stop.bind(this); - addClass(image, CLASS_HIDE); - element.parentNode.insertBefore(image, element.nextSibling); - } - }, { - key: "start", - value: function start() { - var _this2 = this; - var image = this.image; - image.onload = null; - image.onerror = null; - this.sizing = true; + // Hide the original image + addClass(element, CLASS_HIDDEN); - // Match all browsers that use WebKit as the layout engine in iOS devices, - // such as Safari for iOS, Chrome for iOS, and in-app browsers. - var isIOSWebKit = WINDOW.navigator && /(?:iPad|iPhone|iPod).*?AppleWebKit/i.test(WINDOW.navigator.userAgent); - var done = function done(naturalWidth, naturalHeight) { - assign(_this2.imageData, { - naturalWidth: naturalWidth, - naturalHeight: naturalHeight, - aspectRatio: naturalWidth / naturalHeight - }); - _this2.initialImageData = assign({}, _this2.imageData); - _this2.sizing = false; - _this2.sized = true; - _this2.build(); - }; + // Inserts the cropper after to the current image + container.insertBefore(cropper, element.nextSibling); - // Most modern browsers (excepts iOS WebKit) - if (image.naturalWidth && !isIOSWebKit) { - done(image.naturalWidth, image.naturalHeight); - return; - } - var sizingImage = document.createElement('img'); - var body = document.body || document.documentElement; - this.sizingImage = sizingImage; - sizingImage.onload = function () { - done(sizingImage.width, sizingImage.height); - if (!isIOSWebKit) { - body.removeChild(sizingImage); - } - }; - sizingImage.src = image.src; + // Show the hidden image + removeClass(image, CLASS_HIDE); + this.initPreview(); + this.bind(); + options.initialAspectRatio = + Math.max(0, options.initialAspectRatio) || NaN; + options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; + options.viewMode = + Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; + addClass(cropBox, CLASS_HIDDEN); + if (!options.guides) { + addClass( + cropBox.getElementsByClassName("".concat(NAMESPACE, "-dashed")), + CLASS_HIDDEN, + ); + } + if (!options.center) { + addClass( + cropBox.getElementsByClassName("".concat(NAMESPACE, "-center")), + CLASS_HIDDEN, + ); + } + if (options.background) { + addClass(cropper, "".concat(NAMESPACE, "-bg")); + } + if (!options.highlight) { + addClass(face, CLASS_INVISIBLE); + } + if (options.cropBoxMovable) { + addClass(face, CLASS_MOVE); + setData(face, DATA_ACTION, ACTION_ALL); + } + if (!options.cropBoxResizable) { + addClass( + cropBox.getElementsByClassName("".concat(NAMESPACE, "-line")), + CLASS_HIDDEN, + ); + addClass( + cropBox.getElementsByClassName("".concat(NAMESPACE, "-point")), + CLASS_HIDDEN, + ); + } + this.render(); + this.ready = true; + this.setDragMode(options.dragMode); + if (options.autoCrop) { + this.crop(); + } + this.setData(options.data); + if (isFunction(options.ready)) { + addListener(element, EVENT_READY, options.ready, { + once: true, + }); + } + dispatchEvent(element, EVENT_READY); + }, + }, + { + key: "unbuild", + value: function unbuild() { + if (!this.ready) { + return; + } + this.ready = false; + this.unbind(); + this.resetPreview(); + var parentNode = this.cropper.parentNode; + if (parentNode) { + parentNode.removeChild(this.cropper); + } + removeClass(this.element, CLASS_HIDDEN); + }, + }, + { + key: "uncreate", + value: function uncreate() { + if (this.ready) { + this.unbuild(); + this.ready = false; + this.cropped = false; + } else if (this.sizing) { + this.sizingImage.onload = null; + this.sizing = false; + this.sized = false; + } else if (this.reloading) { + this.xhr.onabort = null; + this.xhr.abort(); + } else if (this.image) { + this.stop(); + } + }, - // iOS WebKit will convert the image automatically - // with its orientation once append it into DOM (#279) - if (!isIOSWebKit) { - sizingImage.style.cssText = 'left:0;' + 'max-height:none!important;' + 'max-width:none!important;' + 'min-height:0!important;' + 'min-width:0!important;' + 'opacity:0;' + 'position:absolute;' + 'top:0;' + 'z-index:-1;'; - body.appendChild(sizingImage); - } - } - }, { - key: "stop", - value: function stop() { - var image = this.image; - image.onload = null; - image.onerror = null; - image.parentNode.removeChild(image); - this.image = null; - } - }, { - key: "build", - value: function build() { - if (!this.sized || this.ready) { - return; - } - var element = this.element, - options = this.options, - image = this.image; + /** + * Get the no conflict cropper class. + * @returns {Cropper} The cropper class. + */ + }, + ], + [ + { + key: "noConflict", + value: function noConflict() { + window.Cropper = AnotherCropper; + return Cropper; + }, - // Create cropper elements - var container = element.parentNode; - var template = document.createElement('div'); - template.innerHTML = TEMPLATE; - var cropper = template.querySelector(".".concat(NAMESPACE, "-container")); - var canvas = cropper.querySelector(".".concat(NAMESPACE, "-canvas")); - var dragBox = cropper.querySelector(".".concat(NAMESPACE, "-drag-box")); - var cropBox = cropper.querySelector(".".concat(NAMESPACE, "-crop-box")); - var face = cropBox.querySelector(".".concat(NAMESPACE, "-face")); - this.container = container; - this.cropper = cropper; - this.canvas = canvas; - this.dragBox = dragBox; - this.cropBox = cropBox; - this.viewBox = cropper.querySelector(".".concat(NAMESPACE, "-view-box")); - this.face = face; - canvas.appendChild(image); - - // Hide the original image - addClass(element, CLASS_HIDDEN); - - // Inserts the cropper after to the current image - container.insertBefore(cropper, element.nextSibling); - - // Show the hidden image - removeClass(image, CLASS_HIDE); - this.initPreview(); - this.bind(); - options.initialAspectRatio = Math.max(0, options.initialAspectRatio) || NaN; - options.aspectRatio = Math.max(0, options.aspectRatio) || NaN; - options.viewMode = Math.max(0, Math.min(3, Math.round(options.viewMode))) || 0; - addClass(cropBox, CLASS_HIDDEN); - if (!options.guides) { - addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-dashed")), CLASS_HIDDEN); - } - if (!options.center) { - addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-center")), CLASS_HIDDEN); - } - if (options.background) { - addClass(cropper, "".concat(NAMESPACE, "-bg")); - } - if (!options.highlight) { - addClass(face, CLASS_INVISIBLE); - } - if (options.cropBoxMovable) { - addClass(face, CLASS_MOVE); - setData(face, DATA_ACTION, ACTION_ALL); - } - if (!options.cropBoxResizable) { - addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-line")), CLASS_HIDDEN); - addClass(cropBox.getElementsByClassName("".concat(NAMESPACE, "-point")), CLASS_HIDDEN); - } - this.render(); - this.ready = true; - this.setDragMode(options.dragMode); - if (options.autoCrop) { - this.crop(); - } - this.setData(options.data); - if (isFunction(options.ready)) { - addListener(element, EVENT_READY, options.ready, { - once: true - }); - } - dispatchEvent(element, EVENT_READY); - } - }, { - key: "unbuild", - value: function unbuild() { - if (!this.ready) { - return; - } - this.ready = false; - this.unbind(); - this.resetPreview(); - var parentNode = this.cropper.parentNode; - if (parentNode) { - parentNode.removeChild(this.cropper); - } - removeClass(this.element, CLASS_HIDDEN); - } - }, { - key: "uncreate", - value: function uncreate() { - if (this.ready) { - this.unbuild(); - this.ready = false; - this.cropped = false; - } else if (this.sizing) { - this.sizingImage.onload = null; - this.sizing = false; - this.sized = false; - } else if (this.reloading) { - this.xhr.onabort = null; - this.xhr.abort(); - } else if (this.image) { - this.stop(); - } - } - - /** - * Get the no conflict cropper class. - * @returns {Cropper} The cropper class. - */ - }], [{ - key: "noConflict", - value: function noConflict() { - window.Cropper = AnotherCropper; - return Cropper; - } - - /** - * Change the default options. - * @param {Object} options - The new default options. - */ - }, { - key: "setDefaults", - value: function setDefaults(options) { - assign(DEFAULTS, isPlainObject(options) && options); - } - }]); + /** + * Change the default options. + * @param {Object} options - The new default options. + */ + }, + { + key: "setDefaults", + value: function setDefaults(options) { + assign(DEFAULTS, isPlainObject(options) && options); + }, + }, + ], + ); return Cropper; - }(); + })(); assign(Cropper.prototype, render, preview, events, handlers, change, methods); return Cropper; - -})); +}); diff --git a/plugins/DateParser/date_parser.py b/plugins/DateParser/date_parser.py index 908fc05..baf9be2 100644 --- a/plugins/DateParser/date_parser.py +++ b/plugins/DateParser/date_parser.py @@ -7,60 +7,58 @@ import re from dateparser import parse from datetime import datetime + def main(): - global stash - global pattern + global stash + global pattern - pattern = re.compile(r"\D(\d{4}|\d{1,2})[\._\- /\\](\d{1,2}|[a-zA-Z]{3,}\.*)[\._\- /\\](\d{4}|\d{1,2})\D") - json_input = json.loads(sys.stdin.read()) - mode_arg = json_input['args']['mode'] + pattern = re.compile( + r"\D(\d{4}|\d{1,2})[\._\- /\\](\d{1,2}|[a-zA-Z]{3,}\.*)[\._\- /\\](\d{4}|\d{1,2})\D" + ) + json_input = json.loads(sys.stdin.read()) + mode_arg = json_input["args"]["mode"] - stash = StashInterface(json_input["server_connection"]) - - if mode_arg == "gallery": - find_date_for_galleries() + stash = StashInterface(json_input["server_connection"]) + if mode_arg == "gallery": + find_date_for_galleries() def find_date_for_galleries(): - galleries = stash.find_galleries(f={ - "is_missing": "date", - "path": { - "modifier": "MATCHES_REGEX", - "value": ".zip$" - }, - "file_count": { - "modifier": "EQUALS", - "value": 1 - } - }) + galleries = stash.find_galleries( + f={ + "is_missing": "date", + "path": {"modifier": "MATCHES_REGEX", "value": ".zip$"}, + "file_count": {"modifier": "EQUALS", "value": 1}, + } + ) + + total = len(galleries) + + log.info(f"Found {total} galleries") + + for i, gallery in enumerate(galleries): + log.progress(i / total) + acceptableDate = None + for file in gallery.get("files", []): + for match in pattern.finditer(file["path"]): + g1 = match.group(1) + g2 = match.group(2) + g3 = match.group(3) + temp = parse(g1 + " " + g2 + " " + g3) + if temp: + acceptableDate = temp.strftime("%Y-%m-%d") + if acceptableDate: + log.info( + "Gallery ID (" + + gallery.get("id") + + ") has matched the date : " + + acceptableDate + ) + updateObject = {"id": gallery.get("id"), "date": acceptableDate} + stash.update_gallery(updateObject) - total = len(galleries) - - log.info(f"Found {total} galleries") - - for i, gallery in enumerate(galleries): - log.progress(i/total) - acceptableDate = None - for file in gallery.get("files", []): - for match in pattern.finditer(file["path"]): - g1 = match.group(1) - g2 = match.group(2) - g3 =match.group(3) - temp = parse(g1+" "+g2+" "+g3) - if temp: - acceptableDate = temp.strftime("%Y-%m-%d") - if acceptableDate: - log.info("Gallery ID ("+gallery.get("id") + ") has matched the date : "+acceptableDate) - updateObject = { - "id":gallery.get("id"), - "date":acceptableDate - } - stash.update_gallery(updateObject) - - - -if __name__ == '__main__': - main() \ No newline at end of file +if __name__ == "__main__": + main() diff --git a/plugins/DateParser/date_parser.yml b/plugins/DateParser/date_parser.yml index 82af58b..c6621af 100644 --- a/plugins/DateParser/date_parser.yml +++ b/plugins/DateParser/date_parser.yml @@ -1,14 +1,12 @@ -name: Date Parser -description: Find date in path or filename and add it -version: 0.2 -exec: - - python - - "{pluginDir}/date_parser.py" -interface: raw -tasks: - - name: Find gallery dates - description: Add the date on galleries based on their path - defaultArgs: - mode: gallery - - +name: Date Parser +description: Find date in path or filename and add it +version: 0.2 +exec: + - python + - "{pluginDir}/date_parser.py" +interface: raw +tasks: + - name: Find gallery dates + description: Add the date on galleries based on their path + defaultArgs: + mode: gallery diff --git a/plugins/StashBatchResultToggle/stashBatchResultToggle.js b/plugins/StashBatchResultToggle/stashBatchResultToggle.js index f6c5698..539e8b2 100644 --- a/plugins/StashBatchResultToggle/stashBatchResultToggle.js +++ b/plugins/StashBatchResultToggle/stashBatchResultToggle.js @@ -1,308 +1,377 @@ -(function() { - let running = false; - const buttons = []; - let maxCount = 0; - - function resolveToggle(el) { - let button = null; - if (el?.classList.contains('optional-field-content')) { - button = el.previousElementSibling; - } else if (el?.tagName === 'SPAN' && el?.classList.contains('ml-auto')) { - button = el.querySelector('.optional-field button'); - } else if (el?.parentElement?.classList.contains('optional-field-content')) { - button = el.parentElement.previousElementSibling; - } - const state = button?.classList.contains('text-success'); - return { - button, - state - }; - } - - function toggleSearchItem(searchItem, toggleMode) { - const searchResultItem = searchItem.querySelector('li.search-result.selected-result.active'); - if (!searchResultItem) return; - - const { - urlNode, - url, - id, - data, - nameNode, - name, - queryInput, - performerNodes - } = stash.parseSearchItem(searchItem); - - const { - remoteUrlNode, - remoteId, - remoteUrl, - remoteData, - urlNode: matchUrlNode, - detailsNode, - imageNode, - titleNode, - codeNode, - dateNode, - studioNode, - performerNodes: matchPerformerNodes, - matches - } = stash.parseSearchResultItem(searchResultItem); - - const studioMatchNode = matches.find(o => o.matchType === 'studio')?.matchNode; - const performerMatchNodes = matches.filter(o => o.matchType === 'performer').map(o => o.matchNode); - - const includeTitle = document.getElementById('result-toggle-title').checked; - const includeCode = document.getElementById('result-toggle-code').checked; - const includeDate = document.getElementById('result-toggle-date').checked; - const includeCover = document.getElementById('result-toggle-cover').checked; - const includeStashID = document.getElementById('result-toggle-stashid').checked; - const includeURL = document.getElementById('result-toggle-url').checked; - const includeDetails = document.getElementById('result-toggle-details').checked; - const includeStudio = document.getElementById('result-toggle-studio').checked; - const includePerformers = document.getElementById('result-toggle-performers').checked; - - let options = []; - - options.push(['title', includeTitle, titleNode, resolveToggle(titleNode)]); - options.push(['code', includeCode, codeNode, resolveToggle(codeNode)]); - options.push(['date', includeDate, dateNode, resolveToggle(dateNode)]); - options.push(['cover', includeCover, imageNode, resolveToggle(imageNode)]); - options.push(['stashid', includeStashID, remoteUrlNode, resolveToggle(remoteUrlNode)]); - options.push(['url', includeURL, matchUrlNode, resolveToggle(matchUrlNode)]); - options.push(['details', includeDetails, detailsNode, resolveToggle(detailsNode)]); - options.push(['studio', includeStudio, studioMatchNode, resolveToggle(studioMatchNode)]); - options = options.concat(performerMatchNodes.map(o => ['performer', includePerformers, o, resolveToggle(o)])); - - for (const [optionType, optionValue, optionNode, { - button, - state - }] of options) { - let wantedState = optionValue; - if (toggleMode === 1) { - wantedState = true; - } else if (toggleMode === -1) { - wantedState = false; - } - if (optionNode && wantedState !== state) { - button.click(); - } - } - } - - function run() { - if (!running) return; - const button = buttons.pop(); - stash.setProgress((maxCount - buttons.length) / maxCount * 100); - if (button) { - const searchItem = getClosestAncestor(button, '.search-item'); - let toggleMode = 0; - if (btn === btnOn) { - toggleMode = 1; - } else if (btn === btnOff) { - toggleMode = -1; - } else if (btn === btnMixed) { - toggleMode = 0; - } - toggleSearchItem(searchItem, toggleMode); - setTimeout(run, 0); - } else { - stop(); - } - } - - const btnGroup = document.createElement('div'); - const btnGroupId = 'batch-result-toggle'; - btnGroup.setAttribute('id', btnGroupId); - btnGroup.classList.add('btn-group', 'ml-3'); - - const checkLabel = ''; - const timesLabel = ''; - const startLabel = ''; - let btn; - - const btnOffId = 'batch-result-toggle-off'; - const btnOff = document.createElement("button"); - btnOff.setAttribute("id", btnOffId); - btnOff.title = 'Result Toggle All Off'; - btnOff.classList.add('btn', 'btn-primary'); - btnOff.innerHTML = timesLabel; - btnOff.onclick = () => { - if (running) { - stop(); - } else { - btn = btnOff; - start(); - } - }; - btnGroup.appendChild(btnOff); - - const btnMixedId = 'batch-result-toggle-mixed'; - const btnMixed = document.createElement("button"); - btnMixed.setAttribute("id", btnMixedId); - btnMixed.title = 'Result Toggle All'; - btnMixed.classList.add('btn', 'btn-primary'); - btnMixed.innerHTML = startLabel; - btnMixed.onclick = () => { - if (running) { - stop(); - } else { - btn = btnMixed; - start(); - } - }; - btnGroup.appendChild(btnMixed); - - const btnOnId = 'batch-result-toggle-on'; - const btnOn = document.createElement("button"); - btnOn.setAttribute("id", btnOnId); - btnOn.title = 'Result Toggle All On'; - btnOn.classList.add('btn', 'btn-primary'); - btnOn.innerHTML = checkLabel; - btnOn.onclick = () => { - if (running) { - stop(); - } else { - btn = btnOn; - start(); - } - }; - btnGroup.appendChild(btnOn); - - function start() { - // btn.innerHTML = stopLabel; - btn.classList.remove('btn-primary'); - btn.classList.add('btn-danger'); - btnMixed.disabled = true; - btnOn.disabled = true; - btnOff.disabled = true; - btn.disabled = false; - running = true; - stash.setProgress(0); - buttons.length = 0; - for (const button of document.querySelectorAll('.btn.btn-primary')) { - if (button.innerText === 'Search') { - buttons.push(button); - } - } - maxCount = buttons.length; - run(); - } - - function stop() { - // btn.innerHTML = startLabel; - btn.classList.remove('btn-danger'); - btn.classList.add('btn-primary'); - running = false; - stash.setProgress(0); - btnMixed.disabled = false; - btnOn.disabled = false; - btnOff.disabled = false; - } - - stash.addEventListener('tagger:mutations:header', evt => { - const el = getElementByXpath("//button[text()='Scrape All']"); - if (el && !document.getElementById(btnGroupId)) { - const container = el.parentElement; - container.appendChild(btnGroup); - sortElementChildren(container); - el.classList.add('ml-3'); - } - }); - - const resultToggleConfigId = 'result-toggle-config'; - - stash.addEventListener('tagger:configuration', evt => { - const el = evt.detail; - if (!document.getElementById(resultToggleConfigId)) { - const configContainer = el.parentElement; - const resultToggleConfig = createElementFromHTML(` -
-
Result Toggle ${startLabel} Configuration
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- - -
-
-
-
- `); - configContainer.appendChild(resultToggleConfig); - loadSettings(); - } - }); - - async function loadSettings() { - for (const input of document.querySelectorAll(`#${resultToggleConfigId} input`)) { - input.checked = await sessionStorage.getItem(input.id, input.dataset.default === 'true'); - input.addEventListener('change', async () => { - await sessionStorage.setItem(input.id, input.checked); - }); - } - } - - stash.addEventListener('tagger:mutation:add:remoteperformer', evt => toggleSearchItem(getClosestAncestor(evt.detail.node, '.search-item'), 0)); - stash.addEventListener('tagger:mutation:add:remotestudio', evt => toggleSearchItem(getClosestAncestor(evt.detail.node, '.search-item'), 0)); - stash.addEventListener('tagger:mutation:add:local', evt => toggleSearchItem(getClosestAncestor(evt.detail.node, '.search-item'), 0)); - stash.addEventListener('tagger:mutation:add:container', evt => toggleSearchItem(getClosestAncestor(evt.detail.node, '.search-item'), 0)); - stash.addEventListener('tagger:mutation:add:subcontainer', evt => toggleSearchItem(getClosestAncestor(evt.detail.node, '.search-item'), 0)); - - function checkSaveButtonDisplay() { - const taggerContainer = document.querySelector('.tagger-container'); - const saveButton = getElementByXpath("//button[text()='Save']", taggerContainer); - btnGroup.style.display = saveButton ? 'inline-block' : 'none'; - } - - stash.addEventListener('tagger:mutations:searchitems', checkSaveButtonDisplay); -})(); +(function () { + let running = false; + const buttons = []; + let maxCount = 0; + + function resolveToggle(el) { + let button = null; + if (el?.classList.contains("optional-field-content")) { + button = el.previousElementSibling; + } else if (el?.tagName === "SPAN" && el?.classList.contains("ml-auto")) { + button = el.querySelector(".optional-field button"); + } else if ( + el?.parentElement?.classList.contains("optional-field-content") + ) { + button = el.parentElement.previousElementSibling; + } + const state = button?.classList.contains("text-success"); + return { + button, + state, + }; + } + + function toggleSearchItem(searchItem, toggleMode) { + const searchResultItem = searchItem.querySelector( + "li.search-result.selected-result.active", + ); + if (!searchResultItem) return; + + const { + urlNode, + url, + id, + data, + nameNode, + name, + queryInput, + performerNodes, + } = stash.parseSearchItem(searchItem); + + const { + remoteUrlNode, + remoteId, + remoteUrl, + remoteData, + urlNode: matchUrlNode, + detailsNode, + imageNode, + titleNode, + codeNode, + dateNode, + studioNode, + performerNodes: matchPerformerNodes, + matches, + } = stash.parseSearchResultItem(searchResultItem); + + const studioMatchNode = matches.find( + (o) => o.matchType === "studio", + )?.matchNode; + const performerMatchNodes = matches + .filter((o) => o.matchType === "performer") + .map((o) => o.matchNode); + + const includeTitle = document.getElementById("result-toggle-title").checked; + const includeCode = document.getElementById("result-toggle-code").checked; + const includeDate = document.getElementById("result-toggle-date").checked; + const includeCover = document.getElementById("result-toggle-cover").checked; + const includeStashID = document.getElementById( + "result-toggle-stashid", + ).checked; + const includeURL = document.getElementById("result-toggle-url").checked; + const includeDetails = document.getElementById( + "result-toggle-details", + ).checked; + const includeStudio = document.getElementById( + "result-toggle-studio", + ).checked; + const includePerformers = document.getElementById( + "result-toggle-performers", + ).checked; + + let options = []; + + options.push(["title", includeTitle, titleNode, resolveToggle(titleNode)]); + options.push(["code", includeCode, codeNode, resolveToggle(codeNode)]); + options.push(["date", includeDate, dateNode, resolveToggle(dateNode)]); + options.push(["cover", includeCover, imageNode, resolveToggle(imageNode)]); + options.push([ + "stashid", + includeStashID, + remoteUrlNode, + resolveToggle(remoteUrlNode), + ]); + options.push([ + "url", + includeURL, + matchUrlNode, + resolveToggle(matchUrlNode), + ]); + options.push([ + "details", + includeDetails, + detailsNode, + resolveToggle(detailsNode), + ]); + options.push([ + "studio", + includeStudio, + studioMatchNode, + resolveToggle(studioMatchNode), + ]); + options = options.concat( + performerMatchNodes.map((o) => [ + "performer", + includePerformers, + o, + resolveToggle(o), + ]), + ); + + for (const [ + optionType, + optionValue, + optionNode, + { button, state }, + ] of options) { + let wantedState = optionValue; + if (toggleMode === 1) { + wantedState = true; + } else if (toggleMode === -1) { + wantedState = false; + } + if (optionNode && wantedState !== state) { + button.click(); + } + } + } + + function run() { + if (!running) return; + const button = buttons.pop(); + stash.setProgress(((maxCount - buttons.length) / maxCount) * 100); + if (button) { + const searchItem = getClosestAncestor(button, ".search-item"); + let toggleMode = 0; + if (btn === btnOn) { + toggleMode = 1; + } else if (btn === btnOff) { + toggleMode = -1; + } else if (btn === btnMixed) { + toggleMode = 0; + } + toggleSearchItem(searchItem, toggleMode); + setTimeout(run, 0); + } else { + stop(); + } + } + + const btnGroup = document.createElement("div"); + const btnGroupId = "batch-result-toggle"; + btnGroup.setAttribute("id", btnGroupId); + btnGroup.classList.add("btn-group", "ml-3"); + + const checkLabel = + ''; + const timesLabel = + ''; + const startLabel = + ''; + let btn; + + const btnOffId = "batch-result-toggle-off"; + const btnOff = document.createElement("button"); + btnOff.setAttribute("id", btnOffId); + btnOff.title = "Result Toggle All Off"; + btnOff.classList.add("btn", "btn-primary"); + btnOff.innerHTML = timesLabel; + btnOff.onclick = () => { + if (running) { + stop(); + } else { + btn = btnOff; + start(); + } + }; + btnGroup.appendChild(btnOff); + + const btnMixedId = "batch-result-toggle-mixed"; + const btnMixed = document.createElement("button"); + btnMixed.setAttribute("id", btnMixedId); + btnMixed.title = "Result Toggle All"; + btnMixed.classList.add("btn", "btn-primary"); + btnMixed.innerHTML = startLabel; + btnMixed.onclick = () => { + if (running) { + stop(); + } else { + btn = btnMixed; + start(); + } + }; + btnGroup.appendChild(btnMixed); + + const btnOnId = "batch-result-toggle-on"; + const btnOn = document.createElement("button"); + btnOn.setAttribute("id", btnOnId); + btnOn.title = "Result Toggle All On"; + btnOn.classList.add("btn", "btn-primary"); + btnOn.innerHTML = checkLabel; + btnOn.onclick = () => { + if (running) { + stop(); + } else { + btn = btnOn; + start(); + } + }; + btnGroup.appendChild(btnOn); + + function start() { + // btn.innerHTML = stopLabel; + btn.classList.remove("btn-primary"); + btn.classList.add("btn-danger"); + btnMixed.disabled = true; + btnOn.disabled = true; + btnOff.disabled = true; + btn.disabled = false; + running = true; + stash.setProgress(0); + buttons.length = 0; + for (const button of document.querySelectorAll(".btn.btn-primary")) { + if (button.innerText === "Search") { + buttons.push(button); + } + } + maxCount = buttons.length; + run(); + } + + function stop() { + // btn.innerHTML = startLabel; + btn.classList.remove("btn-danger"); + btn.classList.add("btn-primary"); + running = false; + stash.setProgress(0); + btnMixed.disabled = false; + btnOn.disabled = false; + btnOff.disabled = false; + } + + stash.addEventListener("tagger:mutations:header", (evt) => { + const el = getElementByXpath("//button[text()='Scrape All']"); + if (el && !document.getElementById(btnGroupId)) { + const container = el.parentElement; + container.appendChild(btnGroup); + sortElementChildren(container); + el.classList.add("ml-3"); + } + }); + + const resultToggleConfigId = "result-toggle-config"; + + stash.addEventListener("tagger:configuration", (evt) => { + const el = evt.detail; + if (!document.getElementById(resultToggleConfigId)) { + const configContainer = el.parentElement; + const resultToggleConfig = createElementFromHTML(` +
+
Result Toggle ${startLabel} Configuration
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ `); + configContainer.appendChild(resultToggleConfig); + loadSettings(); + } + }); + + async function loadSettings() { + for (const input of document.querySelectorAll( + `#${resultToggleConfigId} input`, + )) { + input.checked = await sessionStorage.getItem( + input.id, + input.dataset.default === "true", + ); + input.addEventListener("change", async () => { + await sessionStorage.setItem(input.id, input.checked); + }); + } + } + + stash.addEventListener("tagger:mutation:add:remoteperformer", (evt) => + toggleSearchItem(getClosestAncestor(evt.detail.node, ".search-item"), 0), + ); + stash.addEventListener("tagger:mutation:add:remotestudio", (evt) => + toggleSearchItem(getClosestAncestor(evt.detail.node, ".search-item"), 0), + ); + stash.addEventListener("tagger:mutation:add:local", (evt) => + toggleSearchItem(getClosestAncestor(evt.detail.node, ".search-item"), 0), + ); + stash.addEventListener("tagger:mutation:add:container", (evt) => + toggleSearchItem(getClosestAncestor(evt.detail.node, ".search-item"), 0), + ); + stash.addEventListener("tagger:mutation:add:subcontainer", (evt) => + toggleSearchItem(getClosestAncestor(evt.detail.node, ".search-item"), 0), + ); + + function checkSaveButtonDisplay() { + const taggerContainer = document.querySelector(".tagger-container"); + const saveButton = getElementByXpath( + "//button[text()='Save']", + taggerContainer, + ); + btnGroup.style.display = saveButton ? "inline-block" : "none"; + } + + stash.addEventListener( + "tagger:mutations:searchitems", + checkSaveButtonDisplay, + ); +})(); diff --git a/plugins/StashBatchResultToggle/stashBatchResultToggle.yml b/plugins/StashBatchResultToggle/stashBatchResultToggle.yml index a07558f..1277243 100644 --- a/plugins/StashBatchResultToggle/stashBatchResultToggle.yml +++ b/plugins/StashBatchResultToggle/stashBatchResultToggle.yml @@ -1,9 +1,9 @@ -name: Stash Batch Result Toggle. -# requires: StashUserscriptLibrary -description: In Scene Tagger, adds button to toggle all stashdb scene match result fields. Saves clicks when you only want to save a few metadata fields. Instead of turning off every field, you batch toggle them off, then toggle on the ones you want -version: 1.0 -ui: - requires: - - StashUserscriptLibrary - javascript: - - stashBatchResultToggle.js +name: Stash Batch Result Toggle. +# requires: StashUserscriptLibrary +description: In Scene Tagger, adds button to toggle all stashdb scene match result fields. Saves clicks when you only want to save a few metadata fields. Instead of turning off every field, you batch toggle them off, then toggle on the ones you want +version: 1.0 +ui: + requires: + - StashUserscriptLibrary + javascript: + - stashBatchResultToggle.js diff --git a/plugins/TPBDMarkers/TPDBMarkers.yml b/plugins/TPBDMarkers/TPDBMarkers.yml index 4d7cb8b..68d9018 100644 --- a/plugins/TPBDMarkers/TPDBMarkers.yml +++ b/plugins/TPBDMarkers/TPDBMarkers.yml @@ -13,7 +13,7 @@ hooks: - Scene.Update.Post tasks: - - name: 'Sync' + - name: "Sync" description: Get markers for all scenes with a stashid from metadataapi.net and no markers defaultArgs: mode: processScene diff --git a/plugins/TPBDMarkers/tpdbMarkers.py b/plugins/TPBDMarkers/tpdbMarkers.py index fcae0cc..800cd7d 100644 --- a/plugins/TPBDMarkers/tpdbMarkers.py +++ b/plugins/TPBDMarkers/tpdbMarkers.py @@ -12,44 +12,81 @@ request_s = requests.Session() def processScene(scene): - for sid in scene['stash_ids']: - if sid['endpoint'] == 'https://metadataapi.net/graphql': - log.debug('Scene has a TPDB stash id, looking up %s ' % (sid['stash_id'],)) - res=request_s.get('https://api.metadataapi.net/scenes/%s' % (sid['stash_id'],)) - if res.status_code==200: - if 'data' in res.json(): - data=res.json()['data'] + for sid in scene["stash_ids"]: + if sid["endpoint"] == "https://metadataapi.net/graphql": + log.debug("Scene has a TPDB stash id, looking up %s " % (sid["stash_id"],)) + res = request_s.get( + "https://api.metadataapi.net/scenes/%s" % (sid["stash_id"],) + ) + if res.status_code == 200: + if "data" in res.json(): + data = res.json()["data"] markers = [] - for m in data['markers']: + for m in data["markers"]: log.debug(m) - marker={ - 'title' : m['title'], - 'primary_tag' : m["title"], - 'tags': [], - 'seconds':m['start_time'], + marker = { + "title": m["title"], + "primary_tag": m["title"], + "tags": [], + "seconds": m["start_time"], } markers.append(marker) if len(markers) > 0: - log.info('Saving markers') - mp.import_scene_markers(stash, markers, scene['id'], 15) + log.info("Saving markers") + mp.import_scene_markers(stash, markers, scene["id"], 15) + + # log.debug(res.content) - def processAll(): - log.info('Getting scene count') - skip_sync_tag_id = stash.find_tag('[TPDB: Skip Marker]', create=True).get("id") - count=stash.find_scenes(f={"stash_id_endpoint": { "endpoint": "https://metadataapi.net/graphql", "modifier": "NOT_NULL", "stash_id": ""},"has_markers":"false","tags":{"depth":0,"excludes":[skip_sync_tag_id],"modifier":"INCLUDES_ALL","value":[]}},filter={"per_page": 1},get_count=True)[0] - log.info(str(count)+' scenes to submit.') - i=0 - for r in range(1,int(count/per_page)+1): - log.info('fetching data: %s - %s %0.1f%%' % ((r - 1) * per_page,r * per_page,(i/count)*100,)) - scenes=stash.find_scenes(f={"stash_id_endpoint": { "endpoint": "https://metadataapi.net/graphql", "modifier": "NOT_NULL", "stash_id": ""},"has_markers":"false"},filter={"page":r,"per_page": per_page}) + log.info("Getting scene count") + skip_sync_tag_id = stash.find_tag("[TPDB: Skip Marker]", create=True).get("id") + count = stash.find_scenes( + f={ + "stash_id_endpoint": { + "endpoint": "https://metadataapi.net/graphql", + "modifier": "NOT_NULL", + "stash_id": "", + }, + "has_markers": "false", + "tags": { + "depth": 0, + "excludes": [skip_sync_tag_id], + "modifier": "INCLUDES_ALL", + "value": [], + }, + }, + filter={"per_page": 1}, + get_count=True, + )[0] + log.info(str(count) + " scenes to submit.") + i = 0 + for r in range(1, int(count / per_page) + 1): + log.info( + "fetching data: %s - %s %0.1f%%" + % ( + (r - 1) * per_page, + r * per_page, + (i / count) * 100, + ) + ) + scenes = stash.find_scenes( + f={ + "stash_id_endpoint": { + "endpoint": "https://metadataapi.net/graphql", + "modifier": "NOT_NULL", + "stash_id": "", + }, + "has_markers": "false", + }, + filter={"page": r, "per_page": per_page}, + ) for s in scenes: processScene(s) - i=i+1 - log.progress((i/count)) + i = i + 1 + log.progress((i / count)) time.sleep(1) @@ -59,20 +96,22 @@ FRAGMENT_SERVER = json_input["server_connection"] stash = StashInterface(FRAGMENT_SERVER) # Set up the auth token for tpdb -if 'https://metadataapi.net/graphql' in [x['endpoint'] for x in stash.get_configuration()['general']['stashBoxes']]: - for x in stash.get_configuration()['general']['stashBoxes']: - if x['endpoint'] == 'https://metadataapi.net/graphql': - request_s.headers['Authorization']='Bearer %s' % (x['api_key'],) +if "https://metadataapi.net/graphql" in [ + x["endpoint"] for x in stash.get_configuration()["general"]["stashBoxes"] +]: + for x in stash.get_configuration()["general"]["stashBoxes"]: + if x["endpoint"] == "https://metadataapi.net/graphql": + request_s.headers["Authorization"] = "Bearer %s" % (x["api_key"],) - if 'mode' in json_input['args']: - PLUGIN_ARGS = json_input['args']["mode"] - if 'processScene' in PLUGIN_ARGS: + if "mode" in json_input["args"]: + PLUGIN_ARGS = json_input["args"]["mode"] + if "processScene" in PLUGIN_ARGS: processAll() - elif 'hookContext' in json_input['args']: - id = json_input['args']['hookContext']['id'] - if json_input['args']['hookContext']['type'] == 'Scene.Update.Post': + elif "hookContext" in json_input["args"]: + id = json_input["args"]["hookContext"]["id"] + if json_input["args"]["hookContext"]["type"] == "Scene.Update.Post": scene = stash.find_scene(id) processScene(scene) else: - log.warning('The Porn DB endpoint not configured') \ No newline at end of file + log.warning("The Porn DB endpoint not configured") diff --git a/plugins/comicInfoExtractor/comicInfoExtractor.py b/plugins/comicInfoExtractor/comicInfoExtractor.py index 1fda7f1..c3e21a6 100644 --- a/plugins/comicInfoExtractor/comicInfoExtractor.py +++ b/plugins/comicInfoExtractor/comicInfoExtractor.py @@ -10,22 +10,26 @@ import zipfile per_page = 100 + def processGallery(g): - #Read ComicInfo.xml File + # Read ComicInfo.xml File if len(g["files"]) == 0: log.info(g["id"] + " is not an archive. No scanning for Comic Metadata.") return comicInfo = False - with zipfile.ZipFile(g["files"][0]["path"], 'r') as archive: + with zipfile.ZipFile(g["files"][0]["path"], "r") as archive: archivecontent = [x.lower() for x in archive.namelist()] for archivefile in archivecontent: if archivefile.lower() == "comicinfo.xml": comicInfo = ET.fromstring(archive.read("ComicInfo.xml")) if not comicInfo: - log.info(g["files"][0]["path"] + " does not contain a ComicInfo.xml file. No scan will be triggered.") + log.info( + g["files"][0]["path"] + + " does not contain a ComicInfo.xml file. No scan will be triggered." + ) return - #Adjust names for giving ids + # Adjust names for giving ids for key in ImportList.keys(): if ImportList[key] == "tags": ImportList[key] = "tag_ids" @@ -34,7 +38,7 @@ def processGallery(g): if ImportList[key] == "studio": ImportList[key] = "studio_id" - #Get Metadata from ComicInfo.xml + # Get Metadata from ComicInfo.xml galleryData = {"id": g["id"]} for item in ImportList.keys(): value = comicInfo.find(item) @@ -45,11 +49,21 @@ def processGallery(g): if pageData: for page in pageData: if page.get("Bookmark"): - chapterData.append({"image_index": int(page.get("Image")) + 1, "title": page.get("Bookmark")}) + chapterData.append( + { + "image_index": int(page.get("Image")) + 1, + "title": page.get("Bookmark"), + } + ) if page.get("Type"): - chapterData.append({"image_index": int(page.get("Image")) + 1, "title": page.get("Type")}) + chapterData.append( + { + "image_index": int(page.get("Image")) + 1, + "title": page.get("Type"), + } + ) - #Adjust the retrieved data if necessary + # Adjust the retrieved data if necessary for data in galleryData.keys(): if data in ["tag_ids", "performer_ids"]: galleryData[data] = [x.strip() for x in galleryData[data].split(",")] @@ -72,53 +86,65 @@ def processGallery(g): if data == "rating100": galleryData[data] = int(galleryData[data]) - #Add Chapter if it does not exist and finally update Gallery Metadata + # Add Chapter if it does not exist and finally update Gallery Metadata for chapter in chapterData: addChapter = True for existingChapter in g["chapters"]: - if existingChapter["title"] == chapter["title"] and existingChapter["image_index"] == chapter["image_index"]: + if ( + existingChapter["title"] == chapter["title"] + and existingChapter["image_index"] == chapter["image_index"] + ): addChapter = False if addChapter: - stash.create_gallery_chapter({"title": chapter["title"], "image_index": chapter["image_index"], "gallery_id": g["id"]}) + stash.create_gallery_chapter( + { + "title": chapter["title"], + "image_index": chapter["image_index"], + "gallery_id": g["id"], + } + ) stash.update_gallery(galleryData) - def processAll(): - log.info('Getting gallery count') - count=stash.find_galleries(f={},filter={"per_page": 1},get_count=True)[0] - log.info(str(count)+' galleries to scan.') - for r in range(1,int(count/per_page)+1): - log.info('processing '+str(r*per_page)+ ' - '+str(count)) - galleries=stash.find_galleries(f={},filter={"page":r,"per_page": per_page}) + log.info("Getting gallery count") + count = stash.find_galleries(f={}, filter={"per_page": 1}, get_count=True)[0] + log.info(str(count) + " galleries to scan.") + for r in range(1, int(count / per_page) + 1): + log.info("processing " + str(r * per_page) + " - " + str(count)) + galleries = stash.find_galleries(f={}, filter={"page": r, "per_page": per_page}) for g in galleries: processGallery(g) - -#Start of the Program +# Start of the Program json_input = json.loads(sys.stdin.read()) FRAGMENT_SERVER = json_input["server_connection"] stash = StashInterface(FRAGMENT_SERVER) -#Load Config -with open(os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.yml"), "r") as f: - try: - config = yaml.safe_load(f) - except yaml.YAMLError as exc: - log.error("Could not load config.yml: " + str(exc)) - sys.exit(1) +# Load Config +with open( + os.path.join(os.path.dirname(os.path.abspath(__file__)), "config.yml"), "r" +) as f: + try: + config = yaml.safe_load(f) + except yaml.YAMLError as exc: + log.error("Could not load config.yml: " + str(exc)) + sys.exit(1) try: - ImportList=config["ImportList"] + ImportList = config["ImportList"] except KeyError as key: - log.error(str(key) + " is not defined in config.yml, but is needed for this script to proceed") + log.error( + str(key) + + " is not defined in config.yml, but is needed for this script to proceed" + ) sys.exit(1) -if 'mode' in json_input['args']: - PLUGIN_ARGS = json_input['args']["mode"] - if 'process' in PLUGIN_ARGS: +if "mode" in json_input["args"]: + PLUGIN_ARGS = json_input["args"]["mode"] + if "process" in PLUGIN_ARGS: processAll() -elif 'hookContext' in json_input['args']: - id=json_input['args']['hookContext']['id'] - gallery=stash.find_gallery(id) +elif "hookContext" in json_input["args"]: + id = json_input["args"]["hookContext"]["id"] + gallery = stash.find_gallery(id) processGallery(gallery) diff --git a/plugins/defaultDataForPath/defaultDataForPath.js b/plugins/defaultDataForPath/defaultDataForPath.js index 27f7945..6e5709b 100644 --- a/plugins/defaultDataForPath/defaultDataForPath.js +++ b/plugins/defaultDataForPath/defaultDataForPath.js @@ -1,209 +1,230 @@ var jsonData = [ - { - "name": "OPTIONAL NAME - NOT USED IN SCRIPT", - "paths": [ - "C:\\Users\\UserName\\Desktop\\NOTPORN\\Brazzers", - "D:\\SecretStorage\\Porn\\Brazzers" - ], - "studio": "Brazzers", - "tags": [ - "Default_Data_For_Path_Tagged" - ] - } + { + name: "OPTIONAL NAME - NOT USED IN SCRIPT", + paths: [ + "C:\\Users\\UserName\\Desktop\\NOTPORN\\Brazzers", + "D:\\SecretStorage\\Porn\\Brazzers", + ], + studio: "Brazzers", + tags: ["Default_Data_For_Path_Tagged"], + }, ]; function ok() { - return { - output: "ok" - }; + return { + output: "ok", + }; } function main() { - var hookContext = input.Args.hookContext; - var type = hookContext.type; - var ID = hookContext.ID; + var hookContext = input.Args.hookContext; + var type = hookContext.type; + var ID = hookContext.ID; - if (!type || !ID) { - // just return - return ok(); + if (!type || !ID) { + // just return + return ok(); + } + + var itemPath; + var name = ""; + if (type === "Scene.Create.Post") { + itemPath = getScenePath(ID); + name = "scene"; + } else if (type === "Gallery.Create.Post") { + itemPath = getGalleryPath(ID); + name = "gallery"; + } else if (type === "Image.Create.Post") { + itemPath = getImagePath(ID); + name = "image"; + } + + var defaultData = getDefaultData(itemPath); + + // create tags + var defaultTags = []; + for (var p = 0; p < defaultData.length; p++) { + var tags = defaultData[p].tags; + if (tags) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + if (stringNotAlreadyPresent(tag, defaultTags)) defaultTags.push(tag); + } } + } - var itemPath; - var name = ""; - if (type === 'Scene.Create.Post') { - itemPath = getScenePath(ID); - name = "scene" - } else if (type === 'Gallery.Create.Post') { - itemPath = getGalleryPath(ID); - name = "gallery" - } else if(type === 'Image.Create.Post') { - itemPath = getImagePath(ID); - name = "image" + // create studio + var addStudio = false; + var defaultStudioId = null; + var defaultStudio; + for (var p = 0; p < defaultData.length; p++) { + var studio = defaultData[p].studio; + if (studio) { + var studioId = getStudioId(studio); + if (studioId) { + defaultStudioId = studioId; + addStudio = true; + defaultStudio = studio; + } } + } - var defaultData = getDefaultData(itemPath) - - // create tags - var defaultTags = []; - for(var p=0; p= 0; i--) { + var tagId = getTagId(defaultTags[i]); + tagId ? defaultTagIds.push(tagId) : defaultTags.pop(); } - - // create performers - var defaultPerformers = []; - for(var p=0; p=0; i--) { - var tagId = getTagId(defaultTags[i]) - tagId ? defaultTagIds.push(tagId) : defaultTags.pop(); - } - if(defaultTagIds && defaultTagIds.length != 0) { - addTags = true; - } + // convert performers to performerIds + var addPerformers = false; + var defaultPerformerIds = []; + if (defaultPerformers) { + for (var i = defaultPerformers.length - 1; i >= 0; i--) { + var tagId = getPerformerId(defaultPerformers[i]); + tagId ? defaultPerformerIds.push(tagId) : defaultPerformers.pop(); } - - // convert performers to performerIds - var addPerformers = false; - var defaultPerformerIds = []; - if(defaultPerformers) { - for(var i=defaultPerformers.length-1; i>=0; i--) { - var tagId = getPerformerId(defaultPerformers[i]) - tagId ? defaultPerformerIds.push(tagId) : defaultPerformers.pop(); - } - if(defaultPerformerIds && defaultPerformerIds.length != 0) { - addPerformers = true; - } + if (defaultPerformerIds && defaultPerformerIds.length != 0) { + addPerformers = true; } + } + // Apply all and log + var tags = addTags ? defaultTagIds : null; + var studio = addStudio ? defaultStudioId : null; + var performers = addPerformers ? defaultPerformerIds : null; - // Apply all and log - var tags = addTags ? defaultTagIds : null; - var studio = addStudio ? defaultStudioId : null; - var performers = addPerformers ? defaultPerformerIds : null; + if (type === "Scene.Create.Post") { + setSceneData(ID, tags, studio, performers); + } else if (type === "Gallery.Create.Post") { + setGalleryData(ID, tags, studio, performers); + } else if (type === "Image.Create.Post") { + setImageData(ID, tags, studio, performers); + } - if (type === 'Scene.Create.Post') { - setSceneData(ID, tags, studio, performers) - } else if (type === 'Gallery.Create.Post') { - setGalleryData(ID, tags, studio, performers) - } else if(type === 'Image.Create.Post') { - setImageData(ID, tags, studio, performers) - } - - - for(var o=0;o -1; +function stringContains(value, searchFor) { + var v = (value || "").toLowerCase(); + var v2 = searchFor; + if (v2) { + v2 = v2.toLowerCase(); + } + return v.indexOf(v2) > -1; } - function containsElem(items, elem) { - for(var i=0;iScan creation. - triggeredBy: + triggeredBy: - Scene.Create.Post - Gallery.Create.Post - Image.Create.Post diff --git a/plugins/dupeMarker/dupeMarker.py b/plugins/dupeMarker/dupeMarker.py index d90c672..9efef71 100644 --- a/plugins/dupeMarker/dupeMarker.py +++ b/plugins/dupeMarker/dupeMarker.py @@ -8,62 +8,66 @@ from stashapi.stash_types import PhashDistance from stashapi.stashapp import StashInterface FRAGMENT = json.loads(sys.stdin.read()) -MODE = FRAGMENT['args']['mode'] +MODE = FRAGMENT["args"]["mode"] stash = StashInterface(FRAGMENT["server_connection"]) -dupe_marker_tag = stash.find_tag('[Marker: Duplicate]', create=True).get("id") +dupe_marker_tag = stash.find_tag("[Marker: Duplicate]", create=True).get("id") + def findScenesWithMarkers(): - totalDupes = 0 - scenes = stash.find_scenes(f={"has_markers": "true"},fragment="id") - for scene in scenes: - totalDupes += checkScene(scene) - log.info("Found %d duplicate markers across %d scenes" % (totalDupes, len(scenes))) + totalDupes = 0 + scenes = stash.find_scenes(f={"has_markers": "true"}, fragment="id") + for scene in scenes: + totalDupes += checkScene(scene) + log.info("Found %d duplicate markers across %d scenes" % (totalDupes, len(scenes))) + def addMarkerTag(marker): - query = """ + query = """ mutation SceneMarkerUpdate($input:SceneMarkerUpdateInput!) { sceneMarkerUpdate(input: $input) { id } } """ - oldTags = [tag["id"] for tag in marker["tags"]] - if dupe_marker_tag in oldTags: - return - oldTags.append(dupe_marker_tag) - newMarker = { - "id": marker["id"], - "tag_ids": oldTags - } - stash._callGraphQL(query, {"input": newMarker }) - #stash.update_scene_marker(newMarker, "id") + oldTags = [tag["id"] for tag in marker["tags"]] + if dupe_marker_tag in oldTags: + return + oldTags.append(dupe_marker_tag) + newMarker = {"id": marker["id"], "tag_ids": oldTags} + stash._callGraphQL(query, {"input": newMarker}) + # stash.update_scene_marker(newMarker, "id") + def checkScene(scene): - seen = set() - dupes = [] - markers = stash.find_scene_markers(scene['id']) - # find duplicate pairs - for marker in markers: - sortidx = ";".join([ - str(marker["title"]), - str(marker["seconds"]), - str(marker["primary_tag"]["id"]) - ]) - if sortidx not in seen: - seen.add(sortidx) - else: - dupes.append(marker) - # add tag - if dupes: - log.debug("Found %d duplicate markers in scene %s" % (len(dupes), scene['id'])) - for dupe in dupes: - addMarkerTag(dupe) - return len(dupes) + seen = set() + dupes = [] + markers = stash.find_scene_markers(scene["id"]) + # find duplicate pairs + for marker in markers: + sortidx = ";".join( + [ + str(marker["title"]), + str(marker["seconds"]), + str(marker["primary_tag"]["id"]), + ] + ) + if sortidx not in seen: + seen.add(sortidx) + else: + dupes.append(marker) + # add tag + if dupes: + log.debug("Found %d duplicate markers in scene %s" % (len(dupes), scene["id"])) + for dupe in dupes: + addMarkerTag(dupe) + return len(dupes) + def main(): - if MODE == "search": - findScenesWithMarkers() - log.exit("Plugin exited normally.") + if MODE == "search": + findScenesWithMarkers() + log.exit("Plugin exited normally.") -if __name__ == '__main__': - main() \ No newline at end of file + +if __name__ == "__main__": + main() diff --git a/plugins/dupeMarker/dupeMarker.yml b/plugins/dupeMarker/dupeMarker.yml index d043b97..8df1d14 100644 --- a/plugins/dupeMarker/dupeMarker.yml +++ b/plugins/dupeMarker/dupeMarker.yml @@ -7,7 +7,7 @@ exec: - "{pluginDir}/dupeMarker.py" interface: raw tasks: - - name: 'Search' + - name: "Search" description: Search for duplicate markers defaultArgs: - mode: search \ No newline at end of file + mode: search diff --git a/plugins/filenameParser/filenameParser.js b/plugins/filenameParser/filenameParser.js index ca3d126..9dffaf0 100644 --- a/plugins/filenameParser/filenameParser.js +++ b/plugins/filenameParser/filenameParser.js @@ -1,45 +1,46 @@ function ok() { - return { - output: "ok" - }; + return { + output: "ok", + }; } function main() { - var hookContext = input.Args.hookContext; - var type = hookContext.type; - var ID = hookContext.ID; - - if (!ID) { - return ok(); - } - - var filenameFetcher; - var saver; - if (type === 'Scene.Create.Post') { - filenameFetcher = getSceneFilename; - saver = updateScene; - } else if (type === 'Gallery.Create.Post') { - filenameFetcher = getGalleryFilename; - saver = updateGallery; - } else { - return ok(); - } - - var filename = filenameFetcher(ID); - if (!filename) { - return ok(); - } - - filename = cleanFilename(filename); - var parseResult = parseFilename(filename); - - saver(ID, parseResult); + var hookContext = input.Args.hookContext; + var type = hookContext.type; + var ID = hookContext.ID; + if (!ID) { return ok(); + } + + var filenameFetcher; + var saver; + if (type === "Scene.Create.Post") { + filenameFetcher = getSceneFilename; + saver = updateScene; + } else if (type === "Gallery.Create.Post") { + filenameFetcher = getGalleryFilename; + saver = updateGallery; + } else { + return ok(); + } + + var filename = filenameFetcher(ID); + if (!filename) { + return ok(); + } + + filename = cleanFilename(filename); + var parseResult = parseFilename(filename); + + saver(ID, parseResult); + + return ok(); } function getSceneFilename(sceneID) { - var query = "\ + var query = + "\ query findScene($id: ID) {\ findScene(id: $id) {\ files {\ @@ -48,39 +49,41 @@ query findScene($id: ID) {\ }\ }"; - var variables = { - id: sceneID - }; + var variables = { + id: sceneID, + }; - var result = gql.Do(query, variables); - var findScene = result.findScene; - if (!findScene) { - return null; - } + var result = gql.Do(query, variables); + var findScene = result.findScene; + if (!findScene) { + return null; + } - var path = findScene.files[0].path; - return path.substring(path.lastIndexOf('/') + 1); + var path = findScene.files[0].path; + return path.substring(path.lastIndexOf("/") + 1); } function updateScene(sceneID, parseResult) { - var query = "\ + var query = + "\ mutation SceneUpdate($input: SceneUpdateInput!) {\ sceneUpdate(input: $input) {\ id\ }\ }"; - var variables = { - input: parseResult - }; + var variables = { + input: parseResult, + }; - variables.input.id = sceneID; + variables.input.id = sceneID; - gql.Do(query, variables); + gql.Do(query, variables); } function getGalleryFilename(galleryID) { - var query = "\ + var query = + "\ query findGallery($id: ID!) {\ findGallery(id: $id) {\ files {\ @@ -89,119 +92,122 @@ query findGallery($id: ID!) {\ }\ }"; - var variables = { - id: galleryID - }; + var variables = { + id: galleryID, + }; - var result = gql.Do(query, variables); - var findGallery = result.findGallery; - if (!findGallery) { - return null; - } + var result = gql.Do(query, variables); + var findGallery = result.findGallery; + if (!findGallery) { + return null; + } - var path = findGallery.files[0].path; - return path.substring(path.lastIndexOf('/') + 1); + var path = findGallery.files[0].path; + return path.substring(path.lastIndexOf("/") + 1); } function updateGallery(galleryID, parseResult) { - var query = "\ + var query = + "\ mutation GalleryUpdate($input: GalleryUpdateInput!) {\ galleryUpdate(input: $input) {\ id\ }\ }"; - var variables = { - input: parseResult - }; + var variables = { + input: parseResult, + }; - variables.input.id = galleryID; + variables.input.id = galleryID; - gql.Do(query, variables); + gql.Do(query, variables); } function matchNames(parts, name, aliases) { - var names = [name].concat(aliases); + var names = [name].concat(aliases); - var partRegexes = []; + var partRegexes = []; - for (var i = 0; i < parts.length; i++) { - partRegexes[i] = new RegExp('^' + parts[i].toLowerCase() + '[. \\-_]*'); - } + for (var i = 0; i < parts.length; i++) { + partRegexes[i] = new RegExp("^" + parts[i].toLowerCase() + "[. \\-_]*"); + } - var cleanRegex = /[. \-_]/g; - var longestMatch = 0; - for (var i = 0; i < names.length; i++) { - var name = names[i].replace(cleanRegex, '').toLowerCase(); - for (var j = 0; j < partRegexes.length; j++) { - if (!partRegexes[j].test(name)) { - break; - } + var cleanRegex = /[. \-_]/g; + var longestMatch = 0; + for (var i = 0; i < names.length; i++) { + var name = names[i].replace(cleanRegex, "").toLowerCase(); + for (var j = 0; j < partRegexes.length; j++) { + if (!partRegexes[j].test(name)) { + break; + } - name = name.replace(partRegexes[j], ''); + name = name.replace(partRegexes[j], ""); - if (name.length === 0) { - if (j + 1 > longestMatch) { - longestMatch = j + 1; - } - } + if (name.length === 0) { + if (j + 1 > longestMatch) { + longestMatch = j + 1; } + } } + } - return longestMatch; + return longestMatch; } function cleanFilename(name) { - name = name - // remove imageset-...[rarbg] - .replace(/imageset-[\w\d]+\[rarbg]/i, '') - // replace [...] with just ... - .replace(/\[(.*?)]/g, '$1') - // replace (...) with just ... - .replace(/\((.*?)\)/g, '$1') - // replace {...} with just ... - .replace(/{(.*?)}/g, '$1') - ; + name = name + // remove imageset-...[rarbg] + .replace(/imageset-[\w\d]+\[rarbg]/i, "") + // replace [...] with just ... + .replace(/\[(.*?)]/g, "$1") + // replace (...) with just ... + .replace(/\((.*?)\)/g, "$1") + // replace {...} with just ... + .replace(/{(.*?)}/g, "$1"); - var blockList = [ - 'mp4', - 'mov', - 'mkv', - 'zip', - 'cbz', - 'cbr', - 'xxx', - '4k', - '4096x2160', - '3840x2160', - '2160p', - '1080p', - '1920x1080', - '60fps', - '30fps', - 'repack', - 'ktr', - ]; - var regExp = new RegExp('(_|[^\\w\\d]|^)(' + blockList.join('|') + ')(_|[^\\w\\d]|$)', 'i'); - while (regExp.test(name)) { - name = name.replace(regExp, '$1$3'); - } + var blockList = [ + "mp4", + "mov", + "mkv", + "zip", + "cbz", + "cbr", + "xxx", + "4k", + "4096x2160", + "3840x2160", + "2160p", + "1080p", + "1920x1080", + "60fps", + "30fps", + "repack", + "ktr", + ]; + var regExp = new RegExp( + "(_|[^\\w\\d]|^)(" + blockList.join("|") + ")(_|[^\\w\\d]|$)", + "i", + ); + while (regExp.test(name)) { + name = name.replace(regExp, "$1$3"); + } - // If name starts with <...>.com remove the .com (sometimes names include studio name as site/domain) - name = name.replace(/^([\w\d-]+?)\.com/, '$1'); + // If name starts with <...>.com remove the .com (sometimes names include studio name as site/domain) + name = name.replace(/^([\w\d-]+?)\.com/, "$1"); - name = name - // Remove everything except letters and digits at the start - .replace(/^(_|[^\w\d])+/, '') - // Remove everything except letters and digits at the end - .replace(/(_|[^\w\d])+$/, '') - ; + name = name + // Remove everything except letters and digits at the start + .replace(/^(_|[^\w\d])+/, "") + // Remove everything except letters and digits at the end + .replace(/(_|[^\w\d])+$/, ""); - return name; + return name; } function matchStudio(parts, result) { - var query = "\ + var query = + "\ query findStudios($studio_filter: StudioFilterType, $filter: FindFilterType!) {\ findStudios(studio_filter: $studio_filter, filter: $filter) {\ studios {\ @@ -212,85 +218,95 @@ query findStudios($studio_filter: StudioFilterType, $filter: FindFilterType!) {\ }\ }"; - var searchTerm = parts[0].substring(0, 2); - if (parts[0].substring(0, 1) === 'a') { - searchTerm = parts[0].substring(1, 3); - } - var variables = { - filter: { - per_page: -1, + var searchTerm = parts[0].substring(0, 2); + if (parts[0].substring(0, 1) === "a") { + searchTerm = parts[0].substring(1, 3); + } + var variables = { + filter: { + per_page: -1, + }, + studio_filter: { + name: { + modifier: "INCLUDES", + value: searchTerm, + }, + OR: { + aliases: { + modifier: "INCLUDES", + value: searchTerm, }, - studio_filter: { - name: { - modifier: "INCLUDES", - value: searchTerm - }, - OR: { - aliases: { - modifier: "INCLUDES", - value: searchTerm - } - } - } - }; + }, + }, + }; - var queryResult = gql.Do(query, variables); - var studios = queryResult.findStudios.studios; - if (!studios.length && parts[0].substring(0, 1) === 'a') { - variables.studio_filter.name.value = variables.studio_filter.OR.aliases.value = parts[0].substring(1, 3); - queryResult = gql.Do(query, variables); - studios = queryResult.findStudios.studios; + var queryResult = gql.Do(query, variables); + var studios = queryResult.findStudios.studios; + if (!studios.length && parts[0].substring(0, 1) === "a") { + variables.studio_filter.name.value = + variables.studio_filter.OR.aliases.value = parts[0].substring(1, 3); + queryResult = gql.Do(query, variables); + studios = queryResult.findStudios.studios; + } + + var matchingParts = 0; + for (var i = 0; i < studios.length; i++) { + var studio = studios[i]; + matchingParts = matchNames(parts, studio.name, studio.aliases); + if (matchingParts === 0) { + continue; } - var matchingParts = 0; - for (var i = 0; i < studios.length; i++) { - var studio = studios[i]; - matchingParts = matchNames(parts, studio.name, studio.aliases); - if (matchingParts === 0) { - continue; - } + result.studio_id = studio.id; - result.studio_id = studio.id; + break; + } - break; - } - - return matchingParts; + return matchingParts; } function matchDate(parts, result) { - if ( - parts.length < 3 || - !/^(\d{2}|\d{4})$/.test(parts[0]) || - !/^\d{2}$/.test(parts[1]) || - !/^\d{2}$/.test(parts[2]) - ) { - return 0; - } + if ( + parts.length < 3 || + !/^(\d{2}|\d{4})$/.test(parts[0]) || + !/^\d{2}$/.test(parts[1]) || + !/^\d{2}$/.test(parts[2]) + ) { + return 0; + } - var year = parseInt(parts[0], 10); - var month = parseInt(parts[1], 10); - var day = parseInt(parts[2], 10); + var year = parseInt(parts[0], 10); + var month = parseInt(parts[1], 10); + var day = parseInt(parts[2], 10); - if (year < 100) { - year += 2000; - } + if (year < 100) { + year += 2000; + } - if ( - year < 2000 || year > 2100 || - month < 1 || month > 12 || - day < 1 || day > 31 - ) { - return 0; - } + if ( + year < 2000 || + year > 2100 || + month < 1 || + month > 12 || + day < 1 || + day > 31 + ) { + return 0; + } - result.date = year + "-" + (month < 10 ? "0" + month : month) + "-" + (day < 10 ? "0" + day : day); + result.date = + year + + "-" + + (month < 10 ? "0" + month : month) + + "-" + + (day < 10 ? "0" + day : day); - return 3; + return 3; } function matchPerformers(parts, result) { - var query = "\ + var query = + "\ query findPerformers($performer_filter: PerformerFilterType, $filter: FindFilterType!) {\ findPerformers(performer_filter: $performer_filter, filter: $filter) {\ performers {\ @@ -299,107 +315,113 @@ query findPerformers($performer_filter: PerformerFilterType, $filter: FindFilter alias_list\ }\ }\ -}" - var variables = { - filter: { - per_page: -1 +}"; + var variables = { + filter: { + per_page: -1, + }, + performer_filter: { + name: { + modifier: "INCLUDES", + }, + OR: { + aliases: { + modifier: "INCLUDES", }, - performer_filter: { - name: { - modifier: "INCLUDES" - }, - OR: { - aliases: { - modifier: "INCLUDES" - } - } - } - }; + }, + }, + }; - var totalMatchingParts = 0; - result.performer_ids = []; - do { - variables.performer_filter.name.value = variables.performer_filter.OR.aliases.value = parts[0].substring(0, 2); + var totalMatchingParts = 0; + result.performer_ids = []; + do { + variables.performer_filter.name.value = + variables.performer_filter.OR.aliases.value = parts[0].substring(0, 2); - var queryResult = gql.Do(query, variables); - var performers = queryResult.findPerformers.performers; - if (!performers.length) { - parts.shift(); - continue; - } + var queryResult = gql.Do(query, variables); + var performers = queryResult.findPerformers.performers; + if (!performers.length) { + parts.shift(); + continue; + } - var maxMatchLength = 0; - var matches = []; - for (var i = 0; i < performers.length; i++) { - var performer = performers[i]; - var aliases = performer.aliases ? performer.aliases.split(/\s*[,;]+\s*/) : []; - var matchingParts = matchNames(parts, performer.name, aliases); - if (matchingParts === 0) { - continue; - } + var maxMatchLength = 0; + var matches = []; + for (var i = 0; i < performers.length; i++) { + var performer = performers[i]; + var aliases = performer.aliases + ? performer.aliases.split(/\s*[,;]+\s*/) + : []; + var matchingParts = matchNames(parts, performer.name, aliases); + if (matchingParts === 0) { + continue; + } - if (matchingParts > maxMatchLength) { - maxMatchLength = matchingParts; - matches = [performer.id]; - } else if (matchingParts === maxMatchLength) { - matches.push(performer.id); - } - } + if (matchingParts > maxMatchLength) { + maxMatchLength = matchingParts; + matches = [performer.id]; + } else if (matchingParts === maxMatchLength) { + matches.push(performer.id); + } + } - if (maxMatchLength === 0) { - break; - } + if (maxMatchLength === 0) { + break; + } - result.performer_ids = result.performer_ids.concat(matches); + result.performer_ids = result.performer_ids.concat(matches); - totalMatchingParts += maxMatchLength; + totalMatchingParts += maxMatchLength; - parts = parts.slice(maxMatchLength); - while (parts.length > 0 && (parts[0].toLowerCase() === 'and' || parts[0] === '&')) { - parts.shift(); - totalMatchingParts += 1; - } - } while (parts.length > 0); + parts = parts.slice(maxMatchLength); + while ( + parts.length > 0 && + (parts[0].toLowerCase() === "and" || parts[0] === "&") + ) { + parts.shift(); + totalMatchingParts += 1; + } + } while (parts.length > 0); - return totalMatchingParts; + return totalMatchingParts; } function parseFilename(name) { - var parts = name.split(/[. \-_,]+/); + var parts = name.split(/[. \-_,]+/); - var matchers = [ - matchStudio, - matchDate, - matchPerformers, - ]; + var matchers = [matchStudio, matchDate, matchPerformers]; - var result = {}; - var hasMatched = false; - for (var matchTries = 0; matchTries < 3 && !hasMatched && parts.length; matchTries++) { - for (var i = 0; i < matchers.length && parts.length > 0; i++) { - var matchedParts = matchers[i](parts, result); + var result = {}; + var hasMatched = false; + for ( + var matchTries = 0; + matchTries < 3 && !hasMatched && parts.length; + matchTries++ + ) { + for (var i = 0; i < matchers.length && parts.length > 0; i++) { + var matchedParts = matchers[i](parts, result); - if (matchedParts > 0) { - hasMatched = true; - parts = parts.slice(matchedParts); - } - } - - // If no matchers worked remove a part. Maybe the format is correct but studio isn't found? etc - if (!hasMatched) { - parts.shift(); - } + if (matchedParts > 0) { + hasMatched = true; + parts = parts.slice(matchedParts); + } } - if (hasMatched && parts.length > 0) { - var title = parts.join(' '); - // Look behind assertions are not supported, so can't use `replace(/(?<=.)([A-Z]/g, ' $1')` so instead have to do a loop. Otherwise for example 'FooABar' will become 'Foo ABar' instead of 'Foo A Bar' - while (/[^\s][A-Z]/.test(title)) { - title = title.replace(/([^\s])([A-Z])/g, '$1 $2'); - } - result.title = title.trim(); + // If no matchers worked remove a part. Maybe the format is correct but studio isn't found? etc + if (!hasMatched) { + parts.shift(); } - return result; + } + + if (hasMatched && parts.length > 0) { + var title = parts.join(" "); + // Look behind assertions are not supported, so can't use `replace(/(?<=.)([A-Z]/g, ' $1')` so instead have to do a loop. Otherwise for example 'FooABar' will become 'Foo ABar' instead of 'Foo A Bar' + while (/[^\s][A-Z]/.test(title)) { + title = title.replace(/([^\s])([A-Z])/g, "$1 $2"); + } + result.title = title.trim(); + } + return result; } main(); diff --git a/plugins/markerTagToScene/markerTagToScene.js b/plugins/markerTagToScene/markerTagToScene.js index 77ceecc..8aca037 100644 --- a/plugins/markerTagToScene/markerTagToScene.js +++ b/plugins/markerTagToScene/markerTagToScene.js @@ -1,44 +1,45 @@ function ok() { - return { - output: "ok" - }; + return { + output: "ok", + }; } function main() { - var hookContext = input.Args.hookContext; - var opInput = hookContext.input; - var primaryTagID = opInput.primary_tag_id; - var sceneID = opInput.scene_id; + var hookContext = input.Args.hookContext; + var opInput = hookContext.input; + var primaryTagID = opInput.primary_tag_id; + var sceneID = opInput.scene_id; - // we can't currently find scene markers. If it's not in the input - // then just return - if (!primaryTagID || !sceneID) { - // just return - return ok(); + // we can't currently find scene markers. If it's not in the input + // then just return + if (!primaryTagID || !sceneID) { + // just return + return ok(); + } + + // get the existing scene tags + var sceneTags = getSceneTags(sceneID); + var tagIDs = []; + for (var i = 0; i < sceneTags.length; ++i) { + var tagID = sceneTags[i].id; + if (tagID == primaryTagID) { + log.Debug("primary tag already exists on scene"); + return; } - // get the existing scene tags - var sceneTags = getSceneTags(sceneID); - var tagIDs = []; - for (var i = 0; i < sceneTags.length; ++i) { - var tagID = sceneTags[i].id; - if (tagID == primaryTagID) { - log.Debug("primary tag already exists on scene"); - return; - } + tagIDs.push(tagID); + } - tagIDs.push(tagID); - } + // set the tag on the scene if not present + tagIDs.push(primaryTagID); - // set the tag on the scene if not present - tagIDs.push(primaryTagID); - - setSceneTags(sceneID, tagIDs); - log.Info("added primary tag " + primaryTagID + " to scene " + sceneID); + setSceneTags(sceneID, tagIDs); + log.Info("added primary tag " + primaryTagID + " to scene " + sceneID); } function getSceneTags(sceneID) { - var query = "\ + var query = + "\ query findScene($id: ID) {\ findScene(id: $id) {\ tags {\ @@ -47,35 +48,36 @@ query findScene($id: ID) {\ }\ }"; - var variables = { - id: sceneID - }; + var variables = { + id: sceneID, + }; - var result = gql.Do(query, variables); - var findScene = result.findScene; - if (findScene) { - return findScene.tags; - } + var result = gql.Do(query, variables); + var findScene = result.findScene; + if (findScene) { + return findScene.tags; + } - return []; + return []; } function setSceneTags(sceneID, tagIDs) { - var mutation = "\ + var mutation = + "\ mutation sceneUpdate($input: SceneUpdateInput!) {\ sceneUpdate(input: $input) {\ id\ }\ }"; - var variables = { - input: { - id: sceneID, - tag_ids: tagIDs - } - }; + var variables = { + input: { + id: sceneID, + tag_ids: tagIDs, + }, + }; - gql.Do(mutation, variables); + gql.Do(mutation, variables); } -main(); \ No newline at end of file +main(); diff --git a/plugins/markerTagToScene/markerTagToScene.yml b/plugins/markerTagToScene/markerTagToScene.yml index 2dcb10e..f5973e5 100644 --- a/plugins/markerTagToScene/markerTagToScene.yml +++ b/plugins/markerTagToScene/markerTagToScene.yml @@ -9,6 +9,6 @@ interface: js hooks: - name: Update scene with scene marker tag description: Adds primary tag of Scene Marker to the Scene on marker create/update. - triggeredBy: + triggeredBy: - SceneMarker.Create.Post - SceneMarker.Update.Post diff --git a/plugins/miscTags/miscTags.py b/plugins/miscTags/miscTags.py index 1aa0820..c9a9088 100644 --- a/plugins/miscTags/miscTags.py +++ b/plugins/miscTags/miscTags.py @@ -6,126 +6,168 @@ import time per_page = 100 -skip_tag='[MiscTags: Skip]' +skip_tag = "[MiscTags: Skip]" # Defaults if nothing has changed in the stash ui -settings={ - 'addStashVrCompanionTags':False, - 'addVrTags':False, - 'flatStudio':'' - } +settings = {"addStashVrCompanionTags": False, "addVrTags": False, "flatStudio": ""} + +VRCTags = { + "flat": {"VRCTags": ["FLAT"], "projTags": []}, + "180_mono": {"VRCTags": ["DOME", "MONO"], "projTags": ["180°"]}, + "360_mono": {"VRCTags": ["SPHERE", "MONO"], "projTags": ["360°"]}, + "180_sbs": {"VRCTags": ["DOME", "SBS"], "projTags": ["180°"]}, + "LR_180": {"VRCTags": ["DOME", "SBS"], "projTags": ["180°"]}, + "180_lr": {"VRCTags": ["DOME", "SBS"], "projTags": ["180°"]}, + "180_3dh_lr": {"VRCTags": ["DOME", "SBS"], "projTags": ["180°"]}, + "360_tb": {"VRCTags": ["SPHERE", "SBS"], "projTags": ["360°"]}, + "mkx200": {"VRCTags": ["MKX200", "FISHEYE", "SBS"], "projTags": ["220°"]}, + "mkx220": {"VRCTags": ["MKX220", "FISHEYE", "SBS"], "projTags": ["220°"]}, + "vrca220": {"VRCTags": ["VRCA220", "FISHEYE", "SBS"], "projTags": ["220°"]}, + "rf52": {"VRCTags": ["RF52", "FISHEYE", "SBS"], "projTags": ["190°"]}, + "fisheye190": {"VRCTags": ["RF52", "FISHEYE", "SBS"], "projTags": ["190°"]}, + "passthrough": {"VRCTags": [], "projTags": ["Augmented Reality"]}, + "8k": {"VRCTags": [], "projTags": ["8K"]}, + "7k": {"VRCTags": [], "projTags": ["7K"]}, + "6k": {"VRCTags": [], "projTags": ["6K"]}, + "5k": {"VRCTags": [], "projTags": ["5K"]}, +} +tags_cache = {} -VRCTags={ - 'flat':{'VRCTags':['FLAT'],'projTags':[]}, - '180_mono':{'VRCTags':['DOME','MONO'],'projTags':['180°']}, - '360_mono':{'VRCTags':['SPHERE','MONO'],'projTags':['360°']}, - '180_sbs':{'VRCTags':['DOME','SBS'],'projTags':['180°']}, - 'LR_180':{'VRCTags':['DOME','SBS'],'projTags':['180°']}, - '180_lr': {'VRCTags':['DOME', 'SBS'],'projTags':['180°']}, - '180_3dh_lr': {'VRCTags': ['DOME', 'SBS'], 'projTags': ['180°']}, - '360_tb':{'VRCTags':['SPHERE','SBS'],'projTags':['360°']}, - 'mkx200':{'VRCTags':['MKX200','FISHEYE','SBS'],'projTags':['220°']}, - 'mkx220':{'VRCTags':['MKX220','FISHEYE','SBS'],'projTags':['220°']}, - 'vrca220': {'VRCTags':['VRCA220', 'FISHEYE', 'SBS'],'projTags':['220°']}, - 'rf52':{'VRCTags':['RF52','FISHEYE', 'SBS'],'projTags':['190°']}, - 'fisheye190': {'VRCTags':['RF52', 'FISHEYE', 'SBS'],'projTags':['190°']}, - 'passthrough':{'VRCTags':[],'projTags':['Augmented Reality']}, - '8k': {'VRCTags': [], 'projTags': ['8K']}, - '7k': {'VRCTags': [], 'projTags': ['7K']}, - '6k': {'VRCTags': [], 'projTags': ['6K']}, - '5k': {'VRCTags': [], 'projTags': ['5K']}, - } -tags_cache={} def processScene(scene): - log.debug('processing scene: %s' % (scene['id'],)) + log.debug("processing scene: %s" % (scene["id"],)) # if the scene has [MiscTags: Skip] then skip it if skip_tag not in tags_cache: - tags_cache[skip_tag]=stash.find_tag(skip_tag, create=True).get("id") - if tags_cache[skip_tag] not in [x['id'] for x in scene['tags']]: - tags=[] - if settings['addStashVrCompanionTags']: - processStashVRCompanionTags(scene,tags) + tags_cache[skip_tag] = stash.find_tag(skip_tag, create=True).get("id") + if tags_cache[skip_tag] not in [x["id"] for x in scene["tags"]]: + tags = [] + if settings["addStashVrCompanionTags"]: + processStashVRCompanionTags(scene, tags) log.debug(tags) - if settings['addVrTags']: - processVRTags(scene,tags) - if len(settings['flatStudio']) > 0: - processFlatStudio(scene,tags) + if settings["addVrTags"]: + processVRTags(scene, tags) + if len(settings["flatStudio"]) > 0: + processFlatStudio(scene, tags) if len(tags) > 0: - log.debug('processing scene %s, checking if tags need to be added: %s' % (scene['title'],tags,)) + log.debug( + "processing scene %s, checking if tags need to be added: %s" + % ( + scene["title"], + tags, + ) + ) # start with the existing tag id's, then look up the new tag id's and create if needed - new_scene = {'id': scene['id'], 'tag_ids': [x['id'] for x in scene['tags']]} - update=False + new_scene = {"id": scene["id"], "tag_ids": [x["id"] for x in scene["tags"]]} + update = False for t in tags: if t not in tags_cache: - tags_cache[t]=stash.find_tag(t, create=True).get("id") - update=True - if tags_cache[t] not in new_scene['tag_ids']: - new_scene['tag_ids'].append(tags_cache[t]) - update=True + tags_cache[t] = stash.find_tag(t, create=True).get("id") + update = True + if tags_cache[t] not in new_scene["tag_ids"]: + new_scene["tag_ids"].append(tags_cache[t]) + update = True if update: - log.info('Adding tags to scene: %s, tags: %s' % (scene['title'], tags,)) + log.info( + "Adding tags to scene: %s, tags: %s" + % ( + scene["title"], + tags, + ) + ) stash.update_scene(new_scene) else: - log.debug('no update') + log.debug("no update") else: - log.debug('skipping scene') + log.debug("skipping scene") -def processStashVRCompanionTags(scene,tags): - found=False - for f in scene['files']: - for k,v in VRCTags.items(): - if k in f['basename'].lower(): - tags.extend(v['VRCTags']) - found=True +def processStashVRCompanionTags(scene, tags): + found = False + for f in scene["files"]: + for k, v in VRCTags.items(): + if k in f["basename"].lower(): + tags.extend(v["VRCTags"]) + found = True if found: - tags.append('export_deovr') + tags.append("export_deovr") return None -def processVRTags(scene,tags): - found=False - for f in scene['files']: - for k,v in VRCTags.items(): - if k in f['basename'].lower(): - tags.extend(v['projTags']) - found=True + +def processVRTags(scene, tags): + found = False + for f in scene["files"]: + for k, v in VRCTags.items(): + if k in f["basename"].lower(): + tags.extend(v["projTags"]) + found = True if found: - if 'vrTag' in stash.get_configuration()['ui']: - vr_tag=stash.get_configuration()['ui']['vrTag'] + if "vrTag" in stash.get_configuration()["ui"]: + vr_tag = stash.get_configuration()["ui"]["vrTag"] if vr_tag: tags.append(vr_tag) else: - tags.append('VR') + tags.append("VR") else: - tags.append('VR') + tags.append("VR") return None -def processFlatStudio(scene,tags): - log.debug(scene) - if scene['studio']: - if scene['studio']['id'] in [x.strip() for x in settings['flatStudio'].split(',')]: - if 'export_deovr' not in tags: - tags.append('export_deovr') - tags.append('FLAT') +def processFlatStudio(scene, tags): + log.debug(scene) + if scene["studio"]: + if scene["studio"]["id"] in [ + x.strip() for x in settings["flatStudio"].split(",") + ]: + if "export_deovr" not in tags: + tags.append("export_deovr") + + tags.append("FLAT") log.debug(tags) + def processScenes(): - log.info('Getting scene count') + log.info("Getting scene count") if skip_tag not in tags_cache: - tags_cache[skip_tag]=stash.find_tag(skip_tag, create=True).get("id") - count=stash.find_scenes(f={"tags":{"depth":0,"excludes":[tags_cache[skip_tag]],"modifier":"INCLUDES_ALL","value":[]}},filter={"per_page": 1},get_count=True)[0] - log.info(str(count)+' scenes to process.') - i=0 - for r in range(1,int(count/per_page)+2): - log.info('adding tags to scenes: %s - %s %0.1f%%' % ((r - 1) * per_page,r * per_page,(i/count)*100,)) - scenes=stash.find_scenes(f={"tags":{"depth":0,"excludes":[tags_cache[skip_tag]],"modifier":"INCLUDES_ALL","value":[]}},filter={"page":r,"per_page": per_page}) + tags_cache[skip_tag] = stash.find_tag(skip_tag, create=True).get("id") + count = stash.find_scenes( + f={ + "tags": { + "depth": 0, + "excludes": [tags_cache[skip_tag]], + "modifier": "INCLUDES_ALL", + "value": [], + } + }, + filter={"per_page": 1}, + get_count=True, + )[0] + log.info(str(count) + " scenes to process.") + i = 0 + for r in range(1, int(count / per_page) + 2): + log.info( + "adding tags to scenes: %s - %s %0.1f%%" + % ( + (r - 1) * per_page, + r * per_page, + (i / count) * 100, + ) + ) + scenes = stash.find_scenes( + f={ + "tags": { + "depth": 0, + "excludes": [tags_cache[skip_tag]], + "modifier": "INCLUDES_ALL", + "value": [], + } + }, + filter={"page": r, "per_page": per_page}, + ) for s in scenes: processScene(s) - i=i+1 - log.progress((i/count)) + i = i + 1 + log.progress((i / count)) time.sleep(1) @@ -133,20 +175,19 @@ json_input = json.loads(sys.stdin.read()) FRAGMENT_SERVER = json_input["server_connection"] stash = StashInterface(FRAGMENT_SERVER) -config=stash.get_configuration()['plugins'] -if 'misc-tags' in config: - settings.update(config['misc-tags']) -log.info('config: %s ' % (settings,)) +config = stash.get_configuration()["plugins"] +if "misc-tags" in config: + settings.update(config["misc-tags"]) +log.info("config: %s " % (settings,)) -if 'mode' in json_input['args']: - PLUGIN_ARGS = json_input['args']["mode"] - if 'processScenes' in PLUGIN_ARGS: +if "mode" in json_input["args"]: + PLUGIN_ARGS = json_input["args"]["mode"] + if "processScenes" in PLUGIN_ARGS: processScenes() - -elif 'hookContext' in json_input['args']: - id=json_input['args']['hookContext']['id'] - if json_input['args']['hookContext']['type']=='Scene.Update.Post': - scene=stash.find_scene(id) +elif "hookContext" in json_input["args"]: + id = json_input["args"]["hookContext"]["id"] + if json_input["args"]["hookContext"]["type"] == "Scene.Update.Post": + scene = stash.find_scene(id) processScene(scene) diff --git a/plugins/pathParser/pathParser.js b/plugins/pathParser/pathParser.js index bdef349..b2e3c20 100644 --- a/plugins/pathParser/pathParser.js +++ b/plugins/pathParser/pathParser.js @@ -1,132 +1,117 @@ // Common Patterns var patterns = { movieTitleAndYear: /(.+) \(\d{4}\)/, - sceneTitleAndPerformers: /(.+) - ([A-zÀ-ú, ]+)/ -} + sceneTitleAndPerformers: /(.+) - ([A-zÀ-ú, ]+)/, +}; var rules = [ { - name: 'Rule 1', - pattern: [ - 'Specific Studio', - null, - null - ], + name: "Rule 1", + pattern: ["Specific Studio", null, null], fields: { - studio: '#0', - title: '#2', - } + studio: "#0", + title: "#2", + }, }, { - name: 'Rule 2', + name: "Rule 2", pattern: [ - ['One Studio', 'Another Studio'], + ["One Studio", "Another Studio"], patterns.movieTitleAndYear, - patterns.sceneTitleAndPerformers + patterns.sceneTitleAndPerformers, ], fields: { - title: '#2', - studio: '#0', - performers: '#3' - } + title: "#2", + studio: "#0", + performers: "#3", + }, }, ]; /* ---------------------------------------------------------------------------- // DO NOT EDIT BELOW! ---------------------------------------------------------------------------- */ -function main() -{ - try - { - switch (getTask(input.Args)) - { - case 'createTags': - var runTag = getArg(input.Args, 'runTag'); - var testTag = getArg(input.Args, 'testTag'); +function main() { + try { + switch (getTask(input.Args)) { + case "createTags": + var runTag = getArg(input.Args, "runTag"); + var testTag = getArg(input.Args, "testTag"); createTags([runTag, testTag]); break; - case 'removeTags': - var runTag = getArg(input.Args, 'runTag'); - var testTag = getArg(input.Args, 'testTag'); + case "removeTags": + var runTag = getArg(input.Args, "runTag"); + var testTag = getArg(input.Args, "testTag"); removeTags([runTag, testTag]); break; - case 'runRules': - var runTag = getArg(input.Args, 'runTag'); + case "runRules": + var runTag = getArg(input.Args, "runTag"); initBasePaths(); runRules(runTag); break; - case 'testRules': + case "testRules": DEBUG = true; - var testTag = getArg(input.Args, 'testTag'); + var testTag = getArg(input.Args, "testTag"); initBasePaths(); runRules(testTag); break; - case 'scene': + case "scene": var id = getId(input.Args); initBasePaths(); matchRuleWithSceneId(id, applyRule); break; - case 'image': + case "image": var id = getId(input.Args); initBasePaths(); break; default: - throw 'Unsupported task'; + throw "Unsupported task"; } - } - catch (e) - { - return { Output: 'error', Error: e }; + } catch (e) { + return { Output: "error", Error: e }; } - return { Output: 'ok' }; + return { Output: "ok" }; } // Get an input arg -function getArg(inputArgs, arg) -{ - if (inputArgs.hasOwnProperty(arg)) - { +function getArg(inputArgs, arg) { + if (inputArgs.hasOwnProperty(arg)) { return inputArgs[arg]; } - throw 'Input is missing ' + arg; + throw "Input is missing " + arg; } // Determine task based on input args -function getTask(inputArgs) -{ - if (inputArgs.hasOwnProperty('task')) - { +function getTask(inputArgs) { + if (inputArgs.hasOwnProperty("task")) { return inputArgs.task; } - - if (!inputArgs.hasOwnProperty('hookContext')) - { + + if (!inputArgs.hasOwnProperty("hookContext")) { return; } - switch (inputArgs.hookContext.type) - { - case 'Scene.Create.Post': - return 'scene'; - - case 'Image.Create.Post': - return 'image'; + switch (inputArgs.hookContext.type) { + case "Scene.Create.Post": + return "scene"; + + case "Image.Create.Post": + return "image"; } } // Get stash paths from configuration -function initBasePaths() -{ - var query ='\ +function initBasePaths() { + var query = + "\ query Query {\ configuration {\ general {\ @@ -135,239 +120,210 @@ function initBasePaths() }\ }\ }\ - }'; + }"; var result = gql.Do(query); - if (!result.configuration) - { - throw 'Unable to get library paths'; + if (!result.configuration) { + throw "Unable to get library paths"; } - BASE_PATHS = result.configuration.general.stashes.map(function (stash) - { + BASE_PATHS = result.configuration.general.stashes.map(function (stash) { return stash.path; }); - if (BASE_PATHS == null || BASE_PATHS.length == 0) - { - throw 'Unable to get library paths'; + if (BASE_PATHS == null || BASE_PATHS.length == 0) { + throw "Unable to get library paths"; } } // Create tag if it does not already exist -function createTags(tags) -{ - var query ='\ +function createTags(tags) { + var query = + "\ mutation TagCreate($input: TagCreateInput!) {\ tagCreate(input: $input) {\ id\ }\ - }'; + }"; - tags.forEach(function (tag) - { - if (tryGetTag(tag) !== null) - { + tags.forEach(function (tag) { + if (tryGetTag(tag) !== null) { return; } var variables = { input: { - name: tag - } + name: tag, + }, }; var result = gql.Do(query, variables); - if (!result.tagCreate) - { - throw 'Could not create tag ' + tag; + if (!result.tagCreate) { + throw "Could not create tag " + tag; } }); } // Remove tags if it already exists -function removeTags(tags) -{ - tags.forEach(function (tag) - { +function removeTags(tags) { + tags.forEach(function (tag) { var tagId = tryGetTag(tag); - if (tagId === null) - { + if (tagId === null) { return; } - var query = '\ + var query = + "\ mutation TagsDestroy($ids: [ID!]!) {\ tagsDestroy(ids: $ids)\ - }'; + }"; var variables = { - ids: [ tagId ] + ids: [tagId], }; var result = gql.Do(query, variables); - if (!result.tagsDestroy) - { - throw 'Unable to remove tag ' + tag; + if (!result.tagsDestroy) { + throw "Unable to remove tag " + tag; } }); } // Run rules for scenes containing tag -function runRules(tag) -{ +function runRules(tag) { var tagId = tryGetTag(tag); - if (tagId === null) - { - throw 'Tag ' + tag + ' does not exist'; + if (tagId === null) { + throw "Tag " + tag + " does not exist"; } - var query = '\ + var query = + "\ query FindScenes($sceneFilter: SceneFilterType) {\ findScenes(scene_filter: $sceneFilter) {\ scenes {\ id\ }\ }\ - }'; + }"; var variables = { sceneFilter: { tags: { value: tagId, - modifier: 'INCLUDES' - } - } + modifier: "INCLUDES", + }, + }, }; var result = gql.Do(query, variables); - if (!result.findScenes || result.findScenes.scenes.length == 0) - { - throw 'No scenes found with tag ' + tag; + if (!result.findScenes || result.findScenes.scenes.length == 0) { + throw "No scenes found with tag " + tag; } - result.findScenes.scenes.forEach(function (scene) - { + result.findScenes.scenes.forEach(function (scene) { matchRuleWithSceneId(scene.id, applyRule); }); } // Get scene/image id from input args -function getId(inputArgs) -{ - if ((id = inputArgs.hookContext.id) == null) - { - throw 'Input is missing id'; +function getId(inputArgs) { + if ((id = inputArgs.hookContext.id) == null) { + throw "Input is missing id"; } return id; } // Apply callback function to first matching rule for id -function matchRuleWithSceneId(sceneId, cb) -{ - var query = '\ +function matchRuleWithSceneId(sceneId, cb) { + var query = + "\ query FindScene($findSceneId: ID) {\ findScene(id: $findSceneId) {\ files {\ path\ }\ }\ - }'; + }"; var variables = { - findSceneId: sceneId - } + findSceneId: sceneId, + }; var result = gql.Do(query, variables); - if (!result.findScene || result.findScene.files.length == 0) - { - throw 'Missing scene for id: ' + sceneId; + if (!result.findScene || result.findScene.files.length == 0) { + throw "Missing scene for id: " + sceneId; } - for (var i = 0; i < result.findScene.files.length; i++) - { - try - { + for (var i = 0; i < result.findScene.files.length; i++) { + try { matchRuleWithPath(sceneId, result.findScene.files[i].path, cb); - - if (DEBUG && bufferedOutput !== null && bufferedOutput !== '') - { - log.Info('[PathParser] ' + bufferedOutput); + + if (DEBUG && bufferedOutput !== null && bufferedOutput !== "") { + log.Info("[PathParser] " + bufferedOutput); } return; - } - catch (e) - { + } catch (e) { continue; } } - - if (DEBUG && bufferedOutput !== null && bufferedOutput !== '') - { - log.Info('[PathParser] ' + bufferedOutput); + + if (DEBUG && bufferedOutput !== null && bufferedOutput !== "") { + log.Info("[PathParser] " + bufferedOutput); } - throw 'No rule matches id: ' + sceneId; + throw "No rule matches id: " + sceneId; } // Apply callback to first matching rule for path -function matchRuleWithPath(sceneId, path, cb) -{ +function matchRuleWithPath(sceneId, path, cb) { // Remove base path - for (var i = 0; i < BASE_PATHS.length; i++) - { - if (path.slice(0, BASE_PATHS[i].length) === BASE_PATHS[i]) - { + for (var i = 0; i < BASE_PATHS.length; i++) { + if (path.slice(0, BASE_PATHS[i].length) === BASE_PATHS[i]) { path = path.slice(BASE_PATHS[i].length); } } - if (DEBUG) - { - bufferedOutput = path + '\n'; + if (DEBUG) { + bufferedOutput = path + "\n"; } // Split paths into parts var parts = path.split(/[\\/]/); // Remove extension from filename - parts[parts.length - 1] = parts[parts.length - 1].slice(0, parts[parts.length - 1].lastIndexOf('.')); + parts[parts.length - 1] = parts[parts.length - 1].slice( + 0, + parts[parts.length - 1].lastIndexOf("."), + ); - for (var i = 0; i < rules.length; i++) - { + for (var i = 0; i < rules.length; i++) { var sceneData = testRule(rules[i].pattern, parts); - if (sceneData !== null) - { - if (DEBUG) - { - bufferedOutput += 'Rule: ' + rules[i].name + '\n'; + if (sceneData !== null) { + if (DEBUG) { + bufferedOutput += "Rule: " + rules[i].name + "\n"; } - log.Debug('[PathParser] Rule: ' + rules[i].name + '\nPath: ' + path); + log.Debug("[PathParser] Rule: " + rules[i].name + "\nPath: " + path); cb(sceneId, rules[i].fields, sceneData); return; } } - bufferedOutput += 'No matching rule!'; - throw 'No matching rule for path: ' + path; + bufferedOutput += "No matching rule!"; + throw "No matching rule for path: " + path; } // Test single rule -function testRule(pattern, parts) -{ - if (pattern.length !== parts.length) - { +function testRule(pattern, parts) { + if (pattern.length !== parts.length) { return null; } var matchedParts = []; - for (var i = 0; i < pattern.length; i++) - { - if ((subMatches = testPattern(pattern[i], parts[i])) == null) - { + for (var i = 0; i < pattern.length; i++) { + if ((subMatches = testPattern(pattern[i], parts[i])) == null) { return null; } @@ -377,19 +333,15 @@ function testRule(pattern, parts) return matchedParts; } -function testPattern(pattern, part) -{ +function testPattern(pattern, part) { // Match anything - if (pattern == null) - { + if (pattern == null) { return [part]; } // Simple match - if (typeof pattern === 'string') - { - if (pattern === part) - { + if (typeof pattern === "string") { + if (pattern === part) { return [part]; } @@ -397,18 +349,13 @@ function testPattern(pattern, part) } // Predicate match - if (typeof pattern == 'function') - { - try - { + if (typeof pattern == "function") { + try { var results = pattern(part); - if (results !== null) - { + if (results !== null) { return results; } - } - catch (e) - { + } catch (e) { throw e; } @@ -416,12 +363,9 @@ function testPattern(pattern, part) } // Array match - if (pattern instanceof Array) - { - for (var i = 0; i < pattern.length; i++) - { - if ((results = testPattern(pattern[i], part)) != null) - { + if (pattern instanceof Array) { + for (var i = 0; i < pattern.length; i++) { + if ((results = testPattern(pattern[i], part)) != null) { return results; } } @@ -430,11 +374,9 @@ function testPattern(pattern, part) } // RegExp match - if (pattern instanceof RegExp) - { + if (pattern instanceof RegExp) { var results = pattern.exec(part); - if (results === null) - { + if (results === null) { return null; } @@ -443,186 +385,165 @@ function testPattern(pattern, part) } // Apply rule -function applyRule(sceneId, fields, data) -{ +function applyRule(sceneId, fields, data) { var any = false; var variables = { input: { - id: sceneId - } + id: sceneId, + }, }; - if (DEBUG) - { - for (var i = 0; i < data.length; i++) - { - bufferedOutput += '#' + i + ': ' + data[i] + '\n'; + if (DEBUG) { + for (var i = 0; i < data.length; i++) { + bufferedOutput += "#" + i + ": " + data[i] + "\n"; } } - for (var field in fields) - { + for (var field in fields) { var value = fields[field]; - for (var i = data.length - 1; i >= 0; i--) - { - value = value.replace('#' + i, data[i]); + for (var i = data.length - 1; i >= 0; i--) { + value = value.replace("#" + i, data[i]); } - switch (field) - { - case 'title': - if (DEBUG) - { - bufferedOutput += field + ': ' + value + '\n'; + switch (field) { + case "title": + if (DEBUG) { + bufferedOutput += field + ": " + value + "\n"; } - variables.input['title'] = value; + variables.input["title"] = value; any = true; continue; - case 'studio': + case "studio": var studioId = tryGetStudio(value); - if (studioId == null) - { + if (studioId == null) { continue; } - if (DEBUG) - { - bufferedOutput += field + ': ' + value + '\n'; - bufferedOutput += 'studio_id: ' + studioId + '\n'; + if (DEBUG) { + bufferedOutput += field + ": " + value + "\n"; + bufferedOutput += "studio_id: " + studioId + "\n"; } - variables.input['studio_id'] = studioId; + variables.input["studio_id"] = studioId; any = true; continue; - case 'movie_title': - var movie_title = value.split(' ').join('[\\W]*'); - var movieId = tryGetMovie(movie_title); - if (movieId == null) - { - continue; - } - - if (!variables.input.hasOwnProperty('movies')) - { - variables.input['movies'] = [{}]; - } - - if (DEBUG) - { - bufferedOutput += field + ': ' + value + '\n'; - bufferedOutput += 'movie_id: ' + movieId + '\n'; - } - - variables.input['movies'][0]['movie_id'] = movieId; - any = true; + case "movie_title": + var movie_title = value.split(" ").join("[\\W]*"); + var movieId = tryGetMovie(movie_title); + if (movieId == null) { continue; - - case 'scene_index': + } + + if (!variables.input.hasOwnProperty("movies")) { + variables.input["movies"] = [{}]; + } + + if (DEBUG) { + bufferedOutput += field + ": " + value + "\n"; + bufferedOutput += "movie_id: " + movieId + "\n"; + } + + variables.input["movies"][0]["movie_id"] = movieId; + any = true; + continue; + + case "scene_index": var sceneIndex = parseInt(value); - if (isNaN(sceneIndex)) - { + if (isNaN(sceneIndex)) { continue; } - if (!variables.input.hasOwnProperty('movies')) - { - variables.input['movies'] = [{}]; + if (!variables.input.hasOwnProperty("movies")) { + variables.input["movies"] = [{}]; } - if (DEBUG) - { - bufferedOutput += 'scene_index: ' + sceneIndex + '\n'; + if (DEBUG) { + bufferedOutput += "scene_index: " + sceneIndex + "\n"; } - variables.input['movies'][0]['scene_index'] = sceneIndex; + variables.input["movies"][0]["scene_index"] = sceneIndex; continue; - case 'performers': - var performers = value.split(',').map(tryGetPerformer).filter(notNull); - if (performers.length == 0) - { + case "performers": + var performers = value.split(",").map(tryGetPerformer).filter(notNull); + if (performers.length == 0) { continue; } - if (DEBUG) - { - bufferedOutput += field + ': ' + value + '\n'; - bufferedOutput += 'performer_ids: ' + performers.join(', ') + '\n'; + if (DEBUG) { + bufferedOutput += field + ": " + value + "\n"; + bufferedOutput += "performer_ids: " + performers.join(", ") + "\n"; } - variables.input['performer_ids'] = performers; + variables.input["performer_ids"] = performers; any = true; continue; - case 'tags': - var tags = value.split(',').map(tryGetTag).filter(notNull); - if (tags.length == 0) - { + case "tags": + var tags = value.split(",").map(tryGetTag).filter(notNull); + if (tags.length == 0) { continue; } - if (DEBUG) - { - bufferedOutput += field + ': ' + value + '\n'; - bufferedOutput += 'tag_ids: ' + tags.join(', ') + '\n'; + if (DEBUG) { + bufferedOutput += field + ": " + value + "\n"; + bufferedOutput += "tag_ids: " + tags.join(", ") + "\n"; } - variables.input['tag_ids'] = tags; + variables.input["tag_ids"] = tags; any = true; continue; } } // Test only - if (DEBUG) - { - if (!any) - { - bufferedOutput += 'No fields to update!\n'; + if (DEBUG) { + if (!any) { + bufferedOutput += "No fields to update!\n"; } return; } // Remove movies if movie_id is missing - if (variables.input.hasOwnProperty('movies') && !variables.input['movies'][0].hasOwnProperty('movie_id')) - { - delete variables.input['movies']; + if ( + variables.input.hasOwnProperty("movies") && + !variables.input["movies"][0].hasOwnProperty("movie_id") + ) { + delete variables.input["movies"]; } // Apply updates - var query = '\ + var query = + "\ mutation Mutation($input: SceneUpdateInput!) {\ sceneUpdate(input: $input) {\ id\ }\ - }'; + }"; - if (!any) - { - throw 'No fields to update for scene ' + sceneId; + if (!any) { + throw "No fields to update for scene " + sceneId; } var result = gql.Do(query, variables); - if (!result.sceneUpdate) - { - throw 'Unable to update scene ' + sceneId; + if (!result.sceneUpdate) { + throw "Unable to update scene " + sceneId; } } // Returns true for not null elements -function notNull(ele) -{ +function notNull(ele) { return ele != null; } // Get studio id from studio name -function tryGetStudio(studio) -{ - var query = '\ +function tryGetStudio(studio) { + var query = + "\ query FindStudios($studioFilter: StudioFilterType) {\ findStudios(studio_filter: $studioFilter) {\ studios {\ @@ -630,29 +551,28 @@ function tryGetStudio(studio) }\ count\ }\ - }'; + }"; var variables = { studioFilter: { name: { value: studio.trim(), - modifier: 'EQUALS' - } - } + modifier: "EQUALS", + }, + }, }; var result = gql.Do(query, variables); - if (!result.findStudios || result.findStudios.count == 0) - { + if (!result.findStudios || result.findStudios.count == 0) { return; } return result.findStudios.studios[0].id; } -function tryGetMovie(movie_title) -{ - var query = '\ +function tryGetMovie(movie_title) { + var query = + "\ query FindMovies($movieFilter: MovieFilterType) {\ findMovies(movie_filter: $movieFilter) {\ movies {\ @@ -660,20 +580,19 @@ function tryGetMovie(movie_title) }\ count\ }\ - }'; + }"; var variables = { movieFilter: { name: { value: movie_title.trim(), - modifier: 'MATCHES_REGEX' - } - } + modifier: "MATCHES_REGEX", + }, + }, }; var result = gql.Do(query, variables); - if (!result.findMovies || result.findMovies.count == 0) - { + if (!result.findMovies || result.findMovies.count == 0) { return; } @@ -681,9 +600,9 @@ function tryGetMovie(movie_title) } // Get performer id from performer name -function tryGetPerformer(performer) -{ - var query = '\ +function tryGetPerformer(performer) { + var query = + "\ query FindPerformers($performerFilter: PerformerFilterType) {\ findPerformers(performer_filter: $performerFilter) {\ performers {\ @@ -691,20 +610,19 @@ function tryGetPerformer(performer) }\ count\ }\ - }'; + }"; var variables = { performerFilter: { name: { value: performer.trim(), - modifier: 'EQUALS' - } - } + modifier: "EQUALS", + }, + }, }; var result = gql.Do(query, variables); - if (!result.findPerformers || result.findPerformers.count == 0) - { + if (!result.findPerformers || result.findPerformers.count == 0) { return; } @@ -712,9 +630,9 @@ function tryGetPerformer(performer) } // Get tag id from tag name -function tryGetTag(tag) -{ - var query ='\ +function tryGetTag(tag) { + var query = + "\ query FindTags($tagFilter: TagFilterType) {\ findTags(tag_filter: $tagFilter) {\ tags {\ @@ -722,20 +640,19 @@ function tryGetTag(tag) }\ count\ }\ - }'; + }"; var variables = { tagFilter: { name: { value: tag.trim(), - modifier: 'EQUALS' - } - } + modifier: "EQUALS", + }, + }, }; var result = gql.Do(query, variables); - if (!result.findTags || result.findTags.count == 0) - { + if (!result.findTags || result.findTags.count == 0) { return; } @@ -744,5 +661,5 @@ function tryGetTag(tag) var DEBUG = false; var BASE_PATHS = []; -var bufferedOutput = ''; -main(); \ No newline at end of file +var bufferedOutput = ""; +main(); diff --git a/plugins/pathParser/pathParser.yml b/plugins/pathParser/pathParser.yml index 9ef17dc..bcd1e94 100644 --- a/plugins/pathParser/pathParser.yml +++ b/plugins/pathParser/pathParser.yml @@ -8,28 +8,28 @@ interface: js hooks: - name: Run Rules on scan description: Updates scene info whenever a new scene is added. - triggeredBy: + triggeredBy: - Scene.Create.Post tasks: - name: Create Tags description: Create tags used by the path parser tasks. defaultArgs: task: createTags - runTag: '[Run]' - testTag: '[Test]' + runTag: "[Run]" + testTag: "[Test]" - name: Remove Tags description: Remove tags used by the path parser tasks. defaultArgs: task: removeTags - runTag: '[Run]' - testTag: '[Test]' + runTag: "[Run]" + testTag: "[Test]" - name: Run Rules description: Run rules for scenes containing the run tag. defaultArgs: task: runRules - runTag: '[Run]' + runTag: "[Run]" - name: Test Rules description: Test rules for scenes containing the test tag. defaultArgs: task: testRules - testTag: '[Test]' \ No newline at end of file + testTag: "[Test]" diff --git a/plugins/phashDuplicateTagger/config.py b/plugins/phashDuplicateTagger/config.py index f8ca6a9..37c2332 100644 --- a/plugins/phashDuplicateTagger/config.py +++ b/plugins/phashDuplicateTagger/config.py @@ -1,32 +1,47 @@ import stashapi.log as log from stashapi.tools import human_bytes, human_bits -PRIORITY = ['bitrate_per_pixel','resolution', 'bitrate', 'encoding', 'size', 'age'] -CODEC_PRIORITY = {'AV1':0,'H265':1,'HEVC':1,'H264':2,'MPEG4':3,'MPEG1VIDEO':3,'WMV3':4,'WMV2':5,'VC1':6,'SVQ3':7} +PRIORITY = ["bitrate_per_pixel", "resolution", "bitrate", "encoding", "size", "age"] +CODEC_PRIORITY = { + "AV1": 0, + "H265": 1, + "HEVC": 1, + "H264": 2, + "MPEG4": 3, + "MPEG1VIDEO": 3, + "WMV3": 4, + "WMV2": 5, + "VC1": 6, + "SVQ3": 7, +} KEEP_TAG_NAME = "[PDT: Keep]" REMOVE_TAG_NAME = "[PDT: Remove]" UNKNOWN_TAG_NAME = "[PDT: Unknown]" IGNORE_TAG_NAME = "[PDT: Ignore]" - + def compare_bitrate_per_pixel(self, other): try: self_bpp = self.bitrate / (self.width * self.height * self.frame_rate) except ZeroDivisionError: - log.warning(f'scene {self.id} has 0 in file value ({self.width}x{self.height} {self.frame_rate}fps)') + log.warning( + f"scene {self.id} has 0 in file value ({self.width}x{self.height} {self.frame_rate}fps)" + ) return - try: + try: other_bpp = other.bitrate / (other.width * other.height * other.frame_rate) except ZeroDivisionError: - log.warning(f'scene {other.id} has 0 in file value ({other.width}x{other.height} {other.frame_rate}fps)') + log.warning( + f"scene {other.id} has 0 in file value ({other.width}x{other.height} {other.frame_rate}fps)" + ) return - bpp_diff = abs(self_bpp-other_bpp) + bpp_diff = abs(self_bpp - other_bpp) if bpp_diff <= 0.01: return - + if self_bpp > other_bpp: better_bpp, worse_bpp = self_bpp, other_bpp better, worse = self, other @@ -34,24 +49,26 @@ def compare_bitrate_per_pixel(self, other): worse_bpp, better_bpp = self_bpp, other_bpp worse, better = self, other worse.remove_reason = "bitrate_per_pxl" - message = f'bitrate/pxl {better_bpp:.3f}bpp > {worse_bpp:.3f}bpp Δ:{bpp_diff:.3f}' + message = f"bitrate/pxl {better_bpp:.3f}bpp > {worse_bpp:.3f}bpp Δ:{bpp_diff:.3f}" return better, message + def compare_frame_rate(self, other): if not self.frame_rate: - log.warning(f'scene {self.id} has no value for frame_rate') + log.warning(f"scene {self.id} has no value for frame_rate") if not other.frame_rate: - log.warning(f'scene {other.id} has no value for frame_rate') + log.warning(f"scene {other.id} has no value for frame_rate") - if abs(self.frame_rate-other.frame_rate) < 5: + if abs(self.frame_rate - other.frame_rate) < 5: return - + if self.frame_rate > other.frame_rate: better, worse = self, other else: worse, better = self, other worse.remove_reason = "frame_rate" - return better, f'Better FPS {better.frame_rate} vs {worse.frame_rate}' + return better, f"Better FPS {better.frame_rate} vs {worse.frame_rate}" + def compare_resolution(self, other): if self.height == other.height: @@ -61,7 +78,11 @@ def compare_resolution(self, other): else: worse, better = self, other worse.remove_reason = "resolution" - return better, f"Better Resolution {better.id}:{better.height}p > {worse.id}:{worse.height}p" + return ( + better, + f"Better Resolution {better.id}:{better.height}p > {worse.id}:{worse.height}p", + ) + def compare_bitrate(self, other): if self.bitrate == other.bitrate: @@ -71,18 +92,26 @@ def compare_bitrate(self, other): else: worse, better = self, other worse.remove_reason = "bitrate" - return better, f"Better Bitrate {human_bits(better.bitrate)}ps > {human_bits(worse.bitrate)}ps Δ:({human_bits(better.bitrate-other.bitrate)}ps)" - + return ( + better, + f"Better Bitrate {human_bits(better.bitrate)}ps > {human_bits(worse.bitrate)}ps Δ:({human_bits(better.bitrate-other.bitrate)}ps)", + ) + + def compare_size(self, other): - if abs(self.size-other.size) <= 100000: # diff is <= than 0.1 Mb + if abs(self.size - other.size) <= 100000: # diff is <= than 0.1 Mb return if self.size > other.size: better, worse = self, other else: worse, better = self, other worse.remove_reason = "file_size" - return better, f"Better Size {human_bytes(better.size)} > {human_bytes(worse.size)} Δ:({human_bytes(better.size-worse.size)})" - + return ( + better, + f"Better Size {human_bytes(better.size)} > {human_bytes(worse.size)} Δ:({human_bytes(better.size-worse.size)})", + ) + + def compare_age(self, other): if not (self.mod_time and other.mod_time): return @@ -93,18 +122,26 @@ def compare_age(self, other): else: worse, better = self, other worse.remove_reason = "age" - return better, f"Choose Oldest: Δ:{worse.mod_time-better.mod_time} | {better.id} older than {worse.id}" + return ( + better, + f"Choose Oldest: Δ:{worse.mod_time-better.mod_time} | {better.id} older than {worse.id}", + ) + def compare_encoding(self, other): if self.codec_priority == other.codec_priority: return - if not (isinstance(self.codec_priority, int) and isinstance(other.codec_priority, int)): + if not ( + isinstance(self.codec_priority, int) and isinstance(other.codec_priority, int) + ): return - + if self.codec_priority < other.codec_priority: better, worse = self, other else: worse, better = self, other worse.remove_reason = "video_codec" - return self, f"Prefer Codec {better.codec}({better.id}) over {worse.codec}({worse.id})" - \ No newline at end of file + return ( + self, + f"Prefer Codec {better.codec}({better.id}) over {worse.codec}({worse.id})", + ) diff --git a/plugins/phashDuplicateTagger/phashDuplicateTagger.py b/plugins/phashDuplicateTagger/phashDuplicateTagger.py index 494c44a..843d85f 100644 --- a/plugins/phashDuplicateTagger/phashDuplicateTagger.py +++ b/plugins/phashDuplicateTagger/phashDuplicateTagger.py @@ -8,13 +8,15 @@ try: from stashapi.stash_types import PhashDistance from stashapi.stashapp import StashInterface except ModuleNotFoundError: - print("You need to install the stashapi module. (pip install stashapp-tools)", - file=sys.stderr) + print( + "You need to install the stashapi module. (pip install stashapp-tools)", + file=sys.stderr, + ) import config FRAGMENT = json.loads(sys.stdin.read()) -MODE = FRAGMENT['args']['mode'] +MODE = FRAGMENT["args"]["mode"] stash = StashInterface(FRAGMENT["server_connection"]) SLIM_SCENE_FRAGMENT = """ @@ -35,236 +37,244 @@ files { } """ + def main(): - - if MODE == "remove": - clean_scenes() - for tag in get_managed_tags(): - stash.destroy_tag(tag["id"]) - if MODE == "tag_exact": - process_duplicates(PhashDistance.EXACT) - if MODE == "tag_high": - process_duplicates(PhashDistance.HIGH) - if MODE == "tag_medium": - process_duplicates(PhashDistance.MEDIUM) + if MODE == "remove": + clean_scenes() + for tag in get_managed_tags(): + stash.destroy_tag(tag["id"]) - if MODE == "clean_scenes": - clean_scenes() - if MODE == "generate_phash": - generate_phash() + if MODE == "tag_exact": + process_duplicates(PhashDistance.EXACT) + if MODE == "tag_high": + process_duplicates(PhashDistance.HIGH) + if MODE == "tag_medium": + process_duplicates(PhashDistance.MEDIUM) + if MODE == "clean_scenes": + clean_scenes() + if MODE == "generate_phash": + generate_phash() - log.exit("Plugin exited normally.") + log.exit("Plugin exited normally.") def parse_timestamp(ts, format="%Y-%m-%dT%H:%M:%S%z"): - ts = re.sub(r'\.\d+', "", ts) #remove fractional seconds - return dt.datetime.strptime(ts, format) + ts = re.sub(r"\.\d+", "", ts) # remove fractional seconds + return dt.datetime.strptime(ts, format) class StashScene: - def __init__(self, scene=None) -> None: - file = scene["files"][0] + def __init__(self, scene=None) -> None: + file = scene["files"][0] - self.id = int(scene['id']) - self.mod_time = parse_timestamp(file['mod_time']) - if scene.get("date"): - self.date = parse_timestamp(scene['date'], format="%Y-%m-%d") - else: - self.date = None - self.path = scene.get("path") - self.width = file['width'] - self.height = file['height'] - # File size in # of BYTES - self.size = int(file['size']) - self.frame_rate = int(file['frame_rate']) - self.bitrate = int(file['bit_rate']) - self.duration = float(file['duration']) - # replace any existing tagged title - self.title = re.sub(r'^\[Dupe: \d+[KR]\]\s+', '', scene['title']) - self.path = file['path'] - self.tag_ids = [t["id"]for t in scene["tags"]] + self.id = int(scene["id"]) + self.mod_time = parse_timestamp(file["mod_time"]) + if scene.get("date"): + self.date = parse_timestamp(scene["date"], format="%Y-%m-%d") + else: + self.date = None + self.path = scene.get("path") + self.width = file["width"] + self.height = file["height"] + # File size in # of BYTES + self.size = int(file["size"]) + self.frame_rate = int(file["frame_rate"]) + self.bitrate = int(file["bit_rate"]) + self.duration = float(file["duration"]) + # replace any existing tagged title + self.title = re.sub(r"^\[Dupe: \d+[KR]\]\s+", "", scene["title"]) + self.path = file["path"] + self.tag_ids = [t["id"] for t in scene["tags"]] - self.remove_reason = None + self.remove_reason = None - self.codec = file['video_codec'].upper() - if self.codec in config.CODEC_PRIORITY: - self.codec_priority = config.CODEC_PRIORITY[self.codec] - else: - self.codec_priority = None - log.warning(f"could not find codec {self.codec} used in SceneID:{self.id}") + self.codec = file["video_codec"].upper() + if self.codec in config.CODEC_PRIORITY: + self.codec_priority = config.CODEC_PRIORITY[self.codec] + else: + self.codec_priority = None + log.warning(f"could not find codec {self.codec} used in SceneID:{self.id}") - def __repr__(self) -> str: - return f'' + def __repr__(self) -> str: + return f"" - def __str__(self) -> str: - return f'id:{self.id}, height:{self.height}, size:{human_bytes(self.size)}, file_mod_time:{self.mod_time}, title:{self.title}' + def __str__(self) -> str: + return f"id:{self.id}, height:{self.height}, size:{human_bytes(self.size)}, file_mod_time:{self.mod_time}, title:{self.title}" - def compare(self, other): - if not (isinstance(other, StashScene)): - raise Exception(f"can only compare to not <{type(other)}>") + def compare(self, other): + if not (isinstance(other, StashScene)): + raise Exception(f"can only compare to not <{type(other)}>") - if self.id == other.id: - return None, f"Matching IDs {self.id}=={other.id}" + if self.id == other.id: + return None, f"Matching IDs {self.id}=={other.id}" - def compare_not_found(*args, **kwargs): - raise Exception("comparison not found") - for type in config.PRIORITY: - try: - compare_function = getattr(self, f'compare_{type}', compare_not_found) - result = compare_function(other) - if result and len(result) == 2: - best, msg = result - return best, msg - except Exception as e: - log.error(f"Issue Comparing {self.id} {other.id} using <{type}> {e}") - - return None, f"{self.id} worse than {other.id}" + def compare_not_found(*args, **kwargs): + raise Exception("comparison not found") -def process_duplicates(distance:PhashDistance=PhashDistance.EXACT): - - clean_scenes() # clean old results + for type in config.PRIORITY: + try: + compare_function = getattr(self, f"compare_{type}", compare_not_found) + result = compare_function(other) + if result and len(result) == 2: + best, msg = result + return best, msg + except Exception as e: + log.error(f"Issue Comparing {self.id} {other.id} using <{type}> {e}") - ignore_tag_id = stash.find_tag(config.IGNORE_TAG_NAME, create=True).get("id") - duplicate_list = stash.find_duplicate_scenes(distance, fragment=SLIM_SCENE_FRAGMENT) + return None, f"{self.id} worse than {other.id}" - total = len(duplicate_list) - log.info(f"Found {total} sets of duplicates.") - for i, group in enumerate(duplicate_list): - group = [StashScene(s) for s in group] - filtered_group = [] - for scene in group: - if ignore_tag_id in scene.tag_ids: - log.debug(f"Ignore {scene.id} {scene.title}") - else: - filtered_group.append(scene) - - if len(filtered_group) > 1: - tag_files(filtered_group) - - log.progress(i/total) +def process_duplicates(distance: PhashDistance = PhashDistance.EXACT): + + clean_scenes() # clean old results + + ignore_tag_id = stash.find_tag(config.IGNORE_TAG_NAME, create=True).get("id") + duplicate_list = stash.find_duplicate_scenes(distance, fragment=SLIM_SCENE_FRAGMENT) + + total = len(duplicate_list) + log.info(f"Found {total} sets of duplicates.") + + for i, group in enumerate(duplicate_list): + group = [StashScene(s) for s in group] + filtered_group = [] + for scene in group: + if ignore_tag_id in scene.tag_ids: + log.debug(f"Ignore {scene.id} {scene.title}") + else: + filtered_group.append(scene) + + if len(filtered_group) > 1: + tag_files(filtered_group) + + log.progress(i / total) + def tag_files(group): - - keep_reasons = [] - keep_scene = None - total_size = group[0].size - for scene in group[1:]: - total_size += scene.size - better, msg = scene.compare(group[0]) - if better: - keep_scene = better - keep_reasons.append(msg) - total_size = human_bytes(total_size, round=2, prefix='G') + keep_reasons = [] + keep_scene = None - if not keep_scene: - log.info(f"could not determine better scene from {group}") - if config.UNKNOWN_TAG_NAME: - group_id = group[0].id - for scene in group: - tag_ids = [stash.find_tag(config.UNKNOWN_TAG_NAME, create=True).get("id")] - stash.update_scenes({ - 'ids': [scene.id], - 'title': f'[PDT: {total_size}|{group_id}U] {scene.title}', - 'tag_ids': { - 'mode': 'ADD', - 'ids': tag_ids - } - }) - return + total_size = group[0].size + for scene in group[1:]: + total_size += scene.size + better, msg = scene.compare(group[0]) + if better: + keep_scene = better + keep_reasons.append(msg) + total_size = human_bytes(total_size, round=2, prefix="G") - log.info(f"{keep_scene.id} best of:{[s.id for s in group]} {keep_reasons}") + if not keep_scene: + log.info(f"could not determine better scene from {group}") + if config.UNKNOWN_TAG_NAME: + group_id = group[0].id + for scene in group: + tag_ids = [ + stash.find_tag(config.UNKNOWN_TAG_NAME, create=True).get("id") + ] + stash.update_scenes( + { + "ids": [scene.id], + "title": f"[PDT: {total_size}|{group_id}U] {scene.title}", + "tag_ids": {"mode": "ADD", "ids": tag_ids}, + } + ) + return + + log.info(f"{keep_scene.id} best of:{[s.id for s in group]} {keep_reasons}") + + for scene in group: + if scene.id == keep_scene.id: + tag_ids = [stash.find_tag(config.KEEP_TAG_NAME, create=True).get("id")] + stash.update_scenes( + { + "ids": [scene.id], + "title": f"[PDT: {total_size}|{keep_scene.id}K] {scene.title}", + "tag_ids": {"mode": "ADD", "ids": tag_ids}, + } + ) + else: + tag_ids = [] + tag_ids.append( + stash.find_tag(config.REMOVE_TAG_NAME, create=True).get("id") + ) + if scene.remove_reason: + tag_ids.append( + stash.find_tag(f"[Reason: {scene.remove_reason}]", create=True).get( + "id" + ) + ) + stash.update_scenes( + { + "ids": [scene.id], + "title": f"[PDT: {total_size}|{keep_scene.id}R] {scene.title}", + "tag_ids": {"mode": "ADD", "ids": tag_ids}, + } + ) - for scene in group: - if scene.id == keep_scene.id: - tag_ids = [stash.find_tag(config.KEEP_TAG_NAME, create=True).get("id")] - stash.update_scenes({ - 'ids': [scene.id], - 'title': f'[PDT: {total_size}|{keep_scene.id}K] {scene.title}', - 'tag_ids': { - 'mode': 'ADD', - 'ids': tag_ids - } - }) - else: - tag_ids = [] - tag_ids.append(stash.find_tag(config.REMOVE_TAG_NAME, create=True).get("id")) - if scene.remove_reason: - tag_ids.append(stash.find_tag(f'[Reason: {scene.remove_reason}]', create=True).get('id')) - stash.update_scenes({ - 'ids': [scene.id], - 'title': f'[PDT: {total_size}|{keep_scene.id}R] {scene.title}', - 'tag_ids': { - 'mode': 'ADD', - 'ids': tag_ids - } - }) def clean_scenes(): - scene_count, scenes = stash.find_scenes(f={ - "title": { - "modifier": "MATCHES_REGEX", - "value": "^\\[PDT: .+?\\]" - } - },fragment="id title", get_count=True) + scene_count, scenes = stash.find_scenes( + f={"title": {"modifier": "MATCHES_REGEX", "value": "^\\[PDT: .+?\\]"}}, + fragment="id title", + get_count=True, + ) - log.info(f"Cleaning Titles/Tags of {scene_count} Scenes ") - - # Clean scene Title - for i, scene in enumerate(scenes): - title = re.sub(r'\[PDT: .+?\]\s+', '', scene['title']) - stash.update_scenes({ - 'ids': [scene['id']], - 'title': title - }) - log.progress(i/scene_count) + log.info(f"Cleaning Titles/Tags of {scene_count} Scenes ") + + # Clean scene Title + for i, scene in enumerate(scenes): + title = re.sub(r"\[PDT: .+?\]\s+", "", scene["title"]) + stash.update_scenes({"ids": [scene["id"]], "title": title}) + log.progress(i / scene_count) + + # Remove Tags + for tag in get_managed_tags(): + scene_count, scenes = stash.find_scenes( + f={"tags": {"value": [tag["id"]], "modifier": "INCLUDES", "depth": 0}}, + fragment="id", + get_count=True, + ) + if not scene_count > 0: + continue + log.info(f'removing tag {tag["name"]} from {scene_count} scenes') + stash.update_scenes( + { + "ids": [s["id"] for s in scenes], + "tag_ids": {"mode": "REMOVE", "ids": [tag["id"]]}, + } + ) - # Remove Tags - for tag in get_managed_tags(): - scene_count, scenes = stash.find_scenes(f={ - "tags":{"value": [tag['id']],"modifier": "INCLUDES","depth": 0} - }, fragment="id", get_count=True) - if not scene_count > 0: - continue - log.info(f'removing tag {tag["name"]} from {scene_count} scenes') - stash.update_scenes({ - 'ids': [s["id"] for s in scenes], - 'tag_ids': { - 'mode': 'REMOVE', - 'ids': [tag['id']] - } - }) def get_managed_tags(fragment="id name"): - tags = stash.find_tags(f={ - "name": { - "value": "^\\[Reason", - "modifier": "MATCHES_REGEX" - }}, fragment=fragment) - tag_name_list = [ - config.REMOVE_TAG_NAME, - config.KEEP_TAG_NAME, - config.UNKNOWN_TAG_NAME, - # config.IGNORE_TAG_NAME, - ] - for tag_name in tag_name_list: - if tag := stash.find_tag(tag_name): - tags.append(tag) - return tags + tags = stash.find_tags( + f={"name": {"value": "^\\[Reason", "modifier": "MATCHES_REGEX"}}, + fragment=fragment, + ) + tag_name_list = [ + config.REMOVE_TAG_NAME, + config.KEEP_TAG_NAME, + config.UNKNOWN_TAG_NAME, + # config.IGNORE_TAG_NAME, + ] + for tag_name in tag_name_list: + if tag := stash.find_tag(tag_name): + tags.append(tag) + return tags + def generate_phash(): - query = """mutation MetadataGenerate($input: GenerateMetadataInput!) { + query = """mutation MetadataGenerate($input: GenerateMetadataInput!) { metadataGenerate(input: $input) }""" - variables = {"phashes", True} - stash._callGraphQL(query, variables) + variables = {"phashes", True} + stash._callGraphQL(query, variables) -if __name__ == '__main__': - for name, func in getmembers(config, isfunction): - if re.match(r'^compare_', name): - setattr(StashScene, name, func) - main() + +if __name__ == "__main__": + for name, func in getmembers(config, isfunction): + if re.match(r"^compare_", name): + setattr(StashScene, name, func) + main() diff --git a/plugins/phashDuplicateTagger/phashDuplicateTagger.yml b/plugins/phashDuplicateTagger/phashDuplicateTagger.yml index 13f6629..6f949fd 100644 --- a/plugins/phashDuplicateTagger/phashDuplicateTagger.yml +++ b/plugins/phashDuplicateTagger/phashDuplicateTagger.yml @@ -7,27 +7,27 @@ exec: - "{pluginDir}/phashDuplicateTagger.py" interface: raw tasks: - - name: 'Tag Dupes (EXACT)' - description: 'Assign duplicates tags to Exact Match (Dist 0) scenes' + - name: "Tag Dupes (EXACT)" + description: "Assign duplicates tags to Exact Match (Dist 0) scenes" defaultArgs: mode: tag_exact - - name: 'Tag Dupes (HIGH)' - description: 'Assign duplicates tags to High Match (Dist 3) scenes' + - name: "Tag Dupes (HIGH)" + description: "Assign duplicates tags to High Match (Dist 3) scenes" defaultArgs: mode: tag_high - - name: 'Tag Dupes (MEDIUM)' - description: 'Assign duplicates tags to Medium Match (Dist 6) scenes (BE CAREFUL WITH THIS LEVEL)' + - name: "Tag Dupes (MEDIUM)" + description: "Assign duplicates tags to Medium Match (Dist 6) scenes (BE CAREFUL WITH THIS LEVEL)" defaultArgs: mode: tag_medium - - name: 'Delete Managed Tags' - description: 'Deletes tags managed by this plugin from stash' + - name: "Delete Managed Tags" + description: "Deletes tags managed by this plugin from stash" defaultArgs: mode: remove - - name: 'Scene Cleanup' - description: 'Removes titles from scenes and any generated tags excluding [Dupe: Ignore]' + - name: "Scene Cleanup" + description: "Removes titles from scenes and any generated tags excluding [Dupe: Ignore]" defaultArgs: mode: clean_scenes - - name: 'Generate Scene PHASHs' - description: 'Generate PHASHs for all scenes where they are missing' + - name: "Generate Scene PHASHs" + description: "Generate PHASHs for all scenes where they are missing" defaultArgs: mode: generate_phash diff --git a/plugins/renamerOnUpdate/log.py b/plugins/renamerOnUpdate/log.py index f381252..c73dbdb 100644 --- a/plugins/renamerOnUpdate/log.py +++ b/plugins/renamerOnUpdate/log.py @@ -12,41 +12,42 @@ import sys # messages. The LogProgress method is also intended for sending progress data. # -def __prefix(level_char): - start_level_char = b'\x01' - end_level_char = b'\x02' - ret = start_level_char + level_char + end_level_char - return ret.decode() +def __prefix(level_char): + start_level_char = b"\x01" + end_level_char = b"\x02" + + ret = start_level_char + level_char + end_level_char + return ret.decode() def __log(level_char, s): - if level_char == "": - return + if level_char == "": + return - print(__prefix(level_char) + s + "\n", file=sys.stderr, flush=True) + print(__prefix(level_char) + s + "\n", file=sys.stderr, flush=True) def LogTrace(s): - __log(b't', s) + __log(b"t", s) def LogDebug(s): - __log(b'd', s) + __log(b"d", s) def LogInfo(s): - __log(b'i', s) + __log(b"i", s) def LogWarning(s): - __log(b'w', s) + __log(b"w", s) def LogError(s): - __log(b'e', s) + __log(b"e", s) def LogProgress(p): - progress = min(max(0, p), 1) - __log(b'p', str(progress)) + progress = min(max(0, p), 1) + __log(b"p", str(progress)) diff --git a/plugins/renamerOnUpdate/renamerOnUpdate.py b/plugins/renamerOnUpdate/renamerOnUpdate.py index 12eae2b..fbbe8ac 100644 --- a/plugins/renamerOnUpdate/renamerOnUpdate.py +++ b/plugins/renamerOnUpdate/renamerOnUpdate.py @@ -13,12 +13,14 @@ import requests try: import psutil # pip install psutil + MODULE_PSUTIL = True except Exception: MODULE_PSUTIL = False try: import unidecode # pip install Unidecode + MODULE_UNIDECODE = True except Exception: MODULE_UNIDECODE = False @@ -38,7 +40,9 @@ DRY_RUN = config.dry_run DRY_RUN_FILE = None if config.log_file: - DRY_RUN_FILE = os.path.join(os.path.dirname(config.log_file), "renamerOnUpdate_dryrun.txt") + DRY_RUN_FILE = os.path.join( + os.path.dirname(config.log_file), "renamerOnUpdate_dryrun.txt" + ) if DRY_RUN: if DRY_RUN_FILE and not config.dry_run_append: @@ -53,34 +57,40 @@ FRAGMENT_SERVER = FRAGMENT["server_connection"] PLUGIN_DIR = FRAGMENT_SERVER["PluginDir"] -PLUGIN_ARGS = FRAGMENT['args'].get("mode") +PLUGIN_ARGS = FRAGMENT["args"].get("mode") -#log.LogDebug("{}".format(FRAGMENT)) +# log.LogDebug("{}".format(FRAGMENT)) def callGraphQL(query, variables=None): # Session cookie for authentication - graphql_port = str(FRAGMENT_SERVER['Port']) - graphql_scheme = FRAGMENT_SERVER['Scheme'] - graphql_cookies = {'session': FRAGMENT_SERVER['SessionCookie']['Value']} + graphql_port = str(FRAGMENT_SERVER["Port"]) + graphql_scheme = FRAGMENT_SERVER["Scheme"] + graphql_cookies = {"session": FRAGMENT_SERVER["SessionCookie"]["Value"]} graphql_headers = { "Accept-Encoding": "gzip, deflate, br", "Content-Type": "application/json", "Accept": "application/json", "Connection": "keep-alive", - "DNT": "1" + "DNT": "1", } - graphql_domain = FRAGMENT_SERVER['Host'] + graphql_domain = FRAGMENT_SERVER["Host"] if graphql_domain == "0.0.0.0": graphql_domain = "localhost" # Stash GraphQL endpoint graphql_url = f"{graphql_scheme}://{graphql_domain}:{graphql_port}/graphql" - json = {'query': query} + json = {"query": query} if variables is not None: - json['variables'] = variables + json["variables"] = variables try: - response = requests.post(graphql_url, json=json, headers=graphql_headers, cookies=graphql_cookies, timeout=20) + response = requests.post( + graphql_url, + json=json, + headers=graphql_headers, + cookies=graphql_cookies, + timeout=20, + ) except Exception as e: exit_plugin(err=f"[FATAL] Error with the graphql request {e}") if response.status_code == 200: @@ -94,11 +104,14 @@ def callGraphQL(query, variables=None): elif response.status_code == 401: exit_plugin(err="HTTP Error 401, Unauthorised.") else: - raise ConnectionError(f"GraphQL query failed: {response.status_code} - {response.content}") + raise ConnectionError( + f"GraphQL query failed: {response.status_code} - {response.content}" + ) def graphql_getScene(scene_id): - query = """ + query = ( + """ query FindScene($id: ID!, $checksum: String) { findScene(id: $id, checksum: $checksum) { ...SceneData @@ -113,7 +126,9 @@ def graphql_getScene(scene_id): endpoint stash_id } - organized""" + FILE_QUERY + """ + organized""" + + FILE_QUERY + + """ studio { id name @@ -146,16 +161,16 @@ def graphql_getScene(scene_id): } } """ - variables = { - "id": scene_id - } + ) + variables = {"id": scene_id} result = callGraphQL(query, variables) - return result.get('findScene') + return result.get("findScene") # used for bulk def graphql_findScene(perPage, direc="DESC") -> dict: - query = """ + query = ( + """ query FindScenes($filter: FindFilterType) { findScenes(filter: $filter) { count @@ -174,7 +189,9 @@ def graphql_findScene(perPage, direc="DESC") -> dict: endpoint stash_id } - """ + FILE_QUERY + """ + """ + + FILE_QUERY + + """ studio { id name @@ -207,8 +224,16 @@ def graphql_findScene(perPage, direc="DESC") -> dict: } } """ + ) # ASC DESC - variables = {'filter': {"direction": direc, "page": 1, "per_page": perPage, "sort": "updated_at"}} + variables = { + "filter": { + "direction": direc, + "page": 1, + "per_page": perPage, + "sort": "updated_at", + } + } result = callGraphQL(query, variables) return result.get("findScenes") @@ -228,24 +253,13 @@ def graphql_findScenebyPath(path, modifier) -> dict: """ # ASC DESC variables = { - 'filter': { - "direction": "ASC", - "page": 1, - "per_page": 40, - "sort": "updated_at" - }, - "scene_filter": { - "path": { - "modifier": modifier, - "value": path - } - } + "filter": {"direction": "ASC", "page": 1, "per_page": 40, "sort": "updated_at"}, + "scene_filter": {"path": {"modifier": modifier, "value": path}}, } result = callGraphQL(query, variables) return result.get("findScenes") - def graphql_getConfiguration(): query = """ query Configuration { @@ -257,7 +271,7 @@ def graphql_getConfiguration(): } """ result = callGraphQL(query) - return result.get('configuration') + return result.get("configuration") def graphql_getStudio(studio_id): @@ -273,9 +287,7 @@ def graphql_getStudio(studio_id): } } """ - variables = { - "id": studio_id - } + variables = {"id": studio_id} result = callGraphQL(query, variables) return result.get("findStudio") @@ -288,7 +300,9 @@ def graphql_removeScenesTag(id_scenes: list, id_tags: list): } } """ - variables = {'input': {"ids": id_scenes, "tag_ids": {"ids": id_tags, "mode": "REMOVE"}}} + variables = { + "input": {"ids": id_scenes, "tag_ids": {"ids": id_tags, "mode": "REMOVE"}} + } result = callGraphQL(query, variables) return result @@ -302,21 +316,21 @@ def graphql_getBuild(): } """ result = callGraphQL(query) - return result['systemStatus']['databaseSchema'] + return result["systemStatus"]["databaseSchema"] def find_diff_text(a: str, b: str): addi = minus = stay = "" minus_ = addi_ = 0 for _, s in enumerate(difflib.ndiff(a, b)): - if s[0] == ' ': + if s[0] == " ": stay += s[-1] minus += "*" addi += "*" - elif s[0] == '-': + elif s[0] == "-": minus += s[-1] minus_ += 1 - elif s[0] == '+': + elif s[0] == "+": addi += s[-1] addi_ += 1 if minus_ > 20 or addi_ > 20: @@ -324,7 +338,9 @@ def find_diff_text(a: str, b: str): log.LogDebug(f"OLD: {a}") log.LogDebug(f"NEW: {b}") else: - log.LogDebug(f"Original: {a}\n- Charac: {minus}\n+ Charac: {addi}\n Result: {b}") + log.LogDebug( + f"Original: {a}\n- Charac: {minus}\n+ Charac: {addi}\n Result: {b}" + ) return @@ -346,9 +362,9 @@ def has_handle(fpath, all_result=False): def config_edit(name: str, state: bool): found = 0 try: - with open(config.__file__, 'r', encoding='utf8') as file: + with open(config.__file__, "r", encoding="utf8") as file: config_lines = file.readlines() - with open(config.__file__, 'w', encoding='utf8') as file_w: + with open(config.__file__, "w", encoding="utf8") as file_w: for line in config_lines: if len(line.split("=")) > 1: if name == line.split("=")[0].strip(): @@ -365,7 +381,9 @@ def check_longpath(path: str): # Trying to prevent error with long paths for Win10 # https://docs.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=cmd if len(path) > 240 and not IGNORE_PATH_LENGTH: - log.LogError(f"The path is too long ({len(path)} > 240). You can look at 'order_field'/'ignore_path_length' in config.") + log.LogError( + f"The path is too long ({len(path)} > 240). You can look at 'order_field'/'ignore_path_length' in config." + ) return 1 @@ -375,15 +393,21 @@ def get_template_filename(scene: dict): if scene.get("studio") and config.studio_templates: template_found = False current_studio = scene.get("studio") - if config.studio_templates.get(current_studio['name']): - template = config.studio_templates[current_studio['name']] + if config.studio_templates.get(current_studio["name"]): + template = config.studio_templates[current_studio["name"]] template_found = True # by first Parent found while current_studio.get("parent_studio") and not template_found: - if config.studio_templates.get(current_studio.get("parent_studio").get("name")): - template = config.studio_templates[current_studio['parent_studio']['name']] + if config.studio_templates.get( + current_studio.get("parent_studio").get("name") + ): + template = config.studio_templates[ + current_studio["parent_studio"]["name"] + ] template_found = True - current_studio = graphql_getStudio(current_studio.get("parent_studio")['id']) + current_studio = graphql_getStudio( + current_studio.get("parent_studio")["id"] + ) # Change by Tag tags = [x["name"] for x in scene["tags"]] @@ -411,7 +435,9 @@ def get_template_path(scene: dict): # by Parent if scene["studio"].get("parent_studio"): if config.p_studio_templates.get(scene["studio"]["name"]): - template["destination"] = config.p_studio_templates[scene["studio"]["name"]] + template["destination"] = config.p_studio_templates[ + scene["studio"]["name"] + ] # Change by Tag tags = [x["name"] for x in scene["tags"]] @@ -431,7 +457,7 @@ def get_template_path(scene: dict): template["opt_details"]["clean_tag"].append(tag["id"]) else: template["opt_details"] = {"clean_tag": [tag["id"]]} - if not scene['organized'] and PATH_NON_ORGANIZED: + if not scene["organized"] and PATH_NON_ORGANIZED: template["destination"] = PATH_NON_ORGANIZED return template @@ -457,86 +483,114 @@ def extract_info(scene: dict, template: None): # Grabbing things from Stash scene_information = {} - scene_information['current_path'] = str(scene['path']) + scene_information["current_path"] = str(scene["path"]) # note: contain the dot (.mp4) - scene_information['file_extension'] = os.path.splitext(scene_information['current_path'])[1] + scene_information["file_extension"] = os.path.splitext( + scene_information["current_path"] + )[1] # note: basename contains the extension - scene_information['current_filename'] = os.path.basename(scene_information['current_path']) - scene_information['current_directory'] = os.path.dirname(scene_information['current_path']) - scene_information['oshash'] = scene.get("oshash") - scene_information['checksum'] = scene.get("checksum") - scene_information['studio_code'] = scene.get("code") + scene_information["current_filename"] = os.path.basename( + scene_information["current_path"] + ) + scene_information["current_directory"] = os.path.dirname( + scene_information["current_path"] + ) + scene_information["oshash"] = scene.get("oshash") + scene_information["checksum"] = scene.get("checksum") + scene_information["studio_code"] = scene.get("code") if scene.get("stash_ids"): - #todo support other db that stashdb ? - scene_information['stashid_scene'] = scene['stash_ids'][0]["stash_id"] + # todo support other db that stashdb ? + scene_information["stashid_scene"] = scene["stash_ids"][0]["stash_id"] if template.get("path"): if "^*" in template["path"]["destination"]: - template["path"]["destination"] = template["path"]["destination"].replace("^*", scene_information['current_directory']) - scene_information['template_split'] = os.path.normpath(template["path"]["destination"]).split(os.sep) - scene_information['current_path_split'] = os.path.normpath(scene_information['current_path']).split(os.sep) + template["path"]["destination"] = template["path"]["destination"].replace( + "^*", scene_information["current_directory"] + ) + scene_information["template_split"] = os.path.normpath( + template["path"]["destination"] + ).split(os.sep) + scene_information["current_path_split"] = os.path.normpath( + scene_information["current_path"] + ).split(os.sep) if FILENAME_ASTITLE and not scene.get("title"): - scene["title"] = scene_information['current_filename'] + scene["title"] = scene_information["current_filename"] # Grab Title (without extension if present) if scene.get("title"): # Removing extension if present in title - scene_information['title'] = re.sub(fr"{scene_information['file_extension']}$", "", scene['title']) + scene_information["title"] = re.sub( + rf"{scene_information['file_extension']}$", "", scene["title"] + ) if PREPOSITIONS_REMOVAL: for word in PREPOSITIONS_LIST: - scene_information['title'] = re.sub(fr"^{word}[\s_-]", "", scene_information['title']) + scene_information["title"] = re.sub( + rf"^{word}[\s_-]", "", scene_information["title"] + ) # Grab Date - scene_information['date'] = scene.get("date") - if scene_information['date']: - date_scene = datetime.strptime(scene_information['date'], r"%Y-%m-%d") - scene_information['date_format'] = datetime.strftime(date_scene, config.date_format) + scene_information["date"] = scene.get("date") + if scene_information["date"]: + date_scene = datetime.strptime(scene_information["date"], r"%Y-%m-%d") + scene_information["date_format"] = datetime.strftime( + date_scene, config.date_format + ) # Grab Duration - scene_information['duration'] = scene['file']['duration'] + scene_information["duration"] = scene["file"]["duration"] if config.duration_format: - scene_information['duration'] = time.strftime(config.duration_format, time.gmtime(scene_information['duration'])) + scene_information["duration"] = time.strftime( + config.duration_format, time.gmtime(scene_information["duration"]) + ) else: - scene_information['duration'] = str(scene_information['duration']) + scene_information["duration"] = str(scene_information["duration"]) # Grab Rating if scene.get("rating100"): - scene_information['rating'] = RATING_FORMAT.format(scene['rating100']) + scene_information["rating"] = RATING_FORMAT.format(scene["rating100"]) # Grab Performer - scene_information['performer_path'] = None + scene_information["performer_path"] = None if scene.get("performers"): perf_list = [] perf_list_stashid = [] perf_rating = {"0": []} perf_favorite = {"yes": [], "no": []} - for perf in scene['performers']: + for perf in scene["performers"]: if perf.get("gender"): - if perf['gender'] in PERFORMER_IGNOREGENDER: + if perf["gender"] in PERFORMER_IGNOREGENDER: continue elif "UNDEFINED" in PERFORMER_IGNOREGENDER: continue # path related if template.get("path"): if "inverse_performer" in template["path"]["option"]: - perf["name"] = re.sub(r"([a-zA-Z]+)(\s)([a-zA-Z]+)", r"\3 \1", perf["name"]) - perf_list.append(perf['name']) - if perf.get('rating100'): - if perf_rating.get(str(perf['rating100'])) is None: - perf_rating[str(perf['rating100'])] = [] - perf_rating[str(perf['rating100'])].append(perf['name']) + perf["name"] = re.sub( + r"([a-zA-Z]+)(\s)([a-zA-Z]+)", r"\3 \1", perf["name"] + ) + perf_list.append(perf["name"]) + if perf.get("rating100"): + if perf_rating.get(str(perf["rating100"])) is None: + perf_rating[str(perf["rating100"])] = [] + perf_rating[str(perf["rating100"])].append(perf["name"]) else: - perf_rating["0"].append(perf['name']) - if perf.get('favorite'): - perf_favorite['yes'].append(perf['name']) + perf_rating["0"].append(perf["name"]) + if perf.get("favorite"): + perf_favorite["yes"].append(perf["name"]) else: - perf_favorite['no'].append(perf['name']) + perf_favorite["no"].append(perf["name"]) # if the path already contains the name we keep this one - if perf["name"] in scene_information['current_path_split'] and scene_information.get('performer_path') is None and PATH_KEEP_ALRPERF: - scene_information['performer_path'] = perf["name"] - log.LogDebug(f"[PATH] Keeping the current name of the performer '{perf['name']}'") + if ( + perf["name"] in scene_information["current_path_split"] + and scene_information.get("performer_path") is None + and PATH_KEEP_ALRPERF + ): + scene_information["performer_path"] = perf["name"] + log.LogDebug( + f"[PATH] Keeping the current name of the performer '{perf['name']}'" + ) perf_rating = sort_rating(perf_rating) # sort performer if PERFORMER_SORT == "rating": @@ -561,88 +615,98 @@ def extract_info(scene: dict, template: None): perf_list.append(n) elif PERFORMER_SORT == "name": perf_list.sort() - if not scene_information['performer_path'] and perf_list: - scene_information['performer_path'] = perf_list[0] + if not scene_information["performer_path"] and perf_list: + scene_information["performer_path"] = perf_list[0] if len(perf_list) > PERFORMER_LIMIT: if not PERFORMER_LIMIT_KEEP: - log.LogInfo(f"More than {PERFORMER_LIMIT} performer(s). Ignoring $performer") + log.LogInfo( + f"More than {PERFORMER_LIMIT} performer(s). Ignoring $performer" + ) perf_list = [] else: log.LogInfo(f"Limited the amount of performer to {PERFORMER_LIMIT}") - perf_list = perf_list[0: PERFORMER_LIMIT] - scene_information['performer'] = PERFORMER_SPLITCHAR.join(perf_list) + perf_list = perf_list[0:PERFORMER_LIMIT] + scene_information["performer"] = PERFORMER_SPLITCHAR.join(perf_list) if perf_list: for p in perf_list: - for perf in scene['performers']: - #todo support other db that stashdb ? - if p == perf['name'] and perf.get('stash_ids'): - perf_list_stashid.append(perf['stash_ids'][0]["stash_id"]) + for perf in scene["performers"]: + # todo support other db that stashdb ? + if p == perf["name"] and perf.get("stash_ids"): + perf_list_stashid.append(perf["stash_ids"][0]["stash_id"]) break - scene_information['stashid_performer'] = PERFORMER_SPLITCHAR.join(perf_list_stashid) + scene_information["stashid_performer"] = PERFORMER_SPLITCHAR.join( + perf_list_stashid + ) if not PATH_ONEPERFORMER: - scene_information['performer_path'] = PERFORMER_SPLITCHAR.join(perf_list) + scene_information["performer_path"] = PERFORMER_SPLITCHAR.join(perf_list) elif PATH_NOPERFORMER_FOLDER: - scene_information['performer_path'] = "NoPerformer" + scene_information["performer_path"] = "NoPerformer" # Grab Studio name if scene.get("studio"): if SQUEEZE_STUDIO_NAMES: - scene_information['studio'] = scene['studio']['name'].replace(' ', '') + scene_information["studio"] = scene["studio"]["name"].replace(" ", "") else: - scene_information['studio'] = scene['studio']['name'] - scene_information['studio_family'] = scene_information['studio'] - studio_hierarchy = [scene_information['studio']] + scene_information["studio"] = scene["studio"]["name"] + scene_information["studio_family"] = scene_information["studio"] + studio_hierarchy = [scene_information["studio"]] # Grab Parent name - if scene['studio'].get("parent_studio"): + if scene["studio"].get("parent_studio"): if SQUEEZE_STUDIO_NAMES: - scene_information['parent_studio'] = scene['studio']['parent_studio']['name'].replace(' ', '') + scene_information["parent_studio"] = scene["studio"]["parent_studio"][ + "name" + ].replace(" ", "") else: - scene_information['parent_studio'] = scene['studio']['parent_studio']['name'] - scene_information['studio_family'] = scene_information['parent_studio'] + scene_information["parent_studio"] = scene["studio"]["parent_studio"][ + "name" + ] + scene_information["studio_family"] = scene_information["parent_studio"] - studio_p = scene['studio'] + studio_p = scene["studio"] while studio_p.get("parent_studio"): - studio_p = graphql_getStudio(studio_p['parent_studio']['id']) + studio_p = graphql_getStudio(studio_p["parent_studio"]["id"]) if studio_p: if SQUEEZE_STUDIO_NAMES: - studio_hierarchy.append(studio_p['name'].replace(' ', '')) + studio_hierarchy.append(studio_p["name"].replace(" ", "")) else: - studio_hierarchy.append(studio_p['name']) + studio_hierarchy.append(studio_p["name"]) studio_hierarchy.reverse() - scene_information['studio_hierarchy'] = studio_hierarchy + scene_information["studio_hierarchy"] = studio_hierarchy # Grab Tags if scene.get("tags"): tag_list = [] - for tag in scene['tags']: + for tag in scene["tags"]: # ignore tag in blacklist - if tag['name'] in TAGS_BLACKLIST: + if tag["name"] in TAGS_BLACKLIST: continue # check if there is a whilelist if len(TAGS_WHITELIST) > 0: - if tag['name'] in TAGS_WHITELIST: - tag_list.append(tag['name']) + if tag["name"] in TAGS_WHITELIST: + tag_list.append(tag["name"]) else: - tag_list.append(tag['name']) - scene_information['tags'] = TAGS_SPLITCHAR.join(tag_list) + tag_list.append(tag["name"]) + scene_information["tags"] = TAGS_SPLITCHAR.join(tag_list) # Grab Height (720p,1080p,4k...) - scene_information['bit_rate'] = str(round(int(scene['file']['bit_rate']) / 1000000, 2)) - scene_information['resolution'] = 'SD' - scene_information['height'] = f"{scene['file']['height']}p" - if scene['file']['height'] >= 720: - scene_information['resolution'] = 'HD' - if scene['file']['height'] >= 2160: - scene_information['height'] = '4k' - scene_information['resolution'] = 'UHD' - if scene['file']['height'] >= 2880: - scene_information['height'] = '5k' - if scene['file']['height'] >= 3384: - scene_information['height'] = '6k' - if scene['file']['height'] >= 4320: - scene_information['height'] = '8k' + scene_information["bit_rate"] = str( + round(int(scene["file"]["bit_rate"]) / 1000000, 2) + ) + scene_information["resolution"] = "SD" + scene_information["height"] = f"{scene['file']['height']}p" + if scene["file"]["height"] >= 720: + scene_information["resolution"] = "HD" + if scene["file"]["height"] >= 2160: + scene_information["height"] = "4k" + scene_information["resolution"] = "UHD" + if scene["file"]["height"] >= 2880: + scene_information["height"] = "5k" + if scene["file"]["height"] >= 3384: + scene_information["height"] = "6k" + if scene["file"]["height"] >= 4320: + scene_information["height"] = "8k" # For Phone ? - if scene['file']['height'] > scene['file']['width']: - scene_information['resolution'] = 'VERTICAL' + if scene["file"]["height"] > scene["file"]["width"]: + scene_information["resolution"] = "VERTICAL" if scene.get("movies"): scene_information["movie_title"] = scene["movies"][0]["movie"]["name"] @@ -650,23 +714,33 @@ def extract_info(scene: dict, template: None): scene_information["movie_year"] = scene["movies"][0]["movie"]["date"][0:4] if scene["movies"][0].get("scene_index"): scene_information["movie_index"] = scene["movies"][0]["scene_index"] - scene_information["movie_scene"] = f"scene {scene_information['movie_index']}" + scene_information["movie_scene"] = ( + f"scene {scene_information['movie_index']}" + ) # Grab Video and Audio codec - scene_information['video_codec'] = scene['file']['video_codec'].upper() - scene_information['audio_codec'] = scene['file']['audio_codec'].upper() + scene_information["video_codec"] = scene["file"]["video_codec"].upper() + scene_information["audio_codec"] = scene["file"]["audio_codec"].upper() if scene_information.get("date"): - scene_information['year'] = scene_information['date'][0:4] + scene_information["year"] = scene_information["date"][0:4] if FIELD_WHITESPACE_SEP: for key, value in scene_information.items(): - if key in ["current_path", "current_filename", "current_directory", "current_path_split", "template_split"]: + if key in [ + "current_path", + "current_filename", + "current_directory", + "current_path_split", + "template_split", + ]: continue if type(value) is str: scene_information[key] = value.replace(" ", FIELD_WHITESPACE_SEP) elif type(value) is list: - scene_information[key] = [x.replace(" ", FIELD_WHITESPACE_SEP) for x in value] + scene_information[key] = [ + x.replace(" ", FIELD_WHITESPACE_SEP) for x in value + ] return scene_information @@ -681,13 +755,13 @@ def replace_text(text: str): log.LogDebug(f"Regex matched: {text} -> {tmp}") else: if new[1] == "word": - tmp = re.sub(fr'([\s_-])({old})([\s_-])', f'\\1{new[0]}\\3', text) + tmp = re.sub(rf"([\s_-])({old})([\s_-])", f"\\1{new[0]}\\3", text) elif new[1] == "any": tmp = text.replace(old, new[0]) if tmp != text: log.LogDebug(f"'{old}' changed with '{new[0]}'") else: - tmp = re.sub(fr'([\s_-])({old})([\s_-])', f'\\1{new[0]}\\3', text) + tmp = re.sub(rf"([\s_-])({old})([\s_-])", f"\\1{new[0]}\\3", text) if tmp != text: log.LogDebug(f"'{old}' changed with '{new[0]}'") text = tmp @@ -695,23 +769,23 @@ def replace_text(text: str): def cleanup_text(text: str): - text = re.sub(r'\(\W*\)|\[\W*\]|{[^a-zA-Z0-9]*}', '', text) - text = re.sub(r'[{}]', '', text) + text = re.sub(r"\(\W*\)|\[\W*\]|{[^a-zA-Z0-9]*}", "", text) + text = re.sub(r"[{}]", "", text) text = remove_consecutive_nonword(text) return text.strip(" -_.") def remove_consecutive_nonword(text: str): for _ in range(0, 10): - m = re.findall(r'(\W+)\1+', text) + m = re.findall(r"(\W+)\1+", text) if m: - text = re.sub(r'(\W+)\1+', r'\1', text) + text = re.sub(r"(\W+)\1+", r"\1", text) else: break return text -def field_replacer(text: str, scene_information:dict): +def field_replacer(text: str, scene_information: dict): field_found = re.findall(r"\$\w+", text) result = text title = None @@ -721,17 +795,32 @@ def field_replacer(text: str, scene_information:dict): for i in range(0, len(field_found)): f = field_found[i].replace("$", "").strip("_") # If $performer is before $title, prevent having duplicate text. - if f == "performer" and len(field_found) > i + 1 and scene_information.get('performer'): - if field_found[i+1] == "$title" and scene_information.get('title') and PREVENT_TITLE_PERF: - if re.search(f"^{scene_information['performer'].lower()}", scene_information['title'].lower()): - log.LogDebug("Ignoring the performer field because it's already in start of title") + if ( + f == "performer" + and len(field_found) > i + 1 + and scene_information.get("performer") + ): + if ( + field_found[i + 1] == "$title" + and scene_information.get("title") + and PREVENT_TITLE_PERF + ): + if re.search( + f"^{scene_information['performer'].lower()}", + scene_information["title"].lower(), + ): + log.LogDebug( + "Ignoring the performer field because it's already in start of title" + ) result = result.replace("$performer", "") continue replaced_word = scene_information.get(f) if not replaced_word: replaced_word = "" if FIELD_REPLACER.get(f"${f}"): - replaced_word = replaced_word.replace(FIELD_REPLACER[f"${f}"]["replace"], FIELD_REPLACER[f"${f}"]["with"]) + replaced_word = replaced_word.replace( + FIELD_REPLACER[f"${f}"]["replace"], FIELD_REPLACER[f"${f}"]["with"] + ) if f == "title": title = replaced_word.strip() continue @@ -753,7 +842,7 @@ def makeFilename(scene_information: dict, query: str) -> str: if t: r = r.replace("$title", t) # Replace spaces with splitchar - r = r.replace(' ', FILENAME_SPLITCHAR) + r = r.replace(" ", FILENAME_SPLITCHAR) return r @@ -838,20 +927,24 @@ def capitalizeWords(s: str) -> str: def create_new_filename(scene_info: dict, template: str): - new_filename = makeFilename(scene_info, template) + DUPLICATE_SUFFIX[scene_info['file_index']] + scene_info['file_extension'] + new_filename = ( + makeFilename(scene_info, template) + + DUPLICATE_SUFFIX[scene_info["file_index"]] + + scene_info["file_extension"] + ) if FILENAME_LOWER: new_filename = new_filename.lower() if FILENAME_TITLECASE: new_filename = capitalizeWords(new_filename) # Remove illegal character for Windows - new_filename = re.sub('[\\/:"*?<>|]+', '', new_filename) + new_filename = re.sub('[\\/:"*?<>|]+', "", new_filename) if FILENAME_REMOVECHARACTER: - new_filename = re.sub(f'[{FILENAME_REMOVECHARACTER}]+', '', new_filename) + new_filename = re.sub(f"[{FILENAME_REMOVECHARACTER}]+", "", new_filename) # Trying to remove non standard character if MODULE_UNIDECODE and UNICODE_USE: - new_filename = unidecode.unidecode(new_filename, errors='preserve') + new_filename = unidecode.unidecode(new_filename, errors="preserve") else: # Using typewriter for Apostrophe new_filename = re.sub("[’‘”“]+", "'", new_filename) @@ -870,7 +963,7 @@ def remove_consecutive(liste: list): def create_new_path(scene_info: dict, template: dict): # Create the new path # Split the template path - path_split = scene_info['template_split'] + path_split = scene_info["template_split"] path_list = [] for part in path_split: if ":" in part and path_split[0]: @@ -879,9 +972,11 @@ def create_new_path(scene_info: dict, template: dict): if not scene_info.get("studio_hierarchy"): continue for p in scene_info["studio_hierarchy"]: - path_list.append(re.sub('[\\/:"*?<>|]+', '', p).strip()) + path_list.append(re.sub('[\\/:"*?<>|]+', "", p).strip()) else: - path_list.append(re.sub('[\\/:"*?<>|]+', '', makePath(scene_info, part)).strip()) + path_list.append( + re.sub('[\\/:"*?<>|]+', "", makePath(scene_info, part)).strip() + ) # Remove blank, empty string path_split = [x for x in path_list if x] # The first character was a seperator, so put it back. @@ -893,13 +988,13 @@ def create_new_path(scene_info: dict, template: dict): path_split = remove_consecutive(path_split) if "^*" in template["path"]["destination"]: - if scene_info['current_directory'] != os.sep.join(path_split): - path_split.pop(len(scene_info['current_directory'])) + if scene_info["current_directory"] != os.sep.join(path_split): + path_split.pop(len(scene_info["current_directory"])) path_edited = os.sep.join(path_split) if FILENAME_REMOVECHARACTER: - path_edited = re.sub(f'[{FILENAME_REMOVECHARACTER}]+', '', path_edited) + path_edited = re.sub(f"[{FILENAME_REMOVECHARACTER}]+", "", path_edited) # Using typewriter for Apostrophe new_path = re.sub("[’‘”“]+", "'", path_edited) @@ -918,23 +1013,26 @@ def connect_db(path: str): def checking_duplicate_db(scene_info: dict): - scenes = graphql_findScenebyPath(scene_info['final_path'], "EQUALS") + scenes = graphql_findScenebyPath(scene_info["final_path"], "EQUALS") if scenes["count"] > 0: log.LogError("Duplicate path detected") for dupl_row in scenes["scenes"]: log.LogWarning(f"Identical path: [{dupl_row['id']}]") return 1 - scenes = graphql_findScenebyPath(scene_info['new_filename'], "EQUALS") + scenes = graphql_findScenebyPath(scene_info["new_filename"], "EQUALS") if scenes["count"] > 0: for dupl_row in scenes["scenes"]: - if dupl_row['id'] != scene_info['scene_id']: + if dupl_row["id"] != scene_info["scene_id"]: log.LogWarning(f"Duplicate filename: [{dupl_row['id']}]") def db_rename(stash_db: sqlite3.Connection, scene_info): cursor = stash_db.cursor() # Database rename - cursor.execute("UPDATE scenes SET path=? WHERE id=?;", [scene_info['final_path'], scene_info['scene_id']]) + cursor.execute( + "UPDATE scenes SET path=? WHERE id=?;", + [scene_info["final_path"], scene_info["scene_id"]], + ) stash_db.commit() # Close DB cursor.close() @@ -943,23 +1041,25 @@ def db_rename(stash_db: sqlite3.Connection, scene_info): def db_rename_refactor(stash_db: sqlite3.Connection, scene_info): cursor = stash_db.cursor() # 2022-09-17T11:25:52+02:00 - mod_time = datetime.now().astimezone().isoformat('T', 'seconds') + mod_time = datetime.now().astimezone().isoformat("T", "seconds") # get the next id that we should use if needed cursor.execute("SELECT MAX(id) from folders") new_id = cursor.fetchall()[0][0] + 1 # get the old folder id - cursor.execute("SELECT id FROM folders WHERE path=?", [scene_info['current_directory']]) + cursor.execute( + "SELECT id FROM folders WHERE path=?", [scene_info["current_directory"]] + ) old_folder_id = cursor.fetchall()[0][0] # check if the folder of file is created in db - cursor.execute("SELECT id FROM folders WHERE path=?", [scene_info['new_directory']]) + cursor.execute("SELECT id FROM folders WHERE path=?", [scene_info["new_directory"]]) folder_id = cursor.fetchall() if not folder_id: - dir = scene_info['new_directory'] + dir = scene_info["new_directory"] # reduce the path to find a parent folder - for _ in range(1, len(scene_info['new_directory'].split(os.sep))): + for _ in range(1, len(scene_info["new_directory"].split(os.sep))): dir = os.path.dirname(dir) cursor.execute("SELECT id FROM folders WHERE path=?", [dir]) parent_id = cursor.fetchall() @@ -968,16 +1068,25 @@ def db_rename_refactor(stash_db: sqlite3.Connection, scene_info): cursor.execute( "INSERT INTO 'main'.'folders'('id', 'path', 'parent_folder_id', 'mod_time', 'created_at', 'updated_at', 'zip_file_id') VALUES (?, ?, ?, ?, ?, ?, ?);", [ - new_id, scene_info['new_directory'], parent_id[0][0], - mod_time, mod_time, mod_time, None - ]) + new_id, + scene_info["new_directory"], + parent_id[0][0], + mod_time, + mod_time, + mod_time, + None, + ], + ) stash_db.commit() folder_id = new_id break else: folder_id = folder_id[0][0] if folder_id: - cursor.execute("SELECT file_id from scenes_files WHERE scene_id=?", [scene_info['scene_id']]) + cursor.execute( + "SELECT file_id from scenes_files WHERE scene_id=?", + [scene_info["scene_id"]], + ) file_ids = cursor.fetchall() file_id = None for f in file_ids: @@ -989,15 +1098,20 @@ def db_rename_refactor(stash_db: sqlite3.Connection, scene_info): file_id = f[0] break if file_id: - #log.LogDebug(f"UPDATE files SET basename={scene_info['new_filename']}, parent_folder_id={folder_id}, updated_at={mod_time} WHERE id={file_id};") - cursor.execute("UPDATE files SET basename=?, parent_folder_id=?, updated_at=? WHERE id=?;", [scene_info['new_filename'], folder_id, mod_time, file_id]) + # log.LogDebug(f"UPDATE files SET basename={scene_info['new_filename']}, parent_folder_id={folder_id}, updated_at={mod_time} WHERE id={file_id};") + cursor.execute( + "UPDATE files SET basename=?, parent_folder_id=?, updated_at=? WHERE id=?;", + [scene_info["new_filename"], folder_id, mod_time, file_id], + ) cursor.close() stash_db.commit() else: raise Exception("Failed to find file_id") else: cursor.close() - raise Exception(f"You need to setup a library with the new location ({scene_info['new_directory']}) and scan at least 1 file") + raise Exception( + f"You need to setup a library with the new location ({scene_info['new_directory']}) and scan at least 1 file" + ) def file_rename(current_path: str, new_path: str, scene_info: dict): @@ -1015,7 +1129,9 @@ def file_rename(current_path: str, new_path: str, scene_info: dict): shutil.move(current_path, new_path) except PermissionError as err: if "[WinError 32]" in str(err) and MODULE_PSUTIL: - log.LogWarning("A process is using this file (Probably FFMPEG), trying to find it ...") + log.LogWarning( + "A process is using this file (Probably FFMPEG), trying to find it ..." + ) # Find which process accesses the file, it's ffmpeg for sure... process_use = has_handle(current_path, PROCESS_ALLRESULT) if process_use: @@ -1029,7 +1145,9 @@ def file_rename(current_path: str, new_path: str, scene_info: dict): try: shutil.move(current_path, new_path) except Exception as err: - log.LogError(f"Something still prevents renaming the file. {err}") + log.LogError( + f"Something still prevents renaming the file. {err}" + ) return 1 else: log.LogError("A process prevents renaming the file.") @@ -1042,11 +1160,15 @@ def file_rename(current_path: str, new_path: str, scene_info: dict): log.LogInfo(f"[OS] File Renamed! ({current_path} -> {new_path})") if LOGFILE: try: - with open(LOGFILE, 'a', encoding='utf-8') as f: - f.write(f"{scene_info['scene_id']}|{current_path}|{new_path}|{scene_info['oshash']}\n") + with open(LOGFILE, "a", encoding="utf-8") as f: + f.write( + f"{scene_info['scene_id']}|{current_path}|{new_path}|{scene_info['oshash']}\n" + ) except Exception as err: shutil.move(new_path, current_path) - log.LogError(f"Restoring the original path, error writing the logfile: {err}") + log.LogError( + f"Restoring the original path, error writing the logfile: {err}" + ) return 1 if REMOVE_EMPTY_FOLDER: with os.scandir(current_dir) as it: @@ -1055,43 +1177,54 @@ def file_rename(current_path: str, new_path: str, scene_info: dict): try: os.rmdir(current_dir) except Exception as err: - log.logWarning(f"Fail to delete empty folder {current_dir} - {err}") + log.logWarning( + f"Fail to delete empty folder {current_dir} - {err}" + ) else: # I don't think it's possible. log.LogError(f"[OS] Failed to rename the file ? {new_path}") return 1 + def associated_rename(scene_info: dict): if ASSOCIATED_EXT: for ext in ASSOCIATED_EXT: - p = os.path.splitext(scene_info['current_path'])[0] + "." + ext - p_new = os.path.splitext(scene_info['final_path'])[0] + "." + ext + p = os.path.splitext(scene_info["current_path"])[0] + "." + ext + p_new = os.path.splitext(scene_info["final_path"])[0] + "." + ext if os.path.isfile(p): try: shutil.move(p, p_new) except Exception as err: - log.LogError(f"Something prevents renaming this file '{p}' - err: {err}") + log.LogError( + f"Something prevents renaming this file '{p}' - err: {err}" + ) continue if os.path.isfile(p_new): log.LogInfo(f"[OS] Associate file renamed ({p_new})") if LOGFILE: try: - with open(LOGFILE, 'a', encoding='utf-8') as f: + with open(LOGFILE, "a", encoding="utf-8") as f: f.write(f"{scene_info['scene_id']}|{p}|{p_new}\n") except Exception as err: shutil.move(p_new, p) - log.LogError(f"Restoring the original name, error writing the logfile: {err}") + log.LogError( + f"Restoring the original name, error writing the logfile: {err}" + ) def renamer(scene_id, db_conn=None): option_dryrun = False if type(scene_id) is dict: stash_scene = scene_id - scene_id = stash_scene['id'] + scene_id = stash_scene["id"] elif type(scene_id) is int: stash_scene = graphql_getScene(scene_id) - if config.only_organized and not stash_scene['organized'] and not PATH_NON_ORGANIZED: + if ( + config.only_organized + and not stash_scene["organized"] + and not PATH_NON_ORGANIZED + ): log.LogDebug(f"[{scene_id}] Scene ignored (not organized)") return @@ -1100,15 +1233,9 @@ def renamer(scene_id, db_conn=None): if stash_scene.get("path"): stash_scene["file"]["path"] = stash_scene["path"] if stash_scene.get("checksum"): - fingerprint.append({ - "type": "md5", - "value": stash_scene["checksum"] - }) + fingerprint.append({"type": "md5", "value": stash_scene["checksum"]}) if stash_scene.get("oshash"): - fingerprint.append({ - "type": "oshash", - "value": stash_scene["oshash"] - }) + fingerprint.append({"type": "oshash", "value": stash_scene["oshash"]}) stash_scene["file"]["fingerprints"] = fingerprint scene_files = [stash_scene["file"]] del stash_scene["path"] @@ -1143,7 +1270,11 @@ def renamer(scene_id, db_conn=None): if not template["path"].get("destination"): if config.p_use_default_template: log.LogDebug("[PATH] Using default template") - template["path"] = {"destination": config.p_default_template, "option": [], "opt_details": {}} + template["path"] = { + "destination": config.p_default_template, + "option": [], + "opt_details": {}, + } else: template["path"] = None else: @@ -1159,13 +1290,13 @@ def renamer(scene_id, db_conn=None): log.LogWarning(f"[{scene_id}] No template for this scene.") return - #log.LogDebug("Using this template: {}".format(filename_template)) + # log.LogDebug("Using this template: {}".format(filename_template)) scene_information = extract_info(stash_scene, template) log.LogDebug(f"[{scene_id}] Scene information: {scene_information}") log.LogDebug(f"[{scene_id}] Template: {template}") - scene_information['scene_id'] = scene_id - scene_information['file_index'] = i + scene_information["scene_id"] = scene_id + scene_information["file_index"] = i for removed_field in ORDER_SHORTFIELD: if removed_field: @@ -1175,55 +1306,76 @@ def renamer(scene_id, db_conn=None): else: continue if template["filename"]: - scene_information['new_filename'] = create_new_filename(scene_information, template["filename"]) + scene_information["new_filename"] = create_new_filename( + scene_information, template["filename"] + ) else: - scene_information['new_filename'] = scene_information['current_filename'] + scene_information["new_filename"] = scene_information[ + "current_filename" + ] if template.get("path"): - scene_information['new_directory'] = create_new_path(scene_information, template) + scene_information["new_directory"] = create_new_path( + scene_information, template + ) else: - scene_information['new_directory'] = scene_information['current_directory'] - scene_information['final_path'] = os.path.join(scene_information['new_directory'], scene_information['new_filename']) + scene_information["new_directory"] = scene_information[ + "current_directory" + ] + scene_information["final_path"] = os.path.join( + scene_information["new_directory"], scene_information["new_filename"] + ) # check length of path - if IGNORE_PATH_LENGTH or len(scene_information['final_path']) <= 240: + if IGNORE_PATH_LENGTH or len(scene_information["final_path"]) <= 240: break - if check_longpath(scene_information['final_path']): + if check_longpath(scene_information["final_path"]): if (DRY_RUN or option_dryrun) and LOGFILE: - with open(DRY_RUN_FILE, 'a', encoding='utf-8') as f: - f.write(f"[LENGTH LIMIT] {scene_information['scene_id']}|{scene_information['final_path']}\n") + with open(DRY_RUN_FILE, "a", encoding="utf-8") as f: + f.write( + f"[LENGTH LIMIT] {scene_information['scene_id']}|{scene_information['final_path']}\n" + ) continue - #log.LogDebug(f"Filename: {scene_information['current_filename']} -> {scene_information['new_filename']}") - #log.LogDebug(f"Path: {scene_information['current_directory']} -> {scene_information['new_directory']}") + # log.LogDebug(f"Filename: {scene_information['current_filename']} -> {scene_information['new_filename']}") + # log.LogDebug(f"Path: {scene_information['current_directory']} -> {scene_information['new_directory']}") - if scene_information['final_path'] == scene_information['current_path']: + if scene_information["final_path"] == scene_information["current_path"]: log.LogInfo(f"Everything is ok. ({scene_information['current_filename']})") continue - if scene_information['current_directory'] != scene_information['new_directory']: + if scene_information["current_directory"] != scene_information["new_directory"]: log.LogInfo("File will be moved to another directory") log.LogDebug(f"[OLD path] {scene_information['current_path']}") log.LogDebug(f"[NEW path] {scene_information['final_path']}") - if scene_information['current_filename'] != scene_information['new_filename']: + if scene_information["current_filename"] != scene_information["new_filename"]: log.LogInfo("The filename will be changed") if ALT_DIFF_DISPLAY: - find_diff_text(scene_information['current_filename'], scene_information['new_filename']) + find_diff_text( + scene_information["current_filename"], + scene_information["new_filename"], + ) else: log.LogDebug(f"[OLD filename] {scene_information['current_filename']}") log.LogDebug(f"[NEW filename] {scene_information['new_filename']}") if (DRY_RUN or option_dryrun) and LOGFILE: - with open(DRY_RUN_FILE, 'a', encoding='utf-8') as f: - f.write(f"{scene_information['scene_id']}|{scene_information['current_path']}|{scene_information['final_path']}\n") + with open(DRY_RUN_FILE, "a", encoding="utf-8") as f: + f.write( + f"{scene_information['scene_id']}|{scene_information['current_path']}|{scene_information['final_path']}\n" + ) continue # check if there is already a file where the new path is err = checking_duplicate_db(scene_information) - while err and scene_information['file_index']<=len(DUPLICATE_SUFFIX): + while err and scene_information["file_index"] <= len(DUPLICATE_SUFFIX): log.LogDebug("Duplicate filename detected, increasing file index") - scene_information['file_index'] = scene_information['file_index'] + 1 - scene_information['new_filename'] = create_new_filename(scene_information, template["filename"]) - scene_information['final_path'] = os.path.join(scene_information['new_directory'], scene_information['new_filename']) + scene_information["file_index"] = scene_information["file_index"] + 1 + scene_information["new_filename"] = create_new_filename( + scene_information, template["filename"] + ) + scene_information["final_path"] = os.path.join( + scene_information["new_directory"], scene_information["new_filename"] + ) log.LogDebug(f"[NEW filename] {scene_information['new_filename']}") log.LogDebug(f"[NEW path] {scene_information['final_path']}") err = checking_duplicate_db(scene_information) @@ -1239,7 +1391,11 @@ def renamer(scene_id, db_conn=None): stash_db = db_conn try: # rename file on your disk - err = file_rename(scene_information['current_path'], scene_information['final_path'], scene_information) + err = file_rename( + scene_information["current_path"], + scene_information["final_path"], + scene_information, + ) if err: raise Exception("rename") # rename file on your db @@ -1249,8 +1405,14 @@ def renamer(scene_id, db_conn=None): else: db_rename(stash_db, scene_information) except Exception as err: - log.LogError(f"error when trying to update the database ({err}), revert the move...") - err = file_rename(scene_information['final_path'], scene_information['current_path'], scene_information) + log.LogError( + f"error when trying to update the database ({err}), revert the move..." + ) + err = file_rename( + scene_information["final_path"], + scene_information["current_path"], + scene_information, + ) if err: raise Exception("rename") raise Exception("database update") @@ -1258,7 +1420,10 @@ def renamer(scene_id, db_conn=None): associated_rename(scene_information) if template.get("path"): if "clean_tag" in template["path"]["option"]: - graphql_removeScenesTag([scene_information['scene_id']], template["path"]["opt_details"]["clean_tag"]) + graphql_removeScenesTag( + [scene_information["scene_id"]], + template["path"]["opt_details"]["clean_tag"], + ) except Exception as err: log.LogError(f"Error during database operation ({err})") if not db_conn: @@ -1307,12 +1472,12 @@ else: LOGFILE = config.log_file -#Gallery.Update.Post -#if FRAGMENT_HOOK_TYPE == "Scene.Update.Post": +# Gallery.Update.Post +# if FRAGMENT_HOOK_TYPE == "Scene.Update.Post": STASH_CONFIG = graphql_getConfiguration() -STASH_DATABASE = STASH_CONFIG['general']['databasePath'] +STASH_DATABASE = STASH_CONFIG["general"]["databasePath"] # READING CONFIG @@ -1409,11 +1574,11 @@ if PLUGIN_ARGS: scenes = graphql_findScene(config.batch_number_scene, "ASC") log.LogDebug(f"Count scenes: {len(scenes['scenes'])}") progress = 0 - progress_step = 1 / len(scenes['scenes']) + progress_step = 1 / len(scenes["scenes"]) stash_db = connect_db(STASH_DATABASE) if stash_db is None: exit_plugin() - for scene in scenes['scenes']: + for scene in scenes["scenes"]: log.LogDebug(f"** Checking scene: {scene['title']} - {scene['id']} **") try: renamer(scene, stash_db) @@ -1431,4 +1596,3 @@ else: traceback.print_exc() exit_plugin("Successful!") - diff --git a/plugins/renamerOnUpdate/renamerOnUpdate.yml b/plugins/renamerOnUpdate/renamerOnUpdate.yml index f1381fe..b7e9b26 100644 --- a/plugins/renamerOnUpdate/renamerOnUpdate.yml +++ b/plugins/renamerOnUpdate/renamerOnUpdate.yml @@ -12,20 +12,19 @@ hooks: triggeredBy: - Scene.Update.Post tasks: - - name: 'Disable' + - name: "Disable" description: Disable the hook defaultArgs: mode: disable - - name: 'Enable' + - name: "Enable" description: Enable the hook defaultArgs: mode: enable - - name: 'Dryrun' + - name: "Dryrun" description: Enable/disable dry-run defaultArgs: mode: dryrun - - name: 'Rename scenes' + - name: "Rename scenes" description: Rename all your scenes based on your config. defaultArgs: mode: bulk - diff --git a/plugins/renamerOnUpdate/renamerOnUpdate_config.py b/plugins/renamerOnUpdate/renamerOnUpdate_config.py index bfe17a5..23fa809 100644 --- a/plugins/renamerOnUpdate/renamerOnUpdate_config.py +++ b/plugins/renamerOnUpdate/renamerOnUpdate_config.py @@ -2,23 +2,23 @@ # General information # # ----------------------------------------------------------------- # Available elements for renaming: -# $oshash -# $checksum -# $date +# $oshash +# $checksum +# $date # $date_format -# $year -# $performer -# $title -# $height -# $resolution +# $year +# $performer +# $title +# $height +# $resolution # $duration # $bitrate (megabits per second) -# $studio -# $parent_studio -# $studio_family +# $studio +# $parent_studio +# $studio_family # $rating # $tags -# $video_codec +# $video_codec # $audio_codec # $movie_scene # $movie_title @@ -37,7 +37,7 @@ # $movie_scene: "scene #" # = index scene # ----------------------------------------------------------------- # Example templates: -# +# # $title == Her Fantasy Ball # $date $title == 2016-12-29 Her Fantasy Ball # $date.$title == 2016-12-29.Her Fantasy Ball @@ -63,9 +63,7 @@ tag_templates = { } # Adjust the below if you want to use studio names instead of tags for the renaming templates -studio_templates = { - -} +studio_templates = {} # Change to True to use the default template if no specific tag/studio is found use_default_template = False @@ -81,18 +79,15 @@ default_template = "$date $title" # trigger with a specific tag # "tagname": "path" # ex: "plugin_move": r"E:\Movies\R18\$studio_hierarchy" -p_tag_templates = { -} +p_tag_templates = {} -p_studio_templates = { -} +p_studio_templates = {} # match a path # "match path": "destination" # ex: r"E:\Film\R18\2. Test\A trier": r"E:\Film\R18\2. Test\A trier\$performer", -p_path_templates = { -} +p_path_templates = {} # change to True to use the default template if no specific tag/studio is found p_use_default_template = False @@ -108,8 +103,7 @@ p_non_organized = r"" # inverse_performer: change the last/first name (Jane Doe -> Doe Jane) # dry_run: activate dry_run for this scene # ex: "plugin_move": ["clean_tag"] -p_tag_option = { -} +p_tag_option = {} ###################################### # Logging # @@ -140,8 +134,7 @@ field_whitespaceSeperator = "" # Remove/Replace character from field (not using regex) # "field": {"replace": "foo","with": "bar"} # ex: "$studio": {"replace": "'","with": ""} My Dad's Hot Girlfriend --> My Dads Hot Girlfriend -field_replacer = { -} +field_replacer = {} # Match and replace. # "match": ["replace with", "system"] the second element of the list determine the system used. If you don't put this element, the default is word @@ -149,8 +142,7 @@ field_replacer = { # difference between 'word' & 'any': word is between seperator (space, _, -), any is anything ('ring' would replace 'during') # ex: "Scene": ["Sc.", "word"] - Replace Scene by Sc. # r"S\d+:E\d+": ["", "regex"] - Remove Sxx:Ex (x is a digit) -replace_words = { -} +replace_words = {} # Date format for $date_format field, check: https://docs.python.org/3/library/datetime.html#strftime-and-strptime-format-codes date_format = r"%Y-%m-%d" @@ -180,7 +172,7 @@ performer_ignoreGender = [] # word attached at end if multiple file for same scene [FileRefactor] duplicate_suffix = ["", "_1", "_2", "_3", "_4", "_5", "_6", "_7", "_8", "_9", "_10"] -# If $performer is before $title, prevent having duplicate text. +# If $performer is before $title, prevent having duplicate text. # e.g.: # Template used: $year $performer - $title # 2016 Dani Daniels - Dani Daniels in ***.mp4 --> 2016 Dani Daniels in ***.mp4 @@ -199,7 +191,7 @@ path_noperformer_folder = False path_keep_alrperf = True # Removes prepositions from the beginning of titles -prepositions_list = ['The', 'A', 'An'] +prepositions_list = ["The", "A", "An"] prepositions_removal = False # Squeeze studio names removes all spaces in studio, parent studio and studio family name @@ -222,14 +214,14 @@ tags_splitchar = " " # Tags will be compared strictly. "pantyhose" != "Pantyhose" and "panty hose" != "pantyhose" # Option 1: If you're using whitelist, every other tag which is not listed there will be ignored in the filename # Option 2: All tags in the tags_blacklist array will be ignored in the filename. Every other tag will be used. -# Option 3: Leave both arrays empty if you're looking for every tag which is linked to the scene. +# Option 3: Leave both arrays empty if you're looking for every tag which is linked to the scene. # Attention: Only recommended if the scene linked tags number is not that big due to maxiumum filename length tags_whitelist = [ # "Brunette", "Blowjob" ] tags_blacklist = [ - # ignored tags... + # ignored tags... ] # Only rename 'Organized' scenes. @@ -239,7 +231,18 @@ only_organized = False ignore_path_length = False # Field to remove if the path is too long. First in list will be removed then second then ... if length is still too long. -order_field = ["$video_codec", "$audio_codec", "$resolution", "tags", "rating", "$height", "$studio_family", "$studio", "$parent_studio", "$performer"] +order_field = [ + "$video_codec", + "$audio_codec", + "$resolution", + "tags", + "rating", + "$height", + "$studio_family", + "$studio", + "$parent_studio", + "$performer", +] # Alternate way to show diff. Not useful at all. alt_diff_display = False @@ -249,7 +252,7 @@ batch_number_scene = -1 # disable/enable the hook. You can edit this value in 'Plugin Tasks' inside of Stash. enable_hook = True -# disable/enable dry mode. Do a trial run with no permanent changes. Can write into a file (dryrun_renamerOnUpdate.txt), set a path for log_file. +# disable/enable dry mode. Do a trial run with no permanent changes. Can write into a file (dryrun_renamerOnUpdate.txt), set a path for log_file. # You can edit this value in 'Plugin Tasks' inside of Stash. dry_run = False # Choose if you want to append to (True) or overwrite (False) the dry-run log file. @@ -262,14 +265,13 @@ dry_run_append = True # = psutil module (https://pypi.org/project/psutil/) = # Gets a list of all processes instead of stopping after the first one. Enabling it slows down the plugin process_getall = False -# If the file is used by a process, the plugin will kill it. IT CAN MAKE STASH CRASH TOO. +# If the file is used by a process, the plugin will kill it. IT CAN MAKE STASH CRASH TOO. process_kill_attach = False # ========================= # = Unidecode module (https://pypi.org/project/Unidecode/) = -# Check site mentioned for more details. +# Check site mentioned for more details. # TL;DR: Prevent having non common characters by replacing them. # Warning: If you have non-latin characters (Cyrillic, Kanji, Arabic, ...), the result will be extremely different. -use_ascii = False +use_ascii = False # ========================= - diff --git a/plugins/sceneCoverCropper/sceneCoverCropper.js b/plugins/sceneCoverCropper/sceneCoverCropper.js index 3808681..d0ea092 100644 --- a/plugins/sceneCoverCropper/sceneCoverCropper.js +++ b/plugins/sceneCoverCropper/sceneCoverCropper.js @@ -2,144 +2,154 @@ // Ported by feederbox826 (function () { - let cropping = false; - let cropper = null; - - try { - const img = document.createElement('img'); - new Cropper(img) - } catch (e) { - console.error("Cropper not loaded - please install 4. CropperJS from CommunityScripts") - } - try { - stash.getVersion() - } catch (e) { - console.error("Stash not loaded - please install 1. stashUserscriptLibrary from CommunityScripts") - } + let cropping = false; + let cropper = null; - function setupCropper() { - const cropBtnContainerId = "crop-btn-container"; - if (document.getElementById(cropBtnContainerId)) return - const sceneId = window.location.pathname.replace('/scenes/', '').split('/')[0]; - const sceneImage = document.querySelector("img.scene-cover") - - var cropperModal = document.createElement("dialog"); - cropperModal.style.width = "90%"; - cropperModal.style.border = "none"; - cropperModal.classList.add('bg-dark'); - document.body.appendChild(cropperModal); - - var cropperContainer = document.createElement("div"); - cropperContainer.style.width = "100%"; - cropperContainer.style.height = "auto"; - cropperContainer.style.margin = "auto"; - cropperModal.appendChild(cropperContainer); - - var image = sceneImage.cloneNode(); - image.style.display = "block"; - image.style.maxWidth = "100%"; - cropperContainer.appendChild(image); - - var cropBtnContainer = document.createElement('div'); - cropBtnContainer.setAttribute("id", cropBtnContainerId); - cropBtnContainer.classList.add('d-flex','flex-row','justify-content-center','align-items-center'); - cropBtnContainer.style.gap = "10px"; - cropperModal.appendChild(cropBtnContainer); - - - sceneImage.parentElement.parentElement.style.flexFlow = 'column'; - - const cropInfo = document.createElement('p'); - cropInfo.style.all = "revert"; - cropInfo.classList.add('text-white'); - - const cropStart = document.createElement('button'); - cropStart.setAttribute("id", "crop-start"); - cropStart.classList.add('btn', 'btn-primary'); - cropStart.innerText = 'Crop Image'; - cropStart.addEventListener('click', evt => { - cropping = true; - cropStart.style.display = 'none'; - cropCancel.style.display = 'inline-block'; - - //const isVertical = image.naturalHeight > image.naturalWidth; - //const aspectRatio = isVertical ? 3/2 : NaN - const aspectRatio = NaN + try { + const img = document.createElement("img"); + new Cropper(img); + } catch (e) { + console.error( + "Cropper not loaded - please install 4. CropperJS from CommunityScripts", + ); + } + try { + stash.getVersion(); + } catch (e) { + console.error( + "Stash not loaded - please install 1. stashUserscriptLibrary from CommunityScripts", + ); + } - cropper = new Cropper(image, { - viewMode: 1, - initialAspectRatio: aspectRatio, - movable: false, - rotatable: false, - scalable: false, - zoomable: false, - zoomOnTouch: false, - zoomOnWheel: false, - ready() { - cropAccept.style.display = 'inline-block'; - }, - crop(e) { - cropInfo.innerText = `X: ${Math.round(e.detail.x)}, Y: ${Math.round(e.detail.y)}, Width: ${Math.round(e.detail.width)}px, Height: ${Math.round(e.detail.height)}px`; - } - }); - cropperModal.showModal(); - }); - sceneImage.parentElement.appendChild(cropStart); - - const cropAccept = document.createElement('button'); - cropAccept.setAttribute("id", "crop-accept"); - cropAccept.classList.add('btn', 'btn-success', 'mr-2'); - cropAccept.innerText = 'OK'; - cropAccept.addEventListener('click', async evt => { - cropping = false; - cropStart.style.display = 'inline-block'; - cropAccept.style.display = 'none'; - cropCancel.style.display = 'none'; - cropInfo.innerText = ''; - - const reqData = { - "operationName": "SceneUpdate", - "variables": { - "input": { - "cover_image": cropper.getCroppedCanvas().toDataURL(), - "id": sceneId - } - }, - "query": `mutation SceneUpdate($input: SceneUpdateInput!) { + function setupCropper() { + const cropBtnContainerId = "crop-btn-container"; + if (document.getElementById(cropBtnContainerId)) return; + const sceneId = window.location.pathname + .replace("/scenes/", "") + .split("/")[0]; + const sceneImage = document.querySelector("img.scene-cover"); + + var cropperModal = document.createElement("dialog"); + cropperModal.style.width = "90%"; + cropperModal.style.border = "none"; + cropperModal.classList.add("bg-dark"); + document.body.appendChild(cropperModal); + + var cropperContainer = document.createElement("div"); + cropperContainer.style.width = "100%"; + cropperContainer.style.height = "auto"; + cropperContainer.style.margin = "auto"; + cropperModal.appendChild(cropperContainer); + + var image = sceneImage.cloneNode(); + image.style.display = "block"; + image.style.maxWidth = "100%"; + cropperContainer.appendChild(image); + + var cropBtnContainer = document.createElement("div"); + cropBtnContainer.setAttribute("id", cropBtnContainerId); + cropBtnContainer.classList.add( + "d-flex", + "flex-row", + "justify-content-center", + "align-items-center", + ); + cropBtnContainer.style.gap = "10px"; + cropperModal.appendChild(cropBtnContainer); + + sceneImage.parentElement.parentElement.style.flexFlow = "column"; + + const cropInfo = document.createElement("p"); + cropInfo.style.all = "revert"; + cropInfo.classList.add("text-white"); + + const cropStart = document.createElement("button"); + cropStart.setAttribute("id", "crop-start"); + cropStart.classList.add("btn", "btn-primary"); + cropStart.innerText = "Crop Image"; + cropStart.addEventListener("click", (evt) => { + cropping = true; + cropStart.style.display = "none"; + cropCancel.style.display = "inline-block"; + + //const isVertical = image.naturalHeight > image.naturalWidth; + //const aspectRatio = isVertical ? 3/2 : NaN + const aspectRatio = NaN; + + cropper = new Cropper(image, { + viewMode: 1, + initialAspectRatio: aspectRatio, + movable: false, + rotatable: false, + scalable: false, + zoomable: false, + zoomOnTouch: false, + zoomOnWheel: false, + ready() { + cropAccept.style.display = "inline-block"; + }, + crop(e) { + cropInfo.innerText = `X: ${Math.round(e.detail.x)}, Y: ${Math.round(e.detail.y)}, Width: ${Math.round(e.detail.width)}px, Height: ${Math.round(e.detail.height)}px`; + }, + }); + cropperModal.showModal(); + }); + sceneImage.parentElement.appendChild(cropStart); + + const cropAccept = document.createElement("button"); + cropAccept.setAttribute("id", "crop-accept"); + cropAccept.classList.add("btn", "btn-success", "mr-2"); + cropAccept.innerText = "OK"; + cropAccept.addEventListener("click", async (evt) => { + cropping = false; + cropStart.style.display = "inline-block"; + cropAccept.style.display = "none"; + cropCancel.style.display = "none"; + cropInfo.innerText = ""; + + const reqData = { + operationName: "SceneUpdate", + variables: { + input: { + cover_image: cropper.getCroppedCanvas().toDataURL(), + id: sceneId, + }, + }, + query: `mutation SceneUpdate($input: SceneUpdateInput!) { sceneUpdate(input: $input) { id } - }` - } - await stash.callGQL(reqData); - reloadImg(image.src); - cropper.destroy(); - cropperModal.close("cropAccept"); - }); - cropBtnContainer.appendChild(cropAccept); - - const cropCancel = document.createElement('button'); - cropCancel.setAttribute("id", "crop-accept"); - cropCancel.classList.add('btn', 'btn-danger'); - cropCancel.innerText = 'Cancel'; - cropCancel.addEventListener('click', evt => { - cropping = false; - cropStart.style.display = 'inline-block'; - cropAccept.style.display = 'none'; - cropCancel.style.display = 'none'; - cropInfo.innerText = ''; - - cropper.destroy(); - cropperModal.close("cropCancel"); - }); - cropBtnContainer.appendChild(cropCancel); - cropAccept.style.display = 'none'; - cropCancel.style.display = 'none'; - - cropBtnContainer.appendChild(cropInfo); - } - - stash.addEventListener('stash:page:scene', function () { - waitForElementId('scene-edit-details', setupCropper); + }`, + }; + await stash.callGQL(reqData); + reloadImg(image.src); + cropper.destroy(); + cropperModal.close("cropAccept"); }); + cropBtnContainer.appendChild(cropAccept); + + const cropCancel = document.createElement("button"); + cropCancel.setAttribute("id", "crop-accept"); + cropCancel.classList.add("btn", "btn-danger"); + cropCancel.innerText = "Cancel"; + cropCancel.addEventListener("click", (evt) => { + cropping = false; + cropStart.style.display = "inline-block"; + cropAccept.style.display = "none"; + cropCancel.style.display = "none"; + cropInfo.innerText = ""; + + cropper.destroy(); + cropperModal.close("cropCancel"); + }); + cropBtnContainer.appendChild(cropCancel); + cropAccept.style.display = "none"; + cropCancel.style.display = "none"; + + cropBtnContainer.appendChild(cropInfo); + } + + stash.addEventListener("stash:page:scene", function () { + waitForElementId("scene-edit-details", setupCropper); + }); })(); diff --git a/plugins/sceneCoverCropper/sceneCoverCropper.yml b/plugins/sceneCoverCropper/sceneCoverCropper.yml index 53f7111..03aac3c 100644 --- a/plugins/sceneCoverCropper/sceneCoverCropper.yml +++ b/plugins/sceneCoverCropper/sceneCoverCropper.yml @@ -4,7 +4,7 @@ description: Crop Scene Cover Images version: 1.0 ui: requires: - - CropperJS + - CropperJS css: javascript: - - sceneCoverCropper.js \ No newline at end of file + - sceneCoverCropper.js diff --git a/plugins/setSceneCoverFromFile/set_cover.py b/plugins/setSceneCoverFromFile/set_cover.py index ddb7be2..01037ce 100644 --- a/plugins/setSceneCoverFromFile/set_cover.py +++ b/plugins/setSceneCoverFromFile/set_cover.py @@ -5,73 +5,72 @@ import json import base64 try: - import stashapi.log as log - from stashapi.tools import file_to_base64 - from stashapi.stashapp import StashInterface + import stashapi.log as log + from stashapi.tools import file_to_base64 + from stashapi.stashapp import StashInterface except ModuleNotFoundError: - print("You need to install the stashapi module. (pip install stashapp-tools)", - file=sys.stderr) + print( + "You need to install the stashapi module. (pip install stashapp-tools)", + file=sys.stderr, + ) + +MANUAL_ROOT = None # /some/other/path to override scanning all stashes +cover_pattern = r"(?:thumb|poster|cover)\.(?:jpg|png)" -MANUAL_ROOT = None # /some/other/path to override scanning all stashes -cover_pattern = r'(?:thumb|poster|cover)\.(?:jpg|png)' def main(): - global stash, mode_arg - json_input = json.loads(sys.stdin.read()) + global stash, mode_arg + json_input = json.loads(sys.stdin.read()) - stash = StashInterface(json_input["server_connection"]) - mode_arg = json_input['args']['mode'] + stash = StashInterface(json_input["server_connection"]) + mode_arg = json_input["args"]["mode"] - try: - if MANUAL_ROOT: - scan(MANUAL_ROOT, handle_cover) - else: - for stash_path in get_stash_paths(): - scan(stash_path, handle_cover) - except Exception as e: - log.error(e) + try: + if MANUAL_ROOT: + scan(MANUAL_ROOT, handle_cover) + else: + for stash_path in get_stash_paths(): + scan(stash_path, handle_cover) + except Exception as e: + log.error(e) - out = json.dumps({"output": "ok"}) - print( out + "\n") + out = json.dumps({"output": "ok"}) + print(out + "\n") def handle_cover(path, file): - filepath = os.path.join(path, file) + filepath = os.path.join(path, file) + b64img = file_to_base64(filepath) + if not b64img: + log.warning(f"Could not parse {filepath} to b64image") + return - b64img = file_to_base64(filepath) - if not b64img: - log.warning(f"Could not parse {filepath} to b64image") - return + scenes = stash.find_scenes( + f={"path": {"modifier": "INCLUDES", "value": f'{path}"'}}, fragment="id" + ) - scenes = stash.find_scenes(f={ - "path": { - "modifier": "INCLUDES", - "value": f"{path}\"" - } - }, fragment="id") + log.info(f'Found Cover: {[int(s["id"]) for s in scenes]}|{filepath}') - log.info(f'Found Cover: {[int(s["id"]) for s in scenes]}|{filepath}') + if mode_arg == "set_cover": + for scene in scenes: + stash.update_scene({"id": scene["id"], "cover_image": b64img}) + log.info(f"Applied cover to {len(scenes)} scenes") - if mode_arg == "set_cover": - for scene in scenes: - stash.update_scene({ - "id": scene["id"], - "cover_image": b64img - }) - log.info(f'Applied cover to {len(scenes)} scenes') def get_stash_paths(): - config = stash.get_configuration("general { stashes { path excludeVideo } }") - stashes = config["configuration"]["general"]["stashes"] - return [s["path"] for s in stashes if not s["excludeVideo"]] + config = stash.get_configuration("general { stashes { path excludeVideo } }") + stashes = config["configuration"]["general"]["stashes"] + return [s["path"] for s in stashes if not s["excludeVideo"]] + def scan(ROOT_PATH, _callback): - log.info(f'Scanning {ROOT_PATH}') - for root, dirs, files in os.walk(ROOT_PATH): - for file in files: - if re.match(cover_pattern, file, re.IGNORECASE): - _callback(root, file) + log.info(f"Scanning {ROOT_PATH}") + for root, dirs, files in os.walk(ROOT_PATH): + for file in files: + if re.match(cover_pattern, file, re.IGNORECASE): + _callback(root, file) -if __name__ == '__main__': - main() \ No newline at end of file + +if __name__ == "__main__": + main() diff --git a/plugins/setSceneCoverFromFile/set_scene_cover.yml b/plugins/setSceneCoverFromFile/set_scene_cover.yml index f622f35..c5a4048 100644 --- a/plugins/setSceneCoverFromFile/set_scene_cover.yml +++ b/plugins/setSceneCoverFromFile/set_scene_cover.yml @@ -1,4 +1,4 @@ -name: Set Scene Cover +name: Set Scene Cover description: searches Stash for Scenes with a cover image in the same folder and sets the cover image in stash to that image version: 0.4 url: https://github.com/stg-annon/CommunityScripts/tree/main/plugins/setSceneCoverFromFile @@ -14,4 +14,4 @@ tasks: - name: Set Cover description: searches for cover images and sets any stash scene found in the same dir to that image defaultArgs: - mode: set_cover \ No newline at end of file + mode: set_cover diff --git a/plugins/stashAI/stashai.css b/plugins/stashAI/stashai.css index 7117d99..bf1be11 100644 --- a/plugins/stashAI/stashai.css +++ b/plugins/stashAI/stashai.css @@ -1 +1,155 @@ -button.svelte-1m5gxnd{background-color:var(--nav-color);border:0px}.scanner.svelte-1m5gxnd{animation:svelte-1m5gxnd-pulse 2s infinite}@keyframes svelte-1m5gxnd-pulse{0%{transform:scale(0.95);box-shadow:0 0 0 0 var(--light)}70%{transform:scale(1.1);box-shadow:0 0 0 10px var(--info)}100%{transform:scale(0.95);box-shadow:0 0 0 0 var(--primary)}}svg.svelte-1m5gxnd{fill:#ffffff}button.svelte-xcs6vi{background-color:var(--nav-color);border:0px}.scanner.svelte-xcs6vi{animation:svelte-xcs6vi-pulse 2s infinite}@keyframes svelte-xcs6vi-pulse{0%{transform:scale(0.95);box-shadow:0 0 0 0 var(--light)}70%{transform:scale(1.1);box-shadow:0 0 0 10px var(--info)}100%{transform:scale(0.95);box-shadow:0 0 0 0 var(--primary)}}.top-accent.svelte-9viihb{border-top:10px solid var(--primary);border-radius:3px}.modal-header.svelte-9viihb{font-size:2.4rem;border-bottom:0px;padding:20px}.modal-footer.svelte-9viihb{border-top:0px}.lds-dual-ring.svelte-9viihb{display:inline-block;width:16px;height:16px}.lds-dual-ring.svelte-9viihb:after{content:" ";display:block;width:12px;height:12px;margin:3px;border-radius:50%;border:6px solid #fff;border-color:#fff transparent #fff transparent;animation:svelte-9viihb-lds-dual-ring 1.2s linear infinite}@keyframes svelte-9viihb-lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.modal-header.svelte-qsvzsw{font-size:1rem;border-bottom:0px;padding:20px}.modal-footer.svelte-qsvzsw{border-top:0px}.selected.svelte-qsvzsw{border:2px solid #007bff}.tagger-tabs.svelte-qsvzsw{position:absolute;flex:0 0 450px;max-width:450px;min-width:450px;height:100%;overflow:auto;order:-1;background-color:var(--body-color)}.tag-item.svelte-zeu5yg{background-color:var(--card-color);width:100%;padding:5px;margin:0px}.tag-item-accept.svelte-zeu5yg:hover{fill:#45a82c;transition:fill 0.2s ease-out}.tag-item-reject.svelte-zeu5yg:hover{fill:#a82c2c;transition:fill 0.2s ease-out}.tag-item-select.svelte-zeu5yg{border:none;outline:none;scroll-behavior:smooth}.scrubber-item.svelte-zeu5yg{width:160px;height:90px;border-radius:5px 5px 0px 0px;position:relative;cursor:pointer}svg.svelte-zeu5yg{fill:#ffffff}.tag-item.svelte-1d03wug{background-color:var(--card-color);width:100%;padding:5px;margin:0px}.tag-item-select.svelte-1d03wug{border:none;outline:none;scroll-behavior:smooth}.tag-item-reject.svelte-1d03wug:hover{fill:#a82c2c;transition:fill 0.2s ease-out}.scrubber-item.svelte-1d03wug{width:160px;height:90px;border-radius:5px 5px 0px 0px;position:relative}svg.svelte-1d03wug{fill:#ffffff} \ No newline at end of file +button.svelte-1m5gxnd { + background-color: var(--nav-color); + border: 0px; +} +.scanner.svelte-1m5gxnd { + animation: svelte-1m5gxnd-pulse 2s infinite; +} +@keyframes svelte-1m5gxnd-pulse { + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--light); + } + 70% { + transform: scale(1.1); + box-shadow: 0 0 0 10px var(--info); + } + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--primary); + } +} +svg.svelte-1m5gxnd { + fill: #ffffff; +} +button.svelte-xcs6vi { + background-color: var(--nav-color); + border: 0px; +} +.scanner.svelte-xcs6vi { + animation: svelte-xcs6vi-pulse 2s infinite; +} +@keyframes svelte-xcs6vi-pulse { + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--light); + } + 70% { + transform: scale(1.1); + box-shadow: 0 0 0 10px var(--info); + } + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--primary); + } +} +.top-accent.svelte-9viihb { + border-top: 10px solid var(--primary); + border-radius: 3px; +} +.modal-header.svelte-9viihb { + font-size: 2.4rem; + border-bottom: 0px; + padding: 20px; +} +.modal-footer.svelte-9viihb { + border-top: 0px; +} +.lds-dual-ring.svelte-9viihb { + display: inline-block; + width: 16px; + height: 16px; +} +.lds-dual-ring.svelte-9viihb:after { + content: " "; + display: block; + width: 12px; + height: 12px; + margin: 3px; + border-radius: 50%; + border: 6px solid #fff; + border-color: #fff transparent #fff transparent; + animation: svelte-9viihb-lds-dual-ring 1.2s linear infinite; +} +@keyframes svelte-9viihb-lds-dual-ring { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.modal-header.svelte-qsvzsw { + font-size: 1rem; + border-bottom: 0px; + padding: 20px; +} +.modal-footer.svelte-qsvzsw { + border-top: 0px; +} +.selected.svelte-qsvzsw { + border: 2px solid #007bff; +} +.tagger-tabs.svelte-qsvzsw { + position: absolute; + flex: 0 0 450px; + max-width: 450px; + min-width: 450px; + height: 100%; + overflow: auto; + order: -1; + background-color: var(--body-color); +} +.tag-item.svelte-zeu5yg { + background-color: var(--card-color); + width: 100%; + padding: 5px; + margin: 0px; +} +.tag-item-accept.svelte-zeu5yg:hover { + fill: #45a82c; + transition: fill 0.2s ease-out; +} +.tag-item-reject.svelte-zeu5yg:hover { + fill: #a82c2c; + transition: fill 0.2s ease-out; +} +.tag-item-select.svelte-zeu5yg { + border: none; + outline: none; + scroll-behavior: smooth; +} +.scrubber-item.svelte-zeu5yg { + width: 160px; + height: 90px; + border-radius: 5px 5px 0px 0px; + position: relative; + cursor: pointer; +} +svg.svelte-zeu5yg { + fill: #ffffff; +} +.tag-item.svelte-1d03wug { + background-color: var(--card-color); + width: 100%; + padding: 5px; + margin: 0px; +} +.tag-item-select.svelte-1d03wug { + border: none; + outline: none; + scroll-behavior: smooth; +} +.tag-item-reject.svelte-1d03wug:hover { + fill: #a82c2c; + transition: fill 0.2s ease-out; +} +.scrubber-item.svelte-1d03wug { + width: 160px; + height: 90px; + border-radius: 5px 5px 0px 0px; + position: relative; +} +svg.svelte-1d03wug { + fill: #ffffff; +} diff --git a/plugins/stashAI/stashai.js b/plugins/stashAI/stashai.js index c0786f9..9490297 100644 --- a/plugins/stashAI/stashai.js +++ b/plugins/stashAI/stashai.js @@ -1,5 +1,5 @@ (function () { - 'use strict'; + "use strict"; let STASHMARKER_API_URL = "https://cc1234-stashtag.hf.space/api/predict"; @@ -54,7 +54,6 @@ }); } - /** * Retrieves the tags associated with a given scene ID. * @@ -75,7 +74,6 @@ return result.data.findScene.tags.map((p) => p.id); } - /** * Updates a scene with the given scene_id and tag_ids. * @param {string} scene_id - The ID of the scene to update. @@ -94,7 +92,6 @@ return stash.callGQL(reqData); } - /** * Returns an array with the scenario and scenario ID parsed from the current URL. * @returns {Array} An array with the scenario and scenario ID. @@ -113,7 +110,7 @@ */ async function createTag(tag_name) { const reqData = { - variables: { input: {name: tag_name} }, + variables: { input: { name: tag_name } }, query: `mutation tagCreate($input: TagCreateInput!) { tagCreate(input: $input){ id @@ -124,7 +121,6 @@ return result.data.tagCreate.id; } - /** * Creates a marker for a scene with the given parameters. * @param {string} scene_id - The ID of the scene. @@ -198,176 +194,176 @@ } } - function noop() { } - const identity = x => x; + function noop() {} + const identity = (x) => x; function add_location(element, file, line, column, char) { - element.__svelte_meta = { - loc: { file, line, column, char } - }; + element.__svelte_meta = { + loc: { file, line, column, char }, + }; } function run(fn) { - return fn(); + return fn(); } function blank_object() { - return Object.create(null); + return Object.create(null); } function run_all(fns) { - fns.forEach(run); + fns.forEach(run); } function is_function(thing) { - return typeof thing === 'function'; + return typeof thing === "function"; } function safe_not_equal(a, b) { - return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); + return a != a + ? b == b + : a !== b || (a && typeof a === "object") || typeof a === "function"; } function is_empty(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0; } function split_css_unit(value) { - const split = typeof value === 'string' && value.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/); - return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px']; + const split = + typeof value === "string" && value.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/); + return split ? [parseFloat(split[1]), split[2] || "px"] : [value, "px"]; } - const is_client = typeof window !== 'undefined'; - let now = is_client - ? () => window.performance.now() - : () => Date.now(); - let raf = is_client ? cb => requestAnimationFrame(cb) : noop; + const is_client = typeof window !== "undefined"; + let now = is_client ? () => window.performance.now() : () => Date.now(); + let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; const tasks = new Set(); function run_tasks(now) { - tasks.forEach(task => { - if (!task.c(now)) { - tasks.delete(task); - task.f(); - } - }); - if (tasks.size !== 0) - raf(run_tasks); + tasks.forEach((task) => { + if (!task.c(now)) { + tasks.delete(task); + task.f(); + } + }); + if (tasks.size !== 0) raf(run_tasks); } /** * Creates a new task that runs on each raf frame * until it returns a falsy value or is aborted */ function loop(callback) { - let task; - if (tasks.size === 0) - raf(run_tasks); - return { - promise: new Promise(fulfill => { - tasks.add(task = { c: callback, f: fulfill }); - }), - abort() { - tasks.delete(task); - } - }; + let task; + if (tasks.size === 0) raf(run_tasks); + return { + promise: new Promise((fulfill) => { + tasks.add((task = { c: callback, f: fulfill })); + }), + abort() { + tasks.delete(task); + }, + }; } - const globals = (typeof window !== 'undefined' + const globals = + typeof window !== "undefined" ? window - : typeof globalThis !== 'undefined' - ? globalThis - : global); + : typeof globalThis !== "undefined" + ? globalThis + : global; function append(target, node) { - target.appendChild(node); + target.appendChild(node); } function get_root_for_style(node) { - if (!node) - return document; - const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; - if (root && root.host) { - return root; - } - return node.ownerDocument; + if (!node) return document; + const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; + if (root && root.host) { + return root; + } + return node.ownerDocument; } function append_empty_stylesheet(node) { - const style_element = element('style'); - append_stylesheet(get_root_for_style(node), style_element); - return style_element.sheet; + const style_element = element("style"); + append_stylesheet(get_root_for_style(node), style_element); + return style_element.sheet; } function append_stylesheet(node, style) { - append(node.head || node, style); - return style.sheet; + append(node.head || node, style); + return style.sheet; } function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); + target.insertBefore(node, anchor || null); } function detach(node) { - if (node.parentNode) { - node.parentNode.removeChild(node); - } + if (node.parentNode) { + node.parentNode.removeChild(node); + } } function destroy_each(iterations, detaching) { - for (let i = 0; i < iterations.length; i += 1) { - if (iterations[i]) - iterations[i].d(detaching); - } + for (let i = 0; i < iterations.length; i += 1) { + if (iterations[i]) iterations[i].d(detaching); + } } function element(name) { - return document.createElement(name); + return document.createElement(name); } function svg_element(name) { - return document.createElementNS('http://www.w3.org/2000/svg', name); + return document.createElementNS("http://www.w3.org/2000/svg", name); } function text(data) { - return document.createTextNode(data); + return document.createTextNode(data); } function space() { - return text(' '); + return text(" "); } function empty() { - return text(''); + return text(""); } function listen(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); } function attr(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); + if (value == null) node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); } function to_number(value) { - return value === '' ? null : +value; + return value === "" ? null : +value; } function children(element) { - return Array.from(element.childNodes); + return Array.from(element.childNodes); } function set_input_value(input, value) { - input.value = value == null ? '' : value; + input.value = value == null ? "" : value; } function set_style(node, key, value, important) { - if (value == null) { - node.style.removeProperty(key); - } - else { - node.style.setProperty(key, value, important ? 'important' : ''); - } + if (value == null) { + node.style.removeProperty(key); + } else { + node.style.setProperty(key, value, important ? "important" : ""); + } } function select_option(select, value, mounting) { - for (let i = 0; i < select.options.length; i += 1) { - const option = select.options[i]; - if (option.__value === value) { - option.selected = true; - return; - } - } - if (!mounting || value !== undefined) { - select.selectedIndex = -1; // no option should be selected + for (let i = 0; i < select.options.length; i += 1) { + const option = select.options[i]; + if (option.__value === value) { + option.selected = true; + return; } + } + if (!mounting || value !== undefined) { + select.selectedIndex = -1; // no option should be selected + } } function select_value(select) { - const selected_option = select.querySelector(':checked'); - return selected_option && selected_option.__value; + const selected_option = select.querySelector(":checked"); + return selected_option && selected_option.__value; } function toggle_class(element, name, toggle) { - element.classList[toggle ? 'add' : 'remove'](name); + element.classList[toggle ? "add" : "remove"](name); } - function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) { - const e = document.createEvent('CustomEvent'); - e.initCustomEvent(type, bubbles, cancelable, detail); - return e; + function custom_event( + type, + detail, + { bubbles = false, cancelable = false } = {}, + ) { + const e = document.createEvent("CustomEvent"); + e.initCustomEvent(type, bubbles, cancelable, detail); + return e; } // we need to store the information for multiple documents because a Svelte application could also contain iframes @@ -376,142 +372,152 @@ let active = 0; // https://github.com/darkskyapp/string-hash/blob/master/index.js function hash(str) { - let hash = 5381; - let i = str.length; - while (i--) - hash = ((hash << 5) - hash) ^ str.charCodeAt(i); - return hash >>> 0; + let hash = 5381; + let i = str.length; + while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i); + return hash >>> 0; } function create_style_information(doc, node) { - const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; - managed_styles.set(doc, info); - return info; + const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; + managed_styles.set(doc, info); + return info; } function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) { - const step = 16.666 / duration; - let keyframes = '{\n'; - for (let p = 0; p <= 1; p += step) { - const t = a + (b - a) * ease(p); - keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; - } - const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; - const name = `__svelte_${hash(rule)}_${uid}`; - const doc = get_root_for_style(node); - const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node); - if (!rules[name]) { - rules[name] = true; - stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length); - } - const animation = node.style.animation || ''; - node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`; - active += 1; - return name; + const step = 16.666 / duration; + let keyframes = "{\n"; + for (let p = 0; p <= 1; p += step) { + const t = a + (b - a) * ease(p); + keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; + } + const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; + const name = `__svelte_${hash(rule)}_${uid}`; + const doc = get_root_for_style(node); + const { stylesheet, rules } = + managed_styles.get(doc) || create_style_information(doc, node); + if (!rules[name]) { + rules[name] = true; + stylesheet.insertRule( + `@keyframes ${name} ${rule}`, + stylesheet.cssRules.length, + ); + } + const animation = node.style.animation || ""; + node.style.animation = `${animation ? `${animation}, ` : ""}${name} ${duration}ms linear ${delay}ms 1 both`; + active += 1; + return name; } function delete_rule(node, name) { - const previous = (node.style.animation || '').split(', '); - const next = previous.filter(name - ? anim => anim.indexOf(name) < 0 // remove specific animation - : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations - ); - const deleted = previous.length - next.length; - if (deleted) { - node.style.animation = next.join(', '); - active -= deleted; - if (!active) - clear_rules(); - } + const previous = (node.style.animation || "").split(", "); + const next = previous.filter( + name + ? (anim) => anim.indexOf(name) < 0 // remove specific animation + : (anim) => anim.indexOf("__svelte") === -1, // remove all Svelte animations + ); + const deleted = previous.length - next.length; + if (deleted) { + node.style.animation = next.join(", "); + active -= deleted; + if (!active) clear_rules(); + } } function clear_rules() { - raf(() => { - if (active) - return; - managed_styles.forEach(info => { - const { ownerNode } = info.stylesheet; - // there is no ownerNode if it runs on jsdom. - if (ownerNode) - detach(ownerNode); - }); - managed_styles.clear(); + raf(() => { + if (active) return; + managed_styles.forEach((info) => { + const { ownerNode } = info.stylesheet; + // there is no ownerNode if it runs on jsdom. + if (ownerNode) detach(ownerNode); }); + managed_styles.clear(); + }); } function create_animation(node, from, fn, params) { - if (!from) - return noop; - const to = node.getBoundingClientRect(); - if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom) - return noop; - const { delay = 0, duration = 300, easing = identity, + if (!from) return noop; + const to = node.getBoundingClientRect(); + if ( + from.left === to.left && + from.right === to.right && + from.top === to.top && + from.bottom === to.bottom + ) + return noop; + const { + delay = 0, + duration = 300, + easing = identity, // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation? - start: start_time = now() + delay, + start: start_time = now() + delay, // @ts-ignore todo: - end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params); - let running = true; - let started = false; - let name; - function start() { - if (css) { - name = create_rule(node, 0, 1, duration, delay, easing, css); - } - if (!delay) { - started = true; - } + end = start_time + duration, + tick = noop, + css, + } = fn(node, { from, to }, params); + let running = true; + let started = false; + let name; + function start() { + if (css) { + name = create_rule(node, 0, 1, duration, delay, easing, css); } - function stop() { - if (css) - delete_rule(node, name); - running = false; + if (!delay) { + started = true; } - loop(now => { - if (!started && now >= start_time) { - started = true; - } - if (started && now >= end) { - tick(1, 0); - stop(); - } - if (!running) { - return false; - } - if (started) { - const p = now - start_time; - const t = 0 + 1 * easing(p / duration); - tick(t, 1 - t); - } - return true; - }); - start(); - tick(0, 1); - return stop; + } + function stop() { + if (css) delete_rule(node, name); + running = false; + } + loop((now) => { + if (!started && now >= start_time) { + started = true; + } + if (started && now >= end) { + tick(1, 0); + stop(); + } + if (!running) { + return false; + } + if (started) { + const p = now - start_time; + const t = 0 + 1 * easing(p / duration); + tick(t, 1 - t); + } + return true; + }); + start(); + tick(0, 1); + return stop; } function fix_position(node) { - const style = getComputedStyle(node); - if (style.position !== 'absolute' && style.position !== 'fixed') { - const { width, height } = style; - const a = node.getBoundingClientRect(); - node.style.position = 'absolute'; - node.style.width = width; - node.style.height = height; - add_transform(node, a); - } + const style = getComputedStyle(node); + if (style.position !== "absolute" && style.position !== "fixed") { + const { width, height } = style; + const a = node.getBoundingClientRect(); + node.style.position = "absolute"; + node.style.width = width; + node.style.height = height; + add_transform(node, a); + } } function add_transform(node, a) { - const b = node.getBoundingClientRect(); - if (a.left !== b.left || a.top !== b.top) { - const style = getComputedStyle(node); - const transform = style.transform === 'none' ? '' : style.transform; - node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`; - } + const b = node.getBoundingClientRect(); + if (a.left !== b.left || a.top !== b.top) { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`; + } } let current_component; function set_current_component(component) { - current_component = component; + current_component = component; } function get_current_component() { - if (!current_component) - throw new Error('Function called outside component initialization'); - return current_component; + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; } /** * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM. @@ -523,7 +529,7 @@ * https://svelte.dev/docs#run-time-svelte-onmount */ function onMount(fn) { - get_current_component().$$.on_mount.push(fn); + get_current_component().$$.on_mount.push(fn); } /** * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname). @@ -538,20 +544,20 @@ * https://svelte.dev/docs#run-time-svelte-createeventdispatcher */ function createEventDispatcher() { - const component = get_current_component(); - return (type, detail, { cancelable = false } = {}) => { - const callbacks = component.$$.callbacks[type]; - if (callbacks) { - // TODO are there situations where events could be dispatched - // in a server (non-DOM) environment? - const event = custom_event(type, detail, { cancelable }); - callbacks.slice().forEach(fn => { - fn.call(component, event); - }); - return !event.defaultPrevented; - } - return true; - }; + const component = get_current_component(); + return (type, detail, { cancelable = false } = {}) => { + const callbacks = component.$$.callbacks[type]; + if (callbacks) { + // TODO are there situations where events could be dispatched + // in a server (non-DOM) environment? + const event = custom_event(type, detail, { cancelable }); + callbacks.slice().forEach((fn) => { + fn.call(component, event); + }); + return !event.defaultPrevented; + } + return true; + }; } const dirty_components = []; @@ -561,16 +567,16 @@ const resolved_promise = /* @__PURE__ */ Promise.resolve(); let update_scheduled = false; function schedule_update() { - if (!update_scheduled) { - update_scheduled = true; - resolved_promise.then(flush); - } + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } } function add_render_callback(fn) { - render_callbacks.push(fn); + render_callbacks.push(fn); } function add_flush_callback(fn) { - flush_callbacks.push(fn); + flush_callbacks.push(fn); } // flush() calls callbacks in this order: // 1. All beforeUpdate callbacks, in order: parents before children @@ -593,2174 +599,2605 @@ const seen_callbacks = new Set(); let flushidx = 0; // Do *not* move this inside the flush() function function flush() { - // Do not reenter flush while dirty components are updated, as this can - // result in an infinite loop. Instead, let the inner flush handle it. - // Reentrancy is ok afterwards for bindings etc. - if (flushidx !== 0) { - return; + // Do not reenter flush while dirty components are updated, as this can + // result in an infinite loop. Instead, let the inner flush handle it. + // Reentrancy is ok afterwards for bindings etc. + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + // first, call beforeUpdate functions + // and update components + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } catch (e) { + // reset dirty state to not end up in a deadlocked state and then rethrow + dirty_components.length = 0; + flushidx = 0; + throw e; } - const saved_component = current_component; - do { - // first, call beforeUpdate functions - // and update components - try { - while (flushidx < dirty_components.length) { - const component = dirty_components[flushidx]; - flushidx++; - set_current_component(component); - update(component.$$); - } - } - catch (e) { - // reset dirty state to not end up in a deadlocked state and then rethrow - dirty_components.length = 0; - flushidx = 0; - throw e; - } - set_current_component(null); - dirty_components.length = 0; - flushidx = 0; - while (binding_callbacks.length) - binding_callbacks.pop()(); - // then, once components are updated, call - // afterUpdate functions. This may cause - // subsequent updates... - for (let i = 0; i < render_callbacks.length; i += 1) { - const callback = render_callbacks[i]; - if (!seen_callbacks.has(callback)) { - // ...so guard against infinite loops - seen_callbacks.add(callback); - callback(); - } - } - render_callbacks.length = 0; - } while (dirty_components.length); - while (flush_callbacks.length) { - flush_callbacks.pop()(); + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } } - update_scheduled = false; - seen_callbacks.clear(); - set_current_component(saved_component); + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); } function update($$) { - if ($$.fragment !== null) { - $$.update(); - run_all($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback); - } + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } } /** * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`. */ function flush_render_callbacks(fns) { - const filtered = []; - const targets = []; - render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)); - targets.forEach((c) => c()); - render_callbacks = filtered; + const filtered = []; + const targets = []; + render_callbacks.forEach((c) => + fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c), + ); + targets.forEach((c) => c()); + render_callbacks = filtered; } let promise; function wait() { - if (!promise) { - promise = Promise.resolve(); - promise.then(() => { - promise = null; - }); - } - return promise; + if (!promise) { + promise = Promise.resolve(); + promise.then(() => { + promise = null; + }); + } + return promise; } function dispatch(node, direction, kind) { - node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`)); + node.dispatchEvent(custom_event(`${direction ? "intro" : "outro"}${kind}`)); } const outroing = new Set(); let outros; function group_outros() { - outros = { - r: 0, - c: [], - p: outros // parent group - }; + outros = { + r: 0, + c: [], + p: outros, // parent group + }; } function check_outros() { - if (!outros.r) { - run_all(outros.c); - } - outros = outros.p; + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; } function transition_in(block, local) { - if (block && block.i) { - outroing.delete(block); - block.i(local); - } + if (block && block.i) { + outroing.delete(block); + block.i(local); + } } function transition_out(block, local, detach, callback) { - if (block && block.o) { - if (outroing.has(block)) - return; - outroing.add(block); - outros.c.push(() => { - outroing.delete(block); - if (callback) { - if (detach) - block.d(1); - callback(); - } - }); - block.o(local); - } - else if (callback) { + if (block && block.o) { + if (outroing.has(block)) return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) block.d(1); callback(); - } + } + }); + block.o(local); + } else if (callback) { + callback(); + } } const null_transition = { duration: 0 }; function create_in_transition(node, fn, params) { - const options = { direction: 'in' }; - let config = fn(node, params, options); - let running = false; - let animation_name; - let task; - let uid = 0; - function cleanup() { - if (animation_name) - delete_rule(node, animation_name); - } - function go() { - const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition; - if (css) - animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++); - tick(0, 1); - const start_time = now() + delay; - const end_time = start_time + duration; - if (task) - task.abort(); - running = true; - add_render_callback(() => dispatch(node, true, 'start')); - task = loop(now => { - if (running) { - if (now >= end_time) { - tick(1, 0); - dispatch(node, true, 'end'); - cleanup(); - return running = false; - } - if (now >= start_time) { - const t = easing((now - start_time) / duration); - tick(t, 1 - t); - } - } - return running; - }); - } - let started = false; - return { - start() { - if (started) - return; - started = true; - delete_rule(node); - if (is_function(config)) { - config = config(options); - wait().then(go); - } - else { - go(); - } - }, - invalidate() { - started = false; - }, - end() { - if (running) { - cleanup(); - running = false; - } + const options = { direction: "in" }; + let config = fn(node, params, options); + let running = false; + let animation_name; + let task; + let uid = 0; + function cleanup() { + if (animation_name) delete_rule(node, animation_name); + } + function go() { + const { + delay = 0, + duration = 300, + easing = identity, + tick = noop, + css, + } = config || null_transition; + if (css) + animation_name = create_rule( + node, + 0, + 1, + duration, + delay, + easing, + css, + uid++, + ); + tick(0, 1); + const start_time = now() + delay; + const end_time = start_time + duration; + if (task) task.abort(); + running = true; + add_render_callback(() => dispatch(node, true, "start")); + task = loop((now) => { + if (running) { + if (now >= end_time) { + tick(1, 0); + dispatch(node, true, "end"); + cleanup(); + return (running = false); } - }; + if (now >= start_time) { + const t = easing((now - start_time) / duration); + tick(t, 1 - t); + } + } + return running; + }); + } + let started = false; + return { + start() { + if (started) return; + started = true; + delete_rule(node); + if (is_function(config)) { + config = config(options); + wait().then(go); + } else { + go(); + } + }, + invalidate() { + started = false; + }, + end() { + if (running) { + cleanup(); + running = false; + } + }, + }; } function create_out_transition(node, fn, params) { - const options = { direction: 'out' }; - let config = fn(node, params, options); - let running = true; - let animation_name; - const group = outros; - group.r += 1; - function go() { - const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition; - if (css) - animation_name = create_rule(node, 1, 0, duration, delay, easing, css); - const start_time = now() + delay; - const end_time = start_time + duration; - add_render_callback(() => dispatch(node, false, 'start')); - loop(now => { - if (running) { - if (now >= end_time) { - tick(0, 1); - dispatch(node, false, 'end'); - if (!--group.r) { - // this will result in `end()` being called, - // so we don't need to clean up here - run_all(group.c); - } - return false; - } - if (now >= start_time) { - const t = easing((now - start_time) / duration); - tick(1 - t, t); - } - } - return running; - }); - } - if (is_function(config)) { - wait().then(() => { - // @ts-ignore - config = config(options); - go(); - }); - } - else { - go(); - } - return { - end(reset) { - if (reset && config.tick) { - config.tick(1, 0); - } - if (running) { - if (animation_name) - delete_rule(node, animation_name); - running = false; - } + const options = { direction: "out" }; + let config = fn(node, params, options); + let running = true; + let animation_name; + const group = outros; + group.r += 1; + function go() { + const { + delay = 0, + duration = 300, + easing = identity, + tick = noop, + css, + } = config || null_transition; + if (css) + animation_name = create_rule(node, 1, 0, duration, delay, easing, css); + const start_time = now() + delay; + const end_time = start_time + duration; + add_render_callback(() => dispatch(node, false, "start")); + loop((now) => { + if (running) { + if (now >= end_time) { + tick(0, 1); + dispatch(node, false, "end"); + if (!--group.r) { + // this will result in `end()` being called, + // so we don't need to clean up here + run_all(group.c); + } + return false; } - }; + if (now >= start_time) { + const t = easing((now - start_time) / duration); + tick(1 - t, t); + } + } + return running; + }); + } + if (is_function(config)) { + wait().then(() => { + // @ts-ignore + config = config(options); + go(); + }); + } else { + go(); + } + return { + end(reset) { + if (reset && config.tick) { + config.tick(1, 0); + } + if (running) { + if (animation_name) delete_rule(node, animation_name); + running = false; + } + }, + }; } function outro_and_destroy_block(block, lookup) { - transition_out(block, 1, 1, () => { - lookup.delete(block.key); - }); + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); } function fix_and_outro_and_destroy_block(block, lookup) { - block.f(); - outro_and_destroy_block(block, lookup); + block.f(); + outro_and_destroy_block(block, lookup); } - function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { - let o = old_blocks.length; - let n = list.length; - let i = o; - const old_indexes = {}; - while (i--) - old_indexes[old_blocks[i].key] = i; - const new_blocks = []; - const new_lookup = new Map(); - const deltas = new Map(); - const updates = []; - i = n; - while (i--) { - const child_ctx = get_context(ctx, list, i); - const key = get_key(child_ctx); - let block = lookup.get(key); - if (!block) { - block = create_each_block(key, child_ctx); - block.c(); - } - else if (dynamic) { - // defer updates until all the DOM shuffling is done - updates.push(() => block.p(child_ctx, dirty)); - } - new_lookup.set(key, new_blocks[i] = block); - if (key in old_indexes) - deltas.set(key, Math.abs(i - old_indexes[key])); + function update_keyed_each( + old_blocks, + dirty, + get_key, + dynamic, + ctx, + list, + lookup, + node, + destroy, + create_each_block, + next, + get_context, + ) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + const updates = []; + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } else if (dynamic) { + // defer updates until all the DOM shuffling is done + updates.push(() => block.p(child_ctx, dirty)); } - const will_move = new Set(); - const did_move = new Set(); - function insert(block) { - transition_in(block, 1); - block.m(node, next); - lookup.set(block.key, block); - next = block.first; - n--; + new_lookup.set(key, (new_blocks[i] = block)); + if (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } else if (did_move.has(old_key)) { + o--; + } else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } else { + will_move.add(old_key); + o--; } - while (o && n) { - const new_block = new_blocks[n - 1]; - const old_block = old_blocks[o - 1]; - const new_key = new_block.key; - const old_key = old_block.key; - if (new_block === old_block) { - // do nothing - next = new_block.first; - o--; - n--; - } - else if (!new_lookup.has(old_key)) { - // remove old block - destroy(old_block, lookup); - o--; - } - else if (!lookup.has(new_key) || will_move.has(new_key)) { - insert(new_block); - } - else if (did_move.has(old_key)) { - o--; - } - else if (deltas.get(new_key) > deltas.get(old_key)) { - did_move.add(new_key); - insert(new_block); - } - else { - will_move.add(old_key); - o--; - } - } - while (o--) { - const old_block = old_blocks[o]; - if (!new_lookup.has(old_block.key)) - destroy(old_block, lookup); - } - while (n) - insert(new_blocks[n - 1]); - run_all(updates); - return new_blocks; + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) destroy(old_block, lookup); + } + while (n) insert(new_blocks[n - 1]); + run_all(updates); + return new_blocks; } function validate_each_keys(ctx, list, get_context, get_key) { - const keys = new Set(); - for (let i = 0; i < list.length; i++) { - const key = get_key(get_context(ctx, list, i)); - if (keys.has(key)) { - throw new Error('Cannot have duplicate keys in a keyed each'); - } - keys.add(key); + const keys = new Set(); + for (let i = 0; i < list.length; i++) { + const key = get_key(get_context(ctx, list, i)); + if (keys.has(key)) { + throw new Error("Cannot have duplicate keys in a keyed each"); } + keys.add(key); + } } function bind(component, name, callback) { - const index = component.$$.props[name]; - if (index !== undefined) { - component.$$.bound[index] = callback; - callback(component.$$.ctx[index]); - } + const index = component.$$.props[name]; + if (index !== undefined) { + component.$$.bound[index] = callback; + callback(component.$$.ctx[index]); + } } function create_component(block) { - block && block.c(); + block && block.c(); } function mount_component(component, target, anchor, customElement) { - const { fragment, after_update } = component.$$; - fragment && fragment.m(target, anchor); - if (!customElement) { - // onMount happens before the initial afterUpdate - add_render_callback(() => { - const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); - // if the component was destroyed immediately - // it will update the `$$.on_destroy` reference to `null`. - // the destructured on_destroy may still reference to the old array - if (component.$$.on_destroy) { - component.$$.on_destroy.push(...new_on_destroy); - } - else { - // Edge case - component was destroyed immediately, - // most likely as a result of a binding initialising - run_all(new_on_destroy); - } - component.$$.on_mount = []; - }); - } - after_update.forEach(add_render_callback); + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount + .map(run) + .filter(is_function); + // if the component was destroyed immediately + // it will update the `$$.on_destroy` reference to `null`. + // the destructured on_destroy may still reference to the old array + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); } function destroy_component(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - flush_render_callbacks($$.after_update); - run_all($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - // TODO null out other refs, including component.$$ (but need to - // preserve final state?) - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } + const $$ = component.$$; + if ($$.fragment !== null) { + flush_render_callbacks($$.after_update); + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } } function make_dirty(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components.push(component); - schedule_update(); - component.$$.dirty.fill(0); - } - component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= 1 << i % 31; } - function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { - const parent_component = current_component; - set_current_component(component); - const $$ = component.$$ = { - fragment: null, - ctx: [], - // state - props, - update: noop, - not_equal, - bound: blank_object(), - // lifecycle - on_mount: [], - on_destroy: [], - on_disconnect: [], - before_update: [], - after_update: [], - context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), - // everything else - callbacks: blank_object(), - dirty, - skip_bound: false, - root: options.target || parent_component.$$.root - }; - append_styles && append_styles($$.root); - let ready = false; - $$.ctx = instance - ? instance(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty(component, i); - } - return ret; - }) - : []; - $$.update(); - ready = true; - run_all($$.before_update); - // `false` as a special case of no DOM component - $$.fragment = create_fragment ? create_fragment($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - const nodes = children(options.target); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach); + function init( + component, + options, + instance, + create_fragment, + not_equal, + props, + append_styles, + dirty = [-1], + ) { + const parent_component = current_component; + set_current_component(component); + const $$ = (component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map( + options.context || + (parent_component ? parent_component.$$.context : []), + ), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root, + }); + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) { + if (!$$.skip_bound && $$.bound[i]) $$.bound[i](value); + if (ready) make_dirty(component, i); } - else { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in(component.$$.fragment); - mount_component(component, options.target, options.anchor, options.customElement); - flush(); + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); } - set_current_component(parent_component); + if (options.intro) transition_in(component.$$.fragment); + mount_component( + component, + options.target, + options.anchor, + options.customElement, + ); + flush(); + } + set_current_component(parent_component); } /** * Base class for Svelte components. Used when dev=false. */ class SvelteComponent { - $destroy() { - destroy_component(this, 1); - this.$destroy = noop; + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; } - $on(type, callback) { - if (!is_function(callback)) { - return noop; - } - const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } + const callbacks = + this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; } + } } function dispatch_dev(type, detail) { - document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true })); + document.dispatchEvent( + custom_event(type, Object.assign({ version: "3.59.2" }, detail), { + bubbles: true, + }), + ); } function append_dev(target, node) { - dispatch_dev('SvelteDOMInsert', { target, node }); - append(target, node); + dispatch_dev("SvelteDOMInsert", { target, node }); + append(target, node); } function insert_dev(target, node, anchor) { - dispatch_dev('SvelteDOMInsert', { target, node, anchor }); - insert(target, node, anchor); + dispatch_dev("SvelteDOMInsert", { target, node, anchor }); + insert(target, node, anchor); } function detach_dev(node) { - dispatch_dev('SvelteDOMRemove', { node }); - detach(node); + dispatch_dev("SvelteDOMRemove", { node }); + detach(node); } - function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) { - const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : []; - if (has_prevent_default) - modifiers.push('preventDefault'); - if (has_stop_propagation) - modifiers.push('stopPropagation'); - if (has_stop_immediate_propagation) - modifiers.push('stopImmediatePropagation'); - dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers }); - const dispose = listen(node, event, handler, options); - return () => { - dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers }); - dispose(); - }; + function listen_dev( + node, + event, + handler, + options, + has_prevent_default, + has_stop_propagation, + has_stop_immediate_propagation, + ) { + const modifiers = + options === true + ? ["capture"] + : options + ? Array.from(Object.keys(options)) + : []; + if (has_prevent_default) modifiers.push("preventDefault"); + if (has_stop_propagation) modifiers.push("stopPropagation"); + if (has_stop_immediate_propagation) + modifiers.push("stopImmediatePropagation"); + dispatch_dev("SvelteDOMAddEventListener", { + node, + event, + handler, + modifiers, + }); + const dispose = listen(node, event, handler, options); + return () => { + dispatch_dev("SvelteDOMRemoveEventListener", { + node, + event, + handler, + modifiers, + }); + dispose(); + }; } function attr_dev(node, attribute, value) { - attr(node, attribute, value); - if (value == null) - dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute }); - else - dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value }); + attr(node, attribute, value); + if (value == null) + dispatch_dev("SvelteDOMRemoveAttribute", { node, attribute }); + else dispatch_dev("SvelteDOMSetAttribute", { node, attribute, value }); } function set_data_dev(text, data) { - data = '' + data; - if (text.data === data) - return; - dispatch_dev('SvelteDOMSetData', { node: text, data }); - text.data = data; + data = "" + data; + if (text.data === data) return; + dispatch_dev("SvelteDOMSetData", { node: text, data }); + text.data = data; } function validate_each_argument(arg) { - if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) { - let msg = '{#each} only iterates over array-like objects.'; - if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) { - msg += ' You can use a spread to convert this iterable into an array.'; - } - throw new Error(msg); + if ( + typeof arg !== "string" && + !(arg && typeof arg === "object" && "length" in arg) + ) { + let msg = "{#each} only iterates over array-like objects."; + if (typeof Symbol === "function" && arg && Symbol.iterator in arg) { + msg += " You can use a spread to convert this iterable into an array."; } + throw new Error(msg); + } } function validate_slots(name, slot, keys) { - for (const slot_key of Object.keys(slot)) { - if (!~keys.indexOf(slot_key)) { - console.warn(`<${name}> received an unexpected slot "${slot_key}".`); - } + for (const slot_key of Object.keys(slot)) { + if (!~keys.indexOf(slot_key)) { + console.warn(`<${name}> received an unexpected slot "${slot_key}".`); } + } } /** * Base class for Svelte components with some minor dev-enhancements. Used when dev=true. */ class SvelteComponentDev extends SvelteComponent { - constructor(options) { - if (!options || (!options.target && !options.$$inline)) { - throw new Error("'target' is a required option"); - } - super(); + constructor(options) { + if (!options || (!options.target && !options.$$inline)) { + throw new Error("'target' is a required option"); } - $destroy() { - super.$destroy(); - this.$destroy = () => { - console.warn('Component was already destroyed'); // eslint-disable-line no-console - }; - } - $capture_state() { } - $inject_state() { } + super(); + } + $destroy() { + super.$destroy(); + this.$destroy = () => { + console.warn("Component was already destroyed"); // eslint-disable-line no-console + }; + } + $capture_state() {} + $inject_state() {} } /* src/Marker.svelte generated by Svelte v3.59.2 */ const file$5 = "src/Marker.svelte"; function get_each_context$3(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[7] = list[i]; - return child_ctx; + const child_ctx = ctx.slice(); + child_ctx[7] = list[i]; + return child_ctx; } // (92:6) {#each OPTIONS as name} function create_each_block$3(ctx) { - let option; - let t_value = /*name*/ ctx[7] + ""; - let t; + let option; + let t_value = /*name*/ ctx[7] + ""; + let t; - const block = { - c: function create() { - option = element("option"); - t = text(t_value); - set_style(option, "background-color", "var(--gray)"); - option.__value = /*name*/ ctx[7]; - option.value = option.__value; - add_location(option, file$5, 92, 8, 3418); - }, - m: function mount(target, anchor) { - insert_dev(target, option, anchor); - append_dev(option, t); - }, - p: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(option); - } - }; + const block = { + c: function create() { + option = element("option"); + t = text(t_value); + set_style(option, "background-color", "var(--gray)"); + option.__value = /*name*/ ctx[7]; + option.value = option.__value; + add_location(option, file$5, 92, 8, 3418); + }, + m: function mount(target, anchor) { + insert_dev(target, option, anchor); + append_dev(option, t); + }, + p: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(option); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block$3.name, - type: "each", - source: "(92:6) {#each OPTIONS as name}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block$3.name, + type: "each", + source: "(92:6) {#each OPTIONS as name}", + ctx, + }); - return block; + return block; } function create_fragment$5(ctx) { - let div4; - let div0; - let div0_data_offset_value; - let t0; - let div2; - let div1; - let div1_class_value; - let div1_aria_valuenow_value; - let t1; - let span; - let div3; - let svg0; - let path0; - let t2; - let select; - let t3; - let svg1; - let path1; - let mounted; - let dispose; - let each_value = OPTIONS; - validate_each_argument(each_value); - let each_blocks = []; + let div4; + let div0; + let div0_data_offset_value; + let t0; + let div2; + let div1; + let div1_class_value; + let div1_aria_valuenow_value; + let t1; + let span; + let div3; + let svg0; + let path0; + let t2; + let select; + let t3; + let svg1; + let path1; + let mounted; + let dispose; + let each_value = OPTIONS; + validate_each_argument(each_value); + let each_blocks = []; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$3(get_each_context$3(ctx, each_value, i)); - } + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$3( + get_each_context$3(ctx, each_value, i), + ); + } - const block = { - c: function create() { - div4 = element("div"); - div0 = element("div"); - t0 = space(); - div2 = element("div"); - div1 = element("div"); - t1 = space(); - span = element("span"); - div3 = element("div"); - svg0 = svg_element("svg"); - path0 = svg_element("path"); - t2 = space(); - select = element("select"); + const block = { + c: function create() { + div4 = element("div"); + div0 = element("div"); + t0 = space(); + div2 = element("div"); + div1 = element("div"); + t1 = space(); + span = element("span"); + div3 = element("div"); + svg0 = svg_element("svg"); + path0 = svg_element("path"); + t2 = space(); + select = element("select"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - t3 = space(); - svg1 = svg_element("svg"); - path1 = svg_element("path"); - attr_dev(div0, "class", "scrubber-item svelte-zeu5yg"); - set_style(div0, "background-position", "-" + /*frame*/ ctx[0].offset[0] + "px -" + /*frame*/ ctx[0].offset[1] + "px"); - set_style(div0, "background-image", "url('" + /*url*/ ctx[1] + "')"); - attr_dev(div0, "data-offset", div0_data_offset_value = /*frame*/ ctx[0].offset); - add_location(div0, file$5, 47, 2, 1619); - attr_dev(div1, "class", div1_class_value = "progress-bar progress-bar-striped bg-" + confidence$1(/*frame*/ ctx[0].tag.prob) + " svelte-zeu5yg"); - attr_dev(div1, "role", "progressbar"); - set_style(div1, "width", /*frame*/ ctx[0].tag.prob * 100 + "%"); - attr_dev(div1, "aria-valuenow", div1_aria_valuenow_value = /*frame*/ ctx[0].tag.prob * 100); - attr_dev(div1, "aria-valuemin", 0); - attr_dev(div1, "aria-valuemax", 100); - add_location(div1, file$5, 59, 4, 1978); - attr_dev(div2, "class", "progress"); - set_style(div2, "height", "5px"); - add_location(div2, file$5, 58, 2, 1931); - attr_dev(path0, "d", "M313.4 32.9c26 5.2 42.9 30.5 37.7 56.5l-2.3 11.4c-5.3 26.7-15.1 52.1-28.8 75.2H464c26.5 0 48 21.5 48 48c0 18.5-10.5 34.6-25.9 42.6C497 275.4 504 288.9 504 304c0 23.4-16.8 42.9-38.9 47.1c4.4 7.3 6.9 15.8 6.9 24.9c0 21.3-13.9 39.4-33.1 45.6c.7 3.3 1.1 6.8 1.1 10.4c0 26.5-21.5 48-48 48H294.5c-19 0-37.5-5.6-53.3-16.1l-38.5-25.7C176 420.4 160 390.4 160 358.3V320 272 247.1c0-29.2 13.3-56.7 36-75l7.4-5.9c26.5-21.2 44.6-51 51.2-84.2l2.3-11.4c5.2-26 30.5-42.9 56.5-37.7zM32 192H96c17.7 0 32 14.3 32 32V448c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32V224c0-17.7 14.3-32 32-32z"); - add_location(path0, file$5, 81, 9, 2640); - attr_dev(svg0, "class", "tag-item-accept svelte-zeu5yg"); - attr_dev(svg0, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg0, "height", "1em"); - attr_dev(svg0, "viewBox", "0 0 512 512"); - add_location(svg0, file$5, 76, 6, 2500); - set_style(div3, "padding-right", "10px"); - set_style(div3, "display", "inline"); - add_location(div3, file$5, 70, 4, 2355); - set_style(select, "color", "#f5f8fa"); - attr_dev(select, "class", "tag-item-select svelte-zeu5yg"); - if (/*frame*/ ctx[0].tag.label === void 0) add_render_callback(() => /*select_change_handler*/ ctx[5].call(select)); - add_location(select, file$5, 86, 4, 3272); - attr_dev(path1, "d", "M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"); - add_location(path1, file$5, 105, 7, 3754); - attr_dev(svg1, "height", "20"); - attr_dev(svg1, "width", "20"); - attr_dev(svg1, "viewBox", "0 0 20 20"); - attr_dev(svg1, "aria-hidden", "true"); - attr_dev(svg1, "focusable", "false"); - attr_dev(svg1, "class", "tag-item-reject svelte-zeu5yg"); - add_location(svg1, file$5, 95, 4, 3526); - attr_dev(span, "class", "tag-item badge badge-secondary svelte-zeu5yg"); - add_location(span, file$5, 68, 2, 2244); - set_style(div4, "padding", "10px"); - add_location(div4, file$5, 45, 0, 1529); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div4, anchor); - append_dev(div4, div0); - append_dev(div4, t0); - append_dev(div4, div2); - append_dev(div2, div1); - append_dev(div4, t1); - append_dev(div4, span); - append_dev(span, div3); - append_dev(div3, svg0); - append_dev(svg0, path0); - append_dev(span, t2); - append_dev(span, select); + t3 = space(); + svg1 = svg_element("svg"); + path1 = svg_element("path"); + attr_dev(div0, "class", "scrubber-item svelte-zeu5yg"); + set_style( + div0, + "background-position", + "-" + + /*frame*/ ctx[0].offset[0] + + "px -" + + /*frame*/ ctx[0].offset[1] + + "px", + ); + set_style(div0, "background-image", "url('" + /*url*/ ctx[1] + "')"); + attr_dev( + div0, + "data-offset", + (div0_data_offset_value = /*frame*/ ctx[0].offset), + ); + add_location(div0, file$5, 47, 2, 1619); + attr_dev( + div1, + "class", + (div1_class_value = + "progress-bar progress-bar-striped bg-" + + confidence$1(/*frame*/ ctx[0].tag.prob) + + " svelte-zeu5yg"), + ); + attr_dev(div1, "role", "progressbar"); + set_style(div1, "width", /*frame*/ ctx[0].tag.prob * 100 + "%"); + attr_dev( + div1, + "aria-valuenow", + (div1_aria_valuenow_value = /*frame*/ ctx[0].tag.prob * 100), + ); + attr_dev(div1, "aria-valuemin", 0); + attr_dev(div1, "aria-valuemax", 100); + add_location(div1, file$5, 59, 4, 1978); + attr_dev(div2, "class", "progress"); + set_style(div2, "height", "5px"); + add_location(div2, file$5, 58, 2, 1931); + attr_dev( + path0, + "d", + "M313.4 32.9c26 5.2 42.9 30.5 37.7 56.5l-2.3 11.4c-5.3 26.7-15.1 52.1-28.8 75.2H464c26.5 0 48 21.5 48 48c0 18.5-10.5 34.6-25.9 42.6C497 275.4 504 288.9 504 304c0 23.4-16.8 42.9-38.9 47.1c4.4 7.3 6.9 15.8 6.9 24.9c0 21.3-13.9 39.4-33.1 45.6c.7 3.3 1.1 6.8 1.1 10.4c0 26.5-21.5 48-48 48H294.5c-19 0-37.5-5.6-53.3-16.1l-38.5-25.7C176 420.4 160 390.4 160 358.3V320 272 247.1c0-29.2 13.3-56.7 36-75l7.4-5.9c26.5-21.2 44.6-51 51.2-84.2l2.3-11.4c5.2-26 30.5-42.9 56.5-37.7zM32 192H96c17.7 0 32 14.3 32 32V448c0 17.7-14.3 32-32 32H32c-17.7 0-32-14.3-32-32V224c0-17.7 14.3-32 32-32z", + ); + add_location(path0, file$5, 81, 9, 2640); + attr_dev(svg0, "class", "tag-item-accept svelte-zeu5yg"); + attr_dev(svg0, "xmlns", "http://www.w3.org/2000/svg"); + attr_dev(svg0, "height", "1em"); + attr_dev(svg0, "viewBox", "0 0 512 512"); + add_location(svg0, file$5, 76, 6, 2500); + set_style(div3, "padding-right", "10px"); + set_style(div3, "display", "inline"); + add_location(div3, file$5, 70, 4, 2355); + set_style(select, "color", "#f5f8fa"); + attr_dev(select, "class", "tag-item-select svelte-zeu5yg"); + if (/*frame*/ ctx[0].tag.label === void 0) + add_render_callback(() => + /*select_change_handler*/ ctx[5].call(select), + ); + add_location(select, file$5, 86, 4, 3272); + attr_dev( + path1, + "d", + "M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z", + ); + add_location(path1, file$5, 105, 7, 3754); + attr_dev(svg1, "height", "20"); + attr_dev(svg1, "width", "20"); + attr_dev(svg1, "viewBox", "0 0 20 20"); + attr_dev(svg1, "aria-hidden", "true"); + attr_dev(svg1, "focusable", "false"); + attr_dev(svg1, "class", "tag-item-reject svelte-zeu5yg"); + add_location(svg1, file$5, 95, 4, 3526); + attr_dev(span, "class", "tag-item badge badge-secondary svelte-zeu5yg"); + add_location(span, file$5, 68, 2, 2244); + set_style(div4, "padding", "10px"); + add_location(div4, file$5, 45, 0, 1529); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + insert_dev(target, div4, anchor); + append_dev(div4, div0); + append_dev(div4, t0); + append_dev(div4, div2); + append_dev(div2, div1); + append_dev(div4, t1); + append_dev(div4, span); + append_dev(span, div3); + append_dev(div3, svg0); + append_dev(svg0, path0); + append_dev(span, t2); + append_dev(span, select); - for (let i = 0; i < each_blocks.length; i += 1) { - if (each_blocks[i]) { - each_blocks[i].m(select, null); - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(select, null); + } + } - select_option(select, /*frame*/ ctx[0].tag.label, true); - append_dev(span, t3); - append_dev(span, svg1); - append_dev(svg1, path1); + select_option(select, /*frame*/ ctx[0].tag.label, true); + append_dev(span, t3); + append_dev(span, svg1); + append_dev(svg1, path1); - if (!mounted) { - dispose = [ - listen_dev(div0, "click", /*click_handler*/ ctx[3], false, false, false, false), - listen_dev(div0, "mousemove", scrubberMove$1, false, false, false, false), - listen_dev(div0, "mouseleave", scrubberReset$1, false, false, false, false), - listen_dev(div3, "click", /*click_handler_1*/ ctx[4], { once: true }, false, false, false), - listen_dev(select, "change", /*select_change_handler*/ ctx[5]), - listen_dev(svg1, "click", /*click_handler_2*/ ctx[6], { once: true }, false, false, false) - ]; + if (!mounted) { + dispose = [ + listen_dev( + div0, + "click", + /*click_handler*/ ctx[3], + false, + false, + false, + false, + ), + listen_dev( + div0, + "mousemove", + scrubberMove$1, + false, + false, + false, + false, + ), + listen_dev( + div0, + "mouseleave", + scrubberReset$1, + false, + false, + false, + false, + ), + listen_dev( + div3, + "click", + /*click_handler_1*/ ctx[4], + { once: true }, + false, + false, + false, + ), + listen_dev(select, "change", /*select_change_handler*/ ctx[5]), + listen_dev( + svg1, + "click", + /*click_handler_2*/ ctx[6], + { once: true }, + false, + false, + false, + ), + ]; - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*frame*/ 1) { - set_style(div0, "background-position", "-" + /*frame*/ ctx[0].offset[0] + "px -" + /*frame*/ ctx[0].offset[1] + "px"); - } + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*frame*/ 1) { + set_style( + div0, + "background-position", + "-" + + /*frame*/ ctx[0].offset[0] + + "px -" + + /*frame*/ ctx[0].offset[1] + + "px", + ); + } - if (dirty & /*url*/ 2) { - set_style(div0, "background-image", "url('" + /*url*/ ctx[1] + "')"); - } + if (dirty & /*url*/ 2) { + set_style(div0, "background-image", "url('" + /*url*/ ctx[1] + "')"); + } - if (dirty & /*frame, OPTIONS*/ 1 && div0_data_offset_value !== (div0_data_offset_value = /*frame*/ ctx[0].offset)) { - attr_dev(div0, "data-offset", div0_data_offset_value); - } + if ( + dirty & /*frame, OPTIONS*/ 1 && + div0_data_offset_value !== + (div0_data_offset_value = /*frame*/ ctx[0].offset) + ) { + attr_dev(div0, "data-offset", div0_data_offset_value); + } - if (dirty & /*frame, OPTIONS*/ 1 && div1_class_value !== (div1_class_value = "progress-bar progress-bar-striped bg-" + confidence$1(/*frame*/ ctx[0].tag.prob) + " svelte-zeu5yg")) { - attr_dev(div1, "class", div1_class_value); - } + if ( + dirty & /*frame, OPTIONS*/ 1 && + div1_class_value !== + (div1_class_value = + "progress-bar progress-bar-striped bg-" + + confidence$1(/*frame*/ ctx[0].tag.prob) + + " svelte-zeu5yg") + ) { + attr_dev(div1, "class", div1_class_value); + } - if (dirty & /*frame*/ 1) { - set_style(div1, "width", /*frame*/ ctx[0].tag.prob * 100 + "%"); - } + if (dirty & /*frame*/ 1) { + set_style(div1, "width", /*frame*/ ctx[0].tag.prob * 100 + "%"); + } - if (dirty & /*frame, OPTIONS*/ 1 && div1_aria_valuenow_value !== (div1_aria_valuenow_value = /*frame*/ ctx[0].tag.prob * 100)) { - attr_dev(div1, "aria-valuenow", div1_aria_valuenow_value); - } + if ( + dirty & /*frame, OPTIONS*/ 1 && + div1_aria_valuenow_value !== + (div1_aria_valuenow_value = /*frame*/ ctx[0].tag.prob * 100) + ) { + attr_dev(div1, "aria-valuenow", div1_aria_valuenow_value); + } - if (dirty & /*OPTIONS*/ 0) { - each_value = OPTIONS; - validate_each_argument(each_value); - let i; + if (dirty & /*OPTIONS*/ 0) { + each_value = OPTIONS; + validate_each_argument(each_value); + let i; - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$3(ctx, each_value, i); + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$3(ctx, each_value, i); - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$3(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(select, null); - } - } + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$3(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(select, null); + } + } - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } - each_blocks.length = each_value.length; - } + each_blocks.length = each_value.length; + } - if (dirty & /*frame, OPTIONS*/ 1) { - select_option(select, /*frame*/ ctx[0].tag.label); - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div4); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; + if (dirty & /*frame, OPTIONS*/ 1) { + select_option(select, /*frame*/ ctx[0].tag.label); + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div4); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$5.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$5.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function confidence$1(prob) { - prob = prob * 100; + prob = prob * 100; - if (prob < 50.0) { - return "danger"; - } else if (prob < 75.0) { - return "warning"; - } else { - return "success"; - } + if (prob < 50.0) { + return "danger"; + } else if (prob < 75.0) { + return "warning"; + } else { + return "success"; + } } function scrubberMove$1(event) { - let target = event.target; - let imageWidth = 160; - let left = 53; - let right = 106; - let backgroundPosition = target.style.backgroundPosition.split(" "); - let offset = Number(target.getAttribute("data-offset").split(",")[0]); + let target = event.target; + let imageWidth = 160; + let left = 53; + let right = 106; + let backgroundPosition = target.style.backgroundPosition.split(" "); + let offset = Number(target.getAttribute("data-offset").split(",")[0]); - if (event.offsetX < left) { - backgroundPosition[0] = `-${offset - imageWidth}px`; - target.style.backgroundPosition = backgroundPosition.join(" "); - } else if (event.offsetX > left && event.offsetX < right) { - backgroundPosition[0] = `-${offset}px`; - target.style.backgroundPosition = backgroundPosition.join(" "); - } else if (event.offsetX > right) { - backgroundPosition[0] = `-${offset + imageWidth}px`; - target.style.backgroundPosition = backgroundPosition.join(" "); - } + if (event.offsetX < left) { + backgroundPosition[0] = `-${offset - imageWidth}px`; + target.style.backgroundPosition = backgroundPosition.join(" "); + } else if (event.offsetX > left && event.offsetX < right) { + backgroundPosition[0] = `-${offset}px`; + target.style.backgroundPosition = backgroundPosition.join(" "); + } else if (event.offsetX > right) { + backgroundPosition[0] = `-${offset + imageWidth}px`; + target.style.backgroundPosition = backgroundPosition.join(" "); + } } function scrubberReset$1(event) { - let backgroundPosition = event.target.style.backgroundPosition.split(" "); - let offset = Number(event.target.getAttribute("data-offset").split(",")[0]); - backgroundPosition[0] = `-${offset}px`; - event.target.style.backgroundPosition = backgroundPosition.join(" "); + let backgroundPosition = event.target.style.backgroundPosition.split(" "); + let offset = Number(event.target.getAttribute("data-offset").split(",")[0]); + backgroundPosition[0] = `-${offset}px`; + event.target.style.backgroundPosition = backgroundPosition.join(" "); } function instance$5($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('Marker', slots, []); - const dispatch = createEventDispatcher(); - let { frame } = $$props; - let { url = "" } = $$props; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Marker", slots, []); + const dispatch = createEventDispatcher(); + let { frame } = $$props; + let { url = "" } = $$props; - $$self.$$.on_mount.push(function () { - if (frame === undefined && !('frame' in $$props || $$self.$$.bound[$$self.$$.props['frame']])) { - console.warn(" was created without expected prop 'frame'"); - } - }); + $$self.$$.on_mount.push(function () { + if ( + frame === undefined && + !("frame" in $$props || $$self.$$.bound[$$self.$$.props["frame"]]) + ) { + console.warn(" was created without expected prop 'frame'"); + } + }); - const writable_props = ['frame', 'url']; + const writable_props = ["frame", "url"]; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - const click_handler = () => { - dispatch("select", frame); - }; + const click_handler = () => { + dispatch("select", frame); + }; - const click_handler_1 = () => { - dispatch("addMarker", frame); - }; + const click_handler_1 = () => { + dispatch("addMarker", frame); + }; - function select_change_handler() { - frame.tag.label = select_value(this); - $$invalidate(0, frame); - } + function select_change_handler() { + frame.tag.label = select_value(this); + $$invalidate(0, frame); + } - const click_handler_2 = () => { - dispatch("remove", frame.id); - }; + const click_handler_2 = () => { + dispatch("remove", frame.id); + }; - $$self.$$set = $$props => { - if ('frame' in $$props) $$invalidate(0, frame = $$props.frame); - if ('url' in $$props) $$invalidate(1, url = $$props.url); - }; + $$self.$$set = ($$props) => { + if ("frame" in $$props) $$invalidate(0, (frame = $$props.frame)); + if ("url" in $$props) $$invalidate(1, (url = $$props.url)); + }; - $$self.$capture_state = () => ({ - OPTIONS, - createEventDispatcher, - dispatch, - frame, - url, - confidence: confidence$1, - scrubberMove: scrubberMove$1, - scrubberReset: scrubberReset$1 - }); + $$self.$capture_state = () => ({ + OPTIONS, + createEventDispatcher, + dispatch, + frame, + url, + confidence: confidence$1, + scrubberMove: scrubberMove$1, + scrubberReset: scrubberReset$1, + }); - $$self.$inject_state = $$props => { - if ('frame' in $$props) $$invalidate(0, frame = $$props.frame); - if ('url' in $$props) $$invalidate(1, url = $$props.url); - }; + $$self.$inject_state = ($$props) => { + if ("frame" in $$props) $$invalidate(0, (frame = $$props.frame)); + if ("url" in $$props) $$invalidate(1, (url = $$props.url)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - return [ - frame, - url, - dispatch, - click_handler, - click_handler_1, - select_change_handler, - click_handler_2 - ]; + return [ + frame, + url, + dispatch, + click_handler, + click_handler_1, + select_change_handler, + click_handler_2, + ]; } class Marker extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$5, create_fragment$5, safe_not_equal, { frame: 0, url: 1 }); + constructor(options) { + super(options); + init(this, options, instance$5, create_fragment$5, safe_not_equal, { + frame: 0, + url: 1, + }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Marker", - options, - id: create_fragment$5.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Marker", + options, + id: create_fragment$5.name, + }); + } - get frame() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get frame() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set frame(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set frame(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get url() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get url() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set url(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set url(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } } function cubicOut(t) { - const f = t - 1.0; - return f * f * f + 1.0; + const f = t - 1.0; + return f * f * f + 1.0; } function quintOut(t) { - return --t * t * t * t * t + 1; + return --t * t * t * t * t + 1; } function flip(node, { from, to }, params = {}) { - const style = getComputedStyle(node); - const transform = style.transform === 'none' ? '' : style.transform; - const [ox, oy] = style.transformOrigin.split(' ').map(parseFloat); - const dx = (from.left + from.width * ox / to.width) - (to.left + ox); - const dy = (from.top + from.height * oy / to.height) - (to.top + oy); - const { delay = 0, duration = (d) => Math.sqrt(d) * 120, easing = cubicOut } = params; - return { - delay, - duration: is_function(duration) ? duration(Math.sqrt(dx * dx + dy * dy)) : duration, - easing, - css: (t, u) => { - const x = u * dx; - const y = u * dy; - const sx = t + u * from.width / to.width; - const sy = t + u * from.height / to.height; - return `transform: ${transform} translate(${x}px, ${y}px) scale(${sx}, ${sy});`; - } - }; + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + const [ox, oy] = style.transformOrigin.split(" ").map(parseFloat); + const dx = from.left + (from.width * ox) / to.width - (to.left + ox); + const dy = from.top + (from.height * oy) / to.height - (to.top + oy); + const { + delay = 0, + duration = (d) => Math.sqrt(d) * 120, + easing = cubicOut, + } = params; + return { + delay, + duration: is_function(duration) + ? duration(Math.sqrt(dx * dx + dy * dy)) + : duration, + easing, + css: (t, u) => { + const x = u * dx; + const y = u * dy; + const sx = t + (u * from.width) / to.width; + const sy = t + (u * from.height) / to.height; + return `transform: ${transform} translate(${x}px, ${y}px) scale(${sx}, ${sy});`; + }, + }; } function fade(node, { delay = 0, duration = 400, easing = identity } = {}) { - const o = +getComputedStyle(node).opacity; - return { - delay, - duration, - easing, - css: t => `opacity: ${t * o}` - }; + const o = +getComputedStyle(node).opacity; + return { + delay, + duration, + easing, + css: (t) => `opacity: ${t * o}`, + }; } - function fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 } = {}) { - const style = getComputedStyle(node); - const target_opacity = +style.opacity; - const transform = style.transform === 'none' ? '' : style.transform; - const od = target_opacity * (1 - opacity); - const [xValue, xUnit] = split_css_unit(x); - const [yValue, yUnit] = split_css_unit(y); - return { - delay, - duration, - easing, - css: (t, u) => ` + function fly( + node, + { + delay = 0, + duration = 400, + easing = cubicOut, + x = 0, + y = 0, + opacity = 0, + } = {}, + ) { + const style = getComputedStyle(node); + const target_opacity = +style.opacity; + const transform = style.transform === "none" ? "" : style.transform; + const od = target_opacity * (1 - opacity); + const [xValue, xUnit] = split_css_unit(x); + const [yValue, yUnit] = split_css_unit(y); + return { + delay, + duration, + easing, + css: (t, u) => ` transform: ${transform} translate(${(1 - t) * xValue}${xUnit}, ${(1 - t) * yValue}${yUnit}); - opacity: ${target_opacity - (od * u)}` - }; + opacity: ${target_opacity - od * u}`, + }; } /* src/MarkerMatches.svelte generated by Svelte v3.59.2 */ const file$4 = "src/MarkerMatches.svelte"; function get_each_context$2(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[19] = list[i]; - child_ctx[20] = list; - child_ctx[21] = i; - return child_ctx; + const child_ctx = ctx.slice(); + child_ctx[19] = list[i]; + child_ctx[20] = list; + child_ctx[21] = i; + return child_ctx; } // (97:10) {#each filteredFrames as frame (frame.id)} function create_each_block$2(key_1, ctx) { - let div; - let marker; - let updating_frame; - let t; - let div_intro; - let div_outro; - let rect; - let stop_animation = noop; - let current; + let div; + let marker; + let updating_frame; + let t; + let div_intro; + let div_outro; + let rect; + let stop_animation = noop; + let current; - function marker_frame_binding(value) { - /*marker_frame_binding*/ ctx[14](value, /*frame*/ ctx[19], /*each_value*/ ctx[20], /*frame_index*/ ctx[21]); - } + function marker_frame_binding(value) { + /*marker_frame_binding*/ ctx[14]( + value, + /*frame*/ ctx[19], + /*each_value*/ ctx[20], + /*frame_index*/ ctx[21], + ); + } - let marker_props = { url: /*url*/ ctx[1] }; + let marker_props = { url: /*url*/ ctx[1] }; - if (/*frame*/ ctx[19] !== void 0) { - marker_props.frame = /*frame*/ ctx[19]; - } + if (/*frame*/ ctx[19] !== void 0) { + marker_props.frame = /*frame*/ ctx[19]; + } - marker = new Marker({ props: marker_props, $$inline: true }); - binding_callbacks.push(() => bind(marker, 'frame', marker_frame_binding)); - marker.$on("addMarker", /*addMarker_handler*/ ctx[15]); - marker.$on("remove", /*remove_handler*/ ctx[16]); - marker.$on("select", /*select*/ ctx[7]); + marker = new Marker({ props: marker_props, $$inline: true }); + binding_callbacks.push(() => bind(marker, "frame", marker_frame_binding)); + marker.$on("addMarker", /*addMarker_handler*/ ctx[15]); + marker.$on("remove", /*remove_handler*/ ctx[16]); + marker.$on("select", /*select*/ ctx[7]); - const block = { - key: key_1, - first: null, - c: function create() { - div = element("div"); - create_component(marker.$$.fragment); - t = space(); - attr_dev(div, "class", "svelte-qsvzsw"); - toggle_class(div, "selected", /*selected*/ ctx[3] === /*frame*/ ctx[19].id); - add_location(div, file$4, 97, 12, 2701); - this.first = div; - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - mount_component(marker, div, null); - append_dev(div, t); - current = true; - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - const marker_changes = {}; - if (dirty & /*url*/ 2) marker_changes.url = /*url*/ ctx[1]; + const block = { + key: key_1, + first: null, + c: function create() { + div = element("div"); + create_component(marker.$$.fragment); + t = space(); + attr_dev(div, "class", "svelte-qsvzsw"); + toggle_class( + div, + "selected", + /*selected*/ ctx[3] === /*frame*/ ctx[19].id, + ); + add_location(div, file$4, 97, 12, 2701); + this.first = div; + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + mount_component(marker, div, null); + append_dev(div, t); + current = true; + }, + p: function update(new_ctx, dirty) { + ctx = new_ctx; + const marker_changes = {}; + if (dirty & /*url*/ 2) marker_changes.url = /*url*/ ctx[1]; - if (!updating_frame && dirty & /*filteredFrames*/ 32) { - updating_frame = true; - marker_changes.frame = /*frame*/ ctx[19]; - add_flush_callback(() => updating_frame = false); - } + if (!updating_frame && dirty & /*filteredFrames*/ 32) { + updating_frame = true; + marker_changes.frame = /*frame*/ ctx[19]; + add_flush_callback(() => (updating_frame = false)); + } - marker.$set(marker_changes); + marker.$set(marker_changes); - if (!current || dirty & /*selected, filteredFrames*/ 40) { - toggle_class(div, "selected", /*selected*/ ctx[3] === /*frame*/ ctx[19].id); - } - }, - r: function measure() { - rect = div.getBoundingClientRect(); - }, - f: function fix() { - fix_position(div); - stop_animation(); - add_transform(div, rect); - }, - a: function animate() { - stop_animation(); - stop_animation = create_animation(div, rect, flip, { duration: 250, easing: quintOut }); - }, - i: function intro(local) { - if (current) return; - transition_in(marker.$$.fragment, local); + if (!current || dirty & /*selected, filteredFrames*/ 40) { + toggle_class( + div, + "selected", + /*selected*/ ctx[3] === /*frame*/ ctx[19].id, + ); + } + }, + r: function measure() { + rect = div.getBoundingClientRect(); + }, + f: function fix() { + fix_position(div); + stop_animation(); + add_transform(div, rect); + }, + a: function animate() { + stop_animation(); + stop_animation = create_animation(div, rect, flip, { + duration: 250, + easing: quintOut, + }); + }, + i: function intro(local) { + if (current) return; + transition_in(marker.$$.fragment, local); - add_render_callback(() => { - if (!current) return; - if (div_outro) div_outro.end(1); - div_intro = create_in_transition(div, fade, {}); - div_intro.start(); - }); + add_render_callback(() => { + if (!current) return; + if (div_outro) div_outro.end(1); + div_intro = create_in_transition(div, fade, {}); + div_intro.start(); + }); - current = true; - }, - o: function outro(local) { - transition_out(marker.$$.fragment, local); - if (div_intro) div_intro.invalidate(); - div_outro = create_out_transition(div, fade, {}); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - destroy_component(marker); - if (detaching && div_outro) div_outro.end(); - } - }; + current = true; + }, + o: function outro(local) { + transition_out(marker.$$.fragment, local); + if (div_intro) div_intro.invalidate(); + div_outro = create_out_transition(div, fade, {}); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + destroy_component(marker); + if (detaching && div_outro) div_outro.end(); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block$2.name, - type: "each", - source: "(97:10) {#each filteredFrames as frame (frame.id)}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block$2.name, + type: "each", + source: "(97:10) {#each filteredFrames as frame (frame.id)}", + ctx, + }); - return block; + return block; } // (118:12) {#if saving} function create_if_block$1(ctx) { - let div; + let div; - const block = { - c: function create() { - div = element("div"); - attr_dev(div, "class", "lds-dual-ring"); - add_location(div, file$4, 118, 14, 3481); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; + const block = { + c: function create() { + div = element("div"); + attr_dev(div, "class", "lds-dual-ring"); + add_location(div, file$4, 118, 14, 3481); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block$1.name, - type: "if", - source: "(118:12) {#if saving}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block$1.name, + type: "if", + source: "(118:12) {#if saving}", + ctx, + }); - return block; + return block; } function create_fragment$4(ctx) { - let div7; - let div6; - let div5; - let div0; - let t0; - let input; - let t1; - let t2_value = /*threshold*/ ctx[0] * 100 + ""; - let t2; - let t3; - let t4; - let div2; - let div1; - let each_blocks = []; - let each_1_lookup = new Map(); - let t5; - let div4; - let div3; - let button0; - let t7; - let button1; - let t8; - let current; - let mounted; - let dispose; - let each_value = /*filteredFrames*/ ctx[5]; - validate_each_argument(each_value); - const get_key = ctx => /*frame*/ ctx[19].id; - validate_each_keys(ctx, each_value, get_each_context$2, get_key); + let div7; + let div6; + let div5; + let div0; + let t0; + let input; + let t1; + let t2_value = /*threshold*/ ctx[0] * 100 + ""; + let t2; + let t3; + let t4; + let div2; + let div1; + let each_blocks = []; + let each_1_lookup = new Map(); + let t5; + let div4; + let div3; + let button0; + let t7; + let button1; + let t8; + let current; + let mounted; + let dispose; + let each_value = /*filteredFrames*/ ctx[5]; + validate_each_argument(each_value); + const get_key = (ctx) => /*frame*/ ctx[19].id; + validate_each_keys(ctx, each_value, get_each_context$2, get_key); - for (let i = 0; i < each_value.length; i += 1) { - let child_ctx = get_each_context$2(ctx, each_value, i); - let key = get_key(child_ctx); - each_1_lookup.set(key, each_blocks[i] = create_each_block$2(key, child_ctx)); - } + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context$2(ctx, each_value, i); + let key = get_key(child_ctx); + each_1_lookup.set( + key, + (each_blocks[i] = create_each_block$2(key, child_ctx)), + ); + } - let if_block = /*saving*/ ctx[4] && create_if_block$1(ctx); + let if_block = /*saving*/ ctx[4] && create_if_block$1(ctx); - const block = { - c: function create() { - div7 = element("div"); - div6 = element("div"); - div5 = element("div"); - div0 = element("div"); - t0 = text("Threshold: "); - input = element("input"); - t1 = space(); - t2 = text(t2_value); - t3 = text(" %"); - t4 = space(); - div2 = element("div"); - div1 = element("div"); + const block = { + c: function create() { + div7 = element("div"); + div6 = element("div"); + div5 = element("div"); + div0 = element("div"); + t0 = text("Threshold: "); + input = element("input"); + t1 = space(); + t2 = text(t2_value); + t3 = text(" %"); + t4 = space(); + div2 = element("div"); + div1 = element("div"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - t5 = space(); - div4 = element("div"); - div3 = element("div"); - button0 = element("button"); - button0.textContent = "Close"; - t7 = space(); - button1 = element("button"); - if (if_block) if_block.c(); - t8 = text("\n Add All Markers"); - attr_dev(input, "type", "range"); - attr_dev(input, "min", "0.4"); - attr_dev(input, "max", "0.9"); - attr_dev(input, "step", "0.1"); - attr_dev(input, "id", "stash-tag-threshold"); - set_style(input, "margin", "0px"); - set_style(input, "height", "10px"); - add_location(input, file$4, 82, 19, 2204); - attr_dev(div0, "class", "modal-header svelte-qsvzsw"); - add_location(div0, file$4, 81, 6, 2158); - attr_dev(div1, "class", "row justify-content-center"); - add_location(div1, file$4, 95, 8, 2595); - attr_dev(div2, "class", "modal-body"); - add_location(div2, file$4, 94, 6, 2562); - attr_dev(button0, "id", "tags-cancel"); - attr_dev(button0, "type", "button"); - attr_dev(button0, "class", "ml-2 btn btn-secondary"); - add_location(button0, file$4, 110, 10, 3183); - attr_dev(button1, "id", "tags-accept"); - attr_dev(button1, "type", "button"); - attr_dev(button1, "class", "ml-2 btn btn-primary"); - add_location(button1, file$4, 116, 10, 3354); - add_location(div3, file$4, 109, 8, 3167); - attr_dev(div4, "class", "ModalFooter modal-footer svelte-qsvzsw"); - add_location(div4, file$4, 108, 6, 3120); - attr_dev(div5, "class", "modal-content"); - add_location(div5, file$4, 80, 4, 2124); - attr_dev(div6, "class", "modal-dialog modal-xl top-accent"); - add_location(div6, file$4, 79, 2, 2073); - attr_dev(div7, "class", "tagger-tabs svelte-qsvzsw"); - add_location(div7, file$4, 78, 0, 2028); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div7, anchor); - append_dev(div7, div6); - append_dev(div6, div5); - append_dev(div5, div0); - append_dev(div0, t0); - append_dev(div0, input); - set_input_value(input, /*threshold*/ ctx[0]); - append_dev(div0, t1); - append_dev(div0, t2); - append_dev(div0, t3); - append_dev(div5, t4); - append_dev(div5, div2); - append_dev(div2, div1); + t5 = space(); + div4 = element("div"); + div3 = element("div"); + button0 = element("button"); + button0.textContent = "Close"; + t7 = space(); + button1 = element("button"); + if (if_block) if_block.c(); + t8 = text("\n Add All Markers"); + attr_dev(input, "type", "range"); + attr_dev(input, "min", "0.4"); + attr_dev(input, "max", "0.9"); + attr_dev(input, "step", "0.1"); + attr_dev(input, "id", "stash-tag-threshold"); + set_style(input, "margin", "0px"); + set_style(input, "height", "10px"); + add_location(input, file$4, 82, 19, 2204); + attr_dev(div0, "class", "modal-header svelte-qsvzsw"); + add_location(div0, file$4, 81, 6, 2158); + attr_dev(div1, "class", "row justify-content-center"); + add_location(div1, file$4, 95, 8, 2595); + attr_dev(div2, "class", "modal-body"); + add_location(div2, file$4, 94, 6, 2562); + attr_dev(button0, "id", "tags-cancel"); + attr_dev(button0, "type", "button"); + attr_dev(button0, "class", "ml-2 btn btn-secondary"); + add_location(button0, file$4, 110, 10, 3183); + attr_dev(button1, "id", "tags-accept"); + attr_dev(button1, "type", "button"); + attr_dev(button1, "class", "ml-2 btn btn-primary"); + add_location(button1, file$4, 116, 10, 3354); + add_location(div3, file$4, 109, 8, 3167); + attr_dev(div4, "class", "ModalFooter modal-footer svelte-qsvzsw"); + add_location(div4, file$4, 108, 6, 3120); + attr_dev(div5, "class", "modal-content"); + add_location(div5, file$4, 80, 4, 2124); + attr_dev(div6, "class", "modal-dialog modal-xl top-accent"); + add_location(div6, file$4, 79, 2, 2073); + attr_dev(div7, "class", "tagger-tabs svelte-qsvzsw"); + add_location(div7, file$4, 78, 0, 2028); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + insert_dev(target, div7, anchor); + append_dev(div7, div6); + append_dev(div6, div5); + append_dev(div5, div0); + append_dev(div0, t0); + append_dev(div0, input); + set_input_value(input, /*threshold*/ ctx[0]); + append_dev(div0, t1); + append_dev(div0, t2); + append_dev(div0, t3); + append_dev(div5, t4); + append_dev(div5, div2); + append_dev(div2, div1); - for (let i = 0; i < each_blocks.length; i += 1) { - if (each_blocks[i]) { - each_blocks[i].m(div1, null); - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(div1, null); + } + } - append_dev(div5, t5); - append_dev(div5, div4); - append_dev(div4, div3); - append_dev(div3, button0); - append_dev(div3, t7); - append_dev(div3, button1); - if (if_block) if_block.m(button1, null); - append_dev(button1, t8); - /*div7_binding*/ ctx[17](div7); - current = true; + append_dev(div5, t5); + append_dev(div5, div4); + append_dev(div4, div3); + append_dev(div3, button0); + append_dev(div3, t7); + append_dev(div3, button1); + if (if_block) if_block.m(button1, null); + append_dev(button1, t8); + /*div7_binding*/ ctx[17](div7); + current = true; - if (!mounted) { - dispose = [ - listen_dev(input, "change", /*input_change_input_handler*/ ctx[12]), - listen_dev(input, "input", /*input_change_input_handler*/ ctx[12]), - listen_dev(input, "change", /*change_handler*/ ctx[13], false, false, false, false), - listen_dev(button0, "click", /*close*/ ctx[6], false, false, false, false), - listen_dev(button1, "click", /*saveAll*/ ctx[10], false, false, false, false) - ]; + if (!mounted) { + dispose = [ + listen_dev(input, "change", /*input_change_input_handler*/ ctx[12]), + listen_dev(input, "input", /*input_change_input_handler*/ ctx[12]), + listen_dev( + input, + "change", + /*change_handler*/ ctx[13], + false, + false, + false, + false, + ), + listen_dev( + button0, + "click", + /*close*/ ctx[6], + false, + false, + false, + false, + ), + listen_dev( + button1, + "click", + /*saveAll*/ ctx[10], + false, + false, + false, + false, + ), + ]; - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*threshold*/ 1) { - set_input_value(input, /*threshold*/ ctx[0]); - } + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*threshold*/ 1) { + set_input_value(input, /*threshold*/ ctx[0]); + } - if ((!current || dirty & /*threshold*/ 1) && t2_value !== (t2_value = /*threshold*/ ctx[0] * 100 + "")) set_data_dev(t2, t2_value); + if ( + (!current || dirty & /*threshold*/ 1) && + t2_value !== (t2_value = /*threshold*/ ctx[0] * 100 + "") + ) + set_data_dev(t2, t2_value); - if (dirty & /*selected, filteredFrames, url, addMarker, remove, select*/ 938) { - each_value = /*filteredFrames*/ ctx[5]; - validate_each_argument(each_value); - group_outros(); - for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); - validate_each_keys(ctx, each_value, get_each_context$2, get_key); - each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each_1_lookup, div1, fix_and_outro_and_destroy_block, create_each_block$2, null, get_each_context$2); - for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); - check_outros(); - } + if ( + dirty & + /*selected, filteredFrames, url, addMarker, remove, select*/ 938 + ) { + each_value = /*filteredFrames*/ ctx[5]; + validate_each_argument(each_value); + group_outros(); + for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); + validate_each_keys(ctx, each_value, get_each_context$2, get_key); + each_blocks = update_keyed_each( + each_blocks, + dirty, + get_key, + 1, + ctx, + each_value, + each_1_lookup, + div1, + fix_and_outro_and_destroy_block, + create_each_block$2, + null, + get_each_context$2, + ); + for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); + check_outros(); + } - if (/*saving*/ ctx[4]) { - if (if_block) ; else { - if_block = create_if_block$1(ctx); - if_block.c(); - if_block.m(button1, t8); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } - }, - i: function intro(local) { - if (current) return; + if (/*saving*/ ctx[4]) { + if (if_block); + else { + if_block = create_if_block$1(ctx); + if_block.c(); + if_block.m(button1, t8); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } + }, + i: function intro(local) { + if (current) return; - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } - current = true; - }, - o: function outro(local) { - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } + current = true; + }, + o: function outro(local) { + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div7); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div7); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].d(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } - if (if_block) if_block.d(); - /*div7_binding*/ ctx[17](null); - mounted = false; - run_all(dispose); - } - }; + if (if_block) if_block.d(); + /*div7_binding*/ ctx[17](null); + mounted = false; + run_all(dispose); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$4.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$4.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function getCurrentVideo() { - return document.querySelector("#VideoJsPlayer_html5_api"); + return document.querySelector("#VideoJsPlayer_html5_api"); } async function playVideoAtTime(time) { - const video = getCurrentVideo(); - await video.play(); - video.currentTime = time; + const video = getCurrentVideo(); + await video.play(); + video.currentTime = time; } function instance$4($$self, $$props, $$invalidate) { - let filteredFrames; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('MarkerMatches', slots, []); - let { url = "" } = $$props; - let { frames = [] } = $$props; - let { threshold = 0.4 } = $$props; - let tags; - let self; - let selected = null; - let saving = false; + let filteredFrames; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("MarkerMatches", slots, []); + let { url = "" } = $$props; + let { frames = [] } = $$props; + let { threshold = 0.4 } = $$props; + let tags; + let self; + let selected = null; + let saving = false; - onMount(async () => { - tags = await getAllTags(); - $$invalidate(0, threshold = Number(localStorage.getItem('stash-marker-threshold')) || 0.4); - }); + onMount(async () => { + tags = await getAllTags(); + $$invalidate( + 0, + (threshold = + Number(localStorage.getItem("stash-marker-threshold")) || 0.4), + ); + }); - async function close() { - self.remove(); - } + async function close() { + self.remove(); + } - function select(event) { - let frame = event.detail; + function select(event) { + let frame = event.detail; - if (selected === frame.id) { - $$invalidate(3, selected = null); - } else { - $$invalidate(3, selected = frame.id); - playVideoAtTime(frame.time); - } - } + if (selected === frame.id) { + $$invalidate(3, (selected = null)); + } else { + $$invalidate(3, (selected = frame.id)); + playVideoAtTime(frame.time); + } + } - async function remove(id) { - $$invalidate(11, frames = frames.filter(x => x.id !== id)); - } + async function remove(id) { + $$invalidate(11, (frames = frames.filter((x) => x.id !== id))); + } - async function addMarker(frame) { - const [,scene_id] = getScenarioAndID(); - let time; - let tagId; - const tagLower = frame.tag.label.toLowerCase(); + async function addMarker(frame) { + const [, scene_id] = getScenarioAndID(); + let time; + let tagId; + const tagLower = frame.tag.label.toLowerCase(); - if (tags[tagLower] === undefined) { - const tagID = await createTag(tagLower); - tags[tagLower] = tagID; - tagId = tagID; - } else { - tagId = tags[tagLower]; - } + if (tags[tagLower] === undefined) { + const tagID = await createTag(tagLower); + tags[tagLower] = tagID; + tagId = tagID; + } else { + tagId = tags[tagLower]; + } - if (selected && selected === frame.id) { - const video = getCurrentVideo(); - time = video.currentTime; - } else { - time = frame.time; - } + if (selected && selected === frame.id) { + const video = getCurrentVideo(); + time = video.currentTime; + } else { + time = frame.time; + } - await createMarker(scene_id, tagId, time); - remove(frame.id); - $$invalidate(3, selected = null); - } + await createMarker(scene_id, tagId, time); + remove(frame.id); + $$invalidate(3, (selected = null)); + } - async function saveAll() { - $$invalidate(3, selected = null); - $$invalidate(4, saving = true); + async function saveAll() { + $$invalidate(3, (selected = null)); + $$invalidate(4, (saving = true)); - for (const frame of filteredFrames) { - await addMarker(frame); - } + for (const frame of filteredFrames) { + await addMarker(frame); + } - $$invalidate(4, saving = false); - window.location.reload(); - close(); - } + $$invalidate(4, (saving = false)); + window.location.reload(); + close(); + } - const writable_props = ['url', 'frames', 'threshold']; + const writable_props = ["url", "frames", "threshold"]; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - function input_change_input_handler() { - threshold = to_number(this.value); - $$invalidate(0, threshold); - } + function input_change_input_handler() { + threshold = to_number(this.value); + $$invalidate(0, threshold); + } - const change_handler = () => { - localStorage.setItem("stash-marker-threshold", String(threshold)); - }; + const change_handler = () => { + localStorage.setItem("stash-marker-threshold", String(threshold)); + }; - function marker_frame_binding(value, frame, each_value, frame_index) { - each_value[frame_index] = value; - (($$invalidate(5, filteredFrames), $$invalidate(11, frames)), $$invalidate(0, threshold)); - } + function marker_frame_binding(value, frame, each_value, frame_index) { + each_value[frame_index] = value; + ($$invalidate(5, filteredFrames), $$invalidate(11, frames)), + $$invalidate(0, threshold); + } - const addMarker_handler = event => { - addMarker(event.detail); - }; + const addMarker_handler = (event) => { + addMarker(event.detail); + }; - const remove_handler = event => { - remove(event.detail); - }; + const remove_handler = (event) => { + remove(event.detail); + }; - function div7_binding($$value) { - binding_callbacks[$$value ? 'unshift' : 'push'](() => { - self = $$value; - $$invalidate(2, self); - }); - } + function div7_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + self = $$value; + $$invalidate(2, self); + }); + } - $$self.$$set = $$props => { - if ('url' in $$props) $$invalidate(1, url = $$props.url); - if ('frames' in $$props) $$invalidate(11, frames = $$props.frames); - if ('threshold' in $$props) $$invalidate(0, threshold = $$props.threshold); - }; + $$self.$$set = ($$props) => { + if ("url" in $$props) $$invalidate(1, (url = $$props.url)); + if ("frames" in $$props) $$invalidate(11, (frames = $$props.frames)); + if ("threshold" in $$props) + $$invalidate(0, (threshold = $$props.threshold)); + }; - $$self.$capture_state = () => ({ - Marker, - flip, - quintOut, - fade, - createMarker, - getAllTags, - createTag, - getScenarioAndID, - onMount, - url, - frames, - threshold, - tags, - self, - selected, - saving, - getCurrentVideo, - close, - select, - playVideoAtTime, - remove, - addMarker, - saveAll, - filteredFrames - }); + $$self.$capture_state = () => ({ + Marker, + flip, + quintOut, + fade, + createMarker, + getAllTags, + createTag, + getScenarioAndID, + onMount, + url, + frames, + threshold, + tags, + self, + selected, + saving, + getCurrentVideo, + close, + select, + playVideoAtTime, + remove, + addMarker, + saveAll, + filteredFrames, + }); - $$self.$inject_state = $$props => { - if ('url' in $$props) $$invalidate(1, url = $$props.url); - if ('frames' in $$props) $$invalidate(11, frames = $$props.frames); - if ('threshold' in $$props) $$invalidate(0, threshold = $$props.threshold); - if ('tags' in $$props) tags = $$props.tags; - if ('self' in $$props) $$invalidate(2, self = $$props.self); - if ('selected' in $$props) $$invalidate(3, selected = $$props.selected); - if ('saving' in $$props) $$invalidate(4, saving = $$props.saving); - if ('filteredFrames' in $$props) $$invalidate(5, filteredFrames = $$props.filteredFrames); - }; + $$self.$inject_state = ($$props) => { + if ("url" in $$props) $$invalidate(1, (url = $$props.url)); + if ("frames" in $$props) $$invalidate(11, (frames = $$props.frames)); + if ("threshold" in $$props) + $$invalidate(0, (threshold = $$props.threshold)); + if ("tags" in $$props) tags = $$props.tags; + if ("self" in $$props) $$invalidate(2, (self = $$props.self)); + if ("selected" in $$props) $$invalidate(3, (selected = $$props.selected)); + if ("saving" in $$props) $$invalidate(4, (saving = $$props.saving)); + if ("filteredFrames" in $$props) + $$invalidate(5, (filteredFrames = $$props.filteredFrames)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - $$self.$$.update = () => { - if ($$self.$$.dirty & /*frames, threshold*/ 2049) { - $$invalidate(5, filteredFrames = frames.filter(x => x.tag.prob > threshold)); - } - }; + $$self.$$.update = () => { + if ($$self.$$.dirty & /*frames, threshold*/ 2049) { + $$invalidate( + 5, + (filteredFrames = frames.filter((x) => x.tag.prob > threshold)), + ); + } + }; - return [ - threshold, - url, - self, - selected, - saving, - filteredFrames, - close, - select, - remove, - addMarker, - saveAll, - frames, - input_change_input_handler, - change_handler, - marker_frame_binding, - addMarker_handler, - remove_handler, - div7_binding - ]; + return [ + threshold, + url, + self, + selected, + saving, + filteredFrames, + close, + select, + remove, + addMarker, + saveAll, + frames, + input_change_input_handler, + change_handler, + marker_frame_binding, + addMarker_handler, + remove_handler, + div7_binding, + ]; } class MarkerMatches extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$4, create_fragment$4, safe_not_equal, { url: 1, frames: 11, threshold: 0 }); + constructor(options) { + super(options); + init(this, options, instance$4, create_fragment$4, safe_not_equal, { + url: 1, + frames: 11, + threshold: 0, + }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "MarkerMatches", - options, - id: create_fragment$4.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "MarkerMatches", + options, + id: create_fragment$4.name, + }); + } - get url() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get url() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set url(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set url(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get frames() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get frames() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set frames(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set frames(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get threshold() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get threshold() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set threshold(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set threshold(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } } /* src/MarkerButton.svelte generated by Svelte v3.59.2 */ const file$3 = "src/MarkerButton.svelte"; function create_fragment$3(ctx) { - let button; - let svg; - let path; - let mounted; - let dispose; + let button; + let svg; + let path; + let mounted; + let dispose; - const block = { - c: function create() { - button = element("button"); - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "d", "M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z"); - add_location(path, file$3, 70, 77, 2369); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg, "height", "1em"); - attr_dev(svg, "viewBox", "0 0 384 512"); - attr_dev(svg, "class", "svelte-1m5gxnd"); - add_location(svg, file$3, 70, 2, 2294); - attr_dev(button, "id", "stashmarker"); - attr_dev(button, "title", "Scan for markers"); - attr_dev(button, "class", "svelte-1m5gxnd"); - toggle_class(button, "scanner", /*scanner*/ ctx[0]); - add_location(button, file$3, 69, 0, 2205); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, button, anchor); - append_dev(button, svg); - append_dev(svg, path); + const block = { + c: function create() { + button = element("button"); + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev( + path, + "d", + "M215.7 499.2C267 435 384 279.4 384 192C384 86 298 0 192 0S0 86 0 192c0 87.4 117 243 168.3 307.2c12.3 15.3 35.1 15.3 47.4 0zM192 128a64 64 0 1 1 0 128 64 64 0 1 1 0-128z", + ); + add_location(path, file$3, 70, 77, 2369); + attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); + attr_dev(svg, "height", "1em"); + attr_dev(svg, "viewBox", "0 0 384 512"); + attr_dev(svg, "class", "svelte-1m5gxnd"); + add_location(svg, file$3, 70, 2, 2294); + attr_dev(button, "id", "stashmarker"); + attr_dev(button, "title", "Scan for markers"); + attr_dev(button, "class", "svelte-1m5gxnd"); + toggle_class(button, "scanner", /*scanner*/ ctx[0]); + add_location(button, file$3, 69, 0, 2205); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + insert_dev(target, button, anchor); + append_dev(button, svg); + append_dev(svg, path); - if (!mounted) { - dispose = listen_dev(button, "click", /*getMarkers*/ ctx[1], false, false, false, false); - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*scanner*/ 1) { - toggle_class(button, "scanner", /*scanner*/ ctx[0]); - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(button); - mounted = false; - dispose(); - } - }; + if (!mounted) { + dispose = listen_dev( + button, + "click", + /*getMarkers*/ ctx[1], + false, + false, + false, + false, + ); + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*scanner*/ 1) { + toggle_class(button, "scanner", /*scanner*/ ctx[0]); + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(button); + mounted = false; + dispose(); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$3.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$3.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } async function download(url) { - const vblob = await fetch(url).then(res => res.blob()); + const vblob = await fetch(url).then((res) => res.blob()); - return new Promise(resolve => { - let reader = new FileReader(); - reader.onload = () => resolve(reader.result); - reader.readAsDataURL(vblob); - }); + return new Promise((resolve) => { + let reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.readAsDataURL(vblob); + }); } function instance$3($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('MarkerButton', slots, []); - let scanner = false; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("MarkerButton", slots, []); + let scanner = false; - async function getMarkers() { - $$invalidate(0, scanner = true); - const [,scene_id] = getScenarioAndID(); - let url = await getUrlSprite(scene_id); + async function getMarkers() { + $$invalidate(0, (scanner = true)); + const [, scene_id] = getScenarioAndID(); + let url = await getUrlSprite(scene_id); - if (!url) { - alert("No sprite found, please ensure you have sprites enabled and generated for your scenes."); - $$invalidate(0, scanner = false); - return; - } + if (!url) { + alert( + "No sprite found, please ensure you have sprites enabled and generated for your scenes.", + ); + $$invalidate(0, (scanner = false)); + return; + } - // get image blob - let image = await download(url); + // get image blob + let image = await download(url); - // get vtt blob - const vtt_url = url.replace("_sprite.jpg", "_thumbs.vtt"); + // get vtt blob + const vtt_url = url.replace("_sprite.jpg", "_thumbs.vtt"); - let vtt = await download(vtt_url); + let vtt = await download(vtt_url); - // query the api with a threshold of 0.4 as we want to do the filtering ourselves - var data = { "data": [image, vtt, 0.4] }; + // query the api with a threshold of 0.4 as we want to do the filtering ourselves + var data = { data: [image, vtt, 0.4] }; - fetch(STASHMARKER_API_URL + "_1", { - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8" - }, - body: JSON.stringify(data) - }).then(response => { - if (response.status !== 200) { - $$invalidate(0, scanner = false); - alert("Something went wrong. It's likely a server issue, Please try again later."); - return; - } + fetch(STASHMARKER_API_URL + "_1", { + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8", + }, + body: JSON.stringify(data), + }) + .then((response) => { + if (response.status !== 200) { + $$invalidate(0, (scanner = false)); + alert( + "Something went wrong. It's likely a server issue, Please try again later.", + ); + return; + } - return response.json(); - }).then(data => { - $$invalidate(0, scanner = false); - let frames = data.data[0]; - $$invalidate(0, scanner = false); + return response.json(); + }) + .then((data) => { + $$invalidate(0, (scanner = false)); + let frames = data.data[0]; + $$invalidate(0, (scanner = false)); - if (frames.length === 0) { - alert("No tags found"); - return; - } + if (frames.length === 0) { + alert("No tags found"); + return; + } - // find a div with class row - let row = document.querySelector(".row"); + // find a div with class row + let row = document.querySelector(".row"); - new MarkerMatches({ target: row, props: { frames, url } }); - }).catch(error => { - $$invalidate(0, scanner = false); + new MarkerMatches({ target: row, props: { frames, url } }); + }) + .catch((error) => { + $$invalidate(0, (scanner = false)); - if (error.message === "") { - alert("Error: Service may be down. please try again later."); - } else { - alert("Error: " + error.message); - } - }); - } + if (error.message === "") { + alert("Error: Service may be down. please try again later."); + } else { + alert("Error: " + error.message); + } + }); + } - const writable_props = []; + const writable_props = []; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - $$self.$capture_state = () => ({ - getScenarioAndID, - getUrlSprite, - STASHMARKER_API_URL, - MarkerMatches, - scanner, - download, - getMarkers - }); + $$self.$capture_state = () => ({ + getScenarioAndID, + getUrlSprite, + STASHMARKER_API_URL, + MarkerMatches, + scanner, + download, + getMarkers, + }); - $$self.$inject_state = $$props => { - if ('scanner' in $$props) $$invalidate(0, scanner = $$props.scanner); - }; + $$self.$inject_state = ($$props) => { + if ("scanner" in $$props) $$invalidate(0, (scanner = $$props.scanner)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - return [scanner, getMarkers]; + return [scanner, getMarkers]; } class MarkerButton extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$3, create_fragment$3, safe_not_equal, {}); + constructor(options) { + super(options); + init(this, options, instance$3, create_fragment$3, safe_not_equal, {}); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "MarkerButton", - options, - id: create_fragment$3.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "MarkerButton", + options, + id: create_fragment$3.name, + }); + } } /* src/Tag.svelte generated by Svelte v3.59.2 */ const file$2 = "src/Tag.svelte"; function get_each_context$1(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[0] = list[i]; - return child_ctx; + const child_ctx = ctx.slice(); + child_ctx[0] = list[i]; + return child_ctx; } // (74:6) {#each OPTIONS as name} function create_each_block$1(ctx) { - let option; - let t_value = /*name*/ ctx[0] + ""; - let t; + let option; + let t_value = /*name*/ ctx[0] + ""; + let t; - const block = { - c: function create() { - option = element("option"); - t = text(t_value); - set_style(option, "color", "#f5f8fa"); - option.__value = /*name*/ ctx[0]; - option.value = option.__value; - add_location(option, file$2, 74, 8, 2272); - }, - m: function mount(target, anchor) { - insert_dev(target, option, anchor); - append_dev(option, t); - }, - p: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(option); - } - }; + const block = { + c: function create() { + option = element("option"); + t = text(t_value); + set_style(option, "color", "#f5f8fa"); + option.__value = /*name*/ ctx[0]; + option.value = option.__value; + add_location(option, file$2, 74, 8, 2272); + }, + m: function mount(target, anchor) { + insert_dev(target, option, anchor); + append_dev(option, t); + }, + p: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(option); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block$1.name, - type: "each", - source: "(74:6) {#each OPTIONS as name}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block$1.name, + type: "each", + source: "(74:6) {#each OPTIONS as name}", + ctx, + }); - return block; + return block; } function create_fragment$2(ctx) { - let div3; - let div0; - let div0_data_offset_value; - let t0; - let div2; - let div1; - let div1_class_value; - let div1_aria_valuenow_value; - let t1; - let span; - let select; - let t2; - let svg; - let path; - let mounted; - let dispose; - let each_value = OPTIONS; - validate_each_argument(each_value); - let each_blocks = []; + let div3; + let div0; + let div0_data_offset_value; + let t0; + let div2; + let div1; + let div1_class_value; + let div1_aria_valuenow_value; + let t1; + let span; + let select; + let t2; + let svg; + let path; + let mounted; + let dispose; + let each_value = OPTIONS; + validate_each_argument(each_value); + let each_blocks = []; - for (let i = 0; i < each_value.length; i += 1) { - each_blocks[i] = create_each_block$1(get_each_context$1(ctx, each_value, i)); - } + for (let i = 0; i < each_value.length; i += 1) { + each_blocks[i] = create_each_block$1( + get_each_context$1(ctx, each_value, i), + ); + } - const block = { - c: function create() { - div3 = element("div"); - div0 = element("div"); - t0 = space(); - div2 = element("div"); - div1 = element("div"); - t1 = space(); - span = element("span"); - select = element("select"); + const block = { + c: function create() { + div3 = element("div"); + div0 = element("div"); + t0 = space(); + div2 = element("div"); + div1 = element("div"); + t1 = space(); + span = element("span"); + select = element("select"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - t2 = space(); - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(div0, "class", "scrubber-item svelte-1d03wug"); - set_style(div0, "background-position", "-" + /*data*/ ctx[1].offset[0] + "px -" + /*data*/ ctx[1].offset[1] + "px"); - set_style(div0, "background-image", "url('" + /*url*/ ctx[2] + "')"); - attr_dev(div0, "data-offset", div0_data_offset_value = /*data*/ ctx[1].offset); - add_location(div0, file$2, 54, 2, 1571); - attr_dev(div1, "class", div1_class_value = "progress-bar progress-bar-striped bg-" + confidence(/*data*/ ctx[1].prob) + " svelte-1d03wug"); - attr_dev(div1, "role", "progressbar"); - set_style(div1, "width", /*data*/ ctx[1].prob * 100 + "%"); - attr_dev(div1, "aria-valuenow", div1_aria_valuenow_value = /*data*/ ctx[1].prob * 100); - attr_dev(div1, "aria-valuemin", "0"); - attr_dev(div1, "aria-valuemax", "100"); - add_location(div1, file$2, 62, 4, 1858); - attr_dev(div2, "class", "progress"); - set_style(div2, "height", "5px"); - add_location(div2, file$2, 61, 2, 1811); - set_style(select, "color", "#f5f8fa"); - attr_dev(select, "class", "tag-item-select svelte-1d03wug"); - if (/*name*/ ctx[0] === void 0) add_render_callback(() => /*select_change_handler*/ ctx[4].call(select)); - add_location(select, file$2, 72, 4, 2159); - attr_dev(path, "d", "M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"); - add_location(path, file$2, 87, 7, 2586); - attr_dev(svg, "height", "20"); - attr_dev(svg, "width", "20"); - attr_dev(svg, "viewBox", "0 0 20 20"); - attr_dev(svg, "aria-hidden", "true"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "class", "tag-item-reject svelte-1d03wug"); - add_location(svg, file$2, 77, 4, 2364); - attr_dev(span, "class", "tag-item badge badge-secondary svelte-1d03wug"); - add_location(span, file$2, 71, 2, 2109); - set_style(div3, "padding", "20px"); - add_location(div3, file$2, 53, 0, 1540); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div3, anchor); - append_dev(div3, div0); - append_dev(div3, t0); - append_dev(div3, div2); - append_dev(div2, div1); - append_dev(div3, t1); - append_dev(div3, span); - append_dev(span, select); + t2 = space(); + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev(div0, "class", "scrubber-item svelte-1d03wug"); + set_style( + div0, + "background-position", + "-" + + /*data*/ ctx[1].offset[0] + + "px -" + + /*data*/ ctx[1].offset[1] + + "px", + ); + set_style(div0, "background-image", "url('" + /*url*/ ctx[2] + "')"); + attr_dev( + div0, + "data-offset", + (div0_data_offset_value = /*data*/ ctx[1].offset), + ); + add_location(div0, file$2, 54, 2, 1571); + attr_dev( + div1, + "class", + (div1_class_value = + "progress-bar progress-bar-striped bg-" + + confidence(/*data*/ ctx[1].prob) + + " svelte-1d03wug"), + ); + attr_dev(div1, "role", "progressbar"); + set_style(div1, "width", /*data*/ ctx[1].prob * 100 + "%"); + attr_dev( + div1, + "aria-valuenow", + (div1_aria_valuenow_value = /*data*/ ctx[1].prob * 100), + ); + attr_dev(div1, "aria-valuemin", "0"); + attr_dev(div1, "aria-valuemax", "100"); + add_location(div1, file$2, 62, 4, 1858); + attr_dev(div2, "class", "progress"); + set_style(div2, "height", "5px"); + add_location(div2, file$2, 61, 2, 1811); + set_style(select, "color", "#f5f8fa"); + attr_dev(select, "class", "tag-item-select svelte-1d03wug"); + if (/*name*/ ctx[0] === void 0) + add_render_callback(() => + /*select_change_handler*/ ctx[4].call(select), + ); + add_location(select, file$2, 72, 4, 2159); + attr_dev( + path, + "d", + "M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z", + ); + add_location(path, file$2, 87, 7, 2586); + attr_dev(svg, "height", "20"); + attr_dev(svg, "width", "20"); + attr_dev(svg, "viewBox", "0 0 20 20"); + attr_dev(svg, "aria-hidden", "true"); + attr_dev(svg, "focusable", "false"); + attr_dev(svg, "class", "tag-item-reject svelte-1d03wug"); + add_location(svg, file$2, 77, 4, 2364); + attr_dev( + span, + "class", + "tag-item badge badge-secondary svelte-1d03wug", + ); + add_location(span, file$2, 71, 2, 2109); + set_style(div3, "padding", "20px"); + add_location(div3, file$2, 53, 0, 1540); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + insert_dev(target, div3, anchor); + append_dev(div3, div0); + append_dev(div3, t0); + append_dev(div3, div2); + append_dev(div2, div1); + append_dev(div3, t1); + append_dev(div3, span); + append_dev(span, select); - for (let i = 0; i < each_blocks.length; i += 1) { - if (each_blocks[i]) { - each_blocks[i].m(select, null); - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(select, null); + } + } - select_option(select, /*name*/ ctx[0], true); - append_dev(span, t2); - append_dev(span, svg); - append_dev(svg, path); + select_option(select, /*name*/ ctx[0], true); + append_dev(span, t2); + append_dev(span, svg); + append_dev(svg, path); - if (!mounted) { - dispose = [ - listen_dev(div0, "mousemove", scrubberMove, false, false, false, false), - listen_dev(div0, "mouseleave", scrubberReset, false, false, false, false), - listen_dev(select, "change", /*select_change_handler*/ ctx[4]), - listen_dev(svg, "click", /*click_handler*/ ctx[5], false, false, false, false) - ]; + if (!mounted) { + dispose = [ + listen_dev( + div0, + "mousemove", + scrubberMove, + false, + false, + false, + false, + ), + listen_dev( + div0, + "mouseleave", + scrubberReset, + false, + false, + false, + false, + ), + listen_dev(select, "change", /*select_change_handler*/ ctx[4]), + listen_dev( + svg, + "click", + /*click_handler*/ ctx[5], + false, + false, + false, + false, + ), + ]; - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*data*/ 2) { - set_style(div0, "background-position", "-" + /*data*/ ctx[1].offset[0] + "px -" + /*data*/ ctx[1].offset[1] + "px"); - } + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*data*/ 2) { + set_style( + div0, + "background-position", + "-" + + /*data*/ ctx[1].offset[0] + + "px -" + + /*data*/ ctx[1].offset[1] + + "px", + ); + } - if (dirty & /*url*/ 4) { - set_style(div0, "background-image", "url('" + /*url*/ ctx[2] + "')"); - } + if (dirty & /*url*/ 4) { + set_style(div0, "background-image", "url('" + /*url*/ ctx[2] + "')"); + } - if (dirty & /*data*/ 2 && div0_data_offset_value !== (div0_data_offset_value = /*data*/ ctx[1].offset)) { - attr_dev(div0, "data-offset", div0_data_offset_value); - } + if ( + dirty & /*data*/ 2 && + div0_data_offset_value !== + (div0_data_offset_value = /*data*/ ctx[1].offset) + ) { + attr_dev(div0, "data-offset", div0_data_offset_value); + } - if (dirty & /*data*/ 2 && div1_class_value !== (div1_class_value = "progress-bar progress-bar-striped bg-" + confidence(/*data*/ ctx[1].prob) + " svelte-1d03wug")) { - attr_dev(div1, "class", div1_class_value); - } + if ( + dirty & /*data*/ 2 && + div1_class_value !== + (div1_class_value = + "progress-bar progress-bar-striped bg-" + + confidence(/*data*/ ctx[1].prob) + + " svelte-1d03wug") + ) { + attr_dev(div1, "class", div1_class_value); + } - if (dirty & /*data*/ 2) { - set_style(div1, "width", /*data*/ ctx[1].prob * 100 + "%"); - } + if (dirty & /*data*/ 2) { + set_style(div1, "width", /*data*/ ctx[1].prob * 100 + "%"); + } - if (dirty & /*data*/ 2 && div1_aria_valuenow_value !== (div1_aria_valuenow_value = /*data*/ ctx[1].prob * 100)) { - attr_dev(div1, "aria-valuenow", div1_aria_valuenow_value); - } + if ( + dirty & /*data*/ 2 && + div1_aria_valuenow_value !== + (div1_aria_valuenow_value = /*data*/ ctx[1].prob * 100) + ) { + attr_dev(div1, "aria-valuenow", div1_aria_valuenow_value); + } - if (dirty & /*OPTIONS*/ 0) { - each_value = OPTIONS; - validate_each_argument(each_value); - let i; + if (dirty & /*OPTIONS*/ 0) { + each_value = OPTIONS; + validate_each_argument(each_value); + let i; - for (i = 0; i < each_value.length; i += 1) { - const child_ctx = get_each_context$1(ctx, each_value, i); + for (i = 0; i < each_value.length; i += 1) { + const child_ctx = get_each_context$1(ctx, each_value, i); - if (each_blocks[i]) { - each_blocks[i].p(child_ctx, dirty); - } else { - each_blocks[i] = create_each_block$1(child_ctx); - each_blocks[i].c(); - each_blocks[i].m(select, null); - } - } + if (each_blocks[i]) { + each_blocks[i].p(child_ctx, dirty); + } else { + each_blocks[i] = create_each_block$1(child_ctx); + each_blocks[i].c(); + each_blocks[i].m(select, null); + } + } - for (; i < each_blocks.length; i += 1) { - each_blocks[i].d(1); - } + for (; i < each_blocks.length; i += 1) { + each_blocks[i].d(1); + } - each_blocks.length = each_value.length; - } + each_blocks.length = each_value.length; + } - if (dirty & /*name, OPTIONS*/ 1) { - select_option(select, /*name*/ ctx[0]); - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div3); - destroy_each(each_blocks, detaching); - mounted = false; - run_all(dispose); - } - }; + if (dirty & /*name, OPTIONS*/ 1) { + select_option(select, /*name*/ ctx[0]); + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div3); + destroy_each(each_blocks, detaching); + mounted = false; + run_all(dispose); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$2.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$2.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function confidence(prob) { - prob = prob * 100; + prob = prob * 100; - if (prob < 50.0) { - return "danger"; - } else if (prob < 75.0) { - return "warning"; - } else { - return "success"; - } + if (prob < 50.0) { + return "danger"; + } else if (prob < 75.0) { + return "warning"; + } else { + return "success"; + } } function scrubberMove(event) { - let target = event.target; - let imageWidth = 160; - let backgroundPosition = target.style.backgroundPosition.split(" "); - let offset = Number(target.getAttribute("data-offset").split(",")[0]); + let target = event.target; + let imageWidth = 160; + let backgroundPosition = target.style.backgroundPosition.split(" "); + let offset = Number(target.getAttribute("data-offset").split(",")[0]); - if (event.offsetX < 53) { - backgroundPosition[0] = `-${offset - imageWidth}px`; - target.style.backgroundPosition = backgroundPosition.join(" "); - } else if (event.offsetX > 53 && event.offsetX < imageWidth && event.offsetX < 106) { - backgroundPosition[0] = `-${offset}px`; - target.style.backgroundPosition = backgroundPosition.join(" "); - } else if (event.offsetX > 106) { - backgroundPosition[0] = `-${offset + imageWidth}px`; - target.style.backgroundPosition = backgroundPosition.join(" "); - } + if (event.offsetX < 53) { + backgroundPosition[0] = `-${offset - imageWidth}px`; + target.style.backgroundPosition = backgroundPosition.join(" "); + } else if ( + event.offsetX > 53 && + event.offsetX < imageWidth && + event.offsetX < 106 + ) { + backgroundPosition[0] = `-${offset}px`; + target.style.backgroundPosition = backgroundPosition.join(" "); + } else if (event.offsetX > 106) { + backgroundPosition[0] = `-${offset + imageWidth}px`; + target.style.backgroundPosition = backgroundPosition.join(" "); + } } function scrubberReset(event) { - let backgroundPosition = event.target.style.backgroundPosition.split(" "); - let offset = Number(event.target.getAttribute("data-offset").split(",")[0]); - backgroundPosition[0] = `-${offset}px`; - event.target.style.backgroundPosition = backgroundPosition.join(" "); + let backgroundPosition = event.target.style.backgroundPosition.split(" "); + let offset = Number(event.target.getAttribute("data-offset").split(",")[0]); + backgroundPosition[0] = `-${offset}px`; + event.target.style.backgroundPosition = backgroundPosition.join(" "); } function instance$2($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('Tag', slots, []); - let { name } = $$props; - let { data } = $$props; - let { url = "" } = $$props; - const dispatch = createEventDispatcher(); + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Tag", slots, []); + let { name } = $$props; + let { data } = $$props; + let { url = "" } = $$props; + const dispatch = createEventDispatcher(); - $$self.$$.on_mount.push(function () { - if (name === undefined && !('name' in $$props || $$self.$$.bound[$$self.$$.props['name']])) { - console.warn(" was created without expected prop 'name'"); - } + $$self.$$.on_mount.push(function () { + if ( + name === undefined && + !("name" in $$props || $$self.$$.bound[$$self.$$.props["name"]]) + ) { + console.warn(" was created without expected prop 'name'"); + } - if (data === undefined && !('data' in $$props || $$self.$$.bound[$$self.$$.props['data']])) { - console.warn(" was created without expected prop 'data'"); - } - }); + if ( + data === undefined && + !("data" in $$props || $$self.$$.bound[$$self.$$.props["data"]]) + ) { + console.warn(" was created without expected prop 'data'"); + } + }); - const writable_props = ['name', 'data', 'url']; + const writable_props = ["name", "data", "url"]; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - function select_change_handler() { - name = select_value(this); - $$invalidate(0, name); - } + function select_change_handler() { + name = select_value(this); + $$invalidate(0, name); + } - const click_handler = () => { - dispatch("remove", data.id); - }; + const click_handler = () => { + dispatch("remove", data.id); + }; - $$self.$$set = $$props => { - if ('name' in $$props) $$invalidate(0, name = $$props.name); - if ('data' in $$props) $$invalidate(1, data = $$props.data); - if ('url' in $$props) $$invalidate(2, url = $$props.url); - }; + $$self.$$set = ($$props) => { + if ("name" in $$props) $$invalidate(0, (name = $$props.name)); + if ("data" in $$props) $$invalidate(1, (data = $$props.data)); + if ("url" in $$props) $$invalidate(2, (url = $$props.url)); + }; - $$self.$capture_state = () => ({ - OPTIONS, - createEventDispatcher, - name, - data, - url, - dispatch, - confidence, - scrubberMove, - scrubberReset - }); + $$self.$capture_state = () => ({ + OPTIONS, + createEventDispatcher, + name, + data, + url, + dispatch, + confidence, + scrubberMove, + scrubberReset, + }); - $$self.$inject_state = $$props => { - if ('name' in $$props) $$invalidate(0, name = $$props.name); - if ('data' in $$props) $$invalidate(1, data = $$props.data); - if ('url' in $$props) $$invalidate(2, url = $$props.url); - }; + $$self.$inject_state = ($$props) => { + if ("name" in $$props) $$invalidate(0, (name = $$props.name)); + if ("data" in $$props) $$invalidate(1, (data = $$props.data)); + if ("url" in $$props) $$invalidate(2, (url = $$props.url)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - return [name, data, url, dispatch, select_change_handler, click_handler]; + return [name, data, url, dispatch, select_change_handler, click_handler]; } class Tag extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$2, create_fragment$2, safe_not_equal, { name: 0, data: 1, url: 2 }); + constructor(options) { + super(options); + init(this, options, instance$2, create_fragment$2, safe_not_equal, { + name: 0, + data: 1, + url: 2, + }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Tag", - options, - id: create_fragment$2.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Tag", + options, + id: create_fragment$2.name, + }); + } - get name() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get name() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set name(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set name(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get data() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get data() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set data(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set data(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get url() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get url() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set url(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set url(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } } /* src/TagMatches.svelte generated by Svelte v3.59.2 */ @@ -2770,661 +3207,755 @@ const file$1 = "src/TagMatches.svelte"; function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[15] = list[i][0]; - child_ctx[16] = list[i][1]; - child_ctx[17] = list; - child_ctx[18] = i; - return child_ctx; + const child_ctx = ctx.slice(); + child_ctx[15] = list[i][0]; + child_ctx[16] = list[i][1]; + child_ctx[17] = list; + child_ctx[18] = i; + return child_ctx; } // (81:0) {#if visible} function create_if_block(ctx) { - let div8; - let div7; - let div6; - let div0; - let h3; - let t1; - let div2; - let div1; - let each_blocks = []; - let each_1_lookup = new Map(); - let t2; - let div5; - let div3; - let button0; - let t4; - let button1; - let t5; - let t6; - let div4; - let t7; - let input; - let t8; - let t9_value = /*threshold*/ ctx[0] * 100 + ""; - let t9; - let t10; - let div8_intro; - let div8_outro; - let current; - let mounted; - let dispose; - let each_value = /*filteredMatches*/ ctx[5]; - validate_each_argument(each_value); - const get_key = ctx => /*tagData*/ ctx[16].id; - validate_each_keys(ctx, each_value, get_each_context, get_key); + let div8; + let div7; + let div6; + let div0; + let h3; + let t1; + let div2; + let div1; + let each_blocks = []; + let each_1_lookup = new Map(); + let t2; + let div5; + let div3; + let button0; + let t4; + let button1; + let t5; + let t6; + let div4; + let t7; + let input; + let t8; + let t9_value = /*threshold*/ ctx[0] * 100 + ""; + let t9; + let t10; + let div8_intro; + let div8_outro; + let current; + let mounted; + let dispose; + let each_value = /*filteredMatches*/ ctx[5]; + validate_each_argument(each_value); + const get_key = (ctx) => /*tagData*/ ctx[16].id; + validate_each_keys(ctx, each_value, get_each_context, get_key); - for (let i = 0; i < each_value.length; i += 1) { - let child_ctx = get_each_context(ctx, each_value, i); - let key = get_key(child_ctx); - each_1_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); - } + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key(child_ctx); + each_1_lookup.set( + key, + (each_blocks[i] = create_each_block(key, child_ctx)), + ); + } - let if_block = /*saving*/ ctx[3] && create_if_block_1(ctx); + let if_block = /*saving*/ ctx[3] && create_if_block_1(ctx); - const block = { - c: function create() { - div8 = element("div"); - div7 = element("div"); - div6 = element("div"); - div0 = element("div"); - h3 = element("h3"); - h3.textContent = "Stash Tag"; - t1 = space(); - div2 = element("div"); - div1 = element("div"); + const block = { + c: function create() { + div8 = element("div"); + div7 = element("div"); + div6 = element("div"); + div0 = element("div"); + h3 = element("h3"); + h3.textContent = "Stash Tag"; + t1 = space(); + div2 = element("div"); + div1 = element("div"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - t2 = space(); - div5 = element("div"); - div3 = element("div"); - button0 = element("button"); - button0.textContent = "Close"; - t4 = space(); - button1 = element("button"); - if (if_block) if_block.c(); - t5 = text("\n Add Tags"); - t6 = space(); - div4 = element("div"); - t7 = text("Threshold: "); - input = element("input"); - t8 = space(); - t9 = text(t9_value); - t10 = text(" %"); - attr_dev(h3, "class", "modal-title"); - add_location(h3, file$1, 94, 10, 2253); - attr_dev(div0, "class", "modal-header svelte-9viihb"); - add_location(div0, file$1, 93, 8, 2216); - attr_dev(div1, "class", "row justify-content-center"); - add_location(div1, file$1, 97, 10, 2350); - attr_dev(div2, "class", "modal-body"); - add_location(div2, file$1, 96, 8, 2315); - attr_dev(button0, "id", "tags-cancel"); - attr_dev(button0, "type", "button"); - attr_dev(button0, "class", "ml-2 btn btn-secondary"); - add_location(button0, file$1, 116, 12, 2933); - attr_dev(button1, "id", "tags-accept"); - attr_dev(button1, "type", "button"); - attr_dev(button1, "class", "ml-2 btn btn-primary"); - add_location(button1, file$1, 122, 12, 3116); - add_location(div3, file$1, 115, 10, 2915); - attr_dev(input, "type", "range"); - attr_dev(input, "min", "0.2"); - attr_dev(input, "max", "0.9"); - attr_dev(input, "step", "0.1"); - attr_dev(input, "id", "stash-tag-threshold"); - set_style(input, "margin", "0px"); - set_style(input, "height", "10px"); - add_location(input, file$1, 135, 23, 3464); - add_location(div4, file$1, 134, 10, 3435); - attr_dev(div5, "class", "ModalFooter modal-footer svelte-9viihb"); - add_location(div5, file$1, 114, 8, 2866); - attr_dev(div6, "class", "modal-content"); - add_location(div6, file$1, 92, 6, 2180); - attr_dev(div7, "class", "modal-dialog modal-xl top-accent svelte-9viihb"); - add_location(div7, file$1, 91, 4, 2127); - attr_dev(div8, "role", "dialog"); - attr_dev(div8, "aria-modal", "true"); - attr_dev(div8, "class", "fade ModalComponent modal show"); - attr_dev(div8, "tabindex", "-1"); - set_style(div8, "display", "block"); - add_location(div8, file$1, 81, 2, 1884); - }, - m: function mount(target, anchor) { - insert_dev(target, div8, anchor); - append_dev(div8, div7); - append_dev(div7, div6); - append_dev(div6, div0); - append_dev(div0, h3); - append_dev(div6, t1); - append_dev(div6, div2); - append_dev(div2, div1); + t2 = space(); + div5 = element("div"); + div3 = element("div"); + button0 = element("button"); + button0.textContent = "Close"; + t4 = space(); + button1 = element("button"); + if (if_block) if_block.c(); + t5 = text("\n Add Tags"); + t6 = space(); + div4 = element("div"); + t7 = text("Threshold: "); + input = element("input"); + t8 = space(); + t9 = text(t9_value); + t10 = text(" %"); + attr_dev(h3, "class", "modal-title"); + add_location(h3, file$1, 94, 10, 2253); + attr_dev(div0, "class", "modal-header svelte-9viihb"); + add_location(div0, file$1, 93, 8, 2216); + attr_dev(div1, "class", "row justify-content-center"); + add_location(div1, file$1, 97, 10, 2350); + attr_dev(div2, "class", "modal-body"); + add_location(div2, file$1, 96, 8, 2315); + attr_dev(button0, "id", "tags-cancel"); + attr_dev(button0, "type", "button"); + attr_dev(button0, "class", "ml-2 btn btn-secondary"); + add_location(button0, file$1, 116, 12, 2933); + attr_dev(button1, "id", "tags-accept"); + attr_dev(button1, "type", "button"); + attr_dev(button1, "class", "ml-2 btn btn-primary"); + add_location(button1, file$1, 122, 12, 3116); + add_location(div3, file$1, 115, 10, 2915); + attr_dev(input, "type", "range"); + attr_dev(input, "min", "0.2"); + attr_dev(input, "max", "0.9"); + attr_dev(input, "step", "0.1"); + attr_dev(input, "id", "stash-tag-threshold"); + set_style(input, "margin", "0px"); + set_style(input, "height", "10px"); + add_location(input, file$1, 135, 23, 3464); + add_location(div4, file$1, 134, 10, 3435); + attr_dev(div5, "class", "ModalFooter modal-footer svelte-9viihb"); + add_location(div5, file$1, 114, 8, 2866); + attr_dev(div6, "class", "modal-content"); + add_location(div6, file$1, 92, 6, 2180); + attr_dev( + div7, + "class", + "modal-dialog modal-xl top-accent svelte-9viihb", + ); + add_location(div7, file$1, 91, 4, 2127); + attr_dev(div8, "role", "dialog"); + attr_dev(div8, "aria-modal", "true"); + attr_dev(div8, "class", "fade ModalComponent modal show"); + attr_dev(div8, "tabindex", "-1"); + set_style(div8, "display", "block"); + add_location(div8, file$1, 81, 2, 1884); + }, + m: function mount(target, anchor) { + insert_dev(target, div8, anchor); + append_dev(div8, div7); + append_dev(div7, div6); + append_dev(div6, div0); + append_dev(div0, h3); + append_dev(div6, t1); + append_dev(div6, div2); + append_dev(div2, div1); - for (let i = 0; i < each_blocks.length; i += 1) { - if (each_blocks[i]) { - each_blocks[i].m(div1, null); - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(div1, null); + } + } - append_dev(div6, t2); - append_dev(div6, div5); - append_dev(div5, div3); - append_dev(div3, button0); - append_dev(div3, t4); - append_dev(div3, button1); - if (if_block) if_block.m(button1, null); - append_dev(button1, t5); - append_dev(div5, t6); - append_dev(div5, div4); - append_dev(div4, t7); - append_dev(div4, input); - set_input_value(input, /*threshold*/ ctx[0]); - append_dev(div4, t8); - append_dev(div4, t9); - append_dev(div4, t10); - /*div8_binding*/ ctx[13](div8); - current = true; + append_dev(div6, t2); + append_dev(div6, div5); + append_dev(div5, div3); + append_dev(div3, button0); + append_dev(div3, t4); + append_dev(div3, button1); + if (if_block) if_block.m(button1, null); + append_dev(button1, t5); + append_dev(div5, t6); + append_dev(div5, div4); + append_dev(div4, t7); + append_dev(div4, input); + set_input_value(input, /*threshold*/ ctx[0]); + append_dev(div4, t8); + append_dev(div4, t9); + append_dev(div4, t10); + /*div8_binding*/ ctx[13](div8); + current = true; - if (!mounted) { - dispose = [ - listen_dev(button0, "click", /*close*/ ctx[6], false, false, false, false), - listen_dev(button1, "click", /*save*/ ctx[8], false, false, false, false), - listen_dev(input, "change", /*input_change_input_handler*/ ctx[12]), - listen_dev(input, "input", /*input_change_input_handler*/ ctx[12]), - listen_dev(input, "change", /*changeThreshold*/ ctx[9], false, false, false, false) - ]; + if (!mounted) { + dispose = [ + listen_dev( + button0, + "click", + /*close*/ ctx[6], + false, + false, + false, + false, + ), + listen_dev( + button1, + "click", + /*save*/ ctx[8], + false, + false, + false, + false, + ), + listen_dev(input, "change", /*input_change_input_handler*/ ctx[12]), + listen_dev(input, "input", /*input_change_input_handler*/ ctx[12]), + listen_dev( + input, + "change", + /*changeThreshold*/ ctx[9], + false, + false, + false, + false, + ), + ]; - mounted = true; - } - }, - p: function update(ctx, dirty) { - if (dirty & /*filteredMatches, url, remove*/ 162) { - each_value = /*filteredMatches*/ ctx[5]; - validate_each_argument(each_value); - group_outros(); - for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); - validate_each_keys(ctx, each_value, get_each_context, get_key); - each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each_1_lookup, div1, fix_and_outro_and_destroy_block, create_each_block, null, get_each_context); - for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); - check_outros(); - } + mounted = true; + } + }, + p: function update(ctx, dirty) { + if (dirty & /*filteredMatches, url, remove*/ 162) { + each_value = /*filteredMatches*/ ctx[5]; + validate_each_argument(each_value); + group_outros(); + for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); + validate_each_keys(ctx, each_value, get_each_context, get_key); + each_blocks = update_keyed_each( + each_blocks, + dirty, + get_key, + 1, + ctx, + each_value, + each_1_lookup, + div1, + fix_and_outro_and_destroy_block, + create_each_block, + null, + get_each_context, + ); + for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); + check_outros(); + } - if (/*saving*/ ctx[3]) { - if (if_block) ; else { - if_block = create_if_block_1(ctx); - if_block.c(); - if_block.m(button1, t5); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } + if (/*saving*/ ctx[3]) { + if (if_block); + else { + if_block = create_if_block_1(ctx); + if_block.c(); + if_block.m(button1, t5); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } - if (dirty & /*threshold*/ 1) { - set_input_value(input, /*threshold*/ ctx[0]); - } + if (dirty & /*threshold*/ 1) { + set_input_value(input, /*threshold*/ ctx[0]); + } - if ((!current || dirty & /*threshold*/ 1) && t9_value !== (t9_value = /*threshold*/ ctx[0] * 100 + "")) set_data_dev(t9, t9_value); - }, - i: function intro(local) { - if (current) return; + if ( + (!current || dirty & /*threshold*/ 1) && + t9_value !== (t9_value = /*threshold*/ ctx[0] * 100 + "") + ) + set_data_dev(t9, t9_value); + }, + i: function intro(local) { + if (current) return; - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } - add_render_callback(() => { - if (!current) return; - if (div8_outro) div8_outro.end(1); - div8_intro = create_in_transition(div8, fly, { y: 100, duration: 400 }); - div8_intro.start(); - }); + add_render_callback(() => { + if (!current) return; + if (div8_outro) div8_outro.end(1); + div8_intro = create_in_transition(div8, fly, { + y: 100, + duration: 400, + }); + div8_intro.start(); + }); - current = true; - }, - o: function outro(local) { - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } + current = true; + }, + o: function outro(local) { + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } - if (div8_intro) div8_intro.invalidate(); - div8_outro = create_out_transition(div8, fly, { y: -100, duration: 400 }); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div8); + if (div8_intro) div8_intro.invalidate(); + div8_outro = create_out_transition(div8, fly, { + y: -100, + duration: 400, + }); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div8); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].d(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } - if (if_block) if_block.d(); - /*div8_binding*/ ctx[13](null); - if (detaching && div8_outro) div8_outro.end(); - mounted = false; - run_all(dispose); - } - }; + if (if_block) if_block.d(); + /*div8_binding*/ ctx[13](null); + if (detaching && div8_outro) div8_outro.end(); + mounted = false; + run_all(dispose); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block.name, - type: "if", - source: "(81:0) {#if visible}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block.name, + type: "if", + source: "(81:0) {#if visible}", + ctx, + }); - return block; + return block; } // (99:12) {#each filteredMatches as [tagName, tagData] (tagData.id)} function create_each_block(key_1, ctx) { - let div; - let tag; - let updating_name; - let t; - let div_intro; - let div_outro; - let rect; - let stop_animation = noop; - let current; + let div; + let tag; + let updating_name; + let t; + let div_intro; + let div_outro; + let rect; + let stop_animation = noop; + let current; - function tag_name_binding(value) { - /*tag_name_binding*/ ctx[11](value, /*tagName*/ ctx[15], /*each_value*/ ctx[17], /*each_index*/ ctx[18]); - } + function tag_name_binding(value) { + /*tag_name_binding*/ ctx[11]( + value, + /*tagName*/ ctx[15], + /*each_value*/ ctx[17], + /*each_index*/ ctx[18], + ); + } - let tag_props = { - data: /*tagData*/ ctx[16], - url: /*url*/ ctx[1] - }; + let tag_props = { + data: /*tagData*/ ctx[16], + url: /*url*/ ctx[1], + }; - if (/*tagName*/ ctx[15] !== void 0) { - tag_props.name = /*tagName*/ ctx[15]; - } + if (/*tagName*/ ctx[15] !== void 0) { + tag_props.name = /*tagName*/ ctx[15]; + } - tag = new Tag({ props: tag_props, $$inline: true }); - binding_callbacks.push(() => bind(tag, 'name', tag_name_binding)); - tag.$on("remove", /*remove*/ ctx[7]); + tag = new Tag({ props: tag_props, $$inline: true }); + binding_callbacks.push(() => bind(tag, "name", tag_name_binding)); + tag.$on("remove", /*remove*/ ctx[7]); - const block = { - key: key_1, - first: null, - c: function create() { - div = element("div"); - create_component(tag.$$.fragment); - t = space(); - add_location(div, file$1, 99, 14, 2476); - this.first = div; - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - mount_component(tag, div, null); - append_dev(div, t); - current = true; - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; - const tag_changes = {}; - if (dirty & /*filteredMatches*/ 32) tag_changes.data = /*tagData*/ ctx[16]; - if (dirty & /*url*/ 2) tag_changes.url = /*url*/ ctx[1]; + const block = { + key: key_1, + first: null, + c: function create() { + div = element("div"); + create_component(tag.$$.fragment); + t = space(); + add_location(div, file$1, 99, 14, 2476); + this.first = div; + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + mount_component(tag, div, null); + append_dev(div, t); + current = true; + }, + p: function update(new_ctx, dirty) { + ctx = new_ctx; + const tag_changes = {}; + if (dirty & /*filteredMatches*/ 32) + tag_changes.data = /*tagData*/ ctx[16]; + if (dirty & /*url*/ 2) tag_changes.url = /*url*/ ctx[1]; - if (!updating_name && dirty & /*filteredMatches*/ 32) { - updating_name = true; - tag_changes.name = /*tagName*/ ctx[15]; - add_flush_callback(() => updating_name = false); - } + if (!updating_name && dirty & /*filteredMatches*/ 32) { + updating_name = true; + tag_changes.name = /*tagName*/ ctx[15]; + add_flush_callback(() => (updating_name = false)); + } - tag.$set(tag_changes); - }, - r: function measure() { - rect = div.getBoundingClientRect(); - }, - f: function fix() { - fix_position(div); - stop_animation(); - add_transform(div, rect); - }, - a: function animate() { - stop_animation(); - stop_animation = create_animation(div, rect, flip, { duration: 250, easing: quintOut }); - }, - i: function intro(local) { - if (current) return; - transition_in(tag.$$.fragment, local); + tag.$set(tag_changes); + }, + r: function measure() { + rect = div.getBoundingClientRect(); + }, + f: function fix() { + fix_position(div); + stop_animation(); + add_transform(div, rect); + }, + a: function animate() { + stop_animation(); + stop_animation = create_animation(div, rect, flip, { + duration: 250, + easing: quintOut, + }); + }, + i: function intro(local) { + if (current) return; + transition_in(tag.$$.fragment, local); - add_render_callback(() => { - if (!current) return; - if (div_outro) div_outro.end(1); - div_intro = create_in_transition(div, fade, {}); - div_intro.start(); - }); + add_render_callback(() => { + if (!current) return; + if (div_outro) div_outro.end(1); + div_intro = create_in_transition(div, fade, {}); + div_intro.start(); + }); - current = true; - }, - o: function outro(local) { - transition_out(tag.$$.fragment, local); - if (div_intro) div_intro.invalidate(); - div_outro = create_out_transition(div, fade, {}); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - destroy_component(tag); - if (detaching && div_outro) div_outro.end(); - } - }; + current = true; + }, + o: function outro(local) { + transition_out(tag.$$.fragment, local); + if (div_intro) div_intro.invalidate(); + div_outro = create_out_transition(div, fade, {}); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + destroy_component(tag); + if (detaching && div_outro) div_outro.end(); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block.name, - type: "each", - source: "(99:12) {#each filteredMatches as [tagName, tagData] (tagData.id)}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block.name, + type: "each", + source: + "(99:12) {#each filteredMatches as [tagName, tagData] (tagData.id)}", + ctx, + }); - return block; + return block; } // (129:14) {#if saving} function create_if_block_1(ctx) { - let div; + let div; - const block = { - c: function create() { - div = element("div"); - attr_dev(div, "class", "lds-dual-ring svelte-9viihb"); - add_location(div, file$1, 129, 16, 3313); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; + const block = { + c: function create() { + div = element("div"); + attr_dev(div, "class", "lds-dual-ring svelte-9viihb"); + add_location(div, file$1, 129, 16, 3313); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_1.name, - type: "if", - source: "(129:14) {#if saving}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_1.name, + type: "if", + source: "(129:14) {#if saving}", + ctx, + }); - return block; + return block; } function create_fragment$1(ctx) { - let if_block_anchor; - let current; - let if_block = /*visible*/ ctx[2] && create_if_block(ctx); + let if_block_anchor; + let current; + let if_block = /*visible*/ ctx[2] && create_if_block(ctx); - const block = { - c: function create() { - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert_dev(target, if_block_anchor, anchor); - current = true; - }, - p: function update(ctx, [dirty]) { - if (/*visible*/ ctx[2]) { - if (if_block) { - if_block.p(ctx, dirty); + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + current = true; + }, + p: function update(ctx, [dirty]) { + if (/*visible*/ ctx[2]) { + if (if_block) { + if_block.p(ctx, dirty); - if (dirty & /*visible*/ 4) { - transition_in(if_block, 1); - } - } else { - if_block = create_if_block(ctx); - if_block.c(); - transition_in(if_block, 1); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - group_outros(); + if (dirty & /*visible*/ 4) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); - transition_out(if_block, 1, 1, () => { - if_block = null; - }); + transition_out(if_block, 1, 1, () => { + if_block = null; + }); - check_outros(); - } - }, - i: function intro(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o: function outro(local) { - transition_out(if_block); - current = false; - }, - d: function destroy(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach_dev(if_block_anchor); - } - }; + check_outros(); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$1.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$1.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function instance$1($$self, $$props, $$invalidate) { - let filteredMatches; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('TagMatches', slots, []); - let { matches = [] } = $$props; - let { url = "" } = $$props; - let { threshold = 0.2 } = $$props; - let visible = false; - let saving = false; - let modal; - let tags; - matches = Object.entries(matches).sort((a, b) => b[1].frame - a[1].frame).reverse(); + let filteredMatches; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("TagMatches", slots, []); + let { matches = [] } = $$props; + let { url = "" } = $$props; + let { threshold = 0.2 } = $$props; + let visible = false; + let saving = false; + let modal; + let tags; + matches = Object.entries(matches) + .sort((a, b) => b[1].frame - a[1].frame) + .reverse(); - // add random id to each match - matches = matches.map(x => { - x[1].id = Math.random().toString(36).substring(7); - return x; - }); + // add random id to each match + matches = matches.map((x) => { + x[1].id = Math.random().toString(36).substring(7); + return x; + }); - onMount(async () => { - // so we see a nice transition - $$invalidate(2, visible = true); + onMount(async () => { + // so we see a nice transition + $$invalidate(2, (visible = true)); - tags = await getAllTags(); - }); + tags = await getAllTags(); + }); - async function close() { - // so we see a nice transition - $$invalidate(2, visible = false); + async function close() { + // so we see a nice transition + $$invalidate(2, (visible = false)); - setTimeout( - () => { - modal.remove(); - }, - 400 - ); - } + setTimeout(() => { + modal.remove(); + }, 400); + } - function remove(event) { - const id = event.detail; - $$invalidate(10, matches = matches.filter(x => x[1].id !== id)); - } + function remove(event) { + const id = event.detail; + $$invalidate(10, (matches = matches.filter((x) => x[1].id !== id))); + } - async function save() { - $$invalidate(3, saving = true); - const [,scene_id] = getScenarioAndID(); - let existingTags = await getTagsForScene(scene_id); + async function save() { + $$invalidate(3, (saving = true)); + const [, scene_id] = getScenarioAndID(); + let existingTags = await getTagsForScene(scene_id); - for (const [tag] of filteredMatches) { - let tagLower = tag.toLowerCase(); + for (const [tag] of filteredMatches) { + let tagLower = tag.toLowerCase(); - // if tag doesn't exist, create it - if (tags[tagLower] === undefined) { - existingTags.push(await createTag(tag)); - } else if (!existingTags.includes(tags[tagLower])) { - existingTags.push(tags[tagLower]); - } - } + // if tag doesn't exist, create it + if (tags[tagLower] === undefined) { + existingTags.push(await createTag(tag)); + } else if (!existingTags.includes(tags[tagLower])) { + existingTags.push(tags[tagLower]); + } + } - await updateScene(scene_id, existingTags); - $$invalidate(3, saving = false); - close(); - location.reload(); - } + await updateScene(scene_id, existingTags); + $$invalidate(3, (saving = false)); + close(); + location.reload(); + } - function changeThreshold() { - localStorage.setItem("stash-tag-threshold", threshold); - } + function changeThreshold() { + localStorage.setItem("stash-tag-threshold", threshold); + } - const writable_props = ['matches', 'url', 'threshold']; + const writable_props = ["matches", "url", "threshold"]; - Object_1.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object_1.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - function tag_name_binding(value, tagName, each_value, each_index) { - each_value[each_index][0] = value; - (($$invalidate(5, filteredMatches), $$invalidate(10, matches)), $$invalidate(0, threshold)); - } + function tag_name_binding(value, tagName, each_value, each_index) { + each_value[each_index][0] = value; + ($$invalidate(5, filteredMatches), $$invalidate(10, matches)), + $$invalidate(0, threshold); + } - function input_change_input_handler() { - threshold = to_number(this.value); - $$invalidate(0, threshold); - } + function input_change_input_handler() { + threshold = to_number(this.value); + $$invalidate(0, threshold); + } - function div8_binding($$value) { - binding_callbacks[$$value ? 'unshift' : 'push'](() => { - modal = $$value; - $$invalidate(4, modal); - }); - } + function div8_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + modal = $$value; + $$invalidate(4, modal); + }); + } - $$self.$$set = $$props => { - if ('matches' in $$props) $$invalidate(10, matches = $$props.matches); - if ('url' in $$props) $$invalidate(1, url = $$props.url); - if ('threshold' in $$props) $$invalidate(0, threshold = $$props.threshold); - }; + $$self.$$set = ($$props) => { + if ("matches" in $$props) $$invalidate(10, (matches = $$props.matches)); + if ("url" in $$props) $$invalidate(1, (url = $$props.url)); + if ("threshold" in $$props) + $$invalidate(0, (threshold = $$props.threshold)); + }; - $$self.$capture_state = () => ({ - Tag, - onMount, - fly, - fade, - flip, - quintOut, - createTag, - getAllTags, - getTagsForScene, - updateScene, - getScenarioAndID, - matches, - url, - threshold, - visible, - saving, - modal, - tags, - close, - remove, - save, - changeThreshold, - filteredMatches - }); + $$self.$capture_state = () => ({ + Tag, + onMount, + fly, + fade, + flip, + quintOut, + createTag, + getAllTags, + getTagsForScene, + updateScene, + getScenarioAndID, + matches, + url, + threshold, + visible, + saving, + modal, + tags, + close, + remove, + save, + changeThreshold, + filteredMatches, + }); - $$self.$inject_state = $$props => { - if ('matches' in $$props) $$invalidate(10, matches = $$props.matches); - if ('url' in $$props) $$invalidate(1, url = $$props.url); - if ('threshold' in $$props) $$invalidate(0, threshold = $$props.threshold); - if ('visible' in $$props) $$invalidate(2, visible = $$props.visible); - if ('saving' in $$props) $$invalidate(3, saving = $$props.saving); - if ('modal' in $$props) $$invalidate(4, modal = $$props.modal); - if ('tags' in $$props) tags = $$props.tags; - if ('filteredMatches' in $$props) $$invalidate(5, filteredMatches = $$props.filteredMatches); - }; + $$self.$inject_state = ($$props) => { + if ("matches" in $$props) $$invalidate(10, (matches = $$props.matches)); + if ("url" in $$props) $$invalidate(1, (url = $$props.url)); + if ("threshold" in $$props) + $$invalidate(0, (threshold = $$props.threshold)); + if ("visible" in $$props) $$invalidate(2, (visible = $$props.visible)); + if ("saving" in $$props) $$invalidate(3, (saving = $$props.saving)); + if ("modal" in $$props) $$invalidate(4, (modal = $$props.modal)); + if ("tags" in $$props) tags = $$props.tags; + if ("filteredMatches" in $$props) + $$invalidate(5, (filteredMatches = $$props.filteredMatches)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - $$self.$$.update = () => { - if ($$self.$$.dirty & /*matches, threshold*/ 1025) { - $$invalidate(5, filteredMatches = matches.filter(x => x[1].prob > threshold)); - } - }; + $$self.$$.update = () => { + if ($$self.$$.dirty & /*matches, threshold*/ 1025) { + $$invalidate( + 5, + (filteredMatches = matches.filter((x) => x[1].prob > threshold)), + ); + } + }; - return [ - threshold, - url, - visible, - saving, - modal, - filteredMatches, - close, - remove, - save, - changeThreshold, - matches, - tag_name_binding, - input_change_input_handler, - div8_binding - ]; + return [ + threshold, + url, + visible, + saving, + modal, + filteredMatches, + close, + remove, + save, + changeThreshold, + matches, + tag_name_binding, + input_change_input_handler, + div8_binding, + ]; } class TagMatches extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$1, create_fragment$1, safe_not_equal, { matches: 10, url: 1, threshold: 0 }); + constructor(options) { + super(options); + init(this, options, instance$1, create_fragment$1, safe_not_equal, { + matches: 10, + url: 1, + threshold: 0, + }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "TagMatches", - options, - id: create_fragment$1.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "TagMatches", + options, + id: create_fragment$1.name, + }); + } - get matches() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get matches() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set matches(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set matches(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get url() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get url() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set url(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set url(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get threshold() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get threshold() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set threshold(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set threshold(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } } /* src/TagButton.svelte generated by Svelte v3.59.2 */ @@ -3433,204 +3964,229 @@ const file = "src/TagButton.svelte"; function create_fragment(ctx) { - let button; - let svg; - let path; - let mounted; - let dispose; + let button; + let svg; + let path; + let mounted; + let dispose; - const block = { - c: function create() { - button = element("button"); - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(path, "fill", "white"); - attr_dev(path, "d", "m21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4a2 2 0 0 0-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58c.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41c0-.55-.23-1.06-.59-1.42M5.5 7A1.5 1.5 0 0 1 4 5.5A1.5 1.5 0 0 1 5.5 4A1.5 1.5 0 0 1 7 5.5A1.5 1.5 0 0 1 5.5 7m11.77 8.27L13 19.54l-4.27-4.27A2.52 2.52 0 0 1 8 13.5a2.5 2.5 0 0 1 2.5-2.5c.69 0 1.32.28 1.77.74l.73.72l.73-.73c.45-.45 1.08-.73 1.77-.73a2.5 2.5 0 0 1 2.5 2.5c0 .69-.28 1.32-.73 1.77Z"); - add_location(path, file, 78, 85, 2558); - attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); - attr_dev(svg, "width", "24"); - attr_dev(svg, "height", "24"); - attr_dev(svg, "viewBox", "0 0 24 24"); - add_location(svg, file, 78, 2, 2475); - attr_dev(button, "id", "stashtag"); - attr_dev(button, "title", "Scan for tags"); - attr_dev(button, "class", "svelte-xcs6vi"); - toggle_class(button, "scanner", /*scanner*/ ctx[0]); - add_location(button, file, 77, 0, 2395); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, button, anchor); - append_dev(button, svg); - append_dev(svg, path); + const block = { + c: function create() { + button = element("button"); + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev(path, "fill", "white"); + attr_dev( + path, + "d", + "m21.41 11.58l-9-9C12.05 2.22 11.55 2 11 2H4a2 2 0 0 0-2 2v7c0 .55.22 1.05.59 1.42l9 9c.36.36.86.58 1.41.58c.55 0 1.05-.22 1.41-.59l7-7c.37-.36.59-.86.59-1.41c0-.55-.23-1.06-.59-1.42M5.5 7A1.5 1.5 0 0 1 4 5.5A1.5 1.5 0 0 1 5.5 4A1.5 1.5 0 0 1 7 5.5A1.5 1.5 0 0 1 5.5 7m11.77 8.27L13 19.54l-4.27-4.27A2.52 2.52 0 0 1 8 13.5a2.5 2.5 0 0 1 2.5-2.5c.69 0 1.32.28 1.77.74l.73.72l.73-.73c.45-.45 1.08-.73 1.77-.73a2.5 2.5 0 0 1 2.5 2.5c0 .69-.28 1.32-.73 1.77Z", + ); + add_location(path, file, 78, 85, 2558); + attr_dev(svg, "xmlns", "http://www.w3.org/2000/svg"); + attr_dev(svg, "width", "24"); + attr_dev(svg, "height", "24"); + attr_dev(svg, "viewBox", "0 0 24 24"); + add_location(svg, file, 78, 2, 2475); + attr_dev(button, "id", "stashtag"); + attr_dev(button, "title", "Scan for tags"); + attr_dev(button, "class", "svelte-xcs6vi"); + toggle_class(button, "scanner", /*scanner*/ ctx[0]); + add_location(button, file, 77, 0, 2395); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + insert_dev(target, button, anchor); + append_dev(button, svg); + append_dev(svg, path); - if (!mounted) { - dispose = listen_dev(button, "click", /*getTags*/ ctx[1], false, false, false, false); - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*scanner*/ 1) { - toggle_class(button, "scanner", /*scanner*/ ctx[0]); - } - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(button); - mounted = false; - dispose(); - } - }; + if (!mounted) { + dispose = listen_dev( + button, + "click", + /*getTags*/ ctx[1], + false, + false, + false, + false, + ); + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if (dirty & /*scanner*/ 1) { + toggle_class(button, "scanner", /*scanner*/ ctx[0]); + } + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(button); + mounted = false; + dispose(); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function instance($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('TagButton', slots, []); - let scanner = false; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("TagButton", slots, []); + let scanner = false; - async function getTags() { - $$invalidate(0, scanner = true); - const [,scene_id] = getScenarioAndID(); - let url = await getUrlSprite(scene_id); - console.log(url); + async function getTags() { + $$invalidate(0, (scanner = true)); + const [, scene_id] = getScenarioAndID(); + let url = await getUrlSprite(scene_id); + console.log(url); - if (!url) { - alert("No sprite found, please ensure you have sprites enabled and generated for your scenes."); - $$invalidate(0, scanner = false); - return; - } + if (!url) { + alert( + "No sprite found, please ensure you have sprites enabled and generated for your scenes.", + ); + $$invalidate(0, (scanner = false)); + return; + } - // get image blob - const iblob = await fetch(url).then(res => res.blob()); + // get image blob + const iblob = await fetch(url).then((res) => res.blob()); - let image = await new Promise(resolve => { - let reader = new FileReader(); - reader.onload = () => resolve(reader.result); - reader.readAsDataURL(iblob); - }); + let image = await new Promise((resolve) => { + let reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.readAsDataURL(iblob); + }); - // get vtt blob - const vtt_url = url.replace("_sprite.jpg", "_thumbs.vtt"); + // get vtt blob + const vtt_url = url.replace("_sprite.jpg", "_thumbs.vtt"); - const vblob = await fetch(vtt_url).then(res => res.blob()); + const vblob = await fetch(vtt_url).then((res) => res.blob()); - let vtt = await new Promise(resolve => { - let reader = new FileReader(); - reader.onload = () => resolve(reader.result); - reader.readAsDataURL(vblob); - }); + let vtt = await new Promise((resolve) => { + let reader = new FileReader(); + reader.onload = () => resolve(reader.result); + reader.readAsDataURL(vblob); + }); - // query the api with a threshold of 0.2 as we want to do the filtering ourselves - var data = { "data": [image, vtt, 0.2] }; + // query the api with a threshold of 0.2 as we want to do the filtering ourselves + var data = { data: [image, vtt, 0.2] }; - fetch(STASHMARKER_API_URL, { - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8" - }, - body: JSON.stringify(data) - }).then(response => { - if (response.status !== 200) { - $$invalidate(0, scanner = false); - alert("Something went wrong. It's likely a server issue, Please try again later."); - return; - } + fetch(STASHMARKER_API_URL, { + method: "POST", + headers: { + "Content-Type": "application/json; charset=utf-8", + }, + body: JSON.stringify(data), + }) + .then((response) => { + if (response.status !== 200) { + $$invalidate(0, (scanner = false)); + alert( + "Something went wrong. It's likely a server issue, Please try again later.", + ); + return; + } - return response.json(); - }).then(data => { - $$invalidate(0, scanner = false); + return response.json(); + }) + .then((data) => { + $$invalidate(0, (scanner = false)); - if (data.data[0].length === 0) { - alert("No tags found"); - return; - } + if (data.data[0].length === 0) { + alert("No tags found"); + return; + } - // grab stash-tag-threshold from local storage or set to default - let threshold = localStorage.getItem('stash-tag-threshold') || 0.4; + // grab stash-tag-threshold from local storage or set to default + let threshold = localStorage.getItem("stash-tag-threshold") || 0.4; - new TagMatches({ - target: document.body, - props: { matches: data.data[0], url, threshold } - }); - }).catch(error => { - $$invalidate(0, scanner = false); + new TagMatches({ + target: document.body, + props: { matches: data.data[0], url, threshold }, + }); + }) + .catch((error) => { + $$invalidate(0, (scanner = false)); - if (error.message === "") { - alert("Error: Service may be down. please try again later."); - } else { - alert("Error: " + error.message); - } - }); - } + if (error.message === "") { + alert("Error: Service may be down. please try again later."); + } else { + alert("Error: " + error.message); + } + }); + } - const writable_props = []; + const writable_props = []; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console_1.warn(` was created with unknown prop '${key}'`); - }); + Object.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console_1.warn(` was created with unknown prop '${key}'`); + }); - $$self.$capture_state = () => ({ - getScenarioAndID, - getUrlSprite, - STASHMARKER_API_URL, - TagMatches, - scanner, - getTags - }); + $$self.$capture_state = () => ({ + getScenarioAndID, + getUrlSprite, + STASHMARKER_API_URL, + TagMatches, + scanner, + getTags, + }); - $$self.$inject_state = $$props => { - if ('scanner' in $$props) $$invalidate(0, scanner = $$props.scanner); - }; + $$self.$inject_state = ($$props) => { + if ("scanner" in $$props) $$invalidate(0, (scanner = $$props.scanner)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - return [scanner, getTags]; + return [scanner, getTags]; } class TagButton extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance, create_fragment, safe_not_equal, {}); + constructor(options) { + super(options); + init(this, options, instance, create_fragment, safe_not_equal, {}); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "TagButton", - options, - id: create_fragment.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "TagButton", + options, + id: create_fragment.name, + }); + } } stash.addEventListener("stash:page:scene", function () { - let elms = ".ml-auto .btn-group"; - waitForElm(elms).then(() => { - if (!document.querySelector("#stashmarker")) { - new MarkerButton({ target: document.querySelector(elms) }); - } - }); + let elms = ".ml-auto .btn-group"; + waitForElm(elms).then(() => { + if (!document.querySelector("#stashmarker")) { + new MarkerButton({ target: document.querySelector(elms) }); + } + }); }); stash.addEventListener("stash:page:scene", function () { - let elms = ".ml-auto .btn-group"; - waitForElm(elms).then(() => { - if (!document.querySelector("#stashtag")) { - new TagButton({ target: document.querySelector(elms) }); - } - }); + let elms = ".ml-auto .btn-group"; + waitForElm(elms).then(() => { + if (!document.querySelector("#stashtag")) { + new TagButton({ target: document.querySelector(elms) }); + } + }); }); - })(); diff --git a/plugins/stashAI/stashai.yml b/plugins/stashAI/stashai.yml index f3b1c9d..9b67e61 100644 --- a/plugins/stashAI/stashai.yml +++ b/plugins/stashAI/stashai.yml @@ -3,12 +3,12 @@ name: Stash AI description: Add Tags or Markers to a video using AI version: 1.0.2 ui: - requires: - - StashUserscriptLibrary + requires: + - StashUserscriptLibrary javascript: - - stashai.js + - stashai.js css: - - stashai.css + - stashai.css csp: connect-src: - - "https://cc1234-stashtag.hf.space" + - "https://cc1234-stashtag.hf.space" diff --git a/plugins/stashRealbooru/stash-realbooru.css b/plugins/stashRealbooru/stash-realbooru.css index 1f96a3c..f69ffdc 100644 --- a/plugins/stashRealbooru/stash-realbooru.css +++ b/plugins/stashRealbooru/stash-realbooru.css @@ -1 +1,81 @@ -button.svelte-1m5gxnd{background-color:var(--nav-color);border:0px}.scanner.svelte-1m5gxnd{animation:svelte-1m5gxnd-pulse 2s infinite}@keyframes svelte-1m5gxnd-pulse{0%{transform:scale(0.95);box-shadow:0 0 0 0 var(--light)}70%{transform:scale(1.1);box-shadow:0 0 0 10px var(--info)}100%{transform:scale(0.95);box-shadow:0 0 0 0 var(--primary)}}svg.svelte-1m5gxnd{fill:#ffffff}.top-accent.svelte-9viihb{border-top:10px solid var(--primary);border-radius:3px}.modal-header.svelte-9viihb{font-size:2.4rem;border-bottom:0px;padding:20px}.modal-footer.svelte-9viihb{border-top:0px}.lds-dual-ring.svelte-9viihb{display:inline-block;width:16px;height:16px}.lds-dual-ring.svelte-9viihb:after{content:" ";display:block;width:12px;height:12px;margin:3px;border-radius:50%;border:6px solid #fff;border-color:#fff transparent #fff transparent;animation:svelte-9viihb-lds-dual-ring 1.2s linear infinite}@keyframes svelte-9viihb-lds-dual-ring{0%{transform:rotate(0deg)}100%{transform:rotate(360deg)}}.tag.svelte-ai57u1{padding:6px}.tag-item.svelte-ai57u1{background-color:var(--card-color);width:100%;padding:5px;margin:0px}.tag-item-select.svelte-ai57u1{border:none;outline:none;scroll-behavior:smooth}.tag-item-reject.svelte-ai57u1:hover{fill:#a82c2c;transition:fill 0.2s ease-out}svg.svelte-ai57u1{fill:#ffffff} \ No newline at end of file +button.svelte-1m5gxnd { + background-color: var(--nav-color); + border: 0px; +} +.scanner.svelte-1m5gxnd { + animation: svelte-1m5gxnd-pulse 2s infinite; +} +@keyframes svelte-1m5gxnd-pulse { + 0% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--light); + } + 70% { + transform: scale(1.1); + box-shadow: 0 0 0 10px var(--info); + } + 100% { + transform: scale(0.95); + box-shadow: 0 0 0 0 var(--primary); + } +} +svg.svelte-1m5gxnd { + fill: #ffffff; +} +.top-accent.svelte-9viihb { + border-top: 10px solid var(--primary); + border-radius: 3px; +} +.modal-header.svelte-9viihb { + font-size: 2.4rem; + border-bottom: 0px; + padding: 20px; +} +.modal-footer.svelte-9viihb { + border-top: 0px; +} +.lds-dual-ring.svelte-9viihb { + display: inline-block; + width: 16px; + height: 16px; +} +.lds-dual-ring.svelte-9viihb:after { + content: " "; + display: block; + width: 12px; + height: 12px; + margin: 3px; + border-radius: 50%; + border: 6px solid #fff; + border-color: #fff transparent #fff transparent; + animation: svelte-9viihb-lds-dual-ring 1.2s linear infinite; +} +@keyframes svelte-9viihb-lds-dual-ring { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(360deg); + } +} +.tag.svelte-ai57u1 { + padding: 6px; +} +.tag-item.svelte-ai57u1 { + background-color: var(--card-color); + width: 100%; + padding: 5px; + margin: 0px; +} +.tag-item-select.svelte-ai57u1 { + border: none; + outline: none; + scroll-behavior: smooth; +} +.tag-item-reject.svelte-ai57u1:hover { + fill: #a82c2c; + transition: fill 0.2s ease-out; +} +svg.svelte-ai57u1 { + fill: #ffffff; +} diff --git a/plugins/stashRealbooru/stash-realbooru.js b/plugins/stashRealbooru/stash-realbooru.js index 2445bbe..dda24e4 100644 --- a/plugins/stashRealbooru/stash-realbooru.js +++ b/plugins/stashRealbooru/stash-realbooru.js @@ -1,10 +1,9 @@ (function () { - 'use strict'; + "use strict"; let REALBOORU_API_URL = "https://cc1234-deepdanbooru.hf.space/api/predict"; let THRESHOLD = 0.6; // remove matches with a distance higher than this - function waitForElm(selector) { return new Promise((resolve) => { if (document.querySelector(selector)) { @@ -25,7 +24,6 @@ }); } - /** * Retrieves the tags associated with a given image ID. * @@ -46,7 +44,6 @@ return result.data.findImage.tags.map((p) => p.id); } - /** * Updates a image with the given image_id and tag_ids. * @param {string} image_id - The ID of the image to update. @@ -65,7 +62,6 @@ return stash.callGQL(reqData); } - /** * Returns an array with the scenario and scenario ID parsed from the current URL. * @returns {Array} An array with the scenario and scenario ID. @@ -84,7 +80,7 @@ */ async function createTag(tag_name) { const reqData = { - variables: { input: {name: tag_name} }, + variables: { input: { name: tag_name } }, query: `mutation tagCreate($input: TagCreateInput!) { tagCreate(input: $input){ id @@ -95,7 +91,6 @@ return result.data.tagCreate.id; } - /** * Retrieves all tags from the server and returns them as an object with tag names as keys and tag IDs as values. * @returns {Promise} An object with tag names as keys and tag IDs as values. @@ -120,160 +115,160 @@ }, {}); } - function noop() { } - const identity = x => x; + function noop() {} + const identity = (x) => x; function assign(tar, src) { - // @ts-ignore - for (const k in src) - tar[k] = src[k]; - return tar; + // @ts-ignore + for (const k in src) tar[k] = src[k]; + return tar; } function add_location(element, file, line, column, char) { - element.__svelte_meta = { - loc: { file, line, column, char } - }; + element.__svelte_meta = { + loc: { file, line, column, char }, + }; } function run(fn) { - return fn(); + return fn(); } function blank_object() { - return Object.create(null); + return Object.create(null); } function run_all(fns) { - fns.forEach(run); + fns.forEach(run); } function is_function(thing) { - return typeof thing === 'function'; + return typeof thing === "function"; } function safe_not_equal(a, b) { - return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function'); + return a != a + ? b == b + : a !== b || (a && typeof a === "object") || typeof a === "function"; } function is_empty(obj) { - return Object.keys(obj).length === 0; + return Object.keys(obj).length === 0; } function split_css_unit(value) { - const split = typeof value === 'string' && value.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/); - return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px']; + const split = + typeof value === "string" && value.match(/^\s*(-?[\d.]+)([^\s]*)\s*$/); + return split ? [parseFloat(split[1]), split[2] || "px"] : [value, "px"]; } - const is_client = typeof window !== 'undefined'; - let now = is_client - ? () => window.performance.now() - : () => Date.now(); - let raf = is_client ? cb => requestAnimationFrame(cb) : noop; + const is_client = typeof window !== "undefined"; + let now = is_client ? () => window.performance.now() : () => Date.now(); + let raf = is_client ? (cb) => requestAnimationFrame(cb) : noop; const tasks = new Set(); function run_tasks(now) { - tasks.forEach(task => { - if (!task.c(now)) { - tasks.delete(task); - task.f(); - } - }); - if (tasks.size !== 0) - raf(run_tasks); + tasks.forEach((task) => { + if (!task.c(now)) { + tasks.delete(task); + task.f(); + } + }); + if (tasks.size !== 0) raf(run_tasks); } /** * Creates a new task that runs on each raf frame * until it returns a falsy value or is aborted */ function loop(callback) { - let task; - if (tasks.size === 0) - raf(run_tasks); - return { - promise: new Promise(fulfill => { - tasks.add(task = { c: callback, f: fulfill }); - }), - abort() { - tasks.delete(task); - } - }; + let task; + if (tasks.size === 0) raf(run_tasks); + return { + promise: new Promise((fulfill) => { + tasks.add((task = { c: callback, f: fulfill })); + }), + abort() { + tasks.delete(task); + }, + }; } - const globals = (typeof window !== 'undefined' + const globals = + typeof window !== "undefined" ? window - : typeof globalThis !== 'undefined' - ? globalThis - : global); + : typeof globalThis !== "undefined" + ? globalThis + : global; function append(target, node) { - target.appendChild(node); + target.appendChild(node); } function get_root_for_style(node) { - if (!node) - return document; - const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; - if (root && root.host) { - return root; - } - return node.ownerDocument; + if (!node) return document; + const root = node.getRootNode ? node.getRootNode() : node.ownerDocument; + if (root && root.host) { + return root; + } + return node.ownerDocument; } function append_empty_stylesheet(node) { - const style_element = element('style'); - append_stylesheet(get_root_for_style(node), style_element); - return style_element.sheet; + const style_element = element("style"); + append_stylesheet(get_root_for_style(node), style_element); + return style_element.sheet; } function append_stylesheet(node, style) { - append(node.head || node, style); - return style.sheet; + append(node.head || node, style); + return style.sheet; } function insert(target, node, anchor) { - target.insertBefore(node, anchor || null); + target.insertBefore(node, anchor || null); } function detach(node) { - if (node.parentNode) { - node.parentNode.removeChild(node); - } + if (node.parentNode) { + node.parentNode.removeChild(node); + } } function element(name) { - return document.createElement(name); + return document.createElement(name); } function svg_element(name) { - return document.createElementNS('http://www.w3.org/2000/svg', name); + return document.createElementNS("http://www.w3.org/2000/svg", name); } function text(data) { - return document.createTextNode(data); + return document.createTextNode(data); } function space() { - return text(' '); + return text(" "); } function empty() { - return text(''); + return text(""); } function listen(node, event, handler, options) { - node.addEventListener(event, handler, options); - return () => node.removeEventListener(event, handler, options); + node.addEventListener(event, handler, options); + return () => node.removeEventListener(event, handler, options); } function attr(node, attribute, value) { - if (value == null) - node.removeAttribute(attribute); - else if (node.getAttribute(attribute) !== value) - node.setAttribute(attribute, value); + if (value == null) node.removeAttribute(attribute); + else if (node.getAttribute(attribute) !== value) + node.setAttribute(attribute, value); } function to_number(value) { - return value === '' ? null : +value; + return value === "" ? null : +value; } function children(element) { - return Array.from(element.childNodes); + return Array.from(element.childNodes); } function set_input_value(input, value) { - input.value = value == null ? '' : value; + input.value = value == null ? "" : value; } function set_style(node, key, value, important) { - if (value == null) { - node.style.removeProperty(key); - } - else { - node.style.setProperty(key, value, important ? 'important' : ''); - } + if (value == null) { + node.style.removeProperty(key); + } else { + node.style.setProperty(key, value, important ? "important" : ""); + } } function toggle_class(element, name, toggle) { - element.classList[toggle ? 'add' : 'remove'](name); + element.classList[toggle ? "add" : "remove"](name); } - function custom_event(type, detail, { bubbles = false, cancelable = false } = {}) { - const e = document.createEvent('CustomEvent'); - e.initCustomEvent(type, bubbles, cancelable, detail); - return e; + function custom_event( + type, + detail, + { bubbles = false, cancelable = false } = {}, + ) { + const e = document.createEvent("CustomEvent"); + e.initCustomEvent(type, bubbles, cancelable, detail); + return e; } // we need to store the information for multiple documents because a Svelte application could also contain iframes @@ -282,142 +277,152 @@ let active = 0; // https://github.com/darkskyapp/string-hash/blob/master/index.js function hash(str) { - let hash = 5381; - let i = str.length; - while (i--) - hash = ((hash << 5) - hash) ^ str.charCodeAt(i); - return hash >>> 0; + let hash = 5381; + let i = str.length; + while (i--) hash = ((hash << 5) - hash) ^ str.charCodeAt(i); + return hash >>> 0; } function create_style_information(doc, node) { - const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; - managed_styles.set(doc, info); - return info; + const info = { stylesheet: append_empty_stylesheet(node), rules: {} }; + managed_styles.set(doc, info); + return info; } function create_rule(node, a, b, duration, delay, ease, fn, uid = 0) { - const step = 16.666 / duration; - let keyframes = '{\n'; - for (let p = 0; p <= 1; p += step) { - const t = a + (b - a) * ease(p); - keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; - } - const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; - const name = `__svelte_${hash(rule)}_${uid}`; - const doc = get_root_for_style(node); - const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node); - if (!rules[name]) { - rules[name] = true; - stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length); - } - const animation = node.style.animation || ''; - node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`; - active += 1; - return name; + const step = 16.666 / duration; + let keyframes = "{\n"; + for (let p = 0; p <= 1; p += step) { + const t = a + (b - a) * ease(p); + keyframes += p * 100 + `%{${fn(t, 1 - t)}}\n`; + } + const rule = keyframes + `100% {${fn(b, 1 - b)}}\n}`; + const name = `__svelte_${hash(rule)}_${uid}`; + const doc = get_root_for_style(node); + const { stylesheet, rules } = + managed_styles.get(doc) || create_style_information(doc, node); + if (!rules[name]) { + rules[name] = true; + stylesheet.insertRule( + `@keyframes ${name} ${rule}`, + stylesheet.cssRules.length, + ); + } + const animation = node.style.animation || ""; + node.style.animation = `${animation ? `${animation}, ` : ""}${name} ${duration}ms linear ${delay}ms 1 both`; + active += 1; + return name; } function delete_rule(node, name) { - const previous = (node.style.animation || '').split(', '); - const next = previous.filter(name - ? anim => anim.indexOf(name) < 0 // remove specific animation - : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations - ); - const deleted = previous.length - next.length; - if (deleted) { - node.style.animation = next.join(', '); - active -= deleted; - if (!active) - clear_rules(); - } + const previous = (node.style.animation || "").split(", "); + const next = previous.filter( + name + ? (anim) => anim.indexOf(name) < 0 // remove specific animation + : (anim) => anim.indexOf("__svelte") === -1, // remove all Svelte animations + ); + const deleted = previous.length - next.length; + if (deleted) { + node.style.animation = next.join(", "); + active -= deleted; + if (!active) clear_rules(); + } } function clear_rules() { - raf(() => { - if (active) - return; - managed_styles.forEach(info => { - const { ownerNode } = info.stylesheet; - // there is no ownerNode if it runs on jsdom. - if (ownerNode) - detach(ownerNode); - }); - managed_styles.clear(); + raf(() => { + if (active) return; + managed_styles.forEach((info) => { + const { ownerNode } = info.stylesheet; + // there is no ownerNode if it runs on jsdom. + if (ownerNode) detach(ownerNode); }); + managed_styles.clear(); + }); } function create_animation(node, from, fn, params) { - if (!from) - return noop; - const to = node.getBoundingClientRect(); - if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom) - return noop; - const { delay = 0, duration = 300, easing = identity, + if (!from) return noop; + const to = node.getBoundingClientRect(); + if ( + from.left === to.left && + from.right === to.right && + from.top === to.top && + from.bottom === to.bottom + ) + return noop; + const { + delay = 0, + duration = 300, + easing = identity, // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation? - start: start_time = now() + delay, + start: start_time = now() + delay, // @ts-ignore todo: - end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params); - let running = true; - let started = false; - let name; - function start() { - if (css) { - name = create_rule(node, 0, 1, duration, delay, easing, css); - } - if (!delay) { - started = true; - } + end = start_time + duration, + tick = noop, + css, + } = fn(node, { from, to }, params); + let running = true; + let started = false; + let name; + function start() { + if (css) { + name = create_rule(node, 0, 1, duration, delay, easing, css); } - function stop() { - if (css) - delete_rule(node, name); - running = false; + if (!delay) { + started = true; } - loop(now => { - if (!started && now >= start_time) { - started = true; - } - if (started && now >= end) { - tick(1, 0); - stop(); - } - if (!running) { - return false; - } - if (started) { - const p = now - start_time; - const t = 0 + 1 * easing(p / duration); - tick(t, 1 - t); - } - return true; - }); - start(); - tick(0, 1); - return stop; + } + function stop() { + if (css) delete_rule(node, name); + running = false; + } + loop((now) => { + if (!started && now >= start_time) { + started = true; + } + if (started && now >= end) { + tick(1, 0); + stop(); + } + if (!running) { + return false; + } + if (started) { + const p = now - start_time; + const t = 0 + 1 * easing(p / duration); + tick(t, 1 - t); + } + return true; + }); + start(); + tick(0, 1); + return stop; } function fix_position(node) { - const style = getComputedStyle(node); - if (style.position !== 'absolute' && style.position !== 'fixed') { - const { width, height } = style; - const a = node.getBoundingClientRect(); - node.style.position = 'absolute'; - node.style.width = width; - node.style.height = height; - add_transform(node, a); - } + const style = getComputedStyle(node); + if (style.position !== "absolute" && style.position !== "fixed") { + const { width, height } = style; + const a = node.getBoundingClientRect(); + node.style.position = "absolute"; + node.style.width = width; + node.style.height = height; + add_transform(node, a); + } } function add_transform(node, a) { - const b = node.getBoundingClientRect(); - if (a.left !== b.left || a.top !== b.top) { - const style = getComputedStyle(node); - const transform = style.transform === 'none' ? '' : style.transform; - node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`; - } + const b = node.getBoundingClientRect(); + if (a.left !== b.left || a.top !== b.top) { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`; + } } let current_component; function set_current_component(component) { - current_component = component; + current_component = component; } function get_current_component() { - if (!current_component) - throw new Error('Function called outside component initialization'); - return current_component; + if (!current_component) + throw new Error("Function called outside component initialization"); + return current_component; } /** * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM. @@ -429,7 +434,7 @@ * https://svelte.dev/docs#run-time-svelte-onmount */ function onMount(fn) { - get_current_component().$$.on_mount.push(fn); + get_current_component().$$.on_mount.push(fn); } /** * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname). @@ -444,20 +449,20 @@ * https://svelte.dev/docs#run-time-svelte-createeventdispatcher */ function createEventDispatcher() { - const component = get_current_component(); - return (type, detail, { cancelable = false } = {}) => { - const callbacks = component.$$.callbacks[type]; - if (callbacks) { - // TODO are there situations where events could be dispatched - // in a server (non-DOM) environment? - const event = custom_event(type, detail, { cancelable }); - callbacks.slice().forEach(fn => { - fn.call(component, event); - }); - return !event.defaultPrevented; - } - return true; - }; + const component = get_current_component(); + return (type, detail, { cancelable = false } = {}) => { + const callbacks = component.$$.callbacks[type]; + if (callbacks) { + // TODO are there situations where events could be dispatched + // in a server (non-DOM) environment? + const event = custom_event(type, detail, { cancelable }); + callbacks.slice().forEach((fn) => { + fn.call(component, event); + }); + return !event.defaultPrevented; + } + return true; + }; } const dirty_components = []; @@ -467,13 +472,13 @@ const resolved_promise = /* @__PURE__ */ Promise.resolve(); let update_scheduled = false; function schedule_update() { - if (!update_scheduled) { - update_scheduled = true; - resolved_promise.then(flush); - } + if (!update_scheduled) { + update_scheduled = true; + resolved_promise.then(flush); + } } function add_render_callback(fn) { - render_callbacks.push(fn); + render_callbacks.push(fn); } // flush() calls callbacks in this order: // 1. All beforeUpdate callbacks, in order: parents before children @@ -496,871 +501,1007 @@ const seen_callbacks = new Set(); let flushidx = 0; // Do *not* move this inside the flush() function function flush() { - // Do not reenter flush while dirty components are updated, as this can - // result in an infinite loop. Instead, let the inner flush handle it. - // Reentrancy is ok afterwards for bindings etc. - if (flushidx !== 0) { - return; + // Do not reenter flush while dirty components are updated, as this can + // result in an infinite loop. Instead, let the inner flush handle it. + // Reentrancy is ok afterwards for bindings etc. + if (flushidx !== 0) { + return; + } + const saved_component = current_component; + do { + // first, call beforeUpdate functions + // and update components + try { + while (flushidx < dirty_components.length) { + const component = dirty_components[flushidx]; + flushidx++; + set_current_component(component); + update(component.$$); + } + } catch (e) { + // reset dirty state to not end up in a deadlocked state and then rethrow + dirty_components.length = 0; + flushidx = 0; + throw e; } - const saved_component = current_component; - do { - // first, call beforeUpdate functions - // and update components - try { - while (flushidx < dirty_components.length) { - const component = dirty_components[flushidx]; - flushidx++; - set_current_component(component); - update(component.$$); - } - } - catch (e) { - // reset dirty state to not end up in a deadlocked state and then rethrow - dirty_components.length = 0; - flushidx = 0; - throw e; - } - set_current_component(null); - dirty_components.length = 0; - flushidx = 0; - while (binding_callbacks.length) - binding_callbacks.pop()(); - // then, once components are updated, call - // afterUpdate functions. This may cause - // subsequent updates... - for (let i = 0; i < render_callbacks.length; i += 1) { - const callback = render_callbacks[i]; - if (!seen_callbacks.has(callback)) { - // ...so guard against infinite loops - seen_callbacks.add(callback); - callback(); - } - } - render_callbacks.length = 0; - } while (dirty_components.length); - while (flush_callbacks.length) { - flush_callbacks.pop()(); + set_current_component(null); + dirty_components.length = 0; + flushidx = 0; + while (binding_callbacks.length) binding_callbacks.pop()(); + // then, once components are updated, call + // afterUpdate functions. This may cause + // subsequent updates... + for (let i = 0; i < render_callbacks.length; i += 1) { + const callback = render_callbacks[i]; + if (!seen_callbacks.has(callback)) { + // ...so guard against infinite loops + seen_callbacks.add(callback); + callback(); + } } - update_scheduled = false; - seen_callbacks.clear(); - set_current_component(saved_component); + render_callbacks.length = 0; + } while (dirty_components.length); + while (flush_callbacks.length) { + flush_callbacks.pop()(); + } + update_scheduled = false; + seen_callbacks.clear(); + set_current_component(saved_component); } function update($$) { - if ($$.fragment !== null) { - $$.update(); - run_all($$.before_update); - const dirty = $$.dirty; - $$.dirty = [-1]; - $$.fragment && $$.fragment.p($$.ctx, dirty); - $$.after_update.forEach(add_render_callback); - } + if ($$.fragment !== null) { + $$.update(); + run_all($$.before_update); + const dirty = $$.dirty; + $$.dirty = [-1]; + $$.fragment && $$.fragment.p($$.ctx, dirty); + $$.after_update.forEach(add_render_callback); + } } /** * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`. */ function flush_render_callbacks(fns) { - const filtered = []; - const targets = []; - render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c)); - targets.forEach((c) => c()); - render_callbacks = filtered; + const filtered = []; + const targets = []; + render_callbacks.forEach((c) => + fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c), + ); + targets.forEach((c) => c()); + render_callbacks = filtered; } let promise; function wait() { - if (!promise) { - promise = Promise.resolve(); - promise.then(() => { - promise = null; - }); - } - return promise; + if (!promise) { + promise = Promise.resolve(); + promise.then(() => { + promise = null; + }); + } + return promise; } function dispatch(node, direction, kind) { - node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`)); + node.dispatchEvent(custom_event(`${direction ? "intro" : "outro"}${kind}`)); } const outroing = new Set(); let outros; function group_outros() { - outros = { - r: 0, - c: [], - p: outros // parent group - }; + outros = { + r: 0, + c: [], + p: outros, // parent group + }; } function check_outros() { - if (!outros.r) { - run_all(outros.c); - } - outros = outros.p; + if (!outros.r) { + run_all(outros.c); + } + outros = outros.p; } function transition_in(block, local) { - if (block && block.i) { - outroing.delete(block); - block.i(local); - } + if (block && block.i) { + outroing.delete(block); + block.i(local); + } } function transition_out(block, local, detach, callback) { - if (block && block.o) { - if (outroing.has(block)) - return; - outroing.add(block); - outros.c.push(() => { - outroing.delete(block); - if (callback) { - if (detach) - block.d(1); - callback(); - } - }); - block.o(local); - } - else if (callback) { + if (block && block.o) { + if (outroing.has(block)) return; + outroing.add(block); + outros.c.push(() => { + outroing.delete(block); + if (callback) { + if (detach) block.d(1); callback(); - } + } + }); + block.o(local); + } else if (callback) { + callback(); + } } const null_transition = { duration: 0 }; function create_in_transition(node, fn, params) { - const options = { direction: 'in' }; - let config = fn(node, params, options); - let running = false; - let animation_name; - let task; - let uid = 0; - function cleanup() { - if (animation_name) - delete_rule(node, animation_name); - } - function go() { - const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition; - if (css) - animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++); - tick(0, 1); - const start_time = now() + delay; - const end_time = start_time + duration; - if (task) - task.abort(); - running = true; - add_render_callback(() => dispatch(node, true, 'start')); - task = loop(now => { - if (running) { - if (now >= end_time) { - tick(1, 0); - dispatch(node, true, 'end'); - cleanup(); - return running = false; - } - if (now >= start_time) { - const t = easing((now - start_time) / duration); - tick(t, 1 - t); - } - } - return running; - }); - } - let started = false; - return { - start() { - if (started) - return; - started = true; - delete_rule(node); - if (is_function(config)) { - config = config(options); - wait().then(go); - } - else { - go(); - } - }, - invalidate() { - started = false; - }, - end() { - if (running) { - cleanup(); - running = false; - } + const options = { direction: "in" }; + let config = fn(node, params, options); + let running = false; + let animation_name; + let task; + let uid = 0; + function cleanup() { + if (animation_name) delete_rule(node, animation_name); + } + function go() { + const { + delay = 0, + duration = 300, + easing = identity, + tick = noop, + css, + } = config || null_transition; + if (css) + animation_name = create_rule( + node, + 0, + 1, + duration, + delay, + easing, + css, + uid++, + ); + tick(0, 1); + const start_time = now() + delay; + const end_time = start_time + duration; + if (task) task.abort(); + running = true; + add_render_callback(() => dispatch(node, true, "start")); + task = loop((now) => { + if (running) { + if (now >= end_time) { + tick(1, 0); + dispatch(node, true, "end"); + cleanup(); + return (running = false); } - }; + if (now >= start_time) { + const t = easing((now - start_time) / duration); + tick(t, 1 - t); + } + } + return running; + }); + } + let started = false; + return { + start() { + if (started) return; + started = true; + delete_rule(node); + if (is_function(config)) { + config = config(options); + wait().then(go); + } else { + go(); + } + }, + invalidate() { + started = false; + }, + end() { + if (running) { + cleanup(); + running = false; + } + }, + }; } function create_out_transition(node, fn, params) { - const options = { direction: 'out' }; - let config = fn(node, params, options); - let running = true; - let animation_name; - const group = outros; - group.r += 1; - function go() { - const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition; - if (css) - animation_name = create_rule(node, 1, 0, duration, delay, easing, css); - const start_time = now() + delay; - const end_time = start_time + duration; - add_render_callback(() => dispatch(node, false, 'start')); - loop(now => { - if (running) { - if (now >= end_time) { - tick(0, 1); - dispatch(node, false, 'end'); - if (!--group.r) { - // this will result in `end()` being called, - // so we don't need to clean up here - run_all(group.c); - } - return false; - } - if (now >= start_time) { - const t = easing((now - start_time) / duration); - tick(1 - t, t); - } - } - return running; - }); - } - if (is_function(config)) { - wait().then(() => { - // @ts-ignore - config = config(options); - go(); - }); - } - else { - go(); - } - return { - end(reset) { - if (reset && config.tick) { - config.tick(1, 0); - } - if (running) { - if (animation_name) - delete_rule(node, animation_name); - running = false; - } + const options = { direction: "out" }; + let config = fn(node, params, options); + let running = true; + let animation_name; + const group = outros; + group.r += 1; + function go() { + const { + delay = 0, + duration = 300, + easing = identity, + tick = noop, + css, + } = config || null_transition; + if (css) + animation_name = create_rule(node, 1, 0, duration, delay, easing, css); + const start_time = now() + delay; + const end_time = start_time + duration; + add_render_callback(() => dispatch(node, false, "start")); + loop((now) => { + if (running) { + if (now >= end_time) { + tick(0, 1); + dispatch(node, false, "end"); + if (!--group.r) { + // this will result in `end()` being called, + // so we don't need to clean up here + run_all(group.c); + } + return false; } - }; + if (now >= start_time) { + const t = easing((now - start_time) / duration); + tick(1 - t, t); + } + } + return running; + }); + } + if (is_function(config)) { + wait().then(() => { + // @ts-ignore + config = config(options); + go(); + }); + } else { + go(); + } + return { + end(reset) { + if (reset && config.tick) { + config.tick(1, 0); + } + if (running) { + if (animation_name) delete_rule(node, animation_name); + running = false; + } + }, + }; } function outro_and_destroy_block(block, lookup) { - transition_out(block, 1, 1, () => { - lookup.delete(block.key); - }); + transition_out(block, 1, 1, () => { + lookup.delete(block.key); + }); } function fix_and_outro_and_destroy_block(block, lookup) { - block.f(); - outro_and_destroy_block(block, lookup); + block.f(); + outro_and_destroy_block(block, lookup); } - function update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) { - let o = old_blocks.length; - let n = list.length; - let i = o; - const old_indexes = {}; - while (i--) - old_indexes[old_blocks[i].key] = i; - const new_blocks = []; - const new_lookup = new Map(); - const deltas = new Map(); - const updates = []; - i = n; - while (i--) { - const child_ctx = get_context(ctx, list, i); - const key = get_key(child_ctx); - let block = lookup.get(key); - if (!block) { - block = create_each_block(key, child_ctx); - block.c(); - } - else if (dynamic) { - // defer updates until all the DOM shuffling is done - updates.push(() => block.p(child_ctx, dirty)); - } - new_lookup.set(key, new_blocks[i] = block); - if (key in old_indexes) - deltas.set(key, Math.abs(i - old_indexes[key])); + function update_keyed_each( + old_blocks, + dirty, + get_key, + dynamic, + ctx, + list, + lookup, + node, + destroy, + create_each_block, + next, + get_context, + ) { + let o = old_blocks.length; + let n = list.length; + let i = o; + const old_indexes = {}; + while (i--) old_indexes[old_blocks[i].key] = i; + const new_blocks = []; + const new_lookup = new Map(); + const deltas = new Map(); + const updates = []; + i = n; + while (i--) { + const child_ctx = get_context(ctx, list, i); + const key = get_key(child_ctx); + let block = lookup.get(key); + if (!block) { + block = create_each_block(key, child_ctx); + block.c(); + } else if (dynamic) { + // defer updates until all the DOM shuffling is done + updates.push(() => block.p(child_ctx, dirty)); } - const will_move = new Set(); - const did_move = new Set(); - function insert(block) { - transition_in(block, 1); - block.m(node, next); - lookup.set(block.key, block); - next = block.first; - n--; + new_lookup.set(key, (new_blocks[i] = block)); + if (key in old_indexes) deltas.set(key, Math.abs(i - old_indexes[key])); + } + const will_move = new Set(); + const did_move = new Set(); + function insert(block) { + transition_in(block, 1); + block.m(node, next); + lookup.set(block.key, block); + next = block.first; + n--; + } + while (o && n) { + const new_block = new_blocks[n - 1]; + const old_block = old_blocks[o - 1]; + const new_key = new_block.key; + const old_key = old_block.key; + if (new_block === old_block) { + // do nothing + next = new_block.first; + o--; + n--; + } else if (!new_lookup.has(old_key)) { + // remove old block + destroy(old_block, lookup); + o--; + } else if (!lookup.has(new_key) || will_move.has(new_key)) { + insert(new_block); + } else if (did_move.has(old_key)) { + o--; + } else if (deltas.get(new_key) > deltas.get(old_key)) { + did_move.add(new_key); + insert(new_block); + } else { + will_move.add(old_key); + o--; } - while (o && n) { - const new_block = new_blocks[n - 1]; - const old_block = old_blocks[o - 1]; - const new_key = new_block.key; - const old_key = old_block.key; - if (new_block === old_block) { - // do nothing - next = new_block.first; - o--; - n--; - } - else if (!new_lookup.has(old_key)) { - // remove old block - destroy(old_block, lookup); - o--; - } - else if (!lookup.has(new_key) || will_move.has(new_key)) { - insert(new_block); - } - else if (did_move.has(old_key)) { - o--; - } - else if (deltas.get(new_key) > deltas.get(old_key)) { - did_move.add(new_key); - insert(new_block); - } - else { - will_move.add(old_key); - o--; - } - } - while (o--) { - const old_block = old_blocks[o]; - if (!new_lookup.has(old_block.key)) - destroy(old_block, lookup); - } - while (n) - insert(new_blocks[n - 1]); - run_all(updates); - return new_blocks; + } + while (o--) { + const old_block = old_blocks[o]; + if (!new_lookup.has(old_block.key)) destroy(old_block, lookup); + } + while (n) insert(new_blocks[n - 1]); + run_all(updates); + return new_blocks; } function validate_each_keys(ctx, list, get_context, get_key) { - const keys = new Set(); - for (let i = 0; i < list.length; i++) { - const key = get_key(get_context(ctx, list, i)); - if (keys.has(key)) { - throw new Error('Cannot have duplicate keys in a keyed each'); - } - keys.add(key); + const keys = new Set(); + for (let i = 0; i < list.length; i++) { + const key = get_key(get_context(ctx, list, i)); + if (keys.has(key)) { + throw new Error("Cannot have duplicate keys in a keyed each"); } + keys.add(key); + } } function get_spread_update(levels, updates) { - const update = {}; - const to_null_out = {}; - const accounted_for = { $$scope: 1 }; - let i = levels.length; - while (i--) { - const o = levels[i]; - const n = updates[i]; - if (n) { - for (const key in o) { - if (!(key in n)) - to_null_out[key] = 1; - } - for (const key in n) { - if (!accounted_for[key]) { - update[key] = n[key]; - accounted_for[key] = 1; - } - } - levels[i] = n; - } - else { - for (const key in o) { - accounted_for[key] = 1; - } + const update = {}; + const to_null_out = {}; + const accounted_for = { $$scope: 1 }; + let i = levels.length; + while (i--) { + const o = levels[i]; + const n = updates[i]; + if (n) { + for (const key in o) { + if (!(key in n)) to_null_out[key] = 1; + } + for (const key in n) { + if (!accounted_for[key]) { + update[key] = n[key]; + accounted_for[key] = 1; } + } + levels[i] = n; + } else { + for (const key in o) { + accounted_for[key] = 1; + } } - for (const key in to_null_out) { - if (!(key in update)) - update[key] = undefined; - } - return update; + } + for (const key in to_null_out) { + if (!(key in update)) update[key] = undefined; + } + return update; } function get_spread_object(spread_props) { - return typeof spread_props === 'object' && spread_props !== null ? spread_props : {}; + return typeof spread_props === "object" && spread_props !== null + ? spread_props + : {}; } function create_component(block) { - block && block.c(); + block && block.c(); } function mount_component(component, target, anchor, customElement) { - const { fragment, after_update } = component.$$; - fragment && fragment.m(target, anchor); - if (!customElement) { - // onMount happens before the initial afterUpdate - add_render_callback(() => { - const new_on_destroy = component.$$.on_mount.map(run).filter(is_function); - // if the component was destroyed immediately - // it will update the `$$.on_destroy` reference to `null`. - // the destructured on_destroy may still reference to the old array - if (component.$$.on_destroy) { - component.$$.on_destroy.push(...new_on_destroy); - } - else { - // Edge case - component was destroyed immediately, - // most likely as a result of a binding initialising - run_all(new_on_destroy); - } - component.$$.on_mount = []; - }); - } - after_update.forEach(add_render_callback); + const { fragment, after_update } = component.$$; + fragment && fragment.m(target, anchor); + if (!customElement) { + // onMount happens before the initial afterUpdate + add_render_callback(() => { + const new_on_destroy = component.$$.on_mount + .map(run) + .filter(is_function); + // if the component was destroyed immediately + // it will update the `$$.on_destroy` reference to `null`. + // the destructured on_destroy may still reference to the old array + if (component.$$.on_destroy) { + component.$$.on_destroy.push(...new_on_destroy); + } else { + // Edge case - component was destroyed immediately, + // most likely as a result of a binding initialising + run_all(new_on_destroy); + } + component.$$.on_mount = []; + }); + } + after_update.forEach(add_render_callback); } function destroy_component(component, detaching) { - const $$ = component.$$; - if ($$.fragment !== null) { - flush_render_callbacks($$.after_update); - run_all($$.on_destroy); - $$.fragment && $$.fragment.d(detaching); - // TODO null out other refs, including component.$$ (but need to - // preserve final state?) - $$.on_destroy = $$.fragment = null; - $$.ctx = []; - } + const $$ = component.$$; + if ($$.fragment !== null) { + flush_render_callbacks($$.after_update); + run_all($$.on_destroy); + $$.fragment && $$.fragment.d(detaching); + // TODO null out other refs, including component.$$ (but need to + // preserve final state?) + $$.on_destroy = $$.fragment = null; + $$.ctx = []; + } } function make_dirty(component, i) { - if (component.$$.dirty[0] === -1) { - dirty_components.push(component); - schedule_update(); - component.$$.dirty.fill(0); - } - component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31)); + if (component.$$.dirty[0] === -1) { + dirty_components.push(component); + schedule_update(); + component.$$.dirty.fill(0); + } + component.$$.dirty[(i / 31) | 0] |= 1 << i % 31; } - function init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) { - const parent_component = current_component; - set_current_component(component); - const $$ = component.$$ = { - fragment: null, - ctx: [], - // state - props, - update: noop, - not_equal, - bound: blank_object(), - // lifecycle - on_mount: [], - on_destroy: [], - on_disconnect: [], - before_update: [], - after_update: [], - context: new Map(options.context || (parent_component ? parent_component.$$.context : [])), - // everything else - callbacks: blank_object(), - dirty, - skip_bound: false, - root: options.target || parent_component.$$.root - }; - append_styles && append_styles($$.root); - let ready = false; - $$.ctx = instance - ? instance(component, options.props || {}, (i, ret, ...rest) => { - const value = rest.length ? rest[0] : ret; - if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) { - if (!$$.skip_bound && $$.bound[i]) - $$.bound[i](value); - if (ready) - make_dirty(component, i); - } - return ret; - }) - : []; - $$.update(); - ready = true; - run_all($$.before_update); - // `false` as a special case of no DOM component - $$.fragment = create_fragment ? create_fragment($$.ctx) : false; - if (options.target) { - if (options.hydrate) { - const nodes = children(options.target); - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.l(nodes); - nodes.forEach(detach); + function init( + component, + options, + instance, + create_fragment, + not_equal, + props, + append_styles, + dirty = [-1], + ) { + const parent_component = current_component; + set_current_component(component); + const $$ = (component.$$ = { + fragment: null, + ctx: [], + // state + props, + update: noop, + not_equal, + bound: blank_object(), + // lifecycle + on_mount: [], + on_destroy: [], + on_disconnect: [], + before_update: [], + after_update: [], + context: new Map( + options.context || + (parent_component ? parent_component.$$.context : []), + ), + // everything else + callbacks: blank_object(), + dirty, + skip_bound: false, + root: options.target || parent_component.$$.root, + }); + append_styles && append_styles($$.root); + let ready = false; + $$.ctx = instance + ? instance(component, options.props || {}, (i, ret, ...rest) => { + const value = rest.length ? rest[0] : ret; + if ($$.ctx && not_equal($$.ctx[i], ($$.ctx[i] = value))) { + if (!$$.skip_bound && $$.bound[i]) $$.bound[i](value); + if (ready) make_dirty(component, i); } - else { - // eslint-disable-next-line @typescript-eslint/no-non-null-assertion - $$.fragment && $$.fragment.c(); - } - if (options.intro) - transition_in(component.$$.fragment); - mount_component(component, options.target, options.anchor, options.customElement); - flush(); + return ret; + }) + : []; + $$.update(); + ready = true; + run_all($$.before_update); + // `false` as a special case of no DOM component + $$.fragment = create_fragment ? create_fragment($$.ctx) : false; + if (options.target) { + if (options.hydrate) { + const nodes = children(options.target); + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.l(nodes); + nodes.forEach(detach); + } else { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + $$.fragment && $$.fragment.c(); } - set_current_component(parent_component); + if (options.intro) transition_in(component.$$.fragment); + mount_component( + component, + options.target, + options.anchor, + options.customElement, + ); + flush(); + } + set_current_component(parent_component); } /** * Base class for Svelte components. Used when dev=false. */ class SvelteComponent { - $destroy() { - destroy_component(this, 1); - this.$destroy = noop; + $destroy() { + destroy_component(this, 1); + this.$destroy = noop; + } + $on(type, callback) { + if (!is_function(callback)) { + return noop; } - $on(type, callback) { - if (!is_function(callback)) { - return noop; - } - const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = [])); - callbacks.push(callback); - return () => { - const index = callbacks.indexOf(callback); - if (index !== -1) - callbacks.splice(index, 1); - }; - } - $set($$props) { - if (this.$$set && !is_empty($$props)) { - this.$$.skip_bound = true; - this.$$set($$props); - this.$$.skip_bound = false; - } + const callbacks = + this.$$.callbacks[type] || (this.$$.callbacks[type] = []); + callbacks.push(callback); + return () => { + const index = callbacks.indexOf(callback); + if (index !== -1) callbacks.splice(index, 1); + }; + } + $set($$props) { + if (this.$$set && !is_empty($$props)) { + this.$$.skip_bound = true; + this.$$set($$props); + this.$$.skip_bound = false; } + } } function dispatch_dev(type, detail) { - document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true })); + document.dispatchEvent( + custom_event(type, Object.assign({ version: "3.59.2" }, detail), { + bubbles: true, + }), + ); } function append_dev(target, node) { - dispatch_dev('SvelteDOMInsert', { target, node }); - append(target, node); + dispatch_dev("SvelteDOMInsert", { target, node }); + append(target, node); } function insert_dev(target, node, anchor) { - dispatch_dev('SvelteDOMInsert', { target, node, anchor }); - insert(target, node, anchor); + dispatch_dev("SvelteDOMInsert", { target, node, anchor }); + insert(target, node, anchor); } function detach_dev(node) { - dispatch_dev('SvelteDOMRemove', { node }); - detach(node); + dispatch_dev("SvelteDOMRemove", { node }); + detach(node); } - function listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) { - const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : []; - if (has_prevent_default) - modifiers.push('preventDefault'); - if (has_stop_propagation) - modifiers.push('stopPropagation'); - if (has_stop_immediate_propagation) - modifiers.push('stopImmediatePropagation'); - dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers }); - const dispose = listen(node, event, handler, options); - return () => { - dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers }); - dispose(); - }; + function listen_dev( + node, + event, + handler, + options, + has_prevent_default, + has_stop_propagation, + has_stop_immediate_propagation, + ) { + const modifiers = + options === true + ? ["capture"] + : options + ? Array.from(Object.keys(options)) + : []; + if (has_prevent_default) modifiers.push("preventDefault"); + if (has_stop_propagation) modifiers.push("stopPropagation"); + if (has_stop_immediate_propagation) + modifiers.push("stopImmediatePropagation"); + dispatch_dev("SvelteDOMAddEventListener", { + node, + event, + handler, + modifiers, + }); + const dispose = listen(node, event, handler, options); + return () => { + dispatch_dev("SvelteDOMRemoveEventListener", { + node, + event, + handler, + modifiers, + }); + dispose(); + }; } function attr_dev(node, attribute, value) { - attr(node, attribute, value); - if (value == null) - dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute }); - else - dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value }); + attr(node, attribute, value); + if (value == null) + dispatch_dev("SvelteDOMRemoveAttribute", { node, attribute }); + else dispatch_dev("SvelteDOMSetAttribute", { node, attribute, value }); } function set_data_dev(text, data) { - data = '' + data; - if (text.data === data) - return; - dispatch_dev('SvelteDOMSetData', { node: text, data }); - text.data = data; + data = "" + data; + if (text.data === data) return; + dispatch_dev("SvelteDOMSetData", { node: text, data }); + text.data = data; } function validate_each_argument(arg) { - if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) { - let msg = '{#each} only iterates over array-like objects.'; - if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) { - msg += ' You can use a spread to convert this iterable into an array.'; - } - throw new Error(msg); + if ( + typeof arg !== "string" && + !(arg && typeof arg === "object" && "length" in arg) + ) { + let msg = "{#each} only iterates over array-like objects."; + if (typeof Symbol === "function" && arg && Symbol.iterator in arg) { + msg += " You can use a spread to convert this iterable into an array."; } + throw new Error(msg); + } } function validate_slots(name, slot, keys) { - for (const slot_key of Object.keys(slot)) { - if (!~keys.indexOf(slot_key)) { - console.warn(`<${name}> received an unexpected slot "${slot_key}".`); - } + for (const slot_key of Object.keys(slot)) { + if (!~keys.indexOf(slot_key)) { + console.warn(`<${name}> received an unexpected slot "${slot_key}".`); } + } } /** * Base class for Svelte components with some minor dev-enhancements. Used when dev=true. */ class SvelteComponentDev extends SvelteComponent { - constructor(options) { - if (!options || (!options.target && !options.$$inline)) { - throw new Error("'target' is a required option"); - } - super(); + constructor(options) { + if (!options || (!options.target && !options.$$inline)) { + throw new Error("'target' is a required option"); } - $destroy() { - super.$destroy(); - this.$destroy = () => { - console.warn('Component was already destroyed'); // eslint-disable-line no-console - }; - } - $capture_state() { } - $inject_state() { } + super(); + } + $destroy() { + super.$destroy(); + this.$destroy = () => { + console.warn("Component was already destroyed"); // eslint-disable-line no-console + }; + } + $capture_state() {} + $inject_state() {} } /* src/Tag.svelte generated by Svelte v3.59.2 */ const file$2 = "src/Tag.svelte"; function create_fragment$2(ctx) { - let div2; - let div1; - let div0; - let div0_class_value; - let div0_aria_valuenow_value; - let t0; - let span; - let t1; - let t2; - let svg; - let path; - let mounted; - let dispose; + let div2; + let div1; + let div0; + let div0_class_value; + let div0_aria_valuenow_value; + let t0; + let span; + let t1; + let t2; + let svg; + let path; + let mounted; + let dispose; - const block = { - c: function create() { - div2 = element("div"); - div1 = element("div"); - div0 = element("div"); - t0 = space(); - span = element("span"); - t1 = text(/*name*/ ctx[1]); - t2 = space(); - svg = svg_element("svg"); - path = svg_element("path"); - attr_dev(div0, "class", div0_class_value = "progress-bar progress-bar-striped bg-" + confidence(/*prob*/ ctx[2]) + " svelte-ai57u1"); - attr_dev(div0, "role", "progressbar"); - set_style(div0, "width", /*prob*/ ctx[2] * 100 + "%"); - attr_dev(div0, "aria-valuenow", div0_aria_valuenow_value = /*prob*/ ctx[2] * 100); - attr_dev(div0, "aria-valuemin", "0"); - attr_dev(div0, "aria-valuemax", "100"); - add_location(div0, file$2, 24, 4, 440); - attr_dev(div1, "class", "progress"); - set_style(div1, "height", "5px"); - add_location(div1, file$2, 23, 2, 393); - attr_dev(path, "d", "M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z"); - add_location(path, file$2, 45, 7, 954); - attr_dev(svg, "height", "20"); - attr_dev(svg, "width", "20"); - attr_dev(svg, "viewBox", "0 0 20 20"); - attr_dev(svg, "aria-hidden", "true"); - attr_dev(svg, "focusable", "false"); - attr_dev(svg, "class", "tag-item-reject svelte-ai57u1"); - add_location(svg, file$2, 35, 4, 737); - attr_dev(span, "class", "tag-item badge badge-secondary svelte-ai57u1"); - add_location(span, file$2, 33, 2, 676); - attr_dev(div2, "class", "tag svelte-ai57u1"); - add_location(div2, file$2, 22, 0, 373); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - insert_dev(target, div2, anchor); - append_dev(div2, div1); - append_dev(div1, div0); - append_dev(div2, t0); - append_dev(div2, span); - append_dev(span, t1); - append_dev(span, t2); - append_dev(span, svg); - append_dev(svg, path); + const block = { + c: function create() { + div2 = element("div"); + div1 = element("div"); + div0 = element("div"); + t0 = space(); + span = element("span"); + t1 = text(/*name*/ ctx[1]); + t2 = space(); + svg = svg_element("svg"); + path = svg_element("path"); + attr_dev( + div0, + "class", + (div0_class_value = + "progress-bar progress-bar-striped bg-" + + confidence(/*prob*/ ctx[2]) + + " svelte-ai57u1"), + ); + attr_dev(div0, "role", "progressbar"); + set_style(div0, "width", /*prob*/ ctx[2] * 100 + "%"); + attr_dev( + div0, + "aria-valuenow", + (div0_aria_valuenow_value = /*prob*/ ctx[2] * 100), + ); + attr_dev(div0, "aria-valuemin", "0"); + attr_dev(div0, "aria-valuemax", "100"); + add_location(div0, file$2, 24, 4, 440); + attr_dev(div1, "class", "progress"); + set_style(div1, "height", "5px"); + add_location(div1, file$2, 23, 2, 393); + attr_dev( + path, + "d", + "M14.348 14.849c-0.469 0.469-1.229 0.469-1.697 0l-2.651-3.030-2.651 3.029c-0.469 0.469-1.229 0.469-1.697 0-0.469-0.469-0.469-1.229 0-1.697l2.758-3.15-2.759-3.152c-0.469-0.469-0.469-1.228 0-1.697s1.228-0.469 1.697 0l2.652 3.031 2.651-3.031c0.469-0.469 1.228-0.469 1.697 0s0.469 1.229 0 1.697l-2.758 3.152 2.758 3.15c0.469 0.469 0.469 1.229 0 1.698z", + ); + add_location(path, file$2, 45, 7, 954); + attr_dev(svg, "height", "20"); + attr_dev(svg, "width", "20"); + attr_dev(svg, "viewBox", "0 0 20 20"); + attr_dev(svg, "aria-hidden", "true"); + attr_dev(svg, "focusable", "false"); + attr_dev(svg, "class", "tag-item-reject svelte-ai57u1"); + add_location(svg, file$2, 35, 4, 737); + attr_dev(span, "class", "tag-item badge badge-secondary svelte-ai57u1"); + add_location(span, file$2, 33, 2, 676); + attr_dev(div2, "class", "tag svelte-ai57u1"); + add_location(div2, file$2, 22, 0, 373); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + insert_dev(target, div2, anchor); + append_dev(div2, div1); + append_dev(div1, div0); + append_dev(div2, t0); + append_dev(div2, span); + append_dev(span, t1); + append_dev(span, t2); + append_dev(span, svg); + append_dev(svg, path); - if (!mounted) { - dispose = listen_dev(svg, "click", /*click_handler*/ ctx[4], false, false, false, false); - mounted = true; - } - }, - p: function update(ctx, [dirty]) { - if (dirty & /*prob*/ 4 && div0_class_value !== (div0_class_value = "progress-bar progress-bar-striped bg-" + confidence(/*prob*/ ctx[2]) + " svelte-ai57u1")) { - attr_dev(div0, "class", div0_class_value); - } + if (!mounted) { + dispose = listen_dev( + svg, + "click", + /*click_handler*/ ctx[4], + false, + false, + false, + false, + ); + mounted = true; + } + }, + p: function update(ctx, [dirty]) { + if ( + dirty & /*prob*/ 4 && + div0_class_value !== + (div0_class_value = + "progress-bar progress-bar-striped bg-" + + confidence(/*prob*/ ctx[2]) + + " svelte-ai57u1") + ) { + attr_dev(div0, "class", div0_class_value); + } - if (dirty & /*prob*/ 4) { - set_style(div0, "width", /*prob*/ ctx[2] * 100 + "%"); - } + if (dirty & /*prob*/ 4) { + set_style(div0, "width", /*prob*/ ctx[2] * 100 + "%"); + } - if (dirty & /*prob*/ 4 && div0_aria_valuenow_value !== (div0_aria_valuenow_value = /*prob*/ ctx[2] * 100)) { - attr_dev(div0, "aria-valuenow", div0_aria_valuenow_value); - } + if ( + dirty & /*prob*/ 4 && + div0_aria_valuenow_value !== + (div0_aria_valuenow_value = /*prob*/ ctx[2] * 100) + ) { + attr_dev(div0, "aria-valuenow", div0_aria_valuenow_value); + } - if (dirty & /*name*/ 2) set_data_dev(t1, /*name*/ ctx[1]); - }, - i: noop, - o: noop, - d: function destroy(detaching) { - if (detaching) detach_dev(div2); - mounted = false; - dispose(); - } - }; + if (dirty & /*name*/ 2) set_data_dev(t1, /*name*/ ctx[1]); + }, + i: noop, + o: noop, + d: function destroy(detaching) { + if (detaching) detach_dev(div2); + mounted = false; + dispose(); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$2.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$2.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function confidence(prob) { - prob = prob * 100; + prob = prob * 100; - if (prob < 50.0) { - return "danger"; - } else if (prob < 75.0) { - return "warning"; - } else { - return "success"; - } + if (prob < 50.0) { + return "danger"; + } else if (prob < 75.0) { + return "warning"; + } else { + return "success"; + } } function instance$2($$self, $$props, $$invalidate) { - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('Tag', slots, []); - let { id } = $$props; - let { name } = $$props; - let { prob } = $$props; - const dispatch = createEventDispatcher(); + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("Tag", slots, []); + let { id } = $$props; + let { name } = $$props; + let { prob } = $$props; + const dispatch = createEventDispatcher(); - $$self.$$.on_mount.push(function () { - if (id === undefined && !('id' in $$props || $$self.$$.bound[$$self.$$.props['id']])) { - console.warn(" was created without expected prop 'id'"); - } + $$self.$$.on_mount.push(function () { + if ( + id === undefined && + !("id" in $$props || $$self.$$.bound[$$self.$$.props["id"]]) + ) { + console.warn(" was created without expected prop 'id'"); + } - if (name === undefined && !('name' in $$props || $$self.$$.bound[$$self.$$.props['name']])) { - console.warn(" was created without expected prop 'name'"); - } + if ( + name === undefined && + !("name" in $$props || $$self.$$.bound[$$self.$$.props["name"]]) + ) { + console.warn(" was created without expected prop 'name'"); + } - if (prob === undefined && !('prob' in $$props || $$self.$$.bound[$$self.$$.props['prob']])) { - console.warn(" was created without expected prop 'prob'"); - } - }); + if ( + prob === undefined && + !("prob" in $$props || $$self.$$.bound[$$self.$$.props["prob"]]) + ) { + console.warn(" was created without expected prop 'prob'"); + } + }); - const writable_props = ['id', 'name', 'prob']; + const writable_props = ["id", "name", "prob"]; - Object.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - const click_handler = () => { - dispatch("remove", id); - }; + const click_handler = () => { + dispatch("remove", id); + }; - $$self.$$set = $$props => { - if ('id' in $$props) $$invalidate(0, id = $$props.id); - if ('name' in $$props) $$invalidate(1, name = $$props.name); - if ('prob' in $$props) $$invalidate(2, prob = $$props.prob); - }; + $$self.$$set = ($$props) => { + if ("id" in $$props) $$invalidate(0, (id = $$props.id)); + if ("name" in $$props) $$invalidate(1, (name = $$props.name)); + if ("prob" in $$props) $$invalidate(2, (prob = $$props.prob)); + }; - $$self.$capture_state = () => ({ - createEventDispatcher, - id, - name, - prob, - dispatch, - confidence - }); + $$self.$capture_state = () => ({ + createEventDispatcher, + id, + name, + prob, + dispatch, + confidence, + }); - $$self.$inject_state = $$props => { - if ('id' in $$props) $$invalidate(0, id = $$props.id); - if ('name' in $$props) $$invalidate(1, name = $$props.name); - if ('prob' in $$props) $$invalidate(2, prob = $$props.prob); - }; + $$self.$inject_state = ($$props) => { + if ("id" in $$props) $$invalidate(0, (id = $$props.id)); + if ("name" in $$props) $$invalidate(1, (name = $$props.name)); + if ("prob" in $$props) $$invalidate(2, (prob = $$props.prob)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - return [id, name, prob, dispatch, click_handler]; + return [id, name, prob, dispatch, click_handler]; } class Tag extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$2, create_fragment$2, safe_not_equal, { id: 0, name: 1, prob: 2 }); + constructor(options) { + super(options); + init(this, options, instance$2, create_fragment$2, safe_not_equal, { + id: 0, + name: 1, + prob: 2, + }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "Tag", - options, - id: create_fragment$2.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "Tag", + options, + id: create_fragment$2.name, + }); + } - get id() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get id() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set id(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set id(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get name() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get name() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set name(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set name(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get prob() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get prob() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set prob(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set prob(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } } function cubicOut(t) { - const f = t - 1.0; - return f * f * f + 1.0; + const f = t - 1.0; + return f * f * f + 1.0; } function quintOut(t) { - return --t * t * t * t * t + 1; + return --t * t * t * t * t + 1; } function fade(node, { delay = 0, duration = 400, easing = identity } = {}) { - const o = +getComputedStyle(node).opacity; - return { - delay, - duration, - easing, - css: t => `opacity: ${t * o}` - }; + const o = +getComputedStyle(node).opacity; + return { + delay, + duration, + easing, + css: (t) => `opacity: ${t * o}`, + }; } - function fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 } = {}) { - const style = getComputedStyle(node); - const target_opacity = +style.opacity; - const transform = style.transform === 'none' ? '' : style.transform; - const od = target_opacity * (1 - opacity); - const [xValue, xUnit] = split_css_unit(x); - const [yValue, yUnit] = split_css_unit(y); - return { - delay, - duration, - easing, - css: (t, u) => ` + function fly( + node, + { + delay = 0, + duration = 400, + easing = cubicOut, + x = 0, + y = 0, + opacity = 0, + } = {}, + ) { + const style = getComputedStyle(node); + const target_opacity = +style.opacity; + const transform = style.transform === "none" ? "" : style.transform; + const od = target_opacity * (1 - opacity); + const [xValue, xUnit] = split_css_unit(x); + const [yValue, yUnit] = split_css_unit(y); + return { + delay, + duration, + easing, + css: (t, u) => ` transform: ${transform} translate(${(1 - t) * xValue}${xUnit}, ${(1 - t) * yValue}${yUnit}); - opacity: ${target_opacity - (od * u)}` - }; + opacity: ${target_opacity - od * u}`, + }; } function flip(node, { from, to }, params = {}) { - const style = getComputedStyle(node); - const transform = style.transform === 'none' ? '' : style.transform; - const [ox, oy] = style.transformOrigin.split(' ').map(parseFloat); - const dx = (from.left + from.width * ox / to.width) - (to.left + ox); - const dy = (from.top + from.height * oy / to.height) - (to.top + oy); - const { delay = 0, duration = (d) => Math.sqrt(d) * 120, easing = cubicOut } = params; - return { - delay, - duration: is_function(duration) ? duration(Math.sqrt(dx * dx + dy * dy)) : duration, - easing, - css: (t, u) => { - const x = u * dx; - const y = u * dy; - const sx = t + u * from.width / to.width; - const sy = t + u * from.height / to.height; - return `transform: ${transform} translate(${x}px, ${y}px) scale(${sx}, ${sy});`; - } - }; + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + const [ox, oy] = style.transformOrigin.split(" ").map(parseFloat); + const dx = from.left + (from.width * ox) / to.width - (to.left + ox); + const dy = from.top + (from.height * oy) / to.height - (to.top + oy); + const { + delay = 0, + duration = (d) => Math.sqrt(d) * 120, + easing = cubicOut, + } = params; + return { + delay, + duration: is_function(duration) + ? duration(Math.sqrt(dx * dx + dy * dy)) + : duration, + easing, + css: (t, u) => { + const x = u * dx; + const y = u * dy; + const sx = t + (u * from.width) / to.width; + const sy = t + (u * from.height) / to.height; + return `transform: ${transform} translate(${x}px, ${y}px) scale(${sx}, ${sy});`; + }, + }; } /* src/TagMatches.svelte generated by Svelte v3.59.2 */ @@ -1370,632 +1511,723 @@ const file$1 = "src/TagMatches.svelte"; function get_each_context(ctx, list, i) { - const child_ctx = ctx.slice(); - child_ctx[13] = list[i]; - return child_ctx; + const child_ctx = ctx.slice(); + child_ctx[13] = list[i]; + return child_ctx; } // (77:0) {#if visible} function create_if_block(ctx) { - let div8; - let div7; - let div6; - let div0; - let h3; - let t1; - let div2; - let div1; - let each_blocks = []; - let each_1_lookup = new Map(); - let t2; - let div5; - let div3; - let button0; - let t4; - let button1; - let t5; - let t6; - let div4; - let t7; - let input; - let t8; - let t9_value = /*threshold*/ ctx[0] * 100 + ""; - let t9; - let t10; - let div8_intro; - let div8_outro; - let current; - let mounted; - let dispose; - let each_value = /*filteredMatches*/ ctx[4]; - validate_each_argument(each_value); - const get_key = ctx => /*tag*/ ctx[13].id; - validate_each_keys(ctx, each_value, get_each_context, get_key); + let div8; + let div7; + let div6; + let div0; + let h3; + let t1; + let div2; + let div1; + let each_blocks = []; + let each_1_lookup = new Map(); + let t2; + let div5; + let div3; + let button0; + let t4; + let button1; + let t5; + let t6; + let div4; + let t7; + let input; + let t8; + let t9_value = /*threshold*/ ctx[0] * 100 + ""; + let t9; + let t10; + let div8_intro; + let div8_outro; + let current; + let mounted; + let dispose; + let each_value = /*filteredMatches*/ ctx[4]; + validate_each_argument(each_value); + const get_key = (ctx) => /*tag*/ ctx[13].id; + validate_each_keys(ctx, each_value, get_each_context, get_key); - for (let i = 0; i < each_value.length; i += 1) { - let child_ctx = get_each_context(ctx, each_value, i); - let key = get_key(child_ctx); - each_1_lookup.set(key, each_blocks[i] = create_each_block(key, child_ctx)); - } + for (let i = 0; i < each_value.length; i += 1) { + let child_ctx = get_each_context(ctx, each_value, i); + let key = get_key(child_ctx); + each_1_lookup.set( + key, + (each_blocks[i] = create_each_block(key, child_ctx)), + ); + } - let if_block = /*saving*/ ctx[2] && create_if_block_1(ctx); + let if_block = /*saving*/ ctx[2] && create_if_block_1(ctx); - const block = { - c: function create() { - div8 = element("div"); - div7 = element("div"); - div6 = element("div"); - div0 = element("div"); - h3 = element("h3"); - h3.textContent = "Tag"; - t1 = space(); - div2 = element("div"); - div1 = element("div"); + const block = { + c: function create() { + div8 = element("div"); + div7 = element("div"); + div6 = element("div"); + div0 = element("div"); + h3 = element("h3"); + h3.textContent = "Tag"; + t1 = space(); + div2 = element("div"); + div1 = element("div"); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].c(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].c(); + } - t2 = space(); - div5 = element("div"); - div3 = element("div"); - button0 = element("button"); - button0.textContent = "Close"; - t4 = space(); - button1 = element("button"); - if (if_block) if_block.c(); - t5 = text("\n Add Tags"); - t6 = space(); - div4 = element("div"); - t7 = text("Threshold: "); - input = element("input"); - t8 = space(); - t9 = text(t9_value); - t10 = text(" %"); - attr_dev(h3, "class", "modal-title"); - add_location(h3, file$1, 90, 10, 2253); - attr_dev(div0, "class", "modal-header svelte-9viihb"); - add_location(div0, file$1, 89, 8, 2216); - attr_dev(div1, "class", "row justify-content-center"); - add_location(div1, file$1, 93, 10, 2344); - attr_dev(div2, "class", "modal-body"); - add_location(div2, file$1, 92, 8, 2309); - attr_dev(button0, "id", "tags-cancel"); - attr_dev(button0, "type", "button"); - attr_dev(button0, "class", "ml-2 btn btn-secondary"); - add_location(button0, file$1, 107, 12, 2787); - attr_dev(button1, "id", "tags-accept"); - attr_dev(button1, "type", "button"); - attr_dev(button1, "class", "ml-2 btn btn-primary"); - add_location(button1, file$1, 113, 12, 2970); - add_location(div3, file$1, 106, 10, 2769); - attr_dev(input, "type", "range"); - attr_dev(input, "min", "0.2"); - attr_dev(input, "max", "0.9"); - attr_dev(input, "step", "0.1"); - attr_dev(input, "id", "stash-readbooru-threshold"); - set_style(input, "margin", "0px"); - set_style(input, "height", "10px"); - add_location(input, file$1, 126, 23, 3318); - add_location(div4, file$1, 125, 10, 3289); - attr_dev(div5, "class", "ModalFooter modal-footer svelte-9viihb"); - add_location(div5, file$1, 105, 8, 2720); - attr_dev(div6, "class", "modal-content"); - add_location(div6, file$1, 88, 6, 2180); - attr_dev(div7, "class", "modal-dialog modal-xl top-accent svelte-9viihb"); - add_location(div7, file$1, 87, 4, 2127); - attr_dev(div8, "role", "dialog"); - attr_dev(div8, "aria-modal", "true"); - attr_dev(div8, "class", "fade ModalComponent modal show"); - attr_dev(div8, "tabindex", "-1"); - set_style(div8, "display", "block"); - add_location(div8, file$1, 77, 2, 1884); - }, - m: function mount(target, anchor) { - insert_dev(target, div8, anchor); - append_dev(div8, div7); - append_dev(div7, div6); - append_dev(div6, div0); - append_dev(div0, h3); - append_dev(div6, t1); - append_dev(div6, div2); - append_dev(div2, div1); + t2 = space(); + div5 = element("div"); + div3 = element("div"); + button0 = element("button"); + button0.textContent = "Close"; + t4 = space(); + button1 = element("button"); + if (if_block) if_block.c(); + t5 = text("\n Add Tags"); + t6 = space(); + div4 = element("div"); + t7 = text("Threshold: "); + input = element("input"); + t8 = space(); + t9 = text(t9_value); + t10 = text(" %"); + attr_dev(h3, "class", "modal-title"); + add_location(h3, file$1, 90, 10, 2253); + attr_dev(div0, "class", "modal-header svelte-9viihb"); + add_location(div0, file$1, 89, 8, 2216); + attr_dev(div1, "class", "row justify-content-center"); + add_location(div1, file$1, 93, 10, 2344); + attr_dev(div2, "class", "modal-body"); + add_location(div2, file$1, 92, 8, 2309); + attr_dev(button0, "id", "tags-cancel"); + attr_dev(button0, "type", "button"); + attr_dev(button0, "class", "ml-2 btn btn-secondary"); + add_location(button0, file$1, 107, 12, 2787); + attr_dev(button1, "id", "tags-accept"); + attr_dev(button1, "type", "button"); + attr_dev(button1, "class", "ml-2 btn btn-primary"); + add_location(button1, file$1, 113, 12, 2970); + add_location(div3, file$1, 106, 10, 2769); + attr_dev(input, "type", "range"); + attr_dev(input, "min", "0.2"); + attr_dev(input, "max", "0.9"); + attr_dev(input, "step", "0.1"); + attr_dev(input, "id", "stash-readbooru-threshold"); + set_style(input, "margin", "0px"); + set_style(input, "height", "10px"); + add_location(input, file$1, 126, 23, 3318); + add_location(div4, file$1, 125, 10, 3289); + attr_dev(div5, "class", "ModalFooter modal-footer svelte-9viihb"); + add_location(div5, file$1, 105, 8, 2720); + attr_dev(div6, "class", "modal-content"); + add_location(div6, file$1, 88, 6, 2180); + attr_dev( + div7, + "class", + "modal-dialog modal-xl top-accent svelte-9viihb", + ); + add_location(div7, file$1, 87, 4, 2127); + attr_dev(div8, "role", "dialog"); + attr_dev(div8, "aria-modal", "true"); + attr_dev(div8, "class", "fade ModalComponent modal show"); + attr_dev(div8, "tabindex", "-1"); + set_style(div8, "display", "block"); + add_location(div8, file$1, 77, 2, 1884); + }, + m: function mount(target, anchor) { + insert_dev(target, div8, anchor); + append_dev(div8, div7); + append_dev(div7, div6); + append_dev(div6, div0); + append_dev(div0, h3); + append_dev(div6, t1); + append_dev(div6, div2); + append_dev(div2, div1); - for (let i = 0; i < each_blocks.length; i += 1) { - if (each_blocks[i]) { - each_blocks[i].m(div1, null); - } - } + for (let i = 0; i < each_blocks.length; i += 1) { + if (each_blocks[i]) { + each_blocks[i].m(div1, null); + } + } - append_dev(div6, t2); - append_dev(div6, div5); - append_dev(div5, div3); - append_dev(div3, button0); - append_dev(div3, t4); - append_dev(div3, button1); - if (if_block) if_block.m(button1, null); - append_dev(button1, t5); - append_dev(div5, t6); - append_dev(div5, div4); - append_dev(div4, t7); - append_dev(div4, input); - set_input_value(input, /*threshold*/ ctx[0]); - append_dev(div4, t8); - append_dev(div4, t9); - append_dev(div4, t10); - /*div8_binding*/ ctx[11](div8); - current = true; + append_dev(div6, t2); + append_dev(div6, div5); + append_dev(div5, div3); + append_dev(div3, button0); + append_dev(div3, t4); + append_dev(div3, button1); + if (if_block) if_block.m(button1, null); + append_dev(button1, t5); + append_dev(div5, t6); + append_dev(div5, div4); + append_dev(div4, t7); + append_dev(div4, input); + set_input_value(input, /*threshold*/ ctx[0]); + append_dev(div4, t8); + append_dev(div4, t9); + append_dev(div4, t10); + /*div8_binding*/ ctx[11](div8); + current = true; - if (!mounted) { - dispose = [ - listen_dev(button0, "click", /*close*/ ctx[5], false, false, false, false), - listen_dev(button1, "click", /*save*/ ctx[7], false, false, false, false), - listen_dev(input, "change", /*input_change_input_handler*/ ctx[10]), - listen_dev(input, "input", /*input_change_input_handler*/ ctx[10]), - listen_dev(input, "change", /*changeThreshold*/ ctx[8], false, false, false, false) - ]; + if (!mounted) { + dispose = [ + listen_dev( + button0, + "click", + /*close*/ ctx[5], + false, + false, + false, + false, + ), + listen_dev( + button1, + "click", + /*save*/ ctx[7], + false, + false, + false, + false, + ), + listen_dev(input, "change", /*input_change_input_handler*/ ctx[10]), + listen_dev(input, "input", /*input_change_input_handler*/ ctx[10]), + listen_dev( + input, + "change", + /*changeThreshold*/ ctx[8], + false, + false, + false, + false, + ), + ]; - mounted = true; - } - }, - p: function update(ctx, dirty) { - if (dirty & /*filteredMatches, remove*/ 80) { - each_value = /*filteredMatches*/ ctx[4]; - validate_each_argument(each_value); - group_outros(); - for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); - validate_each_keys(ctx, each_value, get_each_context, get_key); - each_blocks = update_keyed_each(each_blocks, dirty, get_key, 1, ctx, each_value, each_1_lookup, div1, fix_and_outro_and_destroy_block, create_each_block, null, get_each_context); - for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); - check_outros(); - } + mounted = true; + } + }, + p: function update(ctx, dirty) { + if (dirty & /*filteredMatches, remove*/ 80) { + each_value = /*filteredMatches*/ ctx[4]; + validate_each_argument(each_value); + group_outros(); + for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].r(); + validate_each_keys(ctx, each_value, get_each_context, get_key); + each_blocks = update_keyed_each( + each_blocks, + dirty, + get_key, + 1, + ctx, + each_value, + each_1_lookup, + div1, + fix_and_outro_and_destroy_block, + create_each_block, + null, + get_each_context, + ); + for (let i = 0; i < each_blocks.length; i += 1) each_blocks[i].a(); + check_outros(); + } - if (/*saving*/ ctx[2]) { - if (if_block) ; else { - if_block = create_if_block_1(ctx); - if_block.c(); - if_block.m(button1, t5); - } - } else if (if_block) { - if_block.d(1); - if_block = null; - } + if (/*saving*/ ctx[2]) { + if (if_block); + else { + if_block = create_if_block_1(ctx); + if_block.c(); + if_block.m(button1, t5); + } + } else if (if_block) { + if_block.d(1); + if_block = null; + } - if (dirty & /*threshold*/ 1) { - set_input_value(input, /*threshold*/ ctx[0]); - } + if (dirty & /*threshold*/ 1) { + set_input_value(input, /*threshold*/ ctx[0]); + } - if ((!current || dirty & /*threshold*/ 1) && t9_value !== (t9_value = /*threshold*/ ctx[0] * 100 + "")) set_data_dev(t9, t9_value); - }, - i: function intro(local) { - if (current) return; + if ( + (!current || dirty & /*threshold*/ 1) && + t9_value !== (t9_value = /*threshold*/ ctx[0] * 100 + "") + ) + set_data_dev(t9, t9_value); + }, + i: function intro(local) { + if (current) return; - for (let i = 0; i < each_value.length; i += 1) { - transition_in(each_blocks[i]); - } + for (let i = 0; i < each_value.length; i += 1) { + transition_in(each_blocks[i]); + } - add_render_callback(() => { - if (!current) return; - if (div8_outro) div8_outro.end(1); - div8_intro = create_in_transition(div8, fly, { y: 100, duration: 400 }); - div8_intro.start(); - }); + add_render_callback(() => { + if (!current) return; + if (div8_outro) div8_outro.end(1); + div8_intro = create_in_transition(div8, fly, { + y: 100, + duration: 400, + }); + div8_intro.start(); + }); - current = true; - }, - o: function outro(local) { - for (let i = 0; i < each_blocks.length; i += 1) { - transition_out(each_blocks[i]); - } + current = true; + }, + o: function outro(local) { + for (let i = 0; i < each_blocks.length; i += 1) { + transition_out(each_blocks[i]); + } - if (div8_intro) div8_intro.invalidate(); - div8_outro = create_out_transition(div8, fly, { y: -100, duration: 400 }); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div8); + if (div8_intro) div8_intro.invalidate(); + div8_outro = create_out_transition(div8, fly, { + y: -100, + duration: 400, + }); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div8); - for (let i = 0; i < each_blocks.length; i += 1) { - each_blocks[i].d(); - } + for (let i = 0; i < each_blocks.length; i += 1) { + each_blocks[i].d(); + } - if (if_block) if_block.d(); - /*div8_binding*/ ctx[11](null); - if (detaching && div8_outro) div8_outro.end(); - mounted = false; - run_all(dispose); - } - }; + if (if_block) if_block.d(); + /*div8_binding*/ ctx[11](null); + if (detaching && div8_outro) div8_outro.end(); + mounted = false; + run_all(dispose); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block.name, - type: "if", - source: "(77:0) {#if visible}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block.name, + type: "if", + source: "(77:0) {#if visible}", + ctx, + }); - return block; + return block; } // (95:12) {#each filteredMatches as tag (tag.id)} function create_each_block(key_1, ctx) { - let div; - let tag; - let t; - let div_intro; - let div_outro; - let rect; - let stop_animation = noop; - let current; - const tag_spread_levels = [/*tag*/ ctx[13]]; - let tag_props = {}; + let div; + let tag; + let t; + let div_intro; + let div_outro; + let rect; + let stop_animation = noop; + let current; + const tag_spread_levels = [/*tag*/ ctx[13]]; + let tag_props = {}; - for (let i = 0; i < tag_spread_levels.length; i += 1) { - tag_props = assign(tag_props, tag_spread_levels[i]); - } + for (let i = 0; i < tag_spread_levels.length; i += 1) { + tag_props = assign(tag_props, tag_spread_levels[i]); + } - tag = new Tag({ props: tag_props, $$inline: true }); - tag.$on("remove", /*remove*/ ctx[6]); + tag = new Tag({ props: tag_props, $$inline: true }); + tag.$on("remove", /*remove*/ ctx[6]); - const block = { - key: key_1, - first: null, - c: function create() { - div = element("div"); - create_component(tag.$$.fragment); - t = space(); - add_location(div, file$1, 95, 14, 2451); - this.first = div; - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - mount_component(tag, div, null); - append_dev(div, t); - current = true; - }, - p: function update(new_ctx, dirty) { - ctx = new_ctx; + const block = { + key: key_1, + first: null, + c: function create() { + div = element("div"); + create_component(tag.$$.fragment); + t = space(); + add_location(div, file$1, 95, 14, 2451); + this.first = div; + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + mount_component(tag, div, null); + append_dev(div, t); + current = true; + }, + p: function update(new_ctx, dirty) { + ctx = new_ctx; - const tag_changes = (dirty & /*filteredMatches*/ 16) - ? get_spread_update(tag_spread_levels, [get_spread_object(/*tag*/ ctx[13])]) - : {}; + const tag_changes = + dirty & /*filteredMatches*/ 16 + ? get_spread_update(tag_spread_levels, [ + get_spread_object(/*tag*/ ctx[13]), + ]) + : {}; - tag.$set(tag_changes); - }, - r: function measure() { - rect = div.getBoundingClientRect(); - }, - f: function fix() { - fix_position(div); - stop_animation(); - add_transform(div, rect); - }, - a: function animate() { - stop_animation(); - stop_animation = create_animation(div, rect, flip, { duration: 250, easing: quintOut }); - }, - i: function intro(local) { - if (current) return; - transition_in(tag.$$.fragment, local); + tag.$set(tag_changes); + }, + r: function measure() { + rect = div.getBoundingClientRect(); + }, + f: function fix() { + fix_position(div); + stop_animation(); + add_transform(div, rect); + }, + a: function animate() { + stop_animation(); + stop_animation = create_animation(div, rect, flip, { + duration: 250, + easing: quintOut, + }); + }, + i: function intro(local) { + if (current) return; + transition_in(tag.$$.fragment, local); - add_render_callback(() => { - if (!current) return; - if (div_outro) div_outro.end(1); - div_intro = create_in_transition(div, fade, {}); - div_intro.start(); - }); + add_render_callback(() => { + if (!current) return; + if (div_outro) div_outro.end(1); + div_intro = create_in_transition(div, fade, {}); + div_intro.start(); + }); - current = true; - }, - o: function outro(local) { - transition_out(tag.$$.fragment, local); - if (div_intro) div_intro.invalidate(); - div_outro = create_out_transition(div, fade, {}); - current = false; - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - destroy_component(tag); - if (detaching && div_outro) div_outro.end(); - } - }; + current = true; + }, + o: function outro(local) { + transition_out(tag.$$.fragment, local); + if (div_intro) div_intro.invalidate(); + div_outro = create_out_transition(div, fade, {}); + current = false; + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + destroy_component(tag); + if (detaching && div_outro) div_outro.end(); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_each_block.name, - type: "each", - source: "(95:12) {#each filteredMatches as tag (tag.id)}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_each_block.name, + type: "each", + source: "(95:12) {#each filteredMatches as tag (tag.id)}", + ctx, + }); - return block; + return block; } // (120:14) {#if saving} function create_if_block_1(ctx) { - let div; + let div; - const block = { - c: function create() { - div = element("div"); - attr_dev(div, "class", "lds-dual-ring svelte-9viihb"); - add_location(div, file$1, 120, 16, 3167); - }, - m: function mount(target, anchor) { - insert_dev(target, div, anchor); - }, - d: function destroy(detaching) { - if (detaching) detach_dev(div); - } - }; + const block = { + c: function create() { + div = element("div"); + attr_dev(div, "class", "lds-dual-ring svelte-9viihb"); + add_location(div, file$1, 120, 16, 3167); + }, + m: function mount(target, anchor) { + insert_dev(target, div, anchor); + }, + d: function destroy(detaching) { + if (detaching) detach_dev(div); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_if_block_1.name, - type: "if", - source: "(120:14) {#if saving}", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_if_block_1.name, + type: "if", + source: "(120:14) {#if saving}", + ctx, + }); - return block; + return block; } function create_fragment$1(ctx) { - let if_block_anchor; - let current; - let if_block = /*visible*/ ctx[1] && create_if_block(ctx); + let if_block_anchor; + let current; + let if_block = /*visible*/ ctx[1] && create_if_block(ctx); - const block = { - c: function create() { - if (if_block) if_block.c(); - if_block_anchor = empty(); - }, - l: function claim(nodes) { - throw new Error("options.hydrate only works if the component was compiled with the `hydratable: true` option"); - }, - m: function mount(target, anchor) { - if (if_block) if_block.m(target, anchor); - insert_dev(target, if_block_anchor, anchor); - current = true; - }, - p: function update(ctx, [dirty]) { - if (/*visible*/ ctx[1]) { - if (if_block) { - if_block.p(ctx, dirty); + const block = { + c: function create() { + if (if_block) if_block.c(); + if_block_anchor = empty(); + }, + l: function claim(nodes) { + throw new Error( + "options.hydrate only works if the component was compiled with the `hydratable: true` option", + ); + }, + m: function mount(target, anchor) { + if (if_block) if_block.m(target, anchor); + insert_dev(target, if_block_anchor, anchor); + current = true; + }, + p: function update(ctx, [dirty]) { + if (/*visible*/ ctx[1]) { + if (if_block) { + if_block.p(ctx, dirty); - if (dirty & /*visible*/ 2) { - transition_in(if_block, 1); - } - } else { - if_block = create_if_block(ctx); - if_block.c(); - transition_in(if_block, 1); - if_block.m(if_block_anchor.parentNode, if_block_anchor); - } - } else if (if_block) { - group_outros(); + if (dirty & /*visible*/ 2) { + transition_in(if_block, 1); + } + } else { + if_block = create_if_block(ctx); + if_block.c(); + transition_in(if_block, 1); + if_block.m(if_block_anchor.parentNode, if_block_anchor); + } + } else if (if_block) { + group_outros(); - transition_out(if_block, 1, 1, () => { - if_block = null; - }); + transition_out(if_block, 1, 1, () => { + if_block = null; + }); - check_outros(); - } - }, - i: function intro(local) { - if (current) return; - transition_in(if_block); - current = true; - }, - o: function outro(local) { - transition_out(if_block); - current = false; - }, - d: function destroy(detaching) { - if (if_block) if_block.d(detaching); - if (detaching) detach_dev(if_block_anchor); - } - }; + check_outros(); + } + }, + i: function intro(local) { + if (current) return; + transition_in(if_block); + current = true; + }, + o: function outro(local) { + transition_out(if_block); + current = false; + }, + d: function destroy(detaching) { + if (if_block) if_block.d(detaching); + if (detaching) detach_dev(if_block_anchor); + }, + }; - dispatch_dev("SvelteRegisterBlock", { - block, - id: create_fragment$1.name, - type: "component", - source: "", - ctx - }); + dispatch_dev("SvelteRegisterBlock", { + block, + id: create_fragment$1.name, + type: "component", + source: "", + ctx, + }); - return block; + return block; } function instance$1($$self, $$props, $$invalidate) { - let filteredMatches; - let { $$slots: slots = {}, $$scope } = $$props; - validate_slots('TagMatches', slots, []); - let { matches = {} } = $$props; - let { threshold = 0.7 } = $$props; - let visible = false; - let saving = false; - let modal; - let tags; + let filteredMatches; + let { $$slots: slots = {}, $$scope } = $$props; + validate_slots("TagMatches", slots, []); + let { matches = {} } = $$props; + let { threshold = 0.7 } = $$props; + let visible = false; + let saving = false; + let modal; + let tags; - // Convert the incoming matching data to an array with a random id, name, and probability - matches = Object.entries(matches).map(([name, prob]) => ({ - id: Math.random().toString(36).substring(7), - name: name.replace(/_/g, " "), - prob - })); + // Convert the incoming matching data to an array with a random id, name, and probability + matches = Object.entries(matches).map(([name, prob]) => ({ + id: Math.random().toString(36).substring(7), + name: name.replace(/_/g, " "), + prob, + })); - onMount(async () => { - // so we see a nice transition - $$invalidate(1, visible = true); + onMount(async () => { + // so we see a nice transition + $$invalidate(1, (visible = true)); - tags = await getAllTags(); - }); + tags = await getAllTags(); + }); - async function close() { - // so we see a nice transition - $$invalidate(1, visible = false); + async function close() { + // so we see a nice transition + $$invalidate(1, (visible = false)); - setTimeout( - () => { - modal.remove(); - }, - 400 - ); - } + setTimeout(() => { + modal.remove(); + }, 400); + } - function remove(event) { - const id = event.detail; - $$invalidate(9, matches = matches.filter(x => x.id !== id)); - } + function remove(event) { + const id = event.detail; + $$invalidate(9, (matches = matches.filter((x) => x.id !== id))); + } - async function save() { - $$invalidate(2, saving = true); - const [,image_id] = getScenarioAndID(); - let existingTags = await getTagsForImage(image_id); + async function save() { + $$invalidate(2, (saving = true)); + const [, image_id] = getScenarioAndID(); + let existingTags = await getTagsForImage(image_id); - for (const tag of filteredMatches) { - let tagLower = tag.name.toLowerCase(); + for (const tag of filteredMatches) { + let tagLower = tag.name.toLowerCase(); - // if tag doesn't exist, create it - if (tags[tagLower] === undefined) { - existingTags.push(await createTag(tagLower)); - } else if (!existingTags.includes(tags[tagLower])) { - existingTags.push(tags[tagLower]); - } - } + // if tag doesn't exist, create it + if (tags[tagLower] === undefined) { + existingTags.push(await createTag(tagLower)); + } else if (!existingTags.includes(tags[tagLower])) { + existingTags.push(tags[tagLower]); + } + } - await updateImage(image_id, existingTags); - $$invalidate(2, saving = false); - close(); - location.reload(); - } + await updateImage(image_id, existingTags); + $$invalidate(2, (saving = false)); + close(); + location.reload(); + } - function changeThreshold() { - localStorage.setItem("stash-readbooru-threshold", threshold); - } + function changeThreshold() { + localStorage.setItem("stash-readbooru-threshold", threshold); + } - const writable_props = ['matches', 'threshold']; + const writable_props = ["matches", "threshold"]; - Object_1.keys($$props).forEach(key => { - if (!~writable_props.indexOf(key) && key.slice(0, 2) !== '$$' && key !== 'slot') console.warn(` was created with unknown prop '${key}'`); - }); + Object_1.keys($$props).forEach((key) => { + if ( + !~writable_props.indexOf(key) && + key.slice(0, 2) !== "$$" && + key !== "slot" + ) + console.warn(` was created with unknown prop '${key}'`); + }); - function input_change_input_handler() { - threshold = to_number(this.value); - $$invalidate(0, threshold); - } + function input_change_input_handler() { + threshold = to_number(this.value); + $$invalidate(0, threshold); + } - function div8_binding($$value) { - binding_callbacks[$$value ? 'unshift' : 'push'](() => { - modal = $$value; - $$invalidate(3, modal); - }); - } + function div8_binding($$value) { + binding_callbacks[$$value ? "unshift" : "push"](() => { + modal = $$value; + $$invalidate(3, modal); + }); + } - $$self.$$set = $$props => { - if ('matches' in $$props) $$invalidate(9, matches = $$props.matches); - if ('threshold' in $$props) $$invalidate(0, threshold = $$props.threshold); - }; + $$self.$$set = ($$props) => { + if ("matches" in $$props) $$invalidate(9, (matches = $$props.matches)); + if ("threshold" in $$props) + $$invalidate(0, (threshold = $$props.threshold)); + }; - $$self.$capture_state = () => ({ - Tag, - onMount, - fly, - fade, - flip, - quintOut, - createTag, - getAllTags, - getTagsForImage, - updateImage, - getScenarioAndID, - matches, - threshold, - visible, - saving, - modal, - tags, - close, - remove, - save, - changeThreshold, - filteredMatches - }); + $$self.$capture_state = () => ({ + Tag, + onMount, + fly, + fade, + flip, + quintOut, + createTag, + getAllTags, + getTagsForImage, + updateImage, + getScenarioAndID, + matches, + threshold, + visible, + saving, + modal, + tags, + close, + remove, + save, + changeThreshold, + filteredMatches, + }); - $$self.$inject_state = $$props => { - if ('matches' in $$props) $$invalidate(9, matches = $$props.matches); - if ('threshold' in $$props) $$invalidate(0, threshold = $$props.threshold); - if ('visible' in $$props) $$invalidate(1, visible = $$props.visible); - if ('saving' in $$props) $$invalidate(2, saving = $$props.saving); - if ('modal' in $$props) $$invalidate(3, modal = $$props.modal); - if ('tags' in $$props) tags = $$props.tags; - if ('filteredMatches' in $$props) $$invalidate(4, filteredMatches = $$props.filteredMatches); - }; + $$self.$inject_state = ($$props) => { + if ("matches" in $$props) $$invalidate(9, (matches = $$props.matches)); + if ("threshold" in $$props) + $$invalidate(0, (threshold = $$props.threshold)); + if ("visible" in $$props) $$invalidate(1, (visible = $$props.visible)); + if ("saving" in $$props) $$invalidate(2, (saving = $$props.saving)); + if ("modal" in $$props) $$invalidate(3, (modal = $$props.modal)); + if ("tags" in $$props) tags = $$props.tags; + if ("filteredMatches" in $$props) + $$invalidate(4, (filteredMatches = $$props.filteredMatches)); + }; - if ($$props && "$$inject" in $$props) { - $$self.$inject_state($$props.$$inject); - } + if ($$props && "$$inject" in $$props) { + $$self.$inject_state($$props.$$inject); + } - $$self.$$.update = () => { - if ($$self.$$.dirty & /*matches, threshold*/ 513) { - $$invalidate(4, filteredMatches = matches.filter(x => x.prob > threshold)); - } - }; + $$self.$$.update = () => { + if ($$self.$$.dirty & /*matches, threshold*/ 513) { + $$invalidate( + 4, + (filteredMatches = matches.filter((x) => x.prob > threshold)), + ); + } + }; - return [ - threshold, - visible, - saving, - modal, - filteredMatches, - close, - remove, - save, - changeThreshold, - matches, - input_change_input_handler, - div8_binding - ]; + return [ + threshold, + visible, + saving, + modal, + filteredMatches, + close, + remove, + save, + changeThreshold, + matches, + input_change_input_handler, + div8_binding, + ]; } class TagMatches extends SvelteComponentDev { - constructor(options) { - super(options); - init(this, options, instance$1, create_fragment$1, safe_not_equal, { matches: 9, threshold: 0 }); + constructor(options) { + super(options); + init(this, options, instance$1, create_fragment$1, safe_not_equal, { + matches: 9, + threshold: 0, + }); - dispatch_dev("SvelteRegisterComponent", { - component: this, - tagName: "TagMatches", - options, - id: create_fragment$1.name - }); - } + dispatch_dev("SvelteRegisterComponent", { + component: this, + tagName: "TagMatches", + options, + id: create_fragment$1.name, + }); + } - get matches() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get matches() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set matches(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set matches(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } - get threshold() { - throw new Error(": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''"); - } + get threshold() { + throw new Error( + ": Props cannot be read directly from the component instance unless compiling with 'accessors: true' or ''", + ); + } - set threshold(value) { - throw new Error(": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''"); - } + set threshold(value) { + throw new Error( + ": Props cannot be set directly on the component instance unless compiling with 'accessors: true' or ''", + ); + } } - var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + var commonjsGlobal = + typeof globalThis !== "undefined" + ? globalThis + : typeof window !== "undefined" + ? window + : typeof global !== "undefined" + ? global + : typeof self !== "undefined" + ? self + : {}; function createCommonjsModule(fn) { var module = { exports: {} }; - return fn(module, module.exports), module.exports; + return fn(module, module.exports), module.exports; } /*! @@ -2005,9 +2237,9 @@ */ var html2canvas = createCommonjsModule(function (module, exports) { - (function (global, factory) { - module.exports = factory() ; - }(commonjsGlobal, (function () { + (function (global, factory) { + module.exports = factory(); + })(commonjsGlobal, function () { /*! ***************************************************************************** Copyright (c) Microsoft Corporation. @@ -2024,114 +2256,252 @@ ***************************************************************************** */ /* global Reflect, Promise */ - var extendStatics = function(d, b) { - extendStatics = Object.setPrototypeOf || - ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || - function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; }; - return extendStatics(d, b); + var extendStatics = function (d, b) { + extendStatics = + Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && + function (d, b) { + d.__proto__ = b; + }) || + function (d, b) { + for (var p in b) + if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; + }; + return extendStatics(d, b); }; function __extends(d, b) { - if (typeof b !== "function" && b !== null) - throw new TypeError("Class extends value " + String(b) + " is not a constructor or null"); - extendStatics(d, b); - function __() { this.constructor = d; } - d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + if (typeof b !== "function" && b !== null) + throw new TypeError( + "Class extends value " + + String(b) + + " is not a constructor or null", + ); + extendStatics(d, b); + function __() { + this.constructor = d; + } + d.prototype = + b === null + ? Object.create(b) + : ((__.prototype = b.prototype), new __()); } - var __assign = function() { - __assign = Object.assign || function __assign(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; - } - return t; + var __assign = function () { + __assign = + Object.assign || + function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) + if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; }; - return __assign.apply(this, arguments); + return __assign.apply(this, arguments); }; function __awaiter(thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); + function adopt(value) { + return value instanceof P + ? value + : new P(function (resolve) { + resolve(value); + }); + } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { + try { + step(generator.next(value)); + } catch (e) { + reject(e); + } + } + function rejected(value) { + try { + step(generator["throw"](value)); + } catch (e) { + reject(e); + } + } + function step(result) { + result.done + ? resolve(result.value) + : adopt(result.value).then(fulfilled, rejected); + } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); } function __generator(thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (_) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; + var _ = { + label: 0, + sent: function () { + if (t[0] & 1) throw t[1]; + return t[1]; + }, + trys: [], + ops: [], + }, + f, + y, + t, + g; + return ( + (g = { next: verb(0), throw: verb(1), return: verb(2) }), + typeof Symbol === "function" && + (g[Symbol.iterator] = function () { + return this; + }), + g + ); + function verb(n) { + return function (v) { + return step([n, v]); + }; + } + function step(op) { + if (f) throw new TypeError("Generator is already executing."); + while (_) + try { + if ( + ((f = 1), + y && + (t = + op[0] & 2 + ? y["return"] + : op[0] + ? y["throw"] || ((t = y["return"]) && t.call(y), 0) + : y.next) && + !(t = t.call(y, op[1])).done) + ) + return t; + if (((y = 0), t)) op = [op[0] & 2, t.value]; + switch (op[0]) { + case 0: + case 1: + t = op; + break; + case 4: + _.label++; + return { value: op[1], done: false }; + case 5: + _.label++; + y = op[1]; + op = [0]; + continue; + case 7: + op = _.ops.pop(); + _.trys.pop(); + continue; + default: + if ( + !((t = _.trys), (t = t.length > 0 && t[t.length - 1])) && + (op[0] === 6 || op[0] === 2) + ) { + _ = 0; + continue; } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } + if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { + _.label = op[1]; + break; + } + if (op[0] === 6 && _.label < t[1]) { + _.label = t[1]; + t = op; + break; + } + if (t && _.label < t[2]) { + _.label = t[2]; + _.ops.push(op); + break; + } + if (t[2]) _.ops.pop(); + _.trys.pop(); + continue; + } + op = body.call(thisArg, _); + } catch (e) { + op = [6, e]; + y = 0; + } finally { + f = t = 0; + } + if (op[0] & 5) throw op[1]; + return { value: op[0] ? op[1] : void 0, done: true }; + } } function __spreadArray(to, from, pack) { - if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { - if (ar || !(i in from)) { - if (!ar) ar = Array.prototype.slice.call(from, 0, i); - ar[i] = from[i]; - } + if (pack || arguments.length === 2) + for (var i = 0, l = from.length, ar; i < l; i++) { + if (ar || !(i in from)) { + if (!ar) ar = Array.prototype.slice.call(from, 0, i); + ar[i] = from[i]; + } } - return to.concat(ar || from); + return to.concat(ar || from); } var Bounds = /** @class */ (function () { - function Bounds(left, top, width, height) { - this.left = left; - this.top = top; - this.width = width; - this.height = height; - } - Bounds.prototype.add = function (x, y, w, h) { - return new Bounds(this.left + x, this.top + y, this.width + w, this.height + h); - }; - Bounds.fromClientRect = function (context, clientRect) { - return new Bounds(clientRect.left + context.windowBounds.left, clientRect.top + context.windowBounds.top, clientRect.width, clientRect.height); - }; - Bounds.fromDOMRectList = function (context, domRectList) { - var domRect = Array.from(domRectList).find(function (rect) { return rect.width !== 0; }); - return domRect - ? new Bounds(domRect.left + context.windowBounds.left, domRect.top + context.windowBounds.top, domRect.width, domRect.height) - : Bounds.EMPTY; - }; - Bounds.EMPTY = new Bounds(0, 0, 0, 0); - return Bounds; - }()); + function Bounds(left, top, width, height) { + this.left = left; + this.top = top; + this.width = width; + this.height = height; + } + Bounds.prototype.add = function (x, y, w, h) { + return new Bounds( + this.left + x, + this.top + y, + this.width + w, + this.height + h, + ); + }; + Bounds.fromClientRect = function (context, clientRect) { + return new Bounds( + clientRect.left + context.windowBounds.left, + clientRect.top + context.windowBounds.top, + clientRect.width, + clientRect.height, + ); + }; + Bounds.fromDOMRectList = function (context, domRectList) { + var domRect = Array.from(domRectList).find(function (rect) { + return rect.width !== 0; + }); + return domRect + ? new Bounds( + domRect.left + context.windowBounds.left, + domRect.top + context.windowBounds.top, + domRect.width, + domRect.height, + ) + : Bounds.EMPTY; + }; + Bounds.EMPTY = new Bounds(0, 0, 0, 0); + return Bounds; + })(); var parseBounds = function (context, node) { - return Bounds.fromClientRect(context, node.getBoundingClientRect()); + return Bounds.fromClientRect(context, node.getBoundingClientRect()); }; var parseDocumentSize = function (document) { - var body = document.body; - var documentElement = document.documentElement; - if (!body || !documentElement) { - throw new Error("Unable to get document size"); - } - var width = Math.max(Math.max(body.scrollWidth, documentElement.scrollWidth), Math.max(body.offsetWidth, documentElement.offsetWidth), Math.max(body.clientWidth, documentElement.clientWidth)); - var height = Math.max(Math.max(body.scrollHeight, documentElement.scrollHeight), Math.max(body.offsetHeight, documentElement.offsetHeight), Math.max(body.clientHeight, documentElement.clientHeight)); - return new Bounds(0, 0, width, height); + var body = document.body; + var documentElement = document.documentElement; + if (!body || !documentElement) { + throw new Error("Unable to get document size"); + } + var width = Math.max( + Math.max(body.scrollWidth, documentElement.scrollWidth), + Math.max(body.offsetWidth, documentElement.offsetWidth), + Math.max(body.clientWidth, documentElement.clientWidth), + ); + var height = Math.max( + Math.max(body.scrollHeight, documentElement.scrollHeight), + Math.max(body.offsetHeight, documentElement.offsetHeight), + Math.max(body.clientHeight, documentElement.clientHeight), + ); + return new Bounds(0, 0, width, height); }; /* @@ -2140,63 +2510,67 @@ * Released under MIT License */ var toCodePoints$1 = function (str) { - var codePoints = []; - var i = 0; - var length = str.length; - while (i < length) { - var value = str.charCodeAt(i++); - if (value >= 0xd800 && value <= 0xdbff && i < length) { - var extra = str.charCodeAt(i++); - if ((extra & 0xfc00) === 0xdc00) { - codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000); - } - else { - codePoints.push(value); - i--; - } - } - else { - codePoints.push(value); - } + var codePoints = []; + var i = 0; + var length = str.length; + while (i < length) { + var value = str.charCodeAt(i++); + if (value >= 0xd800 && value <= 0xdbff && i < length) { + var extra = str.charCodeAt(i++); + if ((extra & 0xfc00) === 0xdc00) { + codePoints.push( + ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000, + ); + } else { + codePoints.push(value); + i--; + } + } else { + codePoints.push(value); } - return codePoints; + } + return codePoints; }; var fromCodePoint$1 = function () { - var codePoints = []; - for (var _i = 0; _i < arguments.length; _i++) { - codePoints[_i] = arguments[_i]; + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (String.fromCodePoint) { + return String.fromCodePoint.apply(String, codePoints); + } + var length = codePoints.length; + if (!length) { + return ""; + } + var codeUnits = []; + var index = -1; + var result = ""; + while (++index < length) { + var codePoint = codePoints[index]; + if (codePoint <= 0xffff) { + codeUnits.push(codePoint); + } else { + codePoint -= 0x10000; + codeUnits.push( + (codePoint >> 10) + 0xd800, + (codePoint % 0x400) + 0xdc00, + ); } - if (String.fromCodePoint) { - return String.fromCodePoint.apply(String, codePoints); + if (index + 1 === length || codeUnits.length > 0x4000) { + result += String.fromCharCode.apply(String, codeUnits); + codeUnits.length = 0; } - var length = codePoints.length; - if (!length) { - return ''; - } - var codeUnits = []; - var index = -1; - var result = ''; - while (++index < length) { - var codePoint = codePoints[index]; - if (codePoint <= 0xffff) { - codeUnits.push(codePoint); - } - else { - codePoint -= 0x10000; - codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00); - } - if (index + 1 === length || codeUnits.length > 0x4000) { - result += String.fromCharCode.apply(String, codeUnits); - codeUnits.length = 0; - } - } - return result; + } + return result; }; - var chars$2 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var chars$2 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. - var lookup$2 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); + var lookup$2 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); for (var i$2 = 0; i$2 < chars$2.length; i$2++) { - lookup$2[chars$2.charCodeAt(i$2)] = i$2; + lookup$2[chars$2.charCodeAt(i$2)] = i$2; } /* @@ -2204,52 +2578,67 @@ * Copyright (c) 2022 Niklas von Hertzen * Released under MIT License */ - var chars$1$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var chars$1$1 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. - var lookup$1$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); + var lookup$1$1 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); for (var i$1$1 = 0; i$1$1 < chars$1$1.length; i$1$1++) { - lookup$1$1[chars$1$1.charCodeAt(i$1$1)] = i$1$1; + lookup$1$1[chars$1$1.charCodeAt(i$1$1)] = i$1$1; } var decode$1 = function (base64) { - var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4; - if (base64[base64.length - 1] === '=') { - bufferLength--; - if (base64[base64.length - 2] === '=') { - bufferLength--; - } + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + if (base64[base64.length - 1] === "=") { + bufferLength--; + if (base64[base64.length - 2] === "=") { + bufferLength--; } - var buffer = typeof ArrayBuffer !== 'undefined' && - typeof Uint8Array !== 'undefined' && - typeof Uint8Array.prototype.slice !== 'undefined' - ? new ArrayBuffer(bufferLength) - : new Array(bufferLength); - var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); - for (i = 0; i < len; i += 4) { - encoded1 = lookup$1$1[base64.charCodeAt(i)]; - encoded2 = lookup$1$1[base64.charCodeAt(i + 1)]; - encoded3 = lookup$1$1[base64.charCodeAt(i + 2)]; - encoded4 = lookup$1$1[base64.charCodeAt(i + 3)]; - bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); - bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); - bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); - } - return buffer; + } + var buffer = + typeof ArrayBuffer !== "undefined" && + typeof Uint8Array !== "undefined" && + typeof Uint8Array.prototype.slice !== "undefined" + ? new ArrayBuffer(bufferLength) + : new Array(bufferLength); + var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); + for (i = 0; i < len; i += 4) { + encoded1 = lookup$1$1[base64.charCodeAt(i)]; + encoded2 = lookup$1$1[base64.charCodeAt(i + 1)]; + encoded3 = lookup$1$1[base64.charCodeAt(i + 2)]; + encoded4 = lookup$1$1[base64.charCodeAt(i + 3)]; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + return buffer; }; var polyUint16Array$1 = function (buffer) { - var length = buffer.length; - var bytes = []; - for (var i = 0; i < length; i += 2) { - bytes.push((buffer[i + 1] << 8) | buffer[i]); - } - return bytes; + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 2) { + bytes.push((buffer[i + 1] << 8) | buffer[i]); + } + return bytes; }; var polyUint32Array$1 = function (buffer) { - var length = buffer.length; - var bytes = []; - for (var i = 0; i < length; i += 4) { - bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]); - } - return bytes; + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 4) { + bytes.push( + (buffer[i + 3] << 24) | + (buffer[i + 2] << 16) | + (buffer[i + 1] << 8) | + buffer[i], + ); + } + return bytes; }; /** Shift size for getting the index-2 table offset. */ @@ -2281,13 +2670,15 @@ var UTRIE2_DATA_MASK$1 = UTRIE2_DATA_BLOCK_LENGTH$1 - 1; var UTRIE2_LSCP_INDEX_2_LENGTH$1 = 0x400 >> UTRIE2_SHIFT_2$1; /** Count the lengths of both BMP pieces. 2080=0x820 */ - var UTRIE2_INDEX_2_BMP_LENGTH$1 = UTRIE2_LSCP_INDEX_2_OFFSET$1 + UTRIE2_LSCP_INDEX_2_LENGTH$1; + var UTRIE2_INDEX_2_BMP_LENGTH$1 = + UTRIE2_LSCP_INDEX_2_OFFSET$1 + UTRIE2_LSCP_INDEX_2_LENGTH$1; /** * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820. * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2. */ var UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 = UTRIE2_INDEX_2_BMP_LENGTH$1; - var UTRIE2_UTF8_2B_INDEX_2_LENGTH$1 = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ + var UTRIE2_UTF8_2B_INDEX_2_LENGTH$1 = + 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ /** * The index-1 table, only used for supplementary code points, at offset 2112=0x840. * Variable length, for code points up to highStart, where the last single-value range starts. @@ -2300,7 +2691,8 @@ * Both the index-1 table and the following part of the index-2 table * are omitted completely if there is only BMP data. */ - var UTRIE2_INDEX_1_OFFSET$1 = UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 + UTRIE2_UTF8_2B_INDEX_2_LENGTH$1; + var UTRIE2_INDEX_1_OFFSET$1 = + UTRIE2_UTF8_2B_INDEX_2_OFFSET$1 + UTRIE2_UTF8_2B_INDEX_2_LENGTH$1; /** * Number of index-1 entries for the BMP. 32=0x20 * This part of the index-1 table is omitted from the serialized form. @@ -2311,97 +2703,132 @@ /** Mask for getting the lower bits for the in-index-2-block offset. */ var UTRIE2_INDEX_2_MASK$1 = UTRIE2_INDEX_2_BLOCK_LENGTH$1 - 1; var slice16$1 = function (view, start, end) { - if (view.slice) { - return view.slice(start, end); - } - return new Uint16Array(Array.prototype.slice.call(view, start, end)); + if (view.slice) { + return view.slice(start, end); + } + return new Uint16Array(Array.prototype.slice.call(view, start, end)); }; var slice32$1 = function (view, start, end) { - if (view.slice) { - return view.slice(start, end); - } - return new Uint32Array(Array.prototype.slice.call(view, start, end)); + if (view.slice) { + return view.slice(start, end); + } + return new Uint32Array(Array.prototype.slice.call(view, start, end)); }; var createTrieFromBase64$1 = function (base64, _byteLength) { - var buffer = decode$1(base64); - var view32 = Array.isArray(buffer) ? polyUint32Array$1(buffer) : new Uint32Array(buffer); - var view16 = Array.isArray(buffer) ? polyUint16Array$1(buffer) : new Uint16Array(buffer); - var headerLength = 24; - var index = slice16$1(view16, headerLength / 2, view32[4] / 2); - var data = view32[5] === 2 - ? slice16$1(view16, (headerLength + view32[4]) / 2) - : slice32$1(view32, Math.ceil((headerLength + view32[4]) / 4)); - return new Trie$1(view32[0], view32[1], view32[2], view32[3], index, data); + var buffer = decode$1(base64); + var view32 = Array.isArray(buffer) + ? polyUint32Array$1(buffer) + : new Uint32Array(buffer); + var view16 = Array.isArray(buffer) + ? polyUint16Array$1(buffer) + : new Uint16Array(buffer); + var headerLength = 24; + var index = slice16$1(view16, headerLength / 2, view32[4] / 2); + var data = + view32[5] === 2 + ? slice16$1(view16, (headerLength + view32[4]) / 2) + : slice32$1(view32, Math.ceil((headerLength + view32[4]) / 4)); + return new Trie$1( + view32[0], + view32[1], + view32[2], + view32[3], + index, + data, + ); }; var Trie$1 = /** @class */ (function () { - function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) { - this.initialValue = initialValue; - this.errorValue = errorValue; - this.highStart = highStart; - this.highValueIndex = highValueIndex; - this.index = index; - this.data = data; + function Trie( + initialValue, + errorValue, + highStart, + highValueIndex, + index, + data, + ) { + this.initialValue = initialValue; + this.errorValue = errorValue; + this.highStart = highStart; + this.highValueIndex = highValueIndex; + this.index = index; + this.data = data; + } + /** + * Get the value for a code point as stored in the Trie. + * + * @param codePoint the code point + * @return the value + */ + Trie.prototype.get = function (codePoint) { + var ix; + if (codePoint >= 0) { + if ( + codePoint < 0x0d800 || + (codePoint > 0x0dbff && codePoint <= 0x0ffff) + ) { + // Ordinary BMP code point, excluding leading surrogates. + // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. + // 16 bit data is stored in the index array itself. + ix = this.index[codePoint >> UTRIE2_SHIFT_2$1]; + ix = + (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); + return this.data[ix]; + } + if (codePoint <= 0xffff) { + // Lead Surrogate Code Point. A Separate index section is stored for + // lead surrogate code units and code points. + // The main index has the code unit data. + // For this function, we need the code point data. + // Note: this expression could be refactored for slightly improved efficiency, but + // surrogate code points will be so rare in practice that it's not worth it. + ix = + this.index[ + UTRIE2_LSCP_INDEX_2_OFFSET$1 + + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2$1) + ]; + ix = + (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); + return this.data[ix]; + } + if (codePoint < this.highStart) { + // Supplemental code point, use two-level lookup. + ix = + UTRIE2_INDEX_1_OFFSET$1 - + UTRIE2_OMITTED_BMP_INDEX_1_LENGTH$1 + + (codePoint >> UTRIE2_SHIFT_1$1); + ix = this.index[ix]; + ix += (codePoint >> UTRIE2_SHIFT_2$1) & UTRIE2_INDEX_2_MASK$1; + ix = this.index[ix]; + ix = + (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); + return this.data[ix]; + } + if (codePoint <= 0x10ffff) { + return this.data[this.highValueIndex]; + } } - /** - * Get the value for a code point as stored in the Trie. - * - * @param codePoint the code point - * @return the value - */ - Trie.prototype.get = function (codePoint) { - var ix; - if (codePoint >= 0) { - if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) { - // Ordinary BMP code point, excluding leading surrogates. - // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. - // 16 bit data is stored in the index array itself. - ix = this.index[codePoint >> UTRIE2_SHIFT_2$1]; - ix = (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); - return this.data[ix]; - } - if (codePoint <= 0xffff) { - // Lead Surrogate Code Point. A Separate index section is stored for - // lead surrogate code units and code points. - // The main index has the code unit data. - // For this function, we need the code point data. - // Note: this expression could be refactored for slightly improved efficiency, but - // surrogate code points will be so rare in practice that it's not worth it. - ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET$1 + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2$1)]; - ix = (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); - return this.data[ix]; - } - if (codePoint < this.highStart) { - // Supplemental code point, use two-level lookup. - ix = UTRIE2_INDEX_1_OFFSET$1 - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH$1 + (codePoint >> UTRIE2_SHIFT_1$1); - ix = this.index[ix]; - ix += (codePoint >> UTRIE2_SHIFT_2$1) & UTRIE2_INDEX_2_MASK$1; - ix = this.index[ix]; - ix = (ix << UTRIE2_INDEX_SHIFT$1) + (codePoint & UTRIE2_DATA_MASK$1); - return this.data[ix]; - } - if (codePoint <= 0x10ffff) { - return this.data[this.highValueIndex]; - } - } - // Fall through. The code point is outside of the legal range of 0..0x10ffff. - return this.errorValue; - }; - return Trie; - }()); + // Fall through. The code point is outside of the legal range of 0..0x10ffff. + return this.errorValue; + }; + return Trie; + })(); /* * base64-arraybuffer 1.0.2 * Copyright (c) 2022 Niklas von Hertzen * Released under MIT License */ - var chars$3 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var chars$3 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. - var lookup$3 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); + var lookup$3 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); for (var i$3 = 0; i$3 < chars$3.length; i$3++) { - lookup$3[chars$3.charCodeAt(i$3)] = i$3; + lookup$3[chars$3.charCodeAt(i$3)] = i$3; } - var base64$1 = 'KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA=='; + var base64$1 = + "KwAAAAAAAAAACA4AUD0AADAgAAACAAAAAAAIABAAGABAAEgAUABYAGAAaABgAGgAYgBqAF8AZwBgAGgAcQB5AHUAfQCFAI0AlQCdAKIAqgCyALoAYABoAGAAaABgAGgAwgDKAGAAaADGAM4A0wDbAOEA6QDxAPkAAQEJAQ8BFwF1AH0AHAEkASwBNAE6AUIBQQFJAVEBWQFhAWgBcAF4ATAAgAGGAY4BlQGXAZ8BpwGvAbUBvQHFAc0B0wHbAeMB6wHxAfkBAQIJAvEBEQIZAiECKQIxAjgCQAJGAk4CVgJeAmQCbAJ0AnwCgQKJApECmQKgAqgCsAK4ArwCxAIwAMwC0wLbAjAA4wLrAvMC+AIAAwcDDwMwABcDHQMlAy0DNQN1AD0DQQNJA0kDSQNRA1EDVwNZA1kDdQB1AGEDdQBpA20DdQN1AHsDdQCBA4kDkQN1AHUAmQOhA3UAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AKYDrgN1AHUAtgO+A8YDzgPWAxcD3gPjA+sD8wN1AHUA+wMDBAkEdQANBBUEHQQlBCoEFwMyBDgEYABABBcDSARQBFgEYARoBDAAcAQzAXgEgASIBJAEdQCXBHUAnwSnBK4EtgS6BMIEyAR1AHUAdQB1AHUAdQCVANAEYABgAGAAYABgAGAAYABgANgEYADcBOQEYADsBPQE/AQEBQwFFAUcBSQFLAU0BWQEPAVEBUsFUwVbBWAAYgVgAGoFcgV6BYIFigWRBWAAmQWfBaYFYABgAGAAYABgAKoFYACxBbAFuQW6BcEFwQXHBcEFwQXPBdMF2wXjBeoF8gX6BQIGCgYSBhoGIgYqBjIGOgZgAD4GRgZMBmAAUwZaBmAAYABgAGAAYABgAGAAYABgAGAAYABgAGIGYABpBnAGYABgAGAAYABgAGAAYABgAGAAYAB4Bn8GhQZgAGAAYAB1AHcDFQSLBmAAYABgAJMGdQA9A3UAmwajBqsGqwaVALMGuwbDBjAAywbSBtIG1QbSBtIG0gbSBtIG0gbdBuMG6wbzBvsGAwcLBxMHAwcbByMHJwcsBywHMQcsB9IGOAdAB0gHTgfSBkgHVgfSBtIG0gbSBtIG0gbSBtIG0gbSBiwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdgAGAALAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAdbB2MHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB2kH0gZwB64EdQB1AHUAdQB1AHUAdQB1AHUHfQdgAIUHjQd1AHUAlQedB2AAYAClB6sHYACzB7YHvgfGB3UAzgfWBzMB3gfmB1EB7gf1B/0HlQENAQUIDQh1ABUIHQglCBcDLQg1CD0IRQhNCEEDUwh1AHUAdQBbCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIaQhjCGQIZQhmCGcIaAhpCGMIZAhlCGYIZwhoCGkIYwhkCGUIZghnCGgIcAh3CHoIMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIgggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAALAcsBywHLAcsBywHLAcsBywHLAcsB4oILAcsB44I0gaWCJ4Ipgh1AHUAqgiyCHUAdQB1AHUAdQB1AHUAdQB1AHUAtwh8AXUAvwh1AMUIyQjRCNkI4AjoCHUAdQB1AO4I9gj+CAYJDgkTCS0HGwkjCYIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiCCIIIggiAAIAAAAFAAYABgAGIAXwBgAHEAdQBFAJUAogCyAKAAYABgAEIA4ABGANMA4QDxAMEBDwE1AFwBLAE6AQEBUQF4QkhCmEKoQrhCgAHIQsAB0MLAAcABwAHAAeDC6ABoAHDCwMMAAcABwAHAAdDDGMMAAcAB6MM4wwjDWMNow3jDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEjDqABWw6bDqABpg6gAaABoAHcDvwOPA+gAaABfA/8DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DvwO/A78DpcPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB9cPKwkyCToJMAB1AHUAdQBCCUoJTQl1AFUJXAljCWcJawkwADAAMAAwAHMJdQB2CX4JdQCECYoJjgmWCXUAngkwAGAAYABxAHUApgn3A64JtAl1ALkJdQDACTAAMAAwADAAdQB1AHUAdQB1AHUAdQB1AHUAowYNBMUIMAAwADAAMADICcsJ0wnZCRUE4QkwAOkJ8An4CTAAMAB1AAAKvwh1AAgKDwoXCh8KdQAwACcKLgp1ADYKqAmICT4KRgowADAAdQB1AE4KMAB1AFYKdQBeCnUAZQowADAAMAAwADAAMAAwADAAMAAVBHUAbQowADAAdQC5CXUKMAAwAHwBxAijBogEMgF9CoQKiASMCpQKmgqIBKIKqgquCogEDQG2Cr4KxgrLCjAAMADTCtsKCgHjCusK8Qr5CgELMAAwADAAMAB1AIsECQsRC3UANAEZCzAAMAAwADAAMAB1ACELKQswAHUANAExCzkLdQBBC0kLMABRC1kLMAAwADAAMAAwADAAdQBhCzAAMAAwAGAAYABpC3ELdwt/CzAAMACHC4sLkwubC58Lpwt1AK4Ltgt1APsDMAAwADAAMAAwADAAMAAwAL4LwwvLC9IL1wvdCzAAMADlC+kL8Qv5C/8LSQswADAAMAAwADAAMAAwADAAMAAHDDAAMAAwADAAMAAODBYMHgx1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1ACYMMAAwADAAdQB1AHUALgx1AHUAdQB1AHUAdQA2DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AD4MdQBGDHUAdQB1AHUAdQB1AEkMdQB1AHUAdQB1AFAMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQBYDHUAdQB1AF8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUA+wMVBGcMMAAwAHwBbwx1AHcMfwyHDI8MMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYABgAJcMMAAwADAAdQB1AJ8MlQClDDAAMACtDCwHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsB7UMLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHdQB1AHUAdQB1AHUAdQB1AHUAdQB1AHUAdQB1AA0EMAC9DDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAsBywHLAcsBywHLAcsBywHLQcwAMEMyAwsBywHLAcsBywHLAcsBywHLAcsBywHzAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAHUAdQB1ANQM2QzhDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMABgAGAAYABgAGAAYABgAOkMYADxDGAA+AwADQYNYABhCWAAYAAODTAAMAAwADAAFg1gAGAAHg37AzAAMAAwADAAYABgACYNYAAsDTQNPA1gAEMNPg1LDWAAYABgAGAAYABgAGAAYABgAGAAUg1aDYsGVglhDV0NcQBnDW0NdQ15DWAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAlQCBDZUAiA2PDZcNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAnw2nDTAAMAAwADAAMAAwAHUArw23DTAAMAAwADAAMAAwADAAMAAwADAAMAB1AL8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAB1AHUAdQB1AHUAdQDHDTAAYABgAM8NMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA1w11ANwNMAAwAD0B5A0wADAAMAAwADAAMADsDfQN/A0EDgwOFA4wABsOMAAwADAAMAAwADAAMAAwANIG0gbSBtIG0gbSBtIG0gYjDigOwQUuDsEFMw7SBjoO0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGQg5KDlIOVg7SBtIGXg5lDm0OdQ7SBtIGfQ6EDooOjQ6UDtIGmg6hDtIG0gaoDqwO0ga0DrwO0gZgAGAAYADEDmAAYAAkBtIGzA5gANIOYADaDokO0gbSBt8O5w7SBu8O0gb1DvwO0gZgAGAAxA7SBtIG0gbSBtIGYABgAGAAYAAED2AAsAUMD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHJA8sBywHLAcsBywHLAccDywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywPLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAc0D9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAccD9IG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIGFA8sBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHLAcsBywHPA/SBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gbSBtIG0gYUD0QPlQCVAJUAMAAwADAAMACVAJUAlQCVAJUAlQCVAEwPMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA//8EAAQABAAEAAQABAAEAAQABAANAAMAAQABAAIABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQACgATABcAHgAbABoAHgAXABYAEgAeABsAGAAPABgAHABLAEsASwBLAEsASwBLAEsASwBLABgAGAAeAB4AHgATAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAGwASAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWAA0AEQAeAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAFAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJABYAGgAbABsAGwAeAB0AHQAeAE8AFwAeAA0AHgAeABoAGwBPAE8ADgBQAB0AHQAdAE8ATwAXAE8ATwBPABYAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwBWAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsABAAbABsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUAAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEAA0ADQBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABABQACsAKwArACsAKwArACsAKwAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUAAaABoAUABQAFAAUABQAEwAHgAbAFAAHgAEACsAKwAEAAQABAArAFAAUABQAFAAUABQACsAKwArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQACsAUABQACsAKwAEACsABAAEAAQABAAEACsAKwArACsABAAEACsAKwAEAAQABAArACsAKwAEACsAKwArACsAKwArACsAUABQAFAAUAArAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAAQABABQAFAAUAAEAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAArACsAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AGwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAKwArACsAKwArAAQABAAEACsAKwArACsAUABQACsAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAAQAUAArAFAAUABQAFAAUABQACsAKwArAFAAUABQACsAUABQAFAAUAArACsAKwBQAFAAKwBQACsAUABQACsAKwArAFAAUAArACsAKwBQAFAAUAArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAArACsAKwAEAAQABAArAAQABAAEAAQAKwArAFAAKwArACsAKwArACsABAArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAHgAeAB4AHgAeAB4AGwAeACsAKwArACsAKwAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAUABQAFAAKwArACsAKwArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwAOAFAAUABQAFAAUABQAFAAHgBQAAQABAAEAA4AUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAKwArAAQAUAAEAAQABAAEAAQABAAEACsABAAEAAQAKwAEAAQABAAEACsAKwArACsAKwArACsABAAEACsAKwArACsAKwArACsAUAArAFAAUAAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwAEAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAXABcAFwAXABcACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAXAArAFwAXABcAFwAXABcAFwAXABcAFwAKgBcAFwAKgAqACoAKgAqACoAKgAqACoAXAArACsAXABcAFwAXABcACsAXAArACoAKgAqACoAKgAqACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwBcAFwAXABcAFAADgAOAA4ADgAeAA4ADgAJAA4ADgANAAkAEwATABMAEwATAAkAHgATAB4AHgAeAAQABAAeAB4AHgAeAB4AHgBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAADQAEAB4ABAAeAAQAFgARABYAEQAEAAQAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAAQABAAEAAQADQAEAAQAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAA0ADQAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeACsAHgAeAA4ADgANAA4AHgAeAB4AHgAeAAkACQArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgBcAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4AHgAeAB4AXABcAFwAXABcAFwAKgAqACoAKgBcAFwAXABcACoAKgAqAFwAKgAqACoAXABcACoAKgAqACoAKgAqACoAXABcAFwAKgAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwAKgBLAEsASwBLAEsASwBLAEsASwBLACoAKgAqACoAKgAqAFAAUABQAFAAUABQACsAUAArACsAKwArACsAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAKwBQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsABAAEAAQAHgANAB4AHgAeAB4AHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUAArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAWABEAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAANAA0AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUAArAAQABAArACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAA0ADQAVAFwADQAeAA0AGwBcACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwAeAB4AEwATAA0ADQAOAB4AEwATAB4ABAAEAAQACQArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAHgArACsAKwATABMASwBLAEsASwBLAEsASwBLAEsASwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAXABcAFwAXABcACsAKwArACsAKwArACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXAArACsAKwAqACoAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsAHgAeAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAqACoAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKwArAAQASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACoAKgAqACoAKgAqACoAXAAqACoAKgAqACoAKgArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABABQAFAAUABQAFAAUABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgANAA0ADQANAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwAeAB4AHgAeAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArAA0ADQANAA0ADQBLAEsASwBLAEsASwBLAEsASwBLACsAKwArAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0ADQBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUAAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArAAQABAAEAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAAQAUABQAFAAUABQAFAABABQAFAABAAEAAQAUAArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQACsAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQACsAKwAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQACsAHgAeAB4AHgAeAB4AHgAOAB4AKwANAA0ADQANAA0ADQANAAkADQANAA0ACAAEAAsABAAEAA0ACQANAA0ADAAdAB0AHgAXABcAFgAXABcAFwAWABcAHQAdAB4AHgAUABQAFAANAAEAAQAEAAQABAAEAAQACQAaABoAGgAaABoAGgAaABoAHgAXABcAHQAVABUAHgAeAB4AHgAeAB4AGAAWABEAFQAVABUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ADQAeAA0ADQANAA0AHgANAA0ADQAHAB4AHgAeAB4AKwAEAAQABAAEAAQABAAEAAQABAAEAFAAUAArACsATwBQAFAAUABQAFAAHgAeAB4AFgARAE8AUABPAE8ATwBPAFAAUABQAFAAUAAeAB4AHgAWABEAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArABsAGwAbABsAGwAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGgAbABsAGwAbABoAGwAbABoAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAFAAGgAeAB0AHgBQAB4AGgAeAB4AHgAeAB4AHgAeAB4AHgBPAB4AUAAbAB4AHgBQAFAAUABQAFAAHgAeAB4AHQAdAB4AUAAeAFAAHgBQAB4AUABPAFAAUAAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAHgBQAFAAUABQAE8ATwBQAFAAUABQAFAATwBQAFAATwBQAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAUABQAFAATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABPAB4AHgArACsAKwArAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAdAB4AHgAeAB0AHQAeAB4AHQAeAB4AHgAdAB4AHQAbABsAHgAdAB4AHgAeAB4AHQAeAB4AHQAdAB0AHQAeAB4AHQAeAB0AHgAdAB0AHQAdAB0AHQAeAB0AHgAeAB4AHgAeAB0AHQAdAB0AHgAeAB4AHgAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB0AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAdAB0AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAHgAeAB4AHgAeAB4AHQAeAB4AHgAeAB4AHgAeACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAFAAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHQAdAB0AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHQAdAB4AHgAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AJQAlAB0AHQAlAB4AJQAlACUAIAAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAeAB4AHgAeAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAeAB0AJQAdAB0AHgAdAB0AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAdAB0AHQAdACUAHgAlACUAJQAdACUAJQAdAB0AHQAlACUAHQAdACUAHQAdACUAJQAlAB4AHQAeAB4AHgAeAB0AHQAlAB0AHQAdAB0AHQAdACUAJQAlACUAJQAdACUAJQAgACUAHQAdACUAJQAlACUAJQAlACUAJQAeAB4AHgAlACUAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AFwAXABcAFwAXABcAHgATABMAJQAeAB4AHgAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARABYAEQAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANAA0AHgANAB4ADQANAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwAlACUAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACsAKwArACsAKwArACsAKwArACsAKwArAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBPAE8ATwBPAE8ATwBPAE8AJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeAAQAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUABQAAQAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUAANAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAUABQAFAAUABQAAQABAAEACsABAAEACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAKwBQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAA0ADQANAA0ADQANAA0ADQAeACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAArACsAKwArAFAAUABQAFAAUAANAA0ADQANAA0ADQAUACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQANAA0ADQANAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAANACsAKwBQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAB4AHgAeAB4AHgArACsAKwArACsAKwAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwAeACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANAFAABAAEAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAEAAQABAAEAB4ABAAEAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQACsABAAEAFAABAAEAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLAA0ADQArAB4ABABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAFAAUAAeAFAAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAAEAAQADgANAA0AEwATAB4AHgAeAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAFAAUABQAFAABAAEACsAKwAEAA0ADQAeAFAAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcAFwADQANAA0AKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQAKwAEAAQAKwArAAQABAAEAAQAUAAEAFAABAAEAA0ADQANACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABABQAA4AUAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANAFAADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAUAArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAaABoAGgAaAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAJAAkACQAJAAkACQAJABYAEQArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AHgAeACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwAEAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAARwBHABUARwAJACsAKwArACsAKwArACsAKwArACsAKwAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAKwArACsAKwArACsAKwArACsAKwArACsAKwBRAFEAUQBRACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUAArACsAHgAEAAQADQAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAeAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQAHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAKwArAFAAKwArAFAAUAArACsAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAHgAeAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeACsAKwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4ABAAeAB4AHgAeAB4AHgAeAB4AHgAeAAQAHgAeAA0ADQANAA0AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArAAQABAAEAAQABAAEAAQAKwAEAAQAKwAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAEAAQABAAEAAQABAAEAFAAUABQAFAAUABQAFAAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwBQAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArABsAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAB4AHgAeAB4ABAAEAAQABAAEAAQABABQACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArABYAFgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAGgBQAFAAUAAaAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUAArACsAKwArACsAKwBQACsAKwArACsAUAArAFAAKwBQACsAUABQAFAAKwBQAFAAKwBQACsAKwBQACsAUAArAFAAKwBQACsAUAArAFAAUAArAFAAKwArAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAUABQAFAAKwBQACsAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAKwBQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeACUAJQAlAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAHgAlACUAJQAlACUAIAAgACAAJQAlACAAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACEAIQAhACEAIQAlACUAIAAgACUAJQAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAlACUAJQAlACAAIAAgACUAIAAgACAAJQAlACUAJQAlACUAJQAgACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAlAB4AJQAeACUAJQAlACUAJQAgACUAJQAlACUAHgAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACAAIAAgACAAIAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABcAFwAXABUAFQAVAB4AHgAeAB4AJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAgACUAJQAgACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAgACAAIAAgACAAIAAgACAAIAAgACUAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAlACAAIAAlACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAgACAAIAAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAA=="; var LETTER_NUMBER_MODIFIER = 50; // Non-tailorable Line Breaking Classes @@ -2452,9 +2879,9 @@ var SA = 42; // Provide a line break opportunity contingent on additional, language-specific context analysis var XX = 43; // Have as yet unknown line breaking behavior or unassigned code positions var ea_OP = [0x2329, 0xff08]; - var BREAK_MANDATORY = '!'; - var BREAK_NOT_ALLOWED$1 = '×'; - var BREAK_ALLOWED$1 = '÷'; + var BREAK_MANDATORY = "!"; + var BREAK_NOT_ALLOWED$1 = "×"; + var BREAK_ALLOWED$1 = "÷"; var UnicodeTrie$1 = createTrieFromBase64$1(base64$1); var ALPHABETICS = [AL, HL]; var HARD_LINE_BREAKS = [BK, CR$1, LF$1, NL]; @@ -2464,378 +2891,443 @@ var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3]; var HYPHEN = [HY, BA]; var codePointsToCharacterClasses = function (codePoints, lineBreak) { - if (lineBreak === void 0) { lineBreak = 'strict'; } - var types = []; - var indices = []; - var categories = []; - codePoints.forEach(function (codePoint, index) { - var classType = UnicodeTrie$1.get(codePoint); - if (classType > LETTER_NUMBER_MODIFIER) { - categories.push(true); - classType -= LETTER_NUMBER_MODIFIER; - } - else { - categories.push(false); - } - if (['normal', 'auto', 'loose'].indexOf(lineBreak) !== -1) { - // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0 - if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) { - indices.push(index); - return types.push(CB); - } - } - if (classType === CM || classType === ZWJ$1) { - // LB10 Treat any remaining combining mark or ZWJ as AL. - if (index === 0) { - indices.push(index); - return types.push(AL); - } - // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of - // the base character in all of the following rules. Treat ZWJ as if it were CM. - var prev = types[index - 1]; - if (LINE_BREAKS.indexOf(prev) === -1) { - indices.push(indices[index - 1]); - return types.push(prev); - } - indices.push(index); - return types.push(AL); - } + if (lineBreak === void 0) { + lineBreak = "strict"; + } + var types = []; + var indices = []; + var categories = []; + codePoints.forEach(function (codePoint, index) { + var classType = UnicodeTrie$1.get(codePoint); + if (classType > LETTER_NUMBER_MODIFIER) { + categories.push(true); + classType -= LETTER_NUMBER_MODIFIER; + } else { + categories.push(false); + } + if (["normal", "auto", "loose"].indexOf(lineBreak) !== -1) { + // U+2010, – U+2013, 〜 U+301C, ゠ U+30A0 + if ([0x2010, 0x2013, 0x301c, 0x30a0].indexOf(codePoint) !== -1) { indices.push(index); - if (classType === CJ) { - return types.push(lineBreak === 'strict' ? NS : ID); - } - if (classType === SA) { - return types.push(AL); - } - if (classType === AI) { - return types.push(AL); - } - // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL - // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised - // to take into account the actual line breaking properties for these characters. - if (classType === XX) { - if ((codePoint >= 0x20000 && codePoint <= 0x2fffd) || (codePoint >= 0x30000 && codePoint <= 0x3fffd)) { - return types.push(ID); - } - else { - return types.push(AL); - } - } - types.push(classType); - }); - return [indices, types, categories]; + return types.push(CB); + } + } + if (classType === CM || classType === ZWJ$1) { + // LB10 Treat any remaining combining mark or ZWJ as AL. + if (index === 0) { + indices.push(index); + return types.push(AL); + } + // LB9 Do not break a combining character sequence; treat it as if it has the line breaking class of + // the base character in all of the following rules. Treat ZWJ as if it were CM. + var prev = types[index - 1]; + if (LINE_BREAKS.indexOf(prev) === -1) { + indices.push(indices[index - 1]); + return types.push(prev); + } + indices.push(index); + return types.push(AL); + } + indices.push(index); + if (classType === CJ) { + return types.push(lineBreak === "strict" ? NS : ID); + } + if (classType === SA) { + return types.push(AL); + } + if (classType === AI) { + return types.push(AL); + } + // For supplementary characters, a useful default is to treat characters in the range 10000..1FFFD as AL + // and characters in the ranges 20000..2FFFD and 30000..3FFFD as ID, until the implementation can be revised + // to take into account the actual line breaking properties for these characters. + if (classType === XX) { + if ( + (codePoint >= 0x20000 && codePoint <= 0x2fffd) || + (codePoint >= 0x30000 && codePoint <= 0x3fffd) + ) { + return types.push(ID); + } else { + return types.push(AL); + } + } + types.push(classType); + }); + return [indices, types, categories]; }; - var isAdjacentWithSpaceIgnored = function (a, b, currentIndex, classTypes) { - var current = classTypes[currentIndex]; - if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) { - var i = currentIndex; - while (i <= classTypes.length) { - i++; - var next = classTypes[i]; - if (next === b) { - return true; - } - if (next !== SP) { - break; - } - } + var isAdjacentWithSpaceIgnored = function ( + a, + b, + currentIndex, + classTypes, + ) { + var current = classTypes[currentIndex]; + if (Array.isArray(a) ? a.indexOf(current) !== -1 : a === current) { + var i = currentIndex; + while (i <= classTypes.length) { + i++; + var next = classTypes[i]; + if (next === b) { + return true; + } + if (next !== SP) { + break; + } } - if (current === SP) { - var i = currentIndex; - while (i > 0) { - i--; - var prev = classTypes[i]; - if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) { - var n = currentIndex; - while (n <= classTypes.length) { - n++; - var next = classTypes[n]; - if (next === b) { - return true; - } - if (next !== SP) { - break; - } - } - } - if (prev !== SP) { - break; - } + } + if (current === SP) { + var i = currentIndex; + while (i > 0) { + i--; + var prev = classTypes[i]; + if (Array.isArray(a) ? a.indexOf(prev) !== -1 : a === prev) { + var n = currentIndex; + while (n <= classTypes.length) { + n++; + var next = classTypes[n]; + if (next === b) { + return true; + } + if (next !== SP) { + break; + } } + } + if (prev !== SP) { + break; + } } - return false; + } + return false; }; var previousNonSpaceClassType = function (currentIndex, classTypes) { - var i = currentIndex; - while (i >= 0) { - var type = classTypes[i]; - if (type === SP) { - i--; - } - else { - return type; - } + var i = currentIndex; + while (i >= 0) { + var type = classTypes[i]; + if (type === SP) { + i--; + } else { + return type; } - return 0; + } + return 0; }; - var _lineBreakAtIndex = function (codePoints, classTypes, indicies, index, forbiddenBreaks) { - if (indicies[index] === 0) { - return BREAK_NOT_ALLOWED$1; - } - var currentIndex = index - 1; - if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) { - return BREAK_NOT_ALLOWED$1; - } - var beforeIndex = currentIndex - 1; - var afterIndex = currentIndex + 1; - var current = classTypes[currentIndex]; - // LB4 Always break after hard line breaks. - // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks. - var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0; - var next = classTypes[afterIndex]; - if (current === CR$1 && next === LF$1) { - return BREAK_NOT_ALLOWED$1; - } - if (HARD_LINE_BREAKS.indexOf(current) !== -1) { - return BREAK_MANDATORY; - } - // LB6 Do not break before hard line breaks. - if (HARD_LINE_BREAKS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED$1; - } - // LB7 Do not break before spaces or zero width space. - if (SPACE$1.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED$1; - } - // LB8 Break before any character following a zero-width space, even if one or more spaces intervene. - if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) { - return BREAK_ALLOWED$1; - } - // LB8a Do not break after a zero width joiner. - if (UnicodeTrie$1.get(codePoints[currentIndex]) === ZWJ$1) { - return BREAK_NOT_ALLOWED$1; - } - // zwj emojis - if ((current === EB || current === EM) && UnicodeTrie$1.get(codePoints[afterIndex]) === ZWJ$1) { - return BREAK_NOT_ALLOWED$1; - } - // LB11 Do not break before or after Word joiner and related characters. - if (current === WJ || next === WJ) { - return BREAK_NOT_ALLOWED$1; - } - // LB12 Do not break after NBSP and related characters. - if (current === GL) { - return BREAK_NOT_ALLOWED$1; - } - // LB12a Do not break before NBSP and related characters, except after spaces and hyphens. - if ([SP, BA, HY].indexOf(current) === -1 && next === GL) { - return BREAK_NOT_ALLOWED$1; - } - // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. - if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED$1; - } - // LB14 Do not break after ‘[’, even after spaces. - if (previousNonSpaceClassType(currentIndex, classTypes) === OP) { - return BREAK_NOT_ALLOWED$1; - } - // LB15 Do not break within ‘”[’, even with intervening spaces. - if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED$1; - } - // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces. - if (isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED$1; - } - // LB17 Do not break within ‘——’, even with intervening spaces. - if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED$1; - } - // LB18 Break after spaces. - if (current === SP) { - return BREAK_ALLOWED$1; - } - // LB19 Do not break before or after quotation marks, such as ‘ ” ’. - if (current === QU || next === QU) { - return BREAK_NOT_ALLOWED$1; - } - // LB20 Break before and after unresolved CB. - if (next === CB || current === CB) { - return BREAK_ALLOWED$1; - } - // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents. - if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) { - return BREAK_NOT_ALLOWED$1; - } - // LB21a Don't break after Hebrew + Hyphen. - if (before === HL && HYPHEN.indexOf(current) !== -1) { - return BREAK_NOT_ALLOWED$1; - } - // LB21b Don’t break between Solidus and Hebrew letters. - if (current === SY && next === HL) { - return BREAK_NOT_ALLOWED$1; - } - // LB22 Do not break before ellipsis. - if (next === IN) { - return BREAK_NOT_ALLOWED$1; - } - // LB23 Do not break between digits and letters. - if ((ALPHABETICS.indexOf(next) !== -1 && current === NU) || (ALPHABETICS.indexOf(current) !== -1 && next === NU)) { - return BREAK_NOT_ALLOWED$1; - } - // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes. - if ((current === PR && [ID, EB, EM].indexOf(next) !== -1) || - ([ID, EB, EM].indexOf(current) !== -1 && next === PO)) { - return BREAK_NOT_ALLOWED$1; - } - // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix. - if ((ALPHABETICS.indexOf(current) !== -1 && PREFIX_POSTFIX.indexOf(next) !== -1) || - (PREFIX_POSTFIX.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1)) { - return BREAK_NOT_ALLOWED$1; - } - // LB25 Do not break between the following pairs of classes relevant to numbers: - if ( + var _lineBreakAtIndex = function ( + codePoints, + classTypes, + indicies, + index, + forbiddenBreaks, + ) { + if (indicies[index] === 0) { + return BREAK_NOT_ALLOWED$1; + } + var currentIndex = index - 1; + if ( + Array.isArray(forbiddenBreaks) && + forbiddenBreaks[currentIndex] === true + ) { + return BREAK_NOT_ALLOWED$1; + } + var beforeIndex = currentIndex - 1; + var afterIndex = currentIndex + 1; + var current = classTypes[currentIndex]; + // LB4 Always break after hard line breaks. + // LB5 Treat CR followed by LF, as well as CR, LF, and NL as hard line breaks. + var before = beforeIndex >= 0 ? classTypes[beforeIndex] : 0; + var next = classTypes[afterIndex]; + if (current === CR$1 && next === LF$1) { + return BREAK_NOT_ALLOWED$1; + } + if (HARD_LINE_BREAKS.indexOf(current) !== -1) { + return BREAK_MANDATORY; + } + // LB6 Do not break before hard line breaks. + if (HARD_LINE_BREAKS.indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB7 Do not break before spaces or zero width space. + if (SPACE$1.indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB8 Break before any character following a zero-width space, even if one or more spaces intervene. + if (previousNonSpaceClassType(currentIndex, classTypes) === ZW) { + return BREAK_ALLOWED$1; + } + // LB8a Do not break after a zero width joiner. + if (UnicodeTrie$1.get(codePoints[currentIndex]) === ZWJ$1) { + return BREAK_NOT_ALLOWED$1; + } + // zwj emojis + if ( + (current === EB || current === EM) && + UnicodeTrie$1.get(codePoints[afterIndex]) === ZWJ$1 + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB11 Do not break before or after Word joiner and related characters. + if (current === WJ || next === WJ) { + return BREAK_NOT_ALLOWED$1; + } + // LB12 Do not break after NBSP and related characters. + if (current === GL) { + return BREAK_NOT_ALLOWED$1; + } + // LB12a Do not break before NBSP and related characters, except after spaces and hyphens. + if ([SP, BA, HY].indexOf(current) === -1 && next === GL) { + return BREAK_NOT_ALLOWED$1; + } + // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. + if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB14 Do not break after ‘[’, even after spaces. + if (previousNonSpaceClassType(currentIndex, classTypes) === OP) { + return BREAK_NOT_ALLOWED$1; + } + // LB15 Do not break within ‘”[’, even with intervening spaces. + if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) { + return BREAK_NOT_ALLOWED$1; + } + // LB16 Do not break between closing punctuation and a nonstarter (lb=NS), even with intervening spaces. + if ( + isAdjacentWithSpaceIgnored([CL, CP], NS, currentIndex, classTypes) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB17 Do not break within ‘——’, even with intervening spaces. + if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) { + return BREAK_NOT_ALLOWED$1; + } + // LB18 Break after spaces. + if (current === SP) { + return BREAK_ALLOWED$1; + } + // LB19 Do not break before or after quotation marks, such as ‘ ” ’. + if (current === QU || next === QU) { + return BREAK_NOT_ALLOWED$1; + } + // LB20 Break before and after unresolved CB. + if (next === CB || current === CB) { + return BREAK_ALLOWED$1; + } + // LB21 Do not break before hyphen-minus, other hyphens, fixed-width spaces, small kana, and other non-starters, or after acute accents. + if ([BA, HY, NS].indexOf(next) !== -1 || current === BB) { + return BREAK_NOT_ALLOWED$1; + } + // LB21a Don't break after Hebrew + Hyphen. + if (before === HL && HYPHEN.indexOf(current) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB21b Don’t break between Solidus and Hebrew letters. + if (current === SY && next === HL) { + return BREAK_NOT_ALLOWED$1; + } + // LB22 Do not break before ellipsis. + if (next === IN) { + return BREAK_NOT_ALLOWED$1; + } + // LB23 Do not break between digits and letters. + if ( + (ALPHABETICS.indexOf(next) !== -1 && current === NU) || + (ALPHABETICS.indexOf(current) !== -1 && next === NU) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB23a Do not break between numeric prefixes and ideographs, or between ideographs and numeric postfixes. + if ( + (current === PR && [ID, EB, EM].indexOf(next) !== -1) || + ([ID, EB, EM].indexOf(current) !== -1 && next === PO) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB24 Do not break between numeric prefix/postfix and letters, or between letters and prefix/postfix. + if ( + (ALPHABETICS.indexOf(current) !== -1 && + PREFIX_POSTFIX.indexOf(next) !== -1) || + (PREFIX_POSTFIX.indexOf(current) !== -1 && + ALPHABETICS.indexOf(next) !== -1) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB25 Do not break between the following pairs of classes relevant to numbers: + if ( // (PR | PO) × ( OP | HY )? NU ([PR, PO].indexOf(current) !== -1 && - (next === NU || ([OP, HY].indexOf(next) !== -1 && classTypes[afterIndex + 1] === NU))) || - // ( OP | HY ) × NU - ([OP, HY].indexOf(current) !== -1 && next === NU) || - // NU × (NU | SY | IS) - (current === NU && [NU, SY, IS].indexOf(next) !== -1)) { + (next === NU || + ([OP, HY].indexOf(next) !== -1 && + classTypes[afterIndex + 1] === NU))) || + // ( OP | HY ) × NU + ([OP, HY].indexOf(current) !== -1 && next === NU) || + // NU × (NU | SY | IS) + (current === NU && [NU, SY, IS].indexOf(next) !== -1) + ) { + return BREAK_NOT_ALLOWED$1; + } + // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP) + if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) { + var prevIndex = currentIndex; + while (prevIndex >= 0) { + var type = classTypes[prevIndex]; + if (type === NU) { return BREAK_NOT_ALLOWED$1; + } else if ([SY, IS].indexOf(type) !== -1) { + prevIndex--; + } else { + break; + } } - // NU (NU | SY | IS)* × (NU | SY | IS | CL | CP) - if ([NU, SY, IS, CL, CP].indexOf(next) !== -1) { - var prevIndex = currentIndex; - while (prevIndex >= 0) { - var type = classTypes[prevIndex]; - if (type === NU) { - return BREAK_NOT_ALLOWED$1; - } - else if ([SY, IS].indexOf(type) !== -1) { - prevIndex--; - } - else { - break; - } - } - } - // NU (NU | SY | IS)* (CL | CP)? × (PO | PR)) - if ([PR, PO].indexOf(next) !== -1) { - var prevIndex = [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex; - while (prevIndex >= 0) { - var type = classTypes[prevIndex]; - if (type === NU) { - return BREAK_NOT_ALLOWED$1; - } - else if ([SY, IS].indexOf(type) !== -1) { - prevIndex--; - } - else { - break; - } - } - } - // LB26 Do not break a Korean syllable. - if ((JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) || - ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) || - ([JT, H3].indexOf(current) !== -1 && next === JT)) { + } + // NU (NU | SY | IS)* (CL | CP)? × (PO | PR)) + if ([PR, PO].indexOf(next) !== -1) { + var prevIndex = + [CL, CP].indexOf(current) !== -1 ? beforeIndex : currentIndex; + while (prevIndex >= 0) { + var type = classTypes[prevIndex]; + if (type === NU) { return BREAK_NOT_ALLOWED$1; + } else if ([SY, IS].indexOf(type) !== -1) { + prevIndex--; + } else { + break; + } } - // LB27 Treat a Korean Syllable Block the same as ID. - if ((KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && [IN, PO].indexOf(next) !== -1) || - (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR)) { - return BREAK_NOT_ALLOWED$1; + } + // LB26 Do not break a Korean syllable. + if ( + (JL === current && [JL, JV, H2, H3].indexOf(next) !== -1) || + ([JV, H2].indexOf(current) !== -1 && [JV, JT].indexOf(next) !== -1) || + ([JT, H3].indexOf(current) !== -1 && next === JT) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB27 Treat a Korean Syllable Block the same as ID. + if ( + (KOREAN_SYLLABLE_BLOCK.indexOf(current) !== -1 && + [IN, PO].indexOf(next) !== -1) || + (KOREAN_SYLLABLE_BLOCK.indexOf(next) !== -1 && current === PR) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB28 Do not break between alphabetics (“at”). + if ( + ALPHABETICS.indexOf(current) !== -1 && + ALPHABETICS.indexOf(next) !== -1 + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). + if (current === IS && ALPHABETICS.indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED$1; + } + // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses. + if ( + (ALPHABETICS.concat(NU).indexOf(current) !== -1 && + next === OP && + ea_OP.indexOf(codePoints[afterIndex]) === -1) || + (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP) + ) { + return BREAK_NOT_ALLOWED$1; + } + // LB30a Break between two regional indicator symbols if and only if there are an even number of regional + // indicators preceding the position of the break. + if (current === RI$1 && next === RI$1) { + var i = indicies[currentIndex]; + var count = 1; + while (i > 0) { + i--; + if (classTypes[i] === RI$1) { + count++; + } else { + break; + } } - // LB28 Do not break between alphabetics (“at”). - if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED$1; + if (count % 2 !== 0) { + return BREAK_NOT_ALLOWED$1; } - // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). - if (current === IS && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED$1; - } - // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses. - if ((ALPHABETICS.concat(NU).indexOf(current) !== -1 && - next === OP && - ea_OP.indexOf(codePoints[afterIndex]) === -1) || - (ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP)) { - return BREAK_NOT_ALLOWED$1; - } - // LB30a Break between two regional indicator symbols if and only if there are an even number of regional - // indicators preceding the position of the break. - if (current === RI$1 && next === RI$1) { - var i = indicies[currentIndex]; - var count = 1; - while (i > 0) { - i--; - if (classTypes[i] === RI$1) { - count++; - } - else { - break; - } - } - if (count % 2 !== 0) { - return BREAK_NOT_ALLOWED$1; - } - } - // LB30b Do not break between an emoji base and an emoji modifier. - if (current === EB && next === EM) { - return BREAK_NOT_ALLOWED$1; - } - return BREAK_ALLOWED$1; + } + // LB30b Do not break between an emoji base and an emoji modifier. + if (current === EB && next === EM) { + return BREAK_NOT_ALLOWED$1; + } + return BREAK_ALLOWED$1; }; var cssFormattedClasses = function (codePoints, options) { - if (!options) { - options = { lineBreak: 'normal', wordBreak: 'normal' }; - } - var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), indicies = _a[0], classTypes = _a[1], isLetterNumber = _a[2]; - if (options.wordBreak === 'break-all' || options.wordBreak === 'break-word') { - classTypes = classTypes.map(function (type) { return ([NU, AL, SA].indexOf(type) !== -1 ? ID : type); }); - } - var forbiddenBreakpoints = options.wordBreak === 'keep-all' - ? isLetterNumber.map(function (letterNumber, i) { - return letterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff; + if (!options) { + options = { lineBreak: "normal", wordBreak: "normal" }; + } + var _a = codePointsToCharacterClasses(codePoints, options.lineBreak), + indicies = _a[0], + classTypes = _a[1], + isLetterNumber = _a[2]; + if ( + options.wordBreak === "break-all" || + options.wordBreak === "break-word" + ) { + classTypes = classTypes.map(function (type) { + return [NU, AL, SA].indexOf(type) !== -1 ? ID : type; + }); + } + var forbiddenBreakpoints = + options.wordBreak === "keep-all" + ? isLetterNumber.map(function (letterNumber, i) { + return ( + letterNumber && + codePoints[i] >= 0x4e00 && + codePoints[i] <= 0x9fff + ); }) - : undefined; - return [indicies, classTypes, forbiddenBreakpoints]; + : undefined; + return [indicies, classTypes, forbiddenBreakpoints]; }; var Break = /** @class */ (function () { - function Break(codePoints, lineBreak, start, end) { - this.codePoints = codePoints; - this.required = lineBreak === BREAK_MANDATORY; - this.start = start; - this.end = end; - } - Break.prototype.slice = function () { - return fromCodePoint$1.apply(void 0, this.codePoints.slice(this.start, this.end)); - }; - return Break; - }()); + function Break(codePoints, lineBreak, start, end) { + this.codePoints = codePoints; + this.required = lineBreak === BREAK_MANDATORY; + this.start = start; + this.end = end; + } + Break.prototype.slice = function () { + return fromCodePoint$1.apply( + void 0, + this.codePoints.slice(this.start, this.end), + ); + }; + return Break; + })(); var LineBreaker = function (str, options) { - var codePoints = toCodePoints$1(str); - var _a = cssFormattedClasses(codePoints, options), indicies = _a[0], classTypes = _a[1], forbiddenBreakpoints = _a[2]; - var length = codePoints.length; - var lastEnd = 0; - var nextIndex = 0; - return { - next: function () { - if (nextIndex >= length) { - return { done: true, value: null }; - } - var lineBreak = BREAK_NOT_ALLOWED$1; - while (nextIndex < length && - (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) === - BREAK_NOT_ALLOWED$1) { } - if (lineBreak !== BREAK_NOT_ALLOWED$1 || nextIndex === length) { - var value = new Break(codePoints, lineBreak, lastEnd, nextIndex); - lastEnd = nextIndex; - return { value: value, done: false }; - } - return { done: true, value: null }; - }, - }; + var codePoints = toCodePoints$1(str); + var _a = cssFormattedClasses(codePoints, options), + indicies = _a[0], + classTypes = _a[1], + forbiddenBreakpoints = _a[2]; + var length = codePoints.length; + var lastEnd = 0; + var nextIndex = 0; + return { + next: function () { + if (nextIndex >= length) { + return { done: true, value: null }; + } + var lineBreak = BREAK_NOT_ALLOWED$1; + while ( + nextIndex < length && + (lineBreak = _lineBreakAtIndex( + codePoints, + classTypes, + indicies, + ++nextIndex, + forbiddenBreakpoints, + )) === BREAK_NOT_ALLOWED$1 + ) {} + if (lineBreak !== BREAK_NOT_ALLOWED$1 || nextIndex === length) { + var value = new Break(codePoints, lineBreak, lastEnd, nextIndex); + lastEnd = nextIndex; + return { value: value, done: false }; + } + return { done: true, value: null }; + }, + }; }; // https://www.w3.org/TR/css-syntax-3 @@ -2896,105 +3388,143 @@ var F = 0x0046; var U = 0x0055; var Z = 0x005a; - var isDigit = function (codePoint) { return codePoint >= ZERO && codePoint <= 0x0039; }; - var isSurrogateCodePoint = function (codePoint) { return codePoint >= 0xd800 && codePoint <= 0xdfff; }; - var isHex = function (codePoint) { - return isDigit(codePoint) || (codePoint >= A && codePoint <= F) || (codePoint >= a && codePoint <= f); + var isDigit = function (codePoint) { + return codePoint >= ZERO && codePoint <= 0x0039; + }; + var isSurrogateCodePoint = function (codePoint) { + return codePoint >= 0xd800 && codePoint <= 0xdfff; + }; + var isHex = function (codePoint) { + return ( + isDigit(codePoint) || + (codePoint >= A && codePoint <= F) || + (codePoint >= a && codePoint <= f) + ); + }; + var isLowerCaseLetter = function (codePoint) { + return codePoint >= a && codePoint <= z; + }; + var isUpperCaseLetter = function (codePoint) { + return codePoint >= A && codePoint <= Z; + }; + var isLetter = function (codePoint) { + return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); + }; + var isNonASCIICodePoint = function (codePoint) { + return codePoint >= CONTROL; }; - var isLowerCaseLetter = function (codePoint) { return codePoint >= a && codePoint <= z; }; - var isUpperCaseLetter = function (codePoint) { return codePoint >= A && codePoint <= Z; }; - var isLetter = function (codePoint) { return isLowerCaseLetter(codePoint) || isUpperCaseLetter(codePoint); }; - var isNonASCIICodePoint = function (codePoint) { return codePoint >= CONTROL; }; var isWhiteSpace = function (codePoint) { - return codePoint === LINE_FEED || codePoint === CHARACTER_TABULATION || codePoint === SPACE; + return ( + codePoint === LINE_FEED || + codePoint === CHARACTER_TABULATION || + codePoint === SPACE + ); }; var isNameStartCodePoint = function (codePoint) { - return isLetter(codePoint) || isNonASCIICodePoint(codePoint) || codePoint === LOW_LINE; + return ( + isLetter(codePoint) || + isNonASCIICodePoint(codePoint) || + codePoint === LOW_LINE + ); }; var isNameCodePoint = function (codePoint) { - return isNameStartCodePoint(codePoint) || isDigit(codePoint) || codePoint === HYPHEN_MINUS; + return ( + isNameStartCodePoint(codePoint) || + isDigit(codePoint) || + codePoint === HYPHEN_MINUS + ); }; var isNonPrintableCodePoint = function (codePoint) { - return ((codePoint >= NULL && codePoint <= BACKSPACE) || - codePoint === LINE_TABULATION || - (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) || - codePoint === DELETE); + return ( + (codePoint >= NULL && codePoint <= BACKSPACE) || + codePoint === LINE_TABULATION || + (codePoint >= SHIFT_OUT && codePoint <= INFORMATION_SEPARATOR_ONE) || + codePoint === DELETE + ); }; var isValidEscape = function (c1, c2) { - if (c1 !== REVERSE_SOLIDUS) { - return false; - } - return c2 !== LINE_FEED; + if (c1 !== REVERSE_SOLIDUS) { + return false; + } + return c2 !== LINE_FEED; }; var isIdentifierStart = function (c1, c2, c3) { - if (c1 === HYPHEN_MINUS) { - return isNameStartCodePoint(c2) || isValidEscape(c2, c3); - } - else if (isNameStartCodePoint(c1)) { - return true; - } - else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) { - return true; - } - return false; + if (c1 === HYPHEN_MINUS) { + return isNameStartCodePoint(c2) || isValidEscape(c2, c3); + } else if (isNameStartCodePoint(c1)) { + return true; + } else if (c1 === REVERSE_SOLIDUS && isValidEscape(c1, c2)) { + return true; + } + return false; }; var isNumberStart = function (c1, c2, c3) { - if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { - if (isDigit(c2)) { - return true; - } - return c2 === FULL_STOP && isDigit(c3); + if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { + if (isDigit(c2)) { + return true; } - if (c1 === FULL_STOP) { - return isDigit(c2); - } - return isDigit(c1); + return c2 === FULL_STOP && isDigit(c3); + } + if (c1 === FULL_STOP) { + return isDigit(c2); + } + return isDigit(c1); }; var stringToNumber = function (codePoints) { - var c = 0; - var sign = 1; - if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { - if (codePoints[c] === HYPHEN_MINUS) { - sign = -1; - } - c++; + var c = 0; + var sign = 1; + if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { + if (codePoints[c] === HYPHEN_MINUS) { + sign = -1; } - var integers = []; - while (isDigit(codePoints[c])) { - integers.push(codePoints[c++]); + c++; + } + var integers = []; + while (isDigit(codePoints[c])) { + integers.push(codePoints[c++]); + } + var int = integers.length + ? parseInt(fromCodePoint$1.apply(void 0, integers), 10) + : 0; + if (codePoints[c] === FULL_STOP) { + c++; + } + var fraction = []; + while (isDigit(codePoints[c])) { + fraction.push(codePoints[c++]); + } + var fracd = fraction.length; + var frac = fracd + ? parseInt(fromCodePoint$1.apply(void 0, fraction), 10) + : 0; + if (codePoints[c] === E || codePoints[c] === e) { + c++; + } + var expsign = 1; + if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { + if (codePoints[c] === HYPHEN_MINUS) { + expsign = -1; } - var int = integers.length ? parseInt(fromCodePoint$1.apply(void 0, integers), 10) : 0; - if (codePoints[c] === FULL_STOP) { - c++; - } - var fraction = []; - while (isDigit(codePoints[c])) { - fraction.push(codePoints[c++]); - } - var fracd = fraction.length; - var frac = fracd ? parseInt(fromCodePoint$1.apply(void 0, fraction), 10) : 0; - if (codePoints[c] === E || codePoints[c] === e) { - c++; - } - var expsign = 1; - if (codePoints[c] === PLUS_SIGN || codePoints[c] === HYPHEN_MINUS) { - if (codePoints[c] === HYPHEN_MINUS) { - expsign = -1; - } - c++; - } - var exponent = []; - while (isDigit(codePoints[c])) { - exponent.push(codePoints[c++]); - } - var exp = exponent.length ? parseInt(fromCodePoint$1.apply(void 0, exponent), 10) : 0; - return sign * (int + frac * Math.pow(10, -fracd)) * Math.pow(10, expsign * exp); + c++; + } + var exponent = []; + while (isDigit(codePoints[c])) { + exponent.push(codePoints[c++]); + } + var exp = exponent.length + ? parseInt(fromCodePoint$1.apply(void 0, exponent), 10) + : 0; + return ( + sign * + (int + frac * Math.pow(10, -fracd)) * + Math.pow(10, expsign * exp) + ); }; var LEFT_PARENTHESIS_TOKEN = { - type: 2 /* LEFT_PARENTHESIS_TOKEN */ + type: 2 /* LEFT_PARENTHESIS_TOKEN */, }; var RIGHT_PARENTHESIS_TOKEN = { - type: 3 /* RIGHT_PARENTHESIS_TOKEN */ + type: 3 /* RIGHT_PARENTHESIS_TOKEN */, }; var COMMA_TOKEN = { type: 4 /* COMMA_TOKEN */ }; var SUFFIX_MATCH_TOKEN = { type: 13 /* SUFFIX_MATCH_TOKEN */ }; @@ -3003,10 +3533,10 @@ var DASH_MATCH_TOKEN = { type: 9 /* DASH_MATCH_TOKEN */ }; var INCLUDE_MATCH_TOKEN = { type: 10 /* INCLUDE_MATCH_TOKEN */ }; var LEFT_CURLY_BRACKET_TOKEN = { - type: 11 /* LEFT_CURLY_BRACKET_TOKEN */ + type: 11 /* LEFT_CURLY_BRACKET_TOKEN */, }; var RIGHT_CURLY_BRACKET_TOKEN = { - type: 12 /* RIGHT_CURLY_BRACKET_TOKEN */ + type: 12 /* RIGHT_CURLY_BRACKET_TOKEN */, }; var SUBSTRING_MATCH_TOKEN = { type: 14 /* SUBSTRING_MATCH_TOKEN */ }; var BAD_URL_TOKEN = { type: 23 /* BAD_URL_TOKEN */ }; @@ -3016,2858 +3546,3375 @@ var COLON_TOKEN = { type: 26 /* COLON_TOKEN */ }; var SEMICOLON_TOKEN = { type: 27 /* SEMICOLON_TOKEN */ }; var LEFT_SQUARE_BRACKET_TOKEN = { - type: 28 /* LEFT_SQUARE_BRACKET_TOKEN */ + type: 28 /* LEFT_SQUARE_BRACKET_TOKEN */, }; var RIGHT_SQUARE_BRACKET_TOKEN = { - type: 29 /* RIGHT_SQUARE_BRACKET_TOKEN */ + type: 29 /* RIGHT_SQUARE_BRACKET_TOKEN */, }; var WHITESPACE_TOKEN = { type: 31 /* WHITESPACE_TOKEN */ }; var EOF_TOKEN = { type: 32 /* EOF_TOKEN */ }; var Tokenizer = /** @class */ (function () { - function Tokenizer() { - this._value = []; + function Tokenizer() { + this._value = []; + } + Tokenizer.prototype.write = function (chunk) { + this._value = this._value.concat(toCodePoints$1(chunk)); + }; + Tokenizer.prototype.read = function () { + var tokens = []; + var token = this.consumeToken(); + while (token !== EOF_TOKEN) { + tokens.push(token); + token = this.consumeToken(); } - Tokenizer.prototype.write = function (chunk) { - this._value = this._value.concat(toCodePoints$1(chunk)); - }; - Tokenizer.prototype.read = function () { - var tokens = []; - var token = this.consumeToken(); - while (token !== EOF_TOKEN) { - tokens.push(token); - token = this.consumeToken(); + return tokens; + }; + Tokenizer.prototype.consumeToken = function () { + var codePoint = this.consumeCodePoint(); + switch (codePoint) { + case QUOTATION_MARK: + return this.consumeStringToken(QUOTATION_MARK); + case NUMBER_SIGN: + var c1 = this.peekCodePoint(0); + var c2 = this.peekCodePoint(1); + var c3 = this.peekCodePoint(2); + if (isNameCodePoint(c1) || isValidEscape(c2, c3)) { + var flags = isIdentifierStart(c1, c2, c3) + ? FLAG_ID + : FLAG_UNRESTRICTED; + var value = this.consumeName(); + return { type: 5 /* HASH_TOKEN */, value: value, flags: flags }; } - return tokens; - }; - Tokenizer.prototype.consumeToken = function () { - var codePoint = this.consumeCodePoint(); - switch (codePoint) { - case QUOTATION_MARK: - return this.consumeStringToken(QUOTATION_MARK); - case NUMBER_SIGN: - var c1 = this.peekCodePoint(0); - var c2 = this.peekCodePoint(1); - var c3 = this.peekCodePoint(2); - if (isNameCodePoint(c1) || isValidEscape(c2, c3)) { - var flags = isIdentifierStart(c1, c2, c3) ? FLAG_ID : FLAG_UNRESTRICTED; - var value = this.consumeName(); - return { type: 5 /* HASH_TOKEN */, value: value, flags: flags }; - } - break; - case DOLLAR_SIGN: - if (this.peekCodePoint(0) === EQUALS_SIGN) { - this.consumeCodePoint(); - return SUFFIX_MATCH_TOKEN; - } - break; - case APOSTROPHE: - return this.consumeStringToken(APOSTROPHE); - case LEFT_PARENTHESIS: - return LEFT_PARENTHESIS_TOKEN; - case RIGHT_PARENTHESIS: - return RIGHT_PARENTHESIS_TOKEN; - case ASTERISK: - if (this.peekCodePoint(0) === EQUALS_SIGN) { - this.consumeCodePoint(); - return SUBSTRING_MATCH_TOKEN; - } - break; - case PLUS_SIGN: - if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) { - this.reconsumeCodePoint(codePoint); - return this.consumeNumericToken(); - } - break; - case COMMA: - return COMMA_TOKEN; - case HYPHEN_MINUS: - var e1 = codePoint; - var e2 = this.peekCodePoint(0); - var e3 = this.peekCodePoint(1); - if (isNumberStart(e1, e2, e3)) { - this.reconsumeCodePoint(codePoint); - return this.consumeNumericToken(); - } - if (isIdentifierStart(e1, e2, e3)) { - this.reconsumeCodePoint(codePoint); - return this.consumeIdentLikeToken(); - } - if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) { - this.consumeCodePoint(); - this.consumeCodePoint(); - return CDC_TOKEN; - } - break; - case FULL_STOP: - if (isNumberStart(codePoint, this.peekCodePoint(0), this.peekCodePoint(1))) { - this.reconsumeCodePoint(codePoint); - return this.consumeNumericToken(); - } - break; - case SOLIDUS: - if (this.peekCodePoint(0) === ASTERISK) { - this.consumeCodePoint(); - while (true) { - var c = this.consumeCodePoint(); - if (c === ASTERISK) { - c = this.consumeCodePoint(); - if (c === SOLIDUS) { - return this.consumeToken(); - } - } - if (c === EOF) { - return this.consumeToken(); - } - } - } - break; - case COLON: - return COLON_TOKEN; - case SEMICOLON: - return SEMICOLON_TOKEN; - case LESS_THAN_SIGN: - if (this.peekCodePoint(0) === EXCLAMATION_MARK && - this.peekCodePoint(1) === HYPHEN_MINUS && - this.peekCodePoint(2) === HYPHEN_MINUS) { - this.consumeCodePoint(); - this.consumeCodePoint(); - return CDO_TOKEN; - } - break; - case COMMERCIAL_AT: - var a1 = this.peekCodePoint(0); - var a2 = this.peekCodePoint(1); - var a3 = this.peekCodePoint(2); - if (isIdentifierStart(a1, a2, a3)) { - var value = this.consumeName(); - return { type: 7 /* AT_KEYWORD_TOKEN */, value: value }; - } - break; - case LEFT_SQUARE_BRACKET: - return LEFT_SQUARE_BRACKET_TOKEN; - case REVERSE_SOLIDUS: - if (isValidEscape(codePoint, this.peekCodePoint(0))) { - this.reconsumeCodePoint(codePoint); - return this.consumeIdentLikeToken(); - } - break; - case RIGHT_SQUARE_BRACKET: - return RIGHT_SQUARE_BRACKET_TOKEN; - case CIRCUMFLEX_ACCENT: - if (this.peekCodePoint(0) === EQUALS_SIGN) { - this.consumeCodePoint(); - return PREFIX_MATCH_TOKEN; - } - break; - case LEFT_CURLY_BRACKET: - return LEFT_CURLY_BRACKET_TOKEN; - case RIGHT_CURLY_BRACKET: - return RIGHT_CURLY_BRACKET_TOKEN; - case u: - case U: - var u1 = this.peekCodePoint(0); - var u2 = this.peekCodePoint(1); - if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) { - this.consumeCodePoint(); - this.consumeUnicodeRangeToken(); - } - this.reconsumeCodePoint(codePoint); - return this.consumeIdentLikeToken(); - case VERTICAL_LINE: - if (this.peekCodePoint(0) === EQUALS_SIGN) { - this.consumeCodePoint(); - return DASH_MATCH_TOKEN; - } - if (this.peekCodePoint(0) === VERTICAL_LINE) { - this.consumeCodePoint(); - return COLUMN_TOKEN; - } - break; - case TILDE: - if (this.peekCodePoint(0) === EQUALS_SIGN) { - this.consumeCodePoint(); - return INCLUDE_MATCH_TOKEN; - } - break; - case EOF: - return EOF_TOKEN; + break; + case DOLLAR_SIGN: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return SUFFIX_MATCH_TOKEN; } - if (isWhiteSpace(codePoint)) { - this.consumeWhiteSpace(); - return WHITESPACE_TOKEN; + break; + case APOSTROPHE: + return this.consumeStringToken(APOSTROPHE); + case LEFT_PARENTHESIS: + return LEFT_PARENTHESIS_TOKEN; + case RIGHT_PARENTHESIS: + return RIGHT_PARENTHESIS_TOKEN; + case ASTERISK: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return SUBSTRING_MATCH_TOKEN; } - if (isDigit(codePoint)) { - this.reconsumeCodePoint(codePoint); - return this.consumeNumericToken(); + break; + case PLUS_SIGN: + if ( + isNumberStart( + codePoint, + this.peekCodePoint(0), + this.peekCodePoint(1), + ) + ) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); } - if (isNameStartCodePoint(codePoint)) { - this.reconsumeCodePoint(codePoint); - return this.consumeIdentLikeToken(); + break; + case COMMA: + return COMMA_TOKEN; + case HYPHEN_MINUS: + var e1 = codePoint; + var e2 = this.peekCodePoint(0); + var e3 = this.peekCodePoint(1); + if (isNumberStart(e1, e2, e3)) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); } - return { type: 6 /* DELIM_TOKEN */, value: fromCodePoint$1(codePoint) }; - }; - Tokenizer.prototype.consumeCodePoint = function () { - var value = this._value.shift(); - return typeof value === 'undefined' ? -1 : value; - }; - Tokenizer.prototype.reconsumeCodePoint = function (codePoint) { - this._value.unshift(codePoint); - }; - Tokenizer.prototype.peekCodePoint = function (delta) { - if (delta >= this._value.length) { - return -1; + if (isIdentifierStart(e1, e2, e3)) { + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); } - return this._value[delta]; - }; - Tokenizer.prototype.consumeUnicodeRangeToken = function () { - var digits = []; - var codePoint = this.consumeCodePoint(); - while (isHex(codePoint) && digits.length < 6) { - digits.push(codePoint); - codePoint = this.consumeCodePoint(); + if (e2 === HYPHEN_MINUS && e3 === GREATER_THAN_SIGN) { + this.consumeCodePoint(); + this.consumeCodePoint(); + return CDC_TOKEN; } - var questionMarks = false; - while (codePoint === QUESTION_MARK && digits.length < 6) { - digits.push(codePoint); - codePoint = this.consumeCodePoint(); - questionMarks = true; + break; + case FULL_STOP: + if ( + isNumberStart( + codePoint, + this.peekCodePoint(0), + this.peekCodePoint(1), + ) + ) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); } - if (questionMarks) { - var start_1 = parseInt(fromCodePoint$1.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? ZERO : digit); })), 16); - var end = parseInt(fromCodePoint$1.apply(void 0, digits.map(function (digit) { return (digit === QUESTION_MARK ? F : digit); })), 16); - return { type: 30 /* UNICODE_RANGE_TOKEN */, start: start_1, end: end }; - } - var start = parseInt(fromCodePoint$1.apply(void 0, digits), 16); - if (this.peekCodePoint(0) === HYPHEN_MINUS && isHex(this.peekCodePoint(1))) { - this.consumeCodePoint(); - codePoint = this.consumeCodePoint(); - var endDigits = []; - while (isHex(codePoint) && endDigits.length < 6) { - endDigits.push(codePoint); - codePoint = this.consumeCodePoint(); + break; + case SOLIDUS: + if (this.peekCodePoint(0) === ASTERISK) { + this.consumeCodePoint(); + while (true) { + var c = this.consumeCodePoint(); + if (c === ASTERISK) { + c = this.consumeCodePoint(); + if (c === SOLIDUS) { + return this.consumeToken(); + } } - var end = parseInt(fromCodePoint$1.apply(void 0, endDigits), 16); - return { type: 30 /* UNICODE_RANGE_TOKEN */, start: start, end: end }; + if (c === EOF) { + return this.consumeToken(); + } + } } - else { - return { type: 30 /* UNICODE_RANGE_TOKEN */, start: start, end: start }; + break; + case COLON: + return COLON_TOKEN; + case SEMICOLON: + return SEMICOLON_TOKEN; + case LESS_THAN_SIGN: + if ( + this.peekCodePoint(0) === EXCLAMATION_MARK && + this.peekCodePoint(1) === HYPHEN_MINUS && + this.peekCodePoint(2) === HYPHEN_MINUS + ) { + this.consumeCodePoint(); + this.consumeCodePoint(); + return CDO_TOKEN; } + break; + case COMMERCIAL_AT: + var a1 = this.peekCodePoint(0); + var a2 = this.peekCodePoint(1); + var a3 = this.peekCodePoint(2); + if (isIdentifierStart(a1, a2, a3)) { + var value = this.consumeName(); + return { type: 7 /* AT_KEYWORD_TOKEN */, value: value }; + } + break; + case LEFT_SQUARE_BRACKET: + return LEFT_SQUARE_BRACKET_TOKEN; + case REVERSE_SOLIDUS: + if (isValidEscape(codePoint, this.peekCodePoint(0))) { + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + } + break; + case RIGHT_SQUARE_BRACKET: + return RIGHT_SQUARE_BRACKET_TOKEN; + case CIRCUMFLEX_ACCENT: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return PREFIX_MATCH_TOKEN; + } + break; + case LEFT_CURLY_BRACKET: + return LEFT_CURLY_BRACKET_TOKEN; + case RIGHT_CURLY_BRACKET: + return RIGHT_CURLY_BRACKET_TOKEN; + case u: + case U: + var u1 = this.peekCodePoint(0); + var u2 = this.peekCodePoint(1); + if (u1 === PLUS_SIGN && (isHex(u2) || u2 === QUESTION_MARK)) { + this.consumeCodePoint(); + this.consumeUnicodeRangeToken(); + } + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + case VERTICAL_LINE: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return DASH_MATCH_TOKEN; + } + if (this.peekCodePoint(0) === VERTICAL_LINE) { + this.consumeCodePoint(); + return COLUMN_TOKEN; + } + break; + case TILDE: + if (this.peekCodePoint(0) === EQUALS_SIGN) { + this.consumeCodePoint(); + return INCLUDE_MATCH_TOKEN; + } + break; + case EOF: + return EOF_TOKEN; + } + if (isWhiteSpace(codePoint)) { + this.consumeWhiteSpace(); + return WHITESPACE_TOKEN; + } + if (isDigit(codePoint)) { + this.reconsumeCodePoint(codePoint); + return this.consumeNumericToken(); + } + if (isNameStartCodePoint(codePoint)) { + this.reconsumeCodePoint(codePoint); + return this.consumeIdentLikeToken(); + } + return { + type: 6 /* DELIM_TOKEN */, + value: fromCodePoint$1(codePoint), }; - Tokenizer.prototype.consumeIdentLikeToken = function () { - var value = this.consumeName(); - if (value.toLowerCase() === 'url' && this.peekCodePoint(0) === LEFT_PARENTHESIS) { - this.consumeCodePoint(); - return this.consumeUrlToken(); - } - else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) { - this.consumeCodePoint(); - return { type: 19 /* FUNCTION_TOKEN */, value: value }; - } - return { type: 20 /* IDENT_TOKEN */, value: value }; - }; - Tokenizer.prototype.consumeUrlToken = function () { - var value = []; + }; + Tokenizer.prototype.consumeCodePoint = function () { + var value = this._value.shift(); + return typeof value === "undefined" ? -1 : value; + }; + Tokenizer.prototype.reconsumeCodePoint = function (codePoint) { + this._value.unshift(codePoint); + }; + Tokenizer.prototype.peekCodePoint = function (delta) { + if (delta >= this._value.length) { + return -1; + } + return this._value[delta]; + }; + Tokenizer.prototype.consumeUnicodeRangeToken = function () { + var digits = []; + var codePoint = this.consumeCodePoint(); + while (isHex(codePoint) && digits.length < 6) { + digits.push(codePoint); + codePoint = this.consumeCodePoint(); + } + var questionMarks = false; + while (codePoint === QUESTION_MARK && digits.length < 6) { + digits.push(codePoint); + codePoint = this.consumeCodePoint(); + questionMarks = true; + } + if (questionMarks) { + var start_1 = parseInt( + fromCodePoint$1.apply( + void 0, + digits.map(function (digit) { + return digit === QUESTION_MARK ? ZERO : digit; + }), + ), + 16, + ); + var end = parseInt( + fromCodePoint$1.apply( + void 0, + digits.map(function (digit) { + return digit === QUESTION_MARK ? F : digit; + }), + ), + 16, + ); + return { + type: 30 /* UNICODE_RANGE_TOKEN */, + start: start_1, + end: end, + }; + } + var start = parseInt(fromCodePoint$1.apply(void 0, digits), 16); + if ( + this.peekCodePoint(0) === HYPHEN_MINUS && + isHex(this.peekCodePoint(1)) + ) { + this.consumeCodePoint(); + codePoint = this.consumeCodePoint(); + var endDigits = []; + while (isHex(codePoint) && endDigits.length < 6) { + endDigits.push(codePoint); + codePoint = this.consumeCodePoint(); + } + var end = parseInt(fromCodePoint$1.apply(void 0, endDigits), 16); + return { + type: 30 /* UNICODE_RANGE_TOKEN */, + start: start, + end: end, + }; + } else { + return { + type: 30 /* UNICODE_RANGE_TOKEN */, + start: start, + end: start, + }; + } + }; + Tokenizer.prototype.consumeIdentLikeToken = function () { + var value = this.consumeName(); + if ( + value.toLowerCase() === "url" && + this.peekCodePoint(0) === LEFT_PARENTHESIS + ) { + this.consumeCodePoint(); + return this.consumeUrlToken(); + } else if (this.peekCodePoint(0) === LEFT_PARENTHESIS) { + this.consumeCodePoint(); + return { type: 19 /* FUNCTION_TOKEN */, value: value }; + } + return { type: 20 /* IDENT_TOKEN */, value: value }; + }; + Tokenizer.prototype.consumeUrlToken = function () { + var value = []; + this.consumeWhiteSpace(); + if (this.peekCodePoint(0) === EOF) { + return { type: 22 /* URL_TOKEN */, value: "" }; + } + var next = this.peekCodePoint(0); + if (next === APOSTROPHE || next === QUOTATION_MARK) { + var stringToken = this.consumeStringToken(this.consumeCodePoint()); + if (stringToken.type === 0 /* STRING_TOKEN */) { this.consumeWhiteSpace(); - if (this.peekCodePoint(0) === EOF) { - return { type: 22 /* URL_TOKEN */, value: '' }; + if ( + this.peekCodePoint(0) === EOF || + this.peekCodePoint(0) === RIGHT_PARENTHESIS + ) { + this.consumeCodePoint(); + return { type: 22 /* URL_TOKEN */, value: stringToken.value }; } - var next = this.peekCodePoint(0); - if (next === APOSTROPHE || next === QUOTATION_MARK) { - var stringToken = this.consumeStringToken(this.consumeCodePoint()); - if (stringToken.type === 0 /* STRING_TOKEN */) { - this.consumeWhiteSpace(); - if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) { - this.consumeCodePoint(); - return { type: 22 /* URL_TOKEN */, value: stringToken.value }; - } - } - this.consumeBadUrlRemnants(); - return BAD_URL_TOKEN; + } + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } + while (true) { + var codePoint = this.consumeCodePoint(); + if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) { + return { + type: 22 /* URL_TOKEN */, + value: fromCodePoint$1.apply(void 0, value), + }; + } else if (isWhiteSpace(codePoint)) { + this.consumeWhiteSpace(); + if ( + this.peekCodePoint(0) === EOF || + this.peekCodePoint(0) === RIGHT_PARENTHESIS + ) { + this.consumeCodePoint(); + return { + type: 22 /* URL_TOKEN */, + value: fromCodePoint$1.apply(void 0, value), + }; } - while (true) { - var codePoint = this.consumeCodePoint(); - if (codePoint === EOF || codePoint === RIGHT_PARENTHESIS) { - return { type: 22 /* URL_TOKEN */, value: fromCodePoint$1.apply(void 0, value) }; - } - else if (isWhiteSpace(codePoint)) { - this.consumeWhiteSpace(); - if (this.peekCodePoint(0) === EOF || this.peekCodePoint(0) === RIGHT_PARENTHESIS) { - this.consumeCodePoint(); - return { type: 22 /* URL_TOKEN */, value: fromCodePoint$1.apply(void 0, value) }; - } - this.consumeBadUrlRemnants(); - return BAD_URL_TOKEN; - } - else if (codePoint === QUOTATION_MARK || - codePoint === APOSTROPHE || - codePoint === LEFT_PARENTHESIS || - isNonPrintableCodePoint(codePoint)) { - this.consumeBadUrlRemnants(); - return BAD_URL_TOKEN; - } - else if (codePoint === REVERSE_SOLIDUS) { - if (isValidEscape(codePoint, this.peekCodePoint(0))) { - value.push(this.consumeEscapedCodePoint()); - } - else { - this.consumeBadUrlRemnants(); - return BAD_URL_TOKEN; - } - } - else { - value.push(codePoint); - } + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } else if ( + codePoint === QUOTATION_MARK || + codePoint === APOSTROPHE || + codePoint === LEFT_PARENTHESIS || + isNonPrintableCodePoint(codePoint) + ) { + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; + } else if (codePoint === REVERSE_SOLIDUS) { + if (isValidEscape(codePoint, this.peekCodePoint(0))) { + value.push(this.consumeEscapedCodePoint()); + } else { + this.consumeBadUrlRemnants(); + return BAD_URL_TOKEN; } - }; - Tokenizer.prototype.consumeWhiteSpace = function () { - while (isWhiteSpace(this.peekCodePoint(0))) { - this.consumeCodePoint(); + } else { + value.push(codePoint); + } + } + }; + Tokenizer.prototype.consumeWhiteSpace = function () { + while (isWhiteSpace(this.peekCodePoint(0))) { + this.consumeCodePoint(); + } + }; + Tokenizer.prototype.consumeBadUrlRemnants = function () { + while (true) { + var codePoint = this.consumeCodePoint(); + if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) { + return; + } + if (isValidEscape(codePoint, this.peekCodePoint(0))) { + this.consumeEscapedCodePoint(); + } + } + }; + Tokenizer.prototype.consumeStringSlice = function (count) { + var SLICE_STACK_SIZE = 50000; + var value = ""; + while (count > 0) { + var amount = Math.min(SLICE_STACK_SIZE, count); + value += fromCodePoint$1.apply( + void 0, + this._value.splice(0, amount), + ); + count -= amount; + } + this._value.shift(); + return value; + }; + Tokenizer.prototype.consumeStringToken = function (endingCodePoint) { + var value = ""; + var i = 0; + do { + var codePoint = this._value[i]; + if ( + codePoint === EOF || + codePoint === undefined || + codePoint === endingCodePoint + ) { + value += this.consumeStringSlice(i); + return { type: 0 /* STRING_TOKEN */, value: value }; + } + if (codePoint === LINE_FEED) { + this._value.splice(0, i); + return BAD_STRING_TOKEN; + } + if (codePoint === REVERSE_SOLIDUS) { + var next = this._value[i + 1]; + if (next !== EOF && next !== undefined) { + if (next === LINE_FEED) { + value += this.consumeStringSlice(i); + i = -1; + this._value.shift(); + } else if (isValidEscape(codePoint, next)) { + value += this.consumeStringSlice(i); + value += fromCodePoint$1(this.consumeEscapedCodePoint()); + i = -1; + } } - }; - Tokenizer.prototype.consumeBadUrlRemnants = function () { - while (true) { - var codePoint = this.consumeCodePoint(); - if (codePoint === RIGHT_PARENTHESIS || codePoint === EOF) { - return; - } - if (isValidEscape(codePoint, this.peekCodePoint(0))) { - this.consumeEscapedCodePoint(); - } - } - }; - Tokenizer.prototype.consumeStringSlice = function (count) { - var SLICE_STACK_SIZE = 50000; - var value = ''; - while (count > 0) { - var amount = Math.min(SLICE_STACK_SIZE, count); - value += fromCodePoint$1.apply(void 0, this._value.splice(0, amount)); - count -= amount; - } - this._value.shift(); - return value; - }; - Tokenizer.prototype.consumeStringToken = function (endingCodePoint) { - var value = ''; - var i = 0; - do { - var codePoint = this._value[i]; - if (codePoint === EOF || codePoint === undefined || codePoint === endingCodePoint) { - value += this.consumeStringSlice(i); - return { type: 0 /* STRING_TOKEN */, value: value }; - } - if (codePoint === LINE_FEED) { - this._value.splice(0, i); - return BAD_STRING_TOKEN; - } - if (codePoint === REVERSE_SOLIDUS) { - var next = this._value[i + 1]; - if (next !== EOF && next !== undefined) { - if (next === LINE_FEED) { - value += this.consumeStringSlice(i); - i = -1; - this._value.shift(); - } - else if (isValidEscape(codePoint, next)) { - value += this.consumeStringSlice(i); - value += fromCodePoint$1(this.consumeEscapedCodePoint()); - i = -1; - } - } - } - i++; - } while (true); - }; - Tokenizer.prototype.consumeNumber = function () { - var repr = []; - var type = FLAG_INTEGER; - var c1 = this.peekCodePoint(0); - if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { - repr.push(this.consumeCodePoint()); - } - while (isDigit(this.peekCodePoint(0))) { - repr.push(this.consumeCodePoint()); - } - c1 = this.peekCodePoint(0); - var c2 = this.peekCodePoint(1); - if (c1 === FULL_STOP && isDigit(c2)) { - repr.push(this.consumeCodePoint(), this.consumeCodePoint()); - type = FLAG_NUMBER; - while (isDigit(this.peekCodePoint(0))) { - repr.push(this.consumeCodePoint()); - } - } - c1 = this.peekCodePoint(0); - c2 = this.peekCodePoint(1); - var c3 = this.peekCodePoint(2); - if ((c1 === E || c1 === e) && (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || isDigit(c2))) { - repr.push(this.consumeCodePoint(), this.consumeCodePoint()); - type = FLAG_NUMBER; - while (isDigit(this.peekCodePoint(0))) { - repr.push(this.consumeCodePoint()); - } - } - return [stringToNumber(repr), type]; - }; - Tokenizer.prototype.consumeNumericToken = function () { - var _a = this.consumeNumber(), number = _a[0], flags = _a[1]; - var c1 = this.peekCodePoint(0); - var c2 = this.peekCodePoint(1); - var c3 = this.peekCodePoint(2); - if (isIdentifierStart(c1, c2, c3)) { - var unit = this.consumeName(); - return { type: 15 /* DIMENSION_TOKEN */, number: number, flags: flags, unit: unit }; - } - if (c1 === PERCENTAGE_SIGN) { - this.consumeCodePoint(); - return { type: 16 /* PERCENTAGE_TOKEN */, number: number, flags: flags }; - } - return { type: 17 /* NUMBER_TOKEN */, number: number, flags: flags }; - }; - Tokenizer.prototype.consumeEscapedCodePoint = function () { - var codePoint = this.consumeCodePoint(); - if (isHex(codePoint)) { - var hex = fromCodePoint$1(codePoint); - while (isHex(this.peekCodePoint(0)) && hex.length < 6) { - hex += fromCodePoint$1(this.consumeCodePoint()); - } - if (isWhiteSpace(this.peekCodePoint(0))) { - this.consumeCodePoint(); - } - var hexCodePoint = parseInt(hex, 16); - if (hexCodePoint === 0 || isSurrogateCodePoint(hexCodePoint) || hexCodePoint > 0x10ffff) { - return REPLACEMENT_CHARACTER; - } - return hexCodePoint; - } - if (codePoint === EOF) { - return REPLACEMENT_CHARACTER; - } - return codePoint; - }; - Tokenizer.prototype.consumeName = function () { - var result = ''; - while (true) { - var codePoint = this.consumeCodePoint(); - if (isNameCodePoint(codePoint)) { - result += fromCodePoint$1(codePoint); - } - else if (isValidEscape(codePoint, this.peekCodePoint(0))) { - result += fromCodePoint$1(this.consumeEscapedCodePoint()); - } - else { - this.reconsumeCodePoint(codePoint); - return result; - } - } - }; - return Tokenizer; - }()); + } + i++; + } while (true); + }; + Tokenizer.prototype.consumeNumber = function () { + var repr = []; + var type = FLAG_INTEGER; + var c1 = this.peekCodePoint(0); + if (c1 === PLUS_SIGN || c1 === HYPHEN_MINUS) { + repr.push(this.consumeCodePoint()); + } + while (isDigit(this.peekCodePoint(0))) { + repr.push(this.consumeCodePoint()); + } + c1 = this.peekCodePoint(0); + var c2 = this.peekCodePoint(1); + if (c1 === FULL_STOP && isDigit(c2)) { + repr.push(this.consumeCodePoint(), this.consumeCodePoint()); + type = FLAG_NUMBER; + while (isDigit(this.peekCodePoint(0))) { + repr.push(this.consumeCodePoint()); + } + } + c1 = this.peekCodePoint(0); + c2 = this.peekCodePoint(1); + var c3 = this.peekCodePoint(2); + if ( + (c1 === E || c1 === e) && + (((c2 === PLUS_SIGN || c2 === HYPHEN_MINUS) && isDigit(c3)) || + isDigit(c2)) + ) { + repr.push(this.consumeCodePoint(), this.consumeCodePoint()); + type = FLAG_NUMBER; + while (isDigit(this.peekCodePoint(0))) { + repr.push(this.consumeCodePoint()); + } + } + return [stringToNumber(repr), type]; + }; + Tokenizer.prototype.consumeNumericToken = function () { + var _a = this.consumeNumber(), + number = _a[0], + flags = _a[1]; + var c1 = this.peekCodePoint(0); + var c2 = this.peekCodePoint(1); + var c3 = this.peekCodePoint(2); + if (isIdentifierStart(c1, c2, c3)) { + var unit = this.consumeName(); + return { + type: 15 /* DIMENSION_TOKEN */, + number: number, + flags: flags, + unit: unit, + }; + } + if (c1 === PERCENTAGE_SIGN) { + this.consumeCodePoint(); + return { + type: 16 /* PERCENTAGE_TOKEN */, + number: number, + flags: flags, + }; + } + return { type: 17 /* NUMBER_TOKEN */, number: number, flags: flags }; + }; + Tokenizer.prototype.consumeEscapedCodePoint = function () { + var codePoint = this.consumeCodePoint(); + if (isHex(codePoint)) { + var hex = fromCodePoint$1(codePoint); + while (isHex(this.peekCodePoint(0)) && hex.length < 6) { + hex += fromCodePoint$1(this.consumeCodePoint()); + } + if (isWhiteSpace(this.peekCodePoint(0))) { + this.consumeCodePoint(); + } + var hexCodePoint = parseInt(hex, 16); + if ( + hexCodePoint === 0 || + isSurrogateCodePoint(hexCodePoint) || + hexCodePoint > 0x10ffff + ) { + return REPLACEMENT_CHARACTER; + } + return hexCodePoint; + } + if (codePoint === EOF) { + return REPLACEMENT_CHARACTER; + } + return codePoint; + }; + Tokenizer.prototype.consumeName = function () { + var result = ""; + while (true) { + var codePoint = this.consumeCodePoint(); + if (isNameCodePoint(codePoint)) { + result += fromCodePoint$1(codePoint); + } else if (isValidEscape(codePoint, this.peekCodePoint(0))) { + result += fromCodePoint$1(this.consumeEscapedCodePoint()); + } else { + this.reconsumeCodePoint(codePoint); + return result; + } + } + }; + return Tokenizer; + })(); var Parser = /** @class */ (function () { - function Parser(tokens) { - this._tokens = tokens; + function Parser(tokens) { + this._tokens = tokens; + } + Parser.create = function (value) { + var tokenizer = new Tokenizer(); + tokenizer.write(value); + return new Parser(tokenizer.read()); + }; + Parser.parseValue = function (value) { + return Parser.create(value).parseComponentValue(); + }; + Parser.parseValues = function (value) { + return Parser.create(value).parseComponentValues(); + }; + Parser.prototype.parseComponentValue = function () { + var token = this.consumeToken(); + while (token.type === 31 /* WHITESPACE_TOKEN */) { + token = this.consumeToken(); } - Parser.create = function (value) { - var tokenizer = new Tokenizer(); - tokenizer.write(value); - return new Parser(tokenizer.read()); + if (token.type === 32 /* EOF_TOKEN */) { + throw new SyntaxError( + "Error parsing CSS component value, unexpected EOF", + ); + } + this.reconsumeToken(token); + var value = this.consumeComponentValue(); + do { + token = this.consumeToken(); + } while (token.type === 31 /* WHITESPACE_TOKEN */); + if (token.type === 32 /* EOF_TOKEN */) { + return value; + } + throw new SyntaxError( + "Error parsing CSS component value, multiple values found when expecting only one", + ); + }; + Parser.prototype.parseComponentValues = function () { + var values = []; + while (true) { + var value = this.consumeComponentValue(); + if (value.type === 32 /* EOF_TOKEN */) { + return values; + } + values.push(value); + values.push(); + } + }; + Parser.prototype.consumeComponentValue = function () { + var token = this.consumeToken(); + switch (token.type) { + case 11 /* LEFT_CURLY_BRACKET_TOKEN */: + case 28 /* LEFT_SQUARE_BRACKET_TOKEN */: + case 2 /* LEFT_PARENTHESIS_TOKEN */: + return this.consumeSimpleBlock(token.type); + case 19 /* FUNCTION_TOKEN */: + return this.consumeFunction(token); + } + return token; + }; + Parser.prototype.consumeSimpleBlock = function (type) { + var block = { type: type, values: [] }; + var token = this.consumeToken(); + while (true) { + if ( + token.type === 32 /* EOF_TOKEN */ || + isEndingTokenFor(token, type) + ) { + return block; + } + this.reconsumeToken(token); + block.values.push(this.consumeComponentValue()); + token = this.consumeToken(); + } + }; + Parser.prototype.consumeFunction = function (functionToken) { + var cssFunction = { + name: functionToken.value, + values: [], + type: 18 /* FUNCTION */, }; - Parser.parseValue = function (value) { - return Parser.create(value).parseComponentValue(); - }; - Parser.parseValues = function (value) { - return Parser.create(value).parseComponentValues(); - }; - Parser.prototype.parseComponentValue = function () { - var token = this.consumeToken(); - while (token.type === 31 /* WHITESPACE_TOKEN */) { - token = this.consumeToken(); - } - if (token.type === 32 /* EOF_TOKEN */) { - throw new SyntaxError("Error parsing CSS component value, unexpected EOF"); - } - this.reconsumeToken(token); - var value = this.consumeComponentValue(); - do { - token = this.consumeToken(); - } while (token.type === 31 /* WHITESPACE_TOKEN */); - if (token.type === 32 /* EOF_TOKEN */) { - return value; - } - throw new SyntaxError("Error parsing CSS component value, multiple values found when expecting only one"); - }; - Parser.prototype.parseComponentValues = function () { - var values = []; - while (true) { - var value = this.consumeComponentValue(); - if (value.type === 32 /* EOF_TOKEN */) { - return values; - } - values.push(value); - values.push(); - } - }; - Parser.prototype.consumeComponentValue = function () { - var token = this.consumeToken(); - switch (token.type) { - case 11 /* LEFT_CURLY_BRACKET_TOKEN */: - case 28 /* LEFT_SQUARE_BRACKET_TOKEN */: - case 2 /* LEFT_PARENTHESIS_TOKEN */: - return this.consumeSimpleBlock(token.type); - case 19 /* FUNCTION_TOKEN */: - return this.consumeFunction(token); - } - return token; - }; - Parser.prototype.consumeSimpleBlock = function (type) { - var block = { type: type, values: [] }; - var token = this.consumeToken(); - while (true) { - if (token.type === 32 /* EOF_TOKEN */ || isEndingTokenFor(token, type)) { - return block; - } - this.reconsumeToken(token); - block.values.push(this.consumeComponentValue()); - token = this.consumeToken(); - } - }; - Parser.prototype.consumeFunction = function (functionToken) { - var cssFunction = { - name: functionToken.value, - values: [], - type: 18 /* FUNCTION */ - }; - while (true) { - var token = this.consumeToken(); - if (token.type === 32 /* EOF_TOKEN */ || token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */) { - return cssFunction; - } - this.reconsumeToken(token); - cssFunction.values.push(this.consumeComponentValue()); - } - }; - Parser.prototype.consumeToken = function () { - var token = this._tokens.shift(); - return typeof token === 'undefined' ? EOF_TOKEN : token; - }; - Parser.prototype.reconsumeToken = function (token) { - this._tokens.unshift(token); - }; - return Parser; - }()); - var isDimensionToken = function (token) { return token.type === 15 /* DIMENSION_TOKEN */; }; - var isNumberToken = function (token) { return token.type === 17 /* NUMBER_TOKEN */; }; - var isIdentToken = function (token) { return token.type === 20 /* IDENT_TOKEN */; }; - var isStringToken = function (token) { return token.type === 0 /* STRING_TOKEN */; }; - var isIdentWithValue = function (token, value) { - return isIdentToken(token) && token.value === value; + while (true) { + var token = this.consumeToken(); + if ( + token.type === 32 /* EOF_TOKEN */ || + token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */ + ) { + return cssFunction; + } + this.reconsumeToken(token); + cssFunction.values.push(this.consumeComponentValue()); + } + }; + Parser.prototype.consumeToken = function () { + var token = this._tokens.shift(); + return typeof token === "undefined" ? EOF_TOKEN : token; + }; + Parser.prototype.reconsumeToken = function (token) { + this._tokens.unshift(token); + }; + return Parser; + })(); + var isDimensionToken = function (token) { + return token.type === 15 /* DIMENSION_TOKEN */; + }; + var isNumberToken = function (token) { + return token.type === 17 /* NUMBER_TOKEN */; + }; + var isIdentToken = function (token) { + return token.type === 20 /* IDENT_TOKEN */; + }; + var isStringToken = function (token) { + return token.type === 0 /* STRING_TOKEN */; + }; + var isIdentWithValue = function (token, value) { + return isIdentToken(token) && token.value === value; + }; + var nonWhiteSpace = function (token) { + return token.type !== 31 /* WHITESPACE_TOKEN */; }; - var nonWhiteSpace = function (token) { return token.type !== 31 /* WHITESPACE_TOKEN */; }; var nonFunctionArgSeparator = function (token) { - return token.type !== 31 /* WHITESPACE_TOKEN */ && token.type !== 4 /* COMMA_TOKEN */; + return ( + token.type !== 31 /* WHITESPACE_TOKEN */ && + token.type !== 4 /* COMMA_TOKEN */ + ); }; var parseFunctionArgs = function (tokens) { - var args = []; - var arg = []; - tokens.forEach(function (token) { - if (token.type === 4 /* COMMA_TOKEN */) { - if (arg.length === 0) { - throw new Error("Error parsing function args, zero tokens for arg"); - } - args.push(arg); - arg = []; - return; - } - if (token.type !== 31 /* WHITESPACE_TOKEN */) { - arg.push(token); - } - }); - if (arg.length) { - args.push(arg); + var args = []; + var arg = []; + tokens.forEach(function (token) { + if (token.type === 4 /* COMMA_TOKEN */) { + if (arg.length === 0) { + throw new Error( + "Error parsing function args, zero tokens for arg", + ); + } + args.push(arg); + arg = []; + return; } - return args; + if (token.type !== 31 /* WHITESPACE_TOKEN */) { + arg.push(token); + } + }); + if (arg.length) { + args.push(arg); + } + return args; }; var isEndingTokenFor = function (token, type) { - if (type === 11 /* LEFT_CURLY_BRACKET_TOKEN */ && token.type === 12 /* RIGHT_CURLY_BRACKET_TOKEN */) { - return true; - } - if (type === 28 /* LEFT_SQUARE_BRACKET_TOKEN */ && token.type === 29 /* RIGHT_SQUARE_BRACKET_TOKEN */) { - return true; - } - return type === 2 /* LEFT_PARENTHESIS_TOKEN */ && token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */; + if ( + type === 11 /* LEFT_CURLY_BRACKET_TOKEN */ && + token.type === 12 /* RIGHT_CURLY_BRACKET_TOKEN */ + ) { + return true; + } + if ( + type === 28 /* LEFT_SQUARE_BRACKET_TOKEN */ && + token.type === 29 /* RIGHT_SQUARE_BRACKET_TOKEN */ + ) { + return true; + } + return ( + type === 2 /* LEFT_PARENTHESIS_TOKEN */ && + token.type === 3 /* RIGHT_PARENTHESIS_TOKEN */ + ); }; var isLength = function (token) { - return token.type === 17 /* NUMBER_TOKEN */ || token.type === 15 /* DIMENSION_TOKEN */; + return ( + token.type === 17 /* NUMBER_TOKEN */ || + token.type === 15 /* DIMENSION_TOKEN */ + ); }; var isLengthPercentage = function (token) { - return token.type === 16 /* PERCENTAGE_TOKEN */ || isLength(token); + return token.type === 16 /* PERCENTAGE_TOKEN */ || isLength(token); }; var parseLengthPercentageTuple = function (tokens) { - return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]]; + return tokens.length > 1 ? [tokens[0], tokens[1]] : [tokens[0]]; }; var ZERO_LENGTH = { - type: 17 /* NUMBER_TOKEN */, - number: 0, - flags: FLAG_INTEGER + type: 17 /* NUMBER_TOKEN */, + number: 0, + flags: FLAG_INTEGER, }; var FIFTY_PERCENT = { - type: 16 /* PERCENTAGE_TOKEN */, - number: 50, - flags: FLAG_INTEGER + type: 16 /* PERCENTAGE_TOKEN */, + number: 50, + flags: FLAG_INTEGER, }; var HUNDRED_PERCENT = { - type: 16 /* PERCENTAGE_TOKEN */, - number: 100, - flags: FLAG_INTEGER + type: 16 /* PERCENTAGE_TOKEN */, + number: 100, + flags: FLAG_INTEGER, }; var getAbsoluteValueForTuple = function (tuple, width, height) { - var x = tuple[0], y = tuple[1]; - return [getAbsoluteValue(x, width), getAbsoluteValue(typeof y !== 'undefined' ? y : x, height)]; + var x = tuple[0], + y = tuple[1]; + return [ + getAbsoluteValue(x, width), + getAbsoluteValue(typeof y !== "undefined" ? y : x, height), + ]; }; var getAbsoluteValue = function (token, parent) { - if (token.type === 16 /* PERCENTAGE_TOKEN */) { - return (token.number / 100) * parent; - } - if (isDimensionToken(token)) { - switch (token.unit) { - case 'rem': - case 'em': - return 16 * token.number; // TODO use correct font-size - case 'px': - default: - return token.number; - } - } - return token.number; - }; - - var DEG = 'deg'; - var GRAD = 'grad'; - var RAD = 'rad'; - var TURN = 'turn'; - var angle = { - name: 'angle', - parse: function (_context, value) { - if (value.type === 15 /* DIMENSION_TOKEN */) { - switch (value.unit) { - case DEG: - return (Math.PI * value.number) / 180; - case GRAD: - return (Math.PI / 200) * value.number; - case RAD: - return value.number; - case TURN: - return Math.PI * 2 * value.number; - } - } - throw new Error("Unsupported angle type"); - } - }; - var isAngle = function (value) { - if (value.type === 15 /* DIMENSION_TOKEN */) { - if (value.unit === DEG || value.unit === GRAD || value.unit === RAD || value.unit === TURN) { - return true; - } - } - return false; - }; - var parseNamedSide = function (tokens) { - var sideOrCorner = tokens - .filter(isIdentToken) - .map(function (ident) { return ident.value; }) - .join(' '); - switch (sideOrCorner) { - case 'to bottom right': - case 'to right bottom': - case 'left top': - case 'top left': - return [ZERO_LENGTH, ZERO_LENGTH]; - case 'to top': - case 'bottom': - return deg(0); - case 'to bottom left': - case 'to left bottom': - case 'right top': - case 'top right': - return [ZERO_LENGTH, HUNDRED_PERCENT]; - case 'to right': - case 'left': - return deg(90); - case 'to top left': - case 'to left top': - case 'right bottom': - case 'bottom right': - return [HUNDRED_PERCENT, HUNDRED_PERCENT]; - case 'to bottom': - case 'top': - return deg(180); - case 'to top right': - case 'to right top': - case 'left bottom': - case 'bottom left': - return [HUNDRED_PERCENT, ZERO_LENGTH]; - case 'to left': - case 'right': - return deg(270); - } - return 0; - }; - var deg = function (deg) { return (Math.PI * deg) / 180; }; - - var color$1 = { - name: 'color', - parse: function (context, value) { - if (value.type === 18 /* FUNCTION */) { - var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name]; - if (typeof colorFunction === 'undefined') { - throw new Error("Attempting to parse an unsupported color function \"" + value.name + "\""); - } - return colorFunction(context, value.values); - } - if (value.type === 5 /* HASH_TOKEN */) { - if (value.value.length === 3) { - var r = value.value.substring(0, 1); - var g = value.value.substring(1, 2); - var b = value.value.substring(2, 3); - return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), 1); - } - if (value.value.length === 4) { - var r = value.value.substring(0, 1); - var g = value.value.substring(1, 2); - var b = value.value.substring(2, 3); - var a = value.value.substring(3, 4); - return pack(parseInt(r + r, 16), parseInt(g + g, 16), parseInt(b + b, 16), parseInt(a + a, 16) / 255); - } - if (value.value.length === 6) { - var r = value.value.substring(0, 2); - var g = value.value.substring(2, 4); - var b = value.value.substring(4, 6); - return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1); - } - if (value.value.length === 8) { - var r = value.value.substring(0, 2); - var g = value.value.substring(2, 4); - var b = value.value.substring(4, 6); - var a = value.value.substring(6, 8); - return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), parseInt(a, 16) / 255); - } - } - if (value.type === 20 /* IDENT_TOKEN */) { - var namedColor = COLORS[value.value.toUpperCase()]; - if (typeof namedColor !== 'undefined') { - return namedColor; - } - } - return COLORS.TRANSPARENT; - } - }; - var isTransparent = function (color) { return (0xff & color) === 0; }; - var asString = function (color) { - var alpha = 0xff & color; - var blue = 0xff & (color >> 8); - var green = 0xff & (color >> 16); - var red = 0xff & (color >> 24); - return alpha < 255 ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" : "rgb(" + red + "," + green + "," + blue + ")"; - }; - var pack = function (r, g, b, a) { - return ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0; - }; - var getTokenColorValue = function (token, i) { - if (token.type === 17 /* NUMBER_TOKEN */) { + if (token.type === 16 /* PERCENTAGE_TOKEN */) { + return (token.number / 100) * parent; + } + if (isDimensionToken(token)) { + switch (token.unit) { + case "rem": + case "em": + return 16 * token.number; // TODO use correct font-size + case "px": + default: return token.number; } - if (token.type === 16 /* PERCENTAGE_TOKEN */) { - var max = i === 3 ? 1 : 255; - return i === 3 ? (token.number / 100) * max : Math.round((token.number / 100) * max); + } + return token.number; + }; + + var DEG = "deg"; + var GRAD = "grad"; + var RAD = "rad"; + var TURN = "turn"; + var angle = { + name: "angle", + parse: function (_context, value) { + if (value.type === 15 /* DIMENSION_TOKEN */) { + switch (value.unit) { + case DEG: + return (Math.PI * value.number) / 180; + case GRAD: + return (Math.PI / 200) * value.number; + case RAD: + return value.number; + case TURN: + return Math.PI * 2 * value.number; + } } - return 0; + throw new Error("Unsupported angle type"); + }, + }; + var isAngle = function (value) { + if (value.type === 15 /* DIMENSION_TOKEN */) { + if ( + value.unit === DEG || + value.unit === GRAD || + value.unit === RAD || + value.unit === TURN + ) { + return true; + } + } + return false; + }; + var parseNamedSide = function (tokens) { + var sideOrCorner = tokens + .filter(isIdentToken) + .map(function (ident) { + return ident.value; + }) + .join(" "); + switch (sideOrCorner) { + case "to bottom right": + case "to right bottom": + case "left top": + case "top left": + return [ZERO_LENGTH, ZERO_LENGTH]; + case "to top": + case "bottom": + return deg(0); + case "to bottom left": + case "to left bottom": + case "right top": + case "top right": + return [ZERO_LENGTH, HUNDRED_PERCENT]; + case "to right": + case "left": + return deg(90); + case "to top left": + case "to left top": + case "right bottom": + case "bottom right": + return [HUNDRED_PERCENT, HUNDRED_PERCENT]; + case "to bottom": + case "top": + return deg(180); + case "to top right": + case "to right top": + case "left bottom": + case "bottom left": + return [HUNDRED_PERCENT, ZERO_LENGTH]; + case "to left": + case "right": + return deg(270); + } + return 0; + }; + var deg = function (deg) { + return (Math.PI * deg) / 180; + }; + + var color$1 = { + name: "color", + parse: function (context, value) { + if (value.type === 18 /* FUNCTION */) { + var colorFunction = SUPPORTED_COLOR_FUNCTIONS[value.name]; + if (typeof colorFunction === "undefined") { + throw new Error( + 'Attempting to parse an unsupported color function "' + + value.name + + '"', + ); + } + return colorFunction(context, value.values); + } + if (value.type === 5 /* HASH_TOKEN */) { + if (value.value.length === 3) { + var r = value.value.substring(0, 1); + var g = value.value.substring(1, 2); + var b = value.value.substring(2, 3); + return pack( + parseInt(r + r, 16), + parseInt(g + g, 16), + parseInt(b + b, 16), + 1, + ); + } + if (value.value.length === 4) { + var r = value.value.substring(0, 1); + var g = value.value.substring(1, 2); + var b = value.value.substring(2, 3); + var a = value.value.substring(3, 4); + return pack( + parseInt(r + r, 16), + parseInt(g + g, 16), + parseInt(b + b, 16), + parseInt(a + a, 16) / 255, + ); + } + if (value.value.length === 6) { + var r = value.value.substring(0, 2); + var g = value.value.substring(2, 4); + var b = value.value.substring(4, 6); + return pack(parseInt(r, 16), parseInt(g, 16), parseInt(b, 16), 1); + } + if (value.value.length === 8) { + var r = value.value.substring(0, 2); + var g = value.value.substring(2, 4); + var b = value.value.substring(4, 6); + var a = value.value.substring(6, 8); + return pack( + parseInt(r, 16), + parseInt(g, 16), + parseInt(b, 16), + parseInt(a, 16) / 255, + ); + } + } + if (value.type === 20 /* IDENT_TOKEN */) { + var namedColor = COLORS[value.value.toUpperCase()]; + if (typeof namedColor !== "undefined") { + return namedColor; + } + } + return COLORS.TRANSPARENT; + }, + }; + var isTransparent = function (color) { + return (0xff & color) === 0; + }; + var asString = function (color) { + var alpha = 0xff & color; + var blue = 0xff & (color >> 8); + var green = 0xff & (color >> 16); + var red = 0xff & (color >> 24); + return alpha < 255 + ? "rgba(" + red + "," + green + "," + blue + "," + alpha / 255 + ")" + : "rgb(" + red + "," + green + "," + blue + ")"; + }; + var pack = function (r, g, b, a) { + return ( + ((r << 24) | (g << 16) | (b << 8) | (Math.round(a * 255) << 0)) >>> 0 + ); + }; + var getTokenColorValue = function (token, i) { + if (token.type === 17 /* NUMBER_TOKEN */) { + return token.number; + } + if (token.type === 16 /* PERCENTAGE_TOKEN */) { + var max = i === 3 ? 1 : 255; + return i === 3 + ? (token.number / 100) * max + : Math.round((token.number / 100) * max); + } + return 0; }; var rgb = function (_context, args) { - var tokens = args.filter(nonFunctionArgSeparator); - if (tokens.length === 3) { - var _a = tokens.map(getTokenColorValue), r = _a[0], g = _a[1], b = _a[2]; - return pack(r, g, b, 1); - } - if (tokens.length === 4) { - var _b = tokens.map(getTokenColorValue), r = _b[0], g = _b[1], b = _b[2], a = _b[3]; - return pack(r, g, b, a); - } - return 0; + var tokens = args.filter(nonFunctionArgSeparator); + if (tokens.length === 3) { + var _a = tokens.map(getTokenColorValue), + r = _a[0], + g = _a[1], + b = _a[2]; + return pack(r, g, b, 1); + } + if (tokens.length === 4) { + var _b = tokens.map(getTokenColorValue), + r = _b[0], + g = _b[1], + b = _b[2], + a = _b[3]; + return pack(r, g, b, a); + } + return 0; }; function hue2rgb(t1, t2, hue) { - if (hue < 0) { - hue += 1; - } - if (hue >= 1) { - hue -= 1; - } - if (hue < 1 / 6) { - return (t2 - t1) * hue * 6 + t1; - } - else if (hue < 1 / 2) { - return t2; - } - else if (hue < 2 / 3) { - return (t2 - t1) * 6 * (2 / 3 - hue) + t1; - } - else { - return t1; - } + if (hue < 0) { + hue += 1; + } + if (hue >= 1) { + hue -= 1; + } + if (hue < 1 / 6) { + return (t2 - t1) * hue * 6 + t1; + } else if (hue < 1 / 2) { + return t2; + } else if (hue < 2 / 3) { + return (t2 - t1) * 6 * (2 / 3 - hue) + t1; + } else { + return t1; + } } var hsl = function (context, args) { - var tokens = args.filter(nonFunctionArgSeparator); - var hue = tokens[0], saturation = tokens[1], lightness = tokens[2], alpha = tokens[3]; - var h = (hue.type === 17 /* NUMBER_TOKEN */ ? deg(hue.number) : angle.parse(context, hue)) / (Math.PI * 2); - var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0; - var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0; - var a = typeof alpha !== 'undefined' && isLengthPercentage(alpha) ? getAbsoluteValue(alpha, 1) : 1; - if (s === 0) { - return pack(l * 255, l * 255, l * 255, 1); - } - var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - var t1 = l * 2 - t2; - var r = hue2rgb(t1, t2, h + 1 / 3); - var g = hue2rgb(t1, t2, h); - var b = hue2rgb(t1, t2, h - 1 / 3); - return pack(r * 255, g * 255, b * 255, a); + var tokens = args.filter(nonFunctionArgSeparator); + var hue = tokens[0], + saturation = tokens[1], + lightness = tokens[2], + alpha = tokens[3]; + var h = + (hue.type === 17 /* NUMBER_TOKEN */ + ? deg(hue.number) + : angle.parse(context, hue)) / + (Math.PI * 2); + var s = isLengthPercentage(saturation) ? saturation.number / 100 : 0; + var l = isLengthPercentage(lightness) ? lightness.number / 100 : 0; + var a = + typeof alpha !== "undefined" && isLengthPercentage(alpha) + ? getAbsoluteValue(alpha, 1) + : 1; + if (s === 0) { + return pack(l * 255, l * 255, l * 255, 1); + } + var t2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var t1 = l * 2 - t2; + var r = hue2rgb(t1, t2, h + 1 / 3); + var g = hue2rgb(t1, t2, h); + var b = hue2rgb(t1, t2, h - 1 / 3); + return pack(r * 255, g * 255, b * 255, a); }; var SUPPORTED_COLOR_FUNCTIONS = { - hsl: hsl, - hsla: hsl, - rgb: rgb, - rgba: rgb + hsl: hsl, + hsla: hsl, + rgb: rgb, + rgba: rgb, }; var parseColor = function (context, value) { - return color$1.parse(context, Parser.create(value).parseComponentValue()); + return color$1.parse( + context, + Parser.create(value).parseComponentValue(), + ); }; var COLORS = { - ALICEBLUE: 0xf0f8ffff, - ANTIQUEWHITE: 0xfaebd7ff, - AQUA: 0x00ffffff, - AQUAMARINE: 0x7fffd4ff, - AZURE: 0xf0ffffff, - BEIGE: 0xf5f5dcff, - BISQUE: 0xffe4c4ff, - BLACK: 0x000000ff, - BLANCHEDALMOND: 0xffebcdff, - BLUE: 0x0000ffff, - BLUEVIOLET: 0x8a2be2ff, - BROWN: 0xa52a2aff, - BURLYWOOD: 0xdeb887ff, - CADETBLUE: 0x5f9ea0ff, - CHARTREUSE: 0x7fff00ff, - CHOCOLATE: 0xd2691eff, - CORAL: 0xff7f50ff, - CORNFLOWERBLUE: 0x6495edff, - CORNSILK: 0xfff8dcff, - CRIMSON: 0xdc143cff, - CYAN: 0x00ffffff, - DARKBLUE: 0x00008bff, - DARKCYAN: 0x008b8bff, - DARKGOLDENROD: 0xb886bbff, - DARKGRAY: 0xa9a9a9ff, - DARKGREEN: 0x006400ff, - DARKGREY: 0xa9a9a9ff, - DARKKHAKI: 0xbdb76bff, - DARKMAGENTA: 0x8b008bff, - DARKOLIVEGREEN: 0x556b2fff, - DARKORANGE: 0xff8c00ff, - DARKORCHID: 0x9932ccff, - DARKRED: 0x8b0000ff, - DARKSALMON: 0xe9967aff, - DARKSEAGREEN: 0x8fbc8fff, - DARKSLATEBLUE: 0x483d8bff, - DARKSLATEGRAY: 0x2f4f4fff, - DARKSLATEGREY: 0x2f4f4fff, - DARKTURQUOISE: 0x00ced1ff, - DARKVIOLET: 0x9400d3ff, - DEEPPINK: 0xff1493ff, - DEEPSKYBLUE: 0x00bfffff, - DIMGRAY: 0x696969ff, - DIMGREY: 0x696969ff, - DODGERBLUE: 0x1e90ffff, - FIREBRICK: 0xb22222ff, - FLORALWHITE: 0xfffaf0ff, - FORESTGREEN: 0x228b22ff, - FUCHSIA: 0xff00ffff, - GAINSBORO: 0xdcdcdcff, - GHOSTWHITE: 0xf8f8ffff, - GOLD: 0xffd700ff, - GOLDENROD: 0xdaa520ff, - GRAY: 0x808080ff, - GREEN: 0x008000ff, - GREENYELLOW: 0xadff2fff, - GREY: 0x808080ff, - HONEYDEW: 0xf0fff0ff, - HOTPINK: 0xff69b4ff, - INDIANRED: 0xcd5c5cff, - INDIGO: 0x4b0082ff, - IVORY: 0xfffff0ff, - KHAKI: 0xf0e68cff, - LAVENDER: 0xe6e6faff, - LAVENDERBLUSH: 0xfff0f5ff, - LAWNGREEN: 0x7cfc00ff, - LEMONCHIFFON: 0xfffacdff, - LIGHTBLUE: 0xadd8e6ff, - LIGHTCORAL: 0xf08080ff, - LIGHTCYAN: 0xe0ffffff, - LIGHTGOLDENRODYELLOW: 0xfafad2ff, - LIGHTGRAY: 0xd3d3d3ff, - LIGHTGREEN: 0x90ee90ff, - LIGHTGREY: 0xd3d3d3ff, - LIGHTPINK: 0xffb6c1ff, - LIGHTSALMON: 0xffa07aff, - LIGHTSEAGREEN: 0x20b2aaff, - LIGHTSKYBLUE: 0x87cefaff, - LIGHTSLATEGRAY: 0x778899ff, - LIGHTSLATEGREY: 0x778899ff, - LIGHTSTEELBLUE: 0xb0c4deff, - LIGHTYELLOW: 0xffffe0ff, - LIME: 0x00ff00ff, - LIMEGREEN: 0x32cd32ff, - LINEN: 0xfaf0e6ff, - MAGENTA: 0xff00ffff, - MAROON: 0x800000ff, - MEDIUMAQUAMARINE: 0x66cdaaff, - MEDIUMBLUE: 0x0000cdff, - MEDIUMORCHID: 0xba55d3ff, - MEDIUMPURPLE: 0x9370dbff, - MEDIUMSEAGREEN: 0x3cb371ff, - MEDIUMSLATEBLUE: 0x7b68eeff, - MEDIUMSPRINGGREEN: 0x00fa9aff, - MEDIUMTURQUOISE: 0x48d1ccff, - MEDIUMVIOLETRED: 0xc71585ff, - MIDNIGHTBLUE: 0x191970ff, - MINTCREAM: 0xf5fffaff, - MISTYROSE: 0xffe4e1ff, - MOCCASIN: 0xffe4b5ff, - NAVAJOWHITE: 0xffdeadff, - NAVY: 0x000080ff, - OLDLACE: 0xfdf5e6ff, - OLIVE: 0x808000ff, - OLIVEDRAB: 0x6b8e23ff, - ORANGE: 0xffa500ff, - ORANGERED: 0xff4500ff, - ORCHID: 0xda70d6ff, - PALEGOLDENROD: 0xeee8aaff, - PALEGREEN: 0x98fb98ff, - PALETURQUOISE: 0xafeeeeff, - PALEVIOLETRED: 0xdb7093ff, - PAPAYAWHIP: 0xffefd5ff, - PEACHPUFF: 0xffdab9ff, - PERU: 0xcd853fff, - PINK: 0xffc0cbff, - PLUM: 0xdda0ddff, - POWDERBLUE: 0xb0e0e6ff, - PURPLE: 0x800080ff, - REBECCAPURPLE: 0x663399ff, - RED: 0xff0000ff, - ROSYBROWN: 0xbc8f8fff, - ROYALBLUE: 0x4169e1ff, - SADDLEBROWN: 0x8b4513ff, - SALMON: 0xfa8072ff, - SANDYBROWN: 0xf4a460ff, - SEAGREEN: 0x2e8b57ff, - SEASHELL: 0xfff5eeff, - SIENNA: 0xa0522dff, - SILVER: 0xc0c0c0ff, - SKYBLUE: 0x87ceebff, - SLATEBLUE: 0x6a5acdff, - SLATEGRAY: 0x708090ff, - SLATEGREY: 0x708090ff, - SNOW: 0xfffafaff, - SPRINGGREEN: 0x00ff7fff, - STEELBLUE: 0x4682b4ff, - TAN: 0xd2b48cff, - TEAL: 0x008080ff, - THISTLE: 0xd8bfd8ff, - TOMATO: 0xff6347ff, - TRANSPARENT: 0x00000000, - TURQUOISE: 0x40e0d0ff, - VIOLET: 0xee82eeff, - WHEAT: 0xf5deb3ff, - WHITE: 0xffffffff, - WHITESMOKE: 0xf5f5f5ff, - YELLOW: 0xffff00ff, - YELLOWGREEN: 0x9acd32ff + ALICEBLUE: 0xf0f8ffff, + ANTIQUEWHITE: 0xfaebd7ff, + AQUA: 0x00ffffff, + AQUAMARINE: 0x7fffd4ff, + AZURE: 0xf0ffffff, + BEIGE: 0xf5f5dcff, + BISQUE: 0xffe4c4ff, + BLACK: 0x000000ff, + BLANCHEDALMOND: 0xffebcdff, + BLUE: 0x0000ffff, + BLUEVIOLET: 0x8a2be2ff, + BROWN: 0xa52a2aff, + BURLYWOOD: 0xdeb887ff, + CADETBLUE: 0x5f9ea0ff, + CHARTREUSE: 0x7fff00ff, + CHOCOLATE: 0xd2691eff, + CORAL: 0xff7f50ff, + CORNFLOWERBLUE: 0x6495edff, + CORNSILK: 0xfff8dcff, + CRIMSON: 0xdc143cff, + CYAN: 0x00ffffff, + DARKBLUE: 0x00008bff, + DARKCYAN: 0x008b8bff, + DARKGOLDENROD: 0xb886bbff, + DARKGRAY: 0xa9a9a9ff, + DARKGREEN: 0x006400ff, + DARKGREY: 0xa9a9a9ff, + DARKKHAKI: 0xbdb76bff, + DARKMAGENTA: 0x8b008bff, + DARKOLIVEGREEN: 0x556b2fff, + DARKORANGE: 0xff8c00ff, + DARKORCHID: 0x9932ccff, + DARKRED: 0x8b0000ff, + DARKSALMON: 0xe9967aff, + DARKSEAGREEN: 0x8fbc8fff, + DARKSLATEBLUE: 0x483d8bff, + DARKSLATEGRAY: 0x2f4f4fff, + DARKSLATEGREY: 0x2f4f4fff, + DARKTURQUOISE: 0x00ced1ff, + DARKVIOLET: 0x9400d3ff, + DEEPPINK: 0xff1493ff, + DEEPSKYBLUE: 0x00bfffff, + DIMGRAY: 0x696969ff, + DIMGREY: 0x696969ff, + DODGERBLUE: 0x1e90ffff, + FIREBRICK: 0xb22222ff, + FLORALWHITE: 0xfffaf0ff, + FORESTGREEN: 0x228b22ff, + FUCHSIA: 0xff00ffff, + GAINSBORO: 0xdcdcdcff, + GHOSTWHITE: 0xf8f8ffff, + GOLD: 0xffd700ff, + GOLDENROD: 0xdaa520ff, + GRAY: 0x808080ff, + GREEN: 0x008000ff, + GREENYELLOW: 0xadff2fff, + GREY: 0x808080ff, + HONEYDEW: 0xf0fff0ff, + HOTPINK: 0xff69b4ff, + INDIANRED: 0xcd5c5cff, + INDIGO: 0x4b0082ff, + IVORY: 0xfffff0ff, + KHAKI: 0xf0e68cff, + LAVENDER: 0xe6e6faff, + LAVENDERBLUSH: 0xfff0f5ff, + LAWNGREEN: 0x7cfc00ff, + LEMONCHIFFON: 0xfffacdff, + LIGHTBLUE: 0xadd8e6ff, + LIGHTCORAL: 0xf08080ff, + LIGHTCYAN: 0xe0ffffff, + LIGHTGOLDENRODYELLOW: 0xfafad2ff, + LIGHTGRAY: 0xd3d3d3ff, + LIGHTGREEN: 0x90ee90ff, + LIGHTGREY: 0xd3d3d3ff, + LIGHTPINK: 0xffb6c1ff, + LIGHTSALMON: 0xffa07aff, + LIGHTSEAGREEN: 0x20b2aaff, + LIGHTSKYBLUE: 0x87cefaff, + LIGHTSLATEGRAY: 0x778899ff, + LIGHTSLATEGREY: 0x778899ff, + LIGHTSTEELBLUE: 0xb0c4deff, + LIGHTYELLOW: 0xffffe0ff, + LIME: 0x00ff00ff, + LIMEGREEN: 0x32cd32ff, + LINEN: 0xfaf0e6ff, + MAGENTA: 0xff00ffff, + MAROON: 0x800000ff, + MEDIUMAQUAMARINE: 0x66cdaaff, + MEDIUMBLUE: 0x0000cdff, + MEDIUMORCHID: 0xba55d3ff, + MEDIUMPURPLE: 0x9370dbff, + MEDIUMSEAGREEN: 0x3cb371ff, + MEDIUMSLATEBLUE: 0x7b68eeff, + MEDIUMSPRINGGREEN: 0x00fa9aff, + MEDIUMTURQUOISE: 0x48d1ccff, + MEDIUMVIOLETRED: 0xc71585ff, + MIDNIGHTBLUE: 0x191970ff, + MINTCREAM: 0xf5fffaff, + MISTYROSE: 0xffe4e1ff, + MOCCASIN: 0xffe4b5ff, + NAVAJOWHITE: 0xffdeadff, + NAVY: 0x000080ff, + OLDLACE: 0xfdf5e6ff, + OLIVE: 0x808000ff, + OLIVEDRAB: 0x6b8e23ff, + ORANGE: 0xffa500ff, + ORANGERED: 0xff4500ff, + ORCHID: 0xda70d6ff, + PALEGOLDENROD: 0xeee8aaff, + PALEGREEN: 0x98fb98ff, + PALETURQUOISE: 0xafeeeeff, + PALEVIOLETRED: 0xdb7093ff, + PAPAYAWHIP: 0xffefd5ff, + PEACHPUFF: 0xffdab9ff, + PERU: 0xcd853fff, + PINK: 0xffc0cbff, + PLUM: 0xdda0ddff, + POWDERBLUE: 0xb0e0e6ff, + PURPLE: 0x800080ff, + REBECCAPURPLE: 0x663399ff, + RED: 0xff0000ff, + ROSYBROWN: 0xbc8f8fff, + ROYALBLUE: 0x4169e1ff, + SADDLEBROWN: 0x8b4513ff, + SALMON: 0xfa8072ff, + SANDYBROWN: 0xf4a460ff, + SEAGREEN: 0x2e8b57ff, + SEASHELL: 0xfff5eeff, + SIENNA: 0xa0522dff, + SILVER: 0xc0c0c0ff, + SKYBLUE: 0x87ceebff, + SLATEBLUE: 0x6a5acdff, + SLATEGRAY: 0x708090ff, + SLATEGREY: 0x708090ff, + SNOW: 0xfffafaff, + SPRINGGREEN: 0x00ff7fff, + STEELBLUE: 0x4682b4ff, + TAN: 0xd2b48cff, + TEAL: 0x008080ff, + THISTLE: 0xd8bfd8ff, + TOMATO: 0xff6347ff, + TRANSPARENT: 0x00000000, + TURQUOISE: 0x40e0d0ff, + VIOLET: 0xee82eeff, + WHEAT: 0xf5deb3ff, + WHITE: 0xffffffff, + WHITESMOKE: 0xf5f5f5ff, + YELLOW: 0xffff00ff, + YELLOWGREEN: 0x9acd32ff, }; var backgroundClip = { - name: 'background-clip', - initialValue: 'border-box', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return tokens.map(function (token) { - if (isIdentToken(token)) { - switch (token.value) { - case 'padding-box': - return 1 /* PADDING_BOX */; - case 'content-box': - return 2 /* CONTENT_BOX */; - } - } - return 0 /* BORDER_BOX */; - }); - } + name: "background-clip", + initialValue: "border-box", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.map(function (token) { + if (isIdentToken(token)) { + switch (token.value) { + case "padding-box": + return 1 /* PADDING_BOX */; + case "content-box": + return 2 /* CONTENT_BOX */; + } + } + return 0 /* BORDER_BOX */; + }); + }, }; var backgroundColor = { - name: "background-color", - initialValue: 'transparent', - prefix: false, - type: 3 /* TYPE_VALUE */, - format: 'color' + name: "background-color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", }; var parseColorStop = function (context, args) { - var color = color$1.parse(context, args[0]); - var stop = args[1]; - return stop && isLengthPercentage(stop) ? { color: color, stop: stop } : { color: color, stop: null }; + var color = color$1.parse(context, args[0]); + var stop = args[1]; + return stop && isLengthPercentage(stop) + ? { color: color, stop: stop } + : { color: color, stop: null }; }; var processColorStops = function (stops, lineLength) { - var first = stops[0]; - var last = stops[stops.length - 1]; - if (first.stop === null) { - first.stop = ZERO_LENGTH; + var first = stops[0]; + var last = stops[stops.length - 1]; + if (first.stop === null) { + first.stop = ZERO_LENGTH; + } + if (last.stop === null) { + last.stop = HUNDRED_PERCENT; + } + var processStops = []; + var previous = 0; + for (var i = 0; i < stops.length; i++) { + var stop_1 = stops[i].stop; + if (stop_1 !== null) { + var absoluteValue = getAbsoluteValue(stop_1, lineLength); + if (absoluteValue > previous) { + processStops.push(absoluteValue); + } else { + processStops.push(previous); + } + previous = absoluteValue; + } else { + processStops.push(null); } - if (last.stop === null) { - last.stop = HUNDRED_PERCENT; + } + var gapBegin = null; + for (var i = 0; i < processStops.length; i++) { + var stop_2 = processStops[i]; + if (stop_2 === null) { + if (gapBegin === null) { + gapBegin = i; + } + } else if (gapBegin !== null) { + var gapLength = i - gapBegin; + var beforeGap = processStops[gapBegin - 1]; + var gapValue = (stop_2 - beforeGap) / (gapLength + 1); + for (var g = 1; g <= gapLength; g++) { + processStops[gapBegin + g - 1] = gapValue * g; + } + gapBegin = null; } - var processStops = []; - var previous = 0; - for (var i = 0; i < stops.length; i++) { - var stop_1 = stops[i].stop; - if (stop_1 !== null) { - var absoluteValue = getAbsoluteValue(stop_1, lineLength); - if (absoluteValue > previous) { - processStops.push(absoluteValue); - } - else { - processStops.push(previous); - } - previous = absoluteValue; - } - else { - processStops.push(null); - } - } - var gapBegin = null; - for (var i = 0; i < processStops.length; i++) { - var stop_2 = processStops[i]; - if (stop_2 === null) { - if (gapBegin === null) { - gapBegin = i; - } - } - else if (gapBegin !== null) { - var gapLength = i - gapBegin; - var beforeGap = processStops[gapBegin - 1]; - var gapValue = (stop_2 - beforeGap) / (gapLength + 1); - for (var g = 1; g <= gapLength; g++) { - processStops[gapBegin + g - 1] = gapValue * g; - } - gapBegin = null; - } - } - return stops.map(function (_a, i) { - var color = _a.color; - return { color: color, stop: Math.max(Math.min(1, processStops[i] / lineLength), 0) }; - }); + } + return stops.map(function (_a, i) { + var color = _a.color; + return { + color: color, + stop: Math.max(Math.min(1, processStops[i] / lineLength), 0), + }; + }); }; var getAngleFromCorner = function (corner, width, height) { - var centerX = width / 2; - var centerY = height / 2; - var x = getAbsoluteValue(corner[0], width) - centerX; - var y = centerY - getAbsoluteValue(corner[1], height); - return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2); + var centerX = width / 2; + var centerY = height / 2; + var x = getAbsoluteValue(corner[0], width) - centerX; + var y = centerY - getAbsoluteValue(corner[1], height); + return (Math.atan2(y, x) + Math.PI * 2) % (Math.PI * 2); }; var calculateGradientDirection = function (angle, width, height) { - var radian = typeof angle === 'number' ? angle : getAngleFromCorner(angle, width, height); - var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian)); - var halfWidth = width / 2; - var halfHeight = height / 2; - var halfLineLength = lineLength / 2; - var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength; - var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength; - return [lineLength, halfWidth - xDiff, halfWidth + xDiff, halfHeight - yDiff, halfHeight + yDiff]; + var radian = + typeof angle === "number" + ? angle + : getAngleFromCorner(angle, width, height); + var lineLength = + Math.abs(width * Math.sin(radian)) + + Math.abs(height * Math.cos(radian)); + var halfWidth = width / 2; + var halfHeight = height / 2; + var halfLineLength = lineLength / 2; + var yDiff = Math.sin(radian - Math.PI / 2) * halfLineLength; + var xDiff = Math.cos(radian - Math.PI / 2) * halfLineLength; + return [ + lineLength, + halfWidth - xDiff, + halfWidth + xDiff, + halfHeight - yDiff, + halfHeight + yDiff, + ]; + }; + var distance = function (a, b) { + return Math.sqrt(a * a + b * b); }; - var distance = function (a, b) { return Math.sqrt(a * a + b * b); }; var findCorner = function (width, height, x, y, closest) { - var corners = [ - [0, 0], - [0, height], - [width, 0], - [width, height] - ]; - return corners.reduce(function (stat, corner) { - var cx = corner[0], cy = corner[1]; - var d = distance(x - cx, y - cy); - if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) { - return { - optimumCorner: corner, - optimumDistance: d - }; - } - return stat; - }, { - optimumDistance: closest ? Infinity : -Infinity, - optimumCorner: null - }).optimumCorner; + var corners = [ + [0, 0], + [0, height], + [width, 0], + [width, height], + ]; + return corners.reduce( + function (stat, corner) { + var cx = corner[0], + cy = corner[1]; + var d = distance(x - cx, y - cy); + if (closest ? d < stat.optimumDistance : d > stat.optimumDistance) { + return { + optimumCorner: corner, + optimumDistance: d, + }; + } + return stat; + }, + { + optimumDistance: closest ? Infinity : -Infinity, + optimumCorner: null, + }, + ).optimumCorner; }; var calculateRadius = function (gradient, x, y, width, height) { - var rx = 0; - var ry = 0; - switch (gradient.size) { - case 0 /* CLOSEST_SIDE */: - // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center. - // If the shape is an ellipse, it exactly meets the closest side in each dimension. - if (gradient.shape === 0 /* CIRCLE */) { - rx = ry = Math.min(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height)); - } - else if (gradient.shape === 1 /* ELLIPSE */) { - rx = Math.min(Math.abs(x), Math.abs(x - width)); - ry = Math.min(Math.abs(y), Math.abs(y - height)); - } - break; - case 2 /* CLOSEST_CORNER */: - // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center. - // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified. - if (gradient.shape === 0 /* CIRCLE */) { - rx = ry = Math.min(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height)); - } - else if (gradient.shape === 1 /* ELLIPSE */) { - // Compute the ratio ry/rx (which is to be the same as for "closest-side") - var c = Math.min(Math.abs(y), Math.abs(y - height)) / Math.min(Math.abs(x), Math.abs(x - width)); - var _a = findCorner(width, height, x, y, true), cx = _a[0], cy = _a[1]; - rx = distance(cx - x, (cy - y) / c); - ry = c * rx; - } - break; - case 1 /* FARTHEST_SIDE */: - // Same as closest-side, except the ending shape is sized based on the farthest side(s) - if (gradient.shape === 0 /* CIRCLE */) { - rx = ry = Math.max(Math.abs(x), Math.abs(x - width), Math.abs(y), Math.abs(y - height)); - } - else if (gradient.shape === 1 /* ELLIPSE */) { - rx = Math.max(Math.abs(x), Math.abs(x - width)); - ry = Math.max(Math.abs(y), Math.abs(y - height)); - } - break; - case 3 /* FARTHEST_CORNER */: - // Same as closest-corner, except the ending shape is sized based on the farthest corner. - // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified. - if (gradient.shape === 0 /* CIRCLE */) { - rx = ry = Math.max(distance(x, y), distance(x, y - height), distance(x - width, y), distance(x - width, y - height)); - } - else if (gradient.shape === 1 /* ELLIPSE */) { - // Compute the ratio ry/rx (which is to be the same as for "farthest-side") - var c = Math.max(Math.abs(y), Math.abs(y - height)) / Math.max(Math.abs(x), Math.abs(x - width)); - var _b = findCorner(width, height, x, y, false), cx = _b[0], cy = _b[1]; - rx = distance(cx - x, (cy - y) / c); - ry = c * rx; - } - break; - } - if (Array.isArray(gradient.size)) { - rx = getAbsoluteValue(gradient.size[0], width); - ry = gradient.size.length === 2 ? getAbsoluteValue(gradient.size[1], height) : rx; - } - return [rx, ry]; + var rx = 0; + var ry = 0; + switch (gradient.size) { + case 0 /* CLOSEST_SIDE */: + // The ending shape is sized so that that it exactly meets the side of the gradient box closest to the gradient’s center. + // If the shape is an ellipse, it exactly meets the closest side in each dimension. + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.min( + Math.abs(x), + Math.abs(x - width), + Math.abs(y), + Math.abs(y - height), + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + rx = Math.min(Math.abs(x), Math.abs(x - width)); + ry = Math.min(Math.abs(y), Math.abs(y - height)); + } + break; + case 2 /* CLOSEST_CORNER */: + // The ending shape is sized so that that it passes through the corner of the gradient box closest to the gradient’s center. + // If the shape is an ellipse, the ending shape is given the same aspect-ratio it would have if closest-side were specified. + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.min( + distance(x, y), + distance(x, y - height), + distance(x - width, y), + distance(x - width, y - height), + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + // Compute the ratio ry/rx (which is to be the same as for "closest-side") + var c = + Math.min(Math.abs(y), Math.abs(y - height)) / + Math.min(Math.abs(x), Math.abs(x - width)); + var _a = findCorner(width, height, x, y, true), + cx = _a[0], + cy = _a[1]; + rx = distance(cx - x, (cy - y) / c); + ry = c * rx; + } + break; + case 1 /* FARTHEST_SIDE */: + // Same as closest-side, except the ending shape is sized based on the farthest side(s) + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.max( + Math.abs(x), + Math.abs(x - width), + Math.abs(y), + Math.abs(y - height), + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + rx = Math.max(Math.abs(x), Math.abs(x - width)); + ry = Math.max(Math.abs(y), Math.abs(y - height)); + } + break; + case 3 /* FARTHEST_CORNER */: + // Same as closest-corner, except the ending shape is sized based on the farthest corner. + // If the shape is an ellipse, the ending shape is given the same aspect ratio it would have if farthest-side were specified. + if (gradient.shape === 0 /* CIRCLE */) { + rx = ry = Math.max( + distance(x, y), + distance(x, y - height), + distance(x - width, y), + distance(x - width, y - height), + ); + } else if (gradient.shape === 1 /* ELLIPSE */) { + // Compute the ratio ry/rx (which is to be the same as for "farthest-side") + var c = + Math.max(Math.abs(y), Math.abs(y - height)) / + Math.max(Math.abs(x), Math.abs(x - width)); + var _b = findCorner(width, height, x, y, false), + cx = _b[0], + cy = _b[1]; + rx = distance(cx - x, (cy - y) / c); + ry = c * rx; + } + break; + } + if (Array.isArray(gradient.size)) { + rx = getAbsoluteValue(gradient.size[0], width); + ry = + gradient.size.length === 2 + ? getAbsoluteValue(gradient.size[1], height) + : rx; + } + return [rx, ry]; }; var linearGradient = function (context, tokens) { - var angle$1 = deg(180); - var stops = []; - parseFunctionArgs(tokens).forEach(function (arg, i) { - if (i === 0) { - var firstToken = arg[0]; - if (firstToken.type === 20 /* IDENT_TOKEN */ && firstToken.value === 'to') { - angle$1 = parseNamedSide(arg); - return; - } - else if (isAngle(firstToken)) { - angle$1 = angle.parse(context, firstToken); - return; - } - } - var colorStop = parseColorStop(context, arg); - stops.push(colorStop); - }); - return { angle: angle$1, stops: stops, type: 1 /* LINEAR_GRADIENT */ }; + var angle$1 = deg(180); + var stops = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + if (i === 0) { + var firstToken = arg[0]; + if ( + firstToken.type === 20 /* IDENT_TOKEN */ && + firstToken.value === "to" + ) { + angle$1 = parseNamedSide(arg); + return; + } else if (isAngle(firstToken)) { + angle$1 = angle.parse(context, firstToken); + return; + } + } + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + }); + return { angle: angle$1, stops: stops, type: 1 /* LINEAR_GRADIENT */ }; }; var prefixLinearGradient = function (context, tokens) { - var angle$1 = deg(180); - var stops = []; - parseFunctionArgs(tokens).forEach(function (arg, i) { - if (i === 0) { - var firstToken = arg[0]; - if (firstToken.type === 20 /* IDENT_TOKEN */ && - ['top', 'left', 'right', 'bottom'].indexOf(firstToken.value) !== -1) { - angle$1 = parseNamedSide(arg); - return; - } - else if (isAngle(firstToken)) { - angle$1 = (angle.parse(context, firstToken) + deg(270)) % deg(360); - return; - } - } - var colorStop = parseColorStop(context, arg); - stops.push(colorStop); - }); - return { - angle: angle$1, - stops: stops, - type: 1 /* LINEAR_GRADIENT */ - }; + var angle$1 = deg(180); + var stops = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + if (i === 0) { + var firstToken = arg[0]; + if ( + firstToken.type === 20 /* IDENT_TOKEN */ && + ["top", "left", "right", "bottom"].indexOf(firstToken.value) !== + -1 + ) { + angle$1 = parseNamedSide(arg); + return; + } else if (isAngle(firstToken)) { + angle$1 = + (angle.parse(context, firstToken) + deg(270)) % deg(360); + return; + } + } + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + }); + return { + angle: angle$1, + stops: stops, + type: 1 /* LINEAR_GRADIENT */, + }; }; var webkitGradient = function (context, tokens) { - var angle = deg(180); - var stops = []; - var type = 1 /* LINEAR_GRADIENT */; - var shape = 0 /* CIRCLE */; - var size = 3 /* FARTHEST_CORNER */; - var position = []; - parseFunctionArgs(tokens).forEach(function (arg, i) { - var firstToken = arg[0]; - if (i === 0) { - if (isIdentToken(firstToken) && firstToken.value === 'linear') { - type = 1 /* LINEAR_GRADIENT */; - return; - } - else if (isIdentToken(firstToken) && firstToken.value === 'radial') { - type = 2 /* RADIAL_GRADIENT */; - return; - } + var angle = deg(180); + var stops = []; + var type = 1; /* LINEAR_GRADIENT */ + var shape = 0; /* CIRCLE */ + var size = 3; /* FARTHEST_CORNER */ + var position = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + var firstToken = arg[0]; + if (i === 0) { + if (isIdentToken(firstToken) && firstToken.value === "linear") { + type = 1 /* LINEAR_GRADIENT */; + return; + } else if ( + isIdentToken(firstToken) && + firstToken.value === "radial" + ) { + type = 2 /* RADIAL_GRADIENT */; + return; + } + } + if (firstToken.type === 18 /* FUNCTION */) { + if (firstToken.name === "from") { + var color = color$1.parse(context, firstToken.values[0]); + stops.push({ stop: ZERO_LENGTH, color: color }); + } else if (firstToken.name === "to") { + var color = color$1.parse(context, firstToken.values[0]); + stops.push({ stop: HUNDRED_PERCENT, color: color }); + } else if (firstToken.name === "color-stop") { + var values = firstToken.values.filter(nonFunctionArgSeparator); + if (values.length === 2) { + var color = color$1.parse(context, values[1]); + var stop_1 = values[0]; + if (isNumberToken(stop_1)) { + stops.push({ + stop: { + type: 16 /* PERCENTAGE_TOKEN */, + number: stop_1.number * 100, + flags: stop_1.flags, + }, + color: color, + }); + } } - if (firstToken.type === 18 /* FUNCTION */) { - if (firstToken.name === 'from') { - var color = color$1.parse(context, firstToken.values[0]); - stops.push({ stop: ZERO_LENGTH, color: color }); - } - else if (firstToken.name === 'to') { - var color = color$1.parse(context, firstToken.values[0]); - stops.push({ stop: HUNDRED_PERCENT, color: color }); - } - else if (firstToken.name === 'color-stop') { - var values = firstToken.values.filter(nonFunctionArgSeparator); - if (values.length === 2) { - var color = color$1.parse(context, values[1]); - var stop_1 = values[0]; - if (isNumberToken(stop_1)) { - stops.push({ - stop: { type: 16 /* PERCENTAGE_TOKEN */, number: stop_1.number * 100, flags: stop_1.flags }, - color: color - }); - } - } - } - } - }); - return type === 1 /* LINEAR_GRADIENT */ - ? { - angle: (angle + deg(180)) % deg(360), - stops: stops, - type: type - } - : { size: size, shape: shape, stops: stops, position: position, type: type }; + } + } + }); + return type === 1 /* LINEAR_GRADIENT */ + ? { + angle: (angle + deg(180)) % deg(360), + stops: stops, + type: type, + } + : { + size: size, + shape: shape, + stops: stops, + position: position, + type: type, + }; }; - var CLOSEST_SIDE = 'closest-side'; - var FARTHEST_SIDE = 'farthest-side'; - var CLOSEST_CORNER = 'closest-corner'; - var FARTHEST_CORNER = 'farthest-corner'; - var CIRCLE = 'circle'; - var ELLIPSE = 'ellipse'; - var COVER = 'cover'; - var CONTAIN = 'contain'; + var CLOSEST_SIDE = "closest-side"; + var FARTHEST_SIDE = "farthest-side"; + var CLOSEST_CORNER = "closest-corner"; + var FARTHEST_CORNER = "farthest-corner"; + var CIRCLE = "circle"; + var ELLIPSE = "ellipse"; + var COVER = "cover"; + var CONTAIN = "contain"; var radialGradient = function (context, tokens) { - var shape = 0 /* CIRCLE */; - var size = 3 /* FARTHEST_CORNER */; - var stops = []; - var position = []; - parseFunctionArgs(tokens).forEach(function (arg, i) { - var isColorStop = true; - if (i === 0) { - var isAtPosition_1 = false; - isColorStop = arg.reduce(function (acc, token) { - if (isAtPosition_1) { - if (isIdentToken(token)) { - switch (token.value) { - case 'center': - position.push(FIFTY_PERCENT); - return acc; - case 'top': - case 'left': - position.push(ZERO_LENGTH); - return acc; - case 'right': - case 'bottom': - position.push(HUNDRED_PERCENT); - return acc; - } - } - else if (isLengthPercentage(token) || isLength(token)) { - position.push(token); - } - } - else if (isIdentToken(token)) { - switch (token.value) { - case CIRCLE: - shape = 0 /* CIRCLE */; - return false; - case ELLIPSE: - shape = 1 /* ELLIPSE */; - return false; - case 'at': - isAtPosition_1 = true; - return false; - case CLOSEST_SIDE: - size = 0 /* CLOSEST_SIDE */; - return false; - case COVER: - case FARTHEST_SIDE: - size = 1 /* FARTHEST_SIDE */; - return false; - case CONTAIN: - case CLOSEST_CORNER: - size = 2 /* CLOSEST_CORNER */; - return false; - case FARTHEST_CORNER: - size = 3 /* FARTHEST_CORNER */; - return false; - } - } - else if (isLength(token) || isLengthPercentage(token)) { - if (!Array.isArray(size)) { - size = []; - } - size.push(token); - return false; - } + var shape = 0; /* CIRCLE */ + var size = 3; /* FARTHEST_CORNER */ + var stops = []; + var position = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + var isColorStop = true; + if (i === 0) { + var isAtPosition_1 = false; + isColorStop = arg.reduce(function (acc, token) { + if (isAtPosition_1) { + if (isIdentToken(token)) { + switch (token.value) { + case "center": + position.push(FIFTY_PERCENT); return acc; - }, isColorStop); + case "top": + case "left": + position.push(ZERO_LENGTH); + return acc; + case "right": + case "bottom": + position.push(HUNDRED_PERCENT); + return acc; + } + } else if (isLengthPercentage(token) || isLength(token)) { + position.push(token); + } + } else if (isIdentToken(token)) { + switch (token.value) { + case CIRCLE: + shape = 0 /* CIRCLE */; + return false; + case ELLIPSE: + shape = 1 /* ELLIPSE */; + return false; + case "at": + isAtPosition_1 = true; + return false; + case CLOSEST_SIDE: + size = 0 /* CLOSEST_SIDE */; + return false; + case COVER: + case FARTHEST_SIDE: + size = 1 /* FARTHEST_SIDE */; + return false; + case CONTAIN: + case CLOSEST_CORNER: + size = 2 /* CLOSEST_CORNER */; + return false; + case FARTHEST_CORNER: + size = 3 /* FARTHEST_CORNER */; + return false; + } + } else if (isLength(token) || isLengthPercentage(token)) { + if (!Array.isArray(size)) { + size = []; + } + size.push(token); + return false; } - if (isColorStop) { - var colorStop = parseColorStop(context, arg); - stops.push(colorStop); - } - }); - return { size: size, shape: shape, stops: stops, position: position, type: 2 /* RADIAL_GRADIENT */ }; + return acc; + }, isColorStop); + } + if (isColorStop) { + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + } + }); + return { + size: size, + shape: shape, + stops: stops, + position: position, + type: 2 /* RADIAL_GRADIENT */, + }; }; var prefixRadialGradient = function (context, tokens) { - var shape = 0 /* CIRCLE */; - var size = 3 /* FARTHEST_CORNER */; - var stops = []; - var position = []; - parseFunctionArgs(tokens).forEach(function (arg, i) { - var isColorStop = true; - if (i === 0) { - isColorStop = arg.reduce(function (acc, token) { - if (isIdentToken(token)) { - switch (token.value) { - case 'center': - position.push(FIFTY_PERCENT); - return false; - case 'top': - case 'left': - position.push(ZERO_LENGTH); - return false; - case 'right': - case 'bottom': - position.push(HUNDRED_PERCENT); - return false; - } - } - else if (isLengthPercentage(token) || isLength(token)) { - position.push(token); - return false; - } - return acc; - }, isColorStop); + var shape = 0; /* CIRCLE */ + var size = 3; /* FARTHEST_CORNER */ + var stops = []; + var position = []; + parseFunctionArgs(tokens).forEach(function (arg, i) { + var isColorStop = true; + if (i === 0) { + isColorStop = arg.reduce(function (acc, token) { + if (isIdentToken(token)) { + switch (token.value) { + case "center": + position.push(FIFTY_PERCENT); + return false; + case "top": + case "left": + position.push(ZERO_LENGTH); + return false; + case "right": + case "bottom": + position.push(HUNDRED_PERCENT); + return false; + } + } else if (isLengthPercentage(token) || isLength(token)) { + position.push(token); + return false; } - else if (i === 1) { - isColorStop = arg.reduce(function (acc, token) { - if (isIdentToken(token)) { - switch (token.value) { - case CIRCLE: - shape = 0 /* CIRCLE */; - return false; - case ELLIPSE: - shape = 1 /* ELLIPSE */; - return false; - case CONTAIN: - case CLOSEST_SIDE: - size = 0 /* CLOSEST_SIDE */; - return false; - case FARTHEST_SIDE: - size = 1 /* FARTHEST_SIDE */; - return false; - case CLOSEST_CORNER: - size = 2 /* CLOSEST_CORNER */; - return false; - case COVER: - case FARTHEST_CORNER: - size = 3 /* FARTHEST_CORNER */; - return false; - } - } - else if (isLength(token) || isLengthPercentage(token)) { - if (!Array.isArray(size)) { - size = []; - } - size.push(token); - return false; - } - return acc; - }, isColorStop); + return acc; + }, isColorStop); + } else if (i === 1) { + isColorStop = arg.reduce(function (acc, token) { + if (isIdentToken(token)) { + switch (token.value) { + case CIRCLE: + shape = 0 /* CIRCLE */; + return false; + case ELLIPSE: + shape = 1 /* ELLIPSE */; + return false; + case CONTAIN: + case CLOSEST_SIDE: + size = 0 /* CLOSEST_SIDE */; + return false; + case FARTHEST_SIDE: + size = 1 /* FARTHEST_SIDE */; + return false; + case CLOSEST_CORNER: + size = 2 /* CLOSEST_CORNER */; + return false; + case COVER: + case FARTHEST_CORNER: + size = 3 /* FARTHEST_CORNER */; + return false; + } + } else if (isLength(token) || isLengthPercentage(token)) { + if (!Array.isArray(size)) { + size = []; + } + size.push(token); + return false; } - if (isColorStop) { - var colorStop = parseColorStop(context, arg); - stops.push(colorStop); - } - }); - return { size: size, shape: shape, stops: stops, position: position, type: 2 /* RADIAL_GRADIENT */ }; + return acc; + }, isColorStop); + } + if (isColorStop) { + var colorStop = parseColorStop(context, arg); + stops.push(colorStop); + } + }); + return { + size: size, + shape: shape, + stops: stops, + position: position, + type: 2 /* RADIAL_GRADIENT */, + }; }; var isLinearGradient = function (background) { - return background.type === 1 /* LINEAR_GRADIENT */; + return background.type === 1 /* LINEAR_GRADIENT */; }; var isRadialGradient = function (background) { - return background.type === 2 /* RADIAL_GRADIENT */; + return background.type === 2 /* RADIAL_GRADIENT */; }; var image = { - name: 'image', - parse: function (context, value) { - if (value.type === 22 /* URL_TOKEN */) { - var image_1 = { url: value.value, type: 0 /* URL */ }; - context.cache.addImage(value.value); - return image_1; - } - if (value.type === 18 /* FUNCTION */) { - var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name]; - if (typeof imageFunction === 'undefined') { - throw new Error("Attempting to parse an unsupported image function \"" + value.name + "\""); - } - return imageFunction(context, value.values); - } - throw new Error("Unsupported image type " + value.type); + name: "image", + parse: function (context, value) { + if (value.type === 22 /* URL_TOKEN */) { + var image_1 = { url: value.value, type: 0 /* URL */ }; + context.cache.addImage(value.value); + return image_1; } + if (value.type === 18 /* FUNCTION */) { + var imageFunction = SUPPORTED_IMAGE_FUNCTIONS[value.name]; + if (typeof imageFunction === "undefined") { + throw new Error( + 'Attempting to parse an unsupported image function "' + + value.name + + '"', + ); + } + return imageFunction(context, value.values); + } + throw new Error("Unsupported image type " + value.type); + }, }; function isSupportedImage(value) { - return (!(value.type === 20 /* IDENT_TOKEN */ && value.value === 'none') && - (value.type !== 18 /* FUNCTION */ || !!SUPPORTED_IMAGE_FUNCTIONS[value.name])); + return ( + !(value.type === 20 /* IDENT_TOKEN */ && value.value === "none") && + (value.type !== 18 /* FUNCTION */ || + !!SUPPORTED_IMAGE_FUNCTIONS[value.name]) + ); } var SUPPORTED_IMAGE_FUNCTIONS = { - 'linear-gradient': linearGradient, - '-moz-linear-gradient': prefixLinearGradient, - '-ms-linear-gradient': prefixLinearGradient, - '-o-linear-gradient': prefixLinearGradient, - '-webkit-linear-gradient': prefixLinearGradient, - 'radial-gradient': radialGradient, - '-moz-radial-gradient': prefixRadialGradient, - '-ms-radial-gradient': prefixRadialGradient, - '-o-radial-gradient': prefixRadialGradient, - '-webkit-radial-gradient': prefixRadialGradient, - '-webkit-gradient': webkitGradient + "linear-gradient": linearGradient, + "-moz-linear-gradient": prefixLinearGradient, + "-ms-linear-gradient": prefixLinearGradient, + "-o-linear-gradient": prefixLinearGradient, + "-webkit-linear-gradient": prefixLinearGradient, + "radial-gradient": radialGradient, + "-moz-radial-gradient": prefixRadialGradient, + "-ms-radial-gradient": prefixRadialGradient, + "-o-radial-gradient": prefixRadialGradient, + "-webkit-radial-gradient": prefixRadialGradient, + "-webkit-gradient": webkitGradient, }; var backgroundImage = { - name: 'background-image', - initialValue: 'none', - type: 1 /* LIST */, - prefix: false, - parse: function (context, tokens) { - if (tokens.length === 0) { - return []; - } - var first = tokens[0]; - if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') { - return []; - } - return tokens - .filter(function (value) { return nonFunctionArgSeparator(value) && isSupportedImage(value); }) - .map(function (value) { return image.parse(context, value); }); + name: "background-image", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (context, tokens) { + if (tokens.length === 0) { + return []; } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return []; + } + return tokens + .filter(function (value) { + return nonFunctionArgSeparator(value) && isSupportedImage(value); + }) + .map(function (value) { + return image.parse(context, value); + }); + }, }; var backgroundOrigin = { - name: 'background-origin', - initialValue: 'border-box', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return tokens.map(function (token) { - if (isIdentToken(token)) { - switch (token.value) { - case 'padding-box': - return 1 /* PADDING_BOX */; - case 'content-box': - return 2 /* CONTENT_BOX */; - } - } - return 0 /* BORDER_BOX */; - }); - } + name: "background-origin", + initialValue: "border-box", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.map(function (token) { + if (isIdentToken(token)) { + switch (token.value) { + case "padding-box": + return 1 /* PADDING_BOX */; + case "content-box": + return 2 /* CONTENT_BOX */; + } + } + return 0 /* BORDER_BOX */; + }); + }, }; var backgroundPosition = { - name: 'background-position', - initialValue: '0% 0%', - type: 1 /* LIST */, - prefix: false, - parse: function (_context, tokens) { - return parseFunctionArgs(tokens) - .map(function (values) { return values.filter(isLengthPercentage); }) - .map(parseLengthPercentageTuple); - } + name: "background-position", + initialValue: "0% 0%", + type: 1 /* LIST */, + prefix: false, + parse: function (_context, tokens) { + return parseFunctionArgs(tokens) + .map(function (values) { + return values.filter(isLengthPercentage); + }) + .map(parseLengthPercentageTuple); + }, }; var backgroundRepeat = { - name: 'background-repeat', - initialValue: 'repeat', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return parseFunctionArgs(tokens) - .map(function (values) { - return values - .filter(isIdentToken) - .map(function (token) { return token.value; }) - .join(' '); - }) - .map(parseBackgroundRepeat); - } + name: "background-repeat", + initialValue: "repeat", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return parseFunctionArgs(tokens) + .map(function (values) { + return values + .filter(isIdentToken) + .map(function (token) { + return token.value; + }) + .join(" "); + }) + .map(parseBackgroundRepeat); + }, }; var parseBackgroundRepeat = function (value) { - switch (value) { - case 'no-repeat': - return 1 /* NO_REPEAT */; - case 'repeat-x': - case 'repeat no-repeat': - return 2 /* REPEAT_X */; - case 'repeat-y': - case 'no-repeat repeat': - return 3 /* REPEAT_Y */; - case 'repeat': - default: - return 0 /* REPEAT */; - } + switch (value) { + case "no-repeat": + return 1 /* NO_REPEAT */; + case "repeat-x": + case "repeat no-repeat": + return 2 /* REPEAT_X */; + case "repeat-y": + case "no-repeat repeat": + return 3 /* REPEAT_Y */; + case "repeat": + default: + return 0 /* REPEAT */; + } }; var BACKGROUND_SIZE; (function (BACKGROUND_SIZE) { - BACKGROUND_SIZE["AUTO"] = "auto"; - BACKGROUND_SIZE["CONTAIN"] = "contain"; - BACKGROUND_SIZE["COVER"] = "cover"; + BACKGROUND_SIZE["AUTO"] = "auto"; + BACKGROUND_SIZE["CONTAIN"] = "contain"; + BACKGROUND_SIZE["COVER"] = "cover"; })(BACKGROUND_SIZE || (BACKGROUND_SIZE = {})); var backgroundSize = { - name: 'background-size', - initialValue: '0', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return parseFunctionArgs(tokens).map(function (values) { return values.filter(isBackgroundSizeInfoToken); }); - } + name: "background-size", + initialValue: "0", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return parseFunctionArgs(tokens).map(function (values) { + return values.filter(isBackgroundSizeInfoToken); + }); + }, }; var isBackgroundSizeInfoToken = function (value) { - return isIdentToken(value) || isLengthPercentage(value); + return isIdentToken(value) || isLengthPercentage(value); }; - var borderColorForSide = function (side) { return ({ + var borderColorForSide = function (side) { + return { name: "border-" + side + "-color", - initialValue: 'transparent', + initialValue: "transparent", prefix: false, type: 3 /* TYPE_VALUE */, - format: 'color' - }); }; - var borderTopColor = borderColorForSide('top'); - var borderRightColor = borderColorForSide('right'); - var borderBottomColor = borderColorForSide('bottom'); - var borderLeftColor = borderColorForSide('left'); + format: "color", + }; + }; + var borderTopColor = borderColorForSide("top"); + var borderRightColor = borderColorForSide("right"); + var borderBottomColor = borderColorForSide("bottom"); + var borderLeftColor = borderColorForSide("left"); - var borderRadiusForSide = function (side) { return ({ + var borderRadiusForSide = function (side) { + return { name: "border-radius-" + side, - initialValue: '0 0', + initialValue: "0 0", prefix: false, type: 1 /* LIST */, parse: function (_context, tokens) { - return parseLengthPercentageTuple(tokens.filter(isLengthPercentage)); - } - }); }; - var borderTopLeftRadius = borderRadiusForSide('top-left'); - var borderTopRightRadius = borderRadiusForSide('top-right'); - var borderBottomRightRadius = borderRadiusForSide('bottom-right'); - var borderBottomLeftRadius = borderRadiusForSide('bottom-left'); + return parseLengthPercentageTuple( + tokens.filter(isLengthPercentage), + ); + }, + }; + }; + var borderTopLeftRadius = borderRadiusForSide("top-left"); + var borderTopRightRadius = borderRadiusForSide("top-right"); + var borderBottomRightRadius = borderRadiusForSide("bottom-right"); + var borderBottomLeftRadius = borderRadiusForSide("bottom-left"); - var borderStyleForSide = function (side) { return ({ + var borderStyleForSide = function (side) { + return { name: "border-" + side + "-style", - initialValue: 'solid', + initialValue: "solid", prefix: false, type: 2 /* IDENT_VALUE */, parse: function (_context, style) { - switch (style) { - case 'none': - return 0 /* NONE */; - case 'dashed': - return 2 /* DASHED */; - case 'dotted': - return 3 /* DOTTED */; - case 'double': - return 4 /* DOUBLE */; - } - return 1 /* SOLID */; - } - }); }; - var borderTopStyle = borderStyleForSide('top'); - var borderRightStyle = borderStyleForSide('right'); - var borderBottomStyle = borderStyleForSide('bottom'); - var borderLeftStyle = borderStyleForSide('left'); + switch (style) { + case "none": + return 0 /* NONE */; + case "dashed": + return 2 /* DASHED */; + case "dotted": + return 3 /* DOTTED */; + case "double": + return 4 /* DOUBLE */; + } + return 1 /* SOLID */; + }, + }; + }; + var borderTopStyle = borderStyleForSide("top"); + var borderRightStyle = borderStyleForSide("right"); + var borderBottomStyle = borderStyleForSide("bottom"); + var borderLeftStyle = borderStyleForSide("left"); - var borderWidthForSide = function (side) { return ({ + var borderWidthForSide = function (side) { + return { name: "border-" + side + "-width", - initialValue: '0', + initialValue: "0", type: 0 /* VALUE */, prefix: false, parse: function (_context, token) { - if (isDimensionToken(token)) { - return token.number; - } - return 0; - } - }); }; - var borderTopWidth = borderWidthForSide('top'); - var borderRightWidth = borderWidthForSide('right'); - var borderBottomWidth = borderWidthForSide('bottom'); - var borderLeftWidth = borderWidthForSide('left'); + if (isDimensionToken(token)) { + return token.number; + } + return 0; + }, + }; + }; + var borderTopWidth = borderWidthForSide("top"); + var borderRightWidth = borderWidthForSide("right"); + var borderBottomWidth = borderWidthForSide("bottom"); + var borderLeftWidth = borderWidthForSide("left"); var color = { - name: "color", - initialValue: 'transparent', - prefix: false, - type: 3 /* TYPE_VALUE */, - format: 'color' + name: "color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", }; var direction = { - name: 'direction', - initialValue: 'ltr', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, direction) { - switch (direction) { - case 'rtl': - return 1 /* RTL */; - case 'ltr': - default: - return 0 /* LTR */; - } + name: "direction", + initialValue: "ltr", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, direction) { + switch (direction) { + case "rtl": + return 1 /* RTL */; + case "ltr": + default: + return 0 /* LTR */; } + }, }; var display = { - name: 'display', - initialValue: 'inline-block', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return tokens.filter(isIdentToken).reduce(function (bit, token) { - return bit | parseDisplayValue(token.value); - }, 0 /* NONE */); - } + name: "display", + initialValue: "inline-block", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.filter(isIdentToken).reduce(function (bit, token) { + return bit | parseDisplayValue(token.value); + }, 0 /* NONE */); + }, }; var parseDisplayValue = function (display) { - switch (display) { - case 'block': - case '-webkit-box': - return 2 /* BLOCK */; - case 'inline': - return 4 /* INLINE */; - case 'run-in': - return 8 /* RUN_IN */; - case 'flow': - return 16 /* FLOW */; - case 'flow-root': - return 32 /* FLOW_ROOT */; - case 'table': - return 64 /* TABLE */; - case 'flex': - case '-webkit-flex': - return 128 /* FLEX */; - case 'grid': - case '-ms-grid': - return 256 /* GRID */; - case 'ruby': - return 512 /* RUBY */; - case 'subgrid': - return 1024 /* SUBGRID */; - case 'list-item': - return 2048 /* LIST_ITEM */; - case 'table-row-group': - return 4096 /* TABLE_ROW_GROUP */; - case 'table-header-group': - return 8192 /* TABLE_HEADER_GROUP */; - case 'table-footer-group': - return 16384 /* TABLE_FOOTER_GROUP */; - case 'table-row': - return 32768 /* TABLE_ROW */; - case 'table-cell': - return 65536 /* TABLE_CELL */; - case 'table-column-group': - return 131072 /* TABLE_COLUMN_GROUP */; - case 'table-column': - return 262144 /* TABLE_COLUMN */; - case 'table-caption': - return 524288 /* TABLE_CAPTION */; - case 'ruby-base': - return 1048576 /* RUBY_BASE */; - case 'ruby-text': - return 2097152 /* RUBY_TEXT */; - case 'ruby-base-container': - return 4194304 /* RUBY_BASE_CONTAINER */; - case 'ruby-text-container': - return 8388608 /* RUBY_TEXT_CONTAINER */; - case 'contents': - return 16777216 /* CONTENTS */; - case 'inline-block': - return 33554432 /* INLINE_BLOCK */; - case 'inline-list-item': - return 67108864 /* INLINE_LIST_ITEM */; - case 'inline-table': - return 134217728 /* INLINE_TABLE */; - case 'inline-flex': - return 268435456 /* INLINE_FLEX */; - case 'inline-grid': - return 536870912 /* INLINE_GRID */; - } - return 0 /* NONE */; + switch (display) { + case "block": + case "-webkit-box": + return 2 /* BLOCK */; + case "inline": + return 4 /* INLINE */; + case "run-in": + return 8 /* RUN_IN */; + case "flow": + return 16 /* FLOW */; + case "flow-root": + return 32 /* FLOW_ROOT */; + case "table": + return 64 /* TABLE */; + case "flex": + case "-webkit-flex": + return 128 /* FLEX */; + case "grid": + case "-ms-grid": + return 256 /* GRID */; + case "ruby": + return 512 /* RUBY */; + case "subgrid": + return 1024 /* SUBGRID */; + case "list-item": + return 2048 /* LIST_ITEM */; + case "table-row-group": + return 4096 /* TABLE_ROW_GROUP */; + case "table-header-group": + return 8192 /* TABLE_HEADER_GROUP */; + case "table-footer-group": + return 16384 /* TABLE_FOOTER_GROUP */; + case "table-row": + return 32768 /* TABLE_ROW */; + case "table-cell": + return 65536 /* TABLE_CELL */; + case "table-column-group": + return 131072 /* TABLE_COLUMN_GROUP */; + case "table-column": + return 262144 /* TABLE_COLUMN */; + case "table-caption": + return 524288 /* TABLE_CAPTION */; + case "ruby-base": + return 1048576 /* RUBY_BASE */; + case "ruby-text": + return 2097152 /* RUBY_TEXT */; + case "ruby-base-container": + return 4194304 /* RUBY_BASE_CONTAINER */; + case "ruby-text-container": + return 8388608 /* RUBY_TEXT_CONTAINER */; + case "contents": + return 16777216 /* CONTENTS */; + case "inline-block": + return 33554432 /* INLINE_BLOCK */; + case "inline-list-item": + return 67108864 /* INLINE_LIST_ITEM */; + case "inline-table": + return 134217728 /* INLINE_TABLE */; + case "inline-flex": + return 268435456 /* INLINE_FLEX */; + case "inline-grid": + return 536870912 /* INLINE_GRID */; + } + return 0 /* NONE */; }; var float = { - name: 'float', - initialValue: 'none', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, float) { - switch (float) { - case 'left': - return 1 /* LEFT */; - case 'right': - return 2 /* RIGHT */; - case 'inline-start': - return 3 /* INLINE_START */; - case 'inline-end': - return 4 /* INLINE_END */; - } - return 0 /* NONE */; + name: "float", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, float) { + switch (float) { + case "left": + return 1 /* LEFT */; + case "right": + return 2 /* RIGHT */; + case "inline-start": + return 3 /* INLINE_START */; + case "inline-end": + return 4 /* INLINE_END */; } + return 0 /* NONE */; + }, }; var letterSpacing = { - name: 'letter-spacing', - initialValue: '0', - prefix: false, - type: 0 /* VALUE */, - parse: function (_context, token) { - if (token.type === 20 /* IDENT_TOKEN */ && token.value === 'normal') { - return 0; - } - if (token.type === 17 /* NUMBER_TOKEN */) { - return token.number; - } - if (token.type === 15 /* DIMENSION_TOKEN */) { - return token.number; - } - return 0; + name: "letter-spacing", + initialValue: "0", + prefix: false, + type: 0 /* VALUE */, + parse: function (_context, token) { + if (token.type === 20 /* IDENT_TOKEN */ && token.value === "normal") { + return 0; } + if (token.type === 17 /* NUMBER_TOKEN */) { + return token.number; + } + if (token.type === 15 /* DIMENSION_TOKEN */) { + return token.number; + } + return 0; + }, }; var LINE_BREAK; (function (LINE_BREAK) { - LINE_BREAK["NORMAL"] = "normal"; - LINE_BREAK["STRICT"] = "strict"; + LINE_BREAK["NORMAL"] = "normal"; + LINE_BREAK["STRICT"] = "strict"; })(LINE_BREAK || (LINE_BREAK = {})); var lineBreak = { - name: 'line-break', - initialValue: 'normal', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, lineBreak) { - switch (lineBreak) { - case 'strict': - return LINE_BREAK.STRICT; - case 'normal': - default: - return LINE_BREAK.NORMAL; - } + name: "line-break", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, lineBreak) { + switch (lineBreak) { + case "strict": + return LINE_BREAK.STRICT; + case "normal": + default: + return LINE_BREAK.NORMAL; } + }, }; var lineHeight = { - name: 'line-height', - initialValue: 'normal', - prefix: false, - type: 4 /* TOKEN_VALUE */ + name: "line-height", + initialValue: "normal", + prefix: false, + type: 4 /* TOKEN_VALUE */, }; var computeLineHeight = function (token, fontSize) { - if (isIdentToken(token) && token.value === 'normal') { - return 1.2 * fontSize; - } - else if (token.type === 17 /* NUMBER_TOKEN */) { - return fontSize * token.number; - } - else if (isLengthPercentage(token)) { - return getAbsoluteValue(token, fontSize); - } - return fontSize; + if (isIdentToken(token) && token.value === "normal") { + return 1.2 * fontSize; + } else if (token.type === 17 /* NUMBER_TOKEN */) { + return fontSize * token.number; + } else if (isLengthPercentage(token)) { + return getAbsoluteValue(token, fontSize); + } + return fontSize; }; var listStyleImage = { - name: 'list-style-image', - initialValue: 'none', - type: 0 /* VALUE */, - prefix: false, - parse: function (context, token) { - if (token.type === 20 /* IDENT_TOKEN */ && token.value === 'none') { - return null; - } - return image.parse(context, token); + name: "list-style-image", + initialValue: "none", + type: 0 /* VALUE */, + prefix: false, + parse: function (context, token) { + if (token.type === 20 /* IDENT_TOKEN */ && token.value === "none") { + return null; } + return image.parse(context, token); + }, }; var listStylePosition = { - name: 'list-style-position', - initialValue: 'outside', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, position) { - switch (position) { - case 'inside': - return 0 /* INSIDE */; - case 'outside': - default: - return 1 /* OUTSIDE */; - } + name: "list-style-position", + initialValue: "outside", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, position) { + switch (position) { + case "inside": + return 0 /* INSIDE */; + case "outside": + default: + return 1 /* OUTSIDE */; } + }, }; var listStyleType = { - name: 'list-style-type', - initialValue: 'none', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, type) { - switch (type) { - case 'disc': - return 0 /* DISC */; - case 'circle': - return 1 /* CIRCLE */; - case 'square': - return 2 /* SQUARE */; - case 'decimal': - return 3 /* DECIMAL */; - case 'cjk-decimal': - return 4 /* CJK_DECIMAL */; - case 'decimal-leading-zero': - return 5 /* DECIMAL_LEADING_ZERO */; - case 'lower-roman': - return 6 /* LOWER_ROMAN */; - case 'upper-roman': - return 7 /* UPPER_ROMAN */; - case 'lower-greek': - return 8 /* LOWER_GREEK */; - case 'lower-alpha': - return 9 /* LOWER_ALPHA */; - case 'upper-alpha': - return 10 /* UPPER_ALPHA */; - case 'arabic-indic': - return 11 /* ARABIC_INDIC */; - case 'armenian': - return 12 /* ARMENIAN */; - case 'bengali': - return 13 /* BENGALI */; - case 'cambodian': - return 14 /* CAMBODIAN */; - case 'cjk-earthly-branch': - return 15 /* CJK_EARTHLY_BRANCH */; - case 'cjk-heavenly-stem': - return 16 /* CJK_HEAVENLY_STEM */; - case 'cjk-ideographic': - return 17 /* CJK_IDEOGRAPHIC */; - case 'devanagari': - return 18 /* DEVANAGARI */; - case 'ethiopic-numeric': - return 19 /* ETHIOPIC_NUMERIC */; - case 'georgian': - return 20 /* GEORGIAN */; - case 'gujarati': - return 21 /* GUJARATI */; - case 'gurmukhi': - return 22 /* GURMUKHI */; - case 'hebrew': - return 22 /* HEBREW */; - case 'hiragana': - return 23 /* HIRAGANA */; - case 'hiragana-iroha': - return 24 /* HIRAGANA_IROHA */; - case 'japanese-formal': - return 25 /* JAPANESE_FORMAL */; - case 'japanese-informal': - return 26 /* JAPANESE_INFORMAL */; - case 'kannada': - return 27 /* KANNADA */; - case 'katakana': - return 28 /* KATAKANA */; - case 'katakana-iroha': - return 29 /* KATAKANA_IROHA */; - case 'khmer': - return 30 /* KHMER */; - case 'korean-hangul-formal': - return 31 /* KOREAN_HANGUL_FORMAL */; - case 'korean-hanja-formal': - return 32 /* KOREAN_HANJA_FORMAL */; - case 'korean-hanja-informal': - return 33 /* KOREAN_HANJA_INFORMAL */; - case 'lao': - return 34 /* LAO */; - case 'lower-armenian': - return 35 /* LOWER_ARMENIAN */; - case 'malayalam': - return 36 /* MALAYALAM */; - case 'mongolian': - return 37 /* MONGOLIAN */; - case 'myanmar': - return 38 /* MYANMAR */; - case 'oriya': - return 39 /* ORIYA */; - case 'persian': - return 40 /* PERSIAN */; - case 'simp-chinese-formal': - return 41 /* SIMP_CHINESE_FORMAL */; - case 'simp-chinese-informal': - return 42 /* SIMP_CHINESE_INFORMAL */; - case 'tamil': - return 43 /* TAMIL */; - case 'telugu': - return 44 /* TELUGU */; - case 'thai': - return 45 /* THAI */; - case 'tibetan': - return 46 /* TIBETAN */; - case 'trad-chinese-formal': - return 47 /* TRAD_CHINESE_FORMAL */; - case 'trad-chinese-informal': - return 48 /* TRAD_CHINESE_INFORMAL */; - case 'upper-armenian': - return 49 /* UPPER_ARMENIAN */; - case 'disclosure-open': - return 50 /* DISCLOSURE_OPEN */; - case 'disclosure-closed': - return 51 /* DISCLOSURE_CLOSED */; - case 'none': - default: - return -1 /* NONE */; - } + name: "list-style-type", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, type) { + switch (type) { + case "disc": + return 0 /* DISC */; + case "circle": + return 1 /* CIRCLE */; + case "square": + return 2 /* SQUARE */; + case "decimal": + return 3 /* DECIMAL */; + case "cjk-decimal": + return 4 /* CJK_DECIMAL */; + case "decimal-leading-zero": + return 5 /* DECIMAL_LEADING_ZERO */; + case "lower-roman": + return 6 /* LOWER_ROMAN */; + case "upper-roman": + return 7 /* UPPER_ROMAN */; + case "lower-greek": + return 8 /* LOWER_GREEK */; + case "lower-alpha": + return 9 /* LOWER_ALPHA */; + case "upper-alpha": + return 10 /* UPPER_ALPHA */; + case "arabic-indic": + return 11 /* ARABIC_INDIC */; + case "armenian": + return 12 /* ARMENIAN */; + case "bengali": + return 13 /* BENGALI */; + case "cambodian": + return 14 /* CAMBODIAN */; + case "cjk-earthly-branch": + return 15 /* CJK_EARTHLY_BRANCH */; + case "cjk-heavenly-stem": + return 16 /* CJK_HEAVENLY_STEM */; + case "cjk-ideographic": + return 17 /* CJK_IDEOGRAPHIC */; + case "devanagari": + return 18 /* DEVANAGARI */; + case "ethiopic-numeric": + return 19 /* ETHIOPIC_NUMERIC */; + case "georgian": + return 20 /* GEORGIAN */; + case "gujarati": + return 21 /* GUJARATI */; + case "gurmukhi": + return 22 /* GURMUKHI */; + case "hebrew": + return 22 /* HEBREW */; + case "hiragana": + return 23 /* HIRAGANA */; + case "hiragana-iroha": + return 24 /* HIRAGANA_IROHA */; + case "japanese-formal": + return 25 /* JAPANESE_FORMAL */; + case "japanese-informal": + return 26 /* JAPANESE_INFORMAL */; + case "kannada": + return 27 /* KANNADA */; + case "katakana": + return 28 /* KATAKANA */; + case "katakana-iroha": + return 29 /* KATAKANA_IROHA */; + case "khmer": + return 30 /* KHMER */; + case "korean-hangul-formal": + return 31 /* KOREAN_HANGUL_FORMAL */; + case "korean-hanja-formal": + return 32 /* KOREAN_HANJA_FORMAL */; + case "korean-hanja-informal": + return 33 /* KOREAN_HANJA_INFORMAL */; + case "lao": + return 34 /* LAO */; + case "lower-armenian": + return 35 /* LOWER_ARMENIAN */; + case "malayalam": + return 36 /* MALAYALAM */; + case "mongolian": + return 37 /* MONGOLIAN */; + case "myanmar": + return 38 /* MYANMAR */; + case "oriya": + return 39 /* ORIYA */; + case "persian": + return 40 /* PERSIAN */; + case "simp-chinese-formal": + return 41 /* SIMP_CHINESE_FORMAL */; + case "simp-chinese-informal": + return 42 /* SIMP_CHINESE_INFORMAL */; + case "tamil": + return 43 /* TAMIL */; + case "telugu": + return 44 /* TELUGU */; + case "thai": + return 45 /* THAI */; + case "tibetan": + return 46 /* TIBETAN */; + case "trad-chinese-formal": + return 47 /* TRAD_CHINESE_FORMAL */; + case "trad-chinese-informal": + return 48 /* TRAD_CHINESE_INFORMAL */; + case "upper-armenian": + return 49 /* UPPER_ARMENIAN */; + case "disclosure-open": + return 50 /* DISCLOSURE_OPEN */; + case "disclosure-closed": + return 51 /* DISCLOSURE_CLOSED */; + case "none": + default: + return -1 /* NONE */; } + }, }; - var marginForSide = function (side) { return ({ + var marginForSide = function (side) { + return { name: "margin-" + side, - initialValue: '0', + initialValue: "0", prefix: false, - type: 4 /* TOKEN_VALUE */ - }); }; - var marginTop = marginForSide('top'); - var marginRight = marginForSide('right'); - var marginBottom = marginForSide('bottom'); - var marginLeft = marginForSide('left'); + type: 4 /* TOKEN_VALUE */, + }; + }; + var marginTop = marginForSide("top"); + var marginRight = marginForSide("right"); + var marginBottom = marginForSide("bottom"); + var marginLeft = marginForSide("left"); var overflow = { - name: 'overflow', - initialValue: 'visible', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return tokens.filter(isIdentToken).map(function (overflow) { - switch (overflow.value) { - case 'hidden': - return 1 /* HIDDEN */; - case 'scroll': - return 2 /* SCROLL */; - case 'clip': - return 3 /* CLIP */; - case 'auto': - return 4 /* AUTO */; - case 'visible': - default: - return 0 /* VISIBLE */; - } - }); - } + name: "overflow", + initialValue: "visible", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens.filter(isIdentToken).map(function (overflow) { + switch (overflow.value) { + case "hidden": + return 1 /* HIDDEN */; + case "scroll": + return 2 /* SCROLL */; + case "clip": + return 3 /* CLIP */; + case "auto": + return 4 /* AUTO */; + case "visible": + default: + return 0 /* VISIBLE */; + } + }); + }, }; var overflowWrap = { - name: 'overflow-wrap', - initialValue: 'normal', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, overflow) { - switch (overflow) { - case 'break-word': - return "break-word" /* BREAK_WORD */; - case 'normal': - default: - return "normal" /* NORMAL */; - } + name: "overflow-wrap", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, overflow) { + switch (overflow) { + case "break-word": + return "break-word" /* BREAK_WORD */; + case "normal": + default: + return "normal" /* NORMAL */; } + }, }; - var paddingForSide = function (side) { return ({ + var paddingForSide = function (side) { + return { name: "padding-" + side, - initialValue: '0', + initialValue: "0", prefix: false, type: 3 /* TYPE_VALUE */, - format: 'length-percentage' - }); }; - var paddingTop = paddingForSide('top'); - var paddingRight = paddingForSide('right'); - var paddingBottom = paddingForSide('bottom'); - var paddingLeft = paddingForSide('left'); + format: "length-percentage", + }; + }; + var paddingTop = paddingForSide("top"); + var paddingRight = paddingForSide("right"); + var paddingBottom = paddingForSide("bottom"); + var paddingLeft = paddingForSide("left"); var textAlign = { - name: 'text-align', - initialValue: 'left', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, textAlign) { - switch (textAlign) { - case 'right': - return 2 /* RIGHT */; - case 'center': - case 'justify': - return 1 /* CENTER */; - case 'left': - default: - return 0 /* LEFT */; - } + name: "text-align", + initialValue: "left", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, textAlign) { + switch (textAlign) { + case "right": + return 2 /* RIGHT */; + case "center": + case "justify": + return 1 /* CENTER */; + case "left": + default: + return 0 /* LEFT */; } + }, }; var position = { - name: 'position', - initialValue: 'static', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, position) { - switch (position) { - case 'relative': - return 1 /* RELATIVE */; - case 'absolute': - return 2 /* ABSOLUTE */; - case 'fixed': - return 3 /* FIXED */; - case 'sticky': - return 4 /* STICKY */; - } - return 0 /* STATIC */; + name: "position", + initialValue: "static", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, position) { + switch (position) { + case "relative": + return 1 /* RELATIVE */; + case "absolute": + return 2 /* ABSOLUTE */; + case "fixed": + return 3 /* FIXED */; + case "sticky": + return 4 /* STICKY */; } + return 0 /* STATIC */; + }, }; var textShadow = { - name: 'text-shadow', - initialValue: 'none', - type: 1 /* LIST */, - prefix: false, - parse: function (context, tokens) { - if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) { - return []; - } - return parseFunctionArgs(tokens).map(function (values) { - var shadow = { - color: COLORS.TRANSPARENT, - offsetX: ZERO_LENGTH, - offsetY: ZERO_LENGTH, - blur: ZERO_LENGTH - }; - var c = 0; - for (var i = 0; i < values.length; i++) { - var token = values[i]; - if (isLength(token)) { - if (c === 0) { - shadow.offsetX = token; - } - else if (c === 1) { - shadow.offsetY = token; - } - else { - shadow.blur = token; - } - c++; - } - else { - shadow.color = color$1.parse(context, token); - } - } - return shadow; - }); + name: "text-shadow", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (context, tokens) { + if (tokens.length === 1 && isIdentWithValue(tokens[0], "none")) { + return []; } + return parseFunctionArgs(tokens).map(function (values) { + var shadow = { + color: COLORS.TRANSPARENT, + offsetX: ZERO_LENGTH, + offsetY: ZERO_LENGTH, + blur: ZERO_LENGTH, + }; + var c = 0; + for (var i = 0; i < values.length; i++) { + var token = values[i]; + if (isLength(token)) { + if (c === 0) { + shadow.offsetX = token; + } else if (c === 1) { + shadow.offsetY = token; + } else { + shadow.blur = token; + } + c++; + } else { + shadow.color = color$1.parse(context, token); + } + } + return shadow; + }); + }, }; var textTransform = { - name: 'text-transform', - initialValue: 'none', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, textTransform) { - switch (textTransform) { - case 'uppercase': - return 2 /* UPPERCASE */; - case 'lowercase': - return 1 /* LOWERCASE */; - case 'capitalize': - return 3 /* CAPITALIZE */; - } - return 0 /* NONE */; + name: "text-transform", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, textTransform) { + switch (textTransform) { + case "uppercase": + return 2 /* UPPERCASE */; + case "lowercase": + return 1 /* LOWERCASE */; + case "capitalize": + return 3 /* CAPITALIZE */; } + return 0 /* NONE */; + }, }; var transform$1 = { - name: 'transform', - initialValue: 'none', - prefix: true, - type: 0 /* VALUE */, - parse: function (_context, token) { - if (token.type === 20 /* IDENT_TOKEN */ && token.value === 'none') { - return null; - } - if (token.type === 18 /* FUNCTION */) { - var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name]; - if (typeof transformFunction === 'undefined') { - throw new Error("Attempting to parse an unsupported transform function \"" + token.name + "\""); - } - return transformFunction(token.values); - } - return null; + name: "transform", + initialValue: "none", + prefix: true, + type: 0 /* VALUE */, + parse: function (_context, token) { + if (token.type === 20 /* IDENT_TOKEN */ && token.value === "none") { + return null; } + if (token.type === 18 /* FUNCTION */) { + var transformFunction = SUPPORTED_TRANSFORM_FUNCTIONS[token.name]; + if (typeof transformFunction === "undefined") { + throw new Error( + 'Attempting to parse an unsupported transform function "' + + token.name + + '"', + ); + } + return transformFunction(token.values); + } + return null; + }, }; var matrix = function (args) { - var values = args.filter(function (arg) { return arg.type === 17 /* NUMBER_TOKEN */; }).map(function (arg) { return arg.number; }); - return values.length === 6 ? values : null; + var values = args + .filter(function (arg) { + return arg.type === 17 /* NUMBER_TOKEN */; + }) + .map(function (arg) { + return arg.number; + }); + return values.length === 6 ? values : null; }; // doesn't support 3D transforms at the moment var matrix3d = function (args) { - var values = args.filter(function (arg) { return arg.type === 17 /* NUMBER_TOKEN */; }).map(function (arg) { return arg.number; }); - var a1 = values[0], b1 = values[1]; values[2]; values[3]; var a2 = values[4], b2 = values[5]; values[6]; values[7]; values[8]; values[9]; values[10]; values[11]; var a4 = values[12], b4 = values[13]; values[14]; values[15]; - return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null; + var values = args + .filter(function (arg) { + return arg.type === 17 /* NUMBER_TOKEN */; + }) + .map(function (arg) { + return arg.number; + }); + var a1 = values[0], + b1 = values[1]; + values[2]; + values[3]; + var a2 = values[4], + b2 = values[5]; + values[6]; + values[7]; + values[8]; + values[9]; + values[10]; + values[11]; + var a4 = values[12], + b4 = values[13]; + values[14]; + values[15]; + return values.length === 16 ? [a1, b1, a2, b2, a4, b4] : null; }; var SUPPORTED_TRANSFORM_FUNCTIONS = { - matrix: matrix, - matrix3d: matrix3d + matrix: matrix, + matrix3d: matrix3d, }; var DEFAULT_VALUE = { - type: 16 /* PERCENTAGE_TOKEN */, - number: 50, - flags: FLAG_INTEGER + type: 16 /* PERCENTAGE_TOKEN */, + number: 50, + flags: FLAG_INTEGER, }; var DEFAULT = [DEFAULT_VALUE, DEFAULT_VALUE]; var transformOrigin = { - name: 'transform-origin', - initialValue: '50% 50%', - prefix: true, - type: 1 /* LIST */, - parse: function (_context, tokens) { - var origins = tokens.filter(isLengthPercentage); - if (origins.length !== 2) { - return DEFAULT; - } - return [origins[0], origins[1]]; + name: "transform-origin", + initialValue: "50% 50%", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + var origins = tokens.filter(isLengthPercentage); + if (origins.length !== 2) { + return DEFAULT; } + return [origins[0], origins[1]]; + }, }; var visibility = { - name: 'visible', - initialValue: 'none', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, visibility) { - switch (visibility) { - case 'hidden': - return 1 /* HIDDEN */; - case 'collapse': - return 2 /* COLLAPSE */; - case 'visible': - default: - return 0 /* VISIBLE */; - } + name: "visible", + initialValue: "none", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, visibility) { + switch (visibility) { + case "hidden": + return 1 /* HIDDEN */; + case "collapse": + return 2 /* COLLAPSE */; + case "visible": + default: + return 0 /* VISIBLE */; } + }, }; var WORD_BREAK; (function (WORD_BREAK) { - WORD_BREAK["NORMAL"] = "normal"; - WORD_BREAK["BREAK_ALL"] = "break-all"; - WORD_BREAK["KEEP_ALL"] = "keep-all"; + WORD_BREAK["NORMAL"] = "normal"; + WORD_BREAK["BREAK_ALL"] = "break-all"; + WORD_BREAK["KEEP_ALL"] = "keep-all"; })(WORD_BREAK || (WORD_BREAK = {})); var wordBreak = { - name: 'word-break', - initialValue: 'normal', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, wordBreak) { - switch (wordBreak) { - case 'break-all': - return WORD_BREAK.BREAK_ALL; - case 'keep-all': - return WORD_BREAK.KEEP_ALL; - case 'normal': - default: - return WORD_BREAK.NORMAL; - } + name: "word-break", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, wordBreak) { + switch (wordBreak) { + case "break-all": + return WORD_BREAK.BREAK_ALL; + case "keep-all": + return WORD_BREAK.KEEP_ALL; + case "normal": + default: + return WORD_BREAK.NORMAL; } + }, }; var zIndex = { - name: 'z-index', - initialValue: 'auto', - prefix: false, - type: 0 /* VALUE */, - parse: function (_context, token) { - if (token.type === 20 /* IDENT_TOKEN */) { - return { auto: true, order: 0 }; - } - if (isNumberToken(token)) { - return { auto: false, order: token.number }; - } - throw new Error("Invalid z-index number parsed"); + name: "z-index", + initialValue: "auto", + prefix: false, + type: 0 /* VALUE */, + parse: function (_context, token) { + if (token.type === 20 /* IDENT_TOKEN */) { + return { auto: true, order: 0 }; } + if (isNumberToken(token)) { + return { auto: false, order: token.number }; + } + throw new Error("Invalid z-index number parsed"); + }, }; var time = { - name: 'time', - parse: function (_context, value) { - if (value.type === 15 /* DIMENSION_TOKEN */) { - switch (value.unit.toLowerCase()) { - case 's': - return 1000 * value.number; - case 'ms': - return value.number; - } - } - throw new Error("Unsupported time type"); + name: "time", + parse: function (_context, value) { + if (value.type === 15 /* DIMENSION_TOKEN */) { + switch (value.unit.toLowerCase()) { + case "s": + return 1000 * value.number; + case "ms": + return value.number; + } } + throw new Error("Unsupported time type"); + }, }; var opacity = { - name: 'opacity', - initialValue: '1', - type: 0 /* VALUE */, - prefix: false, - parse: function (_context, token) { - if (isNumberToken(token)) { - return token.number; - } - return 1; + name: "opacity", + initialValue: "1", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isNumberToken(token)) { + return token.number; } + return 1; + }, }; var textDecorationColor = { - name: "text-decoration-color", - initialValue: 'transparent', - prefix: false, - type: 3 /* TYPE_VALUE */, - format: 'color' + name: "text-decoration-color", + initialValue: "transparent", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", }; var textDecorationLine = { - name: 'text-decoration-line', - initialValue: 'none', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - return tokens - .filter(isIdentToken) - .map(function (token) { - switch (token.value) { - case 'underline': - return 1 /* UNDERLINE */; - case 'overline': - return 2 /* OVERLINE */; - case 'line-through': - return 3 /* LINE_THROUGH */; - case 'none': - return 4 /* BLINK */; - } - return 0 /* NONE */; - }) - .filter(function (line) { return line !== 0 /* NONE */; }); - } + name: "text-decoration-line", + initialValue: "none", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + return tokens + .filter(isIdentToken) + .map(function (token) { + switch (token.value) { + case "underline": + return 1 /* UNDERLINE */; + case "overline": + return 2 /* OVERLINE */; + case "line-through": + return 3 /* LINE_THROUGH */; + case "none": + return 4 /* BLINK */; + } + return 0 /* NONE */; + }) + .filter(function (line) { + return line !== 0 /* NONE */; + }); + }, }; var fontFamily = { - name: "font-family", - initialValue: '', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - var accumulator = []; - var results = []; - tokens.forEach(function (token) { - switch (token.type) { - case 20 /* IDENT_TOKEN */: - case 0 /* STRING_TOKEN */: - accumulator.push(token.value); - break; - case 17 /* NUMBER_TOKEN */: - accumulator.push(token.number.toString()); - break; - case 4 /* COMMA_TOKEN */: - results.push(accumulator.join(' ')); - accumulator.length = 0; - break; - } - }); - if (accumulator.length) { - results.push(accumulator.join(' ')); - } - return results.map(function (result) { return (result.indexOf(' ') === -1 ? result : "'" + result + "'"); }); + name: "font-family", + initialValue: "", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + var accumulator = []; + var results = []; + tokens.forEach(function (token) { + switch (token.type) { + case 20 /* IDENT_TOKEN */: + case 0 /* STRING_TOKEN */: + accumulator.push(token.value); + break; + case 17 /* NUMBER_TOKEN */: + accumulator.push(token.number.toString()); + break; + case 4 /* COMMA_TOKEN */: + results.push(accumulator.join(" ")); + accumulator.length = 0; + break; + } + }); + if (accumulator.length) { + results.push(accumulator.join(" ")); } + return results.map(function (result) { + return result.indexOf(" ") === -1 ? result : "'" + result + "'"; + }); + }, }; var fontSize = { - name: "font-size", - initialValue: '0', - prefix: false, - type: 3 /* TYPE_VALUE */, - format: 'length' + name: "font-size", + initialValue: "0", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "length", }; var fontWeight = { - name: 'font-weight', - initialValue: 'normal', - type: 0 /* VALUE */, - prefix: false, - parse: function (_context, token) { - if (isNumberToken(token)) { - return token.number; - } - if (isIdentToken(token)) { - switch (token.value) { - case 'bold': - return 700; - case 'normal': - default: - return 400; - } - } - return 400; + name: "font-weight", + initialValue: "normal", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isNumberToken(token)) { + return token.number; } + if (isIdentToken(token)) { + switch (token.value) { + case "bold": + return 700; + case "normal": + default: + return 400; + } + } + return 400; + }, }; var fontVariant = { - name: 'font-variant', - initialValue: 'none', - type: 1 /* LIST */, - prefix: false, - parse: function (_context, tokens) { - return tokens.filter(isIdentToken).map(function (token) { return token.value; }); - } + name: "font-variant", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (_context, tokens) { + return tokens.filter(isIdentToken).map(function (token) { + return token.value; + }); + }, }; var fontStyle = { - name: 'font-style', - initialValue: 'normal', - prefix: false, - type: 2 /* IDENT_VALUE */, - parse: function (_context, overflow) { - switch (overflow) { - case 'oblique': - return "oblique" /* OBLIQUE */; - case 'italic': - return "italic" /* ITALIC */; - case 'normal': - default: - return "normal" /* NORMAL */; - } + name: "font-style", + initialValue: "normal", + prefix: false, + type: 2 /* IDENT_VALUE */, + parse: function (_context, overflow) { + switch (overflow) { + case "oblique": + return "oblique" /* OBLIQUE */; + case "italic": + return "italic" /* ITALIC */; + case "normal": + default: + return "normal" /* NORMAL */; } + }, }; - var contains = function (bit, value) { return (bit & value) !== 0; }; + var contains = function (bit, value) { + return (bit & value) !== 0; + }; var content = { - name: 'content', - initialValue: 'none', - type: 1 /* LIST */, - prefix: false, - parse: function (_context, tokens) { - if (tokens.length === 0) { - return []; - } - var first = tokens[0]; - if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') { - return []; - } - return tokens; + name: "content", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return []; } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return []; + } + return tokens; + }, }; var counterIncrement = { - name: 'counter-increment', - initialValue: 'none', - prefix: true, - type: 1 /* LIST */, - parse: function (_context, tokens) { - if (tokens.length === 0) { - return null; - } - var first = tokens[0]; - if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') { - return null; - } - var increments = []; - var filtered = tokens.filter(nonWhiteSpace); - for (var i = 0; i < filtered.length; i++) { - var counter = filtered[i]; - var next = filtered[i + 1]; - if (counter.type === 20 /* IDENT_TOKEN */) { - var increment = next && isNumberToken(next) ? next.number : 1; - increments.push({ counter: counter.value, increment: increment }); - } - } - return increments; + name: "counter-increment", + initialValue: "none", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return null; } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return null; + } + var increments = []; + var filtered = tokens.filter(nonWhiteSpace); + for (var i = 0; i < filtered.length; i++) { + var counter = filtered[i]; + var next = filtered[i + 1]; + if (counter.type === 20 /* IDENT_TOKEN */) { + var increment = next && isNumberToken(next) ? next.number : 1; + increments.push({ counter: counter.value, increment: increment }); + } + } + return increments; + }, }; var counterReset = { - name: 'counter-reset', - initialValue: 'none', - prefix: true, - type: 1 /* LIST */, - parse: function (_context, tokens) { - if (tokens.length === 0) { - return []; - } - var resets = []; - var filtered = tokens.filter(nonWhiteSpace); - for (var i = 0; i < filtered.length; i++) { - var counter = filtered[i]; - var next = filtered[i + 1]; - if (isIdentToken(counter) && counter.value !== 'none') { - var reset = next && isNumberToken(next) ? next.number : 0; - resets.push({ counter: counter.value, reset: reset }); - } - } - return resets; + name: "counter-reset", + initialValue: "none", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return []; } + var resets = []; + var filtered = tokens.filter(nonWhiteSpace); + for (var i = 0; i < filtered.length; i++) { + var counter = filtered[i]; + var next = filtered[i + 1]; + if (isIdentToken(counter) && counter.value !== "none") { + var reset = next && isNumberToken(next) ? next.number : 0; + resets.push({ counter: counter.value, reset: reset }); + } + } + return resets; + }, }; var duration = { - name: 'duration', - initialValue: '0s', - prefix: false, - type: 1 /* LIST */, - parse: function (context, tokens) { - return tokens.filter(isDimensionToken).map(function (token) { return time.parse(context, token); }); - } + name: "duration", + initialValue: "0s", + prefix: false, + type: 1 /* LIST */, + parse: function (context, tokens) { + return tokens.filter(isDimensionToken).map(function (token) { + return time.parse(context, token); + }); + }, }; var quotes = { - name: 'quotes', - initialValue: 'none', - prefix: true, - type: 1 /* LIST */, - parse: function (_context, tokens) { - if (tokens.length === 0) { - return null; - } - var first = tokens[0]; - if (first.type === 20 /* IDENT_TOKEN */ && first.value === 'none') { - return null; - } - var quotes = []; - var filtered = tokens.filter(isStringToken); - if (filtered.length % 2 !== 0) { - return null; - } - for (var i = 0; i < filtered.length; i += 2) { - var open_1 = filtered[i].value; - var close_1 = filtered[i + 1].value; - quotes.push({ open: open_1, close: close_1 }); - } - return quotes; + name: "quotes", + initialValue: "none", + prefix: true, + type: 1 /* LIST */, + parse: function (_context, tokens) { + if (tokens.length === 0) { + return null; } + var first = tokens[0]; + if (first.type === 20 /* IDENT_TOKEN */ && first.value === "none") { + return null; + } + var quotes = []; + var filtered = tokens.filter(isStringToken); + if (filtered.length % 2 !== 0) { + return null; + } + for (var i = 0; i < filtered.length; i += 2) { + var open_1 = filtered[i].value; + var close_1 = filtered[i + 1].value; + quotes.push({ open: open_1, close: close_1 }); + } + return quotes; + }, }; var getQuote = function (quotes, depth, open) { - if (!quotes) { - return ''; - } - var quote = quotes[Math.min(depth, quotes.length - 1)]; - if (!quote) { - return ''; - } - return open ? quote.open : quote.close; + if (!quotes) { + return ""; + } + var quote = quotes[Math.min(depth, quotes.length - 1)]; + if (!quote) { + return ""; + } + return open ? quote.open : quote.close; }; var boxShadow = { - name: 'box-shadow', - initialValue: 'none', - type: 1 /* LIST */, - prefix: false, - parse: function (context, tokens) { - if (tokens.length === 1 && isIdentWithValue(tokens[0], 'none')) { - return []; - } - return parseFunctionArgs(tokens).map(function (values) { - var shadow = { - color: 0x000000ff, - offsetX: ZERO_LENGTH, - offsetY: ZERO_LENGTH, - blur: ZERO_LENGTH, - spread: ZERO_LENGTH, - inset: false - }; - var c = 0; - for (var i = 0; i < values.length; i++) { - var token = values[i]; - if (isIdentWithValue(token, 'inset')) { - shadow.inset = true; - } - else if (isLength(token)) { - if (c === 0) { - shadow.offsetX = token; - } - else if (c === 1) { - shadow.offsetY = token; - } - else if (c === 2) { - shadow.blur = token; - } - else { - shadow.spread = token; - } - c++; - } - else { - shadow.color = color$1.parse(context, token); - } - } - return shadow; - }); + name: "box-shadow", + initialValue: "none", + type: 1 /* LIST */, + prefix: false, + parse: function (context, tokens) { + if (tokens.length === 1 && isIdentWithValue(tokens[0], "none")) { + return []; } + return parseFunctionArgs(tokens).map(function (values) { + var shadow = { + color: 0x000000ff, + offsetX: ZERO_LENGTH, + offsetY: ZERO_LENGTH, + blur: ZERO_LENGTH, + spread: ZERO_LENGTH, + inset: false, + }; + var c = 0; + for (var i = 0; i < values.length; i++) { + var token = values[i]; + if (isIdentWithValue(token, "inset")) { + shadow.inset = true; + } else if (isLength(token)) { + if (c === 0) { + shadow.offsetX = token; + } else if (c === 1) { + shadow.offsetY = token; + } else if (c === 2) { + shadow.blur = token; + } else { + shadow.spread = token; + } + c++; + } else { + shadow.color = color$1.parse(context, token); + } + } + return shadow; + }); + }, }; var paintOrder = { - name: 'paint-order', - initialValue: 'normal', - prefix: false, - type: 1 /* LIST */, - parse: function (_context, tokens) { - var DEFAULT_VALUE = [0 /* FILL */, 1 /* STROKE */, 2 /* MARKERS */]; - var layers = []; - tokens.filter(isIdentToken).forEach(function (token) { - switch (token.value) { - case 'stroke': - layers.push(1 /* STROKE */); - break; - case 'fill': - layers.push(0 /* FILL */); - break; - case 'markers': - layers.push(2 /* MARKERS */); - break; - } - }); - DEFAULT_VALUE.forEach(function (value) { - if (layers.indexOf(value) === -1) { - layers.push(value); - } - }); - return layers; - } + name: "paint-order", + initialValue: "normal", + prefix: false, + type: 1 /* LIST */, + parse: function (_context, tokens) { + var DEFAULT_VALUE = [0 /* FILL */, 1 /* STROKE */, 2 /* MARKERS */]; + var layers = []; + tokens.filter(isIdentToken).forEach(function (token) { + switch (token.value) { + case "stroke": + layers.push(1 /* STROKE */); + break; + case "fill": + layers.push(0 /* FILL */); + break; + case "markers": + layers.push(2 /* MARKERS */); + break; + } + }); + DEFAULT_VALUE.forEach(function (value) { + if (layers.indexOf(value) === -1) { + layers.push(value); + } + }); + return layers; + }, }; var webkitTextStrokeColor = { - name: "-webkit-text-stroke-color", - initialValue: 'currentcolor', - prefix: false, - type: 3 /* TYPE_VALUE */, - format: 'color' + name: "-webkit-text-stroke-color", + initialValue: "currentcolor", + prefix: false, + type: 3 /* TYPE_VALUE */, + format: "color", }; var webkitTextStrokeWidth = { - name: "-webkit-text-stroke-width", - initialValue: '0', - type: 0 /* VALUE */, - prefix: false, - parse: function (_context, token) { - if (isDimensionToken(token)) { - return token.number; - } - return 0; + name: "-webkit-text-stroke-width", + initialValue: "0", + type: 0 /* VALUE */, + prefix: false, + parse: function (_context, token) { + if (isDimensionToken(token)) { + return token.number; } + return 0; + }, }; var CSSParsedDeclaration = /** @class */ (function () { - function CSSParsedDeclaration(context, declaration) { - var _a, _b; - this.animationDuration = parse(context, duration, declaration.animationDuration); - this.backgroundClip = parse(context, backgroundClip, declaration.backgroundClip); - this.backgroundColor = parse(context, backgroundColor, declaration.backgroundColor); - this.backgroundImage = parse(context, backgroundImage, declaration.backgroundImage); - this.backgroundOrigin = parse(context, backgroundOrigin, declaration.backgroundOrigin); - this.backgroundPosition = parse(context, backgroundPosition, declaration.backgroundPosition); - this.backgroundRepeat = parse(context, backgroundRepeat, declaration.backgroundRepeat); - this.backgroundSize = parse(context, backgroundSize, declaration.backgroundSize); - this.borderTopColor = parse(context, borderTopColor, declaration.borderTopColor); - this.borderRightColor = parse(context, borderRightColor, declaration.borderRightColor); - this.borderBottomColor = parse(context, borderBottomColor, declaration.borderBottomColor); - this.borderLeftColor = parse(context, borderLeftColor, declaration.borderLeftColor); - this.borderTopLeftRadius = parse(context, borderTopLeftRadius, declaration.borderTopLeftRadius); - this.borderTopRightRadius = parse(context, borderTopRightRadius, declaration.borderTopRightRadius); - this.borderBottomRightRadius = parse(context, borderBottomRightRadius, declaration.borderBottomRightRadius); - this.borderBottomLeftRadius = parse(context, borderBottomLeftRadius, declaration.borderBottomLeftRadius); - this.borderTopStyle = parse(context, borderTopStyle, declaration.borderTopStyle); - this.borderRightStyle = parse(context, borderRightStyle, declaration.borderRightStyle); - this.borderBottomStyle = parse(context, borderBottomStyle, declaration.borderBottomStyle); - this.borderLeftStyle = parse(context, borderLeftStyle, declaration.borderLeftStyle); - this.borderTopWidth = parse(context, borderTopWidth, declaration.borderTopWidth); - this.borderRightWidth = parse(context, borderRightWidth, declaration.borderRightWidth); - this.borderBottomWidth = parse(context, borderBottomWidth, declaration.borderBottomWidth); - this.borderLeftWidth = parse(context, borderLeftWidth, declaration.borderLeftWidth); - this.boxShadow = parse(context, boxShadow, declaration.boxShadow); - this.color = parse(context, color, declaration.color); - this.direction = parse(context, direction, declaration.direction); - this.display = parse(context, display, declaration.display); - this.float = parse(context, float, declaration.cssFloat); - this.fontFamily = parse(context, fontFamily, declaration.fontFamily); - this.fontSize = parse(context, fontSize, declaration.fontSize); - this.fontStyle = parse(context, fontStyle, declaration.fontStyle); - this.fontVariant = parse(context, fontVariant, declaration.fontVariant); - this.fontWeight = parse(context, fontWeight, declaration.fontWeight); - this.letterSpacing = parse(context, letterSpacing, declaration.letterSpacing); - this.lineBreak = parse(context, lineBreak, declaration.lineBreak); - this.lineHeight = parse(context, lineHeight, declaration.lineHeight); - this.listStyleImage = parse(context, listStyleImage, declaration.listStyleImage); - this.listStylePosition = parse(context, listStylePosition, declaration.listStylePosition); - this.listStyleType = parse(context, listStyleType, declaration.listStyleType); - this.marginTop = parse(context, marginTop, declaration.marginTop); - this.marginRight = parse(context, marginRight, declaration.marginRight); - this.marginBottom = parse(context, marginBottom, declaration.marginBottom); - this.marginLeft = parse(context, marginLeft, declaration.marginLeft); - this.opacity = parse(context, opacity, declaration.opacity); - var overflowTuple = parse(context, overflow, declaration.overflow); - this.overflowX = overflowTuple[0]; - this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0]; - this.overflowWrap = parse(context, overflowWrap, declaration.overflowWrap); - this.paddingTop = parse(context, paddingTop, declaration.paddingTop); - this.paddingRight = parse(context, paddingRight, declaration.paddingRight); - this.paddingBottom = parse(context, paddingBottom, declaration.paddingBottom); - this.paddingLeft = parse(context, paddingLeft, declaration.paddingLeft); - this.paintOrder = parse(context, paintOrder, declaration.paintOrder); - this.position = parse(context, position, declaration.position); - this.textAlign = parse(context, textAlign, declaration.textAlign); - this.textDecorationColor = parse(context, textDecorationColor, (_a = declaration.textDecorationColor) !== null && _a !== void 0 ? _a : declaration.color); - this.textDecorationLine = parse(context, textDecorationLine, (_b = declaration.textDecorationLine) !== null && _b !== void 0 ? _b : declaration.textDecoration); - this.textShadow = parse(context, textShadow, declaration.textShadow); - this.textTransform = parse(context, textTransform, declaration.textTransform); - this.transform = parse(context, transform$1, declaration.transform); - this.transformOrigin = parse(context, transformOrigin, declaration.transformOrigin); - this.visibility = parse(context, visibility, declaration.visibility); - this.webkitTextStrokeColor = parse(context, webkitTextStrokeColor, declaration.webkitTextStrokeColor); - this.webkitTextStrokeWidth = parse(context, webkitTextStrokeWidth, declaration.webkitTextStrokeWidth); - this.wordBreak = parse(context, wordBreak, declaration.wordBreak); - this.zIndex = parse(context, zIndex, declaration.zIndex); - } - CSSParsedDeclaration.prototype.isVisible = function () { - return this.display > 0 && this.opacity > 0 && this.visibility === 0 /* VISIBLE */; - }; - CSSParsedDeclaration.prototype.isTransparent = function () { - return isTransparent(this.backgroundColor); - }; - CSSParsedDeclaration.prototype.isTransformed = function () { - return this.transform !== null; - }; - CSSParsedDeclaration.prototype.isPositioned = function () { - return this.position !== 0 /* STATIC */; - }; - CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () { - return this.isPositioned() && !this.zIndex.auto; - }; - CSSParsedDeclaration.prototype.isFloating = function () { - return this.float !== 0 /* NONE */; - }; - CSSParsedDeclaration.prototype.isInlineLevel = function () { - return (contains(this.display, 4 /* INLINE */) || - contains(this.display, 33554432 /* INLINE_BLOCK */) || - contains(this.display, 268435456 /* INLINE_FLEX */) || - contains(this.display, 536870912 /* INLINE_GRID */) || - contains(this.display, 67108864 /* INLINE_LIST_ITEM */) || - contains(this.display, 134217728 /* INLINE_TABLE */)); - }; - return CSSParsedDeclaration; - }()); + function CSSParsedDeclaration(context, declaration) { + var _a, _b; + this.animationDuration = parse( + context, + duration, + declaration.animationDuration, + ); + this.backgroundClip = parse( + context, + backgroundClip, + declaration.backgroundClip, + ); + this.backgroundColor = parse( + context, + backgroundColor, + declaration.backgroundColor, + ); + this.backgroundImage = parse( + context, + backgroundImage, + declaration.backgroundImage, + ); + this.backgroundOrigin = parse( + context, + backgroundOrigin, + declaration.backgroundOrigin, + ); + this.backgroundPosition = parse( + context, + backgroundPosition, + declaration.backgroundPosition, + ); + this.backgroundRepeat = parse( + context, + backgroundRepeat, + declaration.backgroundRepeat, + ); + this.backgroundSize = parse( + context, + backgroundSize, + declaration.backgroundSize, + ); + this.borderTopColor = parse( + context, + borderTopColor, + declaration.borderTopColor, + ); + this.borderRightColor = parse( + context, + borderRightColor, + declaration.borderRightColor, + ); + this.borderBottomColor = parse( + context, + borderBottomColor, + declaration.borderBottomColor, + ); + this.borderLeftColor = parse( + context, + borderLeftColor, + declaration.borderLeftColor, + ); + this.borderTopLeftRadius = parse( + context, + borderTopLeftRadius, + declaration.borderTopLeftRadius, + ); + this.borderTopRightRadius = parse( + context, + borderTopRightRadius, + declaration.borderTopRightRadius, + ); + this.borderBottomRightRadius = parse( + context, + borderBottomRightRadius, + declaration.borderBottomRightRadius, + ); + this.borderBottomLeftRadius = parse( + context, + borderBottomLeftRadius, + declaration.borderBottomLeftRadius, + ); + this.borderTopStyle = parse( + context, + borderTopStyle, + declaration.borderTopStyle, + ); + this.borderRightStyle = parse( + context, + borderRightStyle, + declaration.borderRightStyle, + ); + this.borderBottomStyle = parse( + context, + borderBottomStyle, + declaration.borderBottomStyle, + ); + this.borderLeftStyle = parse( + context, + borderLeftStyle, + declaration.borderLeftStyle, + ); + this.borderTopWidth = parse( + context, + borderTopWidth, + declaration.borderTopWidth, + ); + this.borderRightWidth = parse( + context, + borderRightWidth, + declaration.borderRightWidth, + ); + this.borderBottomWidth = parse( + context, + borderBottomWidth, + declaration.borderBottomWidth, + ); + this.borderLeftWidth = parse( + context, + borderLeftWidth, + declaration.borderLeftWidth, + ); + this.boxShadow = parse(context, boxShadow, declaration.boxShadow); + this.color = parse(context, color, declaration.color); + this.direction = parse(context, direction, declaration.direction); + this.display = parse(context, display, declaration.display); + this.float = parse(context, float, declaration.cssFloat); + this.fontFamily = parse(context, fontFamily, declaration.fontFamily); + this.fontSize = parse(context, fontSize, declaration.fontSize); + this.fontStyle = parse(context, fontStyle, declaration.fontStyle); + this.fontVariant = parse( + context, + fontVariant, + declaration.fontVariant, + ); + this.fontWeight = parse(context, fontWeight, declaration.fontWeight); + this.letterSpacing = parse( + context, + letterSpacing, + declaration.letterSpacing, + ); + this.lineBreak = parse(context, lineBreak, declaration.lineBreak); + this.lineHeight = parse(context, lineHeight, declaration.lineHeight); + this.listStyleImage = parse( + context, + listStyleImage, + declaration.listStyleImage, + ); + this.listStylePosition = parse( + context, + listStylePosition, + declaration.listStylePosition, + ); + this.listStyleType = parse( + context, + listStyleType, + declaration.listStyleType, + ); + this.marginTop = parse(context, marginTop, declaration.marginTop); + this.marginRight = parse( + context, + marginRight, + declaration.marginRight, + ); + this.marginBottom = parse( + context, + marginBottom, + declaration.marginBottom, + ); + this.marginLeft = parse(context, marginLeft, declaration.marginLeft); + this.opacity = parse(context, opacity, declaration.opacity); + var overflowTuple = parse(context, overflow, declaration.overflow); + this.overflowX = overflowTuple[0]; + this.overflowY = overflowTuple[overflowTuple.length > 1 ? 1 : 0]; + this.overflowWrap = parse( + context, + overflowWrap, + declaration.overflowWrap, + ); + this.paddingTop = parse(context, paddingTop, declaration.paddingTop); + this.paddingRight = parse( + context, + paddingRight, + declaration.paddingRight, + ); + this.paddingBottom = parse( + context, + paddingBottom, + declaration.paddingBottom, + ); + this.paddingLeft = parse( + context, + paddingLeft, + declaration.paddingLeft, + ); + this.paintOrder = parse(context, paintOrder, declaration.paintOrder); + this.position = parse(context, position, declaration.position); + this.textAlign = parse(context, textAlign, declaration.textAlign); + this.textDecorationColor = parse( + context, + textDecorationColor, + (_a = declaration.textDecorationColor) !== null && _a !== void 0 + ? _a + : declaration.color, + ); + this.textDecorationLine = parse( + context, + textDecorationLine, + (_b = declaration.textDecorationLine) !== null && _b !== void 0 + ? _b + : declaration.textDecoration, + ); + this.textShadow = parse(context, textShadow, declaration.textShadow); + this.textTransform = parse( + context, + textTransform, + declaration.textTransform, + ); + this.transform = parse(context, transform$1, declaration.transform); + this.transformOrigin = parse( + context, + transformOrigin, + declaration.transformOrigin, + ); + this.visibility = parse(context, visibility, declaration.visibility); + this.webkitTextStrokeColor = parse( + context, + webkitTextStrokeColor, + declaration.webkitTextStrokeColor, + ); + this.webkitTextStrokeWidth = parse( + context, + webkitTextStrokeWidth, + declaration.webkitTextStrokeWidth, + ); + this.wordBreak = parse(context, wordBreak, declaration.wordBreak); + this.zIndex = parse(context, zIndex, declaration.zIndex); + } + CSSParsedDeclaration.prototype.isVisible = function () { + return ( + this.display > 0 && + this.opacity > 0 && + this.visibility === 0 /* VISIBLE */ + ); + }; + CSSParsedDeclaration.prototype.isTransparent = function () { + return isTransparent(this.backgroundColor); + }; + CSSParsedDeclaration.prototype.isTransformed = function () { + return this.transform !== null; + }; + CSSParsedDeclaration.prototype.isPositioned = function () { + return this.position !== 0 /* STATIC */; + }; + CSSParsedDeclaration.prototype.isPositionedWithZIndex = function () { + return this.isPositioned() && !this.zIndex.auto; + }; + CSSParsedDeclaration.prototype.isFloating = function () { + return this.float !== 0 /* NONE */; + }; + CSSParsedDeclaration.prototype.isInlineLevel = function () { + return ( + contains(this.display, 4 /* INLINE */) || + contains(this.display, 33554432 /* INLINE_BLOCK */) || + contains(this.display, 268435456 /* INLINE_FLEX */) || + contains(this.display, 536870912 /* INLINE_GRID */) || + contains(this.display, 67108864 /* INLINE_LIST_ITEM */) || + contains(this.display, 134217728 /* INLINE_TABLE */) + ); + }; + return CSSParsedDeclaration; + })(); var CSSParsedPseudoDeclaration = /** @class */ (function () { - function CSSParsedPseudoDeclaration(context, declaration) { - this.content = parse(context, content, declaration.content); - this.quotes = parse(context, quotes, declaration.quotes); - } - return CSSParsedPseudoDeclaration; - }()); + function CSSParsedPseudoDeclaration(context, declaration) { + this.content = parse(context, content, declaration.content); + this.quotes = parse(context, quotes, declaration.quotes); + } + return CSSParsedPseudoDeclaration; + })(); var CSSParsedCounterDeclaration = /** @class */ (function () { - function CSSParsedCounterDeclaration(context, declaration) { - this.counterIncrement = parse(context, counterIncrement, declaration.counterIncrement); - this.counterReset = parse(context, counterReset, declaration.counterReset); - } - return CSSParsedCounterDeclaration; - }()); + function CSSParsedCounterDeclaration(context, declaration) { + this.counterIncrement = parse( + context, + counterIncrement, + declaration.counterIncrement, + ); + this.counterReset = parse( + context, + counterReset, + declaration.counterReset, + ); + } + return CSSParsedCounterDeclaration; + })(); // eslint-disable-next-line @typescript-eslint/no-explicit-any var parse = function (context, descriptor, style) { - var tokenizer = new Tokenizer(); - var value = style !== null && typeof style !== 'undefined' ? style.toString() : descriptor.initialValue; - tokenizer.write(value); - var parser = new Parser(tokenizer.read()); - switch (descriptor.type) { - case 2 /* IDENT_VALUE */: - var token = parser.parseComponentValue(); - return descriptor.parse(context, isIdentToken(token) ? token.value : descriptor.initialValue); - case 0 /* VALUE */: - return descriptor.parse(context, parser.parseComponentValue()); - case 1 /* LIST */: - return descriptor.parse(context, parser.parseComponentValues()); - case 4 /* TOKEN_VALUE */: - return parser.parseComponentValue(); - case 3 /* TYPE_VALUE */: - switch (descriptor.format) { - case 'angle': - return angle.parse(context, parser.parseComponentValue()); - case 'color': - return color$1.parse(context, parser.parseComponentValue()); - case 'image': - return image.parse(context, parser.parseComponentValue()); - case 'length': - var length_1 = parser.parseComponentValue(); - return isLength(length_1) ? length_1 : ZERO_LENGTH; - case 'length-percentage': - var value_1 = parser.parseComponentValue(); - return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH; - case 'time': - return time.parse(context, parser.parseComponentValue()); - } - break; - } + var tokenizer = new Tokenizer(); + var value = + style !== null && typeof style !== "undefined" + ? style.toString() + : descriptor.initialValue; + tokenizer.write(value); + var parser = new Parser(tokenizer.read()); + switch (descriptor.type) { + case 2 /* IDENT_VALUE */: + var token = parser.parseComponentValue(); + return descriptor.parse( + context, + isIdentToken(token) ? token.value : descriptor.initialValue, + ); + case 0 /* VALUE */: + return descriptor.parse(context, parser.parseComponentValue()); + case 1 /* LIST */: + return descriptor.parse(context, parser.parseComponentValues()); + case 4 /* TOKEN_VALUE */: + return parser.parseComponentValue(); + case 3 /* TYPE_VALUE */: + switch (descriptor.format) { + case "angle": + return angle.parse(context, parser.parseComponentValue()); + case "color": + return color$1.parse(context, parser.parseComponentValue()); + case "image": + return image.parse(context, parser.parseComponentValue()); + case "length": + var length_1 = parser.parseComponentValue(); + return isLength(length_1) ? length_1 : ZERO_LENGTH; + case "length-percentage": + var value_1 = parser.parseComponentValue(); + return isLengthPercentage(value_1) ? value_1 : ZERO_LENGTH; + case "time": + return time.parse(context, parser.parseComponentValue()); + } + break; + } }; - var elementDebuggerAttribute = 'data-html2canvas-debug'; + var elementDebuggerAttribute = "data-html2canvas-debug"; var getElementDebugType = function (element) { - var attribute = element.getAttribute(elementDebuggerAttribute); - switch (attribute) { - case 'all': - return 1 /* ALL */; - case 'clone': - return 2 /* CLONE */; - case 'parse': - return 3 /* PARSE */; - case 'render': - return 4 /* RENDER */; - default: - return 0 /* NONE */; - } + var attribute = element.getAttribute(elementDebuggerAttribute); + switch (attribute) { + case "all": + return 1 /* ALL */; + case "clone": + return 2 /* CLONE */; + case "parse": + return 3 /* PARSE */; + case "render": + return 4 /* RENDER */; + default: + return 0 /* NONE */; + } }; var isDebugging = function (element, type) { - var elementType = getElementDebugType(element); - return elementType === 1 /* ALL */ || type === elementType; + var elementType = getElementDebugType(element); + return elementType === 1 /* ALL */ || type === elementType; }; var ElementContainer = /** @class */ (function () { - function ElementContainer(context, element) { - this.context = context; - this.textNodes = []; - this.elements = []; - this.flags = 0; - if (isDebugging(element, 3 /* PARSE */)) { - debugger; - } - this.styles = new CSSParsedDeclaration(context, window.getComputedStyle(element, null)); - if (isHTMLElementNode(element)) { - if (this.styles.animationDuration.some(function (duration) { return duration > 0; })) { - element.style.animationDuration = '0s'; - } - if (this.styles.transform !== null) { - // getBoundingClientRect takes transforms into account - element.style.transform = 'none'; - } - } - this.bounds = parseBounds(this.context, element); - if (isDebugging(element, 4 /* RENDER */)) { - this.flags |= 16 /* DEBUG_RENDER */; - } + function ElementContainer(context, element) { + this.context = context; + this.textNodes = []; + this.elements = []; + this.flags = 0; + if (isDebugging(element, 3 /* PARSE */)) { + debugger; } - return ElementContainer; - }()); + this.styles = new CSSParsedDeclaration( + context, + window.getComputedStyle(element, null), + ); + if (isHTMLElementNode(element)) { + if ( + this.styles.animationDuration.some(function (duration) { + return duration > 0; + }) + ) { + element.style.animationDuration = "0s"; + } + if (this.styles.transform !== null) { + // getBoundingClientRect takes transforms into account + element.style.transform = "none"; + } + } + this.bounds = parseBounds(this.context, element); + if (isDebugging(element, 4 /* RENDER */)) { + this.flags |= 16 /* DEBUG_RENDER */; + } + } + return ElementContainer; + })(); /* * text-segmentation 1.0.3 * Copyright (c) 2022 Niklas von Hertzen * Released under MIT License */ - var base64 = 'AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA='; + var base64 = + "AAAAAAAAAAAAEA4AGBkAAFAaAAACAAAAAAAIABAAGAAwADgACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAIABAAQABIAEQATAAIABAACAAQAAgAEAAIABAAVABcAAgAEAAIABAACAAQAGAAaABwAHgAgACIAI4AlgAIABAAmwCjAKgAsAC2AL4AvQDFAMoA0gBPAVYBWgEIAAgACACMANoAYgFkAWwBdAF8AX0BhQGNAZUBlgGeAaMBlQGWAasBswF8AbsBwwF0AcsBYwHTAQgA2wG/AOMBdAF8AekB8QF0AfkB+wHiAHQBfAEIAAMC5gQIAAsCEgIIAAgAFgIeAggAIgIpAggAMQI5AkACygEIAAgASAJQAlgCYAIIAAgACAAKBQoFCgUTBRMFGQUrBSsFCAAIAAgACAAIAAgACAAIAAgACABdAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABoAmgCrwGvAQgAbgJ2AggAHgEIAAgACADnAXsCCAAIAAgAgwIIAAgACAAIAAgACACKAggAkQKZAggAPADJAAgAoQKkAqwCsgK6AsICCADJAggA0AIIAAgACAAIANYC3gIIAAgACAAIAAgACABAAOYCCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAkASoB+QIEAAgACAA8AEMCCABCBQgACABJBVAFCAAIAAgACAAIAAgACAAIAAgACABTBVoFCAAIAFoFCABfBWUFCAAIAAgACAAIAAgAbQUIAAgACAAIAAgACABzBXsFfQWFBYoFigWKBZEFigWKBYoFmAWfBaYFrgWxBbkFCAAIAAgACAAIAAgACAAIAAgACAAIAMEFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAMgFCADQBQgACAAIAAgACAAIAAgACAAIAAgACAAIAO4CCAAIAAgAiQAIAAgACABAAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAD0AggACAD8AggACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIANYFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAMDvwAIAAgAJAIIAAgACAAIAAgACAAIAAgACwMTAwgACAB9BOsEGwMjAwgAKwMyAwsFYgE3A/MEPwMIAEUDTQNRAwgAWQOsAGEDCAAIAAgACAAIAAgACABpAzQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFOgU0BTUFNgU3BTgFOQU6BTQFNQU2BTcFOAU5BToFNAU1BTYFNwU4BTkFIQUoBSwFCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABtAwgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABMAEwACAAIAAgACAAIABgACAAIAAgACAC/AAgACAAyAQgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACAAIAAwAAgACAAIAAgACAAIAAgACAAIAAAARABIAAgACAAIABQASAAIAAgAIABwAEAAjgCIABsAqAC2AL0AigDQAtwC+IJIQqVAZUBWQqVAZUBlQGVAZUBlQGrC5UBlQGVAZUBlQGVAZUBlQGVAXsKlQGVAbAK6wsrDGUMpQzlDJUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAZUBlQGVAfAKAAuZA64AtwCJALoC6ADwAAgAuACgA/oEpgO6AqsD+AAIAAgAswMIAAgACAAIAIkAuwP5AfsBwwPLAwgACAAIAAgACADRA9kDCAAIAOED6QMIAAgACAAIAAgACADuA/YDCAAIAP4DyQAIAAgABgQIAAgAXQAOBAgACAAIAAgACAAIABMECAAIAAgACAAIAAgACAD8AAQBCAAIAAgAGgQiBCoECAExBAgAEAEIAAgACAAIAAgACAAIAAgACAAIAAgACAA4BAgACABABEYECAAIAAgATAQYAQgAVAQIAAgACAAIAAgACAAIAAgACAAIAFoECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAOQEIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAB+BAcACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAEABhgSMBAgACAAIAAgAlAQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAwAEAAQABAADAAMAAwADAAQABAAEAAQABAAEAAQABHATAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAdQMIAAgACAAIAAgACAAIAMkACAAIAAgAfQMIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACACFA4kDCAAIAAgACAAIAOcBCAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAIcDCAAIAAgACAAIAAgACAAIAAgACAAIAJEDCAAIAAgACADFAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABgBAgAZgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAbAQCBXIECAAIAHkECAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACABAAJwEQACjBKoEsgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAC6BMIECAAIAAgACAAIAAgACABmBAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAxwQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAGYECAAIAAgAzgQIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBd0FXwUIAOIF6gXxBYoF3gT5BQAGCAaKBYoFigWKBYoFigWKBYoFigWKBYoFigXWBIoFigWKBYoFigWKBYoFigWKBYsFEAaKBYoFigWKBYoFigWKBRQGCACKBYoFigWKBQgACAAIANEECAAIABgGigUgBggAJgYIAC4GMwaKBYoF0wQ3Bj4GigWKBYoFigWKBYoFigWKBYoFigWKBYoFigUIAAgACAAIAAgACAAIAAgAigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWKBYoFigWLBf///////wQABAAEAAQABAAEAAQABAAEAAQAAwAEAAQAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAQADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUAAAAFAAUAAAAFAAUAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUAAQAAAAUABQAFAAUABQAFAAAAAAAFAAUAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAFAAUAAQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAAABwAHAAcAAAAHAAcABwAFAAEAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAcABwAFAAUAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAAAAQABAAAAAAAAAAAAAAAFAAUABQAFAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAHAAcAAAAHAAcAAAAAAAUABQAHAAUAAQAHAAEABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwABAAUABQAFAAUAAAAAAAAAAAAAAAEAAQABAAEAAQABAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABQANAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAEAAQABAAEAAQABAAEAAQABAAEAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAABQAHAAUABQAFAAAAAAAAAAcABQAFAAUABQAFAAQABAAEAAQABAAEAAQABAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUAAAAFAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAUAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAcABwAFAAcABwAAAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUABwAHAAUABQAFAAUAAAAAAAcABwAAAAAABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAABQAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAAAAAAAAAAABQAFAAAAAAAFAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAFAAUABQAFAAUAAAAFAAUABwAAAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABwAFAAUABQAFAAAAAAAHAAcAAAAAAAcABwAFAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAAAAAAAAAHAAcABwAAAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAABQAHAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAUABQAFAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAHAAcABQAHAAcAAAAFAAcABwAAAAcABwAFAAUAAAAAAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAFAAcABwAFAAUABQAAAAUAAAAHAAcABwAHAAcABwAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAHAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAABwAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAUAAAAFAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABwAFAAUABQAFAAUAAAAFAAUAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABwAFAAUABQAFAAUABQAAAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABQAFAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABQAFAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAHAAUABQAFAAUABQAFAAUABwAHAAcABwAHAAcABwAHAAUABwAHAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABwAHAAcABwAFAAUABwAHAAcAAAAAAAAAAAAHAAcABQAHAAcABwAHAAcABwAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAcABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAUABQAFAAUABQAFAAUAAAAFAAAABQAAAAAABQAFAAUABQAFAAUABQAFAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAFAAUAAAAAAAUABQAFAAUABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABwAFAAcABwAHAAcABwAFAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAUABQAFAAUABwAHAAUABQAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABQAFAAcABwAHAAUABwAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAcABQAFAAUABQAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAAAAAABwAFAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAAAAAAAAAFAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAUABQAHAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAUABQAFAAUABQAHAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAcABwAFAAUABQAFAAcABwAFAAUABwAHAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAFAAcABwAFAAUABwAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAFAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAFAAUABQAAAAAABQAFAAAAAAAAAAAAAAAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAcABwAAAAAAAAAAAAAABwAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAcABwAFAAcABwAAAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAFAAUABQAAAAUABQAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABwAFAAUABQAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAUABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAHAAcABQAHAAUABQAAAAAAAAAAAAAAAAAFAAAABwAHAAcABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAHAAcABwAAAAAABwAHAAAAAAAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABwAHAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAFAAUABwAFAAcABwAFAAcABQAFAAcABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAHAAcABQAFAAUABQAAAAAABwAHAAcABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAHAAUABQAFAAUABQAFAAUABQAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABwAFAAcABwAFAAUABQAFAAUABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAcABwAFAAUABQAFAAcABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAUABQAFAAUABQAHAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAFAAUABQAFAAAAAAAFAAUABwAHAAcABwAFAAAAAAAAAAcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABwAHAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAcABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAAAHAAUABQAFAAUABQAFAAUABwAFAAUABwAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUAAAAAAAAABQAAAAUABQAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAHAAcABwAHAAcAAAAFAAUAAAAHAAcABQAHAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAAAAUABQAFAAAAAAAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAFAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAAAAABQAFAAUABQAFAAUABQAAAAUABQAAAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFAAUABQAFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQAFAAUABQAFAAUABQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAFAAUABQAFAAUADgAOAA4ADgAOAA4ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAA8ADwAPAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAMAAwADAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkACQAJAAkAAAAAAAAAAAAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAKAAoACgAAAAAAAAAAAAsADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwACwAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAADgAOAA4AAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAAAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4AAAAOAAAAAAAAAAAAAAAAAA4AAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAAAAAAAAAAAA4AAAAOAAAAAAAAAAAADgAOAA4AAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAA4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4AAAAAAA4ADgAOAA4ADgAOAA4ADgAOAAAADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4ADgAOAAAAAAAAAAAAAAAAAAAAAAAAAAAADgAOAA4ADgAOAA4AAAAAAAAAAAAAAAAAAAAAAA4ADgAOAA4ADgAOAA4ADgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAOAA4ADgAOAA4ADgAAAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOAA4AAAAAAAAAAAA="; /* * utrie 1.0.2 * Copyright (c) 2022 Niklas von Hertzen * Released under MIT License */ - var chars$1 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var chars$1 = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. - var lookup$1 = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); + var lookup$1 = + typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); for (var i$1 = 0; i$1 < chars$1.length; i$1++) { - lookup$1[chars$1.charCodeAt(i$1)] = i$1; + lookup$1[chars$1.charCodeAt(i$1)] = i$1; } var decode = function (base64) { - var bufferLength = base64.length * 0.75, len = base64.length, i, p = 0, encoded1, encoded2, encoded3, encoded4; - if (base64[base64.length - 1] === '=') { - bufferLength--; - if (base64[base64.length - 2] === '=') { - bufferLength--; - } + var bufferLength = base64.length * 0.75, + len = base64.length, + i, + p = 0, + encoded1, + encoded2, + encoded3, + encoded4; + if (base64[base64.length - 1] === "=") { + bufferLength--; + if (base64[base64.length - 2] === "=") { + bufferLength--; } - var buffer = typeof ArrayBuffer !== 'undefined' && - typeof Uint8Array !== 'undefined' && - typeof Uint8Array.prototype.slice !== 'undefined' - ? new ArrayBuffer(bufferLength) - : new Array(bufferLength); - var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); - for (i = 0; i < len; i += 4) { - encoded1 = lookup$1[base64.charCodeAt(i)]; - encoded2 = lookup$1[base64.charCodeAt(i + 1)]; - encoded3 = lookup$1[base64.charCodeAt(i + 2)]; - encoded4 = lookup$1[base64.charCodeAt(i + 3)]; - bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); - bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); - bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); - } - return buffer; + } + var buffer = + typeof ArrayBuffer !== "undefined" && + typeof Uint8Array !== "undefined" && + typeof Uint8Array.prototype.slice !== "undefined" + ? new ArrayBuffer(bufferLength) + : new Array(bufferLength); + var bytes = Array.isArray(buffer) ? buffer : new Uint8Array(buffer); + for (i = 0; i < len; i += 4) { + encoded1 = lookup$1[base64.charCodeAt(i)]; + encoded2 = lookup$1[base64.charCodeAt(i + 1)]; + encoded3 = lookup$1[base64.charCodeAt(i + 2)]; + encoded4 = lookup$1[base64.charCodeAt(i + 3)]; + bytes[p++] = (encoded1 << 2) | (encoded2 >> 4); + bytes[p++] = ((encoded2 & 15) << 4) | (encoded3 >> 2); + bytes[p++] = ((encoded3 & 3) << 6) | (encoded4 & 63); + } + return buffer; }; var polyUint16Array = function (buffer) { - var length = buffer.length; - var bytes = []; - for (var i = 0; i < length; i += 2) { - bytes.push((buffer[i + 1] << 8) | buffer[i]); - } - return bytes; + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 2) { + bytes.push((buffer[i + 1] << 8) | buffer[i]); + } + return bytes; }; var polyUint32Array = function (buffer) { - var length = buffer.length; - var bytes = []; - for (var i = 0; i < length; i += 4) { - bytes.push((buffer[i + 3] << 24) | (buffer[i + 2] << 16) | (buffer[i + 1] << 8) | buffer[i]); - } - return bytes; + var length = buffer.length; + var bytes = []; + for (var i = 0; i < length; i += 4) { + bytes.push( + (buffer[i + 3] << 24) | + (buffer[i + 2] << 16) | + (buffer[i + 1] << 8) | + buffer[i], + ); + } + return bytes; }; /** Shift size for getting the index-2 table offset. */ @@ -5899,13 +6946,15 @@ var UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1; var UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2; /** Count the lengths of both BMP pieces. 2080=0x820 */ - var UTRIE2_INDEX_2_BMP_LENGTH = UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH; + var UTRIE2_INDEX_2_BMP_LENGTH = + UTRIE2_LSCP_INDEX_2_OFFSET + UTRIE2_LSCP_INDEX_2_LENGTH; /** * The 2-byte UTF-8 version of the index-2 table follows at offset 2080=0x820. * Length 32=0x20 for lead bytes C0..DF, regardless of UTRIE2_SHIFT_2. */ var UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH; - var UTRIE2_UTF8_2B_INDEX_2_LENGTH = 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ + var UTRIE2_UTF8_2B_INDEX_2_LENGTH = + 0x800 >> 6; /* U+0800 is the first code point after 2-byte UTF-8 */ /** * The index-1 table, only used for supplementary code points, at offset 2112=0x840. * Variable length, for code points up to highStart, where the last single-value range starts. @@ -5918,7 +6967,8 @@ * Both the index-1 table and the following part of the index-2 table * are omitted completely if there is only BMP data. */ - var UTRIE2_INDEX_1_OFFSET = UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH; + var UTRIE2_INDEX_1_OFFSET = + UTRIE2_UTF8_2B_INDEX_2_OFFSET + UTRIE2_UTF8_2B_INDEX_2_LENGTH; /** * Number of index-1 entries for the BMP. 32=0x20 * This part of the index-1 table is omitted from the serialized form. @@ -5929,94 +6979,124 @@ /** Mask for getting the lower bits for the in-index-2-block offset. */ var UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1; var slice16 = function (view, start, end) { - if (view.slice) { - return view.slice(start, end); - } - return new Uint16Array(Array.prototype.slice.call(view, start, end)); + if (view.slice) { + return view.slice(start, end); + } + return new Uint16Array(Array.prototype.slice.call(view, start, end)); }; var slice32 = function (view, start, end) { - if (view.slice) { - return view.slice(start, end); - } - return new Uint32Array(Array.prototype.slice.call(view, start, end)); + if (view.slice) { + return view.slice(start, end); + } + return new Uint32Array(Array.prototype.slice.call(view, start, end)); }; var createTrieFromBase64 = function (base64, _byteLength) { - var buffer = decode(base64); - var view32 = Array.isArray(buffer) ? polyUint32Array(buffer) : new Uint32Array(buffer); - var view16 = Array.isArray(buffer) ? polyUint16Array(buffer) : new Uint16Array(buffer); - var headerLength = 24; - var index = slice16(view16, headerLength / 2, view32[4] / 2); - var data = view32[5] === 2 - ? slice16(view16, (headerLength + view32[4]) / 2) - : slice32(view32, Math.ceil((headerLength + view32[4]) / 4)); - return new Trie(view32[0], view32[1], view32[2], view32[3], index, data); + var buffer = decode(base64); + var view32 = Array.isArray(buffer) + ? polyUint32Array(buffer) + : new Uint32Array(buffer); + var view16 = Array.isArray(buffer) + ? polyUint16Array(buffer) + : new Uint16Array(buffer); + var headerLength = 24; + var index = slice16(view16, headerLength / 2, view32[4] / 2); + var data = + view32[5] === 2 + ? slice16(view16, (headerLength + view32[4]) / 2) + : slice32(view32, Math.ceil((headerLength + view32[4]) / 4)); + return new Trie( + view32[0], + view32[1], + view32[2], + view32[3], + index, + data, + ); }; var Trie = /** @class */ (function () { - function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) { - this.initialValue = initialValue; - this.errorValue = errorValue; - this.highStart = highStart; - this.highValueIndex = highValueIndex; - this.index = index; - this.data = data; + function Trie( + initialValue, + errorValue, + highStart, + highValueIndex, + index, + data, + ) { + this.initialValue = initialValue; + this.errorValue = errorValue; + this.highStart = highStart; + this.highValueIndex = highValueIndex; + this.index = index; + this.data = data; + } + /** + * Get the value for a code point as stored in the Trie. + * + * @param codePoint the code point + * @return the value + */ + Trie.prototype.get = function (codePoint) { + var ix; + if (codePoint >= 0) { + if ( + codePoint < 0x0d800 || + (codePoint > 0x0dbff && codePoint <= 0x0ffff) + ) { + // Ordinary BMP code point, excluding leading surrogates. + // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. + // 16 bit data is stored in the index array itself. + ix = this.index[codePoint >> UTRIE2_SHIFT_2]; + ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); + return this.data[ix]; + } + if (codePoint <= 0xffff) { + // Lead Surrogate Code Point. A Separate index section is stored for + // lead surrogate code units and code points. + // The main index has the code unit data. + // For this function, we need the code point data. + // Note: this expression could be refactored for slightly improved efficiency, but + // surrogate code points will be so rare in practice that it's not worth it. + ix = + this.index[ + UTRIE2_LSCP_INDEX_2_OFFSET + + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2) + ]; + ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); + return this.data[ix]; + } + if (codePoint < this.highStart) { + // Supplemental code point, use two-level lookup. + ix = + UTRIE2_INDEX_1_OFFSET - + UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + + (codePoint >> UTRIE2_SHIFT_1); + ix = this.index[ix]; + ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK; + ix = this.index[ix]; + ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); + return this.data[ix]; + } + if (codePoint <= 0x10ffff) { + return this.data[this.highValueIndex]; + } } - /** - * Get the value for a code point as stored in the Trie. - * - * @param codePoint the code point - * @return the value - */ - Trie.prototype.get = function (codePoint) { - var ix; - if (codePoint >= 0) { - if (codePoint < 0x0d800 || (codePoint > 0x0dbff && codePoint <= 0x0ffff)) { - // Ordinary BMP code point, excluding leading surrogates. - // BMP uses a single level lookup. BMP index starts at offset 0 in the Trie2 index. - // 16 bit data is stored in the index array itself. - ix = this.index[codePoint >> UTRIE2_SHIFT_2]; - ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); - return this.data[ix]; - } - if (codePoint <= 0xffff) { - // Lead Surrogate Code Point. A Separate index section is stored for - // lead surrogate code units and code points. - // The main index has the code unit data. - // For this function, we need the code point data. - // Note: this expression could be refactored for slightly improved efficiency, but - // surrogate code points will be so rare in practice that it's not worth it. - ix = this.index[UTRIE2_LSCP_INDEX_2_OFFSET + ((codePoint - 0xd800) >> UTRIE2_SHIFT_2)]; - ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); - return this.data[ix]; - } - if (codePoint < this.highStart) { - // Supplemental code point, use two-level lookup. - ix = UTRIE2_INDEX_1_OFFSET - UTRIE2_OMITTED_BMP_INDEX_1_LENGTH + (codePoint >> UTRIE2_SHIFT_1); - ix = this.index[ix]; - ix += (codePoint >> UTRIE2_SHIFT_2) & UTRIE2_INDEX_2_MASK; - ix = this.index[ix]; - ix = (ix << UTRIE2_INDEX_SHIFT) + (codePoint & UTRIE2_DATA_MASK); - return this.data[ix]; - } - if (codePoint <= 0x10ffff) { - return this.data[this.highValueIndex]; - } - } - // Fall through. The code point is outside of the legal range of 0..0x10ffff. - return this.errorValue; - }; - return Trie; - }()); + // Fall through. The code point is outside of the legal range of 0..0x10ffff. + return this.errorValue; + }; + return Trie; + })(); /* * base64-arraybuffer 1.0.2 * Copyright (c) 2022 Niklas von Hertzen * Released under MIT License */ - var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; + var chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // Use a lookup table to find the index. - var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); + var lookup = typeof Uint8Array === "undefined" ? [] : new Uint8Array(256); for (var i = 0; i < chars.length; i++) { - lookup[chars.charCodeAt(i)] = i; + lookup[chars.charCodeAt(i)] = i; } var Prepend = 1; @@ -6034,3799 +7114,5927 @@ var Extended_Pictographic = 14; var RI = 15; var toCodePoints = function (str) { - var codePoints = []; - var i = 0; - var length = str.length; - while (i < length) { - var value = str.charCodeAt(i++); - if (value >= 0xd800 && value <= 0xdbff && i < length) { - var extra = str.charCodeAt(i++); - if ((extra & 0xfc00) === 0xdc00) { - codePoints.push(((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000); - } - else { - codePoints.push(value); - i--; - } - } - else { - codePoints.push(value); - } + var codePoints = []; + var i = 0; + var length = str.length; + while (i < length) { + var value = str.charCodeAt(i++); + if (value >= 0xd800 && value <= 0xdbff && i < length) { + var extra = str.charCodeAt(i++); + if ((extra & 0xfc00) === 0xdc00) { + codePoints.push( + ((value & 0x3ff) << 10) + (extra & 0x3ff) + 0x10000, + ); + } else { + codePoints.push(value); + i--; + } + } else { + codePoints.push(value); } - return codePoints; + } + return codePoints; }; var fromCodePoint = function () { - var codePoints = []; - for (var _i = 0; _i < arguments.length; _i++) { - codePoints[_i] = arguments[_i]; + var codePoints = []; + for (var _i = 0; _i < arguments.length; _i++) { + codePoints[_i] = arguments[_i]; + } + if (String.fromCodePoint) { + return String.fromCodePoint.apply(String, codePoints); + } + var length = codePoints.length; + if (!length) { + return ""; + } + var codeUnits = []; + var index = -1; + var result = ""; + while (++index < length) { + var codePoint = codePoints[index]; + if (codePoint <= 0xffff) { + codeUnits.push(codePoint); + } else { + codePoint -= 0x10000; + codeUnits.push( + (codePoint >> 10) + 0xd800, + (codePoint % 0x400) + 0xdc00, + ); } - if (String.fromCodePoint) { - return String.fromCodePoint.apply(String, codePoints); + if (index + 1 === length || codeUnits.length > 0x4000) { + result += String.fromCharCode.apply(String, codeUnits); + codeUnits.length = 0; } - var length = codePoints.length; - if (!length) { - return ''; - } - var codeUnits = []; - var index = -1; - var result = ''; - while (++index < length) { - var codePoint = codePoints[index]; - if (codePoint <= 0xffff) { - codeUnits.push(codePoint); - } - else { - codePoint -= 0x10000; - codeUnits.push((codePoint >> 10) + 0xd800, (codePoint % 0x400) + 0xdc00); - } - if (index + 1 === length || codeUnits.length > 0x4000) { - result += String.fromCharCode.apply(String, codeUnits); - codeUnits.length = 0; - } - } - return result; + } + return result; }; var UnicodeTrie = createTrieFromBase64(base64); - var BREAK_NOT_ALLOWED = '×'; - var BREAK_ALLOWED = '÷'; - var codePointToClass = function (codePoint) { return UnicodeTrie.get(codePoint); }; + var BREAK_NOT_ALLOWED = "×"; + var BREAK_ALLOWED = "÷"; + var codePointToClass = function (codePoint) { + return UnicodeTrie.get(codePoint); + }; var _graphemeBreakAtIndex = function (_codePoints, classTypes, index) { - var prevIndex = index - 2; - var prev = classTypes[prevIndex]; - var current = classTypes[index - 1]; - var next = classTypes[index]; - // GB3 Do not break between a CR and LF - if (current === CR && next === LF) { - return BREAK_NOT_ALLOWED; - } - // GB4 Otherwise, break before and after controls. - if (current === CR || current === LF || current === Control) { - return BREAK_ALLOWED; - } - // GB5 - if (next === CR || next === LF || next === Control) { - return BREAK_ALLOWED; - } - // Do not break Hangul syllable sequences. - // GB6 - if (current === L && [L, V, LV, LVT].indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - // GB7 - if ((current === LV || current === V) && (next === V || next === T)) { - return BREAK_NOT_ALLOWED; - } - // GB8 - if ((current === LVT || current === T) && next === T) { - return BREAK_NOT_ALLOWED; - } - // GB9 Do not break before extending characters or ZWJ. - if (next === ZWJ || next === Extend) { - return BREAK_NOT_ALLOWED; - } - // Do not break before SpacingMarks, or after Prepend characters. - // GB9a - if (next === SpacingMark) { - return BREAK_NOT_ALLOWED; - } - // GB9a - if (current === Prepend) { - return BREAK_NOT_ALLOWED; - } - // GB11 Do not break within emoji modifier sequences or emoji zwj sequences. - if (current === ZWJ && next === Extended_Pictographic) { - while (prev === Extend) { - prev = classTypes[--prevIndex]; - } - if (prev === Extended_Pictographic) { - return BREAK_NOT_ALLOWED; - } - } - // GB12 Do not break within emoji flag sequences. - // That is, do not break between regional indicator (RI) symbols - // if there is an odd number of RI characters before the break point. - if (current === RI && next === RI) { - var countRI = 0; - while (prev === RI) { - countRI++; - prev = classTypes[--prevIndex]; - } - if (countRI % 2 === 0) { - return BREAK_NOT_ALLOWED; - } - } + var prevIndex = index - 2; + var prev = classTypes[prevIndex]; + var current = classTypes[index - 1]; + var next = classTypes[index]; + // GB3 Do not break between a CR and LF + if (current === CR && next === LF) { + return BREAK_NOT_ALLOWED; + } + // GB4 Otherwise, break before and after controls. + if (current === CR || current === LF || current === Control) { return BREAK_ALLOWED; + } + // GB5 + if (next === CR || next === LF || next === Control) { + return BREAK_ALLOWED; + } + // Do not break Hangul syllable sequences. + // GB6 + if (current === L && [L, V, LV, LVT].indexOf(next) !== -1) { + return BREAK_NOT_ALLOWED; + } + // GB7 + if ((current === LV || current === V) && (next === V || next === T)) { + return BREAK_NOT_ALLOWED; + } + // GB8 + if ((current === LVT || current === T) && next === T) { + return BREAK_NOT_ALLOWED; + } + // GB9 Do not break before extending characters or ZWJ. + if (next === ZWJ || next === Extend) { + return BREAK_NOT_ALLOWED; + } + // Do not break before SpacingMarks, or after Prepend characters. + // GB9a + if (next === SpacingMark) { + return BREAK_NOT_ALLOWED; + } + // GB9a + if (current === Prepend) { + return BREAK_NOT_ALLOWED; + } + // GB11 Do not break within emoji modifier sequences or emoji zwj sequences. + if (current === ZWJ && next === Extended_Pictographic) { + while (prev === Extend) { + prev = classTypes[--prevIndex]; + } + if (prev === Extended_Pictographic) { + return BREAK_NOT_ALLOWED; + } + } + // GB12 Do not break within emoji flag sequences. + // That is, do not break between regional indicator (RI) symbols + // if there is an odd number of RI characters before the break point. + if (current === RI && next === RI) { + var countRI = 0; + while (prev === RI) { + countRI++; + prev = classTypes[--prevIndex]; + } + if (countRI % 2 === 0) { + return BREAK_NOT_ALLOWED; + } + } + return BREAK_ALLOWED; }; var GraphemeBreaker = function (str) { - var codePoints = toCodePoints(str); - var length = codePoints.length; - var index = 0; - var lastEnd = 0; - var classTypes = codePoints.map(codePointToClass); - return { - next: function () { - if (index >= length) { - return { done: true, value: null }; - } - var graphemeBreak = BREAK_NOT_ALLOWED; - while (index < length && - (graphemeBreak = _graphemeBreakAtIndex(codePoints, classTypes, ++index)) === BREAK_NOT_ALLOWED) { } - if (graphemeBreak !== BREAK_NOT_ALLOWED || index === length) { - var value = fromCodePoint.apply(null, codePoints.slice(lastEnd, index)); - lastEnd = index; - return { value: value, done: false }; - } - return { done: true, value: null }; - }, - }; + var codePoints = toCodePoints(str); + var length = codePoints.length; + var index = 0; + var lastEnd = 0; + var classTypes = codePoints.map(codePointToClass); + return { + next: function () { + if (index >= length) { + return { done: true, value: null }; + } + var graphemeBreak = BREAK_NOT_ALLOWED; + while ( + index < length && + (graphemeBreak = _graphemeBreakAtIndex( + codePoints, + classTypes, + ++index, + )) === BREAK_NOT_ALLOWED + ) {} + if (graphemeBreak !== BREAK_NOT_ALLOWED || index === length) { + var value = fromCodePoint.apply( + null, + codePoints.slice(lastEnd, index), + ); + lastEnd = index; + return { value: value, done: false }; + } + return { done: true, value: null }; + }, + }; }; var splitGraphemes = function (str) { - var breaker = GraphemeBreaker(str); - var graphemes = []; - var bk; - while (!(bk = breaker.next()).done) { - if (bk.value) { - graphemes.push(bk.value.slice()); - } + var breaker = GraphemeBreaker(str); + var graphemes = []; + var bk; + while (!(bk = breaker.next()).done) { + if (bk.value) { + graphemes.push(bk.value.slice()); } - return graphemes; + } + return graphemes; }; var testRangeBounds = function (document) { - var TEST_HEIGHT = 123; - if (document.createRange) { - var range = document.createRange(); - if (range.getBoundingClientRect) { - var testElement = document.createElement('boundtest'); - testElement.style.height = TEST_HEIGHT + "px"; - testElement.style.display = 'block'; - document.body.appendChild(testElement); - range.selectNode(testElement); - var rangeBounds = range.getBoundingClientRect(); - var rangeHeight = Math.round(rangeBounds.height); - document.body.removeChild(testElement); - if (rangeHeight === TEST_HEIGHT) { - return true; - } - } + var TEST_HEIGHT = 123; + if (document.createRange) { + var range = document.createRange(); + if (range.getBoundingClientRect) { + var testElement = document.createElement("boundtest"); + testElement.style.height = TEST_HEIGHT + "px"; + testElement.style.display = "block"; + document.body.appendChild(testElement); + range.selectNode(testElement); + var rangeBounds = range.getBoundingClientRect(); + var rangeHeight = Math.round(rangeBounds.height); + document.body.removeChild(testElement); + if (rangeHeight === TEST_HEIGHT) { + return true; + } } - return false; + } + return false; }; var testIOSLineBreak = function (document) { - var testElement = document.createElement('boundtest'); - testElement.style.width = '50px'; - testElement.style.display = 'block'; - testElement.style.fontSize = '12px'; - testElement.style.letterSpacing = '0px'; - testElement.style.wordSpacing = '0px'; - document.body.appendChild(testElement); - var range = document.createRange(); - testElement.innerHTML = typeof ''.repeat === 'function' ? '👨'.repeat(10) : ''; - var node = testElement.firstChild; - var textList = toCodePoints$1(node.data).map(function (i) { return fromCodePoint$1(i); }); - var offset = 0; - var prev = {}; - // ios 13 does not handle range getBoundingClientRect line changes correctly #2177 - var supports = textList.every(function (text, i) { - range.setStart(node, offset); - range.setEnd(node, offset + text.length); - var rect = range.getBoundingClientRect(); - offset += text.length; - var boundAhead = rect.x > prev.x || rect.y > prev.y; - prev = rect; - if (i === 0) { - return true; - } - return boundAhead; - }); - document.body.removeChild(testElement); - return supports; + var testElement = document.createElement("boundtest"); + testElement.style.width = "50px"; + testElement.style.display = "block"; + testElement.style.fontSize = "12px"; + testElement.style.letterSpacing = "0px"; + testElement.style.wordSpacing = "0px"; + document.body.appendChild(testElement); + var range = document.createRange(); + testElement.innerHTML = + typeof "".repeat === "function" ? "👨".repeat(10) : ""; + var node = testElement.firstChild; + var textList = toCodePoints$1(node.data).map(function (i) { + return fromCodePoint$1(i); + }); + var offset = 0; + var prev = {}; + // ios 13 does not handle range getBoundingClientRect line changes correctly #2177 + var supports = textList.every(function (text, i) { + range.setStart(node, offset); + range.setEnd(node, offset + text.length); + var rect = range.getBoundingClientRect(); + offset += text.length; + var boundAhead = rect.x > prev.x || rect.y > prev.y; + prev = rect; + if (i === 0) { + return true; + } + return boundAhead; + }); + document.body.removeChild(testElement); + return supports; + }; + var testCORS = function () { + return typeof new Image().crossOrigin !== "undefined"; + }; + var testResponseType = function () { + return typeof new XMLHttpRequest().responseType === "string"; }; - var testCORS = function () { return typeof new Image().crossOrigin !== 'undefined'; }; - var testResponseType = function () { return typeof new XMLHttpRequest().responseType === 'string'; }; var testSVG = function (document) { - var img = new Image(); - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - if (!ctx) { - return false; - } - img.src = "data:image/svg+xml,"; - try { - ctx.drawImage(img, 0, 0); - canvas.toDataURL(); - } - catch (e) { - return false; - } - return true; + var img = new Image(); + var canvas = document.createElement("canvas"); + var ctx = canvas.getContext("2d"); + if (!ctx) { + return false; + } + img.src = + "data:image/svg+xml,"; + try { + ctx.drawImage(img, 0, 0); + canvas.toDataURL(); + } catch (e) { + return false; + } + return true; }; var isGreenPixel = function (data) { - return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255; + return ( + data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255 + ); }; var testForeignObject = function (document) { - var canvas = document.createElement('canvas'); - var size = 100; - canvas.width = size; - canvas.height = size; - var ctx = canvas.getContext('2d'); - if (!ctx) { - return Promise.reject(false); - } - ctx.fillStyle = 'rgb(0, 255, 0)'; - ctx.fillRect(0, 0, size, size); - var img = new Image(); - var greenImageSrc = canvas.toDataURL(); - img.src = greenImageSrc; - var svg = createForeignObjectSVG(size, size, 0, 0, img); - ctx.fillStyle = 'red'; - ctx.fillRect(0, 0, size, size); - return loadSerializedSVG$1(svg) - .then(function (img) { - ctx.drawImage(img, 0, 0); - var data = ctx.getImageData(0, 0, size, size).data; - ctx.fillStyle = 'red'; - ctx.fillRect(0, 0, size, size); - var node = document.createElement('div'); - node.style.backgroundImage = "url(" + greenImageSrc + ")"; - node.style.height = size + "px"; - // Firefox 55 does not render inline tags - return isGreenPixel(data) - ? loadSerializedSVG$1(createForeignObjectSVG(size, size, 0, 0, node)) - : Promise.reject(false); + var canvas = document.createElement("canvas"); + var size = 100; + canvas.width = size; + canvas.height = size; + var ctx = canvas.getContext("2d"); + if (!ctx) { + return Promise.reject(false); + } + ctx.fillStyle = "rgb(0, 255, 0)"; + ctx.fillRect(0, 0, size, size); + var img = new Image(); + var greenImageSrc = canvas.toDataURL(); + img.src = greenImageSrc; + var svg = createForeignObjectSVG(size, size, 0, 0, img); + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, size, size); + return loadSerializedSVG$1(svg) + .then(function (img) { + ctx.drawImage(img, 0, 0); + var data = ctx.getImageData(0, 0, size, size).data; + ctx.fillStyle = "red"; + ctx.fillRect(0, 0, size, size); + var node = document.createElement("div"); + node.style.backgroundImage = "url(" + greenImageSrc + ")"; + node.style.height = size + "px"; + // Firefox 55 does not render inline tags + return isGreenPixel(data) + ? loadSerializedSVG$1( + createForeignObjectSVG(size, size, 0, 0, node), + ) + : Promise.reject(false); }) - .then(function (img) { - ctx.drawImage(img, 0, 0); - // Edge does not render background-images - return isGreenPixel(ctx.getImageData(0, 0, size, size).data); + .then(function (img) { + ctx.drawImage(img, 0, 0); + // Edge does not render background-images + return isGreenPixel(ctx.getImageData(0, 0, size, size).data); }) - .catch(function () { return false; }); - }; - var createForeignObjectSVG = function (width, height, x, y, node) { - var xmlns = 'http://www.w3.org/2000/svg'; - var svg = document.createElementNS(xmlns, 'svg'); - var foreignObject = document.createElementNS(xmlns, 'foreignObject'); - svg.setAttributeNS(null, 'width', width.toString()); - svg.setAttributeNS(null, 'height', height.toString()); - foreignObject.setAttributeNS(null, 'width', '100%'); - foreignObject.setAttributeNS(null, 'height', '100%'); - foreignObject.setAttributeNS(null, 'x', x.toString()); - foreignObject.setAttributeNS(null, 'y', y.toString()); - foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true'); - svg.appendChild(foreignObject); - foreignObject.appendChild(node); - return svg; - }; - var loadSerializedSVG$1 = function (svg) { - return new Promise(function (resolve, reject) { - var img = new Image(); - img.onload = function () { return resolve(img); }; - img.onerror = reject; - img.src = "data:image/svg+xml;charset=utf-8," + encodeURIComponent(new XMLSerializer().serializeToString(svg)); + .catch(function () { + return false; }); }; + var createForeignObjectSVG = function (width, height, x, y, node) { + var xmlns = "http://www.w3.org/2000/svg"; + var svg = document.createElementNS(xmlns, "svg"); + var foreignObject = document.createElementNS(xmlns, "foreignObject"); + svg.setAttributeNS(null, "width", width.toString()); + svg.setAttributeNS(null, "height", height.toString()); + foreignObject.setAttributeNS(null, "width", "100%"); + foreignObject.setAttributeNS(null, "height", "100%"); + foreignObject.setAttributeNS(null, "x", x.toString()); + foreignObject.setAttributeNS(null, "y", y.toString()); + foreignObject.setAttributeNS(null, "externalResourcesRequired", "true"); + svg.appendChild(foreignObject); + foreignObject.appendChild(node); + return svg; + }; + var loadSerializedSVG$1 = function (svg) { + return new Promise(function (resolve, reject) { + var img = new Image(); + img.onload = function () { + return resolve(img); + }; + img.onerror = reject; + img.src = + "data:image/svg+xml;charset=utf-8," + + encodeURIComponent(new XMLSerializer().serializeToString(svg)); + }); + }; var FEATURES = { - get SUPPORT_RANGE_BOUNDS() { - var value = testRangeBounds(document); - Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value }); - return value; - }, - get SUPPORT_WORD_BREAKING() { - var value = FEATURES.SUPPORT_RANGE_BOUNDS && testIOSLineBreak(document); - Object.defineProperty(FEATURES, 'SUPPORT_WORD_BREAKING', { value: value }); - return value; - }, - get SUPPORT_SVG_DRAWING() { - var value = testSVG(document); - Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value }); - return value; - }, - get SUPPORT_FOREIGNOBJECT_DRAWING() { - var value = typeof Array.from === 'function' && typeof window.fetch === 'function' - ? testForeignObject(document) - : Promise.resolve(false); - Object.defineProperty(FEATURES, 'SUPPORT_FOREIGNOBJECT_DRAWING', { value: value }); - return value; - }, - get SUPPORT_CORS_IMAGES() { - var value = testCORS(); - Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value }); - return value; - }, - get SUPPORT_RESPONSE_TYPE() { - var value = testResponseType(); - Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value }); - return value; - }, - get SUPPORT_CORS_XHR() { - var value = 'withCredentials' in new XMLHttpRequest(); - Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value }); - return value; - }, - get SUPPORT_NATIVE_TEXT_SEGMENTATION() { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - var value = !!(typeof Intl !== 'undefined' && Intl.Segmenter); - Object.defineProperty(FEATURES, 'SUPPORT_NATIVE_TEXT_SEGMENTATION', { value: value }); - return value; - } + get SUPPORT_RANGE_BOUNDS() { + var value = testRangeBounds(document); + Object.defineProperty(FEATURES, "SUPPORT_RANGE_BOUNDS", { + value: value, + }); + return value; + }, + get SUPPORT_WORD_BREAKING() { + var value = + FEATURES.SUPPORT_RANGE_BOUNDS && testIOSLineBreak(document); + Object.defineProperty(FEATURES, "SUPPORT_WORD_BREAKING", { + value: value, + }); + return value; + }, + get SUPPORT_SVG_DRAWING() { + var value = testSVG(document); + Object.defineProperty(FEATURES, "SUPPORT_SVG_DRAWING", { + value: value, + }); + return value; + }, + get SUPPORT_FOREIGNOBJECT_DRAWING() { + var value = + typeof Array.from === "function" && + typeof window.fetch === "function" + ? testForeignObject(document) + : Promise.resolve(false); + Object.defineProperty(FEATURES, "SUPPORT_FOREIGNOBJECT_DRAWING", { + value: value, + }); + return value; + }, + get SUPPORT_CORS_IMAGES() { + var value = testCORS(); + Object.defineProperty(FEATURES, "SUPPORT_CORS_IMAGES", { + value: value, + }); + return value; + }, + get SUPPORT_RESPONSE_TYPE() { + var value = testResponseType(); + Object.defineProperty(FEATURES, "SUPPORT_RESPONSE_TYPE", { + value: value, + }); + return value; + }, + get SUPPORT_CORS_XHR() { + var value = "withCredentials" in new XMLHttpRequest(); + Object.defineProperty(FEATURES, "SUPPORT_CORS_XHR", { value: value }); + return value; + }, + get SUPPORT_NATIVE_TEXT_SEGMENTATION() { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var value = !!(typeof Intl !== "undefined" && Intl.Segmenter); + Object.defineProperty(FEATURES, "SUPPORT_NATIVE_TEXT_SEGMENTATION", { + value: value, + }); + return value; + }, }; var TextBounds = /** @class */ (function () { - function TextBounds(text, bounds) { - this.text = text; - this.bounds = bounds; - } - return TextBounds; - }()); + function TextBounds(text, bounds) { + this.text = text; + this.bounds = bounds; + } + return TextBounds; + })(); var parseTextBounds = function (context, value, styles, node) { - var textList = breakText(value, styles); - var textBounds = []; - var offset = 0; - textList.forEach(function (text) { - if (styles.textDecorationLine.length || text.trim().length > 0) { - if (FEATURES.SUPPORT_RANGE_BOUNDS) { - var clientRects = createRange(node, offset, text.length).getClientRects(); - if (clientRects.length > 1) { - var subSegments = segmentGraphemes(text); - var subOffset_1 = 0; - subSegments.forEach(function (subSegment) { - textBounds.push(new TextBounds(subSegment, Bounds.fromDOMRectList(context, createRange(node, subOffset_1 + offset, subSegment.length).getClientRects()))); - subOffset_1 += subSegment.length; - }); - } - else { - textBounds.push(new TextBounds(text, Bounds.fromDOMRectList(context, clientRects))); - } - } - else { - var replacementNode = node.splitText(text.length); - textBounds.push(new TextBounds(text, getWrapperBounds(context, node))); - node = replacementNode; - } + var textList = breakText(value, styles); + var textBounds = []; + var offset = 0; + textList.forEach(function (text) { + if (styles.textDecorationLine.length || text.trim().length > 0) { + if (FEATURES.SUPPORT_RANGE_BOUNDS) { + var clientRects = createRange( + node, + offset, + text.length, + ).getClientRects(); + if (clientRects.length > 1) { + var subSegments = segmentGraphemes(text); + var subOffset_1 = 0; + subSegments.forEach(function (subSegment) { + textBounds.push( + new TextBounds( + subSegment, + Bounds.fromDOMRectList( + context, + createRange( + node, + subOffset_1 + offset, + subSegment.length, + ).getClientRects(), + ), + ), + ); + subOffset_1 += subSegment.length; + }); + } else { + textBounds.push( + new TextBounds( + text, + Bounds.fromDOMRectList(context, clientRects), + ), + ); } - else if (!FEATURES.SUPPORT_RANGE_BOUNDS) { - node = node.splitText(text.length); - } - offset += text.length; - }); - return textBounds; + } else { + var replacementNode = node.splitText(text.length); + textBounds.push( + new TextBounds(text, getWrapperBounds(context, node)), + ); + node = replacementNode; + } + } else if (!FEATURES.SUPPORT_RANGE_BOUNDS) { + node = node.splitText(text.length); + } + offset += text.length; + }); + return textBounds; }; var getWrapperBounds = function (context, node) { - var ownerDocument = node.ownerDocument; - if (ownerDocument) { - var wrapper = ownerDocument.createElement('html2canvaswrapper'); - wrapper.appendChild(node.cloneNode(true)); - var parentNode = node.parentNode; - if (parentNode) { - parentNode.replaceChild(wrapper, node); - var bounds = parseBounds(context, wrapper); - if (wrapper.firstChild) { - parentNode.replaceChild(wrapper.firstChild, wrapper); - } - return bounds; - } + var ownerDocument = node.ownerDocument; + if (ownerDocument) { + var wrapper = ownerDocument.createElement("html2canvaswrapper"); + wrapper.appendChild(node.cloneNode(true)); + var parentNode = node.parentNode; + if (parentNode) { + parentNode.replaceChild(wrapper, node); + var bounds = parseBounds(context, wrapper); + if (wrapper.firstChild) { + parentNode.replaceChild(wrapper.firstChild, wrapper); + } + return bounds; } - return Bounds.EMPTY; + } + return Bounds.EMPTY; }; var createRange = function (node, offset, length) { - var ownerDocument = node.ownerDocument; - if (!ownerDocument) { - throw new Error('Node has no owner document'); - } - var range = ownerDocument.createRange(); - range.setStart(node, offset); - range.setEnd(node, offset + length); - return range; + var ownerDocument = node.ownerDocument; + if (!ownerDocument) { + throw new Error("Node has no owner document"); + } + var range = ownerDocument.createRange(); + range.setStart(node, offset); + range.setEnd(node, offset + length); + return range; }; var segmentGraphemes = function (value) { - if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - var segmenter = new Intl.Segmenter(void 0, { granularity: 'grapheme' }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return Array.from(segmenter.segment(value)).map(function (segment) { return segment.segment; }); - } - return splitGraphemes(value); + if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var segmenter = new Intl.Segmenter(void 0, { + granularity: "grapheme", + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return Array.from(segmenter.segment(value)).map(function (segment) { + return segment.segment; + }); + } + return splitGraphemes(value); }; var segmentWords = function (value, styles) { - if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - var segmenter = new Intl.Segmenter(void 0, { - granularity: 'word' - }); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return Array.from(segmenter.segment(value)).map(function (segment) { return segment.segment; }); - } - return breakWords(value, styles); + if (FEATURES.SUPPORT_NATIVE_TEXT_SEGMENTATION) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + var segmenter = new Intl.Segmenter(void 0, { + granularity: "word", + }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return Array.from(segmenter.segment(value)).map(function (segment) { + return segment.segment; + }); + } + return breakWords(value, styles); }; var breakText = function (value, styles) { - return styles.letterSpacing !== 0 ? segmentGraphemes(value) : segmentWords(value, styles); + return styles.letterSpacing !== 0 + ? segmentGraphemes(value) + : segmentWords(value, styles); }; // https://drafts.csswg.org/css-text/#word-separator - var wordSeparators = [0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091]; + var wordSeparators = [ + 0x0020, 0x00a0, 0x1361, 0x10100, 0x10101, 0x1039, 0x1091, + ]; var breakWords = function (str, styles) { - var breaker = LineBreaker(str, { - lineBreak: styles.lineBreak, - wordBreak: styles.overflowWrap === "break-word" /* BREAK_WORD */ ? 'break-word' : styles.wordBreak - }); - var words = []; - var bk; - var _loop_1 = function () { - if (bk.value) { - var value = bk.value.slice(); - var codePoints = toCodePoints$1(value); - var word_1 = ''; - codePoints.forEach(function (codePoint) { - if (wordSeparators.indexOf(codePoint) === -1) { - word_1 += fromCodePoint$1(codePoint); - } - else { - if (word_1.length) { - words.push(word_1); - } - words.push(fromCodePoint$1(codePoint)); - word_1 = ''; - } - }); - if (word_1.length) { - words.push(word_1); - } + var breaker = LineBreaker(str, { + lineBreak: styles.lineBreak, + wordBreak: + styles.overflowWrap === "break-word" /* BREAK_WORD */ + ? "break-word" + : styles.wordBreak, + }); + var words = []; + var bk; + var _loop_1 = function () { + if (bk.value) { + var value = bk.value.slice(); + var codePoints = toCodePoints$1(value); + var word_1 = ""; + codePoints.forEach(function (codePoint) { + if (wordSeparators.indexOf(codePoint) === -1) { + word_1 += fromCodePoint$1(codePoint); + } else { + if (word_1.length) { + words.push(word_1); + } + words.push(fromCodePoint$1(codePoint)); + word_1 = ""; } - }; - while (!(bk = breaker.next()).done) { - _loop_1(); + }); + if (word_1.length) { + words.push(word_1); + } } - return words; + }; + while (!(bk = breaker.next()).done) { + _loop_1(); + } + return words; }; var TextContainer = /** @class */ (function () { - function TextContainer(context, node, styles) { - this.text = transform(node.data, styles.textTransform); - this.textBounds = parseTextBounds(context, this.text, styles, node); - } - return TextContainer; - }()); + function TextContainer(context, node, styles) { + this.text = transform(node.data, styles.textTransform); + this.textBounds = parseTextBounds(context, this.text, styles, node); + } + return TextContainer; + })(); var transform = function (text, transform) { - switch (transform) { - case 1 /* LOWERCASE */: - return text.toLowerCase(); - case 3 /* CAPITALIZE */: - return text.replace(CAPITALIZE, capitalize); - case 2 /* UPPERCASE */: - return text.toUpperCase(); - default: - return text; - } + switch (transform) { + case 1 /* LOWERCASE */: + return text.toLowerCase(); + case 3 /* CAPITALIZE */: + return text.replace(CAPITALIZE, capitalize); + case 2 /* UPPERCASE */: + return text.toUpperCase(); + default: + return text; + } }; var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g; var capitalize = function (m, p1, p2) { - if (m.length > 0) { - return p1 + p2.toUpperCase(); - } - return m; + if (m.length > 0) { + return p1 + p2.toUpperCase(); + } + return m; }; var ImageElementContainer = /** @class */ (function (_super) { - __extends(ImageElementContainer, _super); - function ImageElementContainer(context, img) { - var _this = _super.call(this, context, img) || this; - _this.src = img.currentSrc || img.src; - _this.intrinsicWidth = img.naturalWidth; - _this.intrinsicHeight = img.naturalHeight; - _this.context.cache.addImage(_this.src); - return _this; - } - return ImageElementContainer; - }(ElementContainer)); + __extends(ImageElementContainer, _super); + function ImageElementContainer(context, img) { + var _this = _super.call(this, context, img) || this; + _this.src = img.currentSrc || img.src; + _this.intrinsicWidth = img.naturalWidth; + _this.intrinsicHeight = img.naturalHeight; + _this.context.cache.addImage(_this.src); + return _this; + } + return ImageElementContainer; + })(ElementContainer); var CanvasElementContainer = /** @class */ (function (_super) { - __extends(CanvasElementContainer, _super); - function CanvasElementContainer(context, canvas) { - var _this = _super.call(this, context, canvas) || this; - _this.canvas = canvas; - _this.intrinsicWidth = canvas.width; - _this.intrinsicHeight = canvas.height; - return _this; - } - return CanvasElementContainer; - }(ElementContainer)); + __extends(CanvasElementContainer, _super); + function CanvasElementContainer(context, canvas) { + var _this = _super.call(this, context, canvas) || this; + _this.canvas = canvas; + _this.intrinsicWidth = canvas.width; + _this.intrinsicHeight = canvas.height; + return _this; + } + return CanvasElementContainer; + })(ElementContainer); var SVGElementContainer = /** @class */ (function (_super) { - __extends(SVGElementContainer, _super); - function SVGElementContainer(context, img) { - var _this = _super.call(this, context, img) || this; - var s = new XMLSerializer(); - var bounds = parseBounds(context, img); - img.setAttribute('width', bounds.width + "px"); - img.setAttribute('height', bounds.height + "px"); - _this.svg = "data:image/svg+xml," + encodeURIComponent(s.serializeToString(img)); - _this.intrinsicWidth = img.width.baseVal.value; - _this.intrinsicHeight = img.height.baseVal.value; - _this.context.cache.addImage(_this.svg); - return _this; - } - return SVGElementContainer; - }(ElementContainer)); + __extends(SVGElementContainer, _super); + function SVGElementContainer(context, img) { + var _this = _super.call(this, context, img) || this; + var s = new XMLSerializer(); + var bounds = parseBounds(context, img); + img.setAttribute("width", bounds.width + "px"); + img.setAttribute("height", bounds.height + "px"); + _this.svg = + "data:image/svg+xml," + + encodeURIComponent(s.serializeToString(img)); + _this.intrinsicWidth = img.width.baseVal.value; + _this.intrinsicHeight = img.height.baseVal.value; + _this.context.cache.addImage(_this.svg); + return _this; + } + return SVGElementContainer; + })(ElementContainer); var LIElementContainer = /** @class */ (function (_super) { - __extends(LIElementContainer, _super); - function LIElementContainer(context, element) { - var _this = _super.call(this, context, element) || this; - _this.value = element.value; - return _this; - } - return LIElementContainer; - }(ElementContainer)); + __extends(LIElementContainer, _super); + function LIElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + _this.value = element.value; + return _this; + } + return LIElementContainer; + })(ElementContainer); var OLElementContainer = /** @class */ (function (_super) { - __extends(OLElementContainer, _super); - function OLElementContainer(context, element) { - var _this = _super.call(this, context, element) || this; - _this.start = element.start; - _this.reversed = typeof element.reversed === 'boolean' && element.reversed === true; - return _this; - } - return OLElementContainer; - }(ElementContainer)); + __extends(OLElementContainer, _super); + function OLElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + _this.start = element.start; + _this.reversed = + typeof element.reversed === "boolean" && element.reversed === true; + return _this; + } + return OLElementContainer; + })(ElementContainer); var CHECKBOX_BORDER_RADIUS = [ - { - type: 15 /* DIMENSION_TOKEN */, - flags: 0, - unit: 'px', - number: 3 - } + { + type: 15 /* DIMENSION_TOKEN */, + flags: 0, + unit: "px", + number: 3, + }, ]; var RADIO_BORDER_RADIUS = [ - { - type: 16 /* PERCENTAGE_TOKEN */, - flags: 0, - number: 50 - } + { + type: 16 /* PERCENTAGE_TOKEN */, + flags: 0, + number: 50, + }, ]; var reformatInputBounds = function (bounds) { - if (bounds.width > bounds.height) { - return new Bounds(bounds.left + (bounds.width - bounds.height) / 2, bounds.top, bounds.height, bounds.height); - } - else if (bounds.width < bounds.height) { - return new Bounds(bounds.left, bounds.top + (bounds.height - bounds.width) / 2, bounds.width, bounds.width); - } - return bounds; + if (bounds.width > bounds.height) { + return new Bounds( + bounds.left + (bounds.width - bounds.height) / 2, + bounds.top, + bounds.height, + bounds.height, + ); + } else if (bounds.width < bounds.height) { + return new Bounds( + bounds.left, + bounds.top + (bounds.height - bounds.width) / 2, + bounds.width, + bounds.width, + ); + } + return bounds; }; var getInputValue = function (node) { - var value = node.type === PASSWORD ? new Array(node.value.length + 1).join('\u2022') : node.value; - return value.length === 0 ? node.placeholder || '' : value; + var value = + node.type === PASSWORD + ? new Array(node.value.length + 1).join("\u2022") + : node.value; + return value.length === 0 ? node.placeholder || "" : value; }; - var CHECKBOX = 'checkbox'; - var RADIO = 'radio'; - var PASSWORD = 'password'; + var CHECKBOX = "checkbox"; + var RADIO = "radio"; + var PASSWORD = "password"; var INPUT_COLOR = 0x2a2a2aff; var InputElementContainer = /** @class */ (function (_super) { - __extends(InputElementContainer, _super); - function InputElementContainer(context, input) { - var _this = _super.call(this, context, input) || this; - _this.type = input.type.toLowerCase(); - _this.checked = input.checked; - _this.value = getInputValue(input); - if (_this.type === CHECKBOX || _this.type === RADIO) { - _this.styles.backgroundColor = 0xdededeff; - _this.styles.borderTopColor = - _this.styles.borderRightColor = - _this.styles.borderBottomColor = - _this.styles.borderLeftColor = - 0xa5a5a5ff; - _this.styles.borderTopWidth = - _this.styles.borderRightWidth = - _this.styles.borderBottomWidth = - _this.styles.borderLeftWidth = - 1; - _this.styles.borderTopStyle = - _this.styles.borderRightStyle = - _this.styles.borderBottomStyle = - _this.styles.borderLeftStyle = - 1 /* SOLID */; - _this.styles.backgroundClip = [0 /* BORDER_BOX */]; - _this.styles.backgroundOrigin = [0 /* BORDER_BOX */]; - _this.bounds = reformatInputBounds(_this.bounds); - } - switch (_this.type) { - case CHECKBOX: - _this.styles.borderTopRightRadius = - _this.styles.borderTopLeftRadius = - _this.styles.borderBottomRightRadius = - _this.styles.borderBottomLeftRadius = - CHECKBOX_BORDER_RADIUS; - break; - case RADIO: - _this.styles.borderTopRightRadius = - _this.styles.borderTopLeftRadius = - _this.styles.borderBottomRightRadius = - _this.styles.borderBottomLeftRadius = - RADIO_BORDER_RADIUS; - break; - } - return _this; + __extends(InputElementContainer, _super); + function InputElementContainer(context, input) { + var _this = _super.call(this, context, input) || this; + _this.type = input.type.toLowerCase(); + _this.checked = input.checked; + _this.value = getInputValue(input); + if (_this.type === CHECKBOX || _this.type === RADIO) { + _this.styles.backgroundColor = 0xdededeff; + _this.styles.borderTopColor = + _this.styles.borderRightColor = + _this.styles.borderBottomColor = + _this.styles.borderLeftColor = + 0xa5a5a5ff; + _this.styles.borderTopWidth = + _this.styles.borderRightWidth = + _this.styles.borderBottomWidth = + _this.styles.borderLeftWidth = + 1; + _this.styles.borderTopStyle = + _this.styles.borderRightStyle = + _this.styles.borderBottomStyle = + _this.styles.borderLeftStyle = + 1 /* SOLID */; + _this.styles.backgroundClip = [0 /* BORDER_BOX */]; + _this.styles.backgroundOrigin = [0 /* BORDER_BOX */]; + _this.bounds = reformatInputBounds(_this.bounds); } - return InputElementContainer; - }(ElementContainer)); + switch (_this.type) { + case CHECKBOX: + _this.styles.borderTopRightRadius = + _this.styles.borderTopLeftRadius = + _this.styles.borderBottomRightRadius = + _this.styles.borderBottomLeftRadius = + CHECKBOX_BORDER_RADIUS; + break; + case RADIO: + _this.styles.borderTopRightRadius = + _this.styles.borderTopLeftRadius = + _this.styles.borderBottomRightRadius = + _this.styles.borderBottomLeftRadius = + RADIO_BORDER_RADIUS; + break; + } + return _this; + } + return InputElementContainer; + })(ElementContainer); var SelectElementContainer = /** @class */ (function (_super) { - __extends(SelectElementContainer, _super); - function SelectElementContainer(context, element) { - var _this = _super.call(this, context, element) || this; - var option = element.options[element.selectedIndex || 0]; - _this.value = option ? option.text || '' : ''; - return _this; - } - return SelectElementContainer; - }(ElementContainer)); + __extends(SelectElementContainer, _super); + function SelectElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + var option = element.options[element.selectedIndex || 0]; + _this.value = option ? option.text || "" : ""; + return _this; + } + return SelectElementContainer; + })(ElementContainer); var TextareaElementContainer = /** @class */ (function (_super) { - __extends(TextareaElementContainer, _super); - function TextareaElementContainer(context, element) { - var _this = _super.call(this, context, element) || this; - _this.value = element.value; - return _this; - } - return TextareaElementContainer; - }(ElementContainer)); + __extends(TextareaElementContainer, _super); + function TextareaElementContainer(context, element) { + var _this = _super.call(this, context, element) || this; + _this.value = element.value; + return _this; + } + return TextareaElementContainer; + })(ElementContainer); var IFrameElementContainer = /** @class */ (function (_super) { - __extends(IFrameElementContainer, _super); - function IFrameElementContainer(context, iframe) { - var _this = _super.call(this, context, iframe) || this; - _this.src = iframe.src; - _this.width = parseInt(iframe.width, 10) || 0; - _this.height = parseInt(iframe.height, 10) || 0; - _this.backgroundColor = _this.styles.backgroundColor; - try { - if (iframe.contentWindow && - iframe.contentWindow.document && - iframe.contentWindow.document.documentElement) { - _this.tree = parseTree(context, iframe.contentWindow.document.documentElement); - // http://www.w3.org/TR/css3-background/#special-backgrounds - var documentBackgroundColor = iframe.contentWindow.document.documentElement - ? parseColor(context, getComputedStyle(iframe.contentWindow.document.documentElement).backgroundColor) - : COLORS.TRANSPARENT; - var bodyBackgroundColor = iframe.contentWindow.document.body - ? parseColor(context, getComputedStyle(iframe.contentWindow.document.body).backgroundColor) - : COLORS.TRANSPARENT; - _this.backgroundColor = isTransparent(documentBackgroundColor) - ? isTransparent(bodyBackgroundColor) - ? _this.styles.backgroundColor - : bodyBackgroundColor - : documentBackgroundColor; - } - } - catch (e) { } - return _this; - } - return IFrameElementContainer; - }(ElementContainer)); + __extends(IFrameElementContainer, _super); + function IFrameElementContainer(context, iframe) { + var _this = _super.call(this, context, iframe) || this; + _this.src = iframe.src; + _this.width = parseInt(iframe.width, 10) || 0; + _this.height = parseInt(iframe.height, 10) || 0; + _this.backgroundColor = _this.styles.backgroundColor; + try { + if ( + iframe.contentWindow && + iframe.contentWindow.document && + iframe.contentWindow.document.documentElement + ) { + _this.tree = parseTree( + context, + iframe.contentWindow.document.documentElement, + ); + // http://www.w3.org/TR/css3-background/#special-backgrounds + var documentBackgroundColor = iframe.contentWindow.document + .documentElement + ? parseColor( + context, + getComputedStyle( + iframe.contentWindow.document.documentElement, + ).backgroundColor, + ) + : COLORS.TRANSPARENT; + var bodyBackgroundColor = iframe.contentWindow.document.body + ? parseColor( + context, + getComputedStyle(iframe.contentWindow.document.body) + .backgroundColor, + ) + : COLORS.TRANSPARENT; + _this.backgroundColor = isTransparent(documentBackgroundColor) + ? isTransparent(bodyBackgroundColor) + ? _this.styles.backgroundColor + : bodyBackgroundColor + : documentBackgroundColor; + } + } catch (e) {} + return _this; + } + return IFrameElementContainer; + })(ElementContainer); - var LIST_OWNERS = ['OL', 'UL', 'MENU']; + var LIST_OWNERS = ["OL", "UL", "MENU"]; var parseNodeTree = function (context, node, parent, root) { - for (var childNode = node.firstChild, nextNode = void 0; childNode; childNode = nextNode) { - nextNode = childNode.nextSibling; - if (isTextNode(childNode) && childNode.data.trim().length > 0) { - parent.textNodes.push(new TextContainer(context, childNode, parent.styles)); - } - else if (isElementNode(childNode)) { - if (isSlotElement(childNode) && childNode.assignedNodes) { - childNode.assignedNodes().forEach(function (childNode) { return parseNodeTree(context, childNode, parent, root); }); - } - else { - var container = createContainer(context, childNode); - if (container.styles.isVisible()) { - if (createsRealStackingContext(childNode, container, root)) { - container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */; - } - else if (createsStackingContext(container.styles)) { - container.flags |= 2 /* CREATES_STACKING_CONTEXT */; - } - if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) { - container.flags |= 8 /* IS_LIST_OWNER */; - } - parent.elements.push(container); - childNode.slot; - if (childNode.shadowRoot) { - parseNodeTree(context, childNode.shadowRoot, container, root); - } - else if (!isTextareaElement(childNode) && - !isSVGElement(childNode) && - !isSelectElement(childNode)) { - parseNodeTree(context, childNode, container, root); - } - } - } + for ( + var childNode = node.firstChild, nextNode = void 0; + childNode; + childNode = nextNode + ) { + nextNode = childNode.nextSibling; + if (isTextNode(childNode) && childNode.data.trim().length > 0) { + parent.textNodes.push( + new TextContainer(context, childNode, parent.styles), + ); + } else if (isElementNode(childNode)) { + if (isSlotElement(childNode) && childNode.assignedNodes) { + childNode.assignedNodes().forEach(function (childNode) { + return parseNodeTree(context, childNode, parent, root); + }); + } else { + var container = createContainer(context, childNode); + if (container.styles.isVisible()) { + if (createsRealStackingContext(childNode, container, root)) { + container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */; + } else if (createsStackingContext(container.styles)) { + container.flags |= 2 /* CREATES_STACKING_CONTEXT */; + } + if (LIST_OWNERS.indexOf(childNode.tagName) !== -1) { + container.flags |= 8 /* IS_LIST_OWNER */; + } + parent.elements.push(container); + childNode.slot; + if (childNode.shadowRoot) { + parseNodeTree(context, childNode.shadowRoot, container, root); + } else if ( + !isTextareaElement(childNode) && + !isSVGElement(childNode) && + !isSelectElement(childNode) + ) { + parseNodeTree(context, childNode, container, root); + } } + } } + } }; var createContainer = function (context, element) { - if (isImageElement(element)) { - return new ImageElementContainer(context, element); - } - if (isCanvasElement(element)) { - return new CanvasElementContainer(context, element); - } - if (isSVGElement(element)) { - return new SVGElementContainer(context, element); - } - if (isLIElement(element)) { - return new LIElementContainer(context, element); - } - if (isOLElement(element)) { - return new OLElementContainer(context, element); - } - if (isInputElement(element)) { - return new InputElementContainer(context, element); - } - if (isSelectElement(element)) { - return new SelectElementContainer(context, element); - } - if (isTextareaElement(element)) { - return new TextareaElementContainer(context, element); - } - if (isIFrameElement(element)) { - return new IFrameElementContainer(context, element); - } - return new ElementContainer(context, element); + if (isImageElement(element)) { + return new ImageElementContainer(context, element); + } + if (isCanvasElement(element)) { + return new CanvasElementContainer(context, element); + } + if (isSVGElement(element)) { + return new SVGElementContainer(context, element); + } + if (isLIElement(element)) { + return new LIElementContainer(context, element); + } + if (isOLElement(element)) { + return new OLElementContainer(context, element); + } + if (isInputElement(element)) { + return new InputElementContainer(context, element); + } + if (isSelectElement(element)) { + return new SelectElementContainer(context, element); + } + if (isTextareaElement(element)) { + return new TextareaElementContainer(context, element); + } + if (isIFrameElement(element)) { + return new IFrameElementContainer(context, element); + } + return new ElementContainer(context, element); }; var parseTree = function (context, element) { - var container = createContainer(context, element); - container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */; - parseNodeTree(context, element, container, container); - return container; + var container = createContainer(context, element); + container.flags |= 4 /* CREATES_REAL_STACKING_CONTEXT */; + parseNodeTree(context, element, container, container); + return container; }; var createsRealStackingContext = function (node, container, root) { - return (container.styles.isPositionedWithZIndex() || - container.styles.opacity < 1 || - container.styles.isTransformed() || - (isBodyElement(node) && root.styles.isTransparent())); + return ( + container.styles.isPositionedWithZIndex() || + container.styles.opacity < 1 || + container.styles.isTransformed() || + (isBodyElement(node) && root.styles.isTransparent()) + ); + }; + var createsStackingContext = function (styles) { + return styles.isPositioned() || styles.isFloating(); + }; + var isTextNode = function (node) { + return node.nodeType === Node.TEXT_NODE; + }; + var isElementNode = function (node) { + return node.nodeType === Node.ELEMENT_NODE; }; - var createsStackingContext = function (styles) { return styles.isPositioned() || styles.isFloating(); }; - var isTextNode = function (node) { return node.nodeType === Node.TEXT_NODE; }; - var isElementNode = function (node) { return node.nodeType === Node.ELEMENT_NODE; }; var isHTMLElementNode = function (node) { - return isElementNode(node) && typeof node.style !== 'undefined' && !isSVGElementNode(node); + return ( + isElementNode(node) && + typeof node.style !== "undefined" && + !isSVGElementNode(node) + ); }; var isSVGElementNode = function (element) { - return typeof element.className === 'object'; + return typeof element.className === "object"; + }; + var isLIElement = function (node) { + return node.tagName === "LI"; + }; + var isOLElement = function (node) { + return node.tagName === "OL"; + }; + var isInputElement = function (node) { + return node.tagName === "INPUT"; + }; + var isHTMLElement = function (node) { + return node.tagName === "HTML"; + }; + var isSVGElement = function (node) { + return node.tagName === "svg"; + }; + var isBodyElement = function (node) { + return node.tagName === "BODY"; + }; + var isCanvasElement = function (node) { + return node.tagName === "CANVAS"; + }; + var isVideoElement = function (node) { + return node.tagName === "VIDEO"; + }; + var isImageElement = function (node) { + return node.tagName === "IMG"; + }; + var isIFrameElement = function (node) { + return node.tagName === "IFRAME"; + }; + var isStyleElement = function (node) { + return node.tagName === "STYLE"; + }; + var isScriptElement = function (node) { + return node.tagName === "SCRIPT"; + }; + var isTextareaElement = function (node) { + return node.tagName === "TEXTAREA"; + }; + var isSelectElement = function (node) { + return node.tagName === "SELECT"; + }; + var isSlotElement = function (node) { + return node.tagName === "SLOT"; }; - var isLIElement = function (node) { return node.tagName === 'LI'; }; - var isOLElement = function (node) { return node.tagName === 'OL'; }; - var isInputElement = function (node) { return node.tagName === 'INPUT'; }; - var isHTMLElement = function (node) { return node.tagName === 'HTML'; }; - var isSVGElement = function (node) { return node.tagName === 'svg'; }; - var isBodyElement = function (node) { return node.tagName === 'BODY'; }; - var isCanvasElement = function (node) { return node.tagName === 'CANVAS'; }; - var isVideoElement = function (node) { return node.tagName === 'VIDEO'; }; - var isImageElement = function (node) { return node.tagName === 'IMG'; }; - var isIFrameElement = function (node) { return node.tagName === 'IFRAME'; }; - var isStyleElement = function (node) { return node.tagName === 'STYLE'; }; - var isScriptElement = function (node) { return node.tagName === 'SCRIPT'; }; - var isTextareaElement = function (node) { return node.tagName === 'TEXTAREA'; }; - var isSelectElement = function (node) { return node.tagName === 'SELECT'; }; - var isSlotElement = function (node) { return node.tagName === 'SLOT'; }; // https://html.spec.whatwg.org/multipage/custom-elements.html#valid-custom-element-name - var isCustomElement = function (node) { return node.tagName.indexOf('-') > 0; }; + var isCustomElement = function (node) { + return node.tagName.indexOf("-") > 0; + }; var CounterState = /** @class */ (function () { - function CounterState() { - this.counters = {}; + function CounterState() { + this.counters = {}; + } + CounterState.prototype.getCounterValue = function (name) { + var counter = this.counters[name]; + if (counter && counter.length) { + return counter[counter.length - 1]; } - CounterState.prototype.getCounterValue = function (name) { - var counter = this.counters[name]; - if (counter && counter.length) { - return counter[counter.length - 1]; + return 1; + }; + CounterState.prototype.getCounterValues = function (name) { + var counter = this.counters[name]; + return counter ? counter : []; + }; + CounterState.prototype.pop = function (counters) { + var _this = this; + counters.forEach(function (counter) { + return _this.counters[counter].pop(); + }); + }; + CounterState.prototype.parse = function (style) { + var _this = this; + var counterIncrement = style.counterIncrement; + var counterReset = style.counterReset; + var canReset = true; + if (counterIncrement !== null) { + counterIncrement.forEach(function (entry) { + var counter = _this.counters[entry.counter]; + if (counter && entry.increment !== 0) { + canReset = false; + if (!counter.length) { + counter.push(1); + } + counter[Math.max(0, counter.length - 1)] += entry.increment; } - return 1; - }; - CounterState.prototype.getCounterValues = function (name) { - var counter = this.counters[name]; - return counter ? counter : []; - }; - CounterState.prototype.pop = function (counters) { - var _this = this; - counters.forEach(function (counter) { return _this.counters[counter].pop(); }); - }; - CounterState.prototype.parse = function (style) { - var _this = this; - var counterIncrement = style.counterIncrement; - var counterReset = style.counterReset; - var canReset = true; - if (counterIncrement !== null) { - counterIncrement.forEach(function (entry) { - var counter = _this.counters[entry.counter]; - if (counter && entry.increment !== 0) { - canReset = false; - if (!counter.length) { - counter.push(1); - } - counter[Math.max(0, counter.length - 1)] += entry.increment; - } - }); + }); + } + var counterNames = []; + if (canReset) { + counterReset.forEach(function (entry) { + var counter = _this.counters[entry.counter]; + counterNames.push(entry.counter); + if (!counter) { + counter = _this.counters[entry.counter] = []; } - var counterNames = []; - if (canReset) { - counterReset.forEach(function (entry) { - var counter = _this.counters[entry.counter]; - counterNames.push(entry.counter); - if (!counter) { - counter = _this.counters[entry.counter] = []; - } - counter.push(entry.reset); - }); - } - return counterNames; - }; - return CounterState; - }()); + counter.push(entry.reset); + }); + } + return counterNames; + }; + return CounterState; + })(); var ROMAN_UPPER = { - integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1], - values: ['M', 'CM', 'D', 'CD', 'C', 'XC', 'L', 'XL', 'X', 'IX', 'V', 'IV', 'I'] + integers: [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1], + values: [ + "M", + "CM", + "D", + "CD", + "C", + "XC", + "L", + "XL", + "X", + "IX", + "V", + "IV", + "I", + ], }; var ARMENIAN = { - integers: [ - 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, - 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 - ], - values: [ - 'Ք', - 'Փ', - 'Ւ', - 'Ց', - 'Ր', - 'Տ', - 'Վ', - 'Ս', - 'Ռ', - 'Ջ', - 'Պ', - 'Չ', - 'Ո', - 'Շ', - 'Ն', - 'Յ', - 'Մ', - 'Ճ', - 'Ղ', - 'Ձ', - 'Հ', - 'Կ', - 'Ծ', - 'Խ', - 'Լ', - 'Ի', - 'Ժ', - 'Թ', - 'Ը', - 'Է', - 'Զ', - 'Ե', - 'Դ', - 'Գ', - 'Բ', - 'Ա' - ] + integers: [ + 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, + 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, 9, + 8, 7, 6, 5, 4, 3, 2, 1, + ], + values: [ + "Ք", + "Փ", + "Ւ", + "Ց", + "Ր", + "Տ", + "Վ", + "Ս", + "Ռ", + "Ջ", + "Պ", + "Չ", + "Ո", + "Շ", + "Ն", + "Յ", + "Մ", + "Ճ", + "Ղ", + "Ձ", + "Հ", + "Կ", + "Ծ", + "Խ", + "Լ", + "Ի", + "Ժ", + "Թ", + "Ը", + "Է", + "Զ", + "Ե", + "Դ", + "Գ", + "Բ", + "Ա", + ], }; var HEBREW = { - integers: [ - 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, - 19, 18, 17, 16, 15, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 - ], - values: [ - 'י׳', - 'ט׳', - 'ח׳', - 'ז׳', - 'ו׳', - 'ה׳', - 'ד׳', - 'ג׳', - 'ב׳', - 'א׳', - 'ת', - 'ש', - 'ר', - 'ק', - 'צ', - 'פ', - 'ע', - 'ס', - 'נ', - 'מ', - 'ל', - 'כ', - 'יט', - 'יח', - 'יז', - 'טז', - 'טו', - 'י', - 'ט', - 'ח', - 'ז', - 'ו', - 'ה', - 'ד', - 'ג', - 'ב', - 'א' - ] + integers: [ + 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 400, 300, + 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 19, 18, 17, 16, 15, 10, 9, + 8, 7, 6, 5, 4, 3, 2, 1, + ], + values: [ + "י׳", + "ט׳", + "ח׳", + "ז׳", + "ו׳", + "ה׳", + "ד׳", + "ג׳", + "ב׳", + "א׳", + "ת", + "ש", + "ר", + "ק", + "צ", + "פ", + "ע", + "ס", + "נ", + "מ", + "ל", + "כ", + "יט", + "יח", + "יז", + "טז", + "טו", + "י", + "ט", + "ח", + "ז", + "ו", + "ה", + "ד", + "ג", + "ב", + "א", + ], }; var GEORGIAN = { - integers: [ - 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, 700, 600, 500, 400, 300, 200, 100, 90, - 80, 70, 60, 50, 40, 30, 20, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 - ], - values: [ - 'ჵ', - 'ჰ', - 'ჯ', - 'ჴ', - 'ხ', - 'ჭ', - 'წ', - 'ძ', - 'ც', - 'ჩ', - 'შ', - 'ყ', - 'ღ', - 'ქ', - 'ფ', - 'ჳ', - 'ტ', - 'ს', - 'რ', - 'ჟ', - 'პ', - 'ო', - 'ჲ', - 'ნ', - 'მ', - 'ლ', - 'კ', - 'ი', - 'თ', - 'ჱ', - 'ზ', - 'ვ', - 'ე', - 'დ', - 'გ', - 'ბ', - 'ა' - ] + integers: [ + 10000, 9000, 8000, 7000, 6000, 5000, 4000, 3000, 2000, 1000, 900, 800, + 700, 600, 500, 400, 300, 200, 100, 90, 80, 70, 60, 50, 40, 30, 20, 10, + 9, 8, 7, 6, 5, 4, 3, 2, 1, + ], + values: [ + "ჵ", + "ჰ", + "ჯ", + "ჴ", + "ხ", + "ჭ", + "წ", + "ძ", + "ც", + "ჩ", + "შ", + "ყ", + "ღ", + "ქ", + "ფ", + "ჳ", + "ტ", + "ს", + "რ", + "ჟ", + "პ", + "ო", + "ჲ", + "ნ", + "მ", + "ლ", + "კ", + "ი", + "თ", + "ჱ", + "ზ", + "ვ", + "ე", + "დ", + "გ", + "ბ", + "ა", + ], }; - var createAdditiveCounter = function (value, min, max, symbols, fallback, suffix) { - if (value < min || value > max) { - return createCounterText(value, fallback, suffix.length > 0); + var createAdditiveCounter = function ( + value, + min, + max, + symbols, + fallback, + suffix, + ) { + if (value < min || value > max) { + return createCounterText(value, fallback, suffix.length > 0); + } + return ( + symbols.integers.reduce(function (string, integer, index) { + while (value >= integer) { + value -= integer; + string += symbols.values[index]; + } + return string; + }, "") + suffix + ); + }; + var createCounterStyleWithSymbolResolver = function ( + value, + codePointRangeLength, + isNumeric, + resolver, + ) { + var string = ""; + do { + if (!isNumeric) { + value--; } - return (symbols.integers.reduce(function (string, integer, index) { - while (value >= integer) { - value -= integer; - string += symbols.values[index]; - } - return string; - }, '') + suffix); + string = resolver(value) + string; + value /= codePointRangeLength; + } while (value * codePointRangeLength >= codePointRangeLength); + return string; }; - var createCounterStyleWithSymbolResolver = function (value, codePointRangeLength, isNumeric, resolver) { - var string = ''; - do { - if (!isNumeric) { - value--; - } - string = resolver(value) + string; - value /= codePointRangeLength; - } while (value * codePointRangeLength >= codePointRangeLength); - return string; - }; - var createCounterStyleFromRange = function (value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) { - var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1; - return ((value < 0 ? '-' : '') + - (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) { - return fromCodePoint$1(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart); - }) + - suffix)); + var createCounterStyleFromRange = function ( + value, + codePointRangeStart, + codePointRangeEnd, + isNumeric, + suffix, + ) { + var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1; + return ( + (value < 0 ? "-" : "") + + (createCounterStyleWithSymbolResolver( + Math.abs(value), + codePointRangeLength, + isNumeric, + function (codePoint) { + return fromCodePoint$1( + Math.floor(codePoint % codePointRangeLength) + + codePointRangeStart, + ); + }, + ) + + suffix) + ); }; var createCounterStyleFromSymbols = function (value, symbols, suffix) { - if (suffix === void 0) { suffix = '. '; } - var codePointRangeLength = symbols.length; - return (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, false, function (codePoint) { return symbols[Math.floor(codePoint % codePointRangeLength)]; }) + suffix); + if (suffix === void 0) { + suffix = ". "; + } + var codePointRangeLength = symbols.length; + return ( + createCounterStyleWithSymbolResolver( + Math.abs(value), + codePointRangeLength, + false, + function (codePoint) { + return symbols[Math.floor(codePoint % codePointRangeLength)]; + }, + ) + suffix + ); }; var CJK_ZEROS = 1 << 0; var CJK_TEN_COEFFICIENTS = 1 << 1; var CJK_TEN_HIGH_COEFFICIENTS = 1 << 2; var CJK_HUNDRED_COEFFICIENTS = 1 << 3; - var createCJKCounter = function (value, numbers, multipliers, negativeSign, suffix, flags) { - if (value < -9999 || value > 9999) { - return createCounterText(value, 4 /* CJK_DECIMAL */, suffix.length > 0); + var createCJKCounter = function ( + value, + numbers, + multipliers, + negativeSign, + suffix, + flags, + ) { + if (value < -9999 || value > 9999) { + return createCounterText( + value, + 4 /* CJK_DECIMAL */, + suffix.length > 0, + ); + } + var tmp = Math.abs(value); + var string = suffix; + if (tmp === 0) { + return numbers[0] + string; + } + for (var digit = 0; tmp > 0 && digit <= 4; digit++) { + var coefficient = tmp % 10; + if ( + coefficient === 0 && + contains(flags, CJK_ZEROS) && + string !== "" + ) { + string = numbers[coefficient] + string; + } else if ( + coefficient > 1 || + (coefficient === 1 && digit === 0) || + (coefficient === 1 && + digit === 1 && + contains(flags, CJK_TEN_COEFFICIENTS)) || + (coefficient === 1 && + digit === 1 && + contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && + value > 100) || + (coefficient === 1 && + digit > 1 && + contains(flags, CJK_HUNDRED_COEFFICIENTS)) + ) { + string = + numbers[coefficient] + + (digit > 0 ? multipliers[digit - 1] : "") + + string; + } else if (coefficient === 1 && digit > 0) { + string = multipliers[digit - 1] + string; } - var tmp = Math.abs(value); - var string = suffix; - if (tmp === 0) { - return numbers[0] + string; - } - for (var digit = 0; tmp > 0 && digit <= 4; digit++) { - var coefficient = tmp % 10; - if (coefficient === 0 && contains(flags, CJK_ZEROS) && string !== '') { - string = numbers[coefficient] + string; - } - else if (coefficient > 1 || - (coefficient === 1 && digit === 0) || - (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_COEFFICIENTS)) || - (coefficient === 1 && digit === 1 && contains(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100) || - (coefficient === 1 && digit > 1 && contains(flags, CJK_HUNDRED_COEFFICIENTS))) { - string = numbers[coefficient] + (digit > 0 ? multipliers[digit - 1] : '') + string; - } - else if (coefficient === 1 && digit > 0) { - string = multipliers[digit - 1] + string; - } - tmp = Math.floor(tmp / 10); - } - return (value < 0 ? negativeSign : '') + string; + tmp = Math.floor(tmp / 10); + } + return (value < 0 ? negativeSign : "") + string; }; - var CHINESE_INFORMAL_MULTIPLIERS = '十百千萬'; - var CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬'; - var JAPANESE_NEGATIVE = 'マイナス'; - var KOREAN_NEGATIVE = '마이너스'; + var CHINESE_INFORMAL_MULTIPLIERS = "十百千萬"; + var CHINESE_FORMAL_MULTIPLIERS = "拾佰仟萬"; + var JAPANESE_NEGATIVE = "マイナス"; + var KOREAN_NEGATIVE = "마이너스"; var createCounterText = function (value, type, appendSuffix) { - var defaultSuffix = appendSuffix ? '. ' : ''; - var cjkSuffix = appendSuffix ? '、' : ''; - var koreanSuffix = appendSuffix ? ', ' : ''; - var spaceSuffix = appendSuffix ? ' ' : ''; - switch (type) { - case 0 /* DISC */: - return '•' + spaceSuffix; - case 1 /* CIRCLE */: - return '◦' + spaceSuffix; - case 2 /* SQUARE */: - return '◾' + spaceSuffix; - case 5 /* DECIMAL_LEADING_ZERO */: - var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix); - return string.length < 4 ? "0" + string : string; - case 4 /* CJK_DECIMAL */: - return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix); - case 6 /* LOWER_ROMAN */: - return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, 3 /* DECIMAL */, defaultSuffix).toLowerCase(); - case 7 /* UPPER_ROMAN */: - return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, 3 /* DECIMAL */, defaultSuffix); - case 8 /* LOWER_GREEK */: - return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix); - case 9 /* LOWER_ALPHA */: - return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix); - case 10 /* UPPER_ALPHA */: - return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix); - case 11 /* ARABIC_INDIC */: - return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix); - case 12 /* ARMENIAN */: - case 49 /* UPPER_ARMENIAN */: - return createAdditiveCounter(value, 1, 9999, ARMENIAN, 3 /* DECIMAL */, defaultSuffix); - case 35 /* LOWER_ARMENIAN */: - return createAdditiveCounter(value, 1, 9999, ARMENIAN, 3 /* DECIMAL */, defaultSuffix).toLowerCase(); - case 13 /* BENGALI */: - return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix); - case 14 /* CAMBODIAN */: - case 30 /* KHMER */: - return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix); - case 15 /* CJK_EARTHLY_BRANCH */: - return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix); - case 16 /* CJK_HEAVENLY_STEM */: - return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix); - case 17 /* CJK_IDEOGRAPHIC */: - case 48 /* TRAD_CHINESE_INFORMAL */: - return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case 47 /* TRAD_CHINESE_FORMAL */: - return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case 42 /* SIMP_CHINESE_INFORMAL */: - return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case 41 /* SIMP_CHINESE_FORMAL */: - return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case 26 /* JAPANESE_INFORMAL */: - return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0); - case 25 /* JAPANESE_FORMAL */: - return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case 31 /* KOREAN_HANGUL_FORMAL */: - return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case 33 /* KOREAN_HANJA_INFORMAL */: - return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0); - case 32 /* KOREAN_HANJA_FORMAL */: - return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case 18 /* DEVANAGARI */: - return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix); - case 20 /* GEORGIAN */: - return createAdditiveCounter(value, 1, 19999, GEORGIAN, 3 /* DECIMAL */, defaultSuffix); - case 21 /* GUJARATI */: - return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix); - case 22 /* GURMUKHI */: - return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix); - case 22 /* HEBREW */: - return createAdditiveCounter(value, 1, 10999, HEBREW, 3 /* DECIMAL */, defaultSuffix); - case 23 /* HIRAGANA */: - return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん'); - case 24 /* HIRAGANA_IROHA */: - return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす'); - case 27 /* KANNADA */: - return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix); - case 28 /* KATAKANA */: - return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix); - case 29 /* KATAKANA_IROHA */: - return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix); - case 34 /* LAO */: - return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix); - case 37 /* MONGOLIAN */: - return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix); - case 38 /* MYANMAR */: - return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix); - case 39 /* ORIYA */: - return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix); - case 40 /* PERSIAN */: - return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix); - case 43 /* TAMIL */: - return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix); - case 44 /* TELUGU */: - return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix); - case 45 /* THAI */: - return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix); - case 46 /* TIBETAN */: - return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix); - case 3 /* DECIMAL */: - default: - return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix); - } + var defaultSuffix = appendSuffix ? ". " : ""; + var cjkSuffix = appendSuffix ? "、" : ""; + var koreanSuffix = appendSuffix ? ", " : ""; + var spaceSuffix = appendSuffix ? " " : ""; + switch (type) { + case 0 /* DISC */: + return "•" + spaceSuffix; + case 1 /* CIRCLE */: + return "◦" + spaceSuffix; + case 2 /* SQUARE */: + return "◾" + spaceSuffix; + case 5 /* DECIMAL_LEADING_ZERO */: + var string = createCounterStyleFromRange( + value, + 48, + 57, + true, + defaultSuffix, + ); + return string.length < 4 ? "0" + string : string; + case 4 /* CJK_DECIMAL */: + return createCounterStyleFromSymbols( + value, + "〇一二三四五六七八九", + cjkSuffix, + ); + case 6 /* LOWER_ROMAN */: + return createAdditiveCounter( + value, + 1, + 3999, + ROMAN_UPPER, + 3 /* DECIMAL */, + defaultSuffix, + ).toLowerCase(); + case 7 /* UPPER_ROMAN */: + return createAdditiveCounter( + value, + 1, + 3999, + ROMAN_UPPER, + 3 /* DECIMAL */, + defaultSuffix, + ); + case 8 /* LOWER_GREEK */: + return createCounterStyleFromRange( + value, + 945, + 969, + false, + defaultSuffix, + ); + case 9 /* LOWER_ALPHA */: + return createCounterStyleFromRange( + value, + 97, + 122, + false, + defaultSuffix, + ); + case 10 /* UPPER_ALPHA */: + return createCounterStyleFromRange( + value, + 65, + 90, + false, + defaultSuffix, + ); + case 11 /* ARABIC_INDIC */: + return createCounterStyleFromRange( + value, + 1632, + 1641, + true, + defaultSuffix, + ); + case 12 /* ARMENIAN */: + case 49 /* UPPER_ARMENIAN */: + return createAdditiveCounter( + value, + 1, + 9999, + ARMENIAN, + 3 /* DECIMAL */, + defaultSuffix, + ); + case 35 /* LOWER_ARMENIAN */: + return createAdditiveCounter( + value, + 1, + 9999, + ARMENIAN, + 3 /* DECIMAL */, + defaultSuffix, + ).toLowerCase(); + case 13 /* BENGALI */: + return createCounterStyleFromRange( + value, + 2534, + 2543, + true, + defaultSuffix, + ); + case 14 /* CAMBODIAN */: + case 30 /* KHMER */: + return createCounterStyleFromRange( + value, + 6112, + 6121, + true, + defaultSuffix, + ); + case 15 /* CJK_EARTHLY_BRANCH */: + return createCounterStyleFromSymbols( + value, + "子丑寅卯辰巳午未申酉戌亥", + cjkSuffix, + ); + case 16 /* CJK_HEAVENLY_STEM */: + return createCounterStyleFromSymbols( + value, + "甲乙丙丁戊己庚辛壬癸", + cjkSuffix, + ); + case 17 /* CJK_IDEOGRAPHIC */: + case 48 /* TRAD_CHINESE_INFORMAL */: + return createCJKCounter( + value, + "零一二三四五六七八九", + CHINESE_INFORMAL_MULTIPLIERS, + "負", + cjkSuffix, + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS, + ); + case 47 /* TRAD_CHINESE_FORMAL */: + return createCJKCounter( + value, + "零壹貳參肆伍陸柒捌玖", + CHINESE_FORMAL_MULTIPLIERS, + "負", + cjkSuffix, + CJK_ZEROS | + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS, + ); + case 42 /* SIMP_CHINESE_INFORMAL */: + return createCJKCounter( + value, + "零一二三四五六七八九", + CHINESE_INFORMAL_MULTIPLIERS, + "负", + cjkSuffix, + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS, + ); + case 41 /* SIMP_CHINESE_FORMAL */: + return createCJKCounter( + value, + "零壹贰叁肆伍陆柒捌玖", + CHINESE_FORMAL_MULTIPLIERS, + "负", + cjkSuffix, + CJK_ZEROS | + CJK_TEN_COEFFICIENTS | + CJK_TEN_HIGH_COEFFICIENTS | + CJK_HUNDRED_COEFFICIENTS, + ); + case 26 /* JAPANESE_INFORMAL */: + return createCJKCounter( + value, + "〇一二三四五六七八九", + "十百千万", + JAPANESE_NEGATIVE, + cjkSuffix, + 0, + ); + case 25 /* JAPANESE_FORMAL */: + return createCJKCounter( + value, + "零壱弐参四伍六七八九", + "拾百千万", + JAPANESE_NEGATIVE, + cjkSuffix, + CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS, + ); + case 31 /* KOREAN_HANGUL_FORMAL */: + return createCJKCounter( + value, + "영일이삼사오육칠팔구", + "십백천만", + KOREAN_NEGATIVE, + koreanSuffix, + CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS, + ); + case 33 /* KOREAN_HANJA_INFORMAL */: + return createCJKCounter( + value, + "零一二三四五六七八九", + "十百千萬", + KOREAN_NEGATIVE, + koreanSuffix, + 0, + ); + case 32 /* KOREAN_HANJA_FORMAL */: + return createCJKCounter( + value, + "零壹貳參四五六七八九", + "拾百千", + KOREAN_NEGATIVE, + koreanSuffix, + CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS, + ); + case 18 /* DEVANAGARI */: + return createCounterStyleFromRange( + value, + 0x966, + 0x96f, + true, + defaultSuffix, + ); + case 20 /* GEORGIAN */: + return createAdditiveCounter( + value, + 1, + 19999, + GEORGIAN, + 3 /* DECIMAL */, + defaultSuffix, + ); + case 21 /* GUJARATI */: + return createCounterStyleFromRange( + value, + 0xae6, + 0xaef, + true, + defaultSuffix, + ); + case 22 /* GURMUKHI */: + return createCounterStyleFromRange( + value, + 0xa66, + 0xa6f, + true, + defaultSuffix, + ); + case 22 /* HEBREW */: + return createAdditiveCounter( + value, + 1, + 10999, + HEBREW, + 3 /* DECIMAL */, + defaultSuffix, + ); + case 23 /* HIRAGANA */: + return createCounterStyleFromSymbols( + value, + "あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん", + ); + case 24 /* HIRAGANA_IROHA */: + return createCounterStyleFromSymbols( + value, + "いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす", + ); + case 27 /* KANNADA */: + return createCounterStyleFromRange( + value, + 0xce6, + 0xcef, + true, + defaultSuffix, + ); + case 28 /* KATAKANA */: + return createCounterStyleFromSymbols( + value, + "アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン", + cjkSuffix, + ); + case 29 /* KATAKANA_IROHA */: + return createCounterStyleFromSymbols( + value, + "イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス", + cjkSuffix, + ); + case 34 /* LAO */: + return createCounterStyleFromRange( + value, + 0xed0, + 0xed9, + true, + defaultSuffix, + ); + case 37 /* MONGOLIAN */: + return createCounterStyleFromRange( + value, + 0x1810, + 0x1819, + true, + defaultSuffix, + ); + case 38 /* MYANMAR */: + return createCounterStyleFromRange( + value, + 0x1040, + 0x1049, + true, + defaultSuffix, + ); + case 39 /* ORIYA */: + return createCounterStyleFromRange( + value, + 0xb66, + 0xb6f, + true, + defaultSuffix, + ); + case 40 /* PERSIAN */: + return createCounterStyleFromRange( + value, + 0x6f0, + 0x6f9, + true, + defaultSuffix, + ); + case 43 /* TAMIL */: + return createCounterStyleFromRange( + value, + 0xbe6, + 0xbef, + true, + defaultSuffix, + ); + case 44 /* TELUGU */: + return createCounterStyleFromRange( + value, + 0xc66, + 0xc6f, + true, + defaultSuffix, + ); + case 45 /* THAI */: + return createCounterStyleFromRange( + value, + 0xe50, + 0xe59, + true, + defaultSuffix, + ); + case 46 /* TIBETAN */: + return createCounterStyleFromRange( + value, + 0xf20, + 0xf29, + true, + defaultSuffix, + ); + case 3 /* DECIMAL */: + default: + return createCounterStyleFromRange( + value, + 48, + 57, + true, + defaultSuffix, + ); + } }; - var IGNORE_ATTRIBUTE = 'data-html2canvas-ignore'; + var IGNORE_ATTRIBUTE = "data-html2canvas-ignore"; var DocumentCloner = /** @class */ (function () { - function DocumentCloner(context, element, options) { - this.context = context; - this.options = options; - this.scrolledElements = []; - this.referenceElement = element; - this.counters = new CounterState(); - this.quoteDepth = 0; - if (!element.ownerDocument) { - throw new Error('Cloned element does not have an owner document'); - } - this.documentElement = this.cloneNode(element.ownerDocument.documentElement, false); + function DocumentCloner(context, element, options) { + this.context = context; + this.options = options; + this.scrolledElements = []; + this.referenceElement = element; + this.counters = new CounterState(); + this.quoteDepth = 0; + if (!element.ownerDocument) { + throw new Error("Cloned element does not have an owner document"); } - DocumentCloner.prototype.toIFrame = function (ownerDocument, windowSize) { - var _this = this; - var iframe = createIFrameContainer(ownerDocument, windowSize); - if (!iframe.contentWindow) { - return Promise.reject("Unable to find iframe window"); - } - var scrollX = ownerDocument.defaultView.pageXOffset; - var scrollY = ownerDocument.defaultView.pageYOffset; - var cloneWindow = iframe.contentWindow; - var documentClone = cloneWindow.document; - /* Chrome doesn't detect relative background-images assigned in inline