diff --git a/.github/workflows/IssueAssignment.yml b/.github/workflows/IssueAssignment.yml new file mode 100644 index 00000000..f4520b87 --- /dev/null +++ b/.github/workflows/IssueAssignment.yml @@ -0,0 +1,29 @@ +name: Issue assignment + +on: + issues: + types: [opened] + +jobs: + auto-assign: + runs-on: ubuntu-latest + steps: + - name: 'Auto-assign issue' + uses: pozil/auto-assign-issue@v1.12.0 + with: + assignees: gioxx + numOfAssignee: 1 + allowSelfAssign: true + + - name: 'Comment on issue' + uses: actions/github-script@v7.0.1 + with: + script: | + const issueNumber = context.issue.number; + const message = "🇮🇹 Grazie per aver aperto la segnalazione. Ti informo, però, che il progetto è in fase di chiusura. Vedi https://github.com/gioxx/MarvellousSuspender/discussions/196.\n\n" + + "🇬🇧 Thank you for opening the issue. Please be advised, however, that the project will soon be closed due to Chrome V3 manifest and new policies. Please take a look here: https://github.com/gioxx/MarvellousSuspender/discussions/196."; + await github.rest.issues.createComment({ + ...context.repo, + issue_number: issueNumber, + body: message + }); diff --git a/.gitignore b/.gitignore index 2284fa15..51b7cbf5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,9 +1,8 @@ -**/Thumbs.db -**/*.pem -/node_modules -/assets/* -/build/* -/.idea/* -/.debris/* -build/zip/thegreatsuspender-6.30-dev/welcome.html +Thumbs.db .DS_Store +*.zip +.dccache +.vscode* +node_modules +*.pem +build diff --git a/Marvellous-Assets/remote_message.json b/Marvellous-Assets/remote_message.json new file mode 100644 index 00000000..ab80dc1b --- /dev/null +++ b/Marvellous-Assets/remote_message.json @@ -0,0 +1,5 @@ +{ + "_title": "Test titolo", + "content": "test contenuto", + "url": "" +} diff --git a/Marvellous-Screenshots/The Marvellous Suspender - About (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - About (1280x800p).png new file mode 100644 index 00000000..9136bdfb Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - About (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - About.png b/Marvellous-Screenshots/The Marvellous Suspender - About.png new file mode 100644 index 00000000..d4ea7ff1 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - About.png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Google (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - Google (1280x800p).png new file mode 100644 index 00000000..8c96f916 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Google (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Google.png b/Marvellous-Screenshots/The Marvellous Suspender - Google.png new file mode 100644 index 00000000..a463b32e Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Google.png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Google_Dark_Windows (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - Google_Dark_Windows (1280x800p).png new file mode 100644 index 00000000..d727a3f2 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Google_Dark_Windows (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Google_Dark_Windows.png b/Marvellous-Screenshots/The Marvellous Suspender - Google_Dark_Windows.png new file mode 100644 index 00000000..b83592c5 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Google_Dark_Windows.png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Keyboard shortcuts (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - Keyboard shortcuts (1280x800p).png new file mode 100644 index 00000000..58568e53 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Keyboard shortcuts (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Keyboard shortcuts.png b/Marvellous-Screenshots/The Marvellous Suspender - Keyboard shortcuts.png new file mode 100644 index 00000000..6edc0877 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Keyboard shortcuts.png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Session management (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - Session management (1280x800p).png new file mode 100644 index 00000000..fbdb4203 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Session management (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Session management.png b/Marvellous-Screenshots/The Marvellous Suspender - Session management.png new file mode 100644 index 00000000..4d44114e Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Session management.png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Settings (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - Settings (1280x800p).png new file mode 100644 index 00000000..3ad5a141 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Settings (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Settings.png b/Marvellous-Screenshots/The Marvellous Suspender - Settings.png new file mode 100644 index 00000000..aeacc171 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Settings.png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Suspend (1280x800p).png b/Marvellous-Screenshots/The Marvellous Suspender - Suspend (1280x800p).png new file mode 100644 index 00000000..c69750b1 Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Suspend (1280x800p).png differ diff --git a/Marvellous-Screenshots/The Marvellous Suspender - Suspend.png b/Marvellous-Screenshots/The Marvellous Suspender - Suspend.png new file mode 100644 index 00000000..0e9d68ea Binary files /dev/null and b/Marvellous-Screenshots/The Marvellous Suspender - Suspend.png differ diff --git a/README.md b/README.md index 214f18d0..01377870 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,25 @@ -# The Great Suspender +# The Marvellous Suspender - +[![Crowdin](https://badges.crowdin.net/tms/localized.svg)](https://crowdin.com/project/tms) -"The Great Suspender" is a free and open-source Google Chrome extension for people who find that chrome is consuming too much system resource or suffer from frequent chrome crashing. Once installed and enabled, this extension will automatically *suspend* tabs that have not been used for a while, freeing up memory and cpu that the tab was consuming. +"**The Marvellous Suspender**" is a free and open-source Google Chrome extension for people who find that chrome is consuming too much system resource or suffer from frequent chrome crashing. Totally based on the original "[The Great Suspender](https://github.com/greatsuspender/thegreatsuspender)" but without ADS tracking and problems explained [in this GitHub issue](https://github.com/greatsuspender/thegreatsuspender/issues/1263). -If you have suggestions or problems using the extension, please [submit a bug or a feature request](https://github.com/greatsuspender/thegreatsuspender/issues/). For other enquiries you can email me at greatsuspender@gmail.com. +Once installed and enabled, this extension will automatically *suspend* tabs that have not been used for a default, or user-configurable, time interval. As a result, resources such as memory and CPU that the tab was consuming are freed. -**If you have lost tabs from your browser:** I have written a guide for how to recover your lost tabs [here](https://github.com/deanoemcke/thegreatsuspender/issues/526 -). +If you have suggestions or problems using the extension, please [submit a bug or a feature request](https://github.com/gioxx/MarvellousSuspender/issues/). -### Chrome Web Store +**If you have lost tabs from your browser** you can read a guide for how to recover them [here](https://github.com/deanoemcke/thegreatsuspender/issues/526 +). -The Great Suspender is [available via the official Chrome Web Store](https://chrome.google.com/webstore/detail/the-great-suspender/klbibkeccnjlkjkiokjodocebajanakg). +## Chrome Web Store -Please note that the webstore version may be behind the latest version here. That is because I try to keep webstore updates down to a minimum due to their [disruptive effect](https://github.com/greatsuspender/thegreatsuspender/issues/526). +The Marvellous Suspender is [available via the official Chrome Web Store](https://go.gioxx.org/tgs). For more information on the permissions required for the extension, please refer to this gitHub issue: (https://github.com/greatsuspender/thegreatsuspender/issues/213) ### Install as an extension from source -1. Download the **[latest available version](https://github.com/greatsuspender/thegreatsuspender/releases)** and unarchive to your preferred location (whichever suits you). +1. Download the **[latest available version](https://github.com/gioxx/MarvellousSuspender/releases)** and unarchive to your preferred location (whichever suits you). 2. Using **Google Chrome** browser, navigate to chrome://extensions/ and enable "Developer mode" in the upper right corner. 3. Click on the Load unpacked extension... button. 4. Browse to the src directory of the unarchived folder and confirm. @@ -46,45 +46,15 @@ Done, without errors. The extension in crx format will be inside the build/crx/ directory. You can drag it into [extensions] (chrome://extensions) to install locally. -### Integrating with another Chrome extension or app - -This extension has a small external api to allow other extensions to request the suspension of a tab. See [this issue](https://github.com/greatsuspender/thegreatsuspender/issues/276) for more information. And please let me know about it so that I can try it out! - -### Windows Group Policies - -It is possible to force settings by defining group policies on Microsoft -Windows. +## Contributing to this extension -The whitelist is stored internally as a string, with one URL per line. - -The following settings can be defined: - -* `SCREEN_CAPTURE` (string, default: '0') -* `SCREEN_CAPTURE_FORCE` (boolean, default: false) -* `SUSPEND_IN_PLACE_OF_DISCARD` (boolean, default: false) -* `DISCARD_IN_PLACE_OF_SUSPEND` (boolean, default: false) -* `USE_ALT_SCREEN_CAPTURE_LIB` (boolean, default: false) -* `DISCARD_AFTER_SUSPEND` (boolean, default: false) -* `IGNORE_WHEN_OFFLINE` (boolean, default: false) -* `IGNORE_WHEN_CHARGING` (boolean, default: false) -* `UNSUSPEND_ON_FOCUS` (boolean, default: false) -* `IGNORE_PINNED` (boolean, default: true) -* `IGNORE_FORMS` (boolean, default: true) -* `IGNORE_AUDIO` (boolean, default: true) -* `IGNORE_ACTIVE_TABS` (boolean, default: true) -* `IGNORE_CACHE` (boolean, default: false) -* `ADD_CONTEXT` (boolean, default: true) -* `SYNC_SETTINGS` (boolean, default: true) -* `SUSPEND_TIME` (string (minutes), default: '60') -* `NO_NAG` (boolean, default: false) -* `WHITELIST` (string (one URL per line), default: '') -* `THEME` (string, default: 'light') +Contributions are very welcome. Feel free to submit pull requests for new features and bug fixes. For new features, ideally you would raise an issue for the proposed change first so that we can discuss ideas. This will go a long way to ensuring your pull request is accepted. -### Contributing to this extension +### Localization (l10n) -Contributions are very welcome. Feel free to submit pull requests for new features and bug fixes. For new features, ideally you would raise an issue for the proposed change first so that we can discuss ideas. This will go a long way to ensuring your pull request is accepted. +Feel free to help me to localize this extension in any language, you can do it using Crowdin connecting to https://crowdin.com/project/tms. If your mothertongue language is not available please "ping me" on [Twitter](https://twitter.com/Gioxx) or [submit a feature request](https://github.com/gioxx/MarvellousSuspender/issues/). -### License +## License This work is licensed under a GNU GENERAL PUBLIC LICENSE (v2) diff --git a/crowdin.yml b/crowdin.yml new file mode 100644 index 00000000..8fc70cf5 --- /dev/null +++ b/crowdin.yml @@ -0,0 +1,3 @@ +files: + - source: /src/_locales/en/messages.json + translation: /src/_locales/%locale%/messages.json diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index 8a0005a9..00000000 --- a/package-lock.json +++ /dev/null @@ -1,3664 +0,0 @@ -{ - "name": "thegreatsuspender", - "version": "0.0.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "acorn": { - "version": "5.7.3", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz", - "integrity": "sha512-T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==", - "dev": true - }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, - "requires": { - "acorn": "^3.0.4" - }, - "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true - } - } - }, - "ajv": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", - "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", - "dev": true, - "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" - } - }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true - }, - "ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "dev": true - }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", - "dev": true - }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", - "dev": true - }, - "archiver": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver/-/archiver-1.3.0.tgz", - "integrity": "sha1-TyGU1tj5nfP1MeaIHxTxXVX6ryI=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "async": "^2.0.0", - "buffer-crc32": "^0.2.1", - "glob": "^7.0.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0", - "tar-stream": "^1.5.0", - "walkdir": "^0.0.11", - "zip-stream": "^1.1.0" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - } - } - }, - "archiver-utils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-1.3.0.tgz", - "integrity": "sha1-5QtMCccL89aA4y/xt5lOn52JUXQ=", - "dev": true, - "requires": { - "glob": "^7.0.0", - "graceful-fs": "^4.1.0", - "lazystream": "^1.0.0", - "lodash": "^4.8.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "arr-diff": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", - "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", - "dev": true - }, - "arr-flatten": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", - "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", - "dev": true - }, - "arr-union": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", - "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", - "dev": true - }, - "array-each": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", - "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", - "dev": true - }, - "array-slice": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", - "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", - "dev": true - }, - "array-unique": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", - "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", - "dev": true - }, - "asn1": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", - "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", - "dev": true - }, - "assign-symbols": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", - "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", - "dev": true - }, - "async": { - "version": "0.1.22", - "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", - "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", - "dev": true - }, - "atob": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", - "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", - "dev": true - }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", - "dev": true, - "requires": { - "chalk": "^1.1.3", - "esutils": "^2.0.2", - "js-tokens": "^3.0.2" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true - }, - "base": { - "version": "0.11.2", - "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", - "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", - "dev": true, - "requires": { - "cache-base": "^1.0.1", - "class-utils": "^0.3.5", - "component-emitter": "^1.2.1", - "define-property": "^1.0.0", - "isobject": "^3.0.1", - "mixin-deep": "^1.2.0", - "pascalcase": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "base64-js": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz", - "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==", - "dev": true - }, - "bl": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", - "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", - "dev": true, - "requires": { - "readable-stream": "^2.3.5", - "safe-buffer": "^5.1.1" - } - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", - "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", - "dev": true, - "requires": { - "arr-flatten": "^1.1.0", - "array-unique": "^0.3.2", - "extend-shallow": "^2.0.1", - "fill-range": "^4.0.0", - "isobject": "^3.0.1", - "repeat-element": "^1.1.2", - "snapdragon": "^0.8.1", - "snapdragon-node": "^2.0.1", - "split-string": "^3.0.2", - "to-regex": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz", - "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==", - "dev": true, - "requires": { - "base64-js": "^1.0.2", - "ieee754": "^1.1.4" - } - }, - "buffer-alloc": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", - "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", - "dev": true, - "requires": { - "buffer-alloc-unsafe": "^1.1.0", - "buffer-fill": "^1.0.0" - } - }, - "buffer-alloc-unsafe": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", - "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==", - "dev": true - }, - "buffer-crc32": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", - "dev": true - }, - "buffer-fill": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=", - "dev": true - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", - "dev": true - }, - "cache-base": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", - "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", - "dev": true, - "requires": { - "collection-visit": "^1.0.0", - "component-emitter": "^1.2.1", - "get-value": "^2.0.6", - "has-value": "^1.0.0", - "isobject": "^3.0.1", - "set-value": "^2.0.0", - "to-object-path": "^0.3.0", - "union-value": "^1.0.0", - "unset-value": "^1.0.0" - } - }, - "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", - "dev": true, - "requires": { - "callsites": "^0.2.0" - } - }, - "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", - "dev": true - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } - } - }, - "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", - "dev": true - }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "class-utils": { - "version": "0.3.6", - "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", - "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "define-property": "^0.2.5", - "isobject": "^3.0.0", - "static-extend": "^0.1.1" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", - "dev": true, - "requires": { - "restore-cursor": "^2.0.0" - } - }, - "cli-width": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", - "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", - "dev": true - }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, - "coffee-script": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", - "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", - "dev": true - }, - "collection-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", - "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", - "dev": true, - "requires": { - "map-visit": "^1.0.0", - "object-visit": "^1.0.0" - } - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true - }, - "colors": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", - "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", - "dev": true - }, - "commander": { - "version": "2.19.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", - "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", - "dev": true - }, - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", - "dev": true - }, - "compress-commons": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-1.2.2.tgz", - "integrity": "sha1-UkqfEJA/OoEzibAiXSfEi7dRiQ8=", - "dev": true, - "requires": { - "buffer-crc32": "^0.2.1", - "crc32-stream": "^2.0.0", - "normalize-path": "^2.0.0", - "readable-stream": "^2.0.0" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - } - }, - "contains-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", - "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", - "dev": true - }, - "copy-descriptor": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", - "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", - "dev": true - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true - }, - "crc": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/crc/-/crc-3.8.0.tgz", - "integrity": "sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==", - "dev": true, - "requires": { - "buffer": "^5.1.0" - } - }, - "crc32-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-2.0.0.tgz", - "integrity": "sha1-483TtN8xaN10494/u8t7KX/pCPQ=", - "dev": true, - "requires": { - "crc": "^3.4.4", - "readable-stream": "^2.0.0" - } - }, - "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", - "dev": true, - "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "crx": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/crx/-/crx-3.2.1.tgz", - "integrity": "sha1-Fyk+51790IxtHIs+F0nS1XV89Cs=", - "dev": true, - "requires": { - "archiver": "^1.1.0", - "commander": "^2.5.0", - "es6-promise": "^3.0.0", - "node-rsa": "^0.2.10" - } - }, - "date-time": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/date-time/-/date-time-1.1.0.tgz", - "integrity": "sha1-GIdtC9pMGf5w3Tv0sDTygbEqQLY=", - "dev": true, - "requires": { - "time-zone": "^0.1.0" - } - }, - "dateformat": { - "version": "1.0.2-1.2.3", - "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", - "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", - "dev": true - }, - "db.js": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/db.js/-/db.js-0.15.0.tgz", - "integrity": "sha1-I5MoqPsXQQGwXzTuJd5wBryPdOQ=" - }, - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", - "dev": true - }, - "deep-is": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", - "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", - "dev": true - }, - "define-property": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", - "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", - "dev": true, - "requires": { - "is-descriptor": "^1.0.2", - "isobject": "^3.0.1" - }, - "dependencies": { - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "detect-file": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", - "dev": true - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "requires": { - "is-arrayish": "^0.2.1" - } - }, - "es6-promise": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", - "integrity": "sha1-oIzd6EzNvzTQJ6FFG8kdS80ophM=", - "dev": true - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true - }, - "eslint": { - "version": "4.19.1", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz", - "integrity": "sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==", - "dev": true, - "requires": { - "ajv": "^5.3.0", - "babel-code-frame": "^6.22.0", - "chalk": "^2.1.0", - "concat-stream": "^1.6.0", - "cross-spawn": "^5.1.0", - "debug": "^3.1.0", - "doctrine": "^2.1.0", - "eslint-scope": "^3.7.1", - "eslint-visitor-keys": "^1.0.0", - "espree": "^3.5.4", - "esquery": "^1.0.0", - "esutils": "^2.0.2", - "file-entry-cache": "^2.0.0", - "functional-red-black-tree": "^1.0.1", - "glob": "^7.1.2", - "globals": "^11.0.1", - "ignore": "^3.3.3", - "imurmurhash": "^0.1.4", - "inquirer": "^3.0.6", - "is-resolvable": "^1.0.0", - "js-yaml": "^3.9.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.3.0", - "lodash": "^4.17.4", - "minimatch": "^3.0.2", - "mkdirp": "^0.5.1", - "natural-compare": "^1.4.0", - "optionator": "^0.8.2", - "path-is-inside": "^1.0.2", - "pluralize": "^7.0.0", - "progress": "^2.0.0", - "regexpp": "^1.0.1", - "require-uncached": "^1.0.3", - "semver": "^5.3.0", - "strip-ansi": "^4.0.0", - "strip-json-comments": "~2.0.1", - "table": "4.0.2", - "text-table": "~0.2.0" - } - }, - "eslint-config-prettier": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-2.10.0.tgz", - "integrity": "sha512-Mhl90VLucfBuhmcWBgbUNtgBiK955iCDK1+aHAz7QfDQF6wuzWZ6JjihZ3ejJoGlJWIuko7xLqNm8BA5uenKhA==", - "dev": true, - "requires": { - "get-stdin": "^5.0.1" - } - }, - "eslint-config-standard": { - "version": "10.2.1", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz", - "integrity": "sha1-wGHk0GbzedwXzVYsZOgZtN1FRZE=", - "dev": true - }, - "eslint-import-resolver-node": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", - "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", - "dev": true, - "requires": { - "debug": "^2.6.9", - "resolve": "^1.5.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-module-utils": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.3.0.tgz", - "integrity": "sha512-lmDJgeOOjk8hObTysjqH7wyMi+nsHwwvfBykwfhjR1LNdd7C2uFJBvx4OpWYpXOw4df1yE1cDEVd1yLHitk34w==", - "dev": true, - "requires": { - "debug": "^2.6.8", - "pkg-dir": "^2.0.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-import": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.16.0.tgz", - "integrity": "sha512-z6oqWlf1x5GkHIFgrSvtmudnqM6Q60KM4KvpWi5ubonMjycLjndvd5+8VAZIsTlHC03djdgJuyKG6XO577px6A==", - "dev": true, - "requires": { - "contains-path": "^0.1.0", - "debug": "^2.6.9", - "doctrine": "1.5.0", - "eslint-import-resolver-node": "^0.3.2", - "eslint-module-utils": "^2.3.0", - "has": "^1.0.3", - "lodash": "^4.17.11", - "minimatch": "^3.0.4", - "read-pkg-up": "^2.0.0", - "resolve": "^1.9.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "doctrine": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", - "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", - "dev": true, - "requires": { - "esutils": "^2.0.2", - "isarray": "^1.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", - "dev": true, - "requires": { - "ignore": "^3.3.6", - "minimatch": "^3.0.4", - "resolve": "^1.3.3", - "semver": "5.3.0" - }, - "dependencies": { - "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", - "dev": true - } - } - }, - "eslint-plugin-promise": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-3.8.0.tgz", - "integrity": "sha512-JiFL9UFR15NKpHyGii1ZcvmtIqa3UTwiDAGb8atSffe43qJ3+1czVGN6UtkklpcJ2DVnqvTMzEKRaJdBkAL2aQ==", - "dev": true - }, - "eslint-plugin-standard": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.1.0.tgz", - "integrity": "sha512-fVcdyuKRr0EZ4fjWl3c+gp1BANFJD1+RaWa2UPYfMZ6jCtp5RG00kSaXnK/dE5sYzt4kaWJ9qdxqUfc0d9kX0w==", - "dev": true - }, - "eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==", - "dev": true, - "requires": { - "esrecurse": "^4.1.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", - "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", - "dev": true - }, - "espree": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz", - "integrity": "sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==", - "dev": true, - "requires": { - "acorn": "^5.5.0", - "acorn-jsx": "^3.0.0" - } - }, - "esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true - }, - "esquery": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", - "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", - "dev": true, - "requires": { - "estraverse": "^4.0.0" - } - }, - "esrecurse": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", - "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", - "dev": true, - "requires": { - "estraverse": "^4.1.0" - } - }, - "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", - "dev": true - }, - "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", - "dev": true - }, - "eventemitter2": { - "version": "0.4.14", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", - "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", - "dev": true - }, - "exit": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", - "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", - "dev": true - }, - "expand-brackets": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", - "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", - "dev": true, - "requires": { - "debug": "^2.3.3", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "posix-character-classes": "^0.1.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "expand-tilde": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "extend-shallow": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", - "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", - "dev": true, - "requires": { - "assign-symbols": "^1.0.0", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "external-editor": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz", - "integrity": "sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==", - "dev": true, - "requires": { - "chardet": "^0.4.0", - "iconv-lite": "^0.4.17", - "tmp": "^0.0.33" - } - }, - "extglob": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", - "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", - "dev": true, - "requires": { - "array-unique": "^0.3.2", - "define-property": "^1.0.0", - "expand-brackets": "^2.1.4", - "extend-shallow": "^2.0.1", - "fragment-cache": "^0.2.1", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "fast-deep-equal": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", - "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=", - "dev": true - }, - "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", - "dev": true - }, - "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5" - } - }, - "file-entry-cache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", - "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", - "dev": true, - "requires": { - "flat-cache": "^1.2.1", - "object-assign": "^4.0.1" - } - }, - "file-sync-cmp": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz", - "integrity": "sha1-peeo/7+kk7Q7kju9TKiaU7Y7YSs=", - "dev": true - }, - "fill-range": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", - "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-number": "^3.0.0", - "repeat-string": "^1.6.1", - "to-regex-range": "^2.1.0" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "find-up": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", - "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", - "dev": true, - "requires": { - "locate-path": "^2.0.0" - } - }, - "findup-sync": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", - "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", - "dev": true, - "requires": { - "glob": "~3.2.9", - "lodash": "~2.4.1" - }, - "dependencies": { - "glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", - "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", - "dev": true, - "requires": { - "inherits": "2", - "minimatch": "0.3" - } - }, - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", - "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - } - } - }, - "fined": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.1.tgz", - "integrity": "sha512-jQp949ZmEbiYHk3gkbdtpJ0G1+kgtLQBNdP5edFP7Fh+WAYceLQz6yO1SBj72Xkg8GVyTB3bBzAYrHJVh5Xd5g==", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "is-plain-object": "^2.0.3", - "object.defaults": "^1.1.0", - "object.pick": "^1.2.0", - "parse-filepath": "^1.0.1" - } - }, - "flagged-respawn": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.1.tgz", - "integrity": "sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==", - "dev": true - }, - "flat-cache": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz", - "integrity": "sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==", - "dev": true, - "requires": { - "circular-json": "^0.3.1", - "graceful-fs": "^4.1.2", - "rimraf": "~2.6.2", - "write": "^0.2.1" - } - }, - "for-in": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", - "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", - "dev": true - }, - "for-own": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", - "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", - "dev": true, - "requires": { - "for-in": "^1.0.1" - } - }, - "fragment-cache": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", - "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", - "dev": true, - "requires": { - "map-cache": "^0.2.2" - } - }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", - "dev": true - }, - "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", - "dev": true - }, - "get-value": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", - "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", - "dev": true - }, - "getobject": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", - "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", - "dev": true - }, - "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "global-modules": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", - "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", - "dev": true, - "requires": { - "global-prefix": "^1.0.1", - "is-windows": "^1.0.1", - "resolve-dir": "^1.0.0" - } - }, - "global-prefix": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.2", - "homedir-polyfill": "^1.0.1", - "ini": "^1.3.4", - "is-windows": "^1.0.1", - "which": "^1.2.14" - } - }, - "globals": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.11.0.tgz", - "integrity": "sha512-WHq43gS+6ufNOEqlrDBxVEbb8ntfXrfAUU2ZOpCxrBdGKW3gyv8mCxAfIBD0DroPKGrJ2eSsXsLtY9MPntsyTw==", - "dev": true - }, - "graceful-fs": { - "version": "4.1.15", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", - "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", - "dev": true - }, - "grunt": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", - "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", - "dev": true, - "requires": { - "async": "~0.1.22", - "coffee-script": "~1.3.3", - "colors": "~0.6.2", - "dateformat": "1.0.2-1.2.3", - "eventemitter2": "~0.4.13", - "exit": "~0.1.1", - "findup-sync": "~0.1.2", - "getobject": "~0.1.0", - "glob": "~3.1.21", - "grunt-legacy-log": "~0.1.0", - "grunt-legacy-util": "~0.2.0", - "hooker": "~0.2.3", - "iconv-lite": "~0.2.11", - "js-yaml": "~2.0.5", - "lodash": "~0.9.2", - "minimatch": "~0.2.12", - "nopt": "~1.0.10", - "rimraf": "~2.2.8", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "argparse": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", - "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", - "dev": true, - "requires": { - "underscore": "~1.7.0", - "underscore.string": "~2.4.0" - }, - "dependencies": { - "underscore.string": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", - "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", - "dev": true - } - } - }, - "esprima": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", - "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", - "dev": true - }, - "glob": { - "version": "3.1.21", - "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", - "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", - "dev": true, - "requires": { - "graceful-fs": "~1.2.0", - "inherits": "1", - "minimatch": "~0.2.11" - } - }, - "graceful-fs": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", - "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", - "dev": true - }, - "iconv-lite": { - "version": "0.2.11", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", - "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", - "dev": true - }, - "inherits": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", - "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", - "dev": true - }, - "js-yaml": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", - "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", - "dev": true, - "requires": { - "argparse": "~ 0.1.11", - "esprima": "~ 1.0.2" - } - }, - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - }, - "lru-cache": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", - "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", - "dev": true - }, - "minimatch": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", - "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", - "dev": true, - "requires": { - "lru-cache": "2", - "sigmund": "~1.0.0" - } - }, - "rimraf": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", - "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", - "dev": true - }, - "which": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", - "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", - "dev": true - } - } - }, - "grunt-cli": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.2.tgz", - "integrity": "sha512-8OHDiZZkcptxVXtMfDxJvmN7MVJNE8L/yIcPb4HB7TlyFD1kDvjHrb62uhySsU14wJx9ORMnTuhRMQ40lH/orQ==", - "dev": true, - "requires": { - "grunt-known-options": "~1.1.0", - "interpret": "~1.1.0", - "liftoff": "~2.5.0", - "nopt": "~4.0.1", - "v8flags": "~3.1.1" - }, - "dependencies": { - "nopt": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", - "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", - "dev": true, - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - } - } - }, - "grunt-contrib-clean": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-clean/-/grunt-contrib-clean-1.1.0.tgz", - "integrity": "sha1-Vkq/LQN4qYOhW54/MO51tzjEBjg=", - "dev": true, - "requires": { - "async": "^1.5.2", - "rimraf": "^2.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "grunt-contrib-copy": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz", - "integrity": "sha1-cGDGWB6QS4qw0A8HbgqPbj58NXM=", - "dev": true, - "requires": { - "chalk": "^1.1.1", - "file-sync-cmp": "^0.1.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "grunt-crx": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/grunt-crx/-/grunt-crx-1.0.5.tgz", - "integrity": "sha1-nU5QHO8WtyF3KmBBxNQdH5KFirU=", - "dev": true, - "requires": { - "crx": "^3.0.1", - "es6-promise": "^3.0.0", - "mkdirp": "^0.5.0", - "os-homedir": "^1.0.1", - "xtend": "^4.0.1" - } - }, - "grunt-known-options": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz", - "integrity": "sha512-cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==", - "dev": true - }, - "grunt-legacy-log": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", - "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "grunt-legacy-log-utils": "~0.1.1", - "hooker": "~0.2.3", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-legacy-log-utils": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", - "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", - "dev": true, - "requires": { - "colors": "~0.6.2", - "lodash": "~2.4.1", - "underscore.string": "~2.3.3" - }, - "dependencies": { - "lodash": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", - "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", - "dev": true - }, - "underscore.string": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", - "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", - "dev": true - } - } - }, - "grunt-legacy-util": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", - "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", - "dev": true, - "requires": { - "async": "~0.1.22", - "exit": "~0.1.1", - "getobject": "~0.1.0", - "hooker": "~0.2.3", - "lodash": "~0.9.2", - "underscore.string": "~2.2.1", - "which": "~1.0.5" - }, - "dependencies": { - "lodash": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", - "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", - "dev": true - }, - "which": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", - "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", - "dev": true - } - } - }, - "grunt-string-replace": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/grunt-string-replace/-/grunt-string-replace-1.3.1.tgz", - "integrity": "sha1-YzoDvHhIKg4OH5339kWBH8H7sWI=", - "dev": true, - "requires": { - "async": "^2.0.0", - "chalk": "^1.0.0" - }, - "dependencies": { - "async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz", - "integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==", - "dev": true, - "requires": { - "lodash": "^4.17.11" - } - }, - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true - }, - "has-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", - "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", - "dev": true, - "requires": { - "get-value": "^2.0.6", - "has-values": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "has-values": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", - "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "kind-of": "^4.0.0" - }, - "dependencies": { - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "homedir-polyfill": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", - "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", - "dev": true, - "requires": { - "parse-passwd": "^1.0.0" - } - }, - "hooker": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", - "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", - "dev": true - }, - "hosted-git-info": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz", - "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==", - "dev": true - }, - "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, - "requires": { - "safer-buffer": ">= 2.1.2 < 3" - } - }, - "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", - "dev": true - }, - "ignore": { - "version": "3.3.10", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", - "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", - "dev": true - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true - }, - "ini": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", - "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", - "dev": true - }, - "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "^3.0.0", - "chalk": "^2.0.0", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^2.0.4", - "figures": "^2.0.0", - "lodash": "^4.3.0", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rx-lite": "^4.0.8", - "rx-lite-aggregates": "^4.0.8", - "string-width": "^2.1.0", - "strip-ansi": "^4.0.0", - "through": "^2.3.6" - } - }, - "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", - "dev": true - }, - "is-absolute": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", - "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", - "dev": true, - "requires": { - "is-relative": "^1.0.0", - "is-windows": "^1.0.1" - } - }, - "is-accessor-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", - "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", - "dev": true - }, - "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", - "dev": true - }, - "is-data-descriptor": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", - "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-descriptor": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", - "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^0.1.6", - "is-data-descriptor": "^0.1.4", - "kind-of": "^5.0.0" - }, - "dependencies": { - "kind-of": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", - "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", - "dev": true - } - } - }, - "is-extendable": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", - "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", - "dev": true - }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true - }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } - }, - "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true - }, - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", - "dev": true, - "requires": { - "is-extglob": "^2.1.0" - } - }, - "is-number": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", - "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", - "dev": true - }, - "is-relative": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", - "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", - "dev": true, - "requires": { - "is-unc-path": "^1.0.0" - } - }, - "is-resolvable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", - "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", - "dev": true - }, - "is-unc-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", - "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", - "dev": true, - "requires": { - "unc-path-regex": "^0.1.2" - } - }, - "is-windows": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", - "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", - "dev": true - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", - "dev": true - }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", - "dev": true - }, - "js-yaml": { - "version": "3.12.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", - "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", - "dev": true, - "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - } - }, - "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", - "dev": true - }, - "kind-of": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", - "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", - "dev": true - }, - "lazystream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", - "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", - "dev": true, - "requires": { - "readable-stream": "^2.0.5" - } - }, - "levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - } - }, - "liftoff": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", - "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", - "dev": true, - "requires": { - "extend": "^3.0.0", - "findup-sync": "^2.0.0", - "fined": "^1.0.1", - "flagged-respawn": "^1.0.0", - "is-plain-object": "^2.0.4", - "object.map": "^1.0.0", - "rechoir": "^0.6.2", - "resolve": "^1.1.7" - }, - "dependencies": { - "findup-sync": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", - "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", - "dev": true, - "requires": { - "detect-file": "^1.0.0", - "is-glob": "^3.1.0", - "micromatch": "^3.0.4", - "resolve-dir": "^1.0.1" - } - } - } - }, - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", - "dev": true, - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "strip-bom": "^3.0.0" - } - }, - "locate-path": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", - "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", - "dev": true, - "requires": { - "p-locate": "^2.0.0", - "path-exists": "^3.0.0" - } - }, - "lodash": { - "version": "4.17.11", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", - "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", - "dev": true - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "make-iterator": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz", - "integrity": "sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "map-cache": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", - "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", - "dev": true - }, - "map-visit": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", - "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", - "dev": true, - "requires": { - "object-visit": "^1.0.0" - } - }, - "micromatch": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", - "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "braces": "^2.3.1", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "extglob": "^2.0.4", - "fragment-cache": "^0.2.1", - "kind-of": "^6.0.2", - "nanomatch": "^1.2.9", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.2" - } - }, - "mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "dev": true - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - }, - "mixin-deep": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", - "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", - "dev": true, - "requires": { - "for-in": "^1.0.2", - "is-extendable": "^1.0.1" - }, - "dependencies": { - "is-extendable": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", - "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4" - } - } - } - }, - "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", - "dev": true, - "requires": { - "minimist": "0.0.8" - } - }, - "ms": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true - }, - "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", - "dev": true - }, - "nanomatch": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", - "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", - "dev": true, - "requires": { - "arr-diff": "^4.0.0", - "array-unique": "^0.3.2", - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "fragment-cache": "^0.2.1", - "is-windows": "^1.0.2", - "kind-of": "^6.0.2", - "object.pick": "^1.3.0", - "regex-not": "^1.0.0", - "snapdragon": "^0.8.1", - "to-regex": "^3.0.1" - } - }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node-rsa": { - "version": "0.2.30", - "resolved": "https://registry.npmjs.org/node-rsa/-/node-rsa-0.2.30.tgz", - "integrity": "sha1-iRLiw7G2TM5sp4PKsa8oKzAK3uY=", - "dev": true, - "requires": { - "asn1": "0.2.3", - "lodash": "3.3.0" - }, - "dependencies": { - "lodash": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.3.0.tgz", - "integrity": "sha1-ARzlLQGxTmDq7qdqy5uLpCxwWBs=", - "dev": true - } - } - }, - "nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", - "dev": true, - "requires": { - "abbrev": "1" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "^1.0.1" - } - }, - "number-is-nan": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", - "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", - "dev": true - }, - "object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true - }, - "object-copy": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", - "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", - "dev": true, - "requires": { - "copy-descriptor": "^0.1.0", - "define-property": "^0.2.5", - "kind-of": "^3.0.3" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "object-visit": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", - "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", - "dev": true, - "requires": { - "isobject": "^3.0.0" - } - }, - "object.defaults": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", - "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", - "dev": true, - "requires": { - "array-each": "^1.0.1", - "array-slice": "^1.0.0", - "for-own": "^1.0.0", - "isobject": "^3.0.0" - } - }, - "object.map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", - "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", - "dev": true, - "requires": { - "for-own": "^1.0.0", - "make-iterator": "^1.0.0" - } - }, - "object.pick": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", - "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, - "requires": { - "wrappy": "1" - } - }, - "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "^1.0.0" - } - }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.4", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "wordwrap": "~1.0.0" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", - "dev": true - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "dev": true, - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "p-limit": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", - "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", - "dev": true, - "requires": { - "p-try": "^1.0.0" - } - }, - "p-locate": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", - "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", - "dev": true, - "requires": { - "p-limit": "^1.1.0" - } - }, - "p-try": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", - "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", - "dev": true - }, - "parse-filepath": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", - "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", - "dev": true, - "requires": { - "is-absolute": "^1.0.0", - "map-cache": "^0.2.0", - "path-root": "^0.1.1" - } - }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "dev": true, - "requires": { - "error-ex": "^1.2.0" - } - }, - "parse-ms": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-1.0.1.tgz", - "integrity": "sha1-VjRtR0nXjyNDDKDHE4UK75GqNh0=", - "dev": true - }, - "parse-passwd": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", - "dev": true - }, - "pascalcase": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", - "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", - "dev": true - }, - "path-exists": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", - "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true - }, - "path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", - "dev": true - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true - }, - "path-root": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", - "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", - "dev": true, - "requires": { - "path-root-regex": "^0.1.0" - } - }, - "path-root-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", - "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", - "dev": true - }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", - "dev": true, - "requires": { - "pify": "^2.0.0" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "^2.1.0" - } - }, - "plur": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-1.0.0.tgz", - "integrity": "sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=", - "dev": true - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", - "dev": true - }, - "posix-character-classes": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", - "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", - "dev": true - }, - "prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", - "dev": true - }, - "prettier": { - "version": "1.13.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.13.7.tgz", - "integrity": "sha512-KIU72UmYPGk4MujZGYMFwinB7lOf2LsDNGSOC8ufevsrPLISrZbNJlWstRi3m0AMuszbH+EFSQ/r6w56RSPK6w==", - "dev": true - }, - "pretty-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-2.1.0.tgz", - "integrity": "sha1-QlfCVt8/sLRR1q/6qwIYhBJpgdw=", - "dev": true, - "requires": { - "is-finite": "^1.0.1", - "parse-ms": "^1.0.0", - "plur": "^1.0.0" - } - }, - "process-nextick-args": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", - "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", - "dev": true - }, - "progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", - "dev": true, - "requires": { - "load-json-file": "^2.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^2.0.0" - } - }, - "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", - "dev": true, - "requires": { - "find-up": "^2.0.0", - "read-pkg": "^2.0.0" - } - }, - "readable-stream": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", - "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", - "dev": true, - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "dev": true, - "requires": { - "resolve": "^1.1.6" - } - }, - "regex-not": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", - "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.2", - "safe-regex": "^1.1.0" - } - }, - "regexpp": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz", - "integrity": "sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==", - "dev": true - }, - "remove-trailing-separator": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", - "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", - "dev": true - }, - "repeat-element": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", - "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", - "dev": true - }, - "repeat-string": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true - }, - "require-uncached": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", - "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", - "dev": true, - "requires": { - "caller-path": "^0.1.0", - "resolve-from": "^1.0.0" - } - }, - "resolve": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", - "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", - "dev": true, - "requires": { - "path-parse": "^1.0.6" - } - }, - "resolve-dir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", - "dev": true, - "requires": { - "expand-tilde": "^2.0.0", - "global-modules": "^1.0.0" - } - }, - "resolve-from": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", - "dev": true - }, - "resolve-url": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", - "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", - "dev": true - }, - "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", - "dev": true, - "requires": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - } - }, - "ret": { - "version": "0.1.15", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", - "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", - "dev": true - }, - "rimraf": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", - "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "^2.1.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "*" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true - }, - "safe-regex": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", - "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", - "dev": true, - "requires": { - "ret": "~0.1.10" - } - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true - }, - "semver": { - "version": "5.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", - "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", - "dev": true - }, - "set-value": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", - "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.3", - "split-string": "^3.0.1" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - } - } - }, - "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "requires": { - "shebang-regex": "^1.0.0" - } - }, - "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true - }, - "sigmund": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", - "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", - "dev": true - }, - "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true - }, - "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0" - } - }, - "snapdragon": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", - "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", - "dev": true, - "requires": { - "base": "^0.11.1", - "debug": "^2.2.0", - "define-property": "^0.2.5", - "extend-shallow": "^2.0.1", - "map-cache": "^0.2.2", - "source-map": "^0.5.6", - "source-map-resolve": "^0.5.0", - "use": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, - "requires": { - "ms": "2.0.0" - } - }, - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - }, - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true - } - } - }, - "snapdragon-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", - "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", - "dev": true, - "requires": { - "define-property": "^1.0.0", - "isobject": "^3.0.0", - "snapdragon-util": "^3.0.1" - }, - "dependencies": { - "define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", - "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", - "dev": true, - "requires": { - "is-descriptor": "^1.0.0" - } - }, - "is-accessor-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", - "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-data-descriptor": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", - "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", - "dev": true, - "requires": { - "kind-of": "^6.0.0" - } - }, - "is-descriptor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", - "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", - "dev": true, - "requires": { - "is-accessor-descriptor": "^1.0.0", - "is-data-descriptor": "^1.0.0", - "kind-of": "^6.0.2" - } - } - } - }, - "snapdragon-util": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", - "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", - "dev": true, - "requires": { - "kind-of": "^3.2.0" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "source-map-resolve": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz", - "integrity": "sha512-MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==", - "dev": true, - "requires": { - "atob": "^2.1.1", - "decode-uri-component": "^0.2.0", - "resolve-url": "^0.2.1", - "source-map-url": "^0.4.0", - "urix": "^0.1.0" - } - }, - "source-map-url": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", - "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", - "dev": true - }, - "spdx-correct": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", - "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", - "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", - "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.3.tgz", - "integrity": "sha512-uBIcIl3Ih6Phe3XHK1NqboJLdGfwr1UN3k6wSD1dZpmPsIkb8AGNbZYJ1fOBk834+Gxy8rpfDxrS6XLEMZMY2g==", - "dev": true - }, - "split-string": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", - "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", - "dev": true, - "requires": { - "extend-shallow": "^3.0.0" - } - }, - "sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true - }, - "static-extend": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", - "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", - "dev": true, - "requires": { - "define-property": "^0.2.5", - "object-copy": "^0.1.0" - }, - "dependencies": { - "define-property": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", - "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", - "dev": true, - "requires": { - "is-descriptor": "^0.1.0" - } - } - } - }, - "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, - "requires": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - } - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.0" - } - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - } - } - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", - "dev": true - }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", - "dev": true - }, - "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", - "dev": true, - "requires": { - "ajv": "^5.2.3", - "ajv-keywords": "^2.1.0", - "chalk": "^2.1.0", - "lodash": "^4.17.4", - "slice-ansi": "1.0.0", - "string-width": "^2.1.1" - } - }, - "tar-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", - "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", - "dev": true, - "requires": { - "bl": "^1.0.0", - "buffer-alloc": "^1.2.0", - "end-of-stream": "^1.0.0", - "fs-constants": "^1.0.0", - "readable-stream": "^2.3.0", - "to-buffer": "^1.1.1", - "xtend": "^4.0.0" - } - }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", - "dev": true - }, - "time-grunt": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/time-grunt/-/time-grunt-1.2.2.tgz", - "integrity": "sha1-k88k1LficEuBPu27e8AMrU7zcwk=", - "dev": true, - "requires": { - "chalk": "^1.0.0", - "date-time": "^1.0.0", - "figures": "^1.0.0", - "hooker": "^0.2.3", - "number-is-nan": "^1.0.0", - "pretty-ms": "^2.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", - "dev": true, - "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - } - }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "dev": true, - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", - "dev": true, - "requires": { - "ansi-regex": "^2.0.0" - } - } - } - }, - "time-zone": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-0.1.0.tgz", - "integrity": "sha1-Sncotqwo2w4Aj1FAQ/1VW9VXO0Y=", - "dev": true - }, - "tmp": { - "version": "0.0.33", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", - "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, - "requires": { - "os-tmpdir": "~1.0.2" - } - }, - "to-buffer": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", - "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==", - "dev": true - }, - "to-object-path": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", - "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", - "dev": true, - "requires": { - "kind-of": "^3.0.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "^1.1.5" - } - } - } - }, - "to-regex": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", - "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", - "dev": true, - "requires": { - "define-property": "^2.0.2", - "extend-shallow": "^3.0.2", - "regex-not": "^1.0.2", - "safe-regex": "^1.1.0" - } - }, - "to-regex-range": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", - "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", - "dev": true, - "requires": { - "is-number": "^3.0.0", - "repeat-string": "^1.6.1" - } - }, - "type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", - "dev": true, - "requires": { - "prelude-ls": "~1.1.2" - } - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true - }, - "unc-path-regex": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", - "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", - "dev": true - }, - "underscore": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", - "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", - "dev": true - }, - "underscore.string": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", - "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", - "dev": true - }, - "union-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", - "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", - "dev": true, - "requires": { - "arr-union": "^3.1.0", - "get-value": "^2.0.6", - "is-extendable": "^0.1.1", - "set-value": "^0.4.3" - }, - "dependencies": { - "extend-shallow": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", - "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", - "dev": true, - "requires": { - "is-extendable": "^0.1.0" - } - }, - "set-value": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", - "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", - "dev": true, - "requires": { - "extend-shallow": "^2.0.1", - "is-extendable": "^0.1.1", - "is-plain-object": "^2.0.1", - "to-object-path": "^0.3.0" - } - } - } - }, - "unset-value": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", - "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", - "dev": true, - "requires": { - "has-value": "^0.3.1", - "isobject": "^3.0.0" - }, - "dependencies": { - "has-value": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", - "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", - "dev": true, - "requires": { - "get-value": "^2.0.3", - "has-values": "^0.1.4", - "isobject": "^2.0.0" - }, - "dependencies": { - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", - "dev": true, - "requires": { - "isarray": "1.0.0" - } - } - } - }, - "has-values": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", - "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", - "dev": true - } - } - }, - "urix": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", - "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", - "dev": true - }, - "use": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", - "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", - "dev": true - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true - }, - "v8flags": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-3.1.2.tgz", - "integrity": "sha512-MtivA7GF24yMPte9Rp/BWGCYQNaUj86zeYxV/x2RRJMKagImbbv3u8iJC57lNhWLPcGLJmHcHmFWkNsplbbLWw==", - "dev": true, - "requires": { - "homedir-polyfill": "^1.0.1" - } - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "walkdir": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/walkdir/-/walkdir-0.0.11.tgz", - "integrity": "sha1-oW0CXrkxvQO1LzCMrtD0D86+lTI=", - "dev": true - }, - "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true - }, - "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", - "dev": true, - "requires": { - "mkdirp": "^0.5.1" - } - }, - "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", - "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", - "dev": true - }, - "zip-stream": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", - "integrity": "sha1-qLxF9MG0lpnGuQGYuqyqzbzUugQ=", - "dev": true, - "requires": { - "archiver-utils": "^1.3.0", - "compress-commons": "^1.2.0", - "lodash": "^4.8.0", - "readable-stream": "^2.0.0" - } - } - } -} diff --git a/package.json b/package.json index 2434dbad..7a4fec54 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "name": "thegreatsuspender", + "name": "themarvelloussuspender", "version": "0.0.0", "description": "A chrome extension for suspending all tabs to free up memory", "main": "", @@ -11,7 +11,7 @@ }, "repository": { "type": "git", - "url": "git://github.com/greatsuspender/thegreatsuspender.git" + "url": "git://github.com/gioxx/MarvellousSuspender.git" }, "keywords": [ "chrome", @@ -21,24 +21,24 @@ "suspend", "tab" ], - "author": "deanoemcke", + "author": "Marvellous Suspender Team", "license": "GPLv2", "bugs": { - "url": "https://github.com/greatsuspender/thegreatsuspender/issues" + "url": "https://github.com/gioxx/MarvellousSuspender/issues" }, "devDependencies": { "eslint": "^4.19.1", "eslint-config-prettier": "^2.9.0", "eslint-config-standard": "^10.2.1", - "eslint-plugin-import": "^2.7.0", + "eslint-plugin-import": "^2.22.1", "eslint-plugin-node": "^5.1.1", "eslint-plugin-promise": "^3.5.0", "eslint-plugin-standard": "^3.0.1", - "grunt": "~0.4.5", + "grunt": "^1.3.0", "grunt-cli": "^1.2.0", "grunt-contrib-clean": "^1.1.0", "grunt-contrib-copy": "^1.0.0", - "grunt-crx": "~1.0.5", + "grunt-crx": "~2.0.0", "grunt-string-replace": "^1.3.1", "prettier": "1.13.7", "time-grunt": "~1.2.1" diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json new file mode 100644 index 00000000..139a0b58 --- /dev/null +++ b/src/_locales/ar/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "اجعل جهاز الكمبيوتر يعمل بسلاسة عن طريق تعليق علامات التبويب التي لا تستخدمها" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "إيقاف / إلغاء تعليق التبويب النشط" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "إيقاف مؤقت/إلغاء إيقاف التبويب النشط" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "تعليق علامات التبويب المحددة" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "إلغاء تعليق علامات التبويب المحددة" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "تعليق جميع علامات التبويب الأخرى في النافذة النشطة" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "تعليق جميع علامات التبويب الأخرى في النافذة النشطة" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "إلغاء تعليق جميع علامات التبويب في النافذة النشطة" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "تعليق جميع علامات التبويب في جميع النوافذ" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "تعليق جميع علامات التبويب في جميع النوافذ" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "إلغاء تعليق جميع علامات التبويب في جميع النوافذ" + }, + "js_context_open_link_in_suspended_tab": { + "message": "فتح الرابط في علامة تبويب معلق جديدة" + }, + "js_context_toggle_suspend_state": { + "message": "تعليق/إلغاء تعليق التبويب هذا" + }, + "js_context_toggle_pause_suspension": { + "message": "إيقاف مؤقت/إلغاء إيقاف هذا التبويب" + }, + "js_context_never_suspend_domain": { + "message": "عدم تعليق هذا النطاق مطلقاً" + }, + "js_context_never_suspend_page": { + "message": "عدم تعليق هذا الرابط مطلقاً" + }, + "js_context_suspend_selected_tabs": { + "message": "تعليق علامات التبويب المحددة" + }, + "js_context_unsuspend_selected_tabs": { + "message": "إلغاء تعليق علامات التبويب المحددة" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "تعليق جميع علامات التبويب الأخرى في النافذة النشطة" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "تعليق جميع علامات التبويب الأخرى في النافذة النشطة" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "إلغاء تعليق جميع علامات التبويب في النافذة النشطة" + }, + "js_context_soft_suspend_all_tabs": { + "message": "تعليق جميع علامات التبويب في جميع النوافذ" + }, + "js_context_force_suspend_all_tabs": { + "message": "Tüm pencerelerde tüm sekmeleri askıya almaya zorla" + }, + "js_context_unsuspend_all_tabs": { + "message": "إلغاء تعليق جميع علامات التبويب في جميع النوافذ" + }, + "html_about_title": { + "message": "حول عن الإضافة" + }, + "html_about_fork_beginning": { + "message": "استناداً إلى الأصل" + }, + "html_about_fork_mid": { + "message": "متاح في جيت هب، بدون تتبع ADS" + }, + "html_about_fork_end": { + "message": "المزيد من المعلومات عن" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "إذا كان لديك ملاحظات أو ترغب في الإبلاغ عن مشكلة، فيمكنك القيام بذلك على سبيل المثال" + }, + "html_about_report_issues_suffix": { + "message": ". Lütfen yeni bir fikir oluşturmadan önce fikrinizin veya sorunun zaten var olup olmadığını kontrol edin. Teşekkürler!" + }, + "html_about_debugging_prefix": { + "message": "لتمكين التسجيل، أو لتعيين أعلام التصحيح، اذهب إلى " + }, + "html_about_debugging_suffix": { + "message": "صفحة التصحيح." + }, + "html_about_the_github_issues_page": { + "message": "صفحة المشكلات على \"جيت هاب\"" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "هذه الإضافة تستخدم" + }, + "html_about_html2canvas_suffix": { + "message": "المكتبة العامة التي كتبتها Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "كما أنها تستخدم تغليف فليديب" + }, + "html_about_indexedDb_suffix": { + "message": "كتب بواسطة آرون باول." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "شكراً لك أيضاً" + }, + "html_about_browserstack_suffix": { + "message": "لتوفير أدوات اختبار متصفح الكروم مجانية." + }, + "html_about_tgs_prefix": { + "message": "هذا التمديد لم يكن ليتحقق بدون" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "يتم كسر" + }, + "html_broken_ruh_roh": { + "message": "روه روه!" + }, + "html_broken_line1": { + "message": "فشل في البدء. ربما أنت تستخدم نسخة غير متوافقة من متصفح الكروم ؟" + }, + "html_broken_line2": { + "message": "حاول إعادة تشغيل الإضافة. إذا استمرت المشكلة، اطلب المساعدة على" + }, + "html_broken_line2_github_page": { + "message": "صفحة مشروع جيت هب" + }, + "html_broken_line3": { + "message": "يمكنك استعادة علامات التبويب المفقودة من" + }, + "html_broken_line3_session_management": { + "message": "إدارة الجلسة" + }, + "html_broken_button_restart_extension": { + "message": "إعادة تشغيل الإضافة" + }, + "html_history_title": { + "message": "إدارة الجلسة" + }, + "html_history_current_session": { + "message": "الجلسة الحالية" + }, + "html_history_recent_sessions": { + "message": "الجلسات الأخيرة" + }, + "html_history_saved_sessions": { + "message": "الجلسات المحفوظة" + }, + "html_history_import_session": { + "message": "استيراد الجلسة" + }, + "html_history_migrate_tabs": { + "message": "ترحيل علامات التبويب" + }, + "html_history_migrate_old_id": { + "message": "معرف اضافة TGS القديم" + }, + "html_notice_title": { + "message": "إشعار" + }, + "html_notice_important_notice": { + "message": "إشعار هام من The Marvelous Suspender" + }, + "html_options_title": { + "message": "الإعدادات" + }, + "html_options_suspend_title": { + "message": "تعليق علامة التبويب التلقائي" + }, + "html_options_suspended_title": { + "message": "علامات التبويب المعلقة" + }, + "html_options_other_title": { + "message": "آخر" + }, + "html_options_suspend_automatically_after": { + "message": "تعليق علامات التبويب تلقائياً بعد" + }, + "html_options_suspend_never": { + "message": "أبدا" + }, + "html_options_suspend_seconds": { + "message": "ثواني" + }, + "html_options_suspend_minute": { + "message": "دقيقة" + }, + "html_options_suspend_minutes": { + "message": "دقائق" + }, + "html_options_suspend_hour": { + "message": "ساعة" + }, + "html_options_suspend_hours": { + "message": "ساعات" + }, + "html_options_suspend_day": { + "message": "يوم" + }, + "html_options_suspend_days": { + "message": "أيام" + }, + "html_options_suspend_week": { + "message": "أسبوع" + }, + "html_options_suspend_weeks": { + "message": "أسابيع" + }, + "html_options_suspend_no_pinned": { + "message": "لا تعلق أبداً علامات التبويب الثابتة" + }, + "html_options_suspend_no_forms": { + "message": "لا تعلق أبداً علامات التبويب التي تحتوي على مدخلات نموذج غير محفوظة" + }, + "html_options_suspend_no_audio": { + "message": "لا تقم أبدا بتعليق علامات التبويب التي تشغل الصوت" + }, + "html_options_suspend_only_connected": { + "message": "لا توقف أبداً علامات التبويب عند عدم الاتصال" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "لا توقف أبداً علامات التبويب عند الاتصال بمصدر الطاقة" + }, + "html_options_suspend_no_active_tabs": { + "message": "عدم تعليق علامة التبويب النشطة أبدا في كل نافذة" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "إلغاء تعليق علامة التبويب تلقائياً عند عرضها" + }, + "html_options_suspend_discard_after_suspend": { + "message": "تطبيق تطبيق كروم المدمج لحفظ الذاكرة عند التعليق" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "يقلل من استخدام ذاكرة التبويب المعلق أكثر، من خلال استخدام" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "وظيفة كروم المدمجة في 'تجاهل التبويب'. يمكن أن يؤدي هذا إلى أعلى" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "إلى 500٪ مدخرات الذاكرة عند العمل مع عدد كبير من علامات التبويب." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "غير أنه سيؤدي أيضا إلى تأخير طفيف عند الاختيار" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "علامة التبويب المعلقة." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "وللحصول على مزيد من المعلومات، يرجى الرجوع إلى المرجع التالي:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "موضوع" + }, + "html_options_suspend_theme_light": { + "message": "الضوء" + }, + "html_options_suspend_theme_dark": { + "message": "مظلم" + }, + "html_options_suspend_screen_capturing": { + "message": "التقاط الشاشة" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "معطل" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "التقاط أعلى الشاشة فقط" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "التقاط صفحة كاملة" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "في علامة التبويب المعلقة، يمكن للأضافة أن يعرض صورة معاينة لما تبويب" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "يبدو وكأنه قبل أن يتم تعليقه." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "خاصية التقاط الشاشة تجريبية ويمكن أن تسبب استخداما كبيرا لوحدة المعالجة المركزية" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "بالإضافة إلى زيادة طفيفة في استخدام الذاكرة." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "إذا لاحظت سلوك غريب، مثل علامات التبويب التي تستغرق وقتاً طويلاً لتعليقها، أو كرم" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "تعطل بشكل غير متوقع، حاول إيقاف تشغيل هذه الميزة." + }, + "html_options_suspend_force_screen_capture": { + "message": "تمكين وضع التقاط الشاشة بجودة عالية" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "عند التعطيل، يكون لالتقاط الشاشة القيود التالية للمساعدة في الأداء:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- التقاط شاشة منخفضة الجودة" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- لن يتم التقاط الشاشة إذا استغرق إنشاء الصورة أكثر من دقيقة واحدة" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- أقصى ارتفاع لالتقاط الشاشة يقتصر على 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "تمكين وضع التقاط الشاشة عالي الجودة قد يزيد بشكل كبير من تحميل المعالج" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "و استخدام الذاكرة." + }, + "html_options_whitelist_title": { + "message": "لا تعلق أبداً علامات التبويب مع عناوين URL من القائمة التالية:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "إضافة عنوان URL لكل صفحة تريد القائمة البيضاء على سطر جديد. على سبيل المثال:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "لقائمة بيضاء متعددة المواقع في سطر واحد يمكنك تحديد جزء من url بدلاً من ذلك:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "يمكنك أيضا تحديد التعبيرات العادية عن طريق إرفاق النص في الخطوط الأمامية:" + }, + "html_options_whitelist_test": { + "message": "اختبار القائمة البيضاء" + }, + "html_options_other_enable_context_menu": { + "message": "أضف الموصل المبتكر إلى قائمة السياق بالنقر الأيمن" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "إضافة عناصر تحكم لهذا الملحق إلى قائمة انقر بالزر الأيمن لصفحة ويب." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "هذا سيعطيك الوصول إلى إجراءات التعليق المتقدمة غير متوفرة" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "في مكان آخر من التمديد." + }, + "html_options_other_enable_sync": { + "message": "مزامنة الإعدادات مع ملف تعريف كروم" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "سيتم مزامنة إعدادات الملحق عبر جميع متصفحات الكروم" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "تم تسجيل الدخول بنفس الملف الشخصي." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "سيؤدي هذا أيضا إلى مزامنة الإعدادات في الوضع المخفي." + }, + "html_options_other_enable_sync_warning": { + "message": "تشغيل هذا سوف يستبدل الإعدادات في جميع المتصفحات الأخرى التي تم تسجيلها في نفس ملف كروم" + }, + "html_options_suspend_on_low_memory": { + "message": "التعليق فوراً عندما تصبح ذاكرة النظام منخفضة جداً" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "هذا الخيار سيتجاوز خاصية التبويب التلقائي لـ Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "إذا تم تفعيله، فإنه سيجبر علامة التبويب على التعليق بدلاً من أن يتم تجاهلها من قبل كروم." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "عادة ، لن يتم تجاهل علامات التبويب إلا بمجرد أن تصبح ذاكرة النظام منخفضة جداً." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "يرجى ملاحظة: قد يتسبب هذا في تعليق علامات التبويب قبل الوقت الذي لديك فيه" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "محدد في خيارات التعليق التلقائي للتبويب." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "وللحصول على مزيد من المعلومات عن رفض كروم يرجى الرجوع إلى ما يلي:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "إلغاء تعليق علامة التبويب" + }, + "html_popup_suspend_tab": { + "message": "تعليق علامة التبويب هذه الآن" + }, + "html_popup_dont_suspend_now": { + "message": "لا تقم بالتعليق الآن" + }, + "html_popup_never_suspend_domain": { + "message": "عدم تعليق هذا الرابط مطلقاً" + }, + "html_popup_never_suspend_page": { + "message": "عدم تعليق هذا الرابط مطلقاً" + }, + "html_popup_suspend_other_tabs": { + "message": "تعليق جميع علامات التبويب الأخرى" + }, + "html_popup_unsuspend_all_tabs": { + "message": "إلغاء تعليق كل علامات التبويب" + }, + "html_popup_suspend_selected_tabs": { + "message": "إلغاء تعليق علامات التبويب المحددة" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "إلغاء تعليق علامات التبويب المحددة" + }, + "html_popup_settings": { + "message": "الإعدادات" + }, + "html_restoring_title": { + "message": "إستعادة النافذة" + }, + "html_restoring_heading": { + "message": "إستعادة علامات التبويب" + }, + "html_restoring_detail": { + "message": "الرجاء الانتظار بينما استعيد هذه النافذة..." + }, + "html_recovery_title": { + "message": "استرداد" + }, + "html_recovery_ruh_roh": { + "message": "روه روه!" + }, + "html_recovery_description_line1": { + "message": "يبدو أنك تستعيد عافيتك من تحطم الملحق." + }, + "html_recovery_description_line2": { + "message": "قد تكون علامات التبويب المعلقة الخاصة بك قد تحطمت أو اختفت." + }, + "html_recovery_restore_tabs_automatically": { + "message": "استعادة علامات التبويب تلقائياً" + }, + "html_recovery_go_to_session_manager": { + "message": "اذهب إلى مدير الجلسة" + }, + "html_recovery_important_message": { + "message": "لديك حاليا تشغيل التقاط الشاشة. إذا كان هذا الملحق يتعطل مرارا وتكرارا، فإنه من المستحسن تعطيل هذا الخيار." + }, + "html_recovery_disable_screen_capturing": { + "message": "إيقاف تشغيل التقاط الشاشة" + }, + "html_recovery_tabs_to_restore": { + "message": "علامات التبويب لإستعادتها" + }, + "html_shortcuts_title": { + "message": "اختصارات لوحة المفاتيح" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "اختصارات لوحة المفاتيح" + }, + "html_shortcuts_context_menu_note": { + "message": "ملاحظة: هذه الإجراءات متاحة أيضا عن طريق قائمة السياق بالنقر الأيمن." + }, + "html_shortcuts_remap_keys": { + "message": "تغيير الاختصارات" + }, + "html_sidebar_general_settings": { + "message": "الإعدادات" + }, + "html_sidebar_session_management": { + "message": "إدارة الجلسة" + }, + "html_sidebar_shortcuts": { + "message": "اختصارات لوحة المفاتيح" + }, + "html_sidebar_support": { + "message": "حول عن اضافة" + }, + "html_success_great_success": { + "message": "نجاح رائع!" + }, + "html_success_all_tabs_restored": { + "message": "تم استعادة جميع علامات التبويب الخاصة بك." + }, + "html_success_goto_advanced_prefix": { + "message": "لإدارة الدورات المتقدمة، قم بزيارة" + }, + "html_success_goto_advanced_suffix": { + "message": "الصفحة" + }, + "html_session_manager": { + "message": "إدارة الجلسة" + }, + "html_suspended_title": { + "message": "علامات التبويب المعلقة" + }, + "html_suspended_tab_suspended": { + "message": "علامة التبويب معلقة" + }, + "html_suspended_tab_reload": { + "message": "أعد تحميل الصفحة" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "لا تعلق مطلقاً" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "قم بتحديث أو انقر لإعادة التحميل" + }, + "html_suspended_toast_not_connected": { + "message": "يجب ان تكون متصلاً بالانترنت." + }, + "html_suspended_toast_reload_disabled": { + "message": "إعادة تحميل التبويب التلقائي معطل مؤقتاً." + }, + "html_permissions_title": { + "message": "الأذونات" + }, + "html_permissions_heading": { + "message": "الرجاء منحي حق الوصول إلى عناوين URL للملف المحلي" + }, + "html_permissions_info": { + "message": "هذا التمديد غير مسموح به حاليا لتعليق عناوين URL بدءاً بكلمة \"ملف\".\nلتغيير هذا، يرجى تشغيل \"السماح بالوصول إلى عناوين URLs\" من صفحة إعدادات الملحق." + }, + "html_permissions_backup": { + "message": "يرجى ملاحظة أن تغيير هذا الخيار سيؤدي إلى اختفاء جميع علامات التبويب المعلقة الخاصة بك لفترة وجيزة.\nفقط في الحالة ، قد يكون الوقت جيدا لتوفير نسخة احتياطية من جلسة التبويب الحالية." + }, + "html_update_title": { + "message": "التحديث" + }, + "html_update_heading2": { + "message": "على وشك أن تصبح رائعة" + }, + "html_update_info": { + "message": "نسخة جديدة من الموصوف الجديد جاهزة للتثبيت.\nيرجى ملاحظة: خلال التحديث، ستختفي علامات التبويب المعلقة الخاصة بك لفترة وجيزة." + }, + "html_update_info_withbackup": { + "message": "فقط في الحالة، الآن قد يكون وقتاً جيداً لتوفير نسخة احتياطية من جلسة التبويب الحالية." + }, + "html_update_info_nobackup_prefix": { + "message": "يوصى بشدة بأن تقوم بتصدير نسخة من الجلسة الحالية من " + }, + "html_update_info_nobackup_suffix": { + "message": " قبل الاستمرار في التحديث." + }, + "html_updated_title": { + "message": "التحديث" + }, + "html_updating_heading": { + "message": "يتم التحديث" + }, + "html_updating_message": { + "message": "الرجاء الانتظار بينما أستعيد علامات التبويب المعلقة الخاصة بك..." + }, + "html_updated_great_suspender_updated": { + "message": "لقد تم تحديثها" + }, + "html_updated_info_line1": { + "message": "تم إنشاء نسخة احتياطية تلقائية من علامات التبويب الخاصة بك قبل التحديث." + }, + "html_updated_info_line2_prefix": { + "message": "إذا واجهت أي مشاكل أثناء التحديث، يمكنك استعادة علامات التبويب المفقودة من " + }, + "html_updated_info_line2_suffix": { + "message": " الصفحة." + }, + "html_updated_detail_header_prefix": { + "message": "ما هو الجديد في " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "المميزات الجديدة :" + }, + "html_updated_bug_fixes_header": { + "message": "إصلاح الأخطاء :" + }, + "html_updated_release_notes": { + "message": "قم بزيارة GitHub للحصول على ملاحظات الإصدار الكامل : " + }, + "html_updated_patch_message": { + "message": "عذرا على الإزعاج. كنت بحاجة للتو للقيام بصيانة صغيرة." + }, + "html_welcome_title": { + "message": "أهلاً بك" + }, + "html_welcome_text_line1": { + "message": "شكراً على المحاولة" + }, + "html_welcome_text_line2": { + "message": "أجعل جهاز الكمبيوتر يعمل بسلاسة عن طريق تعليق علامات التبويب التي لا تستخدمها." + }, + "html_welcome_text_line3": { + "message": "يمكنك ضبط الإعدادات أدناه." + }, + "js_popup_normal": { + "message": "سيتم تعليق علامة التبويب تلقائياً." + }, + "js_popup_normal_pause": { + "message": "ليس الآن" + }, + "js_popup_special": { + "message": "لا يمكن تعليق علامة التبويب" + }, + "js_popup_suspended": { + "message": "علامة التبويب معلقة" + }, + "js_popup_suspended_pause": { + "message": "عدم التعليق" + }, + "js_popup_whitelisted": { + "message": "قائمة بيضاء بالموقع." + }, + "js_popup_whitelisted_remove": { + "message": "إزالة من القائمة البيضاء" + }, + "js_popup_audible": { + "message": "علامة التبويب تقوم بتشغيل الصوت." + }, + "js_popup_form_input": { + "message": "علامة التبويب تتلقى مدخلات النموذج." + }, + "js_popup_form_input_unpause": { + "message": "إلغاء الإيقاف المؤقت" + }, + "js_popup_pinned": { + "message": "تم تثبيت علامة التبويب" + }, + "js_popup_temp_whitelist": { + "message": "تعليق علامة التبويب مؤقتاً." + }, + "js_popup_temp_whitelist_unpause": { + "message": "إلغاء الإيقاف المؤقت" + }, + "js_popup_never": { + "message": "تم تعطيل تعليق التبويب التلقائي." + }, + "js_popup_no_connectivity": { + "message": "لا يوجد إتصال بالشبكة" + }, + "js_popup_charging": { + "message": "متصل بمصدر الطاقة" + }, + "js_popup_blockedFile": { + "message": "لا يمكن تعليق الملفات المحلية." + }, + "js_popup_blockedFile_enable": { + "message": "تمكين" + }, + "js_popup_unknown": { + "message": "في انتظار علامة التبويب للتحميل..." + }, + "js_popup_initialising": { + "message": "في انتظار التمديد للتهيئة..." + }, + "js_popup_error": { + "message": "التعليق التلقائي غير متوفر لهذا التبويب" + }, + "js_history_delete": { + "message": "احذف" + }, + "js_history_export": { + "message": "استخراج" + }, + "js_history_reload": { + "message": "افتح و تحميل" + }, + "js_history_resuspend": { + "message": "افتح و تعليق" + }, + "js_history_save": { + "message": "احفظ" + }, + "js_history_window": { + "message": "نافذة" + }, + "js_history_windows": { + "message": "ويندوز" + }, + "js_history_tab": { + "message": "علامة التبويب" + }, + "js_history_tabs": { + "message": "علامات التبويب" + }, + "js_history_enter_name_for_session": { + "message": "أدخل إسم لهذه الجلسة" + }, + "js_history_confirm_delete": { + "message": "هل أنت متأكد أنك تريد حذف هذه الجلسة؟" + }, + "js_history_confirm_session_overwrite": { + "message": "هناك بالفعل جلسة محفوظة بهذا الاسم. هل تريد الكتابة فوق جلسة العمل الحالية؟" + }, + "js_history_import_fail": { + "message": "فشل تحميل الملف. تأكد من أن الملف نص عادي ويحتوي على عنوان URL واحد لكل سطر." + }, + "js_history_migrate_fail": { + "message": "تحتاج إلى معرف اضافة 32 حرف للانتقال من" + }, + "js_history_migrate_success": { + "message": "تم ترحيل $TABCOUNT$ علامات التبويب بنجاح", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "إزالة الموقع من القائمة البيضاء" + }, + "js_suspended_hotkey_to_reload": { + "message": "تعيين اختصارات لوحة المفاتيح" + }, + "js_suspended_low_memory": { + "message": "تم تعليق علامة التبويب بسبب انخفاض ذاكرة النظام" + }, + "js_options_incognito_warning": { + "message": "أنت في وضع التخفي. بعض الميزات لن تكون متاحة." + }, + "js_options_whitelist_no_matches": { + "message": "لا توجد علامات تبويب مفتوحة تتطابق مع القائمة البيضاء الحالية." + }, + "js_options_whitelist_matches_heading": { + "message": "علامات التبويب المفتوحة في القائمة البيضاء:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "و" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "المزيد." + }, + "js_permissions_button_export": { + "message": "حفظ النسخة الاحتياطية" + }, + "js_permissions_button_set": { + "message": "فتح إعدادات الإضافة" + }, + "js_update_confirm": { + "message": "لم تقم بحفظ نسخة احتياطية بعد. هل تريد تحديث الإضافة على أية حال؟" + }, + "js_update_button_export": { + "message": "حفظ النسخة الاحتياطية" + }, + "js_update_button_reload": { + "message": "تحديث الإضافة الآن" + }, + "js_shortcuts_not_set": { + "message": "لم يتم تعيينه" + }, + "js_session_save_point": { + "message": "نقطة الحفظ التلقائي لـ v" + } +} diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json new file mode 100644 index 00000000..16d27108 --- /dev/null +++ b/src/_locales/cs/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Make your computer run smoothly by suspending the tabs you aren't using" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspend/Unsuspend active tab" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pause/Unpause suspension of active tab" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspend selected tabs" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Unsuspend selected tabs" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspend all other tabs in active window" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Force suspend all other tabs in active window" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Unsuspend all tabs in active window" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspend all tabs in all windows" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Force suspend all tabs in all windows" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Unsuspend all tabs in all windows" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Open Link in New Suspended Tab" + }, + "js_context_toggle_suspend_state": { + "message": "Suspend/Unsuspend this tab" + }, + "js_context_toggle_pause_suspension": { + "message": "Pause/Unpause suspension of this tab" + }, + "js_context_never_suspend_domain": { + "message": "Never suspend this domain" + }, + "js_context_never_suspend_page": { + "message": "Never suspend this URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspend selected tabs" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Unsuspend selected tabs" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspend all other tabs in this window" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Force suspend all other tabs in this window" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Unsuspend all tabs in this window" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspend all tabs in all windows" + }, + "js_context_force_suspend_all_tabs": { + "message": "Force suspend all tabs in all windows" + }, + "js_context_unsuspend_all_tabs": { + "message": "Unsuspend all tabs in all windows" + }, + "html_about_title": { + "message": "About" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking" + }, + "html_about_fork_end": { + "message": ", more information available on" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "If you have feedback or would like to report an issue, you can do so on the" + }, + "html_about_report_issues_suffix": { + "message": ". Please check to see if your idea or issue already exists before creating a new one. Thanks!" + }, + "html_about_debugging_prefix": { + "message": "To enable logging, or to set debugging flags, go to the " + }, + "html_about_debugging_suffix": { + "message": "debug page." + }, + "html_about_the_github_issues_page": { + "message": "GitHub issues page" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Toto rozšíření používá" + }, + "html_about_html2canvas_suffix": { + "message": "knihovnu napsanou Niklasem von Hertzenem." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Také používá indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "written by Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Thank you also to" + }, + "html_about_browserstack_suffix": { + "message": "for providing free chrome testing tools." + }, + "html_about_tgs_prefix": { + "message": "Toto rozšíření by nikdy nemohlo existovat bez" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "is broken" + }, + "html_broken_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_broken_line1": { + "message": "failed to start. Perhaps you are using an incompatible version of Chrome?" + }, + "html_broken_line2": { + "message": "Try to restart the extension. If the problem persists, ask for help on the" + }, + "html_broken_line2_github_page": { + "message": "GitHub project page" + }, + "html_broken_line3": { + "message": "You can recover lost tabs from the" + }, + "html_broken_line3_session_management": { + "message": "session management page" + }, + "html_broken_button_restart_extension": { + "message": "Restart extension" + }, + "html_history_title": { + "message": "Session management" + }, + "html_history_current_session": { + "message": "Current session" + }, + "html_history_recent_sessions": { + "message": "Recent sessions" + }, + "html_history_saved_sessions": { + "message": "Saved sessions" + }, + "html_history_import_session": { + "message": "Import session" + }, + "html_history_migrate_tabs": { + "message": "Migrate tabs" + }, + "html_history_migrate_old_id": { + "message": "Old TGS Extension id" + }, + "html_notice_title": { + "message": "Notice" + }, + "html_notice_important_notice": { + "message": "Important notice from The Marvellous Suspender" + }, + "html_options_title": { + "message": "Settings" + }, + "html_options_suspend_title": { + "message": "Automatic tab suspension" + }, + "html_options_suspended_title": { + "message": "Suspended tabs" + }, + "html_options_other_title": { + "message": "Other" + }, + "html_options_suspend_automatically_after": { + "message": "Automatically suspend tabs after" + }, + "html_options_suspend_never": { + "message": "Never" + }, + "html_options_suspend_seconds": { + "message": "seconds" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hour" + }, + "html_options_suspend_hours": { + "message": "hodiny" + }, + "html_options_suspend_day": { + "message": "den" + }, + "html_options_suspend_days": { + "message": "dny" + }, + "html_options_suspend_week": { + "message": "týden" + }, + "html_options_suspend_weeks": { + "message": "týdny" + }, + "html_options_suspend_no_pinned": { + "message": "Never suspend pinned tabs" + }, + "html_options_suspend_no_forms": { + "message": "Never suspend tabs that contain unsaved form inputs" + }, + "html_options_suspend_no_audio": { + "message": "Never suspend tabs that are playing audio" + }, + "html_options_suspend_only_connected": { + "message": "Never suspend tabs when offline" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Never suspend tabs when connected to power source" + }, + "html_options_suspend_no_active_tabs": { + "message": "Never suspend active tab in each window" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Automatically unsuspend tab when it is viewed" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Apply Chrome's built-in memory-saving when suspending" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduces a suspended tab's memory usage even more, by utilizing" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome's built-in 'tab discarding' functionality. This can result in up" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "However, it will also cause a slight rendering delay when selecting" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Theme" + }, + "html_options_suspend_theme_light": { + "message": "Light" + }, + "html_options_suspend_theme_dark": { + "message": "Dark" + }, + "html_options_suspend_screen_capturing": { + "message": "Screen capturing" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Disabled" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture top of screen only" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capture entire page" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "On a suspended tab, the extension can display an image preview of the what the tab" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "The screen capturing feature is experimental and can cause significant CPU usage as" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "If you notice strange behaviour such as tabs taking a long time to suspend, or chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "Enable high quality screen capture mode" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "When disabled, screen captures have the following limitations to aid in performance:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Low quality screen capture" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Will not capture screen if it takes more than 1 minute to generate image" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Maximum height of screen capture limited to 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Enabling high quality screen capture mode may significantly increase CPU load" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "Never suspend tabs with URLs from the following list:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Add the URL of each page you want to whitelist on a new line. For example:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "To whitelist multiple sites in one line you can specify part of the url instead:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "You can also specify regular expressions by enclosing the text in forward slashes:" + }, + "html_options_whitelist_test": { + "message": "Test whitelist" + }, + "html_options_other_enable_context_menu": { + "message": "Add The Marvellous Suspender to right-click context menu" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Add controls for this extension to the right-click menu of a web page." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "This will give you access to advanced suspending actions not available" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "Sync settings with your Chrome profile" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Extension settings will be synchronised across all chrome browsers which are" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "logged in with the same profile." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "This will also synchronise settings in incognito mode." + }, + "html_options_other_enable_sync_warning": { + "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" + }, + "html_options_suspend_on_low_memory": { + "message": "Instantly suspend when system memory gets very low" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "This option will override Chrome's automatic tab discarding functionality." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "If enabled, it will force a tab to suspend instead of being discarded by Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typically, Chrome will only discard tabs once system memory gets very low." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Please note: This may cause tabs to suspend earlier than the time you have" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Unsuspend this tab" + }, + "html_popup_suspend_tab": { + "message": "Suspend this tab now" + }, + "html_popup_dont_suspend_now": { + "message": "Don't suspend for now" + }, + "html_popup_never_suspend_domain": { + "message": "Never suspend this domain" + }, + "html_popup_never_suspend_page": { + "message": "Never suspend this URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspend all other tabs" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Unsuspend all tabs" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspend selected tabs" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Unsuspend selected tabs" + }, + "html_popup_settings": { + "message": "Settings" + }, + "html_restoring_title": { + "message": "Restoring window" + }, + "html_restoring_heading": { + "message": "Restoring tabs" + }, + "html_restoring_detail": { + "message": "Please wait while I restore this window..." + }, + "html_recovery_title": { + "message": "Recovery" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "Looks like you're recovering from an extension crash." + }, + "html_recovery_description_line2": { + "message": "Your suspended tabs may have crashed or disappeared." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restore tabs automatically" + }, + "html_recovery_go_to_session_manager": { + "message": "Go to session manager" + }, + "html_recovery_important_message": { + "message": "You currently have screen capturing turned on. If this extension is repeatedly crashing it is recommended you disable this option." + }, + "html_recovery_disable_screen_capturing": { + "message": "Turn off screen capturing" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs to restore" + }, + "html_shortcuts_title": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_context_menu_note": { + "message": "Note: These actions are also available via the right-click context menu." + }, + "html_shortcuts_remap_keys": { + "message": "Change shortcuts" + }, + "html_sidebar_general_settings": { + "message": "Nastavení" + }, + "html_sidebar_session_management": { + "message": "Session management" + }, + "html_sidebar_shortcuts": { + "message": "Klávesové zkratky" + }, + "html_sidebar_support": { + "message": "About" + }, + "html_success_great_success": { + "message": "Marvellous success!" + }, + "html_success_all_tabs_restored": { + "message": "All your tabs have been restored." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "session management" + }, + "html_suspended_title": { + "message": "Suspended Tab" + }, + "html_suspended_tab_suspended": { + "message": "Tab suspended" + }, + "html_suspended_tab_reload": { + "message": "Reload tab" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Never suspend" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Refresh or click to reload" + }, + "html_suspended_toast_not_connected": { + "message": "You are not connected to the internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatic tab reloading is temporarily disabled." + }, + "html_permissions_title": { + "message": "Permissions" + }, + "html_permissions_heading": { + "message": "Please give me access to local file URLs" + }, + "html_permissions_info": { + "message": "This extension is not currently permitted to suspend URLs beginning with the word \"file\".\nTo change this, please turn on \"Allow access to file URLs\" from the extension settings page." + }, + "html_permissions_backup": { + "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_title": { + "message": "Update" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." + }, + "html_update_info_withbackup": { + "message": "Just in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_info_nobackup_prefix": { + "message": "It is strongly recommended that you export a copy of your current session from " + }, + "html_update_info_nobackup_suffix": { + "message": " before continuing with the update." + }, + "html_updated_title": { + "message": "Updated" + }, + "html_updating_heading": { + "message": "is updating" + }, + "html_updating_message": { + "message": "Please wait while I restore your suspended tabs..." + }, + "html_updated_great_suspender_updated": { + "message": "has been updated" + }, + "html_updated_info_line1": { + "message": "An automatic backup was made of your tabs before the update." + }, + "html_updated_info_line2_prefix": { + "message": "If you encountered any issues during the update, you can recover lost tabs from the " + }, + "html_updated_info_line2_suffix": { + "message": " page." + }, + "html_updated_detail_header_prefix": { + "message": "What's new in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "New features:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug fixes:" + }, + "html_updated_release_notes": { + "message": "Visit GitHub for full release notes: " + }, + "html_updated_patch_message": { + "message": "Sorry for the disturbance. I just needed to perform a little maintenance." + }, + "html_welcome_title": { + "message": "Welcome" + }, + "html_welcome_text_line1": { + "message": "Thanks for trying" + }, + "html_welcome_text_line2": { + "message": "I make your computer run smoothly by suspending the tabs you aren't using." + }, + "html_welcome_text_line3": { + "message": "You can fine-tune the settings below." + }, + "js_popup_normal": { + "message": "Tab will suspend automatically." + }, + "js_popup_normal_pause": { + "message": "Not now" + }, + "js_popup_special": { + "message": "Tab cannot be suspended" + }, + "js_popup_suspended": { + "message": "Tab suspended" + }, + "js_popup_suspended_pause": { + "message": "Don't suspend" + }, + "js_popup_whitelisted": { + "message": "Site whitelisted." + }, + "js_popup_whitelisted_remove": { + "message": "Remove from whitelist" + }, + "js_popup_audible": { + "message": "Tab is playing audio." + }, + "js_popup_form_input": { + "message": "Tab is receiving form input." + }, + "js_popup_form_input_unpause": { + "message": "Unpause" + }, + "js_popup_pinned": { + "message": "Tab has been pinned" + }, + "js_popup_temp_whitelist": { + "message": "Tab suspension paused." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Unpause" + }, + "js_popup_never": { + "message": "Automatic tab suspension disabled." + }, + "js_popup_no_connectivity": { + "message": "No network connection" + }, + "js_popup_charging": { + "message": "Connected to power source" + }, + "js_popup_blockedFile": { + "message": "Local files cannot be suspended." + }, + "js_popup_blockedFile_enable": { + "message": "Enable" + }, + "js_popup_unknown": { + "message": "Waiting for tab to load..." + }, + "js_popup_initialising": { + "message": "Waiting for extension to initialize..." + }, + "js_popup_error": { + "message": "Auto-suspend unavailable for this tab" + }, + "js_history_delete": { + "message": "delete" + }, + "js_history_export": { + "message": "export" + }, + "js_history_reload": { + "message": "open and load" + }, + "js_history_resuspend": { + "message": "open and suspend" + }, + "js_history_save": { + "message": "save" + }, + "js_history_window": { + "message": "Window" + }, + "js_history_windows": { + "message": "Windows" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_tabs": { + "message": "Tabs" + }, + "js_history_enter_name_for_session": { + "message": "Enter a name for this session" + }, + "js_history_confirm_delete": { + "message": "Are you sure you want to delete this session?" + }, + "js_history_confirm_session_overwrite": { + "message": "There is already a saved session with this name. Overwrite existing session?" + }, + "js_history_import_fail": { + "message": "Failed to load file. Ensure file is plain text and contains a single url per line." + }, + "js_history_migrate_fail": { + "message": "Need 32-character extension id to migrate from" + }, + "js_history_migrate_success": { + "message": "Successfully migrated $TABCOUNT$ tabs", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Remove site from whitelist" + }, + "js_suspended_hotkey_to_reload": { + "message": "Set keyboard shortcuts" + }, + "js_suspended_low_memory": { + "message": "Tab suspended due to low system memory" + }, + "js_options_incognito_warning": { + "message": "You are in incognito mode. Some features will not be available." + }, + "js_options_whitelist_no_matches": { + "message": "There are no open tabs that match the current whitelist." + }, + "js_options_whitelist_matches_heading": { + "message": "Whitelisted open tabs:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "and" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "more." + }, + "js_permissions_button_export": { + "message": "Save backup" + }, + "js_permissions_button_set": { + "message": "Open extension settings" + }, + "js_update_confirm": { + "message": "You have not saved a backup yet. Update the extension anyway?" + }, + "js_update_button_export": { + "message": "Save backup" + }, + "js_update_button_reload": { + "message": "Update extension now" + }, + "js_shortcuts_not_set": { + "message": "not set" + }, + "js_session_save_point": { + "message": "Automatic save point for v" + } +} diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json index a1071ecf..be9a9dc1 100644 --- a/src/_locales/de/messages.json +++ b/src/_locales/de/messages.json @@ -1,245 +1,787 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Lass deinen Computer geschmeidiger laufen, in dem du Tabs aussetzen lässt, die du nicht benutzt" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Aktiven Tab aussetzen/aufwachen" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Aussetzen des aktiven Tabs pausieren/fortführen" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Ausgewählte Tabs aussetzen" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Ausgewählte Tabs aufwachen" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Alle anderen Tabs im aktiven Fenster aussetzen" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Alle anderen Tabs im aktiven Fenster aussetzen (forcieren)" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Alle Tabs in diesem Fenster aufwachen" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Alle Tabs in allen Fenstern aussetzen" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Alle Tabs in allen Fenstern aufwachen" }, - "js_context_open_link_in_suspended_tab": { "message": "Öffne Link in neuem ausgesetztem Tab" }, - "js_context_toggle_suspend_state": { "message": "Diesen Tab aussetzen/aufwachen" }, - "js_context_toggle_pause_suspension": { "message": "Aussetzen dieses Tabs pausieren/fortführen" }, - "js_context_never_suspend_domain": { "message": "Diese Domain nicht aussetzen" }, - "js_context_never_suspend_page": { "message": "Diese URL nicht aussetzen" }, - "js_context_suspend_selected_tabs": { "message": "Ausgewählte Tabs aussetzen" }, - "js_context_unsuspend_selected_tabs": { "message": "Ausgewählte Tabs aufwachen" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Alle anderen Tabs in diesem Fenster aussetzen" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Alle anderen Tabs in diesem Fenster aussetzen (forcieren)" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Alle Tabs in diesem Fenster aufwachen" }, - "js_context_soft_suspend_all_tabs": { "message": "Alle Tabs in allen Fenstern aussetzen" }, - "js_context_force_suspend_all_tabs": { "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" }, - "js_context_unsuspend_all_tabs": { "message": "Alle Tabs in allen Fenstern aufwachen" }, - "html_about_title": { "message": "Über" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Wenn du Feedback hast oder einen Fehler melden möchtest, melde das auf der" }, - "html_about_report_issues_suffix": { "message": ". Bitte prüfe vorab, ob deine Idee oder dein Fehler schon gemeldet wurde. Danke!" }, - "html_about_debugging_prefix": { "message": "Um die Protokollierung zu aktivieren oder Debugging-Flags festzulegen, gehen Sie auf die " }, - "html_about_debugging_suffix": { "message": "Debug-Seite." }, - "html_about_the_github_issues_page": { "message": "GitHub Projektseite" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Diese Erweiterung nutzt die" }, - "html_about_html2canvas_suffix": { "message": "Bibliothek, programmiert von Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Sie nutzt auch den indexedDb wrapper" }, - "html_about_indexedDb_suffix": { "message": "programmiert von Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Ein weiterer Dank an" }, - "html_about_browserstack_suffix": { "message": "für die kostenlosen Chrome Testwerkzeuge." }, - "html_history_title": { "message": "Sitzungsverwaltung" }, - "html_history_current_session": { "message": "Aktuelle Sitzung" }, - "html_history_recent_sessions": { "message": "Kürzliche Sitzungen" }, - "html_history_saved_sessions": { "message": "Gespeicherte Sitzungen" }, - "html_history_import_session": { "message": "Sitzung importieren" }, - "html_notice_title": { "message": "Mitteilung" }, - "html_notice_important_notice": { "message": "Wichtige Mitteilung von The Great Suspender" }, - "html_options_title": { "message": "Einstellungen" }, - "html_options_suspend_title": { "message": "Automatisches Tab Aussetzen" }, - "html_options_suspended_title": { "message": "Ausgesetzte Tabs" }, - "html_options_other_title": { "message": "Andere" }, - "html_options_suspend_automatically_after": { "message": "Tabs automatisch aussetzen nach" }, - "html_options_suspend_never": { "message": "Nie" }, - "html_options_suspend_seconds": { "message": "Sekunden" }, - "html_options_suspend_minute": { "message": "Min." }, - "html_options_suspend_minutes": { "message": "Minuten" }, - "html_options_suspend_hour": { "message": "Stunde" }, - "html_options_suspend_hours": { "message": "Stunden" }, - "html_options_suspend_day": { "message": "Tag" }, - "html_options_suspend_days": { "message": "Tage" }, - "html_options_suspend_week": { "message": "Woche" }, - "html_options_suspend_weeks": { "message": "Wochen" }, - "html_options_suspend_no_pinned": { "message": "Gepinnte Tabs nicht aussetzen" }, - "html_options_suspend_no_forms": { "message": "Tabs mit ungespeicherten Formularen nicht aussetzen" }, - "html_options_suspend_no_audio": { "message": "Tabs mit Audiowiedergabe nicht aussetzen" }, - "html_options_suspend_only_connected": { "message": "Tabs nicht aussetzen im Offline-Modus" }, - "html_options_suspend_only_on_battery": { "message": "Tabs nicht aussetzen bei aktiver Stromversorgung" }, - "html_options_suspend_no_active_tabs": { "message": "Aktive Tabs in jedem Fenster nicht aussetzen" }, - "html_options_suspend_automatically_unsuspend": { "message": "Tab automatisch aufwachen, wenn er aufgerufen wird" }, - "html_options_suspend_discard_after_suspend": { "message": "Benutze integrierte Speicherfunktion von Chrome beim Aussetzen" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Reduziert den Speicherverbrauch eines Tabs dank" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "der integrierten \"Tab verwerfen\" Funktion in Chrome. Das kann bis" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "zu 500% mehr Speicher sparen, wenn man eine Vielzahl von Tabs geöffnet hat." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "Das kann aber auch zu kurzen Darstellungsdauern führen beim Auswählen" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "eines ausgesetzten Tabs." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Mehr Informationen über diese Funktionalität gibt es hier:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Aussehen" }, - "html_options_suspend_theme_light": { "message": "hell" }, - "html_options_suspend_theme_dark": { "message": "dunkel" }, - "html_options_suspend_screen_capturing": { "message": "Bildschirmaufnahme" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Gesperrt" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Nur oberen Bereich aufnehmen" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Ganze Seite aufnehmen" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Die Erweiterung kann eine Vorschau des ausgesetzten Tabs anzeigen," }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "die zeigt, wie der Tab vor dem Aussetzen aussah." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "Diese experimentelle Einstellung kann für signifikante CPU-Last und" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "erhöhte Speicherbelegung sorgen." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Wenn sich Tabs stark verzögert aussetzen lassen oder Chrome" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "unerwartet abstürzt, solltest du diese Einstellung deaktivieren." }, - "html_options_suspend_force_screen_capture": { "message": "Hochwertige Bildschirmaufnahmen aktivieren" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Wenn inaktiv, dann haben Bildschirmaufnahmen die folgenden Einschränkungen zur Leistungsverbesserung:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Bildschirmaufnahmen in niedriger Qualtität" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- keine Bildschirmaufnahme, wenn es länger als 1 Minute dauert, das Bild zu erstellen" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- maximale Höhe der Bildschirmaufnahme limitiert auf 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Aktivieren der hochwertigen Bildschirmaufnahmen kann signifikant die CPU-Last" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "und den Speicherverbrauch erhöhen." }, - "html_options_whitelist_title": { "message": "Tabs mit URL aus der Ausnahmeliste nicht aussetzen:" }, - "html_options_whitelist_tooltip_line1": { "message": "Füge die URL jeder Seite, die zugelassen werden soll in eine eigene Zeile. Zum Beispiel:" }, - "html_options_whitelist_tooltip_line2": { "message": "Um mehrere Seiten in einer Zeile zuzulassen, kannst du stattdessen einen Teil der URL angeben:" }, - "html_options_whitelist_tooltip_line3": { "message": "Du kannst auch reguläre Ausdrücke verwenden, wenn der Text von Schrägstrichen eingeschlossen ist:" }, - "html_options_whitelist_test": { "message": "Zulässige Seiten testen" }, - "html_options_other_enable_context_menu": { "message": "Füge The Great Suspender zum Rechtsklick-Kontextmenü hinzu" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Macht Einstellungen der Erweiterung im Rechtsklick-Kontextmenü einer Webseite verfügbar." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Das ermöglicht den Zugriff auf umfangreichere Aktionen, die sonst" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "nicht in der Erweiterung zu finden sind." }, - "html_options_other_enable_sync": { "message": "Synchronisiere die Einstellungen mit deinem Chrome Profil" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "Einstellungen der Erweiterung werden zu allen Chrome Browsern synchronisiert," }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "auf denen das gleiche Profil angemeldet ist." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Das synchronisiert die Einstellungen auch für den Inkognitomodus." }, - "html_options_other_enable_sync_warning": { "message": "Diese Option wird die Einstellungen für alle Browser mit dem gleichen Chrome Profil überschreiben" }, - "html_options_suspend_on_low_memory": { "message": "Bei geringer Speicherverfügbarkeit sofort aussetzen" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Diese Option wird die automatische Tab verwerfen Funktion von Chrome ausschalten." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Ist sie aktiv, wird ein Tab ausgesetzt statt verworfen." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Typischerweise wird Chrome Tabs nur bei geringer Speicherverfügbarkeit verwerfen." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Hinweis: Das kann Tabs früher aussetzen als" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "in den Einstellung für automatisches Tab aussetzen." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Mehr Informationen zu Chromes Verwerfen Funktionalität findest du unter:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Diesen Tab aufwachen" }, - "html_popup_suspend_tab": { "message": "Diesen Tab jetzt aussetzen" }, - "html_popup_dont_suspend_now": { "message": "Jetzt nicht aussetzen" }, - "html_popup_never_suspend_domain": { "message": "Diese Domain nicht aussetzen" }, - "html_popup_never_suspend_page": { "message": "Diese URL nicht aussetzen" }, - "html_popup_suspend_other_tabs": { "message": "Alle anderen Tabs aussetzen" }, - "html_popup_unsuspend_all_tabs": { "message": "Alle Tabs aufwachen" }, - "html_popup_suspend_selected_tabs": { "message": "Ausgewählte Tabs aussetzen" }, - "html_popup_unsuspend_selected_tabs": { "message": "Ausgewählte Tabs aufwachen" }, - "html_popup_settings": { "message": "Einstellungen" }, - "html_restoring_title": { "message": "Fenster wird wiederhergestellt" }, - "html_restoring_heading": { "message": "Tabs wiederherstellen" }, - "html_restoring_detail": { "message": "Bitte warten Sie, bis ich dieses Fenster wiederhergestellt habe..." }, - "html_recovery_title": { "message": "Wiederherstellung" }, - "html_recovery_ruh_roh": { "message": "Oh oh!" }, - "html_recovery_description_line1": { "message": "Es sieht so aus als wäre die Erweiterung abgestürzt." }, - "html_recovery_description_line2": { "message": "Deine ausgesetzten Tabs sind abgestürzt oder verschwunden." }, - "html_recovery_restore_tabs_automatically": { "message": "Tabs automatisch wiederherstellen" }, - "html_recovery_go_to_session_manager": { "message": "Gehe zur Sitzungsverwaltung" }, - "html_recovery_important_message": { "message": "Aktuell ist die Bildschirmaufnahme aktiv. Sollte diese Erweiterung häufig abstürzen, solltest du diese Option deaktivieren." }, - "html_recovery_disable_screen_capturing": { "message": "Bildschirmaufnahme deaktivieren" }, - "html_recovery_tabs_to_restore": { "message": "Tabs zur Wiederherstellung" }, - "html_shortcuts_title": { "message": "Tastenkombinationen" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Tastenkombinationen" }, - "html_shortcuts_context_menu_note": { "message": "Hinweis: Diese Aktionen sind auch über das Rechtsklick-Kontextmenü verfügbar." }, - "html_shortcuts_remap_keys": { "message": "Tastenkombinationen ändern" }, - "html_sidebar_general_settings": { "message": "Einstellungen" }, - "html_sidebar_session_management": { "message": "Sitzungsverwaltung" }, - "html_sidebar_shortcuts": { "message": "Tastenkombinationen" }, - "html_sidebar_support": { "message": "Über" }, - "html_success_great_success": { "message": "Großartig!" }, - "html_success_all_tabs_restored": { "message": "Alles Tabs wurden wiederhergestellt." }, - "html_success_goto_advanced_prefix": { "message": "Für eine erweitertete Sitzungsverwaltung, öffne die" }, - "html_success_goto_advanced_suffix": { "message": "Seite" }, - "html_session_manager": { "message": "Sitzungsverwaltung" }, - "html_suspended_title": { "message": "Ausgesetzter Tab" }, - "html_suspended_tab_suspended": { "message": "Tab ausgesetzt" }, - "html_suspended_tab_reload": { "message": "Tab neu laden" }, - "html_suspended_tab_whitelist_prefix": { "message": "Nicht aussetzen" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Aktualisieren oder Klicken zum Neuladen" }, - "html_suspended_toast_not_connected": { "message": "Du bist nicht mit dem Internet verbunden." }, - "html_suspended_toast_reload_disabled": { "message": "Automatische Tab Aktualisierung ist temporär deaktiviert." }, - "html_permissions_title": { "message": "Berechtigungen" }, - "html_permissions_heading": { "message": "Bitte erlaube Zugriff auf lokale (Datei-) URLs" }, - "html_permissions_info": { "message": "Diese Erweiterung darf derzeit keine URLs aussetzen, die beginnen mit: \"file\".\nUm das zu ändern, aktiviere \"Zugriff auf lokale (Datei-) URLs\" in den Einstellungen der Erweiterung." }, - "html_permissions_backup": { "message": "Hinweis: Das Ändern der Option lässt deine ausgesetzten Tabs kurz verschwinden.\nFür den Fall der Fälle solltest du jetzt eine Sicherung der aktuellen Sitzung anlegen." }, - "html_update_title": { "message": "Aktualisierung" }, - "html_update_heading2": { "message": "wird jetzt noch besser" }, - "html_update_info": { "message": "Eine neue Version von The Great Suspender kann installiert werden.\nHinweis: Während der Aktualisierung verschwinden die ausgesetzten Tabs für kurze Zeit." }, - "html_update_info_withbackup": { "message": "Für den Fall der Fälle solltest du eine Sicherung der aktuellen Sitzung anlegen." }, - "html_update_info_nobackup_prefix": { "message": "Empfehlung: exportiere eine Kopie deiner aktuellen Sitzung von " }, - "html_update_info_nobackup_suffix": { "message": " bevor du die Aktualisierung durchführst." }, - "html_updated_title": { "message": "Aktualisiert" }, - "html_updating_heading": { "message": "wird aktualisiert" }, - "html_updating_message": { "message": "Bitte warte, während die ausgesetzten Tabs wiederhergestellt werden..." }, - "html_updated_great_suspender_updated": { "message": "wurde aktualisiert" }, - "html_updated_info_line1": { "message": "Eine automatische Sicherung deiner Tabs wurde vor der Aktualisierung angelegt." }, - "html_updated_info_line2_prefix": { "message": "Sollte etwas während der Aktualisierung schief gehen, öffne die" }, - "html_updated_info_line2_suffix": { "message": " Seite." }, - "html_updated_detail_header_prefix": { "message": "Was ist neu in " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Neue Funktionen:" }, - "html_updated_bug_fixes_header": { "message": "Fehlerbehebungen:" }, - "html_updated_release_notes": { "message": "Besuche GitHub für alle Änderungen: " }, - "html_updated_patch_message": { "message": "Entschuldige die Störung. Es wurden Wartungsarbeiten durchgeführt." }, - "html_welcome_title": { "message": "Willkommen!" }, - "html_welcome_text_line1": { "message": "Danke fürs Ausprobieren." }, - "html_welcome_text_line2": { "message": "Ich lasse deinen Computer geschmeidiger laufen indem ich Tabs aussetze, die du nicht benutzt." }, - "html_welcome_text_line3": { "message": "Du kannst unten die Einstellungen verändern." }, - "html_thanks_title": { "message": "Danke" }, - "html_thanks_header": { "message": "Danke für deine Unterstützung!" }, - "html_thanks_sub_header": { "message": "Mögen dir großartige Dinge geschehen." }, - "js_popup_normal": { "message": "Tab wird automatisch ausgesetzt." }, - "js_popup_normal_pause": { "message": "Nicht jetzt" }, - "js_popup_special": { "message": "Tab kann nicht ausgesetzt werden" }, - "js_popup_suspended": { "message": "Tab ausgesetzt" }, - "js_popup_suspended_pause": { "message": "Nicht aussetzen" }, - "js_popup_whitelisted": { "message": "Seite zur Ausnahmeliste hinzugefügt." }, - "js_popup_whitelisted_remove": { "message": "Von Ausnahmeliste entfernen" }, - "js_popup_audible": { "message": "Audiowiedergabe in diesem Tab." }, - "js_popup_form_input": { "message": "Formulareingabe in diesem Tab." }, - "js_popup_form_input_unpause": { "message": "Fortführen" }, - "js_popup_pinned": { "message": "Tab wurde gepinnt" }, - "js_popup_temp_whitelist": { "message": "Aussetzen pausiert." }, - "js_popup_temp_whitelist_unpause": { "message": "Fortführen" }, - "js_popup_never": { "message": "Automatisches Aussetzen ist deaktiviert." }, - "js_popup_no_connectivity": { "message": "Keine Netzwerkverbindung" }, - "js_popup_charging": { "message": "Stromversorgung ist aktiv" }, - "js_popup_blockedFile": { "message": "Lokale Dateien können nicht ausgesetzt werden." }, - "js_popup_blockedFile_enable": { "message": "Aktivieren" }, - "js_popup_unknown": { "message": "Lade den Tab..." }, - "js_popup_initialising": { "message": "Initialisiere die Erweiterung..." }, - "js_popup_error": { "message": "Automatisches Aussetzen für diesen Tab nicht verfügbar" }, - "js_history_delete": { "message": "löschen" }, - "js_history_export": { "message": "exportieren" }, - "js_history_reload": { "message": "neu laden" }, - "js_history_resuspend": { "message": "wieder aussetzen" }, - "js_history_save": { "message": "speichern" }, - "js_history_window": { "message": "Fenster" }, - "js_history_tab": { "message": "Tab" }, - "js_history_plural": { "message": "s" }, - "js_history_enter_name_for_session": { "message": "Benenne diese Sitzung" }, - "js_history_confirm_delete": { "message": "Bist du sicher, dass du diese Sitzung löschen willst?" }, - "js_history_confirm_session_overwrite": { "message": "Es gibt bereits eine gespeicherte Sitzung mit diesem Namen. Bestehende Sitzung überschreiben?" }, - "js_history_import_fail": { "message": "Datei konnte nicht geladen werden. Stelle sicher, dass es eine Textdatei ist und sie eine URL pro Zeile enthält." }, - "js_suspended_remove_from_whitelist": { "message": "Seite aus Ausnahmeliste entfernen" }, - "js_suspended_hotkey_to_reload": { "message": "Tastenkombination setzen" }, - "js_suspended_low_memory": { "message": "Tab ausgesetzt aufgrund von niedrigem Speicher" }, - "js_options_incognito_warning": { "message": "Du bist im Inkognitomodus. Einige Funktionen sind nicht verfügbar." }, - "js_options_whitelist_no_matches": { "message": "Es sind keine offenen Seiten vorhanden, die den aktuell zulässigen Seiten entsprechen." }, - "js_options_whitelist_matches_heading": { "message": "Erlaubte offene Seiten:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "und" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "weitere." }, - "js_permissions_button_export": { "message": "Sicherung anlegen" }, - "js_permissions_button_set": { "message": "Einstellungen öffnen" }, - "js_update_confirm": { "message": "Es existiert keine Sicherung. Erweiterung trotzdem aktualisieren?" }, - "js_update_button_export": { "message": "Sicherung anlegen" }, - "js_update_button_reload": { "message": "Erweiterung jetzt aktualisieren" }, - "js_shortcuts_not_set": { "message": "nicht gesetzt" }, - "js_session_save_point": { "message": "Automatischer Sicherungspunkt für v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Lass deinen Computer geschmeidiger laufen, in dem du Tabs aussetzen lässt, die du nicht benutzt" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Aktiven Tab aussetzen/aufwachen" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Aussetzen des aktiven Tabs pausieren/fortführen" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Ausgewählte Tabs aussetzen" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Ausgewählte Tabs aufwachen" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Alle anderen Tabs im aktiven Fenster aussetzen" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Alle anderen Tabs im aktiven Fenster aussetzen (forcieren)" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Alle Tabs in diesem Fenster aufwachen" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Alle Tabs in allen Fenstern aussetzen" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Alle Tabs in allen Fenstern aufwachen" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Öffne Link in neuem ausgesetztem Tab" + }, + "js_context_toggle_suspend_state": { + "message": "Diesen Tab aussetzen/aufwachen" + }, + "js_context_toggle_pause_suspension": { + "message": "Aussetzen dieses Tabs pausieren/fortführen" + }, + "js_context_never_suspend_domain": { + "message": "Diese Domain nicht aussetzen" + }, + "js_context_never_suspend_page": { + "message": "Diese URL nicht aussetzen" + }, + "js_context_suspend_selected_tabs": { + "message": "Ausgewählte Tabs aussetzen" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Ausgewählte Tabs aufwachen" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Alle anderen Tabs in diesem Fenster aussetzen" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Alle anderen Tabs in diesem Fenster aussetzen (forcieren)" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Alle Tabs in diesem Fenster aufwachen" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Alle Tabs in allen Fenstern aussetzen" + }, + "js_context_force_suspend_all_tabs": { + "message": "Alle Tabs in allen Fenstern aussetzen (forcieren)" + }, + "js_context_unsuspend_all_tabs": { + "message": "Alle Tabs in allen Fenstern aufwachen" + }, + "html_about_title": { + "message": "Über" + }, + "html_about_fork_beginning": { + "message": "Basierend auf dem Original" + }, + "html_about_fork_mid": { + "message": "auf GitHub ohne ADS-Tracking verfügbar" + }, + "html_about_fork_end": { + "message": ", mehr Informationen verfügbar unter" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Wenn du Feedback hast oder einen Fehler melden möchtest, melde das auf der" + }, + "html_about_report_issues_suffix": { + "message": ". Bitte prüfe vorab, ob deine Idee oder dein Fehler schon gemeldet wurde. Danke!" + }, + "html_about_debugging_prefix": { + "message": "Um die Protokollierung zu aktivieren oder Debugging-Flags festzulegen, gehen Sie auf die " + }, + "html_about_debugging_suffix": { + "message": "Debug-Seite." + }, + "html_about_the_github_issues_page": { + "message": "GitHub Projektseite" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Diese Erweiterung nutzt die" + }, + "html_about_html2canvas_suffix": { + "message": "Bibliothek, programmiert von Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Sie nutzt auch den indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "programmiert von Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Ein weiterer Dank an" + }, + "html_about_browserstack_suffix": { + "message": "für die kostenlosen Chrome Testwerkzeuge." + }, + "html_about_tgs_prefix": { + "message": "Ohne diese Erweiterung hätte es nie geben können" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "ist defekt" + }, + "html_broken_ruh_roh": { + "message": "Oh oh!" + }, + "html_broken_line1": { + "message": "konnte nicht starten. Vielleicht verwendest du eine inkompatible Version von Chrome?" + }, + "html_broken_line2": { + "message": "Versuche die Erweiterung neu zu starten. Falls das Problem weiterhin besteht, frage nach Hilfe auf der" + }, + "html_broken_line2_github_page": { + "message": "GitHub Projektseite" + }, + "html_broken_line3": { + "message": "Du kannst verlorene Tabs auf der" + }, + "html_broken_line3_session_management": { + "message": "Sitzungsverwaltungsseite" + }, + "html_broken_button_restart_extension": { + "message": "Erweiterung neu starten" + }, + "html_history_title": { + "message": "Sitzungsverwaltung" + }, + "html_history_current_session": { + "message": "Aktuelle Sitzung" + }, + "html_history_recent_sessions": { + "message": "Kürzliche Sitzungen" + }, + "html_history_saved_sessions": { + "message": "Gespeicherte Sitzungen" + }, + "html_history_import_session": { + "message": "Sitzung importieren" + }, + "html_history_migrate_tabs": { + "message": "Tabs migrieren" + }, + "html_history_migrate_old_id": { + "message": "Alte TGS-Erweiterungs-ID" + }, + "html_notice_title": { + "message": "Mitteilung" + }, + "html_notice_important_notice": { + "message": "Wichtige Mitteilung von The Marvellous Suspender" + }, + "html_options_title": { + "message": "Einstellungen" + }, + "html_options_suspend_title": { + "message": "Automatisches Tab Aussetzen" + }, + "html_options_suspended_title": { + "message": "Ausgesetzte Tabs" + }, + "html_options_other_title": { + "message": "Andere" + }, + "html_options_suspend_automatically_after": { + "message": "Tabs automatisch aussetzen nach" + }, + "html_options_suspend_never": { + "message": "Nie" + }, + "html_options_suspend_seconds": { + "message": "Sekunden" + }, + "html_options_suspend_minute": { + "message": "Min." + }, + "html_options_suspend_minutes": { + "message": "Minuten" + }, + "html_options_suspend_hour": { + "message": "Stunde" + }, + "html_options_suspend_hours": { + "message": "Stunden" + }, + "html_options_suspend_day": { + "message": "Tag" + }, + "html_options_suspend_days": { + "message": "Tage" + }, + "html_options_suspend_week": { + "message": "Woche" + }, + "html_options_suspend_weeks": { + "message": "Wochen" + }, + "html_options_suspend_no_pinned": { + "message": "Gepinnte Tabs nicht aussetzen" + }, + "html_options_suspend_no_forms": { + "message": "Tabs mit ungespeicherten Formularen nicht aussetzen" + }, + "html_options_suspend_no_audio": { + "message": "Tabs mit Audiowiedergabe nicht aussetzen" + }, + "html_options_suspend_only_connected": { + "message": "Tabs nicht aussetzen im Offline-Modus" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Tabs nicht aussetzen bei aktiver Stromversorgung" + }, + "html_options_suspend_no_active_tabs": { + "message": "Aktive Tabs in jedem Fenster nicht aussetzen" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Tab automatisch aufwachen, wenn er aufgerufen wird" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Benutze integrierte Speicherfunktion von Chrome beim Aussetzen" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduziert den Speicherverbrauch eines Tabs dank" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "der integrierten \"Tab verwerfen\" Funktion in Chrome. Das kann bis" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "zu 500% mehr Speicher sparen, wenn man eine Vielzahl von Tabs geöffnet hat." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Das kann aber auch zu kurzen Darstellungsdauern führen beim Auswählen" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "eines ausgesetzten Tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Mehr Informationen über diese Funktionalität gibt es hier:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Aussehen" + }, + "html_options_suspend_theme_light": { + "message": "hell" + }, + "html_options_suspend_theme_dark": { + "message": "dunkel" + }, + "html_options_suspend_screen_capturing": { + "message": "Bildschirmaufnahme" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Gesperrt" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Nur oberen Bereich aufnehmen" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Ganze Seite aufnehmen" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Die Erweiterung kann eine Vorschau des ausgesetzten Tabs anzeigen," + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "die zeigt, wie der Tab vor dem Aussetzen aussah." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Diese experimentelle Einstellung kann für signifikante CPU-Last und" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "erhöhte Speicherbelegung sorgen." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Wenn sich Tabs stark verzögert aussetzen lassen oder Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "unerwartet abstürzt, solltest du diese Einstellung deaktivieren." + }, + "html_options_suspend_force_screen_capture": { + "message": "Hochwertige Bildschirmaufnahmen aktivieren" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Wenn inaktiv, dann haben Bildschirmaufnahmen die folgenden Einschränkungen zur Leistungsverbesserung:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Bildschirmaufnahmen in niedriger Qualtität" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- keine Bildschirmaufnahme, wenn es länger als 1 Minute dauert, das Bild zu erstellen" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- maximale Höhe der Bildschirmaufnahme limitiert auf 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Aktivieren der hochwertigen Bildschirmaufnahmen kann signifikant die CPU-Last" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "und den Speicherverbrauch erhöhen." + }, + "html_options_whitelist_title": { + "message": "Tabs mit URL aus der Ausnahmeliste nicht aussetzen:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Füge die URL jeder Seite, die zugelassen werden soll in eine eigene Zeile. Zum Beispiel:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Um mehrere Seiten in einer Zeile zuzulassen, kannst du stattdessen einen Teil der URL angeben:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Du kannst auch reguläre Ausdrücke verwenden, wenn der Text von Schrägstrichen eingeschlossen ist:" + }, + "html_options_whitelist_test": { + "message": "Zulässige Seiten testen" + }, + "html_options_other_enable_context_menu": { + "message": "Füge The Marvellous Suspender zum Rechtsklick-Kontextmenü hinzu" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Macht Einstellungen der Erweiterung im Rechtsklick-Kontextmenü einer Webseite verfügbar." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Das ermöglicht den Zugriff auf umfangreichere Aktionen, die sonst" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "nicht in der Erweiterung zu finden sind." + }, + "html_options_other_enable_sync": { + "message": "Synchronisiere die Einstellungen mit deinem Chrome Profil" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Einstellungen der Erweiterung werden zu allen Chrome Browsern synchronisiert," + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "auf denen das gleiche Profil angemeldet ist." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Das synchronisiert die Einstellungen auch für den Inkognitomodus." + }, + "html_options_other_enable_sync_warning": { + "message": "Diese Option wird die Einstellungen für alle Browser mit dem gleichen Chrome Profil überschreiben" + }, + "html_options_suspend_on_low_memory": { + "message": "Bei geringer Speicherverfügbarkeit sofort aussetzen" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Diese Option wird die automatische Tab verwerfen Funktion von Chrome ausschalten." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Ist sie aktiv, wird ein Tab ausgesetzt statt verworfen." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typischerweise wird Chrome Tabs nur bei geringer Speicherverfügbarkeit verwerfen." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Hinweis: Das kann Tabs früher aussetzen als" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "in den Einstellung für automatisches Tab aussetzen." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Mehr Informationen zu Chromes Verwerfen Funktionalität findest du unter:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Diesen Tab aufwachen" + }, + "html_popup_suspend_tab": { + "message": "Diesen Tab jetzt aussetzen" + }, + "html_popup_dont_suspend_now": { + "message": "Jetzt nicht aussetzen" + }, + "html_popup_never_suspend_domain": { + "message": "Diese Domain nicht aussetzen" + }, + "html_popup_never_suspend_page": { + "message": "Diese URL nicht aussetzen" + }, + "html_popup_suspend_other_tabs": { + "message": "Alle anderen Tabs aussetzen" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Alle Tabs aufwachen" + }, + "html_popup_suspend_selected_tabs": { + "message": "Ausgewählte Tabs aussetzen" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Ausgewählte Tabs aufwachen" + }, + "html_popup_settings": { + "message": "Einstellungen" + }, + "html_restoring_title": { + "message": "Fenster wird wiederhergestellt" + }, + "html_restoring_heading": { + "message": "Tabs wiederherstellen" + }, + "html_restoring_detail": { + "message": "Bitte warten Sie, bis ich dieses Fenster wiederhergestellt habe..." + }, + "html_recovery_title": { + "message": "Wiederherstellung" + }, + "html_recovery_ruh_roh": { + "message": "Oh oh!" + }, + "html_recovery_description_line1": { + "message": "Es sieht so aus als wäre die Erweiterung abgestürzt." + }, + "html_recovery_description_line2": { + "message": "Deine ausgesetzten Tabs sind abgestürzt oder verschwunden." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Tabs automatisch wiederherstellen" + }, + "html_recovery_go_to_session_manager": { + "message": "Gehe zur Sitzungsverwaltung" + }, + "html_recovery_important_message": { + "message": "Aktuell ist die Bildschirmaufnahme aktiv. Sollte diese Erweiterung häufig abstürzen, solltest du diese Option deaktivieren." + }, + "html_recovery_disable_screen_capturing": { + "message": "Bildschirmaufnahme deaktivieren" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs zur Wiederherstellung" + }, + "html_shortcuts_title": { + "message": "Tastenkombinationen" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Tastenkombinationen" + }, + "html_shortcuts_context_menu_note": { + "message": "Hinweis: Diese Aktionen sind auch über das Rechtsklick-Kontextmenü verfügbar." + }, + "html_shortcuts_remap_keys": { + "message": "Tastenkombinationen ändern" + }, + "html_sidebar_general_settings": { + "message": "Einstellungen" + }, + "html_sidebar_session_management": { + "message": "Sitzungsverwaltung" + }, + "html_sidebar_shortcuts": { + "message": "Tastenkombinationen" + }, + "html_sidebar_support": { + "message": "Über" + }, + "html_success_great_success": { + "message": "Großartig!" + }, + "html_success_all_tabs_restored": { + "message": "Alles Tabs wurden wiederhergestellt." + }, + "html_success_goto_advanced_prefix": { + "message": "Für eine erweitertete Sitzungsverwaltung, öffne die" + }, + "html_success_goto_advanced_suffix": { + "message": "Seite" + }, + "html_session_manager": { + "message": "Sitzungsverwaltung" + }, + "html_suspended_title": { + "message": "Ausgesetzter Tab" + }, + "html_suspended_tab_suspended": { + "message": "Tab ausgesetzt" + }, + "html_suspended_tab_reload": { + "message": "Tab neu laden" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nicht aussetzen" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Aktualisieren oder Klicken zum Neuladen" + }, + "html_suspended_toast_not_connected": { + "message": "Du bist nicht mit dem Internet verbunden." + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatische Tab Aktualisierung ist temporär deaktiviert." + }, + "html_permissions_title": { + "message": "Berechtigungen" + }, + "html_permissions_heading": { + "message": "Bitte erlaube Zugriff auf lokale (Datei-) URLs" + }, + "html_permissions_info": { + "message": "Diese Erweiterung darf derzeit keine URLs aussetzen, die beginnen mit: \"file\".\nUm das zu ändern, aktiviere \"Zugriff auf lokale (Datei-) URLs\" in den Einstellungen der Erweiterung." + }, + "html_permissions_backup": { + "message": "Hinweis: Das Ändern der Option lässt deine ausgesetzten Tabs kurz verschwinden.\nFür den Fall der Fälle solltest du jetzt eine Sicherung der aktuellen Sitzung anlegen." + }, + "html_update_title": { + "message": "Aktualisierung" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "Eine neue Version von The Marvellous Suspender kann installiert werden.\nHinweis: Während der Aktualisierung verschwinden die ausgesetzten Tabs für kurze Zeit." + }, + "html_update_info_withbackup": { + "message": "Für den Fall der Fälle solltest du eine Sicherung der aktuellen Sitzung anlegen." + }, + "html_update_info_nobackup_prefix": { + "message": "Empfehlung: exportiere eine Kopie deiner aktuellen Sitzung von " + }, + "html_update_info_nobackup_suffix": { + "message": " bevor du die Aktualisierung durchführst." + }, + "html_updated_title": { + "message": "Aktualisiert" + }, + "html_updating_heading": { + "message": "wird aktualisiert" + }, + "html_updating_message": { + "message": "Bitte warte, während die ausgesetzten Tabs wiederhergestellt werden..." + }, + "html_updated_great_suspender_updated": { + "message": "wurde aktualisiert" + }, + "html_updated_info_line1": { + "message": "Eine automatische Sicherung deiner Tabs wurde vor der Aktualisierung angelegt." + }, + "html_updated_info_line2_prefix": { + "message": "Sollte etwas während der Aktualisierung schief gehen, öffne die " + }, + "html_updated_info_line2_suffix": { + "message": " Seite." + }, + "html_updated_detail_header_prefix": { + "message": "Was ist neu in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Neue Funktionen:" + }, + "html_updated_bug_fixes_header": { + "message": "Fehlerbehebungen:" + }, + "html_updated_release_notes": { + "message": "Besuche GitHub für alle Änderungen: " + }, + "html_updated_patch_message": { + "message": "Entschuldige die Störung. Es wurden Wartungsarbeiten durchgeführt." + }, + "html_welcome_title": { + "message": "Willkommen!" + }, + "html_welcome_text_line1": { + "message": "Danke fürs Ausprobieren." + }, + "html_welcome_text_line2": { + "message": "Ich lasse deinen Computer geschmeidiger laufen indem ich Tabs aussetze, die du nicht benutzt." + }, + "html_welcome_text_line3": { + "message": "Du kannst unten die Einstellungen verändern." + }, + "js_popup_normal": { + "message": "Tab wird automatisch ausgesetzt." + }, + "js_popup_normal_pause": { + "message": "Nicht jetzt" + }, + "js_popup_special": { + "message": "Tab kann nicht ausgesetzt werden" + }, + "js_popup_suspended": { + "message": "Tab ausgesetzt" + }, + "js_popup_suspended_pause": { + "message": "Nicht aussetzen" + }, + "js_popup_whitelisted": { + "message": "Seite zur Ausnahmeliste hinzugefügt." + }, + "js_popup_whitelisted_remove": { + "message": "Von Ausnahmeliste entfernen" + }, + "js_popup_audible": { + "message": "Audiowiedergabe in diesem Tab." + }, + "js_popup_form_input": { + "message": "Formulareingabe in diesem Tab." + }, + "js_popup_form_input_unpause": { + "message": "Fortführen" + }, + "js_popup_pinned": { + "message": "Tab wurde gepinnt" + }, + "js_popup_temp_whitelist": { + "message": "Aussetzen pausiert." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Fortführen" + }, + "js_popup_never": { + "message": "Automatisches Aussetzen ist deaktiviert." + }, + "js_popup_no_connectivity": { + "message": "Keine Netzwerkverbindung" + }, + "js_popup_charging": { + "message": "Stromversorgung ist aktiv" + }, + "js_popup_blockedFile": { + "message": "Lokale Dateien können nicht ausgesetzt werden." + }, + "js_popup_blockedFile_enable": { + "message": "Aktivieren" + }, + "js_popup_unknown": { + "message": "Lade den Tab..." + }, + "js_popup_initialising": { + "message": "Initialisiere die Erweiterung..." + }, + "js_popup_error": { + "message": "Automatisches Aussetzen für diesen Tab nicht verfügbar" + }, + "js_history_delete": { + "message": "löschen" + }, + "js_history_export": { + "message": "exportieren" + }, + "js_history_reload": { + "message": "neu laden" + }, + "js_history_resuspend": { + "message": "wieder aussetzen" + }, + "js_history_save": { + "message": "speichern" + }, + "js_history_window": { + "message": "Fenster" + }, + "js_history_windows": { + "message": "Fenster" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_tabs": { + "message": "Tabs" + }, + "js_history_enter_name_for_session": { + "message": "Benenne diese Sitzung" + }, + "js_history_confirm_delete": { + "message": "Bist du sicher, dass du diese Sitzung löschen willst?" + }, + "js_history_confirm_session_overwrite": { + "message": "Es gibt bereits eine gespeicherte Sitzung mit diesem Namen. Bestehende Sitzung überschreiben?" + }, + "js_history_import_fail": { + "message": "Datei konnte nicht geladen werden. Stelle sicher, dass es eine Textdatei ist und sie eine URL pro Zeile enthält." + }, + "js_history_migrate_fail": { + "message": "Benötigt 32 Zeichen Erweiterung Id zum migrieren" + }, + "js_history_migrate_success": { + "message": "Erfolgreich migriert $TABCOUNT$ Tabs", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Seite aus Ausnahmeliste entfernen" + }, + "js_suspended_hotkey_to_reload": { + "message": "Tastenkombination setzen" + }, + "js_suspended_low_memory": { + "message": "Tab ausgesetzt aufgrund von niedrigem Speicher" + }, + "js_options_incognito_warning": { + "message": "Du bist im Inkognitomodus. Einige Funktionen sind nicht verfügbar." + }, + "js_options_whitelist_no_matches": { + "message": "Es sind keine offenen Seiten vorhanden, die den aktuell zulässigen Seiten entsprechen." + }, + "js_options_whitelist_matches_heading": { + "message": "Erlaubte offene Seiten:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "und" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "weitere." + }, + "js_permissions_button_export": { + "message": "Sicherung anlegen" + }, + "js_permissions_button_set": { + "message": "Einstellungen öffnen" + }, + "js_update_confirm": { + "message": "Es existiert keine Sicherung. Erweiterung trotzdem aktualisieren?" + }, + "js_update_button_export": { + "message": "Sicherung anlegen" + }, + "js_update_button_reload": { + "message": "Erweiterung jetzt aktualisieren" + }, + "js_shortcuts_not_set": { + "message": "nicht gesetzt" + }, + "js_session_save_point": { + "message": "Automatischer Sicherungspunkt für v" + } } diff --git a/src/_locales/en/messages.json b/src/_locales/en/messages.json index d9b59ff2..9748d312 100644 --- a/src/_locales/en/messages.json +++ b/src/_locales/en/messages.json @@ -1,7 +1,7 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, + "ext_extension_name": { "message": "The Marvellous Suspender" }, "ext_extension_description": { "message": "Make your computer run smoothly by suspending the tabs you aren't using" }, - "ext_default_title": { "message": "The Great Suspender" }, + "ext_default_title": { "message": "The Marvellous Suspender" }, "ext_cmd_toggle_tab_suspension_description": { "message": "Suspend/Unsuspend active tab" }, "ext_cmd_toggle_tab_pause_description": { "message": "Pause/Unpause suspension of active tab" }, "ext_cmd_suspend_selected_tabs_description": { "message": "Suspend selected tabs" }, @@ -26,7 +26,11 @@ "js_context_force_suspend_all_tabs": { "message": "Force suspend all tabs in all windows" }, "js_context_unsuspend_all_tabs": { "message": "Unsuspend all tabs in all windows" }, "html_about_title": { "message": "About" }, + "html_about_fork_beginning": { "message": "Based on the original" }, + "html_about_fork_mid": { "message": "available on GitHub, without ADS tracking" }, + "html_about_fork_end": { "message": ", more information available on" }, "html_about_github_title": { "message": "GitHub" }, + "html_about_blog_title": { "message": "Blog" }, "html_about_twitter_title": { "message": "Twitter" }, "html_about_report_issues_prefix": { "message": "If you have feedback or would like to report an issue, you can do so on the" }, "html_about_report_issues_suffix": { "message": ". Please check to see if your idea or issue already exists before creating a new one. Thanks!" }, @@ -39,16 +43,28 @@ "html_about_indexedDb": { "message": "db.js" }, "html_about_indexedDb_prefix": { "message": "It also uses the indexedDb wrapper" }, "html_about_indexedDb_suffix": { "message": "written by Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, + "html_about_browserstack": { "message": "BrowserStack" }, "html_about_browserstack_prefix": { "message": "Thank you also to" }, "html_about_browserstack_suffix": { "message": "for providing free chrome testing tools." }, + "html_about_tgs_prefix": { "message": "This extension could never have existed without" }, + "html_about_tgs_suffix": { "message": "." }, + "html_broken_title": { "message": "is broken" }, + "html_broken_ruh_roh": { "message": "Ruh Roh!" }, + "html_broken_line1": { "message": "failed to start. Perhaps you are using an incompatible version of Chrome?" }, + "html_broken_line2": { "message": "Try to restart the extension. If the problem persists, ask for help on the" }, + "html_broken_line2_github_page": { "message": "GitHub project page" }, + "html_broken_line3": { "message": "You can recover lost tabs from the" }, + "html_broken_line3_session_management": { "message": "session management page" }, + "html_broken_button_restart_extension": { "message": "Restart extension" }, "html_history_title": { "message": "Session management" }, "html_history_current_session": { "message": "Current session" }, "html_history_recent_sessions": { "message": "Recent sessions" }, "html_history_saved_sessions": { "message": "Saved sessions" }, "html_history_import_session": { "message": "Import session" }, + "html_history_migrate_tabs": { "message": "Migrate tabs" }, + "html_history_migrate_old_id": { "message": "Old TGS Extension id" }, "html_notice_title": { "message": "Notice" }, - "html_notice_important_notice": { "message": "Important notice from The Great Suspender" }, + "html_notice_important_notice": { "message": "Important notice from The Marvellous Suspender" }, "html_options_title": { "message": "Settings" }, "html_options_suspend_title": { "message": "Automatic tab suspension" }, "html_options_suspended_title": { "message": "Suspended tabs" }, @@ -68,6 +84,7 @@ "html_options_suspend_no_forms": { "message": "Never suspend tabs that contain unsaved form inputs" }, "html_options_suspend_no_audio": { "message": "Never suspend tabs that are playing audio" }, "html_options_suspend_only_connected": { "message": "Never suspend tabs when offline" }, + "html_options_suspend_claim_by_default": { "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" }, "html_options_suspend_only_on_battery": { "message": "Never suspend tabs when connected to power source" }, "html_options_suspend_no_active_tabs": { "message": "Never suspend active tab in each window" }, "html_options_suspend_automatically_unsuspend": { "message": "Automatically unsuspend tab when it is viewed" }, @@ -99,16 +116,12 @@ "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- Maximum height of screen capture limited to 5000px" }, "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Enabling high quality screen capture mode may significantly increase CPU load" }, "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "and memory usage." }, - "html_options_clean_screen_captures": { "message": "Clean screencaps" }, - "html_options_clean_screen_captures_line1": { "message": "Enabling this option will block advertisements and other annoyances during suspension of a tab." }, - "html_options_clean_screen_captures_line2": { "message": "This will help with the recongnizability of a screencaptured website and save resources." }, - "html_options_clean_screen_captures_line3": { "message": "It will make use of the following host block list: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts." }, "html_options_whitelist_title": { "message": "Never suspend tabs with URLs from the following list:" }, "html_options_whitelist_tooltip_line1": { "message": "Add the URL of each page you want to whitelist on a new line. For example:" }, "html_options_whitelist_tooltip_line2": { "message": "To whitelist multiple sites in one line you can specify part of the url instead:" }, "html_options_whitelist_tooltip_line3": { "message": "You can also specify regular expressions by enclosing the text in forward slashes:" }, "html_options_whitelist_test": { "message": "Test whitelist" }, - "html_options_other_enable_context_menu": { "message": "Add The Great Suspender to right-click context menu" }, + "html_options_other_enable_context_menu": { "message": "Add The Marvellous Suspender to right-click context menu" }, "html_options_other_enable_context_menu_tooltip_line1": { "message": "Add controls for this extension to the right-click menu of a web page." }, "html_options_other_enable_context_menu_tooltip_line2": { "message": "This will give you access to advanced suspending actions not available" }, "html_options_other_enable_context_menu_tooltip_line3": { "message": "elsewhere in the extension." }, @@ -117,8 +130,6 @@ "html_options_other_enable_sync_tooltip_line1b": { "message": "logged in with the same profile." }, "html_options_other_enable_sync_tooltip_line2": { "message": "This will also synchronise settings in incognito mode." }, "html_options_other_enable_sync_warning": { "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" }, - "html_options_tracking_opt_out": { "message": "Automatic deactivation of any kind of tracking" }, - "html_options_tracking_opt_out_line1": { "message": "This option will disable tracking code, such as that from Google Analytics." }, "html_options_suspend_on_low_memory": { "message": "Instantly suspend when system memory gets very low" }, "html_options_suspend_on_low_memory_tooltip_line1": { "message": "This option will override Chrome's automatic tab discarding functionality." }, "html_options_suspend_on_low_memory_tooltip_line2": { "message": "If enabled, it will force a tab to suspend instead of being discarded by Chrome." }, @@ -157,7 +168,7 @@ "html_sidebar_session_management": { "message": "Session management" }, "html_sidebar_shortcuts": { "message": "Keyboard shortcuts" }, "html_sidebar_support": { "message": "About" }, - "html_success_great_success": { "message": "Great success!" }, + "html_success_great_success": { "message": "Marvellous success!" }, "html_success_all_tabs_restored": { "message": "All your tabs have been restored." }, "html_success_goto_advanced_prefix": { "message": "For advanced session management, visit the" }, "html_success_goto_advanced_suffix": { "message": "page" }, @@ -175,8 +186,8 @@ "html_permissions_info": { "message": "This extension is not currently permitted to suspend URLs beginning with the word \"file\".\nTo change this, please turn on \"Allow access to file URLs\" from the extension settings page." }, "html_permissions_backup": { "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." }, "html_update_title": { "message": "Update" }, - "html_update_heading2": { "message": "is about to get greater" }, - "html_update_info": { "message": "A new version of The Great Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." }, + "html_update_heading2": { "message": "is about to get marvellous-er" }, + "html_update_info": { "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." }, "html_update_info_withbackup": { "message": "Just in case, now might be a good time to save a backup of your current tab session." }, "html_update_info_nobackup_prefix": { "message": "It is strongly recommended that you export a copy of your current session from " }, "html_update_info_nobackup_suffix": { "message": " before continuing with the update." }, @@ -224,12 +235,22 @@ "js_history_resuspend": { "message": "open and suspend" }, "js_history_save": { "message": "save" }, "js_history_window": { "message": "Window" }, + "js_history_windows": { "message": "Windows" }, "js_history_tab": { "message": "Tab" }, - "js_history_plural": { "message": "s" }, + "js_history_tabs": { "message": "Tabs" }, "js_history_enter_name_for_session": { "message": "Enter a name for this session" }, "js_history_confirm_delete": { "message": "Are you sure you want to delete this session?" }, "js_history_confirm_session_overwrite": { "message": "There is already a saved session with this name. Overwrite existing session?" }, "js_history_import_fail": { "message": "Failed to load file. Ensure file is plain text and contains a single url per line." }, + "js_history_migrate_fail": { "message": "Need 32-character extension id to migrate from" }, + "js_history_migrate_success": { + "message": "Successfully migrated $TABCOUNT$ tabs", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, "js_suspended_remove_from_whitelist": { "message": "Remove site from whitelist" }, "js_suspended_hotkey_to_reload": { "message": "Set keyboard shortcuts" }, "js_suspended_low_memory": { "message": "Tab suspended due to low system memory" }, diff --git a/src/_locales/es/messages.json b/src/_locales/es/messages.json new file mode 100644 index 00000000..531958b3 --- /dev/null +++ b/src/_locales/es/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Haz que tu ordenador funcione sin problemas al suspender las pestañas que no estás usando" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspender/Anular suspensión de la pestaña activa" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pausar/Reanudar suspensión de la pestaña activa" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspender pestañas seleccionadas" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Anular suspensión de las pestañas seleccionadas" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspender todas las demás pestañas en la ventana activa" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forzar suspensión de todas las otras pestañas en la ventana activa" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Anular suspensión de todas las pestañas en la ventana activa" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspender todas las pestañas en todas las ventanas" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forzar suspensión de todas las pestañas en todas las ventanas" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Anular suspensión de todas las pestañas en todas las ventanas" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Abrir Enlace en una Nueva Pestaña Suspendida" + }, + "js_context_toggle_suspend_state": { + "message": "Suspender/Anular suspensión de esta pestaña" + }, + "js_context_toggle_pause_suspension": { + "message": "Pausar/Reanudar suspensión de esta pestaña" + }, + "js_context_never_suspend_domain": { + "message": "Nunca suspender este dominio" + }, + "js_context_never_suspend_page": { + "message": "Nunca suspenda esta URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspender pestañas seleccionadas" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Anular suspensión de las pestañas seleccionadas" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspender todas las demás pestañas en esta ventana" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forzar suspensión de todas las otras pestañas en esta ventana" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Anular suspensión de todas las pestañas en esta ventana" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspender todas las pestañas en todas las ventanas" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forzar suspensión de todas las pestañas en todas las ventanas" + }, + "js_context_unsuspend_all_tabs": { + "message": "Anular suspensión de todas las pestañas en todas las ventanas" + }, + "html_about_title": { + "message": "Acerca de" + }, + "html_about_fork_beginning": { + "message": "Basado en el original" + }, + "html_about_fork_mid": { + "message": "disponible en GitHub, sin seguimiento ADS" + }, + "html_about_fork_end": { + "message": ", más información disponible en" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Si tiene comentarios o desea reportar un problema, puede hacerlo en el" + }, + "html_about_report_issues_suffix": { + "message": ". Por favor, compruebe si su idea o problema ya existe antes de crear una nueva. ¡Gracias!" + }, + "html_about_debugging_prefix": { + "message": "Para habilitar el registro, o para establecer banderas de depuración, vaya a la " + }, + "html_about_debugging_suffix": { + "message": "pagina de depuración." + }, + "html_about_the_github_issues_page": { + "message": "Página de incidencias de GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Esta extensión utiliza el" + }, + "html_about_html2canvas_suffix": { + "message": "biblioteca escrita por Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "También utiliza el envoltorio indexedDb" + }, + "html_about_indexedDb_suffix": { + "message": "escrito por Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Gracias también a" + }, + "html_about_browserstack_suffix": { + "message": "por proporcionar herramientas gratuitas de prueba chrome." + }, + "html_about_tgs_prefix": { + "message": "Esta extensión nunca podría haber existido sin" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "está roto" + }, + "html_broken_ruh_roh": { + "message": "¡Oh oh!" + }, + "html_broken_line1": { + "message": "fallo al iniciar. ¿Quizás esté usando una versión incompatible de Chrome?" + }, + "html_broken_line2": { + "message": "Intente reiniciar la extensión. Si el problema persiste, pida ayuda en la" + }, + "html_broken_line2_github_page": { + "message": "Página del proyecto en GitHub" + }, + "html_broken_line3": { + "message": "Puede recuperar las pestañas perdidas de la" + }, + "html_broken_line3_session_management": { + "message": "página de gestión de sesión" + }, + "html_broken_button_restart_extension": { + "message": "Reiniciar extensión" + }, + "html_history_title": { + "message": "Administración de sesión" + }, + "html_history_current_session": { + "message": "Sesión actual" + }, + "html_history_recent_sessions": { + "message": "Sesiones recientes" + }, + "html_history_saved_sessions": { + "message": "Sesiones guardadas" + }, + "html_history_import_session": { + "message": "Importar sesión" + }, + "html_history_migrate_tabs": { + "message": "Migrar pestañas" + }, + "html_history_migrate_old_id": { + "message": "Anterior id de extensión TGS" + }, + "html_notice_title": { + "message": "Aviso" + }, + "html_notice_important_notice": { + "message": "Nota importante de The Marvellous Suspender" + }, + "html_options_title": { + "message": "Configuración" + }, + "html_options_suspend_title": { + "message": "Suspensión automática de pestaña" + }, + "html_options_suspended_title": { + "message": "Pestañas suspendidas" + }, + "html_options_other_title": { + "message": "Otro" + }, + "html_options_suspend_automatically_after": { + "message": "Suspender automáticamente las pestañas después de" + }, + "html_options_suspend_never": { + "message": "Nunca" + }, + "html_options_suspend_seconds": { + "message": "segundos" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "minutos" + }, + "html_options_suspend_hour": { + "message": "hora" + }, + "html_options_suspend_hours": { + "message": "horas" + }, + "html_options_suspend_day": { + "message": "día" + }, + "html_options_suspend_days": { + "message": "días" + }, + "html_options_suspend_week": { + "message": "semana" + }, + "html_options_suspend_weeks": { + "message": "semanas" + }, + "html_options_suspend_no_pinned": { + "message": "Nunca suspender pestañas fijadas" + }, + "html_options_suspend_no_forms": { + "message": "Nunca suspender pestañas que contengan entradas de formulario no guardadas" + }, + "html_options_suspend_no_audio": { + "message": "Nunca suspender pestañas que estén reproduciendo audio" + }, + "html_options_suspend_only_connected": { + "message": "Nunca suspender pestañas cuando estén fuera de línea" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Nunca suspender pestañas cuando esté conectado a la fuente de alimentación" + }, + "html_options_suspend_no_active_tabs": { + "message": "Nunca suspender la pestaña activa en cada ventana" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Anular suspensión automáticamente de la pestaña cuando sea vista" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Aplicar el ahorro de memoria integrado de Chrome al suspender" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduce el uso de memoria de una pestaña suspendida aún más, mediante la utilización" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Función integrada de 'Descartar pestañas' de Chrome. Esto puede resultar en" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "al 500% de ahorro de memoria cuando se trabaja con un gran número de pestañas." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Sin embargo, también causará un ligero retraso al seleccionar" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "pestañas suspendidas" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Para más información sobre el descarte de Chrome refiérase a:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Claro" + }, + "html_options_suspend_theme_dark": { + "message": "Oscuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Captura de pantalla" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Deshabilitada" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capturar solo la parte superior de la pantalla" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capturar toda la página" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "En una pestaña suspendida, la extensión puede mostrar una vista previa de la imagen de lo que la pestaña" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "parecía justo antes de que se suspendiera." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "La función de captura de pantalla es experimental y puede causar un uso significativo de la CPU como" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "así como un uso de memoria ligeramente mayor." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Si observa un comportamiento extraño, como pestañas que tardan mucho en suspender, o Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "falla inesperadamente, intente deshabilitar esta función." + }, + "html_options_suspend_force_screen_capture": { + "message": "Habilitar el modo de captura de pantalla de alta calidad" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Cuando están deshabilitadas, las capturas de pantalla tienen las siguientes limitaciones para ayudar en el rendimiento:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Captura de pantalla de baja calidad" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- No capturará la pantalla si tarda más de 1 minuto en generar la imagen" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Altura máxima de captura de pantalla limitada a 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Habilitar el modo de captura de pantalla de alta calidad puede aumentar significativamente la carga de la CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "y uso de memoria." + }, + "html_options_whitelist_title": { + "message": "Nunca suspenda pestañas con URL de la siguiente lista:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Agregue la URL de cada página que desea incluir en la lista blanca en una nueva línea. Por ejemplo:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Para incluir múltiples sitios en una línea, puede especificar parte de la url en su lugar:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "También puede especificar expresiones regulares adjuntando el texto en las barras delanteras:" + }, + "html_options_whitelist_test": { + "message": "Probar lista blanca" + }, + "html_options_other_enable_context_menu": { + "message": "Añadir The Marvellous Suspender al menú contextual del clic derecho" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Añadir controles para esta extensión al menú de clic derecho de una página web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Esto le dará acceso a acciones avanzadas de suspensión no disponibles" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "en otra parte de la extensión." + }, + "html_options_other_enable_sync": { + "message": "Sincronice la configuración con su perfil de Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Los ajustes de extensión se sincronizarán con todos los navegadores Chrome en los que esté" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "conectado con el mismo perfil." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Esto también sincronizará los ajustes en modo incógnito." + }, + "html_options_other_enable_sync_warning": { + "message": "Activar esto sobrescribirá la configuración en todos los otros navegadores conectados al mismo perfil de Chrome" + }, + "html_options_suspend_on_low_memory": { + "message": "Suspender instantáneamente cuando la memoria del sistema es muy baja" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Esta opción anulará la funcionalidad de descarte automático de pestañas de Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Si está activado, forzará la suspensión de la pestaña en vez de ser descartada por Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Por lo general, Chrome sólo descartará las pestañas una vez que la memoria del sistema sea muy baja." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Tenga en cuenta: Esto puede causar que las pestañas se suspendan antes del tiempo que ha" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "especificado en las opciones de suspensión Automática de pestañas." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Para más información sobre el descarte de Chrome refiérase a:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Anular suspensión de esta pestaña" + }, + "html_popup_suspend_tab": { + "message": "Suspender esta pestaña ahora" + }, + "html_popup_dont_suspend_now": { + "message": "No suspender por ahora" + }, + "html_popup_never_suspend_domain": { + "message": "Nunca suspenda este dominio" + }, + "html_popup_never_suspend_page": { + "message": "Nunca suspenda esta URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspender el resto de pestañas" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Anular suspensión de todas las pestañas" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspender pestañas seleccionadas" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Anular suspensión de las pestañas seleccionadas" + }, + "html_popup_settings": { + "message": "Configuración" + }, + "html_restoring_title": { + "message": "Restaurando ventana" + }, + "html_restoring_heading": { + "message": "Restaurando pestañas" + }, + "html_restoring_detail": { + "message": "Por favor, espere mientras restauro esta ventana..." + }, + "html_recovery_title": { + "message": "Recuperación" + }, + "html_recovery_ruh_roh": { + "message": "¡Oh oh!" + }, + "html_recovery_description_line1": { + "message": "Parece que está recuperando de un fallo de extensión." + }, + "html_recovery_description_line2": { + "message": "Es posible que las pestañas suspendidas hayan fallado o desaparecido." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restaurar pestañas automáticamente" + }, + "html_recovery_go_to_session_manager": { + "message": "Ir al gestor de sesiones" + }, + "html_recovery_important_message": { + "message": "Actualmente tiene activada la captura de pantalla. Si esta extensión se bloquea repetidamente, se recomienda desactivar esta opción." + }, + "html_recovery_disable_screen_capturing": { + "message": "Desactivar captura de pantalla" + }, + "html_recovery_tabs_to_restore": { + "message": "Pestañas a restaurar" + }, + "html_shortcuts_title": { + "message": "Atajos del teclado" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Atajos del teclado" + }, + "html_shortcuts_context_menu_note": { + "message": "Nota: Estas acciones también están disponibles a través del menú contextual del clic derecho." + }, + "html_shortcuts_remap_keys": { + "message": "Cambiar atajos" + }, + "html_sidebar_general_settings": { + "message": "Configuración" + }, + "html_sidebar_session_management": { + "message": "Administración de sesión" + }, + "html_sidebar_shortcuts": { + "message": "Atajos del teclado" + }, + "html_sidebar_support": { + "message": "Acerca de" + }, + "html_success_great_success": { + "message": "¡Maravilloso éxito!" + }, + "html_success_all_tabs_restored": { + "message": "Todas sus pestañas se han restaurado." + }, + "html_success_goto_advanced_prefix": { + "message": "Para la gestión avanzada de sesiones, visite el" + }, + "html_success_goto_advanced_suffix": { + "message": "página" + }, + "html_session_manager": { + "message": "gestión de sesiones" + }, + "html_suspended_title": { + "message": "Pestañas suspendidos" + }, + "html_suspended_tab_suspended": { + "message": "Tab suspendidos" + }, + "html_suspended_tab_reload": { + "message": "Recargar pestaña" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nunca suspender" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Actualizar o hacer clic para recargar" + }, + "html_suspended_toast_not_connected": { + "message": "No estás conectado a internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "La recarga automática de pestañas está temporalmente desactivada." + }, + "html_permissions_title": { + "message": "Permisos" + }, + "html_permissions_heading": { + "message": "Por favor, dame acceso a las URL del archivo local" + }, + "html_permissions_info": { + "message": "Actualmente, esta extensión no puede suspender las URL que comienzan con la palabra \"archivo\".\nPara cambiar esto, marque \"Permitir el acceso a las URL de archivos\" en la página de configuración de la extensión." + }, + "html_permissions_backup": { + "message": "Tenga en cuenta: si cambia esta opción, todas las pestañas suspendidas desaparecerán brevemente.\nPor si acaso, ahora podría ser un buen momento para guardar una copia de seguridad de su sesión de pestañas actual." + }, + "html_update_title": { + "message": "Actualizar" + }, + "html_update_heading2": { + "message": "está por volverse más maravilloso" + }, + "html_update_info": { + "message": "Una nueva versión de The Marvelous Suspender está lista para ser instalada.\nTenga en cuenta: durante la actualización, las pestañas suspendidas desaparecerán brevemente." + }, + "html_update_info_withbackup": { + "message": "Por si acaso, ahora podría ser un buen momento para guardar una copia de seguridad de su sesión de pestañas actual." + }, + "html_update_info_nobackup_prefix": { + "message": "Se recomienda encarecidamente que exporte una copia de su sesión actual desde " + }, + "html_update_info_nobackup_suffix": { + "message": " antes de continuar con la actualización." + }, + "html_updated_title": { + "message": "Actualizado" + }, + "html_updating_heading": { + "message": "actualizando" + }, + "html_updating_message": { + "message": "Espere mientras restauro sus pestañas suspendidas..." + }, + "html_updated_great_suspender_updated": { + "message": "ha sido actualizado" + }, + "html_updated_info_line1": { + "message": "Se realizó una copia de seguridad automática de sus pestañas antes de la actualización." + }, + "html_updated_info_line2_prefix": { + "message": "Si encontró algún problema durante la actualización, puede recuperar las pestañas perdidas del " + }, + "html_updated_info_line2_suffix": { + "message": " página." + }, + "html_updated_detail_header_prefix": { + "message": "¿Qué hay de nuevo en " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Nuevas características:" + }, + "html_updated_bug_fixes_header": { + "message": "Corrección de errores:" + }, + "html_updated_release_notes": { + "message": "Visite GitHub para ver las notas de la versión completas: " + }, + "html_updated_patch_message": { + "message": "Perdone la molestia. Solo necesitaba realizar un pequeño mantenimiento." + }, + "html_welcome_title": { + "message": "Bienvenido" + }, + "html_welcome_text_line1": { + "message": "Gracias por intentarlo" + }, + "html_welcome_text_line2": { + "message": "Hago que su computadora funcione sin problemas al suspender las pestañas que no está usando." + }, + "html_welcome_text_line3": { + "message": "Puede ajustar cualquiera de las configuraciones a continuación." + }, + "js_popup_normal": { + "message": "Tab se suspenderá automáticamente." + }, + "js_popup_normal_pause": { + "message": "No ahora" + }, + "js_popup_special": { + "message": "La pestaña no se puede suspender" + }, + "js_popup_suspended": { + "message": "Tab suspendidos" + }, + "js_popup_suspended_pause": { + "message": "No suspender" + }, + "js_popup_whitelisted": { + "message": "Sitio incluido en la lista blanca." + }, + "js_popup_whitelisted_remove": { + "message": "Eliminar de la lista blanca" + }, + "js_popup_audible": { + "message": "Tab está reproduciendo audio." + }, + "js_popup_form_input": { + "message": "Tab está recibiendo entrada de formulario." + }, + "js_popup_form_input_unpause": { + "message": "Reanudar" + }, + "js_popup_pinned": { + "message": "Se ha fijado la pestaña" + }, + "js_popup_temp_whitelist": { + "message": "Suspensión de pestaña pausa." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Reanudar" + }, + "js_popup_never": { + "message": "Suspensión automática de pestañas desactivada." + }, + "js_popup_no_connectivity": { + "message": "No hay conexion de red" + }, + "js_popup_charging": { + "message": "Conectado a fuente de energía" + }, + "js_popup_blockedFile": { + "message": "Los archivos locales no pueden ser suspendidos." + }, + "js_popup_blockedFile_enable": { + "message": "Habilitar" + }, + "js_popup_unknown": { + "message": "Esperando a que la pestaña se cargue..." + }, + "js_popup_initialising": { + "message": "Esperando a que la extensión se inicialice..." + }, + "js_popup_error": { + "message": "Auto-suspensión no disponible para esta pestaña" + }, + "js_history_delete": { + "message": "eliminar" + }, + "js_history_export": { + "message": "exportar" + }, + "js_history_reload": { + "message": "abrir y cargar" + }, + "js_history_resuspend": { + "message": "abrir y suspender" + }, + "js_history_save": { + "message": "guardar" + }, + "js_history_window": { + "message": "Ventana" + }, + "js_history_windows": { + "message": "Ventanas" + }, + "js_history_tab": { + "message": "Pestaña" + }, + "js_history_tabs": { + "message": "Pestañas" + }, + "js_history_enter_name_for_session": { + "message": "Introduzca un nombre para esta sesión" + }, + "js_history_confirm_delete": { + "message": "¿Está seguro de que desea eliminar esta sesión?" + }, + "js_history_confirm_session_overwrite": { + "message": "Ya hay una sesión guardada con este nombre. ¿Sobrescribir sesión existente?" + }, + "js_history_import_fail": { + "message": "Error al cargar el archivo. Asegúrese de que el archivo es de texto plano y contiene una única url por línea." + }, + "js_history_migrate_fail": { + "message": "Necesita un id de extensión de 32 caracteres para migrar desde" + }, + "js_history_migrate_success": { + "message": "$TABCOUNT$ pestañas migradas con éxito", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Eliminar sitio de la lista blanca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Definir los atajos del teclado" + }, + "js_suspended_low_memory": { + "message": "Pestaña suspendida debido a poca memoria del sistema" + }, + "js_options_incognito_warning": { + "message": "Está en modo incógnito. Algunas características no estarán disponibles." + }, + "js_options_whitelist_no_matches": { + "message": "No hay pestañas abiertas que coincidan con la lista blanca actual." + }, + "js_options_whitelist_matches_heading": { + "message": "Pestañas abiertas de la lista blanca:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "y" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "más." + }, + "js_permissions_button_export": { + "message": "Hacer copia de seguridad" + }, + "js_permissions_button_set": { + "message": "Abrir ajustes de extensión" + }, + "js_update_confirm": { + "message": "Aún no ha guardado una copia de seguridad. ¿Actualizar la extensión de todos modos?" + }, + "js_update_button_export": { + "message": "Hacer copia de seguridad" + }, + "js_update_button_reload": { + "message": "Actualizar extensión ahora" + }, + "js_shortcuts_not_set": { + "message": "no establecido" + }, + "js_session_save_point": { + "message": "Punto de guardado automático para v" + } +} diff --git a/src/_locales/fr-FR/messages.json b/src/_locales/fr-FR/messages.json new file mode 100644 index 00000000..122808a0 --- /dev/null +++ b/src/_locales/fr-FR/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Make your computer run smoothly by suspending the tabs you aren't using" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspend/Unsuspend active tab" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pause/Unpause suspension of active tab" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspend selected tabs" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Unsuspend selected tabs" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspend all other tabs in active window" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Force suspend all other tabs in active window" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Unsuspend all tabs in active window" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspend all tabs in all windows" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Force suspend all tabs in all windows" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Unsuspend all tabs in all windows" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Open Link in New Suspended Tab" + }, + "js_context_toggle_suspend_state": { + "message": "Suspend/Unsuspend this tab" + }, + "js_context_toggle_pause_suspension": { + "message": "Pause/Unpause suspension of this tab" + }, + "js_context_never_suspend_domain": { + "message": "Never suspend this domain" + }, + "js_context_never_suspend_page": { + "message": "Never suspend this URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspend selected tabs" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Unsuspend selected tabs" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspend all other tabs in this window" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Force suspend all other tabs in this window" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Unsuspend all tabs in this window" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspend all tabs in all windows" + }, + "js_context_force_suspend_all_tabs": { + "message": "Force suspend all tabs in all windows" + }, + "js_context_unsuspend_all_tabs": { + "message": "Unsuspend all tabs in all windows" + }, + "html_about_title": { + "message": "About" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking" + }, + "html_about_fork_end": { + "message": ", more information available on" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "If you have feedback or would like to report an issue, you can do so on the" + }, + "html_about_report_issues_suffix": { + "message": ". Please check to see if your idea or issue already exists before creating a new one. Thanks!" + }, + "html_about_debugging_prefix": { + "message": "To enable logging, or to set debugging flags, go to the " + }, + "html_about_debugging_suffix": { + "message": "debug page." + }, + "html_about_the_github_issues_page": { + "message": "GitHub issues page" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "This extension uses the" + }, + "html_about_html2canvas_suffix": { + "message": "library written by Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "It also uses the indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "written by Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Thank you also to" + }, + "html_about_browserstack_suffix": { + "message": "for providing free chrome testing tools." + }, + "html_about_tgs_prefix": { + "message": "This extension could never have existed without" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "is broken" + }, + "html_broken_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_broken_line1": { + "message": "failed to start. Perhaps you are using an incompatible version of Chrome?" + }, + "html_broken_line2": { + "message": "Try to restart the extension. If the problem persists, ask for help on the" + }, + "html_broken_line2_github_page": { + "message": "GitHub project page" + }, + "html_broken_line3": { + "message": "You can recover lost tabs from the" + }, + "html_broken_line3_session_management": { + "message": "session management page" + }, + "html_broken_button_restart_extension": { + "message": "Restart extension" + }, + "html_history_title": { + "message": "Session management" + }, + "html_history_current_session": { + "message": "Current session" + }, + "html_history_recent_sessions": { + "message": "Recent sessions" + }, + "html_history_saved_sessions": { + "message": "Saved sessions" + }, + "html_history_import_session": { + "message": "Import session" + }, + "html_history_migrate_tabs": { + "message": "Migrate tabs" + }, + "html_history_migrate_old_id": { + "message": "Old TGS Extension id" + }, + "html_notice_title": { + "message": "Notice" + }, + "html_notice_important_notice": { + "message": "Important notice from The Marvellous Suspender" + }, + "html_options_title": { + "message": "Settings" + }, + "html_options_suspend_title": { + "message": "Automatic tab suspension" + }, + "html_options_suspended_title": { + "message": "Suspended tabs" + }, + "html_options_other_title": { + "message": "Other" + }, + "html_options_suspend_automatically_after": { + "message": "Automatically suspend tabs after" + }, + "html_options_suspend_never": { + "message": "Never" + }, + "html_options_suspend_seconds": { + "message": "seconds" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hour" + }, + "html_options_suspend_hours": { + "message": "hours" + }, + "html_options_suspend_day": { + "message": "day" + }, + "html_options_suspend_days": { + "message": "days" + }, + "html_options_suspend_week": { + "message": "week" + }, + "html_options_suspend_weeks": { + "message": "weeks" + }, + "html_options_suspend_no_pinned": { + "message": "Never suspend pinned tabs" + }, + "html_options_suspend_no_forms": { + "message": "Never suspend tabs that contain unsaved form inputs" + }, + "html_options_suspend_no_audio": { + "message": "Never suspend tabs that are playing audio" + }, + "html_options_suspend_only_connected": { + "message": "Never suspend tabs when offline" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab consider suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Never suspend tabs when connected to power source" + }, + "html_options_suspend_no_active_tabs": { + "message": "Never suspend active tab in each window" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Automatically unsuspend tab when it is viewed" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Apply Chrome's built-in memory-saving when suspending" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduces a suspended tab's memory usage even more, by utilizing" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome's built-in 'tab discarding' functionality. This can result in up" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "However, it will also cause a slight rendering delay when selecting" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Theme" + }, + "html_options_suspend_theme_light": { + "message": "Light" + }, + "html_options_suspend_theme_dark": { + "message": "Dark" + }, + "html_options_suspend_screen_capturing": { + "message": "Screen capturing" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Disabled" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture top of screen only" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capture entire page" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "On a suspended tab, the extension can display an image preview of the what the tab" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "The screen capturing feature is experimental and can cause significant CPU usage as" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "If you notice strange behaviour such as tabs taking a long time to suspend, or chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "Enable high quality screen capture mode" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "When disabled, screen captures have the following limitations to aid in performance:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Low quality screen capture" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Will not capture screen if it takes more than 1 minute to generate image" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Maximum height of screen capture limited to 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Enabling high quality screen capture mode may significantly increase CPU load" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "Never suspend tabs with URLs from the following list:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Add the URL of each page you want to whitelist on a new line. For example:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "To whitelist multiple sites in one line you can specify part of the url instead:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "You can also specify regular expressions by enclosing the text in forward slashes:" + }, + "html_options_whitelist_test": { + "message": "Test whitelist" + }, + "html_options_other_enable_context_menu": { + "message": "Add The Marvellous Suspender to right-click context menu" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Add controls for this extension to the right-click menu of a web page." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "This will give you access to advanced suspending actions not available" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "Sync settings with your Chrome profile" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Extension settings will be synchronised across all chrome browsers which are" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "logged in with the same profile." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "This will also synchronise settings in incognito mode." + }, + "html_options_other_enable_sync_warning": { + "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" + }, + "html_options_suspend_on_low_memory": { + "message": "Instantly suspend when system memory gets very low" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "This option will override Chrome's automatic tab discarding functionality." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "If enabled, it will force a tab to suspend instead of being discarded by Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typically, Chrome will only discard tabs once system memory gets very low." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Please note: This may cause tabs to suspend earlier than the time you have" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Unsuspend this tab" + }, + "html_popup_suspend_tab": { + "message": "Suspend this tab now" + }, + "html_popup_dont_suspend_now": { + "message": "Don't suspend for now" + }, + "html_popup_never_suspend_domain": { + "message": "Never suspend this domain" + }, + "html_popup_never_suspend_page": { + "message": "Never suspend this URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspend all other tabs" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Unsuspend all tabs" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspend selected tabs" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Unsuspend selected tabs" + }, + "html_popup_settings": { + "message": "Settings" + }, + "html_restoring_title": { + "message": "Restoring window" + }, + "html_restoring_heading": { + "message": "Restoring tabs" + }, + "html_restoring_detail": { + "message": "Please wait while I restore this window..." + }, + "html_recovery_title": { + "message": "Recovery" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "Looks like you're recovering from an extension crash." + }, + "html_recovery_description_line2": { + "message": "Your suspended tabs may have crashed or disappeared." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restore tabs automatically" + }, + "html_recovery_go_to_session_manager": { + "message": "Go to session manager" + }, + "html_recovery_important_message": { + "message": "You currently have screen capturing turned on. If this extension is repeatedly crashing it is recommended you disable this option." + }, + "html_recovery_disable_screen_capturing": { + "message": "Turn off screen capturing" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs to restore" + }, + "html_shortcuts_title": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_context_menu_note": { + "message": "Note: These actions are also available via the right-click context menu." + }, + "html_shortcuts_remap_keys": { + "message": "Change shortcuts" + }, + "html_sidebar_general_settings": { + "message": "Settings" + }, + "html_sidebar_session_management": { + "message": "Session management" + }, + "html_sidebar_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_sidebar_support": { + "message": "About" + }, + "html_success_great_success": { + "message": "Marvellous success!" + }, + "html_success_all_tabs_restored": { + "message": "All your tabs have been restored." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "session management" + }, + "html_suspended_title": { + "message": "Suspended Tab" + }, + "html_suspended_tab_suspended": { + "message": "Tab suspended" + }, + "html_suspended_tab_reload": { + "message": "Reload tab" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Never suspend" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Refresh or click to reload" + }, + "html_suspended_toast_not_connected": { + "message": "You are not connected to the internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatic tab reloading is temporarily disabled." + }, + "html_permissions_title": { + "message": "Permissions" + }, + "html_permissions_heading": { + "message": "Please give me access to local file URLs" + }, + "html_permissions_info": { + "message": "This extension is not currently permitted to suspend URLs beginning with the word \"file\".\nTo change this, please turn on \"Allow access to file URLs\" from the extension settings page." + }, + "html_permissions_backup": { + "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_title": { + "message": "Update" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." + }, + "html_update_info_withbackup": { + "message": "Just in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_info_nobackup_prefix": { + "message": "It is strongly recommended that you export a copy of your current session from " + }, + "html_update_info_nobackup_suffix": { + "message": " before continuing with the update." + }, + "html_updated_title": { + "message": "Updated" + }, + "html_updating_heading": { + "message": "is updating" + }, + "html_updating_message": { + "message": "Please wait while I restore your suspended tabs..." + }, + "html_updated_great_suspender_updated": { + "message": "has been updated" + }, + "html_updated_info_line1": { + "message": "An automatic backup was made of your tabs before the update." + }, + "html_updated_info_line2_prefix": { + "message": "If you encountered any issues during the update, you can recover lost tabs from the " + }, + "html_updated_info_line2_suffix": { + "message": " page." + }, + "html_updated_detail_header_prefix": { + "message": "What's new in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "New features:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug fixes:" + }, + "html_updated_release_notes": { + "message": "Visit GitHub for full release notes: " + }, + "html_updated_patch_message": { + "message": "Sorry for the disturbance. I just needed to perform a little maintenance." + }, + "html_welcome_title": { + "message": "Welcome" + }, + "html_welcome_text_line1": { + "message": "Thanks for trying" + }, + "html_welcome_text_line2": { + "message": "I make your computer run smoothly by suspending the tabs you aren't using." + }, + "html_welcome_text_line3": { + "message": "You can fine-tune the settings below." + }, + "js_popup_normal": { + "message": "Tab will suspend automatically." + }, + "js_popup_normal_pause": { + "message": "Not now" + }, + "js_popup_special": { + "message": "Tab cannot be suspended" + }, + "js_popup_suspended": { + "message": "Tab suspended" + }, + "js_popup_suspended_pause": { + "message": "Don't suspend" + }, + "js_popup_whitelisted": { + "message": "Site whitelisted." + }, + "js_popup_whitelisted_remove": { + "message": "Remove from whitelist" + }, + "js_popup_audible": { + "message": "Tab is playing audio." + }, + "js_popup_form_input": { + "message": "Tab is receiving form input." + }, + "js_popup_form_input_unpause": { + "message": "Unpause" + }, + "js_popup_pinned": { + "message": "Tab has been pinned" + }, + "js_popup_temp_whitelist": { + "message": "Tab suspension paused." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Unpause" + }, + "js_popup_never": { + "message": "Automatic tab suspension disabled." + }, + "js_popup_no_connectivity": { + "message": "No network connection" + }, + "js_popup_charging": { + "message": "Connected to power source" + }, + "js_popup_blockedFile": { + "message": "Local files cannot be suspended." + }, + "js_popup_blockedFile_enable": { + "message": "Enable" + }, + "js_popup_unknown": { + "message": "Waiting for tab to load..." + }, + "js_popup_initialising": { + "message": "Waiting for extension to initialize..." + }, + "js_popup_error": { + "message": "Auto-suspend unavailable for this tab" + }, + "js_history_delete": { + "message": "delete" + }, + "js_history_export": { + "message": "export" + }, + "js_history_reload": { + "message": "open and load" + }, + "js_history_resuspend": { + "message": "open and suspend" + }, + "js_history_save": { + "message": "save" + }, + "js_history_window": { + "message": "Window" + }, + "js_history_windows": { + "message": "Windows" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_tabs": { + "message": "Tabs" + }, + "js_history_enter_name_for_session": { + "message": "Enter a name for this session" + }, + "js_history_confirm_delete": { + "message": "Are you sure you want to delete this session?" + }, + "js_history_confirm_session_overwrite": { + "message": "There is already a saved session with this name. Overwrite existing session?" + }, + "js_history_import_fail": { + "message": "Failed to load file. Ensure file is plain text and contains a single url per line." + }, + "js_history_migrate_fail": { + "message": "Need 32-character extension id to migrate from" + }, + "js_history_migrate_success": { + "message": "Successfully migrated $TABCOUNT$ tabs", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Remove site from whitelist" + }, + "js_suspended_hotkey_to_reload": { + "message": "Set keyboard shortcuts" + }, + "js_suspended_low_memory": { + "message": "Tab suspended due to low system memory" + }, + "js_options_incognito_warning": { + "message": "You are in incognito mode. Some features will not be available." + }, + "js_options_whitelist_no_matches": { + "message": "There are no open tabs that match the current whitelist." + }, + "js_options_whitelist_matches_heading": { + "message": "Whitelisted open tabs:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "and" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "more." + }, + "js_permissions_button_export": { + "message": "Save backup" + }, + "js_permissions_button_set": { + "message": "Open extension settings" + }, + "js_update_confirm": { + "message": "You have not saved a backup yet. Update the extension anyway?" + }, + "js_update_button_export": { + "message": "Save backup" + }, + "js_update_button_reload": { + "message": "Update extension now" + }, + "js_shortcuts_not_set": { + "message": "not set" + }, + "js_session_save_point": { + "message": "Automatic save point for v" + } +} diff --git a/src/_locales/fr/messages.json b/src/_locales/fr/messages.json new file mode 100644 index 00000000..28caaa3a --- /dev/null +++ b/src/_locales/fr/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Améliore les performances de votre ordinateur en suspendant les onglets que vous n'utilisez pas" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspend/Recharge l'onglet actif" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pause/Remet la suspension de l'onglet actif" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspend les onglets sélectionnés" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Annule la suspension des onglets sélectionnés" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspend tous les autres onglets de la fenêtre active" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Force la suspension de tous les autres onglets dans la fenêtre active" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Annule la suspension de tous les onglets dans la fenêtre active" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspend tous les onglets dans toutes les fenêtres" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Force la suspension de tous les onglets dans toutes les fenêtres" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Annuler la suspension de tous les onglets dans toutes les fenêtres" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Ouvrir le lien dans un nouvel onglet suspendu" + }, + "js_context_toggle_suspend_state": { + "message": "Suspendre/Annuler la suspension de cet onglet" + }, + "js_context_toggle_pause_suspension": { + "message": "Pause/Remettre la suspension de cet onglet" + }, + "js_context_never_suspend_domain": { + "message": "Ne jamais suspendre ce domaine" + }, + "js_context_never_suspend_page": { + "message": "Ne jamais suspendre cette URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspendre les onglets sélectionnés" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Annuler la suspension des onglets sélectionnés" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspendre tous les autres onglets de cette fenêtre" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forcer la suspension de tous les autres onglets dans cette fenêtre" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Annuler la suspension de tous les onglets dans cette fenêtre" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspendre tous les onglets dans toutes les fenêtres" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forcer la suspension de tous les onglets dans toutes les fenêtres" + }, + "js_context_unsuspend_all_tabs": { + "message": "Annuler la suspension de tous les onglets dans toutes les fenêtres" + }, + "html_about_title": { + "message": "À propos" + }, + "html_about_fork_beginning": { + "message": "Basé sur l'original" + }, + "html_about_fork_mid": { + "message": "disponible sur GitHub, sans suivi publicitaire" + }, + "html_about_fork_end": { + "message": ", plus d'informations disponibles sur" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Si vous avez des commentaires ou souhaitez signaler un problème, vous pouvez le faire sur la" + }, + "html_about_report_issues_suffix": { + "message": ". Veuillez vérifier si votre idée ou problème existe déjà avant d'en créer une nouvelle. Merci!" + }, + "html_about_debugging_prefix": { + "message": "Pour activer la journalisation, ou pour définir des options de débogage, allez dans la " + }, + "html_about_debugging_suffix": { + "message": "page de débogage." + }, + "html_about_the_github_issues_page": { + "message": "page de problèmes GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Cette extension utilise le" + }, + "html_about_html2canvas_suffix": { + "message": "bibliothèque écrite par Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Elle utilise aussi le wrapper indexedDb" + }, + "html_about_indexedDb_suffix": { + "message": "écrit par Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Merci également à" + }, + "html_about_browserstack_suffix": { + "message": "pour fournir des outils de test de chrome gratuits." + }, + "html_about_tgs_prefix": { + "message": "Cette extension n'aurait jamais pu exister sans" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "est cassé" + }, + "html_broken_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_broken_line1": { + "message": "n'a pas pu démarrer. Peut-être utilisez-vous une version incompatible de Chrome ?" + }, + "html_broken_line2": { + "message": "Essayez de redémarrer l'extension. Si le problème persiste, demandez de l'aide sur la" + }, + "html_broken_line2_github_page": { + "message": "page de projet GitHub" + }, + "html_broken_line3": { + "message": "Vous pouvez récupérer les onglets perdus depuis la" + }, + "html_broken_line3_session_management": { + "message": "page de gestion de session" + }, + "html_broken_button_restart_extension": { + "message": "Redémarrer l'extension" + }, + "html_history_title": { + "message": "Gestion de session" + }, + "html_history_current_session": { + "message": "Session en cours" + }, + "html_history_recent_sessions": { + "message": "Sessions récentes" + }, + "html_history_saved_sessions": { + "message": "Sessions sauvegardées" + }, + "html_history_import_session": { + "message": "Importer une session" + }, + "html_history_migrate_tabs": { + "message": "Migration d'onglets" + }, + "html_history_migrate_old_id": { + "message": "Ancien ID d'extension TGS" + }, + "html_notice_title": { + "message": "Annonce" + }, + "html_notice_important_notice": { + "message": "Annonce importante de The Marvellous Suspender" + }, + "html_options_title": { + "message": "Paramètres" + }, + "html_options_suspend_title": { + "message": "Suspension automatique des onglets" + }, + "html_options_suspended_title": { + "message": "Onglets suspendus" + }, + "html_options_other_title": { + "message": "Autres" + }, + "html_options_suspend_automatically_after": { + "message": "Suspendre automatiquement les onglets après" + }, + "html_options_suspend_never": { + "message": "Jamais" + }, + "html_options_suspend_seconds": { + "message": "secondes" + }, + "html_options_suspend_minute": { + "message": "minute" + }, + "html_options_suspend_minutes": { + "message": "minutes" + }, + "html_options_suspend_hour": { + "message": "heure" + }, + "html_options_suspend_hours": { + "message": "heures" + }, + "html_options_suspend_day": { + "message": "jour" + }, + "html_options_suspend_days": { + "message": "jours" + }, + "html_options_suspend_week": { + "message": "semaine" + }, + "html_options_suspend_weeks": { + "message": "semaines" + }, + "html_options_suspend_no_pinned": { + "message": "Ne jamais suspendre les onglets épinglés" + }, + "html_options_suspend_no_forms": { + "message": "Ne jamais suspendre les onglets contenant des entrées de formulaire non enregistrées" + }, + "html_options_suspend_no_audio": { + "message": "Ne jamais suspendre les onglets qui jouent de l'audio" + }, + "html_options_suspend_only_connected": { + "message": "Ne jamais suspendre les onglets en mode hors connexion" + }, + "html_options_suspend_claim_by_default": { + "message": "Réclamer par défaut (migration transparente ; onglet considéré comme suspendu si 'suspended.html' est dans l'url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Ne jamais suspendre les onglets lorsque connecté à une source d'alimentation" + }, + "html_options_suspend_no_active_tabs": { + "message": "Ne jamais suspendre les onglets actifs dans chaque fenêtre" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Automatiquement annuler la suspension de l'onglet lorsqu'il est vu" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Appliquer l'économiseur de mémoire intégré à Chrome lors de la suspension" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Réduit encore plus l'utilisation de la mémoire d'un onglet suspendu, en utilisant la" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "fonctionnalité intégrée de 'suppression d'onglets' de Chrome. Cela peut entraîner jusqu'à" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "500% d'économie de mémoire lorsque vous travaillez avec un grand nombre d'onglets." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Cependant, cela provoquera également un léger délai de rendu lors de la sélection" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "d'un onglet suspendu." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Pour plus d'informations sur les rejets de Chrome, reportez-vous à:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Thème" + }, + "html_options_suspend_theme_light": { + "message": "Clair" + }, + "html_options_suspend_theme_dark": { + "message": "Sombre" + }, + "html_options_suspend_screen_capturing": { + "message": "Capture d'écran" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Désactivé" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capturer le haut de l'écran uniquement" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capturer la page entière" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Dans un onglet suspendu, l'extension peut afficher un aperçu de l'image de ce que l'onglet" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "avait l'air juste avant d'être suspendu." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "La fonctionnalité de capture d'écran est expérimentale et peut causer une utilisation importante du processeur" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "ainsi qu'une utilisation de mémoire légèrement augmentée." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Si vous remarquez un comportement étrange, comme les onglets qui prennent beaucoup de temps à se suspendre, ou chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "plantant inopinément, essayez de désactiver cette fonctionnalité." + }, + "html_options_suspend_force_screen_capture": { + "message": "Activer le mode de capture d'écran haute qualité" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Lorsqu'il est désactivé, les captures d'écran ont les limitations suivantes pour améliorer la performance:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Capture d'écran de faible qualité" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Ne capturera pas l'écran si la génération d'image prend plus d'une minute" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Hauteur maximale de la capture d'écran limitée à 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Activer le mode de capture d'écran de haute qualité peut considérablement augmenter la charge du CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "et l'utilisation de la mémoire." + }, + "html_options_whitelist_title": { + "message": "Ne jamais suspendre les onglets avec des URL dans la liste suivante :" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Ajouter l'URL de chaque page que vous souhaitez ajouter à la liste blanche sur une nouvelle ligne. Par exemple:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Pour mettre en liste blanche plusieurs sites en une ligne, vous pouvez spécifier une partie de l'url à la place:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Vous pouvez également spécifier des expressions régulières en mettant le texte entre des slashs:" + }, + "html_options_whitelist_test": { + "message": "Tester la liste blanche" + }, + "html_options_other_enable_context_menu": { + "message": "Ajouter The Marvellous Suspender au menu contextuel du clic droit" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Ajouter des contrôles pour cette extension au menu contextuel d'une page web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Cela vous donnera accès aux actions de suspension avancées indisponibles" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "autre part dans l'extension." + }, + "html_options_other_enable_sync": { + "message": "Synchroniser les paramètres avec votre profil Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Les paramètres de l'extension seront synchronisés sur tous les navigateurs chrome qui sont" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "connecté avec le même profil." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Cela synchronisera également les paramètres en mode incognito." + }, + "html_options_other_enable_sync_warning": { + "message": "Activer cette option écrasera les paramètres de tous les autres navigateurs connectés sur le même profil Chrome" + }, + "html_options_suspend_on_low_memory": { + "message": "Suspendre instantanément lorsque la mémoire du système devient très faible" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Cette option remplacera la fonctionnalité de suppression automatique des onglets de Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Si activé, cela forcera un onglet à suspendre au lieu d'être rejeté par Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Généralement, Chrome ne supprimera les onglets que lorsque la mémoire du système est très faible." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Remarque : Cela peut entraîner la suspension des onglets plus tôt que le temps que vous avez" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "spécifié dans les options de suspension automatique des onglets." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Pour plus d'informations sur les rejets de Chrome, reportez-vous à:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Annuler la suspension de l'onglet" + }, + "html_popup_suspend_tab": { + "message": "Suspendre cet onglet maintenant" + }, + "html_popup_dont_suspend_now": { + "message": "Ne pas suspendre pour le moment" + }, + "html_popup_never_suspend_domain": { + "message": "Ne jamais suspendre ce domaine" + }, + "html_popup_never_suspend_page": { + "message": "Ne jamais suspendre cette URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspendre tous les autres onglets" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Annuler la suspension de tous les onglets" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspendre les onglets sélectionnés" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Annuler la suspension des onglets sélectionnés" + }, + "html_popup_settings": { + "message": "Paramètres" + }, + "html_restoring_title": { + "message": "Restauration de la fenêtre" + }, + "html_restoring_heading": { + "message": "Restauration des onglets" + }, + "html_restoring_detail": { + "message": "Veuillez patienter pendant que je restaure cette fenêtre..." + }, + "html_recovery_title": { + "message": "Récupération" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "On dirait que vous récupérez à partir d'un plantage d'extension." + }, + "html_recovery_description_line2": { + "message": "Vos onglets suspendus peuvent avoir planté ou disparu." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restaurer automatiquement les onglets" + }, + "html_recovery_go_to_session_manager": { + "message": "Aller au gestionnaire de sessions" + }, + "html_recovery_important_message": { + "message": "La capture d'écran est actuellement activée. Si cette extension plante à plusieurs reprises, il est recommandé de désactiver cette option." + }, + "html_recovery_disable_screen_capturing": { + "message": "Désactiver la capture d'écran" + }, + "html_recovery_tabs_to_restore": { + "message": "Onglets à restaurer" + }, + "html_shortcuts_title": { + "message": "Raccourcis clavier" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Raccourcis clavier" + }, + "html_shortcuts_context_menu_note": { + "message": "Remarque : Ces actions sont également disponibles via le menu contextuel du clic droit." + }, + "html_shortcuts_remap_keys": { + "message": "Modifier les raccourcis" + }, + "html_sidebar_general_settings": { + "message": "Paramètres" + }, + "html_sidebar_session_management": { + "message": "Gestionnaire de session" + }, + "html_sidebar_shortcuts": { + "message": "Raccourcis clavier" + }, + "html_sidebar_support": { + "message": "À propos" + }, + "html_success_great_success": { + "message": "Merveilleux succès!" + }, + "html_success_all_tabs_restored": { + "message": "Tous vos onglets ont été restaurés." + }, + "html_success_goto_advanced_prefix": { + "message": "Pour une gestion avancée de la session, visitez la" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "gestionnaire de session" + }, + "html_suspended_title": { + "message": "Onglet suspendu" + }, + "html_suspended_tab_suspended": { + "message": "Onglet suspendu" + }, + "html_suspended_tab_reload": { + "message": "Recharger l'onglet" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Ne jamais suspendre" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Rafraîchir ou cliquez pour recharger" + }, + "html_suspended_toast_not_connected": { + "message": "Vous n'êtes pas connecté(e) à Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Le rechargement automatique des onglets est temporairement désactivé." + }, + "html_permissions_title": { + "message": "Permissions" + }, + "html_permissions_heading": { + "message": "Veuillez me donner accès aux URL de fichiers locaux" + }, + "html_permissions_info": { + "message": "Cette extension n'est pas actuellement autorisée à suspendre les URL commençant par le mot \"file\".\nPour modifier cela, veuillez activer \"Autoriser l'accès aux URL de fichier\" à partir de la page des paramètres de l'extension." + }, + "html_permissions_backup": { + "message": "Remarque : changer cette option fera disparaître brièvement tous vos onglets suspendus.\nAu cas où, le moment est peut-être bien choisi pour enregistrer une sauvegarde de votre session d'onglets en cours." + }, + "html_update_title": { + "message": "Mis à jour" + }, + "html_update_heading2": { + "message": "est sur le point de devenir marvellous-er" + }, + "html_update_info": { + "message": "Une nouvelle version de The Marvellous Suspender est prête à être installée.\nVeuillez noter : pendant la mise à jour, vos onglets suspendus disparaîtront brièvement." + }, + "html_update_info_withbackup": { + "message": "Au cas où, le moment est peut-être bien choisi pour enregistrer une sauvegarde de votre session d'onglets en cours." + }, + "html_update_info_nobackup_prefix": { + "message": "Il est fortement recommandé d'exporter une copie de votre session actuelle à partir de " + }, + "html_update_info_nobackup_suffix": { + "message": " avant de continuer avec la mise à jour." + }, + "html_updated_title": { + "message": "Mis à jour" + }, + "html_updating_heading": { + "message": "est en cours de mise à jour" + }, + "html_updating_message": { + "message": "Veuillez patienter pendant que je restaure vos onglets suspendus..." + }, + "html_updated_great_suspender_updated": { + "message": "a été mis à jour" + }, + "html_updated_info_line1": { + "message": "Une sauvegarde automatique de vos onglets a été effectuée avant la mise à jour." + }, + "html_updated_info_line2_prefix": { + "message": "Si vous avez rencontré des problèmes pendant la mise à jour, vous pouvez récupérer les onglets perdus depuis la " + }, + "html_updated_info_line2_suffix": { + "message": " page." + }, + "html_updated_detail_header_prefix": { + "message": "Nouveautés dans {0} " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Nouvelles fonctionnalités :" + }, + "html_updated_bug_fixes_header": { + "message": "Corrections de bugs :" + }, + "html_updated_release_notes": { + "message": "Visitez GitHub pour les notes de version complètes : " + }, + "html_updated_patch_message": { + "message": "Désolé pour la perturbation. Je devais juste effectuer un peu de maintenance." + }, + "html_welcome_title": { + "message": "Bienvenue" + }, + "html_welcome_text_line1": { + "message": "Merci pour votre essai" + }, + "html_welcome_text_line2": { + "message": "J'améliore les performances de votre ordinateur en suspendant les onglets que vous n'utilisez pas." + }, + "html_welcome_text_line3": { + "message": "Vous pouvez ajuster n'importe lequel des paramètres ci-dessous." + }, + "js_popup_normal": { + "message": "L'onglet sera automatiquement suspendu." + }, + "js_popup_normal_pause": { + "message": "Plus tard" + }, + "js_popup_special": { + "message": "L'onglet ne peut pas être suspendu" + }, + "js_popup_suspended": { + "message": "Onglet suspendu" + }, + "js_popup_suspended_pause": { + "message": "Ne pas suspendre" + }, + "js_popup_whitelisted": { + "message": "Site sur liste blanche." + }, + "js_popup_whitelisted_remove": { + "message": "Retirer de la liste blanche" + }, + "js_popup_audible": { + "message": "L'onglet est en cours de lecture audio." + }, + "js_popup_form_input": { + "message": "L'onglet est en train de recevoir des entrées de formulaire." + }, + "js_popup_form_input_unpause": { + "message": "Relancer" + }, + "js_popup_pinned": { + "message": "L'onglet est épinglé" + }, + "js_popup_temp_whitelist": { + "message": "La suspension de l'onglet a été interrompue." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Relancer" + }, + "js_popup_never": { + "message": "Suspension automatique de l'onglet désactivée." + }, + "js_popup_no_connectivity": { + "message": "Aucune connexion réseau" + }, + "js_popup_charging": { + "message": "Connecté à une source d'alimentation" + }, + "js_popup_blockedFile": { + "message": "Les fichiers locaux ne peuvent pas être suspendus." + }, + "js_popup_blockedFile_enable": { + "message": "Activer" + }, + "js_popup_unknown": { + "message": "En attente du chargement de l'onglet ..." + }, + "js_popup_initialising": { + "message": "En attente de l'initialisation de l'extension..." + }, + "js_popup_error": { + "message": "Suspension automatique indisponible pour cet onglet" + }, + "js_history_delete": { + "message": "supprimer" + }, + "js_history_export": { + "message": "exporter" + }, + "js_history_reload": { + "message": "ouvrir et charger" + }, + "js_history_resuspend": { + "message": "ouvrir et suspendre" + }, + "js_history_save": { + "message": "sauvegarder" + }, + "js_history_window": { + "message": "Fenêtre" + }, + "js_history_windows": { + "message": "Fenêtres" + }, + "js_history_tab": { + "message": "Onglet" + }, + "js_history_tabs": { + "message": "Onglets" + }, + "js_history_enter_name_for_session": { + "message": "Saisissez un nom pour cette session" + }, + "js_history_confirm_delete": { + "message": "Êtes-vous sûr de vouloir supprimer cette session ?" + }, + "js_history_confirm_session_overwrite": { + "message": "Il y a déjà une session enregistrée avec ce nom. Remplacer la session existante ?" + }, + "js_history_import_fail": { + "message": "Impossible de charger le fichier. Assurez-vous que le fichier est en texte brut et contient une seule url par ligne." + }, + "js_history_migrate_fail": { + "message": "Nécessite un id d'extension de 32 caractères pour migrer depuis" + }, + "js_history_migrate_success": { + "message": "$TABCOUNT$ onglets migrés avec succès", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Retirer le site de la liste blanche" + }, + "js_suspended_hotkey_to_reload": { + "message": "Définir le raccourci clavier" + }, + "js_suspended_low_memory": { + "message": "Onglet suspendu en raison d'une mémoire système faible" + }, + "js_options_incognito_warning": { + "message": "Vous êtes en mode incognito. Certaines fonctionnalités ne seront pas disponibles." + }, + "js_options_whitelist_no_matches": { + "message": "Il n'y a aucun onglet ouvert correspondant à la liste blanche actuelle." + }, + "js_options_whitelist_matches_heading": { + "message": "Onglets ouverts sur la liste blanche:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "et" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "plus." + }, + "js_permissions_button_export": { + "message": "Enregistrer la sauvegarde" + }, + "js_permissions_button_set": { + "message": "Ouvrir les paramètres de l'extension" + }, + "js_update_confirm": { + "message": "Vous n'avez pas encore enregistré de sauvegarde. Mettre à jour l'extension quand même ?" + }, + "js_update_button_export": { + "message": "Enregistrer la sauvegarde" + }, + "js_update_button_reload": { + "message": "Mettre à jour l'extension" + }, + "js_shortcuts_not_set": { + "message": "non défini" + }, + "js_session_save_point": { + "message": "Point de sauvegarde automatique pour v" + } +} diff --git a/src/_locales/id/messages.json b/src/_locales/id/messages.json new file mode 100644 index 00000000..55094beb --- /dev/null +++ b/src/_locales/id/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Jadikan komputer Anda berjalan dengan lancar dengan menangguhkan tab yang tidak Anda gunakan" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Tangguhkan/BatalTangguhkan tab aktif" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Jeda/BatalJeda penangguhan dari tab aktif" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Tangguhkan tab yang dipilih" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "BatalTangguhkan tab yang dipilih" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Tangguhkan semua tab lainnya di jendela aktif" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Tangguhkan secara paksa semua tab lainnya di jendela aktif" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "BatalTangguhkan semua tab di jendela aktif" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Tangguhkan semua tab di semua jendela" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Paksa tangguhkan semua tab di semua jendela" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "BatalTangguhkan semua tab di semua jendela" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Buka tautan di Tab Baru yang Ditangguhkan" + }, + "js_context_toggle_suspend_state": { + "message": "Tangguhkan/BatalTangguhkan tab ini" + }, + "js_context_toggle_pause_suspension": { + "message": "Jeda/BatalJeda penangguhan tab ini" + }, + "js_context_never_suspend_domain": { + "message": "Jangan pernah menangguhkan domain ini" + }, + "js_context_never_suspend_page": { + "message": "Jangan pernah menangguhkan URL ini" + }, + "js_context_suspend_selected_tabs": { + "message": "Tangguhkan tab yang dipilih" + }, + "js_context_unsuspend_selected_tabs": { + "message": "BatalTangguhkan tab yang dipilih" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Tangguhkan semua tab lain di jendela ini" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Pakasa tangguhkan semua tab lainnya di jendela ini" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "BatalTangguhkan semua tab di jendela ini" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Tangguhkan semua tab di semua jendela" + }, + "js_context_force_suspend_all_tabs": { + "message": "Paksa tangguhkan semua tab di semua jendela" + }, + "js_context_unsuspend_all_tabs": { + "message": "BatalTangguhkan semua tab di semua Windows" + }, + "html_about_title": { + "message": "Tentang" + }, + "html_about_fork_beginning": { + "message": "Berdasarkan versi yang asli" + }, + "html_about_fork_mid": { + "message": "tersedia di GitHub, tanpa pelacakan IKLAN" + }, + "html_about_fork_end": { + "message": ", informasi lebih lanjut tersedia di" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Jika Anda memiliki umpan balik atau ingin melaporkan sebuah isu/masalah, Anda dapat melakukannya pada" + }, + "html_about_report_issues_suffix": { + "message": ". Silakan periksa untuk melihat apakah ide/usulan atau isu/masalah Anda sudah ada sebelum membuat yang baru. Terima kasih!" + }, + "html_about_debugging_prefix": { + "message": "Untuk mengaktifkan pencatatan log, atau untuk mengatur flag debugging, pergi ke" + }, + "html_about_debugging_suffix": { + "message": "halaman debug." + }, + "html_about_the_github_issues_page": { + "message": "Halaman isu/masalah GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Ekstensi ini menggunakan" + }, + "html_about_html2canvas_suffix": { + "message": "pustaka data yang ditulis oleh Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Dan juga menggunakan pembungkus indexedDb" + }, + "html_about_indexedDb_suffix": { + "message": "yang ditulis oleh Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Terima kasih juga kepada" + }, + "html_about_browserstack_suffix": { + "message": "untuk menyediakan alat pengujian chrome gratis." + }, + "html_about_tgs_prefix": { + "message": "Ekstensi ini tidak akan pernah ada tanpa" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "rusak" + }, + "html_broken_ruh_roh": { + "message": "Ya Pakde!" + }, + "html_broken_line1": { + "message": "gagal untuk memulai. Mungkin Anda menggunakan versi Chrome yang tidak kompatibel?" + }, + "html_broken_line2": { + "message": "Cobalah untuk memulai kembali ekstensi. Jika masalah tersebut berlanjut, silahkan minta bantuan di" + }, + "html_broken_line2_github_page": { + "message": "Halaman proyek GitHub" + }, + "html_broken_line3": { + "message": "Anda dapat memulihkan tab yang hilang dari" + }, + "html_broken_line3_session_management": { + "message": "halaman manajemen sesi peramban web" + }, + "html_broken_button_restart_extension": { + "message": "Mulai ulang ekstensi" + }, + "html_history_title": { + "message": "Manajemen sesi peramban web" + }, + "html_history_current_session": { + "message": "Sesi saat ini" + }, + "html_history_recent_sessions": { + "message": "Sesi terbaru" + }, + "html_history_saved_sessions": { + "message": "Sesi yang disimpan" + }, + "html_history_import_session": { + "message": "Impor sesi" + }, + "html_history_migrate_tabs": { + "message": "Migrasikan tab" + }, + "html_history_migrate_old_id": { + "message": "ID Ekstensi TGS Lama" + }, + "html_notice_title": { + "message": "Pemberitahuan" + }, + "html_notice_important_notice": { + "message": "Pemberitahuan penting dari The Marvellous Suspender" + }, + "html_options_title": { + "message": "Pengaturan" + }, + "html_options_suspend_title": { + "message": "Penagguhan tab secara otomatis" + }, + "html_options_suspended_title": { + "message": "Tab yang ditangguhkan" + }, + "html_options_other_title": { + "message": "Lainnya" + }, + "html_options_suspend_automatically_after": { + "message": "Secara otomatis menangguhkan tab setelah" + }, + "html_options_suspend_never": { + "message": "Tidak pernah" + }, + "html_options_suspend_seconds": { + "message": "detik" + }, + "html_options_suspend_minute": { + "message": "mnt" + }, + "html_options_suspend_minutes": { + "message": "menit" + }, + "html_options_suspend_hour": { + "message": "jam" + }, + "html_options_suspend_hours": { + "message": "jam" + }, + "html_options_suspend_day": { + "message": "hari" + }, + "html_options_suspend_days": { + "message": "Hari" + }, + "html_options_suspend_week": { + "message": "minggu" + }, + "html_options_suspend_weeks": { + "message": "minggu" + }, + "html_options_suspend_no_pinned": { + "message": "Jangan pernah menangguhkan tab yang disematkan" + }, + "html_options_suspend_no_forms": { + "message": "Jangan pernah menangguhkan tab yang berisi input formulir yang belum disimpan" + }, + "html_options_suspend_no_audio": { + "message": "Jangan pernah menangguhkan tab yang memutar audio" + }, + "html_options_suspend_only_connected": { + "message": "Jangan pernah menangguhkan tab saat offline" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Jangan pernah menangguhkan tab saat terhubung ke sumber daya (listrik)" + }, + "html_options_suspend_no_active_tabs": { + "message": "Jangan pernah menangguhkan tab aktif di setiap jendela" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Secara otomatis batal tangguhkan tab saat dilihat" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Terapkan penghematan memori bawaan Chrome saat menangguhkan" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Mengurangi sebuah penggunaan memori tab yang ditangguhkan lebih lagi, dengan memanfaatkan" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "fungsionalitas 'pengabaian tab' bawaan Chrome. Ini dapat berdampak sampai" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "penghematan memori 500% saat bekerja dengan jumlah tab yang banyak." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Namun, itu juga akan menyebabkan sedikit sebuah penundaan rendering saat memilih" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "sebuah tab yang ditangguhkan." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Untuk informasi lebih lanjut tentang fitur pengabaian Chrome, lihat:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Terang" + }, + "html_options_suspend_theme_dark": { + "message": "Gelap" + }, + "html_options_suspend_screen_capturing": { + "message": "Penangkapan layar" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Dinonaktifkan" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Tangkap bagian atas layar saja" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Tangkap seluruh halaman" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Pada sebuah tab yang ditangguhkan, ekstensi dapat menampilkan pratinjau gambar dari " + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "seperti apa tab sebelum ditangguhkan." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Fitur penangkapan layar bersifat eksperimental dan dapat menyebabkan penggunaan CPU yang signifikan dan juga" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "penggunaan memori sedikit meningkat." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Jika Anda merasakan dan melihat perilaku aneh seperti tab membutuhkan waktu lama untuk menangguhkan, atau Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crash secara tidak terduga, cobalah mematikan fitur ini." + }, + "html_options_suspend_force_screen_capture": { + "message": "Aktifkan mode penangkapan layar berkualitas tinggi" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Ketika dinonaktifkan, tangkapan layar memiliki keterbatasan berikut untuk membantu dalam kinerja:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Pengambilan layar berkualitas rendah" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Tidak akan menangkap layar jika dibutuhkan lebih dari 1 menit untuk menghasilkan gambar" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Tinggi maksimum tangkapan layar terbatas pada 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Mengaktifkan mode pengambilan layar berkualitas tinggi dapat secara signifikan meningkatkan beban CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "dan penggunaan memori." + }, + "html_options_whitelist_title": { + "message": "Jangan pernah menangguhkan tab dengan URL dari daftar berikut:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Tambahkan URL dari setiap halaman yang ingin Anda masukkan ke daftar putih pada baris baru. Misalnya:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Untuk memberikan daftar putih pada banyak situs dalam satu baris Anda dapat menentukan bagian dari URL sebagai gantinya:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Anda juga dapat menentukan ekspresi reguler dengan melampirkan teks dalam garis miring:" + }, + "html_options_whitelist_test": { + "message": "Uji daftar putih" + }, + "html_options_other_enable_context_menu": { + "message": "Tambahkan The Marvellous Suspender ke menu konteks klik-kanan" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Tambahkan kontrol untuk ekstensi ini ke klik-kanan menu dari sebuah halaman web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Ini akan memberi Anda akses ke tindakan menangguhkan lanjutan yang tidak tersedia" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "ditempat lain dalam ekstensi." + }, + "html_options_other_enable_sync": { + "message": "Pengaturan sinkronisasi dengan profil Chrome Anda" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Pengaturan ekstensi akan disinkronkan di semua browser Chrome yang" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "masuk dengan profil yang sama." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Ini juga akan menyinkronkan pengaturan dalam mode penyamaran." + }, + "html_options_other_enable_sync_warning": { + "message": "Menghidupkan ini akan menimpa pengaturan pada semua browser lain yang masuk ke profil Chrome yang sama" + }, + "html_options_suspend_on_low_memory": { + "message": "Secara instan menangguhkan ketika memori sistem menjadi sangat rendah" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Opsi ini akan menimpa fungsionalitas pembuangan tab Chrome secara otomatis." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Jika diaktifkan, itu akan memaksa tab untuk ditangguhkan dibandingkan dibuang oleh Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Biasanya, Chrome hanya akan membuang tab begitu memori sistem menjadi sangat rendah." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Harap diperhatikan: Ini dapat menyebabkan tab untuk ditangguhkan lebih awal dari waktu yang Anda telah" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "tentukan dalam opsi penagguhan tab secara otomatis." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Untuk informasi lebih lanjut tentang pengabaian tab oleh Chrome, lihat:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "BatalTangguhkan Tab ini" + }, + "html_popup_suspend_tab": { + "message": "Tangguhkan tab ini sekarang" + }, + "html_popup_dont_suspend_now": { + "message": "Jangan tangguhkan untuk saat ini" + }, + "html_popup_never_suspend_domain": { + "message": "Jangan pernah menangguhkan domain ini" + }, + "html_popup_never_suspend_page": { + "message": "Jangan pernah menangguhkan URL ini" + }, + "html_popup_suspend_other_tabs": { + "message": "Tangguhkan semua tab lain" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Menangguhkan semua tab" + }, + "html_popup_suspend_selected_tabs": { + "message": "Tangguhkan tab yang dipilih" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Menangguhkan tab yang dipilih" + }, + "html_popup_settings": { + "message": "Pengaturan" + }, + "html_restoring_title": { + "message": "Memulihkan jendela" + }, + "html_restoring_heading": { + "message": "Memulihkan Tab" + }, + "html_restoring_detail": { + "message": "Tolong tunggu sementara aku mengembalikan jendela ini ..." + }, + "html_recovery_title": { + "message": "Pemulihan" + }, + "html_recovery_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_recovery_description_line1": { + "message": "Sepertinya kamu sudah pulih dari kecelakaan ekstensi." + }, + "html_recovery_description_line2": { + "message": "Tab tersuspensi Anda mungkin telah jatuh atau menghilang." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Kembalikan tab secara otomatis" + }, + "html_recovery_go_to_session_manager": { + "message": "Pergi ke Sesi Manager" + }, + "html_recovery_important_message": { + "message": "Saat ini Anda memiliki pengambilan layar dihidupkan. Jika ekstensi ini berulang kali mogok, disarankan Anda menonaktifkan opsi ini." + }, + "html_recovery_disable_screen_capturing": { + "message": "Matikan penangkapan layar" + }, + "html_recovery_tabs_to_restore": { + "message": "Tab untuk memulihkan" + }, + "html_shortcuts_title": { + "message": "Pintasan Keyboard" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Pintasan Keyboard" + }, + "html_shortcuts_context_menu_note": { + "message": "Catatan: Tindakan ini juga tersedia melalui menu konteks klik kanan." + }, + "html_shortcuts_remap_keys": { + "message": "Ubah pintasan" + }, + "html_sidebar_general_settings": { + "message": "Pengaturan" + }, + "html_sidebar_session_management": { + "message": "Manajemen sesi" + }, + "html_sidebar_shortcuts": { + "message": "Pintasan Keyboard" + }, + "html_sidebar_support": { + "message": "Tentang" + }, + "html_success_great_success": { + "message": "Keberhasilan luar biasa!" + }, + "html_success_all_tabs_restored": { + "message": "Semua tabmu telah dipulihkan." + }, + "html_success_goto_advanced_prefix": { + "message": "Untuk manajemen sesi lanjutan, kunjungi" + }, + "html_success_goto_advanced_suffix": { + "message": "halaman" + }, + "html_session_manager": { + "message": "Manajemen sesi" + }, + "html_suspended_title": { + "message": "Tab yang ditangguhkan" + }, + "html_suspended_tab_suspended": { + "message": "Tab ditangguhkan" + }, + "html_suspended_tab_reload": { + "message": "Muat ulang tab" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Jangan pernah menangguhkan" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Refresh atau klik untuk memuat ulang" + }, + "html_suspended_toast_not_connected": { + "message": "Kamu tidak terhubung ke Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Reload tab otomatis untuk sementara dinonaktifkan." + }, + "html_permissions_title": { + "message": "Izin" + }, + "html_permissions_heading": { + "message": "Tolong beri saya akses ke URL file lokal" + }, + "html_permissions_info": { + "message": "Ekstensi ini saat ini tidak diizinkan untuk menangguhkan URL yang dimulai dengan kata \"file\".\n Untuk mengubah ini, silakan aktifkan \"Izinkan akses ke berkas URL\" dari halaman pengaturan ekstensi." + }, + "html_permissions_backup": { + "message": "Harap diperhatikan: Mengubah opsi ini akan menyebabkan semua tab yang ditangguhkan milik Anda akan menghilang secara singkat.\nJika, sekarang mungkin adalah satu waktu yang tepat untuk menyimpan cadangan sesi tab Anda saat ini." + }, + "html_update_title": { + "message": "Perbarui" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "Sebuah bersi baru dari The Marvellous Suspender siap dipasang.\nHarap diperhatikan: Selama pembaruan, tab yang ditangguhkan Anda akan menghilang sekilas." + }, + "html_update_info_withbackup": { + "message": "Jika, sekarang mungkin adalah waktu yang tepat untuk menyimpan cadangan sesi tab Anda saat ini." + }, + "html_update_info_nobackup_prefix": { + "message": "Sangat disarankan agar Anda mengekspor sebuah salinan sesi Anda saat ini dari" + }, + "html_update_info_nobackup_suffix": { + "message": " sebelum melanjutkan dengan pembaruan." + }, + "html_updated_title": { + "message": "Diperbarui" + }, + "html_updating_heading": { + "message": "sedang memperbarui" + }, + "html_updating_message": { + "message": "Harap tunggu sementara saya memulihkan tab yang ditangguhkan milik Anda ..." + }, + "html_updated_great_suspender_updated": { + "message": "telah diperbarui" + }, + "html_updated_info_line1": { + "message": "Cadangan otomatis terbuat dari tab Anda sebelum pembaruan." + }, + "html_updated_info_line2_prefix": { + "message": "Jika Anda mengalami isu/masalah apa pun selama pembaruan, Anda dapat memulihkan tab yang hilang dari" + }, + "html_updated_info_line2_suffix": { + "message": " halaman." + }, + "html_updated_detail_header_prefix": { + "message": "Apa yang baru di" + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Fitur baru:" + }, + "html_updated_bug_fixes_header": { + "message": "Perbaikan bug:" + }, + "html_updated_release_notes": { + "message": "Kunjungi GitHub untuk catatan rilis penuh:" + }, + "html_updated_patch_message": { + "message": "Maaf atas gangguan tersebut. Saya hanya perlu melakukan sedikit pemeliharaan." + }, + "html_welcome_title": { + "message": "Wilujeng Sumping" + }, + "html_welcome_text_line1": { + "message": "Terima kasih telah mencoba" + }, + "html_welcome_text_line2": { + "message": "Saya membuat komputer Anda berjalan dengan lancar dengan menangguhkan tab yang tidak Anda gunakan." + }, + "html_welcome_text_line3": { + "message": "Anda bisa menyempurnakan pengaturan di bawah ini." + }, + "js_popup_normal": { + "message": "Tab akan ditangguhkan secara otomatis." + }, + "js_popup_normal_pause": { + "message": "Tidak sekarang" + }, + "js_popup_special": { + "message": "Tab tidak bisa ditangguhkan" + }, + "js_popup_suspended": { + "message": "Tab ditangguhkan" + }, + "js_popup_suspended_pause": { + "message": "Jangan ditangguhkan" + }, + "js_popup_whitelisted": { + "message": "Situs telah diberikan daftar putih." + }, + "js_popup_whitelisted_remove": { + "message": "Hapus dari daftar putih" + }, + "js_popup_audible": { + "message": "Tab sedang memainkan audio." + }, + "js_popup_form_input": { + "message": "Tab sedang menerima input formulir." + }, + "js_popup_form_input_unpause": { + "message": "BatalJeda" + }, + "js_popup_pinned": { + "message": "Tab telah disematkan" + }, + "js_popup_temp_whitelist": { + "message": "Penangguhan tab dijeda." + }, + "js_popup_temp_whitelist_unpause": { + "message": "BatalJeda" + }, + "js_popup_never": { + "message": "Penangguhan tab secara otomatis dinonaktifkan." + }, + "js_popup_no_connectivity": { + "message": "Tidak ada koneksi jaringan" + }, + "js_popup_charging": { + "message": "Terhubung ke sumber daya (listrik)" + }, + "js_popup_blockedFile": { + "message": "Berkas lokal tidak dapat ditangguhkan." + }, + "js_popup_blockedFile_enable": { + "message": "Aktifkan" + }, + "js_popup_unknown": { + "message": "Menunggu tab untuk dimuat..." + }, + "js_popup_initialising": { + "message": "Menunggu ekstensi untuk menginisialisasi..." + }, + "js_popup_error": { + "message": "Penangguhan-otomatis tidak tersedia untuk tab ini" + }, + "js_history_delete": { + "message": "hapus" + }, + "js_history_export": { + "message": "ekspor" + }, + "js_history_reload": { + "message": "buka dan muat" + }, + "js_history_resuspend": { + "message": "buka dan tangguhkan" + }, + "js_history_save": { + "message": "simpan" + }, + "js_history_window": { + "message": "Jendela" + }, + "js_history_windows": { + "message": "Jendela" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_tabs": { + "message": "Tab" + }, + "js_history_enter_name_for_session": { + "message": "Masukkan sebuah nama untuk sesi ini" + }, + "js_history_confirm_delete": { + "message": "Apakah kamu yakin ingin menghapus sesi ini?" + }, + "js_history_confirm_session_overwrite": { + "message": "Sudah ada sesi yang disimpan dengan nama ini. Timpa sesi yang ada?" + }, + "js_history_import_fail": { + "message": "Gagal memuat berkas. Pastikan berkas berupa teks biasa dan berisi sebuah URL tunggal per baris." + }, + "js_history_migrate_fail": { + "message": "Perlu ID ekstensi 32-karakter untuk migrasi dari" + }, + "js_history_migrate_success": { + "message": "Tab $TABCOUNT$ berhasil dimigrasikan", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Hapus situs dari daftar putih" + }, + "js_suspended_hotkey_to_reload": { + "message": "Atur pintasan papan ketik" + }, + "js_suspended_low_memory": { + "message": "Tab ditangguhkan karena memori sistem rendah" + }, + "js_options_incognito_warning": { + "message": "Anda dalam mode penyamaran. Beberapa fitur tidak akan tersedia." + }, + "js_options_whitelist_no_matches": { + "message": "Tidak ada tab terbuka yang cocok dengan daftar putih saat ini." + }, + "js_options_whitelist_matches_heading": { + "message": "Tab terbuka yang diberikan daftar putih:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "dan" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "lebih." + }, + "js_permissions_button_export": { + "message": "Simpan cadangan" + }, + "js_permissions_button_set": { + "message": "Buka pengaturan ekstensi" + }, + "js_update_confirm": { + "message": "Kamu belum menyimpan sebuah cadangan. Lanjutkan perbarui ekstensi?" + }, + "js_update_button_export": { + "message": "Simpan cadangan" + }, + "js_update_button_reload": { + "message": "Perbarui ekstensi sekarang" + }, + "js_shortcuts_not_set": { + "message": "tidak diatur" + }, + "js_session_save_point": { + "message": "Poin penyimpanan otomatis untuk v" + } +} diff --git a/src/_locales/it/messages.json b/src/_locales/it/messages.json new file mode 100644 index 00000000..e89ae1d9 --- /dev/null +++ b/src/_locales/it/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Fai funzionare il computer senza intoppi sospendendo le schede che non stai usando" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Sospendi/Riattiva la scheda attiva" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Ferma/Riprendi la sospensione della scheda attiva" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Sospendi le schede selezionate" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Riattiva le schede selezionate" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Sospendi tutte le altre schede nella finestra attiva" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forza la sospensione delle altre schede nella finestra attiva" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Riattiva tutte le schede nella finestra attiva" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Sospendi tutte le schede in ogni finestra" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forza la sospensione di tutte le schede in ogni finestra" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Riattiva tutte le schede in ogni finestra" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Apri collegamento in una nuova scheda sospesa" + }, + "js_context_toggle_suspend_state": { + "message": "Sospendi/Riattiva questa scheda" + }, + "js_context_toggle_pause_suspension": { + "message": "Ferma/Riprendi la sospensione di questa scheda" + }, + "js_context_never_suspend_domain": { + "message": "Non sospendere mai questo dominio" + }, + "js_context_never_suspend_page": { + "message": "Non sospendere mai questo indirizzo" + }, + "js_context_suspend_selected_tabs": { + "message": "Sospendi le schede selezionate" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Riattiva le schede selezionate" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Sospendi tutte le altre schede in questa finestra" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forza la sospensione delle altre schede in questa finestra" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Riattiva tutte le schede in questa finestra" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Sospendi tutte le schede in ogni finestra" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forza la sospensione di tutte le schede in ogni finestra" + }, + "js_context_unsuspend_all_tabs": { + "message": "Riattiva tutte le schede in ogni finestra" + }, + "html_about_title": { + "message": "Informazioni" + }, + "html_about_fork_beginning": { + "message": "Basata sull'originale" + }, + "html_about_fork_mid": { + "message": "disponibile su GitHub, senza tracciamento ADS" + }, + "html_about_fork_end": { + "message": ", maggiori informazioni disponibili su" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Se vuoi lasciare un tuo un feedback o segnalare un problema, puoi farlo tramite" + }, + "html_about_report_issues_suffix": { + "message": ". Ti prego di verificare se la tua idea o problema esiste già prima di aprire una nuova richiesta. Grazie!" + }, + "html_about_debugging_prefix": { + "message": "Per abilitare la registrazione degli eventi (logging) o per impostare i flag di debug, vai alla " + }, + "html_about_debugging_suffix": { + "message": "pagina di debug." + }, + "html_about_the_github_issues_page": { + "message": "la pagina problemi su GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Questa estensione utilizza la libreria" + }, + "html_about_html2canvas_suffix": { + "message": "scritta da Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Utilizza anche il wrapper indexedDb" + }, + "html_about_indexedDb_suffix": { + "message": "scritto da Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Grazie inoltre a" + }, + "html_about_browserstack_suffix": { + "message": "per fornire strumenti liberi di collaudo Chrome." + }, + "html_about_tgs_prefix": { + "message": "Questa estensione non sarebbe mai esistita senza" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "si è rotto" + }, + "html_broken_ruh_roh": { + "message": "D'oh!" + }, + "html_broken_line1": { + "message": "non è riuscito ad avviarsi. Forse stai usando una versione incompatibile di Chrome?" + }, + "html_broken_line2": { + "message": "Prova a riavviare l'estensione. Se il problema persiste, chiedi aiuto sulla" + }, + "html_broken_line2_github_page": { + "message": "pagina del progetto su Github" + }, + "html_broken_line3": { + "message": "È possibile recuperare le schede perse dalla" + }, + "html_broken_line3_session_management": { + "message": "pagina di gestione delle sessioni" + }, + "html_broken_button_restart_extension": { + "message": "Riavvia l'estensione" + }, + "html_history_title": { + "message": "Gestione delle sessioni" + }, + "html_history_current_session": { + "message": "Sessione corrente" + }, + "html_history_recent_sessions": { + "message": "Sessioni recenti" + }, + "html_history_saved_sessions": { + "message": "Sessioni salvate" + }, + "html_history_import_session": { + "message": "Importa sessione" + }, + "html_history_migrate_tabs": { + "message": "Migra le schede" + }, + "html_history_migrate_old_id": { + "message": "Vecchio ID estensione TGS" + }, + "html_notice_title": { + "message": "Avviso" + }, + "html_notice_important_notice": { + "message": "Informazioni importanti da The Marvellous Suspender" + }, + "html_options_title": { + "message": "Impostazioni" + }, + "html_options_suspend_title": { + "message": "Sospensione automatica delle schede" + }, + "html_options_suspended_title": { + "message": "Schede sospese" + }, + "html_options_other_title": { + "message": "Altro" + }, + "html_options_suspend_automatically_after": { + "message": "Sospendi automaticamente le schede dopo" + }, + "html_options_suspend_never": { + "message": "Mai" + }, + "html_options_suspend_seconds": { + "message": "secondi" + }, + "html_options_suspend_minute": { + "message": "minuto" + }, + "html_options_suspend_minutes": { + "message": "minuti" + }, + "html_options_suspend_hour": { + "message": "ora" + }, + "html_options_suspend_hours": { + "message": "ore" + }, + "html_options_suspend_day": { + "message": "giorno" + }, + "html_options_suspend_days": { + "message": "giorni" + }, + "html_options_suspend_week": { + "message": "settimana" + }, + "html_options_suspend_weeks": { + "message": "settimane" + }, + "html_options_suspend_no_pinned": { + "message": "Non sospendere mai le schede fissate" + }, + "html_options_suspend_no_forms": { + "message": "Non sospendere le schede che contengono moduli compilati non salvati" + }, + "html_options_suspend_no_audio": { + "message": "Non sospendere mai le schede che stanno riproducendo audio" + }, + "html_options_suspend_only_connected": { + "message": "Non sospendere mai le schede quando non sei connesso a Internet" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Non sospendere mai le schede quando il PC è collegato all'alimentazione" + }, + "html_options_suspend_no_active_tabs": { + "message": "Non sospendere mai la scheda attiva in ogni finestra" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Riattiva automaticamente la scheda quando viene visualizzata" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Applica il risparmio di memoria integrato di Chrome durante la sospensione" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Riduce ancora di più l'utilizzo della memoria di una scheda sospesa, utilizzando" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "la funzionalità integrata 'tab discarding' di Chrome. Questo può portare a un" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "risparmio di memoria fino al 500% quando si lavora con un gran numero di schede." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Tuttavia, causerà anche un leggero ritardo di rendering quando si seleziona" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "una schede sospesa." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Per ulteriori informazioni su Chrome discarding fai riferimento a:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Chiaro" + }, + "html_options_suspend_theme_dark": { + "message": "Scuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Cattura dello schermo" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Disabilitata" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Cattura solo la parte visibile della pagina" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Cattura l'intera pagina" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "In una scheda sospesa, l'estensione può mostrare un'immagine di ciò che la scheda" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "conteneva appena prima che fosse sospesa." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "La funzione di cattura dello schermo è sperimentale e può causare un uso significativo della CPU" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "e un leggero aumento della memoria." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Se noti comportamenti strani come schede che impiegano molto tempo a sospendersi, o Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "che si blocca inaspettatamente, prova a disattivare questa funzione." + }, + "html_options_suspend_force_screen_capture": { + "message": "Abilita la modalità di cattura dello schermo in alta qualità" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Quando disabilitato, le schermate hanno le seguenti limitazioni per migliorare le prestazioni:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Cattura dello schermo di bassa qualità" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Lo schermo non sarà catturato se verrà impiegato più di 1 minuto per generare l'immagine" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Altezza massima dello schermo limitata a 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Abilitare la modalità di cattura dello schermo in alta qualità potrebbe aumentare significativamente il carico della CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "e utilizzo della memoria." + }, + "html_options_whitelist_title": { + "message": "Non sospendere mai le schede contenenti i seguenti indirizzi:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Aggiungi l'indirizzo di ogni pagina che desideri inserire nella lista bianca, uno per riga. Per esempio:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Per autorizzare più siti in una riga puoi invece specificare una parte dell'indirizzo:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Puoi anche usare le espressioni regolari racchiudendo il testo tra due slash:" + }, + "html_options_whitelist_test": { + "message": "Verifica il funzionamento della lista bianca" + }, + "html_options_other_enable_context_menu": { + "message": "Aggiungi The Marvellous Suspender al menu contestuale del tasto destro del mouse" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Aggiungi i controlli per questa estensione al menu del clic destro di una pagina web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Questo ti darà accesso alle azioni di sospensione avanzate non disponibili" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "altrove nell'estensione." + }, + "html_options_other_enable_sync": { + "message": "Sincronizza le impostazioni con il tuo profilo Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Le impostazioni dell'estensione saranno sincronizzate su tutti i browser Chrome che sono" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "connessi con lo stesso profilo." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Questo sincronizzerà anche le impostazioni in modalità incognito." + }, + "html_options_other_enable_sync_warning": { + "message": "Attivando questa opzione sovrascriverai le impostazioni su tutti gli altri browser registrati nello stesso profilo Chrome" + }, + "html_options_suspend_on_low_memory": { + "message": "Sospendi istantaneamente quando la memoria di sistema diventa molto bassa" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Questa opzione sovrascriverà la funzionalità di scarto schede automatica di Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Se abilitata, forzerà la sospensione di una scheda invece di essere scartata da Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Generalmente Chrome scarta le schede solo quando la memoria di sistema diventa molto bassa." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Nota: questo può causare la sospensione delle schede prima del tempo" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "che hai specificato nelle opzioni di sospensione automatica delle schede." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Per ulteriori informazioni su Chrome discarding fai riferimento a:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Riattiva questa scheda" + }, + "html_popup_suspend_tab": { + "message": "Sospendi questa scheda ora" + }, + "html_popup_dont_suspend_now": { + "message": "Non sospendere per ora" + }, + "html_popup_never_suspend_domain": { + "message": "Non sospendere mai questo dominio" + }, + "html_popup_never_suspend_page": { + "message": "Non sospendere mai questo indirizzo" + }, + "html_popup_suspend_other_tabs": { + "message": "Sospendi tutte le altre schede" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Riattiva tutte le schede" + }, + "html_popup_suspend_selected_tabs": { + "message": "Sospendi le schede selezionate" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Riattiva le schede selezionate" + }, + "html_popup_settings": { + "message": "Impostazioni" + }, + "html_restoring_title": { + "message": "Ripristino la finestra" + }, + "html_restoring_heading": { + "message": "Ripristino le schede" + }, + "html_restoring_detail": { + "message": "Attendi mentre ripristino questa finestra..." + }, + "html_recovery_title": { + "message": "Ripristino" + }, + "html_recovery_ruh_roh": { + "message": "D'oh!" + }, + "html_recovery_description_line1": { + "message": "Sembra che tu stia effettuando un ripristino da un crash dell'estensione." + }, + "html_recovery_description_line2": { + "message": "Le schede sospese potrebbero essersi bloccate o scomparse." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Ripristina automaticamente le schede" + }, + "html_recovery_go_to_session_manager": { + "message": "Vai al gestore delle sessioni" + }, + "html_recovery_important_message": { + "message": "Al momento è attivata la cattura dello schermo. Se questa estensione si blocca ripetutamente, è consigliabile disabilitare questa opzione." + }, + "html_recovery_disable_screen_capturing": { + "message": "Disattiva cattura dello schermo" + }, + "html_recovery_tabs_to_restore": { + "message": "Schede da ripristinare" + }, + "html_shortcuts_title": { + "message": "Scorciatoie da tastiera" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Scorciatoie da tastiera" + }, + "html_shortcuts_context_menu_note": { + "message": "Nota: queste azioni sono disponibili anche tramite il menu di scelta rapida del tasto destro." + }, + "html_shortcuts_remap_keys": { + "message": "Imposta scorciatoie" + }, + "html_sidebar_general_settings": { + "message": "Impostazioni" + }, + "html_sidebar_session_management": { + "message": "Gestione delle sessioni" + }, + "html_sidebar_shortcuts": { + "message": "Scorciatoie da tastiera" + }, + "html_sidebar_support": { + "message": "Informazioni" + }, + "html_success_great_success": { + "message": "Meraviglioso successo!" + }, + "html_success_all_tabs_restored": { + "message": "Tutte le schede sono state ripristinate." + }, + "html_success_goto_advanced_prefix": { + "message": "Per la gestione avanzata delle sessioni, visita la" + }, + "html_success_goto_advanced_suffix": { + "message": "pagina" + }, + "html_session_manager": { + "message": "gestione delle sessioni" + }, + "html_suspended_title": { + "message": "Schede sospese" + }, + "html_suspended_tab_suspended": { + "message": "Scheda sospesa" + }, + "html_suspended_tab_reload": { + "message": "Ricarica scheda" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Non sospendere mai" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Aggiorna o fai clic per ricaricare" + }, + "html_suspended_toast_not_connected": { + "message": "Non sei connesso a Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Il caricamento automatico delle tab è temporaneamente disabilitato." + }, + "html_permissions_title": { + "message": "Autorizzazioni" + }, + "html_permissions_heading": { + "message": "Per favore dammi accesso agli indirizzi dei file locali" + }, + "html_permissions_info": { + "message": "Questa estensione non è attualmente autorizzata a sospendere gli indirizzi che cominciano per \"file\".\nPer modificare questo comportamento attiva \"Consenti accesso agli indirizzi dei file\" dalla pagina delle impostazioni dell'estensione." + }, + "html_permissions_backup": { + "message": "Nota: la modifica di questa opzione causerà la scomparsa di tutte le tab sospese.\nPer l'evenienza, ora potrebbe essere un buon momento per salvare un backup della sessione di tab correnti." + }, + "html_update_title": { + "message": "Aggiorna" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "Una nuova versione di The Marvellous Suspender è pronta per essere installata.\nAttenzione: durante l'aggiornamento le schede sospese scompariranno temporaneamente." + }, + "html_update_info_withbackup": { + "message": "Per l'evenienza, ora potrebbe essere un buon momento per salvare un backup della sessione delle tab correnti." + }, + "html_update_info_nobackup_prefix": { + "message": "È caldamente raccomandato di esportare una copia della sessione attuale dalla pagina di " + }, + "html_update_info_nobackup_suffix": { + "message": " prima di proseguire con l'aggiornamento." + }, + "html_updated_title": { + "message": "Aggiornato" + }, + "html_updating_heading": { + "message": "si sta aggiornando" + }, + "html_updating_message": { + "message": "Attendi mentre ripristino le schede sospese ..." + }, + "html_updated_great_suspender_updated": { + "message": "è stato aggiornato" + }, + "html_updated_info_line1": { + "message": "È stato effettuato un backup automatico delle tab prima dell'aggiornamento." + }, + "html_updated_info_line2_prefix": { + "message": "Se hai incontrato problemi durante l'aggiornamento, è possibile recuperare le tab perse dal " + }, + "html_updated_info_line2_suffix": { + "message": " pagina." + }, + "html_updated_detail_header_prefix": { + "message": "Cosa c'è di nuovo in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Nuove funzionalità:" + }, + "html_updated_bug_fixes_header": { + "message": "Risoluzioni di bug:" + }, + "html_updated_release_notes": { + "message": "Visita GitHub per le note di rilascio complete: " + }, + "html_updated_patch_message": { + "message": "Mi dispiace per il disturbo. Avevo solo bisogno di eseguire un po 'di manutenzione." + }, + "html_welcome_title": { + "message": "Ciao" + }, + "html_welcome_text_line1": { + "message": "Grazie per aver provato" + }, + "html_welcome_text_line2": { + "message": "Faccio funzionare il computer senza intoppi sospendendo le schede che non stai usando." + }, + "html_welcome_text_line3": { + "message": "Puoi mettere a punto le impostazioni qui sotto." + }, + "js_popup_normal": { + "message": "La scheda verrà sospesa automaticamente." + }, + "js_popup_normal_pause": { + "message": "Non ora" + }, + "js_popup_special": { + "message": "La scheda non può essere sospesa" + }, + "js_popup_suspended": { + "message": "Tab sospesa" + }, + "js_popup_suspended_pause": { + "message": "Non sospendere" + }, + "js_popup_whitelisted": { + "message": "Sito inserito nella whitelist." + }, + "js_popup_whitelisted_remove": { + "message": "Rimuovi dalla whitelist" + }, + "js_popup_audible": { + "message": "La tab sta riproducendo audio." + }, + "js_popup_form_input": { + "message": "La tab sta ricevendo dati dalle form." + }, + "js_popup_form_input_unpause": { + "message": "Riprendi" + }, + "js_popup_pinned": { + "message": "La scheda è stata fissata" + }, + "js_popup_temp_whitelist": { + "message": "Sospensione della scheda disattivata." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Riprendi" + }, + "js_popup_never": { + "message": "Sospensione automatica delle tab disabilitata." + }, + "js_popup_no_connectivity": { + "message": "Nessuna connessione di rete" + }, + "js_popup_charging": { + "message": "Collegato all'alimentazione elettrica" + }, + "js_popup_blockedFile": { + "message": "I file locali non possono essere sospesi." + }, + "js_popup_blockedFile_enable": { + "message": "Abilita" + }, + "js_popup_unknown": { + "message": "In attesa del caricamento della tab..." + }, + "js_popup_initialising": { + "message": "In attesa dell'avvio dell'estensione..." + }, + "js_popup_error": { + "message": "Sospensione automatica non disponibile per questa scheda" + }, + "js_history_delete": { + "message": "cancella" + }, + "js_history_export": { + "message": "esporta" + }, + "js_history_reload": { + "message": "apri e carica" + }, + "js_history_resuspend": { + "message": "apri e sospendi" + }, + "js_history_save": { + "message": "salva" + }, + "js_history_window": { + "message": "Finestra" + }, + "js_history_windows": { + "message": "Finestre" + }, + "js_history_tab": { + "message": "Scheda" + }, + "js_history_tabs": { + "message": "Schede" + }, + "js_history_enter_name_for_session": { + "message": "Inserisci un nome per questa sessione" + }, + "js_history_confirm_delete": { + "message": "Sei sicuro di voler eliminare questa sessione?" + }, + "js_history_confirm_session_overwrite": { + "message": "C'è già una sessione salvata con questo nome. Sovrascrivere la sessione esistente?" + }, + "js_history_import_fail": { + "message": "Caricamento del file non riuscito. Assicurati che il file sia composto da puro testo e che contenga un singolo indirizzo per riga." + }, + "js_history_migrate_fail": { + "message": "Devi inserire i 32 caratteri dell'id dell'estensione da cui migrare" + }, + "js_history_migrate_success": { + "message": "Ho migrato con successo $TABCOUNT$ schede", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Rimuovi sito dalla lista bianca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Configura scorciatoie da tastiera" + }, + "js_suspended_low_memory": { + "message": "Tab sospesa a causa della bassa memoria del sistema" + }, + "js_options_incognito_warning": { + "message": "Sei in modalità incognito. Molte impostazioni non saranno disponibili." + }, + "js_options_whitelist_no_matches": { + "message": "Non ci sono schede aperte che corrispondono all'attuale lista bianca." + }, + "js_options_whitelist_matches_heading": { + "message": "Schede aperte nella whitelist:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "e" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "altro." + }, + "js_permissions_button_export": { + "message": "Salva backup" + }, + "js_permissions_button_set": { + "message": "Apri impostazioni dell'estensione" + }, + "js_update_confirm": { + "message": "Non hai ancora effettuato un backup. Vuoi aggiornare comunque l'estensione?" + }, + "js_update_button_export": { + "message": "Salva backup" + }, + "js_update_button_reload": { + "message": "Aggiorna l'estensione ora" + }, + "js_shortcuts_not_set": { + "message": "non impostato" + }, + "js_session_save_point": { + "message": "Punto di salvataggio automatico per v" + } +} diff --git a/src/_locales/ja/messages.json b/src/_locales/ja/messages.json new file mode 100644 index 00000000..4dbcaca3 --- /dev/null +++ b/src/_locales/ja/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "使用していないタブを一時停止して、コンピューターをスムーズに動作させます" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "アクティブなタブをサスペンド/サスペンド解除" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "アクティブなタブのポーズ/ポーズ解除" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "選択したタブをサスペンド" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "選択したタブをサスペンド解除" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "アクティブなウィンドウ内の他のすべてのタブをサスペンド" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "アクティブなウィンドウ内の他のすべてのタブを強制的にサスペンド" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "アクティブなウィンドウ内の他のすべてのタブをサスペンド解除" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "すべてのウィンドウ内のすべてのタブをサスペンド" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "すべてのウィンドウ内のすべてのタブを強制的にサスペンド" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "すべてのウィンドウ内のすべてのタブをサスペンド解除" + }, + "js_context_open_link_in_suspended_tab": { + "message": "リンクを新しいサスペンドされたタブで開く" + }, + "js_context_toggle_suspend_state": { + "message": "このタブをサスペンド/サスペンド解除" + }, + "js_context_toggle_pause_suspension": { + "message": "このタブをポーズ/ポーズ解除" + }, + "js_context_never_suspend_domain": { + "message": "このドメインをサスペンドしない" + }, + "js_context_never_suspend_page": { + "message": "このURLをサスペンドしない" + }, + "js_context_suspend_selected_tabs": { + "message": "選択したタブをサスペンド" + }, + "js_context_unsuspend_selected_tabs": { + "message": "選択したタブをサスペンド解除" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "このウィンドウ内の他のすべてのタブをサスペンド" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "このウィンドウ内の他のすべてのタブを強制的にサスペンド" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "このウィンドウ内の他のすべてのタブをサスペンド解除" + }, + "js_context_soft_suspend_all_tabs": { + "message": "すべてのウィンドウ内のすべてのタブをサスペンド" + }, + "js_context_force_suspend_all_tabs": { + "message": "すべてのウィンドウ内のすべてのタブを強制的にサスペンド" + }, + "js_context_unsuspend_all_tabs": { + "message": "すべてのウィンドウ内のすべてのタブをサスペンド解除" + }, + "html_about_title": { + "message": "このアプリについて" + }, + "html_about_fork_beginning": { + "message": "Based on the original" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking" + }, + "html_about_fork_end": { + "message": ", more information available on" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "フィードバックがある場合、または問題を報告したい場合は、以下で行うことができます:" + }, + "html_about_report_issues_suffix": { + "message": "新しく作成する前に、同じ提案や問題が既に存在しているかどうかを確認してください。ありがとうございます!" + }, + "html_about_debugging_prefix": { + "message": "ログを有効にするか、デバッグフラグを設定するには、次に移動します: " + }, + "html_about_debugging_suffix": { + "message": "debug page." + }, + "html_about_the_github_issues_page": { + "message": "GitHub issues page" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "This extension uses the" + }, + "html_about_html2canvas_suffix": { + "message": "library written by Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "It also uses the indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "written by Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Thank you also to" + }, + "html_about_browserstack_suffix": { + "message": "for providing free chrome testing tools." + }, + "html_about_tgs_prefix": { + "message": "This extension could never have existed without" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "is broken" + }, + "html_broken_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_broken_line1": { + "message": "failed to start. Perhaps you are using an incompatible version of Chrome?" + }, + "html_broken_line2": { + "message": "Try to restart the extension. If the problem persists, ask for help on the" + }, + "html_broken_line2_github_page": { + "message": "GitHubのプロジェクトページ" + }, + "html_broken_line3": { + "message": "You can recover lost tabs from the" + }, + "html_broken_line3_session_management": { + "message": "セッション管理ページ" + }, + "html_broken_button_restart_extension": { + "message": "拡張機能を再起動" + }, + "html_history_title": { + "message": "セッション管理" + }, + "html_history_current_session": { + "message": "現在のセッション" + }, + "html_history_recent_sessions": { + "message": "最近のセッション" + }, + "html_history_saved_sessions": { + "message": "保存されたセッション" + }, + "html_history_import_session": { + "message": "セッションをインポート" + }, + "html_history_migrate_tabs": { + "message": "Migrate tabs" + }, + "html_history_migrate_old_id": { + "message": "Old TGS Extension id" + }, + "html_notice_title": { + "message": "Notice" + }, + "html_notice_important_notice": { + "message": "Important notice from The Marvellous Suspender" + }, + "html_options_title": { + "message": "Settings" + }, + "html_options_suspend_title": { + "message": "Automatic tab suspension" + }, + "html_options_suspended_title": { + "message": "Suspended tabs" + }, + "html_options_other_title": { + "message": "Other" + }, + "html_options_suspend_automatically_after": { + "message": "Automatically suspend tabs after" + }, + "html_options_suspend_never": { + "message": "Never" + }, + "html_options_suspend_seconds": { + "message": "seconds" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hour" + }, + "html_options_suspend_hours": { + "message": "hours" + }, + "html_options_suspend_day": { + "message": "day" + }, + "html_options_suspend_days": { + "message": "days" + }, + "html_options_suspend_week": { + "message": "week" + }, + "html_options_suspend_weeks": { + "message": "weeks" + }, + "html_options_suspend_no_pinned": { + "message": "Never suspend pinned tabs" + }, + "html_options_suspend_no_forms": { + "message": "Never suspend tabs that contain unsaved form inputs" + }, + "html_options_suspend_no_audio": { + "message": "Never suspend tabs that are playing audio" + }, + "html_options_suspend_only_connected": { + "message": "Never suspend tabs when offline" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Never suspend tabs when connected to power source" + }, + "html_options_suspend_no_active_tabs": { + "message": "Never suspend active tab in each window" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Automatically unsuspend tab when it is viewed" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Apply Chrome's built-in memory-saving when suspending" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduces a suspended tab's memory usage even more, by utilizing" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome's built-in 'tab discarding' functionality. This can result in up" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "However, it will also cause a slight rendering delay when selecting" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Theme" + }, + "html_options_suspend_theme_light": { + "message": "Light" + }, + "html_options_suspend_theme_dark": { + "message": "Dark" + }, + "html_options_suspend_screen_capturing": { + "message": "Screen capturing" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Disabled" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture top of screen only" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capture entire page" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "On a suspended tab, the extension can display an image preview of the what the tab" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "The screen capturing feature is experimental and can cause significant CPU usage as" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "If you notice strange behaviour such as tabs taking a long time to suspend, or chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "Enable high quality screen capture mode" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "When disabled, screen captures have the following limitations to aid in performance:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Low quality screen capture" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Will not capture screen if it takes more than 1 minute to generate image" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Maximum height of screen capture limited to 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Enabling high quality screen capture mode may significantly increase CPU load" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "Never suspend tabs with URLs from the following list:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Add the URL of each page you want to whitelist on a new line. For example:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "To whitelist multiple sites in one line you can specify part of the url instead:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "You can also specify regular expressions by enclosing the text in forward slashes:" + }, + "html_options_whitelist_test": { + "message": "Test whitelist" + }, + "html_options_other_enable_context_menu": { + "message": "Add The Marvellous Suspender to right-click context menu" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Add controls for this extension to the right-click menu of a web page." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "This will give you access to advanced suspending actions not available" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "Sync settings with your Chrome profile" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Extension settings will be synchronised across all chrome browsers which are" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "logged in with the same profile." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "This will also synchronise settings in incognito mode." + }, + "html_options_other_enable_sync_warning": { + "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" + }, + "html_options_suspend_on_low_memory": { + "message": "Instantly suspend when system memory gets very low" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "This option will override Chrome's automatic tab discarding functionality." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "If enabled, it will force a tab to suspend instead of being discarded by Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typically, Chrome will only discard tabs once system memory gets very low." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Please note: This may cause tabs to suspend earlier than the time you have" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Unsuspend this tab" + }, + "html_popup_suspend_tab": { + "message": "Suspend this tab now" + }, + "html_popup_dont_suspend_now": { + "message": "Don't suspend for now" + }, + "html_popup_never_suspend_domain": { + "message": "Never suspend this domain" + }, + "html_popup_never_suspend_page": { + "message": "Never suspend this URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspend all other tabs" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Unsuspend all tabs" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspend selected tabs" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Unsuspend selected tabs" + }, + "html_popup_settings": { + "message": "Settings" + }, + "html_restoring_title": { + "message": "Restoring window" + }, + "html_restoring_heading": { + "message": "Restoring tabs" + }, + "html_restoring_detail": { + "message": "Please wait while I restore this window..." + }, + "html_recovery_title": { + "message": "Recovery" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "Looks like you're recovering from an extension crash." + }, + "html_recovery_description_line2": { + "message": "Your suspended tabs may have crashed or disappeared." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restore tabs automatically" + }, + "html_recovery_go_to_session_manager": { + "message": "Go to session manager" + }, + "html_recovery_important_message": { + "message": "You currently have screen capturing turned on. If this extension is repeatedly crashing it is recommended you disable this option." + }, + "html_recovery_disable_screen_capturing": { + "message": "Turn off screen capturing" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs to restore" + }, + "html_shortcuts_title": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_context_menu_note": { + "message": "Note: These actions are also available via the right-click context menu." + }, + "html_shortcuts_remap_keys": { + "message": "Change shortcuts" + }, + "html_sidebar_general_settings": { + "message": "Settings" + }, + "html_sidebar_session_management": { + "message": "Session management" + }, + "html_sidebar_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_sidebar_support": { + "message": "About" + }, + "html_success_great_success": { + "message": "Marvellous success!" + }, + "html_success_all_tabs_restored": { + "message": "All your tabs have been restored." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "session management" + }, + "html_suspended_title": { + "message": "Suspended Tab" + }, + "html_suspended_tab_suspended": { + "message": "Tab suspended" + }, + "html_suspended_tab_reload": { + "message": "Reload tab" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Never suspend" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Refresh or click to reload" + }, + "html_suspended_toast_not_connected": { + "message": "You are not connected to the internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatic tab reloading is temporarily disabled." + }, + "html_permissions_title": { + "message": "Permissions" + }, + "html_permissions_heading": { + "message": "Please give me access to local file URLs" + }, + "html_permissions_info": { + "message": "This extension is not currently permitted to suspend URLs beginning with the word \"file\".\nTo change this, please turn on \"Allow access to file URLs\" from the extension settings page." + }, + "html_permissions_backup": { + "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_title": { + "message": "Update" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." + }, + "html_update_info_withbackup": { + "message": "Just in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_info_nobackup_prefix": { + "message": "It is strongly recommended that you export a copy of your current session from " + }, + "html_update_info_nobackup_suffix": { + "message": " before continuing with the update." + }, + "html_updated_title": { + "message": "Updated" + }, + "html_updating_heading": { + "message": "is updating" + }, + "html_updating_message": { + "message": "Please wait while I restore your suspended tabs..." + }, + "html_updated_great_suspender_updated": { + "message": "has been updated" + }, + "html_updated_info_line1": { + "message": "An automatic backup was made of your tabs before the update." + }, + "html_updated_info_line2_prefix": { + "message": "If you encountered any issues during the update, you can recover lost tabs from the " + }, + "html_updated_info_line2_suffix": { + "message": " page." + }, + "html_updated_detail_header_prefix": { + "message": "What's new in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "New features:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug fixes:" + }, + "html_updated_release_notes": { + "message": "Visit GitHub for full release notes: " + }, + "html_updated_patch_message": { + "message": "Sorry for the disturbance. I just needed to perform a little maintenance." + }, + "html_welcome_title": { + "message": "Welcome" + }, + "html_welcome_text_line1": { + "message": "Thanks for trying" + }, + "html_welcome_text_line2": { + "message": "I make your computer run smoothly by suspending the tabs you aren't using." + }, + "html_welcome_text_line3": { + "message": "You can fine-tune the settings below." + }, + "js_popup_normal": { + "message": "Tab will suspend automatically." + }, + "js_popup_normal_pause": { + "message": "Not now" + }, + "js_popup_special": { + "message": "Tab cannot be suspended" + }, + "js_popup_suspended": { + "message": "Tab suspended" + }, + "js_popup_suspended_pause": { + "message": "Don't suspend" + }, + "js_popup_whitelisted": { + "message": "Site whitelisted." + }, + "js_popup_whitelisted_remove": { + "message": "Remove from whitelist" + }, + "js_popup_audible": { + "message": "Tab is playing audio." + }, + "js_popup_form_input": { + "message": "Tab is receiving form input." + }, + "js_popup_form_input_unpause": { + "message": "Unpause" + }, + "js_popup_pinned": { + "message": "Tab has been pinned" + }, + "js_popup_temp_whitelist": { + "message": "Tab suspension paused." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Unpause" + }, + "js_popup_never": { + "message": "Automatic tab suspension disabled." + }, + "js_popup_no_connectivity": { + "message": "No network connection" + }, + "js_popup_charging": { + "message": "Connected to power source" + }, + "js_popup_blockedFile": { + "message": "Local files cannot be suspended." + }, + "js_popup_blockedFile_enable": { + "message": "Enable" + }, + "js_popup_unknown": { + "message": "Waiting for tab to load..." + }, + "js_popup_initialising": { + "message": "Waiting for extension to initialize..." + }, + "js_popup_error": { + "message": "Auto-suspend unavailable for this tab" + }, + "js_history_delete": { + "message": "delete" + }, + "js_history_export": { + "message": "export" + }, + "js_history_reload": { + "message": "open and load" + }, + "js_history_resuspend": { + "message": "open and suspend" + }, + "js_history_save": { + "message": "save" + }, + "js_history_window": { + "message": "Window" + }, + "js_history_windows": { + "message": "Windows" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_tabs": { + "message": "Tabs" + }, + "js_history_enter_name_for_session": { + "message": "Enter a name for this session" + }, + "js_history_confirm_delete": { + "message": "Are you sure you want to delete this session?" + }, + "js_history_confirm_session_overwrite": { + "message": "There is already a saved session with this name. Overwrite existing session?" + }, + "js_history_import_fail": { + "message": "Failed to load file. Ensure file is plain text and contains a single url per line." + }, + "js_history_migrate_fail": { + "message": "Need 32-character extension id to migrate from" + }, + "js_history_migrate_success": { + "message": "Successfully migrated $TABCOUNT$ tabs", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Remove site from whitelist" + }, + "js_suspended_hotkey_to_reload": { + "message": "Set keyboard shortcuts" + }, + "js_suspended_low_memory": { + "message": "Tab suspended due to low system memory" + }, + "js_options_incognito_warning": { + "message": "You are in incognito mode. Some features will not be available." + }, + "js_options_whitelist_no_matches": { + "message": "There are no open tabs that match the current whitelist." + }, + "js_options_whitelist_matches_heading": { + "message": "Whitelisted open tabs:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "and" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "more." + }, + "js_permissions_button_export": { + "message": "Save backup" + }, + "js_permissions_button_set": { + "message": "Open extension settings" + }, + "js_update_confirm": { + "message": "You have not saved a backup yet. Update the extension anyway?" + }, + "js_update_button_export": { + "message": "Save backup" + }, + "js_update_button_reload": { + "message": "Update extension now" + }, + "js_shortcuts_not_set": { + "message": "not set" + }, + "js_session_save_point": { + "message": "Automatic save point for v" + } +} diff --git a/src/_locales/pt_BR/messages.json b/src/_locales/pt_BR/messages.json index 73eda089..a97991fb 100644 --- a/src/_locales/pt_BR/messages.json +++ b/src/_locales/pt_BR/messages.json @@ -1,242 +1,787 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Suspender/Recarregar a guia ativa" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Pausar/Retomar suspensão da guia ativa" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Suspender guias selecionadas" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Recarregar guias selecionadas" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Suspender todas as outras guias na janela ativa" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Forçar suspender todas as outras guias na janela ativa" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Recarregar todas as guias na janela ativa" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Suspender todas as guias em todas as janelas" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Forçar suspensão de todas as guias em todas as janelas" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Recarregar todas as guias em todas as janelas" }, - "js_context_open_link_in_suspended_tab": { "message": "Abrir Link em Nova Guia Suspensa" }, - "js_context_toggle_suspend_state": { "message": "Suspender/Recarregar esta guia" }, - "js_context_toggle_pause_suspension": { "message": "Pausar/Retomar a suspensão desta guia" }, - "js_context_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "js_context_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "js_context_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "js_context_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Suspender todas as outras guias nessa janela" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Forçar a suspensão de todas as outras guias nessa janela" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Recarregar todas as guias nessa janela" }, - "js_context_soft_suspend_all_tabs": { "message": "Suspender todas as guias em todas as janelas" }, - "js_context_force_suspend_all_tabs": { "message": "Forçar a suspensão de todas as guias em todas as janelas" }, - "js_context_unsuspend_all_tabs": { "message": "Recarregar todas as guias em todas as janelas" }, - "html_about_title": { "message": "Sobre" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" }, - "html_about_report_issues_suffix": { "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" }, - "html_about_debugging_prefix": { "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " }, - "html_about_debugging_suffix": { "message": "página de depuração." }, - "html_about_the_github_issues_page": { "message": "Página de problemas do GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Esta extensão usa a" }, - "html_about_html2canvas_suffix": { "message": "biblioteca escrita por Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Ela também usa o indexedDb wrapper" }, - "html_about_indexedDb_suffix": { "message": "escrito por Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Obrigado também por" }, - "html_about_browserstack_suffix": { "message": "disponibilizar ferramentas gratuitas de teste do Chrome." }, - "html_history_title": { "message": "Gerenciamento de sessão" }, - "html_history_current_session": { "message": "Sessão atual" }, - "html_history_recent_sessions": { "message": "Sessões recentes" }, - "html_history_saved_sessions": { "message": "Sessões salvas" }, - "html_history_import_session": { "message": "Importar sessão" }, - "html_notice_title": { "message": "Aviso" }, - "html_notice_important_notice": { "message": "Aviso importante do The Great Suspender" }, - "html_options_title": { "message": "Configurações" }, - "html_options_suspend_title": { "message": "Suspensão de aba automática" }, - "html_options_suspended_title": { "message": "Guias suspensas" }, - "html_options_other_title": { "message": "Outros" }, - "html_options_suspend_automatically_after": { "message": "Suspender automaticamente as guias depois de" }, - "html_options_suspend_never": { "message": "Nunca" }, - "html_options_suspend_seconds": { "message": "segundos" }, - "html_options_suspend_minute": { "message": "min" }, - "html_options_suspend_minutes": { "message": "mins" }, - "html_options_suspend_hour": { "message": "hora" }, - "html_options_suspend_hours": { "message": "horas" }, - "html_options_suspend_day": { "message": "dia" }, - "html_options_suspend_days": { "message": "dias" }, - "html_options_suspend_week": { "message": "semana" }, - "html_options_suspend_weeks": { "message": "semanas" }, - "html_options_suspend_no_pinned": { "message": "Nunca suspender as guias fixadas" }, - "html_options_suspend_no_forms": { "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" }, - "html_options_suspend_no_audio": { "message": "Nunca suspender as guias que estiverem reproduzindo áudio" }, - "html_options_suspend_only_connected": { "message": "Nunca suspender as guias quando estiver off-line" }, - "html_options_suspend_only_on_battery": { "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" }, - "html_options_suspend_no_active_tabs": { "message": "Nunca suspender a guia ativa em cada janela" }, - "html_options_suspend_automatically_unsuspend": { "message": "Recarregar automaticamente quando a guia for visualizada" }, - "html_options_suspend_discard_after_suspend": { "message": "Aplicar a economia de memória integrada do Chrome ao suspender" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "uma guia suspensa." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Tema" }, - "html_options_suspend_theme_light": { "message": "Claro" }, - "html_options_suspend_theme_dark": { "message": "Escuro" }, - "html_options_suspend_screen_capturing": { "message": "Captura de tela" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Desativado" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Capture somente a parte superior da tela" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Capturar a página inteira" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "aparência da guia bem antes de ser suspensa." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "um aumento pequeno no uso de memória." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "travar inesperadamente, tente desativar esse recurso." }, - "html_options_suspend_force_screen_capture": { "message": "Ativar o modo de captura de tela de alta qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Captura de tela de baixa qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- A altura máxima de captura de tela é limitada a 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "e o uso de memória." }, - "html_options_whitelist_title": { "message": "Nunca suspender as guias com URLs da lista a seguir:" }, - "html_options_whitelist_tooltip_line1": { "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" }, - "html_options_whitelist_tooltip_line2": { "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" }, - "html_options_whitelist_tooltip_line3": { "message": "Você também pode especificar expressões regulares colocando o texto em barras:" }, - "html_options_whitelist_test": { "message": "Lista branca de teste" }, - "html_options_other_enable_context_menu": { "message": "Adicionar The Great Suspender no menu de contexto do clique do botão direito" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "em outro lugar na extensão." }, - "html_options_other_enable_sync": { "message": "Sincronizar as configurações com seu perfil do Chrome" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "conectados com o mesmo perfil." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Isso também sincronizará as configurações no modo de navegação anônima." }, - "html_options_other_enable_sync_warning": { "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." }, - "html_options_suspend_on_low_memory": { "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "especificada nas opções de suspensão de guia Automática." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Recarregar esta guia" }, - "html_popup_suspend_tab": { "message": "Suspender esta guia agora" }, - "html_popup_dont_suspend_now": { "message": "Não suspender agora" }, - "html_popup_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "html_popup_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "html_popup_suspend_other_tabs": { "message": "Suspender todas as outras guias" }, - "html_popup_unsuspend_all_tabs": { "message": "Recarregar todas as outras guias" }, - "html_popup_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "html_popup_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "html_popup_settings": { "message": "Configurações" }, - "html_restoring_title": { "message": "Restaurando janela" }, - "html_restoring_heading": { "message": "Restaurando abas" }, - "html_restoring_detail": { "message": "Por favor, aguarde enquanto eu restauro esta janela..." }, - "html_recovery_title": { "message": "Recuperação" }, - "html_recovery_ruh_roh": { "message": "Opa!" }, - "html_recovery_description_line1": { "message": "Parece que você está recuperando de uma falha na extensão." }, - "html_recovery_description_line2": { "message": "Suas guias suspensas podem ter travado ou desaparecido." }, - "html_recovery_restore_tabs_automatically": { "message": "Restaurar guias automaticamente" }, - "html_recovery_go_to_session_manager": { "message": "Ir para o gerenciador de sessões" }, - "html_recovery_important_message": { "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." }, - "html_recovery_disable_screen_capturing": { "message": "Desligue a captura de tela" }, - "html_recovery_tabs_to_restore": { "message": "Guias a restaurar" }, - "html_shortcuts_title": { "message": "Atalhos do teclado" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Atalhos do teclado" }, - "html_shortcuts_context_menu_note": { "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." }, - "html_shortcuts_remap_keys": { "message": "Alterar atalhos" }, - "html_sidebar_general_settings": { "message": "Configurações" }, - "html_sidebar_session_management": { "message": "Gerenciamento de sessões" }, - "html_sidebar_shortcuts": { "message": "Atalhos do teclado" }, - "html_sidebar_support": { "message": "Sobre" }, - "html_success_great_success": { "message": "Grande sucesso!" }, - "html_success_all_tabs_restored": { "message": "Todas as suas guias foram restauradas." }, - "html_success_goto_advanced_prefix": { "message": "For advanced session management, visit the" }, - "html_success_goto_advanced_suffix": { "message": "página" }, - "html_session_manager": { "message": "gerenciamento de sessões" }, - "html_suspended_title": { "message": "Guia suspensa" }, - "html_suspended_tab_suspended": { "message": "Guia suspensa" }, - "html_suspended_tab_reload": { "message": "Recarregar guia" }, - "html_suspended_tab_whitelist_prefix": { "message": "Nunca suspender" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Atualize ou clique para recarregar" }, - "html_suspended_toast_not_connected": { "message": "Você não está conectado à Internet" }, - "html_suspended_toast_reload_disabled": { "message": "O recarregamento automático de guias está temporariamente desativado." }, - "html_permissions_title": { "message": "Permissões" }, - "html_permissions_heading": { "message": "Por favor, me dê acesso a URLs de arquivos locais" }, - "html_permissions_info": { "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." }, - "html_permissions_backup": { "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_title": { "message": "Atualização" }, - "html_update_heading2": { "message": "está prestes a ficar maior" }, - "html_update_info": { "message": "Uma nova versão do The Great Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." }, - "html_update_info_withbackup": { "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_info_nobackup_prefix": { "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " }, - "html_update_info_nobackup_suffix": { "message": " antes de continuar com a atualização." }, - "html_updated_title": { "message": "Atualizado" }, - "html_updating_heading": { "message": "está atualizando" }, - "html_updating_message": { "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." }, - "html_updated_great_suspender_updated": { "message": "foi atualizado" }, - "html_updated_info_line1": { "message": "Um backup automático foi feito de suas guias antes da atualização." }, - "html_updated_info_line2_prefix": { "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " }, - "html_updated_info_line2_suffix": { "message": " página." }, - "html_updated_detail_header_prefix": { "message": "O que há de novo em " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Novos recursos:" }, - "html_updated_bug_fixes_header": { "message": "Correções de bugs:" }, - "html_updated_release_notes": { "message": "Visite o GitHub para obter notas da versão completas: " }, - "html_updated_patch_message": { "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." }, - "html_welcome_title": { "message": "Bem-vindo" }, - "html_welcome_text_line1": { "message": "Obrigado por experimentar" }, - "html_welcome_text_line2": { "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." }, - "html_welcome_text_line3": { "message": "Você pode ajustar bem as configurações abaixo." }, - "js_popup_normal": { "message": "A guia será suspensa automaticamente." }, - "js_popup_normal_pause": { "message": "Agora não" }, - "js_popup_special": { "message": "A guia não pôde ser suspensa" }, - "js_popup_suspended": { "message": "Guia suspensa" }, - "js_popup_suspended_pause": { "message": "Não suspender" }, - "js_popup_whitelisted": { "message": "Site adicionado à lista branca." }, - "js_popup_whitelisted_remove": { "message": "Remover da lista branca" }, - "js_popup_audible": { "message": "Esta guia está reproduzindo áudio." }, - "js_popup_form_input": { "message": "A guia está recebendo entrada de formulário." }, - "js_popup_form_input_unpause": { "message": "Retomar" }, - "js_popup_pinned": { "message": "A guia foi fixada" }, - "js_popup_temp_whitelist": { "message": "Suspensão de guias pausada." }, - "js_popup_temp_whitelist_unpause": { "message": "Retomar" }, - "js_popup_never": { "message": "Suspensão automática de guias desativada." }, - "js_popup_no_connectivity": { "message": "Sem conexão de rede" }, - "js_popup_charging": { "message": "Conectado à fonte de energia" }, - "js_popup_blockedFile": { "message": "Arquivos locais não podem ser suspensos." }, - "js_popup_blockedFile_enable": { "message": "Habilitar" }, - "js_popup_unknown": { "message": "Aguardando a guia carregar..." }, - "js_popup_initialising": { "message": "Aguardando a extensão inicializar..." }, - "js_popup_error": { "message": "Suspensão automática indisponível para esta guia" }, - "js_history_delete": { "message": "excluir" }, - "js_history_export": { "message": "exportar" }, - "js_history_reload": { "message": "abrir e carregar" }, - "js_history_resuspend": { "message": "abrir e suspender" }, - "js_history_save": { "message": "salvar" }, - "js_history_window": { "message": "Janela" }, - "js_history_tab": { "message": "Guia" }, - "js_history_plural": { "message": "s" }, - "js_history_enter_name_for_session": { "message": "Digite um nome para esta sessão" }, - "js_history_confirm_delete": { "message": "Tem certeza de que deseja excluir esta sessão?" }, - "js_history_confirm_session_overwrite": { "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" }, - "js_history_import_fail": { "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." }, - "js_suspended_remove_from_whitelist": { "message": "Remover site da lista branca" }, - "js_suspended_hotkey_to_reload": { "message": "Definir atalhos do teclado" }, - "js_suspended_low_memory": { "message": "Guia suspensa devido a baixa memória do sistema" }, - "js_options_incognito_warning": { "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." }, - "js_options_whitelist_no_matches": { "message": "Não há guias abertas que correspondam à lista branca atual." }, - "js_options_whitelist_matches_heading": { "message": "Guias permitidas abertas:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "e" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "mais." }, - "js_permissions_button_export": { "message": "Salvar backup" }, - "js_permissions_button_set": { "message": "Abrir configurações da extensão" }, - "js_update_confirm": { "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" }, - "js_update_button_export": { "message": "Salvar backup" }, - "js_update_button_reload": { "message": "Atualizar a extensão agora" }, - "js_shortcuts_not_set": { "message": "não definido" }, - "js_session_save_point": { "message": "Ponto de salvamento automático para v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspender/Recarregar a guia ativa" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pausar/Retomar suspensão da guia ativa" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspender guias selecionadas" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Recarregar guias selecionadas" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspender todas as outras guias na janela ativa" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forçar a suspensão de todas as guias na janela ativa" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Recarregar todas as guias na janela ativa" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspender todas as guias em todas as janelas" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forçar suspensão de todas as guias em todas as janelas" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Abrir Link em Nova Guia Suspensa" + }, + "js_context_toggle_suspend_state": { + "message": "Suspender/Recarregar esta guia" + }, + "js_context_toggle_pause_suspension": { + "message": "Pausar/Retomar a suspensão desta guia" + }, + "js_context_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "js_context_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspender todas as outras guias nessa janela" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forçar a suspensão de todas as outras guias nessa janela" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Recarregar todas as guias nessa janela" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspender todas as guias em todas as janelas" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forçar a suspensão de todas as guias em todas as janelas" + }, + "js_context_unsuspend_all_tabs": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "html_about_title": { + "message": "Sobre" + }, + "html_about_fork_beginning": { + "message": "Baseado no original" + }, + "html_about_fork_mid": { + "message": "disponível no GitHub, sem rastreamento ADS" + }, + "html_about_fork_end": { + "message": ", mais informações disponíveis no" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" + }, + "html_about_report_issues_suffix": { + "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" + }, + "html_about_debugging_prefix": { + "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " + }, + "html_about_debugging_suffix": { + "message": "página de depuração." + }, + "html_about_the_github_issues_page": { + "message": "Página de problemas do GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Esta extensão usa a" + }, + "html_about_html2canvas_suffix": { + "message": "biblioteca escrita por Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Ela também usa o indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "escrito por Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Obrigado também por" + }, + "html_about_browserstack_suffix": { + "message": "disponibilizar ferramentas gratuitas de teste do Chrome." + }, + "html_about_tgs_prefix": { + "message": "Esta extensão nunca teria existido sem" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "está quebrado" + }, + "html_broken_ruh_roh": { + "message": "Opa!" + }, + "html_broken_line1": { + "message": "falha ao iniciar. Será que você está usando uma versão incompatível do chrome?" + }, + "html_broken_line2": { + "message": "Tente reiniciar a extensão. Se o problema persistir, peça ajuda na" + }, + "html_broken_line2_github_page": { + "message": "Página do projeto no Github" + }, + "html_broken_line3": { + "message": "Você pode recuperar as abas perdidas do" + }, + "html_broken_line3_session_management": { + "message": "página de gerenciamento de sessões" + }, + "html_broken_button_restart_extension": { + "message": "Reiniciar extensão" + }, + "html_history_title": { + "message": "Gerenciamento de sessão" + }, + "html_history_current_session": { + "message": "Sessão atual" + }, + "html_history_recent_sessions": { + "message": "Sessões recentes" + }, + "html_history_saved_sessions": { + "message": "Sessões salvas" + }, + "html_history_import_session": { + "message": "Importar sessão" + }, + "html_history_migrate_tabs": { + "message": "Migrar abas" + }, + "html_history_migrate_old_id": { + "message": "ID da extensão TGS antiga" + }, + "html_notice_title": { + "message": "Aviso" + }, + "html_notice_important_notice": { + "message": "Aviso importante do The Marvellous Suspender" + }, + "html_options_title": { + "message": "Configurações" + }, + "html_options_suspend_title": { + "message": "Suspensão de aba automática" + }, + "html_options_suspended_title": { + "message": "Guias suspensas" + }, + "html_options_other_title": { + "message": "Outros" + }, + "html_options_suspend_automatically_after": { + "message": "Suspender automaticamente as guias depois de" + }, + "html_options_suspend_never": { + "message": "Nunca" + }, + "html_options_suspend_seconds": { + "message": "segundos" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hora" + }, + "html_options_suspend_hours": { + "message": "horas" + }, + "html_options_suspend_day": { + "message": "dia" + }, + "html_options_suspend_days": { + "message": "dias" + }, + "html_options_suspend_week": { + "message": "semana" + }, + "html_options_suspend_weeks": { + "message": "semanas" + }, + "html_options_suspend_no_pinned": { + "message": "Nunca suspender as guias fixadas" + }, + "html_options_suspend_no_forms": { + "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" + }, + "html_options_suspend_no_audio": { + "message": "Nunca suspender as guias que estiverem reproduzindo áudio" + }, + "html_options_suspend_only_connected": { + "message": "Nunca suspender as guias quando estiver off-line" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" + }, + "html_options_suspend_no_active_tabs": { + "message": "Nunca suspender a guia ativa em cada janela" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Recarregar automaticamente quando a guia for visualizada" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Aplicar a economia de memória integrada do Chrome ao suspender" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "uma guia suspensa." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Claro" + }, + "html_options_suspend_theme_dark": { + "message": "Escuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Captura de tela" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Desativado" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture somente a parte superior da tela" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capturar a página inteira" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "aparência da guia bem antes de ser suspensa." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "um aumento pequeno no uso de memória." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "travar inesperadamente, tente desativar esse recurso." + }, + "html_options_suspend_force_screen_capture": { + "message": "Ativar o modo de captura de tela de alta qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Captura de tela de baixa qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- A altura máxima de captura de tela é limitada a 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "e o uso de memória." + }, + "html_options_whitelist_title": { + "message": "Nunca suspender as guias com URLs da lista a seguir:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Você também pode especificar expressões regulares colocando o texto em barras:" + }, + "html_options_whitelist_test": { + "message": "Lista branca de teste" + }, + "html_options_other_enable_context_menu": { + "message": "Adicionar The Marvellous Suspender no menu de contexto do clique do botão direito" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "em outro lugar na extensão." + }, + "html_options_other_enable_sync": { + "message": "Sincronizar as configurações com seu perfil do Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "conectados com o mesmo perfil." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Isso também sincronizará as configurações no modo de navegação anônima." + }, + "html_options_other_enable_sync_warning": { + "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." + }, + "html_options_suspend_on_low_memory": { + "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "especificada nas opções de suspensão de guia Automática." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Recarregar esta guia" + }, + "html_popup_suspend_tab": { + "message": "Suspender esta guia agora" + }, + "html_popup_dont_suspend_now": { + "message": "Não suspender agora" + }, + "html_popup_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "html_popup_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspender todas as outras guias" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Recarregar todas as outras guias" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "html_popup_settings": { + "message": "Configurações" + }, + "html_restoring_title": { + "message": "Restaurando janela" + }, + "html_restoring_heading": { + "message": "Restaurando abas" + }, + "html_restoring_detail": { + "message": "Por favor, aguarde enquanto eu restauro esta janela..." + }, + "html_recovery_title": { + "message": "Recuperação" + }, + "html_recovery_ruh_roh": { + "message": "Opa!" + }, + "html_recovery_description_line1": { + "message": "Parece que você está recuperando de uma falha na extensão." + }, + "html_recovery_description_line2": { + "message": "Suas guias suspensas podem ter travado ou desaparecido." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restaurar guias automaticamente" + }, + "html_recovery_go_to_session_manager": { + "message": "Ir para o gerenciador de sessões" + }, + "html_recovery_important_message": { + "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." + }, + "html_recovery_disable_screen_capturing": { + "message": "Desligue a captura de tela" + }, + "html_recovery_tabs_to_restore": { + "message": "Guias a restaurar" + }, + "html_shortcuts_title": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_context_menu_note": { + "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." + }, + "html_shortcuts_remap_keys": { + "message": "Alterar atalhos" + }, + "html_sidebar_general_settings": { + "message": "Configurações" + }, + "html_sidebar_session_management": { + "message": "Gerenciamento de sessões" + }, + "html_sidebar_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_sidebar_support": { + "message": "Sobre" + }, + "html_success_great_success": { + "message": "Grande sucesso!" + }, + "html_success_all_tabs_restored": { + "message": "Todas as suas guias foram restauradas." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "página" + }, + "html_session_manager": { + "message": "gerenciamento de sessões" + }, + "html_suspended_title": { + "message": "Guia suspensa" + }, + "html_suspended_tab_suspended": { + "message": "Guia suspensa" + }, + "html_suspended_tab_reload": { + "message": "Recarregar guia" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nunca suspender" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Atualize ou clique para recarregar" + }, + "html_suspended_toast_not_connected": { + "message": "Você não está conectado à Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "O recarregamento automático de guias está temporariamente desativado." + }, + "html_permissions_title": { + "message": "Permissões" + }, + "html_permissions_heading": { + "message": "Por favor, me dê acesso a URLs de arquivos locais" + }, + "html_permissions_info": { + "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." + }, + "html_permissions_backup": { + "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_title": { + "message": "Atualização" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "Uma nova versão do The Marvellous Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." + }, + "html_update_info_withbackup": { + "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_info_nobackup_prefix": { + "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " + }, + "html_update_info_nobackup_suffix": { + "message": " antes de continuar com a atualização." + }, + "html_updated_title": { + "message": "Atualizado" + }, + "html_updating_heading": { + "message": "está atualizando" + }, + "html_updating_message": { + "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." + }, + "html_updated_great_suspender_updated": { + "message": "foi atualizado" + }, + "html_updated_info_line1": { + "message": "Um backup automático foi feito de suas guias antes da atualização." + }, + "html_updated_info_line2_prefix": { + "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " + }, + "html_updated_info_line2_suffix": { + "message": " página." + }, + "html_updated_detail_header_prefix": { + "message": "O que há de novo em " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Novos recursos:" + }, + "html_updated_bug_fixes_header": { + "message": "Correções de bugs:" + }, + "html_updated_release_notes": { + "message": "Visite o GitHub para obter notas da versão completas: " + }, + "html_updated_patch_message": { + "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." + }, + "html_welcome_title": { + "message": "Bem-vindo" + }, + "html_welcome_text_line1": { + "message": "Obrigado por experimentar" + }, + "html_welcome_text_line2": { + "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." + }, + "html_welcome_text_line3": { + "message": "Você pode ajustar as configurações abaixo." + }, + "js_popup_normal": { + "message": "A guia será suspensa automaticamente." + }, + "js_popup_normal_pause": { + "message": "Agora não" + }, + "js_popup_special": { + "message": "A guia não pôde ser suspensa" + }, + "js_popup_suspended": { + "message": "Guia suspensa" + }, + "js_popup_suspended_pause": { + "message": "Não suspender" + }, + "js_popup_whitelisted": { + "message": "Site adicionado à lista branca." + }, + "js_popup_whitelisted_remove": { + "message": "Remover da lista branca" + }, + "js_popup_audible": { + "message": "Esta guia está reproduzindo áudio." + }, + "js_popup_form_input": { + "message": "A guia está recebendo entrada de formulário." + }, + "js_popup_form_input_unpause": { + "message": "Retomar" + }, + "js_popup_pinned": { + "message": "A guia foi fixada" + }, + "js_popup_temp_whitelist": { + "message": "Suspensão de guias pausada." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Retomar" + }, + "js_popup_never": { + "message": "Suspensão automática de guias desativada." + }, + "js_popup_no_connectivity": { + "message": "Sem conexão de rede" + }, + "js_popup_charging": { + "message": "Conectado à fonte de energia" + }, + "js_popup_blockedFile": { + "message": "Arquivos locais não podem ser suspensos." + }, + "js_popup_blockedFile_enable": { + "message": "Habilitar" + }, + "js_popup_unknown": { + "message": "Aguardando a guia carregar..." + }, + "js_popup_initialising": { + "message": "Aguardando a extensão inicializar..." + }, + "js_popup_error": { + "message": "Suspensão automática indisponível para esta guia" + }, + "js_history_delete": { + "message": "excluir" + }, + "js_history_export": { + "message": "exportar" + }, + "js_history_reload": { + "message": "abrir e carregar" + }, + "js_history_resuspend": { + "message": "abrir e suspender" + }, + "js_history_save": { + "message": "salvar" + }, + "js_history_window": { + "message": "Janela" + }, + "js_history_windows": { + "message": "Janelas" + }, + "js_history_tab": { + "message": "Guia" + }, + "js_history_tabs": { + "message": "Abas" + }, + "js_history_enter_name_for_session": { + "message": "Digite um nome para esta sessão" + }, + "js_history_confirm_delete": { + "message": "Tem certeza de que deseja excluir esta sessão?" + }, + "js_history_confirm_session_overwrite": { + "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" + }, + "js_history_import_fail": { + "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." + }, + "js_history_migrate_fail": { + "message": "É necessário o is de 32 caracteres para migrar" + }, + "js_history_migrate_success": { + "message": "Foram migradas $TABCOUNT$ guias com sucesso", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Remover site da lista branca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Definir atalhos do teclado" + }, + "js_suspended_low_memory": { + "message": "Guia suspensa devido a baixa memória do sistema" + }, + "js_options_incognito_warning": { + "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." + }, + "js_options_whitelist_no_matches": { + "message": "Não há guias abertas que correspondam à lista branca atual." + }, + "js_options_whitelist_matches_heading": { + "message": "Guias permitidas abertas:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "e" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "mais." + }, + "js_permissions_button_export": { + "message": "Salvar backup" + }, + "js_permissions_button_set": { + "message": "Abrir configurações da extensão" + }, + "js_update_confirm": { + "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" + }, + "js_update_button_export": { + "message": "Salvar backup" + }, + "js_update_button_reload": { + "message": "Atualizar a extensão agora" + }, + "js_shortcuts_not_set": { + "message": "não definido" + }, + "js_session_save_point": { + "message": "Ponto de salvamento automático para v" + } } diff --git a/src/_locales/pt_PT/messages.json b/src/_locales/pt_PT/messages.json index 857e8eef..58d3330c 100644 --- a/src/_locales/pt_PT/messages.json +++ b/src/_locales/pt_PT/messages.json @@ -1,242 +1,787 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Faça o seu computador funcionar sem problemas suspendendo as guias que você não está usando" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Suspender/Recarregar a guia ativa" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Pausar/Retomar suspensão da guia ativa" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Suspender guias selecionadas" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Recarregar guias selecionadas" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Suspender todas as outras guias na janela ativa" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Forçar suspender todas as outras guias na janela ativa" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Recarregar todas as guias na janela ativa" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Suspender todas as guias em todas as janelas" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Forçar suspensão de todas as guias em todas as janelas" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Recarregar todas as guias em todas as janelas" }, - "js_context_open_link_in_suspended_tab": { "message": "Abrir Link em Nova Guia Suspensa" }, - "js_context_toggle_suspend_state": { "message": "Suspender/Recarregar esta guia" }, - "js_context_toggle_pause_suspension": { "message": "Pausar/Retomar a suspensão desta guia" }, - "js_context_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "js_context_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "js_context_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "js_context_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Suspender todas as outras guias nessa janela" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Forçar a suspensão de todas as outras guias nessa janela" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Recarregar todas as guias nessa janela" }, - "js_context_soft_suspend_all_tabs": { "message": "Suspender todas as guias em todas as janelas" }, - "js_context_force_suspend_all_tabs": { "message": "Forçar a suspensão de todas as guias em todas as janelas" }, - "js_context_unsuspend_all_tabs": { "message": "Recarregar todas as guias em todas as janelas" }, - "html_about_title": { "message": "Sobre" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" }, - "html_about_report_issues_suffix": { "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" }, - "html_about_debugging_prefix": { "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " }, - "html_about_debugging_suffix": { "message": "página de depuração." }, - "html_about_the_github_issues_page": { "message": "Página de problemas do GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Esta extensão usa a" }, - "html_about_html2canvas_suffix": { "message": "biblioteca escrita por Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Ela também usa o indexedDb wrapper" }, - "html_about_indexedDb_suffix": { "message": "escrito por Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Obrigado também por" }, - "html_about_browserstack_suffix": { "message": "disponibilizar ferramentas gratuitas de teste do Chrome." }, - "html_history_title": { "message": "Gerenciamento de sessão" }, - "html_history_current_session": { "message": "Sessão atual" }, - "html_history_recent_sessions": { "message": "Sessões recentes" }, - "html_history_saved_sessions": { "message": "Sessões salvas" }, - "html_history_import_session": { "message": "Importar sessão" }, - "html_notice_title": { "message": "Aviso" }, - "html_notice_important_notice": { "message": "Aviso importante do The Great Suspender" }, - "html_options_title": { "message": "Configurações" }, - "html_options_suspend_title": { "message": "Suspensão de aba automática" }, - "html_options_suspended_title": { "message": "Guias suspensas" }, - "html_options_other_title": { "message": "Outros" }, - "html_options_suspend_automatically_after": { "message": "Suspender automaticamente as guias depois de" }, - "html_options_suspend_never": { "message": "Nunca" }, - "html_options_suspend_seconds": { "message": "segundos" }, - "html_options_suspend_minute": { "message": "min" }, - "html_options_suspend_minutes": { "message": "mins" }, - "html_options_suspend_hour": { "message": "hora" }, - "html_options_suspend_hours": { "message": "horas" }, - "html_options_suspend_day": { "message": "dia" }, - "html_options_suspend_days": { "message": "dias" }, - "html_options_suspend_week": { "message": "semana" }, - "html_options_suspend_weeks": { "message": "semanas" }, - "html_options_suspend_no_pinned": { "message": "Nunca suspender as guias fixadas" }, - "html_options_suspend_no_forms": { "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" }, - "html_options_suspend_no_audio": { "message": "Nunca suspender as guias que estiverem reproduzindo áudio" }, - "html_options_suspend_only_connected": { "message": "Nunca suspender as guias quando estiver off-line" }, - "html_options_suspend_only_on_battery": { "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" }, - "html_options_suspend_no_active_tabs": { "message": "Nunca suspender a guia ativa em cada janela" }, - "html_options_suspend_automatically_unsuspend": { "message": "Recarregar automaticamente quando a guia for visualizada" }, - "html_options_suspend_discard_after_suspend": { "message": "Aplicar a economia de memória integrada do Chrome ao suspender" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "uma guia suspensa." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Tema" }, - "html_options_suspend_theme_light": { "message": "Claro" }, - "html_options_suspend_theme_dark": { "message": "Escuro" }, - "html_options_suspend_screen_capturing": { "message": "Captura de tela" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Desativado" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Capture somente a parte superior da tela" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Capturar a página inteira" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "aparência da guia bem antes de ser suspensa." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "um aumento pequeno no uso de memória." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "travar inesperadamente, tente desativar esse recurso." }, - "html_options_suspend_force_screen_capture": { "message": "Ativar o modo de captura de tela de alta qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Captura de tela de baixa qualidade" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- A altura máxima de captura de tela é limitada a 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "e o uso de memória." }, - "html_options_whitelist_title": { "message": "Nunca suspender as guias com URLs da lista a seguir:" }, - "html_options_whitelist_tooltip_line1": { "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" }, - "html_options_whitelist_tooltip_line2": { "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" }, - "html_options_whitelist_tooltip_line3": { "message": "Você também pode especificar expressões regulares colocando o texto em barras:" }, - "html_options_whitelist_test": { "message": "Lista branca de teste" }, - "html_options_other_enable_context_menu": { "message": "Adicionar The Great Suspender no menu de contexto do clique do botão direito" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "em outro lugar na extensão." }, - "html_options_other_enable_sync": { "message": "Sincronizar as configurações com seu perfil do Chrome" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "conectados com o mesmo perfil." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Isso também sincronizará as configurações no modo de navegação anônima." }, - "html_options_other_enable_sync_warning": { "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." }, - "html_options_suspend_on_low_memory": { "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "especificada nas opções de suspensão de guia Automática." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Para mais informações sobre o descarte do Chrome, consulte:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Recarregar esta guia" }, - "html_popup_suspend_tab": { "message": "Suspender esta guia agora" }, - "html_popup_dont_suspend_now": { "message": "Não suspender agora" }, - "html_popup_never_suspend_domain": { "message": "Nunca suspender este domínio" }, - "html_popup_never_suspend_page": { "message": "Nunca suspender esta URL" }, - "html_popup_suspend_other_tabs": { "message": "Suspender todas as outras guias" }, - "html_popup_unsuspend_all_tabs": { "message": "Recarregar todas as outras guias" }, - "html_popup_suspend_selected_tabs": { "message": "Suspender as guias selecionadas" }, - "html_popup_unsuspend_selected_tabs": { "message": "Recarregar as guias selecionadas" }, - "html_popup_settings": { "message": "Configurações" }, - "html_restoring_title": { "message": "Restaurando janela" }, - "html_restoring_heading": { "message": "Restaurando abas" }, - "html_restoring_detail": { "message": "Por favor, aguarde enquanto eu restauro esta janela..." }, - "html_recovery_title": { "message": "Recuperação" }, - "html_recovery_ruh_roh": { "message": "Opa!" }, - "html_recovery_description_line1": { "message": "Parece que você está recuperando de uma falha na extensão." }, - "html_recovery_description_line2": { "message": "Suas guias suspensas podem ter travado ou desaparecido." }, - "html_recovery_restore_tabs_automatically": { "message": "Restaurar guias automaticamente" }, - "html_recovery_go_to_session_manager": { "message": "Ir para o gerenciador de sessões" }, - "html_recovery_important_message": { "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." }, - "html_recovery_disable_screen_capturing": { "message": "Desligue a captura de tela" }, - "html_recovery_tabs_to_restore": { "message": "Guias a restaurar" }, - "html_shortcuts_title": { "message": "Atalhos do teclado" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Atalhos do teclado" }, - "html_shortcuts_context_menu_note": { "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." }, - "html_shortcuts_remap_keys": { "message": "Alterar atalhos" }, - "html_sidebar_general_settings": { "message": "Configurações" }, - "html_sidebar_session_management": { "message": "Gerenciamento de sessões" }, - "html_sidebar_shortcuts": { "message": "Atalhos do teclado" }, - "html_sidebar_support": { "message": "Sobre" }, - "html_success_great_success": { "message": "Grande sucesso!" }, - "html_success_all_tabs_restored": { "message": "Todas as suas guias foram restauradas." }, - "html_success_goto_advanced_prefix": { "message": "For advanced session management, visit the" }, - "html_success_goto_advanced_suffix": { "message": "página" }, - "html_session_manager": { "message": "gerenciamento de sessões" }, - "html_suspended_title": { "message": "Guia suspensa" }, - "html_suspended_tab_suspended": { "message": "Guia suspensa" }, - "html_suspended_tab_reload": { "message": "Recarregar guia" }, - "html_suspended_tab_whitelist_prefix": { "message": "Nunca suspender" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Atualize ou clique para recarregar" }, - "html_suspended_toast_not_connected": { "message": "Você não está conectado à Internet" }, - "html_suspended_toast_reload_disabled": { "message": "O recarregamento automático de guias está temporariamente desativado." }, - "html_permissions_title": { "message": "Permissões" }, - "html_permissions_heading": { "message": "Por favor, me dê acesso a URLs de arquivos locais" }, - "html_permissions_info": { "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." }, - "html_permissions_backup": { "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_title": { "message": "Atualização" }, - "html_update_heading2": { "message": "está prestes a ficar maior" }, - "html_update_info": { "message": "Uma nova versão do The Great Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." }, - "html_update_info_withbackup": { "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." }, - "html_update_info_nobackup_prefix": { "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " }, - "html_update_info_nobackup_suffix": { "message": " antes de continuar com a atualização." }, - "html_updated_title": { "message": "Atualizado" }, - "html_updating_heading": { "message": "está atualizando" }, - "html_updating_message": { "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." }, - "html_updated_great_suspender_updated": { "message": "foi atualizado" }, - "html_updated_info_line1": { "message": "Um backup automático foi feito de suas guias antes da atualização." }, - "html_updated_info_line2_prefix": { "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " }, - "html_updated_info_line2_suffix": { "message": " página." }, - "html_updated_detail_header_prefix": { "message": "O que há de novo em " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Novos recursos:" }, - "html_updated_bug_fixes_header": { "message": "Correções de bugs:" }, - "html_updated_release_notes": { "message": "Visite o GitHub para obter notas da versão completas: " }, - "html_updated_patch_message": { "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." }, - "html_welcome_title": { "message": "Bem-vindo" }, - "html_welcome_text_line1": { "message": "Obrigado por experimentar" }, - "html_welcome_text_line2": { "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." }, - "html_welcome_text_line3": { "message": "Você pode ajustar bem as configurações abaixo." }, - "js_popup_normal": { "message": "A guia será suspensa automaticamente." }, - "js_popup_normal_pause": { "message": "Agora não" }, - "js_popup_special": { "message": "A guia não pôde ser suspensa" }, - "js_popup_suspended": { "message": "Guia suspensa" }, - "js_popup_suspended_pause": { "message": "Não suspender" }, - "js_popup_whitelisted": { "message": "Site adicionado à lista branca." }, - "js_popup_whitelisted_remove": { "message": "Remover da lista branca" }, - "js_popup_audible": { "message": "Esta guia está reproduzindo áudio." }, - "js_popup_form_input": { "message": "A guia está recebendo entrada de formulário." }, - "js_popup_form_input_unpause": { "message": "Retomar" }, - "js_popup_pinned": { "message": "A guia foi fixada" }, - "js_popup_temp_whitelist": { "message": "Suspensão de guias pausada." }, - "js_popup_temp_whitelist_unpause": { "message": "Retomar" }, - "js_popup_never": { "message": "Suspensão automática de guias desativada." }, - "js_popup_no_connectivity": { "message": "Sem conexão de rede" }, - "js_popup_charging": { "message": "Conectado à fonte de energia" }, - "js_popup_blockedFile": { "message": "Arquivos locais não podem ser suspensos." }, - "js_popup_blockedFile_enable": { "message": "Habilitar" }, - "js_popup_unknown": { "message": "Aguardando a guia carregar..." }, - "js_popup_initialising": { "message": "Aguardando a extensão inicializar..." }, - "js_popup_error": { "message": "Suspensão automática indisponível para esta guia" }, - "js_history_delete": { "message": "excluir" }, - "js_history_export": { "message": "exportar" }, - "js_history_reload": { "message": "abrir e carregar" }, - "js_history_resuspend": { "message": "abrir e suspender" }, - "js_history_save": { "message": "salvar" }, - "js_history_window": { "message": "Janela" }, - "js_history_tab": { "message": "Guia" }, - "js_history_plural": { "message": "s" }, - "js_history_enter_name_for_session": { "message": "Digite um nome para esta sessão" }, - "js_history_confirm_delete": { "message": "Tem certeza de que deseja excluir esta sessão?" }, - "js_history_confirm_session_overwrite": { "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" }, - "js_history_import_fail": { "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." }, - "js_suspended_remove_from_whitelist": { "message": "Remover site da lista branca" }, - "js_suspended_hotkey_to_reload": { "message": "Definir atalhos do teclado" }, - "js_suspended_low_memory": { "message": "Guia suspensa devido a baixa memória do sistema" }, - "js_options_incognito_warning": { "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." }, - "js_options_whitelist_no_matches": { "message": "Não há guias abertas que correspondam à lista branca atual." }, - "js_options_whitelist_matches_heading": { "message": "Guias permitidas abertas:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "e" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "mais." }, - "js_permissions_button_export": { "message": "Salvar backup" }, - "js_permissions_button_set": { "message": "Abrir configurações da extensão" }, - "js_update_confirm": { "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" }, - "js_update_button_export": { "message": "Salvar backup" }, - "js_update_button_reload": { "message": "Atualizar a extensão agora" }, - "js_shortcuts_not_set": { "message": "não definido" }, - "js_session_save_point": { "message": "Ponto de salvamento automático para v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Faça o seu computador funcionar sem problemas suspendendo os separadores que não está a utilizar" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Suspender/Recarregar o separador ativo" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Pausar/Retomar suspensão da guia ativa" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Suspender separadores selecionados" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Reativar separadores selecionados" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Suspender todos os outras separadores na janela ativa" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Forçar suspensão de todos os outros separadores na janela ativa" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Recarregar todas as guias na janela ativa" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Suspender todas as guias em todas as janelas" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Forçar suspensão de todas as guias em todas as janelas" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Abrir Link em Nova Guia Suspensa" + }, + "js_context_toggle_suspend_state": { + "message": "Suspender/Recarregar esta guia" + }, + "js_context_toggle_pause_suspension": { + "message": "Pausar/Retomar a suspensão desta guia" + }, + "js_context_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "js_context_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Suspender todas as outras guias nessa janela" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Forçar a suspensão de todas as outras guias nessa janela" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Recarregar todas as guias nessa janela" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Suspender todas as guias em todas as janelas" + }, + "js_context_force_suspend_all_tabs": { + "message": "Forçar a suspensão de todas as guias em todas as janelas" + }, + "js_context_unsuspend_all_tabs": { + "message": "Recarregar todas as guias em todas as janelas" + }, + "html_about_title": { + "message": "Sobre" + }, + "html_about_fork_beginning": { + "message": "Baseado no original" + }, + "html_about_fork_mid": { + "message": "disponível no GitHub, sem rastreamento de ADS" + }, + "html_about_fork_end": { + "message": ", mais informações disponíveis em" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Se você tiver comentários ou quiser denunciar um problema, poderá fazer isso no" + }, + "html_about_report_issues_suffix": { + "message": ". Por favor, verifique se a sua ideia ou problema já existe antes de criar um novo. Obrigado!" + }, + "html_about_debugging_prefix": { + "message": "Para habilitar o log, ou para definir sinalizadores de depuração, vá para a " + }, + "html_about_debugging_suffix": { + "message": "página de depuração." + }, + "html_about_the_github_issues_page": { + "message": "Página de problemas do GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Esta extensão usa a" + }, + "html_about_html2canvas_suffix": { + "message": "biblioteca escrita por Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Ela também usa o indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": "escrito por Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Obrigado também por" + }, + "html_about_browserstack_suffix": { + "message": "disponibilizar ferramentas gratuitas de teste do Chrome." + }, + "html_about_tgs_prefix": { + "message": "Esta extensão nunca poderia ter existido sem" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "não funciona" + }, + "html_broken_ruh_roh": { + "message": "Oops!" + }, + "html_broken_line1": { + "message": "falha ao iniciar. Talvez você esteja a utilizar uma versão incompatível do Chrome?" + }, + "html_broken_line2": { + "message": "Tente reiniciar a extensão. Se o problema persistir, peça ajuda no" + }, + "html_broken_line2_github_page": { + "message": "Página do projeto no GitHub" + }, + "html_broken_line3": { + "message": "Pode recuperar os separadores perdidos no" + }, + "html_broken_line3_session_management": { + "message": "página de gestão da sessão" + }, + "html_broken_button_restart_extension": { + "message": "Reiniciar extensão" + }, + "html_history_title": { + "message": "Gerenciamento de sessão" + }, + "html_history_current_session": { + "message": "Sessão atual" + }, + "html_history_recent_sessions": { + "message": "Sessões recentes" + }, + "html_history_saved_sessions": { + "message": "Sessões salvas" + }, + "html_history_import_session": { + "message": "Importar sessão" + }, + "html_history_migrate_tabs": { + "message": "Migrar guias" + }, + "html_history_migrate_old_id": { + "message": "ID de extensão TGS antigo" + }, + "html_notice_title": { + "message": "Aviso" + }, + "html_notice_important_notice": { + "message": "Aviso importante do The Marvellous Suspender" + }, + "html_options_title": { + "message": "Configurações" + }, + "html_options_suspend_title": { + "message": "Suspensão de aba automática" + }, + "html_options_suspended_title": { + "message": "Guias suspensas" + }, + "html_options_other_title": { + "message": "Outros" + }, + "html_options_suspend_automatically_after": { + "message": "Suspender automaticamente as guias depois de" + }, + "html_options_suspend_never": { + "message": "Nunca" + }, + "html_options_suspend_seconds": { + "message": "segundos" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "mins" + }, + "html_options_suspend_hour": { + "message": "hora" + }, + "html_options_suspend_hours": { + "message": "horas" + }, + "html_options_suspend_day": { + "message": "dia" + }, + "html_options_suspend_days": { + "message": "dias" + }, + "html_options_suspend_week": { + "message": "semana" + }, + "html_options_suspend_weeks": { + "message": "semanas" + }, + "html_options_suspend_no_pinned": { + "message": "Nunca suspender as guias fixadas" + }, + "html_options_suspend_no_forms": { + "message": "Nunca suspender as guias que contenham entradas de formulário não salvas" + }, + "html_options_suspend_no_audio": { + "message": "Nunca suspender as guias que estiverem reproduzindo áudio" + }, + "html_options_suspend_only_connected": { + "message": "Nunca suspender as guias quando estiver off-line" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Nunca suspender as guias quando estiver conectado à fonte de energia" + }, + "html_options_suspend_no_active_tabs": { + "message": "Nunca suspender a guia ativa em cada janela" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Recarregar automaticamente quando a guia for visualizada" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Aplicar a economia de memória integrada do Chrome ao suspender" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Reduz ainda mais o uso de memória de uma guia suspensa, utilizando a" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "funcionalidade de \"descartar de guias\" do Chrome. Isso pode resultar em" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "até 500% de economia de memória ao trabalhar com um grande número de abas." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "No entanto, isso também causará um pequeno atraso na renderização ao selecionar" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "uma guia suspensa." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Claro" + }, + "html_options_suspend_theme_dark": { + "message": "Escuro" + }, + "html_options_suspend_screen_capturing": { + "message": "Captura de tela" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Desativado" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Capture somente a parte superior da tela" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Capturar a página inteira" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Em uma guia suspensa, a extensão poderá exibir uma visualização de imagem da" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "aparência da guia bem antes de ser suspensa." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "O recurso de captura de tela é experimental e pode causar um uso significativo da CPU, bem como" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "um aumento pequeno no uso de memória." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Se você notar algum comportamento estranho, como as guias demorarem muito tempo para serem suspensas, ou se o Chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "travar inesperadamente, tente desativar esse recurso." + }, + "html_options_suspend_force_screen_capture": { + "message": "Ativar o modo de captura de tela de alta qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Quando desativada, as capturas de tela têm as seguintes limitações para auxiliar no desempenho:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Captura de tela de baixa qualidade" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Não irá capturar a tela se levar mais de 1 minuto para gerar a imagem" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- A altura máxima de captura de tela é limitada a 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Ativar o modo de captura de tela de alta qualidade pode aumentar significativamente a carga da CPU" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "e o uso de memória." + }, + "html_options_whitelist_title": { + "message": "Nunca suspender as guias com URLs da lista a seguir:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Adicione a URL de cada página que você deseja colocar na lista branca em uma nova linha. Por exemplo:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Para colocar na lista branca vários sites em uma linha, você pode especificar parte da URL:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Você também pode especificar expressões regulares colocando o texto em barras:" + }, + "html_options_whitelist_test": { + "message": "Lista branca de teste" + }, + "html_options_other_enable_context_menu": { + "message": "Adicionar The Marvellous Suspender no menu de contexto do clique do botão direito" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Adicione controles para esta extensão no menu do botão direito de uma página da web." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Isso lhe dará acesso a ações avançadas de suspensão que não estão disponíveis" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "em outro lugar na extensão." + }, + "html_options_other_enable_sync": { + "message": "Sincronizar as configurações com seu perfil do Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "As configurações de extensão serão sincronizadas em todos os navegadores Chrome que estiverem" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "conectados com o mesmo perfil." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Isso também sincronizará as configurações no modo de navegação anônima." + }, + "html_options_other_enable_sync_warning": { + "message": "Ativar essa opção substituirá as configurações de todos os outros navegadores conectados ao mesmo perfil do Chrome." + }, + "html_options_suspend_on_low_memory": { + "message": "Suspender instantaneamente quando a memória do sistema ficar muito baixa" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Essa opção substituirá a funcionalidade de descarte de guia automático do Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Se ativado, isso forçará uma guia a ser suspensa, em vez de ser descartada pelo Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Normalmente, o Chrome só irá descartar as guias quando a memória do sistema ficar muito baixa." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Observação: Isso pode fazer com que as guias sejam suspensas mais cedo do que a hora" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "especificada nas opções de suspensão de guia Automática." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Para mais informações sobre o descarte do Chrome, consulte:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Recarregar esta guia" + }, + "html_popup_suspend_tab": { + "message": "Suspender esta guia agora" + }, + "html_popup_dont_suspend_now": { + "message": "Não suspender agora" + }, + "html_popup_never_suspend_domain": { + "message": "Nunca suspender este domínio" + }, + "html_popup_never_suspend_page": { + "message": "Nunca suspender esta URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspender todas as outras guias" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Recarregar todas as outras guias" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspender as guias selecionadas" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Recarregar as guias selecionadas" + }, + "html_popup_settings": { + "message": "Configurações" + }, + "html_restoring_title": { + "message": "Restaurando janela" + }, + "html_restoring_heading": { + "message": "Restaurando abas" + }, + "html_restoring_detail": { + "message": "Por favor, aguarde enquanto eu restauro esta janela..." + }, + "html_recovery_title": { + "message": "Recuperação" + }, + "html_recovery_ruh_roh": { + "message": "Opa!" + }, + "html_recovery_description_line1": { + "message": "Parece que você está recuperando de uma falha na extensão." + }, + "html_recovery_description_line2": { + "message": "Suas guias suspensas podem ter travado ou desaparecido." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restaurar guias automaticamente" + }, + "html_recovery_go_to_session_manager": { + "message": "Ir para o gerenciador de sessões" + }, + "html_recovery_important_message": { + "message": "No momento, você está com a captura de tela ativada. Se esta extensão estiver falhando repetidamente, recomenda-se que você desative essa opção." + }, + "html_recovery_disable_screen_capturing": { + "message": "Desligue a captura de tela" + }, + "html_recovery_tabs_to_restore": { + "message": "Guias a restaurar" + }, + "html_shortcuts_title": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_shortcuts_context_menu_note": { + "message": "Nota: Essas ações também estão disponíveis através do menu de contexto do botão direito do mouse." + }, + "html_shortcuts_remap_keys": { + "message": "Alterar atalhos" + }, + "html_sidebar_general_settings": { + "message": "Configurações" + }, + "html_sidebar_session_management": { + "message": "Gerenciamento de sessões" + }, + "html_sidebar_shortcuts": { + "message": "Atalhos do teclado" + }, + "html_sidebar_support": { + "message": "Sobre" + }, + "html_success_great_success": { + "message": "Grande sucesso!" + }, + "html_success_all_tabs_restored": { + "message": "Todas as suas guias foram restauradas." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "página" + }, + "html_session_manager": { + "message": "gerenciamento de sessões" + }, + "html_suspended_title": { + "message": "Guia suspensa" + }, + "html_suspended_tab_suspended": { + "message": "Guia suspensa" + }, + "html_suspended_tab_reload": { + "message": "Recarregar guia" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Nunca suspender" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Atualize ou clique para recarregar" + }, + "html_suspended_toast_not_connected": { + "message": "Você não está conectado à Internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "O recarregamento automático de guias está temporariamente desativado." + }, + "html_permissions_title": { + "message": "Permissões" + }, + "html_permissions_heading": { + "message": "Por favor, me dê acesso a URLs de arquivos locais" + }, + "html_permissions_info": { + "message": "No momento, esta extensão não está permitida a suspender as URLs que começam com a palavra \"file\".\nPara mudar isso, ative \"Permitir acesso a URLs de arquivo\" na página de configurações da extensão." + }, + "html_permissions_backup": { + "message": "Observação: a alteração dessa opção fará com que todas as suas guias suspensas desapareçam brevemente.\nNeste caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_title": { + "message": "Atualização" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "Uma nova versão do The Marvellous Suspender está pronta para ser instalada.\nObservação: durante a atualização, suas guias suspensas desaparecerão brevemente." + }, + "html_update_info_withbackup": { + "message": "este caso, agora pode ser um bom momento para fazer um backup da sua sessão de guias atuais." + }, + "html_update_info_nobackup_prefix": { + "message": "É altamente recomendável que você exporte uma cópia de sua sessão atual de " + }, + "html_update_info_nobackup_suffix": { + "message": " antes de continuar com a atualização." + }, + "html_updated_title": { + "message": "Atualizado" + }, + "html_updating_heading": { + "message": "está atualizando" + }, + "html_updating_message": { + "message": "Por favor, aguarde enquanto eu restauro as suas guias suspensas..." + }, + "html_updated_great_suspender_updated": { + "message": "foi atualizado" + }, + "html_updated_info_line1": { + "message": "Um backup automático foi feito de suas guias antes da atualização." + }, + "html_updated_info_line2_prefix": { + "message": "Se você encontrou algum problema durante a atualização, você pode recuperar as guias perdidas da " + }, + "html_updated_info_line2_suffix": { + "message": " página." + }, + "html_updated_detail_header_prefix": { + "message": "O que há de novo em " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Novos recursos:" + }, + "html_updated_bug_fixes_header": { + "message": "Correções de bugs:" + }, + "html_updated_release_notes": { + "message": "Visite o GitHub para obter notas da versão completas: " + }, + "html_updated_patch_message": { + "message": "Desculpe pelo incômodo. Eu só precisava fazer uma pequena manutenção." + }, + "html_welcome_title": { + "message": "Bem-vindo" + }, + "html_welcome_text_line1": { + "message": "Obrigado por experimentar" + }, + "html_welcome_text_line2": { + "message": "Eu deixo seu computador funcionar sem problemas suspendendo as guias que você não está usando." + }, + "html_welcome_text_line3": { + "message": "Você pode ajustar bem as configurações abaixo." + }, + "js_popup_normal": { + "message": "A guia será suspensa automaticamente." + }, + "js_popup_normal_pause": { + "message": "Agora não" + }, + "js_popup_special": { + "message": "A guia não pôde ser suspensa" + }, + "js_popup_suspended": { + "message": "Guia suspensa" + }, + "js_popup_suspended_pause": { + "message": "Não suspender" + }, + "js_popup_whitelisted": { + "message": "Site adicionado à lista branca." + }, + "js_popup_whitelisted_remove": { + "message": "Remover da lista branca" + }, + "js_popup_audible": { + "message": "Esta guia está reproduzindo áudio." + }, + "js_popup_form_input": { + "message": "A guia está recebendo entrada de formulário." + }, + "js_popup_form_input_unpause": { + "message": "Retomar" + }, + "js_popup_pinned": { + "message": "A guia foi fixada" + }, + "js_popup_temp_whitelist": { + "message": "Suspensão de guias pausada." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Retomar" + }, + "js_popup_never": { + "message": "Suspensão automática de guias desativada." + }, + "js_popup_no_connectivity": { + "message": "Sem conexão de rede" + }, + "js_popup_charging": { + "message": "Conectado à fonte de energia" + }, + "js_popup_blockedFile": { + "message": "Arquivos locais não podem ser suspensos." + }, + "js_popup_blockedFile_enable": { + "message": "Habilitar" + }, + "js_popup_unknown": { + "message": "Aguardando a guia carregar..." + }, + "js_popup_initialising": { + "message": "Aguardando a extensão inicializar..." + }, + "js_popup_error": { + "message": "Suspensão automática indisponível para esta guia" + }, + "js_history_delete": { + "message": "excluir" + }, + "js_history_export": { + "message": "exportar" + }, + "js_history_reload": { + "message": "abrir e carregar" + }, + "js_history_resuspend": { + "message": "abrir e suspender" + }, + "js_history_save": { + "message": "salvar" + }, + "js_history_window": { + "message": "Janela" + }, + "js_history_windows": { + "message": "Windows" + }, + "js_history_tab": { + "message": "Guia" + }, + "js_history_tabs": { + "message": "Separadores" + }, + "js_history_enter_name_for_session": { + "message": "Digite um nome para esta sessão" + }, + "js_history_confirm_delete": { + "message": "Tem certeza de que deseja excluir esta sessão?" + }, + "js_history_confirm_session_overwrite": { + "message": "Já existe uma sessão salva com este nome. Sobrescrever a sessão existente?" + }, + "js_history_import_fail": { + "message": "Falha ao carregar o arquivo. Certifique-se de que o arquivo seja um texto simples e contenha uma única URL por linha." + }, + "js_history_migrate_fail": { + "message": "Necessita de id de extensão de 32 caracteres para migrar de" + }, + "js_history_migrate_success": { + "message": "Migração de $TABCOUNT$ guias com sucesso", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Remover site da lista branca" + }, + "js_suspended_hotkey_to_reload": { + "message": "Definir atalhos do teclado" + }, + "js_suspended_low_memory": { + "message": "Guia suspensa devido a baixa memória do sistema" + }, + "js_options_incognito_warning": { + "message": "Você está no modo de navegação anônima. Alguns recursos não estarão disponíveis." + }, + "js_options_whitelist_no_matches": { + "message": "Não há guias abertas que correspondam à lista branca atual." + }, + "js_options_whitelist_matches_heading": { + "message": "Guias permitidas abertas:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "e" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "mais." + }, + "js_permissions_button_export": { + "message": "Salvar backup" + }, + "js_permissions_button_set": { + "message": "Abrir configurações da extensão" + }, + "js_update_confirm": { + "message": "Você ainda não salvou um backup. Quer atualizar a extensão mesmo assim?" + }, + "js_update_button_export": { + "message": "Salvar backup" + }, + "js_update_button_reload": { + "message": "Atualizar a extensão agora" + }, + "js_shortcuts_not_set": { + "message": "não definido" + }, + "js_session_save_point": { + "message": "Ponto de salvamento automático para v" + } } diff --git a/src/_locales/ru/messages.json b/src/_locales/ru/messages.json index fc7d6e93..4733c20b 100644 --- a/src/_locales/ru/messages.json +++ b/src/_locales/ru/messages.json @@ -1,242 +1,787 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Заставь свой браузер работать быстрее, приостанавливая неактивные вкладки" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Приостановить/Возобновить активную вкладку" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Поставить на паузу/Возобновить приостановку активной вкладки" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Приостановить выбранные вкладки" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Возобновить выбранные вкладки" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Приостановить все остальные вкладки в активном окне" }, - "ext_cmd_force_suspend_active_window_description": { "message": "Принудительно приостановить все остальные вкладки в активном окне" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Возобновить все вкладки в активном окне" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Приостановить все вкладки во всех окнах" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Принудительно приостановить все вкладки во всех окнах" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Возобновить все вкладки во всех окнах" }, - "js_context_open_link_in_suspended_tab": { "message": "Открыть ссылку в новой приостановленной вкладке" }, - "js_context_toggle_suspend_state": { "message": "Приостановить/Возобновить эту вкладку" }, - "js_context_toggle_pause_suspension": { "message": "Поставить на паузу/Возобновить приостановку этой вкладки" }, - "js_context_never_suspend_domain": { "message": "Никогда не приостанавливать этот домен" }, - "js_context_never_suspend_page": { "message": "Никогда не приостанавливать этот URL" }, - "js_context_suspend_selected_tabs": { "message": "Приостановить выбранные вкладки" }, - "js_context_unsuspend_selected_tabs": { "message": "Возобновить выбранные вкладки" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Приостановить все остальные вкладки в этом окне" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Принудительно приостановить все остальные вкладки в этом окне" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Возобновить все вкладки в этом окне" }, - "js_context_soft_suspend_all_tabs": { "message": "Приостановить все вкладки во всех окнах" }, - "js_context_force_suspend_all_tabs": { "message": "Принудительно приостановить все вкладки во всех окнах" }, - "js_context_unsuspend_all_tabs": { "message": "Возобновить все вкладки во всех окнах" }, - "html_about_title": { "message": "О расширении" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "Связаться с нами или сообщить о баге можно на" }, - "html_about_report_issues_suffix": { "message": ". Пожалуйста, убедитесь, что Ваша идея или предложение не были опубликованы ранее. Спасибо!" }, - "html_about_debugging_prefix": { "message": "Чтобы включить ведение журнала или установить флаги отладки, перейдите на " }, - "html_about_debugging_suffix": { "message": "страницу отладки." }, - "html_about_the_github_issues_page": { "message": "странице предложений GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Это расширение использует" }, - "html_about_html2canvas_suffix": { "message": "библиотеку Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "Также используется " }, - "html_about_indexedDb_suffix": { "message": "обёртка для indexedDb от Aaron Powell." }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Отдельное спасибо" }, - "html_about_browserstack_suffix": { "message": "за бесплатные средства отладки Chrome." }, - "html_history_title": { "message": "Управление сессиями" }, - "html_history_current_session": { "message": "Текущая сессия" }, - "html_history_recent_sessions": { "message": "Предыдущие сессии" }, - "html_history_saved_sessions": { "message": "Сохранённые сессии" }, - "html_history_import_session": { "message": "Импорт сессии" }, - "html_notice_title": { "message": "Уведомление" }, - "html_notice_important_notice": { "message": "Важное уведомление от The Great Suspender" }, - "html_options_title": { "message": "Настройки" }, - "html_options_suspend_title": { "message": "Автоматическая приостановка вкладок" }, - "html_options_suspended_title": { "message": "Приостановленные вкладки" }, - "html_options_other_title": { "message": "Прочее" }, - "html_options_suspend_automatically_after": { "message": "Автоматически приостанавливать вкладки после" }, - "html_options_suspend_never": { "message": "никогда" }, - "html_options_suspend_seconds": { "message": "секунд" }, - "html_options_suspend_minute": { "message": "минуты" }, - "html_options_suspend_minutes": { "message": "минут" }, - "html_options_suspend_hour": { "message": "часа" }, - "html_options_suspend_hours": { "message": "часов" }, - "html_options_suspend_day": { "message": "дня" }, - "html_options_suspend_days": { "message": "дней" }, - "html_options_suspend_week": { "message": "недели" }, - "html_options_suspend_weeks": { "message": "недель" }, - "html_options_suspend_no_pinned": { "message": "Никогда не приостанавливать закреплённые вкладки" }, - "html_options_suspend_no_forms": { "message": "Никогда не приостанавливать вкладки с несохранёнными полями ввода" }, - "html_options_suspend_no_audio": { "message": "Никогда не приостанавливать вкладки с проигрывающимся аудио" }, - "html_options_suspend_only_connected": { "message": "Никогда не приостанавливать вкладки в режиме оффлайн" }, - "html_options_suspend_only_on_battery": { "message": "Никогда не приостанавливать вкладки, когда подключён источник питания" }, - "html_options_suspend_no_active_tabs": { "message": "Никогда не приостанавливать активную вкладку в каждом окне" }, - "html_options_suspend_automatically_unsuspend": { "message": "Автоматически возобновлять приостановленную вкладку при переходе на неё" }, - "html_options_suspend_discard_after_suspend": { "message": "Использовать встроенный в Chrome механизм экономии памяти для приостановленных вкладок" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Ещё больше уменьшает потребление памяти для приостановленных вкладок, используя" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "встроенный в Chrome механизм выгрузки вкладок. Это позволит уменьшить" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "потребление памяти до 500% (при работе с большим количеством вкладок)." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "Однако, это может привести к небольшой задержке прорисовки приостановленной" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "вкладки при переходе на неё." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": {"message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:"}, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "Тема" }, - "html_options_suspend_theme_light": { "message": "Светлая" }, - "html_options_suspend_theme_dark": { "message": "Тёмная" }, - "html_options_suspend_screen_capturing": { "message": "Скриншот страницы" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Отключено" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Захватывать только верх страницы" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Захватывать всю страницу" }, - "html_options_suspend_screen_capturing_tooltip_line1a": {"message": "На приостановленной вкладке расширение будет отображать скриншот страницы"}, - "html_options_suspend_screen_capturing_tooltip_line1b": {"message": "до её приостановки." }, - "html_options_suspend_screen_capturing_tooltip_line2a": {"message": "Скриншот страницы является экспериментальной функцией и может привести к значительной"}, - "html_options_suspend_screen_capturing_tooltip_line2b": {"message": "нагрузке на процессор, а также к повышенному потреблению памяти." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Если Вы заметили странное поведение, например, долгую приостановку вкладки или" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "внезапные вылеты Chrome, попробуйте отключить эту функцию." }, - "html_options_suspend_force_screen_capture": { "message": "Использовать более высокое качество скриншотов страниц" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Когда отключено, снимки экрана имеют следующие ограничения:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": {"message": "- Низкое качество скриншота страницы"}, - "html_options_suspend_force_screen_capture_tooltip_line4": {"message": "- Скриншота страницы не будет, если для генерации изображения требуется более 1 минуты"}, - "html_options_suspend_force_screen_capture_tooltip_line5": {"message": "- Максимальная высота скриншота страницы 5000px"}, - "html_options_suspend_force_screen_capture_tooltip_line6": {"message": "Использование скриншотов страниц высокого качества может значительно увеличить"}, - "html_options_suspend_force_screen_capture_tooltip_line7": {"message": "нагрузку на процессор и потребление памяти." }, - "html_options_whitelist_title": { "message": "Никогда не приостанавливать вкладки с URL-адресами из следующего списка:" }, - "html_options_whitelist_tooltip_line1": {"message": "Добавьте URL-адрес каждой страницы, которую Вы хотите добавить в белый список, например:"}, - "html_options_whitelist_tooltip_line2": {"message": "Чтобы не перечислять несколько сайтов, Вы можете указать совпадающую часть URL:"}, - "html_options_whitelist_tooltip_line3": {"message": "Вы также можете использовать регулярные выражения, используя в тексте косые черты:"}, - "html_options_whitelist_test": { "message": "Протестировать белый список" }, - "html_options_other_enable_context_menu": {"message": "Добавить The Great Suspender в контекстное меню правой кнопки мыши"}, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Добавить элементы управления для этого расширения в контекстное меню веб-страницы." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Это даст Вам доступ к дополнительным действиям с вкладками, которые" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "недоступны в другом месте расширения." }, - "html_options_other_enable_sync": { "message": "Синхронизировать настройки с Вашим профилем Chrome" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "Настройки расширения будут синхронизированы с Вашим профилем между" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "всеми браузерами Chrome." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Также синхронизирует настройки в режиме инкогнито." }, - "html_options_other_enable_sync_warning": { "message": "Включение этой опции приведет к перезаписыванию настроек расширения для Вашего профиля между всеми браузерами Chrome" }, - "html_options_suspend_on_low_memory": { "message": "Приостанавливать вкладки при нехватке системной памяти" }, - "html_options_suspend_on_low_memory_tooltip_line1": {"message": "Этот параметр заменяет встроенный в Chrome механизм выгрузки вкладок." }, - "html_options_suspend_on_low_memory_tooltip_line2": {"message": "Если включено, вкладка будет принудительно приостанавливаться, вместо использования механизма выгрузки Chrome." }, - "html_options_suspend_on_low_memory_tooltip_line3": {"message": "Как правило, Chrome выгружает вкладки, только когда системной памяти остаётся очень мало." }, - "html_options_suspend_on_low_memory_tooltip_line4": {"message": "Обратите внимание: это может привести к приостановке вкладок раньше, чем выбрано"}, - "html_options_suspend_on_low_memory_tooltip_line5": {"message": "в настройке \"Автоматически приостанавливать вкладки после\"." }, - "html_options_suspend_on_low_memory_tooltip_line6": {"message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:"}, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "Возобновить эту вкладку" }, - "html_popup_suspend_tab": { "message": "Приостановить эту вкладку" }, - "html_popup_dont_suspend_now": { "message": "Не приостанавливать" }, - "html_popup_never_suspend_domain": { "message": "Никогда не приостанавливать этот домен" }, - "html_popup_never_suspend_page": { "message": "Никогда не приостанавливать этот URL" }, - "html_popup_suspend_other_tabs": { "message": "Приостановить все остальные вкладки" }, - "html_popup_unsuspend_all_tabs": { "message": "Возобновить все вкладки" }, - "html_popup_suspend_selected_tabs": { "message": "Приостановить выбранные вкладки" }, - "html_popup_unsuspend_selected_tabs": { "message": "Возобновить выбранные вкладки" }, - "html_popup_settings": { "message": "Настройки" }, - "html_restoring_title": { "message": "Восстановление окна" }, - "html_restoring_heading": { "message": "Восстановление вкладок" }, - "html_restoring_detail": { "message": "Пожалуйста, подождите, пока я восстановлю это окно..." }, - "html_recovery_title": { "message": "Восстановление" }, - "html_recovery_ruh_roh": { "message": "Ой-ой!" }, - "html_recovery_description_line1": { "message": "Кажется, расширение завершило работу некорректно." }, - "html_recovery_description_line2": { "message": "Ваши приостановленные вкладки могли пропасть." }, - "html_recovery_restore_tabs_automatically": { "message": "Автоматическое восстановление вкладок" }, - "html_recovery_go_to_session_manager": { "message": "Перейти к управлению сессиями" }, - "html_recovery_important_message": { "message": "У Вас включена функция скриншота страницы. Рекомендуется отключить её, если наблюдаются проблемы с расширением." }, - "html_recovery_disable_screen_capturing": { "message": "Выключить функцию скриншота страницы" }, - "html_recovery_tabs_to_restore": { "message": "Восстановить вкладки" }, - "html_shortcuts_title": { "message": "Горячие клавиши" }, - "html_shortcuts_keyboard_shortcuts": { "message": "Горячие клавиши" }, - "html_shortcuts_context_menu_note": { "message": "Примечание: эти действия также доступны из контекстного меню правой кнопки мыши." }, - "html_shortcuts_remap_keys": { "message": "Изменить горячие клавиши" }, - "html_sidebar_general_settings": { "message": "Настройки" }, - "html_sidebar_session_management": { "message": "Управление сессиями" }, - "html_sidebar_shortcuts": { "message": "Горячие клавиши" }, - "html_sidebar_support": { "message": "О расширении" }, - "html_success_great_success": { "message": "Отлично!" }, - "html_success_all_tabs_restored": { "message": "Все Ваши вкладки были восстановлены." }, - "html_success_goto_advanced_prefix": { "message": "Более продвинутое управление сессиями доступно в разделе " }, - "html_success_goto_advanced_suffix": { "message": "" }, - "html_session_manager": { "message": "управление сессиями" }, - "html_suspended_title": { "message": "Приостановленная вкладка" }, - "html_suspended_tab_suspended": { "message": "Вкладка приостановлена" }, - "html_suspended_tab_reload": { "message": "Обновить вкладку" }, - "html_suspended_tab_whitelist_prefix": { "message": "Никогда не приостанавливать" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "Обновите или нажмите для обновления" }, - "html_suspended_toast_not_connected": { "message": "Нет подключения к интернету" }, - "html_suspended_toast_reload_disabled": { "message": "Автоматическое обновление вкладок временно отключено." }, - "html_permissions_title": { "message": "Разрешения" }, - "html_permissions_heading": { "message": "Пожалуйста, разрешите доступ к локальным файлам" }, - "html_permissions_info": { "message": "У расширения в данный момент нет разрешения приостанавливать вкладки с URL-адресами, начинающимися со слова \"file\".\nЧтобы это изменить, включите \"Разрешить открывать локальные файлы по ссылкам\" со страницы настроек расширения." }, - "html_permissions_backup": { "message": "Примечание: изменение этой опции приведет к временному исчезновению всех приостановленных вкладок.\nНа всякий случай рекомендуем сделать резервную копию вкладок текущей сессии в разделе \"Управление сессиями\"." }, - "html_update_title": { "message": "Обновление" }, - "html_update_heading2": { "message": "становится всё лучше" }, - "html_update_info": { "message": "Новая версия The Great Suspender готова к установке.\nПримечание: в процессе обновления приостановленные вкладки могут временно пропасть." }, - "html_update_info_withbackup": { "message": "На всякий случай рекомендуется сделать резервную копию вкладок текущей сессии." }, - "html_update_info_nobackup_prefix": { "message": "Рекомендуется сделать экспорт текущей сессии" }, - "html_update_info_nobackup_suffix": { "message": " перед обновлением расширения." }, - "html_updated_title": { "message": "Обновлено" }, - "html_updating_heading": { "message": "обновляется" }, - "html_updating_message": { "message": "Восстанавливаются приостановленные вкладки..." }, - "html_updated_great_suspender_updated": { "message": "успешно обновлён" }, - "html_updated_info_line1": { "message": "Перед обновлением была создана резервная копия Ваших вкладок." }, - "html_updated_info_line2_prefix": { "message": "Если во время обновления возникли проблемы, то Вы можете восстановить потерянные вкладки из резервной копии в разделе " }, - "html_updated_info_line2_suffix": { "message": "." }, - "html_updated_detail_header_prefix": { "message": "Что нового в " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_new_features_header": { "message": "Новый функционал:" }, - "html_updated_bug_fixes_header": { "message": "Исправлены баги:" }, - "html_updated_release_notes": { "message": "Прочитать на странице расширения в GitHub: " }, - "html_updated_patch_message": { "message": "Извините за беспокойство. Мне просто нужно было выполнить небольшое техобслуживание." }, - "html_welcome_title": { "message": "Добро пожаловать" }, - "html_welcome_text_line1": { "message": "Спасибо за использование" }, - "html_welcome_text_line2": { "message": "Я ускорю Ваш компьютер, приостанавливая неиспользуемые вкладки." }, - "html_welcome_text_line3": { "message": "Вы можете настроить параметры ниже." }, - "js_popup_normal": { "message": "Вкладка будет приостановлена автоматически." }, - "js_popup_normal_pause": { "message": "Не сейчас" }, - "js_popup_special": { "message": "Вкладка не может быть приостановлена" }, - "js_popup_suspended": { "message": "Вкладка приостановлена" }, - "js_popup_suspended_pause": { "message": "Не приостанавливать" }, - "js_popup_whitelisted": { "message": "Сайт добавлен в белый список." }, - "js_popup_whitelisted_remove": { "message": "Удалить из белого списка" }, - "js_popup_audible": { "message": "Вкладка проигрывает аудио." }, - "js_popup_form_input": { "message": "Вкладка имеет несохранённые поля ввода." }, - "js_popup_form_input_unpause": { "message": "Снять с паузы" }, - "js_popup_pinned": { "message": "Вкладка закреплена" }, - "js_popup_temp_whitelist": { "message": "Приостановка вкладки поставлена на паузу." }, - "js_popup_temp_whitelist_unpause": { "message": "Снять с паузы" }, - "js_popup_never": { "message": "Автоматическая приостановка вкладок отключена." }, - "js_popup_no_connectivity": { "message": "Нет соединения" }, - "js_popup_charging": { "message": "Подключено к источнику питания" }, - "js_popup_blockedFile": { "message": "Локальные файлы не могут быть приостановлены." }, - "js_popup_blockedFile_enable": { "message": "Разрешить" }, - "js_popup_unknown": { "message": "Вкладка загружается..." }, - "js_popup_initialising": { "message": "Расширение запускается..." }, - "js_popup_error": { "message": "Авто-приостановка недоступна для этой вкладки" }, - "js_history_delete": { "message": "удалить" }, - "js_history_export": { "message": "экспортировать" }, - "js_history_reload": { "message": "открыть и загрузить" }, - "js_history_resuspend": { "message": "открыть и приостановить" }, - "js_history_save": { "message": "сохранить" }, - "js_history_window": { "message": "Окно" }, - "js_history_tab": { "message": "Вкладка" }, - "js_history_plural": { "message": "" }, - "js_history_enter_name_for_session": { "message": "Введите имя для сессии" }, - "js_history_confirm_delete": { "message": "Вы точно хотите удалить эту сессию?" }, - "js_history_confirm_session_overwrite": { "message": "Сессия с таким именем уже существует. Перезаписать?" }, - "js_history_import_fail": { "message": "Ошибка при загрузке файла. Убедитесь, что это текстовый файл, и что он содержит не более одного URL-адреса в каждой строке." }, - "js_suspended_remove_from_whitelist": { "message": "Удалить сайт из белого списка" }, - "js_suspended_hotkey_to_reload": { "message": "Назначить горячие клавиши" }, - "js_suspended_low_memory": { "message": "Вкладка приостановлена из-за нехватки памяти" }, - "js_options_incognito_warning": { "message": "Вы находитесь в режиме инкогнито. Некоторые функции будут недоступны." }, - "js_options_whitelist_no_matches": { "message": "Нет открытых вкладок, подходящих под текущий белый список." }, - "js_options_whitelist_matches_heading": { "message": "Открытые вкладки, подходящие под текущий белый список:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "и" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "ещё." }, - "js_permissions_button_export": { "message": "Сохранить резервную копию" }, - "js_permissions_button_set": { "message": "Открыть настройки расширения" }, - "js_update_confirm": { "message": "Вы ещё не сделали резервную копию. Всё равно обновить?" }, - "js_update_button_export": { "message": "Сохранить резервную копию" }, - "js_update_button_reload": { "message": "Обновить расширение" }, - "js_shortcuts_not_set": { "message": "не задано" }, - "js_session_save_point": { "message": "Автоматическая точка восстановления для версии " } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Заставь свой браузер работать быстрее, приостанавливая неиспользуемые вкладки" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Приостановить/Возобновить активную вкладку" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Поставить на паузу/Возобновить приостановку активной вкладки" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Приостановить выбранные вкладки" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Возобновить выбранные вкладки" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Приостановить все остальные вкладки в активном окне" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Принудительно приостановить все остальные вкладки в активном окне" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Возобновить все вкладки в активном окне" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Приостановить все вкладки во всех окнах" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Принудительно приостановить все вкладки во всех окнах" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Возобновить все вкладки во всех окнах" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Открыть ссылку в новой приостановленной вкладке" + }, + "js_context_toggle_suspend_state": { + "message": "Приостановить/Возобновить эту вкладку" + }, + "js_context_toggle_pause_suspension": { + "message": "Поставить на паузу/Возобновить приостановку этой вкладки" + }, + "js_context_never_suspend_domain": { + "message": "Никогда не приостанавливать этот домен" + }, + "js_context_never_suspend_page": { + "message": "Никогда не приостанавливать этот URL" + }, + "js_context_suspend_selected_tabs": { + "message": "Приостановить выбранные вкладки" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Возобновить выбранные вкладки" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Приостановить все остальные вкладки в этом окне" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Принудительно приостановить все остальные вкладки в этом окне" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Возобновить все вкладки в этом окне" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Приостановить все вкладки во всех окнах" + }, + "js_context_force_suspend_all_tabs": { + "message": "Принудительно приостановить все вкладки во всех окнах" + }, + "js_context_unsuspend_all_tabs": { + "message": "Возобновить все вкладки во всех окнах" + }, + "html_about_title": { + "message": "О расширении" + }, + "html_about_fork_beginning": { + "message": "На основе оригинала" + }, + "html_about_fork_mid": { + "message": "доступно на GitHub, без рекламных трекеров" + }, + "html_about_fork_end": { + "message": ", больше информации доступно в" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Связаться с нами или сообщить о баге можно на" + }, + "html_about_report_issues_suffix": { + "message": ". Пожалуйста, убедитесь, что Ваша идея или предложение не были опубликованы ранее. Спасибо!" + }, + "html_about_debugging_prefix": { + "message": "Чтобы включить ведение журнала или установить флаги отладки, перейдите на " + }, + "html_about_debugging_suffix": { + "message": "страницу отладки." + }, + "html_about_the_github_issues_page": { + "message": "странице предложений GitHub" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Это расширение использует" + }, + "html_about_html2canvas_suffix": { + "message": "библиотеку Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Также используется " + }, + "html_about_indexedDb_suffix": { + "message": "обёртка для indexedDb от Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Отдельное спасибо" + }, + "html_about_browserstack_suffix": { + "message": "за бесплатные средства отладки Chrome." + }, + "html_about_tgs_prefix": { + "message": "Это расширение не могло бы существовать без" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "сломан" + }, + "html_broken_ruh_roh": { + "message": "Ой-ой!" + }, + "html_broken_line1": { + "message": "не удалось запустить. Возможно, вы используете несовместимую версию Chrome?" + }, + "html_broken_line2": { + "message": "Попробуйте перезапустить расширение. Если проблема не устранена, попросите помощи в" + }, + "html_broken_line2_github_page": { + "message": "Страница проекта на GitHub" + }, + "html_broken_line3": { + "message": "Вы можете восстановить потерянные вкладки из" + }, + "html_broken_line3_session_management": { + "message": "страница управления сессиями" + }, + "html_broken_button_restart_extension": { + "message": "Перезапустить расширение" + }, + "html_history_title": { + "message": "Управление сессиями" + }, + "html_history_current_session": { + "message": "Текущая сессия" + }, + "html_history_recent_sessions": { + "message": "Предыдущие сессии" + }, + "html_history_saved_sessions": { + "message": "Сохранённые сессии" + }, + "html_history_import_session": { + "message": "Импорт сессии" + }, + "html_history_migrate_tabs": { + "message": "Перенести вкладки" + }, + "html_history_migrate_old_id": { + "message": "Старый идентификатор расширения TGS" + }, + "html_notice_title": { + "message": "Уведомление" + }, + "html_notice_important_notice": { + "message": "Важное уведомление от The Marvellous Suspender" + }, + "html_options_title": { + "message": "Настройки" + }, + "html_options_suspend_title": { + "message": "Автоматическая приостановка вкладок" + }, + "html_options_suspended_title": { + "message": "Приостановленные вкладки" + }, + "html_options_other_title": { + "message": "Прочее" + }, + "html_options_suspend_automatically_after": { + "message": "Автоматически приостанавливать вкладки после" + }, + "html_options_suspend_never": { + "message": "никогда" + }, + "html_options_suspend_seconds": { + "message": "секунд" + }, + "html_options_suspend_minute": { + "message": "минуты" + }, + "html_options_suspend_minutes": { + "message": "минут" + }, + "html_options_suspend_hour": { + "message": "часа" + }, + "html_options_suspend_hours": { + "message": "часов" + }, + "html_options_suspend_day": { + "message": "дня" + }, + "html_options_suspend_days": { + "message": "дней" + }, + "html_options_suspend_week": { + "message": "недели" + }, + "html_options_suspend_weeks": { + "message": "недель" + }, + "html_options_suspend_no_pinned": { + "message": "Никогда не приостанавливать закреплённые вкладки" + }, + "html_options_suspend_no_forms": { + "message": "Никогда не приостанавливать вкладки с несохранёнными полями ввода" + }, + "html_options_suspend_no_audio": { + "message": "Никогда не приостанавливать вкладки с проигрывающимся аудио" + }, + "html_options_suspend_only_connected": { + "message": "Никогда не приостанавливать вкладки в режиме оффлайн" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Никогда не приостанавливать вкладки, когда подключён источник питания" + }, + "html_options_suspend_no_active_tabs": { + "message": "Никогда не приостанавливать активную вкладку в каждом окне" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Автоматически возобновлять приостановленную вкладку при переходе на неё" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Использовать встроенный в Chrome механизм экономии памяти для приостановленных вкладок" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Ещё больше уменьшает потребление памяти для приостановленных вкладок, используя" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "встроенный в Chrome механизм выгрузки вкладок. Это позволит уменьшить" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "потребление памяти до 500% (при работе с большим количеством вкладок)." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Однако, это может привести к небольшой задержке прорисовки приостановленной" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "вкладки при переходе на неё." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Тема" + }, + "html_options_suspend_theme_light": { + "message": "Светлая" + }, + "html_options_suspend_theme_dark": { + "message": "Тёмная" + }, + "html_options_suspend_screen_capturing": { + "message": "Скриншот страницы" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Отключено" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Захватывать только верх страницы" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Захватывать всю страницу" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "На приостановленной вкладке расширение будет отображать скриншот страницы" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "до её приостановки." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Скриншот страницы является экспериментальной функцией и может привести к значительной" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "нагрузке на процессор, а также к повышенному потреблению памяти." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Если Вы заметили странное поведение, например, долгую приостановку вкладки или" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "внезапные вылеты Chrome, попробуйте отключить эту функцию." + }, + "html_options_suspend_force_screen_capture": { + "message": "Использовать более высокое качество скриншотов страниц" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Когда отключено, снимки экрана имеют следующие ограничения:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Низкое качество скриншота страницы" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Скриншота страницы не будет, если для генерации изображения требуется более 1 минуты" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Максимальная высота скриншота страницы 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Использование скриншотов страниц высокого качества может значительно увеличить" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "нагрузку на процессор и потребление памяти." + }, + "html_options_whitelist_title": { + "message": "Никогда не приостанавливать вкладки с URL-адресами из следующего списка:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Добавьте URL-адрес каждой страницы, которую Вы хотите добавить в белый список, например:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Чтобы не перечислять несколько сайтов, Вы можете указать совпадающую часть URL:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Вы также можете использовать регулярные выражения, используя в тексте косые черты:" + }, + "html_options_whitelist_test": { + "message": "Протестировать белый список" + }, + "html_options_other_enable_context_menu": { + "message": "Добавить The Marvellous Suspender в контекстное меню правой кнопки мыши" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Добавить элементы управления для этого расширения в контекстное меню веб-страницы." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Это даст Вам доступ к дополнительным действиям с вкладками, которые" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "недоступны в другом месте расширения." + }, + "html_options_other_enable_sync": { + "message": "Синхронизировать настройки с Вашим профилем Chrome" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Настройки расширения будут синхронизированы с Вашим профилем между" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "всеми браузерами Chrome." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Также синхронизирует настройки в режиме инкогнито." + }, + "html_options_other_enable_sync_warning": { + "message": "Включение этой опции приведет к перезаписыванию настроек расширения для Вашего профиля между всеми браузерами Chrome" + }, + "html_options_suspend_on_low_memory": { + "message": "Приостанавливать вкладки при нехватке системной памяти" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Этот параметр заменяет встроенный в Chrome механизм выгрузки вкладок." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Если включено, вкладка будет принудительно приостанавливаться, вместо использования механизма выгрузки Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Как правило, Chrome выгружает вкладки, только когда системной памяти остаётся очень мало." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Обратите внимание: это может привести к приостановке вкладок раньше, чем выбрано" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "в настройке \"Автоматически приостанавливать вкладки после\"." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Для получения дополнительной информации о механизме выгрузки вкладок Chrome см.:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Возобновить эту вкладку" + }, + "html_popup_suspend_tab": { + "message": "Приостановить эту вкладку" + }, + "html_popup_dont_suspend_now": { + "message": "Не приостанавливать" + }, + "html_popup_never_suspend_domain": { + "message": "Никогда не приостанавливать этот домен" + }, + "html_popup_never_suspend_page": { + "message": "Никогда не приостанавливать этот URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Приостановить все остальные вкладки" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Возобновить все вкладки" + }, + "html_popup_suspend_selected_tabs": { + "message": "Приостановить выбранные вкладки" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Возобновить выбранные вкладки" + }, + "html_popup_settings": { + "message": "Настройки" + }, + "html_restoring_title": { + "message": "Восстановление окна" + }, + "html_restoring_heading": { + "message": "Восстановление вкладок" + }, + "html_restoring_detail": { + "message": "Пожалуйста, подождите, пока я восстановлю это окно..." + }, + "html_recovery_title": { + "message": "Восстановление" + }, + "html_recovery_ruh_roh": { + "message": "Ой-ой!" + }, + "html_recovery_description_line1": { + "message": "Кажется, расширение завершило работу некорректно." + }, + "html_recovery_description_line2": { + "message": "Ваши приостановленные вкладки могли пропасть." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Автоматическое восстановление вкладок" + }, + "html_recovery_go_to_session_manager": { + "message": "Перейти к управлению сессиями" + }, + "html_recovery_important_message": { + "message": "У Вас включена функция скриншота страницы. Рекомендуется отключить её, если наблюдаются проблемы с расширением." + }, + "html_recovery_disable_screen_capturing": { + "message": "Выключить функцию скриншота страницы" + }, + "html_recovery_tabs_to_restore": { + "message": "Восстановить вкладки" + }, + "html_shortcuts_title": { + "message": "Горячие клавиши" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Горячие клавиши" + }, + "html_shortcuts_context_menu_note": { + "message": "Примечание: эти действия также доступны из контекстного меню правой кнопки мыши." + }, + "html_shortcuts_remap_keys": { + "message": "Изменить горячие клавиши" + }, + "html_sidebar_general_settings": { + "message": "Настройки" + }, + "html_sidebar_session_management": { + "message": "Управление сессиями" + }, + "html_sidebar_shortcuts": { + "message": "Горячие клавиши" + }, + "html_sidebar_support": { + "message": "О расширении" + }, + "html_success_great_success": { + "message": "Отлично!" + }, + "html_success_all_tabs_restored": { + "message": "Все Ваши вкладки были восстановлены." + }, + "html_success_goto_advanced_prefix": { + "message": "Более продвинутое управление сессиями доступно в разделе " + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "управление сессиями" + }, + "html_suspended_title": { + "message": "Приостановленная вкладка" + }, + "html_suspended_tab_suspended": { + "message": "Вкладка приостановлена" + }, + "html_suspended_tab_reload": { + "message": "Обновить вкладку" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Никогда не приостанавливать" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Обновите или нажмите для обновления" + }, + "html_suspended_toast_not_connected": { + "message": "Нет подключения к интернету" + }, + "html_suspended_toast_reload_disabled": { + "message": "Автоматическое обновление вкладок временно отключено." + }, + "html_permissions_title": { + "message": "Разрешения" + }, + "html_permissions_heading": { + "message": "Пожалуйста, разрешите доступ к локальным файлам" + }, + "html_permissions_info": { + "message": "У расширения в данный момент нет разрешения приостанавливать вкладки с URL-адресами, начинающимися со слова \"file\".\nЧтобы это изменить, включите \"Разрешить открывать локальные файлы по ссылкам\" со страницы настроек расширения." + }, + "html_permissions_backup": { + "message": "Примечание: изменение этой опции приведет к временному исчезновению всех приостановленных вкладок.\nНа всякий случай рекомендуем сделать резервную копию вкладок текущей сессии в разделе \"Управление сессиями\"." + }, + "html_update_title": { + "message": "Обновление" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "Новая версия The Marvellous Suspender готова к установке.\nПримечание: в процессе обновления приостановленные вкладки могут временно пропасть." + }, + "html_update_info_withbackup": { + "message": "На всякий случай рекомендуется сделать резервную копию вкладок текущей сессии." + }, + "html_update_info_nobackup_prefix": { + "message": "Рекомендуется сделать экспорт текущей сессии" + }, + "html_update_info_nobackup_suffix": { + "message": " перед обновлением расширения." + }, + "html_updated_title": { + "message": "Обновлено" + }, + "html_updating_heading": { + "message": "обновляется" + }, + "html_updating_message": { + "message": "Восстанавливаются приостановленные вкладки..." + }, + "html_updated_great_suspender_updated": { + "message": "успешно обновлён" + }, + "html_updated_info_line1": { + "message": "Перед обновлением была создана резервная копия Ваших вкладок." + }, + "html_updated_info_line2_prefix": { + "message": "Если во время обновления возникли проблемы, то Вы можете восстановить потерянные вкладки из резервной копии в разделе " + }, + "html_updated_info_line2_suffix": { + "message": "." + }, + "html_updated_detail_header_prefix": { + "message": "Что нового в " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Новый функционал:" + }, + "html_updated_bug_fixes_header": { + "message": "Исправлены баги:" + }, + "html_updated_release_notes": { + "message": "Прочитать на странице расширения в GitHub: " + }, + "html_updated_patch_message": { + "message": "Извините за беспокойство. Мне просто нужно было выполнить небольшое техобслуживание." + }, + "html_welcome_title": { + "message": "Добро пожаловать" + }, + "html_welcome_text_line1": { + "message": "Спасибо за использование" + }, + "html_welcome_text_line2": { + "message": "Я ускорю Ваш компьютер, приостанавливая неиспользуемые вкладки." + }, + "html_welcome_text_line3": { + "message": "Вы можете настроить параметры ниже." + }, + "js_popup_normal": { + "message": "Вкладка будет приостановлена автоматически." + }, + "js_popup_normal_pause": { + "message": "Не сейчас" + }, + "js_popup_special": { + "message": "Вкладка не может быть приостановлена" + }, + "js_popup_suspended": { + "message": "Вкладка приостановлена" + }, + "js_popup_suspended_pause": { + "message": "Не приостанавливать" + }, + "js_popup_whitelisted": { + "message": "Сайт добавлен в белый список." + }, + "js_popup_whitelisted_remove": { + "message": "Удалить из белого списка" + }, + "js_popup_audible": { + "message": "Вкладка проигрывает аудио." + }, + "js_popup_form_input": { + "message": "Вкладка имеет несохранённые поля ввода." + }, + "js_popup_form_input_unpause": { + "message": "Снять с паузы" + }, + "js_popup_pinned": { + "message": "Вкладка закреплена" + }, + "js_popup_temp_whitelist": { + "message": "Приостановка вкладки поставлена на паузу." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Снять с паузы" + }, + "js_popup_never": { + "message": "Автоматическая приостановка вкладок отключена." + }, + "js_popup_no_connectivity": { + "message": "Нет соединения" + }, + "js_popup_charging": { + "message": "Подключено к источнику питания" + }, + "js_popup_blockedFile": { + "message": "Локальные файлы не могут быть приостановлены." + }, + "js_popup_blockedFile_enable": { + "message": "Разрешить" + }, + "js_popup_unknown": { + "message": "Вкладка загружается..." + }, + "js_popup_initialising": { + "message": "Расширение запускается..." + }, + "js_popup_error": { + "message": "Авто-приостановка недоступна для этой вкладки" + }, + "js_history_delete": { + "message": "удалить" + }, + "js_history_export": { + "message": "экспортировать" + }, + "js_history_reload": { + "message": "открыть и загрузить" + }, + "js_history_resuspend": { + "message": "открыть и приостановить" + }, + "js_history_save": { + "message": "сохранить" + }, + "js_history_window": { + "message": "Окно" + }, + "js_history_windows": { + "message": "Окна" + }, + "js_history_tab": { + "message": "Вкладка" + }, + "js_history_tabs": { + "message": "Вкладки" + }, + "js_history_enter_name_for_session": { + "message": "Введите имя для сессии" + }, + "js_history_confirm_delete": { + "message": "Вы точно хотите удалить эту сессию?" + }, + "js_history_confirm_session_overwrite": { + "message": "Сессия с таким именем уже существует. Перезаписать?" + }, + "js_history_import_fail": { + "message": "Ошибка при загрузке файла. Убедитесь, что это текстовый файл, и что он содержит не более одного URL-адреса в каждой строке." + }, + "js_history_migrate_fail": { + "message": "Для миграции требуется 32-символьный идентификатор расширения" + }, + "js_history_migrate_success": { + "message": "Успешно перенесено $TABCOUNT$ вкладок", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Удалить сайт из белого списка" + }, + "js_suspended_hotkey_to_reload": { + "message": "Назначить горячие клавиши" + }, + "js_suspended_low_memory": { + "message": "Вкладка приостановлена из-за нехватки памяти" + }, + "js_options_incognito_warning": { + "message": "Вы находитесь в режиме инкогнито. Некоторые функции будут недоступны." + }, + "js_options_whitelist_no_matches": { + "message": "Нет открытых вкладок, подходящих под текущий белый список." + }, + "js_options_whitelist_matches_heading": { + "message": "Открытые вкладки, подходящие под текущий белый список:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "и" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "ещё." + }, + "js_permissions_button_export": { + "message": "Сохранить резервную копию" + }, + "js_permissions_button_set": { + "message": "Открыть настройки расширения" + }, + "js_update_confirm": { + "message": "Вы ещё не сделали резервную копию. Всё равно обновить?" + }, + "js_update_button_export": { + "message": "Сохранить резервную копию" + }, + "js_update_button_reload": { + "message": "Обновить расширение" + }, + "js_shortcuts_not_set": { + "message": "не задано" + }, + "js_session_save_point": { + "message": "Автоматическая точка восстановления для версии " + } } diff --git a/src/_locales/si-LK/messages.json b/src/_locales/si-LK/messages.json new file mode 100644 index 00000000..b22c83b3 --- /dev/null +++ b/src/_locales/si-LK/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "ඔබ භාවිතා නොකරන ටැබ් අත්හිටුවීමෙන් ඔබේ පරිගණකය සුමටව ක්‍රියාත්මක වීමට සලස්වන්න" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "සක්‍රීය ටැබය අත්හිටුවීම/අවලංගු කිරීම" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "සක්‍රිය ටැබයේ විරාමය/විරාමය අත්හිටුවීම" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "තෝරාගත් ටැබ් අත්හිටුවන්න" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "තෝරාගත් ටැබ් අත්හිටුවීම ඉවත් කරන්න" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "සක්‍රිය කවුළුවේ අනෙකුත් සියලුම ටැබ් අත්හිටුවන්න" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "සක්‍රිය කවුළුව තුළ අනෙකුත් සියලුම ටැබ් අත්හිටුවීමට බල කරන්න" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "සක්‍රිය කවුළුවේ ඇති සියලුම ටැබ් අත්හිටුවන්න" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "සියලුම කවුළු වල සියලුම ටැබ් අත්හිටුවන්න" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "සියලුම කවුළු වල සියලුම ටැබ් බලහත්කාරයෙන් අත්හිටුවන්න" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "සියලුම කවුළු වල සියලුම ටැබ් අත්හිටුවන්න" + }, + "js_context_open_link_in_suspended_tab": { + "message": "නව අත්හිටුවන ලද පටිත්තෙහි සබැඳිය විවෘත කරන්න" + }, + "js_context_toggle_suspend_state": { + "message": "මෙම ටැබය අත්හිටුවීම/අවලංගු කිරීම" + }, + "js_context_toggle_pause_suspension": { + "message": "මෙම ටැබයේ අත්හිටුවීම විරාම/විරාම කිරීම" + }, + "js_context_never_suspend_domain": { + "message": "මෙම වසම කිසිවිටක අත්හිටුවන්න එපා" + }, + "js_context_never_suspend_page": { + "message": "මෙම URL එක කිසිවිටක අත්හිටුවන්න එපා" + }, + "js_context_suspend_selected_tabs": { + "message": "තෝරාගත් ටැබ් අත්හිටුවන්න" + }, + "js_context_unsuspend_selected_tabs": { + "message": "තෝරාගත් ටැබ් අත්හිටුවීම ඉවත් කරන්න" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "මෙම කවුළුවේ අනෙකුත් සියලුම ටැබ් අත්හිටුවන්න" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "මෙම කවුළුවේ අනෙකුත් සියලුම ටැබ් අත්හිටුවීමට බල කරන්න" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "මෙම කවුළුවේ ඇති සියලුම ටැබ් අත්හිටුවන්න" + }, + "js_context_soft_suspend_all_tabs": { + "message": "සියලුම කවුළු වල සියලුම ටැබ් අත්හිටුවන්න" + }, + "js_context_force_suspend_all_tabs": { + "message": "සියලුම කවුළු වල සියලුම ටැබ් බලහත්කාරයෙන් අත්හිටුවන්න" + }, + "js_context_unsuspend_all_tabs": { + "message": "සියලුම කවුළු වල සියලුම ටැබ් අත්හිටුවන්න" + }, + "html_about_title": { + "message": "පිළිබඳව" + }, + "html_about_fork_beginning": { + "message": "මුල් පිටපත මත පදනම්ව" + }, + "html_about_fork_mid": { + "message": "ADS ලුහුබැඳීමකින් තොරව GitHub මත තිබේ" + }, + "html_about_fork_end": { + "message": ", වැඩි විස්තර ලබා ගත හැක" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "ඔබට ප්‍රතිපෝෂණ තිබේ නම් හෝ ගැටලුවක් වාර්තා කිරීමට කැමති නම්, ඔබට එය කළ හැක" + }, + "html_about_report_issues_suffix": { + "message": ". කරුණාකර නව එකක් සෑදීමට පෙර ඔබේ අදහස හෝ ගැටලුව දැනටමත් තිබේදැයි පරීක්ෂා කරන්න. ස්තුතියි!" + }, + "html_about_debugging_prefix": { + "message": "ලොග් වීම සබල කිරීමට හෝ නිදොස් කිරීමේ කොඩි සැකසීමට, වෙත යන්න " + }, + "html_about_debugging_suffix": { + "message": "දෝශ නිරාකරණ පිටුව." + }, + "html_about_the_github_issues_page": { + "message": "GitHub නිකුතු පිටුව" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "මෙම දිගුව භාවිතා කරයි" + }, + "html_about_html2canvas_suffix": { + "message": "Niklas von Hertzen විසින් ලියන ලද පුස්තකාලය." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "එය indexedDb wrapper ද භාවිතා කරයි" + }, + "html_about_indexedDb_suffix": { + "message": "Aaron Powell විසින් ලියන ලද්දකි." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "ඔබටත් ස්තුතියි" + }, + "html_about_browserstack_suffix": { + "message": "නොමිලේ chrome පරීක්ෂණ මෙවලම් සැපයීම සඳහා." + }, + "html_about_tgs_prefix": { + "message": "මෙම දිගුව නොමැතිව කිසිදා පැවතිය නොහැක" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "කැඩිලා" + }, + "html_broken_ruh_roh": { + "message": "රුහ් රොහ්!" + }, + "html_broken_line1": { + "message": "ආරම්භ කිරීමට අසමත් විය. සමහර විට ඔබ Chrome හි නොගැලපෙන අනුවාදයක් භාවිතා කරනවාද?" + }, + "html_broken_line2": { + "message": "දිගුව නැවත ආරම්භ කිරීමට උත්සාහ කරන්න. ගැටලුව දිගටම පවතින්නේ නම්, උදව් සඳහා විමසන්න" + }, + "html_broken_line2_github_page": { + "message": "GitHub ව්‍යාපෘති පිටුව" + }, + "html_broken_line3": { + "message": "ඔබට නැතිවූ ටැබ් නැවත ලබා ගත හැක" + }, + "html_broken_line3_session_management": { + "message": "සැසි කළමනාකරණ පිටුව" + }, + "html_broken_button_restart_extension": { + "message": "දිගුව නැවත ආරම්භ කරන්න" + }, + "html_history_title": { + "message": "සැසි කළමනාකරණය" + }, + "html_history_current_session": { + "message": "වත්මන් සැසිය" + }, + "html_history_recent_sessions": { + "message": "මෑත සැසි" + }, + "html_history_saved_sessions": { + "message": "සුරැකි සැසි" + }, + "html_history_import_session": { + "message": "වාරය ආයාතය" + }, + "html_history_migrate_tabs": { + "message": "පටිති සංක්‍රමණය" + }, + "html_history_migrate_old_id": { + "message": "පරණ TGS දිගුවේ හැඬු." + }, + "html_notice_title": { + "message": "දැන්වීම" + }, + "html_notice_important_notice": { + "message": "The Marvelous Suspender වෙතින් වැදගත් දැනුම්දීමක්" + }, + "html_options_title": { + "message": "සැකසුම්" + }, + "html_options_suspend_title": { + "message": "ස්වයංක්‍රීය පටිති ආරම්භය" + }, + "html_options_suspended_title": { + "message": "ඇතිවූ පටිති" + }, + "html_options_other_title": { + "message": "වෙනත්" + }, + "html_options_suspend_automatically_after": { + "message": "පසුව ස්වයංක්‍රීයව පටිතින්න" + }, + "html_options_suspend_never": { + "message": "කවදාවත්" + }, + "html_options_suspend_seconds": { + "message": "තත්පර" + }, + "html_options_suspend_minute": { + "message": "විනාඩිය" + }, + "html_options_suspend_minutes": { + "message": "විනාඩි" + }, + "html_options_suspend_hour": { + "message": "පැය" + }, + "html_options_suspend_hours": { + "message": "පැය" + }, + "html_options_suspend_day": { + "message": "දිනය" + }, + "html_options_suspend_days": { + "message": "දින" + }, + "html_options_suspend_week": { + "message": "සතිය" + }, + "html_options_suspend_weeks": { + "message": "සති" + }, + "html_options_suspend_no_pinned": { + "message": "ඇමුණූ පටිතින්න එපා" + }, + "html_options_suspend_no_forms": { + "message": "නොසුරකින ලද ආකෘති ආදාන අඩංගු ටැබ් කිසිවිටෙක අත්හිටුවන්න එපා" + }, + "html_options_suspend_no_audio": { + "message": "ශ්‍රව්‍ය වාදනය කරන ටැබ් කිසිවිටෙක අත්හිටුවන්න එපා" + }, + "html_options_suspend_only_connected": { + "message": "නොබැඳි විට කිසිවිටෙක ටැබ් අත්හිටුවන්න එපා" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "බල ප්‍රභවයට සම්බන්ධ වූ විට කිසිවිටක ටැබ් අත්හිටුවන්න එපා" + }, + "html_options_suspend_no_active_tabs": { + "message": "සෑම කවුළුවකම සක්‍රිය ටැබය කිසිවිටෙක අත්හිටුවන්න එපා" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "ටැබ් එක බලන විට ස්වයංක්‍රීයව අත්හිටුවීම ඉවත් කරන්න" + }, + "html_options_suspend_discard_after_suspend": { + "message": "අත්හිටුවන විට Chrome හි බිල්ට් මතකය ඉතිරි කිරීම යොදන්න" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "භාවිතය මගින් අත්හිටුවන ලද ටැබ් එකක මතක භාවිතය තවත් අඩු කරයි" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome හි ඇති 'ටැබ් ඉවතලන' ක්‍රියාකාරීත්වය. මෙය ඉහළ යාමට හේතු විය හැක" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "ටැබ් විශාල සංඛ්‍යාවක් සමඟ වැඩ කරන විට 500% මතක ඉතිරියක් දක්වා." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "කෙසේ වෙතත්, එය තෝරාගැනීමේදී සුළු විදැහුම් ප්‍රමාදයක් ද ඇති කරයි" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "අත්හිටුවන ලද ටැබ් එකක්." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Chrome ඉවතලීම පිළිබඳ වැඩි විස්තර සඳහා බලන්න:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "ප්රධාන" + }, + "html_options_suspend_theme_light": { + "message": "දීප්ත" + }, + "html_options_suspend_theme_dark": { + "message": "අඳුරු" + }, + "html_options_suspend_screen_capturing": { + "message": "තිර අල්ලා ගැනීම" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "අබල කර ඇත" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "තිරයේ ඉහළ කොටස පමණක් ග්‍රහණය කරන්න" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "සම්පූර්ණ පිටුව ග්‍රහණය කරන්න" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "අත්හිටුවන ලද පටිත්තක, දිගුවට ටැබ් එකෙහි රූප පෙරදසුනක් පෙන්විය හැක" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "එය අත්හිටුවීමට පෙර මෙන් දිස් විය." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "තිර ග්‍රහණය කිරීමේ විශේෂාංගය පර්යේෂණාත්මක වන අතර සැලකිය යුතු CPU භාවිතයක් ඇති කළ හැක" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "මෙන්ම මතක භාවිතය තරමක් වැඩි විය." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "ටැබ් අත්හිටුවීමට දිගු කාලයක් ගත වීම හෝ ක්‍රෝම් වැනි අමුතු හැසිරීම් ඔබ දුටුවහොත්" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "අනපේක්ෂිත ලෙස බිඳ වැටීම, මෙම විශේෂාංගය අක්‍රිය කිරීමට උත්සාහ කරන්න." + }, + "html_options_suspend_force_screen_capture": { + "message": "උසස් තත්ත්වයේ තිර ග්‍රහණ මාදිලිය සබල කරන්න" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "අබල කළ විට, කාර්ය සාධනය සඳහා සහාය වීමට තිර ග්‍රහණවලට පහත සීමාවන් ඇත:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- අඩු ගුණාත්මක තිර ග්රහණය" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- රූපය ජනනය කිරීමට මිනිත්තු 1 කට වඩා ගත වුවහොත් තිරය ග්‍රහණය නොකරයි" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- තිර ග්‍රහණයේ උපරිම උස 5000px ට සීමා වේ" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "උසස් තත්ත්වයේ තිර ග්‍රහණ මාදිලිය සක්‍රීය කිරීම CPU භාරය සැලකිය යුතු ලෙස වැඩි කළ හැක" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "සහ මතකය භාවිතය." + }, + "html_options_whitelist_title": { + "message": "පහත ලැයිස්තුවෙන් URL සහිත ටැබ් කිසි විටෙකත් අත්හිටුවන්න එපා:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "ඔබට නව පේළියක සුදු ලැයිස්තු කිරීමට අවශ්‍ය සෑම පිටුවකම URL එක් කරන්න. උදාහරණ වශයෙන්:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "එක් පේළියක අඩවි කිහිපයක් සුදු ලැයිස්තු කිරීමට ඔබට ඒ වෙනුවට url හි කොටසක් සඳහන් කළ හැක:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "ඔබට පෙළ ඉදිරියට slashs තුළට ඇතුළත් කිරීමෙන් සාමාන්‍ය ප්‍රකාශන ද නියම කළ හැක:" + }, + "html_options_whitelist_test": { + "message": "පරීක්ෂණ සුදු ලැයිස්තුව" + }, + "html_options_other_enable_context_menu": { + "message": "සන්දර්භය මෙනුව දකුණු-ක්ලික් කිරීමට පුදුමාකාර අත්හිටුවීම එක් කරන්න" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "වෙබ් පිටුවක දකුණු ක්ලික් මෙනුවට මෙම දිගුව සඳහා පාලන එක් කරන්න." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "මෙය ඔබට ලබා ගත නොහැකි උසස් අත්හිටුවීමේ ක්‍රියා වෙත ප්‍රවේශය ලබා දෙනු ඇත" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "දිගුවේ වෙනත් තැනක." + }, + "html_options_other_enable_sync": { + "message": "ඔබගේ Chrome පැතිකඩ සමඟ සැකසීම් සමමුහුර්ත කරන්න" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "සියලුම ක්‍රෝම් බ්‍රව්සර් හරහා දිගු සැකසීම් සමමුහුර්ත කෙරේ" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "එකම පැතිකඩකින් ලොග් වී ඇත." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "මෙය අප්‍රකට මාදිලියේ සිටුවම් ද සමමුහුර්ත කරයි." + }, + "html_options_other_enable_sync_warning": { + "message": "මෙය ක්‍රියාත්මක කිරීමෙන් එකම ක්‍රෝම් පැතිකඩට ලොග් වී ඇති අනෙකුත් සියලුම බ්‍රවුසරවල සිටුවම් උඩින් ලියවේ" + }, + "html_options_suspend_on_low_memory": { + "message": "පද්ධති මතකය ඉතා අඩු වූ විට ක්ෂණිකව අත්හිටුවන්න" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "මෙම විකල්පය Chrome හි ස්වයංක්‍රීය ටැබ් ඉවතලන ක්‍රියාකාරීත්වය අභිබවා යයි." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "සබල කර ඇත්නම්, එය Chrome විසින් ඉවත දමනු වෙනුවට ටැබයක් අත්හිටුවීමට බල කරයි." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "සාමාන්‍යයෙන්, පද්ධති මතකය ඉතා අඩු වූ පසු Chrome විසින් ටැබ් ඉවතලනු ඇත." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "කරුණාකර සටහන් කරන්න: මෙය ඔබට ඇති කාලයට වඩා කලින් ටැබ් අත්හිටුවීමට හේතු විය හැක" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "ස්වයංක්‍රීය ටැබ් අත්හිටුවීමේ විකල්පවල දක්වා ඇත." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Chrome ඉවතලීම පිළිබඳ වැඩි විස්තර සඳහා බලන්න:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "මෙම ටැබය අත්හිටුවීම ඉවත් කරන්න" + }, + "html_popup_suspend_tab": { + "message": "මෙම ටැබය දැන් අත්හිටුවන්න" + }, + "html_popup_dont_suspend_now": { + "message": "දැනට පවතින්න එපා" + }, + "html_popup_never_suspend_domain": { + "message": "මෙම වසම කිසිවිටක අත්හිටුවන්න එපා" + }, + "html_popup_never_suspend_page": { + "message": "මෙම URL එක කිසිවිටක අත්හිටුවන්න එපා" + }, + "html_popup_suspend_other_tabs": { + "message": "අනෙකුත් සියලුම ටැබ් අත්හිටුවන්න" + }, + "html_popup_unsuspend_all_tabs": { + "message": "සියලුම ටැබ් අත්හිටුවීම ඉවත් කරන්න" + }, + "html_popup_suspend_selected_tabs": { + "message": "තෝරාගත් ටැබ් අත්හිටුවන්න" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "තෝරාගත් ටැබ් අත්හිටුවීම ඉවත් කරන්න" + }, + "html_popup_settings": { + "message": "සැකසුම්" + }, + "html_restoring_title": { + "message": "කවුළුව ප්‍රත්‍යර්පණය ස්ථානයේ" + }, + "html_restoring_heading": { + "message": "ටැබ් ප්‍රතිසාධනය කිරීම" + }, + "html_restoring_detail": { + "message": "මම මෙම කවුළුව ප්‍රතිසාධනය කරන තෙක් කරුණාකර රැඳී සිටින්න..." + }, + "html_recovery_title": { + "message": "ප්‍රතිසාධනය" + }, + "html_recovery_ruh_roh": { + "message": "රුහ් රොහ්!" + }, + "html_recovery_description_line1": { + "message": "ඔබ දිගු බිඳ වැටීමකින් සුවය ලබන බවක් පෙනේ." + }, + "html_recovery_description_line2": { + "message": "ඔබගේ අත්හිටුවන ලද ටැබ් බිඳ වැටීමට හෝ අතුරුදහන් වී තිබිය හැක." + }, + "html_recovery_restore_tabs_automatically": { + "message": "ටැබ් ස්වයංක්‍රීයව ප්‍රතිසාධනය කරන්න" + }, + "html_recovery_go_to_session_manager": { + "message": "සැසි කළමනාකරු වෙත යන්න" + }, + "html_recovery_important_message": { + "message": "ඔබ දැනට තිර ග්‍රහණ ක්‍රියාත්මක කර ඇත. මෙම දිගුව නැවත නැවතත් බිඳ වැටෙන්නේ නම්, මෙම විකල්පය අක්‍රිය කිරීම නිර්දේශ කෙරේ." + }, + "html_recovery_disable_screen_capturing": { + "message": "තිර ග්‍රහණය අක්‍රිය කරන්න" + }, + "html_recovery_tabs_to_restore": { + "message": "ප්‍රතිසාධනය කිරීමට ටැබ්" + }, + "html_shortcuts_title": { + "message": "යතුරුපුවරුවේ කෙටිමං" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "යතුරුපුවරුවේ කෙටිමං" + }, + "html_shortcuts_context_menu_note": { + "message": "සටහන: මෙම ක්‍රියා දකුණු ක්ලික් සන්දර්භය මෙනුව හරහා ද ලබා ගත හැකිය." + }, + "html_shortcuts_remap_keys": { + "message": "කෙටිමං වෙනස් කරන්න" + }, + "html_sidebar_general_settings": { + "message": "සැකසුම්" + }, + "html_sidebar_session_management": { + "message": "සැසි කළමනාකරණය" + }, + "html_sidebar_shortcuts": { + "message": "යතුරුපුවරු කෙටිමං" + }, + "html_sidebar_support": { + "message": "පිළිබඳව" + }, + "html_success_great_success": { + "message": "පුදුම සාර්ථකත්වයක්!" + }, + "html_success_all_tabs_restored": { + "message": "ඔබගේ සියලුම ටැබ් ප්‍රතිසාධනය කර ඇත." + }, + "html_success_goto_advanced_prefix": { + "message": "උසස් සැසි කළමනාකරණය සඳහා, පිවිසෙන්න" + }, + "html_success_goto_advanced_suffix": { + "message": "පිටුව" + }, + "html_session_manager": { + "message": "සැසි කළමනාකරණය" + }, + "html_suspended_title": { + "message": "අත්හිටුවන ලද ටැබ්" + }, + "html_suspended_tab_suspended": { + "message": "ටැබය අත්හිටුවා ඇත" + }, + "html_suspended_tab_reload": { + "message": "ටැබ් නැවත පූරණය කරන්න" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "කවදාවත් අත්හිටුවන්න එපා" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "නැවත පූරණය කිරීමට නැවුම් කරන්න හෝ ක්ලික් කරන්න" + }, + "html_suspended_toast_not_connected": { + "message": "ඔබ අන්තර්ජාලයට සම්බන්ධ වී නැත" + }, + "html_suspended_toast_reload_disabled": { + "message": "ස්වයංක්‍රීය ටැබ් නැවත පූරණය කිරීම තාවකාලිකව අබල කර ඇත." + }, + "html_permissions_title": { + "message": "අවසර" + }, + "html_permissions_heading": { + "message": "මට ස්ථානීය ගොනු ඒ.ස.නි. වලට ප්‍රවේශය දෙන්න" + }, + "html_permissions_info": { + "message": "\"ගොනුව\" යන වචනයෙන් ආරම්භ වන URL අත්හිටුවීමට මෙම දිගුවට දැනට අවසර නැත.\nමෙය වෙනස් කිරීමට, කරුණාකර දිගු සැකසීම් පිටුවෙන් \"ගොනු URL වෙත ප්‍රවේශයට ඉඩ දෙන්න\" ක්‍රියාත්මක කරන්න." + }, + "html_permissions_backup": { + "message": "කරුණාකර සටහන් කරන්න: මෙම විකල්පය වෙනස් කිරීමෙන් ඔබගේ අත්හිටවූ ටැබ් සියල්ල කෙටියෙන් අතුරුදහන් වනු ඇත.\nයම් අවස්ථාවක, ඔබගේ වත්මන් ටැබ් සැසියේ උපස්ථයක් සුරැකීමට දැන් හොඳ කාලයක් විය හැක." + }, + "html_update_title": { + "message": "යාවත්කාල කරන්න " + }, + "html_update_heading2": { + "message": "විශ්මයජනක වීමට ආසන්නයි" + }, + "html_update_info": { + "message": "The Marvelous Suspender හි නව අනුවාදයක් ස්ථාපනය කිරීමට සූදානම්ය.\nකරුණාකර සටහන් කරන්න: යාවත්කාලීන කිරීමේදී ඔබගේ අත්හිටුවන ලද ටැබ් කෙටියෙන් අතුරුදහන් වනු ඇත." + }, + "html_update_info_withbackup": { + "message": "යම් අවස්ථාවක දී, ඔබගේ වත්මන් ටැබ් සැසියේ උපස්ථයක් සුරැකීමට දැන් හොඳ කාලයක් විය හැකිය." + }, + "html_update_info_nobackup_prefix": { + "message": "ඔබගේ වත්මන් සැසියේ පිටපතක් අපනයනය කිරීම තරයේ නිර්දේශ කෙරේ " + }, + "html_update_info_nobackup_suffix": { + "message": " යාවත්කාලීන කිරීම දිගටම කරගෙන යාමට පෙර." + }, + "html_updated_title": { + "message": "යාවත්කාල වී ඇත" + }, + "html_updating_heading": { + "message": "යාවත්කාල ස්ථානයේ" + }, + "html_updating_message": { + "message": "මම ඔබගේ අත්හිටුවන ලද ටැබ් ප්‍රතිසාධනය කරන තෙක් කරුණාකර රැඳී සිටින්න..." + }, + "html_updated_great_suspender_updated": { + "message": "යාවත්කාලීන කර ඇත" + }, + "html_updated_info_line1": { + "message": "යාවත්කාලීන කිරීමට පෙර ඔබගේ ටැබ් වලින් ස්වයංක්‍රීය උපස්ථයක් සාදන ලදී." + }, + "html_updated_info_line2_prefix": { + "message": "යාවත්කාලීන කිරීමේදී ඔබට කිසියම් ගැටළුවක් ඇති වුවහොත්, ඔබට නැතිවූ ටැබ් නැවත ලබා ගත හැක " + }, + "html_updated_info_line2_suffix": { + "message": " පිටුව." + }, + "html_updated_detail_header_prefix": { + "message": "අලුත් මොනවද තියෙන්නේ " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "නව විශේෂාංග:" + }, + "html_updated_bug_fixes_header": { + "message": "දෝෂ නිවැරදි කිරීම්:" + }, + "html_updated_release_notes": { + "message": "සම්පූර්ණ නිකුතු සටහන් සඳහා GitHub වෙත පිවිසෙන්න: " + }, + "html_updated_patch_message": { + "message": "බාධාවට සමාවෙන්න. මට අවශ්‍ය වුණේ පොඩි නඩත්තුවක් කරන්න විතරයි." + }, + "html_welcome_title": { + "message": "සාදරයෙන් පිළිගනිමු" + }, + "html_welcome_text_line1": { + "message": "උත්සාහ කළාට ස්තූතියි" + }, + "html_welcome_text_line2": { + "message": "ඔබ භාවිතා නොකරන ටැබ් අත්හිටුවීමෙන් මම ඔබේ පරිගණකය සුමටව ක්‍රියාත්මක කිරීමට සලස්වන්නෙමි." + }, + "html_welcome_text_line3": { + "message": "ඔබට පහත සැකසුම් මනාව සකස් කළ හැක." + }, + "js_popup_normal": { + "message": "ටැබය ස්වයංක්‍රීයව අත්හිටුවනු ඇත." + }, + "js_popup_normal_pause": { + "message": "දැන් නොවේ" + }, + "js_popup_special": { + "message": "ටැබය අත්හිටුවිය නොහැක" + }, + "js_popup_suspended": { + "message": "ටැබය අත්හිටුවා ඇත" + }, + "js_popup_suspended_pause": { + "message": "අවශ්ය එපා" + }, + "js_popup_whitelisted": { + "message": "වෙබ් අඩවිය සුදු ලැයිස්තුගත කර ඇත." + }, + "js_popup_whitelisted_remove": { + "message": "සුදු ලැයිස්තුවෙන් ඉවත් කරන්න" + }, + "js_popup_audible": { + "message": "ටැබ් ඕඩියෝ වාදනය වේ." + }, + "js_popup_form_input": { + "message": "ටැබය පෝරම ආදානය ලබමින් සිටී." + }, + "js_popup_form_input_unpause": { + "message": "නවත්වන්න" + }, + "js_popup_pinned": { + "message": "පටිත්ත අමුණා ඇත" + }, + "js_popup_temp_whitelist": { + "message": "ටැබ් අත්හිටුවීම විරාම කරන ලදී." + }, + "js_popup_temp_whitelist_unpause": { + "message": "නවත්වන්න" + }, + "js_popup_never": { + "message": "ස්වයංක්‍රීය ටැබ් අත්හිටුවීම අබල කර ඇත." + }, + "js_popup_no_connectivity": { + "message": "ජාල සම්බන්ධතාවයක් නොමැත" + }, + "js_popup_charging": { + "message": "බල ප්‍රභවයට සම්බන්ධයි" + }, + "js_popup_blockedFile": { + "message": "දේශීය ගොනු අත්හිටුවිය නොහැක." + }, + "js_popup_blockedFile_enable": { + "message": "සබල කරන්න" + }, + "js_popup_unknown": { + "message": "ටැබය පූරණය වන තෙක් රැඳී සිටිමින්..." + }, + "js_popup_initialising": { + "message": "දිගුව ආරම්භ කිරීම සඳහා රැඳී සිටිමින්..." + }, + "js_popup_error": { + "message": "මෙම ටැබය සඳහා ස්වයංක්‍රීයව අත්හිටුවීම නොමැත" + }, + "js_history_delete": { + "message": "මකා දමන්න" + }, + "js_history_export": { + "message": "අපනයන" + }, + "js_history_reload": { + "message": "විවෘත කර පැටවීම" + }, + "js_history_resuspend": { + "message": "විවෘත සහ අත්හිටුවීම" + }, + "js_history_save": { + "message": "සුරකින්න" + }, + "js_history_window": { + "message": "කවුළුව" + }, + "js_history_windows": { + "message": "වින්ඩෝස්" + }, + "js_history_tab": { + "message": "ටැබ්" + }, + "js_history_tabs": { + "message": "ටැබ්" + }, + "js_history_enter_name_for_session": { + "message": "මෙම සැසිය සඳහා නමක් ඇතුළත් කරන්න" + }, + "js_history_confirm_delete": { + "message": "ඔබට මෙම සැසිය මැකීමට අවශ්‍ය බව විශ්වාසද?" + }, + "js_history_confirm_session_overwrite": { + "message": "මෙම නම සමඟ දැනටමත් සුරැකි සැසියක් ඇත. පවතින සැසිය උඩින් ලියන්නද?" + }, + "js_history_import_fail": { + "message": "ගොනුව පූරණය කිරීමට අසමත් විය. ගොනුව සරල අකුරු සහ පේළියකට තනි url එකක් අඩංගු බව සහතික කර ගන්න." + }, + "js_history_migrate_fail": { + "message": "සංක්‍රමණය වීමට අනුලකුණු-32 දිගු id අවශ්‍යයි" + }, + "js_history_migrate_success": { + "message": "ටැබ් $TABCOUNT$ ක් සාර්ථකව සංක්‍රමණය විය", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "වෙබ් අඩවිය සුදු ලැයිස්තුවෙන් ඉවත් කරන්න" + }, + "js_suspended_hotkey_to_reload": { + "message": "යතුරුපුවරුවේ කෙටිමං සකසන්න" + }, + "js_suspended_low_memory": { + "message": "අඩු පද්ධති මතකය හේතුවෙන් ටැබ් එක අත්හිටුවා ඇත" + }, + "js_options_incognito_warning": { + "message": "ඔබ අප්‍රකට මාදිලියේ සිටී. සමහර විශේෂාංග ලබා ගත නොහැකි වනු ඇත." + }, + "js_options_whitelist_no_matches": { + "message": "වත්මන් සුදු ලැයිස්තුවට ගැලපෙන විවෘත ටැබ් නොමැත." + }, + "js_options_whitelist_matches_heading": { + "message": "සුදු ලැයිස්තුගත විවෘත ටැබ්:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "සහ" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "තව." + }, + "js_permissions_button_export": { + "message": "උපස්ථය සුරකින්න" + }, + "js_permissions_button_set": { + "message": "දිගු සැකසුම් විවෘත කරන්න" + }, + "js_update_confirm": { + "message": "ඔබ තවමත් උපස්ථයක් සුරැකී නැත. කෙසේ වෙතත් දිගුව යාවත්කාලීන කරන්නද?" + }, + "js_update_button_export": { + "message": "උපස්ථය සුරකින්න" + }, + "js_update_button_reload": { + "message": "දැන් දිගුව යාවත්කාලීන කරන්න" + }, + "js_shortcuts_not_set": { + "message": "සකස් කර නැත" + }, + "js_session_save_point": { + "message": "v සඳහා ස්වයංක්‍රීය සුරැකුම් ලක්ෂ්‍යය" + } +} diff --git a/src/_locales/sk/messages.json b/src/_locales/sk/messages.json new file mode 100644 index 00000000..f8e8b2fc --- /dev/null +++ b/src/_locales/sk/messages.json @@ -0,0 +1,787 @@ +{ + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Zabezpečte plynulý chod počítača pozastavením tabov, ktoré nepoužívate" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Pozastav / obnov aktívny tab" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Preruš / obnov pozastavovanie aktívneho tabu" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Pozastav vybrané taby" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Obnov vybrané taby" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Pozastav ostatné taby v aktívnom okne" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Vynútiť pozastavenie ostatných tabov v aktívnom okne" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Obnov všetky taby v aktívnom okne" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Pozastav všetky taby vo všetkých oknách" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Vynútiť pozastavenie všetkých tabov vo všetkých oknách" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Obnov všetky taby vo všetkých oknách" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Otvor linku v novom pozastavenom tabe" + }, + "js_context_toggle_suspend_state": { + "message": "Pozastav / obnov tento tab" + }, + "js_context_toggle_pause_suspension": { + "message": "Preruš / obnov pozastavovanie aktuálneho tabu" + }, + "js_context_never_suspend_domain": { + "message": "Nikdy nepozastavuj túto doménu" + }, + "js_context_never_suspend_page": { + "message": "Nikdy nepozastavuj túto adresu" + }, + "js_context_suspend_selected_tabs": { + "message": "Pozastav vybrané taby" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Obnov vybrané taby" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Pozastav ostatné taby v tomto okne" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Vynútiť pozastavenie ostatných tabov v tomto okne" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Obnov všetky taby v tomto okne" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Pozastav všetky taby vo všetkých oknách" + }, + "js_context_force_suspend_all_tabs": { + "message": "Vynútiť pozastavenie všetkých tabov vo všetkých oknách" + }, + "js_context_unsuspend_all_tabs": { + "message": "Obnov všetky taby vo všetkých oknách" + }, + "html_about_title": { + "message": "O aplikácií" + }, + "html_about_fork_beginning": { + "message": "Odvodené z originálneho" + }, + "html_about_fork_mid": { + "message": "dostupného na GitHube, ale bez sledovania zobrazovaných reklám" + }, + "html_about_fork_end": { + "message": ", viac informácií na" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Ak máte spätnú väzbu alebo chcete nahlásiť problém, môžete tak spraviť na" + }, + "html_about_report_issues_suffix": { + "message": ". Pred vytvorením nového zázamu prosím skontrolujte, či Váš nápad alebo problém nie je už zapísaný. Vďaka!" + }, + "html_about_debugging_prefix": { + "message": "Logovanie alebo debuggovacie flagy nastavíte na " + }, + "html_about_debugging_suffix": { + "message": "debugovacej stránke." + }, + "html_about_the_github_issues_page": { + "message": "stránke GitHub problémov" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Toto rozšírenie používa" + }, + "html_about_html2canvas_suffix": { + "message": "knižnicu, ktorú napísal Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "Tiež používa indexedDb wrapper" + }, + "html_about_indexedDb_suffix": { + "message": ", ktorý napísal Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Ďakujem tiež" + }, + "html_about_browserstack_suffix": { + "message": "za bezplatné poskytnutie testovacích nástrojov pre chrome." + }, + "html_about_tgs_prefix": { + "message": "Toto rozšírenie by nevzniklo bez" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "je pokazené" + }, + "html_broken_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_broken_line1": { + "message": "sa nepodarilo naštartovať. Nepoužívate náhodou nekompatibilnú verziu Chrome?" + }, + "html_broken_line2": { + "message": "Reštartnite rozšírenie. Ak problém pretrvá, požiadajte o pomoc na" + }, + "html_broken_line2_github_page": { + "message": "GitHub projektová stránka" + }, + "html_broken_line3": { + "message": "Múžete obnoviť stratené taby zo" + }, + "html_broken_line3_session_management": { + "message": "stránky správy relácie" + }, + "html_broken_button_restart_extension": { + "message": "Reštartovať rozšírenie" + }, + "html_history_title": { + "message": "Správa relácie" + }, + "html_history_current_session": { + "message": "Aktuálna relácia" + }, + "html_history_recent_sessions": { + "message": "Minulé relácie" + }, + "html_history_saved_sessions": { + "message": "Uložené relácie" + }, + "html_history_import_session": { + "message": "Import relácie" + }, + "html_history_migrate_tabs": { + "message": "Presun tabov" + }, + "html_history_migrate_old_id": { + "message": "Staré id TGS rozšírenia" + }, + "html_notice_title": { + "message": "Poznámka" + }, + "html_notice_important_notice": { + "message": "Dôležité oznámenie od The Marvellous Suspender" + }, + "html_options_title": { + "message": "Nastavenia" + }, + "html_options_suspend_title": { + "message": "Automatické pozastavenie tabov" + }, + "html_options_suspended_title": { + "message": "Pozastavené taby" + }, + "html_options_other_title": { + "message": "Ostatné" + }, + "html_options_suspend_automatically_after": { + "message": "Automaticky pozastav taby po" + }, + "html_options_suspend_never": { + "message": "Nikdy" + }, + "html_options_suspend_seconds": { + "message": "sekúnd" + }, + "html_options_suspend_minute": { + "message": "min" + }, + "html_options_suspend_minutes": { + "message": "minút" + }, + "html_options_suspend_hour": { + "message": "hodina" + }, + "html_options_suspend_hours": { + "message": "hodín" + }, + "html_options_suspend_day": { + "message": "deň" + }, + "html_options_suspend_days": { + "message": "dni" + }, + "html_options_suspend_week": { + "message": "týždeň" + }, + "html_options_suspend_weeks": { + "message": "týždňov" + }, + "html_options_suspend_no_pinned": { + "message": "Nikdy nepozastav pripnuté taby" + }, + "html_options_suspend_no_forms": { + "message": "Nikdy nepozastav taby s neuloženými vstupmi" + }, + "html_options_suspend_no_audio": { + "message": "Nikdy nepozastav tab hrajúci zvuky" + }, + "html_options_suspend_only_connected": { + "message": "Nikdy nepozastav tab v móde bez siete" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Nikdy nepozastav tab ak je počítač pripojený k elektrickej sieti" + }, + "html_options_suspend_no_active_tabs": { + "message": "Nepozastav aktívny tab v každom okne" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Automaticky obnov práve zobrazený tab" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Pri pozastavení použi šetrenie pamäti zabudované v Chrome" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Ešte viac znižuje pamäťové nároky pomocou" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "zabudovaného mechanizmu 'vyraďovania tabov' prehliadača Chrome. Výsledkom čoho môže byť až" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "500% ušetrenie pamäte v prípade, že pracujete s veľkým množstvom tabov." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Takéto šetrenie však spôsobuje určité oneskorenie vykresľovania pri vybraní" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "pozastaveného tabu." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Pre viac informácií o vyraďovaní tabov prehliadačom Chrome pozrite na:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Téma" + }, + "html_options_suspend_theme_light": { + "message": "Svetlý" + }, + "html_options_suspend_theme_dark": { + "message": "Tmavý" + }, + "html_options_suspend_screen_capturing": { + "message": "Zachytávanie obrazovky" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Vypnuté" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Zachyť len vrch obrazovky" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Zachyť celú stránku" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Na pozastavenom tabe môže rozšírenie zobraziť náhľad vzhľadu tabu" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "v čase tesne pred pozastavením." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "The screen capturing feature is experimental and can cause significant CPU usage as" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "If you notice strange behaviour such as tabs taking a long time to suspend, or chrome" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "Enable high quality screen capture mode" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "When disabled, screen captures have the following limitations to aid in performance:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Low quality screen capture" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Will not capture screen if it takes more than 1 minute to generate image" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Maximum height of screen capture limited to 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Enabling high quality screen capture mode may significantly increase CPU load" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "Never suspend tabs with URLs from the following list:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Add the URL of each page you want to whitelist on a new line. For example:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "To whitelist multiple sites in one line you can specify part of the url instead:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "You can also specify regular expressions by enclosing the text in forward slashes:" + }, + "html_options_whitelist_test": { + "message": "Test whitelist" + }, + "html_options_other_enable_context_menu": { + "message": "Add The Marvellous Suspender to right-click context menu" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Add controls for this extension to the right-click menu of a web page." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "This will give you access to advanced suspending actions not available" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "Sync settings with your Chrome profile" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Extension settings will be synchronised across all chrome browsers which are" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "logged in with the same profile." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "This will also synchronise settings in incognito mode." + }, + "html_options_other_enable_sync_warning": { + "message": "Turning this on will overwrite settings on all other browsers logged into the same Chrome profile" + }, + "html_options_suspend_on_low_memory": { + "message": "Instantly suspend when system memory gets very low" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "This option will override Chrome's automatic tab discarding functionality." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "If enabled, it will force a tab to suspend instead of being discarded by Chrome." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Typically, Chrome will only discard tabs once system memory gets very low." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Please note: This may cause tabs to suspend earlier than the time you have" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "For more information on Chrome discarding refer to:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Unsuspend this tab" + }, + "html_popup_suspend_tab": { + "message": "Suspend this tab now" + }, + "html_popup_dont_suspend_now": { + "message": "Don't suspend for now" + }, + "html_popup_never_suspend_domain": { + "message": "Never suspend this domain" + }, + "html_popup_never_suspend_page": { + "message": "Never suspend this URL" + }, + "html_popup_suspend_other_tabs": { + "message": "Suspend all other tabs" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Unsuspend all tabs" + }, + "html_popup_suspend_selected_tabs": { + "message": "Suspend selected tabs" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Unsuspend selected tabs" + }, + "html_popup_settings": { + "message": "Settings" + }, + "html_restoring_title": { + "message": "Restoring window" + }, + "html_restoring_heading": { + "message": "Restoring tabs" + }, + "html_restoring_detail": { + "message": "Please wait while I restore this window..." + }, + "html_recovery_title": { + "message": "Recovery" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "Looks like you're recovering from an extension crash." + }, + "html_recovery_description_line2": { + "message": "Your suspended tabs may have crashed or disappeared." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Restore tabs automatically" + }, + "html_recovery_go_to_session_manager": { + "message": "Go to session manager" + }, + "html_recovery_important_message": { + "message": "You currently have screen capturing turned on. If this extension is repeatedly crashing it is recommended you disable this option." + }, + "html_recovery_disable_screen_capturing": { + "message": "Turn off screen capturing" + }, + "html_recovery_tabs_to_restore": { + "message": "Tabs to restore" + }, + "html_shortcuts_title": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_shortcuts_context_menu_note": { + "message": "Note: These actions are also available via the right-click context menu." + }, + "html_shortcuts_remap_keys": { + "message": "Change shortcuts" + }, + "html_sidebar_general_settings": { + "message": "Settings" + }, + "html_sidebar_session_management": { + "message": "Session management" + }, + "html_sidebar_shortcuts": { + "message": "Keyboard shortcuts" + }, + "html_sidebar_support": { + "message": "About" + }, + "html_success_great_success": { + "message": "Marvellous success!" + }, + "html_success_all_tabs_restored": { + "message": "All your tabs have been restored." + }, + "html_success_goto_advanced_prefix": { + "message": "For advanced session management, visit the" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "session management" + }, + "html_suspended_title": { + "message": "Suspended Tab" + }, + "html_suspended_tab_suspended": { + "message": "Tab suspended" + }, + "html_suspended_tab_reload": { + "message": "Reload tab" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Never suspend" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Refresh or click to reload" + }, + "html_suspended_toast_not_connected": { + "message": "You are not connected to the internet" + }, + "html_suspended_toast_reload_disabled": { + "message": "Automatic tab reloading is temporarily disabled." + }, + "html_permissions_title": { + "message": "Permissions" + }, + "html_permissions_heading": { + "message": "Please give me access to local file URLs" + }, + "html_permissions_info": { + "message": "This extension is not currently permitted to suspend URLs beginning with the word \"file\".\nTo change this, please turn on \"Allow access to file URLs\" from the extension settings page." + }, + "html_permissions_backup": { + "message": "Please note: changing this option will cause all your suspended tabs will briefly disappear.\nJust in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_title": { + "message": "Update" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "A new version of The Marvellous Suspender is ready to be installed.\nPlease note: during the update your suspended tabs will briefly disappear." + }, + "html_update_info_withbackup": { + "message": "Just in case, now might be a good time to save a backup of your current tab session." + }, + "html_update_info_nobackup_prefix": { + "message": "It is strongly recommended that you export a copy of your current session from " + }, + "html_update_info_nobackup_suffix": { + "message": " before continuing with the update." + }, + "html_updated_title": { + "message": "Updated" + }, + "html_updating_heading": { + "message": "is updating" + }, + "html_updating_message": { + "message": "Please wait while I restore your suspended tabs..." + }, + "html_updated_great_suspender_updated": { + "message": "has been updated" + }, + "html_updated_info_line1": { + "message": "An automatic backup was made of your tabs before the update." + }, + "html_updated_info_line2_prefix": { + "message": "If you encountered any issues during the update, you can recover lost tabs from the " + }, + "html_updated_info_line2_suffix": { + "message": " page." + }, + "html_updated_detail_header_prefix": { + "message": "What's new in " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "New features:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug fixes:" + }, + "html_updated_release_notes": { + "message": "Visit GitHub for full release notes: " + }, + "html_updated_patch_message": { + "message": "Sorry for the disturbance. I just needed to perform a little maintenance." + }, + "html_welcome_title": { + "message": "Welcome" + }, + "html_welcome_text_line1": { + "message": "Thanks for trying" + }, + "html_welcome_text_line2": { + "message": "I make your computer run smoothly by suspending the tabs you aren't using." + }, + "html_welcome_text_line3": { + "message": "You can fine-tune the settings below." + }, + "js_popup_normal": { + "message": "Tab will suspend automatically." + }, + "js_popup_normal_pause": { + "message": "Not now" + }, + "js_popup_special": { + "message": "Tab cannot be suspended" + }, + "js_popup_suspended": { + "message": "Tab suspended" + }, + "js_popup_suspended_pause": { + "message": "Don't suspend" + }, + "js_popup_whitelisted": { + "message": "Site whitelisted." + }, + "js_popup_whitelisted_remove": { + "message": "Remove from whitelist" + }, + "js_popup_audible": { + "message": "Tab is playing audio." + }, + "js_popup_form_input": { + "message": "Tab is receiving form input." + }, + "js_popup_form_input_unpause": { + "message": "Unpause" + }, + "js_popup_pinned": { + "message": "Tab has been pinned" + }, + "js_popup_temp_whitelist": { + "message": "Tab suspension paused." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Unpause" + }, + "js_popup_never": { + "message": "Automatic tab suspension disabled." + }, + "js_popup_no_connectivity": { + "message": "No network connection" + }, + "js_popup_charging": { + "message": "Connected to power source" + }, + "js_popup_blockedFile": { + "message": "Local files cannot be suspended." + }, + "js_popup_blockedFile_enable": { + "message": "Enable" + }, + "js_popup_unknown": { + "message": "Waiting for tab to load..." + }, + "js_popup_initialising": { + "message": "Waiting for extension to initialize..." + }, + "js_popup_error": { + "message": "Auto-suspend unavailable for this tab" + }, + "js_history_delete": { + "message": "delete" + }, + "js_history_export": { + "message": "export" + }, + "js_history_reload": { + "message": "open and load" + }, + "js_history_resuspend": { + "message": "open and suspend" + }, + "js_history_save": { + "message": "save" + }, + "js_history_window": { + "message": "Window" + }, + "js_history_windows": { + "message": "Windows" + }, + "js_history_tab": { + "message": "Tab" + }, + "js_history_tabs": { + "message": "Tabs" + }, + "js_history_enter_name_for_session": { + "message": "Enter a name for this session" + }, + "js_history_confirm_delete": { + "message": "Are you sure you want to delete this session?" + }, + "js_history_confirm_session_overwrite": { + "message": "There is already a saved session with this name. Overwrite existing session?" + }, + "js_history_import_fail": { + "message": "Failed to load file. Ensure file is plain text and contains a single url per line." + }, + "js_history_migrate_fail": { + "message": "Need 32-character extension id to migrate from" + }, + "js_history_migrate_success": { + "message": "Successfully migrated $TABCOUNT$ tabs", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Remove site from whitelist" + }, + "js_suspended_hotkey_to_reload": { + "message": "Set keyboard shortcuts" + }, + "js_suspended_low_memory": { + "message": "Tab suspended due to low system memory" + }, + "js_options_incognito_warning": { + "message": "You are in incognito mode. Some features will not be available." + }, + "js_options_whitelist_no_matches": { + "message": "There are no open tabs that match the current whitelist." + }, + "js_options_whitelist_matches_heading": { + "message": "Whitelisted open tabs:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "and" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "more." + }, + "js_permissions_button_export": { + "message": "Save backup" + }, + "js_permissions_button_set": { + "message": "Open extension settings" + }, + "js_update_confirm": { + "message": "You have not saved a backup yet. Update the extension anyway?" + }, + "js_update_button_export": { + "message": "Save backup" + }, + "js_update_button_reload": { + "message": "Update extension now" + }, + "js_shortcuts_not_set": { + "message": "not set" + }, + "js_session_save_point": { + "message": "Automatic save point for v" + } +} diff --git a/src/_locales/tr/messages.json b/src/_locales/tr/messages.json index a9c55c48..0e717a33 100644 --- a/src/_locales/tr/messages.json +++ b/src/_locales/tr/messages.json @@ -1,242 +1,787 @@ { - "ext_cmd_force_suspend_active_window_description": { "message": "Aktif pencere dışında tüm sekmeleri zorla askıya al" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "Aktif pencere dışında tüm sekmeleri askıya al" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "Tüm pencerelerde tüm sekmeleri askıya al" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "Seçilen sekmeyi askıya al" }, - "ext_cmd_toggle_tab_pause_description": { "message": "Aktif sekmenin askı durumunu Duraklat/Devam Et" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "Askıya Al/Askıyı Kaldır active tab" }, - "ext_cmd_unsuspend_active_window_description": { "message": "Aktif penceredeki tüm sekmelerin askıya almasını kaldır" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "Tüm pencerelerde tüm sekmelerin askıya almasını kaldır" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "Seçilen sekmenin askısını kaldır" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayın" }, - "ext_extension_name": { "message": "The Great Suspender" }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "Ayrıca teşekkürler" }, - "html_about_browserstack_suffix": { "message": "ücretsiz Chrome test araçları sağladığı için." }, - "html_about_debugging_prefix": { "message": "Hata ayıklama ve günlük (log) kayıtlarının kontrolü için " }, - "html_about_debugging_suffix": { "message": "hata ayıklama sayfası." }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "Bu eklentinin kullandığı" }, - "html_about_html2canvas_suffix": { "message": "kütüphane programcısı Niklas von Hertzen." }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "indexedDb de kullanılır" }, - "html_about_indexedDb_suffix": { "message": "programcı Aaron Powell." }, - "html_about_report_issues_prefix": { "message": "Geri bildiriminiz varsa veya bir sorunu bildirmek istiyorsanız" }, - "html_about_report_issues_suffix": { "message": ". Lütfen yeni bir tane oluşturmadan önce fikrinizin veya sorununun mevcut olup olmaduğını kontrol ediniz. Teşekkürler!" }, - "html_about_the_github_issues_page": { "message": "GitHub sorunlar sayfası" }, - "html_about_title": { "message": "Hakkında" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_history_current_session": { "message": "Şuanki oturum" }, - "html_history_import_session": { "message": "Oturum Al" }, - "html_history_recent_sessions": { "message": "Son oturumlar" }, - "html_history_saved_sessions": { "message": "Kayıtlı oturumlar" }, - "html_history_title": { "message": "Oturum yönetimi" }, - "html_notice_important_notice": { "message": "Great Suspender'dan önemli uyarı" }, - "html_notice_title": { "message": "Not" }, - "html_options_other_enable_context_menu": { "message": "Sağ tuş menüye Great Suspender için menü ekle" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "Web sayfasının sağ tıklama menüsüne bu uzantı için kontrol ekle." }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "Gelişmiş askıya alma işlemlerine" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "buradan erişmenizi sağlayacaktır." }, - "html_options_other_enable_sync": { "message": "Ayarları Chrome profilinizle senkronize yap" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "Yaptığınız uzantı ayarları, aynı profil ile giriş yaptığınız tarayıcı" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "arasında senkronize edilir." }, - "html_options_other_enable_sync_tooltip_line2": { "message": "Bu aynı zamanda ayarları gizli modda senkronize edecektir." }, - "html_options_other_enable_sync_warning": { "message": "Bunu açtığınızda, aynı Chrome profilinde oturum açan tarayıcıların ayarlarının üzerine yazılacak" }, - "html_options_other_title": { "message": "Diğer" }, - "html_options_suspend_automatically_after": { "message": "Otomatik sekmeyi askıya al" }, - "html_options_suspend_automatically_unsuspend": { "message": "Sekme görüntülendiğinde askısını kaldır" }, - "html_options_suspend_day": { "message": "gün" }, - "html_options_suspend_days": { "message": "gün" }, - "html_options_suspend_discard_after_suspend": { "message": "Askıya alırken Chrome'un dahili hafıza tasarrufunu uygula" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "Askıya alınmış bir sekmenin bellek kullanımını daha da azaltarak" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "Chrome'un yerleşil 'sekme atma' özelliği. Bu sonuçlabilir" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "çok sayıda sekmeler ile çalışırken %500'e varan bellek tasarrufu." }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "Ancak, seçildiğinde askıya alınmış sekmede." }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "işlem işlemede gecikmeye sebep olur." }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "Bilgi için Chrome'un referans bilgisi:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_force_screen_capture": { "message": "Yüksek kaliteli ekran görüntüsü yakalamayı etkinleştir" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "Devre dışı olduğunda, ekran görüntü yakalaması performansa yardımcı olmak için aşağıdaki sınırlamalara sahiptir:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- Düşük kalite ekran görüntüsü yakalama" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- Ekran yakalama görüntüsü oluşturması 1 dakikadan uzun sürerse görüntü yakalanamaz" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- Ekran görüntüsü yakalamanın maksimum yüksekliği 5000px" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "Yüksek kaliteli ekran görüntüsü yakalama modu etkinleştirildiğinde işlemci (CPU) yükünü önemli şekilde yükseltebilir" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "ve bellek kullanımı." }, - "html_options_suspend_hour": { "message": "saat" }, - "html_options_suspend_hours": { "message": "saat" }, - "html_options_suspend_minute": { "message": "dakika" }, - "html_options_suspend_minutes": { "message": "saniye" }, - "html_options_suspend_never": { "message": "Hiç" }, - "html_options_suspend_no_active_tabs": { "message": "Asla aktif penceredeki sekmeye askıya al yapma" }, - "html_options_suspend_no_audio": { "message": "Asla ses çalan sekmelere askıya al yapma" }, - "html_options_suspend_no_forms": { "message": "Asla kaydedilmemiş form girişleri içeren sekmeleri askıya al yapma" }, - "html_options_suspend_no_pinned": { "message": "Sabitlenmiş sekmeleri asla askıya al yapma" }, - "html_options_suspend_on_low_memory": { "message": "Sistem belleği çok azaldığında anında askıya al" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "Bu seçenek, Chrome'un otomatik sekme atma özelliğini geçersiz kılar." }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "Etkinleştirilirse, Chrome tarafından atılmak yerine sekmeyi askıya almaya zorlar." }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "Genellikle, Chrome yalnızca sistem belleği çok azaldığında sekmeleri atar." }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "Lütfen dikkat: Bu, sekmelerin sahip olduğunuz süreden daha erken askıya alınmasına sebep olabilir." }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "otomatik sekme askıya alma seçeneklerinde belirtilen." }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "Daha fazla bilgi için Chrome'un referansına bakınız:" }, - "html_options_suspend_only_connected": { "message": "Çevrimdışı olduğunda askıya al yapma" }, - "html_options_suspend_only_on_battery": { "message": "Güç kaynağına bağlı iken sekmeleri askıya al yapma" }, - "html_options_suspend_screen_capturing": { "message": "Ekran görüntüsü yakalama" }, - "html_options_suspend_screen_capturing_disabled": { "message": "Devre dışı" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "Tüm sayfayı yakala" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "Sadece ekranın üst kısmını yakala" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "Askıya alınmış bir sekmede, uzantı sekmenin ne olduğuna ilişkin resim önizlemesi görüntüleyebilir" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "askıya alınmamış hali gibi." }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "Ekran görüntüsü yakalama özelliği önemli miktarda işlemci (cpu) kullanımına sebep olabilir" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "ve az miktarda bellek kullanımına." }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "Sekmelerin askıya alınması uzun zaman alıyorsa veya chrome uygulamasında " }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "beklenmedik çekilde çökme vb. olursa, bu özelliği kapatmayı deneyin." }, - "html_options_suspend_seconds": { "message": "saniye" }, - "html_options_suspend_theme": { "message": "Tema" }, - "html_options_suspend_theme_dark": { "message": "Koyu" }, - "html_options_suspend_theme_light": { "message": "Açık" }, - "html_options_suspend_title": { "message": "Otomatik sekme askıya alma" }, - "html_options_suspend_week": { "message": "hafta" }, - "html_options_suspend_weeks": { "message": "hafta" }, - "html_options_suspended_title": { "message": "Askıya alınmış sekmeler" }, - "html_options_title": { "message": "Ayarlar" }, - "html_options_whitelist_test": { "message": "Beyaz liste test" }, - "html_options_whitelist_title": { "message": "Aşağıdaki listede bulunan URL adreslerine askıya al yapma:" }, - "html_options_whitelist_tooltip_line1": { "message": "Beyaz listeye eklemek istediğiniz her sayfanın URL'sini yeni bir satıra ekleyin. Örneğin:" }, - "html_options_whitelist_tooltip_line2": { "message": "Tek bir satırda birden fazla siteyi beyaz listeye almak için URL’nin bir bölümünü belirleyebilirsiniz:" }, - "html_options_whitelist_tooltip_line3": { "message": "Ayrıca, slash vb. ekleyerek de düzenli ifadeler belirleyebilirsiniz:" }, - "html_permissions_backup": { "message": "Lütfen dikkat: Bu seçeneğin değiştirilmesi, askıya alınan tüm sekmelerinizin kısa bir süre kaybolmasına neden olur.\nBu durumda şuanki oturumunu kaydetmeniz iyi bir seçenek olabilir." }, - "html_permissions_heading": { "message": "Yerel dosyalar için lütfen yetki veriniz" }, - "html_permissions_info": { "message": "Bu uzantı, \"file\" kelimesi ile başlayan URL’leri askıya almasına izin veremiyor.\nBunu değiştirmek için uzantı ayarları sayfasından ayrıntılarına girip \"Dosya URL'lerine erişime izin ver\" seçeneğini açınız." }, - "html_permissions_title": { "message": "Yetkiler" }, - "html_popup_dont_suspend_now": { "message": "Şimdilik askıya almasını kaldır" }, - "html_popup_never_suspend_domain": { "message": "Bu alanadını hiçbir zaman askıya alma" }, - "html_popup_never_suspend_page": { "message": "Bu URL adresini hiçbir zaman askıya alma" }, - "html_popup_settings": { "message": "Ayarlar" }, - "html_popup_suspend_other_tabs": { "message": "Diğer seklemeri askıya al" }, - "html_popup_suspend_selected_tabs": { "message": "Seçilen sekmeyi askıya al" }, - "html_popup_suspend_tab": { "message": "Bu sekmeyi askıya al" }, - "html_popup_unsuspend_all_tabs": { "message": "Tüm sekmelerin askısını kaldır" }, - "html_popup_unsuspend_selected_tabs": { "message": "Seçilen sekmenin askısını kaldır" }, - "html_popup_unsuspend_tab": { "message": "Bu sekmenin askısını kaldır" }, - "html_recovery_description_line1": { "message": "Uzantının çökmesinden kurtuldunuz gibi görünüyor." }, - "html_recovery_description_line2": { "message": "Askıya alınan sekmeleriniz çökmüş veya kaybolmuş olabilir." }, - "html_recovery_disable_screen_capturing": { "message": "Ekran görüntüsü yakalama devre dışı" }, - "html_recovery_go_to_session_manager": { "message": "Oturum yöneticisine git" }, - "html_recovery_important_message": { "message": "Şu anda ekran görüntüsü yakalamayı açtınız. Bu uzantı art arda çöküyorsa, bu seçeneği devre dışı bırakmanız önerilir." }, - "html_recovery_restore_tabs_automatically": { "message": "Sekmeleri otomatik geri yükle" }, - "html_recovery_ruh_roh": { "message": "Ruh roh!" }, - "html_recovery_tabs_to_restore": { "message": "Sekmeleri geri yükle" }, - "html_recovery_title": { "message": "Kurtarma" }, - "html_restoring_detail": { "message": "Bu pencereyi geri yüklerken lütfen bekleyin..." }, - "html_restoring_heading": { "message": "Sekmeler geri yükleniyor" }, - "html_restoring_title": { "message": "Pencere geri yükleniyor" }, - "html_session_manager": { "message": "oturum yöneticisi" }, - "html_shortcuts_context_menu_note": { "message": "Not: Bu işlemlere mouse sağ tuş menü üzerinden de erişilebilir." }, - "html_shortcuts_keyboard_shortcuts": { "message": "Klavye kısayolları" }, - "html_shortcuts_remap_keys": { "message": "Klavye kısayol değiştir" }, - "html_shortcuts_title": { "message": "Klavye kısayolları" }, - "html_sidebar_general_settings": { "message": "Ayarlar" }, - "html_sidebar_session_management": { "message": "Oturum yöneticisi" }, - "html_sidebar_shortcuts": { "message": "Klavye kısayolları" }, - "html_sidebar_support": { "message": "Hakkında" }, - "html_success_all_tabs_restored": { "message": "Tüm sekmeleriniz geri yüklendi." }, - "html_success_goto_advanced_prefix": { "message": "Gelişmiş oturum yöneticisi için, ziyaret edin" }, - "html_success_goto_advanced_suffix": { "message": "sayfa" }, - "html_success_great_success": { "message": "Başarılı!" }, - "html_suspended_click_to_reload": { "message": "Sayfa askıya alındı.\n\nSayfayı geri yüklemek için tıklayın veya sayfayı yenileyin." }, - "html_suspended_tab_reload": { "message": "Sekmeyi Yeniden Yükle" }, - "html_suspended_tab_suspended": { "message": "Sekme askıya alındı" }, - "html_suspended_tab_whitelist_prefix": { "message": "Askıya Alma Yapma" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_title": { "message": "Askıya Alınmış Sekme" }, - "html_suspended_toast_not_connected": { "message": "Internete bağlı değilsiniz" }, - "html_suspended_toast_reload_disabled": { "message": "Otomatik geri yükleme geçici olarak devre dışı." }, - "html_update_heading2": { "message": "daha büyük olma üzere" }, - "html_update_info": { "message": "The Great Suspender yeni bir sürümü kurulmaya hazır.\nLütfen dikkat: Güncelleme sırasında askıya alınmış sekmeleriniz kısa bir süre kaybolacaktır." }, - "html_update_info_nobackup_prefix": { "message": "Şu anki oturumunuzun buradan kopyasını dışarı aktarma yapmanızı öneririz " }, - "html_update_info_nobackup_suffix": { "message": " güncellemeye devam etmeden önce." }, - "html_update_info_withbackup": { "message": "Şu anki sekmenin oturum yedeğini almak için uygun zaman olabilir." }, - "html_update_title": { "message": "Güncelle" }, - "html_updated_bug_fixes_header": { "message": "Yamalar:" }, - "html_updated_detail_header_prefix": { "message": "Yenilikler " }, - "html_updated_detail_header_suffix": { "message": "?" }, - "html_updated_great_suspender_updated": { "message": "güncellendi" }, - "html_updated_info_line1": { "message": "Güncelleme öncesinde sekmeleriniz otomatik olarak yedeklenir." }, - "html_updated_info_line2_prefix": { "message": "Güncelleme sırasında herhangi bir sorunla karşılaştıysanız, kaybolan sekmeleri geri yüklebilirsiniz " }, - "html_updated_info_line2_suffix": { "message": " sayfa." }, - "html_updated_new_features_header": { "message": "Yeni özellikler:" }, - "html_updated_patch_message": { "message": "Özür dileriz. Sadece biraz bakım yapmamız gerekiyor." }, - "html_updated_release_notes": { "message": "Tüm sürüm notları için GitHub'ı ziyaret edin: " }, - "html_updated_title": { "message": "Güncellendi" }, - "html_updating_heading": { "message": "günceleniyor" }, - "html_updating_message": { "message": "Askıya alınmış sekmeleriniz geri yüklenirken lütfen bekleyiniz..." }, - "html_welcome_text_line1": { "message": "Tekrar için deneniyor teşekkürler" }, - "html_welcome_text_line2": { "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayabilirsiniz." }, - "html_welcome_text_line3": { "message": "Aşağıdaki ayarları hassas şekilde yapabilirsiniz." }, - "html_welcome_title": { "message": "Hoşgeldiniz" }, - "js_context_force_suspend_all_tabs": { "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "Bu pencere dışındaki tüm sekmeleri zorla askıya al" }, - "js_context_never_suspend_domain": { "message": "Bu alanadını hiçbir zaman askıya alma" }, - "js_context_never_suspend_page": { "message": "Bu URL adresini hiçbir zaman askıya alma" }, - "js_context_open_link_in_suspended_tab": { "message": "Askıya Alınmış Sekmede Adresi Aç" }, - "js_context_soft_suspend_all_tabs": { "message": "Tüm penceredeki tüm sekmeleri askıya al" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "Bu pencere dışındaki tüm sekmeleri askıya al" }, - "js_context_suspend_selected_tabs": { "message": "Seçilen sekmeyi askıya al" }, - "js_context_toggle_pause_suspension": { "message": "Bu sekmenin askı durumunu Duraklat/Devam Et" }, - "js_context_toggle_suspend_state": { "message": "Bu sekmeyi Askıya Al/Askısını Kaldır" }, - "js_context_unsuspend_all_tabs": { "message": "Tüm penceredeki tüm sekmelerin askısını kaldır" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "Bu penceredeki tüm sekmelerin askısını kaldır" }, - "js_context_unsuspend_selected_tabs": { "message": "Seçilen sekmenin askısını kaldır" }, - "js_history_confirm_delete": { "message": "Bu oturumu silmek istediğinizden emin misiniz??" }, - "js_history_confirm_session_overwrite": { "message": "Bu oturum bu isim ile zaten kaydedilmiş. Üzerine kayıt yapılsın mı?" }, - "js_history_delete": { "message": "Sil" }, - "js_history_enter_name_for_session": { "message": "Bu oturum için bir isim girin" }, - "js_history_export": { "message": "Dışa aktar" }, - "js_history_import_fail": { "message": "Dosya yükleme başarısız. Dosyanın düz metin olduğundan ve satır başına tek bir URL içerdiğinden emin olunuz." }, - "js_history_plural": { "message": "s" }, - "js_history_reload": { "message": "Aç ve yükle" }, - "js_history_resuspend": { "message": "Aç ve askıya al" }, - "js_history_save": { "message": "Kaydet" }, - "js_history_tab": { "message": "Sekme" }, - "js_history_window": { "message": "Pencere" }, - "js_options_incognito_warning": { "message": "Gizli moddasınız. Bazı özellikler kullanılamayacak." }, - "js_options_whitelist_matches_heading": { "message": "Sekme beyaz listesi:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "ve" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "dahası." }, - "js_options_whitelist_no_matches": { "message": "Mevcut beyaz listeyle eşleşen açık sekme yok." }, - "js_permissions_button_export": { "message": "Yedeği kaydet" }, - "js_permissions_button_set": { "message": "Uzantı ayarlarını aç" }, - "js_popup_audible": { "message": "Sekme ses çalıyor." }, - "js_popup_blockedFile": { "message": "Yerel dosyalar askıya alınamaz." }, - "js_popup_blockedFile_enable": { "message": "Açık" }, - "js_popup_charging": { "message": "Güç kaynağına bağlandı" }, - "js_popup_error": { "message": "Bu sekme için otomatik askıya alma kullanılamıyor" }, - "js_popup_form_input": { "message": "Sekme form girişi yapıyor." }, - "js_popup_form_input_unpause": { "message": "Devam Et" }, - "js_popup_initialising": { "message": "Uzantının başlatılması bekleniyor..." }, - "js_popup_never": { "message": "Otomatik sekme askıya alma devre dışı." }, - "js_popup_no_connectivity": { "message": "Ağ bağlantısı yok" }, - "js_popup_normal": { "message": "Otomatik sekmeyi askıya al." }, - "js_popup_normal_pause": { "message": "Şimdi değil" }, - "js_popup_pinned": { "message": "Sekme sabit" }, - "js_popup_special": { "message": "Askıya alınmadı" }, - "js_popup_suspended": { "message": "Sekme askıya alındı" }, - "js_popup_suspended_pause": { "message": "Askı Duraklatıldı" }, - "js_popup_temp_whitelist": { "message": "Sekme askı durumu duraklatıldı." }, - "js_popup_temp_whitelist_unpause": { "message": "Devam Et" }, - "js_popup_unknown": { "message": "Geri yükleme için sekme bekleniyor..." }, - "js_popup_whitelisted": { "message": "Site beyaz listede." }, - "js_popup_whitelisted_remove": { "message": "Beyaz listeden kaldır" }, - "js_session_save_point": { "message": "v için otomatik kaydetme noktası" }, - "js_shortcuts_not_set": { "message": "tanımsız" }, - "js_suspended_hotkey_to_reload": { "message": "Klavye kısayolları" }, - "js_suspended_low_memory": { "message": "Düşük sistem belleği nedeni ile sekme askıya alındı" }, - "js_suspended_remove_from_whitelist": { "message": "Bu web sitesini beyaz listeden kaldır" }, - "js_update_button_export": { "message": "Yedeği sakla" }, - "js_update_button_reload": { "message": "Uzantı güncelle" }, - "js_update_confirm": { "message": "Henüz bir yedekleme yapmadınız. Uzantıyı yine de güncellensin mi?" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayın" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "Askıya Al/Askıyı Kaldır active tab" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "Aktif sekmenin askı durumunu Duraklat/Devam Et" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "Seçilen sekmeyi askıya al" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "Seçilen sekmenin askısını kaldır" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "Aktif pencere dışında tüm sekmeleri askıya al" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "Aktif pencere dışında tüm sekmeleri zorla askıya al" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "Aktif penceredeki tüm sekmelerin askıya almasını kaldır" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "Tüm pencerelerde tüm sekmeleri askıya al" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "Tüm pencerelerde tüm sekmelerin askıya almasını kaldır" + }, + "js_context_open_link_in_suspended_tab": { + "message": "Askıya Alınmış Sekmede Adresi Aç" + }, + "js_context_toggle_suspend_state": { + "message": "Bu sekmeyi Askıya Al/Askısını Kaldır" + }, + "js_context_toggle_pause_suspension": { + "message": "Bu sekmenin askı durumunu Duraklat/Devam Et" + }, + "js_context_never_suspend_domain": { + "message": "Bu alanadını hiçbir zaman askıya alma" + }, + "js_context_never_suspend_page": { + "message": "Bu URL adresini hiçbir zaman askıya alma" + }, + "js_context_suspend_selected_tabs": { + "message": "Seçilen sekmeyi askıya al" + }, + "js_context_unsuspend_selected_tabs": { + "message": "Seçilen sekmenin askısını kaldır" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "Bu pencere dışındaki tüm sekmeleri askıya al" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "Bu pencere dışındaki tüm sekmeleri zorla askıya al" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "Bu penceredeki tüm sekmelerin askısını kaldır" + }, + "js_context_soft_suspend_all_tabs": { + "message": "Tüm penceredeki tüm sekmeleri askıya al" + }, + "js_context_force_suspend_all_tabs": { + "message": "Tüm penceredeki tüm sekmeleri zorla askıya al" + }, + "js_context_unsuspend_all_tabs": { + "message": "Tüm penceredeki tüm sekmelerin askısını kaldır" + }, + "html_about_title": { + "message": "Hakkında" + }, + "html_about_fork_beginning": { + "message": "Orijinal eklentiye dayalıdır" + }, + "html_about_fork_mid": { + "message": "available on GitHub, without ADS tracking" + }, + "html_about_fork_end": { + "message": ", more information available on" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "Geri bildiriminiz varsa veya bir sorunu bildirmek istiyorsanız" + }, + "html_about_report_issues_suffix": { + "message": ". Lütfen yeni bir tane oluşturmadan önce fikrinizin veya sorununun mevcut olup olmaduğını kontrol ediniz. Teşekkürler!" + }, + "html_about_debugging_prefix": { + "message": "Hata ayıklama ve günlük (log) kayıtlarının kontrolü için " + }, + "html_about_debugging_suffix": { + "message": "hata ayıklama sayfası." + }, + "html_about_the_github_issues_page": { + "message": "GitHub sorunlar sayfası" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "Bu eklentinin kullandığı" + }, + "html_about_html2canvas_suffix": { + "message": "kütüphane programcısı Niklas von Hertzen." + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "indexedDb de kullanılır" + }, + "html_about_indexedDb_suffix": { + "message": "programcı Aaron Powell." + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "Ayrıca teşekkürler" + }, + "html_about_browserstack_suffix": { + "message": "ücretsiz Chrome test araçları sağladığı için." + }, + "html_about_tgs_prefix": { + "message": "Bu uzantı olmadan asla var olamazdı" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "is broken" + }, + "html_broken_ruh_roh": { + "message": "Ruh Roh!" + }, + "html_broken_line1": { + "message": "failed to start. Perhaps you are using an incompatible version of Chrome?" + }, + "html_broken_line2": { + "message": "Try to restart the extension. If the problem persists, ask for help on the" + }, + "html_broken_line2_github_page": { + "message": "GitHub project page" + }, + "html_broken_line3": { + "message": "You can recover lost tabs from the" + }, + "html_broken_line3_session_management": { + "message": "session management page" + }, + "html_broken_button_restart_extension": { + "message": "Restart extension" + }, + "html_history_title": { + "message": "Oturum yönetimi" + }, + "html_history_current_session": { + "message": "Şuanki oturum" + }, + "html_history_recent_sessions": { + "message": "Son oturumlar" + }, + "html_history_saved_sessions": { + "message": "Kayıtlı oturumlar" + }, + "html_history_import_session": { + "message": "Oturum Al" + }, + "html_history_migrate_tabs": { + "message": "Sekmeleri taşı" + }, + "html_history_migrate_old_id": { + "message": "Eski TGS Uzantı kimliği" + }, + "html_notice_title": { + "message": "Not" + }, + "html_notice_important_notice": { + "message": "Marvellous Suspender'dan önemli uyarı" + }, + "html_options_title": { + "message": "Ayarlar" + }, + "html_options_suspend_title": { + "message": "Otomatik sekme askıya alma" + }, + "html_options_suspended_title": { + "message": "Askıya alınmış sekmeler" + }, + "html_options_other_title": { + "message": "Diğer" + }, + "html_options_suspend_automatically_after": { + "message": "Otomatik sekmeyi askıya al" + }, + "html_options_suspend_never": { + "message": "Hiç" + }, + "html_options_suspend_seconds": { + "message": "saniye" + }, + "html_options_suspend_minute": { + "message": "dakika" + }, + "html_options_suspend_minutes": { + "message": "dakika" + }, + "html_options_suspend_hour": { + "message": "saat" + }, + "html_options_suspend_hours": { + "message": "saat" + }, + "html_options_suspend_day": { + "message": "gün" + }, + "html_options_suspend_days": { + "message": "gün" + }, + "html_options_suspend_week": { + "message": "hafta" + }, + "html_options_suspend_weeks": { + "message": "hafta" + }, + "html_options_suspend_no_pinned": { + "message": "Sabitlenmiş sekmeleri asla askıya al yapma" + }, + "html_options_suspend_no_forms": { + "message": "Asla kaydedilmemiş form girişleri içeren sekmeleri askıya al yapma" + }, + "html_options_suspend_no_audio": { + "message": "Asla ses çalan sekmelere askıya al yapma" + }, + "html_options_suspend_only_connected": { + "message": "Çevrimdışı olduğunda askıya al yapma" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "Güç kaynağına bağlı iken sekmeleri askıya al yapma" + }, + "html_options_suspend_no_active_tabs": { + "message": "Asla aktif penceredeki sekmeye askıya al yapma" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "Sekme görüntülendiğinde askısını kaldır" + }, + "html_options_suspend_discard_after_suspend": { + "message": "Askıya alırken Chrome'un dahili hafıza tasarrufunu uygula" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "Askıya alınmış bir sekmenin bellek kullanımını daha da azaltarak" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "Chrome'un yerleşil 'sekme atma' özelliği. Bu sonuçlabilir" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "çok sayıda sekmeler ile çalışırken %500'e varan bellek tasarrufu." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "Ancak, seçildiğinde askıya alınmış sekmede." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "işlem işlemede gecikmeye sebep olur." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "Bilgi için Chrome'un referans bilgisi:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "Tema" + }, + "html_options_suspend_theme_light": { + "message": "Açık" + }, + "html_options_suspend_theme_dark": { + "message": "Koyu" + }, + "html_options_suspend_screen_capturing": { + "message": "Ekran görüntüsü yakalama" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "Devre dışı" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "Sadece ekranın üst kısmını yakala" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "Tüm sayfayı yakala" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "Askıya alınmış bir sekmede, uzantı sekmenin ne olduğuna ilişkin resim önizlemesi görüntüleyebilir" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "askıya alınmamış hali gibi." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "Ekran görüntüsü yakalama özelliği önemli miktarda işlemci (cpu) kullanımına sebep olabilir" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "ve az miktarda bellek kullanımına." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "Sekmelerin askıya alınması uzun zaman alıyorsa veya chrome uygulamasında " + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "beklenmedik çekilde çökme vb. olursa, bu özelliği kapatmayı deneyin." + }, + "html_options_suspend_force_screen_capture": { + "message": "Yüksek kaliteli ekran görüntüsü yakalamayı etkinleştir" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "Devre dışı olduğunda, ekran görüntü yakalaması performansa yardımcı olmak için aşağıdaki sınırlamalara sahiptir:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- Düşük kalite ekran görüntüsü yakalama" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- Ekran yakalama görüntüsü oluşturması 1 dakikadan uzun sürerse görüntü yakalanamaz" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- Ekran görüntüsü yakalamanın maksimum yüksekliği 5000px" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "Yüksek kaliteli ekran görüntüsü yakalama modu etkinleştirildiğinde işlemci (CPU) yükünü önemli şekilde yükseltebilir" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "ve bellek kullanımı." + }, + "html_options_whitelist_title": { + "message": "Aşağıdaki listede bulunan URL adreslerine askıya al yapma:" + }, + "html_options_whitelist_tooltip_line1": { + "message": "Beyaz listeye eklemek istediğiniz her sayfanın URL'sini yeni bir satıra ekleyin. Örneğin:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "Tek bir satırda birden fazla siteyi beyaz listeye almak için URL’nin bir bölümünü belirleyebilirsiniz:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "Ayrıca, slash vb. ekleyerek de düzenli ifadeler belirleyebilirsiniz:" + }, + "html_options_whitelist_test": { + "message": "Beyaz liste test" + }, + "html_options_other_enable_context_menu": { + "message": "Sağ tuş menüye Marvellous Suspender için menü ekle" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "Web sayfasının sağ tıklama menüsüne bu uzantı için kontrol ekle." + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "Gelişmiş askıya alma işlemlerine" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "buradan erişmenizi sağlayacaktır." + }, + "html_options_other_enable_sync": { + "message": "Ayarları Chrome profilinizle senkronize yap" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "Yaptığınız uzantı ayarları, aynı profil ile giriş yaptığınız tarayıcı" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "arasında senkronize edilir." + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "Bu aynı zamanda ayarları gizli modda senkronize edecektir." + }, + "html_options_other_enable_sync_warning": { + "message": "Bunu açtığınızda, aynı Chrome profilinde oturum açan tarayıcıların ayarlarının üzerine yazılacak" + }, + "html_options_suspend_on_low_memory": { + "message": "Sistem belleği çok azaldığında anında askıya al" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "Bu seçenek, Chrome'un otomatik sekme atma özelliğini geçersiz kılar." + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "Etkinleştirilirse, Chrome tarafından atılmak yerine sekmeyi askıya almaya zorlar." + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "Genellikle, Chrome yalnızca sistem belleği çok azaldığında sekmeleri atar." + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "Lütfen dikkat: Bu, sekmelerin sahip olduğunuz süreden daha erken askıya alınmasına sebep olabilir." + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "otomatik sekme askıya alma seçeneklerinde belirtilen." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "Daha fazla bilgi için Chrome'un referansına bakınız:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "Bu sekmenin askısını kaldır" + }, + "html_popup_suspend_tab": { + "message": "Bu sekmeyi askıya al" + }, + "html_popup_dont_suspend_now": { + "message": "Şimdilik askıya almasını kaldır" + }, + "html_popup_never_suspend_domain": { + "message": "Bu alanadını hiçbir zaman askıya alma" + }, + "html_popup_never_suspend_page": { + "message": "Bu URL adresini hiçbir zaman askıya alma" + }, + "html_popup_suspend_other_tabs": { + "message": "Diğer seklemeri askıya al" + }, + "html_popup_unsuspend_all_tabs": { + "message": "Tüm sekmelerin askısını kaldır" + }, + "html_popup_suspend_selected_tabs": { + "message": "Seçilen sekmeyi askıya al" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "Seçilen sekmenin askısını kaldır" + }, + "html_popup_settings": { + "message": "Ayarlar" + }, + "html_restoring_title": { + "message": "Pencere geri yükleniyor" + }, + "html_restoring_heading": { + "message": "Sekmeler geri yükleniyor" + }, + "html_restoring_detail": { + "message": "Bu pencereyi geri yüklerken lütfen bekleyin..." + }, + "html_recovery_title": { + "message": "Kurtarma" + }, + "html_recovery_ruh_roh": { + "message": "Ruh roh!" + }, + "html_recovery_description_line1": { + "message": "Uzantının çökmesinden kurtuldunuz gibi görünüyor." + }, + "html_recovery_description_line2": { + "message": "Askıya alınan sekmeleriniz çökmüş veya kaybolmuş olabilir." + }, + "html_recovery_restore_tabs_automatically": { + "message": "Sekmeleri otomatik geri yükle" + }, + "html_recovery_go_to_session_manager": { + "message": "Oturum yöneticisine git" + }, + "html_recovery_important_message": { + "message": "Şu anda ekran görüntüsü yakalamayı açtınız. Bu uzantı art arda çöküyorsa, bu seçeneği devre dışı bırakmanız önerilir." + }, + "html_recovery_disable_screen_capturing": { + "message": "Ekran görüntüsü yakalama devre dışı" + }, + "html_recovery_tabs_to_restore": { + "message": "Sekmeleri geri yükle" + }, + "html_shortcuts_title": { + "message": "Klavye kısayolları" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "Klavye kısayolları" + }, + "html_shortcuts_context_menu_note": { + "message": "Not: Bu işlemlere mouse sağ tuş menü üzerinden de erişilebilir." + }, + "html_shortcuts_remap_keys": { + "message": "Klavye kısayol değiştir" + }, + "html_sidebar_general_settings": { + "message": "Ayarlar" + }, + "html_sidebar_session_management": { + "message": "Oturum yöneticisi" + }, + "html_sidebar_shortcuts": { + "message": "Klavye kısayolları" + }, + "html_sidebar_support": { + "message": "Hakkında" + }, + "html_success_great_success": { + "message": "Başarılı!" + }, + "html_success_all_tabs_restored": { + "message": "Tüm sekmeleriniz geri yüklendi." + }, + "html_success_goto_advanced_prefix": { + "message": "Gelişmiş oturum yöneticisi için, ziyaret edin" + }, + "html_success_goto_advanced_suffix": { + "message": "sayfa" + }, + "html_session_manager": { + "message": "oturum yöneticisi" + }, + "html_suspended_title": { + "message": "Askıya Alınmış Sekme" + }, + "html_suspended_tab_suspended": { + "message": "Sekme askıya alındı" + }, + "html_suspended_tab_reload": { + "message": "Sekmeyi Yeniden Yükle" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "Askıya Alma Yapma" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "Sayfa askıya alındı.\n\nSayfayı geri yüklemek için tıklayın veya sayfayı yenileyin." + }, + "html_suspended_toast_not_connected": { + "message": "Internete bağlı değilsiniz" + }, + "html_suspended_toast_reload_disabled": { + "message": "Otomatik geri yükleme geçici olarak devre dışı." + }, + "html_permissions_title": { + "message": "Yetkiler" + }, + "html_permissions_heading": { + "message": "Yerel dosyalar için lütfen yetki veriniz" + }, + "html_permissions_info": { + "message": "Bu uzantı, \"file\" kelimesi ile başlayan URL’leri askıya almasına izin veremiyor.\nBunu değiştirmek için uzantı ayarları sayfasından ayrıntılarına girip \"Dosya URL'lerine erişime izin ver\" seçeneğini açınız." + }, + "html_permissions_backup": { + "message": "Lütfen dikkat: Bu seçeneğin değiştirilmesi, askıya alınan tüm sekmelerinizin kısa bir süre kaybolmasına neden olur.\nBu durumda şuanki oturumunu kaydetmeniz iyi bir seçenek olabilir." + }, + "html_update_title": { + "message": "Güncelle" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "The Marvellous Suspender yeni bir sürümü kurulmaya hazır.\nLütfen dikkat: Güncelleme sırasında askıya alınmış sekmeleriniz kısa bir süre kaybolacaktır." + }, + "html_update_info_withbackup": { + "message": "Şu anki sekmenin oturum yedeğini almak için uygun zaman olabilir." + }, + "html_update_info_nobackup_prefix": { + "message": "Şu anki oturumunuzun buradan kopyasını dışarı aktarma yapmanızı öneririz " + }, + "html_update_info_nobackup_suffix": { + "message": " güncellemeye devam etmeden önce." + }, + "html_updated_title": { + "message": "Güncellendi" + }, + "html_updating_heading": { + "message": "günceleniyor" + }, + "html_updating_message": { + "message": "Askıya alınmış sekmeleriniz geri yüklenirken lütfen bekleyiniz..." + }, + "html_updated_great_suspender_updated": { + "message": "güncellendi" + }, + "html_updated_info_line1": { + "message": "Güncelleme öncesinde sekmeleriniz otomatik olarak yedeklenir." + }, + "html_updated_info_line2_prefix": { + "message": "Güncelleme sırasında herhangi bir sorunla karşılaştıysanız, kaybolan sekmeleri geri yüklebilirsiniz " + }, + "html_updated_info_line2_suffix": { + "message": " sayfa." + }, + "html_updated_detail_header_prefix": { + "message": "Yenilikler " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "Yeni özellikler:" + }, + "html_updated_bug_fixes_header": { + "message": "Yamalar:" + }, + "html_updated_release_notes": { + "message": "Tüm sürüm notları için GitHub'ı ziyaret edin: " + }, + "html_updated_patch_message": { + "message": "Özür dileriz. Sadece biraz bakım yapmamız gerekiyor." + }, + "html_welcome_title": { + "message": "Hoşgeldiniz" + }, + "html_welcome_text_line1": { + "message": "Tekrar için deneniyor teşekkürler" + }, + "html_welcome_text_line2": { + "message": "Kullanmadığınız sekmeleri askıya alarak bilgisayarınızın sorunsuz çalışmasını sağlayabilirsiniz." + }, + "html_welcome_text_line3": { + "message": "Aşağıdaki ayarları hassas şekilde yapabilirsiniz." + }, + "js_popup_normal": { + "message": "Otomatik sekmeyi askıya al." + }, + "js_popup_normal_pause": { + "message": "Şimdi değil" + }, + "js_popup_special": { + "message": "Askıya alınmadı" + }, + "js_popup_suspended": { + "message": "Sekme askıya alındı" + }, + "js_popup_suspended_pause": { + "message": "Askı Duraklatıldı" + }, + "js_popup_whitelisted": { + "message": "Site beyaz listede." + }, + "js_popup_whitelisted_remove": { + "message": "Beyaz listeden kaldır" + }, + "js_popup_audible": { + "message": "Sekme ses çalıyor." + }, + "js_popup_form_input": { + "message": "Sekme form girişi yapıyor." + }, + "js_popup_form_input_unpause": { + "message": "Devam Et" + }, + "js_popup_pinned": { + "message": "Sekme sabit" + }, + "js_popup_temp_whitelist": { + "message": "Sekme askı durumu duraklatıldı." + }, + "js_popup_temp_whitelist_unpause": { + "message": "Devam Et" + }, + "js_popup_never": { + "message": "Otomatik sekme askıya alma devre dışı." + }, + "js_popup_no_connectivity": { + "message": "Ağ bağlantısı yok" + }, + "js_popup_charging": { + "message": "Güç kaynağına bağlandı" + }, + "js_popup_blockedFile": { + "message": "Yerel dosyalar askıya alınamaz." + }, + "js_popup_blockedFile_enable": { + "message": "Açık" + }, + "js_popup_unknown": { + "message": "Geri yükleme için sekme bekleniyor..." + }, + "js_popup_initialising": { + "message": "Uzantının başlatılması bekleniyor..." + }, + "js_popup_error": { + "message": "Bu sekme için otomatik askıya alma kullanılamıyor" + }, + "js_history_delete": { + "message": "Sil" + }, + "js_history_export": { + "message": "Dışa aktar" + }, + "js_history_reload": { + "message": "Aç ve yükle" + }, + "js_history_resuspend": { + "message": "Aç ve askıya al" + }, + "js_history_save": { + "message": "Kaydet" + }, + "js_history_window": { + "message": "Pencere" + }, + "js_history_windows": { + "message": "Pencere" + }, + "js_history_tab": { + "message": "Sekme" + }, + "js_history_tabs": { + "message": "Sekmeler" + }, + "js_history_enter_name_for_session": { + "message": "Bu oturum için bir isim girin" + }, + "js_history_confirm_delete": { + "message": "Bu oturumu silmek istediğinizden emin misiniz??" + }, + "js_history_confirm_session_overwrite": { + "message": "Bu oturum bu isim ile zaten kaydedilmiş. Üzerine kayıt yapılsın mı?" + }, + "js_history_import_fail": { + "message": "Dosya yükleme başarısız. Dosyanın düz metin olduğundan ve satır başına tek bir URL içerdiğinden emin olunuz." + }, + "js_history_migrate_fail": { + "message": "Şuradan taşımak için 32 karakterlik uzantı kimliği gerekli" + }, + "js_history_migrate_success": { + "message": "$TABCOUNT$ sekme başarıyla taşındı", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "Bu web sitesini beyaz listeden kaldır" + }, + "js_suspended_hotkey_to_reload": { + "message": "Klavye kısayolları" + }, + "js_suspended_low_memory": { + "message": "Düşük sistem belleği nedeni ile sekme askıya alındı" + }, + "js_options_incognito_warning": { + "message": "Gizli moddasınız. Bazı özellikler kullanılamayacak." + }, + "js_options_whitelist_no_matches": { + "message": "Mevcut beyaz listeyle eşleşen açık sekme yok." + }, + "js_options_whitelist_matches_heading": { + "message": "Sekme beyaz listesi:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "ve" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "dahası." + }, + "js_permissions_button_export": { + "message": "Yedeği kaydet" + }, + "js_permissions_button_set": { + "message": "Uzantı ayarlarını aç" + }, + "js_update_confirm": { + "message": "Henüz bir yedekleme yapmadınız. Uzantıyı yine de güncellensin mi?" + }, + "js_update_button_export": { + "message": "Yedeği sakla" + }, + "js_update_button_reload": { + "message": "Uzantı güncelle" + }, + "js_shortcuts_not_set": { + "message": "tanımsız" + }, + "js_session_save_point": { + "message": "v için otomatik kaydetme noktası" + } } diff --git a/src/_locales/zh_CN/messages.json b/src/_locales/zh_CN/messages.json index 1eec5a20..08e37133 100644 --- a/src/_locales/zh_CN/messages.json +++ b/src/_locales/zh_CN/messages.json @@ -1,242 +1,787 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "冻结暂时用不到的标签页,以便释放系统资源。" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "冻结/恢复当前标签页" }, - "ext_cmd_toggle_tab_pause_description": { "message": "暂停/取消暂停当前标签页的冻结" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "冻结已选择标签页" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "恢复已选择标签页" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "冻结当前窗口中所有的标签页" }, - "ext_cmd_force_suspend_active_window_description": { "message": "强制冻结当前窗口中的所有标签页" }, - "ext_cmd_unsuspend_active_window_description": { "message": "恢复当前窗口中所有的标签页" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "冻结所有窗口的所有标签页" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "强制冻结所有窗口的所有标签页" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "恢复所有窗口的所有标签页" }, - "js_context_open_link_in_suspended_tab": { "message": "在新的冻结标签页打开链接" }, - "js_context_toggle_suspend_state": { "message": "冻结/恢复此标签页" }, - "js_context_toggle_pause_suspension": { "message": "暂停/取消暂停此标签页的冻结" }, - "js_context_never_suspend_domain": { "message": "永远不要冻结此域名" }, - "js_context_never_suspend_page": { "message": "永远不要冻结此页面" }, - "js_context_suspend_selected_tabs": { "message": "冻结已选择标签页" }, - "js_context_unsuspend_selected_tabs": { "message": "恢复已选择标签页" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "冻结当前窗口中所有的标签页" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "强制冻结当前窗口中的所有标签页" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "恢复当前窗口中所有的标签页" }, - "js_context_soft_suspend_all_tabs": { "message": "冻结所有窗口的所有标签页" }, - "js_context_force_suspend_all_tabs": { "message": "强制冻结所有窗口的所有标签页" }, - "js_context_unsuspend_all_tabs": { "message": "恢复所有窗口的所有标签页" }, - "html_about_title": { "message": "关于" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "如果您有反馈意见或者想报告问题,可以在" }, - "html_about_report_issues_suffix": { "message": ". 在提出新的想法或问题之前,请检查相关想法或问题是否已存在。谢谢!" }, - "html_about_debugging_prefix": { "message": "要启用日志记录或设置调试断点,请转至" }, - "html_about_debugging_suffix": { "message": "调试页面。" }, - "html_about_the_github_issues_page": { "message": "GitHub 上进行" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "这个扩展使用了 Niklas von Hertzen 编写的" }, - "html_about_html2canvas_suffix": { "message": "项目。" }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "也使用了 Aaron Powell 撰写编写的" }, - "html_about_indexedDb_suffix": { "message": "项目" }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "同时也感谢" }, - "html_about_browserstack_suffix": { "message": "提供免费的 Chrome 测试工具" }, - "html_history_title": { "message": "会话管理" }, - "html_history_current_session": { "message": "当前会话" }, - "html_history_recent_sessions": { "message": "最近会话" }, - "html_history_saved_sessions": { "message": "已储存会话" }, - "html_history_import_session": { "message": "导入会话" }, - "html_notice_title": { "message": "通知" }, - "html_notice_important_notice": { "message": "来自 The Great Suspender 的重要通知" }, - "html_options_title": { "message": "设置" }, - "html_options_suspend_title": { "message": "标签页自动冻结" }, - "html_options_suspended_title": { "message": "冻结的标签页" }, - "html_options_other_title": { "message": "其他设置" }, - "html_options_suspend_automatically_after": { "message": "多久后自动冻结标签页" }, - "html_options_suspend_never": { "message": "永不" }, - "html_options_suspend_seconds": { "message": "秒" }, - "html_options_suspend_minute": { "message": "分钟" }, - "html_options_suspend_minutes": { "message": "分钟" }, - "html_options_suspend_hour": { "message": "小时" }, - "html_options_suspend_hours": { "message": "小时" }, - "html_options_suspend_day": { "message": "天" }, - "html_options_suspend_days": { "message": "天" }, - "html_options_suspend_week": { "message": "周" }, - "html_options_suspend_weeks": { "message": "周" }, - "html_options_suspend_no_pinned": { "message": "不要冻结已固定的标签页" }, - "html_options_suspend_no_forms": { "message": "不要冻结输入框有文字且尚未储存的标签页" }, - "html_options_suspend_no_audio": { "message": "不要冻结正在播放声音的标签页" }, - "html_options_suspend_only_connected": { "message": "只在联网时才自动冻结" }, - "html_options_suspend_only_on_battery": { "message": "只在未充电时才自动冻结" }, - "html_options_suspend_no_active_tabs": { "message": "不要冻结每个窗口中的正在使用中的标签页" }, - "html_options_suspend_automatically_unsuspend": { "message": "当标签页被浏览就自动恢复标签页" }, - "html_options_suspend_discard_after_suspend": { "message": "冻结时应用 Chrome 内置的内存节省功能" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "通过启用 Chrome 内置的内存节省功能,可以更多的降低内存使用。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "当多个标签页同时打开时,可以降低 500% 的系统内存消耗。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "但是,当重新打开一个被冻结/暂停的标签页时,会导致页面有微小的加载延时。" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "有关 Chrome discarding 的更多信息,请参阅:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "主题" }, - "html_options_suspend_theme_light": { "message": "浅色" }, - "html_options_suspend_theme_dark": { "message": "深色" }, - "html_options_suspend_screen_capturing": { "message": "屏幕截图" }, - "html_options_suspend_screen_capturing_disabled": { "message": "停用" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "只截取可见的画面" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "截取整个页面" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "在暂停的标签页上,扩展会显示该标签页在被冻结时的图像预览" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "屏幕截图功能是实验性的,可能会导致明显的 CPU 占用以及内存使用量略微增加。" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "如果您注意到奇怪的行为,如标签页需要很长时间才能冻结,或者 Chrome 意外崩溃,请尝试关闭此功能。" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "" }, - "html_options_suspend_force_screen_capture": { "message": "启用高质量的屏幕截图模式" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "禁用时,屏幕截图具有以下限制以帮助提高性能:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- 低质量的屏幕截图" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- 如果生成图像需要 1 分钟以上,将不会使用屏幕截图" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- 图片的最大高度限制为 5000 像素" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "启用高质量的屏幕截图模式可能会显着增加 CPU 负载和内存使用量。" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "" }, - "html_options_whitelist_title": { "message": "白名单" }, - "html_options_whitelist_tooltip_line1": { "message": "在每一行上添加要列入白名单的每个页面的 URL。例如:" }, - "html_options_whitelist_tooltip_line2": { "message": "要在一行中将多个网站列入白名单,可以指定 URL 的一部分:" }, - "html_options_whitelist_tooltip_line3": { "message": "您还可以通过正则表达式将 URL 添加白名单:" }, - "html_options_whitelist_test": { "message": "测试白名单" }, - "html_options_other_enable_context_menu": { "message": "把 The Great Suspender 加到右键菜单" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "将控件添加到网页的右键单击菜单。" }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "这样,您就可以访问扩展中在其他地方无法使用的高级冻结操作了。" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "" }, - "html_options_other_enable_sync": { "message": "在不同系统之间同步设置" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "扩展的设置将在所有使用相同配置文件登录的 Chrome 浏览器中同步" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "。" }, - "html_options_other_enable_sync_tooltip_line2": { "message": "在无痕模式下也会进行设置同步。" }, - "html_options_other_enable_sync_warning": { "message": "打开此项将覆盖其他同步系统上保存的设置" }, - "html_options_suspend_on_low_memory": { "message": "当系统内存变得非常低时冻结标签页" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "此选项会覆盖 Chrome 的 automatic tab discarding 功能。" }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "如果启用,该页面将被强制冻结,而不是被 Chrome 删除。" }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "通常,Chrome 仅在系统内存非常低时删除页面。" }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "注意:这可能导致标签页在“标签页自动冻结”选项中指定的时间之前冻结。" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "" }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "有关 automatic tab discarding 的更多信息,请参阅:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "恢复当前标签页" }, - "html_popup_suspend_tab": { "message": "冻结此标签页" }, - "html_popup_dont_suspend_now": { "message": "现在还不要冻结" }, - "html_popup_never_suspend_domain": { "message": "永远不要冻结此域名" }, - "html_popup_never_suspend_page": { "message": "永远不要冻结此网页" }, - "html_popup_suspend_other_tabs": { "message": "冻结其他标签页" }, - "html_popup_unsuspend_all_tabs": { "message": "恢复所有标签页" }, - "html_popup_suspend_selected_tabs": { "message": "冻结已选择标签页" }, - "html_popup_unsuspend_selected_tabs": { "message": "恢复已选择标签页" }, - "html_popup_settings": { "message": "设置" }, - "html_restoring_title": { "message": "恢复窗口" }, - "html_restoring_heading": { "message": "恢复标签页" }, - "html_restoring_detail": { "message": "恢复此窗口中,请稍等..." }, - "html_recovery_title": { "message": "复原" }, - "html_recovery_ruh_roh": { "message": "噢!" }, - "html_recovery_description_line1": { "message": "看来你刚从崩溃的扩展恢复过来。" }, - "html_recovery_description_line2": { "message": "你之前冻结的标签页有可能无法还原。" }, - "html_recovery_restore_tabs_automatically": { "message": "自动恢复标签页" }, - "html_recovery_go_to_session_manager": { "message": "前往会话管理器" }, - "html_recovery_important_message": { "message": "你目前已开启屏幕截图,如果扩展多次崩溃,建议你取消勾选。" }, - "html_recovery_disable_screen_capturing": { "message": "关闭屏幕截图" }, - "html_recovery_tabs_to_restore": { "message": "标签页恢复" }, - "html_shortcuts_title": { "message": "键盘快捷键" }, - "html_shortcuts_keyboard_shortcuts": { "message": "键盘快捷键" }, - "html_shortcuts_context_menu_note": { "message": "注意:您也可以通过右键单击上下文菜单来使用这些操作。" }, - "html_shortcuts_remap_keys": { "message": "修改键盘快捷键" }, - "html_sidebar_general_settings": { "message": "设置" }, - "html_sidebar_session_management": { "message": "会话管理" }, - "html_sidebar_shortcuts": { "message": "键盘快捷键" }, - "html_sidebar_support": { "message": "关于" }, - "html_success_great_success": { "message": "成功!" }, - "html_success_all_tabs_restored": { "message": "你所有的标签页均已恢复完成。" }, - "html_success_goto_advanced_prefix": { "message": "进阶的会话管理,请前往" }, - "html_success_goto_advanced_suffix": { "message": "" }, - "html_session_manager": { "message": "会话管理页面" }, - "html_suspended_title": { "message": "冻结标签页" }, - "html_suspended_tab_suspended": { "message": "标签页已被冻结" }, - "html_suspended_tab_reload": { "message": "重新加载标签页" }, - "html_suspended_tab_whitelist_prefix": { "message": "永远不要冻结" }, - "html_suspended_tab_whitelist_suffix": { "message": "..." }, - "html_suspended_click_to_reload": { "message": "刷新页面或点击此处重新加载" }, - "html_suspended_toast_not_connected": { "message": "您未连接网络" }, - "html_suspended_toast_reload_disabled": { "message": "暂时禁用标签页自动重新加载。" }, - "html_permissions_title": { "message": "许可权限" }, - "html_permissions_heading": { "message": "请授予允许访问本地文件 URL 的权限" }, - "html_permissions_info": { "message": "这个扩展目前不允许冻结那些以 \"file\" 开头的 URL 链接。\n要想改变这个设置, 可以在扩展设置页面打开允许访问文件 URL 的设置。" }, - "html_permissions_backup": { "message": "请注意:改变这个设置可能会使你当前所有的冻结标签页短暂的消失。\n为了以防万一,最好对当前标签页的会话的做备份。" }, - "html_update_title": { "message": "更新" }, - "html_update_heading2": { "message": "即将变得更好" }, - "html_update_info": { "message": "一个新版本的 The Great Suspender 已准备好安装。\n请注意:冻结的页面将在更新过程中暂时消失。" }, - "html_update_info_withbackup": { "message": "为了以防万一,最好对当前标签页的会话的做备份。" }, - "html_update_info_nobackup_prefix": { "message": "强烈建议您在继续更新之前在 " }, - "html_update_info_nobackup_suffix": { "message": " 导出当前标签页会话的备份。" }, - "html_updated_title": { "message": "更新" }, - "html_updating_heading": { "message": "正在更新" }, - "html_updating_message": { "message": "恢复冻结的标签页中,请稍等..." }, - "html_updated_great_suspender_updated": { "message": "已更新" }, - "html_updated_info_line1": { "message": "更新之前,您的标签页已被自动保存。" }, - "html_updated_info_line2_prefix": { "message": "如果在更新过程中遇到任何问题,可以从 " }, - "html_updated_info_line2_suffix": { "message": " 页面中恢复丢失的标签页。" }, - "html_updated_detail_header_prefix": { "message": "在 " }, - "html_updated_detail_header_suffix": { "message": "有什么新功能?" }, - "html_updated_new_features_header": { "message": "新的功能:" }, - "html_updated_bug_fixes_header": { "message": "Bug 修复:" }, - "html_updated_release_notes": { "message": "请浏览 GitHub 获取完整的发行说明: " }, - "html_updated_patch_message": { "message": "很抱歉打扰你。我们需要做一些小维护。" }, - "html_welcome_title": { "message": "欢迎来到" }, - "html_welcome_text_line1": { "message": "感谢你安装" }, - "html_welcome_text_line2": { "message": "我能把你暂时不用的标签页冻结起来,希望这会让你的电脑运行地更流畅一些。" }, - "html_welcome_text_line3": { "message": "您可以在下面更改设置" }, - "js_popup_normal": { "message": "标签页将会自动被冻结。" }, - "js_popup_normal_pause": { "message": "暂时不要冻结" }, - "js_popup_special": { "message": "标签页无法被冻结" }, - "js_popup_suspended": { "message": "标签页已经被冻结" }, - "js_popup_suspended_pause": { "message": "暂时不要冻结" }, - "js_popup_whitelisted": { "message": "白名单。" }, - "js_popup_whitelisted_remove": { "message": "从白名单移除" }, - "js_popup_audible": { "message": "标签页正在播放声音。" }, - "js_popup_form_input": { "message": "标签页有文字还在输入。" }, - "js_popup_form_input_unpause": { "message": "取消暂停" }, - "js_popup_pinned": { "message": "标签页已经被固定" }, - "js_popup_temp_whitelist": { "message": "页面冻结暂停。" }, - "js_popup_temp_whitelist_unpause": { "message": "取消暂停" }, - "js_popup_never": { "message": "禁止自动冻结标签页。" }, - "js_popup_no_connectivity": { "message": "网络未连接" }, - "js_popup_charging": { "message": "已接上电源" }, - "js_popup_blockedFile": { "message": "无法冻结本地文件。" }, - "js_popup_blockedFile_enable": { "message": "启用" }, - "js_popup_unknown": { "message": "等待页面加载..." }, - "js_popup_initialising": { "message": "等待扩展初始化..." }, - "js_popup_error": { "message": "自动冻结在此页面上不可用" }, - "js_history_delete": { "message": "删除" }, - "js_history_export": { "message": "导出" }, - "js_history_reload": { "message": "重新加载" }, - "js_history_resuspend": { "message": "重新冻结" }, - "js_history_save": { "message": "保存" }, - "js_history_window": { "message": " 个窗口" }, - "js_history_tab": { "message": " 个标签页" }, - "js_history_plural": { "message": "" }, - "js_history_enter_name_for_session": { "message": "为此会话命名" }, - "js_history_confirm_delete": { "message": "你确定要删除此会话吗?" }, - "js_history_confirm_session_overwrite": { "message": "已经保存有同名的会话。要覆盖现有会话吗?" }, - "js_history_import_fail": { "message": "无法导入文件。确保文件是纯文本,并且每行只有一条 URL。" }, - "js_suspended_remove_from_whitelist": { "message": "从白名单移除" }, - "js_suspended_hotkey_to_reload": { "message": "设置键盘快捷键" }, - "js_suspended_low_memory": { "message": "由于系统内存不足而冻结的页面" }, - "js_options_incognito_warning": { "message": "您现在处于无痕模式。某些功能将无法使用。" }, - "js_options_whitelist_no_matches": { "message": "没有与当前白单匹配的打开标签页。" }, - "js_options_whitelist_matches_heading": { "message": "这些打开标签页签符合当前白名单:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "和另外" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "个。" }, - "js_permissions_button_export": { "message": "导出备份" }, - "js_permissions_button_set": { "message": "打开扩展设置" }, - "js_update_confirm": { "message": "您尚未保存备份。即使如此也要更新扩展吗?" }, - "js_update_button_export": { "message": "导出备份" }, - "js_update_button_reload": { "message": "现在更新扩展" }, - "js_shortcuts_not_set": { "message": "未设置" }, - "js_session_save_point": { "message": "自动保存点 v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "冻结暂时用不到的标签页,以便释放系统资源。" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "冻结/恢复当前标签页" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "暂停/取消暂停当前标签页的冻结" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "冻结已选择标签页" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "恢复已选择标签页" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "冻结当前窗口中所有的标签页" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "强制冻结当前窗口中的所有标签页" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "恢复当前窗口中所有的标签页" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "冻结所有窗口的所有标签页" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "强制冻结所有窗口的所有标签页" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "恢复所有窗口的所有标签页" + }, + "js_context_open_link_in_suspended_tab": { + "message": "在新的冻结标签页打开链接" + }, + "js_context_toggle_suspend_state": { + "message": "冻结/恢复此标签页" + }, + "js_context_toggle_pause_suspension": { + "message": "暂停/取消暂停此标签页的冻结" + }, + "js_context_never_suspend_domain": { + "message": "永远不要冻结此域名" + }, + "js_context_never_suspend_page": { + "message": "永远不要冻结此页面" + }, + "js_context_suspend_selected_tabs": { + "message": "冻结已选择标签页" + }, + "js_context_unsuspend_selected_tabs": { + "message": "恢复已选择标签页" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "冻结当前窗口中所有的标签页" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "强制冻结当前窗口中的所有标签页" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "恢复当前窗口中所有的标签页" + }, + "js_context_soft_suspend_all_tabs": { + "message": "冻结所有窗口的所有标签页" + }, + "js_context_force_suspend_all_tabs": { + "message": "强制冻结所有窗口的所有标签页" + }, + "js_context_unsuspend_all_tabs": { + "message": "恢复所有窗口的所有标签页" + }, + "html_about_title": { + "message": "关于" + }, + "html_about_fork_beginning": { + "message": "基于最初的" + }, + "html_about_fork_mid": { + "message": "在 GitHub 上可用,没有 ADS 跟踪" + }, + "html_about_fork_end": { + "message": ",更多信息在" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "如果您有反馈意见或者想报告问题,可以在" + }, + "html_about_report_issues_suffix": { + "message": ". 在提出新的想法或问题之前,请检查相关想法或问题是否已存在。谢谢!" + }, + "html_about_debugging_prefix": { + "message": "要启用日志记录或设置调试断点,请转至" + }, + "html_about_debugging_suffix": { + "message": "调试页面。" + }, + "html_about_the_github_issues_page": { + "message": "GitHub 上进行" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "这个扩展使用了 Niklas von Hertzen 编写的" + }, + "html_about_html2canvas_suffix": { + "message": "项目。" + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "也使用了 Aaron Powell 撰写编写的" + }, + "html_about_indexedDb_suffix": { + "message": "项目" + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "同时也感谢" + }, + "html_about_browserstack_suffix": { + "message": "提供免费的 Chrome 测试工具" + }, + "html_about_tgs_prefix": { + "message": "如果没有这个扩展,就不可能存在" + }, + "html_about_tgs_suffix": { + "message": "." + }, + "html_broken_title": { + "message": "已损坏" + }, + "html_broken_ruh_roh": { + "message": "哦吼!" + }, + "html_broken_line1": { + "message": "启动失败。也许您正在使用不兼容的Chrome版本?" + }, + "html_broken_line2": { + "message": "请尝试重新启动扩展。如果问题仍然存在,请在下面寻求帮助" + }, + "html_broken_line2_github_page": { + "message": "GitHub 项目页" + }, + "html_broken_line3": { + "message": "您可以从这里恢复丢失的标签页:" + }, + "html_broken_line3_session_management": { + "message": "会话管理页面" + }, + "html_broken_button_restart_extension": { + "message": "重启扩展" + }, + "html_history_title": { + "message": "会话管理" + }, + "html_history_current_session": { + "message": "当前会话" + }, + "html_history_recent_sessions": { + "message": "最近会话" + }, + "html_history_saved_sessions": { + "message": "已储存会话" + }, + "html_history_import_session": { + "message": "导入会话" + }, + "html_history_migrate_tabs": { + "message": "迁移标签" + }, + "html_history_migrate_old_id": { + "message": "旧TGS 扩展 id" + }, + "html_notice_title": { + "message": "通知" + }, + "html_notice_important_notice": { + "message": "来自 The Marvellous Suspender 的重要通知" + }, + "html_options_title": { + "message": "设置" + }, + "html_options_suspend_title": { + "message": "标签页自动冻结" + }, + "html_options_suspended_title": { + "message": "冻结的标签页" + }, + "html_options_other_title": { + "message": "其他设置" + }, + "html_options_suspend_automatically_after": { + "message": "多久后自动冻结标签页" + }, + "html_options_suspend_never": { + "message": "永不" + }, + "html_options_suspend_seconds": { + "message": "秒" + }, + "html_options_suspend_minute": { + "message": "分钟" + }, + "html_options_suspend_minutes": { + "message": "分钟" + }, + "html_options_suspend_hour": { + "message": "小时" + }, + "html_options_suspend_hours": { + "message": "小时" + }, + "html_options_suspend_day": { + "message": "天" + }, + "html_options_suspend_days": { + "message": "天" + }, + "html_options_suspend_week": { + "message": "周" + }, + "html_options_suspend_weeks": { + "message": "周" + }, + "html_options_suspend_no_pinned": { + "message": "不要冻结已固定的标签页" + }, + "html_options_suspend_no_forms": { + "message": "不要冻结输入框有文字且尚未储存的标签页" + }, + "html_options_suspend_no_audio": { + "message": "不要冻结正在播放声音的标签页" + }, + "html_options_suspend_only_connected": { + "message": "只在联网时才自动冻结" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "只在未充电时才自动冻结" + }, + "html_options_suspend_no_active_tabs": { + "message": "不要冻结每个窗口中的正在使用中的标签页" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "当标签页被浏览就自动恢复标签页" + }, + "html_options_suspend_discard_after_suspend": { + "message": "冻结时应用 Chrome 内置的内存节省功能" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "通过启用 Chrome 内置的内存节省功能,可以更多的降低内存使用。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "当多个标签页同时打开时,可以降低 500% 的系统内存消耗。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "to 500% memory savings when working with large numbers of tabs." + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "但是,当重新打开一个被冻结/暂停的标签页时,会导致页面有微小的加载延时。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "a suspended tab." + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "有关 Chrome discarding 的更多信息,请参阅:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "主题" + }, + "html_options_suspend_theme_light": { + "message": "浅色" + }, + "html_options_suspend_theme_dark": { + "message": "深色" + }, + "html_options_suspend_screen_capturing": { + "message": "屏幕截图" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "停用" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "只截取可见的画面" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "截取整个页面" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "在暂停的标签页上,扩展会显示该标签页在被冻结时的图像预览" + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "looked like just before it was suspended." + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "屏幕截图功能是实验性的,可能会导致明显的 CPU 占用以及内存使用量略微增加。" + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "well as slightly increased memory usage." + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "如果您注意到奇怪的行为,如标签页需要很长时间才能冻结,或者 Chrome 意外崩溃,请尝试关闭此功能。" + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "crashing unexpectedly, try turning this feature off." + }, + "html_options_suspend_force_screen_capture": { + "message": "启用高质量的屏幕截图模式" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "禁用时,屏幕截图具有以下限制以帮助提高性能:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- 低质量的屏幕截图" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- 如果生成图像需要 1 分钟以上,将不会使用屏幕截图" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- 图片的最大高度限制为 5000 像素" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "启用高质量的屏幕截图模式可能会显着增加 CPU 负载和内存使用量。" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "and memory usage." + }, + "html_options_whitelist_title": { + "message": "白名单" + }, + "html_options_whitelist_tooltip_line1": { + "message": "在每一行上添加要列入白名单的每个页面的 URL。例如:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "要在一行中将多个网站列入白名单,可以指定 URL 的一部分:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "您还可以通过正则表达式将 URL 添加白名单:" + }, + "html_options_whitelist_test": { + "message": "测试白名单" + }, + "html_options_other_enable_context_menu": { + "message": "把 The Marvellous Suspender 加到右键菜单" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "将控件添加到网页的右键单击菜单。" + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "这样,您就可以访问扩展中在其他地方无法使用的高级冻结操作了。" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "elsewhere in the extension." + }, + "html_options_other_enable_sync": { + "message": "在不同系统之间同步设置" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "扩展的设置将在所有使用相同配置文件登录的 Chrome 浏览器中同步" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "。" + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "在无痕模式下也会进行设置同步。" + }, + "html_options_other_enable_sync_warning": { + "message": "打开此项将覆盖其他同步系统上保存的设置" + }, + "html_options_suspend_on_low_memory": { + "message": "当系统内存变得非常低时冻结标签页" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "此选项会覆盖 Chrome 的 automatic tab discarding 功能。" + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "如果启用,该页面将被强制冻结,而不是被 Chrome 删除。" + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "通常,Chrome 仅在系统内存非常低时删除页面。" + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "注意:这可能导致标签页在“标签页自动冻结”选项中指定的时间之前冻结。" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "specified in the Automatic tab suspension options." + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "有关 automatic tab discarding 的更多信息,请参阅:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "恢复当前标签页" + }, + "html_popup_suspend_tab": { + "message": "冻结此标签页" + }, + "html_popup_dont_suspend_now": { + "message": "现在还不要冻结" + }, + "html_popup_never_suspend_domain": { + "message": "永远不要冻结此域名" + }, + "html_popup_never_suspend_page": { + "message": "永远不要冻结此网页" + }, + "html_popup_suspend_other_tabs": { + "message": "冻结其他标签页" + }, + "html_popup_unsuspend_all_tabs": { + "message": "恢复所有标签页" + }, + "html_popup_suspend_selected_tabs": { + "message": "冻结已选择标签页" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "恢复已选择标签页" + }, + "html_popup_settings": { + "message": "设置" + }, + "html_restoring_title": { + "message": "恢复窗口" + }, + "html_restoring_heading": { + "message": "恢复标签页" + }, + "html_restoring_detail": { + "message": "恢复此窗口中,请稍等..." + }, + "html_recovery_title": { + "message": "复原" + }, + "html_recovery_ruh_roh": { + "message": "噢!" + }, + "html_recovery_description_line1": { + "message": "看来你刚从崩溃的扩展恢复过来。" + }, + "html_recovery_description_line2": { + "message": "你之前冻结的标签页有可能无法还原。" + }, + "html_recovery_restore_tabs_automatically": { + "message": "自动恢复标签页" + }, + "html_recovery_go_to_session_manager": { + "message": "前往会话管理器" + }, + "html_recovery_important_message": { + "message": "你目前已开启屏幕截图,如果扩展多次崩溃,建议你取消勾选。" + }, + "html_recovery_disable_screen_capturing": { + "message": "关闭屏幕截图" + }, + "html_recovery_tabs_to_restore": { + "message": "标签页恢复" + }, + "html_shortcuts_title": { + "message": "键盘快捷键" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "键盘快捷键" + }, + "html_shortcuts_context_menu_note": { + "message": "注意:您也可以通过右键单击上下文菜单来使用这些操作。" + }, + "html_shortcuts_remap_keys": { + "message": "修改键盘快捷键" + }, + "html_sidebar_general_settings": { + "message": "设置" + }, + "html_sidebar_session_management": { + "message": "会话管理" + }, + "html_sidebar_shortcuts": { + "message": "键盘快捷键" + }, + "html_sidebar_support": { + "message": "关于" + }, + "html_success_great_success": { + "message": "成功!" + }, + "html_success_all_tabs_restored": { + "message": "你所有的标签页均已恢复完成。" + }, + "html_success_goto_advanced_prefix": { + "message": "进阶的会话管理,请前往" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "会话管理页面" + }, + "html_suspended_title": { + "message": "冻结标签页" + }, + "html_suspended_tab_suspended": { + "message": "标签页已被冻结" + }, + "html_suspended_tab_reload": { + "message": "重新加载标签页" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "永远不要冻结" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "刷新页面或点击此处重新加载" + }, + "html_suspended_toast_not_connected": { + "message": "您未连接网络" + }, + "html_suspended_toast_reload_disabled": { + "message": "暂时禁用标签页自动重新加载。" + }, + "html_permissions_title": { + "message": "许可权限" + }, + "html_permissions_heading": { + "message": "请授予允许访问本地文件 URL 的权限" + }, + "html_permissions_info": { + "message": "这个扩展目前不允许冻结那些以 \"file\" 开头的 URL 链接。\n要想改变这个设置, 可以在扩展设置页面打开允许访问文件 URL 的设置。" + }, + "html_permissions_backup": { + "message": "请注意:改变这个设置可能会使你当前所有的冻结标签页短暂的消失。\n为了以防万一,最好对当前标签页的会话的做备份。" + }, + "html_update_title": { + "message": "更新" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "一个新版本的 The Marvellous Suspender 已准备好安装。\n请注意:冻结的页面将在更新过程中暂时消失。" + }, + "html_update_info_withbackup": { + "message": "为了以防万一,最好对当前标签页的会话的做备份。" + }, + "html_update_info_nobackup_prefix": { + "message": "强烈建议您在继续更新之前在 " + }, + "html_update_info_nobackup_suffix": { + "message": " 导出当前标签页会话的备份。" + }, + "html_updated_title": { + "message": "更新" + }, + "html_updating_heading": { + "message": "正在更新" + }, + "html_updating_message": { + "message": "恢复冻结的标签页中,请稍等..." + }, + "html_updated_great_suspender_updated": { + "message": "已更新" + }, + "html_updated_info_line1": { + "message": "更新之前,您的标签页已被自动保存。" + }, + "html_updated_info_line2_prefix": { + "message": "如果在更新过程中遇到任何问题,可以从 " + }, + "html_updated_info_line2_suffix": { + "message": " 页面中恢复丢失的标签页。" + }, + "html_updated_detail_header_prefix": { + "message": "在 " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "新的功能:" + }, + "html_updated_bug_fixes_header": { + "message": "Bug 修复:" + }, + "html_updated_release_notes": { + "message": "请浏览 GitHub 获取完整的发行说明: " + }, + "html_updated_patch_message": { + "message": "很抱歉打扰你。我们需要做一些小维护。" + }, + "html_welcome_title": { + "message": "欢迎来到" + }, + "html_welcome_text_line1": { + "message": "感谢你安装" + }, + "html_welcome_text_line2": { + "message": "我能把你暂时不用的标签页冻结起来,希望这会让你的电脑运行地更流畅一些。" + }, + "html_welcome_text_line3": { + "message": "您可以在下面更改设置" + }, + "js_popup_normal": { + "message": "标签页将会自动被冻结。" + }, + "js_popup_normal_pause": { + "message": "暂时不要冻结" + }, + "js_popup_special": { + "message": "标签页无法被冻结" + }, + "js_popup_suspended": { + "message": "标签页已经被冻结" + }, + "js_popup_suspended_pause": { + "message": "暂时不要冻结" + }, + "js_popup_whitelisted": { + "message": "白名单。" + }, + "js_popup_whitelisted_remove": { + "message": "从白名单移除" + }, + "js_popup_audible": { + "message": "标签页正在播放声音。" + }, + "js_popup_form_input": { + "message": "标签页有文字还在输入。" + }, + "js_popup_form_input_unpause": { + "message": "取消暂停" + }, + "js_popup_pinned": { + "message": "标签页已经被固定" + }, + "js_popup_temp_whitelist": { + "message": "页面冻结暂停。" + }, + "js_popup_temp_whitelist_unpause": { + "message": "取消暂停" + }, + "js_popup_never": { + "message": "禁止自动冻结标签页。" + }, + "js_popup_no_connectivity": { + "message": "网络未连接" + }, + "js_popup_charging": { + "message": "已接上电源" + }, + "js_popup_blockedFile": { + "message": "无法冻结本地文件。" + }, + "js_popup_blockedFile_enable": { + "message": "启用" + }, + "js_popup_unknown": { + "message": "等待页面加载..." + }, + "js_popup_initialising": { + "message": "等待扩展初始化..." + }, + "js_popup_error": { + "message": "自动冻结在此页面上不可用" + }, + "js_history_delete": { + "message": "删除" + }, + "js_history_export": { + "message": "导出" + }, + "js_history_reload": { + "message": "重新加载" + }, + "js_history_resuspend": { + "message": "重新冻结" + }, + "js_history_save": { + "message": "保存" + }, + "js_history_window": { + "message": " 个窗口" + }, + "js_history_windows": { + "message": "个窗口" + }, + "js_history_tab": { + "message": " 个标签页" + }, + "js_history_tabs": { + "message": "标签页" + }, + "js_history_enter_name_for_session": { + "message": "为此会话命名" + }, + "js_history_confirm_delete": { + "message": "你确定要删除此会话吗?" + }, + "js_history_confirm_session_overwrite": { + "message": "已经保存有同名的会话。要覆盖现有会话吗?" + }, + "js_history_import_fail": { + "message": "无法导入文件。确保文件是纯文本,并且每行只有一条 URL。" + }, + "js_history_migrate_fail": { + "message": "需要32个字符扩展ID进行迁移" + }, + "js_history_migrate_success": { + "message": "成功迁移 $TABCOUNT$ 标签", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "从白名单移除" + }, + "js_suspended_hotkey_to_reload": { + "message": "设置键盘快捷键" + }, + "js_suspended_low_memory": { + "message": "由于系统内存不足而冻结的页面" + }, + "js_options_incognito_warning": { + "message": "您现在处于无痕模式。某些功能将无法使用。" + }, + "js_options_whitelist_no_matches": { + "message": "没有与当前白单匹配的打开标签页。" + }, + "js_options_whitelist_matches_heading": { + "message": "这些打开标签页签符合当前白名单:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "和另外" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "个。" + }, + "js_permissions_button_export": { + "message": "导出备份" + }, + "js_permissions_button_set": { + "message": "打开扩展设置" + }, + "js_update_confirm": { + "message": "您尚未保存备份。即使如此也要更新扩展吗?" + }, + "js_update_button_export": { + "message": "导出备份" + }, + "js_update_button_reload": { + "message": "现在更新扩展" + }, + "js_shortcuts_not_set": { + "message": "未设置" + }, + "js_session_save_point": { + "message": "自动保存点 v" + } } diff --git a/src/_locales/zh_TW/messages.json b/src/_locales/zh_TW/messages.json index 3c5d67e2..834160d1 100644 --- a/src/_locales/zh_TW/messages.json +++ b/src/_locales/zh_TW/messages.json @@ -1,242 +1,787 @@ { - "ext_extension_name": { "message": "The Great Suspender" }, - "ext_extension_description": { "message": "凍結暫時用不到的分頁,達到系統資源釋放。" }, - "ext_default_title": { "message": "The Great Suspender" }, - "ext_cmd_toggle_tab_suspension_description": { "message": "凍結/回復目前分頁" }, - "ext_cmd_toggle_tab_pause_description": { "message": "暫停/取消暫停目前分頁的凍結" }, - "ext_cmd_suspend_selected_tabs_description": { "message": "凍結已選擇分頁" }, - "ext_cmd_unsuspend_selected_tabs_description": { "message": "回復已選擇分頁" }, - "ext_cmd_soft_suspend_active_window_description": { "message": "凍結目前視窗中所有的分頁" }, - "ext_cmd_force_suspend_active_window_description": { "message": "強制凍結當前視窗中的所有分頁" }, - "ext_cmd_unsuspend_active_window_description": { "message": "凍結目前視窗中所有的分頁" }, - "ext_cmd_soft_suspend_all_windows_description": { "message": "凍結所有視窗的所有分頁" }, - "ext_cmd_force_suspend_all_windows_description": { "message": "強制凍結所有視窗的所有分頁" }, - "ext_cmd_unsuspend_all_windows_description": { "message": "回復所有視窗的所有分頁" }, - "js_context_open_link_in_suspended_tab": { "message": "在新的凍結分頁打開連結" }, - "js_context_toggle_suspend_state": { "message": "凍結/回復此分頁" }, - "js_context_toggle_pause_suspension": { "message": "暫停/取消暫停此分頁的凍結" }, - "js_context_never_suspend_domain": { "message": "永遠不要凍結此網域" }, - "js_context_never_suspend_page": { "message": "永遠不要凍結此網頁" }, - "js_context_suspend_selected_tabs": { "message": "凍結已選擇分頁" }, - "js_context_unsuspend_selected_tabs": { "message": "回復已選擇分頁" }, - "js_context_soft_suspend_other_tabs_in_window": { "message": "凍結目前視窗中所有的分頁" }, - "js_context_force_suspend_other_tabs_in_window": { "message": "強制凍結當前視窗中的所有分頁" }, - "js_context_unsuspend_all_tabs_in_window": { "message": "回復目前視窗中所有的分頁" }, - "js_context_soft_suspend_all_tabs": { "message": "凍結所有視窗的所有分頁" }, - "js_context_force_suspend_all_tabs": { "message": "強制凍結所有視窗的所有分頁" }, - "js_context_unsuspend_all_tabs": { "message": "回復所有視窗的所有分頁" }, - "html_about_title": { "message": "關於" }, - "html_about_github_title": { "message": "GitHub" }, - "html_about_twitter_title": { "message": "Twitter" }, - "html_about_report_issues_prefix": { "message": "如果您有建議或想回報問題,可以在" }, - "html_about_report_issues_suffix": { "message": ". 在建立新的想法或問題之前,請檢查您的想法或問題是否存在。謝謝!" }, - "html_about_debugging_prefix": { "message": "要啟用日誌記錄或設置調試標誌,請轉至" }, - "html_about_debugging_suffix": { "message": "測試分頁。" }, - "html_about_the_github_issues_page": { "message": "GitHub issues 網頁上提問" }, - "html_about_html2canvas": { "message": "html2canvas" }, - "html_about_html2canvas_prefix": { "message": "這個擴充功能使用 Niklas von Hertzen 撰寫的" }, - "html_about_html2canvas_suffix": { "message": "元件庫。" }, - "html_about_indexedDb": { "message": "db.js" }, - "html_about_indexedDb_prefix": { "message": "也用了 Aaron Powell 撰寫的" }, - "html_about_indexedDb_suffix": { "message": "元件庫。" }, - "html_about_browserstack": { "message": "browserstack" }, - "html_about_browserstack_prefix": { "message": "同時也謝謝" }, - "html_about_browserstack_suffix": { "message": "提供免費的 Chrome 測試工具" }, - "html_history_title": { "message": "記錄管理" }, - "html_history_current_session": { "message": "目前記錄" }, - "html_history_recent_sessions": { "message": "最近記錄" }, - "html_history_saved_sessions": { "message": "已儲存記錄" }, - "html_history_import_session": { "message": "匯入記錄" }, - "html_notice_title": { "message": "通知" }, - "html_notice_important_notice": { "message": "來自 The Great Suspender 的重要通知" }, - "html_options_title": { "message": "設定" }, - "html_options_suspend_title": { "message": "自動凍結分頁" }, - "html_options_suspended_title": { "message": "凍結的分頁" }, - "html_options_other_title": { "message": "其他設定" }, - "html_options_suspend_automatically_after": { "message": "多久後自動凍結" }, - "html_options_suspend_never": { "message": "永不" }, - "html_options_suspend_seconds": { "message": "秒" }, - "html_options_suspend_minute": { "message": "分鐘" }, - "html_options_suspend_minutes": { "message": "分鐘" }, - "html_options_suspend_hour": { "message": "小時" }, - "html_options_suspend_hours": { "message": "小時" }, - "html_options_suspend_day": { "message": "天" }, - "html_options_suspend_days": { "message": "天" }, - "html_options_suspend_week": { "message": "週" }, - "html_options_suspend_weeks": { "message": "週" }, - "html_options_suspend_no_pinned": { "message": "不要凍結已固定的分頁" }, - "html_options_suspend_no_forms": { "message": "不要凍結輸入框有文字且尚未儲存的分頁" }, - "html_options_suspend_no_audio": { "message": "不要凍結正在播放聲音的分頁" }, - "html_options_suspend_only_connected": { "message": "只在網路連接下才自動凍結" }, - "html_options_suspend_only_on_battery": { "message": "只在電腦未接上電源時才自動凍結" }, - "html_options_suspend_no_active_tabs": { "message": "不要凍結每個視窗的正在使用中的分頁" }, - "html_options_suspend_automatically_unsuspend": { "message": "當分頁被瀏覽就自動回復分頁" }, - "html_options_suspend_discard_after_suspend": { "message": "使用 Chrome 內建的凍結/暫停分頁釋放系統記憶體功能" }, - "html_options_suspend_discard_after_suspend_tooltip_line1a": { "message": "通過利用 Chrome 內建的分頁凍結/暫停功能,可以更多的降低記憶體使用。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1b": { "message": "當多個分頁同時打開時,可以降低500%的系統記憶體消耗。" }, - "html_options_suspend_discard_after_suspend_tooltip_line1c": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line2a": { "message": "盡管如此,當重新打開一個的凍結/暫停分頁時,將會有微小的分頁加載延時。" }, - "html_options_suspend_discard_after_suspend_tooltip_line2b": { "message": "" }, - "html_options_suspend_discard_after_suspend_tooltip_line3a": { "message": "有關 Chrome discarding 的更多資訊,請參閱:" }, - "html_options_suspend_discard_after_suspend_tooltip_line3b": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_options_suspend_theme": { "message": "主題" }, - "html_options_suspend_theme_light": { "message": "明亮" }, - "html_options_suspend_theme_dark": { "message": "深色" }, - "html_options_suspend_screen_capturing": { "message": "螢幕擷取" }, - "html_options_suspend_screen_capturing_disabled": { "message": "停用" }, - "html_options_suspend_screen_capturing_screen_only": { "message": "只擷取可見的畫面" }, - "html_options_suspend_screen_capturing_entire_page": { "message": "擷取整個分頁" }, - "html_options_suspend_screen_capturing_tooltip_line1a": { "message": "在暫停的分頁上,擴充功能可以在分頁被暫停前顯示圖片預覽。" }, - "html_options_suspend_screen_capturing_tooltip_line1b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line2a": { "message": "螢幕擷取功能是實驗性的,可能會讓 CPU 使用率以及記憶體使用量明顯地提高。" }, - "html_options_suspend_screen_capturing_tooltip_line2b": { "message": "" }, - "html_options_suspend_screen_capturing_tooltip_line3a": { "message": "如果您注意到奇怪的行為,如分頁需要很長時間才能掛起,或者 Chrome 意外當機,請嘗試關閉此功能。" }, - "html_options_suspend_screen_capturing_tooltip_line3b": { "message": "" }, - "html_options_suspend_force_screen_capture": { "message": "啟用高畫質的螢幕擷取模式" }, - "html_options_suspend_force_screen_capture_tooltip_line1": { "message": "禁用時,螢幕擷取具有以下限制以幫助提高效能:" }, - "html_options_suspend_force_screen_capture_tooltip_line2": { "message": "- 低品質的螢幕擷取" }, - "html_options_suspend_force_screen_capture_tooltip_line4": { "message": "- 如果產生圖片需要 1 分鐘以上,將不會螢幕擷取" }, - "html_options_suspend_force_screen_capture_tooltip_line5": { "message": "- 圖片的最大高度限制為 5000 像素" }, - "html_options_suspend_force_screen_capture_tooltip_line6": { "message": "啟用高品質的畫面捕捉模式可能會讓 CPU 使用率和記憶體使用量明顯提高。" }, - "html_options_suspend_force_screen_capture_tooltip_line7": { "message": "" }, - "html_options_whitelist_title": { "message": "白名單" }, - "html_options_whitelist_tooltip_line1": { "message": "在新的一列上新增要列入白名單的每個分頁的 URL。例如:" }, - "html_options_whitelist_tooltip_line2": { "message": "要在一列中將多個網站列入白名單,可以指定網址的一部分:" }, - "html_options_whitelist_tooltip_line3": { "message": "您還可以使用斜線包起來的文字來指定正規表示式:" }, - "html_options_whitelist_test": { "message": "測試白名單" }, - "html_options_other_enable_context_menu": { "message": "把 The Great Suspender 加到右鍵選單" }, - "html_options_other_enable_context_menu_tooltip_line1": { "message": "將擴充套件新增到網頁的右鍵選單。" }, - "html_options_other_enable_context_menu_tooltip_line2": { "message": "這樣,您就可以訪問程序中其他位置無法使用的進階凍結操作。" }, - "html_options_other_enable_context_menu_tooltip_line3": { "message": "" }, - "html_options_other_enable_sync": { "message": "使用Chrome 使用者設定檔同步設定" }, - "html_options_other_enable_sync_tooltip_line1a": { "message": "登入 Chrome 後,擴充功能將同步相同的設定" }, - "html_options_other_enable_sync_tooltip_line1b": { "message": "。" }, - "html_options_other_enable_sync_tooltip_line2": { "message": "這也將使無痕模式下的設定同步。" }, - "html_options_other_enable_sync_warning": { "message": "打開此項將覆蓋 Chrome 使用者設定並同步所有已登入的系統" }, - "html_options_suspend_on_low_memory": { "message": "當系統記憶體非常少時凍結分頁" }, - "html_options_suspend_on_low_memory_tooltip_line1": { "message": "此選項會覆蓋 Chrome 的 automatic tab discarding 功能。" }, - "html_options_suspend_on_low_memory_tooltip_line2": { "message": "如果啟用,該分頁將被強制凍結,而不是被 Chrome 刪除。" }, - "html_options_suspend_on_low_memory_tooltip_line3": { "message": "正常時 Chrome 僅在系統記憶體非常低時刪除分頁。" }, - "html_options_suspend_on_low_memory_tooltip_line4": { "message": "注意:這可能導致分頁在「自動分頁凍結」選項中指定的時間之前凍結。" }, - "html_options_suspend_on_low_memory_tooltip_line5": { "message": "" }, - "html_options_suspend_on_low_memory_tooltip_line6": { "message": "有關 Chrome discarding 的更多資訊,請參閱:" }, - "html_options_suspend_on_low_memory_tooltip_discarding_link": { "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" }, - "html_popup_unsuspend_tab": { "message": "回復目前分頁" }, - "html_popup_suspend_tab": { "message": "凍結此分頁" }, - "html_popup_dont_suspend_now": { "message": "現在還不要凍結" }, - "html_popup_never_suspend_domain": { "message": "永遠不要凍結此網域" }, - "html_popup_never_suspend_page": { "message": "永遠不要凍結此網頁" }, - "html_popup_suspend_other_tabs": { "message": "凍結其他分頁" }, - "html_popup_unsuspend_all_tabs": { "message": "回復所有分頁" }, - "html_popup_suspend_selected_tabs": { "message": "凍結已選擇分頁" }, - "html_popup_unsuspend_selected_tabs": { "message": "回復已選擇分頁" }, - "html_popup_settings": { "message": "設定" }, - "html_restoring_title": { "message": "回復視窗" }, - "html_restoring_heading": { "message": "回復分頁" }, - "html_restoring_detail": { "message": "請等待回復此視窗" }, - "html_recovery_title": { "message": "回復" }, - "html_recovery_ruh_roh": { "message": "噢!" }, - "html_recovery_description_line1": { "message": "看來你剛從當掉的擴充功能回復過來。" }, - "html_recovery_description_line2": { "message": "之前凍結的分頁可能無法還原。" }, - "html_recovery_restore_tabs_automatically": { "message": "自動回復分頁" }, - "html_recovery_go_to_session_manager": { "message": "前往記錄管理器" }, - "html_recovery_important_message": { "message": "你目前已開啟螢幕擷取,如果擴充功能多次發生故障,建議你取消勾選。" }, - "html_recovery_disable_screen_capturing": { "message": "關閉螢幕擷取" }, - "html_recovery_tabs_to_restore": { "message": "分頁回復" }, - "html_shortcuts_title": { "message": "鍵盤快速鍵" }, - "html_shortcuts_keyboard_shortcuts": { "message": "鍵盤快速鍵" }, - "html_shortcuts_context_menu_note": { "message": "注意:您也可以通過右鍵選單來使用這些操作。" }, - "html_shortcuts_remap_keys": { "message": "修改鍵盤快速鍵" }, - "html_sidebar_general_settings": { "message": "設定" }, - "html_sidebar_session_management": { "message": "記錄管理" }, - "html_sidebar_shortcuts": { "message": "鍵盤快速鍵" }, - "html_sidebar_support": { "message": "關於" }, - "html_success_great_success": { "message": "成功!" }, - "html_success_all_tabs_restored": { "message": "你的所有分頁已經回復完成。" }, - "html_success_goto_advanced_prefix": { "message": "進階的記錄管理,請前往" }, - "html_success_goto_advanced_suffix": { "message": "" }, - "html_session_manager": { "message": "記錄管理分頁" }, - "html_suspended_title": { "message": "分頁已經被凍結" }, - "html_suspended_tab_suspended": { "message": "分頁已經被凍結" }, - "html_suspended_tab_reload": { "message": "重新載入" }, - "html_suspended_tab_whitelist_prefix": { "message": "永遠不要凍結" }, - "html_suspended_tab_whitelist_suffix": { "message": "" }, - "html_suspended_click_to_reload": { "message": "點擊此處重新載入" }, - "html_suspended_toast_not_connected": { "message": "您沒有連接到網絡" }, - "html_suspended_toast_reload_disabled": { "message": "禁用自動重新載入。" }, - "html_permissions_title": { "message": "許可權限" }, - "html_permissions_heading": { "message": "請提供允許存取本機檔案 URL 的權限" }, - "html_permissions_info": { "message": "這個擴充功能目前不允許暫停那些以 file(檔案)開頭的 URL 連結。\n想要改變這個設定, 可以在擴充功能設定分頁打開允許存取檔案URL的設定。" }, - "html_permissions_backup": { "message": "請註意:改變這個設定可能會使你當前所有的暫停分頁短暫的消失。\n以防萬一,最好對當前分頁的瀏覽階段的做備份。" }, - "html_update_title": { "message": "更新" }, - "html_update_heading2": { "message": "即將變得更好" }, - "html_update_info": { "message": "一個新版本的 The Great Suspender 已準備好安裝。\n請注意:凍結分頁將在更新過程中暫時消失。" }, - "html_update_info_withbackup": { "message": "請在繼續之前儲存目前瀏覽階段的備份。" }, - "html_update_info_nobackup_prefix": { "message": "強烈建議您在繼續之前從" }, - "html_update_info_nobackup_suffix": { "message": " 儲存目前瀏覽階段的備份。" }, - "html_updated_title": { "message": "更新" }, - "html_updating_heading": { "message": "正在更新" }, - "html_updating_message": { "message": "請等我回復被暫停的分頁..." }, - "html_updated_great_suspender_updated": { "message": "已更新" }, - "html_updated_info_line1": { "message": "更新之前,您的分頁已被自動儲存。" }, - "html_updated_info_line2_prefix": { "message": "如果在更新過程中遇到任何問題,可以從 " }, - "html_updated_info_line2_suffix": { "message": " 分頁中回復遺失的分頁。" }, - "html_updated_detail_header_prefix": { "message": "在 " }, - "html_updated_detail_header_suffix": { "message": "有什麼新功能?" }, - "html_updated_new_features_header": { "message": "新的功能:" }, - "html_updated_bug_fixes_header": { "message": "錯誤修復:" }, - "html_updated_release_notes": { "message": "請瀏覽 GitHub 取得完整的發行說明:" }, - "html_updated_patch_message": { "message": "很抱歉打擾你。我們做了一些維護。" }, - "html_welcome_title": { "message": "歡迎來到" }, - "html_welcome_text_line1": { "message": "謝謝你安裝" }, - "html_welcome_text_line2": { "message": "通過暫停不使用的分頁,可以讓您的電腦減少記憶體的使用。" }, - "html_welcome_text_line3": { "message": "您可以在下面更改設定" }, - "js_popup_normal": { "message": "分頁將會自動被凍結。" }, - "js_popup_normal_pause": { "message": "暫時不要凍結" }, - "js_popup_special": { "message": "分頁無法被凍結" }, - "js_popup_suspended": { "message": "分頁已經被凍結" }, - "js_popup_suspended_pause": { "message": "暫時不要凍結" }, - "js_popup_whitelisted": { "message": "例外清單。" }, - "js_popup_whitelisted_remove": { "message": "從例外清單移除" }, - "js_popup_audible": { "message": "分頁正在播放聲音。" }, - "js_popup_form_input": { "message": "分頁有文字還在輸入。" }, - "js_popup_form_input_unpause": { "message": "取消暫停" }, - "js_popup_pinned": { "message": "分頁已經被固定" }, - "js_popup_temp_whitelist": { "message": "分頁凍結暫停。" }, - "js_popup_temp_whitelist_unpause": { "message": "取消暫停" }, - "js_popup_never": { "message": "禁止自動凍結分頁。" }, - "js_popup_no_connectivity": { "message": "未連接網路" }, - "js_popup_charging": { "message": "已接上電源" }, - "js_popup_blockedFile": { "message": "本機檔案無法暫停。" }, - "js_popup_blockedFile_enable": { "message": "啟用" }, - "js_popup_unknown": { "message": "等待分頁載入..." }, - "js_popup_initialising": { "message": "等待擴充功能初始化..." }, - "js_popup_error": { "message": "自動凍結在此分頁上不可用" }, - "js_history_delete": { "message": "刪除" }, - "js_history_export": { "message": "匯出" }, - "js_history_reload": { "message": "讀取和載入" }, - "js_history_resuspend": { "message": "重新凍結" }, - "js_history_save": { "message": "儲存" }, - "js_history_window": { "message": "個視窗" }, - "js_history_tab": { "message": "個分頁" }, - "js_history_plural": { "message": "" }, - "js_history_enter_name_for_session": { "message": "命名這個記錄" }, - "js_history_confirm_delete": { "message": "您確定要刪除此記錄嗎?" }, - "js_history_confirm_session_overwrite": { "message": "已經有儲存的名稱的記錄。要覆蓋現有記錄嗎?" }, - "js_history_import_fail": { "message": "無法匯入文件。確保文件是純文字檔案,並且每列只有一個 URL。" }, - "js_suspended_remove_from_whitelist": { "message": "從白名單移除" }, - "js_suspended_hotkey_to_reload": { "message": "設定鍵盤快捷鍵" }, - "js_suspended_low_memory": { "message": "由於系統記憶體不足而凍結的分頁" }, - "js_options_incognito_warning": { "message": "你目前使用隱私模式。某些功能將無法使用。" }, - "js_options_whitelist_no_matches": { "message": "沒有與當前白名單匹配的打開選項卡。" }, - "js_options_whitelist_matches_heading": { "message": "這些打開的選項卡與當前白名單相匹配:" }, - "js_options_whitelist_matches_overflow_prefix": { "message": "和另外" }, - "js_options_whitelist_matches_overflow_suffix": { "message": "個。" }, - "js_permissions_button_export": { "message": "儲存備份" }, - "js_permissions_button_set": { "message": "打開擴充套件設定" }, - "js_update_confirm": { "message": "您尚未匯出備份。更新擴充功能?" }, - "js_update_button_export": { "message": "匯出備份" }, - "js_update_button_reload": { "message": "現在更新擴充功能" }, - "js_shortcuts_not_set": { "message": "沒有設定" }, - "js_session_save_point": { "message": "自動保存點 v" } + "ext_extension_name": { + "message": "The Marvellous Suspender" + }, + "ext_extension_description": { + "message": "凍結暫時用不到的分頁,達到系統資源釋放。" + }, + "ext_default_title": { + "message": "The Marvellous Suspender" + }, + "ext_cmd_toggle_tab_suspension_description": { + "message": "凍結/回復目前分頁" + }, + "ext_cmd_toggle_tab_pause_description": { + "message": "暫停/取消暫停目前分頁的凍結" + }, + "ext_cmd_suspend_selected_tabs_description": { + "message": "凍結已選擇分頁" + }, + "ext_cmd_unsuspend_selected_tabs_description": { + "message": "回復已選擇分頁" + }, + "ext_cmd_soft_suspend_active_window_description": { + "message": "凍結目前視窗中所有的分頁" + }, + "ext_cmd_force_suspend_active_window_description": { + "message": "強制凍結當前視窗中的所有分頁" + }, + "ext_cmd_unsuspend_active_window_description": { + "message": "凍結目前視窗中所有的分頁" + }, + "ext_cmd_soft_suspend_all_windows_description": { + "message": "凍結所有視窗的所有分頁" + }, + "ext_cmd_force_suspend_all_windows_description": { + "message": "強制凍結所有視窗的所有分頁" + }, + "ext_cmd_unsuspend_all_windows_description": { + "message": "回復所有視窗的所有分頁" + }, + "js_context_open_link_in_suspended_tab": { + "message": "在新的凍結分頁打開連結" + }, + "js_context_toggle_suspend_state": { + "message": "凍結/回復此分頁" + }, + "js_context_toggle_pause_suspension": { + "message": "暫停/取消暫停此分頁的凍結" + }, + "js_context_never_suspend_domain": { + "message": "永遠不要凍結此網域" + }, + "js_context_never_suspend_page": { + "message": "永遠不要凍結此網頁" + }, + "js_context_suspend_selected_tabs": { + "message": "凍結已選擇分頁" + }, + "js_context_unsuspend_selected_tabs": { + "message": "回復已選擇分頁" + }, + "js_context_soft_suspend_other_tabs_in_window": { + "message": "凍結目前視窗中所有的分頁" + }, + "js_context_force_suspend_other_tabs_in_window": { + "message": "強制凍結當前視窗中的所有分頁" + }, + "js_context_unsuspend_all_tabs_in_window": { + "message": "回復目前視窗中所有的分頁" + }, + "js_context_soft_suspend_all_tabs": { + "message": "凍結所有視窗的所有分頁" + }, + "js_context_force_suspend_all_tabs": { + "message": "強制凍結所有視窗的所有分頁" + }, + "js_context_unsuspend_all_tabs": { + "message": "回復所有視窗的所有分頁" + }, + "html_about_title": { + "message": "關於" + }, + "html_about_fork_beginning": { + "message": "基於 GitHub 上的原版" + }, + "html_about_fork_mid": { + "message": ",去除廣告追蹤" + }, + "html_about_fork_end": { + "message": ",詳情請見:" + }, + "html_about_github_title": { + "message": "GitHub" + }, + "html_about_blog_title": { + "message": "Blog" + }, + "html_about_twitter_title": { + "message": "Twitter" + }, + "html_about_report_issues_prefix": { + "message": "如果您有建議或想回報問題,可以在" + }, + "html_about_report_issues_suffix": { + "message": ". 在建立新的想法或問題之前,請檢查您的想法或問題是否存在。謝謝!" + }, + "html_about_debugging_prefix": { + "message": "要啟用日誌記錄或設置調試標誌,請轉至" + }, + "html_about_debugging_suffix": { + "message": "測試分頁。" + }, + "html_about_the_github_issues_page": { + "message": "GitHub issues 網頁上提問" + }, + "html_about_html2canvas": { + "message": "html2canvas" + }, + "html_about_html2canvas_prefix": { + "message": "這個擴充功能使用 Niklas von Hertzen 撰寫的" + }, + "html_about_html2canvas_suffix": { + "message": "元件庫。" + }, + "html_about_indexedDb": { + "message": "db.js" + }, + "html_about_indexedDb_prefix": { + "message": "也用了 Aaron Powell 撰寫的" + }, + "html_about_indexedDb_suffix": { + "message": "元件庫。" + }, + "html_about_browserstack": { + "message": "BrowserStack" + }, + "html_about_browserstack_prefix": { + "message": "同時也謝謝" + }, + "html_about_browserstack_suffix": { + "message": "提供免費的 Chrome 測試工具。" + }, + "html_about_tgs_prefix": { + "message": "如果沒有 " + }, + "html_about_tgs_suffix": { + "message": ",這個擴充功能就不可能存在。" + }, + "html_broken_title": { + "message": "故障了" + }, + "html_broken_ruh_roh": { + "message": "噢!" + }, + "html_broken_line1": { + "message": "重新啟動失敗。您是否正在使用不相容的 Chrome 版本?" + }, + "html_broken_line2": { + "message": "請嘗試重新啟動擴充功能。若問題持續發生,請您透過此連結尋求協助:" + }, + "html_broken_line2_github_page": { + "message": "GitHub 專案頁面" + }, + "html_broken_line3": { + "message": "您可以在這裡找到遺失的分頁:" + }, + "html_broken_line3_session_management": { + "message": "記錄管理頁面" + }, + "html_broken_button_restart_extension": { + "message": "重新啟動擴充功能" + }, + "html_history_title": { + "message": "記錄管理" + }, + "html_history_current_session": { + "message": "目前記錄" + }, + "html_history_recent_sessions": { + "message": "最近記錄" + }, + "html_history_saved_sessions": { + "message": "已儲存記錄" + }, + "html_history_import_session": { + "message": "匯入記錄" + }, + "html_history_migrate_tabs": { + "message": "移轉分頁" + }, + "html_history_migrate_old_id": { + "message": "舊的 TGS 擴充功能 ID" + }, + "html_notice_title": { + "message": "通知" + }, + "html_notice_important_notice": { + "message": "來自 The Marvellous Suspender 的重要通知" + }, + "html_options_title": { + "message": "設定" + }, + "html_options_suspend_title": { + "message": "自動凍結分頁" + }, + "html_options_suspended_title": { + "message": "凍結的分頁" + }, + "html_options_other_title": { + "message": "其他設定" + }, + "html_options_suspend_automatically_after": { + "message": "多久後自動凍結" + }, + "html_options_suspend_never": { + "message": "永不" + }, + "html_options_suspend_seconds": { + "message": "秒" + }, + "html_options_suspend_minute": { + "message": "分鐘" + }, + "html_options_suspend_minutes": { + "message": "分鐘" + }, + "html_options_suspend_hour": { + "message": "小時" + }, + "html_options_suspend_hours": { + "message": "小時" + }, + "html_options_suspend_day": { + "message": "天" + }, + "html_options_suspend_days": { + "message": "天" + }, + "html_options_suspend_week": { + "message": "週" + }, + "html_options_suspend_weeks": { + "message": "週" + }, + "html_options_suspend_no_pinned": { + "message": "不要凍結已固定的分頁" + }, + "html_options_suspend_no_forms": { + "message": "不要凍結輸入框有文字且尚未儲存的分頁" + }, + "html_options_suspend_no_audio": { + "message": "不要凍結正在播放聲音的分頁" + }, + "html_options_suspend_only_connected": { + "message": "只在網路連接下才自動凍結" + }, + "html_options_suspend_claim_by_default": { + "message": "Claim by default (seamless migration; tab considered suspended if 'suspended.html' is in url)" + }, + "html_options_suspend_only_on_battery": { + "message": "只在電腦未接上電源時才自動凍結" + }, + "html_options_suspend_no_active_tabs": { + "message": "不要凍結每個視窗的正在使用中的分頁" + }, + "html_options_suspend_automatically_unsuspend": { + "message": "當分頁被瀏覽就自動回復分頁" + }, + "html_options_suspend_discard_after_suspend": { + "message": "凍結分頁時使用 Chrome 內建的系統記憶體釋放功能" + }, + "html_options_suspend_discard_after_suspend_tooltip_line1a": { + "message": "通過利用 Chrome 內建的分頁凍結功能," + }, + "html_options_suspend_discard_after_suspend_tooltip_line1b": { + "message": "可以更多的降低記憶體使用。當同時打開多個分頁時," + }, + "html_options_suspend_discard_after_suspend_tooltip_line1c": { + "message": "可以降低500%的系統記憶體消耗。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line2a": { + "message": "盡管如此,當重新打開一個凍結的分頁時," + }, + "html_options_suspend_discard_after_suspend_tooltip_line2b": { + "message": "將會有微小的分頁加載延時。" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3a": { + "message": "有關 Chrome discarding 的更多資訊,請參閱:" + }, + "html_options_suspend_discard_after_suspend_tooltip_line3b": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_options_suspend_theme": { + "message": "主題" + }, + "html_options_suspend_theme_light": { + "message": "明亮" + }, + "html_options_suspend_theme_dark": { + "message": "深色" + }, + "html_options_suspend_screen_capturing": { + "message": "螢幕擷取" + }, + "html_options_suspend_screen_capturing_disabled": { + "message": "停用" + }, + "html_options_suspend_screen_capturing_screen_only": { + "message": "只擷取可見的畫面" + }, + "html_options_suspend_screen_capturing_entire_page": { + "message": "擷取整個分頁" + }, + "html_options_suspend_screen_capturing_tooltip_line1a": { + "message": "在凍結的分頁上," + }, + "html_options_suspend_screen_capturing_tooltip_line1b": { + "message": "顯示分頁被凍結前的最後畫面。" + }, + "html_options_suspend_screen_capturing_tooltip_line2a": { + "message": "螢幕擷取功能是實驗性的," + }, + "html_options_suspend_screen_capturing_tooltip_line2b": { + "message": "可能會讓 CPU 使用率大幅提高,並讓記憶體使用量些微地提高。" + }, + "html_options_suspend_screen_capturing_tooltip_line3a": { + "message": "如果您注意到奇怪的狀況,例如需要很長時間才能凍結分頁," + }, + "html_options_suspend_screen_capturing_tooltip_line3b": { + "message": "或者 Chrome 意外當機,請嘗試關閉此功能。" + }, + "html_options_suspend_force_screen_capture": { + "message": "啟用高畫質的螢幕擷取模式" + }, + "html_options_suspend_force_screen_capture_tooltip_line1": { + "message": "禁用時,螢幕擷取具有以下限制以幫助提高效能:" + }, + "html_options_suspend_force_screen_capture_tooltip_line2": { + "message": "- 低品質的螢幕擷取" + }, + "html_options_suspend_force_screen_capture_tooltip_line4": { + "message": "- 如果產生圖片需要 1 分鐘以上,將不會螢幕擷取" + }, + "html_options_suspend_force_screen_capture_tooltip_line5": { + "message": "- 圖片的最大高度限制為 5000 像素" + }, + "html_options_suspend_force_screen_capture_tooltip_line6": { + "message": "啟用高品質的畫面捕捉模式可能會讓 CPU 使用率" + }, + "html_options_suspend_force_screen_capture_tooltip_line7": { + "message": "和記憶體使用量明顯提高。" + }, + "html_options_whitelist_title": { + "message": "白名單" + }, + "html_options_whitelist_tooltip_line1": { + "message": "在新的一列上新增要列入白名單的每個分頁的 URL。例如:" + }, + "html_options_whitelist_tooltip_line2": { + "message": "要在一列中將多個網站列入白名單,可以指定網址的一部分:" + }, + "html_options_whitelist_tooltip_line3": { + "message": "您還可以使用斜線包起來的文字來指定正規表示式:" + }, + "html_options_whitelist_test": { + "message": "測試白名單" + }, + "html_options_other_enable_context_menu": { + "message": "把 The Marvellous Suspender 加到右鍵選單" + }, + "html_options_other_enable_context_menu_tooltip_line1": { + "message": "將擴充套件新增到網頁的右鍵選單。" + }, + "html_options_other_enable_context_menu_tooltip_line2": { + "message": "這樣,您就可以使用擴充功能中其他位置無法使用的" + }, + "html_options_other_enable_context_menu_tooltip_line3": { + "message": "進階凍結操作。" + }, + "html_options_other_enable_sync": { + "message": "使用 Chrome 使用者設定檔同步設定" + }, + "html_options_other_enable_sync_tooltip_line1a": { + "message": "將擴充功能的設定將同步至" + }, + "html_options_other_enable_sync_tooltip_line1b": { + "message": "登入相同帳號的 Chrome。" + }, + "html_options_other_enable_sync_tooltip_line2": { + "message": "這也將使無痕模式下的設定同步。" + }, + "html_options_other_enable_sync_warning": { + "message": "打開此選項將覆蓋掉其他登入相同帳號的 Chrome 的擴充功能設定" + }, + "html_options_suspend_on_low_memory": { + "message": "當系統記憶體非常少時凍結分頁" + }, + "html_options_suspend_on_low_memory_tooltip_line1": { + "message": "此選項會覆蓋 Chrome 的 automatic tab discarding 功能。" + }, + "html_options_suspend_on_low_memory_tooltip_line2": { + "message": "如果啟用,該分頁將被強制凍結,而不是被 Chrome 刪除。" + }, + "html_options_suspend_on_low_memory_tooltip_line3": { + "message": "正常時 Chrome 僅在系統記憶體非常低時刪除分頁。" + }, + "html_options_suspend_on_low_memory_tooltip_line4": { + "message": "注意:" + }, + "html_options_suspend_on_low_memory_tooltip_line5": { + "message": "這可能導致分頁在「自動分頁凍結」選項中指定的時間到達之前凍結。" + }, + "html_options_suspend_on_low_memory_tooltip_line6": { + "message": "有關 Chrome discarding 的更多資訊,請參閱:" + }, + "html_options_suspend_on_low_memory_tooltip_discarding_link": { + "message": "https://developers.google.com/web/updates/2015/09/tab-discarding" + }, + "html_popup_unsuspend_tab": { + "message": "回復目前分頁" + }, + "html_popup_suspend_tab": { + "message": "凍結此分頁" + }, + "html_popup_dont_suspend_now": { + "message": "現在還不要凍結" + }, + "html_popup_never_suspend_domain": { + "message": "永遠不要凍結此網域" + }, + "html_popup_never_suspend_page": { + "message": "永遠不要凍結此網頁" + }, + "html_popup_suspend_other_tabs": { + "message": "凍結其他分頁" + }, + "html_popup_unsuspend_all_tabs": { + "message": "回復所有分頁" + }, + "html_popup_suspend_selected_tabs": { + "message": "凍結已選擇分頁" + }, + "html_popup_unsuspend_selected_tabs": { + "message": "回復已選擇分頁" + }, + "html_popup_settings": { + "message": "設定" + }, + "html_restoring_title": { + "message": "回復視窗" + }, + "html_restoring_heading": { + "message": "回復分頁" + }, + "html_restoring_detail": { + "message": "請等待回復此視窗" + }, + "html_recovery_title": { + "message": "回復" + }, + "html_recovery_ruh_roh": { + "message": "噢!" + }, + "html_recovery_description_line1": { + "message": "看來你剛從當掉的擴充功能回復過來。" + }, + "html_recovery_description_line2": { + "message": "之前凍結的分頁可能無法還原。" + }, + "html_recovery_restore_tabs_automatically": { + "message": "自動回復分頁" + }, + "html_recovery_go_to_session_manager": { + "message": "前往記錄管理器" + }, + "html_recovery_important_message": { + "message": "你目前已開啟螢幕擷取,如果擴充功能多次發生故障,建議你取消勾選。" + }, + "html_recovery_disable_screen_capturing": { + "message": "關閉螢幕擷取" + }, + "html_recovery_tabs_to_restore": { + "message": "分頁回復" + }, + "html_shortcuts_title": { + "message": "鍵盤快速鍵" + }, + "html_shortcuts_keyboard_shortcuts": { + "message": "鍵盤快速鍵" + }, + "html_shortcuts_context_menu_note": { + "message": "注意:您也可以通過右鍵選單來使用這些操作。" + }, + "html_shortcuts_remap_keys": { + "message": "修改鍵盤快速鍵" + }, + "html_sidebar_general_settings": { + "message": "設定" + }, + "html_sidebar_session_management": { + "message": "記錄管理" + }, + "html_sidebar_shortcuts": { + "message": "鍵盤快速鍵" + }, + "html_sidebar_support": { + "message": "關於" + }, + "html_success_great_success": { + "message": "成功!" + }, + "html_success_all_tabs_restored": { + "message": "你的所有分頁已經回復完成。" + }, + "html_success_goto_advanced_prefix": { + "message": "進階的記錄管理,請前往" + }, + "html_success_goto_advanced_suffix": { + "message": "page" + }, + "html_session_manager": { + "message": "記錄管理分頁" + }, + "html_suspended_title": { + "message": "分頁已經被凍結" + }, + "html_suspended_tab_suspended": { + "message": "分頁已經被凍結" + }, + "html_suspended_tab_reload": { + "message": "重新載入" + }, + "html_suspended_tab_whitelist_prefix": { + "message": "永遠不要凍結" + }, + "html_suspended_tab_whitelist_suffix": { + "message": "..." + }, + "html_suspended_click_to_reload": { + "message": "點擊此處重新載入" + }, + "html_suspended_toast_not_connected": { + "message": "您沒有連接到網絡" + }, + "html_suspended_toast_reload_disabled": { + "message": "禁用自動重新載入。" + }, + "html_permissions_title": { + "message": "許可權限" + }, + "html_permissions_heading": { + "message": "請提供允許存取本機檔案 URL 的權限" + }, + "html_permissions_info": { + "message": "這個擴充功能目前不允許暫停那些以 file(檔案)開頭的 URL 連結。\n想要改變這個設定, 可以在擴充功能設定分頁打開允許存取檔案URL的設定。" + }, + "html_permissions_backup": { + "message": "請註意:改變這個設定可能會使你當前所有的暫停分頁短暫的消失。\n以防萬一,最好對當前分頁的瀏覽階段的做備份。" + }, + "html_update_title": { + "message": "更新" + }, + "html_update_heading2": { + "message": "is about to get marvellous-er" + }, + "html_update_info": { + "message": "一個新版本的 The Marvellous Suspender 已準備好安裝。\n請注意:凍結分頁將在更新過程中暫時消失。" + }, + "html_update_info_withbackup": { + "message": "請在繼續之前儲存目前瀏覽階段的備份。" + }, + "html_update_info_nobackup_prefix": { + "message": "強烈建議您在繼續之前從" + }, + "html_update_info_nobackup_suffix": { + "message": " 儲存目前瀏覽階段的備份。" + }, + "html_updated_title": { + "message": "更新" + }, + "html_updating_heading": { + "message": "正在更新" + }, + "html_updating_message": { + "message": "請等我回復被暫停的分頁..." + }, + "html_updated_great_suspender_updated": { + "message": "已更新" + }, + "html_updated_info_line1": { + "message": "更新之前,您的分頁已被自動儲存。" + }, + "html_updated_info_line2_prefix": { + "message": "如果在更新過程中遇到任何問題,可以從 " + }, + "html_updated_info_line2_suffix": { + "message": " 分頁中回復遺失的分頁。" + }, + "html_updated_detail_header_prefix": { + "message": "在 " + }, + "html_updated_detail_header_suffix": { + "message": "?" + }, + "html_updated_new_features_header": { + "message": "新的功能:" + }, + "html_updated_bug_fixes_header": { + "message": "錯誤修復:" + }, + "html_updated_release_notes": { + "message": "請瀏覽 GitHub 取得完整的發行說明:" + }, + "html_updated_patch_message": { + "message": "很抱歉打擾你。我們做了一些維護。" + }, + "html_welcome_title": { + "message": "歡迎來到" + }, + "html_welcome_text_line1": { + "message": "謝謝你安裝" + }, + "html_welcome_text_line2": { + "message": "通過暫停不使用的分頁,可以讓您的電腦減少記憶體的使用。" + }, + "html_welcome_text_line3": { + "message": "您可以在下面更改設定" + }, + "js_popup_normal": { + "message": "分頁將會自動被凍結。" + }, + "js_popup_normal_pause": { + "message": "暫時不要凍結" + }, + "js_popup_special": { + "message": "分頁無法被凍結" + }, + "js_popup_suspended": { + "message": "分頁已經被凍結" + }, + "js_popup_suspended_pause": { + "message": "暫時不要凍結" + }, + "js_popup_whitelisted": { + "message": "例外清單。" + }, + "js_popup_whitelisted_remove": { + "message": "從例外清單移除" + }, + "js_popup_audible": { + "message": "分頁正在播放聲音。" + }, + "js_popup_form_input": { + "message": "分頁有文字還在輸入。" + }, + "js_popup_form_input_unpause": { + "message": "取消暫停" + }, + "js_popup_pinned": { + "message": "分頁已經被固定" + }, + "js_popup_temp_whitelist": { + "message": "分頁凍結暫停。" + }, + "js_popup_temp_whitelist_unpause": { + "message": "取消暫停" + }, + "js_popup_never": { + "message": "禁止自動凍結分頁。" + }, + "js_popup_no_connectivity": { + "message": "未連接網路" + }, + "js_popup_charging": { + "message": "已接上電源" + }, + "js_popup_blockedFile": { + "message": "本機檔案無法暫停。" + }, + "js_popup_blockedFile_enable": { + "message": "啟用" + }, + "js_popup_unknown": { + "message": "等待分頁載入..." + }, + "js_popup_initialising": { + "message": "等待擴充功能初始化..." + }, + "js_popup_error": { + "message": "自動凍結在此分頁上不可用" + }, + "js_history_delete": { + "message": "刪除" + }, + "js_history_export": { + "message": "匯出" + }, + "js_history_reload": { + "message": "讀取和載入" + }, + "js_history_resuspend": { + "message": "重新凍結" + }, + "js_history_save": { + "message": "儲存" + }, + "js_history_window": { + "message": "個視窗" + }, + "js_history_windows": { + "message": "個視窗" + }, + "js_history_tab": { + "message": "個分頁" + }, + "js_history_tabs": { + "message": "個分頁" + }, + "js_history_enter_name_for_session": { + "message": "命名這個記錄" + }, + "js_history_confirm_delete": { + "message": "您確定要刪除此記錄嗎?" + }, + "js_history_confirm_session_overwrite": { + "message": "已經有儲存的名稱的記錄。要覆蓋現有記錄嗎?" + }, + "js_history_import_fail": { + "message": "無法匯入文件。確保文件是純文字檔案,並且每列只有一個 URL。" + }, + "js_history_migrate_fail": { + "message": "需要長度 32 個字的擴充元件 ID 以供移轉" + }, + "js_history_migrate_success": { + "message": "成功移轉了 $TABCOUNT$ 個分頁", + "placeholders": { + "tabcount": { + "content": "$1" + } + } + }, + "js_suspended_remove_from_whitelist": { + "message": "從白名單移除" + }, + "js_suspended_hotkey_to_reload": { + "message": "設定鍵盤快捷鍵" + }, + "js_suspended_low_memory": { + "message": "由於系統記憶體不足而凍結的分頁" + }, + "js_options_incognito_warning": { + "message": "你目前使用隱私模式。某些功能將無法使用。" + }, + "js_options_whitelist_no_matches": { + "message": "沒有與當前白名單匹配的打開選項卡。" + }, + "js_options_whitelist_matches_heading": { + "message": "這些打開的選項卡與當前白名單相匹配:" + }, + "js_options_whitelist_matches_overflow_prefix": { + "message": "和另外" + }, + "js_options_whitelist_matches_overflow_suffix": { + "message": "個。" + }, + "js_permissions_button_export": { + "message": "儲存備份" + }, + "js_permissions_button_set": { + "message": "打開擴充套件設定" + }, + "js_update_confirm": { + "message": "您尚未匯出備份。確定要更新擴充功能嗎?" + }, + "js_update_button_export": { + "message": "匯出備份" + }, + "js_update_button_reload": { + "message": "現在更新擴充功能" + }, + "js_shortcuts_not_set": { + "message": "沒有設定" + }, + "js_session_save_point": { + "message": "自動保存點 v" + } } diff --git a/src/about.html b/src/about.html index a9d6eb89..057c8a94 100644 --- a/src/about.html +++ b/src/about.html @@ -37,19 +37,26 @@

+

+ TGS 7.1.6 (issue #1263) gioxx.org/2021/02/06/the-marvellous-suspender-hello-world. +

+

- github.com/greatsuspender/thegreatsuspender + github.com/gioxx/MarvellousSuspender +
+ + gioxx.org
- @greatsuspender + @gioxx

- +

@@ -72,6 +79,11 @@

+

+ + The Great Suspender + +

@@ -80,4 +92,4 @@

- \ No newline at end of file + diff --git a/src/broken.html b/src/broken.html index 274d5721..3b9be0bc 100644 --- a/src/broken.html +++ b/src/broken.html @@ -4,8 +4,7 @@ - The Great Suspender is broken - + @@ -15,15 +14,21 @@
-

Ruh Roh!

-

The Great Suspender failed to start. Perhaps you are using an incompatible version of chrome?

-

Try to restart the extension. If the problem persists, ask for help on the GitHub project page.

-

You can recover lost tabs from the session management page.

+

+

+ +

+

+ . +

+

+ . +


- +
- \ No newline at end of file + diff --git a/src/css/popup.css b/src/css/popup.css index 55f9e6b0..eb973286 100644 --- a/src/css/popup.css +++ b/src/css/popup.css @@ -43,10 +43,6 @@ a { outline: none; color: #3477db; } -#popupContent { - opacity: 0; - transition: opacity 200ms ease; -} #statusDetail a { color: #ffffff; } diff --git a/src/css/style.css b/src/css/style.css index e603d3b9..481dfb6f 100755 --- a/src/css/style.css +++ b/src/css/style.css @@ -10,504 +10,608 @@ */ html, body { - margin: 0; - padding: 0; - min-height: 100%; - font-size: 10px; + margin: 0; + padding: 0; + min-height: 100%; + font-size: 10px; } + html { - box-sizing: border-box; - height: 100vh; + box-sizing: border-box; + height: 100vh; } + *, *::before, *::after { - box-sizing: inherit; + box-sizing: inherit; } + body { - min-height: 100%; - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', + min-height: 100%; + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol'; - font-size: 1.5rem; - line-height: 1.5em; - background: #fafafa; - color: #444; + font-size: 1.5rem; + line-height: 1.5em; + background: #fafafa; + color: #444; } + @media (min-resolution: 192dpi) { - body { - font-weight: 300; - } + body { + font-weight: 300; + } } + /* 'content' pages alignment (suspended tabs have their own overrides) */ /* apply to body tag */ .splash-wrap { - display: flex; - justify-content: center; - /* - vertical center usually looks a little better but some pages have content - which changes height (accordion etc) so this doens't really work - */ - /* align-items: center; */ + display: flex; + justify-content: center; + /* + vertical center usually looks a little better but some pages have content + which changes height (accordion etc) so this doens't really work + */ + /* align-items: center; */ } + strong { - font-weight: 600; + font-weight: 600; } + small { - font-size: smaller; + font-size: smaller; } + h1 { - font-size: 26px; - margin-bottom: 20px; + font-size: 26px; + margin-bottom: 20px; } + p { - margin: 0 0 15px; + margin: 0 0 15px; } + a { - color: #3477db; - text-decoration: none; - cursor: pointer; + color: #3477db; + text-decoration: none; + cursor: pointer; } + a:hover { - text-decoration: underline; + text-decoration: underline; } + a.active { - cursor: default; - color: #444; - pointer-events: none; + cursor: default; + color: #444; + pointer-events: none; } + hr { - border-width: 0; - border-top: 1px solid #e7e7e7; - height: 1px; - margin: 23px 0; + border-width: 0; + border-top: 1px solid #e7e7e7; + height: 1px; + margin: 23px 0; } + .fl { - float: left; - margin-right: 10px; + float: left; + margin-right: 10px; } + .fr { - float: right; - margin-left: 10px; + float: right; + margin-left: 10px; } + .topLabel { - display: inline-block; - margin: 0 0 8px; + display: inline-block; + margin: 0 0 8px; } + select { - min-width: 150px; - color: #444; - background: #fff; - border-radius: 3px; - -webkit-appearance: none; - appearance: none; - margin: 0; - padding: 10px 30px 10px 15px; - font-size: 14px; - border-color: #ccc; - position: relative; - cursor: pointer; + min-width: 150px; + color: #444; + background: #fff; + border-radius: 3px; + -webkit-appearance: none; + appearance: none; + margin: 0; + padding: 10px 30px 10px 15px; + font-size: 14px; + border-color: #ccc; + position: relative; + cursor: pointer; } + .select-wrapper { - background-color: #fff; - display: inline-block; - position: relative; + background-color: #fff; + display: inline-block; + position: relative; } + .select-wrapper::after { - position: absolute; - right: 15px; - top: 6px; - font-family: 'fontello'; - text-decoration: none; - content: '\f0dd'; - color: #3477db; - pointer-events: none; + position: absolute; + right: 15px; + top: 6px; + font-family: 'fontello'; + text-decoration: none; + content: '\f0dd'; + color: #3477db; + pointer-events: none; } + textarea { - color: #444; - width: 100%; - border-color: #c3c3c3; - font-size: 14px; - padding: 3px 5px; - white-space: nowrap; - margin-top: 9px; + color: #444; + width: 100%; + border-color: #c3c3c3; + font-size: 14px; + padding: 3px 5px; + white-space: nowrap; + margin-top: 9px; } + .formRow { - margin: 0 0 20px; + margin: 0 0 20px; } + ul.unorderedList, ol.orderedList { - padding-left: 20px; - margin: 7px 0 10px 0; + padding-left: 20px; + margin: 7px 0 10px 0; } + ul.unorderedList li { - margin: 0 0 3 10px; - list-style: disc; + margin: 0 0 3 10px; + list-style: disc; } + .splash { - padding: 0 20px; - margin: 50px auto; - display: grid; - grid-template-columns: 150px 1fr; - grid-gap: 30px; + padding: 0 20px; + margin: 50px auto; + display: grid; + grid-template-columns: 150px 1fr; + grid-gap: 30px; } + .splash:not(.welcome-message) { - width: 900px; + width: 900px; } + .suspendy-guy { - width: 100%; + width: 100%; } + #suspendy-guy-inprogress { - max-height: 220px; - max-width: 137px; + max-height: 220px; + max-width: 137px; } + #suspendy-guy-complete { - max-height: 220px; + max-height: 220px; } + .btn { - background: #3477db; - color: #fff; - border-radius: 3px; - height: 40px; - line-height: 40px; - padding: 0 20px; - display: inline-block; - border: 0; - font-size: 14px; - font-weight: 500; - cursor: pointer; - - min-width: 80px; - text-align: center; + background: #3477db; + color: #fff; + border-radius: 3px; + height: 40px; + line-height: 40px; + padding: 0 20px; + display: inline-block; + border: 0; + font-size: 14px; + font-weight: 500; + cursor: pointer; + + min-width: 80px; + text-align: center; } + .btn:hover { - background: #5c9dfe; - text-decoration: none; + background: #5c9dfe; + text-decoration: none; } + .btn.btnNeg { - background: #ddd; - color: #333; + background: #ddd; + color: #333; } + .btn.btnNeg:hover { - background: #ccc; + background: #ccc; } .btnDisabled { - background: #f1f1f1; - color: #888; - cursor: default; + background: #f1f1f1; + color: #888; + cursor: default; } + .btnDisabled:hover { - background: #f1f1f1; - color: #888; + background: #f1f1f1; + color: #888; } + .lesserText { - color: #999; + color: #999; } + /* oh dear. well, too late now... */ .hidden { - visibility: hidden; + visibility: hidden; } + .reallyHidden { - display: none; + display: none; } + .mainContent { - width: 750px; - margin: 50px auto; - display: grid; - /* defining first col width because 'auto' could change due to bold text on active item */ - grid-template-columns: 200px auto; - grid-column-gap: 40px; - grid-template-areas: + width: 750px; + margin: 50px auto; + display: grid; + /* defining first col width because 'auto' could change due to bold text on active item */ + grid-template-columns: 200px auto; + grid-column-gap: 40px; + grid-template-areas: 'h h' 'n m'; } + .pageHeader { - grid-area: h; - margin: 0 0 50px; - font-size: 20px; + grid-area: h; + margin: 0 0 50px; + font-size: 20px; } + .contentNav { - grid-area: n; - border-right: 1px solid #ddd; - padding-right: 15px; - align-self: start; + grid-area: n; + border-right: 1px solid #ddd; + padding-right: 15px; + align-self: start; } + .contentNav ul { - padding: 0; - margin: 0; - list-style-type: none; + padding: 0; + margin: 0; + list-style-type: none; } + .contentNav a { - font-size: 16px; - margin-bottom: 20px; - color: #888; - display: block; + font-size: 16px; + margin-bottom: 20px; + color: #888; + display: block; } + .contentNav .active { - color: #3477db; - font-weight: bold; + color: #3477db; + font-weight: bold; } + .content { - grid-area: m; - font-size: 14px; + grid-area: m; + font-size: 14px; } + .content h2 { - font-size: 16px; - font-weight: bold; - margin: 0 0 30px; + font-size: 16px; + font-weight: bold; + margin: 0 0 30px; } + .heading-note { - font-style: italic; - margin-top: -25px; - margin-bottom: 25px; + font-style: italic; + margin-top: -25px; + margin-bottom: 25px; } + .welcome-message { - border-radius: 6px; - background: #fff; - padding: 30px; - margin-bottom: 20px; - align-items: center; - grid-gap: 40px; - box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24); + border-radius: 6px; + background: #fff; + padding: 30px; + margin-bottom: 20px; + align-items: center; + grid-gap: 40px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); } + .gsNote { - font-style: italic; - font-size: 12px; - background: rgb(255, 247, 202); - padding: 5px; - margin-top: 5px; + font-style: italic; + font-size: 12px; + background: rgb(255, 247, 202); + padding: 5px; + margin-top: 5px; } + .sessionLink { - cursor: pointer; + cursor: pointer; } + .sessionLink:hover { - text-decoration: underline; + text-decoration: underline; } + .tabContainer { - padding: 0px; - margin: 0 0 5px 0; + padding: 0px; + margin: 0 0 5px 0; } + .tabContainer > * { - vertical-align: middle; + vertical-align: middle; } + a.historyLink { - padding-left: 5px; - color: #333; - font-size: 13px; - text-decoration: none; - max-width: 90%; - overflow: hidden; - display: inline-block; - white-space: nowrap; - text-overflow: ellipsis; + padding-left: 5px; + color: #333; + font-size: 13px; + text-decoration: none; + max-width: 90%; + overflow: hidden; + display: inline-block; + white-space: nowrap; + text-overflow: ellipsis; } + a.historyLink:hover { - text-decoration: underline; + text-decoration: underline; } + .windowContainer { - font-weight: bold; - margin: 20px 0 10px; + font-weight: bold; + margin: 20px 0 10px; } .groupLink { - margin: 0 0 0 10px; - font-size: 11px; - font-weight: normal; + margin: 0 0 0 10px; + font-size: 11px; + font-weight: normal; } + .sessionContainer { - white-space: nowrap; - margin: 0 0 5px; + white-space: nowrap; + margin: 0 0 5px; } + .sessionContainer .groupLink { - visibility: hidden; + visibility: hidden; } + .sessionContainer:hover .groupLink { - visibility: visible; + visibility: visible; } + .sessionContents { - margin-left: 28px; + margin-left: 28px; } + /* conatiner for a group of sessions */ .sessionsContainer { - margin-bottom: 50px; + margin-bottom: 50px; } + .sessionIcon { - cursor: pointer; - margin: 0 10px 0 -3px; + cursor: pointer; + margin: 0 10px 0 -3px; } + .sessionContents div:last-child { - padding-bottom: 10px; + padding-bottom: 10px; } + .tabContainer .itemHover { - visibility: hidden; - margin: 0; - padding: 0 0 3px; - cursor: pointer; + visibility: hidden; + margin: 0; + padding: 0 0 3px; + cursor: pointer; } + .tabContainer:hover .itemHover { - visibility: visible; + visibility: visible; } + .tabContainer .removeLink { - margin-left: -20px; - color: #888; + margin-left: -20px; + color: #888; } + #screenCaptureNotice { - display: none; - clear: left; - margin-top: 30px; - background: rgb(255, 247, 202); - padding: 10px 0 10px 10px; + display: none; + clear: left; + margin-top: 30px; + background: rgb(255, 247, 202); + padding: 10px 0 10px 10px; } + .keyboardShortcuts { - display: grid; - grid-template-columns: auto auto; + display: grid; + grid-template-columns: auto auto; } + .keyboardShortcuts div { - margin: 0 0 2px; + margin: 0 0 2px; } + .bottomMargin { - margin-bottom: 20px !important; + margin-bottom: 20px !important; } + .hotkeyCommand { - word-spacing: -1px; + word-spacing: -1px; } /* custom checkboxes */ input[type='checkbox'] { - position: absolute; - opacity: 0; + position: absolute; + opacity: 0; } + input[type='checkbox'] + label { - position: relative; - padding-left: 30px; - cursor: pointer; + position: relative; + padding-left: 30px; + cursor: pointer; } + input[type='checkbox'] + label:before { - position: absolute; - left: 0; - top: -2px; - font-family: 'fontello'; - text-decoration: none; - content: '\f096'; - color: #888; - font-size: 24px; - cursor: pointer; + position: absolute; + left: 0; + top: -2px; + font-family: 'fontello'; + text-decoration: none; + content: '\f096'; + color: #888; + font-size: 24px; + cursor: pointer; } + input[type='checkbox']:checked + label:before { - content: '\f14a'; - color: #3477db; + content: '\f14a'; + color: #3477db; } /* custom radio btns */ .radio { - position: relative; - display: block; - margin-top: 15px; - margin-bottom: 15px; + position: relative; + display: block; + margin-top: 15px; + margin-bottom: 15px; } + .radio input[type='radio'] { - opacity: 0; - z-index: 1; + opacity: 0; + z-index: 1; } + .radio input[type='radio']:checked + label::before { - border-color: #3477db; + border-color: #3477db; } + .radio input[type='radio']:checked + label::after { - transform: scale(1, 1); + transform: scale(1, 1); } + .radio input[type='radio']:checked + label::after { - background-color: #3477db; + background-color: #3477db; } + .radio label { - display: inline-block; - vertical-align: middle; - position: relative; - padding-left: 5px; - cursor: pointer; + display: inline-block; + vertical-align: middle; + position: relative; + padding-left: 5px; + cursor: pointer; } + .radio label::before { - cursor: pointer; - content: ''; - display: inline-block; - position: absolute; - width: 17px; - height: 17px; - left: 0; - top: 4px; - margin-left: -20px; - border: 1px solid #ccc; - border-radius: 50%; - background-color: #fff; + cursor: pointer; + content: ''; + display: inline-block; + position: absolute; + width: 17px; + height: 17px; + left: 0; + top: 4px; + margin-left: -20px; + border: 1px solid #ccc; + border-radius: 50%; + background-color: #fff; } + .radio label::after { - display: inline-block; - position: absolute; - content: ' '; - width: 13px; - height: 13px; - left: 2px; - top: 6px; - margin-left: -20px; - border-radius: 50%; - background-color: #555; - transform: scale(0, 0); + display: inline-block; + position: absolute; + content: ' '; + width: 13px; + height: 13px; + left: 2px; + top: 6px; + margin-left: -20px; + border-radius: 50%; + background-color: #555; + transform: scale(0, 0); } + .sub-section { - margin-bottom: 35px; + margin-bottom: 35px; } .tooltipIcon { - color: #444; + color: #444; } + /* Tooltips */ [data-i18n-tooltip] { - position: relative; + position: relative; } + [data-i18n-tooltip]::after { - content: attr(data-i18n-tooltip); - position: absolute; - left: 50%; - top: -6px; - transform: translateX(-50%) translateY(-100%); - background: #fff; - line-height: 20px; - color: #444; - padding: 4px 2px; - min-width: 500px; - border-radius: 4px; - border: 1px solid #e8e8e8; - pointer-events: none; - padding: 24px 24px 32px; - z-index: 99; - opacity: 0; - white-space: pre; + content: attr(data-i18n-tooltip); + position: absolute; + left: 50%; + top: -6px; + transform: translateX(-50%) translateY(-100%); + background: #fff; + line-height: 20px; + color: #444; + padding: 4px 2px; + min-width: 500px; + border-radius: 4px; + border: 1px solid #e8e8e8; + pointer-events: none; + padding: 24px 24px 32px; + z-index: 99; + opacity: 0; + white-space: pre; } + [data-i18n-tooltip]:hover::after { - opacity: 1; + opacity: 1; } + @keyframes spinner { - to {transform: rotate(360deg);} + to { + transform: rotate(360deg); + } } + .faviconSpinner { - position: relative; - display: inline-block; - min-width: 16px; - min-height: 16px; - margin-top: 4px; + position: relative; + display: inline-block; + min-width: 16px; + min-height: 16px; + margin-top: 4px; } + .faviconSpinner:before { - content: ''; - box-sizing: border-box; - position: absolute; - top: 50%; - left: 50%; - width: 16px; - height: 16px; - margin-top: -10px; - margin-left: -10px; - border-radius: 50%; - border: 2px solid #ccc; - border-top-color: #333; - animation: spinner .6s linear infinite; -} \ No newline at end of file + content: ''; + box-sizing: border-box; + position: absolute; + top: 50%; + left: 50%; + width: 16px; + height: 16px; + margin-top: -10px; + margin-left: -10px; + border-radius: 50%; + border: 2px solid #ccc; + border-top-color: #333; + animation: spinner .6s linear infinite; +} + + +/* dark theme */ +.dark, .dark .option, .dark .historyLink { + background: #353535; + color: #b8b8b8; +} + +.dark .tooltipIcon { + color: white; +} + +.dark .btn { + background: #3477db; +} + diff --git a/src/debug.html b/src/debug.html index d028d1d0..401f230d 100644 --- a/src/debug.html +++ b/src/debug.html @@ -5,7 +5,7 @@ - The Great Suspender - Debugger + The Marvellous Suspender - Debugger @@ -16,8 +16,6 @@  |  discardInPlaceOfSuspend:  |  - useAlternateScreenCaptureLib: -  |  claim all suspended tabs
@@ -44,4 +42,4 @@ - \ No newline at end of file + diff --git a/src/history.html b/src/history.html index 0f36acf6..44491507 100644 --- a/src/history.html +++ b/src/history.html @@ -2,55 +2,64 @@ - - - - - - + + + + + + -
+
- + -
-
    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -
-
+
+
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
+
-
-

-
+
+ +

+
-

-
+

+
-

-
+

+
- - -
+ + + +

+
+ +
+ +
+ +
- \ No newline at end of file + diff --git a/src/img/ic_suspendy_128x128.png b/src/img/ic_suspendy_128x128.png index a4d3d4e8..b221c72f 100644 Binary files a/src/img/ic_suspendy_128x128.png and b/src/img/ic_suspendy_128x128.png differ diff --git a/src/img/ic_suspendy_128x128.xcf b/src/img/ic_suspendy_128x128.xcf new file mode 100644 index 00000000..4bc3181f Binary files /dev/null and b/src/img/ic_suspendy_128x128.xcf differ diff --git a/src/img/ic_suspendy_16x16.png b/src/img/ic_suspendy_16x16.png index bb5288ec..cd235656 100644 Binary files a/src/img/ic_suspendy_16x16.png and b/src/img/ic_suspendy_16x16.png differ diff --git a/src/img/ic_suspendy_16x16_grey.png b/src/img/ic_suspendy_16x16_grey.png index a222a00e..9530c5c6 100644 Binary files a/src/img/ic_suspendy_16x16_grey.png and b/src/img/ic_suspendy_16x16_grey.png differ diff --git a/src/img/ic_suspendy_32x32.png b/src/img/ic_suspendy_32x32.png index 0c3db526..fab58345 100644 Binary files a/src/img/ic_suspendy_32x32.png and b/src/img/ic_suspendy_32x32.png differ diff --git a/src/img/ic_suspendy_32x32.xcf b/src/img/ic_suspendy_32x32.xcf new file mode 100644 index 00000000..5a6e927b Binary files /dev/null and b/src/img/ic_suspendy_32x32.xcf differ diff --git a/src/img/ic_suspendy_32x32_grey.png b/src/img/ic_suspendy_32x32_grey.png index 4c3c7e35..53bc24d3 100644 Binary files a/src/img/ic_suspendy_32x32_grey.png and b/src/img/ic_suspendy_32x32_grey.png differ diff --git a/src/img/ic_suspendy_32x32_grey.xcf b/src/img/ic_suspendy_32x32_grey.xcf new file mode 100644 index 00000000..6d9fcb00 Binary files /dev/null and b/src/img/ic_suspendy_32x32_grey.xcf differ diff --git a/src/img/ic_suspendy_48x48.png b/src/img/ic_suspendy_48x48.png index 3fbaae5b..a6443947 100644 Binary files a/src/img/ic_suspendy_48x48.png and b/src/img/ic_suspendy_48x48.png differ diff --git a/src/img/ic_suspendy_48x48.xcf b/src/img/ic_suspendy_48x48.xcf new file mode 100644 index 00000000..c99b1fe9 Binary files /dev/null and b/src/img/ic_suspendy_48x48.xcf differ diff --git a/src/img/marvellous.png b/src/img/marvellous.png new file mode 100644 index 00000000..cde2dc05 Binary files /dev/null and b/src/img/marvellous.png differ diff --git a/src/img/snoozy_tab.svg b/src/img/snoozy_tab.svg index f25e970b..e38569c0 100644 --- a/src/img/snoozy_tab.svg +++ b/src/img/snoozy_tab.svg @@ -1,15 +1,130 @@ - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/src/img/snoozy_tab_awake.svg b/src/img/snoozy_tab_awake.svg index 244bb625..7f87c6fd 100644 --- a/src/img/snoozy_tab_awake.svg +++ b/src/img/snoozy_tab_awake.svg @@ -1,12 +1,115 @@ - - - - - - - - - - - - \ No newline at end of file + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + diff --git a/src/img/snoozy_tab_awake_original.svg b/src/img/snoozy_tab_awake_original.svg new file mode 100644 index 00000000..244bb625 --- /dev/null +++ b/src/img/snoozy_tab_awake_original.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/img/snoozy_tab_original.svg b/src/img/snoozy_tab_original.svg new file mode 100644 index 00000000..f25e970b --- /dev/null +++ b/src/img/snoozy_tab_original.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/img/suspendy-guy-alt.png b/src/img/suspendy-guy-alt.png index 1266978f..ce1def1f 100644 Binary files a/src/img/suspendy-guy-alt.png and b/src/img/suspendy-guy-alt.png differ diff --git a/src/img/suspendy-guy-oops.png b/src/img/suspendy-guy-oops.png index 17b219e8..331e6b71 100644 Binary files a/src/img/suspendy-guy-oops.png and b/src/img/suspendy-guy-oops.png differ diff --git a/src/img/suspendy-guy-uh-oh.png b/src/img/suspendy-guy-uh-oh.png index dc35e8be..fc708911 100644 Binary files a/src/img/suspendy-guy-uh-oh.png and b/src/img/suspendy-guy-uh-oh.png differ diff --git a/src/img/suspendy-guy.png b/src/img/suspendy-guy.png index 2dc542c9..cce953c0 100644 Binary files a/src/img/suspendy-guy.png and b/src/img/suspendy-guy.png differ diff --git a/src/js/about.js b/src/js/about.js index 82f3d2bb..ae45d6c8 100644 --- a/src/js/about.js +++ b/src/js/about.js @@ -1,4 +1,4 @@ -/* global chrome, XMLHttpRequest, gsStorage, gsAnalytics, gsUtils */ +/* global chrome, XMLHttpRequest, gsUtils, gsStorage */ (function(global) { 'use strict'; @@ -9,7 +9,10 @@ return; } - gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + gsUtils.documentReadyAndLocalisedAsPromised(document).then(function() { + //Set theme + document.body.classList.add(gsStorage.getOption(gsStorage.THEME) === 'dark' ? 'dark' : null); + var versionEl = document.getElementById('aboutVersion'); versionEl.innerHTML = 'v' + chrome.runtime.getManifest().version; @@ -19,10 +22,9 @@ document.getElementsByClassName('noIncognito'), function(el) { el.style.display = 'none'; - } + }, ); } }); - gsAnalytics.reportPageView('about.html'); })(this); diff --git a/src/js/background.js b/src/js/background.js index e3dc8a74..111d75c7 100644 --- a/src/js/background.js +++ b/src/js/background.js @@ -1,4 +1,4 @@ -/* global gsStorage, gsChrome, gsIndexedDb, gsUtils, gsFavicon, gsSession, gsMessages, gsTabSuspendManager, gsTabDiscardManager, gsAnalytics, gsTabCheckManager, gsSuspendedTab, chrome, XMLHttpRequest */ +/* global gsStorage, gsChrome, gsIndexedDb, gsUtils, gsFavicon, gsSession, gsMessages, gsTabSuspendManager, gsTabDiscardManager, gsTabCheckManager, gsSuspendedTab, chrome, XMLHttpRequest */ /* * The Great Suspender * Copyright (C) 2017 Dean Oemcke @@ -33,9 +33,6 @@ var tgs = (function() { const STATE_SCROLL_POS = 'scrollPos'; const focusDelay = 500; - const noticeCheckInterval = 1000 * 60 * 60 * 12; // every 12 hours - const sessionMetricsCheckInterval = 1000 * 60 * 15; // every 15 minutes - const analyticsCheckInterval = 1000 * 60 * 60 * 23.5; // every 23.5 hours const _tabStateByTabId = {}; const _currentFocusedTabIdByWindowId = {}; @@ -56,7 +53,6 @@ var tgs = (function() { tgs, gsUtils, gsChrome, - gsAnalytics, gsStorage, gsIndexedDb, gsMessages, @@ -141,11 +137,6 @@ var tgs = (function() { }); } - function startTimers() { - startNoticeCheckerJob(); - startSessionMetricsJob(); - startAnalyticsUpdateJob(); - } function getInternalViewByTabId(tabId) { const internalViews = chrome.extension.getViews({ tabId: tabId }); @@ -154,11 +145,11 @@ var tgs = (function() { } return null; } + function getInternalViewsByViewName(viewName) { - const internalViews = chrome.extension + return chrome.extension .getViews() .filter(o => o.location.pathname.indexOf(viewName) >= 0); - return internalViews; } function getCurrentlyActiveTab(callback) { @@ -202,7 +193,7 @@ var tgs = (function() { _currentStationaryTabIdByWindowId[_currentStationaryWindowId]; if (currentStationaryTabId) { const currentStationaryTab = await gsChrome.tabsGet( - currentStationaryTabId + currentStationaryTabId, ); if (currentStationaryTab !== null) { callback(currentStationaryTab); @@ -262,7 +253,7 @@ var tgs = (function() { let url = gsUtils.getRootUrl( gsUtils.getOriginalUrl(activeTab.url), includePath, - false + false, ); gsUtils.saveToWhitelist(url); unsuspendTab(activeTab); @@ -328,13 +319,13 @@ var tgs = (function() { function setTempWhitelistStateForTab(tab, callback) { gsMessages.sendTemporaryWhitelistToContentScript(tab.id, function( error, - response + response, ) { if (error) { gsUtils.warning( tab.id, 'Failed to sendTemporaryWhitelistToContentScript', - error + error, ); } var contentScriptStatus = @@ -355,13 +346,13 @@ var tgs = (function() { function unsetTempWhitelistStateForTab(tab, callback) { gsMessages.sendUndoTemporaryWhitelistToContentScript(tab.id, function( error, - response + response, ) { if (error) { gsUtils.warning( tab.id, 'Failed to sendUndoTemporaryWhitelistToContentScript', - error + error, ); } var contentScriptStatus = @@ -435,7 +426,7 @@ var tgs = (function() { if (!activeTab) { gsUtils.warning( 'background', - 'Could not determine currently active window.' + 'Could not determine currently active window.', ); return; } @@ -463,7 +454,7 @@ var tgs = (function() { if (!activeTab) { gsUtils.warning( 'background', - 'Could not determine currently active window.' + 'Could not determine currently active window.', ); return; } @@ -512,7 +503,7 @@ var tgs = (function() { for (const tab of selectedTabs) { gsTabSuspendManager.queueTabForSuspension(tab, 1); } - } + }, ); } @@ -526,7 +517,7 @@ var tgs = (function() { unsuspendTab(tab); } } - } + }, ); } @@ -554,7 +545,7 @@ var tgs = (function() { const timerDetails = {}; timerDetails.tabId = tab.id; timerDetails.suspendDateTime = new Date( - new Date().getTime() + timeToSuspend + new Date().getTime() + timeToSuspend, ); timerDetails.timer = setTimeout(async () => { @@ -568,7 +559,7 @@ var tgs = (function() { }, timeToSuspend); gsUtils.log( tab.id, - 'Adding tab timer for: ' + timerDetails.suspendDateTime + 'Adding tab timer for: ' + timerDetails.suspendDateTime, ); setTabStatePropForTabId(tab.id, STATE_TIMER_DETAILS, timerDetails); @@ -597,12 +588,14 @@ var tgs = (function() { function getTabStatePropForTabId(tabId, prop) { return _tabStateByTabId[tabId] ? _tabStateByTabId[tabId][prop] : undefined; } + function setTabStatePropForTabId(tabId, prop, value) { // gsUtils.log(tabId, `Setting tab state prop: ${prop}:`, value); const tabState = _tabStateByTabId[tabId] || {}; tabState[prop] = value; _tabStateByTabId[tabId] = tabState; } + function clearTabStateForTabId(tabId) { gsUtils.log(tabId, 'Clearing tab state props:', _tabStateByTabId[tabId]); clearAutoSuspendTimerForTabId(tabId); @@ -669,7 +662,7 @@ var tgs = (function() { gsUtils.log( tab.id, 'unsuspended tab state changed. changeInfo: ', - changeInfo + changeInfo, ); // Ensure we clear the STATE_UNLOADED_URL flag during load in case the @@ -686,7 +679,7 @@ var tgs = (function() { if (changeInfo.hasOwnProperty('discarded') && changeInfo.discarded) { const existingSuspendReason = getTabStatePropForTabId( tab.id, - STATE_SUSPEND_REASON + STATE_SUSPEND_REASON, ); if (existingSuspendReason && existingSuspendReason === 3) { // For some reason the discarded changeInfo gets called twice (chrome bug?) @@ -697,7 +690,7 @@ var tgs = (function() { } gsUtils.log( tab.id, - 'Unsuspended tab has been discarded. Url: ' + tab.url + 'Unsuspended tab has been discarded. Url: ' + tab.url, ); gsTabDiscardManager.handleDiscardedUnsuspendedTab(tab); //async. unhandled promise. @@ -714,7 +707,7 @@ var tgs = (function() { delete queuedTabDetails.executionProps.refetchTab; gsTabSuspendManager.queueTabForSuspension( tab, - queuedTabDetails.executionProps.forceLevel + queuedTabDetails.executionProps.forceLevel, ); return; } @@ -741,17 +734,17 @@ var tgs = (function() { if (changeInfo.status === 'complete') { const tempWhitelistOnReload = getTabStatePropForTabId( tab.id, - STATE_TEMP_WHITELIST_ON_RELOAD + STATE_TEMP_WHITELIST_ON_RELOAD, ); const scrollPos = getTabStatePropForTabId(tab.id, STATE_SCROLL_POS) || null; const historyUrlToRemove = getTabStatePropForTabId( tab.id, - STATE_HISTORY_URL_TO_REMOVE + STATE_HISTORY_URL_TO_REMOVE, ); const setAutodiscardable = getTabStatePropForTabId( tab.id, - STATE_SET_AUTODISCARDABLE + STATE_SET_AUTODISCARDABLE, ); clearTabStateForTabId(tab.id); @@ -768,7 +761,7 @@ var tgs = (function() { .catch(error => { gsUtils.warning( tab.id, - 'Failed to send init to content script. Tab may not behave as expected.' + 'Failed to send init to content script. Tab may not behave as expected.', ); }) .then(() => { @@ -802,7 +795,8 @@ var tgs = (function() { startTime: previousVisit.visitTime - 0.1, endTime: previousVisit.visitTime + 0.1, }, - () => {} + () => { + }, ); } }); @@ -822,7 +816,7 @@ var tgs = (function() { } else { resolve(response); } - } + }, ); }); } @@ -838,14 +832,14 @@ var tgs = (function() { gsUtils.log( tab.id, 'suspended tab status changed. changeInfo: ', - changeInfo + changeInfo, ); if (changeInfo.status && changeInfo.status === 'loading') { tgs.setTabStatePropForTabId( tab.id, tgs.STATE_INITIALISE_SUSPENDED_TAB, - true + true, ); return; } @@ -857,7 +851,7 @@ var tgs = (function() { gsTabSuspendManager.unqueueTabForSuspension(tab); //safety precaution const shouldInitTab = getTabStatePropForTabId( tab.id, - STATE_INITIALISE_SUSPENDED_TAB + STATE_INITIALISE_SUSPENDED_TAB, ); if (shouldInitTab) { initialiseSuspendedTab(tab); @@ -869,7 +863,7 @@ var tgs = (function() { const unloadedUrl = getTabStatePropForTabId(tab.id, STATE_UNLOADED_URL); const disableUnsuspendOnReload = getTabStatePropForTabId( tab.id, - STATE_DISABLE_UNSUSPEND_ON_RELOAD + STATE_DISABLE_UNSUSPEND_ON_RELOAD, ); clearTabStateForTabId(tab.id); @@ -962,7 +956,7 @@ var tgs = (function() { if (!focusedTab) { gsUtils.warning( 'background', - `Couldnt find active tab with windowId: ${windowId}. Window may have been closed.` + `Couldnt find active tab with windowId: ${windowId}. Window may have been closed.`, ); return; } @@ -989,7 +983,7 @@ var tgs = (function() { // with the new discarded id gsUtils.log( tabId, - 'Could not find newly focused tab. Assuming it has been discarded' + 'Could not find newly focused tab. Assuming it has been discarded', ); return; } @@ -1020,12 +1014,12 @@ var tgs = (function() { contentScriptStatus = await gsTabCheckManager.queueTabCheckAsPromise( focusedTab, {}, - 0 + 0, ); } gsUtils.log( focusedTab.id, - 'Content script status: ' + contentScriptStatus + 'Content script status: ' + contentScriptStatus, ); } @@ -1050,7 +1044,7 @@ var tgs = (function() { } let discardAfterSuspend = gsStorage.getOption( - gsStorage.DISCARD_AFTER_SUSPEND + gsStorage.DISCARD_AFTER_SUSPEND, ); if (!discardAfterSuspend) { return; @@ -1063,7 +1057,7 @@ var tgs = (function() { if (!previouslyFocusedTab) { gsUtils.log( previouslyFocusedTabId, - 'Could not find tab. Has probably already been discarded' + 'Could not find tab. Has probably already been discarded', ); return; } @@ -1075,7 +1069,7 @@ var tgs = (function() { //but also avoids conflicts if this tab is already scheduled for checking gsUtils.log( previouslyFocusedTabId, - 'Queueing previously focused tab for discard via tabCheckManager' + 'Queueing previously focused tab for discard via tabCheckManager', ); gsTabCheckManager.queueTabCheck(previouslyFocusedTab, {}, 1000); } @@ -1103,7 +1097,7 @@ var tgs = (function() { function handleNewStationaryTabFocus( focusedTabId, previousStationaryTabId, - focusedTab + focusedTab, ) { gsUtils.log(focusedTabId, 'new stationary tab focus handled'); @@ -1111,7 +1105,7 @@ var tgs = (function() { handleSuspendedTabFocusGained(focusedTab); //async. unhandled promise. } else if (gsUtils.isNormalTab(focusedTab)) { const queuedTabDetails = gsTabSuspendManager.getQueuedTabDetails( - focusedTab + focusedTab, ); //if focusedTab is already in the queue for suspension then remove it. if (queuedTabDetails) { @@ -1183,73 +1177,10 @@ var tgs = (function() { }); } - function checkForNotices() { - gsUtils.log('background', 'Checking for notices..'); - var xhr = new XMLHttpRequest(); - var lastShownNoticeVersion = gsStorage.fetchNoticeVersion(); - - xhr.open('GET', 'https://greatsuspender.github.io/notice.json', true); - xhr.timeout = 4000; - xhr.setRequestHeader('Cache-Control', 'no-cache'); - xhr.onreadystatechange = function() { - if (xhr.readyState === 4 && xhr.responseText) { - var resp; - try { - resp = JSON.parse(xhr.responseText); - } catch (e) { - gsUtils.error( - 'background', - 'Failed to parse notice response', - xhr.responseText - ); - return; - } - - if (!resp || !resp.active || !resp.text) { - gsUtils.log('background', 'No new notice found'); - return; - } - - //only show notice if it is intended for this extension version - var noticeTargetExtensionVersion = String(resp.target); - if ( - noticeTargetExtensionVersion !== chrome.runtime.getManifest().version - ) { - gsUtils.log( - 'background', - `Notice target extension version: ${noticeTargetExtensionVersion} - does not match actual extension version: ${ - chrome.runtime.getManifest().version - }` - ); - return; - } - - //only show notice if it has not already been shown - var noticeVersion = String(resp.version); - if (noticeVersion <= lastShownNoticeVersion) { - gsUtils.log( - 'background', - `Notice version: ${noticeVersion} is not greater than last shown notice version: ${lastShownNoticeVersion}` - ); - return; - } - - //show notice - set global notice field (so that it can be trigger to show later) - _noticeToDisplay = resp; - gsAnalytics.reportEvent( - 'Notice', - 'Prep', - resp.target + ':' + resp.version - ); - } - }; - xhr.send(); - } - function requestNotice() { return _noticeToDisplay; } + function clearNotice() { _noticeToDisplay = undefined; } @@ -1279,7 +1210,7 @@ var tgs = (function() { if (gsUtils.isNormalTab(tab, true)) { gsMessages.sendRequestInfoToContentScript(tab.id, function( error, - tabInfo + tabInfo, ) { if (error) { gsUtils.warning(tab.id, 'Failed to getDebugInfo', error); @@ -1309,7 +1240,7 @@ var tgs = (function() { } else { gsMessages.sendRequestInfoToContentScript(tabId, function( error, - tabInfo + tabInfo, ) { if (error) { gsUtils.warning(tabId, 'Failed to getContentScriptStatus', error); @@ -1423,7 +1354,7 @@ var tgs = (function() { return; } callback(gsUtils.STATUS_UNKNOWN); - } + }, ); } @@ -1450,7 +1381,7 @@ var tgs = (function() { gsUtils.warning( tabId, chrome.runtime.lastError, - `Failed to set icon for tab. Tab may have been closed.` + `Failed to set icon for tab. Tab may have been closed.`, ); } }); @@ -1531,21 +1462,21 @@ var tgs = (function() { }); chrome.contextMenus.create({ title: chrome.i18n.getMessage( - 'js_context_soft_suspend_other_tabs_in_window' + 'js_context_soft_suspend_other_tabs_in_window', ), contexts: allContexts, onclick: () => suspendAllTabs(false), }); chrome.contextMenus.create({ title: chrome.i18n.getMessage( - 'js_context_force_suspend_other_tabs_in_window' + 'js_context_force_suspend_other_tabs_in_window', ), contexts: allContexts, onclick: () => suspendAllTabs(true), }); chrome.contextMenus.create({ title: chrome.i18n.getMessage( - 'js_context_unsuspend_all_tabs_in_window' + 'js_context_unsuspend_all_tabs_in_window', ), contexts: allContexts, onclick: () => unsuspendAllTabs(), @@ -1577,26 +1508,37 @@ var tgs = (function() { function addCommandListeners() { chrome.commands.onCommand.addListener(function(command) { - if (command === '1-suspend-tab') { - toggleSuspendedStateOfHighlightedTab(); - } else if (command === '2-toggle-temp-whitelist-tab') { - requestToggleTempWhitelistStateOfHighlightedTab(); - } else if (command === '2a-suspend-selected-tabs') { - suspendSelectedTabs(); - } else if (command === '2b-unsuspend-selected-tabs') { - unsuspendSelectedTabs(); - } else if (command === '3-suspend-active-window') { - suspendAllTabs(false); - } else if (command === '3b-force-suspend-active-window') { - suspendAllTabs(true); - } else if (command === '4-unsuspend-active-window') { - unsuspendAllTabs(); - } else if (command === '4b-soft-suspend-all-windows') { - suspendAllTabsInAllWindows(false); - } else if (command === '5-suspend-all-windows') { - suspendAllTabsInAllWindows(true); - } else if (command === '6-unsuspend-all-windows') { - unsuspendAllTabsInAllWindows(); + switch (command) { + case '1-suspend-tab': + toggleSuspendedStateOfHighlightedTab(); + break; + case '2-toggle-temp-whitelist-tab': + requestToggleTempWhitelistStateOfHighlightedTab(); + break; + case '2a-suspend-selected-tabs': + suspendSelectedTabs(); + break; + case '2b-unsuspend-selected-tabs': + unsuspendSelectedTabs(); + break; + case '3-suspend-active-window': + suspendAllTabs(false); + break; + case '3b-force-suspend-active-window': + suspendAllTabs(true); + break; + case '4-unsuspend-active-window': + unsuspendAllTabs(); + break; + case '4b-soft-suspend-all-windows': + suspendAllTabsInAllWindows(false); + break; + case '5-suspend-all-windows': + suspendAllTabsInAllWindows(true); + break; + case '6-unsuspend-all-windows': + unsuspendAllTabsInAllWindows(); + break; } }); } @@ -1607,40 +1549,40 @@ var tgs = (function() { gsUtils.log( sender.tab.id, 'background messageRequestListener', - request.action + request.action, ); - switch (request.action) { - case 'loadCleanScreencaptureBlocklist': - gsCleanScreencaps.loadList() - case 'reportTabState': - var contentScriptStatus = - request && request.status ? request.status : null; - if ( - contentScriptStatus === 'formInput' || - contentScriptStatus === 'tempWhitelist' - ) { - chrome.tabs.update(sender.tab.id, { autoDiscardable: false }); - } else if (!sender.tab.autoDiscardable) { - chrome.tabs.update(sender.tab.id, { autoDiscardable: true }); - } - // If tab is currently visible then update popup icon - if (sender.tab && isCurrentFocusedTab(sender.tab)) { - calculateTabStatus(sender.tab, contentScriptStatus, function (status) { - setIconStatus(status, sender.tab.id); - }); - } - sendResponse(); - return false; - case 'savePreviewData': - gsTabSuspendManager.handlePreviewImageResponse( - sender.tab, - request.previewUrl, - request.errorMsg - ); // async. unhandled promise - sendResponse(); - return false; + if (request.action === 'reportTabState') { + var contentScriptStatus = + request && request.status ? request.status : null; + if ( + contentScriptStatus === 'formInput' || + contentScriptStatus === 'tempWhitelist' + ) { + chrome.tabs.update(sender.tab.id, { autoDiscardable: false }); + } else if (!sender.tab.autoDiscardable) { + chrome.tabs.update(sender.tab.id, { autoDiscardable: true }); + } + // If tab is currently visible then update popup icon + if (sender.tab && isCurrentFocusedTab(sender.tab)) { + calculateTabStatus(sender.tab, contentScriptStatus, function(status) { + setIconStatus(status, sender.tab.id); + }); + } + sendResponse(); + return false; } + + if (request.action === 'savePreviewData') { + gsTabSuspendManager.handlePreviewImageResponse( + sender.tab, + request.previewUrl, + request.errorMsg, + ); // async. unhandled promise + sendResponse(); + return false; + } + // Fallback to empty response to ensure callback is made sendResponse(); return false; @@ -1707,7 +1649,7 @@ var tgs = (function() { //attach listener to runtime for external messages, to allow //interoperability with other extensions in the manner of an API chrome.runtime.onMessageExternal.addListener( - externalMessageRequestListener + externalMessageRequestListener, ); } @@ -1738,9 +1680,38 @@ var tgs = (function() { queueSessionTimer(); removeTabIdReferences(tabId); }); + + function isItOurUrl(url) { + // return true is suspended.html follows extenstion's id immediately + // which means that this url is likely belongs to our extenstion (no other extensions handle it now) + return url.match('^chrome-extension:\/\/[^\/]*\/suspended\.html'); + } + + async function claimTab(tabId) { + const tabs = await gsChrome.tabsQuery(); + for (const tab of tabs) { + if ( + tab.id == tabId && + isItOurUrl(tab.url) && + gsUtils.isSuspendedTab(tab, true) && + tab.url.indexOf(chrome.runtime.id) < 0 + ) { + const newUrl = tab.url.replace( + gsUtils.getRootUrl(tab.url), + chrome.runtime.id, + ); + await gsChrome.tabsUpdate(tab.id, { url: newUrl }); + } + } + }; + chrome.tabs.onUpdated.addListener(function(tabId, changeInfo, tab) { if (!changeInfo) return; + if (gsStorage.getOption(gsStorage.CLAIM_BY_DEFAULT) && changeInfo.status === 'complete') { + claimTab(tabId); + } + // if url has changed if (changeInfo.url) { gsUtils.log(tabId, 'tab url changed. changeInfo: ', changeInfo); @@ -1761,11 +1732,6 @@ var tgs = (function() { var noticeToDisplay = requestNotice(); if (noticeToDisplay) { chrome.tabs.create({ url: chrome.extension.getURL('notice.html') }); - gsAnalytics.reportEvent( - 'Notice', - 'Display', - noticeToDisplay.target + ':' + noticeToDisplay.version - ); } }); chrome.windows.onRemoved.addListener(function(windowId) { @@ -1812,27 +1778,6 @@ var tgs = (function() { }); } - function startNoticeCheckerJob() { - checkForNotices(); - window.setInterval(checkForNotices, noticeCheckInterval); - } - - function startSessionMetricsJob() { - gsSession.updateSessionMetrics(true); - window.setInterval( - gsSession.updateSessionMetrics, - sessionMetricsCheckInterval - ); - } - - function startAnalyticsUpdateJob() { - window.setInterval(() => { - gsAnalytics.performPingReport(); - const reset = true; - gsSession.updateSessionMetrics(reset); - }, analyticsCheckInterval); - } - return { STATE_TIMER_DETAILS, STATE_UNLOADED_URL, @@ -1852,7 +1797,6 @@ var tgs = (function() { setViewGlobals, getInternalViewByTabId, getInternalViewsByViewName, - startTimers, requestNotice, clearNotice, buildContextMenu, @@ -1886,17 +1830,14 @@ var tgs = (function() { Promise.resolve() .then(tgs.backgroundScriptsReadyAsPromised) // wait until all gsLibs have loaded .then(gsStorage.initSettingsAsPromised) // ensure settings have been loaded and synced - .then(gsStorage.checkManagedStorageAndOverride) // enforce managed settings .then(() => { // initialise other gsLibs return Promise.all([ - gsAnalytics.initAsPromised(), gsFavicon.initAsPromised(), gsTabSuspendManager.initAsPromised(), gsTabCheckManager.initAsPromised(), gsTabDiscardManager.initAsPromised(), gsSession.initAsPromised(), - gsCleanScreencaps.initAsPromised() ]); }) .catch(error => { @@ -1909,9 +1850,4 @@ Promise.resolve() .then(tgs.initAsPromised) // adds handle(Un)SuspendedTabChanged listeners! .catch(error => { gsUtils.error('background init error: ', error); - }) - .finally(() => { - gsAnalytics.performStartupReport(); - gsAnalytics.performVersionReport(); - tgs.startTimers(); }); diff --git a/src/js/broken.js b/src/js/broken.js index 6941e739..ee9d13da 100644 --- a/src/js/broken.js +++ b/src/js/broken.js @@ -1,4 +1,4 @@ -/*global chrome, gsAnalytics */ +/* global chrome, gsUtils */ (function(global) { 'use strict'; @@ -20,7 +20,6 @@ .addEventListener('click', function() { chrome.tabs.create({ url: chrome.extension.getURL('history.html') }); }); - gsAnalytics.reportPageView('broken.html'); } if (document.readyState !== 'loading') { init(); @@ -29,4 +28,7 @@ init(); }); } + + gsUtils.documentReadyAndLocalisedAsPromised(document); + })(this); diff --git a/src/js/contentscript.js b/src/js/contentscript.js index e02e29a4..70e643b5 100644 --- a/src/js/contentscript.js +++ b/src/js/contentscript.js @@ -119,7 +119,7 @@ ? 'tempWhitelist' : 'normal', scrollPos: - document.body.scrollTop || document.documentElement.scrollTop || 0, + (document.body || document.documentElement || {}).scrollTop || 0, }; } diff --git a/src/js/debug.js b/src/js/debug.js index 0e4b08ea..9805b496 100644 --- a/src/js/debug.js +++ b/src/js/debug.js @@ -1,4 +1,4 @@ -/*global chrome, tgs, gsAnalytics, gsUtils, gsFavicon, gsStorage, gsChrome */ +/*global chrome, tgs, gsUtils, gsFavicon, gsStorage, gsChrome */ (function(global) { 'use strict'; @@ -76,7 +76,9 @@ }; } - gsUtils.documentReadyAndLocalisedAsPromsied(document).then(async function() { + gsUtils.documentReadyAndLocalisedAsPromised(document).then(async function() { + //Set theme + document.body.classList.add(gsStorage.getOption(gsStorage.THEME) === 'dark' ? 'dark' : null); await fetchInfo(); addFlagHtml( 'toggleDebugInfo', @@ -98,16 +100,6 @@ ); } ); - addFlagHtml( - 'toggleUseAlternateScreenCaptureLib', - () => gsStorage.getOption(gsStorage.USE_ALT_SCREEN_CAPTURE_LIB), - newVal => { - gsStorage.setOptionAndSync( - gsStorage.USE_ALT_SCREEN_CAPTURE_LIB, - newVal - ); - } - ); document.getElementById('claimSuspendedTabs').onclick = async function(e) { const tabs = await gsChrome.tabsQuery(); for (const tab of tabs) { @@ -144,5 +136,4 @@ }); */ }); - gsAnalytics.reportPageView('debug.html'); })(this); diff --git a/src/js/dom-to-image.js b/src/js/dom-to-image.js deleted file mode 100644 index 80516311..00000000 --- a/src/js/dom-to-image.js +++ /dev/null @@ -1,787 +0,0 @@ -// dom-to-image-2.6.0 -// patched to add toCanvas public function (line 112) -// patched to fix uncaught in promise (line 742) -// patched to fix illegal symbols in data-uri (line 349, 358) -(function (global) { - 'use strict'; - - var util = newUtil(); - var inliner = newInliner(); - var fontFaces = newFontFaces(); - var images = newImages(); - - // Default impl options - var defaultOptions = { - // Default is to fail on error, no placeholder - imagePlaceholder: undefined, - // Default cache bust is false, it will use the cache - cacheBust: false - }; - - var domtoimage = { - toSvg: toSvg, - toPng: toPng, - toJpeg: toJpeg, - toBlob: toBlob, - toPixelData: toPixelData, - toCanvas: toCanvas, - impl: { - fontFaces: fontFaces, - images: images, - util: util, - inliner: inliner, - options: {} - } - }; - - if (typeof module !== 'undefined') - module.exports = domtoimage; - else - global.domtoimage = domtoimage; - - - /** - * @param {Node} node - The DOM Node object to render - * @param {Object} options - Rendering options - * @param {Function} options.filter - Should return true if passed node should be included in the output - * (excluding node means excluding it's children as well). Not called on the root node. - * @param {String} options.bgcolor - color for the background, any valid CSS color value. - * @param {Number} options.width - width to be applied to node before rendering. - * @param {Number} options.height - height to be applied to node before rendering. - * @param {Object} options.style - an object whose properties to be copied to node's style before rendering. - * @param {Number} options.quality - a Number between 0 and 1 indicating image quality (applicable to JPEG only), - defaults to 1.0. - * @param {String} options.imagePlaceholder - dataURL to use as a placeholder for failed images, default behaviour is to fail fast on images we can't fetch - * @param {Boolean} options.cacheBust - set to true to cache bust by appending the time to the request url - * @return {Promise} - A promise that is fulfilled with a SVG image data URL - * */ - function toSvg(node, options) { - options = options || {}; - copyOptions(options); - return Promise.resolve(node) - .then(function (node) { - return cloneNode(node, options.filter, true); - }) - .then(embedFonts) - .then(inlineImages) - .then(applyOptions) - .then(function (clone) { - return makeSvgDataUri(clone, - options.width || util.width(node), - options.height || util.height(node) - ); - }); - - function applyOptions(clone) { - if (options.bgcolor) clone.style.backgroundColor = options.bgcolor; - - if (options.width) clone.style.width = options.width + 'px'; - if (options.height) clone.style.height = options.height + 'px'; - - if (options.style) - Object.keys(options.style).forEach(function (property) { - clone.style[property] = options.style[property]; - }); - - return clone; - } - } - - /** - * @param {Node} node - The DOM Node object to render - * @param {Object} options - Rendering options, @see {@link toSvg} - * @return {Promise} - A promise that is fulfilled with a Uint8Array containing RGBA pixel data. - * */ - function toPixelData(node, options) { - return draw(node, options || {}) - .then(function (canvas) { - return canvas.getContext('2d').getImageData( - 0, - 0, - util.width(node), - util.height(node) - ).data; - }); - } - - /** - * @param {Node} node - The DOM Node object to render - * @param {Object} options - Rendering options, @see {@link toSvg} - * @return {Promise} - A promise that is fulfilled with a canvas object - * */ - function toCanvas(node, options) { - return draw(node, options || {}); - } - - /** - * @param {Node} node - The DOM Node object to render - * @param {Object} options - Rendering options, @see {@link toSvg} - * @return {Promise} - A promise that is fulfilled with a PNG image data URL - * */ - function toPng(node, options) { - return draw(node, options || {}) - .then(function (canvas) { - return canvas.toDataURL(); - }); - } - - /** - * @param {Node} node - The DOM Node object to render - * @param {Object} options - Rendering options, @see {@link toSvg} - * @return {Promise} - A promise that is fulfilled with a JPEG image data URL - * */ - function toJpeg(node, options) { - options = options || {}; - return draw(node, options) - .then(function (canvas) { - return canvas.toDataURL('image/jpeg', options.quality || 1.0); - }); - } - - /** - * @param {Node} node - The DOM Node object to render - * @param {Object} options - Rendering options, @see {@link toSvg} - * @return {Promise} - A promise that is fulfilled with a PNG image blob - * */ - function toBlob(node, options) { - return draw(node, options || {}) - .then(util.canvasToBlob); - } - - function copyOptions(options) { - // Copy options to impl options for use in impl - if(typeof(options.imagePlaceholder) === 'undefined') { - domtoimage.impl.options.imagePlaceholder = defaultOptions.imagePlaceholder; - } else { - domtoimage.impl.options.imagePlaceholder = options.imagePlaceholder; - } - - if(typeof(options.cacheBust) === 'undefined') { - domtoimage.impl.options.cacheBust = defaultOptions.cacheBust; - } else { - domtoimage.impl.options.cacheBust = options.cacheBust; - } - } - - function draw(domNode, options) { - return toSvg(domNode, options) - .then(util.makeImage) - .then(util.delay(100)) - .then(function (image) { - var canvas = newCanvas(domNode); - canvas.getContext('2d').drawImage(image, 0, 0); - return canvas; - }); - - function newCanvas(domNode) { - var canvas = document.createElement('canvas'); - canvas.width = options.width || util.width(domNode); - canvas.height = options.height || util.height(domNode); - - if (options.bgcolor) { - var ctx = canvas.getContext('2d'); - ctx.fillStyle = options.bgcolor; - ctx.fillRect(0, 0, canvas.width, canvas.height); - } - - return canvas; - } - } - - function cloneNode(node, filter, root) { - if (!root && filter && !filter(node)) return Promise.resolve(); - - return Promise.resolve(node) - .then(makeNodeCopy) - .then(function (clone) { - return cloneChildren(node, clone, filter); - }) - .then(function (clone) { - return processClone(node, clone); - }); - - function makeNodeCopy(node) { - if (node instanceof HTMLCanvasElement) return util.makeImage(node.toDataURL()); - return node.cloneNode(false); - } - - function cloneChildren(original, clone, filter) { - var children = original.childNodes; - if (children.length === 0) return Promise.resolve(clone); - - return cloneChildrenInOrder(clone, util.asArray(children), filter) - .then(function () { - return clone; - }); - - function cloneChildrenInOrder(parent, children, filter) { - var done = Promise.resolve(); - children.forEach(function (child) { - done = done - .then(function () { - return cloneNode(child, filter); - }) - .then(function (childClone) { - if (childClone) parent.appendChild(childClone); - }); - }); - return done; - } - } - - function processClone(original, clone) { - if (!(clone instanceof Element)) return clone; - - return Promise.resolve() - .then(cloneStyle) - .then(clonePseudoElements) - .then(copyUserInput) - .then(fixSvg) - .then(function () { - return clone; - }); - - function cloneStyle() { - copyStyle(window.getComputedStyle(original), clone.style); - - function copyStyle(source, target) { - if (source.cssText) target.cssText = source.cssText; - else copyProperties(source, target); - - function copyProperties(source, target) { - util.asArray(source).forEach(function (name) { - target.setProperty( - name, - source.getPropertyValue(name), - source.getPropertyPriority(name) - ); - }); - } - } - } - - function clonePseudoElements() { - [':before', ':after'].forEach(function (element) { - clonePseudoElement(element); - }); - - function clonePseudoElement(element) { - var style = window.getComputedStyle(original, element); - var content = style.getPropertyValue('content'); - - if (content === '' || content === 'none') return; - - var className = util.uid(); - clone.className = clone.className + ' ' + className; - var styleElement = document.createElement('style'); - styleElement.appendChild(formatPseudoElementStyle(className, element, style)); - clone.appendChild(styleElement); - - function formatPseudoElementStyle(className, element, style) { - var selector = '.' + className + ':' + element; - var cssText = style.cssText ? formatCssText(style) : formatCssProperties(style); - return document.createTextNode(selector + '{' + cssText + '}'); - - function formatCssText(style) { - var content = style.getPropertyValue('content'); - return style.cssText + ' content: ' + content + ';'; - } - - function formatCssProperties(style) { - - return util.asArray(style) - .map(formatProperty) - .join('; ') + ';'; - - function formatProperty(name) { - return name + ': ' + - style.getPropertyValue(name) + - (style.getPropertyPriority(name) ? ' !important' : ''); - } - } - } - } - } - - function copyUserInput() { - if (original instanceof HTMLTextAreaElement) clone.innerHTML = original.value; - if (original instanceof HTMLInputElement) clone.setAttribute("value", original.value); - } - - function fixSvg() { - if (!(clone instanceof SVGElement)) return; - clone.setAttribute('xmlns', 'http://www.w3.org/2000/svg'); - - if (!(clone instanceof SVGRectElement)) return; - ['width', 'height'].forEach(function (attribute) { - var value = clone.getAttribute(attribute); - if (!value) return; - - clone.style.setProperty(attribute, value); - }); - } - } - } - - function embedFonts(node) { - return fontFaces.resolveAll() - .then(function (cssText) { - var styleNode = document.createElement('style'); - node.appendChild(styleNode); - styleNode.appendChild(document.createTextNode(cssText)); - return node; - }); - } - - function inlineImages(node) { - return images.inlineAll(node) - .then(function () { - return node; - }); - } - - function makeSvgDataUri(node, width, height) { - return Promise.resolve(node) - .then(function (node) { - node.setAttribute('xmlns', 'http://www.w3.org/1999/xhtml'); - return new XMLSerializer().serializeToString(node); - }) - // .then(util.escapeXhtml) - .then(function (xhtml) { - return '' + xhtml + ''; - }) - .then(function (foreignObject) { - return '' + - foreignObject + ''; - }) - .then(function (svg) { - return 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg); - }); - } - - function newUtil() { - return { - escape: escape, - parseExtension: parseExtension, - mimeType: mimeType, - dataAsUrl: dataAsUrl, - isDataUrl: isDataUrl, - canvasToBlob: canvasToBlob, - resolveUrl: resolveUrl, - getAndEncode: getAndEncode, - uid: uid(), - delay: delay, - asArray: asArray, - escapeXhtml: escapeXhtml, - makeImage: makeImage, - width: width, - height: height - }; - - function mimes() { - /* - * Only WOFF and EOT mime types for fonts are 'real' - * see http://www.iana.org/assignments/media-types/media-types.xhtml - */ - var WOFF = 'application/font-woff'; - var JPEG = 'image/jpeg'; - - return { - 'woff': WOFF, - 'woff2': WOFF, - 'ttf': 'application/font-truetype', - 'eot': 'application/vnd.ms-fontobject', - 'png': 'image/png', - 'jpg': JPEG, - 'jpeg': JPEG, - 'gif': 'image/gif', - 'tiff': 'image/tiff', - 'svg': 'image/svg+xml' - }; - } - - function parseExtension(url) { - var match = /\.([^\.\/]*?)$/g.exec(url); - if (match) return match[1]; - else return ''; - } - - function mimeType(url) { - var extension = parseExtension(url).toLowerCase(); - return mimes()[extension] || ''; - } - - function isDataUrl(url) { - return url.search(/^(data:)/) !== -1; - } - - function toBlob(canvas) { - return new Promise(function (resolve) { - var binaryString = window.atob(canvas.toDataURL().split(',')[1]); - var length = binaryString.length; - var binaryArray = new Uint8Array(length); - - for (var i = 0; i < length; i++) - binaryArray[i] = binaryString.charCodeAt(i); - - resolve(new Blob([binaryArray], { - type: 'image/png' - })); - }); - } - - function canvasToBlob(canvas) { - if (canvas.toBlob) - return new Promise(function (resolve) { - canvas.toBlob(resolve); - }); - - return toBlob(canvas); - } - - function resolveUrl(url, baseUrl) { - var doc = document.implementation.createHTMLDocument(); - var base = doc.createElement('base'); - doc.head.appendChild(base); - var a = doc.createElement('a'); - doc.body.appendChild(a); - base.href = baseUrl; - a.href = url; - return a.href; - } - - function uid() { - var index = 0; - - return function () { - return 'u' + fourRandomChars() + index++; - - function fourRandomChars() { - /* see http://stackoverflow.com/a/6248722/2519373 */ - return ('0000' + (Math.random() * Math.pow(36, 4) << 0).toString(36)).slice(-4); - } - }; - } - - function makeImage(uri) { - return new Promise(function (resolve, reject) { - var image = new Image(); - image.onload = function () { - resolve(image); - }; - image.onerror = reject; - image.src = uri; - }); - } - - function getAndEncode(url) { - var TIMEOUT = 30000; - if(domtoimage.impl.options.cacheBust) { - // Cache bypass so we dont have CORS issues with cached images - // Source: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache - url += ((/\?/).test(url) ? "&" : "?") + (new Date()).getTime(); - } - - return new Promise(function (resolve) { - var request = new XMLHttpRequest(); - - request.onreadystatechange = done; - request.ontimeout = timeout; - request.responseType = 'blob'; - request.timeout = TIMEOUT; - request.open('GET', url, true); - request.send(); - - var placeholder; - if(domtoimage.impl.options.imagePlaceholder) { - var split = domtoimage.impl.options.imagePlaceholder.split(/,/); - if(split && split[1]) { - placeholder = split[1]; - } - } - - function done() { - if (request.readyState !== 4) return; - - if (request.status !== 200) { - if(placeholder) { - resolve(placeholder); - } else { - fail('cannot fetch resource: ' + url + ', status: ' + request.status); - } - - return; - } - - var encoder = new FileReader(); - encoder.onloadend = function () { - var content = encoder.result.split(/,/)[1]; - resolve(content); - }; - encoder.readAsDataURL(request.response); - } - - function timeout() { - if(placeholder) { - resolve(placeholder); - } else { - fail('timeout of ' + TIMEOUT + 'ms occured while fetching resource: ' + url); - } - } - - function fail(message) { - console.error(message); - resolve(''); - } - }); - } - - function dataAsUrl(content, type) { - return 'data:' + type + ';base64,' + content; - } - - function escape(string) { - return string.replace(/([.*+?^${}()|\[\]\/\\])/g, '\\$1'); - } - - function delay(ms) { - return function (arg) { - return new Promise(function (resolve) { - setTimeout(function () { - resolve(arg); - }, ms); - }); - }; - } - - function asArray(arrayLike) { - var array = []; - var length = arrayLike.length; - for (var i = 0; i < length; i++) array.push(arrayLike[i]); - return array; - } - - function escapeXhtml(string) { - return string.replace(/#/g, '%23').replace(/\n/g, '%0A'); - } - - function width(node) { - var leftBorder = px(node, 'border-left-width'); - var rightBorder = px(node, 'border-right-width'); - return node.scrollWidth + leftBorder + rightBorder; - } - - function height(node) { - var topBorder = px(node, 'border-top-width'); - var bottomBorder = px(node, 'border-bottom-width'); - return node.scrollHeight + topBorder + bottomBorder; - } - - function px(node, styleProperty) { - var value = window.getComputedStyle(node).getPropertyValue(styleProperty); - return parseFloat(value.replace('px', '')); - } - } - - function newInliner() { - var URL_REGEX = /url\(['"]?([^'"]+?)['"]?\)/g; - - return { - inlineAll: inlineAll, - shouldProcess: shouldProcess, - impl: { - readUrls: readUrls, - inline: inline - } - }; - - function shouldProcess(string) { - return string.search(URL_REGEX) !== -1; - } - - function readUrls(string) { - var result = []; - var match; - while ((match = URL_REGEX.exec(string)) !== null) { - result.push(match[1]); - } - return result.filter(function (url) { - return !util.isDataUrl(url); - }); - } - - function inline(string, url, baseUrl, get) { - return Promise.resolve(url) - .then(function (url) { - return baseUrl ? util.resolveUrl(url, baseUrl) : url; - }) - .then(get || util.getAndEncode) - .then(function (data) { - return util.dataAsUrl(data, util.mimeType(url)); - }) - .then(function (dataUrl) { - return string.replace(urlAsRegex(url), '$1' + dataUrl + '$3'); - }); - - function urlAsRegex(url) { - return new RegExp('(url\\([\'"]?)(' + util.escape(url) + ')([\'"]?\\))', 'g'); - } - } - - function inlineAll(string, baseUrl, get) { - if (nothingToInline()) return Promise.resolve(string); - - return Promise.resolve(string) - .then(readUrls) - .then(function (urls) { - var done = Promise.resolve(string); - urls.forEach(function (url) { - done = done.then(function (string) { - return inline(string, url, baseUrl, get); - }); - }); - return done; - }); - - function nothingToInline() { - return !shouldProcess(string); - } - } - } - - function newFontFaces() { - return { - resolveAll: resolveAll, - impl: { - readAll: readAll - } - }; - - function resolveAll() { - return readAll(document) - .then(function (webFonts) { - return Promise.all( - webFonts.map(function (webFont) { - return webFont.resolve(); - }) - ); - }) - .then(function (cssStrings) { - return cssStrings.join('\n'); - }); - } - - function readAll() { - return Promise.resolve(util.asArray(document.styleSheets)) - .then(getCssRules) - .then(selectWebFontRules) - .then(function (rules) { - return rules.map(newWebFont); - }); - - function selectWebFontRules(cssRules) { - return cssRules - .filter(function (rule) { - return rule.type === CSSRule.FONT_FACE_RULE; - }) - .filter(function (rule) { - return inliner.shouldProcess(rule.style.getPropertyValue('src')); - }); - } - - function getCssRules(styleSheets) { - var cssRules = []; - styleSheets.forEach(function (sheet) { - try { - util.asArray(sheet.cssRules || []).forEach(cssRules.push.bind(cssRules)); - } catch (e) { - console.log('Error while reading CSS rules from ' + sheet.href, e.toString()); - } - }); - return cssRules; - } - - function newWebFont(webFontRule) { - return { - resolve: function resolve() { - var baseUrl = (webFontRule.parentStyleSheet || {}).href; - return inliner.inlineAll(webFontRule.cssText, baseUrl); - }, - src: function () { - return webFontRule.style.getPropertyValue('src'); - } - }; - } - } - } - - function newImages() { - return { - inlineAll: inlineAll, - impl: { - newImage: newImage - } - }; - - function newImage(element) { - return { - inline: inline - }; - - function inline(get) { - if (util.isDataUrl(element.src)) return Promise.resolve(); - - return Promise.resolve(element.src) - .then(get || util.getAndEncode) - .then(function (data) { - return util.dataAsUrl(data, util.mimeType(element.src)); - }) - .then(function (dataUrl) { - return new Promise(function (resolve, reject) { - element.onload = resolve; - // element.onerror = reject; - element.onerror = (e) => { - console.error(e); - resolve(); - }; - element.src = dataUrl; - }); - }); - } - } - - function inlineAll(node) { - if (!(node instanceof Element)) return Promise.resolve(node); - - return inlineBackground(node) - .then(function () { - if (node instanceof HTMLImageElement) - return newImage(node).inline(); - else - return Promise.all( - util.asArray(node.childNodes).map(function (child) { - return inlineAll(child); - }) - ); - }); - - function inlineBackground(node) { - var background = node.style.getPropertyValue('background'); - - if (!background) return Promise.resolve(node); - - return inliner.inlineAll(background) - .then(function (inlined) { - node.style.setProperty( - 'background', - inlined, - node.style.getPropertyPriority('background') - ); - }) - .then(function () { - return node; - }); - } - } - } -})(this); diff --git a/src/js/gsAnalytics.js b/src/js/gsAnalytics.js deleted file mode 100644 index 2352dbf7..00000000 --- a/src/js/gsAnalytics.js +++ /dev/null @@ -1,218 +0,0 @@ -/*global ga, gsStorage, gsSession, gsUtils */ -// eslint-disable-next-line no-unused-vars -var gsAnalytics = function() { - 'use strict'; - - const DIMENSION_VERSION = 'dimension1'; - const DIMENSION_SCREEN_CAPTURE = 'dimension2'; - const DIMENSION_SUSPEND_TIME = 'dimension3'; - const DIMENSION_DONATED = 'dimension4'; - const DIMENSION_DISCARD_AFTER_SUSPEND = 'dimension5'; - - const METRIC_SUSPENDED_TAB_COUNT = 'metric1'; - const METRIC_TOTAL_TAB_COUNT = 'metric2'; - const METRIC_TAB_CHECK_TIME_TAKEN = 'metric3'; - const METRIC_TAB_RECOVER_TIME_TAKEN = 'metric4'; - - function initAsPromised() { - return new Promise(function(resolve) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'init tracking aborted because tracking is disabled' - ); - resolve(); - } - try { - ga('create', 'UA-167314577-2', 'auto'); - ga('set', 'checkProtocolTask', function() {}); - ga('require', 'displayfeatures'); - } catch (e) { - gsUtils.warning('gsAnalytics', e); - } - gsUtils.log('gsAnalytics', 'init successful'); - resolve(); - }); - } - - function setUserDimensions() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'setting dimensions aborted because tracking is disabled' - ); - return; - } - const dimensions = { - [DIMENSION_VERSION]: chrome.runtime.getManifest().version + '', - [DIMENSION_SCREEN_CAPTURE]: - gsStorage.getOption(gsStorage.SCREEN_CAPTURE) + '', - [DIMENSION_SUSPEND_TIME]: - gsStorage.getOption(gsStorage.SUSPEND_TIME) + '', - [DIMENSION_DONATED]: gsStorage.getOption(gsStorage.NO_NAG) + '', - [DIMENSION_DISCARD_AFTER_SUSPEND]: - gsStorage.getOption(gsStorage.DISCARD_AFTER_SUSPEND) + '', - }; - gsUtils.log('gsAnalytics', 'Setting dimensions', dimensions); - ga('set', dimensions); - } - - function performStartupReport() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'perfomStartupReport aborted because tracking is disabled' - ); - return; - } - const category = 'System'; - const action = gsSession.getStartupType(); - - const metrics = {}; - const sessionMetrics = gsStorage.fetchSessionMetrics(); - if (sessionMetrics && sessionMetrics[gsStorage.SM_TIMESTAMP]) { - metrics[METRIC_SUSPENDED_TAB_COUNT] = - sessionMetrics[gsStorage.SM_SUSPENDED_TAB_COUNT]; - metrics[METRIC_TOTAL_TAB_COUNT] = - sessionMetrics[gsStorage.SM_TOTAL_TAB_COUNT]; - } - const tabCheckTimeTaken = gsSession.getTabCheckTimeTakenInSeconds(); - if (!isNaN(tabCheckTimeTaken) && parseInt(tabCheckTimeTaken) >= 0) { - metrics[METRIC_TAB_CHECK_TIME_TAKEN] = tabCheckTimeTaken; - } - const recoveryTimeTaken = gsSession.getRecoveryTimeTakenInSeconds(); - if (!isNaN(recoveryTimeTaken) && parseInt(recoveryTimeTaken) >= 0) { - metrics[METRIC_TAB_RECOVER_TIME_TAKEN] = recoveryTimeTaken; - } - gsUtils.log('gsAnalytics', 'Event: ', category, action, metrics); - ga('send', 'event', category, action, metrics); - } - - function performVersionReport() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'performVersionReport aborted because tracking is disabled' - ); - return; - } - const startupType = gsSession.getStartupType(); - if (!['Install', 'Update'].includes(startupType)) { - return; - } - - const category = 'Version'; - const action = startupType + 'Details'; - const startupLastVersion = gsSession.getStartupLastVersion(); - const curVersion = chrome.runtime.getManifest().version; - const label = - startupLastVersion !== curVersion - ? `${startupLastVersion} -> ${curVersion}` - : curVersion; - - gsUtils.log('gsAnalytics', 'Event: ', category, action, label); - ga('send', 'event', category, action, label); - } - - function performPingReport() { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'performPingReport aborted because tracking is disabled' - ); - return; - } - const category = 'System'; - const action = 'Ping'; - - const metrics = {}; - const sessionMetrics = gsStorage.fetchSessionMetrics(); - if (sessionMetrics && sessionMetrics[gsStorage.SM_TIMESTAMP]) { - metrics[METRIC_SUSPENDED_TAB_COUNT] = - sessionMetrics[gsStorage.SM_SUSPENDED_TAB_COUNT]; - metrics[METRIC_TOTAL_TAB_COUNT] = - sessionMetrics[gsStorage.SM_TOTAL_TAB_COUNT]; - } - gsUtils.log('gsAnalytics', 'Event: ', category, action, metrics); - ga('send', 'event', category, action, metrics); - } - - function reportPageView(pageName) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'reportPageView aborted because tracking is disabled' - ); - return; - } - ga('send', 'pageview', pageName); - } - function reportEvent(category, action, label) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'reportEvent aborted because tracking is disabled' - ); - return; - } - ga('send', 'event', category, action, label); - } - function reportException(errorMessage) { - if (gsStorage.getOption('trackingOptOut')) { - gsUtils.log( - 'gsAnalytics', - 'reportException aborted because tracking is disabled' - ); - return; - } - ga('send', 'exception', { - exDescription: errorMessage, - exFatal: false, - }); - } - return { - initAsPromised, - performStartupReport, - performVersionReport, - performPingReport, - setUserDimensions, - reportPageView, - reportEvent, - reportException, - }; -}; - -function loadGoogleAnalytics(i, s, o, g, r, a, m) { - i['GoogleAnalyticsObject'] = r; - (i[r] = - i[r] || - function() { - (i[r].q = i[r].q || []).push(arguments); - }), - (i[r].l = 1 * new Date()); - (a = s.createElement(o)), (m = s.getElementsByTagName(o)[0]); - a.async = 1; - a.src = g; - m.parentNode.insertBefore(a, m); -} - -function init() { - if (!gsStorage.getOption('trackingOptOut')) { - loadGoogleAnalytics( - window, - document, - 'script', - 'https://www.google-analytics.com/analytics.js', - 'ga' - ); - } - gsAnalytics = gsAnalytics(); -} - -if (document.readyState == 'complete') { - init(); -} else { - document.addEventListener('DOMContentLoaded', function() { - init(); - }); -} diff --git a/src/js/gsCleanScreencaps.js b/src/js/gsCleanScreencaps.js deleted file mode 100644 index 606f9bc4..00000000 --- a/src/js/gsCleanScreencaps.js +++ /dev/null @@ -1,91 +0,0 @@ -var gsCleanScreencaps = { - // this will be filled with domain entries for O(1) lookups during screencaps - blacklist: {}, - - // listeners for request coming from a tab that is being suspended - listeners: {}, - - // load blacklist on initialization if option is enabled - initAsPromised: async ()=> - { - const useCleanScreencap = gsStorage.getOption( - gsStorage.ENABLE_CLEAN_SCREENCAPS - ); - - if (useCleanScreencap) { - await gsCleanScreencaps.loadList() - } - - return; - }, - - addListener: (tabId) => { - // remove a listener if there is already one present. That might not be the case, but the function checks for that case. - gsCleanScreencaps.removeListener(tabId); - - const listener = (details) => { - try { - const host = new URL(details.url).host - if (gsCleanScreencaps.blacklist[host]) { return { cancel: true }; } - } catch (err) { - gsUtils.log('background', 'error while trying to block in gsCleanScreencaps', err) - } - } - - chrome.webRequest.onBeforeRequest.addListener( - listener, - { urls: [""], types: ['image'], tabId: tabId }, - ["blocking"] - ); - - // place a callback that will remove the listener as soon as the suspension - // of the tab succeeded or failed - gsCleanScreencaps.listeners[tabId] = () => chrome.webRequest.onBeforeRequest.removeListener(listener) - }, - - // call the remove listener func and remove it from the hashmap - removeListener: (tabId) => { - let tmp; - if (tmp = gsCleanScreencaps.listeners[tabId]) { - delete gsCleanScreencaps[tabId]; - tmp(); - } - }, - - // do nothing but get the data out of the chrome.local.storage - storageData: () => { - return new Promise((res, _) => { - chrome.storage.local.get('gsCleanScreencapsBlacklist', (storage) => res(storage.gsCleanScreencapsBlacklist)) - }) - }, - - loadList: async () => { - const stored = await gsCleanScreencaps.storageData(); - // take the blocklist out of storage if it's not existent or newer than 30 days - if (!stored || stored.time + (3600 * 24 * 30) <= new Date().getTime()) { - const rex = /^0.0.0.0 (.*)(?:$|#)/ - let resp = await fetch('https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts').then(resp => resp.text()) - let m; - - try { - const blockedHosts = resp - .split(/\n/) - .reduce((res, e) => { - if (m = rex.exec(e)) { - res[m[1]] = true; - } - return res; - }, {}); - - gsCleanScreencaps.blacklist = blockedHosts; - chrome.storage.local.set({ gsCleanScreencapsBlacklist: { time: new Date().getTime(), blockedHosts } }) - return blockedHosts; - } catch (err) { - gsUtils.log('background', 'error while loading blocklist for clean screencapture:', err) - } - } else { - gsCleanScreencaps.blacklist = stored.blockedHosts; - return stored; - } - } -} \ No newline at end of file diff --git a/src/js/gsIndexedDb.js b/src/js/gsIndexedDb.js index f8739b30..09c0dbc8 100644 --- a/src/js/gsIndexedDb.js +++ b/src/js/gsIndexedDb.js @@ -380,7 +380,7 @@ var gsIndexedDb = { session.sessionId = '_' + gsUtils.generateHashCode(session.name); } - //clear id as it will be either readded (if sessionId match found) or generated (if creating a new session) + //clear id as it will be either read (if sessionId match found) or generated (if creating a new session) delete session.id; await gsIndexedDb.updateSession(session); }, diff --git a/src/js/gsSession.js b/src/js/gsSession.js index 912295ae..ccfe218a 100644 --- a/src/js/gsSession.js +++ b/src/js/gsSession.js @@ -5,6 +5,7 @@ var gsSession = (function() { const tabsToRestorePerSecond = 12; + let updateUrl; let updatedUrl; let initialisationMode = true; @@ -20,6 +21,7 @@ var gsSession = (function() { let syncedSettingsOnInit; async function initAsPromised() { + updateUrl = chrome.extension.getURL('update.html'); updatedUrl = chrome.extension.getURL('updated.html'); // Set fileUrlsAccessAllowed to determine if extension can work on file:// URLs @@ -32,6 +34,7 @@ var gsSession = (function() { //remove any update screens await Promise.all([ + gsUtils.removeTabsByUrlAsPromised(updateUrl), gsUtils.removeTabsByUrlAsPromised(updatedUrl), ]); @@ -48,7 +51,7 @@ var gsSession = (function() { gsUtils.log( 'gsSession', - 'A new version is available: ' + currentVersion + ' -> ' + newVersion + 'A new version is available: ' + currentVersion + ' -> ' + newVersion, ); let sessionRestorePoint; @@ -56,17 +59,21 @@ var gsSession = (function() { if (currentSession) { sessionRestorePoint = await gsIndexedDb.createOrUpdateSessionRestorePoint( currentSession, - currentVersion + currentVersion, ); } const suspendedTabCount = await gsUtils.getSuspendedTabCount(); - if (suspendedTabCount === 0) { + if (!sessionRestorePoint || suspendedTabCount > 0) { + //show update message in suspended.html page + gsStorage.setOptionAndSync(gsStorage.UPDATE_AVAILABLE, true); + // await gsChrome.tabsCreate(updateUrl); + + //ensure we don't leave any windows with no unsuspended tabs + await unsuspendActiveTabInEachWindow(); + } else { // if there are no suspended tabs then simply install the update immediately chrome.runtime.reload(); - } else { - //do nothing. this prevents chrome from automatically updating and will instead wait - //until a browser restart to update } } @@ -82,21 +89,20 @@ var gsSession = (function() { async function buildCurrentSession() { const currentWindows = await gsChrome.windowsGetAll(); const tabsExist = currentWindows.some( - window => window.tabs && window.tabs.length + window => window.tabs && window.tabs.length, ); if (!tabsExist) { gsUtils.warning( 'gsSession', - 'Failed to build current session. Could not find any tabs.' + 'Failed to build current session. Could not find any tabs.', ); return null; } - const currentSession = { + return { sessionId: getSessionId(), windows: currentWindows, date: new Date().toISOString(), }; - return currentSession; } async function updateCurrentSession() { @@ -194,34 +200,34 @@ var gsSession = (function() { gsUtils.log( 'gsSession', '\n\n------------------------------------------------\n' + - `Checking tabs for responsiveness..\n` + - '------------------------------------------------\n\n' + `Checking tabs for responsiveness..\n` + + '------------------------------------------------\n\n', ); const postRecoverySessionTabs = await gsChrome.tabsQuery(); gsUtils.log( 'gsSession', 'postRecoverySessionTabs:', - postRecoverySessionTabs + postRecoverySessionTabs, ); const tabCheckResults = await gsTabCheckManager.performInitialisationTabChecks( - postRecoverySessionTabs + postRecoverySessionTabs, ); const totalTabCheckCount = tabCheckResults.length; const successfulTabChecksCount = tabCheckResults.filter( - o => o === gsUtils.STATUS_SUSPENDED || o === gsUtils.STATUS_DISCARDED + o => o === gsUtils.STATUS_SUSPENDED || o === gsUtils.STATUS_DISCARDED, ).length; startupTabCheckTimeTakenInSeconds = parseInt( - (Date.now() - initStartTime) / 1000 + (Date.now() - initStartTime) / 1000, ); gsUtils.log( 'gsSession', '\n\n------------------------------------------------\n' + - `Checking tabs finished. Time taken: ${startupTabCheckTimeTakenInSeconds} sec\n` + - `${successfulTabChecksCount} / ${totalTabCheckCount} initialised successfully\n` + - '------------------------------------------------\n\n' + `Checking tabs finished. Time taken: ${startupTabCheckTimeTakenInSeconds} sec\n` + + `${successfulTabChecksCount} / ${totalTabCheckCount} initialised successfully\n` + + '------------------------------------------------\n\n', ); } @@ -282,23 +288,24 @@ var gsSession = (function() { } const sessionRestorePoint = await gsIndexedDb.fetchSessionRestorePoint( - lastVersion + lastVersion, ); if (!sessionRestorePoint) { const lastSession = await gsIndexedDb.fetchLastSession(); if (lastSession) { await gsIndexedDb.createOrUpdateSessionRestorePoint( lastSession, - lastVersion + lastVersion, ); } else { gsUtils.error( 'gsSession', - 'No session restore point found, and no lastSession exists!' + 'No session restore point found, and no lastSession exists!', ); } } + await gsUtils.removeTabsByUrlAsPromised(updateUrl); await gsUtils.removeTabsByUrlAsPromised(updatedUrl); await gsIndexedDb.performMigration(lastVersion); @@ -344,25 +351,25 @@ var gsSession = (function() { async function checkForCrashRecovery(currentSessionTabs) { gsUtils.log( 'gsSession', - 'Checking for crash recovery: ' + new Date().toISOString() + 'Checking for crash recovery: ' + new Date().toISOString(), ); //try to detect whether the extension has crashed as apposed to chrome restarting //if it is an extension crash, then in theory all suspended tabs will be gone //and all normal tabs will still exist with the same ids const currentSessionSuspendedTabs = currentSessionTabs.filter( - tab => !gsUtils.isSpecialTab(tab) && gsUtils.isSuspendedTab(tab) + tab => !gsUtils.isSpecialTab(tab) && gsUtils.isSuspendedTab(tab), ); const currentSessionNonExtensionTabs = currentSessionTabs.filter( - o => o.url.indexOf(chrome.runtime.id) === -1 + o => o.url.indexOf(chrome.runtime.id) === -1, ); if (currentSessionSuspendedTabs.length > 0) { gsUtils.log( 'gsSession', 'Aborting tab recovery. Browser has open suspended tabs.' + - ' Assuming user has "On start-up -> Continue where you left off" set' + - ' or is restarting with suspended pinned tabs.' + ' Assuming user has "On start-up -> Continue where you left off" set' + + ' or is restarting with suspended pinned tabs.', ); return false; } @@ -371,7 +378,7 @@ var gsSession = (function() { if (!lastSession) { gsUtils.log( 'gsSession', - 'Aborting tab recovery. Could not find last session.' + 'Aborting tab recovery. Could not find last session.', ); return false; } @@ -379,19 +386,19 @@ var gsSession = (function() { const lastSessionTabs = lastSession.windows.reduce( (a, o) => a.concat(o.tabs), - [] + [], ); const lastSessionSuspendedTabs = lastSessionTabs.filter(o => - gsUtils.isSuspendedTab(o) + gsUtils.isSuspendedTab(o), ); const lastSessionNonExtensionTabs = lastSessionTabs.filter( - o => o.url.indexOf(chrome.runtime.id) === -1 + o => o.url.indexOf(chrome.runtime.id) === -1, ); if (lastSessionSuspendedTabs.length === 0) { gsUtils.log( 'gsSession', - 'Aborting tab recovery. Last session contained no suspended tabs.' + 'Aborting tab recovery. Last session contained no suspended tabs.', ); return false; } @@ -404,20 +411,21 @@ var gsSession = (function() { return false; return lastSessionTabs.some(o => o.id === tab.id && o.url === tab.url); } + const matchingTabIdsCount = currentSessionNonExtensionTabs.reduce( (a, o) => (matchingTabExists(o) ? a + 1 : a), - 0 + 0, ); const maxMatchableTabsCount = Math.max( lastSessionNonExtensionTabs.length, - currentSessionNonExtensionTabs.length + currentSessionNonExtensionTabs.length, ); gsUtils.log( 'gsSession', matchingTabIdsCount + - ' / ' + - maxMatchableTabsCount + - ' tabs have the same id between the last session and the current session.' + ' / ' + + maxMatchableTabsCount + + ' tabs have the same id between the last session and the current session.', ); if ( matchingTabIdsCount === 0 || @@ -440,8 +448,8 @@ var gsSession = (function() { gsUtils.log( 'gsSession', '\n\n------------------------------------------------\n' + - 'Recovery mode started.\n' + - '------------------------------------------------\n\n' + 'Recovery mode started.\n' + + '------------------------------------------------\n\n', ); gsUtils.log('gsSession', 'lastSession: ', lastSession); gsUtils.removeInternalUrlsFromSession(lastSession); @@ -449,7 +457,7 @@ var gsSession = (function() { const currentWindows = await gsChrome.windowsGetAll(); const matchedCurrentWindowBySessionWindowId = matchCurrentWindowsWithLastSessionWindows( lastSession.windows, - currentWindows + currentWindows, ); //attempt to automatically restore any lost tabs/windows in their proper positions @@ -465,15 +473,15 @@ var gsSession = (function() { } startupRecoveryTimeTakenInSeconds = parseInt( - (Date.now() - recoveryStartTime) / 1000 + (Date.now() - recoveryStartTime) / 1000, ); gsUtils.log( 'gsSession', '\n\n------------------------------------------------\n' + - 'Recovery mode finished. Time taken: ' + - startupRecoveryTimeTakenInSeconds + - ' sec\n' + - '------------------------------------------------\n\n' + 'Recovery mode finished. Time taken: ' + + startupRecoveryTimeTakenInSeconds + + ' sec\n' + + '------------------------------------------------\n\n', ); gsUtils.log('gsSession', 'updating current session'); updateCurrentSession(); //async @@ -482,29 +490,29 @@ var gsSession = (function() { //try to match session windows with currently open windows function matchCurrentWindowsWithLastSessionWindows( unmatchedSessionWindows, - unmatchedCurrentWindows + unmatchedCurrentWindows, ) { const matchedCurrentWindowBySessionWindowId = {}; //if there is a current window open that matches the id of the session window id then match it unmatchedSessionWindows.slice().forEach(function(sessionWindow) { const matchingCurrentWindow = unmatchedCurrentWindows.find(function( - window + window, ) { return window.id === sessionWindow.id; }); if (matchingCurrentWindow) { matchedCurrentWindowBySessionWindowId[ sessionWindow.id - ] = matchingCurrentWindow; + ] = matchingCurrentWindow; //remove from unmatchedSessionWindows and unmatchedCurrentWindows unmatchedSessionWindows = unmatchedSessionWindows.filter(function( - window + window, ) { return window.id !== sessionWindow.id; }); unmatchedCurrentWindows = unmatchedCurrentWindows.filter(function( - window + window, ) { return window.id !== matchingCurrentWindow.id; }); @@ -521,18 +529,18 @@ var gsSession = (function() { //if we still have session windows that haven't been matched to a current window then attempt matching based on tab urls let tabMatchingObjects = generateTabMatchingObjects( unmatchedSessionWindows, - unmatchedCurrentWindows + unmatchedCurrentWindows, ); //find the tab matching objects with the highest tabMatchCounts while ( unmatchedSessionWindows.length > 0 && unmatchedCurrentWindows.length > 0 - ) { + ) { const maxTabMatchCount = Math.max( ...tabMatchingObjects.map(function(o) { return o.tabMatchCount; - }) + }), ); const bestTabMatchingObject = tabMatchingObjects.find(function(o) { return o.tabMatchCount === maxTabMatchCount; @@ -540,19 +548,19 @@ var gsSession = (function() { matchedCurrentWindowBySessionWindowId[ bestTabMatchingObject.sessionWindow.id - ] = + ] = bestTabMatchingObject.currentWindow; //remove from unmatchedSessionWindows and unmatchedCurrentWindows const unmatchedSessionWindowsLengthBefore = unmatchedSessionWindows.length; unmatchedSessionWindows = unmatchedSessionWindows.filter(function( - window + window, ) { return window.id !== bestTabMatchingObject.sessionWindow.id; }); unmatchedCurrentWindows = unmatchedCurrentWindows.filter(function( - window + window, ) { return window.id !== bestTabMatchingObject.currentWindow.id; }); @@ -560,7 +568,7 @@ var gsSession = (function() { 'gsUtils', 'Matched with tab count of ' + maxTabMatchCount + ': ', bestTabMatchingObject.sessionWindow, - bestTabMatchingObject.currentWindow + bestTabMatchingObject.currentWindow, ); //remove from tabMatchingObjects @@ -630,7 +638,7 @@ var gsSession = (function() { async function restoreSessionWindow( sessionWindow, existingWindow, - suspendMode + suspendMode, ) { if (sessionWindow.tabs.length === 0) { gsUtils.log('gsUtils', 'SessionWindow contains no tabs to restore'); @@ -642,7 +650,7 @@ var gsSession = (function() { 'gsUtils', 'Matched sessionWindow with existingWindow: ', sessionWindow, - existingWindow + existingWindow, ); const currentTabIds = []; const currentTabUrls = []; @@ -667,10 +675,10 @@ var gsSession = (function() { sessionTab, existingWindow.id, sessionTab.index, - suspendMode + suspendMode, ); resolve(); - }) + }), ); } } @@ -682,7 +690,7 @@ var gsSession = (function() { gsUtils.log( 'gsUtils', 'Could not find match for sessionWindow: ', - sessionWindow + sessionWindow, ); const restoringUrl = chrome.extension.getURL('restoring-window.html'); @@ -692,7 +700,7 @@ var gsSession = (function() { // TODO: Report chrome bug const newWindow = await gsUtils.createWindowAndWaitForFinishLoading( { url: restoringUrl, focused: false }, - 500 // dont actually wait + 500, // dont actually wait ); const placeholderTab = newWindow.tabs[0]; await gsChrome.tabsUpdate(placeholderTab.id, { pinned: true }); @@ -707,10 +715,10 @@ var gsSession = (function() { sessionTab, newWindow.id, i + 1, - suspendMode + suspendMode, ); resolve(); - }) + }), ); } await Promise.all(tabPromises); @@ -723,7 +731,7 @@ var gsSession = (function() { sessionTab, windowId, index, - suspendMode + suspendMode, ) { let url = sessionTab.url; if (suspendMode === 1 && gsUtils.isNormalTab(sessionTab)) { @@ -745,52 +753,19 @@ var gsSession = (function() { } } - async function updateSessionMetrics(reset) { - reset = reset || false; - - const tabs = await gsChrome.tabsQuery(); - let curSuspendedTabCount = 0; - for (let tab of tabs) { - if (gsUtils.isSuspendedTab(tab)) { - curSuspendedTabCount += 1; - } - } - let sessionMetrics; - if (reset) { - gsUtils.log('gsSession', 'Resetting session metrics'); - } else { - sessionMetrics = gsStorage.fetchSessionMetrics(); - } - - // If no session metrics exist then create a new one - if (!sessionMetrics || !sessionMetrics[gsStorage.SM_TIMESTAMP]) { - sessionMetrics = createNewSessionMetrics( - curSuspendedTabCount, - tabs.length - ); - gsStorage.setSessionMetrics(sessionMetrics); - gsUtils.log('gsSession', 'Created new session metrics', sessionMetrics); + async function unsuspendActiveTabInEachWindow() { + const activeTabs = await gsChrome.tabsQuery({ active: true }); + const suspendedActiveTabs = activeTabs.filter(tab => + gsUtils.isSuspendedTab(tab), + ); + if (suspendedActiveTabs.length === 0) { return; } - - // Else update metrics (if new max reached) - const lastSuspendedTabCount = - sessionMetrics[gsStorage.SM_SUSPENDED_TAB_COUNT]; - if (lastSuspendedTabCount < curSuspendedTabCount) { - sessionMetrics[gsStorage.SM_SUSPENDED_TAB_COUNT] = curSuspendedTabCount; - sessionMetrics[gsStorage.SM_TOTAL_TAB_COUNT] = tabs.length; - gsStorage.setSessionMetrics(sessionMetrics); - gsUtils.log('gsSession', 'Updated session metrics', sessionMetrics); + for (let suspendedActiveTab of suspendedActiveTabs) { + tgs.unsuspendTab(suspendedActiveTab); } - } - - function createNewSessionMetrics(suspendedTabCount, totalTabCount) { - const sessionMetrics = { - [gsStorage.SM_TIMESTAMP]: Date.now(), - [gsStorage.SM_SUSPENDED_TAB_COUNT]: suspendedTabCount, - [gsStorage.SM_TOTAL_TAB_COUNT]: totalTabCount, - }; - return sessionMetrics; + await gsUtils.setTimeout(1000); + await unsuspendActiveTabInEachWindow(); } return { @@ -812,6 +787,6 @@ var gsSession = (function() { restoreSessionWindow, prepareForUpdate, getUpdateType, - updateSessionMetrics, + unsuspendActiveTabInEachWindow, }; })(); diff --git a/src/js/gsStorage.js b/src/js/gsStorage.js index 33812497..ae22607f 100755 --- a/src/js/gsStorage.js +++ b/src/js/gsStorage.js @@ -1,10 +1,7 @@ -/*global chrome, gsAnalytics, gsSession, localStorage, gsUtils */ +/*global chrome, gsSession, localStorage, gsUtils */ 'use strict'; -// Used to keep track of which settings were defined in the managed storage -const managedOptions = []; // Example: ["gsTheme, gsWhitelist"] - -const gsStorageSettings = { +var gsStorage = { SCREEN_CAPTURE: 'screenCapture', SCREEN_CAPTURE_FORCE: 'screenCaptureForce', SUSPEND_IN_PLACE_OF_DISCARD: 'suspendInPlaceOfDiscard', @@ -12,6 +9,7 @@ const gsStorageSettings = { SUSPEND_TIME: 'gsTimeToSuspend', IGNORE_WHEN_OFFLINE: 'onlineCheck', IGNORE_WHEN_CHARGING: 'batteryCheck', + CLAIM_BY_DEFAULT: 'claimByDefault', IGNORE_PINNED: 'gsDontSuspendPinned', IGNORE_FORMS: 'gsDontSuspendForms', IGNORE_AUDIO: 'gsDontSuspendAudio', @@ -25,24 +23,15 @@ const gsStorageSettings = { DISCARD_AFTER_SUSPEND: 'discardAfterSuspend', DISCARD_IN_PLACE_OF_SUSPEND: 'discardInPlaceOfSuspend', - USE_ALT_SCREEN_CAPTURE_LIB: 'useAlternateScreenCaptureLib', - TRACKING_OPT_OUT: 'trackingOptOut', - ENABLE_CLEAN_SCREENCAPS: 'cleanScreencaps' -}; - -var gsStorage = { - ...gsStorageSettings, APP_VERSION: 'gsVersion', LAST_NOTICE: 'gsNotice', LAST_EXTENSION_RECOVERY: 'gsExtensionRecovery', - SM_SESSION_METRICS: 'gsSessionMetrics', - SM_TIMESTAMP: 'sessionTimestamp', - SM_SUSPENDED_TAB_COUNT: 'suspendedTabCount', - SM_TOTAL_TAB_COUNT: 'totalTabCount', + UPDATE_AVAILABLE: 'gsUpdateAvailable', - noop: function() {}, + noop: function() { + }, getSettingsDefaults: function() { const defaults = {}; @@ -50,10 +39,10 @@ var gsStorage = { defaults[gsStorage.SCREEN_CAPTURE_FORCE] = false; defaults[gsStorage.SUSPEND_IN_PLACE_OF_DISCARD] = false; defaults[gsStorage.DISCARD_IN_PLACE_OF_SUSPEND] = false; - defaults[gsStorage.USE_ALT_SCREEN_CAPTURE_LIB] = false; defaults[gsStorage.DISCARD_AFTER_SUSPEND] = false; defaults[gsStorage.IGNORE_WHEN_OFFLINE] = false; defaults[gsStorage.IGNORE_WHEN_CHARGING] = false; + defaults[gsStorage.CLAIM_BY_DEFAULT] = false; defaults[gsStorage.UNSUSPEND_ON_FOCUS] = false; defaults[gsStorage.IGNORE_PINNED] = true; defaults[gsStorage.IGNORE_FORMS] = true; @@ -66,8 +55,7 @@ var gsStorage = { defaults[gsStorage.NO_NAG] = false; defaults[gsStorage.WHITELIST] = ''; defaults[gsStorage.THEME] = 'light'; - defaults[gsStorage.TRACKING_OPT_OUT] = false; - defaults[gsStorage.ENABLE_CLEAN_SCREENCAPS] = false; + defaults[gsStorage.UPDATE_AVAILABLE] = false; //Set to true for debug return defaults; }, @@ -92,7 +80,7 @@ var gsStorage = { gsUtils.error( 'gsStorage', 'Failed to parse gsSettings: ', - localStorage.getItem('gsSettings') + localStorage.getItem('gsSettings'), ); } if (!rawLocalSettings) { @@ -147,7 +135,7 @@ var gsStorage = { ) { gsUtils.errorIfInitialised( 'gsStorage', - 'Missing key: ' + key + '! Will init with default.' + 'Missing key: ' + key + '! Will init with default.', ); mergedSettings[key] = defaultSettings[key]; } @@ -175,40 +163,6 @@ var gsStorage = { }); }, - /** - * Checks the managed storage for settings and overrides the local storage - * Settings in managed storage are stored by key - * Settings in local storage are stored by name - * Example: in managed storage you will find "SYNC_SETTINGS": true. - * in local storage you will find "gsSyncSettings": true - * I did this because I think the key is easier to interpret for someone - * editing the managed storage manually. - */ - checkManagedStorageAndOverride() { - const settingsList = Object.keys(gsStorageSettings); - chrome.storage.managed.get(settingsList, result => { - const settings = gsStorage.getSettings(); - - Object.keys(result).forEach(key => { - if (key === 'WHITELIST') { - settings[gsStorage[key]] = result[key].replace(/[\s\n]+/g, '\n'); - } else { - settings[gsStorage[key]] = result[key]; - } - - // Mark option as managed - managedOptions.push(gsStorage[key]); - }); - - gsStorage.saveSettings(settings); - gsUtils.log( - 'gsStorage', - 'overrode settings with managed storage config:', - settings - ); - }); - }, - // Listen for changes to synced settings addSettingsSyncListener: function() { chrome.storage.onChanged.addListener(function(remoteSettings, namespace) { @@ -236,7 +190,7 @@ var gsStorage = { 'gsStorage', 'Changed value from sync', key, - remoteSetting.newValue + remoteSetting.newValue, ); changedSettingKeys.push(key); oldValueBySettingKey[key] = localSettings[key]; @@ -250,7 +204,7 @@ var gsStorage = { gsUtils.performPostSaveUpdates( changedSettingKeys, oldValueBySettingKey, - newValueBySettingKey + newValueBySettingKey, ); } } @@ -292,7 +246,7 @@ var gsStorage = { gsUtils.error( 'gsStorage', 'Failed to parse gsSettings: ', - localStorage.getItem('gsSettings') + localStorage.getItem('gsSettings'), ); } if (!settings) { @@ -305,12 +259,11 @@ var gsStorage = { saveSettings: function(settings) { try { localStorage.setItem('gsSettings', JSON.stringify(settings)); - gsAnalytics.setUserDimensions(); } catch (e) { gsUtils.error( 'gsStorage', 'failed to save gsSettings to local storage', - e + e, ); } }, @@ -325,14 +278,14 @@ var gsStorage = { 'gsStorage', 'gsStorage', 'Pushing local settings to sync', - settings + settings, ); chrome.storage.sync.set(settings, () => { if (chrome.runtime.lastError) { gsUtils.error( 'gsStorage', 'failed to save to chrome.storage.sync: ', - chrome.runtime.lastError + chrome.runtime.lastError, ); } }); @@ -347,12 +300,13 @@ var gsStorage = { gsUtils.error( 'gsStorage', 'Failed to parse ' + gsStorage.APP_VERSION + ': ', - localStorage.getItem(gsStorage.APP_VERSION) + localStorage.getItem(gsStorage.APP_VERSION), ); } version = version || '0.0.0'; return version + ''; }, + setLastVersion: function(newVersion) { try { localStorage.setItem(gsStorage.APP_VERSION, JSON.stringify(newVersion)); @@ -360,27 +314,11 @@ var gsStorage = { gsUtils.error( 'gsStorage', 'failed to save ' + gsStorage.APP_VERSION + ' to local storage', - e + e, ); } }, - fetchNoticeVersion: function() { - var lastNoticeVersion; - try { - lastNoticeVersion = JSON.parse( - localStorage.getItem(gsStorage.LAST_NOTICE) - ); - } catch (e) { - gsUtils.error( - 'gsStorage', - 'Failed to parse ' + gsStorage.LAST_NOTICE + ': ', - localStorage.getItem(gsStorage.LAST_NOTICE) - ); - } - lastNoticeVersion = lastNoticeVersion || '0'; - return lastNoticeVersion + ''; - }, setNoticeVersion: function(newVersion) { try { localStorage.setItem(gsStorage.LAST_NOTICE, JSON.stringify(newVersion)); @@ -388,7 +326,7 @@ var gsStorage = { gsUtils.error( 'gsStorage', 'failed to save ' + gsStorage.LAST_NOTICE + ' to local storage', - e + e, ); } }, @@ -397,13 +335,13 @@ var gsStorage = { var lastExtensionRecoveryTimestamp; try { lastExtensionRecoveryTimestamp = JSON.parse( - localStorage.getItem(gsStorage.LAST_EXTENSION_RECOVERY) + localStorage.getItem(gsStorage.LAST_EXTENSION_RECOVERY), ); } catch (e) { gsUtils.error( 'gsStorage', 'Failed to parse ' + gsStorage.LAST_EXTENSION_RECOVERY + ': ', - localStorage.getItem(gsStorage.LAST_EXTENSION_RECOVERY) + localStorage.getItem(gsStorage.LAST_EXTENSION_RECOVERY), ); } return lastExtensionRecoveryTimestamp; @@ -412,54 +350,17 @@ var gsStorage = { try { localStorage.setItem( gsStorage.LAST_EXTENSION_RECOVERY, - JSON.stringify(extensionRecoveryTimestamp) + JSON.stringify(extensionRecoveryTimestamp), ); } catch (e) { gsUtils.error( 'gsStorage', 'failed to save ' + - gsStorage.LAST_EXTENSION_RECOVERY + - ' to local storage', - e + gsStorage.LAST_EXTENSION_RECOVERY + + ' to local storage', + e, ); } }, - fetchSessionMetrics: function() { - var sessionMetrics = {}; - try { - sessionMetrics = JSON.parse( - localStorage.getItem(gsStorage.SM_SESSION_METRICS) - ); - } catch (e) { - gsUtils.error( - 'gsStorage', - 'Failed to parse ' + gsStorage.SM_SESSION_METRICS + ': ', - localStorage.getItem(gsStorage.SM_SESSION_METRICS) - ); - } - return sessionMetrics; - }, - setSessionMetrics: function(sessionMetrics) { - try { - localStorage.setItem( - gsStorage.SM_SESSION_METRICS, - JSON.stringify(sessionMetrics) - ); - } catch (e) { - gsUtils.error( - 'gsStorage', - 'failed to save ' + gsStorage.SM_SESSION_METRICS + ' to local storage', - e - ); - } - }, - - /** - * Used by the options page to tell whether an option is set in managed storage - * and thus should not be changed. - * - * @param option The option name, such as "gsWhitelist" (not "WHITELIST") - */ - isOptionManaged: option => managedOptions.includes(option), }; diff --git a/src/js/gsSuspendedTab.js b/src/js/gsSuspendedTab.js index 095a69a5..c0ec3b2c 100644 --- a/src/js/gsSuspendedTab.js +++ b/src/js/gsSuspendedTab.js @@ -1,4 +1,4 @@ -/*global tgs, gsFavicon, gsStorage, gsSession, gsUtils, gsIndexedDb */ +/*global tgs, gsFavicon, gsStorage, gsSession, gsUtils, gsIndexedDb, gsChrome, chrome */ // eslint-disable-next-line no-unused-vars var gsSuspendedTab = (function() { 'use strict'; @@ -7,7 +7,7 @@ var gsSuspendedTab = (function() { if (!tabView) { gsUtils.warning( tab.id, - 'Could not get internalTabView for suspended tab' + 'Could not get internalTabView for suspended tab', ); } const suspendedUrl = tab.url; @@ -47,7 +47,7 @@ var gsSuspendedTab = (function() { tabView.document, tab, previewMode, - previewUri + previewUri, ); // Set theme @@ -65,7 +65,7 @@ var gsSuspendedTab = (function() { // Set reason const suspendReasonInt = tgs.getTabStatePropForTabId( tab.id, - tgs.STATE_SUSPEND_REASON + tgs.STATE_SUSPEND_REASON, ); let suspendReason = null; if (suspendReasonInt === 3) { @@ -109,7 +109,7 @@ var gsSuspendedTab = (function() { tabView.document, tab, previewMode, - previewUri + previewUri, ); const scrollPosition = gsUtils.getSuspendedScrollPosition(tab.url); @@ -137,12 +137,25 @@ var gsSuspendedTab = (function() { _document.title = title; _document.getElementById('gsTitle').innerHTML = title; _document.getElementById('gsTopBarTitle').innerHTML = title; + + //Check if there are updates + let el = _document.getElementById('tmsUpdateAvailable'); + el.style.display = gsStorage.getOption(gsStorage.UPDATE_AVAILABLE) ? 'block' : 'none'; + el.style.paddingTop = '80px'; // Prevent unsuspend by parent container // Using mousedown event otherwise click can still be triggered if // mouse is released outside of this element _document.getElementById('gsTopBarTitle').onmousedown = function(e) { e.stopPropagation(); }; + + setGoToUpdateHandler(_document); + } + + function setGoToUpdateHandler(_document) { + _document.getElementById('gotoUpdatePage').onclick = async function(e) { + await gsChrome.tabsCreate(chrome.extension.getURL('update.html')); + }; } function setUrl(_document, url) { @@ -215,7 +228,7 @@ var gsSuspendedTab = (function() { previewEl.setAttribute('id', 'gsPreviewContainer'); previewEl.classList.add('gsPreviewContainer'); previewEl.innerHTML = _document.getElementById( - 'previewTemplate' + 'previewTemplate', ).innerHTML; const unsuspendTabHandler = buildUnsuspendTabHandler(_document, tab); previewEl.onclick = unsuspendTabHandler; @@ -244,7 +257,7 @@ var gsSuspendedTab = (function() { _document, tab, previewMode, - previewUri + previewUri, ) { const builtImagePreview = _document.getElementById('gsPreviewContainer') !== null; @@ -283,9 +296,9 @@ var gsSuspendedTab = (function() { '(' + command + ')'; } else { const reloadString = chrome.i18n.getMessage( - 'js_suspended_hotkey_to_reload' + 'js_suspended_hotkey_to_reload', ); - hotkeyEl.innerHTML = `${reloadString}`; + hotkeyEl.innerHTML = `${reloadString}`; } } @@ -303,7 +316,7 @@ var gsSuspendedTab = (function() { } else { gsUtils.log( tab.id, - 'Ignoring beforeUnload as tab is not currently focused.' + 'Ignoring beforeUnload as tab is not currently focused.', ); } }); @@ -335,7 +348,7 @@ var gsSuspendedTab = (function() { } else { _document.body.classList.add('waking'); _document.getElementById('snoozyImg').src = chrome.extension.getURL( - 'img/snoozy_tab_awake.svg' + 'img/snoozy_tab_awake.svg', ); _document.getElementById('snoozySpinner').classList.add('spinner'); } diff --git a/src/js/gsTabSuspendManager.js b/src/js/gsTabSuspendManager.js index ed40b167..59fd7642 100644 --- a/src/js/gsTabSuspendManager.js +++ b/src/js/gsTabSuspendManager.js @@ -14,7 +14,7 @@ var gsTabSuspendManager = (function() { return new Promise(async function(resolve) { const screenCaptureMode = gsStorage.getOption(gsStorage.SCREEN_CAPTURE); const forceScreenCapture = gsStorage.getOption( - gsStorage.SCREEN_CAPTURE_FORCE + gsStorage.SCREEN_CAPTURE_FORCE, ); //TODO: This should probably update when the screencapture mode changes const concurrentSuspensions = @@ -64,20 +64,20 @@ var gsTabSuspendManager = (function() { executionProps, resolve, reject, - requeue + requeue, ) { if (executionProps.refetchTab || gsUtils.isSuspendedTab(tab)) { gsUtils.log( tab.id, QUEUE_ID, - 'Tab refetch required. Getting updated tab..' + 'Tab refetch required. Getting updated tab..', ); const _tab = await gsChrome.tabsGet(tab.id); if (!_tab) { gsUtils.log( tab.id, QUEUE_ID, - 'Could not find tab with id. Will ignore suspension request' + 'Could not find tab with id. Will ignore suspension request', ); resolve(false); return; @@ -90,14 +90,14 @@ var gsTabSuspendManager = (function() { gsUtils.log( tab.id, QUEUE_ID, - 'Tab is already suspended. Will check again in 3 seconds' + 'Tab is already suspended. Will check again in 3 seconds', ); requeue(3000, { refetchTab: true }); } else { gsUtils.log( tab.id, QUEUE_ID, - 'Tab still suspended after 3 seconds. Will ignore tab suspension request' + 'Tab still suspended after 3 seconds. Will ignore tab suspension request', ); resolve(false); } @@ -118,12 +118,12 @@ var gsTabSuspendManager = (function() { const suspendedUrl = gsUtils.generateSuspendedUrl( tab.url, savedTabInfo.title, - 0 + 0, ); gsUtils.log( tab.id, QUEUE_ID, - 'Interrupting tab loading to resuspend tab' + 'Interrupting tab loading to resuspend tab', ); const success = await executeTabSuspension(tab, suspendedUrl); resolve(success); @@ -134,7 +134,7 @@ var gsTabSuspendManager = (function() { } const discardInPlaceOfSuspend = gsStorage.getOption( - gsStorage.DISCARD_IN_PLACE_OF_SUSPEND + gsStorage.DISCARD_IN_PLACE_OF_SUSPEND, ); if (discardInPlaceOfSuspend) { screenCaptureMode = '0'; @@ -150,7 +150,7 @@ var gsTabSuspendManager = (function() { gsUtils.log( tab.id, QUEUE_ID, - 'Tab is not responding. Will reload for screen capture.' + 'Tab is not responding. Will reload for screen capture.', ); await gsChrome.tabsUpdate(tab.id, { url: tab.url }); // allow up to 30 seconds for tab to reload and trigger its subsequent suspension request @@ -166,7 +166,7 @@ var gsTabSuspendManager = (function() { const isEligible = checkContentScriptEligibilityForSuspension( tabInfo.status, - executionProps.forceLevel + executionProps.forceLevel, ); if (!isEligible) { gsUtils.log( @@ -174,7 +174,7 @@ var gsTabSuspendManager = (function() { QUEUE_ID, `Content script status of ${ tabInfo.status - } not eligible for suspension. Removing tab from suspensionQueue.` + } not eligible for suspension. Removing tab from suspensionQueue.`, ); resolve(false); return; @@ -189,7 +189,7 @@ var gsTabSuspendManager = (function() { const suspendedUrl = gsUtils.generateSuspendedUrl( tab.url, tab.title, - tabInfo.scrollPos + tabInfo.scrollPos, ); executionProps.suspendedUrl = suspendedUrl; @@ -205,22 +205,19 @@ var gsTabSuspendManager = (function() { gsUtils.log( tab.id, QUEUE_ID, - 'Preview generation script started successfully.' + 'Preview generation script started successfully.', ); // handlePreviewImageResponse is called on the 'savePreviewData' message response // this will refetch the queued tabDetails and call executionProps.resolveFn(true) } async function handlePreviewImageResponse(tab, previewUrl, errorMsg) { - // remove listener if there is any - gsCleanScreencaps.removeListener(tab.id); - const queuedTabDetails = getQueuedTabDetails(tab); if (!queuedTabDetails) { gsUtils.log( tab.id, QUEUE_ID, - 'Tab missing from suspensionQueue. Assuming suspension cancelled for this tab.' + 'Tab missing from suspensionQueue. Assuming suspension cancelled for this tab.', ); return; } @@ -230,7 +227,7 @@ var gsTabSuspendManager = (function() { gsUtils.log( tab.id, QUEUE_ID, - 'Tab is no longer eligible for suspension. Removing tab from suspensionQueue.' + 'Tab is no longer eligible for suspension. Removing tab from suspensionQueue.', ); return; } @@ -238,7 +235,7 @@ var gsTabSuspendManager = (function() { // Temporarily change tab.url with that from the generated suspended url // This is because for youtube tabs we manually change the url to persist timestamp const timestampedUrl = gsUtils.getOriginalUrl( - queuedTabDetails.executionProps.suspendedUrl + queuedTabDetails.executionProps.suspendedUrl, ); // NOTE: This does not actually change the tab url, just the current tab object tab.url = timestampedUrl; @@ -248,7 +245,7 @@ var gsTabSuspendManager = (function() { tab.id, QUEUE_ID, 'savePreviewData reported an error: ', - errorMsg + errorMsg, ); } else { await gsIndexedDb.addPreviewImage(tab.url, previewUrl); @@ -256,9 +253,8 @@ var gsTabSuspendManager = (function() { const success = await executeTabSuspension( tab, - queuedTabDetails.executionProps.suspendedUrl + queuedTabDetails.executionProps.suspendedUrl, ); - queuedTabDetails.executionProps.resolveFn(success); } @@ -272,25 +268,26 @@ var gsTabSuspendManager = (function() { exceptionType, resolve, reject, - requeue + requeue, ) { if (exceptionType === _suspensionQueue.EXCEPTION_TIMEOUT) { gsUtils.log( tab.id, QUEUE_ID, - `Tab took more than ${_suspensionQueue.getQueueProperties().jobTimeout - }ms to suspend. Will force suspension.` + `Tab took more than ${ + _suspensionQueue.getQueueProperties().jobTimeout + }ms to suspend. Will force suspension.`, ); const success = await executeTabSuspension( tab, - executionProps.suspendedUrl + executionProps.suspendedUrl, ); resolve(success); } else { gsUtils.warning( tab.id, QUEUE_ID, - `Failed to suspend tab: ${exceptionType}` + `Failed to suspend tab: ${exceptionType}`, ); resolve(false); } @@ -304,7 +301,7 @@ var gsTabSuspendManager = (function() { // If we want tabs to be discarded instead of suspending them let discardInPlaceOfSuspend = gsStorage.getOption( - gsStorage.DISCARD_IN_PLACE_OF_SUSPEND + gsStorage.DISCARD_IN_PLACE_OF_SUSPEND, ); if (discardInPlaceOfSuspend) { tgs.clearAutoSuspendTimerForTabId(tab.id); @@ -328,7 +325,7 @@ var gsTabSuspendManager = (function() { tgs.setTabStatePropForTabId( tab.id, tgs.STATE_INITIALISE_SUSPENDED_TAB, - true + true, ); gsChrome.tabsUpdate(tab.id, { url: suspendedUrl }).then(updatedTab => { resolve(updatedTab !== null); @@ -382,7 +379,7 @@ var gsTabSuspendManager = (function() { function checkContentScriptEligibilityForSuspension( contentScriptStatus, - forceLevel + forceLevel, ) { if ( forceLevel >= 2 && @@ -403,7 +400,7 @@ var gsTabSuspendManager = (function() { tab.id, QUEUE_ID, 'Failed to get content script info', - error + error, ); // continue here but will lose information about scroll position, // temp whitelist, and form input @@ -429,7 +426,7 @@ var gsTabSuspendManager = (function() { tab.id, QUEUE_ID, 'Failed to fetch YouTube timestamp', - error + error, ); } if (!response) { @@ -441,14 +438,14 @@ var gsTabSuspendManager = (function() { const youTubeUrl = new URL(tab.url); youTubeUrl.searchParams.set('t', timestamp + 's'); resolve(youTubeUrl.href); - } + }, ); }); } function fetchYouTubeTimestampContentScript() { const videoEl = document.querySelector( - 'video.video-stream.html5-main-video' + 'video.video-stream.html5-main-video', ); const timestamp = videoEl ? videoEl.currentTime >> 0 : 0; return timestamp; @@ -467,7 +464,7 @@ var gsTabSuspendManager = (function() { await gsIndexedDb.addSuspendedTabInfo(tabProperties); const faviconMeta = await gsFavicon.buildFaviconMetaFromChromeFaviconCache( - tab.url + tab.url, ); if (faviconMeta) { await gsFavicon.saveFaviconMetaDataToCache(tab.url, faviconMeta); @@ -475,43 +472,16 @@ var gsTabSuspendManager = (function() { } function requestGeneratePreviewImage(tab) { - // Will not implement this for now as it does not actually capture the whole - // screen, just the visible area - // NOTE: It also requires the manifest permission - // if (tab.active) { - // chrome.tabs.captureVisibleTab( - // tab.windowId, - // { format: 'png' }, - // dataUrl => { - // handlePreviewImageResponse(tab, dataUrl, chrome.runtime.lastError); - // } - // ); //async. unhandled promise. - // return; - // } - const screenCaptureMode = gsStorage.getOption(gsStorage.SCREEN_CAPTURE); const forceScreenCapture = gsStorage.getOption( - gsStorage.SCREEN_CAPTURE_FORCE + gsStorage.SCREEN_CAPTURE_FORCE, ); - const useAlternateScreenCaptureLib = gsStorage.getOption( - gsStorage.USE_ALT_SCREEN_CAPTURE_LIB - ); - const useCleanScreencap = gsStorage.getOption( - gsStorage.ENABLE_CLEAN_SCREENCAPS - ); - const screenCaptureLib = useAlternateScreenCaptureLib - ? 'js/dom-to-image.js' - : 'js/html2canvas.min.js'; + const screenCaptureLib = 'js/html2canvas.min.js'; gsUtils.log( tab.id, QUEUE_ID, - `Injecting ${screenCaptureLib} into content script` + `Injecting ${screenCaptureLib} into content script`, ); - - if (useCleanScreencap) { - gsCleanScreencaps.addListener(tab.id) - } - gsMessages.executeScriptOnTab(tab.id, screenCaptureLib, error => { if (error) { handlePreviewImageResponse(tab, null, 'Failed to executeScriptOnTab'); //async. unhandled promise. @@ -519,17 +489,17 @@ var gsTabSuspendManager = (function() { } gsMessages.executeCodeOnTab( tab.id, - `(${generatePreviewImageCanvasViaContentScript})("${screenCaptureMode}", ${forceScreenCapture}, ${useAlternateScreenCaptureLib});`, + `(${generatePreviewImageCanvasViaContentScript})("${screenCaptureMode}", ${forceScreenCapture});`, error => { if (error) { handlePreviewImageResponse( tab, null, - 'Failed to executeCodeOnTab: generatePreviewImgContentScript' + 'Failed to executeCodeOnTab: generatePreviewImgContentScript', ); //async. unhandled promise. return; } - } + }, ); }); } @@ -541,7 +511,6 @@ var gsTabSuspendManager = (function() { async function generatePreviewImageCanvasViaContentScript( screenCaptureMode, forceScreenCapture, - useAlternateScreenCaptureLib ) { const MAX_CANVAS_HEIGHT = forceScreenCapture ? 10000 : 5000; const IMAGE_TYPE = 'image/webp'; @@ -558,7 +527,7 @@ var gsTabSuspendManager = (function() { document.body.offsetHeight, document.documentElement.clientHeight, document.documentElement.scrollHeight, - document.documentElement.offsetHeight + document.documentElement.offsetHeight, ); // cap the max height otherwise it fails to convert to a data url height = Math.min(height, MAX_CANVAS_HEIGHT); @@ -568,39 +537,24 @@ var gsTabSuspendManager = (function() { width = document.body.clientWidth; let generateCanvas; - if (useAlternateScreenCaptureLib) { - // console.log('Generating via dom-to-image..'); - generateCanvas = () => { - return domtoimage - .toCanvas(document.body, { width: width, height: height }) - .then(canvas => { - const croppedCanvas = document.createElement('canvas'); - const context = croppedCanvas.getContext('2d'); - croppedCanvas.width = width; - croppedCanvas.height = height; - context.drawImage(canvas, 0, 0); - return croppedCanvas; - }); - }; - } else { - // console.log('Generating via html2canvas..'); - generateCanvas = () => { - return html2canvas(document.body, { - height: height, - width: width, - logging: false, - imageTimeout: 10000, - removeContainer: false, - foreignObjectRendering: true, - async: true, - }); - }; - } + + // console.log('Generating via html2canvas..'); + generateCanvas = () => { + return html2canvas(document.body, { + height: height, + width: width, + logging: false, + imageTimeout: 10000, + removeContainer: false, + async: true, + }); + }; + const isCanvasVisible = canvas => { - var ctx = canvas.getContext('2d'); - var imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); - for (var i = 0; i < imageData.data.length; i += 4) { + let ctx = canvas.getContext('2d'); + let imageData = ctx.getImageData(0, 0, canvas.width, canvas.height); + for (let i = 0; i < imageData.data.length; i += 4) { const isTransparent = imageData.data[i + 3] === 0; const isWhite = imageData.data[i] === 255 && @@ -659,4 +613,3 @@ var gsTabSuspendManager = (function() { getQueuedTabDetails, }; })(); - diff --git a/src/js/gsUtils.js b/src/js/gsUtils.js index 3b025b3a..370befff 100644 --- a/src/js/gsUtils.js +++ b/src/js/gsUtils.js @@ -56,7 +56,7 @@ var gsUtils = { id, (new Date() + '').split(' ')[4], text, - ...args + ...args, ); } }, @@ -86,13 +86,12 @@ var gsUtils = { errorObj = errorObj || {}; console.log(id, (new Date() + '').split(' ')[4], 'Error:'); console.error( - gsUtils.getPrintableError(errorMessage, stackTrace, ...args) + gsUtils.getPrintableError(errorMessage, stackTrace, ...args), ); } else { // const logString = errorObj.hasOwnProperty('stack') // ? errorObj.stack // : `${JSON.stringify(errorObj)}\n${gsUtils.getStackTrace()}`; - // gsAnalytics.reportException(logString, false); } }, // Puts all the error args into a single printable string so that all the info @@ -129,12 +128,31 @@ var gsUtils = { return tab.discarded; }, + getTabUrl: function (tab) { + return tab.url || tab.pendingUrl; + }, + + isValidTabWithUrl: function(tab) { + if (!tab || typeof tab == "undefined") { + return false; + } + const url = gsUtils.getTabUrl(tab); + if (url && typeof url == "string" && url.length > 0) { + return true; + } + return false; + }, + + //tests for non-standard web pages. does not check for suspended pages! isSpecialTab: function(tab) { - const url = tab.url || tab.pendingUrl; + if (!gsUtils.isValidTabWithUrl(tab)) { + return false; + } if (gsUtils.isSuspendedTab(tab, true)) { return false; } + const url = gsUtils.getTabUrl(tab); // Careful, suspended urls start with "chrome-extension://" if ( url.indexOf('about') === 0 || @@ -149,7 +167,10 @@ var gsUtils = { }, isFileTab: function(tab) { - const url = tab.url || tab.pendingUrl; + if (!gsUtils.isValidTabWithUrl(tab)) { + return false; + } + const url = gsUtils.getTabUrl(tab); if (url.indexOf('file') === 0) { return true; } @@ -167,7 +188,10 @@ var gsUtils = { //does not include suspended pages! isInternalTab: function(tab) { - const url = tab.url || tab.pendingUrl; + if (!gsUtils.isValidTabWithUrl(tab)) { + return false; + } + const url = gsUtils.getTabUrl(tab); var isLocalExtensionPage = url.indexOf('chrome-extension://' + chrome.runtime.id) === 0; return isLocalExtensionPage && !gsUtils.isSuspendedTab(tab); @@ -185,7 +209,7 @@ var gsUtils = { isProtectedActiveTab: function(tab) { var dontSuspendActiveTabs = gsStorage.getOption( - gsStorage.IGNORE_ACTIVE_TABS + gsStorage.IGNORE_ACTIVE_TABS, ); return ( tgs.isCurrentFocusedTab(tab) || (dontSuspendActiveTabs && tab.active) @@ -219,10 +243,10 @@ var gsUtils = { shouldSuspendDiscardedTabs: function() { var suspendInPlaceOfDiscard = gsStorage.getOption( - gsStorage.SUSPEND_IN_PLACE_OF_DISCARD + gsStorage.SUSPEND_IN_PLACE_OF_DISCARD, ); var discardInPlaceOfSuspend = gsStorage.getOption( - gsStorage.DISCARD_IN_PLACE_OF_SUSPEND + gsStorage.DISCARD_IN_PLACE_OF_SUSPEND, ); return suspendInPlaceOfDiscard && !discardInPlaceOfSuspend; }, @@ -273,14 +297,14 @@ var gsUtils = { checkWhiteList: function(url) { return gsUtils.checkSpecificWhiteList( url, - gsStorage.getOption(gsStorage.WHITELIST) + gsStorage.getOption(gsStorage.WHITELIST), ); }, checkSpecificWhiteList: function(url, whitelistString) { var whitelistItems = whitelistString - ? whitelistString.split(/[\s\n]+/) - : [], + ? whitelistString.split(/[\s\n]+/) + : [], whitelisted; whitelisted = whitelistItems.some(function(item) { @@ -306,7 +330,7 @@ var gsUtils = { gsUtils.performPostSaveUpdates( [key], { [key]: oldWhitelistString }, - { [key]: whitelistString } + { [key]: whitelistString }, ); }, @@ -344,7 +368,7 @@ var gsUtils = { gsUtils.performPostSaveUpdates( [key], { [key]: oldWhitelistString }, - { [key]: newWhitelistString } + { [key]: newWhitelistString }, ); }, @@ -369,7 +393,7 @@ var gsUtils = { } }, - documentReadyAsPromsied: function(doc) { + documentReadyAsPromised: function(doc) { return new Promise(function(resolve) { if (doc.readyState !== 'loading') { resolve(); @@ -382,7 +406,7 @@ var gsUtils = { }, localiseHtml: function(parentEl) { - var replaceTagFunc = function(match, p1) { + let replaceTagFunc = function(match, p1) { return p1 ? chrome.i18n.getMessage(p1) : ''; }; for (let el of parentEl.getElementsByTagName('*')) { @@ -397,14 +421,14 @@ var gsUtils = { 'data-i18n-tooltip', el .getAttribute('data-i18n-tooltip') - .replace(/__MSG_(\w+)__/g, replaceTagFunc) + .replace(/__MSG_(\w+)__/g, replaceTagFunc), ); } } }, - documentReadyAndLocalisedAsPromsied: async function(doc) { - await gsUtils.documentReadyAsPromsied(doc); + documentReadyAndLocalisedAsPromised: async function(doc) { + await gsUtils.documentReadyAsPromised(doc); gsUtils.localiseHtml(doc); if (doc.body && doc.body.hidden) { doc.body.hidden = false; @@ -495,7 +519,7 @@ var gsUtils = { if (keyPair && keyPair.match(keyPairRegEx)) { valuesByKey[keyPair.replace(keyPairRegEx, '$1')] = keyPair.replace( keyPairRegEx, - '$2' + '$2', ); } }); @@ -561,7 +585,7 @@ var gsUtils = { getSuspendedTabCount: async function() { const currentTabs = await gsChrome.tabsQuery(); const currentSuspendedTabs = currentTabs.filter(tab => - gsUtils.isSuspendedTab(tab) + gsUtils.isSuspendedTab(tab), ); return currentSuspendedTabs.length; }, @@ -597,7 +621,7 @@ var gsUtils = { for (const tab of tabs) { const timerDetails = tgs.getTabStatePropForTabId( tab.id, - tgs.STATE_TIMER_DETAILS + tgs.STATE_TIMER_DETAILS, ); if ( timerDetails && @@ -614,7 +638,7 @@ var gsUtils = { performPostSaveUpdates: function( changedSettingKeys, oldValueBySettingKey, - newValueBySettingKey + newValueBySettingKey, ) { chrome.tabs.query({}, function(tabs) { tabs.forEach(function(tab) { @@ -637,7 +661,7 @@ var gsUtils = { //if theme or screenshot preferences have changed then refresh suspended tabs const updateTheme = changedSettingKeys.includes(gsStorage.THEME); const updatePreviewMode = changedSettingKeys.includes( - gsStorage.SCREEN_CAPTURE + gsStorage.SCREEN_CAPTURE, ); if (updateTheme || updatePreviewMode) { const suspendedView = tgs.getInternalViewByTabId(tab.id); @@ -650,18 +674,18 @@ var gsUtils = { suspendedView, tab, theme, - isLowContrastFavicon + isLowContrastFavicon, ); }); } if (updatePreviewMode) { const previewMode = gsStorage.getOption( - gsStorage.SCREEN_CAPTURE + gsStorage.SCREEN_CAPTURE, ); gsSuspendedTab.updatePreviewMode( suspendedView, tab, - previewMode + previewMode, ); // async. unhandled promise. } } @@ -669,7 +693,7 @@ var gsUtils = { //if discardAfterSuspend has changed then updated discarded tabs const updateDiscardAfterSuspend = changedSettingKeys.includes( - gsStorage.DISCARD_AFTER_SUSPEND + gsStorage.DISCARD_AFTER_SUSPEND, ); if ( updateDiscardAfterSuspend && @@ -688,7 +712,7 @@ var gsUtils = { //update content scripts of normal tabs const updateIgnoreForms = changedSettingKeys.includes( - gsStorage.IGNORE_FORMS + gsStorage.IGNORE_FORMS, ); if (updateIgnoreForms) { gsMessages.sendUpdateToContentScriptOfTab(tab); //async. unhandled error @@ -714,11 +738,11 @@ var gsUtils = { (changedSettingKeys.includes(gsStorage.WHITELIST) && (gsUtils.checkSpecificWhiteList( tab.url, - oldValueBySettingKey[gsStorage.WHITELIST] - ) && + oldValueBySettingKey[gsStorage.WHITELIST], + ) && !gsUtils.checkSpecificWhiteList( tab.url, - newValueBySettingKey[gsStorage.WHITELIST] + newValueBySettingKey[gsStorage.WHITELIST], ))); if (updateSuspendTime) { tgs.resetAutoSuspendTimerForTab(tab); @@ -726,7 +750,7 @@ var gsUtils = { //if SuspendInPlaceOfDiscard has changed then updated discarded tabs const updateSuspendInPlaceOfDiscard = changedSettingKeys.includes( - gsStorage.SUSPEND_IN_PLACE_OF_DISCARD + gsStorage.SUSPEND_IN_PLACE_OF_DISCARD, ); if (updateSuspendInPlaceOfDiscard && gsUtils.isDiscardedTab(tab)) { gsTabDiscardManager.handleDiscardedUnsuspendedTab(tab); //async. unhandled promise. @@ -884,7 +908,7 @@ var gsUtils = { promiseFn, fnArgsArray, maxRetries, - retryWaitTime + retryWaitTime, ) { const retryFn = async retries => { try { @@ -899,7 +923,6 @@ var gsUtils = { return await retryFn(retries); } }; - const result = await retryFn(0); - return result; + return await retryFn(0); }, }; diff --git a/src/js/history.js b/src/js/history.js index 23c7e361..87e809cb 100644 --- a/src/js/history.js +++ b/src/js/history.js @@ -1,4 +1,4 @@ -/*global chrome, historyItems, historyUtils, gsAnalytics, gsSession, gsIndexedDb, gsUtils */ +/*global chrome, historyItems, historyUtils, gsSession, gsIndexedDb, gsUtils, gsStorage */ (function(global) { 'use strict'; @@ -34,7 +34,7 @@ function deleteSession(sessionId) { var result = window.confirm( - chrome.i18n.getMessage('js_history_confirm_delete') + chrome.i18n.getMessage('js_history_confirm_delete'), ); if (result) { gsIndexedDb.removeSessionFromHistory(sessionId).then(function() { @@ -66,7 +66,7 @@ async function toggleSession(element, sessionId) { var sessionContentsEl = element.getElementsByClassName( - 'sessionContents' + 'sessionContents', )[0]; var sessionIcon = element.getElementsByClassName('sessionIcon')[0]; if (sessionIcon.classList.contains('icon-plus-squared-alt')) { @@ -94,7 +94,7 @@ for (const [i, curWindow] of curSession.windows.entries()) { curWindow.sessionId = curSession.sessionId; sessionContentsEl.appendChild( - createWindowElement(curSession, curWindow, i) + createWindowElement(curSession, curWindow, i), ); const tabPromises = []; @@ -128,43 +128,43 @@ sessionEl.getElementsByClassName('sessionIcon')[0], function() { toggleSession(sessionEl, session.sessionId); //async. unhandled promise - } + }, ); addClickListenerToElement( sessionEl.getElementsByClassName('sessionLink')[0], function() { toggleSession(sessionEl, session.sessionId); //async. unhandled promise - } + }, ); addClickListenerToElement( sessionEl.getElementsByClassName('exportLink')[0], function() { - historyUtils.exportSessionWithId(session.sessionId); - } + historyUtils.exportSessionWithId(null, session.sessionId); + }, ); addClickListenerToElement( sessionEl.getElementsByClassName('resuspendLink')[0], function() { reloadTabs(session.sessionId, null, true); // async - } + }, ); addClickListenerToElement( sessionEl.getElementsByClassName('reloadLink')[0], function() { reloadTabs(session.sessionId, null, false); // async - } + }, ); addClickListenerToElement( sessionEl.getElementsByClassName('saveLink')[0], function() { - historyUtils.saveSession(session.sessionId); - } + historyUtils.saveSession(session.sessionId, null); + }, ); addClickListenerToElement( sessionEl.getElementsByClassName('deleteLink')[0], function() { deleteSession(session.sessionId); - } + }, ); return sessionEl; } @@ -177,13 +177,27 @@ windowEl.getElementsByClassName('resuspendLink')[0], function() { reloadTabs(session.sessionId, window.id, true); // async - } + }, ); addClickListenerToElement( windowEl.getElementsByClassName('reloadLink')[0], function() { reloadTabs(session.sessionId, window.id, false); // async - } + }, + ); + addClickListenerToElement( + windowEl.getElementsByClassName('exportLink' + index)[0], + function() { + // document.getElementById('debugWindowId').innerText = 'Window ID sent: ' + window.id; + historyUtils.exportSessionWithId(window.id, session.sessionId); + }, + ); + addClickListenerToElement( + windowEl.getElementsByClassName('saveLink' + index)[0], + function() { + // document.getElementById('debugWindowId').innerText = 'Window ID sent: ' + window.id; + historyUtils.saveSession(session.sessionId, window.id); + }, ); return windowEl; } @@ -196,13 +210,16 @@ tabEl.getElementsByClassName('removeLink')[0], function() { removeTab(tabEl, session.sessionId, window.id, tab.id); - } + }, ); return tabEl; } function render() { - var currentDiv = document.getElementById('currentSessions'), + //Set theme + document.body.classList.add(gsStorage.getOption(gsStorage.THEME) === 'dark' ? 'dark' : null); + + let currentDiv = document.getElementById('currentSessions'), sessionsDiv = document.getElementById('recoverySessions'), historyDiv = document.getElementById('historySessions'), importSessionEl = document.getElementById('importSession'), @@ -237,26 +254,31 @@ importSessionActionEl.addEventListener( 'change', historyUtils.importSession, - false + false, ); importSessionEl.onclick = function() { importSessionActionEl.click(); }; + var migrateTabsEl = document.getElementById('migrateTabs'); + migrateTabsEl.onclick = function() { + var migrateTabsFromIdEl = document.getElementById('migrateFromId'); + historyUtils.migrateTabs(migrateTabsFromIdEl.value); + }; + //hide incompatible sidebar items if in incognito mode if (chrome.extension.inIncognitoContext) { Array.prototype.forEach.call( document.getElementsByClassName('noIncognito'), function(el) { el.style.display = 'none'; - } + }, ); } } - gsUtils.documentReadyAndLocalisedAsPromsied(document).then(function() { + gsUtils.documentReadyAndLocalisedAsPromised(document).then(function() { render(); }); - gsAnalytics.reportPageView('history.html'); })(this); diff --git a/src/js/historyItems.js b/src/js/historyItems.js index 973a1c03..a6d7d148 100644 --- a/src/js/historyItems.js +++ b/src/js/historyItems.js @@ -14,12 +14,12 @@ var historyItems = (function(global) { function createSessionHtml(session, showLinks) { session.windows = session.windows || []; - var sessionType = + let sessionType = session.sessionId === gsSession.getSessionId() ? 'current' : session.name - ? 'saved' - : 'recent', + ? 'saved' + : 'recent', sessionContainer, sessionTitle, sessionSave, @@ -35,24 +35,19 @@ var historyItems = (function(global) { return a + b.tabs.length; }, 0); - if (sessionType === 'saved') { - titleText = session.name; - } else { - titleText = gsUtils.getHumanDate(session.date); - } - titleText += + let winText = winCnt > 1 ? 'js_history_windows' : 'js_history_window'; + let tabText = tabCnt > 1 ? 'js_history_tabs' : 'js_history_tab'; + + titleText = + ((sessionType === 'saved') ? session.name : gsUtils.getHumanDate(session.date)) + '  (' + winCnt + - pluralise( - ' ' + chrome.i18n.getMessage('js_history_window').toLowerCase(), - winCnt - ) + + ' ' + + chrome.i18n.getMessage(winText).toLowerCase() + ', ' + tabCnt + - pluralise( - ' ' + chrome.i18n.getMessage('js_history_tab').toLowerCase(), - tabCnt - ) + + ' ' + + chrome.i18n.getMessage(tabText).toLowerCase() + ')'; sessionIcon = createEl('i', { @@ -74,7 +69,7 @@ var historyItems = (function(global) { class: 'groupLink saveLink', href: '#', }, - chrome.i18n.getMessage('js_history_save') + chrome.i18n.getMessage('js_history_save'), ); sessionDelete = createEl( @@ -83,7 +78,7 @@ var historyItems = (function(global) { class: 'groupLink deleteLink', href: '#', }, - chrome.i18n.getMessage('js_history_delete') + chrome.i18n.getMessage('js_history_delete'), ); windowResuspend = createEl( @@ -92,7 +87,7 @@ var historyItems = (function(global) { class: 'groupLink resuspendLink', href: '#', }, - chrome.i18n.getMessage('js_history_resuspend') + chrome.i18n.getMessage('js_history_resuspend'), ); windowReload = createEl( @@ -101,7 +96,7 @@ var historyItems = (function(global) { class: 'groupLink reloadLink', href: '#', }, - chrome.i18n.getMessage('js_history_reload') + chrome.i18n.getMessage('js_history_reload'), ); sessionExport = createEl( @@ -110,7 +105,7 @@ var historyItems = (function(global) { class: 'groupLink exportLink', href: '#', }, - chrome.i18n.getMessage('js_history_export') + chrome.i18n.getMessage('js_history_export'), ); sessionContainer = createEl('div', { @@ -138,35 +133,56 @@ var historyItems = (function(global) { } function createWindowHtml(window, index, showLinks) { - var groupHeading, windowContainer, groupUnsuspendCurrent, groupUnsuspendNew; + let groupHeading, windowContainer, groupUnsuspendCurrent, groupUnsuspendNew; groupHeading = createEl('div', { class: 'windowContainer', + id: 'main-div-' + index, }); var windowString = chrome.i18n.getMessage('js_history_window'); windowContainer = createEl( 'span', + {}, - windowString + ' ' + (index + 1) + ':\u00A0' + windowString + ' ' + (index + 1) + ':\u00A0', ); + windowContainer.appendChild(createEl( + 'a', + { + class: 'groupLink exportLink' + index, + href: '#', + }, + chrome.i18n.getMessage('js_history_export'), + )); + + windowContainer.appendChild(createEl( + 'a', + { + class: 'groupLink saveLink' + index, + href: '#', + }, + chrome.i18n.getMessage('js_history_save'), + )); + + groupUnsuspendCurrent = createEl( 'a', { class: 'groupLink resuspendLink ', - href: '#', + href: '#main-div-' + index, }, - chrome.i18n.getMessage('js_history_resuspend') + chrome.i18n.getMessage('js_history_resuspend'), ); groupUnsuspendNew = createEl( 'a', { class: 'groupLink reloadLink', - href: '#', + href: '#main-div-' + index, }, - chrome.i18n.getMessage('js_history_reload') + chrome.i18n.getMessage('js_history_reload'), ); groupHeading.appendChild(windowContainer); @@ -179,7 +195,7 @@ var historyItems = (function(global) { } async function createTabHtml(tab, showLinks) { - var linksSpan, listImg, listLink, listHover; + let linksSpan, listImg, listLink, listHover; if (tab.sessionId) { linksSpan = createEl('div', { @@ -199,7 +215,7 @@ var historyItems = (function(global) { { class: 'itemHover removeLink', }, - '\u2716' + '\u2716', ); const faviconMeta = await gsFavicon.getFaviconMetaData(tab); @@ -217,7 +233,7 @@ var historyItems = (function(global) { href: tab.url, target: '_blank', }, - tab.title && tab.title.length > 1 ? tab.title : tab.url + tab.title && tab.title.length > 1 ? tab.title : tab.url, ); if (showLinks) { @@ -237,8 +253,9 @@ var historyItems = (function(global) { el.innerHTML = gsUtils.htmlEncode(text || ''); return el; } + function setElAttributes(el, attributes) { - for (var key in attributes) { + for (let key in attributes) { if (attributes.hasOwnProperty(key)) { el.setAttribute(key, attributes[key]); } @@ -246,12 +263,6 @@ var historyItems = (function(global) { return el; } - function pluralise(text, count) { - return ( - text + (count > 1 ? chrome.i18n.getMessage('js_history_plural') : '') - ); - } - return { createSessionHtml: createSessionHtml, createWindowHtml: createWindowHtml, diff --git a/src/js/historyUtils.js b/src/js/historyUtils.js index bd05fa8c..daba6c58 100644 --- a/src/js/historyUtils.js +++ b/src/js/historyUtils.js @@ -11,7 +11,8 @@ var historyUtils = (function(global) { } chrome.extension.getBackgroundPage().tgs.setViewGlobals(global); - var noop = function() {}; + var noop = function() { + }; function importSession(e) { var f = e.target.files[0]; @@ -36,7 +37,7 @@ var historyUtils = (function(global) { async function handleImport(sessionName, textContents) { sessionName = window.prompt( chrome.i18n.getMessage('js_history_enter_name_for_session'), - sessionName + sessionName, ); if (sessionName) { const shouldSave = await new Promise(resolve => { @@ -103,22 +104,22 @@ var historyUtils = (function(global) { } } - function exportSessionWithId(sessionId, callback) { + function exportSessionWithId(windowId, sessionId, callback) { callback = typeof callback !== 'function' ? noop : callback; + // document.getElementById('debugWindowId').innerText = document.getElementById('debugWindowId').innerText + ' - Window ID retrieved: ' + windowId; gsIndexedDb.fetchSessionBySessionId(sessionId).then(function(session) { if (!session || !session.windows) { callback(); } else { - exportSession(session, callback); + exportSession(session, callback, windowId); } }); } - function exportSession(session, callback) { - let sessionString = ''; + function exportSession(session, callback, windowId) { + function _exInternalExport(curWindow) { - session.windows.forEach(function(curWindow, index) { curWindow.tabs.forEach(function(curTab, tabIndex) { if (gsUtils.isSuspendedTab(curTab)) { sessionString += gsUtils.getOriginalUrl(curTab.url) + '\n'; @@ -128,6 +129,19 @@ var historyUtils = (function(global) { }); //add an extra newline to separate windows sessionString += '\n'; + } + + let sessionString = ''; + + session.windows.forEach(function(curWindow, index) { + if (windowId != null) { + if (curWindow.id == windowId) { + _exInternalExport(curWindow); + } + } else { + _exInternalExport(curWindow); + } + }); const blob = new Blob([sessionString], { type: 'text/plain' }); @@ -147,7 +161,7 @@ var historyUtils = (function(global) { }); if (nameExists) { var overwrite = window.confirm( - chrome.i18n.getMessage('js_history_confirm_session_overwrite') + chrome.i18n.getMessage('js_history_confirm_session_overwrite'), ); if (!overwrite) { callback(false); @@ -158,25 +172,31 @@ var historyUtils = (function(global) { }); } - function saveSession(sessionId) { + function saveSession(sessionId, windowId) { + // document.getElementById('debugWindowId').innerText = document.getElementById('debugWindowId').innerText + ' - Window ID retrieved: ' + windowId; gsIndexedDb.fetchSessionBySessionId(sessionId).then(function(session) { if (!session) { gsUtils.warning( 'historyUtils', 'Could not find session with sessionId: ' + - sessionId + - '. Save aborted' + sessionId + + '. Save aborted', ); return; } var sessionName = window.prompt( - chrome.i18n.getMessage('js_history_enter_name_for_session') + chrome.i18n.getMessage('js_history_enter_name_for_session'), ); if (sessionName) { historyUtils.validateNewSessionName(sessionName, function(shouldSave) { if (shouldSave) { session.name = sessionName; - gsIndexedDb.addToSavedSessions(session).then(function() { + // document.getElementById('debugWindowId').innerText = document.getElementById('debugWindowId').innerText + ' - SessionData: ' + JSON.stringify(session); + let newSession = JSON.parse(JSON.stringify(session)); + newSession.windows = (windowId !== null) ? session.windows.filter((curWindow) => (curWindow.id === windowId)) : session.windows; + // document.getElementById('debugWindowId').innerText = JSON.stringify(newSession); + + gsIndexedDb.addToSavedSessions(newSession).then(function() { window.location.reload(); }); } @@ -185,11 +205,33 @@ var historyUtils = (function(global) { }); } + function migrateTabs(from_id) { + if (from_id.length == 32) { + chrome.tabs.query({}, function(tabs) { + var count = 0; + var prefix_before = 'chrome-extension://' + from_id; + var prefix_after = 'chrome-extension://' + chrome.i18n.getMessage('@@extension_id'); + for (var tab of tabs) { + if (!tab.url.startsWith(prefix_before)) { + continue; + } + count += 1; + var migrated_url = prefix_after + tab.url.substr(prefix_before.length); + chrome.tabs.update(tab.id, { url: migrated_url }); + } + alert(chrome.i18n.getMessage('js_history_migrate_success', '' + count)); + }); + } else { + alert(chrome.i18n.getMessage('js_history_migrate_fail')); + } + } + return { importSession, exportSession, exportSessionWithId, validateNewSessionName, saveSession, + migrateTabs, }; })(this); diff --git a/src/js/html2canvas.js b/src/js/html2canvas.js deleted file mode 100644 index 4d3d7487..00000000 --- a/src/js/html2canvas.js +++ /dev/null @@ -1,7274 +0,0 @@ -/*! - * html2canvas 1.0.0-alpha.12 - * Copyright (c) 2018 Niklas von Hertzen - * Released under MIT License - */ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["html2canvas"] = factory(); - else - root["html2canvas"] = factory(); -})(this, function() { - return /******/ (function(modules) { // webpackBootstrap - /******/ // The module cache - /******/ var installedModules = {}; - /******/ - /******/ // The require function - /******/ function __webpack_require__(moduleId) { - /******/ - /******/ // Check if module is in cache - /******/ if(installedModules[moduleId]) { - /******/ return installedModules[moduleId].exports; - /******/ } - /******/ // Create a new module (and put it into the cache) - /******/ var module = installedModules[moduleId] = { - /******/ i: moduleId, - /******/ l: false, - /******/ exports: {} - /******/ }; - /******/ - /******/ // Execute the module function - /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__); - /******/ - /******/ // Flag the module as loaded - /******/ module.l = true; - /******/ - /******/ // Return the exports of the module - /******/ return module.exports; - /******/ } - /******/ - /******/ - /******/ // expose the modules object (__webpack_modules__) - /******/ __webpack_require__.m = modules; - /******/ - /******/ // expose the module cache - /******/ __webpack_require__.c = installedModules; - /******/ - /******/ // define getter function for harmony exports - /******/ __webpack_require__.d = function(exports, name, getter) { - /******/ if(!__webpack_require__.o(exports, name)) { - /******/ Object.defineProperty(exports, name, { - /******/ configurable: false, - /******/ enumerable: true, - /******/ get: getter - /******/ }); - /******/ } - /******/ }; - /******/ - /******/ // getDefaultExport function for compatibility with non-harmony modules - /******/ __webpack_require__.n = function(module) { - /******/ var getter = module && module.__esModule ? - /******/ function getDefault() { return module['default']; } : - /******/ function getModuleExports() { return module; }; - /******/ __webpack_require__.d(getter, 'a', getter); - /******/ return getter; - /******/ }; - /******/ - /******/ // Object.prototype.hasOwnProperty.call - /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); }; - /******/ - /******/ // __webpack_public_path__ - /******/ __webpack_require__.p = ""; - /******/ - /******/ // Load entry module and return exports - /******/ return __webpack_require__(__webpack_require__.s = 27); - /******/ }) - /************************************************************************/ - /******/ ([ - /* 0 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - -// http://dev.w3.org/csswg/css-color/ - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var HEX3 = /^#([a-f0-9]{3})$/i; - var hex3 = function hex3(value) { - var match = value.match(HEX3); - if (match) { - return [parseInt(match[1][0] + match[1][0], 16), parseInt(match[1][1] + match[1][1], 16), parseInt(match[1][2] + match[1][2], 16), null]; - } - return false; - }; - - var HEX6 = /^#([a-f0-9]{6})$/i; - var hex6 = function hex6(value) { - var match = value.match(HEX6); - if (match) { - return [parseInt(match[1].substring(0, 2), 16), parseInt(match[1].substring(2, 4), 16), parseInt(match[1].substring(4, 6), 16), null]; - } - return false; - }; - - var RGB = /^rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*\)$/; - var rgb = function rgb(value) { - var match = value.match(RGB); - if (match) { - return [Number(match[1]), Number(match[2]), Number(match[3]), null]; - } - return false; - }; - - var RGBA = /^rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d?\.?\d+)\s*\)$/; - var rgba = function rgba(value) { - var match = value.match(RGBA); - if (match && match.length > 4) { - return [Number(match[1]), Number(match[2]), Number(match[3]), Number(match[4])]; - } - return false; - }; - - var fromArray = function fromArray(array) { - return [Math.min(array[0], 255), Math.min(array[1], 255), Math.min(array[2], 255), array.length > 3 ? array[3] : null]; - }; - - var namedColor = function namedColor(name) { - var color = NAMED_COLORS[name.toLowerCase()]; - return color ? color : false; - }; - - var Color = function () { - function Color(value) { - _classCallCheck(this, Color); - - var _ref = Array.isArray(value) ? fromArray(value) : hex3(value) || rgb(value) || rgba(value) || namedColor(value) || hex6(value) || [0, 0, 0, null], - _ref2 = _slicedToArray(_ref, 4), - r = _ref2[0], - g = _ref2[1], - b = _ref2[2], - a = _ref2[3]; - - this.r = r; - this.g = g; - this.b = b; - this.a = a; - } - - _createClass(Color, [{ - key: 'isTransparent', - value: function isTransparent() { - return this.a === 0; - } - }, { - key: 'toString', - value: function toString() { - return this.a !== null && this.a !== 1 ? 'rgba(' + this.r + ',' + this.g + ',' + this.b + ',' + this.a + ')' : 'rgb(' + this.r + ',' + this.g + ',' + this.b + ')'; - } - }]); - - return Color; - }(); - - exports.default = Color; - - - var NAMED_COLORS = { - transparent: [0, 0, 0, 0], - aliceblue: [240, 248, 255, null], - antiquewhite: [250, 235, 215, null], - aqua: [0, 255, 255, null], - aquamarine: [127, 255, 212, null], - azure: [240, 255, 255, null], - beige: [245, 245, 220, null], - bisque: [255, 228, 196, null], - black: [0, 0, 0, null], - blanchedalmond: [255, 235, 205, null], - blue: [0, 0, 255, null], - blueviolet: [138, 43, 226, null], - brown: [165, 42, 42, null], - burlywood: [222, 184, 135, null], - cadetblue: [95, 158, 160, null], - chartreuse: [127, 255, 0, null], - chocolate: [210, 105, 30, null], - coral: [255, 127, 80, null], - cornflowerblue: [100, 149, 237, null], - cornsilk: [255, 248, 220, null], - crimson: [220, 20, 60, null], - cyan: [0, 255, 255, null], - darkblue: [0, 0, 139, null], - darkcyan: [0, 139, 139, null], - darkgoldenrod: [184, 134, 11, null], - darkgray: [169, 169, 169, null], - darkgreen: [0, 100, 0, null], - darkgrey: [169, 169, 169, null], - darkkhaki: [189, 183, 107, null], - darkmagenta: [139, 0, 139, null], - darkolivegreen: [85, 107, 47, null], - darkorange: [255, 140, 0, null], - darkorchid: [153, 50, 204, null], - darkred: [139, 0, 0, null], - darksalmon: [233, 150, 122, null], - darkseagreen: [143, 188, 143, null], - darkslateblue: [72, 61, 139, null], - darkslategray: [47, 79, 79, null], - darkslategrey: [47, 79, 79, null], - darkturquoise: [0, 206, 209, null], - darkviolet: [148, 0, 211, null], - deeppink: [255, 20, 147, null], - deepskyblue: [0, 191, 255, null], - dimgray: [105, 105, 105, null], - dimgrey: [105, 105, 105, null], - dodgerblue: [30, 144, 255, null], - firebrick: [178, 34, 34, null], - floralwhite: [255, 250, 240, null], - forestgreen: [34, 139, 34, null], - fuchsia: [255, 0, 255, null], - gainsboro: [220, 220, 220, null], - ghostwhite: [248, 248, 255, null], - gold: [255, 215, 0, null], - goldenrod: [218, 165, 32, null], - gray: [128, 128, 128, null], - green: [0, 128, 0, null], - greenyellow: [173, 255, 47, null], - grey: [128, 128, 128, null], - honeydew: [240, 255, 240, null], - hotpink: [255, 105, 180, null], - indianred: [205, 92, 92, null], - indigo: [75, 0, 130, null], - ivory: [255, 255, 240, null], - khaki: [240, 230, 140, null], - lavender: [230, 230, 250, null], - lavenderblush: [255, 240, 245, null], - lawngreen: [124, 252, 0, null], - lemonchiffon: [255, 250, 205, null], - lightblue: [173, 216, 230, null], - lightcoral: [240, 128, 128, null], - lightcyan: [224, 255, 255, null], - lightgoldenrodyellow: [250, 250, 210, null], - lightgray: [211, 211, 211, null], - lightgreen: [144, 238, 144, null], - lightgrey: [211, 211, 211, null], - lightpink: [255, 182, 193, null], - lightsalmon: [255, 160, 122, null], - lightseagreen: [32, 178, 170, null], - lightskyblue: [135, 206, 250, null], - lightslategray: [119, 136, 153, null], - lightslategrey: [119, 136, 153, null], - lightsteelblue: [176, 196, 222, null], - lightyellow: [255, 255, 224, null], - lime: [0, 255, 0, null], - limegreen: [50, 205, 50, null], - linen: [250, 240, 230, null], - magenta: [255, 0, 255, null], - maroon: [128, 0, 0, null], - mediumaquamarine: [102, 205, 170, null], - mediumblue: [0, 0, 205, null], - mediumorchid: [186, 85, 211, null], - mediumpurple: [147, 112, 219, null], - mediumseagreen: [60, 179, 113, null], - mediumslateblue: [123, 104, 238, null], - mediumspringgreen: [0, 250, 154, null], - mediumturquoise: [72, 209, 204, null], - mediumvioletred: [199, 21, 133, null], - midnightblue: [25, 25, 112, null], - mintcream: [245, 255, 250, null], - mistyrose: [255, 228, 225, null], - moccasin: [255, 228, 181, null], - navajowhite: [255, 222, 173, null], - navy: [0, 0, 128, null], - oldlace: [253, 245, 230, null], - olive: [128, 128, 0, null], - olivedrab: [107, 142, 35, null], - orange: [255, 165, 0, null], - orangered: [255, 69, 0, null], - orchid: [218, 112, 214, null], - palegoldenrod: [238, 232, 170, null], - palegreen: [152, 251, 152, null], - paleturquoise: [175, 238, 238, null], - palevioletred: [219, 112, 147, null], - papayawhip: [255, 239, 213, null], - peachpuff: [255, 218, 185, null], - peru: [205, 133, 63, null], - pink: [255, 192, 203, null], - plum: [221, 160, 221, null], - powderblue: [176, 224, 230, null], - purple: [128, 0, 128, null], - rebeccapurple: [102, 51, 153, null], - red: [255, 0, 0, null], - rosybrown: [188, 143, 143, null], - royalblue: [65, 105, 225, null], - saddlebrown: [139, 69, 19, null], - salmon: [250, 128, 114, null], - sandybrown: [244, 164, 96, null], - seagreen: [46, 139, 87, null], - seashell: [255, 245, 238, null], - sienna: [160, 82, 45, null], - silver: [192, 192, 192, null], - skyblue: [135, 206, 235, null], - slateblue: [106, 90, 205, null], - slategray: [112, 128, 144, null], - slategrey: [112, 128, 144, null], - snow: [255, 250, 250, null], - springgreen: [0, 255, 127, null], - steelblue: [70, 130, 180, null], - tan: [210, 180, 140, null], - teal: [0, 128, 128, null], - thistle: [216, 191, 216, null], - tomato: [255, 99, 71, null], - turquoise: [64, 224, 208, null], - violet: [238, 130, 238, null], - wheat: [245, 222, 179, null], - white: [255, 255, 255, null], - whitesmoke: [245, 245, 245, null], - yellow: [255, 255, 0, null], - yellowgreen: [154, 205, 50, null] - }; - - var TRANSPARENT = exports.TRANSPARENT = new Color([0, 0, 0, 0]); - - /***/ }), - /* 1 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.calculateLengthFromValueWithUnit = exports.LENGTH_TYPE = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var LENGTH_WITH_UNIT = /([\d.]+)(px|r?em|%)/i; - - var LENGTH_TYPE = exports.LENGTH_TYPE = { - PX: 0, - PERCENTAGE: 1 - }; - - var Length = function () { - function Length(value) { - _classCallCheck(this, Length); - - this.type = value.substr(value.length - 1) === '%' ? LENGTH_TYPE.PERCENTAGE : LENGTH_TYPE.PX; - var parsedValue = parseFloat(value); - if (true && isNaN(parsedValue)) { - console.error('Invalid value given for Length: "' + value + '"'); - } - this.value = isNaN(parsedValue) ? 0 : parsedValue; - } - - _createClass(Length, [{ - key: 'isPercentage', - value: function isPercentage() { - return this.type === LENGTH_TYPE.PERCENTAGE; - } - }, { - key: 'getAbsoluteValue', - value: function getAbsoluteValue(parentLength) { - return this.isPercentage() ? parentLength * (this.value / 100) : this.value; - } - }], [{ - key: 'create', - value: function create(v) { - return new Length(v); - } - }]); - - return Length; - }(); - - exports.default = Length; - - - var getRootFontSize = function getRootFontSize(container) { - var parent = container.parent; - return parent ? getRootFontSize(parent) : parseFloat(container.style.font.fontSize); - }; - - var calculateLengthFromValueWithUnit = exports.calculateLengthFromValueWithUnit = function calculateLengthFromValueWithUnit(container, value, unit) { - switch (unit) { - case 'px': - case '%': - return new Length(value + unit); - case 'em': - case 'rem': - var length = new Length(value); - length.value *= unit === 'em' ? parseFloat(container.style.font.fontSize) : getRootFontSize(container); - return length; - default: - // TODO: handle correctly if unknown unit is used - return new Length('0'); - } - }; - - /***/ }), - /* 2 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBoundCurves = exports.calculatePaddingBoxPath = exports.calculateBorderBoxPath = exports.parsePathForBorder = exports.parseDocumentSize = exports.calculateContentBox = exports.calculatePaddingBox = exports.parseBounds = exports.Bounds = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - var _BezierCurve = __webpack_require__(32); - - var _BezierCurve2 = _interopRequireDefault(_BezierCurve); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var TOP = 0; - var RIGHT = 1; - var BOTTOM = 2; - var LEFT = 3; - - var H = 0; - var V = 1; - - var Bounds = exports.Bounds = function () { - function Bounds(x, y, w, h) { - _classCallCheck(this, Bounds); - - this.left = x; - this.top = y; - this.width = w; - this.height = h; - } - - _createClass(Bounds, null, [{ - key: 'fromClientRect', - value: function fromClientRect(clientRect, scrollX, scrollY) { - return new Bounds(clientRect.left + scrollX, clientRect.top + scrollY, clientRect.width, clientRect.height); - } - }]); - - return Bounds; - }(); - - var parseBounds = exports.parseBounds = function parseBounds(node, scrollX, scrollY) { - return Bounds.fromClientRect(node.getBoundingClientRect(), scrollX, scrollY); - }; - - var calculatePaddingBox = exports.calculatePaddingBox = function calculatePaddingBox(bounds, borders) { - return new Bounds(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth)); - }; - - var calculateContentBox = exports.calculateContentBox = function calculateContentBox(bounds, padding, borders) { - // TODO support percentage paddings - var paddingTop = padding[TOP].value; - var paddingRight = padding[RIGHT].value; - var paddingBottom = padding[BOTTOM].value; - var paddingLeft = padding[LEFT].value; - - return new Bounds(bounds.left + paddingLeft + borders[LEFT].borderWidth, bounds.top + paddingTop + borders[TOP].borderWidth, bounds.width - (borders[RIGHT].borderWidth + borders[LEFT].borderWidth + paddingLeft + paddingRight), bounds.height - (borders[TOP].borderWidth + borders[BOTTOM].borderWidth + paddingTop + paddingBottom)); - }; - - var parseDocumentSize = exports.parseDocumentSize = function parseDocumentSize(document) { - var body = document.body; - var documentElement = document.documentElement; - - if (!body || !documentElement) { - throw new Error( true ? '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 parsePathForBorder = exports.parsePathForBorder = function parsePathForBorder(curves, borderSide) { - switch (borderSide) { - case TOP: - return createPathFromCurves(curves.topLeftOuter, curves.topLeftInner, curves.topRightOuter, curves.topRightInner); - case RIGHT: - return createPathFromCurves(curves.topRightOuter, curves.topRightInner, curves.bottomRightOuter, curves.bottomRightInner); - case BOTTOM: - return createPathFromCurves(curves.bottomRightOuter, curves.bottomRightInner, curves.bottomLeftOuter, curves.bottomLeftInner); - case LEFT: - default: - return createPathFromCurves(curves.bottomLeftOuter, curves.bottomLeftInner, curves.topLeftOuter, curves.topLeftInner); - } - }; - - var createPathFromCurves = function createPathFromCurves(outer1, inner1, outer2, inner2) { - var path = []; - if (outer1 instanceof _BezierCurve2.default) { - path.push(outer1.subdivide(0.5, false)); - } else { - path.push(outer1); - } - - if (outer2 instanceof _BezierCurve2.default) { - path.push(outer2.subdivide(0.5, true)); - } else { - path.push(outer2); - } - - if (inner2 instanceof _BezierCurve2.default) { - path.push(inner2.subdivide(0.5, true).reverse()); - } else { - path.push(inner2); - } - - if (inner1 instanceof _BezierCurve2.default) { - path.push(inner1.subdivide(0.5, false).reverse()); - } else { - path.push(inner1); - } - - return path; - }; - - var calculateBorderBoxPath = exports.calculateBorderBoxPath = function calculateBorderBoxPath(curves) { - return [curves.topLeftOuter, curves.topRightOuter, curves.bottomRightOuter, curves.bottomLeftOuter]; - }; - - var calculatePaddingBoxPath = exports.calculatePaddingBoxPath = function calculatePaddingBoxPath(curves) { - return [curves.topLeftInner, curves.topRightInner, curves.bottomRightInner, curves.bottomLeftInner]; - }; - - var parseBoundCurves = exports.parseBoundCurves = function parseBoundCurves(bounds, borders, borderRadius) { - var tlh = borderRadius[CORNER.TOP_LEFT][H].getAbsoluteValue(bounds.width); - var tlv = borderRadius[CORNER.TOP_LEFT][V].getAbsoluteValue(bounds.height); - var trh = borderRadius[CORNER.TOP_RIGHT][H].getAbsoluteValue(bounds.width); - var trv = borderRadius[CORNER.TOP_RIGHT][V].getAbsoluteValue(bounds.height); - var brh = borderRadius[CORNER.BOTTOM_RIGHT][H].getAbsoluteValue(bounds.width); - var brv = borderRadius[CORNER.BOTTOM_RIGHT][V].getAbsoluteValue(bounds.height); - var blh = borderRadius[CORNER.BOTTOM_LEFT][H].getAbsoluteValue(bounds.width); - var blv = borderRadius[CORNER.BOTTOM_LEFT][V].getAbsoluteValue(bounds.height); - - var factors = []; - factors.push((tlh + trh) / bounds.width); - factors.push((blh + brh) / bounds.width); - factors.push((tlv + blv) / bounds.height); - factors.push((trv + brv) / bounds.height); - var maxFactor = Math.max.apply(Math, factors); - - if (maxFactor > 1) { - tlh /= maxFactor; - tlv /= maxFactor; - trh /= maxFactor; - trv /= maxFactor; - brh /= maxFactor; - brv /= maxFactor; - blh /= maxFactor; - blv /= maxFactor; - } - - var topWidth = bounds.width - trh; - var rightHeight = bounds.height - brv; - var bottomWidth = bounds.width - brh; - var leftHeight = bounds.height - blv; - - return { - topLeftOuter: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left, bounds.top, tlh, tlv, CORNER.TOP_LEFT) : new _Vector2.default(bounds.left, bounds.top), - topLeftInner: tlh > 0 || tlv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth, Math.max(0, tlh - borders[LEFT].borderWidth), Math.max(0, tlv - borders[TOP].borderWidth), CORNER.TOP_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + borders[TOP].borderWidth), - topRightOuter: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + topWidth, bounds.top, trh, trv, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top), - topRightInner: trh > 0 || trv > 0 ? getCurvePoints(bounds.left + Math.min(topWidth, bounds.width + borders[LEFT].borderWidth), bounds.top + borders[TOP].borderWidth, topWidth > bounds.width + borders[LEFT].borderWidth ? 0 : trh - borders[LEFT].borderWidth, trv - borders[TOP].borderWidth, CORNER.TOP_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + borders[TOP].borderWidth), - bottomRightOuter: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + bottomWidth, bounds.top + rightHeight, brh, brv, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width, bounds.top + bounds.height), - bottomRightInner: brh > 0 || brv > 0 ? getCurvePoints(bounds.left + Math.min(bottomWidth, bounds.width - borders[LEFT].borderWidth), bounds.top + Math.min(rightHeight, bounds.height + borders[TOP].borderWidth), Math.max(0, brh - borders[RIGHT].borderWidth), brv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_RIGHT) : new _Vector2.default(bounds.left + bounds.width - borders[RIGHT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth), - bottomLeftOuter: blh > 0 || blv > 0 ? getCurvePoints(bounds.left, bounds.top + leftHeight, blh, blv, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left, bounds.top + bounds.height), - bottomLeftInner: blh > 0 || blv > 0 ? getCurvePoints(bounds.left + borders[LEFT].borderWidth, bounds.top + leftHeight, Math.max(0, blh - borders[LEFT].borderWidth), blv - borders[BOTTOM].borderWidth, CORNER.BOTTOM_LEFT) : new _Vector2.default(bounds.left + borders[LEFT].borderWidth, bounds.top + bounds.height - borders[BOTTOM].borderWidth) - }; - }; - - var CORNER = { - TOP_LEFT: 0, - TOP_RIGHT: 1, - BOTTOM_RIGHT: 2, - BOTTOM_LEFT: 3 - }; - - var getCurvePoints = function getCurvePoints(x, y, r1, r2, position) { - var kappa = 4 * ((Math.sqrt(2) - 1) / 3); - var ox = r1 * kappa; // control point offset horizontal - var oy = r2 * kappa; // control point offset vertical - var xm = x + r1; // x-middle - var ym = y + r2; // y-middle - - switch (position) { - case CORNER.TOP_LEFT: - return new _BezierCurve2.default(new _Vector2.default(x, ym), new _Vector2.default(x, ym - oy), new _Vector2.default(xm - ox, y), new _Vector2.default(xm, y)); - case CORNER.TOP_RIGHT: - return new _BezierCurve2.default(new _Vector2.default(x, y), new _Vector2.default(x + ox, y), new _Vector2.default(xm, ym - oy), new _Vector2.default(xm, ym)); - case CORNER.BOTTOM_RIGHT: - return new _BezierCurve2.default(new _Vector2.default(xm, y), new _Vector2.default(xm, y + oy), new _Vector2.default(x + ox, ym), new _Vector2.default(x, ym)); - case CORNER.BOTTOM_LEFT: - default: - return new _BezierCurve2.default(new _Vector2.default(xm, ym), new _Vector2.default(xm - ox, ym), new _Vector2.default(x, y + oy), new _Vector2.default(x, y)); - } - }; - - /***/ }), - /* 3 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Util = __webpack_require__(4); - - var _background = __webpack_require__(5); - - var _border = __webpack_require__(12); - - var _borderRadius = __webpack_require__(33); - - var _display = __webpack_require__(34); - - var _float = __webpack_require__(35); - - var _font = __webpack_require__(36); - - var _letterSpacing = __webpack_require__(37); - - var _lineBreak = __webpack_require__(38); - - var _listStyle = __webpack_require__(8); - - var _margin = __webpack_require__(39); - - var _overflow = __webpack_require__(40); - - var _overflowWrap = __webpack_require__(18); - - var _padding = __webpack_require__(17); - - var _position = __webpack_require__(19); - - var _textDecoration = __webpack_require__(11); - - var _textShadow = __webpack_require__(41); - - var _textTransform = __webpack_require__(20); - - var _transform = __webpack_require__(42); - - var _visibility = __webpack_require__(43); - - var _wordBreak = __webpack_require__(44); - - var _zIndex = __webpack_require__(45); - - var _Bounds = __webpack_require__(2); - - var _Input = __webpack_require__(21); - - var _ListItem = __webpack_require__(14); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var INPUT_TAGS = ['INPUT', 'TEXTAREA', 'SELECT']; - - var NodeContainer = function () { - function NodeContainer(node, parent, resourceLoader, index) { - var _this = this; - - _classCallCheck(this, NodeContainer); - - this.parent = parent; - this.tagName = node.tagName; - this.index = index; - this.childNodes = []; - this.listItems = []; - if (typeof node.start === 'number') { - this.listStart = node.start; - } - var defaultView = node.ownerDocument.defaultView; - var scrollX = defaultView.pageXOffset; - var scrollY = defaultView.pageYOffset; - var style = defaultView.getComputedStyle(node, null); - var display = (0, _display.parseDisplay)(style.display); - - var IS_INPUT = node.type === 'radio' || node.type === 'checkbox'; - - var position = (0, _position.parsePosition)(style.position); - - this.style = { - background: IS_INPUT ? _Input.INPUT_BACKGROUND : (0, _background.parseBackground)(style, resourceLoader), - border: IS_INPUT ? _Input.INPUT_BORDERS : (0, _border.parseBorder)(style), - borderRadius: (node instanceof defaultView.HTMLInputElement || node instanceof HTMLInputElement) && IS_INPUT ? (0, _Input.getInputBorderRadius)(node) : (0, _borderRadius.parseBorderRadius)(style), - color: IS_INPUT ? _Input.INPUT_COLOR : new _Color2.default(style.color), - display: display, - float: (0, _float.parseCSSFloat)(style.float), - font: (0, _font.parseFont)(style), - letterSpacing: (0, _letterSpacing.parseLetterSpacing)(style.letterSpacing), - listStyle: display === _display.DISPLAY.LIST_ITEM ? (0, _listStyle.parseListStyle)(style) : null, - lineBreak: (0, _lineBreak.parseLineBreak)(style.lineBreak), - margin: (0, _margin.parseMargin)(style), - opacity: parseFloat(style.opacity), - overflow: INPUT_TAGS.indexOf(node.tagName) === -1 ? (0, _overflow.parseOverflow)(style.overflow) : _overflow.OVERFLOW.HIDDEN, - overflowWrap: (0, _overflowWrap.parseOverflowWrap)(style.overflowWrap ? style.overflowWrap : style.wordWrap), - padding: (0, _padding.parsePadding)(style), - position: position, - textDecoration: (0, _textDecoration.parseTextDecoration)(style), - textShadow: (0, _textShadow.parseTextShadow)(style.textShadow), - textTransform: (0, _textTransform.parseTextTransform)(style.textTransform), - transform: (0, _transform.parseTransform)(style), - visibility: (0, _visibility.parseVisibility)(style.visibility), - wordBreak: (0, _wordBreak.parseWordBreak)(style.wordBreak), - zIndex: (0, _zIndex.parseZIndex)(position !== _position.POSITION.STATIC ? style.zIndex : 'auto') - }; - - if (this.isTransformed()) { - // getBoundingClientRect provides values post-transform, we want them without the transformation - node.style.transform = 'matrix(1,0,0,1,0,0)'; - } - - if (display === _display.DISPLAY.LIST_ITEM) { - var listOwner = (0, _ListItem.getListOwner)(this); - if (listOwner) { - var listIndex = listOwner.listItems.length; - listOwner.listItems.push(this); - this.listIndex = node.hasAttribute('value') && typeof node.value === 'number' ? node.value : listIndex === 0 ? typeof listOwner.listStart === 'number' ? listOwner.listStart : 1 : listOwner.listItems[listIndex - 1].listIndex + 1; - } - } - - // TODO move bound retrieval for all nodes to a later stage? - if (node.tagName === 'IMG') { - node.addEventListener('load', function () { - _this.bounds = (0, _Bounds.parseBounds)(node, scrollX, scrollY); - _this.curvedBounds = (0, _Bounds.parseBoundCurves)(_this.bounds, _this.style.border, _this.style.borderRadius); - }); - } - this.image = getImage(node, resourceLoader); - this.bounds = IS_INPUT ? (0, _Input.reformatInputBounds)((0, _Bounds.parseBounds)(node, scrollX, scrollY)) : (0, _Bounds.parseBounds)(node, scrollX, scrollY); - this.curvedBounds = (0, _Bounds.parseBoundCurves)(this.bounds, this.style.border, this.style.borderRadius); - - if (true) { - this.name = '' + node.tagName.toLowerCase() + (node.id ? '#' + node.id : '') + node.className.toString().split(' ').map(function (s) { - return s.length ? '.' + s : ''; - }).join(''); - } - } - - _createClass(NodeContainer, [{ - key: 'getClipPaths', - value: function getClipPaths() { - var parentClips = this.parent ? this.parent.getClipPaths() : []; - var isClipped = this.style.overflow !== _overflow.OVERFLOW.VISIBLE; - - return isClipped ? parentClips.concat([(0, _Bounds.calculatePaddingBoxPath)(this.curvedBounds)]) : parentClips; - } - }, { - key: 'isInFlow', - value: function isInFlow() { - return this.isRootElement() && !this.isFloating() && !this.isAbsolutelyPositioned(); - } - }, { - key: 'isVisible', - value: function isVisible() { - return !(0, _Util.contains)(this.style.display, _display.DISPLAY.NONE) && this.style.opacity > 0 && this.style.visibility === _visibility.VISIBILITY.VISIBLE; - } - }, { - key: 'isAbsolutelyPositioned', - value: function isAbsolutelyPositioned() { - return this.style.position !== _position.POSITION.STATIC && this.style.position !== _position.POSITION.RELATIVE; - } - }, { - key: 'isPositioned', - value: function isPositioned() { - return this.style.position !== _position.POSITION.STATIC; - } - }, { - key: 'isFloating', - value: function isFloating() { - return this.style.float !== _float.FLOAT.NONE; - } - }, { - key: 'isRootElement', - value: function isRootElement() { - return this.parent === null; - } - }, { - key: 'isTransformed', - value: function isTransformed() { - return this.style.transform !== null; - } - }, { - key: 'isPositionedWithZIndex', - value: function isPositionedWithZIndex() { - return this.isPositioned() && !this.style.zIndex.auto; - } - }, { - key: 'isInlineLevel', - value: function isInlineLevel() { - return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_FLEX) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_GRID) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_LIST_ITEM) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE); - } - }, { - key: 'isInlineBlockOrInlineTable', - value: function isInlineBlockOrInlineTable() { - return (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_BLOCK) || (0, _Util.contains)(this.style.display, _display.DISPLAY.INLINE_TABLE); - } - }]); - - return NodeContainer; - }(); - - exports.default = NodeContainer; - - - var getImage = function getImage(node, resourceLoader) { - if (node instanceof node.ownerDocument.defaultView.SVGSVGElement || node instanceof SVGSVGElement) { - var s = new XMLSerializer(); - return resourceLoader.loadImage('data:image/svg+xml,' + encodeURIComponent(s.serializeToString(node))); - } - switch (node.tagName) { - case 'IMG': - // $FlowFixMe - var img = node; - return resourceLoader.loadImage(img.currentSrc || img.src); - case 'CANVAS': - // $FlowFixMe - var canvas = node; - return resourceLoader.loadCanvas(canvas); - case 'IFRAME': - var iframeKey = node.getAttribute('data-html2canvas-internal-iframe-key'); - if (iframeKey) { - return iframeKey; - } - break; - } - - return null; - }; - - /***/ }), - /* 4 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var contains = exports.contains = function contains(bit, value) { - return (bit & value) !== 0; - }; - - var distance = exports.distance = function distance(a, b) { - return Math.sqrt(a * a + b * b); - }; - - var copyCSSStyles = exports.copyCSSStyles = function copyCSSStyles(style, target) { - // Edge does not provide value for cssText - for (var i = style.length - 1; i >= 0; i--) { - var property = style.item(i); - // Safari shows pseudoelements if content is set - if (property !== 'content') { - target.style.setProperty(property, style.getPropertyValue(property)); - } - } - return target; - }; - - var SMALL_IMAGE = exports.SMALL_IMAGE = 'data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7'; - - /***/ }), - /* 5 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBackgroundImage = exports.parseBackground = exports.calculateBackgroundRepeatPath = exports.calculateBackgroundPosition = exports.calculateBackgroungPositioningArea = exports.calculateBackgroungPaintingArea = exports.calculateGradientBackgroundSize = exports.calculateBackgroundSize = exports.BACKGROUND_ORIGIN = exports.BACKGROUND_CLIP = exports.BACKGROUND_SIZE = exports.BACKGROUND_REPEAT = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - var _Size = __webpack_require__(31); - - var _Size2 = _interopRequireDefault(_Size); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - var _Bounds = __webpack_require__(2); - - var _padding = __webpack_require__(17); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var BACKGROUND_REPEAT = exports.BACKGROUND_REPEAT = { - REPEAT: 0, - NO_REPEAT: 1, - REPEAT_X: 2, - REPEAT_Y: 3 - }; - - var BACKGROUND_SIZE = exports.BACKGROUND_SIZE = { - AUTO: 0, - CONTAIN: 1, - COVER: 2, - LENGTH: 3 - }; - - var BACKGROUND_CLIP = exports.BACKGROUND_CLIP = { - BORDER_BOX: 0, - PADDING_BOX: 1, - CONTENT_BOX: 2 - }; - - var BACKGROUND_ORIGIN = exports.BACKGROUND_ORIGIN = BACKGROUND_CLIP; - - var AUTO = 'auto'; - - var BackgroundSize = function BackgroundSize(size) { - _classCallCheck(this, BackgroundSize); - - switch (size) { - case 'contain': - this.size = BACKGROUND_SIZE.CONTAIN; - break; - case 'cover': - this.size = BACKGROUND_SIZE.COVER; - break; - case 'auto': - this.size = BACKGROUND_SIZE.AUTO; - break; - default: - this.value = new _Length2.default(size); - } - }; - - var calculateBackgroundSize = exports.calculateBackgroundSize = function calculateBackgroundSize(backgroundImage, image, bounds) { - var width = 0; - var height = 0; - var size = backgroundImage.size; - if (size[0].size === BACKGROUND_SIZE.CONTAIN || size[0].size === BACKGROUND_SIZE.COVER) { - var targetRatio = bounds.width / bounds.height; - var currentRatio = image.width / image.height; - return targetRatio < currentRatio !== (size[0].size === BACKGROUND_SIZE.COVER) ? new _Size2.default(bounds.width, bounds.width / currentRatio) : new _Size2.default(bounds.height * currentRatio, bounds.height); - } - - if (size[0].value) { - width = size[0].value.getAbsoluteValue(bounds.width); - } - - if (size[0].size === BACKGROUND_SIZE.AUTO && size[1].size === BACKGROUND_SIZE.AUTO) { - height = image.height; - } else if (size[1].size === BACKGROUND_SIZE.AUTO) { - height = width / image.width * image.height; - } else if (size[1].value) { - height = size[1].value.getAbsoluteValue(bounds.height); - } - - if (size[0].size === BACKGROUND_SIZE.AUTO) { - width = height / image.height * image.width; - } - - return new _Size2.default(width, height); - }; - - var calculateGradientBackgroundSize = exports.calculateGradientBackgroundSize = function calculateGradientBackgroundSize(backgroundImage, bounds) { - var size = backgroundImage.size; - var width = size[0].value ? size[0].value.getAbsoluteValue(bounds.width) : bounds.width; - var height = size[1].value ? size[1].value.getAbsoluteValue(bounds.height) : size[0].value ? width : bounds.height; - - return new _Size2.default(width, height); - }; - - var AUTO_SIZE = new BackgroundSize(AUTO); - - var calculateBackgroungPaintingArea = exports.calculateBackgroungPaintingArea = function calculateBackgroungPaintingArea(curves, clip) { - switch (clip) { - case BACKGROUND_CLIP.BORDER_BOX: - return (0, _Bounds.calculateBorderBoxPath)(curves); - case BACKGROUND_CLIP.PADDING_BOX: - default: - return (0, _Bounds.calculatePaddingBoxPath)(curves); - } - }; - - var calculateBackgroungPositioningArea = exports.calculateBackgroungPositioningArea = function calculateBackgroungPositioningArea(backgroundOrigin, bounds, padding, border) { - var paddingBox = (0, _Bounds.calculatePaddingBox)(bounds, border); - - switch (backgroundOrigin) { - case BACKGROUND_ORIGIN.BORDER_BOX: - return bounds; - case BACKGROUND_ORIGIN.CONTENT_BOX: - var paddingLeft = padding[_padding.PADDING_SIDES.LEFT].getAbsoluteValue(bounds.width); - var paddingRight = padding[_padding.PADDING_SIDES.RIGHT].getAbsoluteValue(bounds.width); - var paddingTop = padding[_padding.PADDING_SIDES.TOP].getAbsoluteValue(bounds.width); - var paddingBottom = padding[_padding.PADDING_SIDES.BOTTOM].getAbsoluteValue(bounds.width); - return new _Bounds.Bounds(paddingBox.left + paddingLeft, paddingBox.top + paddingTop, paddingBox.width - paddingLeft - paddingRight, paddingBox.height - paddingTop - paddingBottom); - case BACKGROUND_ORIGIN.PADDING_BOX: - default: - return paddingBox; - } - }; - - var calculateBackgroundPosition = exports.calculateBackgroundPosition = function calculateBackgroundPosition(position, size, bounds) { - return new _Vector2.default(position[0].getAbsoluteValue(bounds.width - size.width), position[1].getAbsoluteValue(bounds.height - size.height)); - }; - - var calculateBackgroundRepeatPath = exports.calculateBackgroundRepeatPath = function calculateBackgroundRepeatPath(background, position, size, backgroundPositioningArea, bounds) { - var repeat = background.repeat; - switch (repeat) { - case BACKGROUND_REPEAT.REPEAT_X: - return [new _Vector2.default(Math.round(bounds.left), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(size.height + backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(bounds.left), Math.round(size.height + backgroundPositioningArea.top + position.y))]; - case BACKGROUND_REPEAT.REPEAT_Y: - return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(bounds.height + bounds.top))]; - case BACKGROUND_REPEAT.NO_REPEAT: - return [new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x + size.width), Math.round(backgroundPositioningArea.top + position.y + size.height)), new _Vector2.default(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y + size.height))]; - default: - return [new _Vector2.default(Math.round(bounds.left), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.top)), new _Vector2.default(Math.round(bounds.left + bounds.width), Math.round(bounds.height + bounds.top)), new _Vector2.default(Math.round(bounds.left), Math.round(bounds.height + bounds.top))]; - } - }; - - var parseBackground = exports.parseBackground = function parseBackground(style, resourceLoader) { - return { - backgroundColor: new _Color2.default(style.backgroundColor), - backgroundImage: parseBackgroundImages(style, resourceLoader), - backgroundClip: parseBackgroundClip(style.backgroundClip), - backgroundOrigin: parseBackgroundOrigin(style.backgroundOrigin) - }; - }; - - var parseBackgroundClip = function parseBackgroundClip(backgroundClip) { - switch (backgroundClip) { - case 'padding-box': - return BACKGROUND_CLIP.PADDING_BOX; - case 'content-box': - return BACKGROUND_CLIP.CONTENT_BOX; - } - return BACKGROUND_CLIP.BORDER_BOX; - }; - - var parseBackgroundOrigin = function parseBackgroundOrigin(backgroundOrigin) { - switch (backgroundOrigin) { - case 'padding-box': - return BACKGROUND_ORIGIN.PADDING_BOX; - case 'content-box': - return BACKGROUND_ORIGIN.CONTENT_BOX; - } - return BACKGROUND_ORIGIN.BORDER_BOX; - }; - - var parseBackgroundRepeat = function parseBackgroundRepeat(backgroundRepeat) { - switch (backgroundRepeat.trim()) { - case 'no-repeat': - return BACKGROUND_REPEAT.NO_REPEAT; - case 'repeat-x': - case 'repeat no-repeat': - return BACKGROUND_REPEAT.REPEAT_X; - case 'repeat-y': - case 'no-repeat repeat': - return BACKGROUND_REPEAT.REPEAT_Y; - case 'repeat': - return BACKGROUND_REPEAT.REPEAT; - } - - if (true) { - console.error('Invalid background-repeat value "' + backgroundRepeat + '"'); - } - - return BACKGROUND_REPEAT.REPEAT; - }; - - var parseBackgroundImages = function parseBackgroundImages(style, resourceLoader) { - var sources = parseBackgroundImage(style.backgroundImage).map(function (backgroundImage) { - if (backgroundImage.method === 'url') { - var key = resourceLoader.loadImage(backgroundImage.args[0]); - backgroundImage.args = key ? [key] : []; - } - return backgroundImage; - }); - var positions = style.backgroundPosition.split(','); - var repeats = style.backgroundRepeat.split(','); - var sizes = style.backgroundSize.split(','); - - return sources.map(function (source, index) { - var size = (sizes[index] || AUTO).trim().split(' ').map(parseBackgroundSize); - var position = (positions[index] || AUTO).trim().split(' ').map(parseBackgoundPosition); - - return { - source: source, - repeat: parseBackgroundRepeat(typeof repeats[index] === 'string' ? repeats[index] : repeats[0]), - size: size.length < 2 ? [size[0], AUTO_SIZE] : [size[0], size[1]], - position: position.length < 2 ? [position[0], position[0]] : [position[0], position[1]] - }; - }); - }; - - var parseBackgroundSize = function parseBackgroundSize(size) { - return size === 'auto' ? AUTO_SIZE : new BackgroundSize(size); - }; - - var parseBackgoundPosition = function parseBackgoundPosition(position) { - switch (position) { - case 'bottom': - case 'right': - return new _Length2.default('100%'); - case 'left': - case 'top': - return new _Length2.default('0%'); - case 'auto': - return new _Length2.default('0'); - } - return new _Length2.default(position); - }; - - var parseBackgroundImage = exports.parseBackgroundImage = function parseBackgroundImage(image) { - var whitespace = /^\s$/; - var results = []; - - var args = []; - var method = ''; - var quote = null; - var definition = ''; - var mode = 0; - var numParen = 0; - - var appendResult = function appendResult() { - var prefix = ''; - if (method) { - if (definition.substr(0, 1) === '"') { - definition = definition.substr(1, definition.length - 2); - } - - if (definition) { - args.push(definition.trim()); - } - - var prefix_i = method.indexOf('-', 1) + 1; - if (method.substr(0, 1) === '-' && prefix_i > 0) { - prefix = method.substr(0, prefix_i).toLowerCase(); - method = method.substr(prefix_i); - } - method = method.toLowerCase(); - if (method !== 'none') { - results.push({ - prefix: prefix, - method: method, - args: args - }); - } - } - args = []; - method = definition = ''; - }; - - image.split('').forEach(function (c) { - if (mode === 0 && whitespace.test(c)) { - return; - } - switch (c) { - case '"': - if (!quote) { - quote = c; - } else if (quote === c) { - quote = null; - } - break; - case '(': - if (quote) { - break; - } else if (mode === 0) { - mode = 1; - return; - } else { - numParen++; - } - break; - case ')': - if (quote) { - break; - } else if (mode === 1) { - if (numParen === 0) { - mode = 0; - appendResult(); - return; - } else { - numParen--; - } - } - break; - - case ',': - if (quote) { - break; - } else if (mode === 0) { - appendResult(); - return; - } else if (mode === 1) { - if (numParen === 0 && !method.match(/^url$/i)) { - args.push(definition.trim()); - definition = ''; - return; - } - } - break; - } - - if (mode === 0) { - method += c; - } else { - definition += c; - } - }); - - appendResult(); - return results; - }; - - /***/ }), - /* 6 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var PATH = exports.PATH = { - VECTOR: 0, - BEZIER_CURVE: 1, - CIRCLE: 2 - }; - - /***/ }), - /* 7 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _Path = __webpack_require__(6); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Vector = function Vector(x, y) { - _classCallCheck(this, Vector); - - this.type = _Path.PATH.VECTOR; - this.x = x; - this.y = y; - if (true) { - if (isNaN(x)) { - console.error('Invalid x value given for Vector'); - } - if (isNaN(y)) { - console.error('Invalid y value given for Vector'); - } - } - }; - - exports.default = Vector; - - /***/ }), - /* 8 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseListStyle = exports.parseListStyleType = exports.LIST_STYLE_TYPE = exports.LIST_STYLE_POSITION = undefined; - - var _background = __webpack_require__(5); - - var LIST_STYLE_POSITION = exports.LIST_STYLE_POSITION = { - INSIDE: 0, - OUTSIDE: 1 - }; - - var LIST_STYLE_TYPE = exports.LIST_STYLE_TYPE = { - NONE: -1, - DISC: 0, - CIRCLE: 1, - SQUARE: 2, - DECIMAL: 3, - CJK_DECIMAL: 4, - DECIMAL_LEADING_ZERO: 5, - LOWER_ROMAN: 6, - UPPER_ROMAN: 7, - LOWER_GREEK: 8, - LOWER_ALPHA: 9, - UPPER_ALPHA: 10, - ARABIC_INDIC: 11, - ARMENIAN: 12, - BENGALI: 13, - CAMBODIAN: 14, - CJK_EARTHLY_BRANCH: 15, - CJK_HEAVENLY_STEM: 16, - CJK_IDEOGRAPHIC: 17, - DEVANAGARI: 18, - ETHIOPIC_NUMERIC: 19, - GEORGIAN: 20, - GUJARATI: 21, - GURMUKHI: 22, - HEBREW: 22, - HIRAGANA: 23, - HIRAGANA_IROHA: 24, - JAPANESE_FORMAL: 25, - JAPANESE_INFORMAL: 26, - KANNADA: 27, - KATAKANA: 28, - KATAKANA_IROHA: 29, - KHMER: 30, - KOREAN_HANGUL_FORMAL: 31, - KOREAN_HANJA_FORMAL: 32, - KOREAN_HANJA_INFORMAL: 33, - LAO: 34, - LOWER_ARMENIAN: 35, - MALAYALAM: 36, - MONGOLIAN: 37, - MYANMAR: 38, - ORIYA: 39, - PERSIAN: 40, - SIMP_CHINESE_FORMAL: 41, - SIMP_CHINESE_INFORMAL: 42, - TAMIL: 43, - TELUGU: 44, - THAI: 45, - TIBETAN: 46, - TRAD_CHINESE_FORMAL: 47, - TRAD_CHINESE_INFORMAL: 48, - UPPER_ARMENIAN: 49, - DISCLOSURE_OPEN: 50, - DISCLOSURE_CLOSED: 51 - }; - - var parseListStyleType = exports.parseListStyleType = function parseListStyleType(type) { - switch (type) { - case 'disc': - return LIST_STYLE_TYPE.DISC; - case 'circle': - return LIST_STYLE_TYPE.CIRCLE; - case 'square': - return LIST_STYLE_TYPE.SQUARE; - case 'decimal': - return LIST_STYLE_TYPE.DECIMAL; - case 'cjk-decimal': - return LIST_STYLE_TYPE.CJK_DECIMAL; - case 'decimal-leading-zero': - return LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO; - case 'lower-roman': - return LIST_STYLE_TYPE.LOWER_ROMAN; - case 'upper-roman': - return LIST_STYLE_TYPE.UPPER_ROMAN; - case 'lower-greek': - return LIST_STYLE_TYPE.LOWER_GREEK; - case 'lower-alpha': - return LIST_STYLE_TYPE.LOWER_ALPHA; - case 'upper-alpha': - return LIST_STYLE_TYPE.UPPER_ALPHA; - case 'arabic-indic': - return LIST_STYLE_TYPE.ARABIC_INDIC; - case 'armenian': - return LIST_STYLE_TYPE.ARMENIAN; - case 'bengali': - return LIST_STYLE_TYPE.BENGALI; - case 'cambodian': - return LIST_STYLE_TYPE.CAMBODIAN; - case 'cjk-earthly-branch': - return LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH; - case 'cjk-heavenly-stem': - return LIST_STYLE_TYPE.CJK_HEAVENLY_STEM; - case 'cjk-ideographic': - return LIST_STYLE_TYPE.CJK_IDEOGRAPHIC; - case 'devanagari': - return LIST_STYLE_TYPE.DEVANAGARI; - case 'ethiopic-numeric': - return LIST_STYLE_TYPE.ETHIOPIC_NUMERIC; - case 'georgian': - return LIST_STYLE_TYPE.GEORGIAN; - case 'gujarati': - return LIST_STYLE_TYPE.GUJARATI; - case 'gurmukhi': - return LIST_STYLE_TYPE.GURMUKHI; - case 'hebrew': - return LIST_STYLE_TYPE.HEBREW; - case 'hiragana': - return LIST_STYLE_TYPE.HIRAGANA; - case 'hiragana-iroha': - return LIST_STYLE_TYPE.HIRAGANA_IROHA; - case 'japanese-formal': - return LIST_STYLE_TYPE.JAPANESE_FORMAL; - case 'japanese-informal': - return LIST_STYLE_TYPE.JAPANESE_INFORMAL; - case 'kannada': - return LIST_STYLE_TYPE.KANNADA; - case 'katakana': - return LIST_STYLE_TYPE.KATAKANA; - case 'katakana-iroha': - return LIST_STYLE_TYPE.KATAKANA_IROHA; - case 'khmer': - return LIST_STYLE_TYPE.KHMER; - case 'korean-hangul-formal': - return LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL; - case 'korean-hanja-formal': - return LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL; - case 'korean-hanja-informal': - return LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL; - case 'lao': - return LIST_STYLE_TYPE.LAO; - case 'lower-armenian': - return LIST_STYLE_TYPE.LOWER_ARMENIAN; - case 'malayalam': - return LIST_STYLE_TYPE.MALAYALAM; - case 'mongolian': - return LIST_STYLE_TYPE.MONGOLIAN; - case 'myanmar': - return LIST_STYLE_TYPE.MYANMAR; - case 'oriya': - return LIST_STYLE_TYPE.ORIYA; - case 'persian': - return LIST_STYLE_TYPE.PERSIAN; - case 'simp-chinese-formal': - return LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL; - case 'simp-chinese-informal': - return LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL; - case 'tamil': - return LIST_STYLE_TYPE.TAMIL; - case 'telugu': - return LIST_STYLE_TYPE.TELUGU; - case 'thai': - return LIST_STYLE_TYPE.THAI; - case 'tibetan': - return LIST_STYLE_TYPE.TIBETAN; - case 'trad-chinese-formal': - return LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL; - case 'trad-chinese-informal': - return LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL; - case 'upper-armenian': - return LIST_STYLE_TYPE.UPPER_ARMENIAN; - case 'disclosure-open': - return LIST_STYLE_TYPE.DISCLOSURE_OPEN; - case 'disclosure-closed': - return LIST_STYLE_TYPE.DISCLOSURE_CLOSED; - case 'none': - default: - return LIST_STYLE_TYPE.NONE; - } - }; - - var parseListStyle = exports.parseListStyle = function parseListStyle(style) { - var listStyleImage = (0, _background.parseBackgroundImage)(style.getPropertyValue('list-style-image')); - return { - listStyleType: parseListStyleType(style.getPropertyValue('list-style-type')), - listStyleImage: listStyleImage.length ? listStyleImage[0] : null, - listStylePosition: parseListStylePosition(style.getPropertyValue('list-style-position')) - }; - }; - - var parseListStylePosition = function parseListStylePosition(position) { - switch (position) { - case 'inside': - return LIST_STYLE_POSITION.INSIDE; - case 'outside': - default: - return LIST_STYLE_POSITION.OUTSIDE; - } - }; - - /***/ }), - /* 9 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _textTransform = __webpack_require__(20); - - var _TextBounds = __webpack_require__(22); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var TextContainer = function () { - function TextContainer(text, parent, bounds) { - _classCallCheck(this, TextContainer); - - this.text = text; - this.parent = parent; - this.bounds = bounds; - } - - _createClass(TextContainer, null, [{ - key: 'fromTextNode', - value: function fromTextNode(node, parent) { - var text = transform(node.data, parent.style.textTransform); - return new TextContainer(text, parent, (0, _TextBounds.parseTextBounds)(text, parent, node)); - } - }]); - - return TextContainer; - }(); - - exports.default = TextContainer; - - - var CAPITALIZE = /(^|\s|:|-|\(|\))([a-z])/g; - - var transform = function transform(text, _transform) { - switch (_transform) { - case _textTransform.TEXT_TRANSFORM.LOWERCASE: - return text.toLowerCase(); - case _textTransform.TEXT_TRANSFORM.CAPITALIZE: - return text.replace(CAPITALIZE, capitalize); - case _textTransform.TEXT_TRANSFORM.UPPERCASE: - return text.toUpperCase(); - default: - return text; - } - }; - - function capitalize(m, p1, p2) { - if (m.length > 0) { - return p1 + p2.toUpperCase(); - } - - return m; - } - - /***/ }), - /* 10 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _ForeignObjectRenderer = __webpack_require__(23); - - var testRangeBounds = function testRangeBounds(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; - } - } - } - - return false; - }; - -// iOS 10.3 taints canvas with base64 images unless crossOrigin = 'anonymous' - var testBase64 = function testBase64(document, src) { - var img = new Image(); - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - - return new Promise(function (resolve) { - // Single pixel base64 image renders fine on iOS 10.3??? - img.src = src; - - var onload = function onload() { - try { - ctx.drawImage(img, 0, 0); - canvas.toDataURL(); - } catch (e) { - return resolve(false); - } - - return resolve(true); - }; - - img.onload = onload; - img.onerror = function () { - return resolve(false); - }; - - if (img.complete === true) { - setTimeout(function () { - onload(); - }, 500); - } - }); - }; - - var testCORS = function testCORS() { - return typeof new Image().crossOrigin !== 'undefined'; - }; - - var testResponseType = function testResponseType() { - return typeof new XMLHttpRequest().responseType === 'string'; - }; - - var testSVG = function testSVG(document) { - var img = new Image(); - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - img.src = 'data:image/svg+xml,'; - - try { - ctx.drawImage(img, 0, 0); - canvas.toDataURL(); - } catch (e) { - return false; - } - return true; - }; - - var isGreenPixel = function isGreenPixel(data) { - return data[0] === 0 && data[1] === 255 && data[2] === 0 && data[3] === 255; - }; - - var testForeignObject = function testForeignObject(document) { - var canvas = document.createElement('canvas'); - var size = 100; - canvas.width = size; - canvas.height = size; - var ctx = canvas.getContext('2d'); - 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 = (0, _ForeignObjectRenderer.createForeignObjectSVG)(size, size, 0, 0, img); - ctx.fillStyle = 'red'; - ctx.fillRect(0, 0, size, size); - - return (0, _ForeignObjectRenderer.loadSerializedSVG)(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) ? (0, _ForeignObjectRenderer.loadSerializedSVG)((0, _ForeignObjectRenderer.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); - }).catch(function (e) { - return false; - }); - }; - - var FEATURES = { - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_RANGE_BOUNDS() { - 'use strict'; - - var value = testRangeBounds(document); - Object.defineProperty(FEATURES, 'SUPPORT_RANGE_BOUNDS', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_SVG_DRAWING() { - 'use strict'; - - var value = testSVG(document); - Object.defineProperty(FEATURES, 'SUPPORT_SVG_DRAWING', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_BASE64_DRAWING() { - 'use strict'; - - return function (src) { - var _value = testBase64(document, src); - Object.defineProperty(FEATURES, 'SUPPORT_BASE64_DRAWING', { value: function value() { - return _value; - } }); - return _value; - }; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_FOREIGNOBJECT_DRAWING() { - 'use strict'; - - 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; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_CORS_IMAGES() { - 'use strict'; - - var value = testCORS(); - Object.defineProperty(FEATURES, 'SUPPORT_CORS_IMAGES', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_RESPONSE_TYPE() { - 'use strict'; - - var value = testResponseType(); - Object.defineProperty(FEATURES, 'SUPPORT_RESPONSE_TYPE', { value: value }); - return value; - }, - // $FlowFixMe - get/set properties not yet supported - get SUPPORT_CORS_XHR() { - 'use strict'; - - var value = 'withCredentials' in new XMLHttpRequest(); - Object.defineProperty(FEATURES, 'SUPPORT_CORS_XHR', { value: value }); - return value; - } - }; - - exports.default = FEATURES; - - /***/ }), - /* 11 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTextDecoration = exports.TEXT_DECORATION_LINE = exports.TEXT_DECORATION = exports.TEXT_DECORATION_STYLE = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var TEXT_DECORATION_STYLE = exports.TEXT_DECORATION_STYLE = { - SOLID: 0, - DOUBLE: 1, - DOTTED: 2, - DASHED: 3, - WAVY: 4 - }; - - var TEXT_DECORATION = exports.TEXT_DECORATION = { - NONE: null - }; - - var TEXT_DECORATION_LINE = exports.TEXT_DECORATION_LINE = { - UNDERLINE: 1, - OVERLINE: 2, - LINE_THROUGH: 3, - BLINK: 4 - }; - - var parseLine = function parseLine(line) { - switch (line) { - case 'underline': - return TEXT_DECORATION_LINE.UNDERLINE; - case 'overline': - return TEXT_DECORATION_LINE.OVERLINE; - case 'line-through': - return TEXT_DECORATION_LINE.LINE_THROUGH; - } - return TEXT_DECORATION_LINE.BLINK; - }; - - var parseTextDecorationLine = function parseTextDecorationLine(line) { - if (line === 'none') { - return null; - } - - return line.split(' ').map(parseLine); - }; - - var parseTextDecorationStyle = function parseTextDecorationStyle(style) { - switch (style) { - case 'double': - return TEXT_DECORATION_STYLE.DOUBLE; - case 'dotted': - return TEXT_DECORATION_STYLE.DOTTED; - case 'dashed': - return TEXT_DECORATION_STYLE.DASHED; - case 'wavy': - return TEXT_DECORATION_STYLE.WAVY; - } - return TEXT_DECORATION_STYLE.SOLID; - }; - - var parseTextDecoration = exports.parseTextDecoration = function parseTextDecoration(style) { - var textDecorationLine = parseTextDecorationLine(style.textDecorationLine ? style.textDecorationLine : style.textDecoration); - if (textDecorationLine === null) { - return TEXT_DECORATION.NONE; - } - - var textDecorationColor = style.textDecorationColor ? new _Color2.default(style.textDecorationColor) : null; - var textDecorationStyle = parseTextDecorationStyle(style.textDecorationStyle); - - return { - textDecorationLine: textDecorationLine, - textDecorationColor: textDecorationColor, - textDecorationStyle: textDecorationStyle - }; - }; - - /***/ }), - /* 12 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBorder = exports.BORDER_SIDES = exports.BORDER_STYLE = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var BORDER_STYLE = exports.BORDER_STYLE = { - NONE: 0, - SOLID: 1 - }; - - var BORDER_SIDES = exports.BORDER_SIDES = { - TOP: 0, - RIGHT: 1, - BOTTOM: 2, - LEFT: 3 - }; - - var SIDES = Object.keys(BORDER_SIDES).map(function (s) { - return s.toLowerCase(); - }); - - var parseBorderStyle = function parseBorderStyle(style) { - switch (style) { - case 'none': - return BORDER_STYLE.NONE; - } - return BORDER_STYLE.SOLID; - }; - - var parseBorder = exports.parseBorder = function parseBorder(style) { - return SIDES.map(function (side) { - var borderColor = new _Color2.default(style.getPropertyValue('border-' + side + '-color')); - var borderStyle = parseBorderStyle(style.getPropertyValue('border-' + side + '-style')); - var borderWidth = parseFloat(style.getPropertyValue('border-' + side + '-width')); - return { - borderColor: borderColor, - borderStyle: borderStyle, - borderWidth: isNaN(borderWidth) ? 0 : borderWidth - }; - }); - }; - - /***/ }), - /* 13 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var toCodePoints = exports.toCodePoints = function toCodePoints(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); - } - } - return codePoints; - }; - - var fromCodePoint = exports.fromCodePoint = function fromCodePoint() { - if (String.fromCodePoint) { - return String.fromCodePoint.apply(String, arguments); - } - - var length = arguments.length; - if (!length) { - return ''; - } - - var codeUnits = []; - - var index = -1; - var result = ''; - while (++index < length) { - var codePoint = arguments.length <= index ? undefined : arguments[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; - }; - - var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; - -// Use a lookup table to find the index. - var lookup = typeof Uint8Array === 'undefined' ? [] : new Uint8Array(256); - for (var i = 0; i < chars.length; i++) { - lookup[chars.charCodeAt(i)] = i; - } - - var decode = exports.decode = function decode(base64) { - var bufferLength = base64.length * 0.75, - len = base64.length, - i = void 0, - p = 0, - encoded1 = void 0, - encoded2 = void 0, - encoded3 = void 0, - encoded4 = void 0; - - 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[base64.charCodeAt(i)]; - encoded2 = lookup[base64.charCodeAt(i + 1)]; - encoded3 = lookup[base64.charCodeAt(i + 2)]; - encoded4 = lookup[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 = exports.polyUint16Array = function polyUint16Array(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 polyUint32Array = exports.polyUint32Array = function polyUint32Array(buffer) { - var length = buffer.length; - var bytes = []; - for (var _i2 = 0; _i2 < length; _i2 += 4) { - bytes.push(buffer[_i2 + 3] << 24 | buffer[_i2 + 2] << 16 | buffer[_i2 + 1] << 8 | buffer[_i2]); - } - return bytes; - }; - - /***/ }), - /* 14 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.createCounterText = exports.inlineListItemElement = exports.getListOwner = undefined; - - var _Util = __webpack_require__(4); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _listStyle = __webpack_require__(8); - - var _Unicode = __webpack_require__(24); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - -// Margin between the enumeration and the list item content - var MARGIN_RIGHT = 7; - - var ancestorTypes = ['OL', 'UL', 'MENU']; - - var getListOwner = exports.getListOwner = function getListOwner(container) { - var parent = container.parent; - if (!parent) { - return null; - } - - do { - var isAncestor = ancestorTypes.indexOf(parent.tagName) !== -1; - if (isAncestor) { - return parent; - } - parent = parent.parent; - } while (parent); - - return container.parent; - }; - - var inlineListItemElement = exports.inlineListItemElement = function inlineListItemElement(node, container, resourceLoader) { - var listStyle = container.style.listStyle; - - if (!listStyle) { - return; - } - - var style = node.ownerDocument.defaultView.getComputedStyle(node, null); - var wrapper = node.ownerDocument.createElement('html2canvaswrapper'); - (0, _Util.copyCSSStyles)(style, wrapper); - - wrapper.style.position = 'absolute'; - wrapper.style.bottom = 'auto'; - wrapper.style.display = 'block'; - wrapper.style.letterSpacing = 'normal'; - - switch (listStyle.listStylePosition) { - case _listStyle.LIST_STYLE_POSITION.OUTSIDE: - wrapper.style.left = 'auto'; - wrapper.style.right = node.ownerDocument.defaultView.innerWidth - container.bounds.left - container.style.margin[1].getAbsoluteValue(container.bounds.width) + MARGIN_RIGHT + 'px'; - wrapper.style.textAlign = 'right'; - break; - case _listStyle.LIST_STYLE_POSITION.INSIDE: - wrapper.style.left = container.bounds.left - container.style.margin[3].getAbsoluteValue(container.bounds.width) + 'px'; - wrapper.style.right = 'auto'; - wrapper.style.textAlign = 'left'; - break; - } - - var text = void 0; - var MARGIN_TOP = container.style.margin[0].getAbsoluteValue(container.bounds.width); - var styleImage = listStyle.listStyleImage; - if (styleImage) { - if (styleImage.method === 'url') { - var image = node.ownerDocument.createElement('img'); - image.src = styleImage.args[0]; - wrapper.style.top = container.bounds.top - MARGIN_TOP + 'px'; - wrapper.style.width = 'auto'; - wrapper.style.height = 'auto'; - wrapper.appendChild(image); - } else { - var size = parseFloat(container.style.font.fontSize) * 0.5; - wrapper.style.top = container.bounds.top - MARGIN_TOP + container.bounds.height - 1.5 * size + 'px'; - wrapper.style.width = size + 'px'; - wrapper.style.height = size + 'px'; - wrapper.style.backgroundImage = style.listStyleImage; - } - } else if (typeof container.listIndex === 'number') { - text = node.ownerDocument.createTextNode(createCounterText(container.listIndex, listStyle.listStyleType, true)); - wrapper.appendChild(text); - wrapper.style.top = container.bounds.top - MARGIN_TOP + 'px'; - } - - // $FlowFixMe - var body = node.ownerDocument.body; - body.appendChild(wrapper); - - if (text) { - container.childNodes.push(_TextContainer2.default.fromTextNode(text, container)); - body.removeChild(wrapper); - } else { - // $FlowFixMe - container.childNodes.push(new _NodeContainer2.default(wrapper, container, resourceLoader, 0)); - } - }; - - 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'] - }; - - 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: ['Ք', 'Փ', 'Ւ', 'Ց', 'Ր', 'Տ', 'Վ', 'Ս', 'Ռ', 'Ջ', 'Պ', 'Չ', 'Ո', 'Շ', 'Ն', 'Յ', 'Մ', 'Ճ', 'Ղ', 'Ձ', 'Հ', 'Կ', 'Ծ', 'Խ', 'Լ', 'Ի', 'Ժ', 'Թ', 'Ը', 'Է', 'Զ', 'Ե', 'Դ', 'Գ', 'Բ', 'Ա'] - }; - - 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: ['י׳', 'ט׳', 'ח׳', 'ז׳', 'ו׳', 'ה׳', 'ד׳', 'ג׳', 'ב׳', 'א׳', 'ת', 'ש', 'ר', 'ק', 'צ', 'פ', 'ע', 'ס', 'נ', 'מ', 'ל', 'כ', 'יט', 'יח', 'יז', 'טז', 'טו', 'י', 'ט', 'ח', 'ז', 'ו', 'ה', 'ד', 'ג', 'ב', 'א'] - }; - - 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: ['ჵ', 'ჰ', 'ჯ', 'ჴ', 'ხ', 'ჭ', 'წ', 'ძ', 'ც', 'ჩ', 'შ', 'ყ', 'ღ', 'ქ', 'ფ', 'ჳ', 'ტ', 'ს', 'რ', 'ჟ', 'პ', 'ო', 'ჲ', 'ნ', 'მ', 'ლ', 'კ', 'ი', 'თ', 'ჱ', 'ზ', 'ვ', 'ე', 'დ', 'გ', 'ბ', 'ა'] - }; - - var createAdditiveCounter = function createAdditiveCounter(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 createCounterStyleWithSymbolResolver(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 createCounterStyleFromRange(value, codePointRangeStart, codePointRangeEnd, isNumeric, suffix) { - var codePointRangeLength = codePointRangeEnd - codePointRangeStart + 1; - - return (value < 0 ? '-' : '') + (createCounterStyleWithSymbolResolver(Math.abs(value), codePointRangeLength, isNumeric, function (codePoint) { - return (0, _Unicode.fromCodePoint)(Math.floor(codePoint % codePointRangeLength) + codePointRangeStart); - }) + suffix); - }; - - var createCounterStyleFromSymbols = function createCounterStyleFromSymbols(value, symbols) { - var suffix = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '. '; - - 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 createCJKCounter(value, numbers, multipliers, negativeSign, suffix, flags) { - if (value < -9999 || value > 9999) { - return createCounterText(value, _listStyle.LIST_STYLE_TYPE.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 && (0, _Util.contains)(flags, CJK_ZEROS) && string !== '') { - string = numbers[coefficient] + string; - } else if (coefficient > 1 || coefficient === 1 && digit === 0 || coefficient === 1 && digit === 1 && (0, _Util.contains)(flags, CJK_TEN_COEFFICIENTS) || coefficient === 1 && digit === 1 && (0, _Util.contains)(flags, CJK_TEN_HIGH_COEFFICIENTS) && value > 100 || coefficient === 1 && digit > 1 && (0, _Util.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; - }; - - var CHINESE_INFORMAL_MULTIPLIERS = '十百千萬'; - var CHINESE_FORMAL_MULTIPLIERS = '拾佰仟萬'; - var JAPANESE_NEGATIVE = 'マイナス'; - var KOREAN_NEGATIVE = '마이너스 '; - - var createCounterText = exports.createCounterText = function createCounterText(value, type, appendSuffix) { - var defaultSuffix = appendSuffix ? '. ' : ''; - var cjkSuffix = appendSuffix ? '、' : ''; - var koreanSuffix = appendSuffix ? ', ' : ''; - switch (type) { - case _listStyle.LIST_STYLE_TYPE.DISC: - return '•'; - case _listStyle.LIST_STYLE_TYPE.CIRCLE: - return '◦'; - case _listStyle.LIST_STYLE_TYPE.SQUARE: - return '◾'; - case _listStyle.LIST_STYLE_TYPE.DECIMAL_LEADING_ZERO: - var string = createCounterStyleFromRange(value, 48, 57, true, defaultSuffix); - return string.length < 4 ? '0' + string : string; - case _listStyle.LIST_STYLE_TYPE.CJK_DECIMAL: - return createCounterStyleFromSymbols(value, '〇一二三四五六七八九', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_ROMAN: - return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase(); - case _listStyle.LIST_STYLE_TYPE.UPPER_ROMAN: - return createAdditiveCounter(value, 1, 3999, ROMAN_UPPER, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_GREEK: - return createCounterStyleFromRange(value, 945, 969, false, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_ALPHA: - return createCounterStyleFromRange(value, 97, 122, false, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.UPPER_ALPHA: - return createCounterStyleFromRange(value, 65, 90, false, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.ARABIC_INDIC: - return createCounterStyleFromRange(value, 1632, 1641, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.ARMENIAN: - case _listStyle.LIST_STYLE_TYPE.UPPER_ARMENIAN: - return createAdditiveCounter(value, 1, 9999, ARMENIAN, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.LOWER_ARMENIAN: - return createAdditiveCounter(value, 1, 9999, ARMENIAN, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix).toLowerCase(); - case _listStyle.LIST_STYLE_TYPE.BENGALI: - return createCounterStyleFromRange(value, 2534, 2543, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.CAMBODIAN: - case _listStyle.LIST_STYLE_TYPE.KHMER: - return createCounterStyleFromRange(value, 6112, 6121, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.CJK_EARTHLY_BRANCH: - return createCounterStyleFromSymbols(value, '子丑寅卯辰巳午未申酉戌亥', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.CJK_HEAVENLY_STEM: - return createCounterStyleFromSymbols(value, '甲乙丙丁戊己庚辛壬癸', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.CJK_IDEOGRAPHIC: - case _listStyle.LIST_STYLE_TYPE.TRAD_CHINESE_INFORMAL: - return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.TRAD_CHINESE_FORMAL: - return createCJKCounter(value, '零壹貳參肆伍陸柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '負', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.SIMP_CHINESE_INFORMAL: - return createCJKCounter(value, '零一二三四五六七八九', CHINESE_INFORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.SIMP_CHINESE_FORMAL: - return createCJKCounter(value, '零壹贰叁肆伍陆柒捌玖', CHINESE_FORMAL_MULTIPLIERS, '负', cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS | CJK_HUNDRED_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.JAPANESE_INFORMAL: - return createCJKCounter(value, '〇一二三四五六七八九', '十百千万', JAPANESE_NEGATIVE, cjkSuffix, 0); - case _listStyle.LIST_STYLE_TYPE.JAPANESE_FORMAL: - return createCJKCounter(value, '零壱弐参四伍六七八九', '拾百千万', JAPANESE_NEGATIVE, cjkSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.KOREAN_HANGUL_FORMAL: - return createCJKCounter(value, '영일이삼사오육칠팔구', '십백천만', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.KOREAN_HANJA_INFORMAL: - return createCJKCounter(value, '零一二三四五六七八九', '十百千萬', KOREAN_NEGATIVE, koreanSuffix, 0); - case _listStyle.LIST_STYLE_TYPE.KOREAN_HANJA_FORMAL: - return createCJKCounter(value, '零壹貳參四五六七八九', '拾百千', KOREAN_NEGATIVE, koreanSuffix, CJK_ZEROS | CJK_TEN_COEFFICIENTS | CJK_TEN_HIGH_COEFFICIENTS); - case _listStyle.LIST_STYLE_TYPE.DEVANAGARI: - return createCounterStyleFromRange(value, 0x966, 0x96f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.GEORGIAN: - return createAdditiveCounter(value, 1, 19999, GEORGIAN, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.GUJARATI: - return createCounterStyleFromRange(value, 0xae6, 0xaef, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.GURMUKHI: - return createCounterStyleFromRange(value, 0xa66, 0xa6f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.HEBREW: - return createAdditiveCounter(value, 1, 10999, HEBREW, _listStyle.LIST_STYLE_TYPE.DECIMAL, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.HIRAGANA: - return createCounterStyleFromSymbols(value, 'あいうえおかきくけこさしすせそたちつてとなにぬねのはひふへほまみむめもやゆよらりるれろわゐゑをん'); - case _listStyle.LIST_STYLE_TYPE.HIRAGANA_IROHA: - return createCounterStyleFromSymbols(value, 'いろはにほへとちりぬるをわかよたれそつねならむうゐのおくやまけふこえてあさきゆめみしゑひもせす'); - case _listStyle.LIST_STYLE_TYPE.KANNADA: - return createCounterStyleFromRange(value, 0xce6, 0xcef, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.KATAKANA: - return createCounterStyleFromSymbols(value, 'アイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワヰヱヲン', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.KATAKANA_IROHA: - return createCounterStyleFromSymbols(value, 'イロハニホヘトチリヌルヲワカヨタレソツネナラムウヰノオクヤマケフコエテアサキユメミシヱヒモセス', cjkSuffix); - case _listStyle.LIST_STYLE_TYPE.LAO: - return createCounterStyleFromRange(value, 0xed0, 0xed9, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.MONGOLIAN: - return createCounterStyleFromRange(value, 0x1810, 0x1819, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.MYANMAR: - return createCounterStyleFromRange(value, 0x1040, 0x1049, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.ORIYA: - return createCounterStyleFromRange(value, 0xb66, 0xb6f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.PERSIAN: - return createCounterStyleFromRange(value, 0x6f0, 0x6f9, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.TAMIL: - return createCounterStyleFromRange(value, 0xbe6, 0xbef, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.TELUGU: - return createCounterStyleFromRange(value, 0xc66, 0xc6f, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.THAI: - return createCounterStyleFromRange(value, 0xe50, 0xe59, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.TIBETAN: - return createCounterStyleFromRange(value, 0xf20, 0xf29, true, defaultSuffix); - case _listStyle.LIST_STYLE_TYPE.DECIMAL: - default: - return createCounterStyleFromRange(value, 48, 57, true, defaultSuffix); - } - }; - - /***/ }), - /* 15 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Path = __webpack_require__(6); - - var _textDecoration = __webpack_require__(11); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var addColorStops = function addColorStops(gradient, canvasGradient) { - var maxStop = Math.max.apply(null, gradient.colorStops.map(function (colorStop) { - return colorStop.stop; - })); - var f = 1 / Math.max(1, maxStop); - gradient.colorStops.forEach(function (colorStop) { - canvasGradient.addColorStop(f * colorStop.stop, colorStop.color.toString()); - }); - }; - - var CanvasRenderer = function () { - function CanvasRenderer(canvas) { - _classCallCheck(this, CanvasRenderer); - - this.canvas = canvas ? canvas : document.createElement('canvas'); - } - - _createClass(CanvasRenderer, [{ - key: 'render', - value: function render(options) { - this.ctx = this.canvas.getContext('2d'); - this.options = options; - this.canvas.width = Math.floor(options.width * options.scale); - this.canvas.height = Math.floor(options.height * options.scale); - this.canvas.style.width = options.width + 'px'; - this.canvas.style.height = options.height + 'px'; - - this.ctx.scale(this.options.scale, this.options.scale); - this.ctx.translate(-options.x, -options.y); - this.ctx.textBaseline = 'bottom'; - options.logger.log('Canvas renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + this.options.scale); - } - }, { - key: 'clip', - value: function clip(clipPaths, callback) { - var _this = this; - - if (clipPaths.length) { - this.ctx.save(); - clipPaths.forEach(function (path) { - _this.path(path); - _this.ctx.clip(); - }); - } - - callback(); - - if (clipPaths.length) { - this.ctx.restore(); - } - } - }, { - key: 'drawImage', - value: function drawImage(image, source, destination) { - this.ctx.drawImage(image, source.left, source.top, source.width, source.height, destination.left, destination.top, destination.width, destination.height); - } - }, { - key: 'drawShape', - value: function drawShape(path, color) { - this.path(path); - this.ctx.fillStyle = color.toString(); - this.ctx.fill(); - } - }, { - key: 'fill', - value: function fill(color) { - this.ctx.fillStyle = color.toString(); - this.ctx.fill(); - } - }, { - key: 'getTarget', - value: function getTarget() { - this.canvas.getContext('2d').setTransform(1, 0, 0, 1, 0, 0); - return Promise.resolve(this.canvas); - } - }, { - key: 'path', - value: function path(_path) { - var _this2 = this; - - this.ctx.beginPath(); - if (Array.isArray(_path)) { - _path.forEach(function (point, index) { - var start = point.type === _Path.PATH.VECTOR ? point : point.start; - if (index === 0) { - _this2.ctx.moveTo(start.x, start.y); - } else { - _this2.ctx.lineTo(start.x, start.y); - } - - if (point.type === _Path.PATH.BEZIER_CURVE) { - _this2.ctx.bezierCurveTo(point.startControl.x, point.startControl.y, point.endControl.x, point.endControl.y, point.end.x, point.end.y); - } - }); - } else { - this.ctx.arc(_path.x + _path.radius, _path.y + _path.radius, _path.radius, 0, Math.PI * 2, true); - } - - this.ctx.closePath(); - } - }, { - key: 'rectangle', - value: function rectangle(x, y, width, height, color) { - this.ctx.fillStyle = color.toString(); - this.ctx.fillRect(x, y, width, height); - } - }, { - key: 'renderLinearGradient', - value: function renderLinearGradient(bounds, gradient) { - var linearGradient = this.ctx.createLinearGradient(bounds.left + gradient.direction.x1, bounds.top + gradient.direction.y1, bounds.left + gradient.direction.x0, bounds.top + gradient.direction.y0); - - addColorStops(gradient, linearGradient); - this.ctx.fillStyle = linearGradient; - this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height); - } - }, { - key: 'renderRadialGradient', - value: function renderRadialGradient(bounds, gradient) { - var _this3 = this; - - var x = bounds.left + gradient.center.x; - var y = bounds.top + gradient.center.y; - - var radialGradient = this.ctx.createRadialGradient(x, y, 0, x, y, gradient.radius.x); - if (!radialGradient) { - return; - } - - addColorStops(gradient, radialGradient); - this.ctx.fillStyle = radialGradient; - - if (gradient.radius.x !== gradient.radius.y) { - // transforms for elliptical radial gradient - var midX = bounds.left + 0.5 * bounds.width; - var midY = bounds.top + 0.5 * bounds.height; - var f = gradient.radius.y / gradient.radius.x; - var invF = 1 / f; - - this.transform(midX, midY, [1, 0, 0, f, 0, 0], function () { - return _this3.ctx.fillRect(bounds.left, invF * (bounds.top - midY) + midY, bounds.width, bounds.height * invF); - }); - } else { - this.ctx.fillRect(bounds.left, bounds.top, bounds.width, bounds.height); - } - } - }, { - key: 'renderRepeat', - value: function renderRepeat(path, image, imageSize, offsetX, offsetY) { - this.path(path); - this.ctx.fillStyle = this.ctx.createPattern(this.resizeImage(image, imageSize), 'repeat'); - this.ctx.translate(offsetX, offsetY); - this.ctx.fill(); - this.ctx.translate(-offsetX, -offsetY); - } - }, { - key: 'renderTextNode', - value: function renderTextNode(textBounds, color, font, textDecoration, textShadows) { - var _this4 = this; - - this.ctx.font = [font.fontStyle, font.fontVariant, font.fontWeight, font.fontSize, font.fontFamily].join(' '); - - textBounds.forEach(function (text) { - _this4.ctx.fillStyle = color.toString(); - if (textShadows && text.text.trim().length) { - textShadows.slice(0).reverse().forEach(function (textShadow) { - _this4.ctx.shadowColor = textShadow.color.toString(); - _this4.ctx.shadowOffsetX = textShadow.offsetX * _this4.options.scale; - _this4.ctx.shadowOffsetY = textShadow.offsetY * _this4.options.scale; - _this4.ctx.shadowBlur = textShadow.blur; - - _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height); - }); - } else { - _this4.ctx.fillText(text.text, text.bounds.left, text.bounds.top + text.bounds.height); - } - - if (textDecoration !== null) { - var textDecorationColor = textDecoration.textDecorationColor || color; - textDecoration.textDecorationLine.forEach(function (textDecorationLine) { - switch (textDecorationLine) { - case _textDecoration.TEXT_DECORATION_LINE.UNDERLINE: - // Draws a line at the baseline of the font - // TODO As some browsers display the line as more than 1px if the font-size is big, - // need to take that into account both in position and size - var _options$fontMetrics$ = _this4.options.fontMetrics.getMetrics(font), - baseline = _options$fontMetrics$.baseline; - - _this4.rectangle(text.bounds.left, Math.round(text.bounds.top + baseline), text.bounds.width, 1, textDecorationColor); - break; - case _textDecoration.TEXT_DECORATION_LINE.OVERLINE: - _this4.rectangle(text.bounds.left, Math.round(text.bounds.top), text.bounds.width, 1, textDecorationColor); - break; - case _textDecoration.TEXT_DECORATION_LINE.LINE_THROUGH: - // TODO try and find exact position for line-through - var _options$fontMetrics$2 = _this4.options.fontMetrics.getMetrics(font), - middle = _options$fontMetrics$2.middle; - - _this4.rectangle(text.bounds.left, Math.ceil(text.bounds.top + middle), text.bounds.width, 1, textDecorationColor); - break; - } - }); - } - }); - } - }, { - key: 'resizeImage', - value: function resizeImage(image, size) { - if (image.width === size.width && image.height === size.height) { - return image; - } - - var canvas = this.canvas.ownerDocument.createElement('canvas'); - canvas.width = size.width; - canvas.height = size.height; - var ctx = canvas.getContext('2d'); - ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, size.width, size.height); - return canvas; - } - }, { - key: 'setOpacity', - value: function setOpacity(opacity) { - this.ctx.globalAlpha = opacity; - } - }, { - key: 'transform', - value: function transform(offsetX, offsetY, matrix, callback) { - this.ctx.save(); - this.ctx.translate(offsetX, offsetY); - this.ctx.transform(matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]); - this.ctx.translate(-offsetX, -offsetY); - - callback(); - - this.ctx.restore(); - } - }]); - - return CanvasRenderer; - }(); - - exports.default = CanvasRenderer; - - /***/ }), - /* 16 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Logger = function () { - function Logger(enabled, id, start) { - _classCallCheck(this, Logger); - - this.enabled = typeof window !== 'undefined' && enabled; - this.start = start ? start : Date.now(); - this.id = id; - } - - _createClass(Logger, [{ - key: 'child', - value: function child(id) { - return new Logger(this.enabled, id, this.start); - } - - // eslint-disable-next-line flowtype/no-weak-types - - }, { - key: 'log', - value: function log() { - if (this.enabled && window.console && window.console.log) { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - Function.prototype.bind.call(window.console.log, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0))); - } - } - - // eslint-disable-next-line flowtype/no-weak-types - - }, { - key: 'error', - value: function error() { - if (this.enabled && window.console && window.console.error) { - for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { - args[_key2] = arguments[_key2]; - } - - Function.prototype.bind.call(window.console.error, window.console).apply(window.console, [Date.now() - this.start + 'ms', this.id ? 'html2canvas (' + this.id + '):' : 'html2canvas:'].concat([].slice.call(args, 0))); - } - } - }]); - - return Logger; - }(); - - exports.default = Logger; - - /***/ }), - /* 17 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parsePadding = exports.PADDING_SIDES = undefined; - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var PADDING_SIDES = exports.PADDING_SIDES = { - TOP: 0, - RIGHT: 1, - BOTTOM: 2, - LEFT: 3 - }; - - var SIDES = ['top', 'right', 'bottom', 'left']; - - var parsePadding = exports.parsePadding = function parsePadding(style) { - return SIDES.map(function (side) { - return new _Length2.default(style.getPropertyValue('padding-' + side)); - }); - }; - - /***/ }), - /* 18 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var OVERFLOW_WRAP = exports.OVERFLOW_WRAP = { - NORMAL: 0, - BREAK_WORD: 1 - }; - - var parseOverflowWrap = exports.parseOverflowWrap = function parseOverflowWrap(overflow) { - switch (overflow) { - case 'break-word': - return OVERFLOW_WRAP.BREAK_WORD; - case 'normal': - default: - return OVERFLOW_WRAP.NORMAL; - } - }; - - /***/ }), - /* 19 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var POSITION = exports.POSITION = { - STATIC: 0, - RELATIVE: 1, - ABSOLUTE: 2, - FIXED: 3, - STICKY: 4 - }; - - var parsePosition = exports.parsePosition = function parsePosition(position) { - switch (position) { - case 'relative': - return POSITION.RELATIVE; - case 'absolute': - return POSITION.ABSOLUTE; - case 'fixed': - return POSITION.FIXED; - case 'sticky': - return POSITION.STICKY; - } - - return POSITION.STATIC; - }; - - /***/ }), - /* 20 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var TEXT_TRANSFORM = exports.TEXT_TRANSFORM = { - NONE: 0, - LOWERCASE: 1, - UPPERCASE: 2, - CAPITALIZE: 3 - }; - - var parseTextTransform = exports.parseTextTransform = function parseTextTransform(textTransform) { - switch (textTransform) { - case 'uppercase': - return TEXT_TRANSFORM.UPPERCASE; - case 'lowercase': - return TEXT_TRANSFORM.LOWERCASE; - case 'capitalize': - return TEXT_TRANSFORM.CAPITALIZE; - } - - return TEXT_TRANSFORM.NONE; - }; - - /***/ }), - /* 21 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.reformatInputBounds = exports.inlineSelectElement = exports.inlineTextAreaElement = exports.inlineInputElement = exports.getInputBorderRadius = exports.INPUT_BACKGROUND = exports.INPUT_BORDERS = exports.INPUT_COLOR = undefined; - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _background = __webpack_require__(5); - - var _border = __webpack_require__(12); - - var _Circle = __webpack_require__(50); - - var _Circle2 = _interopRequireDefault(_Circle); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - var _Bounds = __webpack_require__(2); - - var _TextBounds = __webpack_require__(22); - - var _Util = __webpack_require__(4); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var INPUT_COLOR = exports.INPUT_COLOR = new _Color2.default([42, 42, 42]); - var INPUT_BORDER_COLOR = new _Color2.default([165, 165, 165]); - var INPUT_BACKGROUND_COLOR = new _Color2.default([222, 222, 222]); - var INPUT_BORDER = { - borderWidth: 1, - borderColor: INPUT_BORDER_COLOR, - borderStyle: _border.BORDER_STYLE.SOLID - }; - var INPUT_BORDERS = exports.INPUT_BORDERS = [INPUT_BORDER, INPUT_BORDER, INPUT_BORDER, INPUT_BORDER]; - var INPUT_BACKGROUND = exports.INPUT_BACKGROUND = { - backgroundColor: INPUT_BACKGROUND_COLOR, - backgroundImage: [], - backgroundClip: _background.BACKGROUND_CLIP.PADDING_BOX, - backgroundOrigin: _background.BACKGROUND_ORIGIN.PADDING_BOX - }; - - var RADIO_BORDER_RADIUS = new _Length2.default('50%'); - var RADIO_BORDER_RADIUS_TUPLE = [RADIO_BORDER_RADIUS, RADIO_BORDER_RADIUS]; - var INPUT_RADIO_BORDER_RADIUS = [RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE, RADIO_BORDER_RADIUS_TUPLE]; - - var CHECKBOX_BORDER_RADIUS = new _Length2.default('3px'); - var CHECKBOX_BORDER_RADIUS_TUPLE = [CHECKBOX_BORDER_RADIUS, CHECKBOX_BORDER_RADIUS]; - var INPUT_CHECKBOX_BORDER_RADIUS = [CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE, CHECKBOX_BORDER_RADIUS_TUPLE]; - - var getInputBorderRadius = exports.getInputBorderRadius = function getInputBorderRadius(node) { - return node.type === 'radio' ? INPUT_RADIO_BORDER_RADIUS : INPUT_CHECKBOX_BORDER_RADIUS; - }; - - var inlineInputElement = exports.inlineInputElement = function inlineInputElement(node, container) { - if (node.type === 'radio' || node.type === 'checkbox') { - if (node.checked) { - var size = Math.min(container.bounds.width, container.bounds.height); - container.childNodes.push(node.type === 'checkbox' ? [new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79), new _Vector2.default(container.bounds.left + size * 0.16, container.bounds.top + size * 0.5549), new _Vector2.default(container.bounds.left + size * 0.27347, container.bounds.top + size * 0.44071), new _Vector2.default(container.bounds.left + size * 0.39694, container.bounds.top + size * 0.5649), new _Vector2.default(container.bounds.left + size * 0.72983, container.bounds.top + size * 0.23), new _Vector2.default(container.bounds.left + size * 0.84, container.bounds.top + size * 0.34085), new _Vector2.default(container.bounds.left + size * 0.39363, container.bounds.top + size * 0.79)] : new _Circle2.default(container.bounds.left + size / 4, container.bounds.top + size / 4, size / 4)); - } - } else { - inlineFormElement(getInputValue(node), node, container, false); - } - }; - - var inlineTextAreaElement = exports.inlineTextAreaElement = function inlineTextAreaElement(node, container) { - inlineFormElement(node.value, node, container, true); - }; - - var inlineSelectElement = exports.inlineSelectElement = function inlineSelectElement(node, container) { - var option = node.options[node.selectedIndex || 0]; - inlineFormElement(option ? option.text || '' : '', node, container, false); - }; - - var reformatInputBounds = exports.reformatInputBounds = function reformatInputBounds(bounds) { - if (bounds.width > bounds.height) { - bounds.left += (bounds.width - bounds.height) / 2; - bounds.width = bounds.height; - } else if (bounds.width < bounds.height) { - bounds.top += (bounds.height - bounds.width) / 2; - bounds.height = bounds.width; - } - return bounds; - }; - - var inlineFormElement = function inlineFormElement(value, node, container, allowLinebreak) { - var body = node.ownerDocument.body; - if (value.length > 0 && body) { - var wrapper = node.ownerDocument.createElement('html2canvaswrapper'); - (0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node, null), wrapper); - wrapper.style.position = 'absolute'; - wrapper.style.left = container.bounds.left + 'px'; - wrapper.style.top = container.bounds.top + 'px'; - if (!allowLinebreak) { - wrapper.style.whiteSpace = 'nowrap'; - } - var text = node.ownerDocument.createTextNode(value); - wrapper.appendChild(text); - body.appendChild(wrapper); - container.childNodes.push(_TextContainer2.default.fromTextNode(text, container)); - body.removeChild(wrapper); - } - }; - - var getInputValue = function getInputValue(node) { - var value = node.type === 'password' ? new Array(node.value.length + 1).join('\u2022') : node.value; - - return value.length === 0 ? node.placeholder || '' : value; - }; - - /***/ }), - /* 22 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTextBounds = exports.TextBounds = undefined; - - var _Bounds = __webpack_require__(2); - - var _textDecoration = __webpack_require__(11); - - var _Feature = __webpack_require__(10); - - var _Feature2 = _interopRequireDefault(_Feature); - - var _Unicode = __webpack_require__(24); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var TextBounds = exports.TextBounds = function TextBounds(text, bounds) { - _classCallCheck(this, TextBounds); - - this.text = text; - this.bounds = bounds; - }; - - var parseTextBounds = exports.parseTextBounds = function parseTextBounds(value, parent, node) { - var letterRendering = parent.style.letterSpacing !== 0; - var textList = letterRendering ? (0, _Unicode.toCodePoints)(value).map(function (i) { - return (0, _Unicode.fromCodePoint)(i); - }) : (0, _Unicode.breakWords)(value, parent); - var length = textList.length; - var defaultView = node.parentNode ? node.parentNode.ownerDocument.defaultView : null; - var scrollX = defaultView ? defaultView.pageXOffset : 0; - var scrollY = defaultView ? defaultView.pageYOffset : 0; - var textBounds = []; - var offset = 0; - for (var i = 0; i < length; i++) { - var text = textList[i]; - if (parent.style.textDecoration !== _textDecoration.TEXT_DECORATION.NONE || text.trim().length > 0) { - if (_Feature2.default.SUPPORT_RANGE_BOUNDS) { - textBounds.push(new TextBounds(text, getRangeBounds(node, offset, text.length, scrollX, scrollY))); - } else { - var replacementNode = node.splitText(text.length); - textBounds.push(new TextBounds(text, getWrapperBounds(node, scrollX, scrollY))); - node = replacementNode; - } - } else if (!_Feature2.default.SUPPORT_RANGE_BOUNDS) { - node = node.splitText(text.length); - } - offset += text.length; - } - return textBounds; - }; - - var getWrapperBounds = function getWrapperBounds(node, scrollX, scrollY) { - var wrapper = node.ownerDocument.createElement('html2canvaswrapper'); - wrapper.appendChild(node.cloneNode(true)); - var parentNode = node.parentNode; - if (parentNode) { - parentNode.replaceChild(wrapper, node); - var bounds = (0, _Bounds.parseBounds)(wrapper, scrollX, scrollY); - if (wrapper.firstChild) { - parentNode.replaceChild(wrapper.firstChild, wrapper); - } - return bounds; - } - return new _Bounds.Bounds(0, 0, 0, 0); - }; - - var getRangeBounds = function getRangeBounds(node, offset, length, scrollX, scrollY) { - var range = node.ownerDocument.createRange(); - range.setStart(node, offset); - range.setEnd(node, offset + length); - return _Bounds.Bounds.fromClientRect(range.getBoundingClientRect(), scrollX, scrollY); - }; - - /***/ }), - /* 23 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var ForeignObjectRenderer = function () { - function ForeignObjectRenderer(element) { - _classCallCheck(this, ForeignObjectRenderer); - - this.element = element; - } - - _createClass(ForeignObjectRenderer, [{ - key: 'render', - value: function render(options) { - var _this = this; - - this.options = options; - this.canvas = document.createElement('canvas'); - this.ctx = this.canvas.getContext('2d'); - this.canvas.width = Math.floor(options.width) * options.scale; - this.canvas.height = Math.floor(options.height) * options.scale; - this.canvas.style.width = options.width + 'px'; - this.canvas.style.height = options.height + 'px'; - - options.logger.log('ForeignObject renderer initialized (' + options.width + 'x' + options.height + ' at ' + options.x + ',' + options.y + ') with scale ' + options.scale); - var svg = createForeignObjectSVG(Math.max(options.windowWidth, options.width) * options.scale, Math.max(options.windowHeight, options.height) * options.scale, options.scrollX * options.scale, options.scrollY * options.scale, this.element); - - return loadSerializedSVG(svg).then(function (img) { - if (options.backgroundColor) { - _this.ctx.fillStyle = options.backgroundColor.toString(); - _this.ctx.fillRect(0, 0, options.width * options.scale, options.height * options.scale); - } - - _this.ctx.drawImage(img, -options.x * options.scale, -options.y * options.scale); - return _this.canvas; - }); - } - }]); - - return ForeignObjectRenderer; - }(); - - exports.default = ForeignObjectRenderer; - var createForeignObjectSVG = exports.createForeignObjectSVG = function createForeignObjectSVG(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); - svg.setAttributeNS(null, 'height', height); - - foreignObject.setAttributeNS(null, 'width', '100%'); - foreignObject.setAttributeNS(null, 'height', '100%'); - foreignObject.setAttributeNS(null, 'x', x); - foreignObject.setAttributeNS(null, 'y', y); - foreignObject.setAttributeNS(null, 'externalResourcesRequired', 'true'); - svg.appendChild(foreignObject); - - foreignObject.appendChild(node); - - return svg; - }; - - var loadSerializedSVG = exports.loadSerializedSVG = function loadSerializedSVG(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)); - }); - }; - - /***/ }), - /* 24 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.breakWords = exports.fromCodePoint = exports.toCodePoints = undefined; - - var _cssLineBreak = __webpack_require__(46); - - Object.defineProperty(exports, 'toCodePoints', { - enumerable: true, - get: function get() { - return _cssLineBreak.toCodePoints; - } - }); - Object.defineProperty(exports, 'fromCodePoint', { - enumerable: true, - get: function get() { - return _cssLineBreak.fromCodePoint; - } - }); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _overflowWrap = __webpack_require__(18); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var breakWords = exports.breakWords = function breakWords(str, parent) { - var breaker = (0, _cssLineBreak.LineBreaker)(str, { - lineBreak: parent.style.lineBreak, - wordBreak: parent.style.overflowWrap === _overflowWrap.OVERFLOW_WRAP.BREAK_WORD ? 'break-word' : parent.style.wordBreak - }); - - var words = []; - var bk = void 0; - - while (!(bk = breaker.next()).done) { - words.push(bk.value.slice()); - } - - return words; - }; - - /***/ }), - /* 25 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.FontMetrics = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Util = __webpack_require__(4); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var SAMPLE_TEXT = 'Hidden Text'; - - var FontMetrics = exports.FontMetrics = function () { - function FontMetrics(document) { - _classCallCheck(this, FontMetrics); - - this._data = {}; - this._document = document; - } - - _createClass(FontMetrics, [{ - key: '_parseMetrics', - value: function _parseMetrics(font) { - var container = this._document.createElement('div'); - var img = this._document.createElement('img'); - var span = this._document.createElement('span'); - - var body = this._document.body; - if (!body) { - throw new Error( true ? 'No document found for font metrics' : ''); - } - - container.style.visibility = 'hidden'; - container.style.fontFamily = font.fontFamily; - container.style.fontSize = font.fontSize; - container.style.margin = '0'; - container.style.padding = '0'; - - body.appendChild(container); - - img.src = _Util.SMALL_IMAGE; - img.width = 1; - img.height = 1; - - img.style.margin = '0'; - img.style.padding = '0'; - img.style.verticalAlign = 'baseline'; - - span.style.fontFamily = font.fontFamily; - span.style.fontSize = font.fontSize; - span.style.margin = '0'; - span.style.padding = '0'; - - span.appendChild(this._document.createTextNode(SAMPLE_TEXT)); - container.appendChild(span); - container.appendChild(img); - var baseline = img.offsetTop - span.offsetTop + 2; - - container.removeChild(span); - container.appendChild(this._document.createTextNode(SAMPLE_TEXT)); - - container.style.lineHeight = 'normal'; - img.style.verticalAlign = 'super'; - - var middle = img.offsetTop - container.offsetTop + 2; - - body.removeChild(container); - - return { baseline: baseline, middle: middle }; - } - }, { - key: 'getMetrics', - value: function getMetrics(font) { - var key = font.fontFamily + ' ' + font.fontSize; - if (this._data[key] === undefined) { - this._data[key] = this._parseMetrics(font); - } - - return this._data[key]; - } - }]); - - return FontMetrics; - }(); - - /***/ }), - /* 26 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.Proxy = undefined; - - var _Feature = __webpack_require__(10); - - var _Feature2 = _interopRequireDefault(_Feature); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var Proxy = exports.Proxy = function Proxy(src, options) { - if (!options.proxy) { - return Promise.reject( true ? 'No proxy defined' : null); - } - var proxy = options.proxy; - - return new Promise(function (resolve, reject) { - var responseType = _Feature2.default.SUPPORT_CORS_XHR && _Feature2.default.SUPPORT_RESPONSE_TYPE ? 'blob' : 'text'; - var xhr = _Feature2.default.SUPPORT_CORS_XHR ? new XMLHttpRequest() : new XDomainRequest(); - xhr.onload = function () { - if (xhr instanceof XMLHttpRequest) { - if (xhr.status === 200) { - if (responseType === 'text') { - resolve(xhr.response); - } else { - var reader = new FileReader(); - // $FlowFixMe - reader.addEventListener('load', function () { - return resolve(reader.result); - }, false); - // $FlowFixMe - reader.addEventListener('error', function (e) { - return reject(e); - }, false); - reader.readAsDataURL(xhr.response); - } - } else { - reject( true ? 'Failed to proxy resource ' + src.substring(0, 256) + ' with status code ' + xhr.status : ''); - } - } else { - resolve(xhr.responseText); - } - }; - - xhr.onerror = reject; - xhr.open('GET', proxy + '?url=' + encodeURIComponent(src) + '&responseType=' + responseType); - - if (responseType !== 'text' && xhr instanceof XMLHttpRequest) { - xhr.responseType = responseType; - } - - if (options.imageTimeout) { - var timeout = options.imageTimeout; - xhr.timeout = timeout; - xhr.ontimeout = function () { - return reject( true ? 'Timed out (' + timeout + 'ms) proxying ' + src.substring(0, 256) : ''); - }; - } - - xhr.send(); - }); - }; - - /***/ }), - /* 27 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; - - var _CanvasRenderer = __webpack_require__(15); - - var _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer); - - var _Logger = __webpack_require__(16); - - var _Logger2 = _interopRequireDefault(_Logger); - - var _Window = __webpack_require__(28); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var html2canvas = function html2canvas(element, conf) { - var config = conf || {}; - var logger = new _Logger2.default(typeof config.logging === 'boolean' ? config.logging : true); - logger.log('html2canvas ' + "1.0.0-alpha.11"); - - if (true && typeof config.onrendered === 'function') { - logger.error('onrendered option is deprecated, html2canvas returns a Promise with the canvas as the value'); - } - - var ownerDocument = element.ownerDocument; - if (!ownerDocument) { - return Promise.reject('Provided element is not within a Document'); - } - var defaultView = ownerDocument.defaultView; - - var defaultOptions = { - async: true, - allowTaint: false, - backgroundColor: '#ffffff', - imageTimeout: 15000, - logging: true, - proxy: null, - removeContainer: true, - foreignObjectRendering: false, - scale: defaultView.devicePixelRatio || 1, - target: new _CanvasRenderer2.default(config.canvas), - useCORS: false, - windowWidth: defaultView.innerWidth, - windowHeight: defaultView.innerHeight, - scrollX: defaultView.pageXOffset, - scrollY: defaultView.pageYOffset - }; - - var result = (0, _Window.renderElement)(element, _extends({}, defaultOptions, config), logger); - - if (true) { - return result.catch(function (e) { - logger.error(e); - throw e; - }); - } - return result; - }; - - html2canvas.CanvasRenderer = _CanvasRenderer2.default; - - module.exports = html2canvas; - - /***/ }), - /* 28 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.renderElement = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _Logger = __webpack_require__(16); - - var _Logger2 = _interopRequireDefault(_Logger); - - var _NodeParser = __webpack_require__(29); - - var _Renderer = __webpack_require__(51); - - var _Renderer2 = _interopRequireDefault(_Renderer); - - var _ForeignObjectRenderer = __webpack_require__(23); - - var _ForeignObjectRenderer2 = _interopRequireDefault(_ForeignObjectRenderer); - - var _Feature = __webpack_require__(10); - - var _Feature2 = _interopRequireDefault(_Feature); - - var _Bounds = __webpack_require__(2); - - var _Clone = __webpack_require__(54); - - var _Font = __webpack_require__(25); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var renderElement = exports.renderElement = function renderElement(element, options, logger) { - var ownerDocument = element.ownerDocument; - - var windowBounds = new _Bounds.Bounds(options.scrollX, options.scrollY, options.windowWidth, options.windowHeight); - - // http://www.w3.org/TR/css3-background/#special-backgrounds - var documentBackgroundColor = ownerDocument.documentElement ? new _Color2.default(getComputedStyle(ownerDocument.documentElement).backgroundColor) : _Color.TRANSPARENT; - var bodyBackgroundColor = ownerDocument.body ? new _Color2.default(getComputedStyle(ownerDocument.body).backgroundColor) : _Color.TRANSPARENT; - - var backgroundColor = element === ownerDocument.documentElement ? documentBackgroundColor.isTransparent() ? bodyBackgroundColor.isTransparent() ? options.backgroundColor ? new _Color2.default(options.backgroundColor) : null : bodyBackgroundColor : documentBackgroundColor : options.backgroundColor ? new _Color2.default(options.backgroundColor) : null; - - return (options.foreignObjectRendering ? // $FlowFixMe - _Feature2.default.SUPPORT_FOREIGNOBJECT_DRAWING : Promise.resolve(false)).then(function (supportForeignObject) { - return supportForeignObject ? function (cloner) { - if (true) { - logger.log('Document cloned, using foreignObject rendering'); - } - - return cloner.inlineFonts(ownerDocument).then(function () { - return cloner.resourceLoader.ready(); - }).then(function () { - var renderer = new _ForeignObjectRenderer2.default(cloner.documentElement); - - var defaultView = ownerDocument.defaultView; - var scrollX = defaultView.pageXOffset; - var scrollY = defaultView.pageYOffset; - - var isDocument = element.tagName === 'HTML' || element.tagName === 'BODY'; - - var _ref = isDocument ? (0, _Bounds.parseDocumentSize)(ownerDocument) : (0, _Bounds.parseBounds)(element, scrollX, scrollY), - width = _ref.width, - height = _ref.height, - left = _ref.left, - top = _ref.top; - - return renderer.render({ - backgroundColor: backgroundColor, - logger: logger, - scale: options.scale, - x: typeof options.x === 'number' ? options.x : left, - y: typeof options.y === 'number' ? options.y : top, - width: typeof options.width === 'number' ? options.width : Math.ceil(width), - height: typeof options.height === 'number' ? options.height : Math.ceil(height), - windowWidth: options.windowWidth, - windowHeight: options.windowHeight, - scrollX: options.scrollX, - scrollY: options.scrollY - }); - }); - }(new _Clone.DocumentCloner(element, options, logger, true, renderElement)) : (0, _Clone.cloneWindow)(ownerDocument, windowBounds, element, options, logger, renderElement).then(function (_ref2) { - var _ref3 = _slicedToArray(_ref2, 3), - container = _ref3[0], - clonedElement = _ref3[1], - resourceLoader = _ref3[2]; - - if (true) { - logger.log('Document cloned, using computed rendering'); - } - - var stack = (0, _NodeParser.NodeParser)(clonedElement, resourceLoader, logger); - var clonedDocument = clonedElement.ownerDocument; - - if (backgroundColor === stack.container.style.background.backgroundColor) { - stack.container.style.background.backgroundColor = _Color.TRANSPARENT; - } - - return resourceLoader.ready().then(function (imageStore) { - var fontMetrics = new _Font.FontMetrics(clonedDocument); - if (true) { - logger.log('Starting renderer'); - } - - var defaultView = clonedDocument.defaultView; - var scrollX = defaultView.pageXOffset; - var scrollY = defaultView.pageYOffset; - - var isDocument = clonedElement.tagName === 'HTML' || clonedElement.tagName === 'BODY'; - - var _ref4 = isDocument ? (0, _Bounds.parseDocumentSize)(ownerDocument) : (0, _Bounds.parseBounds)(clonedElement, scrollX, scrollY), - width = _ref4.width, - height = _ref4.height, - left = _ref4.left, - top = _ref4.top; - - var renderOptions = { - backgroundColor: backgroundColor, - fontMetrics: fontMetrics, - imageStore: imageStore, - logger: logger, - scale: options.scale, - x: typeof options.x === 'number' ? options.x : left, - y: typeof options.y === 'number' ? options.y : top, - width: typeof options.width === 'number' ? options.width : Math.ceil(width), - height: typeof options.height === 'number' ? options.height : Math.ceil(height) - }; - - if (Array.isArray(options.target)) { - return Promise.all(options.target.map(function (target) { - var renderer = new _Renderer2.default(target, renderOptions); - return renderer.render(stack); - })); - } else { - var renderer = new _Renderer2.default(options.target, renderOptions); - var canvas = renderer.render(stack); - if (options.removeContainer === true) { - if (container.parentNode) { - container.parentNode.removeChild(container); - } else if (true) { - logger.log('Cannot detach cloned iframe as it is not in the DOM anymore'); - } - } - - return canvas; - } - }); - }); - }); - }; - - /***/ }), - /* 29 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.NodeParser = undefined; - - var _StackingContext = __webpack_require__(30); - - var _StackingContext2 = _interopRequireDefault(_StackingContext); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _Input = __webpack_require__(21); - - var _ListItem = __webpack_require__(14); - - var _listStyle = __webpack_require__(8); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var NodeParser = exports.NodeParser = function NodeParser(node, resourceLoader, logger) { - if (true) { - logger.log('Starting node parsing'); - } - - var index = 0; - - var container = new _NodeContainer2.default(node, null, resourceLoader, index++); - var stack = new _StackingContext2.default(container, null, true); - - parseNodeTree(node, container, stack, resourceLoader, index); - - if (true) { - logger.log('Finished parsing node tree'); - } - - return stack; - }; - - var IGNORED_NODE_NAMES = ['SCRIPT', 'HEAD', 'TITLE', 'OBJECT', 'BR', 'OPTION']; - - var parseNodeTree = function parseNodeTree(node, parent, stack, resourceLoader, index) { - if (true && index > 50000) { - throw new Error('Recursion error while parsing node tree'); - } - - for (var childNode = node.firstChild, nextNode; childNode; childNode = nextNode) { - nextNode = childNode.nextSibling; - var defaultView = childNode.ownerDocument.defaultView; - if (childNode instanceof defaultView.Text || childNode instanceof Text || defaultView.parent && childNode instanceof defaultView.parent.Text) { - if (childNode.data.trim().length > 0) { - parent.childNodes.push(_TextContainer2.default.fromTextNode(childNode, parent)); - } - } else if (childNode instanceof defaultView.HTMLElement || childNode instanceof HTMLElement || defaultView.parent && childNode instanceof defaultView.parent.HTMLElement) { - if (IGNORED_NODE_NAMES.indexOf(childNode.nodeName) === -1) { - var container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++); - if (container.isVisible()) { - if (childNode.tagName === 'INPUT') { - // $FlowFixMe - (0, _Input.inlineInputElement)(childNode, container); - } else if (childNode.tagName === 'TEXTAREA') { - // $FlowFixMe - (0, _Input.inlineTextAreaElement)(childNode, container); - } else if (childNode.tagName === 'SELECT') { - // $FlowFixMe - (0, _Input.inlineSelectElement)(childNode, container); - } else if (container.style.listStyle && container.style.listStyle.listStyleType !== _listStyle.LIST_STYLE_TYPE.NONE) { - (0, _ListItem.inlineListItemElement)(childNode, container, resourceLoader); - } - - var SHOULD_TRAVERSE_CHILDREN = childNode.tagName !== 'TEXTAREA'; - var treatAsRealStackingContext = createsRealStackingContext(container, childNode); - if (treatAsRealStackingContext || createsStackingContext(container)) { - // for treatAsRealStackingContext:false, any positioned descendants and descendants - // which actually create a new stacking context should be considered part of the parent stacking context - var parentStack = treatAsRealStackingContext || container.isPositioned() ? stack.getRealParentStackingContext() : stack; - var childStack = new _StackingContext2.default(container, parentStack, treatAsRealStackingContext); - parentStack.contexts.push(childStack); - if (SHOULD_TRAVERSE_CHILDREN) { - parseNodeTree(childNode, container, childStack, resourceLoader, index); - } - } else { - stack.children.push(container); - if (SHOULD_TRAVERSE_CHILDREN) { - parseNodeTree(childNode, container, stack, resourceLoader, index); - } - } - } - } - } else if (childNode instanceof defaultView.SVGSVGElement || childNode instanceof SVGSVGElement || defaultView.parent && childNode instanceof defaultView.parent.SVGSVGElement) { - var _container = new _NodeContainer2.default(childNode, parent, resourceLoader, index++); - var _treatAsRealStackingContext = createsRealStackingContext(_container, childNode); - if (_treatAsRealStackingContext || createsStackingContext(_container)) { - // for treatAsRealStackingContext:false, any positioned descendants and descendants - // which actually create a new stacking context should be considered part of the parent stacking context - var _parentStack = _treatAsRealStackingContext || _container.isPositioned() ? stack.getRealParentStackingContext() : stack; - var _childStack = new _StackingContext2.default(_container, _parentStack, _treatAsRealStackingContext); - _parentStack.contexts.push(_childStack); - } else { - stack.children.push(_container); - } - } - } - }; - - var createsRealStackingContext = function createsRealStackingContext(container, node) { - return container.isRootElement() || container.isPositionedWithZIndex() || container.style.opacity < 1 || container.isTransformed() || isBodyWithTransparentRoot(container, node); - }; - - var createsStackingContext = function createsStackingContext(container) { - return container.isPositioned() || container.isFloating(); - }; - - var isBodyWithTransparentRoot = function isBodyWithTransparentRoot(container, node) { - return node.nodeName === 'BODY' && container.parent instanceof _NodeContainer2.default && container.parent.style.background.backgroundColor.isTransparent(); - }; - - /***/ }), - /* 30 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _position = __webpack_require__(19); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var StackingContext = function () { - function StackingContext(container, parent, treatAsRealStackingContext) { - _classCallCheck(this, StackingContext); - - this.container = container; - this.parent = parent; - this.contexts = []; - this.children = []; - this.treatAsRealStackingContext = treatAsRealStackingContext; - } - - _createClass(StackingContext, [{ - key: 'getOpacity', - value: function getOpacity() { - return this.parent ? this.container.style.opacity * this.parent.getOpacity() : this.container.style.opacity; - } - }, { - key: 'getRealParentStackingContext', - value: function getRealParentStackingContext() { - return !this.parent || this.treatAsRealStackingContext ? this : this.parent.getRealParentStackingContext(); - } - }]); - - return StackingContext; - }(); - - exports.default = StackingContext; - - /***/ }), - /* 31 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Size = function Size(width, height) { - _classCallCheck(this, Size); - - this.width = width; - this.height = height; - }; - - exports.default = Size; - - /***/ }), - /* 32 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Path = __webpack_require__(6); - - var _Vector = __webpack_require__(7); - - var _Vector2 = _interopRequireDefault(_Vector); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var lerp = function lerp(a, b, t) { - return new _Vector2.default(a.x + (b.x - a.x) * t, a.y + (b.y - a.y) * t); - }; - - var BezierCurve = function () { - function BezierCurve(start, startControl, endControl, end) { - _classCallCheck(this, BezierCurve); - - this.type = _Path.PATH.BEZIER_CURVE; - this.start = start; - this.startControl = startControl; - this.endControl = endControl; - this.end = end; - } - - _createClass(BezierCurve, [{ - key: 'subdivide', - value: function subdivide(t, firstHalf) { - var ab = lerp(this.start, this.startControl, t); - var bc = lerp(this.startControl, this.endControl, t); - var cd = lerp(this.endControl, this.end, t); - var abbc = lerp(ab, bc, t); - var bccd = lerp(bc, cd, t); - var dest = lerp(abbc, bccd, t); - return firstHalf ? new BezierCurve(this.start, ab, abbc, dest) : new BezierCurve(dest, bccd, cd, this.end); - } - }, { - key: 'reverse', - value: function reverse() { - return new BezierCurve(this.end, this.endControl, this.startControl, this.start); - } - }]); - - return BezierCurve; - }(); - - exports.default = BezierCurve; - - /***/ }), - /* 33 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseBorderRadius = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var SIDES = ['top-left', 'top-right', 'bottom-right', 'bottom-left']; - - var parseBorderRadius = exports.parseBorderRadius = function parseBorderRadius(style) { - return SIDES.map(function (side) { - var value = style.getPropertyValue('border-' + side + '-radius'); - - var _value$split$map = value.split(' ').map(_Length2.default.create), - _value$split$map2 = _slicedToArray(_value$split$map, 2), - horizontal = _value$split$map2[0], - vertical = _value$split$map2[1]; - - return typeof vertical === 'undefined' ? [horizontal, horizontal] : [horizontal, vertical]; - }); - }; - - /***/ }), - /* 34 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var DISPLAY = exports.DISPLAY = { - NONE: 1 << 0, - BLOCK: 1 << 1, - INLINE: 1 << 2, - RUN_IN: 1 << 3, - FLOW: 1 << 4, - FLOW_ROOT: 1 << 5, - TABLE: 1 << 6, - FLEX: 1 << 7, - GRID: 1 << 8, - RUBY: 1 << 9, - SUBGRID: 1 << 10, - LIST_ITEM: 1 << 11, - TABLE_ROW_GROUP: 1 << 12, - TABLE_HEADER_GROUP: 1 << 13, - TABLE_FOOTER_GROUP: 1 << 14, - TABLE_ROW: 1 << 15, - TABLE_CELL: 1 << 16, - TABLE_COLUMN_GROUP: 1 << 17, - TABLE_COLUMN: 1 << 18, - TABLE_CAPTION: 1 << 19, - RUBY_BASE: 1 << 20, - RUBY_TEXT: 1 << 21, - RUBY_BASE_CONTAINER: 1 << 22, - RUBY_TEXT_CONTAINER: 1 << 23, - CONTENTS: 1 << 24, - INLINE_BLOCK: 1 << 25, - INLINE_LIST_ITEM: 1 << 26, - INLINE_TABLE: 1 << 27, - INLINE_FLEX: 1 << 28, - INLINE_GRID: 1 << 29 - }; - - var parseDisplayValue = function parseDisplayValue(display) { - switch (display) { - case 'block': - return DISPLAY.BLOCK; - case 'inline': - return DISPLAY.INLINE; - case 'run-in': - return DISPLAY.RUN_IN; - case 'flow': - return DISPLAY.FLOW; - case 'flow-root': - return DISPLAY.FLOW_ROOT; - case 'table': - return DISPLAY.TABLE; - case 'flex': - return DISPLAY.FLEX; - case 'grid': - return DISPLAY.GRID; - case 'ruby': - return DISPLAY.RUBY; - case 'subgrid': - return DISPLAY.SUBGRID; - case 'list-item': - return DISPLAY.LIST_ITEM; - case 'table-row-group': - return DISPLAY.TABLE_ROW_GROUP; - case 'table-header-group': - return DISPLAY.TABLE_HEADER_GROUP; - case 'table-footer-group': - return DISPLAY.TABLE_FOOTER_GROUP; - case 'table-row': - return DISPLAY.TABLE_ROW; - case 'table-cell': - return DISPLAY.TABLE_CELL; - case 'table-column-group': - return DISPLAY.TABLE_COLUMN_GROUP; - case 'table-column': - return DISPLAY.TABLE_COLUMN; - case 'table-caption': - return DISPLAY.TABLE_CAPTION; - case 'ruby-base': - return DISPLAY.RUBY_BASE; - case 'ruby-text': - return DISPLAY.RUBY_TEXT; - case 'ruby-base-container': - return DISPLAY.RUBY_BASE_CONTAINER; - case 'ruby-text-container': - return DISPLAY.RUBY_TEXT_CONTAINER; - case 'contents': - return DISPLAY.CONTENTS; - case 'inline-block': - return DISPLAY.INLINE_BLOCK; - case 'inline-list-item': - return DISPLAY.INLINE_LIST_ITEM; - case 'inline-table': - return DISPLAY.INLINE_TABLE; - case 'inline-flex': - return DISPLAY.INLINE_FLEX; - case 'inline-grid': - return DISPLAY.INLINE_GRID; - } - - return DISPLAY.NONE; - }; - - var setDisplayBit = function setDisplayBit(bit, display) { - return bit | parseDisplayValue(display); - }; - - var parseDisplay = exports.parseDisplay = function parseDisplay(display) { - return display.split(' ').reduce(setDisplayBit, 0); - }; - - /***/ }), - /* 35 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var FLOAT = exports.FLOAT = { - NONE: 0, - LEFT: 1, - RIGHT: 2, - INLINE_START: 3, - INLINE_END: 4 - }; - - var parseCSSFloat = exports.parseCSSFloat = function parseCSSFloat(float) { - switch (float) { - case 'left': - return FLOAT.LEFT; - case 'right': - return FLOAT.RIGHT; - case 'inline-start': - return FLOAT.INLINE_START; - case 'inline-end': - return FLOAT.INLINE_END; - } - return FLOAT.NONE; - }; - - /***/ }), - /* 36 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - - var parseFontWeight = function parseFontWeight(weight) { - switch (weight) { - case 'normal': - return 400; - case 'bold': - return 700; - } - - var value = parseInt(weight, 10); - return isNaN(value) ? 400 : value; - }; - - var parseFont = exports.parseFont = function parseFont(style) { - var fontFamily = style.fontFamily; - var fontSize = style.fontSize; - var fontStyle = style.fontStyle; - var fontVariant = style.fontVariant; - var fontWeight = parseFontWeight(style.fontWeight); - - return { - fontFamily: fontFamily, - fontSize: fontSize, - fontStyle: fontStyle, - fontVariant: fontVariant, - fontWeight: fontWeight - }; - }; - - /***/ }), - /* 37 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var parseLetterSpacing = exports.parseLetterSpacing = function parseLetterSpacing(letterSpacing) { - if (letterSpacing === 'normal') { - return 0; - } - var value = parseFloat(letterSpacing); - return isNaN(value) ? 0 : value; - }; - - /***/ }), - /* 38 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var LINE_BREAK = exports.LINE_BREAK = { - NORMAL: 'normal', - STRICT: 'strict' - }; - - var parseLineBreak = exports.parseLineBreak = function parseLineBreak(wordBreak) { - switch (wordBreak) { - case 'strict': - return LINE_BREAK.STRICT; - case 'normal': - default: - return LINE_BREAK.NORMAL; - } - }; - - /***/ }), - /* 39 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseMargin = undefined; - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var SIDES = ['top', 'right', 'bottom', 'left']; - - var parseMargin = exports.parseMargin = function parseMargin(style) { - return SIDES.map(function (side) { - return new _Length2.default(style.getPropertyValue('margin-' + side)); - }); - }; - - /***/ }), - /* 40 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var OVERFLOW = exports.OVERFLOW = { - VISIBLE: 0, - HIDDEN: 1, - SCROLL: 2, - AUTO: 3 - }; - - var parseOverflow = exports.parseOverflow = function parseOverflow(overflow) { - switch (overflow) { - case 'hidden': - return OVERFLOW.HIDDEN; - case 'scroll': - return OVERFLOW.SCROLL; - case 'auto': - return OVERFLOW.AUTO; - case 'visible': - default: - return OVERFLOW.VISIBLE; - } - }; - - /***/ }), - /* 41 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTextShadow = undefined; - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var NUMBER = /^([+-]|\d|\.)$/i; - - var parseTextShadow = exports.parseTextShadow = function parseTextShadow(textShadow) { - if (textShadow === 'none' || typeof textShadow !== 'string') { - return null; - } - - var currentValue = ''; - var isLength = false; - var values = []; - var shadows = []; - var numParens = 0; - var color = null; - - var appendValue = function appendValue() { - if (currentValue.length) { - if (isLength) { - values.push(parseFloat(currentValue)); - } else { - color = new _Color2.default(currentValue); - } - } - isLength = false; - currentValue = ''; - }; - - var appendShadow = function appendShadow() { - if (values.length && color !== null) { - shadows.push({ - color: color, - offsetX: values[0] || 0, - offsetY: values[1] || 0, - blur: values[2] || 0 - }); - } - values.splice(0, values.length); - color = null; - }; - - for (var i = 0; i < textShadow.length; i++) { - var c = textShadow[i]; - switch (c) { - case '(': - currentValue += c; - numParens++; - break; - case ')': - currentValue += c; - numParens--; - break; - case ',': - if (numParens === 0) { - appendValue(); - appendShadow(); - } else { - currentValue += c; - } - break; - case ' ': - if (numParens === 0) { - appendValue(); - } else { - currentValue += c; - } - break; - default: - if (currentValue.length === 0 && NUMBER.test(c)) { - isLength = true; - } - currentValue += c; - } - } - - appendValue(); - appendShadow(); - - if (shadows.length === 0) { - return null; - } - - return shadows; - }; - - /***/ }), - /* 42 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.parseTransform = undefined; - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - var toFloat = function toFloat(s) { - return parseFloat(s.trim()); - }; - - var MATRIX = /(matrix|matrix3d)\((.+)\)/; - - var parseTransform = exports.parseTransform = function parseTransform(style) { - var transform = parseTransformMatrix(style.transform || style.webkitTransform || style.mozTransform || - // $FlowFixMe - style.msTransform || - // $FlowFixMe - style.oTransform); - if (transform === null) { - return null; - } - - return { - transform: transform, - transformOrigin: parseTransformOrigin(style.transformOrigin || style.webkitTransformOrigin || style.mozTransformOrigin || - // $FlowFixMe - style.msTransformOrigin || - // $FlowFixMe - style.oTransformOrigin) - }; - }; - -// $FlowFixMe - var parseTransformOrigin = function parseTransformOrigin(origin) { - if (typeof origin !== 'string') { - var v = new _Length2.default('0'); - return [v, v]; - } - var values = origin.split(' ').map(_Length2.default.create); - return [values[0], values[1]]; - }; - -// $FlowFixMe - var parseTransformMatrix = function parseTransformMatrix(transform) { - if (transform === 'none' || typeof transform !== 'string') { - return null; - } - - var match = transform.match(MATRIX); - if (match) { - if (match[1] === 'matrix') { - var matrix = match[2].split(',').map(toFloat); - return [matrix[0], matrix[1], matrix[2], matrix[3], matrix[4], matrix[5]]; - } else { - var matrix3d = match[2].split(',').map(toFloat); - return [matrix3d[0], matrix3d[1], matrix3d[4], matrix3d[5], matrix3d[12], matrix3d[13]]; - } - } - return null; - }; - - /***/ }), - /* 43 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var VISIBILITY = exports.VISIBILITY = { - VISIBLE: 0, - HIDDEN: 1, - COLLAPSE: 2 - }; - - var parseVisibility = exports.parseVisibility = function parseVisibility(visibility) { - switch (visibility) { - case 'hidden': - return VISIBILITY.HIDDEN; - case 'collapse': - return VISIBILITY.COLLAPSE; - case 'visible': - default: - return VISIBILITY.VISIBLE; - } - }; - - /***/ }), - /* 44 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var WORD_BREAK = exports.WORD_BREAK = { - NORMAL: 'normal', - BREAK_ALL: 'break-all', - KEEP_ALL: 'keep-all' - }; - - var parseWordBreak = exports.parseWordBreak = function parseWordBreak(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; - } - }; - - /***/ }), - /* 45 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var parseZIndex = exports.parseZIndex = function parseZIndex(zIndex) { - var auto = zIndex === 'auto'; - return { - auto: auto, - order: auto ? 0 : parseInt(zIndex, 10) - }; - }; - - /***/ }), - /* 46 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _Util = __webpack_require__(13); - - Object.defineProperty(exports, 'toCodePoints', { - enumerable: true, - get: function get() { - return _Util.toCodePoints; - } - }); - Object.defineProperty(exports, 'fromCodePoint', { - enumerable: true, - get: function get() { - return _Util.fromCodePoint; - } - }); - - var _LineBreak = __webpack_require__(47); - - Object.defineProperty(exports, 'LineBreaker', { - enumerable: true, - get: function get() { - return _LineBreak.LineBreaker; - } - }); - - /***/ }), - /* 47 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.LineBreaker = exports.inlineBreakOpportunities = exports.lineBreakAtIndex = exports.codePointsToCharacterClasses = exports.UnicodeTrie = exports.BREAK_ALLOWED = exports.BREAK_NOT_ALLOWED = exports.BREAK_MANDATORY = exports.classes = exports.LETTER_NUMBER_MODIFIER = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _Trie = __webpack_require__(48); - - var _linebreakTrie = __webpack_require__(49); - - var _linebreakTrie2 = _interopRequireDefault(_linebreakTrie); - - var _Util = __webpack_require__(13); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var LETTER_NUMBER_MODIFIER = exports.LETTER_NUMBER_MODIFIER = 50; - -// Non-tailorable Line Breaking Classes - var BK = 1; // Cause a line break (after) - var CR = 2; // Cause a line break (after), except between CR and LF - var LF = 3; // Cause a line break (after) - var CM = 4; // Prohibit a line break between the character and the preceding character - var NL = 5; // Cause a line break (after) - var SG = 6; // Do not occur in well-formed text - var WJ = 7; // Prohibit line breaks before and after - var ZW = 8; // Provide a break opportunity - var GL = 9; // Prohibit line breaks before and after - var SP = 10; // Enable indirect line breaks - var ZWJ = 11; // Prohibit line breaks within joiner sequences -// Break Opportunities - var B2 = 12; // Provide a line break opportunity before and after the character - var BA = 13; // Generally provide a line break opportunity after the character - var BB = 14; // Generally provide a line break opportunity before the character - var HY = 15; // Provide a line break opportunity after the character, except in numeric context - var CB = 16; // Provide a line break opportunity contingent on additional information -// Characters Prohibiting Certain Breaks - var CL = 17; // Prohibit line breaks before - var CP = 18; // Prohibit line breaks before - var EX = 19; // Prohibit line breaks before - var IN = 20; // Allow only indirect line breaks between pairs - var NS = 21; // Allow only indirect line breaks before - var OP = 22; // Prohibit line breaks after - var QU = 23; // Act like they are both opening and closing -// Numeric Context - var IS = 24; // Prevent breaks after any and before numeric - var NU = 25; // Form numeric expressions for line breaking purposes - var PO = 26; // Do not break following a numeric expression - var PR = 27; // Do not break in front of a numeric expression - var SY = 28; // Prevent a break before; and allow a break after -// Other Characters - var AI = 29; // Act like AL when the resolvedEAW is N; otherwise; act as ID - var AL = 30; // Are alphabetic characters or symbols that are used with alphabetic characters - var CJ = 31; // Treat as NS or ID for strict or normal breaking. - var EB = 32; // Do not break from following Emoji Modifier - var EM = 33; // Do not break from preceding Emoji Base - var H2 = 34; // Form Korean syllable blocks - var H3 = 35; // Form Korean syllable blocks - var HL = 36; // Do not break around a following hyphen; otherwise act as Alphabetic - var ID = 37; // Break before or after; except in some numeric context - var JL = 38; // Form Korean syllable blocks - var JV = 39; // Form Korean syllable blocks - var JT = 40; // Form Korean syllable blocks - var RI = 41; // Keep pairs together. For pairs; break before and after other classes - 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 classes = exports.classes = { - BK: BK, - CR: CR, - LF: LF, - CM: CM, - NL: NL, - SG: SG, - WJ: WJ, - ZW: ZW, - GL: GL, - SP: SP, - ZWJ: ZWJ, - B2: B2, - BA: BA, - BB: BB, - HY: HY, - CB: CB, - CL: CL, - CP: CP, - EX: EX, - IN: IN, - NS: NS, - OP: OP, - QU: QU, - IS: IS, - NU: NU, - PO: PO, - PR: PR, - SY: SY, - AI: AI, - AL: AL, - CJ: CJ, - EB: EB, - EM: EM, - H2: H2, - H3: H3, - HL: HL, - ID: ID, - JL: JL, - JV: JV, - JT: JT, - RI: RI, - SA: SA, - XX: XX - }; - - var BREAK_MANDATORY = exports.BREAK_MANDATORY = '!'; - var BREAK_NOT_ALLOWED = exports.BREAK_NOT_ALLOWED = '×'; - var BREAK_ALLOWED = exports.BREAK_ALLOWED = '÷'; - var UnicodeTrie = exports.UnicodeTrie = (0, _Trie.createTrieFromBase64)(_linebreakTrie2.default); - - var ALPHABETICS = [AL, HL]; - var HARD_LINE_BREAKS = [BK, CR, LF, NL]; - var SPACE = [SP, ZW]; - var PREFIX_POSTFIX = [PR, PO]; - var LINE_BREAKS = HARD_LINE_BREAKS.concat(SPACE); - var KOREAN_SYLLABLE_BLOCK = [JL, JV, JT, H2, H3]; - var HYPHEN = [HY, BA]; - - var codePointsToCharacterClasses = exports.codePointsToCharacterClasses = function codePointsToCharacterClasses(codePoints) { - var lineBreak = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'strict'; - - var types = []; - var indicies = []; - var categories = []; - codePoints.forEach(function (codePoint, index) { - var classType = UnicodeTrie.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) { - indicies.push(index); - return types.push(CB); - } - } - - if (classType === CM || classType === ZWJ) { - // LB10 Treat any remaining combining mark or ZWJ as AL. - if (index === 0) { - indicies.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) { - indicies.push(indicies[index - 1]); - return types.push(prev); - } - indicies.push(index); - return types.push(AL); - } - - indicies.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 [indicies, types, categories]; - }; - - var isAdjacentWithSpaceIgnored = function isAdjacentWithSpaceIgnored(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; - } - } - } - return false; - }; - - var previousNonSpaceClassType = function previousNonSpaceClassType(currentIndex, classTypes) { - var i = currentIndex; - while (i >= 0) { - var type = classTypes[i]; - if (type === SP) { - i--; - } else { - return type; - } - } - return 0; - }; - - var _lineBreakAtIndex = function _lineBreakAtIndex(codePoints, classTypes, indicies, index, forbiddenBreaks) { - if (indicies[index] === 0) { - return BREAK_NOT_ALLOWED; - } - - var currentIndex = index - 1; - if (Array.isArray(forbiddenBreaks) && forbiddenBreaks[currentIndex] === true) { - return BREAK_NOT_ALLOWED; - } - - 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 && next === LF) { - return BREAK_NOT_ALLOWED; - } - - 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; - } - - // LB7 Do not break before spaces or zero width space. - if (SPACE.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // 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; - } - - // LB8a Do not break between a zero width joiner and an ideograph, emoji base or emoji modifier. - if (UnicodeTrie.get(codePoints[currentIndex]) === ZWJ && (next === ID || next === EB || next === EM)) { - return BREAK_NOT_ALLOWED; - } - - // LB11 Do not break before or after Word joiner and related characters. - if (current === WJ || next === WJ) { - return BREAK_NOT_ALLOWED; - } - - // LB12 Do not break after NBSP and related characters. - if (current === GL) { - return BREAK_NOT_ALLOWED; - } - - // 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; - } - - // LB13 Do not break before ‘]’ or ‘!’ or ‘;’ or ‘/’, even after spaces. - if ([CL, CP, EX, IS, SY].indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB14 Do not break after ‘[’, even after spaces. - if (previousNonSpaceClassType(currentIndex, classTypes) === OP) { - return BREAK_NOT_ALLOWED; - } - - // LB15 Do not break within ‘”[’, even with intervening spaces. - if (isAdjacentWithSpaceIgnored(QU, OP, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED; - } - - // 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; - } - - // LB17 Do not break within ‘——’, even with intervening spaces. - if (isAdjacentWithSpaceIgnored(B2, B2, currentIndex, classTypes)) { - return BREAK_NOT_ALLOWED; - } - - // LB18 Break after spaces. - if (current === SP) { - return BREAK_ALLOWED; - } - - // LB19 Do not break before or after quotation marks, such as ‘ ” ’. - if (current === QU || next === QU) { - return BREAK_NOT_ALLOWED; - } - - // LB20 Break before and after unresolved CB. - if (next === CB || current === CB) { - return BREAK_ALLOWED; - } - - // 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; - } - - // LB21a Don't break after Hebrew + Hyphen. - if (before === HL && HYPHEN.indexOf(current) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB21b Don’t break between Solidus and Hebrew letters. - if (current === SY && next === HL) { - return BREAK_NOT_ALLOWED; - } - - // LB22 Do not break between two ellipses, or between letters, numbers or exclamations and ellipsis. - if (next === IN && ALPHABETICS.concat(IN, EX, NU, ID, EB, EM).indexOf(current) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // 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; - } - - // 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; - } - - // 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; - } - - // 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) { - return BREAK_NOT_ALLOWED; - } - - // 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; - } 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; - } 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) { - return BREAK_NOT_ALLOWED; - } - - // 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; - } - - // LB28 Do not break between alphabetics (“at”). - if (ALPHABETICS.indexOf(current) !== -1 && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB29 Do not break between numeric punctuation and alphabetics (“e.g.”). - if (current === IS && ALPHABETICS.indexOf(next) !== -1) { - return BREAK_NOT_ALLOWED; - } - - // LB30 Do not break between letters, numbers, or ordinary symbols and opening or closing parentheses. - if (ALPHABETICS.concat(NU).indexOf(current) !== -1 && next === OP || ALPHABETICS.concat(NU).indexOf(next) !== -1 && current === CP) { - return BREAK_NOT_ALLOWED; - } - - // 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 && next === RI) { - var i = indicies[currentIndex]; - var count = 1; - while (i > 0) { - i--; - if (classTypes[i] === RI) { - count++; - } else { - break; - } - } - if (count % 2 !== 0) { - return BREAK_NOT_ALLOWED; - } - } - - // LB30b Do not break between an emoji base and an emoji modifier. - if (current === EB && next === EM) { - return BREAK_NOT_ALLOWED; - } - - return BREAK_ALLOWED; - }; - - var lineBreakAtIndex = exports.lineBreakAtIndex = function lineBreakAtIndex(codePoints, index) { - // LB2 Never break at the start of text. - if (index === 0) { - return BREAK_NOT_ALLOWED; - } - - // LB3 Always break at the end of text. - if (index >= codePoints.length) { - return BREAK_MANDATORY; - } - - var _codePointsToCharacte = codePointsToCharacterClasses(codePoints), - _codePointsToCharacte2 = _slicedToArray(_codePointsToCharacte, 2), - indicies = _codePointsToCharacte2[0], - classTypes = _codePointsToCharacte2[1]; - - return _lineBreakAtIndex(codePoints, classTypes, indicies, index); - }; - - var cssFormattedClasses = function cssFormattedClasses(codePoints, options) { - if (!options) { - options = { lineBreak: 'normal', wordBreak: 'normal' }; - } - - var _codePointsToCharacte3 = codePointsToCharacterClasses(codePoints, options.lineBreak), - _codePointsToCharacte4 = _slicedToArray(_codePointsToCharacte3, 3), - indicies = _codePointsToCharacte4[0], - classTypes = _codePointsToCharacte4[1], - isLetterNumber = _codePointsToCharacte4[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 (isLetterNumber, i) { - return isLetterNumber && codePoints[i] >= 0x4e00 && codePoints[i] <= 0x9fff; - }) : null; - - return [indicies, classTypes, forbiddenBreakpoints]; - }; - - var inlineBreakOpportunities = exports.inlineBreakOpportunities = function inlineBreakOpportunities(str, options) { - var codePoints = (0, _Util.toCodePoints)(str); - var output = BREAK_NOT_ALLOWED; - - var _cssFormattedClasses = cssFormattedClasses(codePoints, options), - _cssFormattedClasses2 = _slicedToArray(_cssFormattedClasses, 3), - indicies = _cssFormattedClasses2[0], - classTypes = _cssFormattedClasses2[1], - forbiddenBreakpoints = _cssFormattedClasses2[2]; - - codePoints.forEach(function (codePoint, i) { - output += (0, _Util.fromCodePoint)(codePoint) + (i >= codePoints.length - 1 ? BREAK_MANDATORY : _lineBreakAtIndex(codePoints, classTypes, indicies, i + 1, forbiddenBreakpoints)); - }); - - return output; - }; - - var Break = function () { - function Break(codePoints, lineBreak, start, end) { - _classCallCheck(this, Break); - - this._codePoints = codePoints; - this.required = lineBreak === BREAK_MANDATORY; - this.start = start; - this.end = end; - } - - _createClass(Break, [{ - key: 'slice', - value: function slice() { - return _Util.fromCodePoint.apply(undefined, _toConsumableArray(this._codePoints.slice(this.start, this.end))); - } - }]); - - return Break; - }(); - - var LineBreaker = exports.LineBreaker = function LineBreaker(str, options) { - var codePoints = (0, _Util.toCodePoints)(str); - - var _cssFormattedClasses3 = cssFormattedClasses(codePoints, options), - _cssFormattedClasses4 = _slicedToArray(_cssFormattedClasses3, 3), - indicies = _cssFormattedClasses4[0], - classTypes = _cssFormattedClasses4[1], - forbiddenBreakpoints = _cssFormattedClasses4[2]; - - var length = codePoints.length; - var lastEnd = 0; - var nextIndex = 0; - - return { - next: function next() { - if (nextIndex >= length) { - return { done: true }; - } - var lineBreak = BREAK_NOT_ALLOWED; - while (nextIndex < length && (lineBreak = _lineBreakAtIndex(codePoints, classTypes, indicies, ++nextIndex, forbiddenBreakpoints)) === BREAK_NOT_ALLOWED) {} - - if (lineBreak !== BREAK_NOT_ALLOWED || nextIndex === length) { - var value = new Break(codePoints, lineBreak, lastEnd, nextIndex); - lastEnd = nextIndex; - return { value: value, done: false }; - } - - return { done: true }; - } - }; - }; - - /***/ }), - /* 48 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.Trie = exports.createTrieFromBase64 = exports.UTRIE2_INDEX_2_MASK = exports.UTRIE2_INDEX_2_BLOCK_LENGTH = exports.UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = exports.UTRIE2_INDEX_1_OFFSET = exports.UTRIE2_UTF8_2B_INDEX_2_LENGTH = exports.UTRIE2_UTF8_2B_INDEX_2_OFFSET = exports.UTRIE2_INDEX_2_BMP_LENGTH = exports.UTRIE2_LSCP_INDEX_2_LENGTH = exports.UTRIE2_DATA_MASK = exports.UTRIE2_DATA_BLOCK_LENGTH = exports.UTRIE2_LSCP_INDEX_2_OFFSET = exports.UTRIE2_SHIFT_1_2 = exports.UTRIE2_INDEX_SHIFT = exports.UTRIE2_SHIFT_1 = exports.UTRIE2_SHIFT_2 = undefined; - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Util = __webpack_require__(13); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - /** Shift size for getting the index-2 table offset. */ - var UTRIE2_SHIFT_2 = exports.UTRIE2_SHIFT_2 = 5; - - /** Shift size for getting the index-1 table offset. */ - var UTRIE2_SHIFT_1 = exports.UTRIE2_SHIFT_1 = 6 + 5; - - /** - * Shift size for shifting left the index array values. - * Increases possible data size with 16-bit index values at the cost - * of compactability. - * This requires data blocks to be aligned by UTRIE2_DATA_GRANULARITY. - */ - var UTRIE2_INDEX_SHIFT = exports.UTRIE2_INDEX_SHIFT = 2; - - /** - * Difference between the two shift sizes, - * for getting an index-1 offset from an index-2 offset. 6=11-5 - */ - var UTRIE2_SHIFT_1_2 = exports.UTRIE2_SHIFT_1_2 = UTRIE2_SHIFT_1 - UTRIE2_SHIFT_2; - - /** - * The part of the index-2 table for U+D800..U+DBFF stores values for - * lead surrogate code _units_ not code _points_. - * Values for lead surrogate code _points_ are indexed with this portion of the table. - * Length=32=0x20=0x400>>UTRIE2_SHIFT_2. (There are 1024=0x400 lead surrogates.) - */ - var UTRIE2_LSCP_INDEX_2_OFFSET = exports.UTRIE2_LSCP_INDEX_2_OFFSET = 0x10000 >> UTRIE2_SHIFT_2; - - /** Number of entries in a data block. 32=0x20 */ - var UTRIE2_DATA_BLOCK_LENGTH = exports.UTRIE2_DATA_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_2; - /** Mask for getting the lower bits for the in-data-block offset. */ - var UTRIE2_DATA_MASK = exports.UTRIE2_DATA_MASK = UTRIE2_DATA_BLOCK_LENGTH - 1; - - var UTRIE2_LSCP_INDEX_2_LENGTH = exports.UTRIE2_LSCP_INDEX_2_LENGTH = 0x400 >> UTRIE2_SHIFT_2; - /** Count the lengths of both BMP pieces. 2080=0x820 */ - var UTRIE2_INDEX_2_BMP_LENGTH = exports.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 = exports.UTRIE2_UTF8_2B_INDEX_2_OFFSET = UTRIE2_INDEX_2_BMP_LENGTH; - var UTRIE2_UTF8_2B_INDEX_2_LENGTH = exports.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. - * Maximum length 512=0x200=0x100000>>UTRIE2_SHIFT_1. - * (For 0x100000 supplementary code points U+10000..U+10ffff.) - * - * The part of the index-2 table for supplementary code points starts - * after this index-1 table. - * - * 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 = exports.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. - */ - var UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = exports.UTRIE2_OMITTED_BMP_INDEX_1_LENGTH = 0x10000 >> UTRIE2_SHIFT_1; - - /** Number of entries in an index-2 block. 64=0x40 */ - var UTRIE2_INDEX_2_BLOCK_LENGTH = exports.UTRIE2_INDEX_2_BLOCK_LENGTH = 1 << UTRIE2_SHIFT_1_2; - /** Mask for getting the lower bits for the in-index-2-block offset. */ - var UTRIE2_INDEX_2_MASK = exports.UTRIE2_INDEX_2_MASK = UTRIE2_INDEX_2_BLOCK_LENGTH - 1; - - var createTrieFromBase64 = exports.createTrieFromBase64 = function createTrieFromBase64(base64) { - var buffer = (0, _Util.decode)(base64); - var view32 = Array.isArray(buffer) ? (0, _Util.polyUint32Array)(buffer) : new Uint32Array(buffer); - var view16 = Array.isArray(buffer) ? (0, _Util.polyUint16Array)(buffer) : new Uint16Array(buffer); - var headerLength = 24; - - var index = view16.slice(headerLength / 2, view32[4] / 2); - var data = view32[5] === 2 ? view16.slice((headerLength + view32[4]) / 2) : view32.slice(Math.ceil((headerLength + view32[4]) / 4)); - - return new Trie(view32[0], view32[1], view32[2], view32[3], index, data); - }; - - var Trie = exports.Trie = function () { - function Trie(initialValue, errorValue, highStart, highValueIndex, index, data) { - _classCallCheck(this, Trie); - - 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 - */ - - - _createClass(Trie, [{ - key: 'get', - value: function get(codePoint) { - var ix = void 0; - 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; - }(); - - /***/ }), - /* 49 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - module.exports = 'KwAAAAAAAAAACA4AIDoAAPAfAAACAAAAAAAIABAAGABAAEgAUABYAF4AZgBeAGYAYABoAHAAeABeAGYAfACEAIAAiACQAJgAoACoAK0AtQC9AMUAXgBmAF4AZgBeAGYAzQDVAF4AZgDRANkA3gDmAOwA9AD8AAQBDAEUARoBIgGAAIgAJwEvATcBPwFFAU0BTAFUAVwBZAFsAXMBewGDATAAiwGTAZsBogGkAawBtAG8AcIBygHSAdoB4AHoAfAB+AH+AQYCDgIWAv4BHgImAi4CNgI+AkUCTQJTAlsCYwJrAnECeQKBAk0CiQKRApkCoQKoArACuALAAsQCzAIwANQC3ALkAjAA7AL0AvwCAQMJAxADGAMwACADJgMuAzYDPgOAAEYDSgNSA1IDUgNaA1oDYANiA2IDgACAAGoDgAByA3YDfgOAAIQDgACKA5IDmgOAAIAAogOqA4AAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAK8DtwOAAIAAvwPHA88D1wPfAyAD5wPsA/QD/AOAAIAABAQMBBIEgAAWBB4EJgQuBDMEIAM7BEEEXgBJBCADUQRZBGEEaQQwADAAcQQ+AXkEgQSJBJEEgACYBIAAoASoBK8EtwQwAL8ExQSAAIAAgACAAIAAgACgAM0EXgBeAF4AXgBeAF4AXgBeANUEXgDZBOEEXgDpBPEE+QQBBQkFEQUZBSEFKQUxBTUFPQVFBUwFVAVcBV4AYwVeAGsFcwV7BYMFiwWSBV4AmgWgBacFXgBeAF4AXgBeAKsFXgCyBbEFugW7BcIFwgXIBcIFwgXQBdQF3AXkBesF8wX7BQMGCwYTBhsGIwYrBjMGOwZeAD8GRwZNBl4AVAZbBl4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAGMGXgBqBnEGXgBeAF4AXgBeAF4AXgBeAF4AXgB5BoAG4wSGBo4GkwaAAIADHgR5AF4AXgBeAJsGgABGA4AAowarBrMGswagALsGwwbLBjAA0wbaBtoG3QbaBtoG2gbaBtoG2gblBusG8wb7BgMHCwcTBxsHCwcjBysHMAc1BzUHOgdCB9oGSgdSB1oHYAfaBloHaAfaBlIH2gbaBtoG2gbaBtoG2gbaBjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHbQdeAF4ANQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQd1B30HNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B4MH2gaKB68EgACAAIAAgACAAIAAgACAAI8HlwdeAJ8HpweAAIAArwe3B14AXgC/B8UHygcwANAH2AfgB4AA6AfwBz4B+AcACFwBCAgPCBcIogEYAR8IJwiAAC8INwg/CCADRwhPCFcIXwhnCEoDGgSAAIAAgABvCHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIfQh3CHgIeQh6CHsIfAh9CHcIeAh5CHoIewh8CH0Idwh4CHkIegh7CHwIhAiLCI4IMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlggwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAANQc1BzUHNQc1BzUHNQc1BzUHNQc1B54INQc1B6II2gaqCLIIugiAAIAAvgjGCIAAgACAAIAAgACAAIAAgACAAIAAywiHAYAA0wiAANkI3QjlCO0I9Aj8CIAAgACAAAIJCgkSCRoJIgknCTYHLwk3CZYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiWCJYIlgiAAIAAAAFAAXgBeAGAAcABeAHwAQACQAKAArQC9AJ4AXgBeAE0A3gBRAN4A7AD8AMwBGgEAAKcBNwEFAUwBXAF4QkhCmEKnArcCgAHHAsABz4LAAcABwAHAAd+C6ABoAG+C/4LAAcABwAHAAc+DF4MAAcAB54M3gweDV4Nng3eDaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAGgAaABoAEeDqABVg6WDqABoQ6gAaABoAHXDvcONw/3DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DvcO9w73DncPAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcABwAHAAcAB7cPPwlGCU4JMACAAIAAgABWCV4JYQmAAGkJcAl4CXwJgAkwADAAMAAwAIgJgACLCZMJgACZCZ8JowmrCYAAswkwAF4AXgB8AIAAuwkABMMJyQmAAM4JgADVCTAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAqwYWBNkIMAAwADAAMADdCeAJ6AnuCR4E9gkwAP4JBQoNCjAAMACAABUK0wiAAB0KJAosCjQKgAAwADwKQwqAAEsKvQmdCVMKWwowADAAgACAALcEMACAAGMKgABrCjAAMAAwADAAMAAwADAAMAAwADAAMAAeBDAAMAAwADAAMAAwADAAMAAwADAAMAAwAIkEPQFzCnoKiQSCCooKkAqJBJgKoAqkCokEGAGsCrQKvArBCjAAMADJCtEKFQHZCuEK/gHpCvEKMAAwADAAMACAAIwE+QowAIAAPwEBCzAAMAAwADAAMACAAAkLEQswAIAAPwEZCyELgAAOCCkLMAAxCzkLMAAwADAAMAAwADAAXgBeAEELMAAwADAAMAAwADAAMAAwAEkLTQtVC4AAXAtkC4AAiQkwADAAMAAwADAAMAAwADAAbAtxC3kLgAuFC4sLMAAwAJMLlwufCzAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAApwswADAAMACAAIAAgACvC4AAgACAAIAAgACAALcLMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAvwuAAMcLgACAAIAAgACAAIAAyguAAIAAgACAAIAA0QswADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAANkLgACAAIAA4AswADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACJCR4E6AswADAAhwHwC4AA+AsADAgMEAwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMACAAIAAGAwdDCUMMAAwAC0MNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQw1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHPQwwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUHNQc1BzUHNQc1BzUHNQc2BzAAMAA5DDUHNQc1BzUHNQc1BzUHNQc1BzUHNQdFDDAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAgACAAIAATQxSDFoMMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAF4AXgBeAF4AXgBeAF4AYgxeAGoMXgBxDHkMfwxeAIUMXgBeAI0MMAAwADAAMAAwAF4AXgCVDJ0MMAAwADAAMABeAF4ApQxeAKsMswy7DF4Awgy9DMoMXgBeAF4AXgBeAF4AXgBeAF4AXgDRDNkMeQBqCeAM3Ax8AOYM7Az0DPgMXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgBeAF4AXgCgAAANoAAHDQ4NFg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAeDSYNMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAIAAgACAAIAAgACAAC4NMABeAF4ANg0wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwAD4NRg1ODVYNXg1mDTAAbQ0wADAAMAAwADAAMAAwADAA2gbaBtoG2gbaBtoG2gbaBnUNeg3CBYANwgWFDdoGjA3aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gaUDZwNpA2oDdoG2gawDbcNvw3HDdoG2gbPDdYN3A3fDeYN2gbsDfMN2gbaBvoN/g3aBgYODg7aBl4AXgBeABYOXgBeACUG2gYeDl4AJA5eACwO2w3aBtoGMQ45DtoG2gbaBtoGQQ7aBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDjUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B1EO2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQdZDjUHNQc1BzUHNQc1B2EONQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHaA41BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B3AO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gY1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1BzUHNQc1B2EO2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gZJDtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBtoG2gbaBkkOeA6gAKAAoAAwADAAMAAwAKAAoACgAKAAoACgAKAAgA4wADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAD//wQABAAEAAQABAAEAAQABAAEAA0AAwABAAEAAgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAKABMAFwAeABsAGgAeABcAFgASAB4AGwAYAA8AGAAcAEsASwBLAEsASwBLAEsASwBLAEsAGAAYAB4AHgAeABMAHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAFgAbABIAHgAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYADQARAB4ABAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAUABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkAFgAaABsAGwAbAB4AHQAdAB4ATwAXAB4ADQAeAB4AGgAbAE8ATwAOAFAAHQAdAB0ATwBPABcATwBPAE8AFgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAFAATwBAAE8ATwBPAEAATwBQAFAATwBQAB4AHgAeAB4AHgAeAB0AHQAdAB0AHgAdAB4ADgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgBQAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAJAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAkACQAJAAkACQAJAAkABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgAeAFAAHgAeAB4AKwArAFAAUABQAFAAGABQACsAKwArACsAHgAeAFAAHgBQAFAAUAArAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAAQABAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUAAeAB4AHgAeAB4AHgArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwAYAA0AKwArAB4AHgAbACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQADQAEAB4ABAAEAB4ABAAEABMABAArACsAKwArACsAKwArACsAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAKwArACsAKwArAFYAVgBWAB4AHgArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AGgAaABoAGAAYAB4AHgAEAAQABAAEAAQABAAEAAQABAAEAAQAEwAEACsAEwATAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABLAEsASwBLAEsASwBLAEsASwBLABoAGQAZAB4AUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABMAUAAEAAQABAAEAAQABAAEAB4AHgAEAAQABAAEAAQABABQAFAABAAEAB4ABAAEAAQABABQAFAASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUAAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAFAABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQAUABQAB4AHgAYABMAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAFAABAAEAAQABAAEAFAABAAEAAQAUAAEAAQABAAEAAQAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAArACsAHgArAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAAQABAANAA0ASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAKwArACsAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAUAArACsAKwArACsAKwArACsABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAGgAaAFAAUABQAFAAUABMAB4AGwBQAB4AKwArACsABAAEAAQAKwBQAFAAUABQAFAAUAArACsAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUAArAFAAUAArACsABAArAAQABAAEAAQABAArACsAKwArAAQABAArACsABAAEAAQAKwArACsABAArACsAKwArACsAKwArAFAAUABQAFAAKwBQACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwAEAAQAUABQAFAABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUAArAFAAUABQAFAAUAArACsABABQAAQABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQAKwArAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeABsAKwArACsAKwArACsAKwBQAAQABAAEAAQABAAEACsABAAEAAQAKwBQAFAAUABQAFAAUABQAFAAKwArAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArAAQABAArACsABAAEAAQAKwArACsAKwArACsAKwArAAQABAArACsAKwArAFAAUAArAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwAeAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwAEAFAAKwBQAFAAUABQAFAAUAArACsAKwBQAFAAUAArAFAAUABQAFAAKwArACsAUABQACsAUAArAFAAUAArACsAKwBQAFAAKwArACsAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwAEAAQABAAEAAQAKwArACsABAAEAAQAKwAEAAQABAAEACsAKwBQACsAKwArACsAKwArAAQAKwArACsAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAB4AHgAeAB4AHgAeABsAHgArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArAFAAUABQACsAKwArACsAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAB4AUAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQACsAKwAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABAArACsAKwArACsAKwArAAQABAArACsAKwArACsAKwArAFAAKwBQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAFAABAAEAAQABAAEAAQABAArAAQABAAEACsABAAEAAQABABQAB4AKwArACsAKwBQAFAAUAAEAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwBLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQABoAUABQAFAAUABQAFAAKwArAAQABAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQACsAUAArACsAUABQAFAAUABQAFAAUAArACsAKwAEACsAKwArACsABAAEAAQABAAEAAQAKwAEACsABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgAqACsAKwArACsAGwBcAFwAXABcAFwAXABcACoAKgAqACoAKgAqACoAKgAeAEsASwBLAEsASwBLAEsASwBLAEsADQANACsAKwArACsAKwBcAFwAKwBcACsAKwBcAFwAKwBcACsAKwBcACsAKwArACsAKwArAFwAXABcAFwAKwBcAFwAXABcAFwAXABcACsAXABcAFwAKwBcACsAXAArACsAXABcACsAXABcAFwAXAAqAFwAXAAqACoAKgAqACoAKgArACoAKgBcACsAKwBcAFwAXABcAFwAKwBcACsAKgAqACoAKgAqACoAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArAFwAXABcAFwAUAAOAA4ADgAOAB4ADgAOAAkADgAOAA0ACQATABMAEwATABMACQAeABMAHgAeAB4ABAAEAB4AHgAeAB4AHgAeAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAFAAUAANAAQAHgAEAB4ABAAWABEAFgARAAQABABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAAQABAAEAAQABAANAAQABABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsADQANAB4AHgAeAB4AHgAeAAQAHgAeAB4AHgAeAB4AKwAeAB4ADgAOAA0ADgAeAB4AHgAeAB4ACQAJACsAKwArACsAKwBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqAFwASwBLAEsASwBLAEsASwBLAEsASwANAA0AHgAeAB4AHgBcAFwAXABcAFwAXAAqACoAKgAqAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAKgAqACoAKgAqACoAKgBcAFwAXAAqACoAKgAqAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgAqACoAXAAqAEsASwBLAEsASwBLAEsASwBLAEsAKgAqACoAKgAqACoAUABQAFAAUABQAFAAKwBQACsAKwArACsAKwBQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQACsAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwAEAAQABAAeAA0AHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQABYAEQArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAADQANAA0AUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAA0ADQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQACsABAAEACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoADQANABUAXAANAB4ADQAbAFwAKgArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAB4AHgATABMADQANAA4AHgATABMAHgAEAAQABAAJACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAUABQAFAAUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwAeACsAKwArABMAEwBLAEsASwBLAEsASwBLAEsASwBLAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwBcAFwAXABcAFwAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcACsAKwArACsAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBcACsAKwArACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEACsAKwAeAB4AXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAKgAqACoAKgAqACoAKgArACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsABABLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKgAqACoAKgAqACoAKgBcACoAKgAqACoAKgAqACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAUABQAFAAUABQAFAAUAArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsADQANAB4ADQANAA0ADQAeAB4AHgAeAB4AHgAeAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArAAQABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAEsASwBLAEsASwBLAEsASwBLAEsAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAHgAeAB4AHgBQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwANAA0ADQANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwBQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAANAA0AUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsABAAEAAQAHgAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAFAAUABQAFAABABQAFAAUABQAAQABAAEAFAAUAAEAAQABAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAKwBQACsAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAFAAHgAeAB4AUABQAFAAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAKwArAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAKwAeAB4AHgAeAB4AHgAeAA4AHgArAA0ADQANAA0ADQANAA0ACQANAA0ADQAIAAQACwAEAAQADQAJAA0ADQAMAB0AHQAeABcAFwAWABcAFwAXABYAFwAdAB0AHgAeABQAFAAUAA0AAQABAAQABAAEAAQABAAJABoAGgAaABoAGgAaABoAGgAeABcAFwAdABUAFQAeAB4AHgAeAB4AHgAYABYAEQAVABUAFQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgANAB4ADQANAA0ADQAeAA0ADQANAAcAHgAeAB4AHgArAAQABAAEAAQABAAEAAQABAAEAAQAUABQACsAKwBPAFAAUABQAFAAUAAeAB4AHgAWABEATwBQAE8ATwBPAE8AUABQAFAAUABQAB4AHgAeABYAEQArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAaABsAGwAbABsAGgAbABsAGgAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsAGwAbABsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgBQABoAHgAdAB4AUAAeABoAHgAeAB4AHgAeAB4AHgAeAB4ATwAeAFAAGwAeAB4AUABQAFAAUABQAB4AHgAeAB0AHQAeAFAAHgBQAB4AUAAeAFAATwBQAFAAHgAeAB4AHgAeAB4AHgBQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AUABQAFAAUABPAE8AUABQAFAAUABQAE8AUABQAE8AUABPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAFAAUABQAE8ATwBPAE8ATwBPAE8ATwBPAE8AUABQAFAAUABQAFAAUABQAFAAHgAeAFAAUABQAFAATwAeAB4AKwArACsAKwAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB0AHQAeAB4AHgAdAB0AHgAeAB0AHgAeAB4AHQAeAB0AGwAbAB4AHQAeAB4AHgAeAB0AHgAeAB0AHQAdAB0AHgAeAB0AHgAdAB4AHQAdAB0AHQAdAB0AHgAdAB4AHgAeAB4AHgAdAB0AHQAdAB4AHgAeAB4AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAeAB4AHgAdAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHgAdAB0AHQAdAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHQAeAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAFgARAB4AHgAeAB4AHgAeAB0AHgAeAB4AHgAeAB4AHgAlACUAHgAeAB4AHgAeAB4AHgAeAB4AFgARAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBQAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeAB0AHQAdAB0AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAdAB0AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAdAB0AHgAeAB0AHQAeAB4AHgAeAB0AHQAeAB4AHgAeAB0AHQAdAB4AHgAdAB4AHgAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAeAB0AHQAeAB4AHQAeAB4AHgAeAB0AHQAeAB4AHgAeACUAJQAdAB0AJQAeACUAJQAlACAAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAHgAeAB4AHgAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB4AHQAdAB0AHgAdACUAHQAdAB4AHQAdAB4AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB0AHQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAHQAdAB0AHQAlAB4AJQAlACUAHQAlACUAHQAdAB0AJQAlAB0AHQAlAB0AHQAlACUAJQAeAB0AHgAeAB4AHgAdAB0AJQAdAB0AHQAdAB0AHQAlACUAJQAlACUAHQAlACUAIAAlAB0AHQAlACUAJQAlACUAJQAlACUAHgAeAB4AJQAlACAAIAAgACAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAdAB4AHgAeABcAFwAXABcAFwAXAB4AEwATACUAHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAWABEAFgARAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAWABEAFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAFgARABYAEQAWABEAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFgARABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeABYAEQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHQAdAB0AHQAdAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAeAB4AKwArACsAKwArABMADQANAA0AUAATAA0AUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUAANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAA0ADQANAA0ADQANAA0ADQAeAA0AFgANAB4AHgAXABcAHgAeABcAFwAWABEAFgARABYAEQAWABEADQANAA0ADQATAFAADQANAB4ADQANAB4AHgAeAB4AHgAMAAwADQANAA0AHgANAA0AFgANAA0ADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArAA0AEQARACUAJQBHAFcAVwAWABEAFgARABYAEQAWABEAFgARACUAJQAWABEAFgARABYAEQAWABEAFQAWABEAEQAlAFcAVwBXAFcAVwBXAFcAVwBXAAQABAAEAAQABAAEACUAVwBXAFcAVwA2ACUAJQBXAFcAVwBHAEcAJQAlACUAKwBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBRAFcAUQBXAFEAVwBXAFcAVwBXAFcAUQBXAFcAVwBXAFcAVwBRAFEAKwArAAQABAAVABUARwBHAFcAFQBRAFcAUQBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFEAVwBRAFcAUQBXAFcAVwBXAFcAVwBRAFcAVwBXAFcAVwBXAFEAUQBXAFcAVwBXABUAUQBHAEcAVwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACUAJQBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwArACUAJQAlACUAKwArACsAKwArACsAKwArACsAKwArACsAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQBRAFEAUQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAVwBXAFcAVwBXAFcAVwBXAFcAVwAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAE8ATwBPAE8ATwBPAE8ATwAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADQATAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABLAEsASwBLAEsASwBLAEsASwBLAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAABAAEAAQABAAeAAQABAAEAAQABAAEAAQABAAEAAQAHgBQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUABQAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAeAA0ADQANAA0ADQArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAB4AHgAeAB4AHgAeAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAB4AHgAeAB4AHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAAQAUABQAFAABABQAFAAUABQAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAeAB4AHgAeACsAKwArACsAUABQAFAAUABQAFAAHgAeABoAHgArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAADgAOABMAEwArACsAKwArACsAKwArACsABAAEAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwANAA0ASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUAAeAB4AHgBQAA4AUAArACsAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAA0ADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArAB4AWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYAFgAWABYACsAKwArAAQAHgAeAB4AHgAeAB4ADQANAA0AHgAeAB4AHgArAFAASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArAB4AHgBcAFwAXABcAFwAKgBcAFwAXABcAFwAXABcAFwAXABcAEsASwBLAEsASwBLAEsASwBLAEsAXABcAFwAXABcACsAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArAFAAUABQAAQAUABQAFAAUABQAFAAUABQAAQABAArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAHgANAA0ADQBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAKgAqACoAXAAqACoAKgBcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAAqAFwAKgAqACoAXABcACoAKgBcAFwAXABcAFwAKgAqAFwAKgBcACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcACoAKgBQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAA0ADQBQAFAAUAAEAAQAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQADQAEAAQAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAVABVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBUAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVAFUAVQBVACsAKwArACsAKwArACsAKwArACsAKwArAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAWQBZAFkAKwArACsAKwBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAWgBaAFoAKwArACsAKwAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYABgAGAAYAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArACsAKwArAFYABABWAFYAVgBWAFYAVgBWAFYAVgBWAB4AVgBWAFYAVgBWAFYAVgBWAFYAVgBWAFYAVgArAFYAVgBWAFYAVgArAFYAKwBWAFYAKwBWAFYAKwBWAFYAVgBWAFYAVgBWAFYAVgBWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAEQAWAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUAAaAB4AKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAGAARABEAGAAYABMAEwAWABEAFAArACsAKwArACsAKwAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACUAJQAlACUAJQAWABEAFgARABYAEQAWABEAFgARABYAEQAlACUAFgARACUAJQAlACUAJQAlACUAEQAlABEAKwAVABUAEwATACUAFgARABYAEQAWABEAJQAlACUAJQAlACUAJQAlACsAJQAbABoAJQArACsAKwArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAcAKwATACUAJQAbABoAJQAlABYAEQAlACUAEQAlABEAJQBXAFcAVwBXAFcAVwBXAFcAVwBXABUAFQAlACUAJQATACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXABYAJQARACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwAWACUAEQAlABYAEQARABYAEQARABUAVwBRAFEAUQBRAFEAUQBRAFEAUQBRAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAEcARwArACsAVwBXAFcAVwBXAFcAKwArAFcAVwBXAFcAVwBXACsAKwBXAFcAVwBXAFcAVwArACsAVwBXAFcAKwArACsAGgAbACUAJQAlABsAGwArAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwAEAAQABAAQAB0AKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsADQANAA0AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgBQAFAAHgAeAB4AKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQBQAFAAUABQACsAKwArACsAUABQAFAAUABQAFAAUABQAA0AUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAArACsAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArAFAAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAA0AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AHgBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsADQBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwBQAFAAUABQAFAABAAEAAQAKwAEAAQAKwArACsAKwArAAQABAAEAAQAUABQAFAAUAArAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsABAAEAAQAKwArACsAKwAEAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsADQANAA0ADQANAA0ADQANAB4AKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAB4AUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEACsAKwArACsAUABQAFAAUABQAA0ADQANAA0ADQANABQAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwANAA0ADQANAA0ADQANAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAHgAeAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQAeAB4AHgAeAB4AKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQABAAEAAQABAAeAB4AHgANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAKwArAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsASwBLAEsASwBLAEsASwBLAEsASwANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAeAA4AUAArACsAKwArACsAKwArACsAKwAEAFAAUABQAFAADQANAB4ADQAeAAQABAAEAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsAUAAOAFAADQANAA0AKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAANAA0AHgANAA0AHgAEACsAUABQAFAAUABQAFAAUAArAFAAKwBQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAA0AKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsABAAEAAQABAArAFAAUABQAFAAUABQAFAAUAArACsAUABQACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAArACsABAAEACsAKwAEAAQABAArACsAUAArACsAKwArACsAKwAEACsAKwArACsAKwBQAFAAUABQAFAABAAEACsAKwAEAAQABAAEAAQABAAEACsAKwArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABABQAFAAUABQAA0ADQANAA0AHgBLAEsASwBLAEsASwBLAEsASwBLACsADQArAB4AKwArAAQABAAEAAQAUABQAB4AUAArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEACsAKwAEAAQABAAEAAQABAAEAAQABAAOAA0ADQATABMAHgAeAB4ADQANAA0ADQANAA0ADQANAA0ADQANAA0ADQANAA0AUABQAFAAUAAEAAQAKwArAAQADQANAB4AUAArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwAOAA4ADgAOAA4ADgAOAA4ADgAOAA4ADgAOACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXABcAFwAXAArACsAKwAqACoAKgAqACoAKgAqACoAKgAqACoAKgAqACoAKgArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAXABcAA0ADQANACoASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwBQAFAABAAEAAQABAAEAAQABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAFAABAAEAAQABAAOAB4ADQANAA0ADQAOAB4ABAArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQAUABQAFAAUAArACsAUABQAFAAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAA0ADQANACsADgAOAA4ADQANACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAABAAEAAQABAAEAAQABAAEACsABAAEAAQABAAEAAQABAAEAFAADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwAOABMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQACsAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAArACsAKwAEACsABAAEACsABAAEAAQABAAEAAQABABQAAQAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsADQANAA0ADQANACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABIAEgAQwBDAEMAUABQAFAAUABDAFAAUABQAEgAQwBIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAASABDAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABIAEMAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAEsASwBLAEsASwBLAEsASwBLAEsAKwArACsAKwANAA0AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArAAQABAAEAAQABAANACsAKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAEAAQABAAEAAQABAAEAA0ADQANAB4AHgAeAB4AHgAeAFAAUABQAFAADQAeACsAKwArACsAKwArACsAKwArACsASwBLAEsASwBLAEsASwBLAEsASwArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAUAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAEcARwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwArACsAKwArACsAKwArACsAKwArACsAKwArAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwBQAFAAUABQAFAAUABQAFAAUABQACsAKwAeAAQABAANAAQABAAEAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAeAB4AHgArACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAEAAQABAAEAB4AHgAeAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQAHgAeAAQABAAEAAQABAAEAAQAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAEAAQABAAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwArACsAKwArACsAKwArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUAArACsAUAArACsAUABQACsAKwBQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AKwBQACsAUABQAFAAUABQAFAAUAArAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwAeAB4AUABQAFAAUABQACsAUAArACsAKwBQAFAAUABQAFAAUABQACsAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgArACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUAAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAHgAeAB4AHgAeAB4AHgAeAB4AKwArAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsASwBLAEsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4ABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAB4AHgAeAB4AHgAeAB4AHgAEAB4AHgAeAB4AHgAeAB4AHgAeAB4ABAAeAB4ADQANAA0ADQAeACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAArAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsABAAEAAQABAAEAAQABAArAAQABAArAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwBQAFAAUABQAFAAKwArAFAAUABQAFAAUABQAFAAUABQAAQABAAEAAQABAAEAAQAKwArACsAKwArACsAKwArACsAHgAeAB4AHgAEAAQABAAEAAQABAAEACsAKwArACsAKwBLAEsASwBLAEsASwBLAEsASwBLACsAKwArACsAFgAWAFAAUABQAFAAKwBQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUAArAFAAKwBQACsAKwArACsAKwArAFAAKwArACsAKwBQACsAUAArAFAAKwBQAFAAUAArAFAAUAArAFAAKwArAFAAKwBQACsAUAArAFAAKwBQACsAUABQACsAUAArACsAUABQAFAAUAArAFAAUABQAFAAUABQAFAAKwBQAFAAUABQACsAUABQAFAAUAArAFAAKwBQAFAAUABQAFAAUABQAFAAUABQACsAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQACsAKwArACsAKwBQAFAAUAArAFAAUABQAFAAUAArAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUABQAFAAUAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArAB4AHgArACsAKwArACsAKwArACsAKwArACsAKwArACsATwBPAE8ATwBPAE8ATwBPAE8ATwBPAE8ATwAlACUAJQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAeACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHgAeACUAJQAlACUAHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdAB0AHQAdACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQApACkAKQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeACUAJQAlACUAJQAeACUAJQAlACUAJQAgACAAIAAlACUAIAAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIQAhACEAIQAhACUAJQAgACAAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAIAAlACUAJQAlACAAJQAgACAAIAAgACAAIAAgACAAIAAlACUAJQAgACUAJQAlACUAIAAgACAAJQAgACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeACUAHgAlAB4AJQAlACUAJQAlACAAJQAlACUAJQAeACUAHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACAAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAIAAgACAAIAAgAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AFwAXABcAFQAVABUAHgAeAB4AHgAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAIAAgACAAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAIAAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAJQAlAB4AHgAeAB4AHgAeAB4AHgAeAB4AJQAlACUAJQAlACUAHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeAB4AHgAeACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAlACAAIAAlACUAJQAlACUAJQAgACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAIAAgACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACsAKwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAVwBXAFcAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQAlACUAJQArAAQAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAAEAAQABAArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsAKwArACsA'; - - /***/ }), - /* 50 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _Path = __webpack_require__(6); - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Circle = function Circle(x, y, radius) { - _classCallCheck(this, Circle); - - this.type = _Path.PATH.CIRCLE; - this.x = x; - this.y = y; - this.radius = radius; - if (true) { - if (isNaN(x)) { - console.error('Invalid x value given for Circle'); - } - if (isNaN(y)) { - console.error('Invalid y value given for Circle'); - } - if (isNaN(radius)) { - console.error('Invalid radius value given for Circle'); - } - } - }; - - exports.default = Circle; - - /***/ }), - /* 51 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Bounds = __webpack_require__(2); - - var _Font = __webpack_require__(25); - - var _Gradient = __webpack_require__(52); - - var _TextContainer = __webpack_require__(9); - - var _TextContainer2 = _interopRequireDefault(_TextContainer); - - var _background = __webpack_require__(5); - - var _border = __webpack_require__(12); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var Renderer = function () { - function Renderer(target, options) { - _classCallCheck(this, Renderer); - - this.target = target; - this.options = options; - target.render(options); - } - - _createClass(Renderer, [{ - key: 'renderNode', - value: function renderNode(container) { - if (container.isVisible()) { - this.renderNodeBackgroundAndBorders(container); - this.renderNodeContent(container); - } - } - }, { - key: 'renderNodeContent', - value: function renderNodeContent(container) { - var _this = this; - - var callback = function callback() { - if (container.childNodes.length) { - container.childNodes.forEach(function (child) { - if (child instanceof _TextContainer2.default) { - var style = child.parent.style; - _this.target.renderTextNode(child.bounds, style.color, style.font, style.textDecoration, style.textShadow); - } else { - _this.target.drawShape(child, container.style.color); - } - }); - } - - if (container.image) { - var _image = _this.options.imageStore.get(container.image); - if (_image) { - var contentBox = (0, _Bounds.calculateContentBox)(container.bounds, container.style.padding, container.style.border); - var _width = typeof _image.width === 'number' && _image.width > 0 ? _image.width : contentBox.width; - var _height = typeof _image.height === 'number' && _image.height > 0 ? _image.height : contentBox.height; - if (_width > 0 && _height > 0) { - _this.target.clip([(0, _Bounds.calculatePaddingBoxPath)(container.curvedBounds)], function () { - _this.target.drawImage(_image, new _Bounds.Bounds(0, 0, _width, _height), contentBox); - }); - } - } - } - }; - var paths = container.getClipPaths(); - if (paths.length) { - this.target.clip(paths, callback); - } else { - callback(); - } - } - }, { - key: 'renderNodeBackgroundAndBorders', - value: function renderNodeBackgroundAndBorders(container) { - var _this2 = this; - - var HAS_BACKGROUND = !container.style.background.backgroundColor.isTransparent() || container.style.background.backgroundImage.length; - - var hasRenderableBorders = container.style.border.some(function (border) { - return border.borderStyle !== _border.BORDER_STYLE.NONE && !border.borderColor.isTransparent(); - }); - - var callback = function callback() { - var backgroundPaintingArea = (0, _background.calculateBackgroungPaintingArea)(container.curvedBounds, container.style.background.backgroundClip); - - if (HAS_BACKGROUND) { - _this2.target.clip([backgroundPaintingArea], function () { - if (!container.style.background.backgroundColor.isTransparent()) { - _this2.target.fill(container.style.background.backgroundColor); - } - - _this2.renderBackgroundImage(container); - }); - } - - container.style.border.forEach(function (border, side) { - if (border.borderStyle !== _border.BORDER_STYLE.NONE && !border.borderColor.isTransparent()) { - _this2.renderBorder(border, side, container.curvedBounds); - } - }); - }; - - if (HAS_BACKGROUND || hasRenderableBorders) { - var paths = container.parent ? container.parent.getClipPaths() : []; - if (paths.length) { - this.target.clip(paths, callback); - } else { - callback(); - } - } - } - }, { - key: 'renderBackgroundImage', - value: function renderBackgroundImage(container) { - var _this3 = this; - - container.style.background.backgroundImage.slice(0).reverse().forEach(function (backgroundImage) { - if (backgroundImage.source.method === 'url' && backgroundImage.source.args.length) { - _this3.renderBackgroundRepeat(container, backgroundImage); - } else if (/gradient/i.test(backgroundImage.source.method)) { - _this3.renderBackgroundGradient(container, backgroundImage); - } - }); - } - }, { - key: 'renderBackgroundRepeat', - value: function renderBackgroundRepeat(container, background) { - var image = this.options.imageStore.get(background.source.args[0]); - if (image) { - var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border); - var backgroundImageSize = (0, _background.calculateBackgroundSize)(background, image, backgroundPositioningArea); - var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea); - var _path = (0, _background.calculateBackgroundRepeatPath)(background, position, backgroundImageSize, backgroundPositioningArea, container.bounds); - - var _offsetX = Math.round(backgroundPositioningArea.left + position.x); - var _offsetY = Math.round(backgroundPositioningArea.top + position.y); - this.target.renderRepeat(_path, image, backgroundImageSize, _offsetX, _offsetY); - } - } - }, { - key: 'renderBackgroundGradient', - value: function renderBackgroundGradient(container, background) { - var backgroundPositioningArea = (0, _background.calculateBackgroungPositioningArea)(container.style.background.backgroundOrigin, container.bounds, container.style.padding, container.style.border); - var backgroundImageSize = (0, _background.calculateGradientBackgroundSize)(background, backgroundPositioningArea); - var position = (0, _background.calculateBackgroundPosition)(background.position, backgroundImageSize, backgroundPositioningArea); - var gradientBounds = new _Bounds.Bounds(Math.round(backgroundPositioningArea.left + position.x), Math.round(backgroundPositioningArea.top + position.y), backgroundImageSize.width, backgroundImageSize.height); - - var gradient = (0, _Gradient.parseGradient)(container, background.source, gradientBounds); - if (gradient) { - switch (gradient.type) { - case _Gradient.GRADIENT_TYPE.LINEAR_GRADIENT: - // $FlowFixMe - this.target.renderLinearGradient(gradientBounds, gradient); - break; - case _Gradient.GRADIENT_TYPE.RADIAL_GRADIENT: - // $FlowFixMe - this.target.renderRadialGradient(gradientBounds, gradient); - break; - } - } - } - }, { - key: 'renderBorder', - value: function renderBorder(border, side, curvePoints) { - this.target.drawShape((0, _Bounds.parsePathForBorder)(curvePoints, side), border.borderColor); - } - }, { - key: 'renderStack', - value: function renderStack(stack) { - var _this4 = this; - - if (stack.container.isVisible()) { - var _opacity = stack.getOpacity(); - if (_opacity !== this._opacity) { - this.target.setOpacity(stack.getOpacity()); - this._opacity = _opacity; - } - - var _transform = stack.container.style.transform; - if (_transform !== null) { - this.target.transform(stack.container.bounds.left + _transform.transformOrigin[0].value, stack.container.bounds.top + _transform.transformOrigin[1].value, _transform.transform, function () { - return _this4.renderStackContent(stack); - }); - } else { - this.renderStackContent(stack); - } - } - } - }, { - key: 'renderStackContent', - value: function renderStackContent(stack) { - var _splitStackingContext = splitStackingContexts(stack), - _splitStackingContext2 = _slicedToArray(_splitStackingContext, 5), - negativeZIndex = _splitStackingContext2[0], - zeroOrAutoZIndexOrTransformedOrOpacity = _splitStackingContext2[1], - positiveZIndex = _splitStackingContext2[2], - nonPositionedFloats = _splitStackingContext2[3], - nonPositionedInlineLevel = _splitStackingContext2[4]; - - var _splitDescendants = splitDescendants(stack), - _splitDescendants2 = _slicedToArray(_splitDescendants, 2), - inlineLevel = _splitDescendants2[0], - nonInlineLevel = _splitDescendants2[1]; - - // https://www.w3.org/TR/css-position-3/#painting-order - // 1. the background and borders of the element forming the stacking context. - - - this.renderNodeBackgroundAndBorders(stack.container); - // 2. the child stacking contexts with negative stack levels (most negative first). - negativeZIndex.sort(sortByZIndex).forEach(this.renderStack, this); - // 3. For all its in-flow, non-positioned, block-level descendants in tree order: - this.renderNodeContent(stack.container); - nonInlineLevel.forEach(this.renderNode, this); - // 4. All non-positioned floating descendants, in tree order. For each one of these, - // treat the element as if it created a new stacking context, but any positioned descendants and descendants - // which actually create a new stacking context should be considered part of the parent stacking context, - // not this new one. - nonPositionedFloats.forEach(this.renderStack, this); - // 5. the in-flow, inline-level, non-positioned descendants, including inline tables and inline blocks. - nonPositionedInlineLevel.forEach(this.renderStack, this); - inlineLevel.forEach(this.renderNode, this); - // 6. All positioned, opacity or transform descendants, in tree order that fall into the following categories: - // All positioned descendants with 'z-index: auto' or 'z-index: 0', in tree order. - // For those with 'z-index: auto', treat the element as if it created a new stacking context, - // but any positioned descendants and descendants which actually create a new stacking context should be - // considered part of the parent stacking context, not this new one. For those with 'z-index: 0', - // treat the stacking context generated atomically. - // - // All opacity descendants with opacity less than 1 - // - // All transform descendants with transform other than none - zeroOrAutoZIndexOrTransformedOrOpacity.forEach(this.renderStack, this); - // 7. Stacking contexts formed by positioned descendants with z-indices greater than or equal to 1 in z-index - // order (smallest first) then tree order. - positiveZIndex.sort(sortByZIndex).forEach(this.renderStack, this); - } - }, { - key: 'render', - value: function render(stack) { - var _this5 = this; - - if (this.options.backgroundColor) { - this.target.rectangle(this.options.x, this.options.y, this.options.width, this.options.height, this.options.backgroundColor); - } - this.renderStack(stack); - var target = this.target.getTarget(); - if (true) { - return target.then(function (output) { - _this5.options.logger.log('Render completed'); - return output; - }); - } - return target; - } - }]); - - return Renderer; - }(); - - exports.default = Renderer; - - - var splitDescendants = function splitDescendants(stack) { - var inlineLevel = []; - var nonInlineLevel = []; - - var length = stack.children.length; - for (var i = 0; i < length; i++) { - var child = stack.children[i]; - if (child.isInlineLevel()) { - inlineLevel.push(child); - } else { - nonInlineLevel.push(child); - } - } - return [inlineLevel, nonInlineLevel]; - }; - - var splitStackingContexts = function splitStackingContexts(stack) { - var negativeZIndex = []; - var zeroOrAutoZIndexOrTransformedOrOpacity = []; - var positiveZIndex = []; - var nonPositionedFloats = []; - var nonPositionedInlineLevel = []; - var length = stack.contexts.length; - for (var i = 0; i < length; i++) { - var child = stack.contexts[i]; - if (child.container.isPositioned() || child.container.style.opacity < 1 || child.container.isTransformed()) { - if (child.container.style.zIndex.order < 0) { - negativeZIndex.push(child); - } else if (child.container.style.zIndex.order > 0) { - positiveZIndex.push(child); - } else { - zeroOrAutoZIndexOrTransformedOrOpacity.push(child); - } - } else { - if (child.container.isFloating()) { - nonPositionedFloats.push(child); - } else { - nonPositionedInlineLevel.push(child); - } - } - } - return [negativeZIndex, zeroOrAutoZIndexOrTransformedOrOpacity, positiveZIndex, nonPositionedFloats, nonPositionedInlineLevel]; - }; - - var sortByZIndex = function sortByZIndex(a, b) { - if (a.container.style.zIndex.order > b.container.style.zIndex.order) { - return 1; - } else if (a.container.style.zIndex.order < b.container.style.zIndex.order) { - return -1; - } - - return a.container.index > b.container.index ? 1 : -1; - }; - - /***/ }), - /* 52 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.transformWebkitRadialGradientArgs = exports.parseGradient = exports.RadialGradient = exports.LinearGradient = exports.RADIAL_GRADIENT_SHAPE = exports.GRADIENT_TYPE = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _NodeContainer = __webpack_require__(3); - - var _NodeContainer2 = _interopRequireDefault(_NodeContainer); - - var _Angle = __webpack_require__(53); - - var _Color = __webpack_require__(0); - - var _Color2 = _interopRequireDefault(_Color); - - var _Length = __webpack_require__(1); - - var _Length2 = _interopRequireDefault(_Length); - - var _Util = __webpack_require__(4); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var SIDE_OR_CORNER = /^(to )?(left|top|right|bottom)( (left|top|right|bottom))?$/i; - var PERCENTAGE_ANGLES = /^([+-]?\d*\.?\d+)% ([+-]?\d*\.?\d+)%$/i; - var ENDS_WITH_LENGTH = /(px)|%|( 0)$/i; - var FROM_TO_COLORSTOP = /^(from|to|color-stop)\((?:([\d.]+)(%)?,\s*)?(.+?)\)$/i; - var RADIAL_SHAPE_DEFINITION = /^\s*(circle|ellipse)?\s*((?:([\d.]+)(px|r?em|%)\s*(?:([\d.]+)(px|r?em|%))?)|closest-side|closest-corner|farthest-side|farthest-corner)?\s*(?:at\s*(?:(left|center|right)|([\d.]+)(px|r?em|%))\s+(?:(top|center|bottom)|([\d.]+)(px|r?em|%)))?(?:\s|$)/i; - - var GRADIENT_TYPE = exports.GRADIENT_TYPE = { - LINEAR_GRADIENT: 0, - RADIAL_GRADIENT: 1 - }; - - var RADIAL_GRADIENT_SHAPE = exports.RADIAL_GRADIENT_SHAPE = { - CIRCLE: 0, - ELLIPSE: 1 - }; - - var LENGTH_FOR_POSITION = { - left: new _Length2.default('0%'), - top: new _Length2.default('0%'), - center: new _Length2.default('50%'), - right: new _Length2.default('100%'), - bottom: new _Length2.default('100%') - }; - - var LinearGradient = exports.LinearGradient = function LinearGradient(colorStops, direction) { - _classCallCheck(this, LinearGradient); - - this.type = GRADIENT_TYPE.LINEAR_GRADIENT; - this.colorStops = colorStops; - this.direction = direction; - }; - - var RadialGradient = exports.RadialGradient = function RadialGradient(colorStops, shape, center, radius) { - _classCallCheck(this, RadialGradient); - - this.type = GRADIENT_TYPE.RADIAL_GRADIENT; - this.colorStops = colorStops; - this.shape = shape; - this.center = center; - this.radius = radius; - }; - - var parseGradient = exports.parseGradient = function parseGradient(container, _ref, bounds) { - var args = _ref.args, - method = _ref.method, - prefix = _ref.prefix; - - if (method === 'linear-gradient') { - return parseLinearGradient(args, bounds, !!prefix); - } else if (method === 'gradient' && args[0] === 'linear') { - // TODO handle correct angle - return parseLinearGradient(['to bottom'].concat(transformObsoleteColorStops(args.slice(3))), bounds, !!prefix); - } else if (method === 'radial-gradient') { - return parseRadialGradient(container, prefix === '-webkit-' ? transformWebkitRadialGradientArgs(args) : args, bounds); - } else if (method === 'gradient' && args[0] === 'radial') { - return parseRadialGradient(container, transformObsoleteColorStops(transformWebkitRadialGradientArgs(args.slice(1))), bounds); - } - }; - - var parseColorStops = function parseColorStops(args, firstColorStopIndex, lineLength) { - var colorStops = []; - - for (var i = firstColorStopIndex; i < args.length; i++) { - var value = args[i]; - var HAS_LENGTH = ENDS_WITH_LENGTH.test(value); - var lastSpaceIndex = value.lastIndexOf(' '); - var _color = new _Color2.default(HAS_LENGTH ? value.substring(0, lastSpaceIndex) : value); - var _stop = HAS_LENGTH ? new _Length2.default(value.substring(lastSpaceIndex + 1)) : i === firstColorStopIndex ? new _Length2.default('0%') : i === args.length - 1 ? new _Length2.default('100%') : null; - colorStops.push({ color: _color, stop: _stop }); - } - - var absoluteValuedColorStops = colorStops.map(function (_ref2) { - var color = _ref2.color, - stop = _ref2.stop; - - var absoluteStop = lineLength === 0 ? 0 : stop ? stop.getAbsoluteValue(lineLength) / lineLength : null; - - return { - color: color, - // $FlowFixMe - stop: absoluteStop - }; - }); - - var previousColorStop = absoluteValuedColorStops[0].stop; - for (var _i = 0; _i < absoluteValuedColorStops.length; _i++) { - if (previousColorStop !== null) { - var _stop2 = absoluteValuedColorStops[_i].stop; - if (_stop2 === null) { - var n = _i; - while (absoluteValuedColorStops[n].stop === null) { - n++; - } - var steps = n - _i + 1; - var nextColorStep = absoluteValuedColorStops[n].stop; - var stepSize = (nextColorStep - previousColorStop) / steps; - for (; _i < n; _i++) { - previousColorStop = absoluteValuedColorStops[_i].stop = previousColorStop + stepSize; - } - } else { - previousColorStop = _stop2; - } - } - } - - return absoluteValuedColorStops; - }; - - var parseLinearGradient = function parseLinearGradient(args, bounds, hasPrefix) { - var angle = (0, _Angle.parseAngle)(args[0]); - var HAS_SIDE_OR_CORNER = SIDE_OR_CORNER.test(args[0]); - var HAS_DIRECTION = HAS_SIDE_OR_CORNER || angle !== null || PERCENTAGE_ANGLES.test(args[0]); - var direction = HAS_DIRECTION ? angle !== null ? calculateGradientDirection( - // if there is a prefix, the 0° angle points due East (instead of North per W3C) - hasPrefix ? angle - Math.PI * 0.5 : angle, bounds) : HAS_SIDE_OR_CORNER ? parseSideOrCorner(args[0], bounds) : parsePercentageAngle(args[0], bounds) : calculateGradientDirection(Math.PI, bounds); - var firstColorStopIndex = HAS_DIRECTION ? 1 : 0; - - // TODO: Fix some inaccuracy with color stops with px values - var lineLength = Math.min((0, _Util.distance)(Math.abs(direction.x0) + Math.abs(direction.x1), Math.abs(direction.y0) + Math.abs(direction.y1)), bounds.width * 2, bounds.height * 2); - - return new LinearGradient(parseColorStops(args, firstColorStopIndex, lineLength), direction); - }; - - var parseRadialGradient = function parseRadialGradient(container, args, bounds) { - var m = args[0].match(RADIAL_SHAPE_DEFINITION); - var shape = m && (m[1] === 'circle' || // explicit shape specification - m[3] !== undefined && m[5] === undefined) // only one radius coordinate - ? RADIAL_GRADIENT_SHAPE.CIRCLE : RADIAL_GRADIENT_SHAPE.ELLIPSE; - var radius = {}; - var center = {}; - - if (m) { - // Radius - if (m[3] !== undefined) { - radius.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[3], m[4]).getAbsoluteValue(bounds.width); - } - - if (m[5] !== undefined) { - radius.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[5], m[6]).getAbsoluteValue(bounds.height); - } - - // Position - if (m[7]) { - center.x = LENGTH_FOR_POSITION[m[7].toLowerCase()]; - } else if (m[8] !== undefined) { - center.x = (0, _Length.calculateLengthFromValueWithUnit)(container, m[8], m[9]); - } - - if (m[10]) { - center.y = LENGTH_FOR_POSITION[m[10].toLowerCase()]; - } else if (m[11] !== undefined) { - center.y = (0, _Length.calculateLengthFromValueWithUnit)(container, m[11], m[12]); - } - } - - var gradientCenter = { - x: center.x === undefined ? bounds.width / 2 : center.x.getAbsoluteValue(bounds.width), - y: center.y === undefined ? bounds.height / 2 : center.y.getAbsoluteValue(bounds.height) - }; - var gradientRadius = calculateRadius(m && m[2] || 'farthest-corner', shape, gradientCenter, radius, bounds); - - return new RadialGradient(parseColorStops(args, m ? 1 : 0, Math.min(gradientRadius.x, gradientRadius.y)), shape, gradientCenter, gradientRadius); - }; - - var calculateGradientDirection = function calculateGradientDirection(radian, bounds) { - var width = bounds.width; - var height = bounds.height; - var HALF_WIDTH = width * 0.5; - var HALF_HEIGHT = height * 0.5; - var lineLength = Math.abs(width * Math.sin(radian)) + Math.abs(height * Math.cos(radian)); - var HALF_LINE_LENGTH = lineLength / 2; - - var x0 = HALF_WIDTH + Math.sin(radian) * HALF_LINE_LENGTH; - var y0 = HALF_HEIGHT - Math.cos(radian) * HALF_LINE_LENGTH; - var x1 = width - x0; - var y1 = height - y0; - - return { x0: x0, x1: x1, y0: y0, y1: y1 }; - }; - - var parseTopRight = function parseTopRight(bounds) { - return Math.acos(bounds.width / 2 / ((0, _Util.distance)(bounds.width, bounds.height) / 2)); - }; - - var parseSideOrCorner = function parseSideOrCorner(side, bounds) { - switch (side) { - case 'bottom': - case 'to top': - return calculateGradientDirection(0, bounds); - case 'left': - case 'to right': - return calculateGradientDirection(Math.PI / 2, bounds); - case 'right': - case 'to left': - return calculateGradientDirection(3 * Math.PI / 2, bounds); - case 'top right': - case 'right top': - case 'to bottom left': - case 'to left bottom': - return calculateGradientDirection(Math.PI + parseTopRight(bounds), bounds); - case 'top left': - case 'left top': - case 'to bottom right': - case 'to right bottom': - return calculateGradientDirection(Math.PI - parseTopRight(bounds), bounds); - case 'bottom left': - case 'left bottom': - case 'to top right': - case 'to right top': - return calculateGradientDirection(parseTopRight(bounds), bounds); - case 'bottom right': - case 'right bottom': - case 'to top left': - case 'to left top': - return calculateGradientDirection(2 * Math.PI - parseTopRight(bounds), bounds); - case 'top': - case 'to bottom': - default: - return calculateGradientDirection(Math.PI, bounds); - } - }; - - var parsePercentageAngle = function parsePercentageAngle(angle, bounds) { - var _angle$split$map = angle.split(' ').map(parseFloat), - _angle$split$map2 = _slicedToArray(_angle$split$map, 2), - left = _angle$split$map2[0], - top = _angle$split$map2[1]; - - var ratio = left / 100 * bounds.width / (top / 100 * bounds.height); - - return calculateGradientDirection(Math.atan(isNaN(ratio) ? 1 : ratio) + Math.PI / 2, bounds); - }; - - var findCorner = function findCorner(bounds, x, y, closest) { - var corners = [{ x: 0, y: 0 }, { x: 0, y: bounds.height }, { x: bounds.width, y: 0 }, { x: bounds.width, y: bounds.height }]; - - // $FlowFixMe - return corners.reduce(function (stat, corner) { - var d = (0, _Util.distance)(x - corner.x, y - corner.y); - 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 calculateRadius(extent, shape, center, radius, bounds) { - var x = center.x; - var y = center.y; - var rx = 0; - var ry = 0; - - switch (extent) { - case '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 (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.min(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) { - rx = Math.min(Math.abs(x), Math.abs(x - bounds.width)); - ry = Math.min(Math.abs(y), Math.abs(y - bounds.height)); - } - break; - - case '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 (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.min((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.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 - bounds.height)) / Math.min(Math.abs(x), Math.abs(x - bounds.width)); - var corner = findCorner(bounds, x, y, true); - rx = (0, _Util.distance)(corner.x - x, (corner.y - y) / c); - ry = c * rx; - } - break; - - case 'farthest-side': - // Same as closest-side, except the ending shape is sized based on the farthest side(s) - if (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.max(Math.abs(x), Math.abs(x - bounds.width), Math.abs(y), Math.abs(y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.ELLIPSE) { - rx = Math.max(Math.abs(x), Math.abs(x - bounds.width)); - ry = Math.max(Math.abs(y), Math.abs(y - bounds.height)); - } - break; - - case '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 (shape === RADIAL_GRADIENT_SHAPE.CIRCLE) { - rx = ry = Math.max((0, _Util.distance)(x, y), (0, _Util.distance)(x, y - bounds.height), (0, _Util.distance)(x - bounds.width, y), (0, _Util.distance)(x - bounds.width, y - bounds.height)); - } else if (shape === RADIAL_GRADIENT_SHAPE.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 - bounds.height)) / Math.max(Math.abs(x), Math.abs(x - bounds.width)); - var _corner = findCorner(bounds, x, y, false); - rx = (0, _Util.distance)(_corner.x - x, (_corner.y - y) / _c); - ry = _c * rx; - } - break; - - default: - // pixel or percentage values - rx = radius.x || 0; - ry = radius.y !== undefined ? radius.y : rx; - break; - } - - return { - x: rx, - y: ry - }; - }; - - var transformWebkitRadialGradientArgs = exports.transformWebkitRadialGradientArgs = function transformWebkitRadialGradientArgs(args) { - var shape = ''; - var radius = ''; - var extent = ''; - var position = ''; - var idx = 0; - - var POSITION = /^(left|center|right|\d+(?:px|r?em|%)?)(?:\s+(top|center|bottom|\d+(?:px|r?em|%)?))?$/i; - var SHAPE_AND_EXTENT = /^(circle|ellipse)?\s*(closest-side|closest-corner|farthest-side|farthest-corner|contain|cover)?$/i; - var RADIUS = /^\d+(px|r?em|%)?(?:\s+\d+(px|r?em|%)?)?$/i; - - var matchStartPosition = args[idx].match(POSITION); - if (matchStartPosition) { - idx++; - } - - var matchShapeExtent = args[idx].match(SHAPE_AND_EXTENT); - if (matchShapeExtent) { - shape = matchShapeExtent[1] || ''; - extent = matchShapeExtent[2] || ''; - if (extent === 'contain') { - extent = 'closest-side'; - } else if (extent === 'cover') { - extent = 'farthest-corner'; - } - idx++; - } - - var matchStartRadius = args[idx].match(RADIUS); - if (matchStartRadius) { - idx++; - } - - var matchEndPosition = args[idx].match(POSITION); - if (matchEndPosition) { - idx++; - } - - var matchEndRadius = args[idx].match(RADIUS); - if (matchEndRadius) { - idx++; - } - - var matchPosition = matchEndPosition || matchStartPosition; - if (matchPosition && matchPosition[1]) { - position = matchPosition[1] + (/^\d+$/.test(matchPosition[1]) ? 'px' : ''); - if (matchPosition[2]) { - position += ' ' + matchPosition[2] + (/^\d+$/.test(matchPosition[2]) ? 'px' : ''); - } - } - - var matchRadius = matchEndRadius || matchStartRadius; - if (matchRadius) { - radius = matchRadius[0]; - if (!matchRadius[1]) { - radius += 'px'; - } - } - - if (position && !shape && !radius && !extent) { - radius = position; - position = ''; - } - - if (position) { - position = 'at ' + position; - } - - return [[shape, extent, radius, position].filter(function (s) { - return !!s; - }).join(' ')].concat(args.slice(idx)); - }; - - var transformObsoleteColorStops = function transformObsoleteColorStops(args) { - return args.map(function (color) { - return color.match(FROM_TO_COLORSTOP); - }) - // $FlowFixMe - .map(function (v, index) { - if (!v) { - return args[index]; - } - - switch (v[1]) { - case 'from': - return v[4] + ' 0%'; - case 'to': - return v[4] + ' 100%'; - case 'color-stop': - if (v[3] === '%') { - return v[4] + ' ' + v[2]; - } - return v[4] + ' ' + parseFloat(v[2]) * 100 + '%'; - } - }); - }; - - /***/ }), - /* 53 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - var ANGLE = /([+-]?\d*\.?\d+)(deg|grad|rad|turn)/i; - - var parseAngle = exports.parseAngle = function parseAngle(angle) { - var match = angle.match(ANGLE); - - if (match) { - var value = parseFloat(match[1]); - switch (match[2].toLowerCase()) { - case 'deg': - return Math.PI * value / 180; - case 'grad': - return Math.PI / 200 * value; - case 'rad': - return value; - case 'turn': - return Math.PI * 2 * value; - } - } - - return null; - }; - - /***/ }), - /* 54 */ - /***/ (function(module, exports, __webpack_require__) { - - "use strict"; - - - Object.defineProperty(exports, "__esModule", { - value: true - }); - exports.cloneWindow = exports.DocumentCloner = undefined; - - var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }(); - - var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); - - var _Bounds = __webpack_require__(2); - - var _Proxy = __webpack_require__(26); - - var _ResourceLoader = __webpack_require__(55); - - var _ResourceLoader2 = _interopRequireDefault(_ResourceLoader); - - var _Util = __webpack_require__(4); - - var _background = __webpack_require__(5); - - var _CanvasRenderer = __webpack_require__(15); - - var _CanvasRenderer2 = _interopRequireDefault(_CanvasRenderer); - - var _PseudoNodeContent = __webpack_require__(56); - - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } - - function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - - var IGNORE_ATTRIBUTE = 'data-html2canvas-ignore'; - - var DocumentCloner = exports.DocumentCloner = function () { - function DocumentCloner(element, options, logger, copyInline, renderer) { - _classCallCheck(this, DocumentCloner); - - this.referenceElement = element; - this.scrolledElements = []; - this.copyStyles = copyInline; - this.inlineImages = copyInline; - this.logger = logger; - this.options = options; - this.renderer = renderer; - this.resourceLoader = new _ResourceLoader2.default(options, logger, window); - this.pseudoContentData = { - counters: {}, - quoteDepth: 0 - }; - // $FlowFixMe - this.documentElement = this.cloneNode(element.ownerDocument.documentElement); - } - - _createClass(DocumentCloner, [{ - key: 'inlineAllImages', - value: function inlineAllImages(node) { - var _this = this; - - if (this.inlineImages && node) { - var style = node.style; - Promise.all((0, _background.parseBackgroundImage)(style.backgroundImage).map(function (backgroundImage) { - if (backgroundImage.method === 'url') { - return _this.resourceLoader.inlineImage(backgroundImage.args[0]).then(function (img) { - return img && typeof img.src === 'string' ? 'url("' + img.src + '")' : 'none'; - }).catch(function (e) { - if (true) { - _this.logger.log('Unable to load image', e); - } - }); - } - return Promise.resolve('' + backgroundImage.prefix + backgroundImage.method + '(' + backgroundImage.args.join(',') + ')'); - })).then(function (backgroundImages) { - if (backgroundImages.length > 1) { - // TODO Multiple backgrounds somehow broken in Chrome - style.backgroundColor = ''; - } - style.backgroundImage = backgroundImages.join(','); - }); - - if (node instanceof HTMLImageElement) { - this.resourceLoader.inlineImage(node.src).then(function (img) { - if (img && node instanceof HTMLImageElement && node.parentNode) { - var parentNode = node.parentNode; - var clonedChild = (0, _Util.copyCSSStyles)(node.style, img.cloneNode(false)); - parentNode.replaceChild(clonedChild, node); - } - }).catch(function (e) { - if (true) { - _this.logger.log('Unable to load image', e); - } - }); - } - } - } - }, { - key: 'inlineFonts', - value: function inlineFonts(document) { - var _this2 = this; - - return Promise.all(Array.from(document.styleSheets).map(function (sheet) { - if (sheet.href) { - return fetch(sheet.href).then(function (res) { - return res.text(); - }).then(function (text) { - return createStyleSheetFontsFromText(text, sheet.href); - }).catch(function (e) { - if (true) { - _this2.logger.log('Unable to load stylesheet', e); - } - return []; - }); - } - return getSheetFonts(sheet, document); - })).then(function (fonts) { - return fonts.reduce(function (acc, font) { - return acc.concat(font); - }, []); - }).then(function (fonts) { - return Promise.all(fonts.map(function (font) { - return fetch(font.formats[0].src).then(function (response) { - return response.blob(); - }).then(function (blob) { - return new Promise(function (resolve, reject) { - var reader = new FileReader(); - reader.onerror = reject; - reader.onload = function () { - // $FlowFixMe - var result = reader.result; - resolve(result); - }; - reader.readAsDataURL(blob); - }); - }).then(function (dataUri) { - font.fontFace.setProperty('src', 'url("' + dataUri + '")'); - return '@font-face {' + font.fontFace.cssText + ' '; - }); - })); - }).then(function (fontCss) { - var style = document.createElement('style'); - style.textContent = fontCss.join('\n'); - _this2.documentElement.appendChild(style); - }); - } - }, { - key: 'createElementClone', - value: function createElementClone(node) { - var _this3 = this; - - if (this.copyStyles && node instanceof HTMLCanvasElement) { - var img = node.ownerDocument.createElement('img'); - try { - img.src = node.toDataURL(); - return img; - } catch (e) { - if (true) { - this.logger.log('Unable to clone canvas contents, canvas is tainted'); - } - } - } - - if (node instanceof HTMLIFrameElement) { - var tempIframe = node.cloneNode(false); - var iframeKey = generateIframeKey(); - tempIframe.setAttribute('data-html2canvas-internal-iframe-key', iframeKey); - - var _parseBounds = (0, _Bounds.parseBounds)(node, 0, 0), - width = _parseBounds.width, - height = _parseBounds.height; - - this.resourceLoader.cache[iframeKey] = getIframeDocumentElement(node, this.options).then(function (documentElement) { - return _this3.renderer(documentElement, { - async: _this3.options.async, - allowTaint: _this3.options.allowTaint, - backgroundColor: '#ffffff', - canvas: null, - imageTimeout: _this3.options.imageTimeout, - logging: _this3.options.logging, - proxy: _this3.options.proxy, - removeContainer: _this3.options.removeContainer, - scale: _this3.options.scale, - foreignObjectRendering: _this3.options.foreignObjectRendering, - useCORS: _this3.options.useCORS, - target: new _CanvasRenderer2.default(), - width: width, - height: height, - x: 0, - y: 0, - windowWidth: documentElement.ownerDocument.defaultView.innerWidth, - windowHeight: documentElement.ownerDocument.defaultView.innerHeight, - scrollX: documentElement.ownerDocument.defaultView.pageXOffset, - scrollY: documentElement.ownerDocument.defaultView.pageYOffset - }, _this3.logger.child(iframeKey)); - }).then(function (canvas) { - return new Promise(function (resolve, reject) { - var iframeCanvas = document.createElement('img'); - iframeCanvas.onload = function () { - return resolve(canvas); - }; - iframeCanvas.onerror = reject; - iframeCanvas.src = canvas.toDataURL(); - if (tempIframe.parentNode) { - tempIframe.parentNode.replaceChild((0, _Util.copyCSSStyles)(node.ownerDocument.defaultView.getComputedStyle(node), iframeCanvas), tempIframe); - } - }); - }); - return tempIframe; - } - - if (node instanceof HTMLStyleElement && node.sheet && node.sheet.cssRules) { - var css = [].slice.call(node.sheet.cssRules, 0).reduce(function (css, rule) { - try { - if (rule && rule.cssText) { - return css + rule.cssText; - } - return css; - } catch (err) { - _this3.logger.log('Unable to access cssText property', rule.name); - return css; - } - }, ''); - var style = node.cloneNode(false); - style.textContent = css; - return style; - } - - return node.cloneNode(false); - } - }, { - key: 'cloneNode', - value: function cloneNode(node) { - var clone = node.nodeType === Node.TEXT_NODE ? document.createTextNode(node.nodeValue) : this.createElementClone(node); - - var window = node.ownerDocument.defaultView; - var style = node instanceof window.HTMLElement ? window.getComputedStyle(node) : null; - var styleBefore = node instanceof window.HTMLElement ? window.getComputedStyle(node, ':before') : null; - var styleAfter = node instanceof window.HTMLElement ? window.getComputedStyle(node, ':after') : null; - - if (this.referenceElement === node && clone instanceof window.HTMLElement) { - this.clonedReferenceElement = clone; - } - - if (clone instanceof window.HTMLBodyElement) { - createPseudoHideStyles(clone); - } - - var counters = (0, _PseudoNodeContent.parseCounterReset)(style, this.pseudoContentData); - var contentBefore = (0, _PseudoNodeContent.resolvePseudoContent)(node, styleBefore, this.pseudoContentData); - - for (var child = node.firstChild; child; child = child.nextSibling) { - if (child.nodeType !== Node.ELEMENT_NODE || child.nodeName !== 'SCRIPT' && - // $FlowFixMe - !child.hasAttribute(IGNORE_ATTRIBUTE) && (typeof this.options.ignoreElements !== 'function' || - // $FlowFixMe - !this.options.ignoreElements(child))) { - if (!this.copyStyles || child.nodeName !== 'STYLE') { - clone.appendChild(this.cloneNode(child)); - } - } - } - - var contentAfter = (0, _PseudoNodeContent.resolvePseudoContent)(node, styleAfter, this.pseudoContentData); - (0, _PseudoNodeContent.popCounters)(counters, this.pseudoContentData); - - if (node instanceof window.HTMLElement && clone instanceof window.HTMLElement) { - if (styleBefore) { - this.inlineAllImages(inlinePseudoElement(node, clone, styleBefore, contentBefore, PSEUDO_BEFORE)); - } - if (styleAfter) { - this.inlineAllImages(inlinePseudoElement(node, clone, styleAfter, contentAfter, PSEUDO_AFTER)); - } - if (style && this.copyStyles && !(node instanceof HTMLIFrameElement)) { - (0, _Util.copyCSSStyles)(style, clone); - } - this.inlineAllImages(clone); - if (node.scrollTop !== 0 || node.scrollLeft !== 0) { - this.scrolledElements.push([clone, node.scrollLeft, node.scrollTop]); - } - switch (node.nodeName) { - case 'CANVAS': - if (!this.copyStyles) { - cloneCanvasContents(node, clone); - } - break; - case 'TEXTAREA': - case 'SELECT': - clone.value = node.value; - break; - } - } - return clone; - } - }]); - - return DocumentCloner; - }(); - - var getSheetFonts = function getSheetFonts(sheet, document) { - // $FlowFixMe - return (sheet.cssRules ? Array.from(sheet.cssRules) : []).filter(function (rule) { - return rule.type === CSSRule.FONT_FACE_RULE; - }).map(function (rule) { - var src = (0, _background.parseBackgroundImage)(rule.style.getPropertyValue('src')); - var formats = []; - for (var i = 0; i < src.length; i++) { - if (src[i].method === 'url' && src[i + 1] && src[i + 1].method === 'format') { - var a = document.createElement('a'); - a.href = src[i].args[0]; - if (document.body) { - document.body.appendChild(a); - } - - var font = { - src: a.href, - format: src[i + 1].args[0] - }; - formats.push(font); - } - } - - return { - // TODO select correct format for browser), - - formats: formats.filter(function (font) { - return (/^woff/i.test(font.format) - ); - }), - fontFace: rule.style - }; - }).filter(function (font) { - return font.formats.length; - }); - }; - - var createStyleSheetFontsFromText = function createStyleSheetFontsFromText(text, baseHref) { - var doc = document.implementation.createHTMLDocument(''); - var base = document.createElement('base'); - // $FlowFixMe - base.href = baseHref; - var style = document.createElement('style'); - - style.textContent = text; - if (doc.head) { - doc.head.appendChild(base); - } - if (doc.body) { - doc.body.appendChild(style); - } - - return style.sheet ? getSheetFonts(style.sheet, doc) : []; - }; - - var restoreOwnerScroll = function restoreOwnerScroll(ownerDocument, x, y) { - if (ownerDocument.defaultView && (x !== ownerDocument.defaultView.pageXOffset || y !== ownerDocument.defaultView.pageYOffset)) { - ownerDocument.defaultView.scrollTo(x, y); - } - }; - - var cloneCanvasContents = function cloneCanvasContents(canvas, clonedCanvas) { - try { - if (clonedCanvas) { - clonedCanvas.width = canvas.width; - clonedCanvas.height = canvas.height; - var ctx = canvas.getContext('2d'); - var clonedCtx = clonedCanvas.getContext('2d'); - if (ctx) { - clonedCtx.putImageData(ctx.getImageData(0, 0, canvas.width, canvas.height), 0, 0); - } else { - clonedCtx.drawImage(canvas, 0, 0); - } - } - } catch (e) {} - }; - - var inlinePseudoElement = function inlinePseudoElement(node, clone, style, contentItems, pseudoElt) { - if (!style || !style.content || style.content === 'none' || style.content === '-moz-alt-content' || style.display === 'none') { - return; - } - - var anonymousReplacedElement = clone.ownerDocument.createElement('html2canvaspseudoelement'); - (0, _Util.copyCSSStyles)(style, anonymousReplacedElement); - - if (contentItems) { - var len = contentItems.length; - for (var i = 0; i < len; i++) { - var item = contentItems[i]; - switch (item.type) { - case _PseudoNodeContent.PSEUDO_CONTENT_ITEM_TYPE.IMAGE: - var img = clone.ownerDocument.createElement('img'); - img.src = (0, _background.parseBackgroundImage)('url(' + item.value + ')')[0].args[0]; - img.style.opacity = '1'; - anonymousReplacedElement.appendChild(img); - break; - case _PseudoNodeContent.PSEUDO_CONTENT_ITEM_TYPE.TEXT: - anonymousReplacedElement.appendChild(clone.ownerDocument.createTextNode(item.value)); - break; - } - } - } - - anonymousReplacedElement.className = PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER; - clone.className += pseudoElt === PSEUDO_BEFORE ? ' ' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE : ' ' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER; - if (pseudoElt === PSEUDO_BEFORE) { - clone.insertBefore(anonymousReplacedElement, clone.firstChild); - } else { - clone.appendChild(anonymousReplacedElement); - } - - return anonymousReplacedElement; - }; - - var URL_REGEXP = /^url\((.+)\)$/i; - var PSEUDO_BEFORE = ':before'; - var PSEUDO_AFTER = ':after'; - var PSEUDO_HIDE_ELEMENT_CLASS_BEFORE = '___html2canvas___pseudoelement_before'; - var PSEUDO_HIDE_ELEMENT_CLASS_AFTER = '___html2canvas___pseudoelement_after'; - - var PSEUDO_HIDE_ELEMENT_STYLE = '{\n content: "" !important;\n display: none !important;\n}'; - - var createPseudoHideStyles = function createPseudoHideStyles(body) { - createStyles(body, '.' + PSEUDO_HIDE_ELEMENT_CLASS_BEFORE + PSEUDO_BEFORE + PSEUDO_HIDE_ELEMENT_STYLE + '\n .' + PSEUDO_HIDE_ELEMENT_CLASS_AFTER + PSEUDO_AFTER + PSEUDO_HIDE_ELEMENT_STYLE); - }; - - var createStyles = function createStyles(body, styles) { - var style = body.ownerDocument.createElement('style'); - style.innerHTML = styles; - body.appendChild(style); - }; - - var initNode = function initNode(_ref) { - var _ref2 = _slicedToArray(_ref, 3), - element = _ref2[0], - x = _ref2[1], - y = _ref2[2]; - - element.scrollLeft = x; - element.scrollTop = y; - }; - - var generateIframeKey = function generateIframeKey() { - return Math.ceil(Date.now() + Math.random() * 10000000).toString(16); - }; - - var DATA_URI_REGEXP = /^data:text\/(.+);(base64)?,(.*)$/i; - - var getIframeDocumentElement = function getIframeDocumentElement(node, options) { - try { - return Promise.resolve(node.contentWindow.document.documentElement); - } catch (e) { - return options.proxy ? (0, _Proxy.Proxy)(node.src, options).then(function (html) { - var match = html.match(DATA_URI_REGEXP); - if (!match) { - return Promise.reject(); - } - - return match[2] === 'base64' ? window.atob(decodeURIComponent(match[3])) : decodeURIComponent(match[3]); - }).then(function (html) { - return createIframeContainer(node.ownerDocument, (0, _Bounds.parseBounds)(node, 0, 0)).then(function (cloneIframeContainer) { - var cloneWindow = cloneIframeContainer.contentWindow; - var documentClone = cloneWindow.document; - - documentClone.open(); - documentClone.write(html); - var iframeLoad = iframeLoader(cloneIframeContainer).then(function () { - return documentClone.documentElement; - }); - - documentClone.close(); - return iframeLoad; - }); - }) : Promise.reject(); - } - }; - - var createIframeContainer = function createIframeContainer(ownerDocument, bounds) { - var cloneIframeContainer = ownerDocument.createElement('iframe'); - - cloneIframeContainer.className = 'html2canvas-container'; - cloneIframeContainer.style.visibility = 'hidden'; - cloneIframeContainer.style.position = 'fixed'; - cloneIframeContainer.style.left = '-10000px'; - cloneIframeContainer.style.top = '0px'; - cloneIframeContainer.style.border = '0'; - cloneIframeContainer.width = bounds.width.toString(); - cloneIframeContainer.height = bounds.height.toString(); - cloneIframeContainer.scrolling = 'no'; // ios won't scroll without it - cloneIframeContainer.setAttribute(IGNORE_ATTRIBUTE, 'true'); - if (!ownerDocument.body) { - return Promise.reject( true ? 'Body element not found in Document that is getting rendered' : ''); - } - - ownerDocument.body.appendChild(cloneIframeContainer); - - return Promise.resolve(cloneIframeContainer); - }; - - var iframeLoader = function iframeLoader(cloneIframeContainer) { - var cloneWindow = cloneIframeContainer.contentWindow; - var documentClone = cloneWindow.document; - - return new Promise(function (resolve, reject) { - cloneWindow.onload = cloneIframeContainer.onload = documentClone.onreadystatechange = function () { - var interval = setInterval(function () { - if (documentClone.body.childNodes.length > 0 && documentClone.readyState === 'complete') { - clearInterval(interval); - resolve(cloneIframeContainer); - } - }, 50); - }; - }); - }; - - var cloneWindow = exports.cloneWindow = function cloneWindow(ownerDocument, bounds, referenceElement, options, logger, renderer) { - var cloner = new DocumentCloner(referenceElement, options, logger, false, renderer); - var scrollX = ownerDocument.defaultView.pageXOffset; - var scrollY = ownerDocument.defaultView.pageYOffset; - - return createIframeContainer(ownerDocument, bounds).then(function (cloneIframeContainer) { - var cloneWindow = cloneIframeContainer.contentWindow; - var documentClone = cloneWindow.document; - - /* Chrome doesn't detect relative background-images assigned in inline