summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2021-03-13 14:24:12 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2021-03-13 14:24:12 +0000
commitd3fc4c98513126dc7825ae75c775688c4f666a3e (patch)
tree5fd46925c6b4a881c9208772ed8e5cc0588bc164
parentInitial commit. (diff)
downloadprivacybadger-d3fc4c98513126dc7825ae75c775688c4f666a3e.tar.xz
privacybadger-d3fc4c98513126dc7825ae75c775688c4f666a3e.zip
Adding upstream version 2020.10.7.upstream/2020.10.7upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
-rw-r--r--.editorconfig37
-rw-r--r--.eslintignore5
-rw-r--r--.eslintrc.yml63
-rw-r--r--.github/ISSUE_TEMPLATE/broken-site-report.md19
-rw-r--r--.github/SECURITY.md5
-rw-r--r--.gitignore51
-rw-r--r--.travis.yml36
-rw-r--r--.tx/config8
-rw-r--r--CODE_OF_CONDUCT.md1
-rw-r--r--CONTRIBUTING.md23
-rw-r--r--LICENSE844
-rw-r--r--Makefile35
-rw-r--r--README.md32
-rw-r--r--doc/Changelog550
-rw-r--r--doc/DESIGN-AND-ROADMAP.md276
-rw-r--r--doc/Translation.md92
-rw-r--r--doc/admin-deployment.md49
-rw-r--r--doc/develop.md45
-rw-r--r--doc/fixing-broken-sites.md63
-rw-r--r--doc/jid1-MnnxcxisBPnSXQ@jetpack.json11
-rw-r--r--doc/permissions.md27
-rw-r--r--doc/sample-managed-storage-manifest-chrome.json12
-rw-r--r--doc/tests.md92
-rw-r--r--doc/yellowlist-criteria.md8
-rw-r--r--package-lock.json7063
-rw-r--r--package.json22
-rwxr-xr-xrelease-utils/chromium-release.sh26
-rwxr-xr-xrelease-utils/firefox-release.sh45
-rwxr-xr-xrelease-utils/make-eff-zip.sh32
-rwxr-xr-xrelease-utils/make-release-zip.sh43
-rwxr-xr-xrelease-utils/make-release.sh50
-rwxr-xr-xrelease-utils/make-signed-xpi.sh65
-rwxr-xr-xrelease-utils/post-chrome-release.sh29
-rwxr-xr-xrelease-utils/post-release.sh77
-rwxr-xr-xscripts/chromedriver.sh25
-rwxr-xr-xscripts/convertpsl.py36
-rwxr-xr-xscripts/fix_placeholders.py40
-rwxr-xr-xscripts/generate-legacy-yellowlist.sh1
-rwxr-xr-xscripts/run_travis.sh36
-rwxr-xr-xscripts/setup_travis.sh79
-rwxr-xr-xscripts/updategoogle.py51
-rwxr-xr-xscripts/updategoogle.sh27
-rwxr-xr-xscripts/updatepsl.sh28
-rwxr-xr-xscripts/updateseeddata.sh33
-rw-r--r--scripts/verify_json.py18
-rw-r--r--src/_locales/ar/messages.json677
-rw-r--r--src/_locales/bg/messages.json677
-rw-r--r--src/_locales/ca/messages.json677
-rw-r--r--src/_locales/cs/messages.json677
-rw-r--r--src/_locales/da/messages.json677
-rw-r--r--src/_locales/de/messages.json677
-rw-r--r--src/_locales/en_US/messages.json677
-rw-r--r--src/_locales/eo/messages.json677
-rw-r--r--src/_locales/es/messages.json677
-rw-r--r--src/_locales/fa/messages.json677
-rw-r--r--src/_locales/fi/messages.json677
-rw-r--r--src/_locales/fr/messages.json677
-rw-r--r--src/_locales/he/messages.json677
-rw-r--r--src/_locales/it/messages.json677
-rw-r--r--src/_locales/ko/messages.json677
-rwxr-xr-xsrc/_locales/nl/messages.json677
-rw-r--r--src/_locales/pl/messages.json677
-rw-r--r--src/_locales/pt_BR/messages.json677
-rw-r--r--src/_locales/pt_PT/messages.json677
-rw-r--r--src/_locales/ru/messages.json677
-rw-r--r--src/_locales/sv/messages.json677
-rw-r--r--src/_locales/tr/messages.json677
-rw-r--r--src/_locales/uk/messages.json677
-rw-r--r--src/_locales/zh_CN/messages.json677
-rw-r--r--src/_locales/zh_TW/messages.json677
-rw-r--r--src/data/dnt-policies.json9
-rw-r--r--src/data/dnt-policy.txt218
-rw-r--r--src/data/schema.json48
-rw-r--r--src/data/seed.json19505
-rw-r--r--src/data/socialwidgets.json266
-rw-r--r--src/data/surrogates.js474
-rw-r--r--src/data/yellowlist.txt788
-rw-r--r--src/icons/UI-icons-green.svg10
-rw-r--r--src/icons/UI-icons-red.svg10
-rw-r--r--src/icons/UI-icons-yellow.svg17
-rw-r--r--src/icons/badger-128.pngbin0 -> 6072 bytes
-rw-r--r--src/icons/badger-16.pngbin0 -> 1686 bytes
-rw-r--r--src/icons/badger-19-disabled.pngbin0 -> 483 bytes
-rw-r--r--src/icons/badger-19.pngbin0 -> 1959 bytes
-rw-r--r--src/icons/badger-38-disabled.pngbin0 -> 1078 bytes
-rw-r--r--src/icons/badger-38.pngbin0 -> 1442 bytes
-rw-r--r--src/icons/badger-48.pngbin0 -> 2824 bytes
-rw-r--r--src/icons/badger-64.pngbin0 -> 2045 bytes
-rw-r--r--src/icons/badger-bw-noborder.svg72
-rw-r--r--src/icons/badger-pin.pngbin0 -> 436 bytes
-rw-r--r--src/icons/dnt-16.pngbin0 -> 343 bytes
-rw-r--r--src/icons/help.svg3
-rw-r--r--src/icons/options.svg3
-rw-r--r--src/icons/share.svg3
-rw-r--r--src/js/background.js1148
-rw-r--r--src/js/bootstrap.js37
-rw-r--r--src/js/constants.js54
-rw-r--r--src/js/contentscripts/clobbercookie.js60
-rw-r--r--src/js/contentscripts/clobberlocalstorage.js94
-rw-r--r--src/js/contentscripts/collapser.js56
-rw-r--r--src/js/contentscripts/dnt.js66
-rw-r--r--src/js/contentscripts/fingerprinting.js367
-rw-r--r--src/js/contentscripts/socialwidgets.js641
-rw-r--r--src/js/contentscripts/supercookie.js151
-rw-r--r--src/js/contentscripts/utils.js53
-rw-r--r--src/js/firefoxandroid.js90
-rw-r--r--src/js/firstparties/facebook.js56
-rw-r--r--src/js/firstparties/google-search.js39
-rw-r--r--src/js/firstparties/google-static.js41
-rw-r--r--src/js/firstparties/lib/utils.js62
-rw-r--r--src/js/heuristicblocking.js557
-rw-r--r--src/js/htmlutils.js283
-rw-r--r--src/js/incognito.js49
-rw-r--r--src/js/migrations.js356
-rw-r--r--src/js/multiDomainFirstParties.js4133
-rw-r--r--src/js/options.js976
-rw-r--r--src/js/popup.js723
-rw-r--r--src/js/socialwidgetloader.js133
-rw-r--r--src/js/storage.js707
-rw-r--r--src/js/surrogates.js87
-rw-r--r--src/js/utils.js445
-rw-r--r--src/js/webrequest.js1293
-rw-r--r--src/lib/basedomain.js319
-rw-r--r--src/lib/i18n.js151
-rw-r--r--src/lib/options.js120
-rw-r--r--src/lib/publicSuffixList.js7497
-rw-r--r--src/lib/vendor/jquery-3.5.1.js10872
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-bg_glass_55_fbf9ee_1x400.pngbin0 -> 335 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-bg_glass_65_ffffff_1x400.pngbin0 -> 207 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-bg_glass_75_dadada_1x400.pngbin0 -> 262 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-bg_glass_75_e6e6e6_1x400.pngbin0 -> 262 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-bg_glass_95_fef1ec_1x400.pngbin0 -> 332 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-bg_highlight-soft_75_cccccc_1x100.pngbin0 -> 280 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-icons_222222_256x240.pngbin0 -> 6922 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-icons_2e83ff_256x240.pngbin0 -> 4549 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-icons_454545_256x240.pngbin0 -> 6992 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-icons_888888_256x240.pngbin0 -> 6999 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/images/ui-icons_cd0a0a_256x240.pngbin0 -> 4549 bytes
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/jquery-ui.js2815
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/jquery-ui.structure.css286
-rw-r--r--src/lib/vendor/jquery-ui-1.12.1.custom/jquery-ui.theme.css443
-rw-r--r--src/lib/vendor/jquery-ui-iconfont-2.3.2/font/jquery-ui.woff2bin0 -> 21208 bytes
-rw-r--r--src/lib/vendor/jquery-ui-iconfont-2.3.2/jquery-ui-1.12.icon-font.css839
-rw-r--r--src/lib/vendor/jquery.smooth-scroll.js357
-rw-r--r--src/lib/vendor/punycode-1.4.1.js533
-rw-r--r--src/lib/vendor/select2-4.0.11/select2-4.0.11.css481
-rw-r--r--src/lib/vendor/select2-4.0.11/select2-4.0.11.js6044
-rw-r--r--src/lib/vendor/toggle-switch.css310
-rw-r--r--src/lib/vendor/tooltipster-4.2.6/tooltipster.bundle.css388
-rw-r--r--src/lib/vendor/tooltipster-4.2.6/tooltipster.bundle.js4273
-rw-r--r--src/lib/vendor/underscore-1.9.1.js1692
-rw-r--r--src/manifest.json522
-rw-r--r--src/skin/background.pngbin0 -> 1070 bytes
-rw-r--r--src/skin/css/firstRun.css798
-rw-r--r--src/skin/firstRun.html131
-rw-r--r--src/skin/fonts/Chunk.ttfbin0 -> 31268 bytes
-rw-r--r--src/skin/fonts/OpenSans-Bold.ttfbin0 -> 224452 bytes
-rw-r--r--src/skin/fonts/OpenSans-Light.ttfbin0 -> 222236 bytes
-rw-r--r--src/skin/images/EFF-red.svg7
-rw-r--r--src/skin/images/carrot-down.svg10
-rw-r--r--src/skin/images/catches-trackers.pngbin0 -> 30571 bytes
-rw-r--r--src/skin/images/disable-badger.pngbin0 -> 19494 bytes
-rw-r--r--src/skin/images/eff-logo.pngbin0 -> 356 bytes
-rw-r--r--src/skin/images/facebook.svg19
-rw-r--r--src/skin/images/learns-trackers.pngbin0 -> 35251 bytes
-rw-r--r--src/skin/images/not-ad-blocker.pngbin0 -> 9138 bytes
-rw-r--r--src/skin/images/pb-logo-outline.svg41
-rw-r--r--src/skin/images/twitter.svg19
-rw-r--r--src/skin/js/firstRun.js25
-rw-r--r--src/skin/options-layout.css260
-rw-r--r--src/skin/options.html307
-rw-r--r--src/skin/popup.css488
-rw-r--r--src/skin/popup.html155
-rw-r--r--src/skin/socialwidgets/AddThis.svg134
-rw-r--r--src/skin/socialwidgets/Digg.svg212
-rw-r--r--src/skin/socialwidgets/FacebookLike.svg216
-rw-r--r--src/skin/socialwidgets/FacebookShare.svg214
-rw-r--r--src/skin/socialwidgets/LinkedIn.svg182
-rw-r--r--src/skin/socialwidgets/Pinterest.svg211
-rw-r--r--src/skin/socialwidgets/Twitter.svg116
-rw-r--r--src/tests/.eslintrc.yml4
-rw-r--r--src/tests/index.html76
-rw-r--r--src/tests/lib/qunit_config.js74
-rw-r--r--src/tests/lib/vendor/qunit-2.9.2.css436
-rw-r--r--src/tests/lib/vendor/qunit-2.9.2.js6604
-rw-r--r--src/tests/lib/vendor/sinon-2.0.0.js11586
-rw-r--r--src/tests/tests/background.js467
-rw-r--r--src/tests/tests/baseDomain.js255
-rw-r--r--src/tests/tests/firstparties.js167
-rw-r--r--src/tests/tests/heuristic.js165
-rw-r--r--src/tests/tests/htmlutils.js241
-rw-r--r--src/tests/tests/multiDomainFirstParties.js73
-rw-r--r--src/tests/tests/options.js105
-rw-r--r--src/tests/tests/storage.js638
-rw-r--r--src/tests/tests/tabData.js310
-rw-r--r--src/tests/tests/utils.js550
-rw-r--r--src/tests/tests/yellowlist.js424
-rw-r--r--tests/requirements.txt3
-rw-r--r--tests/selenium/.flake82
-rw-r--r--tests/selenium/breakage_test.py30
-rw-r--r--tests/selenium/clobbering_test.py102
-rw-r--r--tests/selenium/cookie_test.py163
-rw-r--r--tests/selenium/dnt_test.py324
-rw-r--r--tests/selenium/fingerprinting_test.py105
-rw-r--r--tests/selenium/options_test.py327
-rw-r--r--tests/selenium/pbtest.py498
-rw-r--r--tests/selenium/pbtest_org_test.py71
-rw-r--r--tests/selenium/popup_test.py361
-rw-r--r--tests/selenium/qunit_test.py38
-rw-r--r--tests/selenium/service_workers_test.py56
-rw-r--r--tests/selenium/storage_test.py71
-rw-r--r--tests/selenium/super_cookie_test.py120
-rw-r--r--tests/selenium/surrogates_test.py104
-rw-r--r--tests/selenium/website_testbed/first-party.html13
-rw-r--r--tests/selenium/website_testbed/first-party.js25
-rw-r--r--tests/selenium/widgets_test.py344
216 files changed, 127737 insertions, 0 deletions
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..a27ccd2
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,37 @@
+# EditorConfig is awesome: http://EditorConfig.org
+
+# top-most EditorConfig file
+root = true
+
+# Unix-style newlines with a newline ending every file
+[*]
+end_of_line = lf
+insert_final_newline = true
+charset = utf-8
+
+[*.css]
+indent_style = space
+indent_size = 4
+
+[*.html]
+indent_style = space
+indent_size = 2
+
+[*.js]
+indent_style = space
+indent_size = 2
+
+[*.json]
+indent_style=space
+indent_size = 4
+
+[manifest.json]
+indent_size = 2
+
+[*.py]
+indent_style = space
+indent_size = 4
+
+[*.sh]
+indent_style = space
+indent_size = 2
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..9c8a92f
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,5 @@
+src/lib/vendor/
+src/tests/lib/vendor/
+node_modules/
+**/selenium/
+!tests/selenium/
diff --git a/.eslintrc.yml b/.eslintrc.yml
new file mode 100644
index 0000000..1742cd8
--- /dev/null
+++ b/.eslintrc.yml
@@ -0,0 +1,63 @@
+env:
+ browser: true
+ es6: true
+ jquery: true
+ webextensions: true
+extends: 'eslint:recommended'
+globals:
+ # false to disallow overwriting
+ require: false
+ _: false
+parserOptions:
+ ecmaVersion: 2017
+ # strict mode
+ sourceType: module
+rules:
+ array-callback-return: error
+ brace-style:
+ - error
+ - 1tbs
+ - allowSingleLine: true
+ consistent-this:
+ - error
+ - self
+ curly: error
+ dot-notation: error
+ eol-last: error
+ indent:
+ - error
+ - 2
+ - outerIIFEBody: 0
+ keyword-spacing: error
+ linebreak-style:
+ - error
+ - unix
+ new-cap: error
+ no-array-constructor: error
+ no-bitwise: error
+ no-caller: error
+ no-console: off
+ no-eval: error
+ no-implied-eval: error
+ no-iterator: error
+ no-loop-func: error
+ no-multi-spaces: error
+ no-multi-str: error
+ no-new: error
+ no-new-func: error
+ no-new-object: error
+ no-new-wrappers: error
+ no-proto: error
+ no-script-url: error
+ no-shadow: error
+ no-shadow-restricted-names: error
+ no-tabs: error
+ no-trailing-spaces: error
+ no-unused-expressions: error
+ semi: error
+ space-before-blocks: error
+ space-in-parens: error
+ space-unary-ops:
+ - error
+ - words: true
+ nonwords: false
diff --git a/.github/ISSUE_TEMPLATE/broken-site-report.md b/.github/ISSUE_TEMPLATE/broken-site-report.md
new file mode 100644
index 0000000..ade57fb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/broken-site-report.md
@@ -0,0 +1,19 @@
+---
+name: Report a broken site
+about: Is Privacy Badger breaking something somewhere? We'd like to get it fixed!
+
+---
+
+#### What is your browser and browser version?
+
+#### What is broken and where?
+
+#### What is the "culprit" domain?
+Please follow the debug instructions to identify which domain breaks stuff when blocked:
+https://github.com/EFForg/privacybadger/wiki/Find-out-why-Privacy-Badger-is-blocking-a-domain
+
+#### What is your debug output for this domain?
+To get the debug output, please see the instructions link above.
+```
+Paste debug output here.
+```
diff --git a/.github/SECURITY.md b/.github/SECURITY.md
new file mode 100644
index 0000000..79d2be9
--- /dev/null
+++ b/.github/SECURITY.md
@@ -0,0 +1,5 @@
+# Security Policy
+
+## Reporting a Vulnerability
+
+Security vulnerabilities can be reported privately to vulnerabilities@eff.org. Please see our [Security Vulnerability Disclosure Program](https://www.eff.org/security) for the GPG key and more information.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..19d5adb
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,51 @@
+*.py[cod]
+
+# C extensions
+*.so
+
+# Packages
+*.egg
+*.egg-info
+dist
+build
+eggs
+parts
+bin
+var
+sdist
+develop-eggs
+.installed.cfg
+lib64
+__pycache__
+
+# Dynamic libraries
+*.dylib
+
+# JSHydra
+buildtools/jshydra/mozilla/js
+
+# Vim swap files
+*.sw*
+
+# Mac DS_Store
+*.DS_Store
+
+node_modules
+
+tests/.cache
+tests/.pytest_cache
+.pytest_cache
+
+*.xpi
+.chrome-profile
+
+.idea
+
+#Eclipse project stuff
+.settings/
+.project
+
+web-ext-artifacts
+pkg
+release-utils/config.sh
+release-utils/xpi
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..9c2ef5a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,36 @@
+sudo: required
+language: python
+os: linux
+dist: bionic
+python: 3.6
+jobs:
+ fast_finish: true
+ include:
+ - env: INFO="lint"
+ node_js: node
+ - env: INFO="chrome beta" BROWSER=google-chrome-beta
+ addons:
+ chrome: beta
+ - env: INFO="chrome stable" BROWSER=google-chrome-stable
+ addons:
+ chrome: stable
+ - env: INFO="firefox" BROWSER=firefox
+ addons:
+ firefox: latest
+ - env: INFO="firefox esr" BROWSER=firefox
+ addons:
+ firefox: latest-esr
+ - env: INFO="firefox beta" BROWSER=firefox
+ addons:
+ firefox: latest-beta
+ - env: INFO="firefox nightly" BROWSER=firefox
+ addons:
+ firefox: latest-nightly
+ allow_failures:
+ - env: INFO="firefox nightly" BROWSER=firefox
+ addons:
+ firefox: latest-nightly
+before_script: travis_retry ./scripts/setup_travis.sh
+script: . ./scripts/run_travis.sh
+services:
+ - xvfb
diff --git a/.tx/config b/.tx/config
new file mode 100644
index 0000000..bebb04e
--- /dev/null
+++ b/.tx/config
@@ -0,0 +1,8 @@
+[main]
+host = https://www.transifex.com
+
+[privacy-badger.messagesjson]
+file_filter = src/_locales/<lang>/messages.json
+source_file = src/_locales/en_US/messages.json
+source_lang = en_US
+type = CHROME
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..142b31c
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1 @@
+This project is governed by [EFF's Public Projects Code of Conduct](https://www.eff.org/pages/eppcode). \ No newline at end of file
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..f1a46a8
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,23 @@
+# Contributing to Privacy Badger
+
+Welcome dear contributor! There are many ways to help Privacy Badger:
+
+* Did we break a site? We want to fix it,
+ so we wrote a [guide to fixing broken sites](/doc/fixing-broken-sites.md).
+* Want to help translate Privacy Badger? Please see our [guide to translating Privacy Badger](/doc/Translation.md).
+* To review issues we would like help with, visit our
+ ["good first issue"](https://github.com/EFForg/privacybadger/labels/good%20first%20issue)
+ and
+ ["help wanted"](https://github.com/EFForg/privacybadger/labels/help%20wanted)
+ labels.
+* When making changes to Privacy Badger's code, please consult our [developer](/doc/develop.md) and [automated testing](/doc/tests.md) guides.
+* Security vulnerabilities can be reported privately to
+ [vulnerabilities@eff.org](mailto:vulnerabilities@eff.org). Please see our
+ [Security Vulnerability Disclosure Program](https://www.eff.org/security)
+ for the GPG key and more information.
+
+When interacting with us, please remember to follow [EFF's Public Projects Code of Conduct](https://www.eff.org/pages/eppcode).
+
+If you find something confusing or frustrating, please [let us know](mailto:extension-devs@eff.org)! We believe in making Privacy Badger better by making it easier for you to contribute.
+
+Thank you!
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8cef74a
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,844 @@
+Privacy Badger
+Copyright © 2015 Electronic Frontier Foundation and other contributors
+
+Privacy Badger as a whole is presently Licensed GPL v3+, though many portions
+of the code are dual-licensed under other free/open source licenses.
+
+CONTRIBUTORS AGREE TO FREE/OPEN SOURCE DUAL-LICENSING
+=====================================================
+
+By contributing code or other works of authorship to this project ("Your
+Contributions"), you grant to the Electronic Frontier Foundation (EFF) a
+perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+license to reproduce, prepare derivative works of, publicly display, publicly
+perform, sublicense, and distribute Your Contributions and such derivative
+works under the terms of any free software or open source license or licenses,
+such license(s) to be selected by EFF at its sole discretion (such licenses
+will always be consistent with EFF's mission).
+
+By contributing code or other works of authorship to this project, you
+represent that you have the legal right and ability to grant this license.
+
+Except for the license granted herein to EFF and recipients of software
+distributed by EFF, You reserve all right, title, and interest in and to Your
+Contributions.
+
+If you do not agree to these terms, please do not send patches or pull
+requests, or commit any material to this repository.
+
+LICENSES FOR INCORPORATED CODEBASES
+===================================
+
+jQuery JavaScript Library
+Copyright JS Foundation and other contributors
+Released under the MIT license
+https://jquery.org/license
+
+Underscore.js
+http://underscorejs.org
+(c) 2009-2018 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
+Underscore may be freely distributed under the MIT license.
+
+jQuery UI
+Copyright jQuery Foundation and other contributors
+Licensed MIT
+
+Incorporating code from CSS Toggle Switch,
+https://github.com/ghinda/css-toggle-switch
+By Ionuț Colceriu - ghinda.net
+Licensed Unlicense
+
+Incorporating code from AdBlockPlus,
+https://adblockplus.org/en/firefox
+Copyright © 2006-2014 Eyeo GmbH
+Licensed GPL v3
+
+basedomain.js incorporates code from ipv6.js
+https://github.com/beaugunderson/javascript-ipv6
+Copyright 2011 Beau Gunderson
+Licensed MIT
+
+src/js/firstparties/facebook.js incorporates code from Facebook™ Tracking & Ad Removal
+https://github.com/mgziminsky/FacebookTrackingRemoval
+Copyright 2018 Michael Ziminsky
+Licensed GPL v3
+
+Incorporating code from ShareMeNot,
+https://sharemenot.cs.washington.edu
+Copyright © 2006-2014 University of Washington
+Licensed MIT
+
+Incorporating code from Chameleon,
+https://github.com/ghostwords/chameleon
+Copyright © 2015 ghostwords
+This Source Code Form is subject to the terms of the Mozilla Public
+License, v. 2.0. If a copy of the MPL was not distributed with this
+file, You can obtain one at http://mozilla.org/MPL/2.0/.
+Alternatively, this code may be distributed or
+otherwise used under the terms of GPL v3
+
+Incorporating code from Punycode.js
+http://mths.be/punycode
+Copyright 2011 Mathias Bynens <http://mathiasbynens.be/>
+Licensed MIT
+
+Tooltipster
+http://iamceege.github.io/tooltipster/
+Copyright (c) 2012,2016 Caleb Jacob and Louis Ameline
+Licensed MIT
+
+ChunkFive
+https://www.theleagueofmoveabletype.com/
+All fonts from The League of Moveable Type are subject to the Open Font License and are free and open-source.
+
+OpenSans
+https://www.apache.org/licenses/LICENSE-2.0
+
+jQuery Smooth Scroll - v2.2.0 - 2017-05-05
+https://github.com/kswedberg/jquery-smooth-scroll
+Copyright (c) 2017 Karl Swedberg
+Licensed MIT
+
+Select2
+https://select2.org/
+Copyright (c) 2012-2017 Kevin Brown, Igor Vaynberg, and Select2 contributors
+Licensed MIT
+
+Icon Font for jQuery UI
+Copyright (c) 2015-2017 Michael Keck
+Font version 2.1
+Licensed CC BY-SA 3.0: https://creativecommons.org/licenses/by-sa/3.0/
+Stylesheet version 2.3.2
+Licensed GPL: http://www.gnu.org/licenses/gpl.html
+
+
+TEXT OF GPLv3
+=============
+
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the program's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ <program> Copyright (C) <year> <name of author>
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+<http://www.gnu.org/licenses/>.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+<http://www.gnu.org/philosophy/why-not-lgpl.html>.
+
+Text of MIT License:
+====================
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom
+the Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall
+be included in all copies or substantial portions of the
+Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
+KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO
+THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
+PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
+CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
+
+
+Text of Unlicense:
+=================
+This is free and unencumbered software released into the public domain.
+
+Anyone is free to copy, modify, publish, use, compile, sell, or
+distribute this software, either in source code form or as a compiled
+binary, for any purpose, commercial or non-commercial, and by any
+means.
+
+In jurisdictions that recognize copyright laws, the author or authors
+of this software dedicate any and all copyright interest in the
+software to the public domain. We make this dedication for the benefit
+of the public at large and to the detriment of our heirs and
+successors. We intend this dedication to be an overt act of
+relinquishment in perpetuity of all present and future rights to this
+software under copyright law.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
+OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+
+For more information, please refer to <http://unlicense.org/>
diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..10cc956
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,35 @@
+lint:
+ ./node_modules/.bin/eslint .
+
+updatepsl:
+ scripts/updatepsl.sh
+
+updateseed:
+ scripts/updateseeddata.sh
+
+updategoogle:
+ scripts/updategoogle.sh
+
+todo:
+ grep -rn 'TODO' src
+
+upload:
+ $(eval TMPFILE := $(shell mktemp))
+ scp src/data/yellowlist.txt $$YELLOWLIST_UPLOAD_PATH
+ scripts/generate-legacy-yellowlist.sh > $(TMPFILE) && scp $(TMPFILE) $$YELLOWLIST_LEGACY_UPLOAD_PATH && rm $(TMPFILE)
+ scp src/data/dnt-policies.json $$DNT_POLICIES_UPLOAD_PATH
+
+tx:
+ tx pull -f
+ scripts/fix_placeholders.py
+
+runch:
+ ./node_modules/.bin/web-ext run --target chromium --start-url "chrome://extensions" -s src/
+
+runff:
+ ./node_modules/.bin/web-ext run --start-url "about:debugging#/runtime/this-firefox" -s src/
+
+runfn:
+ ./node_modules/.bin/web-ext run --start-url "about:debugging#/runtime/this-firefox" -s src/ -f nightly
+
+.PHONY: lint updatepsl updateseed updategoogle todo tx runch runff runfn
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..947cedf
--- /dev/null
+++ b/README.md
@@ -0,0 +1,32 @@
+Privacy Badger [![Build Status](https://travis-ci.org/EFForg/privacybadger.svg?branch=master)](https://travis-ci.org/EFForg/privacybadger)
+===================
+Privacy Badger is a browser extension that automatically learns to block invisible trackers. Instead of keeping lists of what to block, Privacy Badger learns by watching which domains appear to be tracking you as you browse the Web.
+
+Privacy Badger sends the [Do Not Track signal](https://www.eff.org/issues/do-not-track) with your browsing. If trackers ignore your wishes, your Badger will learn to block them. Privacy Badger starts blocking once it sees the same tracker on three different websites.
+
+Besides automatic tracker blocking, Privacy Badger removes outgoing link click tracking on [Facebook](https://www.eff.org/deeplinks/2018/05/privacy-badger-rolls-out-new-ways-fight-facebook-tracking) and [Google](https://www.eff.org/deeplinks/2018/10/privacy-badger-now-fights-more-sneaky-google-tracking), with more privacy protections on the way.
+
+To learn more, see [the FAQ on Privacy Badger's homepage](https://privacybadger.org/#faq).
+
+
+## Contributing
+
+We're glad you want to help! Please see [our contributor guide](/CONTRIBUTING.md).
+
+This project is governed by [EFF's Public Projects Code of Conduct](https://www.eff.org/pages/eppcode).
+
+
+## Getting in touch
+
+Besides using [our GitHub issue tracker](https://github.com/EFForg/privacybadger/issues), you could [send us an email](mailto:extension-devs@eff.org), or join the [Privacy Badger mailing list](https://lists.eff.org/mailman/listinfo/privacybadger).
+
+We also hold public meetings using [Jitsi audio conferencing](https://meet.jit.si/PoliteBadgersSingEuphoricly):
+- Mondays at 10:30 AM PST
+- Thursdays at 11:30 AM PST
+
+
+## License
+
+Privacy Badger is licensed under the GPLv3. See [LICENSE](/LICENSE) for more details.
+
+Privacy Badger is a project of the [Electronic Frontier Foundation](https://www.eff.org).
diff --git a/doc/Changelog b/doc/Changelog
new file mode 100644
index 0000000..6e36b14
--- /dev/null
+++ b/doc/Changelog
@@ -0,0 +1,550 @@
+Privacy Badger Release Notes
+============================
+2020.10.7
+* Disabled learning (by default) to address privacy concerns.
+Visit https://www.eff.org/badger-evolution to learn more.
+* Added support for Global Privacy Control, a new specification that
+lets you tell companies you'd like to opt out of data sharing and selling.
+Visit https://globalprivacycontrol.org/ to learn more.
+* Added a new section to the options page to display the browser settings
+that Privacy Badger overrides for privacy reasons
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Dutch, Finnish, Hebrew, Italian,
+Russian, Spanish, Ukrainian)
+
+2020.8.25
+* Added a button to widget replacements to always allow a widget on a site
+* Improved scrolling of tracking domains on the options page
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Traditional Chinese, Esperanto,
+Finnish, French, Polish, Brazilian Portuguese, Russian, Spanish, Swedish)
+
+2020.7.21
+* Improved broken site reporting screen in the popup
+* Refreshed the look of options page tabs
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Danish, European Portuguese,
+Spanish, Turkish)
+
+2020.6.29
+* Added replacement placeholder for Disqus comments widgets
+* Fixed domain sliders on the options page not saving in some cases
+* Fixed slider changes on the options page resetting the list of domains,
+causing you to lose your place if you were scrolled down
+* Fixed domain slider tooltip display
+* Re-enabled custom tooltips in Firefox
+* Fixed various site breakages
+* Improved translations (Esperanto, Hebrew, Ukrainian)
+
+2020.6.2
+* Added replacement placeholders for Facebook Comments/Video and Twitch Player
+* Removed Twitter link unwrapping. We are unable to unwrap t.co links
+on Twitter at this time, as the original URL is no longer present
+in the Twitter website's document structure.
+* Fixed various site breakages
+* Improved translations (Hebrew, Polish, Swedish)
+
+2020.5.12
+* Made buttons in the popup easier to see and click (or tap, on Firefox for
+Android)
+* Added a replacement placeholder widget for Google reCAPTCHA
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Dutch, Finnish, French, German,
+Hebrew, Italian, Brazilian Portuguese, Spanish, Swedish, Turkish)
+
+2020.2.19
+* Added website breakage warnings, shown in the popup when you block a domain
+known to break websites
+* Removed pixel cookie sharing detection pending security fixes
+* Fixed various site breakages
+* Improved translations (Catalan, Simplified Chinese, Danish, Dutch, German,
+Russian)
+
+2020.1.13
+* Fixed bug that sometimes loses pre-trained data for new users
+* Fixed various site breakages
+
+2020.1.7.1
+* Added helpful text to popup on disabled sites
+* Fixed display issues in popup on smaller displays
+* Fixed Facebook link unwrapping on messenger.com
+* Fixed some cookies getting incorrectly flagged as high entropy
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Traditional Chinese, French,
+Hebrew, Italian, Korean, Russian, Spanish, Swedish, Ukrainian)
+
+2019.11.18
+* Improved display of domains Privacy Badger hasn't yet learned to block
+* Fixed export/import of the WebRTC protection setting
+* Fixed certain YouTube ("video unavailable"), Vimeo ("Because of its privacy
+settings, this video cannot be played here"), and other video players
+by revising referrer protection for "cookieblocked" domains
+* Fixed various other site breakages
+* Added Korean translations
+* Improved translations (Finnish, French, Hebrew, Swedish)
+
+2019.10.28
+* Refreshed the popup with a higher-contrast look
+* Widget placeholders will no longer be applied for domains on the yellowlist.
+The value of widget placeholders is full blocking (best privacy) combined with
+a clear way to restore potentially useful blocked content (convenience).
+Mixing cookie blocking and placeholders doesn't actually improve privacy or
+convenience but does introduce various bugs.
+* Added a replacement placeholder for YouTube (disabled by default as youtube.com
+is still on the yellowlist for now)
+* Added the Widget Replacement tab to the options page to manage widgets that
+do get blocked and replaced with Privacy Badger placeholders. Visit Widget
+Replacement to selectively disable placeholders. For example, you want social
+buttons out of your life completely.
+* Fixed various site breakages
+* Added Hebrew translations
+* Improved translations (Italian, Russian, Ukrainian)
+
+2019.10.8
+* Fixed image/video thumbnails in Google search results
+* Fixed various other site breakages
+* Removed the green "0" tracker count badge.
+No need to draw attention when there is nothing to show.
+* Improved translations (Simplified Chinese, Ukrainian)
+
+2019.9.23
+* Added helpful text to popup on special browser pages like the New Tab page
+* Fixed pixel cookie sharing detection being broken by First-Party Isolation
+in Firefox
+* Fixed major issues with Service Workers-powered sites like Gmail and Twitter
+* Fixed various other site breakages
+* Improved translations (Simplified Chinese, French, Spanish, Swedish,
+Turkish, Ukrainian)
+
+2019.7.1
+* Added pixel cookie sharing detection. Privacy Badger now records
+tracking by images with querystrings that contain first-party cookie data.
+This catches Google Analytics.
+* Removed display of non-tracking domains from the popup by default.
+Hiding domains that Privacy Badger does not consider to be tracking
+should reduce self-inflicted Web breakage.
+* Enabled Facebook link unwrapping on messenger.com
+* Fixed various site breakages
+* Added Catalan translations
+* Improved translations (Bulgarian, Traditional Chinese, Persian,
+Brazilian Portuguese, European Portuguese, Swedish, Ukrainian)
+
+2019.2.19
+* Improved replacement widgets:
+
+ - Replaced the "play" icon with an "allow once" button to improve
+ accessibility and to make it more clear our widgets are interactive
+ - Made activation also activate any other widgets of the same type
+ - Updated the replacement for Vimeo to ignore background videos
+ - Set minimum dimensions to avoid becoming too small or hidden
+
+* Fixed various site breakages
+
+2019.1.30
+* Added replacement widgets for embedded Spotify, Streamable and Vimeo
+players. Privacy Badger can replace potentially useful third-party widgets
+with placeholders. This avoids on-by-default tracking while providing a clear
+way to restore the original widget on demand.
+* Fixed various site breakages
+* Added Arabic and European Portuguese translations
+* Improved translations (Traditional Chinese, Czech, German, Persian, Swedish,
+Turkish)
+
+2018.12.17
+* Fixed major Privacy Badger breakages in Chrome 72+
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Spanish, Turkish)
+
+2018.12.5
+* Added a Share button to the popup. This lets you easily copy and paste
+Badger's findings on any page.
+* Updated link protection to work on all Google Search country domains
+* Updated link protection on Facebook to remove the new "fbclid" tracking
+parameter
+* Added support for enterprise/admin/group policy settings overrides. This
+lets administrators preconfigure Privacy Badger installations. For more
+information, please visit
+https://github.com/EFForg/privacybadger/blob/master/doc/admin-deployment.md
+* Fixed various bugs with local storage protection for "cookieblocked" (slider
+set to "yellow") domains
+* Made the options page work better on small and on large displays
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Dutch, Esperanto, Finnish,
+German, Italian, Persian, Polish, Spanish, Swedish)
+
+2018.10.3.1
+* Fixed style problems with Google Search results
+* Fixed the setting to open results in new browser windows on Google Search
+
+2018.10.3
+* Added protection against outgoing link click tracking on Google Search,
+Google Docs and Google Hangouts
+* Fixed various site breakages
+* Added Finnish translations
+* Improved translations (Simplified Chinese)
+
+2018.9.20
+* Added buttons to back up and restore the disabled sites list using
+Firefox/Google Sync. The new buttons live under the Manage Data tab
+on the options page.
+* Added saving of in-progress error reports so that you no longer lose
+your typing when you close the popup for whatever reason
+* Fixed popup layout problems when opened in the overflow menu in Firefox
+* Updated popup and options to use a higher resolution Badger logo on higher
+pixel density displays
+* Fixed problems with broken fonts and images on Google Docs
+* Improved translations (Traditional Chinese, French, German,
+Brazilian Portuguese, Russian, Spanish, Swedish, Turkish)
+
+2018.8.22
+* Added pre-trained tracker data for new Privacy Badger installations.
+Visit www.eff.org/badger-pretraining to learn more.
+* Added reset/clear tracker data buttons to the Manage Data options page tab
+* Fixed various site breakages
+* Added Persian and Brazilian Portuguese translations
+* Improved translations (Simplified Chinese, Danish, Esperanto, French,
+German, Italian, Norwegian Bokmål, Spanish, Swedish)
+
+2018.8.1
+* Fixed security issues with HTML5 local storage tracking detection as well as
+SoundCloud widget replacement. Thanks again to Cure53 for discovering and
+reporting these vulnerabilities.
+* Improved Facebook link unwrapping; now enabled on the Facebook Onion domain
+* Improved translations (Italian, Norwegian Bokmål, Swedish, Ukrainian)
+
+2018.7.18.1
+* Added setting to disable sending Do Not Track to websites
+* Fixed security issue with link unwrapping on Facebook. Thanks to Cure53 for
+discovering and reporting this vulnerability.
+* Improved ordering of domain names in the popup and on the options page
+* Improved handling of disabled sites with wildcards
+* Added t.co link replacement to user profiles on Twitter
+* Linked to EFF software privacy policy from the new user welcome page
+* Updated to latest dummy Google Tag Manager script from uBlock Origin
+to avoid "failed to redirect a network request" warnings in Chrome
+* Fixed various site breakages
+* Improved translations (Simplified Chinese, Dutch, Esperanto, German,
+Russian, Swedish, Turkish)
+
+2018.5.10
+* Added protection against outgoing link click tracking on Facebook
+* Updated WebRTC protection to revert to browser default (off) when disabled
+* Fixed popup in the Italian locale in Chrome
+* Updated to latest dummy Google Analytics script from uBlock Origin
+to avoid "failed to redirect a network request" warnings in Chrome
+* Fixed various site breakages
+* Improved translations (Traditional Chinese, Danish, Dutch, Esperanto,
+French, German, Italian, Polish, Russian, Swedish, Ukrainian)
+
+2018.4.23
+* Fixed changes not being persisted for domains that appear after scrolling
+the tracking domains list on the options page
+* Improved tracking domains search on the options page
+* Fixed "can't access dead object" errors in Firefox
+* Fixed XML document rendering in Firefox
+* Updated WebRTC protection checkbox to become disabled when the setting is
+controlled by other extensions
+* Fixed various site breakages
+* Improved translations (Traditional Chinese, Czech, Danish, Esperanto,
+French, German, Italian, Polish, Russian, Swedish, Turkish, Ukrainian)
+
+2018.4.10
+* Updated the new user welcome page. The redesigned page is mobile-friendly,
+accessible and already translated into several languages.
+* Fixed Do Not Track being checked sometimes in Private Browsing/Incognito
+windows. By default, Privacy Badger should not record anything in Incognito.
+* Added setting to allow learning in Private Browsing/Incognito windows
+* Fixed unwanted scrolling when switching tabs on the options page
+* Updated replacement icon for Google+
+* Fixed various site breakages
+* Improved translations (Bulgarian, Simplified Chinese, Traditional Chinese,
+Danish, Esperanto, French, German, Italian, Polish, Russian, Spanish,
+Ukrainian)
+
+2018.3.21
+* Fixed Do Not Track not being recognized by sites that test for it by
+checking navigator.doNotTrack with JavaScript
+* Stopped signaling DNT on sites where Privacy Badger is disabled
+* Fixed popup in Private Browsing windows in Firefox
+* Fixed certain kinds of site breakages (such as visual issues with charts)
+not going away even after disabling Privacy Badger on the site
+* Updated to latest dummy Google Tag Manager script from uBlock Origin to
+avoid "failed to redirect a network request" warnings in Chrome
+* Fixed various site breakages
+* Improved translations (Bulgarian, Traditional Chinese, German, Italian,
+Swedish)
+
+2018.2.5
+* Added type/status filters to the tracking domains list on the options page
+* Reworked social widget replacement to avoid WebExtensions fingerprintability
+issue in Firefox
+* New translations (Turkish)
+* Improved translations (Danish, Esperanto, French, German, Polish, Swedish,
+Ukrainian)
+
+2018.1.30
+* Removed the "unlimitedStorage" permission from the manifest
+* Changed the tracker count badge color from red to "Privacy Badger orange"
+
+2018.1.25
+* Added workaround to avoid Privacy Badger getting disabled as "Not from
+Chrome Web Store" in Chrome
+
+2018.1.22
+* Reduced amount of data stored as part of normal operation. Privacy Badger
+will no longer record (or check Do Not Track policies for) non-tracking
+domains. This should enable us to remove the "unlimitedStorage" permission
+with the next Badger update.
+* Improved tracker detection status summaries in popup and options
+* Added explanatory acknowledgement to Tracking Domains options page tab
+* Fixed file download dialog not showing when exporting user data in Firefox
+* Removed tutorial reminder link from popup when already on tutorial page
+* Removed "Requests to the server have been blocked by an extension" messages
+in Chrome and Opera
+* Fixed style issue with replacement social widgets
+* Fixed error reporting on pages where Privacy Badger has been disabled
+* Fixed various site breakages
+* Improved translations (Bulgarian, Danish, Esperanto, French, German,
+Italian, Polish, Russian, Spanish, Swedish, Ukrainian)
+
+2017.11.20
+* Disabled custom tooltips in Firefox to work around browser freezing issues
+* Added validation to the disabled sites form
+* Improved translations (Dutch, Esperanto and German)
+* Added Bulgarian and Polish translations
+
+2017.11.9
+* Fixed various site breakages
+* Improved translations (French, Serbian and Ukrainian)
+* Added Esperanto translation
+
+2017.10.25.1
+* Reverted manifest file change preventing upload to Chrome Web Store
+
+2017.10.25
+* Added Beta support for Firefox for Android
+* Updated popup to close after doing anything that reloads the page
+* Improved handling of long domain names
+* Improved tooltips
+* Restored canvas fingerprinting detection to Firefox
+* Fixed yellowlist updates not getting applied when importing Badger data
+* Updated to latest dummy Google Analytics script from uBlock Origin
+to avoid "failed to redirect a network request" warnings in Chrome
+* Fixed various site breakages
+* Improved translations (Danish, French, German, Italian, Swedish)
+
+2017.9.12.1
+* Fixed build script issue that reintroduced major site breakages on Firefox
+
+2017.9.12
+* Fixed DNT policy checking for blocked domains
+* Fixed exporting large Badger datasets
+* Made progress on Firefox for Android compatibility
+* Fixed various site breakages
+* Improved badge updating performance
+* Improved translations (Czech, Italian, Swedish, Ukrainian)
+* Added Danish translation
+
+2017.7.24
+* Added validation to yellowlist (f.k.a. "cookieblock list") updating
+* Removed faulty yellowlist domain removal logic, which, together with missing
+validation and eff.org serving a maintenance page instead of the actual
+yellowlist, resulted in major breakages all across the Web, something this
+update should prevent from happening ever again
+* Fixed various site breakages
+* Improved translations (Swedish)
+
+2017.6.13.1
+* Added workaround for validation issue preventing upload to Chrome Web Store
+* Fixed chrome.privacy-related exceptions in Firefox 54
+
+2017.6.13
+* Added automatic replacement of t.co shortened tracking URLs with original
+unobfuscated URLs on twitter.com
+* Added option to disable Do Not Track policy checking
+* Restricted DNT policy checking from sending cookies
+* Fixed tooltips for DNT-compliant domains in popup
+* Fixed localStorage tracking sometimes being attributed to unrelated domains
+* Improved translations (Swedish, Ukrainian)
+
+2017.5.9
+* Improved popup rendering
+* Added version number to popup
+* Restricted Do Not Track policy checking from being able to set cookies
+* Fixed several cookie parsing issues
+* Added workaround for Cloudflare security cookies
+* Improved translations (Simplified Chinese, Swedish, Ukrainian)
+
+2017.4.19.1
+* Rework DNT policy rechecking to only happen during browsing. Eliminates
+needless rechecking of unlikely-to-be-visited-again domains. Should further
+mitigate CPU issues.
+* Fix DNT policies to only apply to specific domains they are posted on
+* New translations (Ukrainian)
+* Improved translations (Simplified Chinese, Italian)
+* Fix "trackers" link on popup and options pages
+* Fix broken site (sharepoint.com)
+
+2017.3.28
+* New Translations (Czech)
+* Translation Updates
+* Fix bug in DNT policy re-checking code
+* Rate limit DNT checking to one request per second
+* Fix issue with multiple DNT checks at once for a single domain
+* Fix cookieblock updating issue
+* Fix popup width issue
+* Fix DNT hash updating issue
+* Fix toggle switch issue
+* Automated tests now also run on Firefox
+* Other minor bugfixes and broken site fixes
+
+2017.3.22
+* AMO (Firefox) only release.
+* Fix cookie tracking detection in Firefox.
+
+2017.1.26.1
+* AMO only release
+* Fixes an error in the build scripts which reintroduced a firefox bug for AMO users
+
+2017.1.26
+* Huge speed improvements for settings import and on startup
+* Fixes no content blocking bug (firefox)
+* Several fixes for broken websites
+* Translations fixes
+* New Translation: Nordic
+* New Translation: Traditional Chineese (Taiwan)
+* New Translation: Serbian
+* Bugfix: Crash on browsers without WebRTC
+* Bugfix: narrow poup if icon is in the menu (firefox)
+* Bugfix: Import/Export now uses utf-8 and can handle non english character
+sets
+* Enhancement: Convert icons to SVG
+* Enhancement: Script surrogate for google analytics, gigya, and more...
+* KNOWN ISSUE: Chrome will now display a message "Not downloaded from chrome
+
+2016.12.15.1 (2.0.2)
+* BUGFIX: Chrome browsers no longer display privacy badger as (corrupted)
+* BUGFIX: Fixes lockup issue on some versions of firefox
+* BUGFIX: Fixes issue where privacy badger panel gets cut off
+* BUGFIX: Fixes a non implmeneted API in firefox which was causing numerous
+sites to break.
+* KNOWN ISSUE: Chrome will now display a message "Not downloaded from chrome
+store". This is a known side effect of a workaround for a different bug.
+
+2016.12.8.1 (2.0.1)
+* BUGFIX: Sanitize origin and action in popup
+
+2016.12.8 (2.0)
+* BUGFIX: Fix ublock origin warnings
+* BUGFIX: Remove need for download permission
+
+2016.12.7.2 (2.0RC1)
+* Huge speed improvements
+* Multiprocess Compatible (E10S) for firefox
+* Breaks many fewer websites
+* Many small bugfixes
+* Import and Export your data
+* Block WebRTC from leaking your IP address
+* Forget data in incognito mode
+* block html5 "ping" tracking
+* Translation fixes
+* (Developers) Firefox and Chrome versions now share one code base!
+
+2016.9.7 (1.13)
+* Add exceptions for multi domain first parties
+* Fix google drive download issue
+* Fix wikipedia login issue
+* Fix youtube comments and notifications issues
+* Several other broken site fixes
+* Hopefully a fix for the "corrupted extension" issue
+
+2016.8.29 (1.12)
+* UI Tweaks
+* Remove last adblock plus code
+* Feature: remove domains from list
+* Refactor incognito mode handling
+* Compatibile with firefox web extensions
+
+2016.5.24 (1.11)
+* Fix build error
+
+2016.5.23 (1.10)
+* Fix cookie block list adding bug
+* New migration to fix bug retroactively
+
+2016.5.16 (1.9)
+* Remove Adblock Plus Engine
+* Switch to using storage.js and chrome storage API
+* Massive refactoring of code
+* Huge speed improvements
+* Fixes bug where privacy badger "forgets" settings
+* Fixes first run tab opening on every startup
+* Fix waiting for privacy badger bug
+* Fix high CPU usage bug
+* Uses separate data store for incognito mode
+* Ads selenium test to run pbtest.org sweet
+* Fixes weird subdomain handling edge case
+* Fixes bug where pages stop loading sometimes
+
+2015.4.6 (1.8)
+* Fix "waiting for privacy badger bug"
+* Huge speed improvement
+
+2015.4.6 (1.7)
+* Fix crash when closing options page
+* Add EFF Donate Button
+* New popup to nag user to go through tutorial
+
+2015.3.2 (1.0.6)
+* New feature: Search within blocked domain list
+* Replace soundcloud widget with a click to play button
+* Misc. bug fixes and translation improvements
+
+2015.12.3 (1.0.4)
+* Lots of site bug fixes
+* Chinese Translation
+* Spanish Translation
+* italian translation
+* UI Overhaul
+* Update Swedish locale
+* Typo fixes
+* Numerous bug fixes
+* Added support for disabled sites with wildcards
+* Red badge now reflects the number of domains blocked or cookieblocked
+instead of all third parties.
+* Tooltips show full domain name
+
+2015.8.14 (1.0.1)
+* Fixes a bug where slider settings for a base domain wouldn't take effect
+* Fixes 'this extension is slowing down chrome' errors
+
+2015.8.5 (1.0)
+* 1.0 release
+* Bugfixes from 2015.7.24 (0.99)
+* Detects Canvas Fingerprinting
+* Detect Local Storage Supercookies
+* Improved UI
+* Options page for overriding privacy badger settings
+* Report Broken Site button
+* Many Bugfixes (see github)
+* Translations into swedish, french and german
+
+2015.7.24 (0.99)
+* Release candidate for version 1.0!
+
+2015.4.1
+* Miscellanious bugfixes
+* Improvements to heuristic
+
+2014.9.16
+* Adds lots of tests including selenium tests.
+* Adds lots of domains to the cookie block list.
+* Fixes bug with downloading cookie block list.
+* Fixes other minor stylistic bugs.
+
+2014.7.17
+* Created dialog to allow users to unblock certain third parties on certain
+* sites for addedd functionality. E.g. disqus comments, facebook comments, etc.
+* Added lots of domains to cookie block list.
+* do not show domains that do not appear to be trackers in the popup
+* added missing google+ button override
diff --git a/doc/DESIGN-AND-ROADMAP.md b/doc/DESIGN-AND-ROADMAP.md
new file mode 100644
index 0000000..ca96989
--- /dev/null
+++ b/doc/DESIGN-AND-ROADMAP.md
@@ -0,0 +1,276 @@
+# PRIVACY BADGER DESIGN AND ROADMAP
+
+## DESIGN
+
+### OBJECTIVE
+
+Privacy Badger aims to
+
+ - Protect users against non-consensual tracking by third party domains as they
+ browse the Web.
+
+ - Send and enforce the Do Not Track signal to sites (especially "third party"
+ sites since they are in a position to collect a large fraction of the user's
+ browsing history).
+
+Privacy Badger consists of a primary tracker blocking algorithm, augmented by
+a number of secondary features that extend further privacy protection and
+reduce breakage from the primary mechanism.
+
+### PRIMARY MECHANISM
+
+Privacy Badger:
+
+1. Ensures your browser is sending the DNT: 1 header (in some regulatory
+ environments, it is advisable to note "installing Privacy Badger will enable
+ Do Not Track" on your installation page / app store entry.
+2. Observes which first party origins a given third party origin is setting cookies on
+ (certain cookies are deemed to be "low entropy", as discussed below).
+
+ 2a. Observes which first party origins a given third party is doing certain
+ types of fingerprinting on.
+
+ 2b. Observes which first party origins a given third party is setting certain types
+ of supercookies on.
+
+ 2c. Observes which first party origins a given third party is sending
+ certain parts of first party cookies back to itself using image query
+ strings (pixel cookie sharing).
+
+3. If a third party origin receives a cookie, a supercookie, an image pixel
+ containing first party cookie data, or makes JavaScript fingerprinting API
+ calls on 3 or more first party origins, this is deemed to be "cross site
+ tracking".
+4. Typically, cross site trackers are blocked completely; Privacy Badger
+ prevents the browser from communicating with them. The exception is if the
+ site is on Privacy Badger's "yellow list" (aka the "cookie block list"), in
+ which case resources from the site are loaded, but without access to their
+ (third party) cookies or local storage, and with the referer header either
+ trimmed down to the origin (for GET requests) or removed outright (all other
+ requests). The yellow list is routinely fetched from [an EFF URL](https://www.eff.org/files/cookieblocklist_new.txt)
+ to allow prompt fixes for breakage.
+
+ Until methods for blocking them have been implemented, domains that perform
+ fingerprinting or use third party supercookies should not be added to the
+ yellow list.
+5. Users can also choose custom rules for any given domain flagged by Privacy Badger,
+ overrulling any automatic decision Privacy Badger has made about the domain.
+ Privacy Badger uses three-state sliders (red → block, yellow → cookie block, green → allow) to convey this
+ state in UI. We believe this is less confusing than the UI in many other
+ blocking tools, which often leave the user confused about whether a visual
+ state represents current blocking or the opportunity to block.
+6. Domains can agree to EFF's [Do Not Track policy](https://eff.org/dnt-policy). If a domain does this
+ Privacy Badger will no longer block its traffic or cookies. If a
+ first-party domain posts the policy, this applies to all third parties
+ embedded on that domain.
+ Sites post the policy at [a well-known URL](https://example.com/.well-known/dnt-policy.txt)
+ on their domains. The contents must match those of a file from the list of
+ acceptable policies exactly; the policy file is [maintained on github](https://github.com/EFForg/dnt-policy/),
+ but Privacy Badger fetches a list of known-good hashes periodically [from EFF](https://www.eff.org/files/dnt-policies.json)
+ (version 1.0 of the policy file will be added to that list when Privacy Badger
+ reaches version 1.0)
+
+#### Further Details
+
+# :warning: THIS SECTION IS OUTDATED AND NEEDS TO BE REWRITTEN :warning:
+
+Data Structures:
+
+- action_map = { 'google.com': blocked, 'fonts.google.com': 'cookieblocked', 'apis.fonts.google.com': 'user_cookieblock', 'foo.tracker.net': 'allow', 'tracker.net': 'DNT', }
+- snitch_map = {google.com: array('cooperq.com', 'noah.com', 'eff.org'), tracker.net: array(a.com, b.com, c.com)}
+- dnt_domains = array('tracker.net', 'dnt.eff.org')
+- settings = {social_widgets = true, ...}
+- cookie_block_list = "{'fonts.google.com': true, 'maps.google.com', true}"
+
+
+On Request():
+
+ if privacy badger is not enabled for the tab domain then return
+ if fqdn is not a third party then return
+
+ action = check_action(fqdn) (described below)
+
+ if action is block then cancel request
+ if action is cookie_block then strip headers
+ if fqdn is nontracking (i.e check_action returned nothing) then do nothing
+ if action is noaction or any user override then async_check_tracking
+ if action is allow && count == 2 then blocking_check_tracking
+ if check_tracking changed action then call check_action again
+ else do_nothing
+
+ async_check_dnt(fqdn)
+
+check_action(fqdn): returns action
+
+ related_domains = array()
+ best_action = 'noaction'
+
+ for $domain in range(fqdn ... etld+1)
+ if action_map contains $domain
+ related_domains.shift($domain)
+
+ for each domain in related domains
+ if score(domain.action) > score(best_action)
+ best_action = domain.action
+
+ return best_action
+
+check_tracking(fqdn): return boolean
+
+ var base_domain = etld+1(fqdn)
+
+ if has_cookie or has_supercookie or has_fingerprinting
+ if snitch_map doesn't have base domain add it
+ if snitch_map doesn't have first party add it
+ if snitch_map.base_domain.len >= 3
+ add base domain to action map as blocked
+ add all chlidren of base_domain and self from yellow list to action map
+ return true
+
+##### What is an "origin" for Privacy Badger?
+
+Privacy Badger has two notions of origin. One is the [effective top level
+domain](https://wiki.mozilla.org/Public_Suffix_List) plus one level of
+subdomain (eTLD+1), computed using
+[getBaseDomain](https://developer.mozilla.org/en-US/docs/Mozilla/Tech/XPCOM/Reference/Interface/nsIEffectiveTLDService)
+(which is built-in to Firefox; in Chrome we [ship a
+copy](https://github.com/EFForg/privacybadger/blob/8e8ad9838b74b6d13354163f78d362ca60dd44f9/src/lib/basedomain.js#L75).
+The accounting for which origins are trackers or not is performed by looking
+up how many first party fully qualified domain names (FQDNs) have been tracked by each
+of these eTLD + 1 origins. This is a conservative choice, which avoids the
+need to evaluate sets of cookies with different scopes.
+
+When the heuristic determines that the correct response is to block,
+that decision is applied to the third party eTLD+1 from which tracking was seen.
+
+Users are able to override Privacy Badger's decision for any given FQDN if they
+do not wish to block something that is otherwise blocked (or block something
+that is not blocked).
+
+To illustrate this, suppose the site <tt>tracking.co.uk</tt> was embedded on
+every site on the Web, but each embed came from a randomly selected subdomain
+<tt>a.tracking.co.uk</tt>, <tt>b.tracking.co.uk</tt>,
+<tt>c.tracking.co.uk</tt>, etc. Suppose the user visits
+<tt>www.news-example.com</tt> and <tt>search.jobs-example.info</tt>.
+
+The accounting data structure <tt>seenThirdParties</tt> would come to include:
+
+```
+{
+ ...
+ "tracking.co.uk" : {
+ "news-example.com" : true,
+ "jobs-example.info" : true,
+ }
+ ...
+}
+```
+
+Now suppose the user visits a third site, <tt>clickbait.nonprofit.org</tt>,
+and is tracked by <tt>q.tracking.co.uk</tt> on that site. The
+seenThirdParties data structure will have a third entry added to it, meeting
+the threshold of three first party origins and defining
+<tt>tracking.co.uk</tt> as a tracking eTLD+1. At this point
+<tt>tracking.co.uk</tt> will be added to the block list. Any future requests to
+<tt>tracking.co.uk</tt>, or any of its subdomains, will be blocked.
+The user can manually unblock specific subdomains as necessary via the popup menu.
+
+##### What is a "low entropy" cookie?
+
+Our [current cookie heuristic](https://github.com/EFForg/privacybadger/blob/8e8ad9838b74b6d13354163f78d362ca60dd44f9/src/js/heuristicblocking.js#L632) is to assign "number of identifying bits" estimates to
+some known common cookie values, and to bound the sum of these to 12.
+Predetermined low-entropy cookies will not be identified as tracking, nor will
+combinations of them so long as their total estimated entropy is under 12 bits.
+
+### ADDITIONAL MECHANISMS
+
+#### Widget Substitution
+
+Many social media widgets are inherently designed to combine tracking
+and occasionally-useful functionality in a single resource load.
+Privacy Badger aims to give the user access to the functionality when they want
+it, but protection against the tracking at all other times.
+
+To that end, Privacy Badger has incorporated code from the ShareMeNot project
+so that it is able to replace various types of widgets hosted
+by third party origins with local, static equivalents that either replace the
+original widget faithfully, or create a click-through step before the widget
+is loaded and tracks the user.
+
+The widget replacement table lives in the [socialwidgets.json file](https://github.com/EFForg/privacybadger/blob/8e8ad9838b74b6d13354163f78d362ca60dd44f9/src/data/socialwidgets.json).
+Widgets are replaced unless the user has chosen to specifically allow that third party
+domain (by moving the slider to 'green' in the UI), so users can selectively
+disable this functionality if they wish. The code for social media widgets is
+quite diverse, so not all variants (especially custom variants that sites build
+for themselves) are necessarily replaced.
+
+#### What are the states for domain responses?
+
+Currently domains have three states: no action, cookie block, and block. No
+action allows all requests to resolve as normal without intervention from
+Privacy Badger. Cookie block allows for requests to resolve normally but will
+block cookies from being read or created. Cookie block also trims or removes
+the referer header. Block will cause any requests from that origin to be
+blocked entirely; before even a TCP connection can be established. The user can
+toggle these options manually, which will supersede any determinations made
+automatically by Privacy Badger.
+
+#### What does EFFs Do Not Track policy stipulate?
+
+Currently the Do Not Track policy covers where the agreement will be hosted,
+how users who send the DNT header are treated, log retention, how information
+will be shared with other domains, notifications of disclosure, and possible exceptions.
+It can be read in full [here](https://www.eff.org/dnt-policy).
+
+#### How do sites agree to EFFs Do Not Track policy?
+
+Sites can agree to this policy by posting at https://subdomain.example.com/.well-known/dnt-policy.txt,
+where "subdomain" is any domain to which the policy applies, for a given third party.
+
+#### Fingerprinting detection
+Certain aspects of the browser, such as fonts, add-ons or extensions, screen size,
+and seen links, can be used to give the browser a fingerprint that is unique out
+of a very small amount of users (see [Panopticlick](https://panopticlick.eff.org/) for more information).
+
+As of Privacy Badger 1.0, any third party script that writes to an HTML5
+canvas object and then reads a sufficiently large amount back from the third
+party canvas object will be treated the same way as a third party cookie, blocking the
+third party origin if it does this across multiple first party origins. Our
+research has determined that this is a reliable way to distinguish between
+fingerprinting and other third party canvas uses.
+
+This may be augmented by hooks to detect extensive enumeration of properties
+in the <tt>navigator</tt> object in the future.
+
+#### Pixel cookie sharing detection
+
+Detection of first to third party cookie sharing via image pixels was added in [#2088](https://github.com/EFForg/privacybadger/issues/2088).
+
+### ROADMAP
+
+#### High priority issues
+
+Please see our ["high priority"-labeled issues](https://github.com/EFForg/privacybadger/issues?q=is%3Aissue+is%3Aopen+label%3A%22high+priority%22).
+
+## Technical Implementation
+
+### How are origins and the rules for them stored?
+
+When a browser with Privacy Badger enabled makes a request to a third party, if
+the request contains a cookie or the response tries to set a cookie it gets
+flagged as 'tracking'. Origins that make tracking requests get stored in a
+key→value store where the keys are the origins making the request, and the
+values are the first party origins these requests were made on. If that list of
+third parties contains three or more first party origins the third party origin
+gets added to another list of known trackers. When Privacy Badger gets a
+request from an origin on the known trackers list, if it is not on the yellow
+list then Privacy Badger blocks that request. If it is on the yellow list then
+the request is allowed to resolve, but all cookie setting and getting parts of
+it are blocked, while the referer header is trimmed or removed. Both of these
+lists are stored on disk, and persist between browser sessions.
+
+Additionally users can manually set the desired action for any FQDN.
+These get added to their own lists, which are also stored on disk, and get checked
+before Privacy Badger does its default action for a given origin. These are managed
+from the popup window for Privacy Badger on the page as well as the options menu
+for the whole extension.
diff --git a/doc/Translation.md b/doc/Translation.md
new file mode 100644
index 0000000..6292b07
--- /dev/null
+++ b/doc/Translation.md
@@ -0,0 +1,92 @@
+# Translating Privacy Badger
+
+We need your help in translating Privacy Badger to every possible language!
+
+When translating you should always use the source (American English) locale as
+the reference. You can also use existing translations from other languages to
+help you in case of doubt, but you should always consider the English version
+as the correct one.
+
+
+#### A note about adding translation strings in PRs
+
+While working on a Privacy Badger enhancement, you might need to add one or
+more localized strings. You only need to add new strings to the source
+(`en_US`) locale. There is no need to manually add untranslated copies of new
+messages to all other locales. This will be taken care of later by a Privacy
+Badger maintainer.
+
+
+## Working with translations on GitHub
+
+Translations on GitHub are done with JSON files.
+Each language has its own folder inside
+[`src/_locales/`](https://github.com/EFForg/privacybadger/tree/master/src/_locales)
+(e.g. 'es' for Spanish, 'ru' for Russian, etc.).
+Inside each of these folders is a JSON file that contains the translated
+strings for that language. Each entry in the JSON file follows this structure:
+
+ "string_identifier": {
+ "message": "String text"
+ "description": "Some useful info"
+ }
+
+The translated string is the `"String text"` part. You should **NOT** change
+any other part of the entry.
+
+The `"Some useful info"` part sometimes contains useful information (in
+English) about the string. Usually it provides the context of the string: what
+it is ("a section heading") and where it can be found in the UI ("on the new
+user intro page"). You should not translate it.
+
+To contribute on GitHub, first check the status of your local language
+translation: if you don't see a folder with your
+[local language code](https://developer.chrome.com/webstore/i18n?csw=1#localeTable),
+the translation for that language is missing. In this case you should follow
+the instructions below to set up the JSON file for your language. If the
+translation for your language is already there, you can contribute by checking
+its accuracy and by correcting any errors you find (see below for
+instructions).
+
+#### Add a new language
+
+To add a new language on GitHub, follow these steps:
+
+1. Fork this repository
+2. Inside your fork, create a folder in `src/_locales/` and name it
+with your [local language code](https://developer.chrome.com/webstore/i18n?csw=1#localeTable)
+3. Copy the `src/_locales/en_US/messages.json` file to the folder you created
+4. Start translating each message to your language by replacing the
+English strings with the translated ones
+5. When you have completed the translation, [open a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/). Here you can find
+an example translation pull request: [#1270](https://github.com/EFForg/privacybadger/pull/1270).
+
+#### Correct an existing translation
+
+To correct errors in an existing translation:
+
+1. Fork this repository
+2. Open your local language JSON file and apply the changes
+3. When you have completed your work, [open a pull request](https://help.github.com/articles/creating-a-pull-request-from-a-fork/).
+Here you can find an example translation pull request:
+[#1270](https://github.com/EFForg/privacybadger/pull/1270).
+
+
+## Testing your translations
+
+To see your (in-progress) translations in the actual Privacy Badger UI, you should first [load Privacy Badger from source code](/doc/develop.md#install-from-source).
+
+A quick/hacky way to change Privacy Badger's locale is to temporarily copy the locale you want to use to your default (OS) locale's folder in `src/_locales/` and reload Privacy Badger.
+
+The proper way would be to launch the browser in your desired locale.
+
+For Chrome, it might be as easy as [launching it from the command line with `LANGUAGE=fr` (for example) in front of the executable](https://stackoverflow.com/questions/24992240/start-google-chrome-with-a-specific-locale-using-a-command-line-argument).
+
+Firefox requires [downloading a language pack](https://addons.mozilla.org/en-US/firefox/language-tools/) and [setting it as your locale from about:config](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Internationalization#Testing_out_your_extension).
+
+
+## Other information
+
+To learn about outstanding translations-related issues, and to
+see how translations have been handled in the past, take a look
+at issues and pull requests marked with the [translations label](https://github.com/EFForg/privacybadger/issues?utf8=%E2%9C%93&q=label%3Atranslations%20).
diff --git a/doc/admin-deployment.md b/doc/admin-deployment.md
new file mode 100644
index 0000000..41c1d0e
--- /dev/null
+++ b/doc/admin-deployment.md
@@ -0,0 +1,49 @@
+# Privacy Badger enterprise deployment and configuration
+
+Administrators can configure Privacy Badger on managed devices by setting up a policy.
+
+You can find the full list of available settings in [Privacy Badger's managed storage schema](/src/data/schema.json). Please [let us know](https://privacybadger.org/#I-found-a-bug%21-What-do-I-do-now) if you'd like to set something that isn't yet supported.
+
+Note that Privacy Badger currently reads and applies settings from [managed storage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage/managed) on startup. To see your policy take effect on a managed device, first restart that device's browser.
+
+
+## Firefox setup
+
+1. Locate and if necessary create the [managed storage manifests folder](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Native_manifests#Manifest_location). Note that on Windows you need to create a registry key that points to the manifest's location.
+2. Copy the [sample managed storage manifest for Firefox](/doc/jid1-MnnxcxisBPnSXQ@jetpack.json) to this folder.
+
+If your Privacy Badgers were installed from [Privacy Badger's homepage](https://privacybadger.org) (not from [AMO](https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/)):
+
+3. Rename the manifest to `jid1-MnnxcxisBPnSXQ-eff@jetpack.json`.
+4. Similarly, update the `"name"` property in the manifest to `"jid1-MnnxcxisBPnSXQ-eff@jetpack"`.
+
+
+## Chrome/Chromium setup
+
+Please review the [Configuring Apps and Extensions by Policy](http://www.chromium.org/administrators/configuring-policy-for-extensions) document.
+
+Notes for Chrome OS and Linux follow.
+
+### Chrome OS
+
+The following example JSON policy disables Privacy Badger on `example.com`. This means Privacy Badger will be disabled when you visit any `example.com` page.
+
+```json
+{
+ "disabledSites": {
+ "Value": [
+ "example.com"
+ ]
+ },
+ "showIntroPage": {
+ "Value": false
+ }
+}
+```
+
+### Linux
+
+1. Locate and if necessary create the [managed policies folder for Chrome or Chromium](http://www.chromium.org/administrators/configuring-policy-for-extensions).
+2. Copy the [sample managed storage manifest for Chrome](/doc/sample-managed-storage-manifest-chrome.json) to this folder.
+3. Rename the manifest file to whatever you like (perhaps `privacy-badger-admin-settings.json`).
+4. Update the extension ID inside the manifest if you are not using official Privacy Badger releases from Chrome Web Store.
diff --git a/doc/develop.md b/doc/develop.md
new file mode 100644
index 0000000..cd28b16
--- /dev/null
+++ b/doc/develop.md
@@ -0,0 +1,45 @@
+# Working with Privacy Badger's code
+
+To make changes to Privacy Badger, you have to first load the extension from a source code checkout.
+
+
+## Install from source
+
+To install Privacy Badger from source in Chrome, visit `chrome://extensions`, enable "Developer mode", click "Load unpacked" and select the [`src`](src/) subdirectory inside your copy of the Privacy Badger source code.
+
+In Firefox, visit `about:debugging`, click "Load Temporary Add-on" and select the [`src/manifest.json`](src/manifest.json) file. Note that this only installs the extension temporarily; it will be removed when you close Firefox.
+
+To install Privacy Badger from source in Firefox for Android, please see [Mozilla's guide to developing extensions for Firefox for Android](https://extensionworkshop.com/documentation/develop/developing-extensions-for-firefox-for-android/) and [`web-ext` documentation](https://extensionworkshop.com/documentation/develop/getting-started-with-web-ext/#testing-in-firefox-for-android).
+
+
+## Send a pull request
+
+Before submitting a pull request (PR), please review the sections below.
+
+### Style guide
+
+All JavaScript code going forward should use the following naming conventions:
+
+- Objects and their properties should be Java or camelCase style.
+- Primitive types should be Python or snake_case style.
+- Constants should be ALL_CAPS.
+
+Examples:
+
+```javascript
+const TRACKER_ENTROPY_THRESHOLD = 33;
+
+let tab_id = details.tabId;
+
+window.badger.getTrackerCount(tab_id);
+```
+
+### Catch errors early with static code analysis
+
+First, install the exact expected version of [ESLint](https://eslint.org) by running `npm install` in your Privacy Badger source code checkout directory. You should then be able to produce a lint report by running `make lint` in the same directory.
+
+You can review our set of ESLint rules in [`.eslintrc.yml`](/.eslintrc.yml). Files we want ESLint to ignore are specified in [`.eslintignore`](/.eslintignore).
+
+### Commit messages
+
+Please review the suggestions in this excellent [guide to writing commit messages](https://chris.beams.io/posts/git-commit/).
diff --git a/doc/fixing-broken-sites.md b/doc/fixing-broken-sites.md
new file mode 100644
index 0000000..7a31da9
--- /dev/null
+++ b/doc/fixing-broken-sites.md
@@ -0,0 +1,63 @@
+# How to fix broken site issues
+
+Unfortunately, while working to protect your privacy, Privacy Badger can end up breaking website functionality. Here are the [open "broken site" and "help wanted"-labeled issues](https://github.com/EFForg/privacybadger/issues?utf8=✓&q=is%3Aissue%20is%3Aopen%20label%3A"broken%20site"%20label%3A"help%20wanted"%20).
+
+This document is about the process of classifying and resolving these breakages.
+
+
+## Confirm Privacy Badger is responsible
+
+The first thing to do is to confirm that Privacy Badger blocks (or will eventually learn to block) the domain, and that blocking the domain does indeed break the site.
+
+Browser caching can get in our way here, as cached resources bypass request filtering by extensions. Disable your browser cache when debugging, for example by reloading using <kbd>Ctrl+Shift+R</kbd> every time.
+
+Try disabling Privacy Badger for the site, and then reloading the page. Does that fix the issue? If it doesn't, does disabling the entire Privacy Badger add-on and reloading the page fix the issue? If it still doesn't, Privacy Badger is not at fault.
+
+If disabling Badger and reloading the page fixed the issue, and re-enabling and reloading brought the issue back, let's try to figure out the responsible domain(s). Try allowing half the blocked domains to load. If (after reloading the page) the issue was fixed, pick half of those domains and revert them back to Badger's control. Eventually you should find the exact domain(s) that, when blocked, cause the issue to appear.
+
+
+## Resolve the breakage
+
+Once the issue is confirmed (and the responsible domains have been identified), you should try to find the most appropriate way to resolve it. Privacy Badger comes with several approaches:
+
+| Approach | Label | Original issue | Difficulty | Notes |
+| --- | :---: | :---: | :---: | --- |
+| Multi-domain first parties | [MDFP](https://github.com/EFForg/privacybadger/labels/MDFP) | [#781](https://github.com/EFForg/privacybadger/issues/781) | Easy | Narrowly applicable |
+| Script surrogates | [surrogates](https://github.com/EFForg/privacybadger/labels/surrogates) | [#400](https://github.com/EFForg/privacybadger/issues/400) | Hard | Should use uBlock Origin's surrogates ("neutered scripts") as much as possible |
+| Widget replacement | [widgets](https://github.com/EFForg/privacybadger/labels/widgets) | [#196](https://github.com/EFForg/privacybadger/issues/196), [#1467](https://github.com/EFForg/privacybadger/issues/1467) | Medium | Still needs review/improvements, although some progress being made ([#2262](https://github.com/EFForg/privacybadger/pull/2262)) |
+| EFF's Do Not Track policy | [DNT Policy](https://github.com/EFForg/privacybadger/labels/DNT%20policy)| - | n/a | Narrowly applicable |
+| Yellowlisting | [yellowlist](https://github.com/EFForg/privacybadger/labels/yellowlist)| - | Easy | Only protects against some types of tracking |
+
+The question to ask is, which way addresses the issue most specifically, resolving the breakage while increasing privacy exposure by the smallest amount? If you are not sure, that's OK! Opening a new issue (or chiming in on an existing issue) to ask for help is fine.
+
+Let's look at some common kinds of breakages and see how they relate to the approaches above.
+
+
+### Domains that are part of the site but don't look like it
+
+Does the blocked domain actually belong to the site, but Privacy Badger doesn't know that and so treats the domain as an external tracker? Sounds like a job for [multi-domain first parties](https://github.com/EFForg/privacybadger/issues/781) (MDFP).
+
+When adding domains to the MDFP list, please add base ([eTLD](https://en.wikipedia.org/wiki/Public_Suffix_List)+1) domains only. For example, there is no need to add `api.example.net` when adding `example.com` and `example.net`.
+
+For past examples, you could browse [the list of merged pull requests with the "MDFP" label](https://github.com/EFForg/privacybadger/issues?q=label%3AMDFP+is%3Amerged).
+
+
+### JavaScript errors
+
+Does blocking the domain block a JavaScript analytics library that the site tries to use and fails, breaking site navigation? This could be resolved by [script surrogates](https://github.com/EFForg/privacybadger/issues/400).
+
+
+### External services
+
+Is the missing comments section powered by a commenting service that Privacy Badger learned to block? Perhaps a new [widget replacement](https://github.com/EFForg/privacybadger/pull/196) should be added.
+
+We should also ask the service to to adopt the [EFF Do Not Track policy](https://www.eff.org/dnt-policy), which is a way for privacy-conscious companies to receive recognition for their good practices. If their service can and will abide by the policy's requirements, posting the policy on the service's domains will tell Privacy Badger to allow loading of resources from those domains.
+
+
+### External domains too complex to surrogate or replace with placeholders
+
+If nothing else seems to fit, adding the affected domain to the "[yellowlist](/doc/yellowlist-criteria.md)" will make Privacy Badger set the domain to "yellow" ("cookie-blocked") instead of "red" (blocked) after seeing it track on three or more sites.
+
+Resources from yellowlisted domains are requested without referrer headers, and are restricted from reading or writing cookies or localStorage.
+
+[Here is an example yellowlist pull request](https://github.com/EFForg/privacybadger/pull/1543) that shows what's good to know when deciding how to fix a breakage, and how to get that information.
diff --git a/doc/jid1-MnnxcxisBPnSXQ@jetpack.json b/doc/jid1-MnnxcxisBPnSXQ@jetpack.json
new file mode 100644
index 0000000..b9242ca
--- /dev/null
+++ b/doc/jid1-MnnxcxisBPnSXQ@jetpack.json
@@ -0,0 +1,11 @@
+{
+ "name": "jid1-MnnxcxisBPnSXQ@jetpack",
+ "description": "This is a sample Firefox managed storage manifest.",
+ "type": "storage",
+ "data": {
+ "showIntroPage": false,
+ "disabledSites": [
+ "example.com"
+ ]
+ }
+}
diff --git a/doc/permissions.md b/doc/permissions.md
new file mode 100644
index 0000000..1211b2a
--- /dev/null
+++ b/doc/permissions.md
@@ -0,0 +1,27 @@
+# Permissions
+
+This document explains the need for each [extension permission](https://developer.chrome.com/extensions/declare_permissions) declared in Privacy Badger's [extension manifest](/src/manifest.json).
+
+## Privacy
+The Privacy API lets extensions modify browser-wide privacy settings. Privacy Badger uses it to disable a setting that lets Chrome send third-party requests to resolve errors, and to turns off link tracking via the HTML ping attribute. We also give users the option to change their WebRTC privacy level in order to prevent leaking local network address information.
+
+## Cookies
+Privacy Badger needs access to the cookies API in order to detect and correct a common error where Cloudflare domains are identified as trackers and blocked.
+
+## Storage
+The storage API lets extensions store information that persists after the browser is closed. Privacy Badger uses it to save user settings and information it has learned about trackers.
+
+## WebRequest
+The WebRequest API allows extensions to observe all incoming and outgoing network requests made by the browser. Privacy Badger inspects request for tracking behavior, and logs the destinations of outgoing requests that are flagged as tracking. No information is ever shared outside of the browser.
+
+## WebRequestBlocking
+The blocking version of the WebRequest API allows extensions to modify or block network requests before they leave the browser. Privacy Badger uses this API to synchronously view, modify, and block requests to trackers. For example, Privacy Badger modifies requests made to domains on the yellowlist to remove the referer header and cookies.
+
+## WebNavigation
+This API allows extensions to detect when the user navigates from one web page to another. Privacy Badger needs this in order to correctly determine whether each request is a first-party request (to the same domain as the web page) or a third-party request (to somewhere else). This permission allows it to avoid misattributing trackers on special pages such as Service Worker pages.
+
+## http://\*/\* and https://\*/\*
+These permissions allow Privacy Badger to use the WebRequest and WebRequestBlocking permissions on requests to all websites. As described above, Privacy Badger uses these APIs to analyze requests and detect tracking, then modify or block requests to known trackers. No information is ever shared outside of the browser.
+
+## Tabs
+Privacy Badger needs access to the tabs API so that the extension can detect which tab is active and which tabs are simply present in the background. The extension icon, badge and popup update to reflect the state of Privacy Badger. This often requires knowing the tab's URL. For example, updating the icon requires the URL in order to determine whether Privacy Badger should be shown as disabled on that tab. Privacy Badger also uses the tabs API for miscellaneous tasks such as opening or switching to the already open new user welcome page.
diff --git a/doc/sample-managed-storage-manifest-chrome.json b/doc/sample-managed-storage-manifest-chrome.json
new file mode 100644
index 0000000..194bd02
--- /dev/null
+++ b/doc/sample-managed-storage-manifest-chrome.json
@@ -0,0 +1,12 @@
+{
+ "3rdparty": {
+ "extensions": {
+ "pkehgijcmpdhfbdbbnkijodmdjhbjlgp": {
+ "showIntroPage": false,
+ "disabledSites": [
+ "example.com"
+ ]
+ }
+ }
+ }
+}
diff --git a/doc/tests.md b/doc/tests.md
new file mode 100644
index 0000000..b03c4a3
--- /dev/null
+++ b/doc/tests.md
@@ -0,0 +1,92 @@
+# Working with Privacy Badger's tests
+
+We have a few different types of tests:
+
+* We use [unit tests](/doc/tests.md#unit-tests) for confirming that smaller pieces of code behave as expected.
+* [Functional tests](/doc/tests.md#functional-tests) test the UI and that things integrate together properly.
+* [Travis CI](/doc/tests.md#travis-ci) runs all these automatically for every pull request on both Chrome and Firefox.
+
+## Travis CI
+
+Every pull request runs the full suite of functional and unit tests on [Travis CI](https://travis-ci.org/). We test on latest stable Chrome and Firefox releases, as well as on Chrome Beta, Firefox Beta and Firefox ESR.
+
+See [`.travis.yml`](/.travis.yml) for Travis configuration, [`scripts/setup_travis.sh`](/scripts/setup_travis.sh) for test setup, and [`scripts/run_travis.sh`](/scripts/run_travis.sh) for test execution procedures.
+
+We use [ESLint](https://eslint.org) to flag potential JavaScript errors and style issues. Please see our [developer guide](/doc/develop.md#lint-your-changes) for setup instructions.
+
+## Unit tests
+
+We use [QUnit](https://qunitjs.com/) for unit tests.
+Unit tests are defined in [`/src/tests/tests`](/src/tests/tests). Unit test dependencies live in [`/src/tests/lib`](/src/tests/lib).
+
+To run unit tests, first [load Privacy Badger from source code](/doc/develop.md#install-from-source) (as we don't ship unit tests with published versions).
+Once you loaded Badger from source, click on its button in your browser toolbar to open Badger's popup.
+Then in the popup, click on the gear icon (⚙) to open the options page.
+Your browser should navigate to an internal URL that starts with `chrome-extension://` or `moz-extension://` and ends with `/skin/options.html`.
+Replace `/skin/options.html` with `/tests/index.html` and hit <kbd>Enter</kbd>.
+This will open the unit test suite and run the tests.
+
+### Writing unit tests
+
+When writing unit tests, try to scope each test to the function or method in question, then each individual assertion within that test addressing a core piece of functionality or expectation of that test. Consider testing expected input, potential breaking points, and expected outputs. It's easy to get caught going down rabbit holes testing unlikely scenarios, so consider which edge cases are most important to consider, and which are more likely to occur.
+
+Do verify that removing or mutating the code being tested produces failed assertions.
+
+## Functional tests
+
+Our [functional tests](/tests/selenium/) are written in Python and driven by [Selenium](https://selenium-python.readthedocs.io/) and [pytest](https://docs.pytest.org/en/latest/).
+
+To run them in Chrome, you need to [install `chromedriver`](http://chromedriver.chromium.org/getting-started). In Firefox, you need to [install `geckodriver`](https://github.com/EFForg/privacybadger/blob/1550b9efb64c1d5e276361e3940f402c3ec87afc/scripts/setup_travis.sh#L21-L50).
+
+You also need to [install the Python packages](https://snarky.ca/a-quick-and-dirty-guide-on-how-to-install-packages-for-python/) specified in [`/tests/requirements.txt`](/tests/requirements.txt).
+
+You should now be able to run the Selenium tests. Try them out by running
+the code below. This should take several minutes.
+```bash
+$ BROWSER=chrome pytest -v tests/
+```
+
+macOS users may need to provide the full path to the browser application folder. For example, to run tests on macOS:
+```bash
+$ BROWSER=/Applications/Firefox.app/Contents/MacOS/firefox-bin pytest -v tests/
+# or
+$ BROWSER=/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome pytest -v tests/
+```
+
+For more information, see our Travis CI [setup](/scripts/setup_travis.sh) and
+[run](/scripts/run_travis.sh) scripts.
+
+
+### Invocation examples
+
+Note that to use a debugger like `pdb` or `ipdb` you must pass the `-s` (`--capture=no`) flag to pytest.
+```bash
+# run qunit_test.py, with Firefox, with verbose output (-v)
+$ BROWSER=/usr/bin/firefox pytest -v tests/selenium/qunit_test.py tests/
+
+# run a specific test on a specific class in a specific module with Chrome Beta
+$ BROWSER=google-chrome-beta pytest tests/selenium/super_cookie_test.py::SupercookieTest::test_should_detect_ls_of_third_party_frame
+
+# run any tests whose name (including the module and class) matches the string cookie_test
+# this is often useful as a less verbose way to run a single test
+$ BROWSER=firefox pytest -k cookie_test tests/
+```
+
+More pytest invocations can be found [here](https://docs.pytest.org/en/latest/usage.html).
+
+If you are on Linux, you can also run the tests headlessly (without displaying a GUI).
+Install `Xvfb` with your system package manager, then set the `ENABLE_XVFB=1` environment variable:
+
+```bash
+$ BROWSER=firefox ENABLE_XVFB=1 pytest -s -v -k PopupTest tests/
+```
+
+### Writing functional tests
+
+Test methods that you want to be discovered and run by `pytest` must be prefixed with the keyword `test`. For example: `test_pixel_tracking_detection`. A similar rule applies to naming any new test class files that you want to be detected by the testing suite: the `test` keyword must be appended to the end of the title. For example: `pixel_test.py`.
+
+When testing Badger's tracker detection/learning, you should first clear the pre-trained/seed tracker data. For example (run on Badger's options page): `self.js("chrome.extension.getBackgroundPage().badger.storage.clearTrackerData();")`. Clearing seed data ensures that the tracking domain was discovered just now and not from seed data.
+
+You should also set up your tracking detection test in a way where your test fixture has a "no tracking" mode that you visit first and assert that no tracking was detected. This is to ensure that when we detect the tracking being tested we didn't actually detect some other kind of tracking instead.
+
+Just as with unit tests, please verify that removing or mutating the code being tested produces failed assertions.
diff --git a/doc/yellowlist-criteria.md b/doc/yellowlist-criteria.md
new file mode 100644
index 0000000..c209328
--- /dev/null
+++ b/doc/yellowlist-criteria.md
@@ -0,0 +1,8 @@
+EFF maintains a Privacy Badger "yellowlist" of domains for which requests are allowed but Privacy Badger restricts access or availability of objectionable cookies and potentially other objectionable identifiers.
+
+Our objective in curating that list is to maximize user privacy while minimizing disruption to functionality that users expect from sites. The criteria we examine when considering possible yellowlist entries include (but are not limited to):
+
+* Was this in [Bau and Mayer's](https://jonathanmayer.org/papers_data/bau13.pdf) manually curated non-tracker list?
+* Is this domain necessary for functionality the user expects from 1st party pages?
+* Is the domain's privacy policy clear that it does not perform non-consensual tracking?
+* Is there a reasonable self-hosted surrogate available that could replace the functionality of this domain (e.g. https://github.com/EFForg/privacybadgerchrome/issues/400).
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..deba7a3
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,7063 @@
+{
+ "name": "privacy-badger-dev-tools",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@babel/code-frame": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
+ "requires": {
+ "@babel/highlight": "^7.0.0"
+ }
+ },
+ "@babel/highlight": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
+ "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
+ "requires": {
+ "chalk": "^2.0.0",
+ "esutils": "^2.0.2",
+ "js-tokens": "^4.0.0"
+ },
+ "dependencies": {
+ "js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ }
+ }
+ },
+ "@babel/polyfill": {
+ "version": "7.11.5",
+ "resolved": "https://registry.npmjs.org/@babel/polyfill/-/polyfill-7.11.5.tgz",
+ "integrity": "sha512-FunXnE0Sgpd61pKSj2OSOs1D44rKTD3pGOfGilZ6LGrrIH0QEtJlTjqOqdF8Bs98JmjfGhni2BBkTfv9KcKJ9g==",
+ "dev": true,
+ "requires": {
+ "core-js": "^2.6.5",
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@babel/runtime": {
+ "version": "7.11.2",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.11.2.tgz",
+ "integrity": "sha512-TeWkU52so0mPtDcaCTxNBI/IHiz0pZgr8VEFqXFtZWpYD08ZB6FaSwVAS8MKRQAP3bYKiVjwysOJgMFY28o6Tw==",
+ "dev": true,
+ "requires": {
+ "regenerator-runtime": "^0.13.4"
+ }
+ },
+ "@cliqz-oss/firefox-client": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@cliqz-oss/firefox-client/-/firefox-client-0.3.1.tgz",
+ "integrity": "sha512-RO+Tops/wGnBzWoZYkCraqyh2JqOejqJq5/a4b54HhmjTNSKdUPwAOK17EGg/zPb0nWqkuB7QyZsI9bo+ev8Kw==",
+ "dev": true,
+ "requires": {
+ "colors": "0.5.x",
+ "js-select": "~0.6.0"
+ }
+ },
+ "@cliqz-oss/node-firefox-connect": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@cliqz-oss/node-firefox-connect/-/node-firefox-connect-1.2.1.tgz",
+ "integrity": "sha512-O/IyiB5pfztCdmxQZg0/xeq5w+YiP3gtJz8d4We2EpLPKzbDVjOrtfLKYgVfm6Ya6mbvDge1uLkSRwaoVCWKnA==",
+ "dev": true,
+ "requires": {
+ "@cliqz-oss/firefox-client": "0.3.1",
+ "es6-promise": "^2.0.1"
+ }
+ },
+ "@devicefarmer/adbkit": {
+ "version": "2.11.3",
+ "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit/-/adbkit-2.11.3.tgz",
+ "integrity": "sha512-rsgWREAvSRQjdP9/3GoAV6Tq+o97haywgbTfCgt5yUqiDpaaq3hlH9FTo9XsdG8x+Jd0VQ9nTC2IXsDu8JGRSA==",
+ "dev": true,
+ "requires": {
+ "@devicefarmer/adbkit-logcat": "^1.1.0",
+ "@devicefarmer/adbkit-monkey": "~1.0.1",
+ "bluebird": "~2.9.24",
+ "commander": "^2.3.0",
+ "debug": "~2.6.3",
+ "node-forge": "^0.10.0",
+ "split": "~0.3.3"
+ }
+ },
+ "@devicefarmer/adbkit-logcat": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit-logcat/-/adbkit-logcat-1.1.0.tgz",
+ "integrity": "sha512-K90P5gUXM/w+yzLvJIRQ+tJooNU6ipUPPQkljtPJ0laR66TGtpt4Gqsjm0n9dPHK1W5KGgU1R5wnCd6RTSlPNA==",
+ "dev": true
+ },
+ "@devicefarmer/adbkit-monkey": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@devicefarmer/adbkit-monkey/-/adbkit-monkey-1.0.1.tgz",
+ "integrity": "sha512-HilPrVrCosYWqSyjfpDtaaN1kJwdlBpS+IAflP3z+e7nsEgk3JGJf1Vg0NgHJooTf5HDfXSyZqMVg+5jvXCK0g==",
+ "dev": true,
+ "requires": {
+ "async": "~0.2.9"
+ }
+ },
+ "@eslint/eslintrc": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.1.3.tgz",
+ "integrity": "sha512-4YVwPkANLeNtRjMekzux1ci8hIaH5eGKktGqR0d3LWsKNn5B2X/1Z6Trxy7jQXl9EBGE6Yj02O+t09FMeRllaA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.4",
+ "debug": "^4.1.1",
+ "espree": "^7.3.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^3.13.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "strip-json-comments": "^3.1.1"
+ },
+ "dependencies": {
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ }
+ }
+ },
+ "@sindresorhus/is": {
+ "version": "0.14.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz",
+ "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==",
+ "dev": true
+ },
+ "@szmarczak/http-timer": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz",
+ "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==",
+ "dev": true,
+ "requires": {
+ "defer-to-connect": "^1.0.1"
+ }
+ },
+ "@types/minimatch": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz",
+ "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "14.11.2",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.11.2.tgz",
+ "integrity": "sha512-jiE3QIxJ8JLNcb1Ps6rDbysDhN4xa8DJJvuC9prr6w+1tIh+QAbYyNF3tyiZNLDBIuBCf4KEcV2UvQm/V60xfA==",
+ "dev": true
+ },
+ "JSONSelect": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/JSONSelect/-/JSONSelect-0.2.1.tgz",
+ "integrity": "sha1-QVQYpSbTP+MddLTe+jyDbUhewgM=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
+ "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
+ "dev": true
+ },
+ "acorn-jsx": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
+ "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
+ "dev": true
+ },
+ "addons-linter": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/addons-linter/-/addons-linter-2.7.0.tgz",
+ "integrity": "sha512-kH+0fAKSc461PnCyYQ0/SeKcxEQ2zxCZwG2GB6xjvfkMiMAwwic87VP62Cffc8H/zHEfYuT8uFmy42ayH5mqEQ==",
+ "dev": true,
+ "requires": {
+ "@babel/runtime": "7.11.2",
+ "ajv": "6.12.5",
+ "ajv-merge-patch": "4.1.0",
+ "chalk": "4.1.0",
+ "cheerio": "1.0.0-rc.3",
+ "columnify": "1.5.4",
+ "common-tags": "1.8.0",
+ "deepmerge": "4.2.2",
+ "dispensary": "0.57.0",
+ "es6-promisify": "6.1.1",
+ "eslint": "7.9.0",
+ "eslint-plugin-no-unsanitized": "3.1.2",
+ "eslint-visitor-keys": "2.0.0",
+ "espree": "7.3.0",
+ "esprima": "4.0.1",
+ "first-chunk-stream": "4.0.0",
+ "fluent-syntax": "0.13.0",
+ "fsevents": "2.1.3",
+ "glob": "7.1.6",
+ "is-mergeable-object": "1.1.1",
+ "jed": "1.1.1",
+ "mdn-browser-compat-data": "1.0.39",
+ "os-locale": "5.0.0",
+ "pino": "6.6.1",
+ "postcss": "7.0.35",
+ "probe-image-size": "5.0.0",
+ "relaxed-json": "1.0.3",
+ "semver": "7.3.2",
+ "source-map-support": "0.5.19",
+ "strip-bom-stream": "4.0.0",
+ "tosource": "1.0.0",
+ "upath": "1.2.0",
+ "whatwg-url": "8.2.2",
+ "yargs": "15.4.1",
+ "yauzl": "2.10.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "debug": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.2.0.tgz",
+ "integrity": "sha512-IX2ncY78vDTjZMFUdmsvIRFY2Cf4FnD0wRs+nQwJU8Lu99/tPFdb0VybiiMTPe3I6rQmwsqQqRBvxU+bZ/I8sg==",
+ "dev": true,
+ "requires": {
+ "ms": "2.1.2"
+ }
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "eslint": {
+ "version": "7.9.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.9.0.tgz",
+ "integrity": "sha512-V6QyhX21+uXp4T+3nrNfI3hQNBDa/P8ga7LoQOenwrlEFXrEnUEE+ok1dMtaS3b6rmLXhT1TkTIsG75HMLbknA==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "@eslint/eslintrc": "^0.1.3",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.0.1",
+ "doctrine": "^3.0.0",
+ "enquirer": "^2.3.5",
+ "eslint-scope": "^5.1.0",
+ "eslint-utils": "^2.1.0",
+ "eslint-visitor-keys": "^1.3.0",
+ "espree": "^7.3.0",
+ "esquery": "^1.2.0",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^5.0.1",
+ "functional-red-black-tree": "^1.0.1",
+ "glob-parent": "^5.0.0",
+ "globals": "^12.1.0",
+ "ignore": "^4.0.6",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "js-yaml": "^3.13.1",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash": "^4.17.19",
+ "minimatch": "^3.0.4",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.1",
+ "progress": "^2.0.0",
+ "regexpp": "^3.1.0",
+ "semver": "^7.2.1",
+ "strip-ansi": "^6.0.0",
+ "strip-json-comments": "^3.1.0",
+ "table": "^5.2.3",
+ "text-table": "^0.2.0",
+ "v8-compile-cache": "^2.0.3"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "requires": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
+ "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
+ "dev": true,
+ "requires": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "eslint-visitor-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz",
+ "integrity": "sha512-QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==",
+ "dev": true
+ },
+ "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
+ },
+ "esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.2.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "file-entry-cache": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz",
+ "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==",
+ "dev": true,
+ "requires": {
+ "flat-cache": "^2.0.1"
+ }
+ },
+ "flat-cache": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz",
+ "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==",
+ "dev": true,
+ "requires": {
+ "flatted": "^2.0.0",
+ "rimraf": "2.6.3",
+ "write": "1.0.3"
+ }
+ },
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "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"
+ }
+ },
+ "levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
+ "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
+ "dev": true,
+ "requires": {
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0",
+ "word-wrap": "^1.2.3"
+ }
+ },
+ "prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "table": {
+ "version": "5.4.6",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz",
+ "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.10.2",
+ "lodash": "^4.17.14",
+ "slice-ansi": "^2.1.0",
+ "string-width": "^3.0.0"
+ }
+ },
+ "type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "^1.2.1"
+ }
+ },
+ "write": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz",
+ "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==",
+ "dev": true,
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ }
+ }
+ },
+ "adm-zip": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz",
+ "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==",
+ "dev": true
+ },
+ "ajv": {
+ "version": "6.12.5",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.5.tgz",
+ "integrity": "sha512-lRF8RORchjpKG50/WFf8xmg7sgCLFiYNNnqdKflk63whMQcWR5ngGjiSXkL9bjxy6B2npOK2HSMN49jEBMSkag==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ajv-merge-patch": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-merge-patch/-/ajv-merge-patch-4.1.0.tgz",
+ "integrity": "sha512-0mAYXMSauA8RZ7r+B4+EAOYcZEcO9OK5EiQCR7W7Cv4E44pJj56ZnkKLJ9/PAcOc0dT+LlV9fdDcq2TxVJfOYw==",
+ "dev": true,
+ "requires": {
+ "fast-json-patch": "^2.0.6",
+ "json-merge-patch": "^0.2.3"
+ }
+ },
+ "ansi-align": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz",
+ "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==",
+ "dev": true,
+ "requires": {
+ "string-width": "^3.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
+ "dev": true
+ },
+ "emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^4.1.0"
+ }
+ }
+ }
+ },
+ "ansi-colors": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
+ "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
+ "dev": true
+ },
+ "ansi-escapes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz",
+ "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ=="
+ },
+ "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": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "requires": {
+ "color-convert": "^2.0.1"
+ },
+ "dependencies": {
+ "color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "requires": {
+ "color-name": "~1.1.4"
+ }
+ },
+ "color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ }
+ }
+ },
+ "any-promise": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz",
+ "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=",
+ "dev": true
+ },
+ "anymatch": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz",
+ "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ }
+ },
+ "archiver": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/archiver/-/archiver-5.0.2.tgz",
+ "integrity": "sha512-Tq3yV/T4wxBsD2Wign8W9VQKhaUxzzRmjEiSoOK0SLqPgDP/N1TKdYyBeIEu56T4I9iO4fKTTR0mN9NWkBA0sg==",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "^2.1.0",
+ "async": "^3.2.0",
+ "buffer-crc32": "^0.2.1",
+ "readable-stream": "^3.6.0",
+ "readdir-glob": "^1.0.0",
+ "tar-stream": "^2.1.4",
+ "zip-stream": "^4.0.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
+ "dev": true
+ }
+ }
+ },
+ "archiver-utils": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/archiver-utils/-/archiver-utils-2.1.0.tgz",
+ "integrity": "sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.4",
+ "graceful-fs": "^4.2.0",
+ "lazystream": "^1.0.0",
+ "lodash.defaults": "^4.2.0",
+ "lodash.difference": "^4.5.0",
+ "lodash.flatten": "^4.4.0",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.union": "^4.6.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^2.0.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "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"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "argparse": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz",
+ "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=",
+ "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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true
+ },
+ "array-differ": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-3.0.0.tgz",
+ "integrity": "sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==",
+ "dev": true
+ },
+ "array-filter": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
+ "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=",
+ "dev": true
+ },
+ "array-map": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
+ "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=",
+ "dev": true
+ },
+ "array-reduce": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
+ "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=",
+ "dev": true
+ },
+ "array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=",
+ "requires": {
+ "array-uniq": "^1.0.1"
+ }
+ },
+ "array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY="
+ },
+ "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,
+ "optional": true
+ },
+ "arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0="
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "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,
+ "optional": true
+ },
+ "astral-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg=="
+ },
+ "async": {
+ "version": "0.2.10",
+ "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
+ "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
+ "dev": true
+ },
+ "async-each": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
+ "dev": true,
+ "optional": true
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "at-least-node": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz",
+ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==",
+ "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,
+ "optional": true
+ },
+ "atomic-sleep": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz",
+ "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==",
+ "dev": true
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.10.1",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.10.1.tgz",
+ "integrity": "sha512-zg7Hz2k5lI8kb7U32998pRRFin7zJlkfezGJjUc2heaD4Pw2wObakCDVzkKztTm/Ln7eiVvYsjqak0Ed4LkMDA==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
+ },
+ "base": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
+ "dev": true,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "base64-js": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "binary-extensions": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz",
+ "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==",
+ "dev": true,
+ "optional": true
+ },
+ "bl": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.0.3.tgz",
+ "integrity": "sha512-fs4G6/Hu4/EE+F75J8DuN/0IpQqNjAdC7aEQv7Qt8MHGUH7Ckv2MwTEEeN9QehD0pfIDkMI1bkHYkKy7xHyKIg==",
+ "dev": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ },
+ "dependencies": {
+ "inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ }
+ }
+ },
+ "bluebird": {
+ "version": "2.9.34",
+ "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.9.34.tgz",
+ "integrity": "sha1-L3tOyAIWMoqf3evfacjUlC/v99g=",
+ "dev": true
+ },
+ "boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
+ "dev": true
+ },
+ "boxen": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/boxen/-/boxen-4.2.0.tgz",
+ "integrity": "sha512-eB4uT9RGzg2odpER62bBwSLvUeGC+WbRjjyyFhGsKnc8wp/m0+hQsMUvUe3H2V0D5vw0nBdO1hCJoZo5mKeuIQ==",
+ "dev": true,
+ "requires": {
+ "ansi-align": "^3.0.0",
+ "camelcase": "^5.3.1",
+ "chalk": "^3.0.0",
+ "cli-boxes": "^2.2.0",
+ "string-width": "^4.1.0",
+ "term-size": "^2.1.0",
+ "type-fest": "^0.8.1",
+ "widest-line": "^3.1.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "brace-expansion": {
+ "version": "1.1.8",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz",
+ "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=",
+ "requires": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+ "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "fill-range": "^7.0.1"
+ }
+ },
+ "buffer": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.6.0.tgz",
+ "integrity": "sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.0.2",
+ "ieee754": "^1.1.4"
+ }
+ },
+ "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-equal-constant-time": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz",
+ "integrity": "sha1-+OcRMvf/5uAaXJaXpMbz5I1cyBk=",
+ "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
+ },
+ "bunyan": {
+ "version": "1.8.14",
+ "resolved": "https://registry.npmjs.org/bunyan/-/bunyan-1.8.14.tgz",
+ "integrity": "sha512-LlahJUxXzZLuw/hetUQJmRgZ1LF6+cr5TPpRj6jf327AsiIq2jhYEH4oqUUkVKTor+9w2BT3oxVwhzE5lw9tcg==",
+ "dev": true,
+ "requires": {
+ "dtrace-provider": "~0.8",
+ "moment": "^2.19.3",
+ "mv": "~2",
+ "safe-json-stringify": "~1"
+ }
+ },
+ "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,
+ "optional": 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"
+ }
+ },
+ "cacheable-request": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz",
+ "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==",
+ "dev": true,
+ "requires": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^3.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^4.1.0",
+ "responselike": "^1.0.2"
+ },
+ "dependencies": {
+ "lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true
+ }
+ }
+ },
+ "caller-path": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz",
+ "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=",
+ "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="
+ },
+ "camelcase": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.0.0.tgz",
+ "integrity": "sha512-8KMDF1Vz2gzOq54ONPJS65IvTUaB1cHJ2DMM7MbPmLZljDH1qpzzLsWdiN9pHh6qvkRVDTi/07+eNGch/oLU4w==",
+ "dev": true
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz",
+ "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==",
+ "requires": {
+ "ansi-styles": "^3.1.0",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-styles": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz",
+ "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "supports-color": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz",
+ "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=",
+ "requires": {
+ "has-flag": "^2.0.0"
+ }
+ }
+ }
+ },
+ "cheerio": {
+ "version": "1.0.0-rc.3",
+ "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.3.tgz",
+ "integrity": "sha512-0td5ijfUPuubwLUu0OBoe98gZj8C/AA+RW3v67GPlGOrvxWjZmBXiBCRU+I8VEiNyJzjth40POfHiz2RB3gImA==",
+ "dev": true,
+ "requires": {
+ "css-select": "~1.2.0",
+ "dom-serializer": "~0.1.1",
+ "entities": "~1.1.1",
+ "htmlparser2": "^3.9.1",
+ "lodash": "^4.15.0",
+ "parse5": "^3.0.1"
+ }
+ },
+ "chokidar": {
+ "version": "3.4.2",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.2.tgz",
+ "integrity": "sha512-IZHaDeBeI+sZJRX7lGcXsdzgvZqKv6sECqsbErJA4mHWfpRrD8B97kSFN4cQz6nGBGiuFia1MKR4d6c1o8Cv7A==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "anymatch": "~3.1.1",
+ "braces": "~3.0.2",
+ "fsevents": "~2.1.2",
+ "glob-parent": "~5.1.0",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.4.0"
+ }
+ },
+ "chrome-launcher": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.13.4.tgz",
+ "integrity": "sha512-nnzXiDbGKjDSK6t2I+35OAPBy5Pw/39bgkb/ZAFwMhwJbdYBp6aH+vW28ZgtjdU890Q7D+3wN/tB8N66q5Gi2A==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*",
+ "escape-string-regexp": "^1.0.5",
+ "is-wsl": "^2.2.0",
+ "lighthouse-logger": "^1.0.0",
+ "mkdirp": "^0.5.3",
+ "rimraf": "^3.0.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "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"
+ }
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ }
+ }
+ },
+ "ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "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=="
+ },
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "cli-boxes": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz",
+ "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==",
+ "dev": true
+ },
+ "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=",
+ "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="
+ },
+ "cliui": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.0",
+ "wrap-ansi": "^6.2.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "clone-response": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz",
+ "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "collection-visit": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "map-visit": "^1.0.0",
+ "object-visit": "^1.0.0"
+ }
+ },
+ "color-convert": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz",
+ "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==",
+ "requires": {
+ "color-name": "^1.1.1"
+ }
+ },
+ "color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
+ },
+ "colors": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz",
+ "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=",
+ "dev": true
+ },
+ "columnify": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.5.4.tgz",
+ "integrity": "sha1-Rzfd8ce2mop8NAVweC6UfuyOeLs=",
+ "dev": true,
+ "requires": {
+ "strip-ansi": "^3.0.0",
+ "wcwidth": "^1.0.0"
+ },
+ "dependencies": {
+ "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"
+ }
+ }
+ }
+ },
+ "combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "common-tags": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.0.tgz",
+ "integrity": "sha512-6P6g0uetGpW/sdyUy/iQQCbFF0kWVMSIVSyYz7Zgjcgh8mgw8PQzDNZeyZ5DQ2gM7LBoZPHmnjz8rUthkBG5tw==",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
+ "dev": true,
+ "optional": true
+ },
+ "compress-commons": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/compress-commons/-/compress-commons-4.0.1.tgz",
+ "integrity": "sha512-xZm9o6iikekkI0GnXCmAl3LQGZj5TBDj0zLowsqi7tJtEa3FMGSEcHcqrSJIrOAk1UG/NBbDn/F1q+MG/p/EsA==",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "^0.2.13",
+ "crc32-stream": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ },
+ "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"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "configstore": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+ "dev": true,
+ "requires": {
+ "dot-prop": "^5.2.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^3.0.0",
+ "unique-string": "^2.0.0",
+ "write-file-atomic": "^3.0.0",
+ "xdg-basedir": "^4.0.0"
+ }
+ },
+ "copy-descriptor": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
+ "dev": true,
+ "optional": true
+ },
+ "core-js": {
+ "version": "2.6.11",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
+ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
+ "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": "4.0.0",
+ "resolved": "https://registry.npmjs.org/crc32-stream/-/crc32-stream-4.0.0.tgz",
+ "integrity": "sha512-tyMw2IeUX6t9jhgXI6um0eKfWq4EIDpfv5m7GX4Jzp7eVelQ360xd8EPXJhp2mHwLQIkqlnMLjzqSZI3a+0wRw==",
+ "dev": true,
+ "requires": {
+ "crc": "^3.4.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ },
+ "shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "requires": {
+ "shebang-regex": "^3.0.0"
+ }
+ },
+ "shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "dev": true
+ },
+ "css-select": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz",
+ "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0",
+ "css-what": "2.1",
+ "domutils": "1.5.1",
+ "nth-check": "~1.0.1"
+ }
+ },
+ "css-what": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.3.tgz",
+ "integrity": "sha512-a+EPoD+uZiNfh+5fxw2nO9QwFa6nJe2Or35fGY6Ipw1R3R4AGz1d1TEZrCegvw2YTmZ0jXirGYlzxxpYSHwpEg==",
+ "dev": true
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "debounce": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.0.tgz",
+ "integrity": "sha512-mYtLl1xfZLi1m4RtQYlZgJUNQjl4ZxVnHzIR8nLLgi4q1YT8o/WM+MK/f8yfcc9s5Ir5zRaPZyZU6xs1Syoocg==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "decamelize": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz",
+ "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==",
+ "dev": true
+ },
+ "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,
+ "optional": true
+ },
+ "decompress-response": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz",
+ "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=",
+ "dev": true,
+ "requires": {
+ "mimic-response": "^1.0.0"
+ }
+ },
+ "deep-equal": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz",
+ "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==",
+ "dev": true,
+ "requires": {
+ "is-arguments": "^1.0.4",
+ "is-date-object": "^1.0.1",
+ "is-regex": "^1.0.4",
+ "object-is": "^1.0.1",
+ "object-keys": "^1.1.1",
+ "regexp.prototype.flags": "^1.2.0"
+ }
+ },
+ "deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "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="
+ },
+ "deepcopy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/deepcopy/-/deepcopy-2.1.0.tgz",
+ "integrity": "sha512-8cZeTb1ZKC3bdSCP6XOM1IsTczIO73fdqtwa2B0N15eAz7gmyhQo+mc5gnFuulsgN3vIQYmTgbmQVKalH1dKvQ==",
+ "dev": true,
+ "requires": {
+ "type-detect": "^4.0.8"
+ }
+ },
+ "deepmerge": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz",
+ "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==",
+ "dev": true
+ },
+ "defaults": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
+ "dev": true,
+ "requires": {
+ "clone": "^1.0.2"
+ }
+ },
+ "defer-to-connect": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz",
+ "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==",
+ "dev": true
+ },
+ "define-properties": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
+ "dev": true,
+ "requires": {
+ "object-keys": "^1.0.12"
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "del": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz",
+ "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=",
+ "requires": {
+ "globby": "^5.0.0",
+ "is-path-cwd": "^1.0.0",
+ "is-path-in-cwd": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0",
+ "rimraf": "^2.2.8"
+ }
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "diff": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
+ "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
+ "dev": true
+ },
+ "dispensary": {
+ "version": "0.57.0",
+ "resolved": "https://registry.npmjs.org/dispensary/-/dispensary-0.57.0.tgz",
+ "integrity": "sha512-vgRaZa9Ok8QdrAVtx+s6heBgI1RGT+Y6VA336oPWYADZZz83K+5NOTpLamEKRyJdRY5pYLaWhV2Js7bau1JyKg==",
+ "dev": true,
+ "requires": {
+ "async": "~3.2.0",
+ "natural-compare-lite": "~1.4.0",
+ "pino": "~6.6.0",
+ "request": "~2.88.0",
+ "sha.js": "~2.4.4",
+ "source-map-support": "~0.5.4",
+ "yargs": "~15.4.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz",
+ "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==",
+ "dev": true
+ }
+ }
+ },
+ "doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "dom-serializer": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.1.tgz",
+ "integrity": "sha512-l0IU0pPzLWSHBcieZbpOKgkIn3ts3vAh7ZuFyXNwJxJXk/c4Gwj9xaTJwIDVQCXawWD0qb3IzMGH5rglQaO0XA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^1.3.0",
+ "entities": "^1.1.1"
+ }
+ },
+ "domelementtype": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
+ },
+ "domhandler": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "1"
+ }
+ },
+ "domutils": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
+ "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
+ "dev": true,
+ "requires": {
+ "dom-serializer": "0",
+ "domelementtype": "1"
+ }
+ },
+ "dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "requires": {
+ "is-obj": "^2.0.0"
+ }
+ },
+ "dtrace-provider": {
+ "version": "0.8.8",
+ "resolved": "https://registry.npmjs.org/dtrace-provider/-/dtrace-provider-0.8.8.tgz",
+ "integrity": "sha512-b7Z7cNtHPhH9EJhNNbbeqTcXB8LGFFZhq1PGgEvpeHlzd36bhbdTWoE/Ba/YguqpBSlAPKnARWhVlhunCMwfxg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "^2.14.0"
+ }
+ },
+ "duplexer3": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz",
+ "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "ecdsa-sig-formatter": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz",
+ "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
+ "enquirer": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
+ "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
+ "dev": true,
+ "requires": {
+ "ansi-colors": "^4.1.1"
+ }
+ },
+ "entities": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "es-abstract": {
+ "version": "1.18.0-next.1",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.1.tgz",
+ "integrity": "sha512-I4UGspA0wpZXWENrdA0uHbnhte683t3qT/1VFH9aX2dA5PPSf6QW5HHXf5HImaqPmjXaVeVk4RGWnaylmV7uAA==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-negative-zero": "^2.0.0",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ },
+ "es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "requires": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ }
+ },
+ "es6-error": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
+ "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
+ "dev": true
+ },
+ "es6-promise": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz",
+ "integrity": "sha1-lu258v2wGZWCKyY92KratnSBgbw=",
+ "dev": true
+ },
+ "es6-promisify": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-6.1.1.tgz",
+ "integrity": "sha512-HBL8I3mIki5C1Cc9QjKUenHtnG0A5/xA8Q/AllRcfiwl2CZFXGK7ddBiCoRwAix4i2KxcQfjtIVcrVbB3vbmwg==",
+ "dev": true
+ },
+ "escape-goat": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz",
+ "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==",
+ "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="
+ },
+ "eslint": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-5.10.0.tgz",
+ "integrity": "sha512-HpqzC+BHULKlnPwWae9MaVZ5AXJKpkxCVXQHrFaRw3hbDj26V/9ArYM4Rr/SQ8pi6qUPLXSSXC4RBJlyq2Z2OQ==",
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "ajv": "^6.5.3",
+ "chalk": "^2.1.0",
+ "cross-spawn": "^6.0.5",
+ "debug": "^4.0.1",
+ "doctrine": "^2.1.0",
+ "eslint-scope": "^4.0.0",
+ "eslint-utils": "^1.3.1",
+ "eslint-visitor-keys": "^1.0.0",
+ "espree": "^5.0.0",
+ "esquery": "^1.0.1",
+ "esutils": "^2.0.2",
+ "file-entry-cache": "^2.0.0",
+ "functional-red-black-tree": "^1.0.1",
+ "glob": "^7.1.2",
+ "globals": "^11.7.0",
+ "ignore": "^4.0.6",
+ "imurmurhash": "^0.1.4",
+ "inquirer": "^6.1.0",
+ "js-yaml": "^3.12.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.3.0",
+ "lodash": "^4.17.5",
+ "minimatch": "^3.0.4",
+ "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": "^2.0.1",
+ "require-uncached": "^1.0.3",
+ "semver": "^5.5.1",
+ "strip-ansi": "^4.0.0",
+ "strip-json-comments": "^2.0.1",
+ "table": "^5.0.2",
+ "text-table": "^0.2.0"
+ },
+ "dependencies": {
+ "acorn": {
+ "version": "6.4.1",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA=="
+ },
+ "acorn-jsx": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.1.tgz",
+ "integrity": "sha512-HJ7CfNHrfJLlNTzIEUTj43LNWGkqpRLxm3YjAlcD0ACydk9XynzYsCBHxut+iqt+1aBXkx9UP/w/ZqMr13XIzg=="
+ },
+ "ajv": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "ansi-regex": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.0.0.tgz",
+ "integrity": "sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w=="
+ },
+ "chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA=="
+ },
+ "cross-spawn": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
+ "requires": {
+ "nice-try": "^1.0.4",
+ "path-key": "^2.0.1",
+ "semver": "^5.5.0",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "debug": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.0.tgz",
+ "integrity": "sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg==",
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "requires": {
+ "esutils": "^2.0.2"
+ }
+ },
+ "espree": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-5.0.0.tgz",
+ "integrity": "sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA==",
+ "requires": {
+ "acorn": "^6.0.2",
+ "acorn-jsx": "^5.0.0",
+ "eslint-visitor-keys": "^1.0.0"
+ }
+ },
+ "esquery": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz",
+ "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==",
+ "requires": {
+ "estraverse": "^4.0.0"
+ }
+ },
+ "external-editor": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.0.3.tgz",
+ "integrity": "sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA==",
+ "requires": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ },
+ "globals": {
+ "version": "11.9.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.9.0.tgz",
+ "integrity": "sha512-5cJVtyXWH8PiJPVLZzzoIizXx944O4OmRro5MWKx5fT4MgcN7OfaMutPeaTdJCCURwbWdhhcCWcKIffPnmTzBg=="
+ },
+ "iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg=="
+ },
+ "inquirer": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.2.1.tgz",
+ "integrity": "sha512-088kl3DRT2dLU5riVMKKr1DlImd6X7smDhpXUCkJDCKvTEJeRiXh0G132HG9u5a+6Ylw9plFRY7RuTnwohYSpg==",
+ "requires": {
+ "ansi-escapes": "^3.0.0",
+ "chalk": "^2.0.0",
+ "cli-cursor": "^2.1.0",
+ "cli-width": "^2.0.0",
+ "external-editor": "^3.0.0",
+ "figures": "^2.0.0",
+ "lodash": "^4.17.10",
+ "mute-stream": "0.0.7",
+ "run-async": "^2.2.0",
+ "rxjs": "^6.1.0",
+ "string-width": "^2.1.0",
+ "strip-ansi": "^5.0.0",
+ "through": "^2.3.6"
+ },
+ "dependencies": {
+ "strip-ansi": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.0.0.tgz",
+ "integrity": "sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow==",
+ "requires": {
+ "ansi-regex": "^4.0.0"
+ }
+ }
+ }
+ },
+ "js-yaml": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "lodash": {
+ "version": "4.17.19",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
+ },
+ "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=="
+ },
+ "regexpp": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz",
+ "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw=="
+ },
+ "rxjs": {
+ "version": "6.3.3",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.3.3.tgz",
+ "integrity": "sha512-JTWmoY9tWCs7zvIk/CvRjhjGaOd+OVBM987mxFo+OW66cGpdKjZcpmc74ES1sB//7Kl/PAe8+wEakuhG4pcgOw==",
+ "requires": {
+ "tslib": "^1.9.0"
+ }
+ },
+ "semver": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz",
+ "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg=="
+ }
+ }
+ },
+ "eslint-plugin-no-unsanitized": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-no-unsanitized/-/eslint-plugin-no-unsanitized-3.1.2.tgz",
+ "integrity": "sha512-KPShfliA3Uy9qqwQx35P1fwIOeJjZkb0FbMMUFztRYRposzaynsM8JCEb952fqkidROl1kpqY80uSvn+TcWkQQ==",
+ "dev": true
+ },
+ "eslint-scope": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz",
+ "integrity": "sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==",
+ "requires": {
+ "esrecurse": "^4.1.0",
+ "estraverse": "^4.1.1"
+ }
+ },
+ "eslint-utils": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz",
+ "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==",
+ "requires": {
+ "eslint-visitor-keys": "^1.0.0"
+ }
+ },
+ "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=="
+ },
+ "espree": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.0.tgz",
+ "integrity": "sha512-dksIWsvKCixn1yrEXO8UosNSxaDoSYpq9reEjZSbHLpT5hpaCAKTLBwq0RHtLrIr+c0ByiYzWT8KTMRzoRCNlw==",
+ "dev": true,
+ "requires": {
+ "acorn": "^7.4.0",
+ "acorn-jsx": "^5.2.0",
+ "eslint-visitor-keys": "^1.3.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
+ "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
+ "dev": true
+ }
+ }
+ },
+ "esprima": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz",
+ "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw=="
+ },
+ "esquery": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.3.1.tgz",
+ "integrity": "sha512-olpvt9QG0vniUBZspVRN6lwB7hOZoTRtT+jzR+tS4ffYx2mzbw+z0XCOk44aaLYKApNX5nMm+E+P6o25ip/DHQ==",
+ "dev": true,
+ "requires": {
+ "estraverse": "^5.1.0"
+ },
+ "dependencies": {
+ "estraverse": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
+ "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
+ "dev": true
+ }
+ }
+ },
+ "esrecurse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz",
+ "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=",
+ "requires": {
+ "estraverse": "^4.1.0",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM="
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
+ },
+ "event-to-promise": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/event-to-promise/-/event-to-promise-0.8.0.tgz",
+ "integrity": "sha1-S4TxF3K28l93Uvx02XFTGsb1tiY=",
+ "dev": true
+ },
+ "execa": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-4.0.3.tgz",
+ "integrity": "sha512-WFDXGHckXPWZX19t1kCsXzOpqX9LWYNqn4C+HqZlk/V0imTkzJZqf87ZBhvpHaftERYknpk0fjSylnXVlVgI0A==",
+ "dev": true,
+ "requires": {
+ "cross-spawn": "^7.0.0",
+ "get-stream": "^5.0.0",
+ "human-signals": "^1.1.1",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.0",
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2",
+ "strip-final-newline": "^2.0.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ },
+ "onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "requires": {
+ "mimic-fn": "^2.1.0"
+ }
+ }
+ }
+ },
+ "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,
+ "optional": 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": {
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "extglob": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
+ "dev": true,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-accessor-descriptor": "^1.0.0",
+ "is-data-descriptor": "^1.0.0",
+ "kind-of": "^6.0.2"
+ }
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "fast-json-patch": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/fast-json-patch/-/fast-json-patch-2.2.1.tgz",
+ "integrity": "sha512-4j5uBaTnsYAV5ebkidvxiLUYOwjQ+JSFljeqfTxCrH9bDmlCQaOJFS84oDJ2rAXZq2yskmk3ORfoP9DCwqFNig==",
+ "dev": true,
+ "requires": {
+ "fast-deep-equal": "^2.0.1"
+ },
+ "dependencies": {
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=",
+ "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="
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc="
+ },
+ "fast-redact": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-2.1.0.tgz",
+ "integrity": "sha512-0LkHpTLyadJavq9sRzzyqIoMZemWli77K2/MGOkafrR64B9ItrvZ9aT+jluvNDsv0YEHjSNhlMBtbokuoqii4A==",
+ "dev": true
+ },
+ "fast-safe-stringify": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz",
+ "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==",
+ "dev": true
+ },
+ "fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=",
+ "dev": true,
+ "requires": {
+ "pend": "~1.2.0"
+ }
+ },
+ "figures": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz",
+ "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=",
+ "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=",
+ "requires": {
+ "flat-cache": "^1.2.1",
+ "object-assign": "^4.0.1"
+ }
+ },
+ "fill-range": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+ "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "to-regex-range": "^5.0.1"
+ }
+ },
+ "find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "requires": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ }
+ },
+ "firefox-profile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/firefox-profile/-/firefox-profile-4.0.0.tgz",
+ "integrity": "sha512-Vw31AsjfLDbcApMDwwnhZcz3tWjV6lxB9BNf84FaV44rZXtU87cVbFMBzPEtrJdUDbwPYiuYzprp6yksYGwjSw==",
+ "dev": true,
+ "requires": {
+ "adm-zip": "~0.4.x",
+ "archiver": "~5.0.2",
+ "async": "~2.5.0",
+ "fs-extra": "~4.0.2",
+ "ini": "~1.3.3",
+ "jetpack-id": "1.0.0",
+ "lazystream": "~1.0.0",
+ "lodash": "~4.17.2",
+ "minimist": "^1.1.1",
+ "uuid": "^3.0.0",
+ "xml2js": "~0.4.4"
+ },
+ "dependencies": {
+ "async": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz",
+ "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==",
+ "dev": true,
+ "requires": {
+ "lodash": "^4.14.0"
+ }
+ },
+ "fs-extra": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-4.0.3.tgz",
+ "integrity": "sha512-q6rbdDd1o2mAnQreO7YADIxf/Whx4AHBiRf6d+/cVT8h44ss+lHgxf1FemcqDnQt9X3ct4McHr+JMGlYSsK7Cg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.2",
+ "jsonfile": "^4.0.0",
+ "universalify": "^0.1.0"
+ }
+ }
+ }
+ },
+ "first-chunk-stream": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-4.0.0.tgz",
+ "integrity": "sha512-8TOz/mJp7+zc2HN63vnJHotwceq4gQI1+/gdJVnJcG4dEB96oUxw7wV9We4QKjSFWUc/V0ADDfaGba5cDoG6EA==",
+ "dev": true
+ },
+ "flat-cache": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz",
+ "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=",
+ "requires": {
+ "circular-json": "^0.3.1",
+ "del": "^2.0.2",
+ "graceful-fs": "^4.1.2",
+ "write": "^0.2.1"
+ }
+ },
+ "flatstr": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
+ "integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==",
+ "dev": true
+ },
+ "flatted": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz",
+ "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==",
+ "dev": true
+ },
+ "fluent-syntax": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/fluent-syntax/-/fluent-syntax-0.13.0.tgz",
+ "integrity": "sha512-0Bk1AsliuYB550zr4JV9AYhsETsD3ELXUQzdXGJfIc1Ni/ukAfBdQInDhVMYJUaT2QxoamNslwkYF7MlOrPUwg==",
+ "dev": true
+ },
+ "for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
+ "dev": true,
+ "optional": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "form-data": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
+ "dev": true,
+ "requires": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.6",
+ "mime-types": "^2.1.12"
+ }
+ },
+ "formatio": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz",
+ "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=",
+ "dev": true,
+ "requires": {
+ "samsam": "1.x"
+ }
+ },
+ "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,
+ "optional": 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-extra": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.0.1.tgz",
+ "integrity": "sha512-h2iAoN838FqAFJY2/qVpzFXy+EBxfVE220PalAqQLDVsFOHLJrZvut5puAbCdNv6WJk+B8ihI+k0c7JK5erwqQ==",
+ "dev": true,
+ "requires": {
+ "at-least-node": "^1.0.0",
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^1.0.0"
+ },
+ "dependencies": {
+ "graceful-fs": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz",
+ "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.0.1.tgz",
+ "integrity": "sha512-jR2b5v7d2vIOust+w3wtFKZIfpC2pnRmFAhAC/BuweZFQR8qZzxH1OyrQ10HmdVYiXWkYUqPVsz91cG7EL2FBg==",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6",
+ "universalify": "^1.0.0"
+ }
+ },
+ "universalify": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-1.0.0.tgz",
+ "integrity": "sha512-rb6X1W158d7pRQBg5gkR8uPaSfiids68LTJQYOtEUhoJUWBdaQHsuT/EUduxXYxcrt4r5PJ4fuHW1MHT6p0qug==",
+ "dev": true
+ }
+ }
+ },
+ "fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ },
+ "fsevents": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz",
+ "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==",
+ "dev": true,
+ "optional": 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="
+ },
+ "fx-runner": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmjs.org/fx-runner/-/fx-runner-1.0.13.tgz",
+ "integrity": "sha512-Ces2bm+LNuXehkvmN1/Z+oEDkI/jHBp9xdyBtBy7hcgvF18/pv/D8F6A6kQgNkMZsnBgLEv+VvdDxyqkfkYycw==",
+ "dev": true,
+ "requires": {
+ "commander": "2.9.0",
+ "shell-quote": "1.6.1",
+ "spawn-sync": "1.0.15",
+ "when": "3.7.7",
+ "which": "1.2.4",
+ "winreg": "0.0.12"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz",
+ "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=",
+ "dev": true,
+ "requires": {
+ "graceful-readlink": ">= 1.0.0"
+ }
+ },
+ "isexe": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz",
+ "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz",
+ "integrity": "sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=",
+ "dev": true,
+ "requires": {
+ "is-absolute": "^0.1.7",
+ "isexe": "^1.1.1"
+ }
+ }
+ }
+ },
+ "get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "dev": true
+ },
+ "get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ },
+ "get-value": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
+ "dev": true,
+ "optional": true
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0"
+ }
+ },
+ "glob": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
+ "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
+ "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"
+ }
+ },
+ "glob-parent": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz",
+ "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==",
+ "dev": true,
+ "requires": {
+ "is-glob": "^4.0.1"
+ }
+ },
+ "global-dirs": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-2.0.1.tgz",
+ "integrity": "sha512-5HqUqdhkEovj2Of/ms3IeS/EekcO54ytHRLV4PEY2rhRwrHXLQjeVEES0Lhka0xwNDtGYn58wyC4s5+MHsOO6A==",
+ "dev": true,
+ "requires": {
+ "ini": "^1.3.5"
+ }
+ },
+ "globals": {
+ "version": "12.4.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
+ "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
+ "dev": true,
+ "requires": {
+ "type-fest": "^0.8.1"
+ }
+ },
+ "globby": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz",
+ "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=",
+ "requires": {
+ "array-union": "^1.0.1",
+ "arrify": "^1.0.0",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ }
+ },
+ "got": {
+ "version": "9.6.0",
+ "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz",
+ "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==",
+ "dev": true,
+ "requires": {
+ "@sindresorhus/is": "^0.14.0",
+ "@szmarczak/http-timer": "^1.1.2",
+ "cacheable-request": "^6.0.0",
+ "decompress-response": "^3.3.0",
+ "duplexer3": "^0.1.4",
+ "get-stream": "^4.1.0",
+ "lowercase-keys": "^1.0.1",
+ "mimic-response": "^1.0.1",
+ "p-cancelable": "^1.0.0",
+ "to-readable-stream": "^1.0.0",
+ "url-parse-lax": "^3.0.0"
+ },
+ "dependencies": {
+ "get-stream": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
+ "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
+ "dev": true,
+ "requires": {
+ "pump": "^3.0.0"
+ }
+ }
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg="
+ },
+ "graceful-readlink": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz",
+ "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=",
+ "dev": true
+ },
+ "growly": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/growly/-/growly-1.3.0.tgz",
+ "integrity": "sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=",
+ "dev": true
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "dev": true
+ },
+ "har-validator": {
+ "version": "5.1.5",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz",
+ "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==",
+ "dev": true,
+ "requires": {
+ "ajv": "^6.12.3",
+ "har-schema": "^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-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE="
+ },
+ "has-symbols": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "kind-of": "^4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "has-yarn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz",
+ "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==",
+ "dev": true
+ },
+ "htmlparser2": {
+ "version": "3.10.1",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
+ "dev": true,
+ "requires": {
+ "domelementtype": "^1.3.1",
+ "domhandler": "^2.3.0",
+ "domutils": "^1.5.1",
+ "entities": "^1.1.1",
+ "inherits": "^2.0.1",
+ "readable-stream": "^3.1.1"
+ }
+ },
+ "http-cache-semantics": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz",
+ "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "jsprim": "^1.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "human-signals": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
+ "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==",
+ "dev": true
+ },
+ "ieee754": {
+ "version": "1.1.13",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
+ "dev": true
+ },
+ "ignore": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
+ "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
+ "dev": true
+ },
+ "import-fresh": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.2.1.tgz",
+ "integrity": "sha512-6e1q1cnWP2RXD9/keSkxHScg508CdXqXWgWBaETNhyuBFz+kUZlKboh+ISK+bU++DmbHimVBrOz/zzPe0sZ3sQ==",
+ "dev": true,
+ "requires": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "dependencies": {
+ "resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true
+ }
+ }
+ },
+ "import-lazy": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz",
+ "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=",
+ "dev": true
+ },
+ "imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o="
+ },
+ "inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "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="
+ },
+ "ini": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
+ "dev": true
+ },
+ "invert-kv": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-3.0.1.tgz",
+ "integrity": "sha512-CYdFeFexxhv/Bcny+Q0BfOV+ltRlJcd4BBZBYFX/O0u4npJrgZtIcjokegtiSMAvlMTJ+Koq0GBCc//3bueQxw==",
+ "dev": true
+ },
+ "is-absolute": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz",
+ "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=",
+ "dev": true,
+ "requires": {
+ "is-relative": "^0.1.0"
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-arguments": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.0.4.tgz",
+ "integrity": "sha512-xPh0Rmt8NE65sNzvyUmWgI1tz3mKq74lGA0mL8LYZcoIzKOzDh6HmrYm3d18k60nHerC8A9Km8kYu87zfSFnLA==",
+ "dev": true
+ },
+ "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-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "binary-extensions": "^2.0.0"
+ }
+ },
+ "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,
+ "optional": true
+ },
+ "is-callable": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz",
+ "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==",
+ "dev": true
+ },
+ "is-ci": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz",
+ "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==",
+ "dev": true,
+ "requires": {
+ "ci-info": "^2.0.0"
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "is-date-object": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
+ "dev": true
+ },
+ "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,
+ "optional": 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,
+ "optional": true
+ }
+ }
+ },
+ "is-docker": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.1.1.tgz",
+ "integrity": "sha512-ZOoqiXfEwtGknTiuDEy8pN2CfE3TxMHprvNer1mXiqwkOT77Rw3YVrUQ52EqAOU3QAWDQ+bQdx7HJzrv7LS2Hw==",
+ "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,
+ "optional": 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-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="
+ },
+ "is-glob": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
+ "dev": true,
+ "requires": {
+ "is-extglob": "^2.1.1"
+ }
+ },
+ "is-installed-globally": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.3.2.tgz",
+ "integrity": "sha512-wZ8x1js7Ia0kecP/CHM/3ABkAmujX7WPvQk6uu3Fly/Mk44pySulQpnHG46OMjHGXApINnV4QhY3SWnECO2z5g==",
+ "dev": true,
+ "requires": {
+ "global-dirs": "^2.0.1",
+ "is-path-inside": "^3.0.1"
+ },
+ "dependencies": {
+ "is-path-inside": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz",
+ "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==",
+ "dev": true
+ }
+ }
+ },
+ "is-mergeable-object": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-mergeable-object/-/is-mergeable-object-1.1.1.tgz",
+ "integrity": "sha512-CPduJfuGg8h8vW74WOxHtHmtQutyQBzR+3MjQ6iDHIYdbOnm1YC7jv43SqCoU8OPGTJD4nibmiryA4kmogbGrA==",
+ "dev": true
+ },
+ "is-negative-zero": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.0.tgz",
+ "integrity": "sha1-lVOxIbD6wohp2p7UWeIMdUN4hGE=",
+ "dev": true
+ },
+ "is-npm": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz",
+ "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==",
+ "dev": true
+ },
+ "is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "optional": true
+ },
+ "is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true
+ },
+ "is-path-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz",
+ "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0="
+ },
+ "is-path-in-cwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz",
+ "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=",
+ "requires": {
+ "is-path-inside": "^1.0.0"
+ }
+ },
+ "is-path-inside": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz",
+ "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=",
+ "requires": {
+ "path-is-inside": "^1.0.1"
+ }
+ },
+ "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,
+ "optional": 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="
+ },
+ "is-regex": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz",
+ "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-relative": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz",
+ "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=",
+ "dev": true
+ },
+ "is-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz",
+ "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==",
+ "dev": true
+ },
+ "is-symbol": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
+ "dev": true,
+ "requires": {
+ "has-symbols": "^1.0.1"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "is-utf8": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz",
+ "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=",
+ "dev": true
+ },
+ "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,
+ "optional": true
+ },
+ "is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "requires": {
+ "is-docker": "^2.0.0"
+ }
+ },
+ "is-yarn-global": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz",
+ "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==",
+ "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="
+ },
+ "isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
+ "dev": true,
+ "optional": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "jed": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/jed/-/jed-1.1.1.tgz",
+ "integrity": "sha1-elSbvZ/+FYWwzQoZHiAwVb7ldLQ=",
+ "dev": true
+ },
+ "jetpack-id": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/jetpack-id/-/jetpack-id-1.0.0.tgz",
+ "integrity": "sha1-LPn7rkbYB0/Ba33gBxyO/rykc6Y=",
+ "dev": true
+ },
+ "jquery": {
+ "version": "3.5.1",
+ "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz",
+ "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==",
+ "dev": true
+ },
+ "jquery-smooth-scroll": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/jquery-smooth-scroll/-/jquery-smooth-scroll-2.2.0.tgz",
+ "integrity": "sha1-h9wa3YQWi39Gazza7rgcgD/SKio=",
+ "dev": true,
+ "requires": {
+ "jquery": ">=1.7.0"
+ }
+ },
+ "jquery-ui": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/jquery-ui/-/jquery-ui-1.12.1.tgz",
+ "integrity": "sha1-vLQEXI3QU5wTS8FIjN0+dop6nlE=",
+ "dev": true
+ },
+ "jquery-ui-iconfont": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/jquery-ui-iconfont/-/jquery-ui-iconfont-2.3.2.tgz",
+ "integrity": "sha1-WwhjzM6U281q3qJCdgWZjdaNNJY=",
+ "dev": true
+ },
+ "js-reporters": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/js-reporters/-/js-reporters-1.2.1.tgz",
+ "integrity": "sha1-+IxgjjJKM3OpW8xFrTBeXJecRZs=",
+ "dev": true
+ },
+ "js-select": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/js-select/-/js-select-0.6.0.tgz",
+ "integrity": "sha1-woTiKCTVknrsli3N8kcXSu+w0ZA=",
+ "dev": true,
+ "requires": {
+ "JSONSelect": "0.2.1",
+ "traverse": "0.4.x"
+ }
+ },
+ "js-yaml": {
+ "version": "3.14.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz",
+ "integrity": "sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==",
+ "dev": true,
+ "requires": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ }
+ },
+ "jsbn": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
+ "dev": true
+ },
+ "json-buffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz",
+ "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=",
+ "dev": true
+ },
+ "json-merge-patch": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-merge-patch/-/json-merge-patch-0.2.3.tgz",
+ "integrity": "sha1-+ixrWvh9p3uuKWalidUuI+2B/kA=",
+ "dev": true,
+ "requires": {
+ "deep-equal": "^1.0.0"
+ }
+ },
+ "json-parse-better-errors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
+ "dev": true
+ },
+ "json-schema": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
+ "dev": true
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "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="
+ },
+ "json-stringify-safe": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
+ "dev": true
+ },
+ "jsonfile": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
+ "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
+ "dev": true,
+ "requires": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "jsonify": {
+ "version": "0.0.0",
+ "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
+ "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=",
+ "dev": true
+ },
+ "jsonwebtoken": {
+ "version": "8.5.1",
+ "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-8.5.1.tgz",
+ "integrity": "sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==",
+ "dev": true,
+ "requires": {
+ "jws": "^3.2.2",
+ "lodash.includes": "^4.3.0",
+ "lodash.isboolean": "^3.0.3",
+ "lodash.isinteger": "^4.0.4",
+ "lodash.isnumber": "^3.0.3",
+ "lodash.isplainobject": "^4.0.6",
+ "lodash.isstring": "^4.0.1",
+ "lodash.once": "^4.0.0",
+ "ms": "^2.1.1",
+ "semver": "^5.6.0"
+ },
+ "dependencies": {
+ "ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "semver": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
+ "dev": true
+ }
+ }
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.0"
+ }
+ },
+ "jszip": {
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/jszip/-/jszip-2.6.1.tgz",
+ "integrity": "sha1-uI86ey5noqBIFSmCx6N1bZxIKPA=",
+ "dev": true,
+ "requires": {
+ "pako": "~1.0.2"
+ }
+ },
+ "jwa": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.1.tgz",
+ "integrity": "sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==",
+ "dev": true,
+ "requires": {
+ "buffer-equal-constant-time": "1.0.1",
+ "ecdsa-sig-formatter": "1.0.11",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "jws": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz",
+ "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==",
+ "dev": true,
+ "requires": {
+ "jwa": "^1.4.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "keyv": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz",
+ "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==",
+ "dev": true,
+ "requires": {
+ "json-buffer": "3.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "optional": true
+ },
+ "latest-version": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz",
+ "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==",
+ "dev": true,
+ "requires": {
+ "package-json": "^6.3.0"
+ }
+ },
+ "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"
+ },
+ "dependencies": {
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "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"
+ }
+ },
+ "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
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "lcid": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lcid/-/lcid-3.1.1.tgz",
+ "integrity": "sha512-M6T051+5QCGLBQb8id3hdvIW8+zeFV2FyBGFS9IEK5H9Wt4MueD4bW1eWikpHgZp+5xR3l5c8pZUkQsIA0BFZg==",
+ "dev": true,
+ "requires": {
+ "invert-kv": "^3.0.0"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "lighthouse-logger": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.2.0.tgz",
+ "integrity": "sha512-wzUvdIeJZhRsG6gpZfmSCfysaxNEr43i+QT+Hie94wvHDKFLi4n7C2GqZ4sTC+PH5b5iktmXJvU87rWvhP3lHw==",
+ "dev": true,
+ "requires": {
+ "debug": "^2.6.8",
+ "marky": "^1.2.0"
+ }
+ },
+ "lines-and-columns": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz",
+ "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=",
+ "dev": true
+ },
+ "locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "requires": {
+ "p-locate": "^4.1.0"
+ }
+ },
+ "lodash": {
+ "version": "4.17.19",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz",
+ "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ=="
+ },
+ "lodash.defaults": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
+ "integrity": "sha1-0JF4cW/+pN3p5ft7N/bwgCJ0WAw=",
+ "dev": true
+ },
+ "lodash.difference": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.difference/-/lodash.difference-4.5.0.tgz",
+ "integrity": "sha1-nMtOUF1Ia5FlE0V3KIWi3yf9AXw=",
+ "dev": true
+ },
+ "lodash.flatten": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz",
+ "integrity": "sha1-8xwiIlqWMtK7+OSt2+8kCqdlph8=",
+ "dev": true
+ },
+ "lodash.includes": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz",
+ "integrity": "sha1-YLuYqHy5I8aMoeUTJUgzFISfVT8=",
+ "dev": true
+ },
+ "lodash.isboolean": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz",
+ "integrity": "sha1-bC4XHbKiV82WgC/UOwGyDV9YcPY=",
+ "dev": true
+ },
+ "lodash.isinteger": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz",
+ "integrity": "sha1-YZwK89A/iwTDH1iChAt3sRzWg0M=",
+ "dev": true
+ },
+ "lodash.isnumber": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz",
+ "integrity": "sha1-POdoEMWSjQM1IwGsKHMX8RwLH/w=",
+ "dev": true
+ },
+ "lodash.isplainobject": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz",
+ "integrity": "sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs=",
+ "dev": true
+ },
+ "lodash.isstring": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz",
+ "integrity": "sha1-1SfftUVuynzJu5XV2ur4i6VKVFE=",
+ "dev": true
+ },
+ "lodash.once": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz",
+ "integrity": "sha1-DdOXEhPHxW34gJd9UEyI+0cal6w=",
+ "dev": true
+ },
+ "lodash.sortby": {
+ "version": "4.7.0",
+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
+ "dev": true
+ },
+ "lodash.union": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/lodash.union/-/lodash.union-4.6.0.tgz",
+ "integrity": "sha1-SLtQiECfFvGCFmZkHETdGqrjzYg=",
+ "dev": true
+ },
+ "lolex": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz",
+ "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=",
+ "dev": true
+ },
+ "lowercase-keys": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz",
+ "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==",
+ "dev": true
+ },
+ "make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.0.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "map-age-cleaner": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
+ "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
+ "dev": true,
+ "requires": {
+ "p-defer": "^1.0.0"
+ }
+ },
+ "map-cache": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
+ "dev": true,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "object-visit": "^1.0.0"
+ }
+ },
+ "marky": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.1.tgz",
+ "integrity": "sha512-md9k+Gxa3qLH6sUKpeC2CNkJK/Ld+bEz5X96nYwloqphQE0CKCVEKco/6jxEZixinqNdz5RFi/KaCyfbMDMAXQ==",
+ "dev": true
+ },
+ "mdn-browser-compat-data": {
+ "version": "1.0.39",
+ "resolved": "https://registry.npmjs.org/mdn-browser-compat-data/-/mdn-browser-compat-data-1.0.39.tgz",
+ "integrity": "sha512-1U5Lt+pjYxJ1mosBIdK5fr3guzV4v81f8yy0rLAj/cu7ki3ciCe85LVJJ0RLK0lP6VwFtjpXSOESfwAEpz0FyQ==",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.2"
+ }
+ },
+ "mem": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/mem/-/mem-5.1.1.tgz",
+ "integrity": "sha512-qvwipnozMohxLXG1pOqoLiZKNkC4r4qqRucSoDwXowsNGDSULiqFTRUF05vcZWnwJSG22qTsynQhxbaMtnX9gw==",
+ "dev": true,
+ "requires": {
+ "map-age-cleaner": "^0.1.3",
+ "mimic-fn": "^2.1.0",
+ "p-is-promise": "^2.1.0"
+ },
+ "dependencies": {
+ "mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true
+ }
+ }
+ },
+ "merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "micromatch": {
+ "version": "3.1.10",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
+ "dev": true,
+ "optional": 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"
+ },
+ "dependencies": {
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "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,
+ "optional": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "mime-db": {
+ "version": "1.44.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.27",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.44.0"
+ }
+ },
+ "mimic-fn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.1.0.tgz",
+ "integrity": "sha1-5md4PZLonb00KBi1IwudYqZyrRg="
+ },
+ "mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true
+ },
+ "minimatch": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
+ "requires": {
+ "brace-expansion": "^1.1.7"
+ }
+ },
+ "minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw=="
+ },
+ "mixin-deep": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
+ "dev": true,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-plain-object": "^2.0.4"
+ }
+ }
+ }
+ },
+ "mkdirp": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.3.tgz",
+ "integrity": "sha512-P+2gwrFqx8lhew375MQHHeTlY8AuOJSrGf0R5ddkEndUkmwpgUob/vQuBD1V22/Cw1/lJr4x+EjllSezBThzBg==",
+ "requires": {
+ "minimist": "^1.2.5"
+ }
+ },
+ "moment": {
+ "version": "2.29.0",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.0.tgz",
+ "integrity": "sha512-z6IJ5HXYiuxvFTI6eiQ9dm77uE0gyy1yXNApVHqTcnIKfY9tIwEjlzsZ6u1LQXvVgKeTnv9Xm7NDvJ7lso3MtA==",
+ "dev": true,
+ "optional": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multimatch": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-4.0.0.tgz",
+ "integrity": "sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==",
+ "dev": true,
+ "requires": {
+ "@types/minimatch": "^3.0.3",
+ "array-differ": "^3.0.0",
+ "array-union": "^2.1.0",
+ "arrify": "^2.0.1",
+ "minimatch": "^3.0.4"
+ },
+ "dependencies": {
+ "array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true
+ },
+ "arrify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz",
+ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==",
+ "dev": true
+ }
+ }
+ },
+ "mute-stream": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz",
+ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s="
+ },
+ "mv": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/mv/-/mv-2.1.1.tgz",
+ "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "mkdirp": "~0.5.1",
+ "ncp": "~2.0.0",
+ "rimraf": "~2.4.0"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz",
+ "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ }
+ },
+ "rimraf": {
+ "version": "2.4.5",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz",
+ "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "glob": "^6.0.1"
+ }
+ }
+ }
+ },
+ "mz": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz",
+ "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0",
+ "object-assign": "^4.0.1",
+ "thenify-all": "^1.0.0"
+ }
+ },
+ "nan": {
+ "version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
+ "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
+ "dev": true,
+ "optional": true
+ },
+ "nanomatch": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
+ "dev": true,
+ "optional": 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"
+ }
+ },
+ "native-promise-only": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz",
+ "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=",
+ "dev": true
+ },
+ "natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc="
+ },
+ "natural-compare-lite": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz",
+ "integrity": "sha1-F7CVgZiJef3a/gIB6TG6kzyWy7Q=",
+ "dev": true
+ },
+ "ncp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz",
+ "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=",
+ "dev": true,
+ "optional": true
+ },
+ "neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "next-tick": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz",
+ "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==",
+ "dev": true
+ },
+ "nice-try": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ=="
+ },
+ "node-forge": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz",
+ "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==",
+ "dev": true
+ },
+ "node-notifier": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/node-notifier/-/node-notifier-8.0.0.tgz",
+ "integrity": "sha512-46z7DUmcjoYdaWyXouuFNNfUo6eFa94t23c53c+lG/9Cvauk4a98rAUp9672X5dxGdQmLpPzTxzu8f/OeEPaFA==",
+ "dev": true,
+ "requires": {
+ "growly": "^1.3.0",
+ "is-wsl": "^2.2.0",
+ "semver": "^7.3.2",
+ "shellwords": "^0.1.1",
+ "uuid": "^8.3.0",
+ "which": "^2.0.2"
+ },
+ "dependencies": {
+ "uuid": {
+ "version": "8.3.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.1.tgz",
+ "integrity": "sha512-FOmRr+FmWEIG8uhZv6C2bTgEVXsHk08kE7mPlrBbEe+c3r9pjceVPgupIfNIhc4yx55H69OXANrUaSuu9eInKg==",
+ "dev": true
+ },
+ "which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ }
+ }
+ },
+ "node-watch": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/node-watch/-/node-watch-0.6.0.tgz",
+ "integrity": "sha512-XAgTL05z75ptd7JSVejH1a2Dm1zmXYhuDr9l230Qk6Z7/7GPcnAs/UyJJ4ggsXSvWil8iOzwQLW0zuGUvHpG8g==",
+ "dev": true
+ },
+ "normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true
+ },
+ "normalize-url": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.0.tgz",
+ "integrity": "sha512-2s47yzUxdexf1OhyRi4Em83iQk0aPvwTddtFz4hnSSw9dCEsLEGf6SwIO8ss/19S9iBb5sJaOuTvTGDeZI00BQ==",
+ "dev": true
+ },
+ "npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "requires": {
+ "path-key": "^3.0.0"
+ },
+ "dependencies": {
+ "path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true
+ }
+ }
+ },
+ "nth-check": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
+ "dev": true,
+ "requires": {
+ "boolbase": "~1.0.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "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="
+ },
+ "object-copy": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
+ "dev": true,
+ "optional": 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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "object-inspect": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.8.0.tgz",
+ "integrity": "sha512-jLdtEOB112fORuypAyl/50VRVIBIdVQOSUUGQHzJ4xBSbit81zRarz7GThkEFZy1RceYrWYcPcBFPQwHyAc1gA==",
+ "dev": true
+ },
+ "object-is": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.3.tgz",
+ "integrity": "sha512-teyqLvFWzLkq5B9ki8FVWA902UER2qkxmdA4nLf+wjOLAWgxzCWZNCxpDq9MvE8MmhWNr+I8w3BN49Vx36Y6Xg==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.1"
+ }
+ },
+ "object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true
+ },
+ "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,
+ "optional": true,
+ "requires": {
+ "isobject": "^3.0.0"
+ }
+ },
+ "object.assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.1.tgz",
+ "integrity": "sha512-VT/cxmx5yaoHSOTSyrCygIDFco+RsibY2NM0a4RdEeY/4KgqezwFtK1yr3U67xYhqJSlASm2pKhLVzPj2lr4bA==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.18.0-next.0",
+ "has-symbols": "^1.0.1",
+ "object-keys": "^1.1.1"
+ }
+ },
+ "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,
+ "optional": 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=",
+ "requires": {
+ "wrappy": "1"
+ }
+ },
+ "onetime": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
+ "requires": {
+ "mimic-fn": "^1.0.0"
+ }
+ },
+ "open": {
+ "version": "7.3.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.3.0.tgz",
+ "integrity": "sha512-mgLwQIx2F/ye9SmbrUkurZCnkoXyXyu9EbHtJZrICjVAJfyMArdHp3KkixGdZx1ZHFPNIwl0DDM1dFFqXbTLZw==",
+ "dev": true,
+ "requires": {
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
+ }
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "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-locale": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-5.0.0.tgz",
+ "integrity": "sha512-tqZcNEDAIZKBEPnHPlVDvKrp7NzgLi7jRmhKiUoa2NUmhl13FtkAGLUVR+ZsYvApBQdBfYm43A4tXXQ4IrYLBA==",
+ "dev": true,
+ "requires": {
+ "execa": "^4.0.0",
+ "lcid": "^3.0.0",
+ "mem": "^5.0.0"
+ }
+ },
+ "os-shim": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz",
+ "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=",
+ "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="
+ },
+ "p-cancelable": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz",
+ "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==",
+ "dev": true
+ },
+ "p-defer": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
+ "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
+ "dev": true
+ },
+ "p-is-promise": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
+ "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
+ "dev": true
+ },
+ "p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "requires": {
+ "p-try": "^2.0.0"
+ }
+ },
+ "p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "requires": {
+ "p-limit": "^2.2.0"
+ }
+ },
+ "p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "dev": true
+ },
+ "package-json": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz",
+ "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==",
+ "dev": true,
+ "requires": {
+ "got": "^9.6.0",
+ "registry-auth-token": "^4.0.0",
+ "registry-url": "^5.0.0",
+ "semver": "^6.2.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "pako": {
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
+ "dev": true
+ },
+ "parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "requires": {
+ "callsites": "^3.0.0"
+ },
+ "dependencies": {
+ "callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true
+ }
+ }
+ },
+ "parse-json": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.1.tgz",
+ "integrity": "sha512-ztoZ4/DYeXQq4E21v169sC8qWINGpcosGv9XhTDvg9/hWvx/zrFkc9BiWxR58OJLHGk28j5BL0SDLeV2WmFZlQ==",
+ "dev": true,
+ "requires": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1",
+ "lines-and-columns": "^1.1.6"
+ }
+ },
+ "parse5": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz",
+ "integrity": "sha512-rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==",
+ "dev": true,
+ "requires": {
+ "@types/node": "*"
+ }
+ },
+ "pascalcase": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
+ "dev": true,
+ "optional": true
+ },
+ "path-dirname": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
+ "dev": true,
+ "optional": true
+ },
+ "path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "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="
+ },
+ "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="
+ },
+ "path-key": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A="
+ },
+ "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-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ }
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "picomatch": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz",
+ "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==",
+ "dev": true,
+ "optional": true
+ },
+ "pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw="
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA="
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "requires": {
+ "pinkie": "^2.0.0"
+ }
+ },
+ "pino": {
+ "version": "6.6.1",
+ "resolved": "https://registry.npmjs.org/pino/-/pino-6.6.1.tgz",
+ "integrity": "sha512-DOgm7rn6ctBkBYemHXSLj7+j3o3U1q1FWBXbHcprur8mA93QcJSycEkEqhqKiFB9Mx/3Qld2FGr6+9yfQza0kA==",
+ "dev": true,
+ "requires": {
+ "fast-redact": "^2.0.0",
+ "fast-safe-stringify": "^2.0.7",
+ "flatstr": "^1.0.12",
+ "pino-std-serializers": "^2.4.2",
+ "quick-format-unescaped": "^4.0.1",
+ "sonic-boom": "^1.0.2"
+ }
+ },
+ "pino-std-serializers": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.5.0.tgz",
+ "integrity": "sha512-wXqbqSrIhE58TdrxxlfLwU9eDhrzppQDvGhBEr1gYbzzM4KKo3Y63gSjiDXRKLVS2UOXdPNR2v+KnQgNrs+xUg==",
+ "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=="
+ },
+ "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,
+ "optional": true
+ },
+ "postcss": {
+ "version": "7.0.35",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.35.tgz",
+ "integrity": "sha512-3QT8bBJeX/S5zKTTjTCIjRF3If4avAT6kqxcASlTWEtAFCb9NH0OUxNDfgZSWdP5fJnBYCMEWkIFfWeugjzYMg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "source-map": "^0.6.1",
+ "supports-color": "^6.1.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"
+ }
+ },
+ "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": {
+ "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"
+ }
+ }
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^3.0.0"
+ }
+ }
+ }
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ="
+ },
+ "prepend-http": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz",
+ "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=",
+ "dev": true
+ },
+ "probe-image-size": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/probe-image-size/-/probe-image-size-5.0.0.tgz",
+ "integrity": "sha512-V6uBYw5eBc5UVIE7MUZD6Nxg0RYuGDWLDenEn0B1WC6PcTvn1xdQ6HLDDuznefsiExC6rNrCz7mFRBo0f3Xekg==",
+ "dev": true,
+ "requires": {
+ "deepmerge": "^4.0.0",
+ "inherits": "^2.0.3",
+ "next-tick": "^1.0.0",
+ "request": "^2.83.0",
+ "stream-parser": "~0.3.1"
+ }
+ },
+ "process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "progress": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz",
+ "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8="
+ },
+ "psl": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==",
+ "dev": true
+ },
+ "pump": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
+ "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "pupa": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.0.1.tgz",
+ "integrity": "sha512-hEJH0s8PXLY/cdXh66tNEQGndDrIKNqNC5xmrysZy3i5C3oEoLna7YAOad+7u125+zH1HNXUmGEkrhb3c2VriA==",
+ "dev": true,
+ "requires": {
+ "escape-goat": "^2.0.0"
+ }
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "quick-format-unescaped": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.1.tgz",
+ "integrity": "sha512-RyYpQ6Q5/drsJyOhrWHYMWTedvjTIat+FTwv0K4yoUxzvekw2aRHMQJLlnvt8UantkZg2++bEzD9EdxXqkWf4A==",
+ "dev": true
+ },
+ "qunit": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.9.2.tgz",
+ "integrity": "sha512-wTOYHnioWHcx5wa85Wl15IE7D6zTZe2CQlsodS14yj7s2FZ3MviRnQluspBZsueIDEO7doiuzKlv05yfky1R7w==",
+ "dev": true,
+ "requires": {
+ "commander": "2.12.2",
+ "js-reporters": "1.2.1",
+ "minimatch": "3.0.4",
+ "node-watch": "0.6.0",
+ "resolve": "1.9.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz",
+ "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==",
+ "dev": true
+ },
+ "resolve": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.9.0.tgz",
+ "integrity": "sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==",
+ "dev": true,
+ "requires": {
+ "path-parse": "^1.0.6"
+ }
+ }
+ }
+ },
+ "rc": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz",
+ "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==",
+ "dev": true,
+ "requires": {
+ "deep-extend": "^0.6.0",
+ "ini": "~1.3.0",
+ "minimist": "^1.2.0",
+ "strip-json-comments": "~2.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "readdir-glob": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.0.tgz",
+ "integrity": "sha512-KgT0oXPIDQRRRYFf+06AUaodICTep2Q5635BORLzTEzp7rEqcR14a47j3Vzm3ix7FeI1lp8mYyG7r8lTB06Pyg==",
+ "dev": true,
+ "requires": {
+ "minimatch": "^3.0.4"
+ }
+ },
+ "readdirp": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz",
+ "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "picomatch": "^2.2.1"
+ }
+ },
+ "regenerator-runtime": {
+ "version": "0.13.7",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
+ "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
+ "dev": true
+ },
+ "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,
+ "optional": true,
+ "requires": {
+ "extend-shallow": "^3.0.2",
+ "safe-regex": "^1.1.0"
+ }
+ },
+ "regexp.prototype.flags": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz",
+ "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.0-next.1"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ }
+ }
+ },
+ "regexpp": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
+ "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
+ "dev": true
+ },
+ "registry-auth-token": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.0.tgz",
+ "integrity": "sha512-P+lWzPrsgfN+UEpDS3U8AQKg/UjZX6mQSJueZj3EK+vNESoqBSpBUD3gmu4sF9lOsjXWjF11dQKUqemf3veq1w==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.2.8"
+ }
+ },
+ "registry-url": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz",
+ "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==",
+ "dev": true,
+ "requires": {
+ "rc": "^1.2.8"
+ }
+ },
+ "relaxed-json": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/relaxed-json/-/relaxed-json-1.0.3.tgz",
+ "integrity": "sha512-b7wGPo7o2KE/g7SqkJDDbav6zmrEeP4TK2VpITU72J/M949TLe/23y/ZHJo+pskcGM52xIfFoT9hydwmgr1AEg==",
+ "dev": true,
+ "requires": {
+ "chalk": "^2.4.2",
+ "commander": "^2.6.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"
+ }
+ },
+ "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"
+ }
+ },
+ "has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
+ "dev": true
+ },
+ "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"
+ }
+ }
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true
+ },
+ "request": {
+ "version": "2.88.2",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.3",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.5.0",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ }
+ },
+ "require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
+ "dev": true
+ },
+ "require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
+ "dev": true
+ },
+ "require-uncached": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz",
+ "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=",
+ "requires": {
+ "caller-path": "^0.1.0",
+ "resolve-from": "^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="
+ },
+ "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,
+ "optional": true
+ },
+ "responselike": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz",
+ "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=",
+ "dev": true,
+ "requires": {
+ "lowercase-keys": "^1.0.0"
+ }
+ },
+ "restore-cursor": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
+ "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,
+ "optional": true
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "requires": {
+ "glob": "^7.0.5"
+ }
+ },
+ "run-async": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz",
+ "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=",
+ "requires": {
+ "is-promise": "^2.1.0"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true
+ },
+ "safe-json-stringify": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/safe-json-stringify/-/safe-json-stringify-1.2.0.tgz",
+ "integrity": "sha512-gH8eh2nZudPQO6TytOvbxnuhYBOvDBBLW52tz5q6X58lJcd/tkmqFR+5Z9adS8aJtURSXWThWy/xJtJwixErvg==",
+ "dev": true,
+ "optional": 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,
+ "optional": 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=="
+ },
+ "samsam": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz",
+ "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "select2": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/select2/-/select2-4.0.11.tgz",
+ "integrity": "sha512-8Z/yd43F5EMOkz2Mo+aE7nOx2i8nSuxGZVFkbeyCklkU+WTwCa+xdZqG+IPgZ75lkEkLD+X+f8vEG9aKBxISqA==",
+ "dev": true
+ },
+ "semver": {
+ "version": "7.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz",
+ "integrity": "sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ==",
+ "dev": true
+ },
+ "semver-diff": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz",
+ "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==",
+ "dev": true,
+ "requires": {
+ "semver": "^6.3.0"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
+ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
+ "dev": true
+ }
+ }
+ },
+ "set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
+ "dev": true
+ },
+ "set-value": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
+ "dev": true,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ }
+ }
+ },
+ "sha.js": {
+ "version": "2.4.11",
+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.1",
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
+ "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="
+ },
+ "shell-quote": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
+ "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
+ "dev": true,
+ "requires": {
+ "array-filter": "~0.0.0",
+ "array-map": "~0.0.0",
+ "array-reduce": "~0.0.0",
+ "jsonify": "~0.0.0"
+ }
+ },
+ "shellwords": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/shellwords/-/shellwords-0.1.1.tgz",
+ "integrity": "sha512-vFwSUfQvqybiICwZY5+DAWIPLKsWO31Q91JSKl3UYv+K5c2QRPzn0qzec6QPu1Qc9eHYItiP3NdJqNVqetYAww==",
+ "dev": true
+ },
+ "sign-addon": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/sign-addon/-/sign-addon-3.1.0.tgz",
+ "integrity": "sha512-zZ7nKc5/3QWM3skYBosGDvYQf2jkKhW2u8BELrZoN1wgCSOnwsV9T47Vx9uaNbA3CyZ+V9XSA0tDVHoV1QfVPw==",
+ "dev": true,
+ "requires": {
+ "common-tags": "1.8.0",
+ "core-js": "3.6.5",
+ "deepcopy": "2.1.0",
+ "es6-error": "4.1.1",
+ "es6-promisify": "6.1.1",
+ "jsonwebtoken": "8.5.1",
+ "mz": "2.7.0",
+ "request": "2.88.2",
+ "source-map-support": "0.5.19",
+ "stream-to-promise": "3.0.0"
+ },
+ "dependencies": {
+ "core-js": {
+ "version": "3.6.5",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz",
+ "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==",
+ "dev": true
+ }
+ }
+ },
+ "signal-exit": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
+ "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0="
+ },
+ "sinon": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.0.0.tgz",
+ "integrity": "sha1-SDN/pIkGnlMK1+L0TwewrpPTeyQ=",
+ "dev": true,
+ "requires": {
+ "diff": "^3.1.0",
+ "formatio": "1.2.0",
+ "lolex": "^1.6.0",
+ "native-promise-only": "^0.8.1",
+ "path-to-regexp": "^1.7.0",
+ "samsam": "^1.1.3",
+ "text-encoding": "0.6.4",
+ "type-detect": "^4.0.0"
+ }
+ },
+ "slice-ansi": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.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"
+ }
+ }
+ }
+ },
+ "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,
+ "optional": 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": {
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
+ "dev": true,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "sonic-boom": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.3.0.tgz",
+ "integrity": "sha512-4nX6OYvOYr6R76xfQKi6cZpTO3YSWe/vd+QdIfoH0lBy0MnPkeAbb2rRWgmgADkXUeCKPwO1FZAKlAVWAadELw==",
+ "dev": true,
+ "requires": {
+ "atomic-sleep": "^1.0.0",
+ "flatstr": "^1.0.12"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-resolve": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "atob": "^2.1.2",
+ "decode-uri-component": "^0.2.0",
+ "resolve-url": "^0.2.1",
+ "source-map-url": "^0.4.0",
+ "urix": "^0.1.0"
+ }
+ },
+ "source-map-support": {
+ "version": "0.5.19",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.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,
+ "optional": true
+ },
+ "spawn-sync": {
+ "version": "1.0.15",
+ "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz",
+ "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=",
+ "dev": true,
+ "requires": {
+ "concat-stream": "^1.4.7",
+ "os-shim": "^0.1.2"
+ }
+ },
+ "split": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
+ "dev": true,
+ "requires": {
+ "through": "2"
+ }
+ },
+ "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,
+ "optional": 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="
+ },
+ "sshpk": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-descriptor": "^0.1.0"
+ }
+ }
+ }
+ },
+ "stream-parser": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/stream-parser/-/stream-parser-0.3.1.tgz",
+ "integrity": "sha1-FhhUhpRCACGhGC/wrxkRwSl2F3M=",
+ "dev": true,
+ "requires": {
+ "debug": "2"
+ }
+ },
+ "stream-to-array": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/stream-to-array/-/stream-to-array-2.3.0.tgz",
+ "integrity": "sha1-u/azn19D7DC8cbq8s3VXrOzzQ1M=",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.1.0"
+ }
+ },
+ "stream-to-promise": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/stream-to-promise/-/stream-to-promise-3.0.0.tgz",
+ "integrity": "sha512-h+7wLeFiYegOdgTfTxjRsrT7/Op7grnKEIHWgaO1RTHwcwk7xRreMr3S8XpDfDMesSxzgM2V4CxNCFAGo6ssnA==",
+ "dev": true,
+ "requires": {
+ "any-promise": "~1.3.0",
+ "end-of-stream": "~1.4.1",
+ "stream-to-array": "~2.3.0"
+ }
+ },
+ "string-width": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
+ "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
+ "requires": {
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^4.0.0"
+ }
+ },
+ "string.prototype.trimend": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
+ "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ }
+ }
+ },
+ "string.prototype.trimstart": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
+ "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
+ "dev": true,
+ "requires": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ },
+ "dependencies": {
+ "es-abstract": {
+ "version": "1.17.7",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz",
+ "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==",
+ "dev": true,
+ "requires": {
+ "es-to-primitive": "^1.2.1",
+ "function-bind": "^1.1.1",
+ "has": "^1.0.3",
+ "has-symbols": "^1.0.1",
+ "is-callable": "^1.2.2",
+ "is-regex": "^1.1.1",
+ "object-inspect": "^1.8.0",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.1",
+ "string.prototype.trimend": "^1.0.1",
+ "string.prototype.trimstart": "^1.0.1"
+ }
+ }
+ }
+ },
+ "string_decoder": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "~5.2.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
+ "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="
+ }
+ }
+ },
+ "strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true
+ },
+ "strip-bom-buf": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-buf/-/strip-bom-buf-2.0.0.tgz",
+ "integrity": "sha512-gLFNHucd6gzb8jMsl5QmZ3QgnUJmp7qn4uUSHNwEXumAp7YizoGYw19ZUVfuq4aBOQUtyn2k8X/CwzWB73W2lQ==",
+ "dev": true,
+ "requires": {
+ "is-utf8": "^0.2.1"
+ }
+ },
+ "strip-bom-stream": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-4.0.0.tgz",
+ "integrity": "sha512-0ApK3iAkHv6WbgLICw/J4nhwHeDZsBxIIsOD+gHgZICL6SeJ0S9f/WZqemka9cjkTyMN5geId6e8U5WGFAn3cQ==",
+ "dev": true,
+ "requires": {
+ "first-chunk-stream": "^3.0.0",
+ "strip-bom-buf": "^2.0.0"
+ },
+ "dependencies": {
+ "first-chunk-stream": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-3.0.0.tgz",
+ "integrity": "sha512-LNRvR4hr/S8cXXkIY5pTgVP7L3tq6LlYWcg9nWBuW7o1NMxKZo6oOVa/6GIekMGI0Iw7uC+HWimMe9u/VAeKqw==",
+ "dev": true
+ }
+ }
+ },
+ "strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "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="
+ },
+ "supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "requires": {
+ "has-flag": "^4.0.0"
+ },
+ "dependencies": {
+ "has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true
+ }
+ }
+ },
+ "table": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/table/-/table-5.1.1.tgz",
+ "integrity": "sha512-NUjapYb/qd4PeFW03HnAuOJ7OMcBkJlqeClWxeNlQ0lXGSb52oZXGzkO0/I0ARegQ2eUT1g2VDJH0eUxDRcHmw==",
+ "requires": {
+ "ajv": "^6.6.1",
+ "lodash": "^4.17.11",
+ "slice-ansi": "2.0.0",
+ "string-width": "^2.1.1"
+ },
+ "dependencies": {
+ "ajv": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.6.2.tgz",
+ "integrity": "sha512-FBHEW6Jf5TB9MGBgUUA9XHkTbjXYfAUjY43ACMfmdMRHniyoMHjHjzD50OK8LGDWQwp4rWEsIq5kEqq7rvIM1g==",
+ "requires": {
+ "fast-deep-equal": "^2.0.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "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==",
+ "requires": {
+ "color-convert": "^1.9.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz",
+ "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk="
+ },
+ "json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ },
+ "slice-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.0.0.tgz",
+ "integrity": "sha512-4j2WTWjp3GsZ+AOagyzVbzp4vWGtZ0hEZ/gDY/uTvm6MTxUfTUIsnMIFb1bn8o0RuXiqUw15H1bue8f22Vw2oQ==",
+ "requires": {
+ "ansi-styles": "^3.2.0",
+ "astral-regex": "^1.0.0",
+ "is-fullwidth-code-point": "^2.0.0"
+ }
+ }
+ }
+ },
+ "tar-stream": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.1.4.tgz",
+ "integrity": "sha512-o3pS2zlG4gxr67GmFYBLlq+dM8gyRGUOvsrHclSkvtVtQbjV0s/+ZE8OpICbaj8clrX3tjeHngYGP7rweaBnuw==",
+ "dev": true,
+ "requires": {
+ "bl": "^4.0.3",
+ "end-of-stream": "^1.4.1",
+ "fs-constants": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^3.1.1"
+ }
+ },
+ "term-size": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/term-size/-/term-size-2.2.0.tgz",
+ "integrity": "sha512-a6sumDlzyHVJWb8+YofY4TW112G6p2FCPEAFk+59gIYHv3XHRhm9ltVQ9kli4hNWeQBwSpe8cRN25x0ROunMOw==",
+ "dev": true
+ },
+ "text-encoding": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz",
+ "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=",
+ "dev": true
+ },
+ "text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ="
+ },
+ "thenify": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz",
+ "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==",
+ "dev": true,
+ "requires": {
+ "any-promise": "^1.0.0"
+ }
+ },
+ "thenify-all": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz",
+ "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=",
+ "dev": true,
+ "requires": {
+ "thenify": ">= 3.1.0 < 4"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "requires": {
+ "os-tmpdir": "~1.0.2"
+ }
+ },
+ "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,
+ "optional": 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,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ }
+ }
+ },
+ "to-readable-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz",
+ "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==",
+ "dev": true
+ },
+ "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,
+ "optional": 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": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-number": "^7.0.0"
+ }
+ },
+ "tooltipster": {
+ "version": "4.2.6",
+ "resolved": "https://registry.npmjs.org/tooltipster/-/tooltipster-4.2.6.tgz",
+ "integrity": "sha1-+/ej9bQL2D6BV04o2WZ8+CZnvHk=",
+ "dev": true
+ },
+ "tosource": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/tosource/-/tosource-1.0.0.tgz",
+ "integrity": "sha1-QtiN0RZhi88A1hBt1URvNCeQL/E=",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.28",
+ "punycode": "^2.1.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ }
+ }
+ },
+ "tr46": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.0.2.tgz",
+ "integrity": "sha512-3n1qG+/5kg+jrbTzwAykB5yRYtQCTqOGKq5U5PE3b0a1/mzo6snDhjGS0zJVJunO0NrT3Dg1MLy5TjWP/UJppg==",
+ "dev": true,
+ "requires": {
+ "punycode": "^2.1.1"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
+ "dev": true
+ }
+ }
+ },
+ "traverse": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.4.6.tgz",
+ "integrity": "sha1-0EsigOTHkqWBVCnve4tgxkyczDQ=",
+ "dev": true
+ },
+ "tslib": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
+ "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true
+ },
+ "type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true
+ },
+ "typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
+ "dev": true
+ },
+ "typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "requires": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "underscore": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
+ "integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg==",
+ "dev": true
+ },
+ "union-value": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "arr-union": "^3.1.0",
+ "get-value": "^2.0.6",
+ "is-extendable": "^0.1.1",
+ "set-value": "^2.0.1"
+ }
+ },
+ "unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dev": true,
+ "requires": {
+ "crypto-random-string": "^2.0.0"
+ }
+ },
+ "universalify": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
+ "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
+ "dev": true
+ },
+ "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,
+ "optional": 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,
+ "optional": 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,
+ "optional": 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,
+ "optional": true
+ }
+ }
+ },
+ "upath": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
+ "dev": true
+ },
+ "update-notifier": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.0.0.tgz",
+ "integrity": "sha512-8tqsiVrMv7aZsKNSjqA6DdBLKJpZG1hRpkj1RbOJu1PgyP69OX+EInAnP1EK/ShX5YdPFgwWdk19oquZ0HTM8g==",
+ "dev": true,
+ "requires": {
+ "boxen": "^4.2.0",
+ "chalk": "^4.1.0",
+ "configstore": "^5.0.1",
+ "has-yarn": "^2.1.0",
+ "import-lazy": "^2.1.0",
+ "is-ci": "^2.0.0",
+ "is-installed-globally": "^0.3.1",
+ "is-npm": "^5.0.0",
+ "is-yarn-global": "^0.3.0",
+ "latest-version": "^5.0.0",
+ "pupa": "^2.0.1",
+ "semver": "^7.3.2",
+ "semver-diff": "^3.1.1",
+ "xdg-basedir": "^4.0.0"
+ },
+ "dependencies": {
+ "chalk": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz",
+ "integrity": "sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ }
+ }
+ }
+ },
+ "uri-js": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
+ "requires": {
+ "punycode": "^2.1.0"
+ },
+ "dependencies": {
+ "punycode": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
+ }
+ }
+ },
+ "urix": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
+ "dev": true,
+ "optional": true
+ },
+ "url-parse-lax": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz",
+ "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=",
+ "dev": true,
+ "requires": {
+ "prepend-http": "^2.0.0"
+ }
+ },
+ "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,
+ "optional": 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
+ },
+ "uuid": {
+ "version": "3.4.0",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==",
+ "dev": true
+ },
+ "v8-compile-cache": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz",
+ "integrity": "sha512-8OQ9CL+VWyt3JStj7HX7/ciTL2V3Rl1Wf5OL+SNTm0yK1KvtReVulksyeRnCANHHuUxHlQig+JJDlUhBt1NQDQ==",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "^1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "^1.2.0"
+ }
+ },
+ "watchpack": {
+ "version": "1.7.4",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.4.tgz",
+ "integrity": "sha512-aWAgTW4MoSJzZPAicljkO1hsi1oKj/RRq/OJQh2PKI2UKL04c2Bs+MBOB+BBABHTXJpf9mCwHN7ANCvYsvY2sg==",
+ "dev": true,
+ "requires": {
+ "chokidar": "^3.4.1",
+ "graceful-fs": "^4.1.2",
+ "neo-async": "^2.5.0",
+ "watchpack-chokidar2": "^2.0.0"
+ }
+ },
+ "watchpack-chokidar2": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz",
+ "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "chokidar": "^2.1.8"
+ },
+ "dependencies": {
+ "anymatch": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "micromatch": "^3.1.4",
+ "normalize-path": "^2.1.1"
+ },
+ "dependencies": {
+ "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,
+ "optional": true,
+ "requires": {
+ "remove-trailing-separator": "^1.0.1"
+ }
+ }
+ }
+ },
+ "binary-extensions": {
+ "version": "1.13.1",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
+ "dev": true,
+ "optional": true
+ },
+ "braces": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
+ "dev": true,
+ "optional": 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"
+ }
+ },
+ "chokidar": {
+ "version": "2.1.8",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "anymatch": "^2.0.0",
+ "async-each": "^1.0.1",
+ "braces": "^2.3.2",
+ "fsevents": "^1.2.7",
+ "glob-parent": "^3.1.0",
+ "inherits": "^2.0.3",
+ "is-binary-path": "^1.0.0",
+ "is-glob": "^4.0.0",
+ "normalize-path": "^3.0.0",
+ "path-is-absolute": "^1.0.0",
+ "readdirp": "^2.2.1",
+ "upath": "^1.1.1"
+ }
+ },
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extendable": "^0.1.0"
+ }
+ },
+ "fill-range": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "extend-shallow": "^2.0.1",
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1",
+ "to-regex-range": "^2.1.0"
+ }
+ },
+ "fsevents": {
+ "version": "1.2.13",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz",
+ "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "nan": "^2.12.1"
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-glob": "^3.1.0",
+ "path-dirname": "^1.0.0"
+ },
+ "dependencies": {
+ "is-glob": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-extglob": "^2.1.0"
+ }
+ }
+ }
+ },
+ "is-binary-path": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "binary-extensions": "^1.0.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,
+ "optional": true,
+ "requires": {
+ "kind-of": "^3.0.2"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "is-buffer": "^1.1.5"
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.7",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
+ "dev": true,
+ "optional": 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"
+ }
+ },
+ "readdirp": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "graceful-fs": "^4.1.11",
+ "micromatch": "^3.1.10",
+ "readable-stream": "^2.0.2"
+ }
+ },
+ "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,
+ "optional": true
+ },
+ "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,
+ "optional": true,
+ "requires": {
+ "safe-buffer": "~5.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,
+ "optional": true,
+ "requires": {
+ "is-number": "^3.0.0",
+ "repeat-string": "^1.6.1"
+ }
+ }
+ }
+ },
+ "wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
+ "dev": true,
+ "requires": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "web-ext": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/web-ext/-/web-ext-5.2.0.tgz",
+ "integrity": "sha512-o/s206JW2U/vXHTe/XeBnsUQhIcuphsSVNVrJU+MoMFq8JlU9vI1VdS2RCW+u5NuqAsMvTyV+pA+4hLGB9CGCw==",
+ "dev": true,
+ "requires": {
+ "@babel/polyfill": "7.11.5",
+ "@babel/runtime": "7.11.2",
+ "@cliqz-oss/firefox-client": "0.3.1",
+ "@cliqz-oss/node-firefox-connect": "1.2.1",
+ "@devicefarmer/adbkit": "2.11.3",
+ "addons-linter": "2.7.0",
+ "bunyan": "1.8.14",
+ "camelcase": "6.0.0",
+ "chrome-launcher": "0.13.4",
+ "debounce": "1.2.0",
+ "decamelize": "4.0.0",
+ "es6-error": "4.1.1",
+ "event-to-promise": "0.8.0",
+ "firefox-profile": "4.0.0",
+ "fs-extra": "9.0.1",
+ "fx-runner": "1.0.13",
+ "import-fresh": "3.2.1",
+ "mkdirp": "1.0.4",
+ "multimatch": "4.0.0",
+ "mz": "2.7.0",
+ "node-notifier": "8.0.0",
+ "open": "7.3.0",
+ "parse-json": "5.0.1",
+ "sign-addon": "3.1.0",
+ "source-map-support": "0.5.19",
+ "strip-bom": "4.0.0",
+ "strip-json-comments": "3.1.1",
+ "tmp": "0.2.1",
+ "update-notifier": "5.0.0",
+ "watchpack": "1.7.4",
+ "ws": "7.3.1",
+ "yargs": "15.4.1",
+ "zip-dir": "1.0.2"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "7.1.6",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz",
+ "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==",
+ "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"
+ }
+ },
+ "mkdirp": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "requires": {
+ "glob": "^7.1.3"
+ }
+ },
+ "strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true
+ },
+ "tmp": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz",
+ "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==",
+ "dev": true,
+ "requires": {
+ "rimraf": "^3.0.0"
+ }
+ }
+ }
+ },
+ "webidl-conversions": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz",
+ "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "8.2.2",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.2.2.tgz",
+ "integrity": "sha512-PcVnO6NiewhkmzV0qn7A+UZ9Xx4maNTI+O+TShmfE4pqjoCMwUMjkvoNhNHPTvgR7QH9Xt3R13iHuWy2sToFxQ==",
+ "dev": true,
+ "requires": {
+ "lodash.sortby": "^4.7.0",
+ "tr46": "^2.0.2",
+ "webidl-conversions": "^6.1.0"
+ }
+ },
+ "when": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/when/-/when-3.7.7.tgz",
+ "integrity": "sha1-q6A/w7tzbWyIsJHQE9io5ZDYRxg=",
+ "dev": true
+ },
+ "which": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz",
+ "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==",
+ "requires": {
+ "isexe": "^2.0.0"
+ }
+ },
+ "which-module": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
+ "dev": true
+ },
+ "widest-line": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz",
+ "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==",
+ "dev": true,
+ "requires": {
+ "string-width": "^4.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "winreg": {
+ "version": "0.0.12",
+ "resolved": "https://registry.npmjs.org/winreg/-/winreg-0.0.12.tgz",
+ "integrity": "sha1-BxBVVLoanQiXklHRKUdb/64wBrc=",
+ "dev": true
+ },
+ "word-wrap": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
+ "dev": true
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus="
+ },
+ "wrap-ansi": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ },
+ "write": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz",
+ "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=",
+ "requires": {
+ "mkdirp": "^0.5.1"
+ }
+ },
+ "write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "requires": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "ws": {
+ "version": "7.3.1",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.3.1.tgz",
+ "integrity": "sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==",
+ "dev": true
+ },
+ "xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "dev": true
+ },
+ "xml2js": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz",
+ "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==",
+ "dev": true,
+ "requires": {
+ "sax": ">=0.6.0",
+ "xmlbuilder": "~11.0.0"
+ }
+ },
+ "xmlbuilder": {
+ "version": "11.0.1",
+ "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz",
+ "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==",
+ "dev": true
+ },
+ "y18n": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
+ "dev": true
+ },
+ "yargs": {
+ "version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
+ "dev": true,
+ "requires": {
+ "cliui": "^6.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^4.1.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^4.2.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^18.1.2"
+ },
+ "dependencies": {
+ "ansi-regex": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz",
+ "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ },
+ "is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true
+ },
+ "string-width": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz",
+ "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==",
+ "dev": true,
+ "requires": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ }
+ },
+ "strip-ansi": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz",
+ "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "^5.0.0"
+ }
+ }
+ }
+ },
+ "yargs-parser": {
+ "version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
+ "dev": true,
+ "requires": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ },
+ "dependencies": {
+ "camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true
+ },
+ "decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
+ "dev": true
+ }
+ }
+ },
+ "yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "zip-dir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/zip-dir/-/zip-dir-1.0.2.tgz",
+ "integrity": "sha1-JT+QeurWKiGs2HIdi4gDKyQRwFE=",
+ "dev": true,
+ "requires": {
+ "async": "^1.5.2",
+ "jszip": "^2.4.0"
+ },
+ "dependencies": {
+ "async": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz",
+ "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=",
+ "dev": true
+ }
+ }
+ },
+ "zip-stream": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.0.2.tgz",
+ "integrity": "sha512-TGxB2g+1ur6MHkvM644DuZr8Uzyz0k0OYWtS3YlpfWBEmK4woaC2t3+pozEL3dBfIPmpgmClR5B2QRcMgGt22g==",
+ "dev": true,
+ "requires": {
+ "archiver-utils": "^2.1.0",
+ "compress-commons": "^4.0.0",
+ "readable-stream": "^3.6.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..509957c
--- /dev/null
+++ b/package.json
@@ -0,0 +1,22 @@
+{
+ "name": "privacy-badger-dev-tools",
+ "version": "0.0.1",
+ "description": "Developer tools for Privacy Badger.",
+ "dependencies": {
+ "eslint": "~5.10.0"
+ },
+ "devDependencies": {
+ "jquery": "3.5.1",
+ "jquery-smooth-scroll": "2.2.0",
+ "jquery-ui": "1.12.1",
+ "jquery-ui-iconfont": "2.3.2",
+ "punycode": "1.4.1",
+ "qunit": "2.9.2",
+ "select2": "4.0.11",
+ "sinon": "2.0.0",
+ "tooltipster": "4.2.6",
+ "underscore": "1.9.1",
+ "web-ext": "~5.2.0"
+ },
+ "private": true
+}
diff --git a/release-utils/chromium-release.sh b/release-utils/chromium-release.sh
new file mode 100755
index 0000000..491d172
--- /dev/null
+++ b/release-utils/chromium-release.sh
@@ -0,0 +1,26 @@
+#!/bin/bash
+
+if [ $# -ne 3 ]; then
+ echo "$0 TAG KEY DESTINATION"
+ exit
+fi
+
+SUBDIR=checkout
+[ -d $SUBDIR ] && rm -rf $SUBDIR
+mkdir $SUBDIR
+cp -r -f -a .git $SUBDIR
+cd $SUBDIR
+git reset --hard "$1"
+
+# clean up
+# TODO duplicated in make-eff-zip.sh
+rm -rf src/tests # remove unit tests
+rm src/data/dnt-policy.txt # only used by unit tests
+cp LICENSE src/ # include LICENSE in build
+
+echo "Building chrome version" "$1"
+
+chromium --pack-extension="src/" --pack-extension-key="$2"
+cd -
+mv checkout/src.crx "$3"
+rm -rf checkout
diff --git a/release-utils/firefox-release.sh b/release-utils/firefox-release.sh
new file mode 100755
index 0000000..0242c6d
--- /dev/null
+++ b/release-utils/firefox-release.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+
+set -e
+cd "$(dirname "$0")"
+
+PKGDIR=../pkg
+
+# To make an Privacy Badger firefox release, signed with an offline key
+
+# 1. get the repo into a sane state for a release
+# 2. ensure that doc/Changelog approximately describes this release
+# 3. tag the release with "git tag -s <release version number>"
+# 4. run this script with <release version number> as the argument
+
+
+if [ $# -ne 1 ] ; then
+ echo "Usage: $0 <version to release>"
+ exit 1
+fi
+TARGET=$1
+
+
+if ! git show release-"$TARGET" > /dev/null 2> /dev/null ; then
+ echo "$TARGET is not a valid git target"
+ exit 1
+fi
+
+PKG=$PKGDIR/privacy-badger-eff-$TARGET.xpi
+ALT=$PKGDIR/privacy-badger-eff-latest.xpi
+
+if ! ./make-signed-xpi.sh "$TARGET" ; then
+ echo "Failed to build target $TARGET XPI"
+ exit 1
+fi
+
+if ! [ -f "$PKG" ] ; then
+ echo "Failed to find package $PKG after build"
+ exit 1
+fi
+
+# XXX: Why make a gpg detached sig?
+echo "Making (secondary) GPG signature"
+gpg --detach-sign "$PKG"
+
+cp "$PKG" "$ALT"
diff --git a/release-utils/make-eff-zip.sh b/release-utils/make-eff-zip.sh
new file mode 100755
index 0000000..e06be24
--- /dev/null
+++ b/release-utils/make-eff-zip.sh
@@ -0,0 +1,32 @@
+#!/usr/bin/env bash
+
+# make a release zip of Privacy Badger for opera and firefox
+# chrome releases happen in chromium-release.sh
+
+# this script takes a mandatory argument which is the git tag to build
+
+if [ -n "$1" ]; then
+ SUBDIR=checkout
+ [ -d $SUBDIR ] && rm -rf $SUBDIR
+ mkdir $SUBDIR
+ cp -r -f -a .git $SUBDIR
+ cd $SUBDIR
+ git reset --hard "$1"
+
+ # clean up
+ # TODO duplicated in chromium-release.sh
+ rm -rf src/tests # remove unit tests
+ rm src/data/dnt-policy.txt # only used by unit tests
+ cp LICENSE src/ # include LICENSE in build
+
+else
+ echo "Please supply a tag name for the release you are zipping"
+ exit 1
+fi
+
+
+echo "Building zip version" "$1"
+
+(cd src && zip -q -r ../privacy_badger-"$TARGET".zip .)
+mv privacy_badger*.zip ../pkg/
+cd -
diff --git a/release-utils/make-release-zip.sh b/release-utils/make-release-zip.sh
new file mode 100755
index 0000000..8010b1f
--- /dev/null
+++ b/release-utils/make-release-zip.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+
+# We use the immutable filesystem attribute as a workaround for the fact that
+# the build scripts are not currently idempotent.
+
+# The fact that the package is marked immutable means that it has been built
+# for release.
+
+if ! lsattr "$PREPKG" | cut -f 1 -d" " | grep -q i ; then
+
+ if [ -f "$PREPKG" ] ; then
+ echo "$PREPKG" is not immutable, rebuilding it for release!
+ else
+ echo building "$PREPKG" for the first time...
+ fi
+
+ if ! release-utils/make-eff-zip.sh "$GITTAG" ; then
+ echo "Failed to build target $GITTAG"
+ exit 1
+ fi
+
+ if ! [ -f "$PREPKG" -a -f "$PREPKGCWS" ] ; then
+ echo "Failed to find package $PREPKG after build"
+ exit 1
+ fi
+
+ # Verification and testing of build goes here!
+
+ echo Marking "$PREPKG" immutable...
+ if ! sudo true ; then
+ echo "Failed to sudo :("
+ exit 1
+ fi
+ if ! sudo chattr +i "$PREPKG" "$PREPKGCWS"; then
+ echo ""
+ echo "WARNING: FAILED TO MARK $PREPKG or $PREPKGCWS IMMUTABLE."
+ echo "DO NOT RERUN THIS SCRIPT AFTER SIGNING"
+ echo ""
+ read -p "(Press Enter to acknowledge)"
+ fi
+else
+ echo "$PREPKG is immutable; good, not rebuilding it..."
+fi
diff --git a/release-utils/make-release.sh b/release-utils/make-release.sh
new file mode 100755
index 0000000..4cda497
--- /dev/null
+++ b/release-utils/make-release.sh
@@ -0,0 +1,50 @@
+#!/bin/bash
+
+# To make a privacy badger release see wiki
+
+if [ $# -ne 1 ] ; then
+ echo "Usage: $0 <version to release>"
+ exit 1
+fi
+export TARGET=$1
+export GITTAG
+
+if ! [ -f ./release-utils/config.sh ] ; then
+ echo "Missing config file. Cannot continue."
+ exit 1
+fi
+source ./release-utils/config.sh
+
+
+if echo "$TARGET" | grep -q release- ; then
+ GITTAG=$TARGET
+ TARGET=$(echo "$TARGET" | sed s/release-//)
+else
+ GITTAG=release-$TARGET
+fi
+
+if ! git show "$GITTAG" > /dev/null 2> /dev/null ; then
+ echo "$GITTAG is not a valid git target"
+ exit 1
+fi
+
+export PREPKG=pkg/privacy_badger-$TARGET.zip
+export PREPKGCWS=pkg/privacy_badger-$TARGET.zip
+
+
+echo "Making Opera zip"
+if ! release-utils/make-release-zip.sh "$TARGET"; then
+ echo "Failed to build target $TARGET for Opera"
+ exit 1
+fi
+
+echo "Making Firefox release"
+if ! release-utils/firefox-release.sh "$TARGET"; then
+ echo "Failed to build target $TARGET for Firefox"
+ exit 1
+fi
+
+
+./release-utils/post-release.sh "$TARGET"
+
+rm -rf checkout
diff --git a/release-utils/make-signed-xpi.sh b/release-utils/make-signed-xpi.sh
new file mode 100755
index 0000000..cf3fe73
--- /dev/null
+++ b/release-utils/make-signed-xpi.sh
@@ -0,0 +1,65 @@
+#!/bin/sh
+
+set -e
+
+cd "$(dirname "$0")"
+
+LATEST_SDK_VERSION=5.2.0
+WEB_EXT=../node_modules/.bin/web-ext
+
+# Auto-generated XPI name from 'web-ext sign'
+PRE_XPI_NAME=privacy_badger_by_eff-$TARGET-an+fx.xpi
+XPI_NAME="privacy-badger-eff-$1.xpi"
+AMO_ZIP_NAME="privacy_badger-$1.amo.zip"
+
+if ! type $WEB_EXT > /dev/null; then
+ echo "Please install web-ext before running this script."
+ exit 1
+fi
+
+if ! $WEB_EXT --version | grep -q "$LATEST_SDK_VERSION"; then
+ echo "Please use the latest stable web-ext version or edit this script to the current version."
+ exit 1
+fi
+
+if [ $# -ne 1 ]; then
+ echo "Usage: $0 <version to release>"
+ exit 1
+fi
+
+echo "changing author value"
+sed -i -e '/eff.software.projects@gmail.com/,+1d' -e 's/"author": {/"author": "privacybadger-owner@eff.org",/' ../checkout/src/manifest.json
+
+echo "removing Chrome's update_url"
+# remove update_url
+sed -i -e '/"update_url": "https:\/\/clients2.google.com\/service\/update2\/crx"/,+0d' ../checkout/src/manifest.json
+# fix the trailing comma
+# TODO fragile! at least we validate the JSON below
+# https://unix.stackexchange.com/a/26288
+# https://unix.stackexchange.com/a/26290
+sed -i -e '/"storage": {/{
+ n
+ n
+ s/},/}/
+}' ../checkout/src/manifest.json
+
+# lint the checkout folder
+$WEB_EXT lint -s ../checkout/src
+
+echo "making zip file for AMO"
+
+(cd ../checkout/src && rm -f ../../pkg/"$AMO_ZIP_NAME" && zip -q -r ../../pkg/"$AMO_ZIP_NAME" ./*)
+
+echo "insert self hosting package id"
+# Insert self hosted package id
+sed -i 's,"id": "jid1-MnnxcxisBPnSXQ@jetpack","id": "jid1-MnnxcxisBPnSXQ-eff@jetpack"\,\n "update_url": "https://www.eff.org/files/privacy-badger-updates.json",' ../checkout/src/manifest.json
+
+# lint checkout again as our modification above could have broken something
+# disable AMO-specific checks to allow applications.gecko.update_url
+$WEB_EXT lint -s ../checkout/src --self-hosted
+
+#"update_url": "https://www.eff.org/files/privacy-badger-updates.json"
+# Build and sign the XPI
+echo "Running web-ext sign"
+$WEB_EXT sign -s ../checkout/src --api-key "$AMO_API_KEY" --api-secret "$AMO_API_SECRET" -a ../pkg
+mv "../pkg/$PRE_XPI_NAME" "../pkg/$XPI_NAME"
diff --git a/release-utils/post-chrome-release.sh b/release-utils/post-chrome-release.sh
new file mode 100755
index 0000000..a751ef7
--- /dev/null
+++ b/release-utils/post-chrome-release.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+
+if ! [ -f ./release-utils/config.sh ] ; then
+ echo "Missing config file. Cannot continue."
+ exit 1
+fi
+source ./release-utils/config.sh
+
+if [ $# -ne 1 ] ; then
+ echo "Usage: $0 <version to release>"
+ exit 1
+fi
+TARGET=$1
+if ! git show release-"$TARGET" > /dev/null 2> /dev/null ; then
+ echo "$TARGET is not a valid git target"
+ exit 1
+fi
+
+PKGDIR=pkg
+CHROME_PKG=$PKGDIR/privacy_badger-"$TARGET".crx
+if ! [ -f "$CHROME_PKG" ] ; then
+ mv $PKGDIR/privacy-badger-"$TARGET".crx "$CHROME_PKG"
+fi
+CHROME_ALT=$PKGDIR/privacy_badger-chrome.crx
+echo "Uploading chrome package"
+cp "$CHROME_PKG" "$CHROME_ALT"
+echo Copying .crx files...
+scp "$CHROME_PKG" "$USER@$SERVER:/www/eff.org/files" || exit 1
+scp "$CHROME_ALT" "$USER@$SERVER:/www/eff.org/files" || exit 1
diff --git a/release-utils/post-release.sh b/release-utils/post-release.sh
new file mode 100755
index 0000000..4bfe00e
--- /dev/null
+++ b/release-utils/post-release.sh
@@ -0,0 +1,77 @@
+#!/bin/bash
+
+cd "$(dirname "$0")"
+source ./config.sh
+PKGDIR=../pkg
+if [ $# -ne 1 ] ; then
+ echo "Usage: $0 <version to release>"
+ exit 1
+fi
+TARGET=$1
+if ! git show release-"$TARGET" > /dev/null 2> /dev/null ; then
+ echo "$TARGET is not a valid git target"
+ exit 1
+fi
+PKG="$PKGDIR"/privacy-badger-eff-$TARGET.xpi
+ALT="$PKGDIR"/privacy-badger-eff-latest.xpi
+
+echo Copying .xpi files...
+scp "$PKG" "$USER@$SERVER:/www/eff.org/files" || exit 1
+scp "$ALT" "$USER@$SERVER:/www/eff.org/files" || exit 1
+echo Copying detached signature
+scp "$PKG".sig "$USER@$SERVER:/www/eff.org/files" || exit 1
+echo Copying Changelog.txt
+git show release-"$TARGET":doc/Changelog > /tmp/pbchangelog$$ || exit 1
+scp /tmp/pbchangelog$$ "$USER@$SERVER:/www/eff.org/files/pbChangelog.txt" || exit 1
+rm -f /tmp/changelog$$
+
+MSG=/tmp/email$$
+
+echo "Privacy Badger $TARGET has been released for all supported browsers." > $MSG
+echo "As always, you can get it from https://privacybadger.org/ or from your browser's add-on gallery." >> $MSG
+echo "" >> $MSG
+echo "Notable updates:" >> $MSG
+echo "" >> $MSG
+tail -n+5 ../doc/Changelog | sed '/^$/q' >> $MSG
+echo "For further details, consult our release notes on GitHub:" >> $MSG
+echo "https://github.com/EFForg/privacybadger/releases/tag/release-$TARGET" >> $MSG
+
+echo To send email to the mailing list...
+echo mutt -s "Privacy\ Badger\ version\ $TARGET\ released" privacybadger@eff.org '<' $MSG
+echo "Now please edit https://www.eff.org/files/privacy-badger-updates.json to include the following"
+echo ""
+echo "{"
+echo " \"version\": \"$TARGET\","
+echo " \"update_link\": \"https://eff.org/files/privacy-badger-eff-$TARGET.xpi\","
+echo " \"update_hash\": \"sha256:$(sha256sum "$PKG" | cut -c 1-64)\","
+echo " \"applications\": {"
+echo " \"gecko\": { \"strict_min_version\": \"52.0\" }"
+echo " }"
+echo "}"
+
+echo ""
+echo "AMO release notes:"
+echo ""
+echo "<ul>"
+tail -n+5 ../doc/Changelog | sed '/^$/q' | {
+ out=""
+ while IFS= read -r line; do
+ # changelog entries start with "*"
+ if [ "${line:0:1}" = "*" ]; then
+ # this is the first entry
+ if [ -z "$out" ]; then
+ out="<li>${line:2}"
+ else
+ out="$out</li>\n<li>${line:2}"
+ fi
+ # changelog entry continues
+ else
+ if [ -n "$line" ]; then
+ out="$out $line"
+ fi
+ fi
+ done
+ echo -e "$out</li>"
+}
+echo "</ul>"
+echo ""
diff --git a/scripts/chromedriver.sh b/scripts/chromedriver.sh
new file mode 100755
index 0000000..3bd55d6
--- /dev/null
+++ b/scripts/chromedriver.sh
@@ -0,0 +1,25 @@
+#!/usr/bin/env bash
+
+# stop on errors (nonzero exit codes), uninitialized vars
+set -eu
+
+TEMPFILE=$(mktemp)
+CHROME="$1"
+
+trap 'rm $TEMPFILE' EXIT
+
+# install the appropriate version of ChromeDriver
+chrome_version=$("$CHROME" --product-version | cut -d . -f 1-3)
+chromedriver_version_url=https://chromedriver.storage.googleapis.com/LATEST_RELEASE_"$chrome_version"
+chromedriver_version=$(wget "$chromedriver_version_url" -q -O -)
+echo "Setting up ChromeDriver version $chromedriver_version ..."
+chromedriver_url=https://chromedriver.storage.googleapis.com/"$chromedriver_version"/chromedriver_linux64.zip
+wget -q -O "$TEMPFILE" "$chromedriver_url"
+sudo unzip -q -o "$TEMPFILE" chromedriver -d /usr/local/bin/
+sudo chmod a+x /usr/local/bin/chromedriver
+
+# check that chromedriver is now present
+type chromedriver >/dev/null 2>&1 || {
+ echo "Failed to install ChromeDriver!"
+ exit 1
+}
diff --git a/scripts/convertpsl.py b/scripts/convertpsl.py
new file mode 100755
index 0000000..3cd78be
--- /dev/null
+++ b/scripts/convertpsl.py
@@ -0,0 +1,36 @@
+#!/usr/bin/env python
+
+# script based on
+# https://github.com/adblockplus/buildtools/blob/d090e00610a58cebc78478ae33e896e6b949fc12/publicSuffixListUpdater.py
+
+from __future__ import print_function
+
+import json
+import sys
+
+def convert(psl_text):
+ suffixes = {}
+
+ for line in psl_text:
+ line = line.rstrip()
+ if line.startswith('//') or '.' not in line:
+ continue
+ if line.startswith('*.'):
+ suffixes[line[2:]] = 2
+ elif line.startswith('!'):
+ suffixes[line[1:]] = 0
+ else:
+ suffixes[line] = 1
+
+ return suffixes
+
+
+if __name__ == '__main__':
+ with open(sys.argv[1], 'r+') as f:
+ psl = convert(f)
+ f.seek(0)
+ text = 'window.publicSuffixes = %s;' % (
+ json.dumps(psl, sort_keys=True, indent=2, separators=(',', ': '))
+ )
+ print(text, file=f)
+ f.truncate()
diff --git a/scripts/fix_placeholders.py b/scripts/fix_placeholders.py
new file mode 100755
index 0000000..e940dcc
--- /dev/null
+++ b/scripts/fix_placeholders.py
@@ -0,0 +1,40 @@
+#!/usr/bin/env python3
+
+import json
+
+from collections import OrderedDict
+from glob import glob
+
+SOURCE_LOCALE = 'src/_locales/en_US/messages.json'
+
+
+def fix_locale(locale, placeholder_keys):
+ # read in locale, preserving existing ordering
+ with open(locale, 'r') as f:
+ data = json.load(f, object_pairs_hook=OrderedDict)
+
+ # restore missing placeholders
+ for key in placeholder_keys:
+ if key in data and "placeholders" not in data[key]:
+ data[key]["placeholders"] = source_data[key]["placeholders"]
+
+ with open(locale, 'w') as f:
+ json.dump(data, f, ensure_ascii=False, indent=4)
+
+
+if __name__ == '__main__':
+ with open(SOURCE_LOCALE, 'r') as f:
+ source_data = json.load(f, object_pairs_hook=OrderedDict)
+
+ # get keys of locale messages with placeholders
+ placeholder_keys = []
+ for key in source_data:
+ if "placeholders" in source_data[key]:
+ placeholder_keys.append(key)
+
+ # fix all locales
+ for locale in glob('src/_locales/*/*.json'):
+ if locale == SOURCE_LOCALE:
+ continue
+
+ fix_locale(locale, placeholder_keys)
diff --git a/scripts/generate-legacy-yellowlist.sh b/scripts/generate-legacy-yellowlist.sh
new file mode 100755
index 0000000..b74712e
--- /dev/null
+++ b/scripts/generate-legacy-yellowlist.sh
@@ -0,0 +1 @@
+sed -e "s/^\([^\!].*\)$/@@||\1^\$third-party/g" src/data/yellowlist.txt
diff --git a/scripts/run_travis.sh b/scripts/run_travis.sh
new file mode 100755
index 0000000..fa20fdb
--- /dev/null
+++ b/scripts/run_travis.sh
@@ -0,0 +1,36 @@
+#!/usr/bin/env bash
+
+toplevel=$(git rev-parse --show-toplevel)
+testdir=${toplevel}/tests/selenium
+
+function run_lint {
+ if ! make -C "$toplevel" lint; then
+ echo "Linting errors"
+ exit 1
+ fi
+}
+
+function run_selenium {
+ # autodiscover and run the tests
+ pytest --capture=no --verbose --durations=10 "$testdir"
+}
+
+if [ "$INFO" == "lint" ]; then
+ echo "running lint tests"
+ run_lint
+else
+ case $BROWSER in
+ *chrome*)
+ echo "running tests on chrome"
+ run_selenium
+ ;;
+ *firefox*)
+ echo "running tests on firefox"
+ run_selenium
+ ;;
+ *)
+ echo "bad INFO variable, got $INFO"
+ exit 1
+ ;;
+ esac
+fi
diff --git a/scripts/setup_travis.sh b/scripts/setup_travis.sh
new file mode 100755
index 0000000..5e4bbf0
--- /dev/null
+++ b/scripts/setup_travis.sh
@@ -0,0 +1,79 @@
+#!/usr/bin/env bash
+
+# stop on errors (nonzero exit codes), uninitialized vars
+set -eu
+
+toplevel=$(git rev-parse --show-toplevel)
+
+function setup_firefox {
+ # Install the latest version of geckodriver
+ version=$(curl -sI https://github.com/mozilla/geckodriver/releases/latest | grep -i "^Location: " | sed 's/.*\///' | tr -d '\r')
+
+ # check that we got something
+ if [ -z "$version" ]; then
+ echo "Failed to determine the latest geckodriver version!"
+ exit 1
+ fi
+
+ # Geckodriver distribution is MacOS or Linux specific
+ os="$(uname -s)"
+ if [[ $os == "Darwin" ]]; then
+ os_dist="macos.tar.gz"
+ else
+ os_dist="linux64.tar.gz"
+ fi
+
+ echo "Setting up geckodriver version $version ..."
+ url="https://github.com/mozilla/geckodriver/releases/download/${version}/geckodriver-${version}-${os_dist}"
+ wget -q -O /tmp/geckodriver.tar.gz "$url"
+ sudo tar -xvf /tmp/geckodriver.tar.gz -C /usr/local/bin/
+ sudo chmod a+x /usr/local/bin/geckodriver
+
+ # check that geckodriver is now present
+ type geckodriver >/dev/null 2>&1 || {
+ echo "Failed to install geckodriver!"
+ exit 1
+ }
+}
+
+function browser_setup {
+ # install python stuff
+ pip install -r "$toplevel"/tests/requirements.txt
+}
+
+function setup_lint {
+ # "--production" to skip installing devDependencies modules
+ npm install --production || exit 1
+}
+
+# check that the desired browser is present as it might fail to install
+# for example: https://travis-ci.org/EFForg/privacybadger/jobs/362381214
+function check_browser {
+ type "$BROWSER" >/dev/null 2>&1 || {
+ echo "$BROWSER seems to be missing!"
+ exit 1
+ }
+
+ # print the version
+ echo "Found $("$BROWSER" --version)"
+}
+
+case $INFO in
+ *chrome*)
+ check_browser
+ "$toplevel"/scripts/chromedriver.sh "$BROWSER"
+ browser_setup
+ ;;
+ *firefox*) # Install the latest version of geckodriver
+ check_browser
+ setup_firefox
+ browser_setup
+ ;;
+ *lint*)
+ setup_lint
+ ;;
+ *)
+ echo "bad INFO variable, got $INFO"
+ exit 1
+ ;;
+esac
diff --git a/scripts/updategoogle.py b/scripts/updategoogle.py
new file mode 100755
index 0000000..a3046d4
--- /dev/null
+++ b/scripts/updategoogle.py
@@ -0,0 +1,51 @@
+#!/usr/bin/env python3
+
+import json
+import sys
+
+from collections import OrderedDict
+
+def convert(text):
+ patterns = []
+ for domain in text.split():
+ patterns.append("https://www" + domain + "/*")
+ patterns.append("http://www" + domain + "/*")
+ return patterns
+
+def update_manifest(tempfile_path, manifest_path):
+ with open(manifest_path, 'r') as f:
+ manifest = json.load(f, object_pairs_hook=OrderedDict)
+
+ with open(tempfile_path, 'r+') as f:
+ # tempfile_path contains Google's supported domains
+ match_patterns = convert(f.read())
+
+ scripts_idx = -1
+ for idx, entry in enumerate(manifest['content_scripts']):
+ if "js/firstparties/google-search.js" in entry['js']:
+ scripts_idx = idx
+ break
+ if scripts_idx == -1:
+ print("Failed to locate the Google Search content script in the manifest!")
+ sys.exit(1)
+
+ manifest['content_scripts'][scripts_idx]['matches'] = match_patterns
+
+ # overwrite tempfile_path with the updated manifest
+ f.seek(0)
+ # print() auto-adds a trailing newline
+ print(
+ json.dumps(
+ manifest,
+ sort_keys=False,
+ indent=2,
+ separators=(',', ': ')
+ ),
+ file=f
+ )
+ f.truncate()
+
+if __name__ == '__main__':
+ # argv[1]: the path to a copy of https://www.google.com/supported_domains
+ # argv[2]: the path to the extension manifest
+ update_manifest(sys.argv[1], sys.argv[2])
diff --git a/scripts/updategoogle.sh b/scripts/updategoogle.sh
new file mode 100755
index 0000000..d446861
--- /dev/null
+++ b/scripts/updategoogle.sh
@@ -0,0 +1,27 @@
+#!/usr/bin/env bash
+
+# stop on errors (nonzero exit codes), uninitialized vars
+set -eu
+
+GOOGLE_DOMAINS_URL=https://www.google.com/supported_domains
+MANIFEST_PATH=src/manifest.json
+TEMPFILE=$(mktemp)
+
+trap 'rm $TEMPFILE' EXIT
+
+echo "fetching Google Search domains ..."
+if wget -q -T 30 -O "$TEMPFILE" -- $GOOGLE_DOMAINS_URL && [ -s "$TEMPFILE" ]; then
+ ./scripts/updategoogle.py "$TEMPFILE" "$MANIFEST_PATH"
+ if cmp -s "$TEMPFILE" $MANIFEST_PATH; then
+ echo " no Google Search domain updates"
+ else
+ cp "$TEMPFILE" $MANIFEST_PATH
+ echo " updated Google Search domains in $MANIFEST_PATH"
+ echo " please verify, update Google's MDFP list, and commit both!"
+ exit 1
+ fi
+else
+ echo " failed to fetch $GOOGLE_DOMAINS_URL"
+ echo " aborting build!"
+ exit 1
+fi
diff --git a/scripts/updatepsl.sh b/scripts/updatepsl.sh
new file mode 100755
index 0000000..fa91741
--- /dev/null
+++ b/scripts/updatepsl.sh
@@ -0,0 +1,28 @@
+#!/usr/bin/env bash
+# Update the Public Suffix List (psl)
+
+# stop on errors (nonzero exit codes), uninitialized vars
+set -eu
+
+PSL_PATH=src/lib/publicSuffixList.js
+PSL_URL=https://publicsuffix.org/list/public_suffix_list.dat
+TEMPFILE=$(mktemp)
+
+trap 'rm $TEMPFILE' EXIT
+
+echo "fetching Public Suffix List ..."
+if wget -q -T 30 -O "$TEMPFILE" -- $PSL_URL && [ -s "$TEMPFILE" ]; then
+ python scripts/convertpsl.py "$TEMPFILE"
+ if cmp -s "$TEMPFILE" $PSL_PATH; then
+ echo " no PSL updates"
+ else
+ cp "$TEMPFILE" $PSL_PATH
+ echo " updated PSL at $PSL_PATH"
+ echo " please verify and commit!"
+ exit 1
+ fi
+else
+ echo " failed to fetch PSL from $PSL_URL"
+ echo " aborting build!"
+ exit 1
+fi
diff --git a/scripts/updateseeddata.sh b/scripts/updateseeddata.sh
new file mode 100755
index 0000000..bb1d221
--- /dev/null
+++ b/scripts/updateseeddata.sh
@@ -0,0 +1,33 @@
+#!/usr/bin/env bash
+# Update the pre-trained "seed" tracker list
+
+# stop on errors (nonzero exit codes), uninitialized vars
+set -eu
+
+SEED_PATH=src/data/seed.json
+SEED_URL=https://raw.githubusercontent.com/EFForg/badger-sett/master/results.json
+TEMPFILE=$(mktemp)
+
+trap 'rm $TEMPFILE' EXIT
+
+echo "fetching seed tracker lists..."
+if wget -q -T 30 -O "$TEMPFILE" -- $SEED_URL && [ -s "$TEMPFILE" ]; then
+ if ! python scripts/verify_json.py "$TEMPFILE"; then
+ echo " new seed data is not formatted correctly"
+ echo " aborting build!"
+ exit 1
+ fi
+
+ if cmp -s "$TEMPFILE" $SEED_PATH; then
+ echo " no seed data updates"
+ else
+ cp "$TEMPFILE" $SEED_PATH
+ echo " updated seed data at $SEED_PATH"
+ echo " please verify and commit!"
+ exit 1
+ fi
+else
+ echo " failed to fetch seed data from $SEED_URL"
+ echo " aborting build!"
+ exit 1
+fi
diff --git a/scripts/verify_json.py b/scripts/verify_json.py
new file mode 100644
index 0000000..e5a17ac
--- /dev/null
+++ b/scripts/verify_json.py
@@ -0,0 +1,18 @@
+#!/usr/bin/env python3
+
+import json
+import sys
+
+KEYS = set(['snitch_map', 'action_map', 'version'])
+
+with open(sys.argv[1]) as f:
+ try:
+ js = json.load(f)
+ if set(js.keys()) == KEYS:
+ sys.exit(0)
+ else:
+ print("json keys %s are not correct" % js.keys())
+ sys.exit(1)
+ except Exception as e:
+ print("error parsing json:", e)
+ sys.exit(1)
diff --git a/src/_locales/ar/messages.json b/src/_locales/ar/messages.json
new file mode 100644
index 0000000..4c424d3
--- /dev/null
+++ b/src/_locales/ar/messages.json
@@ -0,0 +1,677 @@
+{
+ "badger_status_block": {
+ "message": "$DOMAIN$ محجوب",
+ "description": "Tooltip shown when you hover over a domain name with a red slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "invalid_json": {
+ "message": "ملف JSON غير سليم.",
+ "description": ""
+ },
+ "options_remove_origin_confirm": {
+ "message": "أمتأكد أنك تريد إزالة النطاق من «غرير الخصوصية»",
+ "description": "Confirmation shown when you click to remove a domain from Privacy Badger's tracking domains list on the options page."
+ },
+ "badger_status_noaction": {
+ "message": "لا تَعقب للنطاق $DOMAIN$",
+ "description": "Tooltip shown when you hover over a non-tracking domain name with a green slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "non_tracker_tip": {
+ "message": "حاليا «غرير الخصوصية» لا يتحقق إلا من كون الأطراف الخارجية تستخدم الكعكات، أو تخزين HTML5 المحلي، أو بصمات مساحة الرسم لتعقب تصفحك. ربما تستخدم بعض هذه النطاقات طرقًا أخرى لا يستطيع «غرير الخصوصية» اكتشافها.",
+ "description": ""
+ },
+ "options_dnt_policy_setting": {
+ "message": "تحقق من كون <a target='_blank' href='https://www.eff.org/privacybadger/faq#What-is-a-third-party-tracker'>نطاقات الأطراف الخارحية</a> تلتزم <a target='_blank' href='https://www.eff.org/dnt-policy'>سياسة EFF لعدم التعقب</a>",
+ "description": "Checkbox label on the general settings page"
+ },
+ "invalid_domain": {
+ "message": "رجاء أضف مسارا أو نطاقا صحيحا.",
+ "description": ""
+ },
+ "donate_to_eff": {
+ "message": "تبرع إلى EFF",
+ "description": "Button shown in the popup and on the intro page."
+ },
+ "intro_donate_subheading": {
+ "message": "ساعدنا بالتبرع ونشر دعمك لأدواتنا",
+ "description": "Shown below the Donate button on the intro page."
+ },
+ "intro_not_an_adblocker": {
+ "message": "لست حاجبًا للإعلانات، أنا مختلف",
+ "description": "Intro page paragraph heading."
+ },
+ "report_success": {
+ "message": "شكرا، سنفحص الأمر.",
+ "description": ""
+ },
+ "dnt_tooltip": {
+ "message": "يعِد هذا النطاق بألا يتعقبك",
+ "description": "Tooltip shown when you hover over a DNT-compliant domain name in the list of domains in the popup or under the Tracking Domains tab on the options page."
+ },
+ "breakage_warning_tooltip": {
+ "message": "Blocking this domain is known to break websites",
+ "description": "Tooltip for a warning icon that appears when move a domain slider to 'red' (block) for a domain that was automatically set to 'yellow' (block cookies)."
+ },
+ "feed_the_badger_title": {
+ "message": "Click to return control of this domain to Privacy Badger",
+ "description": "Tooltip shown when you hover over an undo arrow that appears when you move a domain slider away from its automatic setting."
+ },
+ "next_section": {
+ "message": "القسم التالي",
+ "description": "Image alt. text on a couple of \"scroll down\" arrow buttons on the intro page."
+ },
+ "extension_error_text": {
+ "message": "رجاء <a href='https://www.eff.org/privacybadger#faq-I-found-a-bug!-What-do-I-do-now?' target='_blank'>أخبرنا</a> بتفاصيل العطل التالي:",
+ "description": "Shown in the popup when there is a problem with the user's Privacy Badger extension that we want to encourage the user to tell us about."
+ },
+ "data_settings": {
+ "message": "أدِر البيانات",
+ "description": "This is an options page tab heading."
+ },
+ "report_title": {
+ "message": "أبلغ عن عطل",
+ "description": ""
+ },
+ "whitelist_form_domain_input_placeholder": {
+ "message": "مثلا: www.domain.com، أو ‪*.domain.net‬، أو domain.org",
+ "description": "Placeholder text for the Add domain input under the Disabled Sites tab on the options page."
+ },
+ "domain_slider_cookieblock_tooltip": {
+ "message": "انقر هنا لحجب هذا النطاق من إضافة كعكات",
+ "description": "Tooltip shown when you hover over the center part of a slider shown for each domain in the domain list."
+ },
+ "options_domain_filter_block": {
+ "message": "المحجوب",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "options_webrtc_setting": {
+ "message": "امنع WebRTC من تسريب عناوين الإنترنت المحلية",
+ "description": "Checkbox label on the general settings page"
+ },
+ "intro_welcome": {
+ "message": "يتعلم «غرير الخصوصية» تلقائيا كيف يحجب المتعقبات الخفية. خذ دقيقة من وقتك لتعرف كيف يحدث هذا.",
+ "description": "Intro page welcome paragraph."
+ },
+ "error_input": {
+ "message": "ما المشكلة؟",
+ "description": ""
+ },
+ "options_domain_list_tab": {
+ "message": "النطاقات المتعقِّبة",
+ "description": "This is an options page tab heading."
+ },
+ "share_button_title_twitter": {
+ "message": "شارك على تويتر",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "first_run_text": {
+ "message": "تعرف كيف يحمي «غرير الخصوصية» خصوصيتك",
+ "description": "Part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "download": {
+ "message": "نزّل",
+ "description": ""
+ },
+ "import": {
+ "message": "استورد",
+ "description": ""
+ },
+ "options_hide_social_widgets": {
+ "message": "Don't replace the following widgets:",
+ "description": "Multiple selection box on the widget replacement tab"
+ },
+ "options_social_widgets_checkbox": {
+ "message": "Enable widget replacement",
+ "description": "Checkbox label on the widget replacement tab"
+ },
+ "options_show_nontracking_domains_checkbox": {
+ "message": "Show domains that don't appear to be tracking you",
+ "description": "Checkbox label on the general settings page. Should match wording used in the 'non_tracker' message."
+ },
+ "report_button": {
+ "message": "أرسل العطل",
+ "description": ""
+ },
+ "badger_status_allow": {
+ "message": "$DOMAIN$ غير محجوب",
+ "description": "Tooltip shown when you hover over a tracking but still allowed (green slider) domain name in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "privacy_badger_what_is": {
+ "message": "ما «غرير الخصوصية»؟",
+ "description": ""
+ },
+ "options_domain_search": {
+ "message": "ابحث في النطاقات:",
+ "description": "Label for a text input box on the Tracking Domains options page tab."
+ },
+ "options_learn_setting": {
+ "message": "Learn to block new trackers from your browsing",
+ "description": "Checkbox label on the general settings page"
+ },
+ "local_learning_warning": {
+ "message": "Enabling learning may make you more identifiable to websites",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_incognito_setting": {
+ "message": "تعلم في نوافذ التصفح الخاص",
+ "description": "Checkbox label on the general settings page"
+ },
+ "options_incognito_warning": {
+ "message": "تفعيل التعلم في نوافذ التصفح الخاص قد يترك آثارا لتأريخ تصفحك الخاص على حاسوبك. مبدئيا سيحجب «غرير الخصوصية» المتعقبات التي يعرفها من قبل في نوافذ التصفح الخاص، لكنه لن يتعلم أي متعقبات جديدة. قد تريد تفعيل هذا الخيار إن كان الكثير من تصفحك في نوافذ خاصة.",
+ "description": "Tooltip on the general settings page"
+ },
+ "learning_prompt_text1": {
+ "message": "Privacy Badger will no longer learn from your browsing by default.",
+ "description": "First part of a prompt to visit the blog."
+ },
+ "learning_prompt_text2": {
+ "message": "Click below to learn more.",
+ "description": "Second part of a prompt to visit the blog."
+ },
+ "learning_prompt_button": {
+ "message": "Learn how Privacy Badger is changing",
+ "description": "Button text, part of a prompt to visit the blog."
+ },
+ "show_counter_checkbox": {
+ "message": "Show count of trackers",
+ "description": "Checkbox label on the general settings page"
+ },
+ "what_is_a_tracker": {
+ "message": "ما المتعقب؟",
+ "description": "Tooltip that comes up when you hover over the 'tracking domains' link under the Tracking Domains tab on the options page."
+ },
+ "intro_report_button": {
+ "message": "رجاء لا تنس النقر على ”هل أفسد «غرير الخصوصية» هذا الموقع“. لأننا نحترم خصوصيتك لا نرسل أي بلاغات تلقائية.",
+ "description": "Intro page paragraph. The quoted message ('Did Privacy Badger break this site') should match the first part of the translation for the 'report_broken_site' message."
+ },
+ "options_title": {
+ "message": "خيارات «غرير الخصوصية»",
+ "description": ""
+ },
+ "report_terms": {
+ "message": "This will automatically send the following information to EFF: the page you're currently visiting, your browser version, the version of Privacy Badger, and the state of all of the sliders on this page.",
+ "description": ""
+ },
+ "whitelisted_domains": {
+ "message": "المواقع غير المفعلة",
+ "description": "This is an options page tab heading."
+ },
+ "popup_enable_for_site": {
+ "message": "فعّل «غرير الخصوصية» على هذا الموقع",
+ "description": ""
+ },
+ "options_domain_type_filter": {
+ "message": "رشّح بالنوع:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "import_successful": {
+ "message": "حُدثت قائمة المتعقبات و إعداداتها بنجاح.",
+ "description": ""
+ },
+ "export_user_data": {
+ "message": "صدّر بيانات المستخدم",
+ "description": ""
+ },
+ "manage_data_intro": {
+ "message": "استيراد بيانات المستخدم: <ul><li>يكتب فوق قيم الإعدادات العامة</li><li>يدمج قوائم المواقع غير المفعلة</li><li>يدمج معلومات المتعقبات التي رآها «غرير الخصوصية»</li><li>يكتب فوق إعدادات المواقع</li></ul>",
+ "description": "A brief explanation of what happens when you import Badger user data. Shown above the import/export user data buttons under the Manage Data options page tab."
+ },
+ "reset": {
+ "message": "أعِد إلى الأصل",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "reset_data": {
+ "message": "أعِد النطاقات المتعقِّبة إلى أصلها",
+ "description": "Caption above reset button"
+ },
+ "reset_data_confirm": {
+ "message": "إعادة النطاقات المتعقِّبة إلى أصلها:\n\n • سيحذف كل البيانات التي تعلمها «غرير الخصوصية» عن هذه النطاقات أثناء تصفحك\n • سيعيد قائمة النطاقات المتعقِّبة إلى آخر قائمة قبل التعلم (زر www.eff.org/badger-pretraining لمزيد من المعلومات)",
+ "description": "Pop-up triggered when the reset_data button is clicked"
+ },
+ "remove_all": {
+ "message": "أزل الكل",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "remove_all_data": {
+ "message": "أزل كل النطاقات المتعقِّبة",
+ "description": "Caption above remove_all button"
+ },
+ "remove_all_data_confirm": {
+ "message": "إزالة كل النطاقات المتعقِّبة:\n\n • سيحذف كل ما يعرفه «غرير الخصوصية» عن المتعقبات\n • سيمنع «غرير الخصوصية» من حجب أي شيء إلى أن يعيد التعلم من تصفحك",
+ "description": "Pop-up triggered when the remove_all_data button is clicked"
+ },
+ "intro_text1": {
+ "message": "يحميك «غرير الخصوصية» الآن.",
+ "description": "First part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "intro_text2": {
+ "message": "انقر أدناه لتطلع أكثر على كيف يعمل.",
+ "description": "Second part of a reminder to visit the intro page"
+ },
+ "options_webrtc_warning": {
+ "message": "يمكن أن يسرب WebRTC عنواوين الإنترنت (IP) المحلية. لاحظ أن تفعيل هذا الخيار قد يقلل من أداء برمجيات الاجتماعات على الوب مثل Google Hangouts.",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_general_settings": {
+ "message": "الإعدادات العامة",
+ "description": "This is an options page tab heading."
+ },
+ "options_privacy_settings": {
+ "message": "Privacy",
+ "description": "Subheading on the general settings options page."
+ },
+ "options_advanced_settings": {
+ "message": "Advanced",
+ "description": "Subheading on the general settings options page."
+ },
+ "intro_next_button": {
+ "message": "خذ جولة",
+ "description": "Intro page welcome button."
+ },
+ "domain_slider_block_tooltip": {
+ "message": "انقر هنا لحجب هذا النطاق تماما",
+ "description": "Tooltip shown when you hover over the leftmost part of a slider shown for each domain in the domain list."
+ },
+ "version": {
+ "message": "إصدارة $VERSION_STRING$",
+ "description": "Shows Privacy Badger's version in the popup. For example, \"version 2018.8.1\".",
+ "placeholders": {
+ "version_string": {
+ "content": "$1",
+ "example": "2018.8.1"
+ }
+ }
+ },
+ "badger_status_cookieblock": {
+ "message": "الكعكات محجوبة من النطاق $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a yellow slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "options_domain_filter_cookieblock": {
+ "message": "المحجوب جزئيا",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "show_tracking_domains_acknowledgement": {
+ "message": "أفهم هذا؛ أرني رجاء قائمة المتعقبات",
+ "description": "Acknowledgement shown next to the checkbox required to reveal the tracking domains list on the options page."
+ },
+ "firstRun_title": {
+ "message": "شكرا على تنصيب «غرير الخصوصية»",
+ "description": ""
+ },
+ "import_select_file": {
+ "message": "رجاء اختر ملفا لاستيراده",
+ "description": ""
+ },
+ "report_broken_site": {
+ "message": "هل أفسد «غرير الخصوصية» هذا الموقع؟ أعلمنا بهذا.",
+ "description": "Button in the popup."
+ },
+ "tooltip_cookieblock": {
+ "message": "وسط المؤشر لحجب الكعكات",
+ "description": ""
+ },
+ "intro_learns": {
+ "message": "Learns automatically",
+ "description": "Intro page paragraph heading"
+ },
+ "intro_learns_paragraph": {
+ "message": "Instead of keeping lists of what to block, Privacy Badger automatically discovers trackers based on their behavior.",
+ "description": "Intro page paragraph"
+ },
+ "intro_beyond_ads": {
+ "message": "يمسك بالمتعقبات المتخفية",
+ "description": "Intro page paragraph heading."
+ },
+ "intro_beyond_ads_paragraph": {
+ "message": "Invisible tracking happens in all sorts of ways; ads are just the visible tip of the iceberg. Privacy Badger sends the <a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control signal</a>, to opt you out of data sharing and selling, and the <a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track signal</a> to tell companies not to track you. If they ignore your wishes, Privacy Badger will learn to block them—whether they are advertisers or trackers of other kinds.",
+ "description": "Intro page paragraph."
+ },
+ "report_close": {
+ "message": "أغلق",
+ "description": ""
+ },
+ "import_user_data": {
+ "message": "استورد بيانات المستخدم",
+ "description": ""
+ },
+ "options_domain_filter_dnt": {
+ "message": "متوافق مع ”لا تتعقبني“",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "popup_help_button": {
+ "message": "مساعدة",
+ "description": "Tooltip that comes up when you hover over the question mark button in the upper right corner of the popup."
+ },
+ "options_domain_filter_allow": {
+ "message": "المسموح به",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "intro_donate_heading": {
+ "message": "الخصوصية رياضة جماعية",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "show_tracking_domains_message": {
+ "message": "يفترض ألا تحتاج لتغيير أي شيء هنا.",
+ "description": "Shown above the acknowledgement checkbox required to reveal the tracking domains list on the options page. This is the second paragraph; the first paragraph is the message under the \"intro_not_an_adblocker_paragraph\" key."
+ },
+ "options_domain_filter_all": {
+ "message": "الكل",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "report_cancel": {
+ "message": "ألغ",
+ "description": ""
+ },
+ "tooltip_block": {
+ "message": "حرك المؤشر شمالا لحجب النطاق",
+ "description": ""
+ },
+ "options_enable_dnt_checkbox": {
+ "message": "Send websites the \"<a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>\" and \"<a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>\" signals",
+ "description": "Checkbox label for enabling/disabling the Sec-GPC and DNT signals, found on the general settings page"
+ },
+ "options_disable_google_nav_error_service": {
+ "message": "Disable sending web addresses you visit to Google. This disables suggestions for similar pages when a page can't be found.",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_disable_hyperlink_auditing": {
+ "message": "Disable hyperlink auditing",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_domain_filter_user": {
+ "message": "تحت تحكم المستخدم",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "disabled_for_these_domains": {
+ "message": "<p>Privacy Badger is disabled on the following sites. This means that Privacy Badger will not block anything when you visit the sites listed here, and it will not send the Do Not Track or Global Privacy Control signals.</p><p>If you think Privacy Badger is breaking a page, or you would like to allow a particular site to share or sell your data, you can type that page's domain in the box below and click the \"Add domain\" button.</p><p>Alternatively, when you already have the page's tab selected, you can just click on Privacy Badger's button in the browser toolbar and then click the \"Disable\" button.</p>",
+ "description": ""
+ },
+ "popup_instructions": {
+ "message": "$COUNT$ potential $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Popup message shown when at least one tracker was blocked.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_instructions_no_trackers": {
+ "message": "No $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Text shown in the popup when there are no trackers on the page.",
+ "placeholders": {
+ "link_start": {
+ "content": "$1",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_blocked": {
+ "message": "There are no third party resources on this page. Hooray for privacy!",
+ "description": "Text shown in the popup when showing non-tracking domains is enabled, and there are no third-party domains on the page."
+ },
+ "intro_by_eff": {
+ "message": "مشروع من مؤسسة الجبهة الإلكترونية (Electronic Frontier Foundation)",
+ "description": ""
+ },
+ "add_domain_button": {
+ "message": "أضف النطاق",
+ "description": ""
+ },
+ "tooltip_allow": {
+ "message": "حرك المؤشر يمينا للسماح بالنطاق",
+ "description": ""
+ },
+ "popup_disable_for_site": {
+ "message": "عطّل «غرير الخصوصية» على هذا الموقع",
+ "description": "Button in the popup."
+ },
+ "domain_slider_allow_tooltip": {
+ "message": "انقر هنا للسماح بهذا النطاق",
+ "description": "Tooltip shown when you hover over the rightmost part of a slider shown for each domain in the domain list."
+ },
+ "intro_privacy_note": {
+ "message": "لن يشارك «غرير الخصوصية» أبدا أي معلومات عن تصفحك إلا إن اخترت أن تشاركها.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_list_trackers": {
+ "message": "Privacy Badger has decided to block $COUNT$ potential $TRACKER_LINK_START$tracking domains$TRACKER_LINK_END$ so far",
+ "description": "Shown on the Tracking Domains tab on the options page after Privacy Badger learned to block one or more domains",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "900"
+ },
+ "tracker_link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "tracker_link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "options_domain_list_no_trackers": {
+ "message": "لم يكتشف «غرير الخصوصية» أي <a target='_blank' tabindex=-1 title='i18n_what_is_a_tracker' class='tooltip' href='https://www.eff.org/privacybadger#faq-What-is-a-third-party-tracker?'>نطاقات متعقِّبة</a> حتى الآن. واصل تصفحك.",
+ "description": "Shown on the Tracking Domains tab on the options page if all tracking domains have been removed."
+ },
+ "name": {
+ "message": "«غرير الخصوصية»",
+ "description": ""
+ },
+ "intro_not_an_adblocker_paragraph": {
+ "message": "يبدأ «غرير الخصوصية» في الحجب ما إن يرى نفس المتعقب على ثلاثة مواقع مختلفة. ثلاث فرص ثم يخرج!",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_status_filter": {
+ "message": "رشّح بالحالة:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "report_text": {
+ "message": "صف العطل باختصار أدناه.",
+ "description": ""
+ },
+ "remove_button": {
+ "message": "أزل المحدد",
+ "description": "This is the label for the 'Remove selected' buttons."
+ },
+ "intro_donate1": {
+ "message": "باستخدامك «غرير الخصوصية» تنضم إلى <a href='https://www.eff.org/' target='_blank'>مؤسسة الجبهة الإلكترونية</a> و ملايين المستخدمين في قتالهم من أجل الخصوصية. نحن مؤسسة غير ربحية نقاتل لحقوقك على الإنترنت. شكرًا لانضمامك إلينا.",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "options_domain_search_tooltip": {
+ "message": "لاستبعاد النطاقات، ضع ”-“ قبل عبارة البحث. فمثلا، ”‪.co -.com‬“ ستظهر نطاقات ‪.co‬ و ‪.co.uk‬ لكن لن تظهر نطاقات ‪.com‬ في نتائج البحث.",
+ "description": "Tooltip for an \"information\" icon next to the domain search input on the Tracking Domains options page tab."
+ },
+ "intro_disable_button": {
+ "message": "إذا كنت تظن أن «غرير الخصوصية» يفسد إحدى الصفحات (الفديو لا يعمل مثلا)، فيمكنك النقر على زر ’عطّل‘ لتعطيل «غرير الخصوصية» على هذا الموقع.",
+ "description": "Intro page paragraph. The quoted string ('Disable') should match the verb used for the 'popup_disable_for_site' message."
+ },
+ "intro_link_policy": {
+ "message": "سياسة الخصوصية",
+ "description": "Shown at the bottom of the intro page, links to the EFF software and technology projects privacy policy."
+ },
+ "report_input_label": {
+ "message": "الوصف",
+ "description": ""
+ },
+ "not_yet_blocked_header": {
+ "message": "Your Badger hasn't decided yet if these domains should get blocked",
+ "description": "Popup domain list header text; separates blocked from haven't-yet-seen-enough-to-block potential trackers."
+ },
+ "options_show_not_yet_blocked": {
+ "message": "Show domains your Badger hasn't decided yet to block:",
+ "description": "Label for a checkbox on the Tracking Domains options page tab. Should match wording used in the 'not_yet_blocked_header' message."
+ },
+ "non_tracker": {
+ "message": "لا يظهر أن النطاقات التالية تتعقبك",
+ "description": "Header text; separates tracking from non-tracking domains in the popup."
+ },
+ "popup_options_button": {
+ "message": "الخيارات",
+ "description": ""
+ },
+ "share_button_title_facebook": {
+ "message": "شارك على فيسبوك",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "description": {
+ "message": "يتعلم «غرير الخصوصية» تلقائيا أن يحجب المتعقبات الخفية.",
+ "description": ""
+ },
+ "report_fail": {
+ "message": "حدث عطل ما.",
+ "description": ""
+ },
+ "social_tooltip_pb_has_replaced": {
+ "message": "استبدل «غرير الخصوصية» زر $BUTTON$ هذا",
+ "description": "Tooltip shown over a replaced social button. For example, \"Privacy Badger has replaced this Facebook Like button\". See also the widget_placeholder_pb_has_replaced message.",
+ "placeholders": {
+ "button": {
+ "content": "$1",
+ "example": "Facebook Like"
+ }
+ }
+ },
+ "widget_placeholder_pb_has_replaced": {
+ "message": "Privacy Badger has replaced this $WIDGET$ widget",
+ "description": "Text shown inside a replaced widget's placeholder. For example, \"Privacy Badger has replaced this Google reCAPTCHA widget\". See also the social_tooltip_pb_has_replaced message.",
+ "placeholders": {
+ "widget": {
+ "content": "$1",
+ "example": "Google reCAPTCHA"
+ }
+ }
+ },
+ "allow_once": {
+ "message": "Allow once",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking it will allow the third-party widget to load this one time only."
+ },
+ "allow_on_site": {
+ "message": "Always allow on this site",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking this button will always allow the widget to load on this particular site."
+ },
+ "sync_intro": {
+ "message": "مزامنة السحاب:<ul><li>تحتاج إلى مزامنة فيرفكس\\كروم</li><li>الرفع يكتب فوق أي بيانات ل‍«‍غرير الخصوصية» موجودة على السحاب.</li><li>التنزيل يدمج قائمة المواقع التي عطلت عليها «غرير الخصوصية»</li></ul>",
+ "description": "A brief explanation of how syncing works. Shown above the upload/download cloud data buttons under the Manage Data options page tab."
+ },
+ "upload": {
+ "message": "ارفع",
+ "description": "Button label for uploading data to the cloud on Manage Data options page tab."
+ },
+ "upload_cloud": {
+ "message": "صدّر المواقع غير المفعلة إلى السحاب",
+ "description": "Button title for uploading data to the cloud on Manage Data options page tab."
+ },
+ "download_cloud": {
+ "message": "استورد المواقع غير المفعلة من السحاب",
+ "description": "Button title for downloading data from the cloud on Manage Data options page tab."
+ },
+ "download_cloud_success": {
+ "message": "تم استيراد البيانات من السحاب.",
+ "description": "Message displayed to the user after successfully merging cloud data."
+ },
+ "download_cloud_failure": {
+ "message": "تعذّر تنزيل البيانات.",
+ "description": "Message displayed to the user after failing to download cloud data."
+ },
+ "upload_cloud_success": {
+ "message": "تم رفع البيانات.",
+ "description": "Message displayed to the user after successfully uploading local data."
+ },
+ "upload_cloud_failure": {
+ "message": "تعذّر رفع البيانات.",
+ "description": "Message displayed to the user after failing to upload local data."
+ },
+ "download_cloud_no_data": {
+ "message": "لم تنزّل أي بيانات من السحاب.",
+ "description": "'Error' message when there is on cloud data to download."
+ },
+ "share_title": {
+ "message": "أخبر أصدقائك",
+ "description": "Title of the share overlay."
+ },
+ "popup_share_button": {
+ "message": "شارك",
+ "description": "Tooltip that comes up when you hover over the share button in the upper right corner of the popup."
+ },
+ "share_tracker_header": {
+ "message": "Privacy Badger blocked $COUNT$ potential trackers on $DOMAIN$:",
+ "description": "Header above the list of tracking domains in the share message.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "domain": {
+ "content": "$2",
+ "example": "example.com"
+ }
+ }
+ },
+ "share_base_message": {
+ "message": "«غرير الخصوصية» (www.eff.org/privacybadger) هو امتداد للمتصفح يتعلم تلقائيا أن يحجب المتعقبات الخفية. «غرير الخصوصية» من مؤسسة الجبهة الإلكترونية، و هي منظمة غير ربحية تقاتل لحقوقك على الإنترنت.",
+ "description": "The base message that is always included in the share message."
+ },
+ "copy_button_initial": {
+ "message": "انسخ إلى الحافظة",
+ "description": "Initial text of the copy button on the share overlay."
+ },
+ "copy_button_copied": {
+ "message": "نُسِخ",
+ "description": "On-click text of the copy button on the share overlay."
+ },
+ "popup_special_page_header": {
+ "message": "Nothing to do on this page",
+ "description": "Heading for popup_special_page_paragraph"
+ },
+ "popup_special_page_paragraph": {
+ "message": "Privacy Badger doesn't work on special pages like this one. Try browsing somewhere else.",
+ "description": "Shown in the popup for special browser pages such as the New Tab page and 'about:' pages."
+ },
+ "popup_disabled_site_header": {
+ "message": "Privacy Badger is disabled on this site",
+ "description": "Shown in the popup on disabled sites."
+ },
+ "options_widget_replacement_tab": {
+ "message": "Widget Replacement",
+ "description": "Options page tab heading"
+ },
+ "options_widget_replacement_desc": {
+ "message": "When blocking social buttons and other potentially useful (video, audio, comments) widgets, Privacy Badger can replace them with click-to-activate placeholders.",
+ "description": "Introduction to the Widget Replacement tab on the options page."
+ }
+} \ No newline at end of file
diff --git a/src/_locales/bg/messages.json b/src/_locales/bg/messages.json
new file mode 100644
index 0000000..b7edfd0
--- /dev/null
+++ b/src/_locales/bg/messages.json
@@ -0,0 +1,677 @@
+{
+ "badger_status_block": {
+ "message": "Блокирах $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a red slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "invalid_json": {
+ "message": "Невалиден JSON файл.",
+ "description": ""
+ },
+ "options_remove_origin_confirm": {
+ "message": "Сигурен ли си, че искаш да премахнеш този домейн от Privacy Badger?",
+ "description": "Confirmation shown when you click to remove a domain from Privacy Badger's tracking domains list on the options page."
+ },
+ "badger_status_noaction": {
+ "message": "Няма преследвачи в $DOMAIN$",
+ "description": "Tooltip shown when you hover over a non-tracking domain name with a green slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "non_tracker_tip": {
+ "message": "Засега Privacy Badger проверява само дали трети страни ползват бисквитки, локалната памет на HTML5, или canvas fingerprinting, за да те следят. Някои от тези домейни може би използват други начини за следене, които Privacy Badger не може да засече.",
+ "description": ""
+ },
+ "options_dnt_policy_setting": {
+ "message": "Проверявай дали <a target='_blank' href='https://www.eff.org/privacybadger/faq#What-is-a-third-party-tracker'>домейните от трети страни</a> се съобразяват с <a target='_blank' href='https://www.eff.org/dnt-policy'>Do Not Track (Не ме следи) политиката на EFF</a>",
+ "description": "Checkbox label on the general settings page"
+ },
+ "invalid_domain": {
+ "message": "Моля добави валиден домейн или URL.",
+ "description": ""
+ },
+ "donate_to_eff": {
+ "message": "Подкрепи EFF",
+ "description": "Button shown in the popup and on the intro page."
+ },
+ "intro_donate_subheading": {
+ "message": "Помогни ни с дарение или като споделиш подкрепата си за инструментите ни",
+ "description": "Shown below the Donate button on the intro page."
+ },
+ "intro_not_an_adblocker": {
+ "message": "Не съм блокирач на реклами. Аз съм малко по-различен",
+ "description": "Intro page paragraph heading."
+ },
+ "report_success": {
+ "message": "Мерси! Ще разнищим проблема.",
+ "description": ""
+ },
+ "dnt_tooltip": {
+ "message": "Този домейн обещава да не те следи",
+ "description": "Tooltip shown when you hover over a DNT-compliant domain name in the list of domains in the popup or under the Tracking Domains tab on the options page."
+ },
+ "breakage_warning_tooltip": {
+ "message": "Blocking this domain is known to break websites",
+ "description": "Tooltip for a warning icon that appears when move a domain slider to 'red' (block) for a domain that was automatically set to 'yellow' (block cookies)."
+ },
+ "feed_the_badger_title": {
+ "message": "Click to return control of this domain to Privacy Badger",
+ "description": "Tooltip shown when you hover over an undo arrow that appears when you move a domain slider away from its automatic setting."
+ },
+ "next_section": {
+ "message": "следваща част",
+ "description": "Image alt. text on a couple of \"scroll down\" arrow buttons on the intro page."
+ },
+ "extension_error_text": {
+ "message": "Моля те <a href='https://www.eff.org/privacybadger#faq-I-found-a-bug!-What-do-I-do-now?' target='_blank'>кажи ни</a> за следната грешка:",
+ "description": "Shown in the popup when there is a problem with the user's Privacy Badger extension that we want to encourage the user to tell us about."
+ },
+ "data_settings": {
+ "message": "Управление на данни",
+ "description": "This is an options page tab heading."
+ },
+ "report_title": {
+ "message": "Докладвай за грешка",
+ "description": ""
+ },
+ "whitelist_form_domain_input_placeholder": {
+ "message": "например www.domain.com, *.domain.net, domain.org",
+ "description": "Placeholder text for the Add domain input under the Disabled Sites tab on the options page."
+ },
+ "domain_slider_cookieblock_tooltip": {
+ "message": "Щракни тук, за да забраниш на този домейн да оставя бисквитки",
+ "description": "Tooltip shown when you hover over the center part of a slider shown for each domain in the domain list."
+ },
+ "options_domain_filter_block": {
+ "message": "блокирани",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "options_webrtc_setting": {
+ "message": "Спри изтичането на локалния ти IP адрес през WebRTC",
+ "description": "Checkbox label on the general settings page"
+ },
+ "intro_welcome": {
+ "message": "Privacy Badger автоматично се научава да блокира невидими преследвачи. Отдели си минутка, за да видиш как.",
+ "description": "Intro page welcome paragraph."
+ },
+ "error_input": {
+ "message": "Какво не е наред?",
+ "description": ""
+ },
+ "options_domain_list_tab": {
+ "message": "Домейни-преследвачи",
+ "description": "This is an options page tab heading."
+ },
+ "share_button_title_twitter": {
+ "message": "Сподели в Twitter",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "first_run_text": {
+ "message": "Научи как Privacy Badger защитава личното ти пространство и поверителност",
+ "description": "Part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "download": {
+ "message": "Дръпни",
+ "description": ""
+ },
+ "import": {
+ "message": "Импортирай",
+ "description": ""
+ },
+ "options_hide_social_widgets": {
+ "message": "Don't replace the following widgets:",
+ "description": "Multiple selection box on the widget replacement tab"
+ },
+ "options_social_widgets_checkbox": {
+ "message": "Enable widget replacement",
+ "description": "Checkbox label on the widget replacement tab"
+ },
+ "options_show_nontracking_domains_checkbox": {
+ "message": "Show domains that don't appear to be tracking you",
+ "description": "Checkbox label on the general settings page. Should match wording used in the 'non_tracker' message."
+ },
+ "report_button": {
+ "message": "Изпрати грешката",
+ "description": ""
+ },
+ "badger_status_allow": {
+ "message": "Разреших $DOMAIN$",
+ "description": "Tooltip shown when you hover over a tracking but still allowed (green slider) domain name in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "privacy_badger_what_is": {
+ "message": "Какво е Privacy Badger?",
+ "description": ""
+ },
+ "options_domain_search": {
+ "message": "Търси в домейните:",
+ "description": "Label for a text input box on the Tracking Domains options page tab."
+ },
+ "options_learn_setting": {
+ "message": "Learn to block new trackers from your browsing",
+ "description": "Checkbox label on the general settings page"
+ },
+ "local_learning_warning": {
+ "message": "Enabling learning may make you more identifiable to websites",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_incognito_setting": {
+ "message": "Учи се в Поверителни/Инкогнито прозорци",
+ "description": "Checkbox label on the general settings page"
+ },
+ "options_incognito_warning": {
+ "message": "Ако позволиш ученето в Поверителни/Инкогнито прозорци, това може да остави на компютъра ти следи от историята, докато си сърфирал поверително. По подразбиране Privacy Badger ще блокира в Поверителните/Инкогнито прозорци преследвачите, за които вече знае, но няма да се учи за нови преследвачи. Би било полезно да включиш тази настройка, ако сърфираш редовно в Поверителни/Инкогнито прозорци.",
+ "description": "Tooltip on the general settings page"
+ },
+ "learning_prompt_text1": {
+ "message": "Privacy Badger will no longer learn from your browsing by default.",
+ "description": "First part of a prompt to visit the blog."
+ },
+ "learning_prompt_text2": {
+ "message": "Click below to learn more.",
+ "description": "Second part of a prompt to visit the blog."
+ },
+ "learning_prompt_button": {
+ "message": "Learn how Privacy Badger is changing",
+ "description": "Button text, part of a prompt to visit the blog."
+ },
+ "show_counter_checkbox": {
+ "message": "Show count of trackers",
+ "description": "Checkbox label on the general settings page"
+ },
+ "what_is_a_tracker": {
+ "message": "Какво е преследвач?",
+ "description": "Tooltip that comes up when you hover over the 'tracking domains' link under the Tracking Domains tab on the options page."
+ },
+ "intro_report_button": {
+ "message": "Моля те не забравай да щракнеш на \"Развали ли Privacy Badger този сайт\". Уважаваме личното ти пространство, така че не изпращаме автоматични доклади.",
+ "description": "Intro page paragraph. The quoted message ('Did Privacy Badger break this site') should match the first part of the translation for the 'report_broken_site' message."
+ },
+ "options_title": {
+ "message": "Настройки на Privacy Badger",
+ "description": ""
+ },
+ "report_terms": {
+ "message": "This will automatically send the following information to EFF: the page you're currently visiting, your browser version, the version of Privacy Badger, and the state of all of the sliders on this page.",
+ "description": ""
+ },
+ "whitelisted_domains": {
+ "message": "Сайтове-изключения",
+ "description": "This is an options page tab heading."
+ },
+ "popup_enable_for_site": {
+ "message": "Включи Privacy Badger за този сайт",
+ "description": ""
+ },
+ "options_domain_type_filter": {
+ "message": "Филтрирай според вид:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "import_successful": {
+ "message": "Списъкът с преследвачи и опциите бяха променени успешно!",
+ "description": ""
+ },
+ "export_user_data": {
+ "message": "Експортирай потребителските данни",
+ "description": ""
+ },
+ "manage_data_intro": {
+ "message": "Импортирането на потребителски данни:<ul><li>Презаписва общите настройки</li><li>Слива списъците със сайтове-изключения</li><li>Слива информацията за това кои преследвачи е виждал Privacy Badger</li><li>Презаписва персонализирането на плъзгачите</li></ul>",
+ "description": "A brief explanation of what happens when you import Badger user data. Shown above the import/export user data buttons under the Manage Data options page tab."
+ },
+ "reset": {
+ "message": "Започни отначало",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "reset_data": {
+ "message": "Започни отначало с домейните-преследвачи",
+ "description": "Caption above reset button"
+ },
+ "reset_data_confirm": {
+ "message": "Започването отначало с домейните-преследвачи ще:\n\n • Изтрие всички данни за преследвачи, които Privacy Badger е научил от твоето сърфиране\n • Възвърне списъка на домейните-преслевдачи към най-новия предварително трениран списък (посети www.eff.org/badger-pretraining, за да научиш повече)",
+ "description": "Pop-up triggered when the reset_data button is clicked"
+ },
+ "remove_all": {
+ "message": "Премахни всички",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "remove_all_data": {
+ "message": "Премахни всички домейни-преследвачи",
+ "description": "Caption above remove_all button"
+ },
+ "remove_all_data_confirm": {
+ "message": "Премахването на всички домейни-преследвачи ще:\n\n • Изтрие всичко, което Privacy Badger знае за преследвачите\n • Накара Privacy Badger да не блокира нищо, докато не успее да се научи наново от твоето сърфиране",
+ "description": "Pop-up triggered when the remove_all_data button is clicked"
+ },
+ "intro_text1": {
+ "message": "Privacy Badger вече те защитава.",
+ "description": "First part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "intro_text2": {
+ "message": "За да разбереш как работи Privacy Badger, щракни долу, за да ти обясни набързо.",
+ "description": "Second part of a reminder to visit the intro page"
+ },
+ "options_webrtc_warning": {
+ "message": "През WebRTC може да изтече локалния ти IP адрес. Имай предвид, че включването на тази опция може да забави някои апове за разговори, като например Google Hangouts.",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_general_settings": {
+ "message": "Общи настройки",
+ "description": "This is an options page tab heading."
+ },
+ "options_privacy_settings": {
+ "message": "Privacy",
+ "description": "Subheading on the general settings options page."
+ },
+ "options_advanced_settings": {
+ "message": "Advanced",
+ "description": "Subheading on the general settings options page."
+ },
+ "intro_next_button": {
+ "message": "Обясни ми набързо",
+ "description": "Intro page welcome button."
+ },
+ "domain_slider_block_tooltip": {
+ "message": "Щракни тук, за да блокираш този домейн напълно",
+ "description": "Tooltip shown when you hover over the leftmost part of a slider shown for each domain in the domain list."
+ },
+ "version": {
+ "message": "версия $VERSION_STRING$",
+ "description": "Shows Privacy Badger's version in the popup. For example, \"version 2018.8.1\".",
+ "placeholders": {
+ "version_string": {
+ "content": "$1",
+ "example": "2018.8.1"
+ }
+ }
+ },
+ "badger_status_cookieblock": {
+ "message": "Блокирах бисквитки от $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a yellow slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "options_domain_filter_cookieblock": {
+ "message": "частично блокирани",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "show_tracking_domains_acknowledgement": {
+ "message": "Разбирам; покажи ми все пак домейните-преследвачи",
+ "description": "Acknowledgement shown next to the checkbox required to reveal the tracking domains list on the options page."
+ },
+ "firstRun_title": {
+ "message": "Благодаря, че инсталира Privacy Badger!",
+ "description": ""
+ },
+ "import_select_file": {
+ "message": "Моля избери файл за импорт.",
+ "description": ""
+ },
+ "report_broken_site": {
+ "message": "Развали ли Privacy Badger този сайт? Уведоми ни!",
+ "description": "Button in the popup."
+ },
+ "tooltip_cookieblock": {
+ "message": "Премести плъзгача в средата, за да блокираш бисквитките",
+ "description": ""
+ },
+ "intro_learns": {
+ "message": "Learns automatically",
+ "description": "Intro page paragraph heading"
+ },
+ "intro_learns_paragraph": {
+ "message": "Instead of keeping lists of what to block, Privacy Badger automatically discovers trackers based on their behavior.",
+ "description": "Intro page paragraph"
+ },
+ "intro_beyond_ads": {
+ "message": "Хващам подмолни преследвачи",
+ "description": "Intro page paragraph heading."
+ },
+ "intro_beyond_ads_paragraph": {
+ "message": "Invisible tracking happens in all sorts of ways; ads are just the visible tip of the iceberg. Privacy Badger sends the <a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control signal</a>, to opt you out of data sharing and selling, and the <a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track signal</a> to tell companies not to track you. If they ignore your wishes, Privacy Badger will learn to block them—whether they are advertisers or trackers of other kinds.",
+ "description": "Intro page paragraph."
+ },
+ "report_close": {
+ "message": "Затвори",
+ "description": ""
+ },
+ "import_user_data": {
+ "message": "Импортирай потребителски данни",
+ "description": ""
+ },
+ "options_domain_filter_dnt": {
+ "message": "съобразяващи се с DNT",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "popup_help_button": {
+ "message": "Помощ",
+ "description": "Tooltip that comes up when you hover over the question mark button in the upper right corner of the popup."
+ },
+ "options_domain_filter_allow": {
+ "message": "разрешени",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "intro_donate_heading": {
+ "message": "Личното пространство е отборна игра!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "show_tracking_domains_message": {
+ "message": "Не би трябвало да се налага да променяш каквото и да е тук.",
+ "description": "Shown above the acknowledgement checkbox required to reveal the tracking domains list on the options page. This is the second paragraph; the first paragraph is the message under the \"intro_not_an_adblocker_paragraph\" key."
+ },
+ "options_domain_filter_all": {
+ "message": "всички",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "report_cancel": {
+ "message": "Откажи",
+ "description": ""
+ },
+ "tooltip_block": {
+ "message": "Премести плъзгача наляво, за да блокираш домейн",
+ "description": ""
+ },
+ "options_enable_dnt_checkbox": {
+ "message": "Send websites the \"<a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>\" and \"<a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>\" signals",
+ "description": "Checkbox label for enabling/disabling the Sec-GPC and DNT signals, found on the general settings page"
+ },
+ "options_disable_google_nav_error_service": {
+ "message": "Disable sending web addresses you visit to Google. This disables suggestions for similar pages when a page can't be found.",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_disable_hyperlink_auditing": {
+ "message": "Disable hyperlink auditing",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_domain_filter_user": {
+ "message": "контролирани от теб",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "disabled_for_these_domains": {
+ "message": "<p>Privacy Badger is disabled on the following sites. This means that Privacy Badger will not block anything when you visit the sites listed here, and it will not send the Do Not Track or Global Privacy Control signals.</p><p>If you think Privacy Badger is breaking a page, or you would like to allow a particular site to share or sell your data, you can type that page's domain in the box below and click the \"Add domain\" button.</p><p>Alternatively, when you already have the page's tab selected, you can just click on Privacy Badger's button in the browser toolbar and then click the \"Disable\" button.</p>",
+ "description": ""
+ },
+ "popup_instructions": {
+ "message": "$COUNT$ potential $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Popup message shown when at least one tracker was blocked.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_instructions_no_trackers": {
+ "message": "No $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Text shown in the popup when there are no trackers on the page.",
+ "placeholders": {
+ "link_start": {
+ "content": "$1",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_blocked": {
+ "message": "There are no third party resources on this page. Hooray for privacy!",
+ "description": "Text shown in the popup when showing non-tracking domains is enabled, and there are no third-party domains on the page."
+ },
+ "intro_by_eff": {
+ "message": "Един проект на Electronic Frontier Foundation",
+ "description": ""
+ },
+ "add_domain_button": {
+ "message": "Добави домейн",
+ "description": ""
+ },
+ "tooltip_allow": {
+ "message": "Премести плъзгача надясно, за да разрешиш домейн",
+ "description": ""
+ },
+ "popup_disable_for_site": {
+ "message": "Изключи Privacy Badger за този сайт",
+ "description": "Button in the popup."
+ },
+ "domain_slider_allow_tooltip": {
+ "message": "Щракни тук, за да разрешиш този домейн",
+ "description": "Tooltip shown when you hover over the rightmost part of a slider shown for each domain in the domain list."
+ },
+ "intro_privacy_note": {
+ "message": "Privacy Badger НИКОГА няма да споделя данни за сърфирането ти, освен ако ти не решиш да ги споделиш.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_list_trackers": {
+ "message": "Privacy Badger has decided to block $COUNT$ potential $TRACKER_LINK_START$tracking domains$TRACKER_LINK_END$ so far",
+ "description": "Shown on the Tracking Domains tab on the options page after Privacy Badger learned to block one or more domains",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "900"
+ },
+ "tracker_link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "tracker_link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "options_domain_list_no_trackers": {
+ "message": "Privacy Badger досега не е открил <a target='_blank' tabindex=-1 title='i18n_what_is_a_tracker' class='tooltip' href='https://www.eff.org/privacybadger#faq-What-is-a-third-party-tracker?'>домейни-преследвачи</a>. Продължавай да си сърфираш!",
+ "description": "Shown on the Tracking Domains tab on the options page if all tracking domains have been removed."
+ },
+ "name": {
+ "message": "Privacy Badger",
+ "description": ""
+ },
+ "intro_not_an_adblocker_paragraph": {
+ "message": "Privacy Badger започва да блокира, когато види един и същ преследвач на три различни сайта. Три картона и е аут!",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_status_filter": {
+ "message": "Филтрирай според настройка:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "report_text": {
+ "message": "Опиши накратко грешката по́ долу.",
+ "description": ""
+ },
+ "remove_button": {
+ "message": "Премахни избраните",
+ "description": "This is the label for the 'Remove selected' buttons."
+ },
+ "intro_donate1": {
+ "message": "Когато използваш Privacy Badger, се присъединяваш към <a href='https://www.eff.org/' target='_blank'>Electronic Frontier Foundation</a> и милиони други потребители в борбата за лично пространство и поверителност. Ние сме сдружение с непарична цел, което се бори за онлайн правата ти. Благодаря, че си с нас!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "options_domain_search_tooltip": {
+ "message": "За да изключиш домейни от търсенето, започни с \"-\". Например: \".co -.com\" ще покаже домейни с .co и .co.uk, но не и .com.",
+ "description": "Tooltip for an \"information\" icon next to the domain search input on the Tracking Domains options page tab."
+ },
+ "intro_disable_button": {
+ "message": "Ако смяташ, че Privacy Badger е развалил страница (например не върви видео клип), можеш да щракнеш на бутона \"Изключи\", за да изключиш Privacy Badger за този сайт.",
+ "description": "Intro page paragraph. The quoted string ('Disable') should match the verb used for the 'popup_disable_for_site' message."
+ },
+ "intro_link_policy": {
+ "message": "Политика за поверителност",
+ "description": "Shown at the bottom of the intro page, links to the EFF software and technology projects privacy policy."
+ },
+ "report_input_label": {
+ "message": "Описание",
+ "description": ""
+ },
+ "not_yet_blocked_header": {
+ "message": "Your Badger hasn't decided yet if these domains should get blocked",
+ "description": "Popup domain list header text; separates blocked from haven't-yet-seen-enough-to-block potential trackers."
+ },
+ "options_show_not_yet_blocked": {
+ "message": "Show domains your Badger hasn't decided yet to block:",
+ "description": "Label for a checkbox on the Tracking Domains options page tab. Should match wording used in the 'not_yet_blocked_header' message."
+ },
+ "non_tracker": {
+ "message": "Домейните по́ долу не изглеждат сякаш те следят",
+ "description": "Header text; separates tracking from non-tracking domains in the popup."
+ },
+ "popup_options_button": {
+ "message": "Настройки",
+ "description": ""
+ },
+ "share_button_title_facebook": {
+ "message": "Сподели във Facebook",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "description": {
+ "message": "Privacy Badger автоматично се научава да блокира невидими преследвачи.",
+ "description": ""
+ },
+ "report_fail": {
+ "message": "Опа. Нещо се обърка.",
+ "description": ""
+ },
+ "social_tooltip_pb_has_replaced": {
+ "message": "Privacy Badger замени този $BUTTON$ бутон",
+ "description": "Tooltip shown over a replaced social button. For example, \"Privacy Badger has replaced this Facebook Like button\". See also the widget_placeholder_pb_has_replaced message.",
+ "placeholders": {
+ "button": {
+ "content": "$1",
+ "example": "Facebook Like"
+ }
+ }
+ },
+ "widget_placeholder_pb_has_replaced": {
+ "message": "Privacy Badger has replaced this $WIDGET$ widget",
+ "description": "Text shown inside a replaced widget's placeholder. For example, \"Privacy Badger has replaced this Google reCAPTCHA widget\". See also the social_tooltip_pb_has_replaced message.",
+ "placeholders": {
+ "widget": {
+ "content": "$1",
+ "example": "Google reCAPTCHA"
+ }
+ }
+ },
+ "allow_once": {
+ "message": "Разреши веднъж",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking it will allow the third-party widget to load this one time only."
+ },
+ "allow_on_site": {
+ "message": "Разрешаване винаги на този сайт",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking this button will always allow the widget to load on this particular site."
+ },
+ "sync_intro": {
+ "message": "Синхронизацията с облака:<ul><li>Изисква Firefox/Chrome Синхронизация</li><li>Качването презаписва всички съществуващи в облака данни на Privacy Badger</li><li>Дърпането слива списъците със сайтове, на които язовеца ти е изключен</li></ul>",
+ "description": "A brief explanation of how syncing works. Shown above the upload/download cloud data buttons under the Manage Data options page tab."
+ },
+ "upload": {
+ "message": "Качи",
+ "description": "Button label for uploading data to the cloud on Manage Data options page tab."
+ },
+ "upload_cloud": {
+ "message": "Експортирай сайтовете-изключения в облака",
+ "description": "Button title for uploading data to the cloud on Manage Data options page tab."
+ },
+ "download_cloud": {
+ "message": "Импортирай сайтовете-изключения от облака",
+ "description": "Button title for downloading data from the cloud on Manage Data options page tab."
+ },
+ "download_cloud_success": {
+ "message": "Импортирах успешно данните от облака.",
+ "description": "Message displayed to the user after successfully merging cloud data."
+ },
+ "download_cloud_failure": {
+ "message": "Не успях да дръпна данните от облака.",
+ "description": "Message displayed to the user after failing to download cloud data."
+ },
+ "upload_cloud_success": {
+ "message": "Качих успешно данните в обалака.",
+ "description": "Message displayed to the user after successfully uploading local data."
+ },
+ "upload_cloud_failure": {
+ "message": "Не успях да кача данните в облака.",
+ "description": "Message displayed to the user after failing to upload local data."
+ },
+ "download_cloud_no_data": {
+ "message": "В облака няма данни за дърпане.",
+ "description": "'Error' message when there is on cloud data to download."
+ },
+ "share_title": {
+ "message": "Кажи на приятелите си",
+ "description": "Title of the share overlay."
+ },
+ "popup_share_button": {
+ "message": "Сподели",
+ "description": "Tooltip that comes up when you hover over the share button in the upper right corner of the popup."
+ },
+ "share_tracker_header": {
+ "message": "Privacy Badger blocked $COUNT$ potential trackers on $DOMAIN$:",
+ "description": "Header above the list of tracking domains in the share message.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "domain": {
+ "content": "$2",
+ "example": "example.com"
+ }
+ }
+ },
+ "share_base_message": {
+ "message": "Privacy Badger (www.eff.org/privacybadger) е разширение за браузер, което автоматично се научава да блокира невидими преследвачи. Privacy Badger е направен от Electronic Frontier Foundation, организация с нестопанска цел, която се бори за твоите онлайн права.",
+ "description": "The base message that is always included in the share message."
+ },
+ "copy_button_initial": {
+ "message": "Копирай в клипборда",
+ "description": "Initial text of the copy button on the share overlay."
+ },
+ "copy_button_copied": {
+ "message": "Копирах",
+ "description": "On-click text of the copy button on the share overlay."
+ },
+ "popup_special_page_header": {
+ "message": "Nothing to do on this page",
+ "description": "Heading for popup_special_page_paragraph"
+ },
+ "popup_special_page_paragraph": {
+ "message": "Privacy Badger doesn't work on special pages like this one. Try browsing somewhere else.",
+ "description": "Shown in the popup for special browser pages such as the New Tab page and 'about:' pages."
+ },
+ "popup_disabled_site_header": {
+ "message": "Privacy Badger is disabled on this site",
+ "description": "Shown in the popup on disabled sites."
+ },
+ "options_widget_replacement_tab": {
+ "message": "Widget Replacement",
+ "description": "Options page tab heading"
+ },
+ "options_widget_replacement_desc": {
+ "message": "When blocking social buttons and other potentially useful (video, audio, comments) widgets, Privacy Badger can replace them with click-to-activate placeholders.",
+ "description": "Introduction to the Widget Replacement tab on the options page."
+ }
+} \ No newline at end of file
diff --git a/src/_locales/ca/messages.json b/src/_locales/ca/messages.json
new file mode 100644
index 0000000..790c4b3
--- /dev/null
+++ b/src/_locales/ca/messages.json
@@ -0,0 +1,677 @@
+{
+ "badger_status_block": {
+ "message": "S'ha blocat $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a red slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "invalid_json": {
+ "message": "Arxiu JSON no vàlid",
+ "description": ""
+ },
+ "options_remove_origin_confirm": {
+ "message": "Segur que voleu treure aquest domini de Privacy Badger?",
+ "description": "Confirmation shown when you click to remove a domain from Privacy Badger's tracking domains list on the options page."
+ },
+ "badger_status_noaction": {
+ "message": "El domini $DOMAIN$ no fa seguiments",
+ "description": "Tooltip shown when you hover over a non-tracking domain name with a green slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "non_tracker_tip": {
+ "message": "Ara mateix, Privacy Badger només comprova si terceres parts estan utilitzant galetes, emmagatzematge local d'HTML5 o el marcat del llenç per fer seguiments del vostre navegador. Alguns d'aquests dominis poden utilitzar mètodes de seguiment que Privacy Badger no pot detectar.",
+ "description": ""
+ },
+ "options_dnt_policy_setting": {
+ "message": "Comproveu si els <a target='_blank' href='https://www.eff.org/privacybadger/faq#What-is-a-third-party-tracker'>dominis de terceres parts</a> compleixen amb la <a target='_blank' href='https://www.eff.org/dnt-policy'>política d'EFF de no seguiment</a>",
+ "description": "Checkbox label on the general settings page"
+ },
+ "invalid_domain": {
+ "message": "Si us plau, afegiu un domini vàlid o un URL",
+ "description": ""
+ },
+ "donate_to_eff": {
+ "message": "Feu un donatiu a EFF",
+ "description": "Button shown in the popup and on the intro page."
+ },
+ "intro_donate_subheading": {
+ "message": "Ajudeu-nos fent un donatiu i compartint el vostre suport per les nostres eines",
+ "description": "Shown below the Donate button on the intro page."
+ },
+ "intro_not_an_adblocker": {
+ "message": "No bloco anuncis, sóc diferent",
+ "description": "Intro page paragraph heading."
+ },
+ "report_success": {
+ "message": "Gràcies! Arribarem al fons d'això.",
+ "description": ""
+ },
+ "dnt_tooltip": {
+ "message": "Aquest domini promet no seguir-vos",
+ "description": "Tooltip shown when you hover over a DNT-compliant domain name in the list of domains in the popup or under the Tracking Domains tab on the options page."
+ },
+ "breakage_warning_tooltip": {
+ "message": "Blocking this domain is known to break websites",
+ "description": "Tooltip for a warning icon that appears when move a domain slider to 'red' (block) for a domain that was automatically set to 'yellow' (block cookies)."
+ },
+ "feed_the_badger_title": {
+ "message": "Click to return control of this domain to Privacy Badger",
+ "description": "Tooltip shown when you hover over an undo arrow that appears when you move a domain slider away from its automatic setting."
+ },
+ "next_section": {
+ "message": "següent secció",
+ "description": "Image alt. text on a couple of \"scroll down\" arrow buttons on the intro page."
+ },
+ "extension_error_text": {
+ "message": "Si us plau, <a href='https://www.eff.org/privacybadger#faq-I-found-a-bug!-What-do-I-do-now?' target='_blank'>expliqueu-nos</a> alguna cosa sobre el següent error:",
+ "description": "Shown in the popup when there is a problem with the user's Privacy Badger extension that we want to encourage the user to tell us about."
+ },
+ "data_settings": {
+ "message": "Gestió de dades",
+ "description": "This is an options page tab heading."
+ },
+ "report_title": {
+ "message": "Informeu d'un error",
+ "description": ""
+ },
+ "whitelist_form_domain_input_placeholder": {
+ "message": "p. ex. www.domini.com, *.domini.net, domini.org",
+ "description": "Placeholder text for the Add domain input under the Disabled Sites tab on the options page."
+ },
+ "domain_slider_cookieblock_tooltip": {
+ "message": "Cliqueu aquí per blocar les galetes d'aquest domini",
+ "description": "Tooltip shown when you hover over the center part of a slider shown for each domain in the domain list."
+ },
+ "options_domain_filter_block": {
+ "message": "blocat",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "options_webrtc_setting": {
+ "message": "Impediu que el WebRTC filtri una adreça IP local",
+ "description": "Checkbox label on the general settings page"
+ },
+ "intro_welcome": {
+ "message": "Privacy Badger aprèn automàticament a blocar rastrejadors invisibles. Deixeu-nos un minut per ensenyar-vos com.",
+ "description": "Intro page welcome paragraph."
+ },
+ "error_input": {
+ "message": "Què ha fallat?",
+ "description": ""
+ },
+ "options_domain_list_tab": {
+ "message": "Dominis de seguiment",
+ "description": "This is an options page tab heading."
+ },
+ "share_button_title_twitter": {
+ "message": "Compartiu-lo a Twitter",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "first_run_text": {
+ "message": "Apreneu com Privacy Badger protegeix la vostra privacitat",
+ "description": "Part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "download": {
+ "message": "Descarregar",
+ "description": ""
+ },
+ "import": {
+ "message": "Importar",
+ "description": ""
+ },
+ "options_hide_social_widgets": {
+ "message": "No reemplaçar els ginys següents:",
+ "description": "Multiple selection box on the widget replacement tab"
+ },
+ "options_social_widgets_checkbox": {
+ "message": "Habilita el reemplaçament de ginys",
+ "description": "Checkbox label on the widget replacement tab"
+ },
+ "options_show_nontracking_domains_checkbox": {
+ "message": "Mostra els dominis que, aparentment, no us segueixen",
+ "description": "Checkbox label on the general settings page. Should match wording used in the 'non_tracker' message."
+ },
+ "report_button": {
+ "message": "Enviar Errada",
+ "description": ""
+ },
+ "badger_status_allow": {
+ "message": "Permès $DOMAIN$",
+ "description": "Tooltip shown when you hover over a tracking but still allowed (green slider) domain name in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "privacy_badger_what_is": {
+ "message": "Què és Privacy Badger?",
+ "description": ""
+ },
+ "options_domain_search": {
+ "message": "Cerca de dominis:",
+ "description": "Label for a text input box on the Tracking Domains options page tab."
+ },
+ "options_learn_setting": {
+ "message": "Learn to block new trackers from your browsing",
+ "description": "Checkbox label on the general settings page"
+ },
+ "local_learning_warning": {
+ "message": "Enabling learning may make you more identifiable to websites",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_incognito_setting": {
+ "message": "Aprendre en finestres Privades/Incògnit",
+ "description": "Checkbox label on the general settings page"
+ },
+ "options_incognito_warning": {
+ "message": "Habilitant l'aprenentatge en finestres Privades/Incògnit, podeu deixar traces a l'historial privat de navegació del vostre ordinador. Per defecte, Privacy Badger blocarà els rastrejadors coneguts a les finestres Privades/Incògnit, però no aprendrà sobre nous rastrejadors. Cal que habiliteu aquesta opció si la majoria de la vostra navegació la feu en finestres Privades/Incògnit",
+ "description": "Tooltip on the general settings page"
+ },
+ "learning_prompt_text1": {
+ "message": "Privacy Badger will no longer learn from your browsing by default.",
+ "description": "First part of a prompt to visit the blog."
+ },
+ "learning_prompt_text2": {
+ "message": "Click below to learn more.",
+ "description": "Second part of a prompt to visit the blog."
+ },
+ "learning_prompt_button": {
+ "message": "Learn how Privacy Badger is changing",
+ "description": "Button text, part of a prompt to visit the blog."
+ },
+ "show_counter_checkbox": {
+ "message": "Mostra el comptador de rastrejadors",
+ "description": "Checkbox label on the general settings page"
+ },
+ "what_is_a_tracker": {
+ "message": "Què és un rastrejador?",
+ "description": "Tooltip that comes up when you hover over the 'tracking domains' link under the Tracking Domains tab on the options page."
+ },
+ "intro_report_button": {
+ "message": "Si us plau, no us oblideu de clicar a 'El Privacy Badger ha espatllat aquest lloc'. Respectem tant la vostra privacitat que no enviem informes de forma automàtica.",
+ "description": "Intro page paragraph. The quoted message ('Did Privacy Badger break this site') should match the first part of the translation for the 'report_broken_site' message."
+ },
+ "options_title": {
+ "message": "Opcions de Privacy Badger",
+ "description": ""
+ },
+ "report_terms": {
+ "message": "This will automatically send the following information to EFF: the page you're currently visiting, your browser version, the version of Privacy Badger, and the state of all of the sliders on this page.",
+ "description": ""
+ },
+ "whitelisted_domains": {
+ "message": "Llocs deshabilitats",
+ "description": "This is an options page tab heading."
+ },
+ "popup_enable_for_site": {
+ "message": "Habilita el Privacy Badger per aquest lloc",
+ "description": ""
+ },
+ "options_domain_type_filter": {
+ "message": "Filtra per tipus:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "import_successful": {
+ "message": "La llista i la configuració del rastrejador s'ha actualitzat correctament!",
+ "description": ""
+ },
+ "export_user_data": {
+ "message": "Exporta les dades d'usuari",
+ "description": ""
+ },
+ "manage_data_intro": {
+ "message": "Si importeu les dades d'usuari: <ul><li>Sobreescriureu la configuració general</li><li>Fusionareu les llistes de llocs deshabilitats</li><li>Fusionareu la informació sobre els rastrejadors que Privacy Badger ha vist</li><li>Sobreescriureu la personalització dels lliscadors</li></ul>",
+ "description": "A brief explanation of what happens when you import Badger user data. Shown above the import/export user data buttons under the Manage Data options page tab."
+ },
+ "reset": {
+ "message": "Restablir",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "reset_data": {
+ "message": "Restablir els dominis de seguiment",
+ "description": "Caption above reset button"
+ },
+ "reset_data_confirm": {
+ "message": "Restablint els dominis de seguiment:\n\n • Esborrareu totes les dades que el Privacy Badger hagi après sobre rastrejadors durant la vostra navegació\n • Restaurareu la llista de dominis de seguiment a la llista d'abans de començar a aprendre (visiteu www.eff.org/badger-pretraining per saber-ne més)",
+ "description": "Pop-up triggered when the reset_data button is clicked"
+ },
+ "remove_all": {
+ "message": "Eliminar-ho tot",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "remove_all_data": {
+ "message": "Eliminar tots els dominis de seguiment",
+ "description": "Caption above remove_all button"
+ },
+ "remove_all_data_confirm": {
+ "message": "Eliminant tots els dominis de seguiment:\n\n • Esborrareu tot el que Privacy Badger sap sobre els rastrejadors\n • Provocareu que Privacy Badger no bloqui res fins que hagi tornat a aprendre amb la vostra navegació",
+ "description": "Pop-up triggered when the remove_all_data button is clicked"
+ },
+ "intro_text1": {
+ "message": "Ara el Privacy Badger ja us protegeix.",
+ "description": "First part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "intro_text2": {
+ "message": "Per saber com treballa el Privacy Badger, cliqueu aquí baix i seguiu la guia ràpida.",
+ "description": "Second part of a reminder to visit the intro page"
+ },
+ "options_webrtc_warning": {
+ "message": "WebRTC pot filtrar la vostra IP local. Teniu en compte que aquesta opció pot degradar el rendiment d'aplicacions de videoconferència com Google Hangouts.",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_general_settings": {
+ "message": "Configuració general",
+ "description": "This is an options page tab heading."
+ },
+ "options_privacy_settings": {
+ "message": "Privacy",
+ "description": "Subheading on the general settings options page."
+ },
+ "options_advanced_settings": {
+ "message": "Advanced",
+ "description": "Subheading on the general settings options page."
+ },
+ "intro_next_button": {
+ "message": "Feu la visita guiada",
+ "description": "Intro page welcome button."
+ },
+ "domain_slider_block_tooltip": {
+ "message": "Cliqueu aquí per blocar completament aquest domini",
+ "description": "Tooltip shown when you hover over the leftmost part of a slider shown for each domain in the domain list."
+ },
+ "version": {
+ "message": "versió $VERSION_STRING$",
+ "description": "Shows Privacy Badger's version in the popup. For example, \"version 2018.8.1\".",
+ "placeholders": {
+ "version_string": {
+ "content": "$1",
+ "example": "2018.8.1"
+ }
+ }
+ },
+ "badger_status_cookieblock": {
+ "message": "S'han blocat les galetes de $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a yellow slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "options_domain_filter_cookieblock": {
+ "message": "blocat parcialment",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "show_tracking_domains_acknowledgement": {
+ "message": "Ho entenc; si us plau, mostra'm igualment el llistat de dominis de seguiment",
+ "description": "Acknowledgement shown next to the checkbox required to reveal the tracking domains list on the options page."
+ },
+ "firstRun_title": {
+ "message": "Gràcies per instal·lar el Privacy Badger!",
+ "description": ""
+ },
+ "import_select_file": {
+ "message": "Si us plau, seleccioneu l'arxiu a importar",
+ "description": ""
+ },
+ "report_broken_site": {
+ "message": "El Privacy Badger ha espatllat aquest lloc? Feu-nos-ho saber!",
+ "description": "Button in the popup."
+ },
+ "tooltip_cookieblock": {
+ "message": "Centreu el lliscador per blocar les galetes",
+ "description": ""
+ },
+ "intro_learns": {
+ "message": "Learns automatically",
+ "description": "Intro page paragraph heading"
+ },
+ "intro_learns_paragraph": {
+ "message": "Instead of keeping lists of what to block, Privacy Badger automatically discovers trackers based on their behavior.",
+ "description": "Intro page paragraph"
+ },
+ "intro_beyond_ads": {
+ "message": "Captura rastrejadors furtius",
+ "description": "Intro page paragraph heading."
+ },
+ "intro_beyond_ads_paragraph": {
+ "message": "Invisible tracking happens in all sorts of ways; ads are just the visible tip of the iceberg. Privacy Badger sends the <a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control signal</a>, to opt you out of data sharing and selling, and the <a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track signal</a> to tell companies not to track you. If they ignore your wishes, Privacy Badger will learn to block them—whether they are advertisers or trackers of other kinds.",
+ "description": "Intro page paragraph."
+ },
+ "report_close": {
+ "message": "Tanca",
+ "description": ""
+ },
+ "import_user_data": {
+ "message": "Importa dades d'usuari",
+ "description": ""
+ },
+ "options_domain_filter_dnt": {
+ "message": "respecta el No Em Seguiu",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "popup_help_button": {
+ "message": "Ajuda",
+ "description": "Tooltip that comes up when you hover over the question mark button in the upper right corner of the popup."
+ },
+ "options_domain_filter_allow": {
+ "message": "permès",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "intro_donate_heading": {
+ "message": "La privacitat és un esport d'equip!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "show_tracking_domains_message": {
+ "message": "Aquí no hauria de ser necessari modificar res",
+ "description": "Shown above the acknowledgement checkbox required to reveal the tracking domains list on the options page. This is the second paragraph; the first paragraph is the message under the \"intro_not_an_adblocker_paragraph\" key."
+ },
+ "options_domain_filter_all": {
+ "message": "tot",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "report_cancel": {
+ "message": "Cancel·la",
+ "description": ""
+ },
+ "tooltip_block": {
+ "message": "Moveu el lliscador a l'esquerra per blocar el domini",
+ "description": ""
+ },
+ "options_enable_dnt_checkbox": {
+ "message": "Send websites the \"<a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>\" and \"<a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>\" signals",
+ "description": "Checkbox label for enabling/disabling the Sec-GPC and DNT signals, found on the general settings page"
+ },
+ "options_disable_google_nav_error_service": {
+ "message": "Disable sending web addresses you visit to Google. This disables suggestions for similar pages when a page can't be found.",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_disable_hyperlink_auditing": {
+ "message": "Disable hyperlink auditing",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_domain_filter_user": {
+ "message": "controlat per l'usuari",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "disabled_for_these_domains": {
+ "message": "<p>Privacy Badger is disabled on the following sites. This means that Privacy Badger will not block anything when you visit the sites listed here, and it will not send the Do Not Track or Global Privacy Control signals.</p><p>If you think Privacy Badger is breaking a page, or you would like to allow a particular site to share or sell your data, you can type that page's domain in the box below and click the \"Add domain\" button.</p><p>Alternatively, when you already have the page's tab selected, you can just click on Privacy Badger's button in the browser toolbar and then click the \"Disable\" button.</p>",
+ "description": ""
+ },
+ "popup_instructions": {
+ "message": "$COUNT$ potential $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Popup message shown when at least one tracker was blocked.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_instructions_no_trackers": {
+ "message": "No $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Text shown in the popup when there are no trackers on the page.",
+ "placeholders": {
+ "link_start": {
+ "content": "$1",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_blocked": {
+ "message": "There are no third party resources on this page. Hooray for privacy!",
+ "description": "Text shown in the popup when showing non-tracking domains is enabled, and there are no third-party domains on the page."
+ },
+ "intro_by_eff": {
+ "message": "Un projecte de l'Electronic Frontier Foundation",
+ "description": ""
+ },
+ "add_domain_button": {
+ "message": "Afegeix domini",
+ "description": ""
+ },
+ "tooltip_allow": {
+ "message": "Moveu el lliscador a la dreta per permetre un domini",
+ "description": ""
+ },
+ "popup_disable_for_site": {
+ "message": "Deshabiliteu el Privacy Badger en aquest lloc",
+ "description": "Button in the popup."
+ },
+ "domain_slider_allow_tooltip": {
+ "message": "Cliqueu aquí per permetre aquest domini",
+ "description": "Tooltip shown when you hover over the rightmost part of a slider shown for each domain in the domain list."
+ },
+ "intro_privacy_note": {
+ "message": "El Privacy Badger MAI compartirà dades sobre la vostra navegació, excepte si decidiu compartir-les.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_list_trackers": {
+ "message": "Privacy Badger has decided to block $COUNT$ potential $TRACKER_LINK_START$tracking domains$TRACKER_LINK_END$ so far",
+ "description": "Shown on the Tracking Domains tab on the options page after Privacy Badger learned to block one or more domains",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "900"
+ },
+ "tracker_link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "tracker_link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "options_domain_list_no_trackers": {
+ "message": "El Privacy Badger encara no ha detectat cap <a target='_blank' tabindex=-1 title='i18n_what_is_a_tracker' class='tooltip' href='https://www.eff.org/privacybadger#faq-What-is-a-third-party-tracker?'>domini de seguiment</a>. Seguiu navegant!",
+ "description": "Shown on the Tracking Domains tab on the options page if all tracking domains have been removed."
+ },
+ "name": {
+ "message": "Privacy Badger",
+ "description": ""
+ },
+ "intro_not_an_adblocker_paragraph": {
+ "message": "Privacy Badger comença a blocar un cop veu el mateix rastrejador en tres llocs web diferents. Tres strikes i eliminat! Com al beisbol.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_status_filter": {
+ "message": "Filtrar per estat:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "report_text": {
+ "message": "Descriviu breument l'errada a sota.",
+ "description": ""
+ },
+ "remove_button": {
+ "message": "Treu els seleccionats",
+ "description": "This is the label for the 'Remove selected' buttons."
+ },
+ "intro_donate1": {
+ "message": "Quan utilitzeu el Privacy Badger, us uniu a l'<a href='https://www.eff.org/' target='_blank'>Electronic Frontier Foundation</a> i milions de persones en la lluita per la privacitat. Som una entitat sense ànim de lucre lluitant pels vostres drets en línia. Gràcies per unir-vos a nosaltres!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "options_domain_search_tooltip": {
+ "message": "Per excloure dominis, utilitzeu el caràcter \"-\". Per exemple, si cerqueu \".co -.com\" us mostrarà els dominis .co i .co.uk, però no us mostrarà el domini .com",
+ "description": "Tooltip for an \"information\" icon next to the domain search input on the Tracking Domains options page tab."
+ },
+ "intro_disable_button": {
+ "message": "Si penseu que el Privacy Badger ha espatllat una pàgina (un vídeo que no es veu, per exemple), podeu clicar el botó 'Deshabilita' perquè el Privacy Badger no controli el lloc.",
+ "description": "Intro page paragraph. The quoted string ('Disable') should match the verb used for the 'popup_disable_for_site' message."
+ },
+ "intro_link_policy": {
+ "message": "Política de privacitat",
+ "description": "Shown at the bottom of the intro page, links to the EFF software and technology projects privacy policy."
+ },
+ "report_input_label": {
+ "message": "Descripció",
+ "description": ""
+ },
+ "not_yet_blocked_header": {
+ "message": "Your Badger hasn't decided yet if these domains should get blocked",
+ "description": "Popup domain list header text; separates blocked from haven't-yet-seen-enough-to-block potential trackers."
+ },
+ "options_show_not_yet_blocked": {
+ "message": "Show domains your Badger hasn't decided yet to block:",
+ "description": "Label for a checkbox on the Tracking Domains options page tab. Should match wording used in the 'not_yet_blocked_header' message."
+ },
+ "non_tracker": {
+ "message": "Els dominis de sota, aparentment, no us segueixen.",
+ "description": "Header text; separates tracking from non-tracking domains in the popup."
+ },
+ "popup_options_button": {
+ "message": "Opcions",
+ "description": ""
+ },
+ "share_button_title_facebook": {
+ "message": "Compartiu-ho a Facebook",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "description": {
+ "message": "El Privacy Badger aprèn automàticament a blocar rastrejadors invisibles.",
+ "description": ""
+ },
+ "report_fail": {
+ "message": "Ai! Alguna cosa no ha anat bé.",
+ "description": ""
+ },
+ "social_tooltip_pb_has_replaced": {
+ "message": "El Privacy Badger ha substituït aquest botó de $BUTTON$",
+ "description": "Tooltip shown over a replaced social button. For example, \"Privacy Badger has replaced this Facebook Like button\". See also the widget_placeholder_pb_has_replaced message.",
+ "placeholders": {
+ "button": {
+ "content": "$1",
+ "example": "Facebook Like"
+ }
+ }
+ },
+ "widget_placeholder_pb_has_replaced": {
+ "message": "Privacy Badger has replaced this $WIDGET$ widget",
+ "description": "Text shown inside a replaced widget's placeholder. For example, \"Privacy Badger has replaced this Google reCAPTCHA widget\". See also the social_tooltip_pb_has_replaced message.",
+ "placeholders": {
+ "widget": {
+ "content": "$1",
+ "example": "Google reCAPTCHA"
+ }
+ }
+ },
+ "allow_once": {
+ "message": "Permetre-ho un cop",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking it will allow the third-party widget to load this one time only."
+ },
+ "allow_on_site": {
+ "message": "Permet sempre en aquest lloc",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking this button will always allow the widget to load on this particular site."
+ },
+ "sync_intro": {
+ "message": "Sincronització al núvol: <ul><li>Requereix Firefox/Chrome Sync</li><li>La càrrega sobreescriu qualsevol dada del Privacy Badger existent al núvol</li><li>La descàrrega fusiona les llistes dels llocs que heu deshabilitat al teixó (Badger)</li></ul>",
+ "description": "A brief explanation of how syncing works. Shown above the upload/download cloud data buttons under the Manage Data options page tab."
+ },
+ "upload": {
+ "message": "Carrega",
+ "description": "Button label for uploading data to the cloud on Manage Data options page tab."
+ },
+ "upload_cloud": {
+ "message": "Exporta els llocs deshabilitats al núvol",
+ "description": "Button title for uploading data to the cloud on Manage Data options page tab."
+ },
+ "download_cloud": {
+ "message": "Importa els llocs deshabilitats del núvol",
+ "description": "Button title for downloading data from the cloud on Manage Data options page tab."
+ },
+ "download_cloud_success": {
+ "message": "Les dades del núvol s'han importat correctament.",
+ "description": "Message displayed to the user after successfully merging cloud data."
+ },
+ "download_cloud_failure": {
+ "message": "Les dades del núvol no s'han pogut descarregar.",
+ "description": "Message displayed to the user after failing to download cloud data."
+ },
+ "upload_cloud_success": {
+ "message": "S'han carregat les dades al núvol correctament.",
+ "description": "Message displayed to the user after successfully uploading local data."
+ },
+ "upload_cloud_failure": {
+ "message": "Les dades no s'han pogut carregar al núvol.",
+ "description": "Message displayed to the user after failing to upload local data."
+ },
+ "download_cloud_no_data": {
+ "message": "Al núvol no hi ha dades per descarregar.",
+ "description": "'Error' message when there is on cloud data to download."
+ },
+ "share_title": {
+ "message": "Expliqueu-ho a les vostres amistats",
+ "description": "Title of the share overlay."
+ },
+ "popup_share_button": {
+ "message": "Compartiu",
+ "description": "Tooltip that comes up when you hover over the share button in the upper right corner of the popup."
+ },
+ "share_tracker_header": {
+ "message": "Privacy Badger blocked $COUNT$ potential trackers on $DOMAIN$:",
+ "description": "Header above the list of tracking domains in the share message.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "domain": {
+ "content": "$2",
+ "example": "example.com"
+ }
+ }
+ },
+ "share_base_message": {
+ "message": "El Privacy Badger (www.eff.org/privacybadger) és una extensió del navegador que aprèn automàticament a blocar rastrejadors invisibles. El Privacy Badger l'ha creat l'Electronic Frontier Foundation, una entitat sense ànim de lucre que lluita pels vostres drets en línia.",
+ "description": "The base message that is always included in the share message."
+ },
+ "copy_button_initial": {
+ "message": "Copia-ho al porta-retalls",
+ "description": "Initial text of the copy button on the share overlay."
+ },
+ "copy_button_copied": {
+ "message": "Copiat",
+ "description": "On-click text of the copy button on the share overlay."
+ },
+ "popup_special_page_header": {
+ "message": "En aquesta pàgina no hi ha res a fer",
+ "description": "Heading for popup_special_page_paragraph"
+ },
+ "popup_special_page_paragraph": {
+ "message": "Privacy Badger no funciona en pàgines especials com aquesta. Proveu de navegar per altres llocs.",
+ "description": "Shown in the popup for special browser pages such as the New Tab page and 'about:' pages."
+ },
+ "popup_disabled_site_header": {
+ "message": "En aquest lloc, el Privacy Badger està deshabilitat",
+ "description": "Shown in the popup on disabled sites."
+ },
+ "options_widget_replacement_tab": {
+ "message": "Reemplaçament de ginys",
+ "description": "Options page tab heading"
+ },
+ "options_widget_replacement_desc": {
+ "message": "Quan es bloquegen els botons de les xarxes socials i altres ginys (vídeo, àudio, comentaris) habituals, el Privacy Badger pot reemplaçar-los per espais reservats activables amb un clic.",
+ "description": "Introduction to the Widget Replacement tab on the options page."
+ }
+} \ No newline at end of file
diff --git a/src/_locales/cs/messages.json b/src/_locales/cs/messages.json
new file mode 100644
index 0000000..275960c
--- /dev/null
+++ b/src/_locales/cs/messages.json
@@ -0,0 +1,677 @@
+{
+ "badger_status_block": {
+ "message": "Doména $DOMAIN$ je blokována",
+ "description": "Tooltip shown when you hover over a domain name with a red slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "invalid_json": {
+ "message": "Neplatný soubor JSON.",
+ "description": ""
+ },
+ "options_remove_origin_confirm": {
+ "message": "Jste si jistí, že chcete odebrat tuto doménu ze seznamu Privacy Badger?",
+ "description": "Confirmation shown when you click to remove a domain from Privacy Badger's tracking domains list on the options page."
+ },
+ "badger_status_noaction": {
+ "message": "Žádné sledovací prvky pro $DOMAIN$",
+ "description": "Tooltip shown when you hover over a non-tracking domain name with a green slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "non_tracker_tip": {
+ "message": "V současnosti Privacy Badger hlídá, zda soubory cookies třetích stran, lokální úložiště HTML5 a metoda canvas fingerprinting neslouží ke sledování Vašeho procházení internetu. Některé domény mohou používat metody sledování, které Privacy Badger dosud nedokáže detekovat.",
+ "description": ""
+ },
+ "options_dnt_policy_setting": {
+ "message": "Zkontrolujte, zda <a target='_blank' href='https://www.eff.org/privacybadger/faq#What-is-a-third-party-tracker'>domény třetích stran</a> dodržují <a target='_blank' href='https://www.eff.org/dnt-policy'>pravidla Žádosti o nesledování od organizace EFF.</a>",
+ "description": "Checkbox label on the general settings page"
+ },
+ "invalid_domain": {
+ "message": "Prosím, vložte validní doménu nebo adresu URL.",
+ "description": ""
+ },
+ "donate_to_eff": {
+ "message": "Přispět EFF",
+ "description": "Button shown in the popup and on the intro page."
+ },
+ "intro_donate_subheading": {
+ "message": "Můžete nám přispět finanční obnos, nebo sdílet Vaši podporu na sociálních sítích",
+ "description": "Shown below the Donate button on the intro page."
+ },
+ "intro_not_an_adblocker": {
+ "message": "Není to prostý program na blokování reklam",
+ "description": "Intro page paragraph heading."
+ },
+ "report_success": {
+ "message": "Děkujeme! Přijdeme tomu na kloub.",
+ "description": ""
+ },
+ "dnt_tooltip": {
+ "message": "Tato doména slibuje, že Vás nebude sledovat",
+ "description": "Tooltip shown when you hover over a DNT-compliant domain name in the list of domains in the popup or under the Tracking Domains tab on the options page."
+ },
+ "breakage_warning_tooltip": {
+ "message": "Blocking this domain is known to break websites",
+ "description": "Tooltip for a warning icon that appears when move a domain slider to 'red' (block) for a domain that was automatically set to 'yellow' (block cookies)."
+ },
+ "feed_the_badger_title": {
+ "message": "Click to return control of this domain to Privacy Badger",
+ "description": "Tooltip shown when you hover over an undo arrow that appears when you move a domain slider away from its automatic setting."
+ },
+ "next_section": {
+ "message": "další sekce",
+ "description": "Image alt. text on a couple of \"scroll down\" arrow buttons on the intro page."
+ },
+ "extension_error_text": {
+ "message": "Prosím, <a href='https://www.eff.org/privacybadger#faq-I-found-a-bug!-What-do-I-do-now?' target='_blank'>napište nám</a> o vzniklé chybě:",
+ "description": "Shown in the popup when there is a problem with the user's Privacy Badger extension that we want to encourage the user to tell us about."
+ },
+ "data_settings": {
+ "message": "Spravovat data",
+ "description": "This is an options page tab heading."
+ },
+ "report_title": {
+ "message": "Nahlásit chybu",
+ "description": ""
+ },
+ "whitelist_form_domain_input_placeholder": {
+ "message": "např. www.domain.com, *.domain.net, domain.org",
+ "description": "Placeholder text for the Add domain input under the Disabled Sites tab on the options page."
+ },
+ "domain_slider_cookieblock_tooltip": {
+ "message": "Kliknutím zde zakážete doméně nastavovat soubory cookies",
+ "description": "Tooltip shown when you hover over the center part of a slider shown for each domain in the domain list."
+ },
+ "options_domain_filter_block": {
+ "message": "blokované",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "options_webrtc_setting": {
+ "message": "Bránit uniku lokální IP adresy skrze WebRTC",
+ "description": "Checkbox label on the general settings page"
+ },
+ "intro_welcome": {
+ "message": "Privacy Badger se automaticky učí blokovat neviditelné sledovací prvky na webových stránkách. Jestliže máte minutku, ukážeme Vám jak.",
+ "description": "Intro page welcome paragraph."
+ },
+ "error_input": {
+ "message": "Co je špatně?",
+ "description": ""
+ },
+ "options_domain_list_tab": {
+ "message": "Sledovací domény",
+ "description": "This is an options page tab heading."
+ },
+ "share_button_title_twitter": {
+ "message": "Sdílet na Twitteru",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "first_run_text": {
+ "message": "Zjistěte, jak Privacy Badger chrání Vaše soukromí",
+ "description": "Part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "download": {
+ "message": "Stáhnout",
+ "description": ""
+ },
+ "import": {
+ "message": "Importovat",
+ "description": ""
+ },
+ "options_hide_social_widgets": {
+ "message": "Don't replace the following widgets:",
+ "description": "Multiple selection box on the widget replacement tab"
+ },
+ "options_social_widgets_checkbox": {
+ "message": "Enable widget replacement",
+ "description": "Checkbox label on the widget replacement tab"
+ },
+ "options_show_nontracking_domains_checkbox": {
+ "message": "Show domains that don't appear to be tracking you",
+ "description": "Checkbox label on the general settings page. Should match wording used in the 'non_tracker' message."
+ },
+ "report_button": {
+ "message": "Odeslat hlášení o chybě",
+ "description": ""
+ },
+ "badger_status_allow": {
+ "message": "Doména $DOMAIN je povolena",
+ "description": "Tooltip shown when you hover over a tracking but still allowed (green slider) domain name in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "privacy_badger_what_is": {
+ "message": "Co je to Privacy Badger?",
+ "description": ""
+ },
+ "options_domain_search": {
+ "message": "Hledat domény:",
+ "description": "Label for a text input box on the Tracking Domains options page tab."
+ },
+ "options_learn_setting": {
+ "message": "Learn to block new trackers from your browsing",
+ "description": "Checkbox label on the general settings page"
+ },
+ "local_learning_warning": {
+ "message": "Enabling learning may make you more identifiable to websites",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_incognito_setting": {
+ "message": "Učit se v Anonymním okně prohlížeče",
+ "description": "Checkbox label on the general settings page"
+ },
+ "options_incognito_warning": {
+ "message": "Jestliže povolíte učení v Anonymním okně, může zůstat na počítači Vaše historie procházení. Ve výchozím nastavení Privacy Badger blokuje v Anonymním okně pouze sledovací prvky, které již zná, ale nebude se snažit objevovat nové a učit se z nich. Zvažte zapnutí této možnosti v případě, že často používáte Anonymní okno.",
+ "description": "Tooltip on the general settings page"
+ },
+ "learning_prompt_text1": {
+ "message": "Privacy Badger will no longer learn from your browsing by default.",
+ "description": "First part of a prompt to visit the blog."
+ },
+ "learning_prompt_text2": {
+ "message": "Click below to learn more.",
+ "description": "Second part of a prompt to visit the blog."
+ },
+ "learning_prompt_button": {
+ "message": "Learn how Privacy Badger is changing",
+ "description": "Button text, part of a prompt to visit the blog."
+ },
+ "show_counter_checkbox": {
+ "message": "Show count of trackers",
+ "description": "Checkbox label on the general settings page"
+ },
+ "what_is_a_tracker": {
+ "message": "Co je to sledovací prvek?",
+ "description": "Tooltip that comes up when you hover over the 'tracking domains' link under the Tracking Domains tab on the options page."
+ },
+ "intro_report_button": {
+ "message": "Nezapomeňte prosím kliknout na tlačítko \"Rozbil Privacy Badger tuto stránku?\", jelikož respektujeme Vaše soukromí a neposíláme automatické hlášení o chybách.",
+ "description": "Intro page paragraph. The quoted message ('Did Privacy Badger break this site') should match the first part of the translation for the 'report_broken_site' message."
+ },
+ "options_title": {
+ "message": "Nastavení Privacy Badger",
+ "description": ""
+ },
+ "report_terms": {
+ "message": "This will automatically send the following information to EFF: the page you're currently visiting, your browser version, the version of Privacy Badger, and the state of all of the sliders on this page.",
+ "description": ""
+ },
+ "whitelisted_domains": {
+ "message": "Vyloučené stránky",
+ "description": "This is an options page tab heading."
+ },
+ "popup_enable_for_site": {
+ "message": "Zapnout Privacy Badger pro tuto stránku",
+ "description": ""
+ },
+ "options_domain_type_filter": {
+ "message": "Filtrovat podle druhu:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "import_successful": {
+ "message": "Seznam sledovacích prvků a nastavení bylo úspěšně aktualizováno!",
+ "description": ""
+ },
+ "export_user_data": {
+ "message": "Exportovat uživatelská data",
+ "description": ""
+ },
+ "manage_data_intro": {
+ "message": "Importováním uživatelských dat:<ul><li>přepíšete základní nastavení,</li><li>sloučíte seznamy vyloučených domén,</li><li>sloučíte seznamy sledovacích domén, které Privacy Badger objevil,</li><li>přepíšete nastavení posuvníků.</li></ul>",
+ "description": "A brief explanation of what happens when you import Badger user data. Shown above the import/export user data buttons under the Manage Data options page tab."
+ },
+ "reset": {
+ "message": "Resetovat",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "reset_data": {
+ "message": "Resetovat seznam sledovacích domén",
+ "description": "Caption above reset button"
+ },
+ "reset_data_confirm": {
+ "message": "Resetování sledovacích domén způsobí:\n\n • Všechna data o sledovacích doménách, které se Privacy Badger naučil během Vašeho používání, budou smazána.\n • Seznam sledovacích domén se obnoví do základního nastavení (na adrese www.eff.org/badger-pretraining naleznete více informací).",
+ "description": "Pop-up triggered when the reset_data button is clicked"
+ },
+ "remove_all": {
+ "message": "Odstranit vše",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "remove_all_data": {
+ "message": "Odstranit všechny sledovací domény",
+ "description": "Caption above remove_all button"
+ },
+ "remove_all_data_confirm": {
+ "message": "Odstranění všech sledovacích domén způsobí:\n\n • Všechny zjištěné údaje o sledovacích doménách budou smazána.\n • Privacy Badger nebude nic blokovat, dokud se opětovně nenaučí odhalovat sledovací domény během Vašeho procházení internetu.",
+ "description": "Pop-up triggered when the remove_all_data button is clicked"
+ },
+ "intro_text1": {
+ "message": "Nyní Vás chrání Privacy Badger.",
+ "description": "First part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "intro_text2": {
+ "message": "Pokud chcete vědět, jak Privacy Badger funguje, klikněte níže pro rychlý tutoriál.",
+ "description": "Second part of a reminder to visit the intro page"
+ },
+ "options_webrtc_warning": {
+ "message": "Skrze WebRTC může unikat Vaše lokání IP adresa. Jestliže povolíte toto nastavení, kvalita Vašich hovorů na službách jako jsou Google Hangouts se může zhoršit.",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_general_settings": {
+ "message": "Obecná nastavení",
+ "description": "This is an options page tab heading."
+ },
+ "options_privacy_settings": {
+ "message": "Privacy",
+ "description": "Subheading on the general settings options page."
+ },
+ "options_advanced_settings": {
+ "message": "Advanced",
+ "description": "Subheading on the general settings options page."
+ },
+ "intro_next_button": {
+ "message": "Spustit prohlídku",
+ "description": "Intro page welcome button."
+ },
+ "domain_slider_block_tooltip": {
+ "message": "Kliknutím zde doménu zablokujete úplně",
+ "description": "Tooltip shown when you hover over the leftmost part of a slider shown for each domain in the domain list."
+ },
+ "version": {
+ "message": "verze $VERSION_STRING$",
+ "description": "Shows Privacy Badger's version in the popup. For example, \"version 2018.8.1\".",
+ "placeholders": {
+ "version_string": {
+ "content": "$1",
+ "example": "2018.8.1"
+ }
+ }
+ },
+ "badger_status_cookieblock": {
+ "message": "Blokovány soubory cookies z domény $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a yellow slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "options_domain_filter_cookieblock": {
+ "message": "částečně blokované",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "show_tracking_domains_acknowledgement": {
+ "message": "Rozumím, přesto mi ukažte seznam sledovacích domén",
+ "description": "Acknowledgement shown next to the checkbox required to reveal the tracking domains list on the options page."
+ },
+ "firstRun_title": {
+ "message": "Děkujeme Vám za instalaci Privacy Badger!",
+ "description": ""
+ },
+ "import_select_file": {
+ "message": "Vyberte prosím soubor pro importování.",
+ "description": ""
+ },
+ "report_broken_site": {
+ "message": "Rozbil Privacy Badger tuto stránku? Dejte nám vědět!",
+ "description": "Button in the popup."
+ },
+ "tooltip_cookieblock": {
+ "message": "Umístěte posuvník doprostřed pro zablokování souborů cookies",
+ "description": ""
+ },
+ "intro_learns": {
+ "message": "Learns automatically",
+ "description": "Intro page paragraph heading"
+ },
+ "intro_learns_paragraph": {
+ "message": "Instead of keeping lists of what to block, Privacy Badger automatically discovers trackers based on their behavior.",
+ "description": "Intro page paragraph"
+ },
+ "intro_beyond_ads": {
+ "message": "Chytá zákeřné sledovací prvky",
+ "description": "Intro page paragraph heading."
+ },
+ "intro_beyond_ads_paragraph": {
+ "message": "Invisible tracking happens in all sorts of ways; ads are just the visible tip of the iceberg. Privacy Badger sends the <a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control signal</a>, to opt you out of data sharing and selling, and the <a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track signal</a> to tell companies not to track you. If they ignore your wishes, Privacy Badger will learn to block them—whether they are advertisers or trackers of other kinds.",
+ "description": "Intro page paragraph."
+ },
+ "report_close": {
+ "message": "Zavřít",
+ "description": ""
+ },
+ "import_user_data": {
+ "message": "Importovat uživatelská data",
+ "description": ""
+ },
+ "options_domain_filter_dnt": {
+ "message": "v souladu s Do Not Track",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "popup_help_button": {
+ "message": "Nápověda",
+ "description": "Tooltip that comes up when you hover over the question mark button in the upper right corner of the popup."
+ },
+ "options_domain_filter_allow": {
+ "message": "povolené",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "intro_donate_heading": {
+ "message": "Snaha o soukromí je týmový sport!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "show_tracking_domains_message": {
+ "message": "Obvykle zde nemusíte nic upravovat.",
+ "description": "Shown above the acknowledgement checkbox required to reveal the tracking domains list on the options page. This is the second paragraph; the first paragraph is the message under the \"intro_not_an_adblocker_paragraph\" key."
+ },
+ "options_domain_filter_all": {
+ "message": "všechny",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "report_cancel": {
+ "message": "Zrušit",
+ "description": ""
+ },
+ "tooltip_block": {
+ "message": "Posuňte posuvník vlevo pro zablokování domény",
+ "description": ""
+ },
+ "options_enable_dnt_checkbox": {
+ "message": "Send websites the \"<a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>\" and \"<a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>\" signals",
+ "description": "Checkbox label for enabling/disabling the Sec-GPC and DNT signals, found on the general settings page"
+ },
+ "options_disable_google_nav_error_service": {
+ "message": "Disable sending web addresses you visit to Google. This disables suggestions for similar pages when a page can't be found.",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_disable_hyperlink_auditing": {
+ "message": "Disable hyperlink auditing",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_domain_filter_user": {
+ "message": "nastavené uživatelem",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "disabled_for_these_domains": {
+ "message": "<p>Privacy Badger is disabled on the following sites. This means that Privacy Badger will not block anything when you visit the sites listed here, and it will not send the Do Not Track or Global Privacy Control signals.</p><p>If you think Privacy Badger is breaking a page, or you would like to allow a particular site to share or sell your data, you can type that page's domain in the box below and click the \"Add domain\" button.</p><p>Alternatively, when you already have the page's tab selected, you can just click on Privacy Badger's button in the browser toolbar and then click the \"Disable\" button.</p>",
+ "description": ""
+ },
+ "popup_instructions": {
+ "message": "$COUNT$ potential $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Popup message shown when at least one tracker was blocked.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_instructions_no_trackers": {
+ "message": "No $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Text shown in the popup when there are no trackers on the page.",
+ "placeholders": {
+ "link_start": {
+ "content": "$1",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_blocked": {
+ "message": "There are no third party resources on this page. Hooray for privacy!",
+ "description": "Text shown in the popup when showing non-tracking domains is enabled, and there are no third-party domains on the page."
+ },
+ "intro_by_eff": {
+ "message": "Projekt Electronic Frontier Foundation",
+ "description": ""
+ },
+ "add_domain_button": {
+ "message": "Přidat doménu",
+ "description": ""
+ },
+ "tooltip_allow": {
+ "message": "Posuňte posuvník vpravo pro povolení domény",
+ "description": ""
+ },
+ "popup_disable_for_site": {
+ "message": "Vypnout Privacy Badger pro tuto stránku",
+ "description": "Button in the popup."
+ },
+ "domain_slider_allow_tooltip": {
+ "message": "Klikněte zde pro povolení této domény",
+ "description": "Tooltip shown when you hover over the rightmost part of a slider shown for each domain in the domain list."
+ },
+ "intro_privacy_note": {
+ "message": "Privacy Badger NIKDY nesdílí žádná data o Vašem procházení, jestliže se k tomu sami nerozhodnete.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_list_trackers": {
+ "message": "Privacy Badger has decided to block $COUNT$ potential $TRACKER_LINK_START$tracking domains$TRACKER_LINK_END$ so far",
+ "description": "Shown on the Tracking Domains tab on the options page after Privacy Badger learned to block one or more domains",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "900"
+ },
+ "tracker_link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "tracker_link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "options_domain_list_no_trackers": {
+ "message": "Privacy Badger zatím neobjevil žádné <a target='_blank' tabindex=-1 title='i18n_what_is_a_tracker' class='tooltip' href='https://www.eff.org/privacybadger#faq-What-is-a-third-party-tracker?'>sledovací domény</a>. Můžete pokračovat v procházení internetu!",
+ "description": "Shown on the Tracking Domains tab on the options page if all tracking domains have been removed."
+ },
+ "name": {
+ "message": "Privacy Badger",
+ "description": ""
+ },
+ "intro_not_an_adblocker_paragraph": {
+ "message": "Privacy Badger začne blokovat prvek teprve ve chvíli, kdy jej najde na třech různých webových stránkách. Tři zářezy a jde ze hry!",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_status_filter": {
+ "message": "Filtrovat podle stavu:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "report_text": {
+ "message": "Níže stručně popište chybu.",
+ "description": ""
+ },
+ "remove_button": {
+ "message": "Smazat vybrané",
+ "description": "This is the label for the 'Remove selected' buttons."
+ },
+ "intro_donate1": {
+ "message": "Používáním rozšíření Privacy Badger se připojíte k organizaci <a href='https://www.eff.org/' target='_blank'>Electronic Frontier Foundation</a> a milionům dalších uživatelů k boji za soukromí. Jsme nezisková organizace, která bojuje za Vaše práva na internetu. Děkujeme, že jste s námi!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "options_domain_search_tooltip": {
+ "message": "Pro vyloučení určitých domén z vyhledávní přidejte před hledaný výraz znak \"-\". Například jestliže chcete najít všechny domény .co a .co.uk, ale chcete vynechat doménu .com, můžete použít hledání \".co -.com\".",
+ "description": "Tooltip for an \"information\" icon next to the domain search input on the Tracking Domains options page tab."
+ },
+ "intro_disable_button": {
+ "message": "Pokud si myslíte, že Privacy Badger rozbil nějakou webovou stránku (například se nezobrazí video), můžete kliknout na tlačítko \"Vypnout Privacy Badger pro tuto stránku\", díky čemuž nebude Privacy Badger na této stránce aktivní.",
+ "description": "Intro page paragraph. The quoted string ('Disable') should match the verb used for the 'popup_disable_for_site' message."
+ },
+ "intro_link_policy": {
+ "message": "Zásady ochrany osobních údajů",
+ "description": "Shown at the bottom of the intro page, links to the EFF software and technology projects privacy policy."
+ },
+ "report_input_label": {
+ "message": "Popis",
+ "description": ""
+ },
+ "not_yet_blocked_header": {
+ "message": "Your Badger hasn't decided yet if these domains should get blocked",
+ "description": "Popup domain list header text; separates blocked from haven't-yet-seen-enough-to-block potential trackers."
+ },
+ "options_show_not_yet_blocked": {
+ "message": "Show domains your Badger hasn't decided yet to block:",
+ "description": "Label for a checkbox on the Tracking Domains options page tab. Should match wording used in the 'not_yet_blocked_header' message."
+ },
+ "non_tracker": {
+ "message": "Domény níže nevypadají, že Vás sledují",
+ "description": "Header text; separates tracking from non-tracking domains in the popup."
+ },
+ "popup_options_button": {
+ "message": "Nastavení",
+ "description": ""
+ },
+ "share_button_title_facebook": {
+ "message": "Sdílet na Facebooku",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "description": {
+ "message": "Privacy Badger se automaticky učí blokovat neviditelné sledovací prvky na webových stránkách.",
+ "description": ""
+ },
+ "report_fail": {
+ "message": "Jejda. Něco se pokazilo.",
+ "description": ""
+ },
+ "social_tooltip_pb_has_replaced": {
+ "message": "Privacy Badger nahradil toto $BUTTON$ tlačítko",
+ "description": "Tooltip shown over a replaced social button. For example, \"Privacy Badger has replaced this Facebook Like button\". See also the widget_placeholder_pb_has_replaced message.",
+ "placeholders": {
+ "button": {
+ "content": "$1",
+ "example": "Facebook Like"
+ }
+ }
+ },
+ "widget_placeholder_pb_has_replaced": {
+ "message": "Privacy Badger has replaced this $WIDGET$ widget",
+ "description": "Text shown inside a replaced widget's placeholder. For example, \"Privacy Badger has replaced this Google reCAPTCHA widget\". See also the social_tooltip_pb_has_replaced message.",
+ "placeholders": {
+ "widget": {
+ "content": "$1",
+ "example": "Google reCAPTCHA"
+ }
+ }
+ },
+ "allow_once": {
+ "message": "Allow once",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking it will allow the third-party widget to load this one time only."
+ },
+ "allow_on_site": {
+ "message": "Povolit vždy na tomto webu",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking this button will always allow the widget to load on this particular site."
+ },
+ "sync_intro": {
+ "message": "Synchronizace s cloudovou službou:<ul><li>Vyžaduje účet pro synchronizaci dat prohlížeče Firefox nebo Google Chrome.</li><li>Nahráním údajů přepíšete veškerá předchozí data rozšíření Privacy Badger na cloudu.</li><li>Stáhnutím dat z cloudu se sjednotí seznamy domén, na kterých je Privacy Badger vypnutý.</li></ul>",
+ "description": "A brief explanation of how syncing works. Shown above the upload/download cloud data buttons under the Manage Data options page tab."
+ },
+ "upload": {
+ "message": "Nahrát",
+ "description": "Button label for uploading data to the cloud on Manage Data options page tab."
+ },
+ "upload_cloud": {
+ "message": "Nahrát vyloučené stránky na cloud",
+ "description": "Button title for uploading data to the cloud on Manage Data options page tab."
+ },
+ "download_cloud": {
+ "message": "Importovat vyloučené stránky z cloudu",
+ "description": "Button title for downloading data from the cloud on Manage Data options page tab."
+ },
+ "download_cloud_success": {
+ "message": "Data z cloudu byla úspěšně importována.",
+ "description": "Message displayed to the user after successfully merging cloud data."
+ },
+ "download_cloud_failure": {
+ "message": "Data z cloudu nemohla být stáhnuta.",
+ "description": "Message displayed to the user after failing to download cloud data."
+ },
+ "upload_cloud_success": {
+ "message": "Data byla úspěšně nahrána na cloud.",
+ "description": "Message displayed to the user after successfully uploading local data."
+ },
+ "upload_cloud_failure": {
+ "message": "Data nemohla být nahrána na cloud.",
+ "description": "Message displayed to the user after failing to upload local data."
+ },
+ "download_cloud_no_data": {
+ "message": "Žádná data z cloudu nejsou k dispozici ke stažení.",
+ "description": "'Error' message when there is on cloud data to download."
+ },
+ "share_title": {
+ "message": "Povězte to svým přátelům",
+ "description": "Title of the share overlay."
+ },
+ "popup_share_button": {
+ "message": "Sdílet",
+ "description": "Tooltip that comes up when you hover over the share button in the upper right corner of the popup."
+ },
+ "share_tracker_header": {
+ "message": "Privacy Badger blocked $COUNT$ potential trackers on $DOMAIN$:",
+ "description": "Header above the list of tracking domains in the share message.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "domain": {
+ "content": "$2",
+ "example": "example.com"
+ }
+ }
+ },
+ "share_base_message": {
+ "message": "Privacy Badger (www.eff.org/privacybadger) je rozšíření prohlížeče, které automaticky detekuje neviditelné sledovací prvky. Privacy Badger je tvořen kolektivem Electronic Frontier Foundation, neziskovou organizací, která bojuje za Vaše práva na internetu.",
+ "description": "The base message that is always included in the share message."
+ },
+ "copy_button_initial": {
+ "message": "Zkopírovat do schránky",
+ "description": "Initial text of the copy button on the share overlay."
+ },
+ "copy_button_copied": {
+ "message": "Zkopírováno",
+ "description": "On-click text of the copy button on the share overlay."
+ },
+ "popup_special_page_header": {
+ "message": "Nothing to do on this page",
+ "description": "Heading for popup_special_page_paragraph"
+ },
+ "popup_special_page_paragraph": {
+ "message": "Privacy Badger doesn't work on special pages like this one. Try browsing somewhere else.",
+ "description": "Shown in the popup for special browser pages such as the New Tab page and 'about:' pages."
+ },
+ "popup_disabled_site_header": {
+ "message": "Privacy Badger is disabled on this site",
+ "description": "Shown in the popup on disabled sites."
+ },
+ "options_widget_replacement_tab": {
+ "message": "Widget Replacement",
+ "description": "Options page tab heading"
+ },
+ "options_widget_replacement_desc": {
+ "message": "When blocking social buttons and other potentially useful (video, audio, comments) widgets, Privacy Badger can replace them with click-to-activate placeholders.",
+ "description": "Introduction to the Widget Replacement tab on the options page."
+ }
+} \ No newline at end of file
diff --git a/src/_locales/da/messages.json b/src/_locales/da/messages.json
new file mode 100644
index 0000000..0fcd47c
--- /dev/null
+++ b/src/_locales/da/messages.json
@@ -0,0 +1,677 @@
+{
+ "badger_status_block": {
+ "message": "Blokerede $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a red slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "invalid_json": {
+ "message": "Ugyldig JSON-fil.",
+ "description": ""
+ },
+ "options_remove_origin_confirm": {
+ "message": "Er du sikker på at du vil fjerne dette domæne fra Privacy Badger?",
+ "description": "Confirmation shown when you click to remove a domain from Privacy Badger's tracking domains list on the options page."
+ },
+ "badger_status_noaction": {
+ "message": "Ingen sporing fra $DOMAIN$",
+ "description": "Tooltip shown when you hover over a non-tracking domain name with a green slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "non_tracker_tip": {
+ "message": "I øjeblikket tjekker Privacy Badger kun om tredjeparter bruger cookies, HTML5 lokal lagring, eller kanvasfingeraftryk til at spore din netlæsning. Nogle af disse domæner kan bruge sporingsmetoder som Privacy Badger ikke kan opdage.",
+ "description": ""
+ },
+ "options_dnt_policy_setting": {
+ "message": "Tjek om <a target='_blank' href='https://www.eff.org/privacybadger/faq#What-is-a-third-party-tracker'>tredjepartsdomæner</a> overholder <a target='_blank' href='https://www.eff.org/dnt-policy'>EFFs \"Spor Ikke\"-politik</a>",
+ "description": "Checkbox label on the general settings page"
+ },
+ "invalid_domain": {
+ "message": "Tilføj venligst et gyldigt domæne eller URL.",
+ "description": ""
+ },
+ "donate_to_eff": {
+ "message": "Doner til EFF",
+ "description": "Button shown in the popup and on the intro page."
+ },
+ "intro_donate_subheading": {
+ "message": "Hjælp os ved at donere og dele din støtte til vores væktøjer",
+ "description": "Shown below the Donate button on the intro page."
+ },
+ "intro_not_an_adblocker": {
+ "message": "Ikke en reklameblokering, jeg er anderledes",
+ "description": "Intro page paragraph heading."
+ },
+ "report_success": {
+ "message": "Tak! Vi skal nok komme til bunds i det.",
+ "description": ""
+ },
+ "dnt_tooltip": {
+ "message": "Dette domæne lover ikke at spore dig",
+ "description": "Tooltip shown when you hover over a DNT-compliant domain name in the list of domains in the popup or under the Tracking Domains tab on the options page."
+ },
+ "breakage_warning_tooltip": {
+ "message": "Nogle netsteder virker ikke når dette domæne blokeres",
+ "description": "Tooltip for a warning icon that appears when move a domain slider to 'red' (block) for a domain that was automatically set to 'yellow' (block cookies)."
+ },
+ "feed_the_badger_title": {
+ "message": "Klik for at give Privacy Badger kontrol over dette domæne",
+ "description": "Tooltip shown when you hover over an undo arrow that appears when you move a domain slider away from its automatic setting."
+ },
+ "next_section": {
+ "message": "næste sektion",
+ "description": "Image alt. text on a couple of \"scroll down\" arrow buttons on the intro page."
+ },
+ "extension_error_text": {
+ "message": "<a href='https://www.eff.org/privacybadger#faq-I-found-a-bug!-What-do-I-do-now?' target='_blank'>Fortæl os</a> om følgende fejl:",
+ "description": "Shown in the popup when there is a problem with the user's Privacy Badger extension that we want to encourage the user to tell us about."
+ },
+ "data_settings": {
+ "message": "Håndter Data",
+ "description": "This is an options page tab heading."
+ },
+ "report_title": {
+ "message": "Rapporter en fejl",
+ "description": ""
+ },
+ "whitelist_form_domain_input_placeholder": {
+ "message": "fx www.domain.com, *.domain.net, domain.org",
+ "description": "Placeholder text for the Add domain input under the Disabled Sites tab on the options page."
+ },
+ "domain_slider_cookieblock_tooltip": {
+ "message": "Klik her for at blokere dette domæne fra at sætte cookies",
+ "description": "Tooltip shown when you hover over the center part of a slider shown for each domain in the domain list."
+ },
+ "options_domain_filter_block": {
+ "message": "blokeret",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "options_webrtc_setting": {
+ "message": "Forhindr WebRTC i at lække lokal IP-adresse",
+ "description": "Checkbox label on the general settings page"
+ },
+ "intro_welcome": {
+ "message": "Privacy Badger lærer automatisk at blokere usynlige sporinger. Brug et minut på at se hvordan.",
+ "description": "Intro page welcome paragraph."
+ },
+ "error_input": {
+ "message": "Hvad er der galt?",
+ "description": ""
+ },
+ "options_domain_list_tab": {
+ "message": "Sporingsdomæner",
+ "description": "This is an options page tab heading."
+ },
+ "share_button_title_twitter": {
+ "message": "Del på Twitter",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "first_run_text": {
+ "message": "Lær hvordan Privacy Badger beskytter dit privatliv",
+ "description": "Part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "download": {
+ "message": "Hent",
+ "description": ""
+ },
+ "import": {
+ "message": "Importer",
+ "description": ""
+ },
+ "options_hide_social_widgets": {
+ "message": "Udskift ikke følgende ting:",
+ "description": "Multiple selection box on the widget replacement tab"
+ },
+ "options_social_widgets_checkbox": {
+ "message": "Aktiver udskiftning",
+ "description": "Checkbox label on the widget replacement tab"
+ },
+ "options_show_nontracking_domains_checkbox": {
+ "message": "Vis domæner der ser ud til ikke at spore dig",
+ "description": "Checkbox label on the general settings page. Should match wording used in the 'non_tracker' message."
+ },
+ "report_button": {
+ "message": "Indsend fejl",
+ "description": ""
+ },
+ "badger_status_allow": {
+ "message": "Tillod $DOMAIN$",
+ "description": "Tooltip shown when you hover over a tracking but still allowed (green slider) domain name in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "privacy_badger_what_is": {
+ "message": "Hvad er Privacy Badger?",
+ "description": ""
+ },
+ "options_domain_search": {
+ "message": "Søg domæner:",
+ "description": "Label for a text input box on the Tracking Domains options page tab."
+ },
+ "options_learn_setting": {
+ "message": "Learn to block new trackers from your browsing",
+ "description": "Checkbox label on the general settings page"
+ },
+ "local_learning_warning": {
+ "message": "Enabling learning may make you more identifiable to websites",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_incognito_setting": {
+ "message": "Lær i Private/Inkognito-vinduer",
+ "description": "Checkbox label on the general settings page"
+ },
+ "options_incognito_warning": {
+ "message": "At aktivere læring i Private/Inkognito-vinduer kan efterlade spor af din private browsinghistorik på din computer. Som standard vil Privacy Badger blokere sporinger den allerede kender til i Private/Inkognito-vinduer, men den vil ikke lære om nye sporinger. Du vil muligvis slå denne indsilling til hvis du browser meget med Private/Inkognito-vinduer.",
+ "description": "Tooltip on the general settings page"
+ },
+ "learning_prompt_text1": {
+ "message": "Privacy Badger will no longer learn from your browsing by default.",
+ "description": "First part of a prompt to visit the blog."
+ },
+ "learning_prompt_text2": {
+ "message": "Click below to learn more.",
+ "description": "Second part of a prompt to visit the blog."
+ },
+ "learning_prompt_button": {
+ "message": "Learn how Privacy Badger is changing",
+ "description": "Button text, part of a prompt to visit the blog."
+ },
+ "show_counter_checkbox": {
+ "message": "Vis antal sporinger",
+ "description": "Checkbox label on the general settings page"
+ },
+ "what_is_a_tracker": {
+ "message": "Hvad er en sporing?",
+ "description": "Tooltip that comes up when you hover over the 'tracking domains' link under the Tracking Domains tab on the options page."
+ },
+ "intro_report_button": {
+ "message": "Glem ikke at klikke på 'Ødelagde Privacy Badger dette netsted'. Vi respekterer dit privatliv, så vi sender ikke automatiske rapporter.",
+ "description": "Intro page paragraph. The quoted message ('Did Privacy Badger break this site') should match the first part of the translation for the 'report_broken_site' message."
+ },
+ "options_title": {
+ "message": "Privacy Badger Indstillinger",
+ "description": ""
+ },
+ "report_terms": {
+ "message": "This will automatically send the following information to EFF: the page you're currently visiting, your browser version, the version of Privacy Badger, and the state of all of the sliders on this page.",
+ "description": ""
+ },
+ "whitelisted_domains": {
+ "message": "Deaktiverede Steder",
+ "description": "This is an options page tab heading."
+ },
+ "popup_enable_for_site": {
+ "message": "Aktiver Privacy Badger for dette netsted",
+ "description": ""
+ },
+ "options_domain_type_filter": {
+ "message": "Filtrer efter type:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "import_successful": {
+ "message": "Sporingsliste og opsætning successfuldt opdateret!",
+ "description": ""
+ },
+ "export_user_data": {
+ "message": "Eksporter brugerdata",
+ "description": ""
+ },
+ "manage_data_intro": {
+ "message": "Import af brugerdata:<ul><li>Overskriver generelle indstillinger</li><li>Kombinerer lister over deaktiverede steder</li><li>Kombinerer informationer om hvilke sporinger Privacy Badger har set</li><li>Overskriver skyderes brugerindstillinger</li></ul>",
+ "description": "A brief explanation of what happens when you import Badger user data. Shown above the import/export user data buttons under the Manage Data options page tab."
+ },
+ "reset": {
+ "message": "Nulstil",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "reset_data": {
+ "message": "Nulstil sporingsdomæner",
+ "description": "Caption above reset button"
+ },
+ "reset_data_confirm": {
+ "message": "Nulstilling af sporingsdomæner vil:\n\n• Slette alle data om sporinger som Privacy Badger har lært fra din browsning.\n• Gendanner listen over sporingdomæner til den seneste før-trænede liste (besøg www.eff.org/badger-pretraining for at lære mere)",
+ "description": "Pop-up triggered when the reset_data button is clicked"
+ },
+ "remove_all": {
+ "message": "Fjern alle",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "remove_all_data": {
+ "message": "Fjern alle sporingsdomæner",
+ "description": "Caption above remove_all button"
+ },
+ "remove_all_data_confirm": {
+ "message": "At fjerne alle sporingsdomæner vil:\n\n• Slette alt Privacy Badger ved om sporinger\n• Få Privacy Badger til ikke at blokere noget indtil den har haft en chance til igen at lære fra din browsning",
+ "description": "Pop-up triggered when the remove_all_data button is clicked"
+ },
+ "intro_text1": {
+ "message": "Du er nu beskyttet af Privacy Badger.",
+ "description": "First part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "intro_text2": {
+ "message": "For at lære hvordan Privacy Badger virker, klik herunder for en hurtig gennemgang.",
+ "description": "Second part of a reminder to visit the intro page"
+ },
+ "options_webrtc_warning": {
+ "message": "WebRTC kan lække din lokale IP-addresse. Bemærk at aktivering af denne funktion kan have en negativ effekt på ydeevnen af webkonferenceprogrammer som Google Hangouts.",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_general_settings": {
+ "message": "Generelle Indstillinger",
+ "description": "This is an options page tab heading."
+ },
+ "options_privacy_settings": {
+ "message": "Privacy",
+ "description": "Subheading on the general settings options page."
+ },
+ "options_advanced_settings": {
+ "message": "Advanced",
+ "description": "Subheading on the general settings options page."
+ },
+ "intro_next_button": {
+ "message": "Tag turen",
+ "description": "Intro page welcome button."
+ },
+ "domain_slider_block_tooltip": {
+ "message": "Klik her for at blokere dette domæne fuldstændigt",
+ "description": "Tooltip shown when you hover over the leftmost part of a slider shown for each domain in the domain list."
+ },
+ "version": {
+ "message": "version $VERSION_STRING$",
+ "description": "Shows Privacy Badger's version in the popup. For example, \"version 2018.8.1\".",
+ "placeholders": {
+ "version_string": {
+ "content": "$1",
+ "example": "2018.8.1"
+ }
+ }
+ },
+ "badger_status_cookieblock": {
+ "message": "Blokerede cookies fra $DOMAIN$",
+ "description": "Tooltip shown when you hover over a domain name with a yellow slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "options_domain_filter_cookieblock": {
+ "message": "delvist blokeret",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "show_tracking_domains_acknowledgement": {
+ "message": "Jeg forstår; vis mig listen over sporingsdomæner alligevel",
+ "description": "Acknowledgement shown next to the checkbox required to reveal the tracking domains list on the options page."
+ },
+ "firstRun_title": {
+ "message": "Tak for at installere Privacy Badger!",
+ "description": ""
+ },
+ "import_select_file": {
+ "message": "Vælg en fil at importere.",
+ "description": ""
+ },
+ "report_broken_site": {
+ "message": "Ødelagde Privacy Badger dette netsted? Fortæl os om det!",
+ "description": "Button in the popup."
+ },
+ "tooltip_cookieblock": {
+ "message": "Centrer skyderen for at blokere cookies",
+ "description": ""
+ },
+ "intro_learns": {
+ "message": "Learns automatically",
+ "description": "Intro page paragraph heading"
+ },
+ "intro_learns_paragraph": {
+ "message": "Instead of keeping lists of what to block, Privacy Badger automatically discovers trackers based on their behavior.",
+ "description": "Intro page paragraph"
+ },
+ "intro_beyond_ads": {
+ "message": "Fanger luskede sporinger",
+ "description": "Intro page paragraph heading."
+ },
+ "intro_beyond_ads_paragraph": {
+ "message": "Invisible tracking happens in all sorts of ways; ads are just the visible tip of the iceberg. Privacy Badger sends the <a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control signal</a>, to opt you out of data sharing and selling, and the <a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track signal</a> to tell companies not to track you. If they ignore your wishes, Privacy Badger will learn to block them—whether they are advertisers or trackers of other kinds.",
+ "description": "Intro page paragraph."
+ },
+ "report_close": {
+ "message": "Luk",
+ "description": ""
+ },
+ "import_user_data": {
+ "message": "Importer brugerdata",
+ "description": ""
+ },
+ "options_domain_filter_dnt": {
+ "message": "\"Spor ikke\"-kompatibel",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "popup_help_button": {
+ "message": "Hjælp",
+ "description": "Tooltip that comes up when you hover over the question mark button in the upper right corner of the popup."
+ },
+ "options_domain_filter_allow": {
+ "message": "tilladt",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "intro_donate_heading": {
+ "message": "Privatliv er en gruppesport!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "show_tracking_domains_message": {
+ "message": "Du burde ikke have nødigt at ændre noget her.",
+ "description": "Shown above the acknowledgement checkbox required to reveal the tracking domains list on the options page. This is the second paragraph; the first paragraph is the message under the \"intro_not_an_adblocker_paragraph\" key."
+ },
+ "options_domain_filter_all": {
+ "message": "alle",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "report_cancel": {
+ "message": "Annuller",
+ "description": ""
+ },
+ "tooltip_block": {
+ "message": "Flyt skyderen til venstre for at blokere et domæne",
+ "description": ""
+ },
+ "options_enable_dnt_checkbox": {
+ "message": "Send websites the \"<a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>\" and \"<a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>\" signals",
+ "description": "Checkbox label for enabling/disabling the Sec-GPC and DNT signals, found on the general settings page"
+ },
+ "options_disable_google_nav_error_service": {
+ "message": "Disable sending web addresses you visit to Google. This disables suggestions for similar pages when a page can't be found.",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_disable_hyperlink_auditing": {
+ "message": "Disable hyperlink auditing",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_domain_filter_user": {
+ "message": "brugerstyret",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "disabled_for_these_domains": {
+ "message": "<p>Privacy Badger is disabled on the following sites. This means that Privacy Badger will not block anything when you visit the sites listed here, and it will not send the Do Not Track or Global Privacy Control signals.</p><p>If you think Privacy Badger is breaking a page, or you would like to allow a particular site to share or sell your data, you can type that page's domain in the box below and click the \"Add domain\" button.</p><p>Alternatively, when you already have the page's tab selected, you can just click on Privacy Badger's button in the browser toolbar and then click the \"Disable\" button.</p>",
+ "description": ""
+ },
+ "popup_instructions": {
+ "message": "$COUNT$ potential $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Popup message shown when at least one tracker was blocked.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_instructions_no_trackers": {
+ "message": "No $LINK_START$trackers$LINK_END$ blocked",
+ "description": "Text shown in the popup when there are no trackers on the page.",
+ "placeholders": {
+ "link_start": {
+ "content": "$1",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_blocked": {
+ "message": "There are no third party resources on this page. Hooray for privacy!",
+ "description": "Text shown in the popup when showing non-tracking domains is enabled, and there are no third-party domains on the page."
+ },
+ "intro_by_eff": {
+ "message": "Et projekt fra Electronic Frontier Foundation",
+ "description": ""
+ },
+ "add_domain_button": {
+ "message": "Tilføj domæne",
+ "description": ""
+ },
+ "tooltip_allow": {
+ "message": "Flyt skyderen til højre for at tillade domænet",
+ "description": ""
+ },
+ "popup_disable_for_site": {
+ "message": "Deaktiver Privacy Badger for dette netsted",
+ "description": "Button in the popup."
+ },
+ "domain_slider_allow_tooltip": {
+ "message": "Klik her for at tillade dette domæne",
+ "description": "Tooltip shown when you hover over the rightmost part of a slider shown for each domain in the domain list."
+ },
+ "intro_privacy_note": {
+ "message": "Privacy Badger vil ALDRIG dele data om din browsning, med mindre du vælger at dele det.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_list_trackers": {
+ "message": "Privacy Badger has decided to block $COUNT$ potential $TRACKER_LINK_START$tracking domains$TRACKER_LINK_END$ so far",
+ "description": "Shown on the Tracking Domains tab on the options page after Privacy Badger learned to block one or more domains",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "900"
+ },
+ "tracker_link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "tracker_link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "options_domain_list_no_trackers": {
+ "message": "Privacy Badger har ikke opdaget nogle <a target='_blank' tabindex=-1 title='i18n_what_is_a_tracker' class='tooltip' href='https://www.eff.org/privacybadger#faq-What-is-a-third-party-tracker?'>sporingsdomæner</a> endnu. Fortsæt med at browse!",
+ "description": "Shown on the Tracking Domains tab on the options page if all tracking domains have been removed."
+ },
+ "name": {
+ "message": "Privacy Badger",
+ "description": ""
+ },
+ "intro_not_an_adblocker_paragraph": {
+ "message": "Privacy Badger starts blocking once it sees the same tracker on three different websites. Three strikes and it's out!",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_status_filter": {
+ "message": "Filtrer efter status:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "report_text": {
+ "message": "Beskriv fejlen kort herunder.",
+ "description": ""
+ },
+ "remove_button": {
+ "message": "Fjern valgte",
+ "description": "This is the label for the 'Remove selected' buttons."
+ },
+ "intro_donate1": {
+ "message": "Når du bruger Privacy Badger, tilslutter du dig <a href='https://www.eff.org/' target='_blank'>Electronic Frontier Foundation</a> og millioner af andre brugere i kampen for privatliv. Vi er en nonprofit organisation der kæmper for dine rettigheder online. Tak for at slutte dig til os!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "options_domain_search_tooltip": {
+ "message": "Sæt \"-\" foran dine søgeudtryk for at udelukke domæner. For eksempel vil \".co -.com\" vise .co og .co.uk men ikke .com-domæner.",
+ "description": "Tooltip for an \"information\" icon next to the domain search input on the Tracking Domains options page tab."
+ },
+ "intro_disable_button": {
+ "message": "Hvis du tror at Privacy Badger ødelægger en side (f.eks. en video spiller ikke), kan du klikke på \"Deaktiver\"-knappen for at slå Privacy Badger fra på det netsted.",
+ "description": "Intro page paragraph. The quoted string ('Disable') should match the verb used for the 'popup_disable_for_site' message."
+ },
+ "intro_link_policy": {
+ "message": "Privatlivspolitik",
+ "description": "Shown at the bottom of the intro page, links to the EFF software and technology projects privacy policy."
+ },
+ "report_input_label": {
+ "message": "Beskrivelse",
+ "description": ""
+ },
+ "not_yet_blocked_header": {
+ "message": "Din Badger har endnu ikke besluttet om disse domæner skal blokeres",
+ "description": "Popup domain list header text; separates blocked from haven't-yet-seen-enough-to-block potential trackers."
+ },
+ "options_show_not_yet_blocked": {
+ "message": "Vis domæner din Badger endnu ikke har besluttet at blokere:",
+ "description": "Label for a checkbox on the Tracking Domains options page tab. Should match wording used in the 'not_yet_blocked_header' message."
+ },
+ "non_tracker": {
+ "message": "Domænerne herunder ser ikke ud til at spore dig",
+ "description": "Header text; separates tracking from non-tracking domains in the popup."
+ },
+ "popup_options_button": {
+ "message": "Opsætning",
+ "description": ""
+ },
+ "share_button_title_facebook": {
+ "message": "Del på Facebook",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "description": {
+ "message": "Privacy Badger lærer automatisk at blokere usynlige sporinger.",
+ "description": ""
+ },
+ "report_fail": {
+ "message": "Ups. Noget gik galt.",
+ "description": ""
+ },
+ "social_tooltip_pb_has_replaced": {
+ "message": "Privacy Badger har erstattet denne $BUTTON$ knap",
+ "description": "Tooltip shown over a replaced social button. For example, \"Privacy Badger has replaced this Facebook Like button\". See also the widget_placeholder_pb_has_replaced message.",
+ "placeholders": {
+ "button": {
+ "content": "$1",
+ "example": "Facebook Like"
+ }
+ }
+ },
+ "widget_placeholder_pb_has_replaced": {
+ "message": "Privacy Badger har erstattet denne $WIDGET$-kontrol",
+ "description": "Text shown inside a replaced widget's placeholder. For example, \"Privacy Badger has replaced this Google reCAPTCHA widget\". See also the social_tooltip_pb_has_replaced message.",
+ "placeholders": {
+ "widget": {
+ "content": "$1",
+ "example": "Google reCAPTCHA"
+ }
+ }
+ },
+ "allow_once": {
+ "message": "Tillad en gang",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking it will allow the third-party widget to load this one time only."
+ },
+ "allow_on_site": {
+ "message": "Tillad altid på dette netsted",
+ "description": "Button in the placeholder shown in place of certain third-party (video, audio, commenting) widgets. Clicking this button will always allow the widget to load on this particular site."
+ },
+ "sync_intro": {
+ "message": "Skysynkronisering:<ul><li>Kræver Firefox/Chrome-Synkronisering</li><li>Oplægning overskriver eksisterende Privacy Badger-data i skyen</li><li>Hentning kombinerer listerne over steder hvor din Privacy Badger er deaktiveret</li></ul>",
+ "description": "A brief explanation of how syncing works. Shown above the upload/download cloud data buttons under the Manage Data options page tab."
+ },
+ "upload": {
+ "message": "Læg op",
+ "description": "Button label for uploading data to the cloud on Manage Data options page tab."
+ },
+ "upload_cloud": {
+ "message": "Eksporter deaktiverede steder til skyen",
+ "description": "Button title for uploading data to the cloud on Manage Data options page tab."
+ },
+ "download_cloud": {
+ "message": "Importer deaktiverede steder fra skyen",
+ "description": "Button title for downloading data from the cloud on Manage Data options page tab."
+ },
+ "download_cloud_success": {
+ "message": "Skydata importeret med success.",
+ "description": "Message displayed to the user after successfully merging cloud data."
+ },
+ "download_cloud_failure": {
+ "message": "Skydata kunne ikke hentes.",
+ "description": "Message displayed to the user after failing to download cloud data."
+ },
+ "upload_cloud_success": {
+ "message": "Skydata lagt op med success.",
+ "description": "Message displayed to the user after successfully uploading local data."
+ },
+ "upload_cloud_failure": {
+ "message": "Skydata kunne ikke lægges op.",
+ "description": "Message displayed to the user after failing to upload local data."
+ },
+ "download_cloud_no_data": {
+ "message": "Ingen skydata at hente.",
+ "description": "'Error' message when there is on cloud data to download."
+ },
+ "share_title": {
+ "message": "Del med dine venner",
+ "description": "Title of the share overlay."
+ },
+ "popup_share_button": {
+ "message": "Del",
+ "description": "Tooltip that comes up when you hover over the share button in the upper right corner of the popup."
+ },
+ "share_tracker_header": {
+ "message": "Privacy Badger blocked $COUNT$ potential trackers on $DOMAIN$:",
+ "description": "Header above the list of tracking domains in the share message.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "domain": {
+ "content": "$2",
+ "example": "example.com"
+ }
+ }
+ },
+ "share_base_message": {
+ "message": "Privacy Badger (www.eff.org/privacybadger) er en browserudvidelse som automatisk lærer at blokere usynlige sporinger. Privacy Badger laves af Electronic Frontier Foundation, en nonprofit-orginsation der kæmper for dine rettigheder online.",
+ "description": "The base message that is always included in the share message."
+ },
+ "copy_button_initial": {
+ "message": "Kopiér til klippebord",
+ "description": "Initial text of the copy button on the share overlay."
+ },
+ "copy_button_copied": {
+ "message": "Kopieret",
+ "description": "On-click text of the copy button on the share overlay."
+ },
+ "popup_special_page_header": {
+ "message": "Der er intet at gøre på denne side",
+ "description": "Heading for popup_special_page_paragraph"
+ },
+ "popup_special_page_paragraph": {
+ "message": "Privacy Badger virker ikke på specielle sider som denne. Prøv at browse et andet sted.",
+ "description": "Shown in the popup for special browser pages such as the New Tab page and 'about:' pages."
+ },
+ "popup_disabled_site_header": {
+ "message": "Privacy Badger er deaktiveret på dette netsted",
+ "description": "Shown in the popup on disabled sites."
+ },
+ "options_widget_replacement_tab": {
+ "message": "Kontroludskiftning",
+ "description": "Options page tab heading"
+ },
+ "options_widget_replacement_desc": {
+ "message": "Ved blokering af sociale knapper og andre potentielt brugbare (video, lyd, kommentarer) kontroller, kan Privacy Badger udskifte dem med klik-for-at-aktivere pladsholdere.",
+ "description": "Introduction to the Widget Replacement tab on the options page."
+ }
+} \ No newline at end of file
diff --git a/src/_locales/de/messages.json b/src/_locales/de/messages.json
new file mode 100644
index 0000000..ea2535d
--- /dev/null
+++ b/src/_locales/de/messages.json
@@ -0,0 +1,677 @@
+{
+ "badger_status_block": {
+ "message": "$DOMAIN$ geblockt",
+ "description": "Tooltip shown when you hover over a domain name with a red slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "invalid_json": {
+ "message": "Ungültige JSON-Datei.",
+ "description": ""
+ },
+ "options_remove_origin_confirm": {
+ "message": "Möchten Sie diese Domain wirklich aus Privacy Badger entfernen?",
+ "description": "Confirmation shown when you click to remove a domain from Privacy Badger's tracking domains list on the options page."
+ },
+ "badger_status_noaction": {
+ "message": "Kein Tracking für $DOMAIN$",
+ "description": "Tooltip shown when you hover over a non-tracking domain name with a green slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "non_tracker_tip": {
+ "message": "Derzeit überprüft Privacy Badger nur, ob Drittparteien zum Verfolgen Ihrer Internetaktivitäten Cookies, lokalen HTML5-Speicher oder Canvas-Fingerprinting verwenden. Einige dieser Domains könnten allerdings Tracking-Methoden benutzen, die Privacy Badger nicht erkennen kann.",
+ "description": ""
+ },
+ "options_dnt_policy_setting": {
+ "message": "Überprüfen, ob <a target='_blank' href='https://www.eff.org/privacybadger/faq#What-is-a-third-party-tracker'>Drittanbieter-Domains</a> <a target='_blank' href='https://www.eff.org/dnt-policy'>EFFs Do-Not-Track-Richtlinie</a> befolgen",
+ "description": "Checkbox label on the general settings page"
+ },
+ "invalid_domain": {
+ "message": "Bitte eine gültige Domain oder Adresse hinzufügen.",
+ "description": ""
+ },
+ "donate_to_eff": {
+ "message": "An EFF spenden",
+ "description": "Button shown in the popup and on the intro page."
+ },
+ "intro_donate_subheading": {
+ "message": "Helfen Sie uns durch Spenden und Weiterempfehlen unserer Software",
+ "description": "Shown below the Donate button on the intro page."
+ },
+ "intro_not_an_adblocker": {
+ "message": "Kein Adblocker: Ich bin anders",
+ "description": "Intro page paragraph heading."
+ },
+ "report_success": {
+ "message": "Vielen Dank! Wir werden den Fehler umgehend untersuchen.",
+ "description": ""
+ },
+ "dnt_tooltip": {
+ "message": "Diese Domain verspricht, Ihre Internetaktivitäten nicht zu verfolgen",
+ "description": "Tooltip shown when you hover over a DNT-compliant domain name in the list of domains in the popup or under the Tracking Domains tab on the options page."
+ },
+ "breakage_warning_tooltip": {
+ "message": "Das Blocken dieser Domain ist dafür bekannt, bei Websites Probleme zu verursachen",
+ "description": "Tooltip for a warning icon that appears when move a domain slider to 'red' (block) for a domain that was automatically set to 'yellow' (block cookies)."
+ },
+ "feed_the_badger_title": {
+ "message": "Anklicken, um die Kontrolle dieser Domain an Privacy Badger zurückzugeben",
+ "description": "Tooltip shown when you hover over an undo arrow that appears when you move a domain slider away from its automatic setting."
+ },
+ "next_section": {
+ "message": "nächster Abschnitt",
+ "description": "Image alt. text on a couple of \"scroll down\" arrow buttons on the intro page."
+ },
+ "extension_error_text": {
+ "message": "Bitte <a href='https://www.eff.org/privacybadger#faq-I-found-a-bug!-What-do-I-do-now?' target='_blank'>informieren Sie uns</a> über den folgenden Fehler:",
+ "description": "Shown in the popup when there is a problem with the user's Privacy Badger extension that we want to encourage the user to tell us about."
+ },
+ "data_settings": {
+ "message": "Benutzerdaten verwalten",
+ "description": "This is an options page tab heading."
+ },
+ "report_title": {
+ "message": "Melden eines Fehlers",
+ "description": ""
+ },
+ "whitelist_form_domain_input_placeholder": {
+ "message": "z. B. www.domain.com, *.domain.net, domain.org",
+ "description": "Placeholder text for the Add domain input under the Disabled Sites tab on the options page."
+ },
+ "domain_slider_cookieblock_tooltip": {
+ "message": "Hier klicken, um zu verhindern, dass diese Domain Cookies setzt",
+ "description": "Tooltip shown when you hover over the center part of a slider shown for each domain in the domain list."
+ },
+ "options_domain_filter_block": {
+ "message": "geblockt",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "options_webrtc_setting": {
+ "message": "WebRTC hindern, die lokale IP-Adresse zu verraten",
+ "description": "Checkbox label on the general settings page"
+ },
+ "intro_welcome": {
+ "message": "Privacy Badger lernt automatisch, unsichtbare Tracker zu blocken. Nehmen Sie sich eine Minute Zeit, um zu erfahren wie.",
+ "description": "Intro page welcome paragraph."
+ },
+ "error_input": {
+ "message": "Was läuft falsch?",
+ "description": ""
+ },
+ "options_domain_list_tab": {
+ "message": "Tracking-Domains",
+ "description": "This is an options page tab heading."
+ },
+ "share_button_title_twitter": {
+ "message": "Auf Twitter teilen",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "first_run_text": {
+ "message": "Erfahren Sie, wie Privacy Badger Ihre Privatsphäre schützt",
+ "description": "Part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "download": {
+ "message": "Herunterladen",
+ "description": ""
+ },
+ "import": {
+ "message": "Importieren",
+ "description": ""
+ },
+ "options_hide_social_widgets": {
+ "message": "Folgende Widgets nicht ersetzen:",
+ "description": "Multiple selection box on the widget replacement tab"
+ },
+ "options_social_widgets_checkbox": {
+ "message": "Ersetzen von Widgets aktivieren",
+ "description": "Checkbox label on the widget replacement tab"
+ },
+ "options_show_nontracking_domains_checkbox": {
+ "message": "Domains anzeigen, die Ihre Internetaktivitäten anscheinend nicht verfolgen",
+ "description": "Checkbox label on the general settings page. Should match wording used in the 'non_tracker' message."
+ },
+ "report_button": {
+ "message": "Fehler übermitteln",
+ "description": ""
+ },
+ "badger_status_allow": {
+ "message": "$DOMAIN$ erlaubt",
+ "description": "Tooltip shown when you hover over a tracking but still allowed (green slider) domain name in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "privacy_badger_what_is": {
+ "message": "Was ist Privacy Badger?",
+ "description": ""
+ },
+ "options_domain_search": {
+ "message": "Domains suchen:",
+ "description": "Label for a text input box on the Tracking Domains options page tab."
+ },
+ "options_learn_setting": {
+ "message": "Blocken neuer Tracker beim Browsen lernen",
+ "description": "Checkbox label on the general settings page"
+ },
+ "local_learning_warning": {
+ "message": "Aktiviertes Lernen macht dich für Websites möglicherweise leichter identifizierbar",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_incognito_setting": {
+ "message": "Auch in privaten bzw. Inkognito-Fenstern lernen",
+ "description": "Checkbox label on the general settings page"
+ },
+ "options_incognito_warning": {
+ "message": "Die Aktivierung des Lernens in privaten bzw. Inkognito-Fenstern hinterlässt eventuell Spuren Ihres privaten Surfverlaufs auf Ihrem Computer. In privaten/Inkognito-Fenstern blockt Privacy Badger standardmäßig bereits bekannte Tracker, erlernt aber keine neuen. Falls Sie oft private/Inkognito-Fenster verwenden, kann die Aktivierung dieser Option Sinn machen.",
+ "description": "Tooltip on the general settings page"
+ },
+ "learning_prompt_text1": {
+ "message": "Privacy Badger wird standardmäßig nicht mehr aus Ihrem Browsen lernen.",
+ "description": "First part of a prompt to visit the blog."
+ },
+ "learning_prompt_text2": {
+ "message": "Klicken Sie unten, um mehr zu erfahren.",
+ "description": "Second part of a prompt to visit the blog."
+ },
+ "learning_prompt_button": {
+ "message": "Erfahren Sie, was sich in Privacy Badger ändert.",
+ "description": "Button text, part of a prompt to visit the blog."
+ },
+ "show_counter_checkbox": {
+ "message": "Trackeranzahl anzeigen",
+ "description": "Checkbox label on the general settings page"
+ },
+ "what_is_a_tracker": {
+ "message": "Was ist ein Tracker?",
+ "description": "Tooltip that comes up when you hover over the 'tracking domains' link under the Tracking Domains tab on the options page."
+ },
+ "intro_report_button": {
+ "message": "Bitte vergessen Sie nicht, auf »Verursacht Privacy Badger bei dieser Website Probleme?« zu klicken. Da wir Ihre Privatsphäre respektieren, senden wir keine automatisierten Berichte.",
+ "description": "Intro page paragraph. The quoted message ('Did Privacy Badger break this site') should match the first part of the translation for the 'report_broken_site' message."
+ },
+ "options_title": {
+ "message": "Optionen von Privacy Badger",
+ "description": ""
+ },
+ "report_terms": {
+ "message": "Dies wird folgende Informationen automatisch an die EFF senden: Die von Ihnen derzeit besuchte Webseite, Ihre Browserversion, die Version von Privacy Badger und den Status aller Schieberegler auf dieser Webseite.",
+ "description": ""
+ },
+ "whitelisted_domains": {
+ "message": "Deaktivierte Websites",
+ "description": "This is an options page tab heading."
+ },
+ "popup_enable_for_site": {
+ "message": "Für diese Website Privacy Badger aktivieren",
+ "description": ""
+ },
+ "options_domain_type_filter": {
+ "message": "Nach Typ filtern:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "import_successful": {
+ "message": "Trackerliste und Einstellungen erfolgreich aktualisiert!",
+ "description": ""
+ },
+ "export_user_data": {
+ "message": "Benutzerdaten exportieren",
+ "description": ""
+ },
+ "manage_data_intro": {
+ "message": "Importieren von Benutzerdaten:<ul><li>Überschreibt allgemeine Einstellungen</li><li>Kombiniert Listen deaktivierter Sites</li><li>Kombiniert Informationen über die bereits erkannten Tracker</li><li>Überschreibt Veränderungen der Schieberegler</li></ul>",
+ "description": "A brief explanation of what happens when you import Badger user data. Shown above the import/export user data buttons under the Manage Data options page tab."
+ },
+ "reset": {
+ "message": "Zurücksetzen",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "reset_data": {
+ "message": "Tracking-Domains zurücksetzen",
+ "description": "Caption above reset button"
+ },
+ "reset_data_confirm": {
+ "message": "Zurücksetzen der Tracking-Domains wird:\n\n • Alle Daten über Tracker löschen, die Privacy Badger während Ihrer Browsernutzung gelernt hat\n • Die Tracking-Domain-Liste auf die neueste vorgegebene Liste zurücksetzen (besuchen Sie www.eff.org/badger-pretraining für weitere Informationen)",
+ "description": "Pop-up triggered when the reset_data button is clicked"
+ },
+ "remove_all": {
+ "message": "Alle entfernen",
+ "description": "Options page button, under the Manage Data tab"
+ },
+ "remove_all_data": {
+ "message": "Alle Tracking-Domains entfernen",
+ "description": "Caption above remove_all button"
+ },
+ "remove_all_data_confirm": {
+ "message": "Entfernen aller Tracking-Domains wird:\n\n • Alles löschen, was Privacy Badger über Tracker weiß\n • Privacy Badger veranlassen, solange nichts zu blocken, bis er Gelegenheit hatte, von Ihrer Browsernutzung neu zu lernen",
+ "description": "Pop-up triggered when the remove_all_data button is clicked"
+ },
+ "intro_text1": {
+ "message": "Sie werden nun von Privacy Badger geschützt.",
+ "description": "First part of a reminder to visit the intro page. Shown in popup until the user clicks on the reminder link or browses through the intro page."
+ },
+ "intro_text2": {
+ "message": "Um zu erfahren, wie Privacy Badger funktioniert, klicken Sie bitte unten für eine kurze Einführung.",
+ "description": "Second part of a reminder to visit the intro page"
+ },
+ "options_webrtc_warning": {
+ "message": "WebRTC kann Ihre lokale IP-Adresse verraten. Bitte beachten Sie, dass das Aktivieren dieser Option eventuell die Leistung bei Apps für Webkonferenzen wie Google Hangouts verringert.",
+ "description": "Tooltip on the general settings page"
+ },
+ "options_general_settings": {
+ "message": "Allgemeine Einstellungen",
+ "description": "This is an options page tab heading."
+ },
+ "options_privacy_settings": {
+ "message": "Datenschutz",
+ "description": "Subheading on the general settings options page."
+ },
+ "options_advanced_settings": {
+ "message": "Erweitert",
+ "description": "Subheading on the general settings options page."
+ },
+ "intro_next_button": {
+ "message": "Rundgang machen",
+ "description": "Intro page welcome button."
+ },
+ "domain_slider_block_tooltip": {
+ "message": "Hier klicken, um diese Domain vollständig zu blocken",
+ "description": "Tooltip shown when you hover over the leftmost part of a slider shown for each domain in the domain list."
+ },
+ "version": {
+ "message": "Version $VERSION_STRING$",
+ "description": "Shows Privacy Badger's version in the popup. For example, \"version 2018.8.1\".",
+ "placeholders": {
+ "version_string": {
+ "content": "$1",
+ "example": "2018.8.1"
+ }
+ }
+ },
+ "badger_status_cookieblock": {
+ "message": "Cookies von $DOMAIN$ geblockt",
+ "description": "Tooltip shown when you hover over a domain name with a yellow slider in the list of domains in the popup or under the Tracking Domains tab on the options page.",
+ "placeholders": {
+ "domain": {
+ "content": "$1",
+ "example": "example.com"
+ }
+ }
+ },
+ "options_domain_filter_cookieblock": {
+ "message": "teilweise geblockt",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "show_tracking_domains_acknowledgement": {
+ "message": "Verstanden. Bitte die Liste der Tracking-Domains trotzdem anzeigen.",
+ "description": "Acknowledgement shown next to the checkbox required to reveal the tracking domains list on the options page."
+ },
+ "firstRun_title": {
+ "message": "Danke für das Installieren von Privacy Badger!",
+ "description": ""
+ },
+ "import_select_file": {
+ "message": "Bitte eine Datei zum Importieren auswählen.",
+ "description": ""
+ },
+ "report_broken_site": {
+ "message": "Verursacht Privacy Badger bei dieser Website Probleme?",
+ "description": "Button in the popup."
+ },
+ "tooltip_cookieblock": {
+ "message": "Bewegen Sie den Schieberegler in die Mitte, um Cookies zu blocken",
+ "description": ""
+ },
+ "intro_learns": {
+ "message": "Lernt automatisch",
+ "description": "Intro page paragraph heading"
+ },
+ "intro_learns_paragraph": {
+ "message": "Anstatt vorgefertigte Listen zu blockender Domains zu verwenden, entdeckt Privacy Badger Tracker aufgrund ihres Verhaltens automatisch.",
+ "description": "Intro page paragraph"
+ },
+ "intro_beyond_ads": {
+ "message": "Fängt hinterlistige Tracker",
+ "description": "Intro page paragraph heading."
+ },
+ "intro_beyond_ads_paragraph": {
+ "message": "Unsichtbares Tracking wird auf unterschiedlichen Wegen realisiert; Werbeanzeigen sind hierbei nur die sichtbare Spitze des Eisbergs. Privacy Badger signalisiert Websites durch <a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>, dass Ihre Daten nicht geteilt und verkauft werden sollen, und durch <a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>, dass Sie nicht verfolgt werden wollen. Falls diese Ihren Wunsch ignorieren, lernt Privacy Badger, sie zu blocken — egal, ob es sich dabei um Werbung oder andere Arten von Tracking handelt.",
+ "description": "Intro page paragraph."
+ },
+ "report_close": {
+ "message": "Schließen",
+ "description": ""
+ },
+ "import_user_data": {
+ "message": "Benutzerdaten importieren",
+ "description": ""
+ },
+ "options_domain_filter_dnt": {
+ "message": "DNT-konform",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "popup_help_button": {
+ "message": "Hilfe",
+ "description": "Tooltip that comes up when you hover over the question mark button in the upper right corner of the popup."
+ },
+ "options_domain_filter_allow": {
+ "message": "erlaubt",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "intro_donate_heading": {
+ "message": "Datenschutz ist ein Teamsport!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "show_tracking_domains_message": {
+ "message": "Hier sollten keine Änderungen notwendig sein.",
+ "description": "Shown above the acknowledgement checkbox required to reveal the tracking domains list on the options page. This is the second paragraph; the first paragraph is the message under the \"intro_not_an_adblocker_paragraph\" key."
+ },
+ "options_domain_filter_all": {
+ "message": "alle",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "report_cancel": {
+ "message": "Abbrechen",
+ "description": ""
+ },
+ "tooltip_block": {
+ "message": "Bewegen Sie den Schieberegler nach links, um eine Domain zu blocken",
+ "description": ""
+ },
+ "options_enable_dnt_checkbox": {
+ "message": "Websites »<a href='https://globalprivacycontrol.org/' target='_blank'>Global Privacy Control</a>« und »<a href='https://www.eff.org/issues/do-not-track' target='_blank'>Do Not Track</a>« signalisieren",
+ "description": "Checkbox label for enabling/disabling the Sec-GPC and DNT signals, found on the general settings page"
+ },
+ "options_disable_google_nav_error_service": {
+ "message": "Senden besuchter Web-Adressen an Google deaktivieren. Dies deaktiviert Vorschläge für ähnliche Seiten, wenn eine Seite nicht gefunden werden kann.",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_disable_hyperlink_auditing": {
+ "message": "Hyperlink-Auditing deaktivieren",
+ "description": "Checkbox label found on the general settings page"
+ },
+ "options_domain_filter_user": {
+ "message": "benutzergesteuert",
+ "description": "Dropdown control setting on the Tracking Domains options page tab."
+ },
+ "disabled_for_these_domains": {
+ "message": "<p>Privacy Badger ist auf den folgenden Websites deaktiviert. Das heißt, Privacy Badger wird nichts blocken, wenn Sie die hier aufgeführten Sites besuchen, und wird weder »Do Not Track« noch »Global Privacy Control« signalisieren.</p><p>Falls Sie annehmen, dass Privacy Badger bei einer Webseite Probleme verursacht, oder wenn Sie einer bestimmten Site erlauben möchten, Ihre Daten zu teilen oder zu verkaufen, so können Sie die Domain der entsprechenden Seite in das Feld unten eingeben und auf die Schaltfläche »Domain hinzufügen« klicken.</p><p>Falls Sie den Tab der Seite bereits ausgewählt haben, können Sie auch einfach auf Privacy Badgers Schaltfläche in der Browsersymbolleiste und dann dort auf die Schaltfäche »Deaktivieren« klicken.</p>",
+ "description": ""
+ },
+ "popup_instructions": {
+ "message": "$COUNT$ mögliche $LINK_START$Tracker$LINK_END$ geblockt",
+ "description": "Popup message shown when at least one tracker was blocked.",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "15"
+ },
+ "link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_instructions_no_trackers": {
+ "message": "Keine $LINK_START$Tracker$LINK_END$ geblockt",
+ "description": "Text shown in the popup when there are no trackers on the page.",
+ "placeholders": {
+ "link_start": {
+ "content": "$1",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "popup_blocked": {
+ "message": "Auf dieser Webseite sind keine Elemente von Drittparteien vorhanden. Ein Hoch auf die Privatsphäre!",
+ "description": "Text shown in the popup when showing non-tracking domains is enabled, and there are no third-party domains on the page."
+ },
+ "intro_by_eff": {
+ "message": "Ein Projekt der Electronic Frontier Foundation",
+ "description": ""
+ },
+ "add_domain_button": {
+ "message": "Domain hinzufügen",
+ "description": ""
+ },
+ "tooltip_allow": {
+ "message": "Bewegen Sie den Schieberegler nach rechts, um eine Domain zu erlauben",
+ "description": ""
+ },
+ "popup_disable_for_site": {
+ "message": "Für diese Website Privacy Badger deaktivieren",
+ "description": "Button in the popup."
+ },
+ "domain_slider_allow_tooltip": {
+ "message": "Hier klicken, um diese Domain zu erlauben",
+ "description": "Tooltip shown when you hover over the rightmost part of a slider shown for each domain in the domain list."
+ },
+ "intro_privacy_note": {
+ "message": "Privacy Badger wird NIEMALS Daten über Ihre Internetaktivitäten weitergeben, solange Sie sich selbst nicht dazu entscheiden.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_list_trackers": {
+ "message": "Privacy Badger hat entschieden, bisher $COUNT$ mögliche $TRACKER_LINK_START$Tracking-Domains$TRACKER_LINK_END$ zu blocken",
+ "description": "Shown on the Tracking Domains tab on the options page after Privacy Badger learned to block one or more domains",
+ "placeholders": {
+ "count": {
+ "content": "$1",
+ "example": "900"
+ },
+ "tracker_link_start": {
+ "content": "$2",
+ "example": "<a href='https://privacybadger.org/#What-is-a-third-party-tracker'>"
+ },
+ "tracker_link_end": {
+ "content": "</a>"
+ }
+ }
+ },
+ "options_domain_list_no_trackers": {
+ "message": "Privacy Badger hat bisher keine <a target='_blank' tabindex=-1 title='i18n_what_is_a_tracker' class='tooltip' href='https://www.eff.org/privacybadger#faq-What-is-a-third-party-tracker?'>Tracking-Domains</a> erkannt. Surfen Sie weiter!",
+ "description": "Shown on the Tracking Domains tab on the options page if all tracking domains have been removed."
+ },
+ "name": {
+ "message": "Privacy Badger",
+ "description": ""
+ },
+ "intro_not_an_adblocker_paragraph": {
+ "message": "Privacy Badger beginnt mit dem Blocken, sobald er denselben Tracker auf drei verschiedenen Websites erkennt.",
+ "description": "Intro page paragraph."
+ },
+ "options_domain_status_filter": {
+ "message": "Nach Status filtern:",
+ "description": "Label for a dropdown control on the Tracking Domains options page tab."
+ },
+ "report_text": {
+ "message": "Beschreiben Sie bitte unten kurz den Fehler.",
+ "description": ""
+ },
+ "remove_button": {
+ "message": "Ausgewählte entfernen",
+ "description": "This is the label for the 'Remove selected' buttons."
+ },
+ "intro_donate1": {
+ "message": "Durch das Verwenden von Privacy Badger werden Sie Teil der <a href='https://www.eff.org/' target='_blank'>Electronic Frontier Foundation</a> und Millionen anderer Nutzer im Kampf für Datenschutz. Wir sind eine gemeinnützige Organisation, die sich für Ihre Rechte im Internet einsetzt. Vielen Dank für Ihre Teilnahme!",
+ "description": "Part of the 'donate' section on the intro page."
+ },
+ "options_domain_search_tooltip": {
+ "message": "Stellen Sie zum Ausschließen von Domains Ihrem Suchbegriff ein »-« voran. Beispielsweise zeigt ».co -.com« als Ergebnis ».co«- und ».co.uk«-Domains an, aber keine ».com«-Domains.",
+ "description": "Tooltip for an \"information\" icon next to the domain search input on the Tracking Domains options page tab."
+ },
+ "intro_disable_button": {
+ "message": "Falls Sie annehmen, dass Privacy Badger bei einer Webseite Probleme verursacht (z. B. ein Video wird nicht wiedergegeben), so können Sie auf die Schaltfläche »Deaktivieren« klicken, um Privacy Badger für diese Website auszuschalten.",
+ "description": "Intro page paragraph. The quoted string ('Disable') should match the verb used for the 'popup_disable_for_site' message."
+ },
+ "intro_link_policy": {
+ "message": "Datenschutzerklärung",
+ "description": "Shown at the bottom of the intro page, links to the EFF software and technology projects privacy policy."
+ },
+ "report_input_label": {
+ "message": "Beschreibung",
+ "description": ""
+ },
+ "not_yet_blocked_header": {
+ "message": "Ihr Badger hat noch nicht entschieden, ob diese Domains geblockt werden sollen",
+ "description": "Popup domain list header text; separates blocked from haven't-yet-seen-enough-to-block potential trackers."
+ },
+ "options_show_not_yet_blocked": {
+ "message": "Domains anzeigen, deren Blockstatus noch nicht entschieden ist:",
+ "description": "Label for a checkbox on the Tracking Domains options page tab. Should match wording used in the 'not_yet_blocked_header' message."
+ },
+ "non_tracker": {
+ "message": "Die nachfolgenden Domains scheinen Ihre Internetaktivitäten nicht zu verfolgen",
+ "description": "Header text; separates tracking from non-tracking domains in the popup."
+ },
+ "popup_options_button": {
+ "message": "Optionen",
+ "description": ""
+ },
+ "share_button_title_facebook": {
+ "message": "Auf Facebook teilen",
+ "description": "Text that comes up when you hover over the social sharing buttons on the intro page."
+ },
+ "description": {
+ "message": "Privacy Badger lernt automatisch, unsichtbare Tracker zu blocken.",
+ "description": ""
+ },
+ "report_fail": {
+ "message": "Huch! Etwas ist schief gelaufen.",
+ "description": ""
+ },
+ "social_tooltip_pb_has_replaced": {
+ "message": "Privacy Badger hat diese $BUTTON$-Schaltfläche ersetzt",
+ "description": "Tooltip shown over a replaced social button. For example, \"Privacy Badger has replaced this Facebook Like button\". See also the widget_placeholder_pb_has_replaced message.",
+ "placeholders": {
+ "button": {
+ "content": "$1",
+ "e