diff --git a/.circleci/config.yml b/.circleci/config.yml new file mode 100644 index 000000000..3cf275e6c --- /dev/null +++ b/.circleci/config.yml @@ -0,0 +1,99 @@ +version: 2.0 +jobs: + test: + docker: + - image: circleci/node:12-browsers + steps: + - checkout + - run: npm ci + - run: npm run lint + - run: npm test + - store_artifacts: + path: coverage + integration_tests: + docker: + - image: circleci/node:12-browsers + steps: + - checkout + - run: npm ci + - run: + name: Run integration test + command: ./scripts/bin/run-integration-test-circleci.sh + deploy_dev: + docker: + - image: circleci/node:12 + steps: + - checkout + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: docker build -t mozilla/send:latest . + - run: docker push mozilla/send:latest + deploy_vnext: + docker: + - image: circleci/node:12 + steps: + - checkout + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: docker build -t mozilla/send:vnext . + - run: docker push mozilla/send:vnext + deploy_stage: + docker: + - image: circleci/node:12 + steps: + - checkout + - setup_remote_docker + - run: docker login -u $DOCKER_USER -p $DOCKER_PASS + - run: docker build -t mozilla/send:$CIRCLE_TAG . + - run: docker push mozilla/send:$CIRCLE_TAG +workflows: + version: 2 + test_pr: + jobs: + - test: + filters: + branches: + ignore: + - master + - vnext + - integration_tests: + filters: + branches: + ignore: master + build_and_deploy_dev: + jobs: + - deploy_dev: + filters: + branches: + only: master + tags: + ignore: /^v.*/ + - deploy_vnext: + filters: + branches: + only: vnext + tags: + ignore: /^v.*/ + build_and_deploy_stage: + jobs: + - test: + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ + - integration_tests: + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ + - deploy_stage: + requires: + - test + - integration_tests + filters: + branches: + ignore: /.*/ + tags: + only: /^v.*/ diff --git a/.dockerignore b/.dockerignore index eb85ddcc7..f91dc6a9f 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,8 +1,8 @@ -node_modules -.git +.circleci +.nyc_output +.vscode .DS_Store -firefox -assets +coverage docs -public -test +firefox +node_modules \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 7540c39c5..d067a75db 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,3 +1,7 @@ dist assets firefox +coverage +android/app/build +app/locale.js +app/capabilities.js \ No newline at end of file diff --git a/.eslintrc.yml b/.eslintrc.yml index 6556e4c10..c8b60c4c4 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,6 +4,7 @@ env: extends: - eslint:recommended + - prettier - plugin:node/recommended - plugin:security/recommended @@ -14,18 +15,14 @@ plugins: root: true rules: + node/no-deprecated-api: off + node/no-unsupported-features/es-syntax: off + node/no-unsupported-features/node-builtins: off node/no-unpublished-require: off + node/no-unpublished-import: off security/detect-non-literal-fs-filename: off security/detect-object-injection: off - eol-last: [error, always] - eqeqeq: error - no-alert: warn - no-console: warn - no-path-concat: error no-unused-vars: [error, {argsIgnorePattern: "^_|err|event|next|reject"}] - no-var: error - one-var: [error, never] - prefer-const: error - quotes: [error, single, {avoidEscape: true}] + require-atomic-updates: warn diff --git a/.gitignore b/.gitignore index 82ee25a10..00aca6daa 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,15 @@ node_modules +coverage dist .idea +.DS_Store +.nyc_output +.tox +.pytest_cache +*.iml +android/app/src/main/assets +ios/send-ios/assets/ios.js +ios/send-ios/assets/vendor.js +ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/* +ios/send-ios.xcodeproj/xcuserdata/* +test/integration/downloads diff --git a/.nsprc b/.nsprc deleted file mode 100644 index e7831e901..000000000 --- a/.nsprc +++ /dev/null @@ -1,3 +0,0 @@ -{ - "exceptions": ["https://nodesecurity.io/advisories/534"] -} \ No newline at end of file diff --git a/.prettierignore b/.prettierignore index c4ae50c4e..994b9f2fc 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,2 +1,4 @@ dist -assets/*.js +android/app/src/main/assets +android/app/build +coverage \ No newline at end of file diff --git a/.stylelintrc b/.stylelintrc index 9ade61445..0af67b034 100644 --- a/.stylelintrc +++ b/.stylelintrc @@ -10,3 +10,4 @@ rules: declaration-colon-newline-after: null selector-list-comma-newline-after: null value-list-comma-newline-after: null + at-rule-no-unknown: null diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 000000000..7a73a41bf --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,2 @@ +{ +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 49216149c..2c1f5b620 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,98 @@ ## Change Log +### v2.5.1 (2018/03/12 19:26 +00:00) +- [#789](https://github.com/mozilla/send/pull/789) Fixed #775 : Made text not-selectable (@RCMainak) + +### v2.5.0 (2018/03/08 19:31 +00:00) +- [#782](https://github.com/mozilla/send/pull/782) updated docs (@dannycoates) +- [#781](https://github.com/mozilla/send/pull/781) Don't translate URL-safe chars, b64 is doing it for us (@timvisee) +- [#779](https://github.com/mozilla/send/pull/779) implemented crypto polyfills for ms edge (@dannycoates) + +### v2.4.1 (2018/02/28 17:05 +00:00) +- [#777](https://github.com/mozilla/send/pull/777) use a separate circle in the progress svg for indefinite progress (@dannycoates) + +### v2.4.0 (2018/02/27 01:55 +00:00) +- [#769](https://github.com/mozilla/send/pull/769) removed unsafe-inline styles via svgo-loader (@dannycoates) +- [#767](https://github.com/mozilla/send/pull/767) added coverage artifact to circleci (@dannycoates) +- [#766](https://github.com/mozilla/send/pull/766) Some frontend unit tests [WIP] (@dannycoates) +- [#761](https://github.com/mozilla/send/pull/761) added maxPasswordLength and passwordError messages (@dannycoates) +- [#764](https://github.com/mozilla/send/pull/764) added indefinite progress mode (@dannycoates) +- [#760](https://github.com/mozilla/send/pull/760) refactored css: phase 1 (@dannycoates) +- [#759](https://github.com/mozilla/send/pull/759) Switch en-US FTL file to new syntax (@flodolo) +- [#758](https://github.com/mozilla/send/pull/758) refactored server (@dannycoates) +- [#757](https://github.com/mozilla/send/pull/757) Update to fluent 0.4.3 (@stasm) + +### v2.3.0 (2018/02/01 23:27 +00:00) +- [#536](https://github.com/mozilla/send/pull/536) use redis expire event to delete stored data immediately (@ehuggett) +- [#744](https://github.com/mozilla/send/pull/744) Gradient experiment (@dannycoates) +- [#739](https://github.com/mozilla/send/pull/739) added /api/info/:id route (@dannycoates) +- [#737](https://github.com/mozilla/send/pull/737) big refactor (@dannycoates) +- [#722](https://github.com/mozilla/send/pull/722) Add localization note to 'Time' and 'Downloads' string (@flodolo) +- [#721](https://github.com/mozilla/send/pull/721) show download Limits on page; Fixes #661 (@shikhar-scs) +- [#694](https://github.com/mozilla/send/pull/694) Passwords can now be changed (#687) (@himanish-star) +- [#702](https://github.com/mozilla/send/pull/702) Restricted the banner from showing on unsupported browsers (@himanish-star) +- [#701](https://github.com/mozilla/send/pull/701) improved popup for mobile display; Fixes #699 (@shikhar-scs) +- [#683](https://github.com/mozilla/send/pull/683) API changes to accommodate 3rd party clients (@ehuggett) +- [#698](https://github.com/mozilla/send/pull/698) Popup for delete button attached (@himanish-star) +- [#695](https://github.com/mozilla/send/pull/695) Show Warning, Cancel and Redirect on size > 2GB ; fixes #578 (@shikhar-scs) +- [#684](https://github.com/mozilla/send/pull/684) delete btn popup attached (@himanish-star) +- [#686](https://github.com/mozilla/send/pull/686) Hide password while Typing and after Entering: Fixes #670 (@shikhar-scs) +- [#679](https://github.com/mozilla/send/pull/679) changed font to sans sherif: Solves #676 (@shikhar-scs) +- [#693](https://github.com/mozilla/send/pull/693) README: Fix query link for "good first bugs" (@jspam) +- [#685](https://github.com/mozilla/send/pull/685) checkbox now has a hover effect: fixes #635 (@himanish-star) +- [#668](https://github.com/mozilla/send/pull/668) Add possibility to bind to a specific IP address (@TwizzyDizzy) +- [#682](https://github.com/mozilla/send/pull/682) [Docs] - README.md - minor spelling fixes (@tmm2018) +- [#672](https://github.com/mozilla/send/pull/672) Use EXPIRE_SECONDS to calculate file ttl for static content (@derektamsen) +- [#680](https://github.com/mozilla/send/pull/680) adjusted line height of label : fixes #609 (@himanish-star) + +### v2.2.2 (2017/12/19 18:06 +00:00) +- [#667](https://github.com/mozilla/send/pull/667) Make develop the default NODE_ENV (@claudijd) + +### v2.2.1 (2017/12/08 18:00 +00:00) +- [#665](https://github.com/mozilla/send/pull/665) stop drag target from flickering when dragging over children (@ericawright) + +### v2.2.0 (2017/12/06 23:57 +00:00) +- [#654](https://github.com/mozilla/send/pull/654) Multiple download UI (@dannycoates) +- [#650](https://github.com/mozilla/send/pull/650) #634: overwrite appearance of password submit input (@ovlb) +- [#649](https://github.com/mozilla/send/pull/649) #609 share interface: align text in input and button (@ovlb) + +### v2.1.2 (2017/11/16 19:03 +00:00) +- [#645](https://github.com/mozilla/send/pull/645) Remove the leak of the password into the console (@laurentj) + +### v2.1.0 (2017/11/15 03:07 +00:00) +- [#641](https://github.com/mozilla/send/pull/641) Added experiment for firefox download promo (@dannycoates) +- [#640](https://github.com/mozilla/send/pull/640) use fluent-langneg for subtag support (@dannycoates) +- [#639](https://github.com/mozilla/send/pull/639) wrap number localization in try/catch (@dannycoates) + +### v2.0.0 (2017/11/08 05:31 +00:00) +- [#633](https://github.com/mozilla/send/pull/633) Keyboard navigation/visual feedback regression (@ehuggett) +- [#632](https://github.com/mozilla/send/pull/632) display the 'add password' button only when the input field isn't empty (@dannycoates) +- [#626](https://github.com/mozilla/send/pull/626) Partial fix for #623 (@ehuggett) +- [#624](https://github.com/mozilla/send/pull/624) set a default MIME type in file metadata (@ehuggett) +- [#612](https://github.com/mozilla/send/pull/612) Password UI nits (@dannycoates, @ericawright) +- [#617](https://github.com/mozilla/send/pull/617) allow drag and drop if navigating from shared page (@ericawright) +- [#608](https://github.com/mozilla/send/pull/608) disable copying link when password not completed (@ericawright) +- [#605](https://github.com/mozilla/send/pull/605) align the "Password" and "Copy to clipboard" fields. (@ericawright) +- [#582](https://github.com/mozilla/send/pull/582) Add optional password to the download url (@dannycoates) + +### v1.2.4 (2017/10/10 17:34 +00:00) +- [#583](https://github.com/mozilla/send/pull/583) Promote the beefy UI to default (@dannycoates) +- [#581](https://github.com/mozilla/send/pull/581) introducing ToC to README.md (@tmm2018) +- [#579](https://github.com/mozilla/send/pull/579) Hide cancel button when upload reaches 100% (@ericawright) +- [#580](https://github.com/mozilla/send/pull/580) Change Favicon in to look better in a variety of cases (@ericawright) +- [#571](https://github.com/mozilla/send/pull/571) Centre logo (@ehuggett) +- [#574](https://github.com/mozilla/send/pull/574) Make upload button focusable (accessibility/tab navigation) (@ehuggett) + +### v1.2.0 (2017/09/12 22:42 +00:00) +- [#559](https://github.com/mozilla/send/pull/559) added first A/B experiment (@dannycoates) +- [#542](https://github.com/mozilla/send/pull/542) fix docker link typo (@ehuggett) +- [#541](https://github.com/mozilla/send/pull/541) removed .title and .alt attributes from ftl (@dannycoates) +- [#537](https://github.com/mozilla/send/pull/537) a few changes to make A/B testing easier (@dannycoates) +- [#533](https://github.com/mozilla/send/pull/533) minor UI fixes (@youwenliang) +- [#531](https://github.com/mozilla/send/pull/531) Add CHANGELOG script (@pdehaan) +- [#535](https://github.com/mozilla/send/pull/535) Fixed minimum NodeJS version in README (@LuFlo) +- [#528](https://github.com/mozilla/send/pull/528) adding separators to README (@tmm2018) + ### v1.1.1 (2017/08/17 01:29 +00:00) - [#516](https://github.com/mozilla/send/pull/516) cache assets (@dannycoates) - [#520](https://github.com/mozilla/send/pull/520) fix drag & drop (@dannycoates) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 000000000..498baa3fb --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,15 @@ +# Community Participation Guidelines + +This repository is governed by Mozilla's code of conduct and etiquette guidelines. +For more details, please read the +[Mozilla Community Participation Guidelines](https://www.mozilla.org/about/governance/policies/participation/). + +## How to Report +For more information on how to report violations of the Community Participation Guidelines, please read our '[How to Report](https://www.mozilla.org/about/governance/policies/participation/reporting/)' page. + + diff --git a/CONTRIBUTORS b/CONTRIBUTORS index a611f6934..cea29588b 100644 --- a/CONTRIBUTORS +++ b/CONTRIBUTORS @@ -1,92 +1,272 @@ +Abdalrahman Hwoij Abhinav Adduri +Adnan Kičin +Adolfo Jayme Barrientos +Alberto Castro Alexander Slovesnik +Alfredos-Panagiotis Damkalis +Aman Alam Amin Mahmudian +Ander Elortondo Andreas Pettersson +Anesu Chiodza +Anika Dorn +Anish Sheela Arash Mousavi +Artem Polivanchuk +Ashikur Rahman +Ashok kumar +Balasankar C Balázs Meskó Belayet Hossain +Benjamin Forehand Jr +Besnik Bleta +Björn I Bjørn I Boopesh Mahendran +Brahim Essaidi +Brainlulz +Breana Gonzales +Christian Elbrianno +Christoph Kührer +Christopher Ramírez Chuck Harmston +Cloney 173741 Cláudio Esperança +Cristian Silaghi Cynthia Pereira Daniel Thorn Daniela Arcese Danny Coates +Davide +Derek Tamsen +Dhyey Thakore +Donovan Preston +Edi Santoso +Edmund Huggett +Elisa X +Emily +Emily Hou Emin Mastizada Enol Erica Erica Wright +Fauzan Alfi +Filip Hruška Fjoerfoks Francesco Lodolo Francesco Lodolo [:flod] +Frederick Villaluna +G12r +Gabriela Gautam krishna.R +George Raptis +Georgianizator +Gonçalo Matos +Gwenn +Hampus +Hugo +Hugo Abreu +Hyeonseok Shin Håvar Henriksen +Ian Neal +ItielMaN Jae Hyeon Park +Jakob Kappel Jakub Rychlý Jamie +Jarmo Jim Spentzos +Jiri Grönroos +Jobava +Joe Becher +Joe ST +Joergen Johann-S John Gruen +Jon Buckley Jon Vadillo +Jonathan Claudius +Jordi Cuevas Jordi Serratosa +Juan Esteban Ajsivinac Sián +Juan Sián Juraj Cigáň +Kerim Kalamujić +Khaled Hosny +Kim Ludvigsen +Kim Younggeon Kohei Yoshino Lan Glad +Lasse Liehu +Laurent Jouanneau +Lobodzets +LuFlo +Luis A. Sánchez +Luiz Carlos de Morais +Luiz Felipe F M Costa Luna Jernberg +Mahay Alam Khan +Marcelo Ghelman Marcelo Poli Marco Aurélio +Mark Heijl Mark Liang +Mark Liang (You-Wen) +Marko Andrejić +Martijn Dekker +Marwan Mohamad Matjaž Horvat Maykon Chagas +Melo46 +Merike Sell Michael Köhler Michael Wolf Michal Stanke Michal Vašíček +Mikeyy +Miro Rauhala +Mozilla Pontoon +Mozilla-GitHub-Standards +Mozinet Moḥend Belqasem +Muhend Belkacem +Muḥend Belqasem +Myungjae Won Nicholas Skinsacos +Nihad +Nihad Suljić +Niksend Mizuhara +Oscar +Paulius +Pedro Burlamaqui Bendahan Peter deHaan Pierre Neter Pin-guang Chen +Piotr Drąg +Quentí +Quế Tùng +Rachel Tublitz +Radu Popescu Rhoslyn Prys +RickieES +Rimas Kudelis Rizky Ariestiyansyah +Rob Powell +Robert Roberto Alvarado Rodrigo +Rodrigo Guerra Rok Žerdin +Romi Hardiyanto +Rongjian Zhang +Ruba Sahithi Sairam Raavi +Sander Lepik Sandro +Sara Todaro +Sav22999 Schieck :) Selim Şumlu +Selyan Sliman Amiri +Sidak Singh Aulakh Slimane Amiri +Slimane Selyan AMIRI +Soumya Himanish Mohapatra +Staś Małolepszy +Suriyaa ✌️️ +Tema +Thomas Dalichow Théo Chevalier +Tiago Morais Morgado +Tim Visée +Tomer Cohen Tomáš Zelina Ton +Top Tymur Faradzhev +Uccen Marzuq Varghese Thomas Victor Bychek +Vimal Raghubir +Vitaliy Krutko Weihang Lo +Wiktor Furman Wil Clouser YFdyh000 +Yassine Aït-El-Mouden +Yongmin H You-Wen Liang (Mark) +aaaaalbert +aefgh39622 +alamanda +albertdcastro alex_mayorga ariestiyansyah avelper +chilledfrogs +clouserw-mozilla-owner dgadelha +dskmori ehuggett eljuno +emily-hou1 erdem cobanoglu gautamkrishnar +gmontagu goofy +hello hi +ivan.pompa jesferman1993 +jlG josotrix +jspam +julen +julenx kenrick95 +kumincir +leo.toneff +m4hdi.pdroid +mail manxmensch +marigalicer +marsf +merianosnikos +mirzet.omerovic.1992 +mujeebcpy +p.sanroman.bengoetxea +passionforlife +paul.trevor +pyup.io bot ravmn +rcmainak reza.habibi2008 +rgpublic +risger +robbp +ruikunai +savemore99.sm +sergio +shikhar-scs siparon skystar-p +stripTM +tatalmondmush +tiagomoraismorgado +timvisee +victor.gonzalezro xcffl +ybouhamam +yoshimitsu002 +yusup.ramdani Μιχάλης Марко Костић (Marko Kostić) +Ратко Вујановић +صفا الفليج +వీవెన్ +ജോയ്സ് +张无忌 +新垣结衣松冈茉优长泽雅美门胁麦上野树里石原里美 +莫非前世那一眼 diff --git a/Dockerfile b/Dockerfile index 93f3a47b3..064053ed0 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,15 +1,59 @@ -FROM node:8-alpine +## +# Firefox Send - Mozilla +# +# License https://github.com/mozilla/send/blob/master/LICENSE +## -RUN apk add --no-cache git -RUN addgroup -S -g 10001 app && adduser -S -D -G app -u 10001 app -COPY . /app -RUN chown -R app /app + +# Build project +FROM node:12 AS builder +RUN set -x \ + # Add user + && addgroup --gid 10001 app \ + && adduser --disabled-password \ + --gecos '' \ + --gid 10001 \ + --home /app \ + --uid 10001 \ + app +COPY --chown=app:app . /app USER app WORKDIR /app -RUN mkdir static -RUN npm install --production && npm cache clean --force +RUN set -x \ + # Build + && PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true npm ci \ + && npm run build + + +# Main image +FROM node:12-slim +RUN set -x \ + # Add user + && addgroup --gid 10001 app \ + && adduser --disabled-password \ + --gecos '' \ + --gid 10001 \ + --home /app \ + --uid 10001 \ + app +RUN apt-get update && apt-get -y install \ + git-core \ + && rm -rf /var/lib/apt/lists/* +USER app +WORKDIR /app +COPY --chown=app:app package*.json ./ +COPY --chown=app:app app app +COPY --chown=app:app common common +COPY --chown=app:app public/locales public/locales +COPY --chown=app:app server server +COPY --chown=app:app --from=builder /app/dist dist + +RUN npm ci --production && npm cache clean --force +RUN mkdir -p /app/.config/configstore +RUN ln -s dist/version.json version.json ENV PORT=1443 -EXPOSE $PORT -CMD ["npm", "run", "prod"] +EXPOSE ${PORT} + +CMD ["node", "server/bin/prod.js"] diff --git a/README.md b/README.md index 0e6e2d88c..8a5362bfc 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,16 @@ # Firefox Send [![CircleCI](https://img.shields.io/circleci/project/github/mozilla/send.svg)](https://circleci.com/gh/mozilla/send) -[![Available on Test Pilot](https://img.shields.io/badge/available_on-Test_Pilot-0996F8.svg)](https://testpilot.firefox.com/experiments/send) -**Docs:** [Docker](docs/docker.md), [Metrics](docs/metrics.md) +## NOTICE - May 2021 + +Mozilla discontinued the Firefox Send service in September 2021. For more information about this, please see the [Mozilla Blog](https://blog.mozilla.org/blog/2020/09/17/update-on-firefox-send-and-firefox-notes/). + +Please note that the [Mozilla Public License 2.0](https://www.mozilla.org/en-US/MPL/2.0/) does not "grant any rights in the trademarks, service marks, or logos of any Contributor." You may fork and modify the source code for Firefox Send pursuant to the Mozilla Public License, but you may not create a version of the service that uses Mozilla trademarks or logos. + +This repository is archived. In May 2021, Mozilla removed Mozilla trademarks from some of the files in this repository so that developers using this code are less likely to inadvertently infringe Mozilla's trademarks and confuse users. You are welcome to copy and modify this code under its open source license, but please ensure that all use complies with [Mozilla's trademark policy](https://www.mozilla.org/en-US/foundation/trademarks/policy/). In other words, if you create a new version of Firefox Send you must remove all "Mozilla" and "Firefox" branding to ensure that users are not confused about who is providing the service. + +**Docs:** [FAQ](docs/faq.md), [Encryption](docs/encryption.md), [Build](docs/build.md), [Docker](docs/docker.md), [Metrics](docs/metrics.md), [More](docs/) --- @@ -17,6 +24,8 @@ * [Localization](#localization) * [Contributing](#contributing) * [Testing](#testing) +* [Deployment](#deployment) +* [Android](#android) * [License](#license) --- @@ -29,22 +38,22 @@ A file sharing experiment which allows you to send encrypted files to other user ## Requirements -- [Node.js 8.2+](https://nodejs.org/) +- [Node.js 12.x](https://nodejs.org/) - [Redis server](https://redis.io/) (optional for development) -- [AWS S3](https://aws.amazon.com/s3/) or compatible service. (optional) +- [AWS S3](https://aws.amazon.com/s3/) or compatible service (optional) --- ## Development -To start an ephemeral development server run: +To start an ephemeral development server, run: ```sh npm install npm start ``` -Then browse to http://localhost:8080 +Then, browse to http://localhost:8080 --- @@ -71,6 +80,8 @@ The server is configured with environment variables. See [server/config.js](serv Firefox Send localization is managed via [Pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/), not direct pull requests to the repository. If you want to fix a typo, add a new language, or simply know more about localization, please get in touch with the [existing localization team](https://pontoon.mozilla.org/teams/) for your language or Mozilla’s [l10n-drivers](https://wiki.mozilla.org/L10n:Mozilla_Team#Mozilla_Corporation) for guidance. +see also [docs/localization.md](docs/localization.md) + --- ## Contributing @@ -84,8 +95,20 @@ Pull requests are always welcome! Feel free to check out the list of ["good firs | ENVIRONMENT | URL |-------------|----- | Production | -| Stage | -| Development | +| Stage | +| Development | + +--- + +## Deployment + +see also [docs/deployment.md](docs/deployment.md) + +--- + +## Android + +The android implementation is contained in the `android` directory, and can be viewed locally for easy testing and editing by running `ANDROID=1 npm start` and then visiting . CSS and image files are located in the `android/app/src/main/assets` directory. --- diff --git a/android/.eslintrc.yaml b/android/.eslintrc.yaml new file mode 100644 index 000000000..73942709d --- /dev/null +++ b/android/.eslintrc.yaml @@ -0,0 +1,6 @@ +env: + browser: true + +parserOptions: + sourceType: module + diff --git a/android/.gitignore b/android/.gitignore new file mode 100644 index 000000000..caa8065e2 --- /dev/null +++ b/android/.gitignore @@ -0,0 +1,4 @@ +local.properties +.gradle +build + diff --git a/android/README.md b/android/README.md new file mode 100644 index 000000000..50c7c5337 --- /dev/null +++ b/android/README.md @@ -0,0 +1,9 @@ +Readme +===== + +The Send Android app allows you to choose any file from your android device, encrypt it with a password, and get a URL which will allow secure download of the file. By default, this URL will expire after one download or 24 hours. + +Building the Send Android app. +===== + +First, install Android Studio. Open the `android` directory in Android Studio, plug in your android phone, and press the run button. \ No newline at end of file diff --git a/android/SendAndroid.iml b/android/SendAndroid.iml new file mode 100644 index 000000000..3a01e9b26 --- /dev/null +++ b/android/SendAndroid.iml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/android.js b/android/android.js new file mode 100644 index 000000000..22069ea10 --- /dev/null +++ b/android/android.js @@ -0,0 +1,96 @@ +import 'intl-pluralrules'; +import choo from 'choo'; +import html from 'choo/html'; +import * as Sentry from '@sentry/browser'; + +import { setApiUrlPrefix, getConstants } from '../app/api'; +import metrics from '../app/metrics'; +//import assets from '../common/assets'; +import Archive from '../app/archive'; +import Header from '../app/ui/header'; +import storage from '../app/storage'; +import controller from '../app/controller'; +import User from './user'; +import intents from './stores/intents'; +import home from './pages/home'; +import upload from './pages/upload'; +import share from './pages/share'; +import preferences from './pages/preferences'; +import error from './pages/error'; +import { getTranslator } from '../app/locale'; +import { setTranslate } from '../app/utils'; + +import { delay } from '../app/utils'; + +if (navigator.userAgent === 'Send Android') { + setApiUrlPrefix('https://send.firefox.com'); +} + +const app = choo(); +//app.use(state); +app.use(controller); +app.use(intents); + +window.finishLogin = async function(accountInfo) { + while (!(app.state && app.state.user)) { + await delay(); + } + await app.state.user.finishLogin(accountInfo); + await app.state.user.syncFileList(); + app.emitter.emit('replaceState', '/'); +}; + +function body(main) { + return function(state, emit) { + /* + Disable the preferences menu for now since it is ugly and isn't + relevant to the beta + function clickPreferences(event) { + event.preventDefault(); + emit('pushState', '/preferences'); + } + + const menu = html` + + `; + */ + return html` + + ${state.cache(Header, 'header').render()} ${main(state, emit)} + + `; + }; +} +(async function start() { + const translate = await getTranslator('en-US'); + setTranslate(translate); + const { LIMITS, DEFAULTS } = await getConstants(); + app.use(state => { + state.LIMITS = LIMITS; + state.DEFAULTS = DEFAULTS; + state.translate = translate; + state.capabilities = { + account: true + }; //TODO + state.archive = new Archive([], DEFAULTS.EXPIRE_SECONDS); + state.storage = storage; + state.user = new User(storage, LIMITS); + state.sentry = Sentry; + }); + app.use(metrics); + app.route('/', body(home)); + app.route('/upload', upload); + app.route('/share/:id', share); + app.route('/preferences', preferences); + app.route('/error', error); + //app.route('/debugging', require('./pages/debugging').default); + // add /api/filelist + app.mount('body'); +})(); + +window.app = app; diff --git a/android/app/.gitignore b/android/app/.gitignore new file mode 100644 index 000000000..796b96d1c --- /dev/null +++ b/android/app/.gitignore @@ -0,0 +1 @@ +/build diff --git a/android/app/build.gradle b/android/app/build.gradle new file mode 100644 index 000000000..471a3a213 --- /dev/null +++ b/android/app/build.gradle @@ -0,0 +1,41 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' +apply plugin: 'kotlin-android-extensions' + +android { + compileSdkVersion 27 + defaultConfig { + applicationId "org.mozilla.firefoxsend" + minSdkVersion 26 + targetSdkVersion 27 + versionCode 1 + versionName "1.0" + testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" + } + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation"org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.android.support:appcompat-v7:27.1.1' + implementation 'com.android.support.constraint:constraint-layout:1.1.3' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'com.android.support.test:runner:1.0.2' + androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' + implementation 'com.github.delight-im:Android-AdvancedWebView:v3.0.0' + implementation "org.mozilla.components:service-firefox-accounts:$android_components_version" +} + +task generateAndLinkBundle(type: Exec, description: 'Generate the android.js bundle and link it into the assets directory') { + commandLine './buildAssets.sh' +} + +tasks.withType(JavaCompile) { + compileTask -> compileTask.dependsOn generateAndLinkBundle +} diff --git a/android/app/buildAssets.sh b/android/app/buildAssets.sh new file mode 100755 index 000000000..b936c8db6 --- /dev/null +++ b/android/app/buildAssets.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash +if [ -d "../../node_modules" ] +then + echo "node_modules already present." +else + echo "node_modules not present, running npm install." + npm install +fi +npm run build +rm -rf src/main/assets +mkdir -p src/main/assets +cp -R ../../dist/* src/main/assets diff --git a/android/app/proguard-rules.pro b/android/app/proguard-rules.pro new file mode 100644 index 000000000..f1b424510 --- /dev/null +++ b/android/app/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml new file mode 100644 index 000000000..9e4163fa4 --- /dev/null +++ b/android/app/src/main/AndroidManifest.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/android/app/src/main/ic_launcher-web.png b/android/app/src/main/ic_launcher-web.png new file mode 100644 index 000000000..07411c116 Binary files /dev/null and b/android/app/src/main/ic_launcher-web.png differ diff --git a/android/app/src/main/java/org/mozilla/firefoxsend/MainActivity.kt b/android/app/src/main/java/org/mozilla/firefoxsend/MainActivity.kt new file mode 100644 index 000000000..8b3d475a3 --- /dev/null +++ b/android/app/src/main/java/org/mozilla/firefoxsend/MainActivity.kt @@ -0,0 +1,226 @@ +package org.mozilla.firefoxsend + +import android.annotation.SuppressLint +import android.content.ComponentName +import android.content.Intent +import android.graphics.Bitmap +import android.net.Uri +import android.os.Bundle +import android.support.v7.app.AppCompatActivity +import android.util.Base64 +import android.util.Log +import android.view.View +import android.webkit.* +import im.delight.android.webview.AdvancedWebView +import kotlinx.android.synthetic.main.activity_main.* +import mozilla.components.service.fxa.Config +import mozilla.components.service.fxa.FirefoxAccount +import mozilla.components.service.fxa.FxaResult +import org.json.JSONObject + +internal class LoggingWebChromeClient : WebChromeClient() { + override fun onConsoleMessage(cm: ConsoleMessage): Boolean { + Log.d(TAG, String.format("%s @ %d: %s", + cm.message(), cm.lineNumber(), cm.sourceId())) + return true + } + + companion object { + private const val TAG = "CONTENT" + } +} + +class WebAppInterface(private val mContext: MainActivity) { + @JavascriptInterface + fun beginOAuthFlow() { + mContext.beginOAuthFlow() + } + + @JavascriptInterface + fun shareUrl(url: String) { + mContext.shareUrl(url) + } +} + +class MainActivity : AppCompatActivity(), AdvancedWebView.Listener { + + private var mToShare: String? = null + private var mToCall: String? = null + private var mAccount: FirefoxAccount? = null + + @SuppressLint("SetJavaScriptEnabled") + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_main) + + WebView.setWebContentsDebuggingEnabled(BuildConfig.DEBUG) + webView.apply { + setListener(this@MainActivity, this@MainActivity) + addJavascriptInterface(WebAppInterface(this@MainActivity), JS_INTERFACE_NAME) + setLayerType(View.LAYER_TYPE_HARDWARE, null) + webChromeClient = LoggingWebChromeClient() + + settings.apply { + userAgentString = "Send Android" + allowUniversalAccessFromFileURLs = true + javaScriptEnabled = true + } + } + + val type = intent.type + if (Intent.ACTION_SEND == intent.action && type != null) { + if (type == "text/plain") { + val sharedText = intent.getStringExtra(Intent.EXTRA_TEXT) + // Log.d(TAG_INTENT, "text/plain $sharedText") + mToShare = "data:text/plain;base64," + Base64.encodeToString(sharedText.toByteArray(), 16).trim() + } else if (type.startsWith("image/")) { + val imageUri = intent.getParcelableExtra(Intent.EXTRA_STREAM) as Uri + // Log.d(TAG_INTENT, "image/ $imageUri") + mToShare = "data:text/plain;base64," + Base64.encodeToString(imageUri.path.toByteArray(), 16).trim() + } + } + webView.loadUrl("file:///android_asset/android.html") + } + + fun beginOAuthFlow() { + Config.release().then { value -> + mAccount = FirefoxAccount(value, "20f7931c9054d833", "https://send.firefox.com/fxa/android-redirect.html") + mAccount?.beginOAuthFlow(arrayOf("profile", "https://identity.mozilla.com/apps/send"), true) + ?.then { url -> + // Log.d(TAG_CONFIG, "GOT A URL $url") + this@MainActivity.runOnUiThread { + webView.loadUrl(url) + } + FxaResult.fromValue(Unit) + } + // Log.d(TAG_CONFIG, "CREATED FIREFOXACCOUNT") + FxaResult.fromValue(Unit) + } + } + + fun shareUrl(url: String) { + val shareIntent = Intent().apply { + action = Intent.ACTION_SEND + type = "text/plain" + putExtra(Intent.EXTRA_TEXT, url) + } + + val components = arrayOf(ComponentName(applicationContext, MainActivity::class.java)) + val chooser = Intent.createChooser(shareIntent, "") + .putExtra(Intent.EXTRA_EXCLUDE_COMPONENTS, components) + + startActivity(chooser) + } + + override fun onResume() { + super.onResume() + webView.onResume() + } + + override fun onPause() { + webView.onPause() + super.onPause() + } + + override fun onDestroy() { + webView.onDestroy() + super.onDestroy() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, intent: Intent?) { + super.onActivityResult(requestCode, resultCode, intent) + webView.onActivityResult(requestCode, resultCode, intent) + } + + override fun onBackPressed() { + if (!webView.onBackPressed()) { + return + } + super.onBackPressed() + } + + override fun onPageStarted(url: String, favicon: Bitmap?) { + if (url.startsWith("https://send.firefox.com/fxa/android-redirect.html")) { + // We load this here so the user doesn't see the android-redirect.html page + webView.loadUrl("file:///android_asset/android.html") + + val uri = Uri.parse(url) + uri.getQueryParameter("code")?.let { code -> + uri.getQueryParameter("state")?.let { state -> + mAccount?.completeOAuthFlow(code, state)?.whenComplete { info -> + mAccount?.getProfile(false)?.then { profile -> + val profileJsonPayload = JSONObject() + .put("accessToken", info.accessToken) + .put("keys", info.keys) + .put("avatar", profile.avatar) + .put("displayName", profile.displayName) + .put("email", profile.email) + .put("uid", profile.uid).toString() + mToCall = "finishLogin($profileJsonPayload)" + this@MainActivity.runOnUiThread { + // Clear the history so that the user can't use the back button to see broken pages + // that were inserted into the history by the login process. + webView.clearHistory() + + // We also reload this here because we need to make sure onPageFinished runs after mToCall has been set. + // We can't guarantee that onPageFinished wasn't already called at this point. + webView.loadUrl("file:///android_asset/android.html") + } + FxaResult.fromValue(Unit) + } + } + } + } + } + if (!url.startsWith("file:///android_asset/") && !url.startsWith("https://accounts.firefox.com/")) { + // Don't allow loading anything other than the app in our webview + // It should be possible to do this with shouldOverrideUrlLoading + // but it didn't seem to be working, so this works as a hack. + webView.loadUrl("file:///android_asset/android.html") + Log.d(TAG_MAIN, "BAD URL " + url) + } else { + // Log.d(TAG_MAIN, "onPageStarted " + url) + } + } + + override fun onPageFinished(url: String) { + // Log.d(TAG_MAIN, "onPageFinished") + if (mToShare != null) { + // Log.d(TAG_INTENT, mToShare) + + webView.postWebMessage(WebMessage(mToShare), Uri.EMPTY) + mToShare = null + } + if (mToCall != null) { + this@MainActivity.runOnUiThread { + webView.evaluateJavascript(mToCall) { + mToCall = null + } + } + } + } + + override fun onPageError(errorCode: Int, description: String, failingUrl: String) { + Log.d(TAG_MAIN, "onPageError($errorCode, $description, $failingUrl)") + } + + override fun onDownloadRequested(url: String, + suggestedFilename: String, + mimeType: String, + contentLength: Long, + contentDisposition: String, + userAgent: String) { + // Log.d(TAG_MAIN, "onDownloadRequested") + } + + override fun onExternalPageRequest(url: String) { + // Log.d(TAG_MAIN, "onExternalPageRequest($url)") + } + + companion object { + private const val TAG_MAIN = "MAIN" + private const val TAG_INTENT = "INTENT" + private const val TAG_CONFIG = "CONFIG" + private const val JS_INTERFACE_NAME = "Android" + } +} diff --git a/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml new file mode 100644 index 000000000..218e2ce27 --- /dev/null +++ b/android/app/src/main/res/drawable-v24/ic_launcher_foreground.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/drawable/ic_launcher_foreground.xml b/android/app/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 000000000..514163b34 --- /dev/null +++ b/android/app/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,97 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/android/app/src/main/res/layout/activity_main.xml b/android/app/src/main/res/layout/activity_main.xml new file mode 100644 index 000000000..d2b2ba3f8 --- /dev/null +++ b/android/app/src/main/res/layout/activity_main.xml @@ -0,0 +1,7 @@ + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml new file mode 100644 index 000000000..7353dbd1f --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml new file mode 100644 index 000000000..7353dbd1f --- /dev/null +++ b/android/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..59b62ada7 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png new file mode 100644 index 000000000..ea8650ff0 Binary files /dev/null and b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2e5dcb942 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png new file mode 100644 index 000000000..2bfe55552 Binary files /dev/null and b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..8bacced78 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png new file mode 100644 index 000000000..348c18eb1 Binary files /dev/null and b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..bce6cd3ca Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..dc5be3e80 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..9e0617239 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png new file mode 100644 index 000000000..c606d9cb9 Binary files /dev/null and b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ diff --git a/android/app/src/main/res/values/colors.xml b/android/app/src/main/res/values/colors.xml new file mode 100644 index 000000000..3ab3e9cbc --- /dev/null +++ b/android/app/src/main/res/values/colors.xml @@ -0,0 +1,6 @@ + + + #3F51B5 + #303F9F + #FF4081 + diff --git a/android/app/src/main/res/values/ic_launcher_background.xml b/android/app/src/main/res/values/ic_launcher_background.xml new file mode 100644 index 000000000..3587ae3a8 --- /dev/null +++ b/android/app/src/main/res/values/ic_launcher_background.xml @@ -0,0 +1,4 @@ + + + #220033 + \ No newline at end of file diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml new file mode 100644 index 000000000..81a068af6 --- /dev/null +++ b/android/app/src/main/res/values/strings.xml @@ -0,0 +1,3 @@ + + Send + diff --git a/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml new file mode 100644 index 000000000..0eb88fe33 --- /dev/null +++ b/android/app/src/main/res/values/styles.xml @@ -0,0 +1,11 @@ + + + + + + diff --git a/android/build.gradle b/android/build.gradle new file mode 100644 index 000000000..bae18a8dd --- /dev/null +++ b/android/build.gradle @@ -0,0 +1,27 @@ +// Top-level build file where you can add configuration options common to all sub-projects/modules. + +buildscript { + ext.kotlin_version = '1.3.21' + ext.android_components_version = '0.26.0' + repositories { + google() + jcenter() + } + dependencies { + classpath 'com.android.tools.build:gradle:3.3.2' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21" + } +} + +allprojects { + repositories { + google() + maven { url "https://maven.mozilla.org/maven2" } + jcenter() + maven { url "https://jitpack.io" } + } +} + +task clean(type: Delete) { + delete rootProject.buildDir +} diff --git a/android/gradle.properties b/android/gradle.properties new file mode 100644 index 000000000..743d692ce --- /dev/null +++ b/android/gradle.properties @@ -0,0 +1,13 @@ +# Project-wide Gradle settings. +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +org.gradle.jvmargs=-Xmx1536m +# When configured, Gradle will run in incubating parallel mode. +# This option should only be used with decoupled projects. More details, visit +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +# org.gradle.parallel=true diff --git a/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..7a3265ee9 Binary files /dev/null and b/android/gradle/wrapper/gradle-wrapper.jar differ diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..5d0c12e4b --- /dev/null +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,6 @@ +#Tue Feb 19 08:34:25 EST 2019 +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME +zipStorePath=wrapper/dists +distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip diff --git a/android/gradlew b/android/gradlew new file mode 100755 index 000000000..cccdd3d51 --- /dev/null +++ b/android/gradlew @@ -0,0 +1,172 @@ +#!/usr/bin/env sh + +############################################################################## +## +## Gradle start up script for UN*X +## +############################################################################## + +# Attempt to set APP_HOME +# Resolve links: $0 may be a link +PRG="$0" +# Need this for relative symlinks. +while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG=`dirname "$PRG"`"/$link" + fi +done +SAVED="`pwd`" +cd "`dirname \"$PRG\"`/" >/dev/null +APP_HOME="`pwd -P`" +cd "$SAVED" >/dev/null + +APP_NAME="Gradle" +APP_BASE_NAME=`basename "$0"` + +# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +DEFAULT_JVM_OPTS="" + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD="maximum" + +warn () { + echo "$*" +} + +die () { + echo + echo "$*" + echo + exit 1 +} + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "`uname`" in + CYGWIN* ) + cygwin=true + ;; + Darwin* ) + darwin=true + ;; + MINGW* ) + msys=true + ;; + NONSTOP* ) + nonstop=true + ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD="java" + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then + MAX_FD_LIMIT=`ulimit -H -n` + if [ $? -eq 0 ] ; then + if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then + MAX_FD="$MAX_FD_LIMIT" + fi + ulimit -n $MAX_FD + if [ $? -ne 0 ] ; then + warn "Could not set maximum file descriptor limit: $MAX_FD" + fi + else + warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" + fi +fi + +# For Darwin, add options to specify how the application appears in the dock +if $darwin; then + GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" +fi + +# For Cygwin, switch paths to Windows format before running java +if $cygwin ; then + APP_HOME=`cygpath --path --mixed "$APP_HOME"` + CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` + JAVACMD=`cygpath --unix "$JAVACMD"` + + # We build the pattern for arguments to be converted via cygpath + ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` + SEP="" + for dir in $ROOTDIRSRAW ; do + ROOTDIRS="$ROOTDIRS$SEP$dir" + SEP="|" + done + OURCYGPATTERN="(^($ROOTDIRS))" + # Add a user-defined pattern to the cygpath arguments + if [ "$GRADLE_CYGPATTERN" != "" ] ; then + OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" + fi + # Now convert the arguments - kludge to limit ourselves to /bin/sh + i=0 + for arg in "$@" ; do + CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` + CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option + + if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition + eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` + else + eval `echo args$i`="\"$arg\"" + fi + i=$((i+1)) + done + case $i in + (0) set -- ;; + (1) set -- "$args0" ;; + (2) set -- "$args0" "$args1" ;; + (3) set -- "$args0" "$args1" "$args2" ;; + (4) set -- "$args0" "$args1" "$args2" "$args3" ;; + (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; + (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; + (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; + (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; + (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; + esac +fi + +# Escape application args +save () { + for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done + echo " " +} +APP_ARGS=$(save "$@") + +# Collect all arguments for the java command, following the shell quoting and substitution rules +eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" + +# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong +if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then + cd "$(dirname "$0")" +fi + +exec "$JAVACMD" "$@" diff --git a/android/gradlew.bat b/android/gradlew.bat new file mode 100644 index 000000000..e95643d6a --- /dev/null +++ b/android/gradlew.bat @@ -0,0 +1,84 @@ +@if "%DEBUG%" == "" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%" == "" set DIRNAME=. +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS= + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if "%ERRORLEVEL%" == "0" goto init + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto init + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:init +@rem Get command-line arguments, handling Windows variants + +if not "%OS%" == "Windows_NT" goto win9xME_args + +:win9xME_args +@rem Slurp the command line arguments. +set CMD_LINE_ARGS= +set _SKIP=2 + +:win9xME_args_slurp +if "x%~1" == "x" goto execute + +set CMD_LINE_ARGS=%* + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% + +:end +@rem End local scope for the variables with windows NT shell +if "%ERRORLEVEL%"=="0" goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 +exit /b 1 + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/android/pages/.eslintrc.yaml b/android/pages/.eslintrc.yaml new file mode 100644 index 000000000..73942709d --- /dev/null +++ b/android/pages/.eslintrc.yaml @@ -0,0 +1,6 @@ +env: + browser: true + +parserOptions: + sourceType: module + diff --git a/android/pages/error.js b/android/pages/error.js new file mode 100644 index 000000000..b85d53a4d --- /dev/null +++ b/android/pages/error.js @@ -0,0 +1,12 @@ +const html = require('choo/html'); + +export default function error(_state, _emit) { + return html` + +
+

Error

+

Sorry, an error occurred.

+
+ + `; +} diff --git a/android/pages/home.js b/android/pages/home.js new file mode 100644 index 000000000..5bc1cc156 --- /dev/null +++ b/android/pages/home.js @@ -0,0 +1,69 @@ +const html = require('choo/html'); +const { list } = require('../../app/utils'); +const archiveTile = require('../../app/ui/archiveTile'); +const modal = require('../../app/ui/modal'); +const intro = require('../../app/ui/intro'); +const assets = require('../../common/assets'); + +module.exports = function(state, emit) { + function onchange(event) { + event.preventDefault(); + const newFiles = Array.from(event.target.files); + + emit('addFiles', { files: newFiles }); + } + + function onclick() { + document.getElementById('file-upload').click(); + } + + const archives = state.storage.files + .filter(archive => !archive.expired) + .map(archive => archiveTile(state, emit, archive)) + .reverse(); + + let content = ''; + let button = html` +
+ +
+ `; + if (state.uploading) { + content = archiveTile.uploading(state, emit); + button = ''; + } else if (state.archive.numFiles > 0) { + content = archiveTile.wip(state, emit); + button = ''; + } else { + content = + archives.length < 1 + ? intro(state) + : list(archives, 'h-full overflow-y-auto w-full', 'mb-3 w-full'); + } + + return html` +
+ ${state.modal && modal(state, emit)} +
+ ${content} +
+
+ ${button} + +
+
+ `; +}; diff --git a/android/pages/preferences.js b/android/pages/preferences.js new file mode 100644 index 000000000..bfc5a5a27 --- /dev/null +++ b/android/pages/preferences.js @@ -0,0 +1,34 @@ +const html = require('choo/html'); + +import { setFileProtocolWssUrl, getFileProtocolWssUrl } from '../../app/api'; + +export default function preferences(state, emit) { + const wssURL = getFileProtocolWssUrl(); + + function updateWssUrl(event) { + state.wssURL = event.target.value; + setFileProtocolWssUrl(state.wssURL); + emit('render'); + } + + function clickDone(event) { + event.preventDefault(); + emit('pushState', '/'); + } + + return html` + +
+
+ done +
+
wss url:
+
+ +
+
+
+
+ + `; +} diff --git a/android/pages/share.js b/android/pages/share.js new file mode 100644 index 000000000..220808cbd --- /dev/null +++ b/android/pages/share.js @@ -0,0 +1,51 @@ +const html = require('choo/html'); + +export default function uploadComplete(state, emit) { + const file = state.storage.files[state.storage.files.length - 1]; + function onclick(e) { + e.preventDefault(); + input.select(); + document.execCommand('copy'); + input.selectionEnd = input.selectionStart; + copyText.textContent = 'Copied!'; + setTimeout(function() { + copyText.textContent = 'Copy link'; + }, 2000); + } + + function uploadFile(event) { + event.preventDefault(); + const target = event.target; + const file = target.files[0]; + if (file.size === 0) { + return; + } + + emit('pushState', '/upload'); + emit('addFiles', { files: [file] }); + emit('upload', {}); + } + + const input = html` + + `; + const copyText = html` + Copy link + `; + return html` +
+
+
The card contents will be here.
+
Expires after: exp
+ ${input} + + + +
+`; +} diff --git a/android/pages/upload.js b/android/pages/upload.js new file mode 100644 index 000000000..c98962dd2 --- /dev/null +++ b/android/pages/upload.js @@ -0,0 +1,26 @@ +const html = require('choo/html'); + +export default function progressBar(state, emit) { + let percent = 0; + if (state.transfer && state.transfer.progress) { + percent = Math.floor(state.transfer.progressRatio * 100); + } + function onclick(e) { + e.preventDefault(); + if (state.uploading) { + emit('cancel'); + } + emit('pushState', '/'); + } + return html` + +
+
+
${percent}%
+ . +
CANCEL
+
+
+ + `; +} diff --git a/android/settings.gradle b/android/settings.gradle new file mode 100644 index 000000000..e7b4def49 --- /dev/null +++ b/android/settings.gradle @@ -0,0 +1 @@ +include ':app' diff --git a/android/stores/intents.js b/android/stores/intents.js new file mode 100644 index 000000000..ba757eaa2 --- /dev/null +++ b/android/stores/intents.js @@ -0,0 +1,20 @@ +/* eslint-disable no-console */ + +export default function intentHandler(state, emitter) { + window.addEventListener( + 'message', + event => { + if (typeof event.data !== 'string' || !event.data.startsWith('data:')) { + return; + } + fetch(event.data) + .then(res => res.blob()) + .then(blob => { + emitter.emit('addFiles', { files: [blob] }); + emitter.emit('upload', {}); + }) + .catch(e => console.error('ERROR ' + e + ' ' + e.stack)); + }, + false + ); +} diff --git a/android/stores/state.js b/android/stores/state.js new file mode 100644 index 000000000..a11058b56 --- /dev/null +++ b/android/stores/state.js @@ -0,0 +1,41 @@ +/* eslint-disable no-console */ + +import User from '../user'; +import storage from '../../app/storage'; + +export default function initialState(state, emitter) { + const files = []; + + Object.assign(state, { + prefix: '/android_asset', + user: new User(storage), + getAsset(name) { + return `${state.prefix}/${name}`; + }, + sentry: { + captureException: e => { + console.error('ERROR ' + e + ' ' + e.stack); + } + }, + storage: { + files, + remove: function(fileId) { + console.log('REMOVE FILEID', fileId); + }, + writeFile: function(file) { + console.log('WRITEFILE', file); + }, + addFile: function(file) { + console.log('addfile' + JSON.stringify(file)); + files.push(file); + emitter.emit('pushState', `/share/${file.id}`); + }, + totalUploads: 0 + }, + transfer: null, + uploading: false, + settingPassword: false, + passwordSetError: null, + route: '/' + }); +} diff --git a/android/user.js b/android/user.js new file mode 100644 index 000000000..f9c056b65 --- /dev/null +++ b/android/user.js @@ -0,0 +1,30 @@ +/* global Android */ +import User from '../app/user'; +import { deriveFileListKey } from '../app/fxa'; + +export default class AndroidUser extends User { + constructor(storage, limits) { + super(storage, limits); + } + + async login() { + Android.beginOAuthFlow(); + } + + startAuthFlow() { + return Promise.resolve(); + } + + async finishLogin(accountInfo) { + const jwks = JSON.parse(accountInfo.keys); + const ikm = jwks['https://identity.mozilla.com/apps/send'].k; + const profile = { + displayName: accountInfo.displayName, + email: accountInfo.email, + avatar: accountInfo.avatar, + access_token: accountInfo.accessToken + }; + profile.fileListKey = await deriveFileListKey(ikm); + this.info = profile; + } +} diff --git a/app/api.js b/app/api.js index 5986ff9f4..c316b1cb7 100644 --- a/app/api.js +++ b/app/api.js @@ -1,16 +1,58 @@ -import { arrayToB64, b64ToArray } from './utils'; +import { arrayToB64, b64ToArray, delay } from './utils'; +import { ECE_RECORD_SIZE } from './ece'; -function post(obj) { +let fileProtocolWssUrl = null; +try { + fileProtocolWssUrl = localStorage.getItem('wssURL'); +} catch (e) { + // NOOP +} +if (!fileProtocolWssUrl) { + fileProtocolWssUrl = 'wss://send.firefox.com/api/ws'; +} + +export class ConnectionError extends Error { + constructor(cancelled, duration, size) { + super(cancelled ? '0' : 'connection closed'); + this.cancelled = cancelled; + this.duration = duration; + this.size = size; + } +} + +export function setFileProtocolWssUrl(url) { + localStorage && localStorage.setItem('wssURL', url); + fileProtocolWssUrl = url; +} + +export function getFileProtocolWssUrl() { + return fileProtocolWssUrl; +} + +let apiUrlPrefix = ''; +export function getApiUrl(path) { + return apiUrlPrefix + path; +} + +export function setApiUrlPrefix(prefix) { + apiUrlPrefix = prefix; +} + +function post(obj, bearerToken) { + const h = { + 'Content-Type': 'application/json' + }; + if (bearerToken) { + h['Authentication'] = `Bearer ${bearerToken}`; + } return { method: 'POST', - headers: new Headers({ - 'Content-Type': 'application/json' - }), + headers: new Headers(h), body: JSON.stringify(obj) }; } -function parseNonce(header) { +export function parseNonce(header) { header = header || ''; return header.split(' ')[1]; } @@ -19,7 +61,10 @@ async function fetchWithAuth(url, params, keychain) { const result = {}; params = params || {}; const h = await keychain.authHeader(); - params.headers = new Headers({ Authorization: h }); + params.headers = new Headers({ + Authorization: h, + 'Content-Type': 'application/json' + }); const response = await fetch(url, params); result.response = response; result.ok = response.ok; @@ -38,33 +83,44 @@ async function fetchWithAuthAndRetry(url, params, keychain) { } export async function del(id, owner_token) { - const response = await fetch(`/api/delete/${id}`, post({ owner_token })); + const response = await fetch( + getApiUrl(`/api/delete/${id}`), + post({ owner_token }) + ); return response.ok; } -export async function setParams(id, owner_token, params) { +export async function setParams(id, owner_token, bearerToken, params) { const response = await fetch( - `/api/params/${id}`, - post({ - owner_token, - dlimit: params.dlimit - }) + getApiUrl(`/api/params/${id}`), + post( + { + owner_token, + dlimit: params.dlimit + }, + bearerToken + ) ); return response.ok; } export async function fileInfo(id, owner_token) { - const response = await fetch(`/api/info/${id}`, post({ owner_token })); + const response = await fetch( + getApiUrl(`/api/info/${id}`), + post({ owner_token }) + ); + if (response.ok) { const obj = await response.json(); return obj; } + throw new Error(response.status); } export async function metadata(id, keychain) { const result = await fetchWithAuthAndRetry( - `/api/metadata/${id}`, + getApiUrl(`/api/metadata/${id}`), { method: 'GET' }, keychain ); @@ -72,11 +128,12 @@ export async function metadata(id, keychain) { const data = await result.response.json(); const meta = await keychain.decryptMetadata(b64ToArray(data.metadata)); return { - size: data.size, + size: meta.size, ttl: data.ttl, - iv: meta.iv, name: meta.name, - type: meta.type + type: meta.type, + manifest: meta.manifest, + flagged: data.flagged }; } throw new Error(result.response.status); @@ -85,129 +142,331 @@ export async function metadata(id, keychain) { export async function setPassword(id, owner_token, keychain) { const auth = await keychain.authKeyB64(); const response = await fetch( - `/api/password/${id}`, + getApiUrl(`/api/password/${id}`), post({ owner_token, auth }) ); return response.ok; } -export function uploadFile(encrypted, metadata, verifierB64, keychain) { - const xhr = new XMLHttpRequest(); - const upload = { - onprogress: function() {}, - cancel: function() { - xhr.abort(); - }, - result: new Promise(function(resolve, reject) { - xhr.addEventListener('loadend', function() { - const authHeader = xhr.getResponseHeader('WWW-Authenticate'); - if (authHeader) { - keychain.nonce = parseNonce(authHeader); - } - if (xhr.status === 200) { - const responseObj = JSON.parse(xhr.responseText); - return resolve({ - url: responseObj.url, - id: responseObj.id, - ownerToken: responseObj.owner - }); +function asyncInitWebSocket(server) { + return new Promise((resolve, reject) => { + try { + const ws = new WebSocket(server); + ws.addEventListener('open', () => resolve(ws), { once: true }); + } catch (e) { + reject(new ConnectionError(false)); + } + }); +} + +function listenForResponse(ws, canceller) { + return new Promise((resolve, reject) => { + function handleClose(event) { + // a 'close' event before a 'message' event means the request failed + ws.removeEventListener('message', handleMessage); + reject(new ConnectionError(canceller.cancelled)); + } + function handleMessage(msg) { + ws.removeEventListener('close', handleClose); + try { + const response = JSON.parse(msg.data); + if (response.error) { + throw new Error(response.error); + } else { + resolve(response); } - reject(new Error(xhr.status)); - }); - }) - }; - const dataView = new DataView(encrypted); - const blob = new Blob([dataView], { type: 'application/octet-stream' }); - const fd = new FormData(); - fd.append('data', blob); - xhr.upload.addEventListener('progress', function(event) { - if (event.lengthComputable) { - upload.onprogress([event.loaded, event.total]); + } catch (e) { + reject(e); + } } + ws.addEventListener('message', handleMessage, { once: true }); + ws.addEventListener('close', handleClose, { once: true }); }); - xhr.open('post', '/api/upload', true); - xhr.setRequestHeader('X-File-Metadata', arrayToB64(new Uint8Array(metadata))); - xhr.setRequestHeader('Authorization', `send-v1 ${verifierB64}`); - xhr.send(fd); - return upload; } -function download(id, keychain) { - const xhr = new XMLHttpRequest(); - const download = { - onprogress: function() {}, +async function upload( + stream, + metadata, + verifierB64, + timeLimit, + dlimit, + bearerToken, + onprogress, + canceller +) { + let size = 0; + const start = Date.now(); + const host = window.location.hostname; + const port = window.location.port; + const protocol = window.location.protocol === 'https:' ? 'wss:' : 'ws:'; + const endpoint = + window.location.protocol === 'file:' + ? fileProtocolWssUrl + : `${protocol}//${host}${port ? ':' : ''}${port}/api/ws`; + + const ws = await asyncInitWebSocket(endpoint); + + try { + const metadataHeader = arrayToB64(new Uint8Array(metadata)); + const fileMeta = { + fileMetadata: metadataHeader, + authorization: `send-v1 ${verifierB64}`, + bearer: bearerToken, + timeLimit, + dlimit + }; + const uploadInfoResponse = listenForResponse(ws, canceller); + ws.send(JSON.stringify(fileMeta)); + const uploadInfo = await uploadInfoResponse; + + const completedResponse = listenForResponse(ws, canceller); + + const reader = stream.getReader(); + let state = await reader.read(); + while (!state.done) { + if (canceller.cancelled) { + ws.close(); + } + if (ws.readyState !== WebSocket.OPEN) { + break; + } + const buf = state.value; + ws.send(buf); + onprogress(size); + size += buf.length; + state = await reader.read(); + while ( + ws.bufferedAmount > ECE_RECORD_SIZE * 2 && + ws.readyState === WebSocket.OPEN && + !canceller.cancelled + ) { + await delay(); + } + } + if (ws.readyState === WebSocket.OPEN) { + ws.send(new Uint8Array([0])); //EOF + } + + await completedResponse; + uploadInfo.duration = Date.now() - start; + return uploadInfo; + } catch (e) { + e.size = size; + e.duration = Date.now() - start; + throw e; + } finally { + if (![WebSocket.CLOSED, WebSocket.CLOSING].includes(ws.readyState)) { + ws.close(); + } + } +} + +export function uploadWs( + encrypted, + metadata, + verifierB64, + timeLimit, + dlimit, + bearerToken, + onprogress +) { + const canceller = { cancelled: false }; + + return { cancel: function() { - xhr.abort(); + canceller.cancelled = true; }, - result: new Promise(async function(resolve, reject) { - xhr.addEventListener('loadend', function() { - const authHeader = xhr.getResponseHeader('WWW-Authenticate'); - if (authHeader) { - keychain.nonce = parseNonce(authHeader); - } - if (xhr.status === 404) { - return reject(new Error('notfound')); - } - if (xhr.status !== 200) { - return reject(new Error(xhr.status)); - } - const blob = new Blob([xhr.response]); - const fileReader = new FileReader(); - fileReader.readAsArrayBuffer(blob); - fileReader.onload = function() { - resolve(this.result); - }; - }); - xhr.addEventListener('progress', function(event) { - if (event.lengthComputable && event.target.status === 200) { - download.onprogress([event.loaded, event.total]); - } - }); - const auth = await keychain.authHeader(); - xhr.open('get', `/api/download/${id}`); - xhr.setRequestHeader('Authorization', auth); - xhr.responseType = 'blob'; - xhr.send(); - }) + result: upload( + encrypted, + metadata, + verifierB64, + timeLimit, + dlimit, + bearerToken, + onprogress, + canceller + ) }; +} + +//////////////////////// + +async function _downloadStream(id, dlToken, signal) { + const response = await fetch(getApiUrl(`/api/download/${id}`), { + signal: signal, + method: 'GET', + headers: { Authorization: `Bearer ${dlToken}` } + }); + + if (response.status !== 200) { + throw new Error(response.status); + } - return download; + return response.body; } -async function tryDownload(id, keychain, onprogress, tries = 1) { - const dl = download(id, keychain); - dl.onprogress = onprogress; +async function tryDownloadStream(id, dlToken, signal, tries = 2) { try { - const result = await dl.result; + const result = await _downloadStream(id, dlToken, signal); return result; } catch (e) { if (e.message === '401' && --tries > 0) { - return tryDownload(id, keychain, onprogress, tries); + return tryDownloadStream(id, dlToken, signal, tries); + } + if (e.name === 'AbortError') { + throw new Error('0'); } throw e; } } -export function downloadFile(id, keychain) { - let cancelled = false; - function updateProgress(p) { - if (cancelled) { - // This is a bit of a hack - // We piggyback off of the progress event as a chance to cancel. - // Otherwise wiring the xhr abort up while allowing retries - // gets pretty nasty. - // 'this' here is the object returned by download(id, keychain) - return this.cancel(); +export function downloadStream(id, dlToken) { + const controller = new AbortController(); + function cancel() { + controller.abort(); + } + return { + cancel, + result: tryDownloadStream(id, dlToken, controller.signal) + }; +} + +////////////////// + +async function download(id, dlToken, onprogress, canceller) { + const xhr = new XMLHttpRequest(); + canceller.oncancel = function() { + xhr.abort(); + }; + return new Promise(function(resolve, reject) { + xhr.addEventListener('loadend', function() { + canceller.oncancel = function() {}; + if (xhr.status !== 200) { + return reject(new Error(xhr.status)); + } + + const blob = new Blob([xhr.response]); + resolve(blob); + }); + + xhr.addEventListener('progress', function(event) { + if (event.target.status === 200) { + onprogress(event.loaded); + } + }); + xhr.open('get', getApiUrl(`/api/download/blob/${id}`)); + xhr.setRequestHeader('Authorization', `Bearer ${dlToken}`); + xhr.responseType = 'blob'; + xhr.send(); + onprogress(0); + }); +} + +async function tryDownload(id, dlToken, onprogress, canceller, tries = 2) { + try { + const result = await download(id, dlToken, onprogress, canceller); + return result; + } catch (e) { + if (e.message === '401' && --tries > 0) { + return tryDownload(id, dlToken, onprogress, canceller, tries); } - dl.onprogress(p); + throw e; } - const dl = { - onprogress: function() {}, - cancel: function() { - cancelled = true; - }, - result: tryDownload(id, keychain, updateProgress, 2) +} + +export function downloadFile(id, dlToken, onprogress) { + const canceller = { + oncancel: function() {} // download() sets this + }; + function cancel() { + canceller.oncancel(); + } + return { + cancel, + result: tryDownload(id, dlToken, onprogress, canceller) }; - return dl; +} + +export async function getFileList(bearerToken, kid) { + const headers = new Headers({ Authorization: `Bearer ${bearerToken}` }); + const response = await fetch(getApiUrl(`/api/filelist/${kid}`), { headers }); + if (response.ok) { + const encrypted = await response.blob(); + return encrypted; + } + throw new Error(response.status); +} + +export async function setFileList(bearerToken, kid, data) { + const headers = new Headers({ Authorization: `Bearer ${bearerToken}` }); + const response = await fetch(getApiUrl(`/api/filelist/${kid}`), { + headers, + method: 'POST', + body: data + }); + return response.ok; +} + +export function sendMetrics(blob) { + if (!navigator.sendBeacon) { + return; + } + try { + navigator.sendBeacon(getApiUrl('/api/metrics'), blob); + } catch (e) { + console.error(e); + } +} + +export async function getConstants() { + const response = await fetch(getApiUrl('/config')); + + if (response.ok) { + const obj = await response.json(); + return obj; + } + + throw new Error(response.status); +} + +export async function reportLink(id, keychain, reason) { + const result = await fetchWithAuthAndRetry( + getApiUrl(`/api/report/${id}`), + { + method: 'POST', + body: JSON.stringify({ reason }) + }, + keychain + ); + + if (result.ok) { + return; + } + + throw new Error(result.response.status); +} + +export async function getDownloadToken(id, keychain) { + const result = await fetchWithAuthAndRetry( + getApiUrl(`/api/download/token/${id}`), + { + method: 'GET' + }, + keychain + ); + + if (result.ok) { + return (await result.response.json()).token; + } + throw new Error(result.response.status); +} + +export async function downloadDone(id, dlToken) { + const headers = new Headers({ Authorization: `Bearer ${dlToken}` }); + const response = await fetch(getApiUrl(`/api/download/done/${id}`), { + headers, + method: 'POST' + }); + return response.ok; } diff --git a/app/archive.js b/app/archive.js new file mode 100644 index 000000000..45517754d --- /dev/null +++ b/app/archive.js @@ -0,0 +1,83 @@ +import { blobStream, concatStream } from './streams'; + +function isDupe(newFile, array) { + for (const file of array) { + if ( + newFile.name === file.name && + newFile.size === file.size && + newFile.lastModified === file.lastModified + ) { + return true; + } + } + return false; +} + +export default class Archive { + constructor(files = [], defaultTimeLimit = 86400) { + this.files = Array.from(files); + this.defaultTimeLimit = defaultTimeLimit; + this.timeLimit = defaultTimeLimit; + this.dlimit = 1; + this.password = null; + } + + get name() { + return this.files.length > 1 ? 'Send-Archive.zip' : this.files[0].name; + } + + get type() { + return this.files.length > 1 ? 'send-archive' : this.files[0].type; + } + + get size() { + return this.files.reduce((total, file) => total + file.size, 0); + } + + get numFiles() { + return this.files.length; + } + + get manifest() { + return { + files: this.files.map(file => ({ + name: file.name, + size: file.size, + type: file.type + })) + }; + } + + get stream() { + return concatStream(this.files.map(file => blobStream(file))); + } + + addFiles(files, maxSize, maxFiles) { + if (this.files.length + files.length > maxFiles) { + throw new Error('tooManyFiles'); + } + const newFiles = files.filter( + file => file.size > 0 && !isDupe(file, this.files) + ); + const newSize = newFiles.reduce((total, file) => total + file.size, 0); + if (this.size + newSize > maxSize) { + throw new Error('fileTooBig'); + } + this.files = this.files.concat(newFiles); + return true; + } + + remove(file) { + const index = this.files.indexOf(file); + if (index > -1) { + this.files.splice(index, 1); + } + } + + clear() { + this.files = []; + this.dlimit = 1; + this.timeLimit = this.defaultTimeLimit; + this.password = null; + } +} diff --git a/app/capabilities.js b/app/capabilities.js new file mode 100644 index 000000000..d43a6b108 --- /dev/null +++ b/app/capabilities.js @@ -0,0 +1,116 @@ +/* global AUTH_CONFIG */ +import { browserName, locale } from './utils'; + +async function checkCrypto() { + try { + const key = await crypto.subtle.generateKey( + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + await crypto.subtle.exportKey('raw', key); + await crypto.subtle.encrypt( + { + name: 'AES-GCM', + iv: crypto.getRandomValues(new Uint8Array(12)), + tagLength: 128 + }, + key, + new ArrayBuffer(8) + ); + await crypto.subtle.importKey( + 'raw', + crypto.getRandomValues(new Uint8Array(16)), + 'PBKDF2', + false, + ['deriveKey'] + ); + await crypto.subtle.importKey( + 'raw', + crypto.getRandomValues(new Uint8Array(16)), + 'HKDF', + false, + ['deriveKey'] + ); + await crypto.subtle.generateKey( + { + name: 'ECDH', + namedCurve: 'P-256' + }, + true, + ['deriveBits'] + ); + return true; + } catch (err) { + try { + window.asmCrypto = await import('asmcrypto.js'); + await import('@dannycoates/webcrypto-liner/build/shim'); + return true; + } catch (e) { + return false; + } + } +} + +function checkStreams() { + try { + new ReadableStream({ + pull() {} + }); + return true; + } catch (e) { + return false; + } +} + +async function polyfillStreams() { + try { + await import('@mattiasbuelens/web-streams-polyfill'); + return true; + } catch (e) { + return false; + } +} + +export default async function getCapabilities() { + const browser = browserName(); + const isMobile = /mobi|android/i.test(navigator.userAgent); + const serviceWorker = 'serviceWorker' in navigator && browser !== 'edge'; + let crypto = await checkCrypto(); + const nativeStreams = checkStreams(); + let polyStreams = false; + if (!nativeStreams) { + polyStreams = await polyfillStreams(); + } + let account = typeof AUTH_CONFIG !== 'undefined'; + try { + account = account && !!localStorage; + } catch (e) { + account = false; + } + const share = + isMobile && + typeof navigator.share === 'function' && + locale().startsWith('en'); // en until strings merge + + const standalone = + window.matchMedia('(display-mode: standalone)').matches || + navigator.standalone; + + const mobileFirefox = browser === 'firefox' && isMobile; + + return { + account, + crypto, + serviceWorker, + streamUpload: nativeStreams || polyStreams, + streamDownload: + nativeStreams && serviceWorker && browser !== 'safari' && !mobileFirefox, + multifile: nativeStreams || polyStreams, + share, + standalone + }; +} diff --git a/app/controller.js b/app/controller.js new file mode 100644 index 000000000..6b7240db5 --- /dev/null +++ b/app/controller.js @@ -0,0 +1,337 @@ +import FileSender from './fileSender'; +import FileReceiver from './fileReceiver'; +import { copyToClipboard, delay, openLinksInNewTab, percent } from './utils'; +import * as metrics from './metrics'; +import { bytes, locale } from './utils'; +import okDialog from './ui/okDialog'; +import copyDialog from './ui/copyDialog'; +import shareDialog from './ui/shareDialog'; + +export default function(state, emitter) { + let lastRender = 0; + let updateTitle = false; + + function render() { + emitter.emit('render'); + } + + async function checkFiles() { + const changes = await state.user.syncFileList(); + const rerender = changes.incoming || changes.downloadCount; + if (rerender) { + render(); + } + } + + function updateProgress() { + if (updateTitle) { + emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio)); + } + render(); + } + + emitter.on('DOMContentLoaded', () => { + document.addEventListener('blur', () => (updateTitle = true)); + document.addEventListener('focus', () => { + updateTitle = false; + emitter.emit('DOMTitleChange', 'Send'); + }); + checkFiles(); + }); + + emitter.on('render', () => { + lastRender = Date.now(); + }); + + emitter.on('login', email => { + state.user.login(email); + }); + + emitter.on('logout', async () => { + await state.user.logout(); + metrics.loggedOut({ trigger: 'button' }); + emitter.emit('pushState', '/'); + }); + + emitter.on('removeUpload', file => { + state.archive.remove(file); + if (state.archive.numFiles === 0) { + state.archive.clear(); + } + render(); + }); + + emitter.on('delete', async ownedFile => { + try { + metrics.deletedUpload({ + size: ownedFile.size, + time: ownedFile.time, + speed: ownedFile.speed, + type: ownedFile.type, + ttl: ownedFile.expiresAt - Date.now(), + location + }); + state.storage.remove(ownedFile.id); + await ownedFile.del(); + } catch (e) { + state.sentry.captureException(e); + } + render(); + }); + + emitter.on('cancel', () => { + state.transfer.cancel(); + }); + + emitter.on('addFiles', async ({ files }) => { + if (files.length < 1) { + return; + } + const maxSize = state.user.maxSize; + try { + state.archive.addFiles( + files, + maxSize, + state.LIMITS.MAX_FILES_PER_ARCHIVE + ); + } catch (e) { + if (e.message === 'fileTooBig' && maxSize < state.LIMITS.MAX_FILE_SIZE) { + return emitter.emit('signup-cta', 'size'); + } + state.modal = okDialog( + state.translate(e.message, { + size: bytes(maxSize), + count: state.LIMITS.MAX_FILES_PER_ARCHIVE + }) + ); + } + render(); + }); + + emitter.on('authenticate', async (code, oauthState) => { + try { + await state.user.finishLogin(code, oauthState); + await state.user.syncFileList(); + emitter.emit('replaceState', '/'); + } catch (e) { + emitter.emit('replaceState', '/error'); + setTimeout(render); + } + }); + + emitter.on('upload', async () => { + if (state.storage.files.length >= state.LIMITS.MAX_ARCHIVES_PER_USER) { + state.modal = okDialog( + state.translate('tooManyArchives', { + count: state.LIMITS.MAX_ARCHIVES_PER_USER + }) + ); + return render(); + } + const archive = state.archive; + const sender = new FileSender(); + + sender.on('progress', updateProgress); + sender.on('encrypting', render); + sender.on('complete', render); + state.transfer = sender; + state.uploading = true; + render(); + + const links = openLinksInNewTab(); + await delay(200); + const start = Date.now(); + try { + const ownedFile = await sender.upload(archive, state.user.bearerToken); + state.storage.totalUploads += 1; + const duration = Date.now() - start; + metrics.completedUpload(archive, duration); + + state.storage.addFile(ownedFile); + // TODO integrate password into /upload request + if (archive.password) { + emitter.emit('password', { + password: archive.password, + file: ownedFile + }); + } + state.modal = state.capabilities.share + ? shareDialog(ownedFile.name, ownedFile.url) + : copyDialog(ownedFile.name, ownedFile.url); + } catch (err) { + if (err.message === '0') { + //cancelled. do nothing + metrics.cancelledUpload(archive, err.duration); + render(); + } else if (err.message === '401') { + const refreshed = await state.user.refresh(); + if (refreshed) { + return emitter.emit('upload'); + } + emitter.emit('pushState', '/error'); + } else { + // eslint-disable-next-line no-console + console.error(err); + state.sentry.withScope(scope => { + scope.setExtra('duration', err.duration); + scope.setExtra('size', err.size); + state.sentry.captureException(err); + }); + metrics.stoppedUpload(archive, err.duration); + emitter.emit('pushState', '/error'); + } + } finally { + openLinksInNewTab(links, false); + archive.clear(); + state.uploading = false; + state.transfer = null; + await state.user.syncFileList(); + render(); + } + }); + + emitter.on('password', async ({ password, file }) => { + try { + state.settingPassword = true; + render(); + await file.setPassword(password); + state.storage.writeFile(file); + await delay(1000); + } catch (err) { + // eslint-disable-next-line no-console + console.error(err); + state.passwordSetError = err; + } finally { + state.settingPassword = false; + } + render(); + }); + + emitter.on('getMetadata', async () => { + const file = state.fileInfo; + + const receiver = new FileReceiver(file); + try { + await receiver.getMetadata(); + state.transfer = receiver; + } catch (e) { + if (e.message === '401' || e.message === '404') { + file.password = null; + file.dead = e.message === '404'; + } else { + console.error(e); + return emitter.emit('pushState', '/error'); + } + } + + render(); + }); + + emitter.on('download', async file => { + state.transfer.on('progress', updateProgress); + state.transfer.on('decrypting', render); + state.transfer.on('complete', render); + const links = openLinksInNewTab(); + const size = file.size; + const start = Date.now(); + try { + const dl = state.transfer.download({ + stream: state.capabilities.streamDownload, + storage: state.storage + }); + render(); + await dl; + state.storage.totalDownloads += 1; + const duration = Date.now() - start; + metrics.completedDownload({ + size, + duration, + password_protected: file.requiresPassword + }); + } catch (err) { + if (err.message === '0') { + // download cancelled + state.transfer.reset(); + render(); + } else { + // eslint-disable-next-line no-console + state.transfer = null; + const location = ['404', '403'].includes(err.message) + ? '/404' + : '/error'; + if (location === '/error') { + state.sentry.withScope(scope => { + scope.setExtra('duration', err.duration); + scope.setExtra('size', err.size); + scope.setExtra('progress', err.progress); + state.sentry.captureException(err); + }); + const duration = Date.now() - start; + metrics.stoppedDownload({ + size, + duration, + password_protected: file.requiresPassword + }); + } + emitter.emit('pushState', location); + } + } finally { + openLinksInNewTab(links, false); + } + }); + + emitter.on('copy', ({ url }) => { + copyToClipboard(url); + // metrics.copiedLink({ location }); + }); + + emitter.on('closeModal', () => { + if ( + state.PREFS.surveyUrl && + ['copy', 'share'].includes(state.modal.type) && + locale().startsWith('en') && + (state.storage.totalUploads > 1 || state.storage.totalDownloads > 0) && + !state.user.surveyed + ) { + state.user.surveyed = true; + // state.modal = surveyDialog(); + } else { + state.modal = null; + } + render(); + }); + + emitter.on('report', async ({ reason }) => { + try { + const receiver = state.transfer || new FileReceiver(state.fileInfo); + await receiver.reportLink(reason); + render(); + } catch (err) { + console.error(err); + if (err.message === '404') { + state.fileInfo = { reported: true }; + return render(); + } + emitter.emit('pushState', '/error'); + } + }); + + setInterval(() => { + // poll for updates of the upload list + if (!state.modal && state.route === '/') { + checkFiles(); + } + }, 2 * 60 * 1000); + + setInterval(() => { + // poll for rerendering the file list countdown timers + if ( + !state.modal && + state.route === '/' && + state.storage.files.length > 0 && + Date.now() - lastRender > 30000 + ) { + render(); + } + }, 60000); +} diff --git a/app/crc32.js b/app/crc32.js new file mode 100644 index 000000000..ec6d67e67 --- /dev/null +++ b/app/crc32.js @@ -0,0 +1,266 @@ +const LOOKUP = Int32Array.from([ + 0x00000000, + 0x77073096, + 0xee0e612c, + 0x990951ba, + 0x076dc419, + 0x706af48f, + 0xe963a535, + 0x9e6495a3, + 0x0edb8832, + 0x79dcb8a4, + 0xe0d5e91e, + 0x97d2d988, + 0x09b64c2b, + 0x7eb17cbd, + 0xe7b82d07, + 0x90bf1d91, + 0x1db71064, + 0x6ab020f2, + 0xf3b97148, + 0x84be41de, + 0x1adad47d, + 0x6ddde4eb, + 0xf4d4b551, + 0x83d385c7, + 0x136c9856, + 0x646ba8c0, + 0xfd62f97a, + 0x8a65c9ec, + 0x14015c4f, + 0x63066cd9, + 0xfa0f3d63, + 0x8d080df5, + 0x3b6e20c8, + 0x4c69105e, + 0xd56041e4, + 0xa2677172, + 0x3c03e4d1, + 0x4b04d447, + 0xd20d85fd, + 0xa50ab56b, + 0x35b5a8fa, + 0x42b2986c, + 0xdbbbc9d6, + 0xacbcf940, + 0x32d86ce3, + 0x45df5c75, + 0xdcd60dcf, + 0xabd13d59, + 0x26d930ac, + 0x51de003a, + 0xc8d75180, + 0xbfd06116, + 0x21b4f4b5, + 0x56b3c423, + 0xcfba9599, + 0xb8bda50f, + 0x2802b89e, + 0x5f058808, + 0xc60cd9b2, + 0xb10be924, + 0x2f6f7c87, + 0x58684c11, + 0xc1611dab, + 0xb6662d3d, + 0x76dc4190, + 0x01db7106, + 0x98d220bc, + 0xefd5102a, + 0x71b18589, + 0x06b6b51f, + 0x9fbfe4a5, + 0xe8b8d433, + 0x7807c9a2, + 0x0f00f934, + 0x9609a88e, + 0xe10e9818, + 0x7f6a0dbb, + 0x086d3d2d, + 0x91646c97, + 0xe6635c01, + 0x6b6b51f4, + 0x1c6c6162, + 0x856530d8, + 0xf262004e, + 0x6c0695ed, + 0x1b01a57b, + 0x8208f4c1, + 0xf50fc457, + 0x65b0d9c6, + 0x12b7e950, + 0x8bbeb8ea, + 0xfcb9887c, + 0x62dd1ddf, + 0x15da2d49, + 0x8cd37cf3, + 0xfbd44c65, + 0x4db26158, + 0x3ab551ce, + 0xa3bc0074, + 0xd4bb30e2, + 0x4adfa541, + 0x3dd895d7, + 0xa4d1c46d, + 0xd3d6f4fb, + 0x4369e96a, + 0x346ed9fc, + 0xad678846, + 0xda60b8d0, + 0x44042d73, + 0x33031de5, + 0xaa0a4c5f, + 0xdd0d7cc9, + 0x5005713c, + 0x270241aa, + 0xbe0b1010, + 0xc90c2086, + 0x5768b525, + 0x206f85b3, + 0xb966d409, + 0xce61e49f, + 0x5edef90e, + 0x29d9c998, + 0xb0d09822, + 0xc7d7a8b4, + 0x59b33d17, + 0x2eb40d81, + 0xb7bd5c3b, + 0xc0ba6cad, + 0xedb88320, + 0x9abfb3b6, + 0x03b6e20c, + 0x74b1d29a, + 0xead54739, + 0x9dd277af, + 0x04db2615, + 0x73dc1683, + 0xe3630b12, + 0x94643b84, + 0x0d6d6a3e, + 0x7a6a5aa8, + 0xe40ecf0b, + 0x9309ff9d, + 0x0a00ae27, + 0x7d079eb1, + 0xf00f9344, + 0x8708a3d2, + 0x1e01f268, + 0x6906c2fe, + 0xf762575d, + 0x806567cb, + 0x196c3671, + 0x6e6b06e7, + 0xfed41b76, + 0x89d32be0, + 0x10da7a5a, + 0x67dd4acc, + 0xf9b9df6f, + 0x8ebeeff9, + 0x17b7be43, + 0x60b08ed5, + 0xd6d6a3e8, + 0xa1d1937e, + 0x38d8c2c4, + 0x4fdff252, + 0xd1bb67f1, + 0xa6bc5767, + 0x3fb506dd, + 0x48b2364b, + 0xd80d2bda, + 0xaf0a1b4c, + 0x36034af6, + 0x41047a60, + 0xdf60efc3, + 0xa867df55, + 0x316e8eef, + 0x4669be79, + 0xcb61b38c, + 0xbc66831a, + 0x256fd2a0, + 0x5268e236, + 0xcc0c7795, + 0xbb0b4703, + 0x220216b9, + 0x5505262f, + 0xc5ba3bbe, + 0xb2bd0b28, + 0x2bb45a92, + 0x5cb36a04, + 0xc2d7ffa7, + 0xb5d0cf31, + 0x2cd99e8b, + 0x5bdeae1d, + 0x9b64c2b0, + 0xec63f226, + 0x756aa39c, + 0x026d930a, + 0x9c0906a9, + 0xeb0e363f, + 0x72076785, + 0x05005713, + 0x95bf4a82, + 0xe2b87a14, + 0x7bb12bae, + 0x0cb61b38, + 0x92d28e9b, + 0xe5d5be0d, + 0x7cdcefb7, + 0x0bdbdf21, + 0x86d3d2d4, + 0xf1d4e242, + 0x68ddb3f8, + 0x1fda836e, + 0x81be16cd, + 0xf6b9265b, + 0x6fb077e1, + 0x18b74777, + 0x88085ae6, + 0xff0f6a70, + 0x66063bca, + 0x11010b5c, + 0x8f659eff, + 0xf862ae69, + 0x616bffd3, + 0x166ccf45, + 0xa00ae278, + 0xd70dd2ee, + 0x4e048354, + 0x3903b3c2, + 0xa7672661, + 0xd06016f7, + 0x4969474d, + 0x3e6e77db, + 0xaed16a4a, + 0xd9d65adc, + 0x40df0b66, + 0x37d83bf0, + 0xa9bcae53, + 0xdebb9ec5, + 0x47b2cf7f, + 0x30b5ffe9, + 0xbdbdf21c, + 0xcabac28a, + 0x53b39330, + 0x24b4a3a6, + 0xbad03605, + 0xcdd70693, + 0x54de5729, + 0x23d967bf, + 0xb3667a2e, + 0xc4614ab8, + 0x5d681b02, + 0x2a6f2b94, + 0xb40bbe37, + 0xc30c8ea1, + 0x5a05df1b, + 0x2d02ef8d +]); + +module.exports = function crc32(uint8Array, previous) { + let crc = previous === 0 ? 0 : ~~previous ^ -1; + for (let i = 0; i < uint8Array.byteLength; i++) { + crc = LOOKUP[(crc ^ uint8Array[i]) & 0xff] ^ (crc >>> 8); + } + return (crc ^ -1) >>> 0; +}; diff --git a/app/dragManager.js b/app/dragManager.js index c8a02fcfd..1379c0046 100644 --- a/app/dragManager.js +++ b/app/dragManager.js @@ -1,6 +1,3 @@ -/* global MAXFILESIZE */ -const { bytes } = require('./utils'); - export default function(state, emitter) { emitter.on('DOMContentLoaded', () => { document.body.addEventListener('dragover', event => { @@ -9,27 +6,16 @@ export default function(state, emitter) { } }); document.body.addEventListener('drop', event => { - if (state.route === '/' && !state.uploading) { + if ( + state.route === '/' && + !state.uploading && + event.dataTransfer && + event.dataTransfer.files + ) { event.preventDefault(); - document.querySelector('.upload-window').classList.remove('ondrag'); - const target = event.dataTransfer; - if (target.files.length === 0) { - return; - } - if (target.files.length > 1) { - return alert(state.translate('uploadPageMultipleFilesAlert')); - } - const file = target.files[0]; - if (file.size === 0) { - return; - } - if (file.size > MAXFILESIZE) { - window.alert( - state.translate('fileTooBig', { size: bytes(MAXFILESIZE) }) - ); - return; - } - emitter.emit('upload', { file, type: 'drop' }); + emitter.emit('addFiles', { + files: Array.from(event.dataTransfer.files) + }); } }); }); diff --git a/app/ece.js b/app/ece.js new file mode 100644 index 000000000..7fff87b4c --- /dev/null +++ b/app/ece.js @@ -0,0 +1,306 @@ +import { transformStream } from './streams'; +import { concat } from './utils'; + +const NONCE_LENGTH = 12; +const TAG_LENGTH = 16; +const KEY_LENGTH = 16; +const MODE_ENCRYPT = 'encrypt'; +const MODE_DECRYPT = 'decrypt'; +export const ECE_RECORD_SIZE = 1024 * 64; + +const encoder = new TextEncoder(); + +function generateSalt(len) { + const randSalt = new Uint8Array(len); + crypto.getRandomValues(randSalt); + return randSalt.buffer; +} + +class ECETransformer { + constructor(mode, ikm, rs, salt) { + this.mode = mode; + this.prevChunk; + this.seq = 0; + this.firstchunk = true; + this.rs = rs; + this.ikm = ikm.buffer; + this.salt = salt; + } + + async generateKey() { + const inputKey = await crypto.subtle.importKey( + 'raw', + this.ikm, + 'HKDF', + false, + ['deriveKey'] + ); + + return crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: this.salt, + info: encoder.encode('Content-Encoding: aes128gcm\0'), + hash: 'SHA-256' + }, + inputKey, + { + name: 'AES-GCM', + length: 128 + }, + true, // Edge polyfill requires key to be extractable to encrypt :/ + ['encrypt', 'decrypt'] + ); + } + + async generateNonceBase() { + const inputKey = await crypto.subtle.importKey( + 'raw', + this.ikm, + 'HKDF', + false, + ['deriveKey'] + ); + + const base = await crypto.subtle.exportKey( + 'raw', + await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: this.salt, + info: encoder.encode('Content-Encoding: nonce\0'), + hash: 'SHA-256' + }, + inputKey, + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ) + ); + + return base.slice(0, NONCE_LENGTH); + } + + generateNonce(seq) { + if (seq > 0xffffffff) { + throw new Error('record sequence number exceeds limit'); + } + const nonce = new DataView(this.nonceBase.slice()); + const m = nonce.getUint32(nonce.byteLength - 4); + const xor = (m ^ seq) >>> 0; //forces unsigned int xor + nonce.setUint32(nonce.byteLength - 4, xor); + return new Uint8Array(nonce.buffer); + } + + pad(data, isLast) { + const len = data.length; + if (len + TAG_LENGTH >= this.rs) { + throw new Error('data too large for record size'); + } + + if (isLast) { + return concat(data, Uint8Array.of(2)); + } else { + const padding = new Uint8Array(this.rs - len - TAG_LENGTH); + padding[0] = 1; + return concat(data, padding); + } + } + + unpad(data, isLast) { + for (let i = data.length - 1; i >= 0; i--) { + if (data[i]) { + if (isLast) { + if (data[i] !== 2) { + throw new Error('delimiter of final record is not 2'); + } + } else { + if (data[i] !== 1) { + throw new Error('delimiter of not final record is not 1'); + } + } + return data.slice(0, i); + } + } + throw new Error('no delimiter found'); + } + + createHeader() { + const nums = new DataView(new ArrayBuffer(5)); + nums.setUint32(0, this.rs); + return concat(new Uint8Array(this.salt), new Uint8Array(nums.buffer)); + } + + readHeader(buffer) { + if (buffer.length < 21) { + throw new Error('chunk too small for reading header'); + } + const header = {}; + const dv = new DataView(buffer.buffer); + header.salt = buffer.slice(0, KEY_LENGTH); + header.rs = dv.getUint32(KEY_LENGTH); + const idlen = dv.getUint8(KEY_LENGTH + 4); + header.length = idlen + KEY_LENGTH + 5; + return header; + } + + async encryptRecord(buffer, seq, isLast) { + const nonce = this.generateNonce(seq); + const encrypted = await crypto.subtle.encrypt( + { name: 'AES-GCM', iv: nonce }, + this.key, + this.pad(buffer, isLast) + ); + return new Uint8Array(encrypted); + } + + async decryptRecord(buffer, seq, isLast) { + const nonce = this.generateNonce(seq); + const data = await crypto.subtle.decrypt( + { + name: 'AES-GCM', + iv: nonce, + tagLength: 128 + }, + this.key, + buffer + ); + + return this.unpad(new Uint8Array(data), isLast); + } + + async start(controller) { + if (this.mode === MODE_ENCRYPT) { + this.key = await this.generateKey(); + this.nonceBase = await this.generateNonceBase(); + controller.enqueue(this.createHeader()); + } else if (this.mode !== MODE_DECRYPT) { + throw new Error('mode must be either encrypt or decrypt'); + } + } + + async transformPrevChunk(isLast, controller) { + if (this.mode === MODE_ENCRYPT) { + controller.enqueue( + await this.encryptRecord(this.prevChunk, this.seq, isLast) + ); + this.seq++; + } else { + if (this.seq === 0) { + //the first chunk during decryption contains only the header + const header = this.readHeader(this.prevChunk); + this.salt = header.salt; + this.rs = header.rs; + this.key = await this.generateKey(); + this.nonceBase = await this.generateNonceBase(); + } else { + controller.enqueue( + await this.decryptRecord(this.prevChunk, this.seq - 1, isLast) + ); + } + this.seq++; + } + } + + async transform(chunk, controller) { + if (!this.firstchunk) { + await this.transformPrevChunk(false, controller); + } + this.firstchunk = false; + this.prevChunk = new Uint8Array(chunk.buffer); + } + + async flush(controller) { + //console.log('ece stream ends') + if (this.prevChunk) { + await this.transformPrevChunk(true, controller); + } + } +} + +class StreamSlicer { + constructor(rs, mode) { + this.mode = mode; + this.rs = rs; + this.chunkSize = mode === MODE_ENCRYPT ? rs - 17 : 21; + this.partialChunk = new Uint8Array(this.chunkSize); //where partial chunks are saved + this.offset = 0; + } + + send(buf, controller) { + controller.enqueue(buf); + if (this.chunkSize === 21 && this.mode === MODE_DECRYPT) { + this.chunkSize = this.rs; + } + this.partialChunk = new Uint8Array(this.chunkSize); + this.offset = 0; + } + + //reslice input into record sized chunks + transform(chunk, controller) { + //console.log('Received chunk with %d bytes.', chunk.byteLength) + let i = 0; + + if (this.offset > 0) { + const len = Math.min(chunk.byteLength, this.chunkSize - this.offset); + this.partialChunk.set(chunk.slice(0, len), this.offset); + this.offset += len; + i += len; + + if (this.offset === this.chunkSize) { + this.send(this.partialChunk, controller); + } + } + + while (i < chunk.byteLength) { + const remainingBytes = chunk.byteLength - i; + if (remainingBytes >= this.chunkSize) { + const record = chunk.slice(i, i + this.chunkSize); + i += this.chunkSize; + this.send(record, controller); + } else { + const end = chunk.slice(i, i + remainingBytes); + i += end.byteLength; + this.partialChunk.set(end); + this.offset = end.byteLength; + } + } + } + + flush(controller) { + if (this.offset > 0) { + controller.enqueue(this.partialChunk.slice(0, this.offset)); + } + } +} + +/* +input: a ReadableStream containing data to be transformed +key: Uint8Array containing key of size KEY_LENGTH +rs: int containing record size, optional +salt: ArrayBuffer containing salt of KEY_LENGTH length, optional +*/ +export function encryptStream( + input, + key, + rs = ECE_RECORD_SIZE, + salt = generateSalt(KEY_LENGTH) +) { + const mode = 'encrypt'; + const inputStream = transformStream(input, new StreamSlicer(rs, mode)); + return transformStream(inputStream, new ECETransformer(mode, key, rs, salt)); +} + +/* +input: a ReadableStream containing data to be transformed +key: Uint8Array containing key of size KEY_LENGTH +rs: int containing record size, optional +*/ +export function decryptStream(input, key, rs = ECE_RECORD_SIZE) { + const mode = 'decrypt'; + const inputStream = transformStream(input, new StreamSlicer(rs, mode)); + return transformStream(inputStream, new ECETransformer(mode, key, rs)); +} diff --git a/app/experiments.js b/app/experiments.js index 0b27b3581..8b7a19ee8 100644 --- a/app/experiments.js +++ b/app/experiments.js @@ -1,38 +1,19 @@ import hash from 'string-hash'; +import Account from './ui/account'; const experiments = { - S9wqVl2SQ4ab2yZtqDI3Dw: { - id: 'S9wqVl2SQ4ab2yZtqDI3Dw', - run: function(variant, state, emitter) { - switch (variant) { - case 1: - state.promo = 'blue'; - break; - case 2: - state.promo = 'pink'; - break; - default: - state.promo = 'grey'; - } - emitter.emit('render'); - }, + signin_button_color: { eligible: function() { - return ( - !/firefox/i.test(navigator.userAgent) && - document.querySelector('html').lang === 'en-US' - ); + return true; }, - variant: function(state) { - const n = this.luckyNumber(state); - if (n < 0.33) { - return 0; - } - return n < 0.66 ? 1 : 2; + variant: function() { + return ['white-blue', 'blue', 'white-violet', 'violet'][ + Math.floor(Math.random() * 4) + ]; }, - luckyNumber: function(state) { - return luckyNumber( - `${this.id}:${state.storage.get('testpilot_ga__cid')}` - ); + run: function(variant, state) { + const account = state.cache(Account, 'account'); + account.buttonClass = variant; } } }; @@ -60,23 +41,12 @@ export default function initialize(state, emitter) { xp.run(+state.query.v, state, emitter); } }); - - if (!state.storage.get('testpilot_ga__cid')) { - // first ever visit. check again after cid is assigned. - emitter.on('DOMContentLoaded', () => { - checkExperiments(state, emitter); - }); + const enrolled = state.storage.enrolled; + // single experiment per session for now + const id = Object.keys(enrolled)[0]; + if (Object.keys(experiments).includes(id)) { + experiments[id].run(enrolled[id], state, emitter); } else { - const enrolled = state.storage.enrolled.filter(([id, variant]) => { - const xp = experiments[id]; - if (xp) { - xp.run(variant, state, emitter); - } - return !!xp; - }); - // single experiment per session for now - if (enrolled.length === 0) { - checkExperiments(state, emitter); - } + checkExperiments(state, emitter); } } diff --git a/app/fileManager.js b/app/fileManager.js deleted file mode 100644 index 26da0fc6b..000000000 --- a/app/fileManager.js +++ /dev/null @@ -1,221 +0,0 @@ -import FileSender from './fileSender'; -import FileReceiver from './fileReceiver'; -import { - copyToClipboard, - delay, - fadeOut, - openLinksInNewTab, - percent, - saveFile -} from './utils'; -import * as metrics from './metrics'; - -export default function(state, emitter) { - let lastRender = 0; - let updateTitle = false; - - function render() { - emitter.emit('render'); - } - - async function checkFiles() { - const files = state.storage.files; - let rerender = false; - for (const file of files) { - const oldLimit = file.dlimit; - const oldTotal = file.dtotal; - await file.updateDownloadCount(); - if (file.dtotal === file.dlimit) { - state.storage.remove(file.id); - rerender = true; - } else if (oldLimit !== file.dlimit || oldTotal !== file.dtotal) { - rerender = true; - } - } - if (rerender) { - render(); - } - } - - function updateProgress() { - if (updateTitle) { - emitter.emit('DOMTitleChange', percent(state.transfer.progressRatio)); - } - render(); - } - - emitter.on('DOMContentLoaded', () => { - document.addEventListener('blur', () => (updateTitle = true)); - document.addEventListener('focus', () => { - updateTitle = false; - emitter.emit('DOMTitleChange', 'Firefox Send'); - }); - checkFiles(); - }); - - emitter.on('navigate', checkFiles); - - emitter.on('render', () => { - lastRender = Date.now(); - }); - - emitter.on('changeLimit', async ({ file, value }) => { - await file.changeLimit(value); - state.storage.writeFile(file); - metrics.changedDownloadLimit(file); - }); - - emitter.on('delete', async ({ file, location }) => { - try { - metrics.deletedUpload({ - size: file.size, - time: file.time, - speed: file.speed, - type: file.type, - ttl: file.expiresAt - Date.now(), - location - }); - state.storage.remove(file.id); - await file.del(); - } catch (e) { - state.raven.captureException(e); - } - }); - - emitter.on('cancel', () => { - state.transfer.cancel(); - }); - - emitter.on('upload', async ({ file, type }) => { - const size = file.size; - const sender = new FileSender(file); - sender.on('progress', updateProgress); - sender.on('encrypting', render); - state.transfer = sender; - state.uploading = true; - render(); - - const links = openLinksInNewTab(); - await delay(200); - try { - metrics.startedUpload({ size, type }); - const ownedFile = await sender.upload(); - ownedFile.type = type; - state.storage.totalUploads += 1; - metrics.completedUpload(ownedFile); - - state.storage.addFile(ownedFile); - - document.getElementById('cancel-upload').hidden = 'hidden'; - await delay(1000); - await fadeOut('upload-progress'); - openLinksInNewTab(links, false); - emitter.emit('pushState', `/share/${ownedFile.id}`); - } catch (err) { - console.error(err); - - if (err.message === '0') { - //cancelled. do nothing - metrics.cancelledUpload({ size, type }); - return render(); - } - state.raven.captureException(err); - metrics.stoppedUpload({ size, type, err }); - emitter.emit('pushState', '/error'); - } finally { - state.uploading = false; - state.transfer = null; - } - }); - - emitter.on('password', async ({ password, file }) => { - try { - await file.setPassword(password); - state.storage.writeFile(file); - metrics.addedPassword({ size: file.size }); - } catch (err) { - console.error(err); - } - render(); - }); - - emitter.on('getMetadata', async () => { - const file = state.fileInfo; - const receiver = new FileReceiver(file); - try { - await receiver.getMetadata(); - receiver.on('progress', updateProgress); - receiver.on('decrypting', render); - state.transfer = receiver; - } catch (e) { - if (e.message === '401') { - file.password = null; - if (!file.requiresPassword) { - return emitter.emit('pushState', '/404'); - } - } - } - render(); - }); - - emitter.on('download', async file => { - state.transfer.on('progress', render); - state.transfer.on('decrypting', render); - const links = openLinksInNewTab(); - const size = file.size; - try { - const start = Date.now(); - metrics.startedDownload({ size: file.size, ttl: file.ttl }); - const f = await state.transfer.download(); - const time = Date.now() - start; - const speed = size / (time / 1000); - await delay(1000); - await fadeOut('download-progress'); - saveFile(f); - state.storage.totalDownloads += 1; - state.transfer.reset(); - metrics.completedDownload({ size, time, speed }); - emitter.emit('pushState', '/completed'); - } catch (err) { - if (err.message === '0') { - // download cancelled - state.transfer.reset(); - return render(); - } - console.error(err); - state.transfer = null; - const location = err.message === 'notfound' ? '/404' : '/error'; - if (location === '/error') { - state.raven.captureException(err); - metrics.stoppedDownload({ size, err }); - } - emitter.emit('pushState', location); - } finally { - openLinksInNewTab(links, false); - } - }); - - emitter.on('copy', ({ url, location }) => { - copyToClipboard(url); - metrics.copiedLink({ location }); - }); - - setInterval(() => { - // poll for updates of the download counts - // TODO something for the share page: || state.route === '/share/:id' - if (state.route === '/') { - checkFiles(); - } - }, 2 * 60 * 1000); - - setInterval(() => { - // poll for rerendering the file list countdown timers - if ( - state.route === '/' && - state.storage.files.length > 0 && - Date.now() - lastRender > 30000 - ) { - render(); - } - }, 60000); -} diff --git a/app/fileReceiver.js b/app/fileReceiver.js index b3b5502ef..764480468 100644 --- a/app/fileReceiver.js +++ b/app/fileReceiver.js @@ -1,7 +1,16 @@ import Nanobus from 'nanobus'; import Keychain from './keychain'; -import { bytes } from './utils'; -import { metadata, downloadFile } from './api'; +import { delay, bytes, streamToArrayBuffer } from './utils'; +import { + downloadFile, + downloadDone, + metadata, + getApiUrl, + reportLink, + getDownloadToken +} from './api'; +import { blobStream } from './streams'; +import Zip from './zip'; export default class FileReceiver extends Nanobus { constructor(fileInfo) { @@ -11,13 +20,22 @@ export default class FileReceiver extends Nanobus { this.keychain.setPassword(fileInfo.password, fileInfo.url); } this.fileInfo = fileInfo; + this.dlToken = null; this.reset(); } + get id() { + return this.fileInfo.id; + } + get progressRatio() { return this.progress[0] / this.progress[1]; } + get progressIndefinite() { + return this.state !== 'downloading'; + } + get sizes() { return { partialSize: bytes(this.progress[0]), @@ -26,64 +44,234 @@ export default class FileReceiver extends Nanobus { } cancel() { - this.cancelled = true; - if (this.fileDownload) { - this.fileDownload.cancel(); + if (this.downloadRequest) { + this.downloadRequest.cancel(); } } reset() { - this.fileDownload = null; this.msg = 'fileSizeProgress'; this.state = 'initialized'; this.progress = [0, 1]; - this.cancelled = false; } async getMetadata() { const meta = await metadata(this.fileInfo.id, this.keychain); - if (meta) { - this.keychain.setIV(meta.iv); - this.fileInfo.name = meta.name; - this.fileInfo.type = meta.type; - this.fileInfo.iv = meta.iv; - this.fileInfo.size = meta.size; - this.state = 'ready'; - return; - } - this.state = 'invalid'; - return; + this.fileInfo.name = meta.name; + this.fileInfo.type = meta.type; + this.fileInfo.size = +meta.size; + this.fileInfo.manifest = meta.manifest; + this.fileInfo.flagged = meta.flagged; + this.state = 'ready'; + } + + async reportLink(reason) { + await reportLink(this.fileInfo.id, this.keychain, reason); + } + + sendMessageToSw(msg) { + return new Promise((resolve, reject) => { + const channel = new MessageChannel(); + + channel.port1.onmessage = function(event) { + if (event.data === undefined) { + reject('bad response from serviceWorker'); + } else if (event.data.error !== undefined) { + reject(event.data.error); + } else { + resolve(event.data); + } + }; + + navigator.serviceWorker.controller.postMessage(msg, [channel.port2]); + }); } - async download() { + async downloadBlob(noSave = false) { this.state = 'downloading'; - this.emit('progress', this.progress); + this.downloadRequest = await downloadFile( + this.fileInfo.id, + this.dlToken, + p => { + this.progress = [p, this.fileInfo.size]; + this.emit('progress'); + } + ); try { - const download = await downloadFile(this.fileInfo.id, this.keychain); - download.onprogress = p => { - this.progress = p; - this.emit('progress', p); - }; - this.fileDownload = download; - const ciphertext = await download.result; - this.fileDownload = null; + const ciphertext = await this.downloadRequest.result; + this.downloadRequest = null; this.msg = 'decryptingFile'; this.state = 'decrypting'; this.emit('decrypting'); - const plaintext = await this.keychain.decryptFile(ciphertext); - if (this.cancelled) { - throw new Error(0); + let size = this.fileInfo.size; + let plainStream = this.keychain.decryptStream(blobStream(ciphertext)); + if (this.fileInfo.type === 'send-archive') { + const zip = new Zip(this.fileInfo.manifest, plainStream); + plainStream = zip.stream; + size = zip.size; + } + const plaintext = await streamToArrayBuffer(plainStream, size); + if (!noSave) { + await saveFile({ + plaintext, + name: decodeURIComponent(this.fileInfo.name), + type: this.fileInfo.type + }); } this.msg = 'downloadFinish'; + this.emit('complete'); this.state = 'complete'; - return { - plaintext, - name: decodeURIComponent(this.fileInfo.name), - type: this.fileInfo.type + } catch (e) { + this.downloadRequest = null; + throw e; + } + } + + async downloadStream(noSave = false) { + const start = Date.now(); + const onprogress = p => { + this.progress = [p, this.fileInfo.size]; + this.emit('progress'); + }; + + this.downloadRequest = { + cancel: () => { + this.sendMessageToSw({ request: 'cancel', id: this.fileInfo.id }); + } + }; + + try { + this.state = 'downloading'; + + const info = { + request: 'init', + id: this.fileInfo.id, + filename: this.fileInfo.name, + type: this.fileInfo.type, + manifest: this.fileInfo.manifest, + key: this.fileInfo.secretKey, + requiresPassword: this.fileInfo.requiresPassword, + password: this.fileInfo.password, + url: this.fileInfo.url, + size: this.fileInfo.size, + nonce: this.keychain.nonce, + dlToken: this.dlToken, + noSave }; + await this.sendMessageToSw(info); + + onprogress(0); + + if (noSave) { + const res = await fetch(getApiUrl(`/api/download/${this.fileInfo.id}`)); + if (res.status !== 200) { + throw new Error(res.status); + } + } else { + const downloadPath = `/api/download/${this.fileInfo.id}`; + let downloadUrl = getApiUrl(downloadPath); + if (downloadUrl === downloadPath) { + downloadUrl = `${location.protocol}//${location.host}${downloadPath}`; + } + const a = document.createElement('a'); + a.href = downloadUrl; + document.body.appendChild(a); + a.click(); + } + + let prog = 0; + let hangs = 0; + while (prog < this.fileInfo.size) { + const msg = await this.sendMessageToSw({ + request: 'progress', + id: this.fileInfo.id + }); + if (msg.progress === prog) { + hangs++; + } else { + hangs = 0; + } + if (hangs > 30) { + // TODO: On Chrome we don't get a cancel + // signal so one is indistinguishable from + // a hang. We may be able to detect + // which end is hung in the service worker + // to improve on this. + const e = new Error('hung download'); + e.duration = Date.now() - start; + e.size = this.fileInfo.size; + e.progress = prog; + throw e; + } + prog = msg.progress; + onprogress(prog); + await delay(1000); + } + + this.downloadRequest = null; + this.msg = 'downloadFinish'; + this.emit('complete'); + this.state = 'complete'; } catch (e) { - this.state = 'invalid'; + this.downloadRequest = null; + if (e === 'cancelled' || e.message === '400') { + throw new Error(0); + } throw e; } } + + async download({ stream, storage, noSave }) { + this.dlToken = storage.getDownloadToken(this.id); + if (!this.dlToken) { + this.dlToken = await getDownloadToken(this.id, this.keychain); + storage.setDownloadToken(this.id, this.dlToken); + } + if (stream) { + await this.downloadStream(noSave); + } else { + await this.downloadBlob(noSave); + } + await downloadDone(this.id, this.dlToken); + storage.setDownloadToken(this.id); + } +} + +async function saveFile(file) { + return new Promise(function(resolve, reject) { + const dataView = new DataView(file.plaintext); + const blob = new Blob([dataView], { type: file.type }); + + if (navigator.msSaveBlob) { + navigator.msSaveBlob(blob, file.name); + return resolve(); + } else if (/iPhone|fxios/i.test(navigator.userAgent)) { + // This method is much slower but createObjectURL + // is buggy on iOS + const reader = new FileReader(); + reader.addEventListener('loadend', function() { + if (reader.error) { + return reject(reader.error); + } + if (reader.result) { + const a = document.createElement('a'); + a.href = reader.result; + a.download = file.name; + document.body.appendChild(a); + a.click(); + } + resolve(); + }); + reader.readAsDataURL(blob); + } else { + const downloadUrl = URL.createObjectURL(blob); + const a = document.createElement('a'); + a.href = downloadUrl; + a.download = file.name; + document.body.appendChild(a); + a.click(); + URL.revokeObjectURL(downloadUrl); + setTimeout(resolve, 100); + } + }); } diff --git a/app/fileSender.js b/app/fileSender.js index e9a86c5a2..e8bc6bea4 100644 --- a/app/fileSender.js +++ b/app/fileSender.js @@ -1,25 +1,27 @@ -/* global EXPIRE_SECONDS */ import Nanobus from 'nanobus'; import OwnedFile from './ownedFile'; import Keychain from './keychain'; import { arrayToB64, bytes } from './utils'; -import { uploadFile } from './api'; +import { uploadWs } from './api'; +import { encryptedSize } from './utils'; export default class FileSender extends Nanobus { - constructor(file) { + constructor() { super('FileSender'); - this.file = file; - this.uploadRequest = null; - this.msg = 'importingFile'; - this.progress = [0, 1]; - this.cancelled = false; this.keychain = new Keychain(); + this.reset(); } get progressRatio() { return this.progress[0] / this.progress[1]; } + get progressIndefinite() { + return ( + ['fileSizeProgress', 'notifyUploadEncryptDone'].indexOf(this.msg) === -1 + ); + } + get sizes() { return { partialSize: bytes(this.progress[0]), @@ -27,6 +29,13 @@ export default class FileSender extends Nanobus { }; } + reset() { + this.uploadRequest = null; + this.msg = 'importingFile'; + this.progress = [0, 1]; + this.cancelled = false; + } + cancel() { this.cancelled = true; if (this.uploadRequest) { @@ -34,66 +43,59 @@ export default class FileSender extends Nanobus { } } - readFile() { - return new Promise((resolve, reject) => { - const reader = new FileReader(); - reader.readAsArrayBuffer(this.file); - // TODO: progress? - reader.onload = function(event) { - const plaintext = new Uint8Array(this.result); - resolve(plaintext); - }; - reader.onerror = function(err) { - reject(err); - }; - }); - } - - async upload() { - const start = Date.now(); - const plaintext = await this.readFile(); + async upload(archive, bearerToken) { if (this.cancelled) { throw new Error(0); } this.msg = 'encryptingFile'; this.emit('encrypting'); - const encrypted = await this.keychain.encryptFile(plaintext); - const metadata = await this.keychain.encryptMetadata(this.file); + const totalSize = encryptedSize(archive.size); + const encStream = await this.keychain.encryptStream(archive.stream); + const metadata = await this.keychain.encryptMetadata(archive); const authKeyB64 = await this.keychain.authKeyB64(); - if (this.cancelled) { - throw new Error(0); - } - this.uploadRequest = uploadFile( - encrypted, + + this.uploadRequest = uploadWs( + encStream, metadata, authKeyB64, - this.keychain + archive.timeLimit, + archive.dlimit, + bearerToken, + p => { + this.progress = [p, totalSize]; + this.emit('progress'); + } ); + + if (this.cancelled) { + throw new Error(0); + } + this.msg = 'fileSizeProgress'; - this.uploadRequest.onprogress = p => { - this.progress = p; - this.emit('progress', p); - }; + this.emit('progress'); // HACK to kick MS Edge try { const result = await this.uploadRequest.result; - const time = Date.now() - start; - this.msg = 'notifyUploadDone'; + this.msg = 'notifyUploadEncryptDone'; this.uploadRequest = null; this.progress = [1, 1]; const secretKey = arrayToB64(this.keychain.rawSecret); const ownedFile = new OwnedFile({ id: result.id, url: `${result.url}#${secretKey}`, - name: this.file.name, - size: this.file.size, - time: time, - speed: this.file.size / (time / 1000), + name: archive.name, + size: archive.size, + manifest: archive.manifest, + time: result.duration, + speed: archive.size / (result.duration / 1000), createdAt: Date.now(), - expiresAt: Date.now() + EXPIRE_SECONDS * 1000, + expiresAt: Date.now() + archive.timeLimit * 1000, secretKey: secretKey, nonce: this.keychain.nonce, - ownerToken: result.ownerToken + ownerToken: result.ownerToken, + dlimit: archive.dlimit, + timeLimit: archive.timeLimit }); + return ownedFile; } catch (e) { this.msg = 'errorPageHeader'; diff --git a/app/fxa.js b/app/fxa.js new file mode 100644 index 000000000..6af7da275 --- /dev/null +++ b/app/fxa.js @@ -0,0 +1,174 @@ +/* global AUTH_CONFIG */ +import { arrayToB64, b64ToArray, concat } from './utils'; + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +function getOtherInfo(enc) { + const name = encoder.encode(enc); + const length = 256; + const buffer = new ArrayBuffer(name.length + 16); + const dv = new DataView(buffer); + const result = new Uint8Array(buffer); + let i = 0; + dv.setUint32(i, name.length); + i += 4; + result.set(name, i); + i += name.length; + dv.setUint32(i, 0); + i += 4; + dv.setUint32(i, 0); + i += 4; + dv.setUint32(i, length); + return result; +} + +async function concatKdf(key, enc) { + if (key.length !== 32) { + throw new Error('unsupported key length'); + } + const otherInfo = getOtherInfo(enc); + const buffer = new ArrayBuffer(4 + key.length + otherInfo.length); + const dv = new DataView(buffer); + const concat = new Uint8Array(buffer); + dv.setUint32(0, 1); + concat.set(key, 4); + concat.set(otherInfo, key.length + 4); + const result = await crypto.subtle.digest('SHA-256', concat); + return new Uint8Array(result); +} + +export async function prepareScopedBundleKey(storage) { + const keys = await crypto.subtle.generateKey( + { + name: 'ECDH', + namedCurve: 'P-256' + }, + true, + ['deriveBits'] + ); + const privateJwk = await crypto.subtle.exportKey('jwk', keys.privateKey); + const publicJwk = await crypto.subtle.exportKey('jwk', keys.publicKey); + const kid = await crypto.subtle.digest( + 'SHA-256', + encoder.encode(JSON.stringify(publicJwk)) + ); + privateJwk.kid = kid; + publicJwk.kid = kid; + storage.set('scopedBundlePrivateKey', JSON.stringify(privateJwk)); + return arrayToB64(encoder.encode(JSON.stringify(publicJwk))); +} + +export async function decryptBundle(storage, bundle) { + const privateJwk = JSON.parse(storage.get('scopedBundlePrivateKey')); + storage.remove('scopedBundlePrivateKey'); + const privateKey = await crypto.subtle.importKey( + 'jwk', + privateJwk, + { + name: 'ECDH', + namedCurve: 'P-256' + }, + false, + ['deriveBits'] + ); + const jweParts = bundle.split('.'); + if (jweParts.length !== 5) { + throw new Error('invalid jwe'); + } + const header = JSON.parse(decoder.decode(b64ToArray(jweParts[0]))); + const additionalData = encoder.encode(jweParts[0]); + const iv = b64ToArray(jweParts[2]); + const ciphertext = b64ToArray(jweParts[3]); + const tag = b64ToArray(jweParts[4]); + + if (header.alg !== 'ECDH-ES' || header.enc !== 'A256GCM') { + throw new Error('unsupported jwe type'); + } + + const publicKey = await crypto.subtle.importKey( + 'jwk', + header.epk, + { + name: 'ECDH', + namedCurve: 'P-256' + }, + false, + [] + ); + const sharedBits = await crypto.subtle.deriveBits( + { + name: 'ECDH', + public: publicKey + }, + privateKey, + 256 + ); + + const rawSharedKey = await concatKdf(new Uint8Array(sharedBits), header.enc); + const sharedKey = await crypto.subtle.importKey( + 'raw', + rawSharedKey, + { + name: 'AES-GCM' + }, + false, + ['decrypt'] + ); + + const plaintext = await crypto.subtle.decrypt( + { + name: 'AES-GCM', + iv: iv, + additionalData: additionalData, + tagLength: tag.length * 8 + }, + sharedKey, + concat(ciphertext, tag) + ); + + return JSON.parse(decoder.decode(plaintext)); +} + +export async function preparePkce(storage) { + const verifier = arrayToB64(crypto.getRandomValues(new Uint8Array(64))); + storage.set('pkceVerifier', verifier); + const challenge = await crypto.subtle.digest( + 'SHA-256', + encoder.encode(verifier) + ); + return arrayToB64(new Uint8Array(challenge)); +} + +export async function deriveFileListKey(ikm) { + const baseKey = await crypto.subtle.importKey( + 'raw', + b64ToArray(ikm), + { name: 'HKDF' }, + false, + ['deriveKey'] + ); + const fileListKey = await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('fileList'), + hash: 'SHA-256' + }, + baseKey, + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + const rawFileListKey = await crypto.subtle.exportKey('raw', fileListKey); + return arrayToB64(new Uint8Array(rawFileListKey)); +} + +export async function getFileListKey(storage, bundle) { + const jwks = await decryptBundle(storage, bundle); + const jwk = jwks[AUTH_CONFIG.key_scope]; + return deriveFileListKey(jwk.k); +} diff --git a/app/keychain.js b/app/keychain.js index eacffec33..37951aa72 100644 --- a/app/keychain.js +++ b/app/keychain.js @@ -1,47 +1,25 @@ import { arrayToB64, b64ToArray } from './utils'; - +import { decryptStream, encryptStream } from './ece.js'; const encoder = new TextEncoder(); const decoder = new TextDecoder(); export default class Keychain { - constructor(secretKeyB64, nonce, ivB64) { + constructor(secretKeyB64, nonce) { this._nonce = nonce || 'yRCdyQ1EMSA3mo4rqSkuNQ=='; - if (ivB64) { - this.iv = b64ToArray(ivB64); - } else { - this.iv = window.crypto.getRandomValues(new Uint8Array(12)); - } if (secretKeyB64) { this.rawSecret = b64ToArray(secretKeyB64); } else { - this.rawSecret = window.crypto.getRandomValues(new Uint8Array(16)); + this.rawSecret = crypto.getRandomValues(new Uint8Array(16)); } - this.secretKeyPromise = window.crypto.subtle.importKey( + this.secretKeyPromise = crypto.subtle.importKey( 'raw', this.rawSecret, 'HKDF', false, ['deriveKey'] ); - this.encryptKeyPromise = this.secretKeyPromise.then(function(secretKey) { - return window.crypto.subtle.deriveKey( - { - name: 'HKDF', - salt: new Uint8Array(), - info: encoder.encode('encryption'), - hash: 'SHA-256' - }, - secretKey, - { - name: 'AES-GCM', - length: 128 - }, - false, - ['encrypt', 'decrypt'] - ); - }); this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) { - return window.crypto.subtle.deriveKey( + return crypto.subtle.deriveKey( { name: 'HKDF', salt: new Uint8Array(), @@ -58,7 +36,7 @@ export default class Keychain { ); }); this.authKeyPromise = this.secretKeyPromise.then(function(secretKey) { - return window.crypto.subtle.deriveKey( + return crypto.subtle.deriveKey( { name: 'HKDF', salt: new Uint8Array(), @@ -86,17 +64,13 @@ export default class Keychain { } } - setIV(ivB64) { - this.iv = b64ToArray(ivB64); - } - setPassword(password, shareUrl) { - this.authKeyPromise = window.crypto.subtle + this.authKeyPromise = crypto.subtle .importKey('raw', encoder.encode(password), { name: 'PBKDF2' }, false, [ 'deriveKey' ]) .then(passwordKey => - window.crypto.subtle.deriveKey( + crypto.subtle.deriveKey( { name: 'PBKDF2', salt: encoder.encode(shareUrl), @@ -115,7 +89,7 @@ export default class Keychain { } setAuthKey(authKeyB64) { - this.authKeyPromise = window.crypto.subtle.importKey( + this.authKeyPromise = crypto.subtle.importKey( 'raw', b64ToArray(authKeyB64), { @@ -129,13 +103,13 @@ export default class Keychain { async authKeyB64() { const authKey = await this.authKeyPromise; - const rawAuth = await window.crypto.subtle.exportKey('raw', authKey); + const rawAuth = await crypto.subtle.exportKey('raw', authKey); return arrayToB64(new Uint8Array(rawAuth)); } async authHeader() { const authKey = await this.authKeyPromise; - const sig = await window.crypto.subtle.sign( + const sig = await crypto.subtle.sign( { name: 'HMAC' }, @@ -145,23 +119,9 @@ export default class Keychain { return `send-v1 ${arrayToB64(new Uint8Array(sig))}`; } - async encryptFile(plaintext) { - const encryptKey = await this.encryptKeyPromise; - const ciphertext = await window.crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: this.iv, - tagLength: 128 - }, - encryptKey, - plaintext - ); - return ciphertext; - } - async encryptMetadata(metadata) { const metaKey = await this.metaKeyPromise; - const ciphertext = await window.crypto.subtle.encrypt( + const ciphertext = await crypto.subtle.encrypt( { name: 'AES-GCM', iv: new Uint8Array(12), @@ -170,32 +130,27 @@ export default class Keychain { metaKey, encoder.encode( JSON.stringify({ - iv: arrayToB64(this.iv), name: metadata.name, - type: metadata.type || 'application/octet-stream' + size: metadata.size, + type: metadata.type || 'application/octet-stream', + manifest: metadata.manifest || {} }) ) ); return ciphertext; } - async decryptFile(ciphertext) { - const encryptKey = await this.encryptKeyPromise; - const plaintext = await window.crypto.subtle.decrypt( - { - name: 'AES-GCM', - iv: this.iv, - tagLength: 128 - }, - encryptKey, - ciphertext - ); - return plaintext; + encryptStream(plainStream) { + return encryptStream(plainStream, this.rawSecret); + } + + decryptStream(cryptotext) { + return decryptStream(cryptotext, this.rawSecret); } async decryptMetadata(ciphertext) { const metaKey = await this.metaKeyPromise; - const plaintext = await window.crypto.subtle.decrypt( + const plaintext = await crypto.subtle.decrypt( { name: 'AES-GCM', iv: new Uint8Array(12), diff --git a/app/locale.js b/app/locale.js new file mode 100644 index 000000000..ff8925fb0 --- /dev/null +++ b/app/locale.js @@ -0,0 +1,26 @@ +import { FluentBundle } from '@fluent/bundle'; + +function makeBundle(locale, ftl) { + const bundle = new FluentBundle(locale, { useIsolating: false }); + bundle.addMessages(ftl); + return bundle; +} + +export async function getTranslator(locale) { + const bundles = []; + const { default: en } = await import('../public/locales/en-US/send.ftl'); + if (locale !== 'en-US') { + const { default: ftl } = await import( + `../public/locales/${locale}/send.ftl` + ); + bundles.push(makeBundle(locale, ftl)); + } + bundles.push(makeBundle('en-US', en)); + return function(id, data) { + for (let bundle of bundles) { + if (bundle.hasMessage(id)) { + return bundle.format(bundle.getMessage(id), data); + } + } + }; +} diff --git a/app/main.css b/app/main.css new file mode 100644 index 000000000..4b7a47d78 --- /dev/null +++ b/app/main.css @@ -0,0 +1,371 @@ +@tailwind base; + +html { + line-height: 1.15; +} + +@tailwind components; + +:not(input) { + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +:root { + --violet-gradient: linear-gradient( + -180deg, + rgba(144, 89, 255, 0.8) 0%, + rgba(144, 89, 255, 0.4) 100% + ); +} + +a { + color: inherit; + text-decoration: none; +} + +a:focus { + outline: 1px dotted grey; +} + +body { + overflow-x: hidden; +} + +.btn { + @apply bg-blue-60; + @apply text-white; + @apply cursor-pointer; + @apply py-4; + @apply px-6; + @apply font-semibold; +} + +.btn:hover { + @apply bg-blue-70; +} + +.btn:focus { + @apply bg-blue-70; +} + +.btn:disabled { + @apply bg-grey-transparent; + + cursor: not-allowed; +} + +.checkbox { + @apply leading-normal; + @apply select-none; +} + +.checkbox > input[type='checkbox'] { + @apply absolute; + @apply opacity-0; +} + +.checkbox > label { + @apply cursor-pointer; +} + +.checkbox > label::before { + /* @apply bg-grey-10; */ + @apply border; + @apply rounded-sm; + + content: ''; + height: 1.5rem; + width: 1.5rem; + margin-right: 0.5rem; + float: left; +} + +.checkbox > label:hover::before { + @apply border-blue-50; +} + +.checkbox > input:focus + label::before { + @apply border-blue-50; +} + +.checkbox > input:checked + label::before { + @apply bg-blue-50; + @apply border-blue-50; + + background-image: url('../assets/lock.svg'); + background-position: center; + background-size: 1.25rem; + background-repeat: no-repeat; +} + +.checkbox > input:disabled + label { + cursor: auto; +} + +.checkbox > input:disabled + label::before { + @apply bg-blue-50; + @apply border-blue-50; + + background-image: url('../assets/lock.svg'); + background-position: center; + background-size: 1.25rem; + background-repeat: no-repeat; + cursor: auto; +} + +details { + overflow: hidden; +} + +details > summary::-webkit-details-marker { + display: none; +} + +details > summary > svg { + transition: all 0.25s cubic-bezier(0.07, 0.95, 0, 1); +} + +details[open] { + overflow-y: auto; +} + +details[open] > summary > svg { + transform: rotate(90deg); +} + +footer li:hover { + text-decoration: underline; +} + +.link-blue { + @apply text-blue-60; +} + +.link-blue:hover { + @apply text-blue-70; +} + +.link-blue:focus { + @apply text-blue-70; +} + +.main-header img { + height: 32px; + width: auto; +} + +.intro { + max-width: 100%; + height: unset; +} + +.dl-bg { + filter: grayscale(1) opacity(0.15); +} + +.main { + display: flex; + position: relative; + max-width: 64rem; + width: 100%; + height: 100%; +} + +.main > section { + @apply bg-white; +} + +#password-msg::after { + content: '\200b'; +} + +progress { + @apply bg-grey-30; + @apply rounded-sm; + @apply w-full; + @apply h-1; +} + +progress::-webkit-progress-bar { + @apply bg-grey-30; + @apply rounded-sm; + @apply w-full; + @apply h-1; +} + +progress::-webkit-progress-value { + /* stylelint-disable */ + background-image: -webkit-linear-gradient( + -45deg, + transparent 20%, + rgba(255, 255, 255, 0.4) 20%, + rgba(255, 255, 255, 0.4) 40%, + transparent 40%, + transparent 60%, + rgba(255, 255, 255, 0.4) 60%, + rgba(255, 255, 255, 0.4) 80%, + transparent 80% + ), + -webkit-linear-gradient(left, #0a84ff, #0a84ff); + /* stylelint-enable */ + border-radius: 2px; + background-size: 21px 20px, 100% 100%, 100% 100%; + -webkit-animation: animate-stripes 1s linear infinite; +} + +progress::-moz-progress-bar { + /* stylelint-disable */ + background-image: -moz-linear-gradient( + 135deg, + transparent 20%, + rgba(255, 255, 255, 0.4) 20%, + rgba(255, 255, 255, 0.4) 40%, + transparent 40%, + transparent 60%, + rgba(255, 255, 255, 0.4) 60%, + rgba(255, 255, 255, 0.4) 80%, + transparent 80% + ), + -moz-linear-gradient(left, #0a84ff, #0a84ff); + /* stylelint-enable */ + border-radius: 2px; + background-size: 21px 20px, 100% 100%, 100% 100%; + animation: animate-stripes 1s linear infinite; +} + +@-webkit-keyframes animate-stripes { + 100% { + background-position: -21px 0; + } +} + +@keyframes animate-stripes { + 100% { + background-position: -21px 0; + } +} + +select { + background-image: url('../assets/select-arrow.svg'); + background-position: calc(100% - 0.75rem); + background-repeat: no-repeat; +} + +@screen md { + .main-header img { + height: 48px; + width: auto; + } + + .intro { + max-width: unset; + height: unset; + margin-bottom: -3rem; + margin-right: -7rem; + } + + .main { + @apply flex-1; + @apply self-center; + @apply items-center; + @apply m-auto; + @apply py-8; + + min-height: 42rem; + max-height: 42rem; + width: calc(100% - 3rem); + } +} + +@screen dark { + body { + @apply text-grey-10; + + background-image: unset; + } + + .btn { + @apply bg-blue-40; + @apply text-white; + } + + .btn:hover { + @apply bg-blue-50; + } + + .btn:focus { + @apply bg-blue-50; + } + + .btn:disabled { + @apply bg-grey-80; + } + + .link-blue { + @apply text-blue-40; + } + + .link-blue:hover { + @apply text-blue-50; + } + + .link-blue:focus { + @apply text-blue-50; + } + + .main > section { + @apply bg-grey-90; + } + + @screen md { + .main > section { + @apply border; + @apply border-grey-80; + } + } +} + +@tailwind utilities; + +@responsive { + .shadow-light { + box-shadow: 0 0 8px 0 rgba(12, 12, 13, 0.1); + } + + .shadow-big { + box-shadow: 0 12px 18px 2px rgba(34, 0, 51, 0.04), + 0 6px 22px 4px rgba(7, 48, 114, 0.12), + 0 6px 10px -4px rgba(14, 13, 26, 0.12); + } +} + +@variants focus { + .outline { + outline: 1px dotted grey; + } +} + +.word-break-all { + word-break: break-all; + line-break: anywhere; +} + +.signin { + backface-visibility: hidden; + border-radius: 6px; + transition-property: transform, background-color; + transition-duration: 250ms; + transition-timing-function: cubic-bezier(0.07, 0.95, 0, 1); +} + +.signin:hover, +.signin:focus { + transform: scale(1.0625); +} + +.signin:hover:active { + transform: scale(0.9375); +} diff --git a/app/main.js b/app/main.js index 0b41b75d3..1519a1225 100644 --- a/app/main.js +++ b/app/main.js @@ -1,55 +1,75 @@ -import 'fluent-intl-polyfill'; -import app from './routes'; -import locale from '../common/locales'; -import fileManager from './fileManager'; +/* global DEFAULTS LIMITS PREFS */ +import 'core-js'; +import 'fast-text-encoding'; // MS Edge support +import 'intl-pluralrules'; +import choo from 'choo'; +import nanotiming from 'nanotiming'; +import routes from './routes'; +import getCapabilities from './capabilities'; +import controller from './controller'; import dragManager from './dragManager'; -import { canHasSend } from './utils'; -import assets from '../common/assets'; +import pasteManager from './pasteManager'; import storage from './storage'; import metrics from './metrics'; import experiments from './experiments'; -import Raven from 'raven-js'; +import * as Sentry from '@sentry/browser'; +import './main.css'; +import User from './user'; +import { getTranslator } from './locale'; +import Archive from './archive'; +import { setTranslate, locale } from './utils'; -if (navigator.doNotTrack !== '1' && window.RAVEN_CONFIG) { - Raven.config(window.SENTRY_ID, window.RAVEN_CONFIG).install(); +if (navigator.doNotTrack !== '1' && window.SENTRY_CONFIG) { + Sentry.init(window.SENTRY_CONFIG); } -app.use((state, emitter) => { - state.transfer = null; - state.fileInfo = null; - state.translate = locale.getTranslator(); - state.storage = storage; - state.raven = Raven; - window.appState = state; - emitter.on('DOMContentLoaded', async function checkSupport() { - let unsupportedReason = null; - if ( - // Firefox < 50 - /firefox/i.test(navigator.userAgent) && - parseInt(navigator.userAgent.match(/firefox\/*([^\n\r]*)\./i)[1], 10) < 50 - ) { - unsupportedReason = 'outdated'; - } - if (/edge\/\d+/i.test(navigator.userAgent)) { - unsupportedReason = 'edge'; - } - const ok = await canHasSend(assets.get('cryptofill.js')); - if (!ok) { - unsupportedReason = /firefox/i.test(navigator.userAgent) - ? 'outdated' - : 'gcm'; - } - if (unsupportedReason) { - setTimeout(() => - emitter.emit('replaceState', `/unsupported/${unsupportedReason}`) - ); +if (process.env.NODE_ENV === 'production') { + nanotiming.disabled = true; +} + +(async function start() { + const capabilities = await getCapabilities(); + if ( + !capabilities.crypto && + window.location.pathname !== '/unsupported/crypto' + ) { + return window.location.assign('/unsupported/crypto'); + } + if (capabilities.serviceWorker) { + try { + await navigator.serviceWorker.register('/serviceWorker.js'); + await navigator.serviceWorker.ready; + } catch (e) { + // continue but disable streaming downloads + capabilities.streamDownload = false; } - }); -}); + } -app.use(metrics); -app.use(fileManager); -app.use(dragManager); -app.use(experiments); + const translate = await getTranslator(locale()); + setTranslate(translate); + // eslint-disable-next-line require-atomic-updates + window.initialState = { + LIMITS, + DEFAULTS, + PREFS, + archive: new Archive([], DEFAULTS.EXPIRE_SECONDS), + capabilities, + translate, + storage, + sentry: Sentry, + user: new User(storage, LIMITS, window.AUTH_CONFIG), + transfer: null, + fileInfo: null, + locale: locale() + }; -app.mount('body'); + const app = routes(choo({ hash: true })); + // eslint-disable-next-line require-atomic-updates + window.app = app; + app.use(experiments); + app.use(metrics); + app.use(controller); + app.use(dragManager); + app.use(pasteManager); + app.mount('body'); +})(); diff --git a/app/metrics.js b/app/metrics.js index bc6783f2c..759866df7 100644 --- a/app/metrics.js +++ b/app/metrics.js @@ -1,297 +1,186 @@ -import testPilotGA from 'testpilot-ga/src/TestPilotGA'; import storage from './storage'; - -let hasLocalStorage = false; -try { - hasLocalStorage = typeof localStorage !== 'undefined'; -} catch (e) { - // when disabled, any mention of localStorage throws an error -} - -const analytics = new testPilotGA({ - an: 'Firefox Send', - ds: 'web', - tid: window.GOOGLE_ANALYTICS_ID -}); +import { platform, locale } from './utils'; +import { sendMetrics } from './api'; let appState = null; let experiment = null; +const HOUR = 1000 * 60 * 60; +const events = []; +let session_id = Date.now(); +const lang = locale(); export default function initialize(state, emitter) { appState = state; + emitter.on('DOMContentLoaded', () => { - addExitHandlers(); - experiment = storage.enrolled[0]; - sendEvent(category(), 'visit', { - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads + experiment = storage.enrolled; + if (!appState.user.firstAction) { + appState.user.firstAction = + appState.route === '/' ? 'upload' : 'download'; + } + const query = appState.query; + addEvent('client_visit', { + entrypoint: appState.route === '/' ? 'upload' : 'download', + referrer: document.referrer, + utm_campaign: query.utm_campaign, + utm_content: query.utm_content, + utm_medium: query.utm_medium, + utm_source: query.utm_source, + utm_term: query.utm_term }); - //TODO restart handlers... somewhere }); - emitter.on('exit', exitEvent); emitter.on('experiment', experimentEvent); + window.addEventListener('unload', submitEvents); } -function category() { - switch (appState.route) { - case '/': - case '/share/:id': - return 'sender'; - case '/download/:id/:key': - case '/download/:id': - case '/completed': - return 'recipient'; - default: - return 'other'; - } +function sizeOrder(n) { + return Math.floor(Math.log10(n)); } -function sendEvent() { - const args = Array.from(arguments); - if (experiment && args[2]) { - args[2].xid = experiment[0]; - args[2].xvar = experiment[1]; +function submitEvents() { + if (navigator.doNotTrack === '1') { + return; } - return ( - hasLocalStorage && analytics.sendEvent.apply(analytics, args).catch(() => 0) + sendMetrics( + new Blob( + [ + JSON.stringify({ + now: Date.now(), + session_id, + lang, + platform: platform(), + events + }) + ], + { type: 'text/plain' } // see http://crbug.com/490015 + ) ); + events.splice(0); } -function urlToMetric(url) { - switch (url) { - case 'https://www.mozilla.org/': - return 'mozilla'; - case 'https://www.mozilla.org/about/legal': - return 'legal'; - case 'https://testpilot.firefox.com/about': - return 'about'; - case 'https://testpilot.firefox.com/privacy': - return 'privacy'; - case 'https://testpilot.firefox.com/terms': - return 'terms'; - case 'https://www.mozilla.org/privacy/websites/#cookies': - return 'cookies'; - case 'https://github.com/mozilla/send': - return 'github'; - case 'https://twitter.com/FxTestPilot': - return 'twitter'; - case 'https://www.mozilla.org/firefox/new/?scene=2': - return 'download-firefox'; - case 'https://qsurvey.mozilla.com/s3/txp-firefox-send': - return 'survey'; - case 'https://testpilot.firefox.com/': - case 'https://testpilot.firefox.com/experiments/send': - return 'testpilot'; - case 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com': - return 'promo'; - default: - return 'other'; +async function addEvent(event_type, event_properties) { + const user_id = await appState.user.metricId(); + const device_id = await appState.user.deviceId(); + const ab_id = Object.keys(experiment)[0]; + if (ab_id) { + event_properties.experiment = ab_id; + event_properties.variant = experiment[ab_id]; } -} - -function setReferrer(state) { - if (category() === 'sender') { - if (state) { - storage.referrer = `${state}-upload`; + events.push({ + device_id, + event_properties, + event_type, + time: Date.now(), + user_id, + user_properties: { + anonymous: !appState.user.loggedIn, + first_action: appState.user.firstAction, + active_count: storage.files.length } - } else if (category() === 'recipient') { - if (state) { - storage.referrer = `${state}-download`; - } - } -} - -function externalReferrer() { - if (/^https:\/\/testpilot\.firefox\.com/.test(document.referrer)) { - return 'testpilot'; - } - return 'external'; -} - -function takeReferrer() { - const referrer = storage.referrer || externalReferrer(); - storage.referrer = null; - return referrer; -} - -function startedUpload(params) { - return sendEvent('sender', 'upload-started', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length + 1, - cm7: storage.totalDownloads, - cd1: params.type, - cd5: takeReferrer() - }); -} - -function cancelledUpload(params) { - setReferrer('cancelled'); - return sendEvent('sender', 'upload-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd2: 'cancelled' }); + if (events.length === 25) { + submitEvents(); + } } -function completedUpload(params) { - return sendEvent('sender', 'upload-stopped', { - cm1: params.size, - cm2: params.time, - cm3: params.speed, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd2: 'completed' +function cancelledUpload(archive, duration) { + return addEvent('client_upload', { + download_limit: archive.dlimit, + duration: sizeOrder(duration), + file_count: archive.numFiles, + password_protected: !!archive.password, + size: sizeOrder(archive.size), + status: 'cancel', + time_limit: archive.timeLimit }); } -function addedPassword(params) { - return sendEvent('sender', 'password-added', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads +function completedUpload(archive, duration) { + return addEvent('client_upload', { + download_limit: archive.dlimit, + duration: sizeOrder(duration), + file_count: archive.numFiles, + password_protected: !!archive.password, + size: sizeOrder(archive.size), + status: 'ok', + time_limit: archive.timeLimit }); } -function startedDownload(params) { - return sendEvent('recipient', 'download-started', { - cm1: params.size, - cm4: params.ttl, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads +function stoppedUpload(archive, duration = 0) { + return addEvent('client_upload', { + download_limit: archive.dlimit, + duration: sizeOrder(duration), + file_count: archive.numFiles, + password_protected: !!archive.password, + size: sizeOrder(archive.size), + status: 'error', + time_limit: archive.timeLimit }); } function stoppedDownload(params) { - return sendEvent('recipient', 'download-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd2: 'errored', - cd6: params.err - }); -} - -function cancelledDownload(params) { - setReferrer('cancelled'); - return sendEvent('recipient', 'download-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd2: 'cancelled' - }); -} - -function stoppedUpload(params) { - return sendEvent('sender', 'upload-stopped', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd2: 'errored', - cd6: params.err - }); -} - -function changedDownloadLimit(params) { - return sendEvent('sender', 'download-limit-changed', { - cm1: params.size, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cm8: params.dlimit + return addEvent('client_download', { + duration: sizeOrder(params.duration), + password_protected: params.password_protected, + size: sizeOrder(params.size), + status: 'error' }); } function completedDownload(params) { - return sendEvent('recipient', 'download-stopped', { - cm1: params.size, - cm2: params.time, - cm3: params.speed, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd2: 'completed' + return addEvent('client_download', { + duration: sizeOrder(params.duration), + password_protected: params.password_protected, + size: sizeOrder(params.size), + status: 'ok' }); } -function deletedUpload(params) { - return sendEvent(category(), 'upload-deleted', { - cm1: params.size, - cm2: params.time, - cm3: params.speed, - cm4: params.ttl, - cm5: storage.totalUploads, - cm6: storage.files.length, - cm7: storage.totalDownloads, - cd1: params.type, - cd4: params.location +function deletedUpload(ownedFile) { + return addEvent('client_delete', { + age: Math.floor((Date.now() - ownedFile.createdAt) / HOUR), + downloaded: ownedFile.dtotal > 0, + status: 'ok' }); } -function unsupported(params) { - return sendEvent(category(), 'unsupported', { - cd6: params.err - }); -} - -function copiedLink(params) { - return sendEvent('sender', 'copied', { - cd4: params.location - }); +function experimentEvent(params) { + return addEvent('client_experiment', params); } -function exitEvent(target) { - return sendEvent(category(), 'exited', { - cd3: urlToMetric(target.currentTarget.href) +function submittedSignup(params) { + return addEvent('client_login', { + status: 'ok', + trigger: params.trigger }); } -function experimentEvent(params) { - return sendEvent(category(), 'experiment', params); -} - -// eslint-disable-next-line no-unused-vars -function addExitHandlers() { - const links = Array.from(document.querySelectorAll('a')); - links.forEach(l => { - if (/^http/.test(l.getAttribute('href'))) { - l.addEventListener('click', exitEvent); - } +function canceledSignup(params) { + return addEvent('client_login', { + status: 'cancel', + trigger: params.trigger }); } -function restart(state) { - setReferrer(state); - return sendEvent(category(), 'restarted', { - cd2: state +function loggedOut(params) { + addEvent('client_logout', { + status: 'ok', + trigger: params.trigger }); + // flush events and start new anon session + submitEvents(); + session_id = Date.now(); } export { - copiedLink, - startedUpload, cancelledUpload, stoppedUpload, completedUpload, - changedDownloadLimit, deletedUpload, - startedDownload, - cancelledDownload, stoppedDownload, completedDownload, - addedPassword, - restart, - unsupported + submittedSignup, + canceledSignup, + loggedOut }; diff --git a/app/ownedFile.js b/app/ownedFile.js index 307621f14..04b497d18 100644 --- a/app/ownedFile.js +++ b/app/ownedFile.js @@ -4,11 +4,14 @@ import { del, fileInfo, setParams, setPassword } from './api'; export default class OwnedFile { constructor(obj) { + if (!obj.manifest) { + throw new Error('invalid file object'); + } this.id = obj.id; this.url = obj.url; this.name = obj.name; this.size = obj.size; - this.type = obj.type; + this.manifest = obj.manifest; this.time = obj.time; this.speed = obj.speed; this.createdAt = obj.createdAt; @@ -16,35 +19,48 @@ export default class OwnedFile { this.ownerToken = obj.ownerToken; this.dlimit = obj.dlimit || 1; this.dtotal = obj.dtotal || 0; - this.keychain = new Keychain(obj.secretKey); + this.keychain = new Keychain(obj.secretKey, obj.nonce); this._hasPassword = !!obj.hasPassword; + this.timeLimit = obj.timeLimit; + } + + get hasPassword() { + return !!this._hasPassword; + } + + get expired() { + return this.dlimit === this.dtotal || Date.now() > this.expiresAt; } async setPassword(password) { - this.password = password; - this._hasPassword = true; - this.keychain.setPassword(password, this.url); - const result = await setPassword(this.id, this.ownerToken, this.keychain); - return result; + try { + this.password = password; + this._hasPassword = true; + this.keychain.setPassword(password, this.url); + const result = await setPassword(this.id, this.ownerToken, this.keychain); + return result; + } catch (e) { + this.password = null; + this._hasPassword = false; + throw e; + } } del() { return del(this.id, this.ownerToken); } - changeLimit(dlimit) { + changeLimit(dlimit, user = {}) { if (this.dlimit !== dlimit) { this.dlimit = dlimit; - return setParams(this.id, this.ownerToken, { dlimit }); + return setParams(this.id, this.ownerToken, user.bearerToken, { dlimit }); } return Promise.resolve(true); } - get hasPassword() { - return !!this._hasPassword; - } - async updateDownloadCount() { + const oldTotal = this.dtotal; + const oldLimit = this.dlimit; try { const result = await fileInfo(this.id, this.ownerToken); this.dtotal = result.dtotal; @@ -53,7 +69,9 @@ export default class OwnedFile { if (e.message === '404') { this.dtotal = this.dlimit; } + // ignore other errors } + return oldTotal !== this.dtotal || oldLimit !== this.dlimit; } toJSON() { @@ -62,7 +80,7 @@ export default class OwnedFile { url: this.url, name: this.name, size: this.size, - type: this.type, + manifest: this.manifest, time: this.time, speed: this.speed, createdAt: this.createdAt, @@ -71,7 +89,8 @@ export default class OwnedFile { ownerToken: this.ownerToken, dlimit: this.dlimit, dtotal: this.dtotal, - hasPassword: this.hasPassword + hasPassword: this.hasPassword, + timeLimit: this.timeLimit }; } } diff --git a/app/pages/blank.js b/app/pages/blank.js deleted file mode 100644 index ec104ac33..000000000 --- a/app/pages/blank.js +++ /dev/null @@ -1,6 +0,0 @@ -const html = require('choo/html'); - -module.exports = function() { - const div = html`
`; - return div; -}; diff --git a/app/pages/completed.js b/app/pages/completed.js deleted file mode 100644 index fa1fb896d..000000000 --- a/app/pages/completed.js +++ /dev/null @@ -1,34 +0,0 @@ -const html = require('choo/html'); -const progress = require('../templates/progress'); -const { fadeOut } = require('../utils'); - -module.exports = function(state, emit) { - const div = html` -
-
-
-
- ${state.translate('downloadFinish')} -
-
- ${progress(1)} -
-
-
-
- ${state.translate('sendYourFilesLink')} -
-
- `; - - async function sendNew(e) { - e.preventDefault(); - await fadeOut('download'); - emit('pushState', '/'); - } - - return div; -}; diff --git a/app/pages/download.js b/app/pages/download.js deleted file mode 100644 index 4a415f17b..000000000 --- a/app/pages/download.js +++ /dev/null @@ -1,46 +0,0 @@ -const html = require('choo/html'); -const progress = require('../templates/progress'); -const { bytes } = require('../utils'); - -module.exports = function(state, emit) { - const transfer = state.transfer; - const cancelBtn = html` - `; - - const div = html` -
-
-
-
- ${state.translate('downloadingPageProgress', { - filename: state.fileInfo.name, - size: bytes(state.fileInfo.size) - })} -
-
- ${state.translate('downloadingPageMessage')} -
- ${progress(transfer.progressRatio)} -
-
- ${state.translate(transfer.msg, transfer.sizes)} -
- ${transfer.state === 'downloading' ? cancelBtn : null} -
-
-
-
- `; - - function cancel() { - const btn = document.getElementById('cancel-upload'); - btn.remove(); - emit('cancel'); - } - return div; -}; diff --git a/app/pages/error.js b/app/pages/error.js deleted file mode 100644 index f7751faa7..000000000 --- a/app/pages/error.js +++ /dev/null @@ -1,10 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - return html` -
-
${state.translate('errorPageHeader')}
- -
`; -}; diff --git a/app/pages/legal.js b/app/pages/legal.js deleted file mode 100644 index af196ab9a..000000000 --- a/app/pages/legal.js +++ /dev/null @@ -1,34 +0,0 @@ -const html = require('choo/html'); - -function replaceLinks(str, urls) { - let i = -1; - const s = str.replace(/([^<]+)<\/a>/g, (m, v) => { - i++; - return `${v}`; - }); - return [`
${s}
`]; -} - -module.exports = function(state) { - const div = html` -
- -
- `; - return div; -}; diff --git a/app/pages/notFound.js b/app/pages/notFound.js deleted file mode 100644 index 495b8b082..000000000 --- a/app/pages/notFound.js +++ /dev/null @@ -1,21 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - const div = html` -
-
-
${state.translate('expiredPageHeader')}
- -
- ${state.translate('uploadPageExplainer')} -
- - ${state.translate('sendYourFilesLink')} - -
-
`; - return div; -}; diff --git a/app/pages/preview.js b/app/pages/preview.js deleted file mode 100644 index 84e54f250..000000000 --- a/app/pages/preview.js +++ /dev/null @@ -1,44 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); -const { bytes } = require('../utils'); - -module.exports = function(state, pageAction) { - const fileInfo = state.fileInfo; - - const size = fileInfo.size - ? state.translate('downloadFileSize', { size: bytes(fileInfo.size) }) - : ''; - - const title = fileInfo.name - ? state.translate('downloadFileName', { filename: fileInfo.name }) - : state.translate('downloadFileTitle'); - - const info = html` -
`; - if (!pageAction) { - return info; - } - const div = html` -
-
-
-
- ${title} - ${' ' + size} -
-
${state.translate('downloadMessage')}
- - ${pageAction} -
- ${state.translate('sendYourFilesLink')} -
- ${info} -
- `; - return div; -}; diff --git a/app/pages/share.js b/app/pages/share.js deleted file mode 100644 index 5fa8b1270..000000000 --- a/app/pages/share.js +++ /dev/null @@ -1,126 +0,0 @@ -/* global EXPIRE_SECONDS */ -const html = require('choo/html'); -const assets = require('../../common/assets'); -const notFound = require('./notFound'); -const uploadPasswordSet = require('../templates/uploadPasswordSet'); -const uploadPasswordUnset = require('../templates/uploadPasswordUnset'); -const selectbox = require('../templates/selectbox'); -const { allowedCopy, delay, fadeOut } = require('../utils'); - -function expireInfo(file, translate, emit) { - const hours = Math.floor(EXPIRE_SECONDS / 60 / 60); - const el = html([ - `
${translate('expireInfo', { - downloadCount: '', - timespan: translate('timespanHours', { num: hours }) - })}
` - ]); - const select = el.querySelector('select'); - const options = [1, 2, 3, 4, 5, 20].filter(i => i > (file.dtotal || 0)); - const t = num => translate('downloadCount', { num }); - const changed = value => emit('changeLimit', { file, value }); - select.parentNode.replaceChild( - selectbox(file.dlimit || 1, options, t, changed), - select - ); - return el; -} - -module.exports = function(state, emit) { - const file = state.storage.getFileById(state.params.id); - if (!file) { - return notFound(state, emit); - } - - const passwordSection = file.hasPassword - ? uploadPasswordSet(state, emit) - : uploadPasswordUnset(state, emit); - const div = html` - - `; - - function showPopup() { - const popupText = document.querySelector('.popuptext'); - popupText.classList.add('show'); - popupText.focus(); - } - - function cancel(e) { - e.stopPropagation(); - const popupText = document.querySelector('.popuptext'); - popupText.classList.remove('show'); - } - - async function sendNew(e) { - e.preventDefault(); - await fadeOut('share-link'); - emit('pushState', '/'); - } - - async function copyLink() { - if (allowedCopy()) { - emit('copy', { url: file.url, location: 'success-screen' }); - const input = document.getElementById('link'); - input.disabled = true; - const copyBtn = document.getElementById('copy-btn'); - copyBtn.disabled = true; - copyBtn.classList.add('success'); - copyBtn.replaceChild( - html``, - copyBtn.firstChild - ); - await delay(2000); - input.disabled = false; - if (!copyBtn.parentNode.classList.contains('wait-password')) { - copyBtn.disabled = false; - } - copyBtn.classList.remove('success'); - copyBtn.textContent = state.translate('copyUrlFormButton'); - } - } - - async function deleteFile() { - emit('delete', { file, location: 'success-screen' }); - await fadeOut('share-link'); - emit('pushState', '/'); - } - return div; -}; diff --git a/app/pages/unsupported.js b/app/pages/unsupported.js deleted file mode 100644 index 03a558837..000000000 --- a/app/pages/unsupported.js +++ /dev/null @@ -1,52 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - const msg = - state.params.reason === 'outdated' - ? html` -
-
${state.translate('notSupportedHeader')}
-
- ${state.translate('notSupportedOutdatedDetail')} -
- - -
- ${state.translate('updateFirefox')} -
-
-
- ${state.translate('uploadPageExplainer')} -
-
` - : html` -
-
${state.translate('notSupportedHeader')}
-
${state.translate('notSupportedDetail')}
- - - -
Firefox
- ${state.translate('downloadFirefoxButtonSub')} -
-
-
- ${state.translate('uploadPageExplainer')} -
-
`; - const div = html`
${msg}
`; - return div; -}; diff --git a/app/pages/upload.js b/app/pages/upload.js deleted file mode 100644 index 7a21bd3be..000000000 --- a/app/pages/upload.js +++ /dev/null @@ -1,41 +0,0 @@ -const html = require('choo/html'); -const progress = require('../templates/progress'); -const { bytes } = require('../utils'); - -module.exports = function(state, emit) { - const transfer = state.transfer; - - const div = html` -
-
-
- ${state.translate('uploadingPageProgress', { - filename: transfer.file.name, - size: bytes(transfer.file.size) - })} -
-
- ${progress(transfer.progressRatio)} -
-
- ${state.translate(transfer.msg, transfer.sizes)} -
- -
-
-
- `; - - function cancel() { - const btn = document.getElementById('cancel-upload'); - btn.disabled = true; - btn.textContent = state.translate('uploadCancelNotification'); - emit('cancel'); - } - return div; -}; diff --git a/app/pages/welcome.js b/app/pages/welcome.js deleted file mode 100644 index ab5df4080..000000000 --- a/app/pages/welcome.js +++ /dev/null @@ -1,84 +0,0 @@ -/* global MAXFILESIZE */ -const html = require('choo/html'); -const assets = require('../../common/assets'); -const fileList = require('../templates/fileList'); -const { bytes, fadeOut } = require('../utils'); - -module.exports = function(state, emit) { - // the page flickers if both the server and browser set 'fadeIn' - const fade = state.layout ? '' : 'fadeIn'; - const div = html` -
-
${state.translate('uploadPageHeader')}
-
-
${state.translate('uploadPageExplainer')}
- - ${state.translate('uploadPageLearnMore')} - -
-
-
- -
-
${state.translate('uploadPageDropMessage')}
- - ${state.translate('uploadPageSizeMessage')} - - - -
- ${fileList(state, emit)} -
- `; - - function dragover(event) { - const div = document.querySelector('.upload-window'); - div.classList.add('ondrag'); - } - - function dragleave(event) { - const div = document.querySelector('.upload-window'); - div.classList.remove('ondrag'); - } - - function onfocus(event) { - event.target.classList.add('has-focus'); - } - - function onblur(event) { - event.target.classList.remove('has-focus'); - } - - async function upload(event) { - event.preventDefault(); - const target = event.target; - const file = target.files[0]; - if (file.size === 0) { - return; - } - if (file.size > MAXFILESIZE) { - window.alert(state.translate('fileTooBig', { size: bytes(MAXFILESIZE) })); - return; - } - - await fadeOut('page-one'); - emit('upload', { file, type: 'click' }); - } - return div; -}; diff --git a/app/pasteManager.js b/app/pasteManager.js new file mode 100644 index 000000000..c35c7f82c --- /dev/null +++ b/app/pasteManager.js @@ -0,0 +1,36 @@ +function getString(item) { + return new Promise(resolve => { + item.getAsString(resolve); + }); +} + +export default function(state, emitter) { + window.addEventListener('paste', async event => { + if (state.route !== '/' || state.uploading) return; + if (['password', 'text', 'email'].includes(event.target.type)) return; + + const items = Array.from(event.clipboardData.items); + const transferFiles = items.filter(item => item.kind === 'file'); + const strings = items.filter(item => item.kind === 'string'); + if (transferFiles.length) { + const promises = transferFiles.map(async (f, i) => { + const blob = f.getAsFile(); + if (!blob) { + return null; + } + const name = await getString(strings[i]); + const file = new File([blob], name, { type: blob.type }); + return file; + }); + const files = (await Promise.all(promises)).filter(f => !!f); + if (files.length) { + emitter.emit('addFiles', { files }); + } + } else if (strings.length) { + strings[0].getAsString(s => { + const file = new File([s], 'pasted.txt', { type: 'text/plain' }); + emitter.emit('addFiles', { files: [file] }); + }); + } + }); +} diff --git a/app/readme.md b/app/readme.md new file mode 100644 index 000000000..b80e52469 --- /dev/null +++ b/app/readme.md @@ -0,0 +1,9 @@ +# Application Code + +`app/` contains the browser code that gets bundled into `app.[hash].js`. It's got all the logic, crypto, and UI. All of it gets used in the browser, and some of it by the server for server side rendering. + +The main entrypoint for the browser is [main.js](./main.js) and on the server [routes.js](./routes.js) is imported by [/server/routes/pages.js](../server/routes/pages.js) + +- `pages` contains display logic an markup for pages +- `routes` contains route definitions and logic +- `templates` contains ui elements smaller than pages diff --git a/app/routes.js b/app/routes.js new file mode 100644 index 000000000..d79f42bbf --- /dev/null +++ b/app/routes.js @@ -0,0 +1,22 @@ +const choo = require('choo'); +const download = require('./ui/download'); +const body = require('./ui/body'); + +module.exports = function(app = choo({ hash: true })) { + app.route('/', body(require('./ui/home'))); + app.route('/download/:id', body(download)); + app.route('/download/:id/:key', body(download)); + app.route('/unsupported/:reason', body(require('./ui/unsupported'))); + app.route('/error', body(require('./ui/error'))); + app.route('/blank', body(require('./ui/blank'))); + app.route('/oauth', function(state, emit) { + emit('authenticate', state.query.code, state.query.state); + }); + app.route('/login', function(state, emit) { + emit('replaceState', '/'); + setTimeout(() => emit('render')); + }); + app.route('/report', body(require('./ui/report'))); + app.route('*', body(require('./ui/notFound'))); + return app; +}; diff --git a/app/routes/download.js b/app/routes/download.js deleted file mode 100644 index 63267d56d..000000000 --- a/app/routes/download.js +++ /dev/null @@ -1,60 +0,0 @@ -const preview = require('../pages/preview'); -const download = require('../pages/download'); -const notFound = require('../pages/notFound'); -const downloadPassword = require('../templates/downloadPassword'); -const downloadButton = require('../templates/downloadButton'); - -function hasFileInfo() { - return !!document.getElementById('dl-file'); -} - -function getFileInfoFromDOM() { - const el = document.getElementById('dl-file'); - if (!el) { - return null; - } - return { - nonce: el.getAttribute('data-nonce'), - requiresPassword: !!+el.getAttribute('data-requires-password') - }; -} - -function createFileInfo(state) { - const metadata = getFileInfoFromDOM(); - return { - id: state.params.id, - secretKey: state.params.key, - nonce: metadata.nonce, - requiresPassword: metadata.requiresPassword - }; -} - -module.exports = function(state, emit) { - if (!state.fileInfo) { - // This is a fresh page load - // We need to parse the file info from the server's html - if (!hasFileInfo()) { - return notFound(state, emit); - } - state.fileInfo = createFileInfo(state); - - if (!state.fileInfo.requiresPassword) { - emit('getMetadata'); - } - } - - let pageAction = null; //default state: we don't have file metadata - if (state.transfer) { - const s = state.transfer.state; - if (['downloading', 'decrypting', 'complete'].indexOf(s) > -1) { - // Downloading is in progress - return download(state, emit); - } - // we have file metadata - pageAction = downloadButton(state, emit); - } else if (state.fileInfo.requiresPassword && !state.fileInfo.password) { - // we're waiting on the user for a valid password - pageAction = downloadPassword(state, emit); - } - return preview(state, pageAction); -}; diff --git a/app/routes/home.js b/app/routes/home.js deleted file mode 100644 index 3d13e87f0..000000000 --- a/app/routes/home.js +++ /dev/null @@ -1,9 +0,0 @@ -const welcome = require('../pages/welcome'); -const upload = require('../pages/upload'); - -module.exports = function(state, emit) { - if (state.uploading) { - return upload(state, emit); - } - return welcome(state, emit); -}; diff --git a/app/routes/index.js b/app/routes/index.js deleted file mode 100644 index 67818e58b..000000000 --- a/app/routes/index.js +++ /dev/null @@ -1,54 +0,0 @@ -const choo = require('choo'); -const html = require('choo/html'); -const download = require('./download'); -const header = require('../templates/header'); -const footer = require('../templates/footer'); -const fxPromo = require('../templates/fxPromo'); - -const app = choo(); - -function banner(state, emit) { - if (state.promo && !state.route.startsWith('/unsupported/')) { - return fxPromo(state, emit); - } -} - -function body(template) { - return function(state, emit) { - const b = html` - ${banner(state, emit)} - ${header(state)} -
- - ${template(state, emit)} -
- ${footer(state)} - `; - if (state.layout) { - // server side only - return state.layout(state, b); - } - return b; - }; -} - -app.route('/', body(require('./home'))); -app.route('/share/:id', body(require('../pages/share'))); -app.route('/download/:id', body(download)); -app.route('/download/:id/:key', body(download)); -app.route('/completed', body(require('../pages/completed'))); -app.route('/unsupported/:reason', body(require('../pages/unsupported'))); -app.route('/legal', body(require('../pages/legal'))); -app.route('/error', body(require('../pages/error'))); -app.route('/blank', body(require('../pages/blank'))); -app.route('*', body(require('../pages/notFound'))); - -module.exports = app; diff --git a/app/serviceWorker.js b/app/serviceWorker.js new file mode 100644 index 000000000..9e32630e6 --- /dev/null +++ b/app/serviceWorker.js @@ -0,0 +1,175 @@ +import assets from '../common/assets'; +import { version } from '../package.json'; +import Keychain from './keychain'; +import { downloadStream } from './api'; +import { transformStream } from './streams'; +import Zip from './zip'; +import contentDisposition from 'content-disposition'; + +let noSave = false; +const map = new Map(); +const IMAGES = /.*\.(png|svg|jpg)$/; +const VERSIONED_ASSET = /\.[A-Fa-f0-9]{8}\.(js|css|png|svg|jpg)(#\w+)?$/; +const DOWNLOAD_URL = /\/api\/download\/([A-Fa-f0-9]{4,})/; +const FONT = /\.woff2?$/; + +self.addEventListener('install', () => { + self.skipWaiting(); +}); + +self.addEventListener('activate', event => { + event.waitUntil(self.clients.claim().then(precache)); +}); + +async function decryptStream(id) { + const file = map.get(id); + if (!file) { + return new Response(null, { status: 400 }); + } + try { + let size = file.size; + let type = file.type; + const keychain = new Keychain(file.key, file.nonce); + if (file.requiresPassword) { + keychain.setPassword(file.password, file.url); + } + + file.download = downloadStream(id, file.dlToken); + + const body = await file.download.result; + + const decrypted = keychain.decryptStream(body); + + let zipStream = null; + if (file.type === 'send-archive') { + const zip = new Zip(file.manifest, decrypted); + zipStream = zip.stream; + type = 'application/zip'; + size = zip.size; + } + const responseStream = transformStream( + zipStream || decrypted, + { + transform(chunk, controller) { + file.progress += chunk.length; + controller.enqueue(chunk); + } + }, + function oncancel() { + // NOTE: cancel doesn't currently fire on chrome + // https://bugs.chromium.org/p/chromium/issues/detail?id=638494 + file.download.cancel(); + map.delete(id); + } + ); + + const headers = { + 'Content-Disposition': contentDisposition(file.filename), + 'Content-Type': type, + 'Content-Length': size + }; + return new Response(responseStream, { headers }); + } catch (e) { + if (noSave) { + return new Response(null, { status: e.message }); + } + + return new Response(null, { + status: 302, + headers: { + Location: `/download/${id}/#${file.key}` + } + }); + } +} + +async function precache() { + try { + await cleanCache(); + const cache = await caches.open(version); + const images = assets.match(IMAGES); + await cache.addAll(images); + } catch (e) { + console.error(e); + // cache will get populated on demand + } +} + +async function cleanCache() { + const oldCaches = await caches.keys(); + for (const c of oldCaches) { + if (c !== version) { + await caches.delete(c); + } + } +} + +function cacheable(url) { + return VERSIONED_ASSET.test(url) || FONT.test(url); +} + +async function cachedOrFetched(req) { + const cache = await caches.open(version); + const cached = await cache.match(req); + if (cached) { + return cached; + } + const fetched = await fetch(req); + if (fetched.ok && cacheable(req.url)) { + cache.put(req, fetched.clone()); + } + return fetched; +} + +self.onfetch = event => { + const req = event.request; + if (req.method !== 'GET') return; + const url = new URL(req.url); + const dlmatch = DOWNLOAD_URL.exec(url.pathname); + if (dlmatch) { + event.respondWith(decryptStream(dlmatch[1])); + } else if (cacheable(url.pathname)) { + event.respondWith(cachedOrFetched(req)); + } +}; + +self.onmessage = event => { + if (event.data.request === 'init') { + noSave = event.data.noSave; + const info = { + key: event.data.key, + nonce: event.data.nonce, + filename: event.data.filename, + requiresPassword: event.data.requiresPassword, + password: event.data.password, + url: event.data.url, + type: event.data.type, + manifest: event.data.manifest, + size: event.data.size, + dlToken: event.data.dlToken, + progress: 0 + }; + map.set(event.data.id, info); + + event.ports[0].postMessage('file info received'); + } else if (event.data.request === 'progress') { + const file = map.get(event.data.id); + if (!file) { + event.ports[0].postMessage({ error: 'cancelled' }); + } else { + if (file.progress === file.size) { + map.delete(event.data.id); + } + event.ports[0].postMessage({ progress: file.progress }); + } + } else if (event.data.request === 'cancel') { + const file = map.get(event.data.id); + if (file) { + if (file.download) { + file.download.cancel(); + } + map.delete(event.data.id); + } + event.ports[0].postMessage('download cancelled'); + } +}; diff --git a/app/storage.js b/app/storage.js index e33e449b3..a4a369a6d 100644 --- a/app/storage.js +++ b/app/storage.js @@ -1,4 +1,4 @@ -import { isFile } from './utils'; +import { arrayToB64, isFile } from './utils'; import OwnedFile from './ownedFile'; class Mem { @@ -35,10 +35,11 @@ class Storage { this.engine = new Mem(); } this._files = this.loadFiles(); + this.pruneTokens(); } loadFiles() { - const fs = []; + const fs = new Map(); for (let i = 0; i < this.engine.length; i++) { const k = this.engine.key(i); if (isFile(k)) { @@ -47,14 +48,24 @@ class Storage { if (!f.id) { f.id = f.fileId; } - fs.push(f); + + fs.set(f.id, f); } catch (err) { // obviously you're not a golfer this.engine.removeItem(k); } } } - return fs.sort((a, b) => a.createdAt - b.createdAt); + return fs; + } + + get id() { + let id = this.engine.getItem('device_id'); + if (!id) { + id = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); + this.engine.setItem('device_id', id); + } + return id; } get totalDownloads() { @@ -76,39 +87,54 @@ class Storage { this.engine.setItem('referrer', str); } get enrolled() { - return JSON.parse(this.engine.getItem('experiments') || '[]'); + return JSON.parse(this.engine.getItem('ab_experiments') || '{}'); } enroll(id, variant) { - const enrolled = this.enrolled; - // eslint-disable-next-line no-unused-vars - if (!enrolled.find(([i, v]) => i === id)) { - enrolled.push([id, variant]); - this.engine.setItem('experiments', JSON.stringify(enrolled)); - } + const enrolled = {}; + enrolled[id] = variant; + this.engine.setItem('ab_experiments', JSON.stringify(enrolled)); } get files() { - return this._files; + return Array.from(this._files.values()).sort( + (a, b) => a.createdAt - b.createdAt + ); + } + + get user() { + try { + return JSON.parse(this.engine.getItem('user')); + } catch (e) { + return null; + } + } + + set user(info) { + return this.engine.setItem('user', JSON.stringify(info)); } getFileById(id) { - return this._files.find(f => f.id === id); + return this._files.get(id); } get(id) { return this.engine.getItem(id); } + set(id, value) { + return this.engine.setItem(id, value); + } + remove(property) { if (isFile(property)) { - this._files.splice(this._files.findIndex(f => f.id === property), 1); + this._files.delete(property); } this.engine.removeItem(property); } addFile(file) { - this._files.push(file); + this._files.set(file.id, file); this.writeFile(file); } @@ -119,6 +145,84 @@ class Storage { writeFiles() { this._files.forEach(f => this.writeFile(f)); } + + clearLocalFiles() { + this._files.forEach(f => this.engine.removeItem(f.id)); + this._files = new Map(); + } + + async merge(files = []) { + let incoming = false; + let outgoing = false; + let downloadCount = false; + for (const f of files) { + if (!this.getFileById(f.id)) { + this.addFile(new OwnedFile(f)); + incoming = true; + } + } + const workingFiles = this.files.slice(); + for (const f of workingFiles) { + const cc = await f.updateDownloadCount(); + if (cc) { + await this.writeFile(f); + } + downloadCount = downloadCount || cc; + outgoing = outgoing || f.expired; + if (f.expired) { + this.remove(f.id); + } else if (!files.find(x => x.id === f.id)) { + outgoing = true; + } + } + return { + incoming, + outgoing, + downloadCount + }; + } + + setDownloadToken(id, token) { + let otherTokens = {}; + try { + otherTokens = JSON.parse(this.get('dlTokens')); + } catch (e) { + // + } + if (token) { + const record = { token, ts: Date.now() }; + this.set('dlTokens', JSON.stringify({ ...otherTokens, [id]: record })); + } else { + this.set('dlTokens', JSON.stringify({ ...otherTokens, [id]: undefined })); + } + } + + getDownloadToken(id) { + try { + return JSON.parse(this.get('dlTokens'))[id].token; + } catch (e) { + return undefined; + } + } + + pruneTokens() { + try { + const now = Date.now(); + const tokens = JSON.parse(this.get('dlTokens')); + const keep = {}; + for (const id of Object.keys(tokens)) { + const t = tokens[id]; + if (t.ts > now - 7 * 86400 * 1000) { + keep[id] = t; + } + } + if (Object.keys(keep).length < Object.keys(tokens).length) { + this.set('dlTokens', JSON.stringify(keep)); + } + } catch (e) { + console.error(e); + } + } } export default new Storage(); diff --git a/app/streams.js b/app/streams.js new file mode 100644 index 000000000..00159a24d --- /dev/null +++ b/app/streams.js @@ -0,0 +1,103 @@ +/* global TransformStream */ + +export function transformStream(readable, transformer, oncancel) { + try { + return readable.pipeThrough(new TransformStream(transformer)); + } catch (e) { + const reader = readable.getReader(); + return new ReadableStream({ + start(controller) { + if (transformer.start) { + return transformer.start(controller); + } + }, + async pull(controller) { + let enqueued = false; + const wrappedController = { + enqueue(d) { + enqueued = true; + controller.enqueue(d); + } + }; + while (!enqueued) { + const data = await reader.read(); + if (data.done) { + if (transformer.flush) { + await transformer.flush(controller); + } + return controller.close(); + } + await transformer.transform(data.value, wrappedController); + } + }, + cancel(reason) { + readable.cancel(reason); + if (oncancel) { + oncancel(reason); + } + } + }); + } +} + +class BlobStreamController { + constructor(blob, size) { + this.blob = blob; + this.index = 0; + this.chunkSize = size || 1024 * 64; + } + + pull(controller) { + return new Promise((resolve, reject) => { + const bytesLeft = this.blob.size - this.index; + if (bytesLeft <= 0) { + controller.close(); + return resolve(); + } + const size = Math.min(this.chunkSize, bytesLeft); + const slice = this.blob.slice(this.index, this.index + size); + const reader = new FileReader(); + reader.onload = () => { + controller.enqueue(new Uint8Array(reader.result)); + resolve(); + }; + reader.onerror = reject; + reader.readAsArrayBuffer(slice); + this.index += size; + }); + } +} + +export function blobStream(blob, size) { + return new ReadableStream(new BlobStreamController(blob, size)); +} + +class ConcatStreamController { + constructor(streams) { + this.streams = streams; + this.index = 0; + this.reader = null; + this.nextReader(); + } + + nextReader() { + const next = this.streams[this.index++]; + this.reader = next && next.getReader(); + } + + async pull(controller) { + if (!this.reader) { + return controller.close(); + } + const data = await this.reader.read(); + if (data.done) { + this.nextReader(); + return this.pull(controller); + } + controller.enqueue(data.value); + } +} + +export function concatStream(streams) { + return new ReadableStream(new ConcatStreamController(streams)); +} diff --git a/app/templates/downloadButton.js b/app/templates/downloadButton.js deleted file mode 100644 index be01333f2..000000000 --- a/app/templates/downloadButton.js +++ /dev/null @@ -1,16 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(state, emit) { - function download(event) { - event.preventDefault(); - emit('download', state.fileInfo); - } - - return html` -
- -
`; -}; diff --git a/app/templates/downloadPassword.js b/app/templates/downloadPassword.js deleted file mode 100644 index 6b9a7cad6..000000000 --- a/app/templates/downloadPassword.js +++ /dev/null @@ -1,59 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(state, emit) { - const fileInfo = state.fileInfo; - const label = - fileInfo.password === null - ? html` - ` - : html` - `; - const div = html` -
- ${label} -
- - -
-
`; - - function inputChanged() { - const input = document.getElementById('unlock-input'); - const btn = document.getElementById('unlock-btn'); - if (input.value.length > 0) { - btn.classList.remove('btn-hidden'); - input.classList.remove('input-no-btn'); - } else { - btn.classList.add('btn-hidden'); - input.classList.add('input-no-btn'); - } - } - - function checkPassword(event) { - event.preventDefault(); - const password = document.getElementById('unlock-input').value; - if (password.length > 0) { - document.getElementById('unlock-btn').disabled = true; - state.fileInfo.url = window.location.href; - state.fileInfo.password = password; - emit('getMetadata'); - } - return false; - } - - return div; -}; diff --git a/app/templates/file.js b/app/templates/file.js deleted file mode 100644 index 573302eb4..000000000 --- a/app/templates/file.js +++ /dev/null @@ -1,99 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -function timeLeft(milliseconds, state) { - const minutes = Math.floor(milliseconds / 1000 / 60); - const hours = Math.floor(minutes / 60); - if (hours >= 1) { - return state.translate('expiresHoursMinutes', { - hours, - minutes: minutes % 60 - }); - } else if (hours === 0) { - if (minutes === 0) { - return state.translate('expiresMinutes', { minutes: '< 1' }); - } - return state.translate('expiresMinutes', { minutes }); - } - return null; -} - -module.exports = function(file, state, emit) { - const ttl = file.expiresAt - Date.now(); - const remainingTime = - timeLeft(ttl, state) || state.translate('linkExpiredAlt'); - const downloadLimit = file.dlimit || 1; - const totalDownloads = file.dtotal || 0; - const row = html` - - - ${file.name} - - - - - - ${remainingTime} - ${totalDownloads} / ${downloadLimit} - - - - - - `; - - function copyClick(e) { - emit('copy', { url: file.url, location: 'upload-list' }); - const icon = e.target; - const text = e.target.nextSibling; - icon.hidden = true; - text.hidden = false; - setTimeout(() => { - icon.hidden = false; - text.hidden = true; - }, 500); - } - - function showPopup() { - const tr = document.getElementById(file.id); - const popup = tr.querySelector('.popuptext'); - popup.classList.add('show'); - popup.focus(); - } - - function cancel(e) { - e.stopPropagation(); - const tr = document.getElementById(file.id); - const popup = tr.querySelector('.popuptext'); - popup.classList.remove('show'); - } - - function deleteFile() { - emit('delete', { file, location: 'upload-list' }); - emit('render'); - } - - return row; -}; diff --git a/app/templates/fileList.js b/app/templates/fileList.js deleted file mode 100644 index ece4ebcf7..000000000 --- a/app/templates/fileList.js +++ /dev/null @@ -1,37 +0,0 @@ -const html = require('choo/html'); -const file = require('./file'); - -module.exports = function(state, emit) { - let table = ''; - if (state.storage.files.length) { - table = html` - - - - - - - - - - - - ${state.storage.files.map(f => file(f, state, emit))} - -
${state.translate('uploadedFile')} - ${state.translate('copyFileList')} - - ${state.translate('timeFileList')} - - ${state.translate('downloadsFileList')} - - ${state.translate('deleteFileList')} -
- `; - } - return html` -
- ${table} -
- `; -}; diff --git a/app/templates/footer.js b/app/templates/footer.js deleted file mode 100644 index a2dfe2767..000000000 --- a/app/templates/footer.js +++ /dev/null @@ -1,43 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state) { - return html``; -}; diff --git a/app/templates/fxPromo.js b/app/templates/fxPromo.js deleted file mode 100644 index 611b277a9..000000000 --- a/app/templates/fxPromo.js +++ /dev/null @@ -1,33 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); - -module.exports = function(state, emit) { - function clicked() { - emit('experiment', { cd3: 'promo' }); - } - let classes = 'banner'; - switch (state.promo) { - case 'blue': - classes = 'banner banner-blue'; - break; - case 'pink': - classes = 'banner banner-pink'; - break; - } - - return html` -
-
- Firefox - Send is brought to you by the all-new Firefox. - Download Firefox now ≫ -
-
`; -}; diff --git a/app/templates/header.js b/app/templates/header.js deleted file mode 100644 index 761b8188f..000000000 --- a/app/templates/header.js +++ /dev/null @@ -1,59 +0,0 @@ -const html = require('choo/html'); -const assets = require('../../common/assets'); -/* - The current weback config uses package.json to generate - version.json for /__version__ meaning `require` returns the - string 'version.json' in the frontend context but the json - on the server. - - We want `version` to be constant at build time so this file - has a custom loader (/build/version_loader.js) just to replace - string with the value from package.json. 🤢 -*/ -const version = require('../../package.json').version || 'VERSION'; - -function browserName() { - try { - if (/firefox/i.test(navigator.userAgent)) { - return 'firefox'; - } - if (/edge/i.test(navigator.userAgent)) { - return 'edge'; - } - if (/trident/i.test(navigator.userAgent)) { - return 'ie'; - } - if (/chrome/i.test(navigator.userAgent)) { - return 'chrome'; - } - if (/safari/i.test(navigator.userAgent)) { - return 'safari'; - } - return 'other'; - } catch (e) { - return 'unknown'; - } -} - -const browser = browserName(); - -module.exports = function(state) { - return html`
- - -
`; -}; diff --git a/app/templates/progress.js b/app/templates/progress.js deleted file mode 100644 index fe0cf6b73..000000000 --- a/app/templates/progress.js +++ /dev/null @@ -1,41 +0,0 @@ -const html = require('choo/html'); - -const radius = 73; -const oRadius = radius + 10; -const oDiameter = oRadius * 2; -const circumference = 2 * Math.PI * radius; - -module.exports = function(progressRatio) { - const dashOffset = (1 - progressRatio) * circumference; - const percent = Math.floor(progressRatio * 100); - const div = html` -
- - - - - ${percent} - % - - -
- `; - return div; -}; diff --git a/app/templates/selectbox.js b/app/templates/selectbox.js deleted file mode 100644 index be42da337..000000000 --- a/app/templates/selectbox.js +++ /dev/null @@ -1,54 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(selected, options, translate, changed) { - const id = `select-${Math.random()}`; - let x = selected; - - function close() { - const ul = document.getElementById(id); - const body = document.querySelector('body'); - ul.classList.remove('active'); - body.removeEventListener('click', close); - } - - function toggle(event) { - event.stopPropagation(); - const ul = document.getElementById(id); - if (ul.classList.contains('active')) { - close(); - } else { - ul.classList.add('active'); - const body = document.querySelector('body'); - body.addEventListener('click', close); - } - } - - function choose(event) { - event.stopPropagation(); - const target = event.target; - const value = +target.dataset.value; - target.parentNode.previousSibling.firstElementChild.textContent = translate( - value - ); - if (x !== value) { - x = value; - changed(value); - } - close(); - } - return html` -
-
- ${translate(selected)} - - - -
-
    - ${options.map( - i => - html`
  • ${i}
  • ` - )} -
-
`; -}; diff --git a/app/templates/uploadPasswordSet.js b/app/templates/uploadPasswordSet.js deleted file mode 100644 index acff383eb..000000000 --- a/app/templates/uploadPasswordSet.js +++ /dev/null @@ -1,80 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(state, emit) { - const file = state.storage.getFileById(state.params.id); - - return html`
- ${passwordSpan(file.password)} - - -
`; - - function passwordSpan(password) { - password = password || '●●●●●'; - const span = html([ - `${state.translate('passwordResult', { - password: - '
'
-      })}
` - ]); - const og = span.querySelector('.passwordOriginal'); - const masked = span.querySelector('.passwordMask'); - og.textContent = password; - masked.textContent = password.replace(/./g, '●'); - return span; - } - - function inputChanged() { - const resetInput = document.getElementById('unlock-reset-input'); - const resetBtn = document.getElementById('unlock-reset-btn'); - if (resetInput.value.length > 0) { - resetBtn.classList.remove('btn-hidden'); - resetInput.classList.remove('input-no-btn'); - } else { - resetBtn.classList.add('btn-hidden'); - resetInput.classList.add('input-no-btn'); - } - } - - function resetPassword(event) { - event.preventDefault(); - const password = document.querySelector('#unlock-reset-input').value; - if (password.length > 0) { - document.getElementById('copy').classList.remove('wait-password'); - document.getElementById('copy-btn').disabled = false; - emit('password', { password, file }); - } - return false; - } - - function toggleResetInput(event) { - const form = event.target.parentElement.querySelector('form'); - const input = document.getElementById('unlock-reset-input'); - if (form.style.visibility === 'hidden' || form.style.visibility === '') { - form.style.visibility = 'visible'; - input.focus(); - } else { - form.style.visibility = 'hidden'; - } - inputChanged(); - } -}; diff --git a/app/templates/uploadPasswordUnset.js b/app/templates/uploadPasswordUnset.js deleted file mode 100644 index 398948dfe..000000000 --- a/app/templates/uploadPasswordUnset.js +++ /dev/null @@ -1,70 +0,0 @@ -const html = require('choo/html'); - -module.exports = function(state, emit) { - const file = state.storage.getFileById(state.params.id); - const div = html` -
-
- - -
- -
`; - - function inputChanged() { - const input = document.getElementById('unlock-input'); - const btn = document.getElementById('unlock-btn'); - if (input.value.length > 0) { - btn.classList.remove('btn-hidden'); - input.classList.remove('input-no-btn'); - } else { - btn.classList.add('btn-hidden'); - input.classList.add('input-no-btn'); - } - } - - function togglePasswordInput(e) { - const unlockInput = document.getElementById('unlock-input'); - const boxChecked = e.target.checked; - document - .querySelector('.setPassword') - .classList.toggle('hidden', !boxChecked); - if (boxChecked) { - unlockInput.focus(); - } else { - unlockInput.value = ''; - } - inputChanged(); - } - - function setPassword(event) { - event.preventDefault(); - const password = document.getElementById('unlock-input').value; - if (password.length > 0) { - document.getElementById('copy').classList.remove('wait-password'); - document.getElementById('copy-btn').disabled = false; - emit('password', { password, file }); - } - return false; - } - - return div; -}; diff --git a/app/ui/account.js b/app/ui/account.js new file mode 100644 index 000000000..7f6430ec2 --- /dev/null +++ b/app/ui/account.js @@ -0,0 +1,111 @@ +const html = require('choo/html'); +const Component = require('choo/component'); + +class Account extends Component { + constructor(name, state, emit) { + super(name); + this.state = state; + this.emit = emit; + this.enabled = state.capabilities.account; + this.local = state.components[name] = {}; + this.buttonClass = ''; + this.setLocal(); + } + + avatarClick(event) { + event.preventDefault(); + const menu = document.getElementById('accountMenu'); + menu.classList.toggle('invisible'); + menu.focus(); + } + + hideMenu(event) { + event.stopPropagation(); + const menu = document.getElementById('accountMenu'); + menu.classList.add('invisible'); + } + + login(event) { + event.preventDefault(); + this.emit('signup-cta', 'button'); + } + + logout(event) { + event.preventDefault(); + this.emit('logout'); + } + + changed() { + return this.local.loggedIn !== this.state.user.loggedIn; + } + + setLocal() { + const changed = this.changed(); + if (changed) { + this.local.loggedIn = this.state.user.loggedIn; + } + return changed; + } + + update() { + return this.setLocal(); + } + + createElement() { + if (!this.enabled) { + return html` + + `; + } + const user = this.state.user; + const translate = this.state.translate; + this.setLocal(); + if (user.loginRequired && !this.local.loggedIn) { + return html` + + `; + } + if (!this.local.loggedIn) { + return html` + + + + `; + } + return html` + + + + + `; + } +} + +module.exports = Account; diff --git a/app/ui/archiveTile.js b/app/ui/archiveTile.js new file mode 100644 index 000000000..40672f95b --- /dev/null +++ b/app/ui/archiveTile.js @@ -0,0 +1,590 @@ +/* global Android */ + +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const assets = require('../../common/assets'); +const { + bytes, + copyToClipboard, + list, + percent, + platform, + timeLeft +} = require('../utils'); +const expiryOptions = require('./expiryOptions'); + +function expiryInfo(translate, archive) { + const l10n = timeLeft(archive.expiresAt - Date.now()); + return raw( + translate('archiveExpiryInfo', { + downloadCount: translate('downloadCount', { + num: archive.dlimit - archive.dtotal + }), + timespan: translate(l10n.id, l10n) + }) + ); +} + +function password(state) { + const MAX_LENGTH = 32; + + return html` +
+ +
+ + +
+ + +
+ `; + + function togglePasswordInput(event) { + event.stopPropagation(); + const checked = event.target.checked; + const input = document.getElementById('password-input'); + if (checked) { + input.classList.remove('invisible'); + input.focus(); + } else { + input.classList.add('invisible'); + input.value = ''; + document.getElementById('password-msg').textContent = ''; + state.archive.password = null; + } + } + + function inputChanged() { + const passwordInput = document.getElementById('password-input'); + const pwdmsg = document.getElementById('password-msg'); + const password = passwordInput.value; + const length = password.length; + + if (length === MAX_LENGTH) { + pwdmsg.textContent = state.translate('maxPasswordLength', { + length: MAX_LENGTH + }); + } else { + pwdmsg.textContent = ''; + } + state.archive.password = password; + } + + function focused(event) { + event.preventDefault(); + const el = document.getElementById('password-input'); + if (el.placeholder !== state.translate('unlockInputPlaceholder')) { + el.placeholder = ''; + } + } +} + +function fileInfo(file, action) { + return html` + + + + +

+

${file.name}

+
${bytes( + file.size + )}
+

+ ${action} +
`; +} + +function archiveInfo(archive, action) { + return html` +

+ + + +

+

${archive.name}

+
${bytes( + archive.size + )}
+

+ ${action} +

`; +} + +function archiveDetails(translate, archive) { + if (archive.manifest.files.length > 1) { + return html` +
+ + + + + ${translate('fileCount', { + num: archive.manifest.files.length + })} + + ${list(archive.manifest.files.map(f => fileInfo(f)))} +
+ `; + } + function toggled(event) { + event.stopPropagation(); + archive.open = event.target.open; + } +} + +module.exports = function(state, emit, archive) { + const copyOrShare = + state.capabilities.share || platform() === 'android' + ? html` + + ` + : html` + + `; + const dl = + platform() === 'web' + ? html` + + + + + ${state.translate('downloadButtonLabel')} + + ` + : html` +
+ `; + return html` + + ${archiveInfo( + archive, + html` + + ` + )} +
+ ${expiryInfo(state.translate, archive)} +
+ ${archiveDetails(state.translate, archive)} +
+
+ ${dl} ${copyOrShare} +
+
+ `; + + function copy(event) { + event.stopPropagation(); + copyToClipboard(archive.url); + const text = event.target.lastChild; + text.textContent = state.translate('copiedUrl'); + setTimeout( + () => (text.textContent = state.translate('copyLinkButton')), + 1000 + ); + } + + function del(event) { + event.stopPropagation(); + emit('delete', archive); + } + + async function share(event) { + event.stopPropagation(); + if (platform() === 'android') { + Android.shareUrl(archive.url); + } else { + try { + await navigator.share({ + title: state.translate('-send-brand'), + text: `Download "${archive.name}" with Firefox Send: simple, safe file sharing`, + //state.translate('shareMessage', { name }), + url: archive.url + }); + } catch (e) { + // ignore + } + } + } +}; + +module.exports.wip = function(state, emit) { + return html` + + ${list( + Array.from(state.archive.files) + .reverse() + .map(f => + fileInfo(f, remove(f, state.translate('deleteButtonHover'))) + ), + 'flex-shrink bg-grey-10 rounded-t overflow-y-auto px-6 py-4 md:h-full md:max-h-half-screen dark:bg-black', + 'bg-white px-2 my-2 shadow-light rounded dark:bg-grey-90 dark:border dark:border-grey-80' + )} +
+ +
+ +
+ ${state.translate('totalSize', { + size: bytes(state.archive.size) + })} +
+
+
+ ${expiryOptions(state, emit)} ${password(state, emit)} + +
+ `; + + function focus(event) { + event.target.nextElementSibling.firstElementChild.classList.add('outline'); + } + + function blur(event) { + event.target.nextElementSibling.firstElementChild.classList.remove( + 'outline' + ); + } + + function upload(event) { + window.scrollTo(0, 0); + event.preventDefault(); + event.target.disabled = true; + if (!state.uploading) { + emit('upload'); + } + } + + function add(event) { + event.preventDefault(); + const newFiles = Array.from(event.target.files); + + emit('addFiles', { files: newFiles }); + setTimeout(() => { + document + .querySelector('#wip > ul > li:first-child') + .scrollIntoView({ block: 'center' }); + }); + } + + function remove(file, desc) { + return html` + + `; + function del(event) { + event.stopPropagation(); + emit('removeUpload', file); + } + } +}; + +module.exports.uploading = function(state, emit) { + const progress = state.transfer.progressRatio; + const progressPercent = percent(progress); + const archive = state.archive; + return html` + + ${archiveInfo(archive)} +
+ ${expiryInfo(state.translate, { + dlimit: state.archive.dlimit, + dtotal: 0, + expiresAt: Date.now() + 500 + state.archive.timeLimit * 1000 + })} +
+ + ${progressPercent} + +
+ `; + + function cancel(event) { + event.stopPropagation(); + event.target.disabled = true; + emit('cancel'); + } +}; + +module.exports.empty = function(state, emit) { + const upsell = + state.user.loggedIn || !state.capabilities.account + ? '' + : html` + + `; + return html` + + + + +
+ ${state.translate('dragAndDropFiles')} +
+
+ ${state.translate('orClickWithSize', { + size: bytes(state.user.maxSize) + })} +
+ + +

+ ${state.translate('trustWarningMessage')} +

+ ${upsell} +
+ `; + + function focus(event) { + event.target.nextElementSibling.classList.add('bg-blue-70', 'outline'); + } + + function blur(event) { + event.target.nextElementSibling.classList.remove('bg-blue-70', 'outline'); + } + + function add(event) { + event.preventDefault(); + const newFiles = Array.from(event.target.files); + + emit('addFiles', { files: newFiles }); + } +}; + +module.exports.preview = function(state, emit) { + const archive = state.fileInfo; + if (archive.open === undefined) { + archive.open = true; + } + const single = archive.manifest.files.length === 1; + const details = single + ? '' + : html` +
+ ${archiveDetails(state.translate, archive)} +
+ `; + return html` + +
+ ${archiveInfo(archive)} ${details} +
+
+ + +
+ +
+ `; + + function toggleDownloadEnabled(event) { + event.stopPropagation(); + const checked = event.target.checked; + const btn = document.getElementById('download-btn'); + btn.disabled = !checked; + } + + function download(event) { + event.preventDefault(); + event.target.disabled = true; + emit('download', archive); + } +}; + +module.exports.downloading = function(state) { + const archive = state.fileInfo; + const progress = state.transfer.progressRatio; + const progressPercent = percent(progress); + return html` + + ${archiveInfo(archive)} + + ${progressPercent} + + `; +}; diff --git a/app/ui/blank.js b/app/ui/blank.js new file mode 100644 index 000000000..d34f94e30 --- /dev/null +++ b/app/ui/blank.js @@ -0,0 +1,14 @@ +const html = require('choo/html'); + +module.exports = function() { + return html` +
+
+
+
+
+
+ `; +}; diff --git a/app/ui/body.js b/app/ui/body.js new file mode 100644 index 000000000..b717a9b16 --- /dev/null +++ b/app/ui/body.js @@ -0,0 +1,21 @@ +const html = require('choo/html'); +const Header = require('./header'); +const Footer = require('./footer'); + +module.exports = function body(main) { + return function(state, emit) { + const b = html` + + ${state.cache(Header, 'header').render()} ${main(state, emit)} + ${state.cache(Footer, 'footer').render()} + + `; + if (state.layout) { + // server side only + return state.layout(state, b); + } + return b; + }; +}; diff --git a/app/ui/copyDialog.js b/app/ui/copyDialog.js new file mode 100644 index 000000000..40d714e31 --- /dev/null +++ b/app/ui/copyDialog.js @@ -0,0 +1,50 @@ +const html = require('choo/html'); +const { copyToClipboard } = require('../utils'); + +module.exports = function(name, url) { + const dialog = function(state, emit, close) { + return html` + +

+ ${state.translate('notifyUploadEncryptDone')} +

+

+ ${state.translate('copyLinkDescription')}
+ ${name} +

+ + + +
+ `; + + function copy(event) { + event.stopPropagation(); + copyToClipboard(url); + event.target.textContent = state.translate('copiedUrl'); + setTimeout(close, 1000); + } + }; + dialog.type = 'copy'; + return dialog; +}; diff --git a/app/ui/download.js b/app/ui/download.js new file mode 100644 index 000000000..8abaa1f7a --- /dev/null +++ b/app/ui/download.js @@ -0,0 +1,130 @@ +/* global downloadMetadata */ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const archiveTile = require('./archiveTile'); +const modal = require('./modal'); +const noStreams = require('./noStreams'); +const notFound = require('./notFound'); +const downloadPassword = require('./downloadPassword'); +const downloadCompleted = require('./downloadCompleted'); +const BIG_SIZE = 1024 * 1024 * 256; + +function createFileInfo(state) { + return { + id: state.params.id, + secretKey: state.params.key, + nonce: downloadMetadata.nonce, + requiresPassword: downloadMetadata.pwd + }; +} + +function downloading(state, emit) { + return html` +
+

+ ${state.translate('downloadingTitle')} +

+ ${archiveTile.downloading(state, emit)} +
+ `; +} + +function preview(state, emit) { + if (state.fileInfo.flagged) { + return html` +
+

${state.translate('downloadFlagged')}

+
+ `; + } + if (!state.capabilities.streamDownload && state.fileInfo.size > BIG_SIZE) { + return noStreams(state, emit); + } + return html` +
+
+

+ ${state.translate('downloadTitle')} +

+

+ ${state.translate('downloadDescription')} +

+

+ ${state.translate('downloadConfirmDescription')} +

+ +
+ +
+ `; +} + +module.exports = function(state, emit) { + let content = ''; + if (!state.fileInfo) { + state.fileInfo = createFileInfo(state); + if (downloadMetadata.status === 404) { + return notFound(state); + } + if (!state.fileInfo.nonce) { + // coming from something like the browser back button + return location.reload(); + } + } + + if (state.fileInfo.dead) { + return notFound(state); + } + + if (!state.transfer && !state.fileInfo.requiresPassword) { + emit('getMetadata'); + } + + if (state.transfer) { + switch (state.transfer.state) { + case 'downloading': + case 'decrypting': + content = downloading(state, emit); + break; + case 'complete': + content = downloadCompleted(state); + break; + default: + content = preview(state, emit); + } + } else if (state.fileInfo.requiresPassword && !state.fileInfo.password) { + content = downloadPassword(state, emit); + } + return html` +
+ ${state.modal && modal(state, emit)} +
+ ${content} +
+
+ `; +}; diff --git a/app/ui/downloadCompleted.js b/app/ui/downloadCompleted.js new file mode 100644 index 000000000..22fd7ba44 --- /dev/null +++ b/app/ui/downloadCompleted.js @@ -0,0 +1,33 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +module.exports = function(state) { + const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; + return html` +
+

+ ${state.translate('downloadFinish')} +

+ +

+ ${state.translate('trySendDescription')} +

+

+ ${state.translate(btnText)} +

+

+ ${state.translate('reportFile')} +

+
+ `; +}; diff --git a/app/ui/downloadDialog.js b/app/ui/downloadDialog.js new file mode 100644 index 000000000..cd0722228 --- /dev/null +++ b/app/ui/downloadDialog.js @@ -0,0 +1,58 @@ +const html = require('choo/html'); + +module.exports = function() { + return function(state, emit, close) { + const archive = state.fileInfo; + return html` + +

+ ${state.translate('downloadConfirmTitle')} +

+

+ ${state.translate('downloadConfirmDescription')} +

+
+ + +
+ + ${state.translate('reportFile')} +
+ `; + + function toggleDownloadEnabled(event) { + event.stopPropagation(); + const checked = event.target.checked; + const btn = document.getElementById('download-btn'); + btn.disabled = !checked; + } + + function download(event) { + event.preventDefault(); + close(); + event.target.disabled = true; + emit('download', archive); + } + }; +}; diff --git a/app/ui/downloadPassword.js b/app/ui/downloadPassword.js new file mode 100644 index 000000000..86c98fd9b --- /dev/null +++ b/app/ui/downloadPassword.js @@ -0,0 +1,98 @@ +const html = require('choo/html'); + +module.exports = function(state, emit) { + const fileInfo = state.fileInfo; + const invalid = fileInfo.password === null; + + const div = html` +
+

+ ${state.translate('downloadTitle')} +

+

+ ${state.translate('downloadDescription')} +

+
+ + + +
+ +
+ `; + + if (!(div instanceof String)) { + setTimeout(() => document.getElementById('password-input').focus()); + } + + function inputChanged(event) { + event.stopPropagation(); + event.preventDefault(); + const label = document.getElementById('password-error'); + const input = document.getElementById('password-input'); + const btn = document.getElementById('password-btn'); + label.classList.add('invisible'); + input.classList.remove('border-red', 'dark:border-red-40'); + btn.classList.remove( + 'bg-red', + 'hover:bg-red', + 'focus:bg-red', + 'dark:bg-red-40' + ); + } + + function checkPassword(event) { + event.stopPropagation(); + event.preventDefault(); + const el = document.getElementById('password-input'); + const password = el.value; + if (password.length > 0) { + document.getElementById('password-btn').disabled = true; + // Strip any url parameters between fileId and secretKey + const fileInfoUrl = window.location.href.replace(/\?.+#/, '#'); + state.fileInfo.url = fileInfoUrl; + state.fileInfo.password = password; + emit('getMetadata'); + } + return false; + } + + return div; +}; diff --git a/app/ui/error.js b/app/ui/error.js new file mode 100644 index 000000000..1996c8417 --- /dev/null +++ b/app/ui/error.js @@ -0,0 +1,33 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const modal = require('./modal'); + +module.exports = function(state, emit) { + const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; + return html` +
+ ${state.modal && modal(state, emit)} +
+

+ ${state.translate('errorPageHeader')} +

+ +

+ ${state.translate('trySendDescription')} +

+

+ ${state.translate(btnText)} +

+
+
+ `; +}; diff --git a/app/ui/expiryOptions.js b/app/ui/expiryOptions.js new file mode 100644 index 000000000..494093f45 --- /dev/null +++ b/app/ui/expiryOptions.js @@ -0,0 +1,75 @@ +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const { secondsToL10nId } = require('../utils'); +const selectbox = require('./selectbox'); + +module.exports = function(state, emit) { + const el = html` +
+ ${raw( + state.translate('archiveExpiryInfo', { + downloadCount: + '', + timespan: '' + }) + )} +
+ `; + if (el.__encoded) { + // we're rendering on the server + return el; + } + + const counts = state.DEFAULTS.DOWNLOAD_COUNTS.filter( + i => state.capabilities.account || i <= state.user.maxDownloads + ); + + const dlCountSelect = el.querySelector('#dlCount'); + el.replaceChild( + selectbox( + state.archive.dlimit, + counts, + num => state.translate('downloadCount', { num }), + value => { + const max = state.user.maxDownloads; + state.archive.dlimit = Math.min(value, max); + if (value > max) { + emit('signup-cta', 'count'); + } else { + emit('render'); + } + }, + 'expire-after-dl-count-select' + ), + dlCountSelect + ); + + const expires = state.DEFAULTS.EXPIRE_TIMES_SECONDS.filter( + i => state.capabilities.account || i <= state.user.maxExpireSeconds + ); + + const timeSelect = el.querySelector('#timespan'); + el.replaceChild( + selectbox( + state.archive.timeLimit, + expires, + num => { + const l10n = secondsToL10nId(num); + return state.translate(l10n.id, l10n); + }, + value => { + const max = state.user.maxExpireSeconds; + state.archive.timeLimit = Math.min(value, max); + if (value > max) { + emit('signup-cta', 'time'); + } else { + emit('render'); + } + }, + 'expire-after-time-select' + ), + timeSelect + ); + + return el; +}; diff --git a/app/ui/footer.js b/app/ui/footer.js new file mode 100644 index 000000000..37b59ff3f --- /dev/null +++ b/app/ui/footer.js @@ -0,0 +1,23 @@ +const html = require('choo/html'); +const Component = require('choo/component'); + +class Footer extends Component { + constructor(name, state) { + super(name); + this.state = state; + } + + update() { + return false; + } + + createElement() { + return html` +
+ `; + } +} + +module.exports = Footer; diff --git a/app/ui/header.js b/app/ui/header.js new file mode 100644 index 000000000..4ab380336 --- /dev/null +++ b/app/ui/header.js @@ -0,0 +1,51 @@ +const html = require('choo/html'); +const Component = require('choo/component'); +const Account = require('./account'); +const assets = require('../../common/assets'); +const { platform } = require('../utils'); + +class Header extends Component { + constructor(name, state, emit) { + super(name); + this.state = state; + this.emit = emit; + this.account = state.cache(Account, 'account'); + } + + update() { + this.account.render(); + return false; + } + createElement() { + const title = + platform() === 'android' + ? html` + + + + + + + ` + : html` + + ${this.state.translate('title')} + + + + + `; + return html` +
+ ${title} ${this.account.render()} +
+ `; + } +} + +module.exports = Header; diff --git a/app/ui/home.js b/app/ui/home.js new file mode 100644 index 000000000..aa12bedc1 --- /dev/null +++ b/app/ui/home.js @@ -0,0 +1,39 @@ +const html = require('choo/html'); +const { list } = require('../utils'); +const archiveTile = require('./archiveTile'); +const modal = require('./modal'); +const intro = require('./intro'); + +module.exports = function(state, emit) { + if (state.user.loginRequired && !state.user.loggedIn) { + emit('signup-cta', 'required'); + } + const archives = state.storage.files + .filter(archive => !archive.expired) + .map(archive => archiveTile(state, emit, archive)); + let left = ''; + if (state.uploading) { + left = archiveTile.uploading(state, emit); + } else if (state.archive.numFiles > 0) { + left = archiveTile.wip(state, emit); + } else { + left = archiveTile.empty(state, emit); + } + archives.reverse(); + const right = + archives.length === 0 + ? intro(state) + : list(archives, 'p-2 h-full overflow-y-auto w-full', 'mb-4 w-full'); + + return html` +
+ ${state.modal && modal(state, emit)} +
+
${left}
+
${right}
+
+
+ `; +}; diff --git a/app/ui/intro.js b/app/ui/intro.js new file mode 100644 index 000000000..7b69f2f6d --- /dev/null +++ b/app/ui/intro.js @@ -0,0 +1,20 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +module.exports = function intro(state) { + return html` + +
+

+ ${state.translate('introTitle')} +

+

+ ${state.translate('introDescription')} +

+ +
+
+ `; +}; diff --git a/app/ui/modal.js b/app/ui/modal.js new file mode 100644 index 000000000..3636af8a9 --- /dev/null +++ b/app/ui/modal.js @@ -0,0 +1,25 @@ +const html = require('choo/html'); + +module.exports = function(state, emit) { + return html` + +
+
+ ${state.modal(state, emit, close)} +
+
+
+ `; + + function close(event) { + if (event) { + event.preventDefault(); + event.stopPropagation(); + } + emit('closeModal'); + } +}; diff --git a/app/ui/noStreams.js b/app/ui/noStreams.js new file mode 100644 index 000000000..52cb7d052 --- /dev/null +++ b/app/ui/noStreams.js @@ -0,0 +1,108 @@ +const html = require('choo/html'); +const { bytes } = require('../utils'); +const assets = require('../../common/assets'); + +module.exports = function(state, emit) { + const archive = state.fileInfo; + return html` +
+

${state.translate( + 'downloadTitle' + )}

+

+ ⚠️ ${state.translate('noStreamsWarning')} ⚠️ +

+
+
+
+ + + +

+

${ + archive.name + }

+
${bytes( + archive.size + )}
+

+
+
+ + +
+
+ + +
+
+ + +
+
+ +

+ ${state.translate('downloadConfirmDescription')} +

+
+
+ `; + + function optionChanged(event) { + event.stopPropagation(); + const choice = event.target.value; + const button = event.currentTarget.nextElementSibling; + let title = button.title; + console.error(choice, title); + switch (choice) { + case 'copy': + title = state.translate('copyLinkButton'); + break; + case 'firefox': + title = state.translate('downloadFirefox'); + break; + case 'download': + title = state.translate('downloadButtonLabel'); + break; + } + button.title = title; + button.value = title; + } + + function submit(event) { + const action = document.querySelector('input[type="radio"]:checked').value; + switch (action) { + case 'copy': + emit('copy', { url: window.location.href }); + document.querySelector('input[type="submit"]').value = state.translate( + 'copiedUrl' + ); + break; + case 'firefox': + window.open( + 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com' + ); + break; + case 'download': + emit('download', archive); + break; + } + return false; + } +}; diff --git a/app/ui/notFound.js b/app/ui/notFound.js new file mode 100644 index 000000000..ad70bb5d4 --- /dev/null +++ b/app/ui/notFound.js @@ -0,0 +1,38 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const modal = require('./modal'); + +module.exports = function(state, emit) { + const btnText = state.user.loggedIn ? 'okButton' : 'sendYourFilesLink'; + return html` +
+ ${state.modal && modal(state, emit)} +
+

+ ${state.translate('expiredTitle')} +

+ +

+ ${state.translate('trySendDescription')} +

+

+ ${state.translate(btnText)} +

+

+ ${state.translate('reportFile')} +

+
+
+ `; +}; diff --git a/app/ui/okDialog.js b/app/ui/okDialog.js new file mode 100644 index 000000000..cb8c3c6aa --- /dev/null +++ b/app/ui/okDialog.js @@ -0,0 +1,20 @@ +const html = require('choo/html'); + +module.exports = function(message) { + return function(state, emit, close) { + return html` + +

+ ${message} +

+ +
+ `; + }; +}; diff --git a/app/ui/report.js b/app/ui/report.js new file mode 100644 index 000000000..2fce5d48f --- /dev/null +++ b/app/ui/report.js @@ -0,0 +1,115 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); + +const REPORTABLES = ['Malware', 'Pii', 'Abuse']; + +module.exports = function(state, emit) { + let submitting = false; + const file = state.fileInfo; + if (!file) { + return html` +
+
+

+ ${state.translate('reportUnknownDescription')} +

+
+
+ `; + } + if (file.reported) { + return html` +
+
+

+ ${state.translate('reportedTitle')} +

+

+ ${state.translate('reportedDescription')} +

+ +

+ ${state.translate('okButton')} +

+
+
+ `; + } + return html` +
+
+
+

+ ${state.translate('reportFile')} +

+

+ ${state.translate('reportDescription')} +

+
+
+
    + ${REPORTABLES.map( + reportable => + html` +
  • + +
  • + ` + )} +
+
+ +
+
+
+
+ `; + + function optionChanged(event) { + event.stopPropagation(); + const button = event.currentTarget.nextElementSibling; + button.disabled = false; + } + + function report(event) { + event.stopPropagation(); + event.preventDefault(); + if (submitting) { + return; + } + submitting = true; + state.fileInfo.reported = true; + const form = event.target; + emit('report', { reason: form.reason.value }); + } +}; diff --git a/app/ui/selectbox.js b/app/ui/selectbox.js new file mode 100644 index 000000000..cf1d1a4f9 --- /dev/null +++ b/app/ui/selectbox.js @@ -0,0 +1,32 @@ +const html = require('choo/html'); + +module.exports = function(selected, options, translate, changed, htmlId) { + let x = selected; + + return html` + + `; + + function choose(event) { + const target = event.target; + const value = +target.value; + + if (x !== value) { + x = value; + changed(value); + } + } +}; diff --git a/app/ui/shareDialog.js b/app/ui/shareDialog.js new file mode 100644 index 000000000..a85633ecc --- /dev/null +++ b/app/ui/shareDialog.js @@ -0,0 +1,59 @@ +const html = require('choo/html'); + +module.exports = function(name, url) { + const dialog = function(state, emit, close) { + return html` + +

+ ${state.translate('notifyUploadEncryptDone')} +

+

+ ${state.translate('shareLinkDescription')}
+ ${name} +

+ + + +
+ `; + + async function share(event) { + event.stopPropagation(); + try { + await navigator.share({ + title: state.translate('-send-brand'), + text: state.translate('shareMessage', { name }), + url + }); + } catch (e) { + if (e.code === e.ABORT_ERR) { + return; + } + console.error(e); + } + close(); + } + }; + dialog.type = 'share'; + return dialog; +}; diff --git a/app/ui/unsupported.js b/app/ui/unsupported.js new file mode 100644 index 000000000..6b52ca2b2 --- /dev/null +++ b/app/ui/unsupported.js @@ -0,0 +1,57 @@ +const html = require('choo/html'); +const modal = require('./modal'); + +module.exports = function(state, emit) { + let strings = {}; + let why = ''; + let url = ''; + + if (state.params.reason !== 'outdated') { + strings = unsupportedStrings(state); + why = html` + + ${state.translate('notSupportedLink')} + + `; + url = + 'https://www.mozilla.org/firefox/new/?utm_campaign=send-acquisition&utm_medium=referral&utm_source=send.firefox.com'; + } else { + strings = outdatedStrings(state); + url = 'https://support.mozilla.org/kb/update-firefox-latest-version'; + } + + return html` +
+ ${state.modal && modal(state, emit)} +
+

${strings.header}

+

${strings.description}

+ ${why} + + ${strings.button} + +
+
+ `; +}; + +function outdatedStrings(state) { + return { + header: state.translate('notSupportedHeader'), + description: state.translate('notSupportedOutdatedDetail'), + button: state.translate('updateFirefox') + }; +} + +function unsupportedStrings(state) { + return { + header: state.translate('notSupportedHeader'), + description: state.translate('notSupportedDescription'), + button: state.translate('downloadFirefox') + }; +} diff --git a/app/user.js b/app/user.js new file mode 100644 index 000000000..49d8decb6 --- /dev/null +++ b/app/user.js @@ -0,0 +1,322 @@ +import assets from '../common/assets'; +import { getFileList, setFileList } from './api'; +import { encryptStream, decryptStream } from './ece'; +import { arrayToB64, b64ToArray, streamToArrayBuffer } from './utils'; +import { blobStream } from './streams'; +import { getFileListKey, prepareScopedBundleKey, preparePkce } from './fxa'; +import storage from './storage'; + +const textEncoder = new TextEncoder(); +const textDecoder = new TextDecoder(); +const anonId = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); + +async function hashId(id) { + const d = new Date(); + const month = d.getUTCMonth(); + const year = d.getUTCFullYear(); + const encoded = textEncoder.encode(`${id}:${year}:${month}`); + const hash = await crypto.subtle.digest('SHA-256', encoded); + return arrayToB64(new Uint8Array(hash.slice(16))); +} + +export default class User { + constructor(storage, limits, authConfig) { + this.authConfig = authConfig; + this.limits = limits; + this.storage = storage; + this.data = storage.user || {}; + } + + get info() { + return this.data || this.storage.user || {}; + } + + set info(data) { + this.data = data; + this.storage.user = data; + } + + get firstAction() { + return this.storage.get('firstAction'); + } + + set firstAction(action) { + this.storage.set('firstAction', action); + } + + get surveyed() { + return this.storage.get('surveyed'); + } + + set surveyed(yes) { + this.storage.set('surveyed', yes); + } + + get avatar() { + const defaultAvatar = assets.get('user.svg'); + if (this.info.avatarDefault) { + return defaultAvatar; + } + return this.info.avatar || defaultAvatar; + } + + get name() { + return this.info.displayName; + } + + get email() { + return this.info.email; + } + + get loggedIn() { + return !!this.info.access_token; + } + + get bearerToken() { + return this.info.access_token; + } + + get refreshToken() { + return this.info.refresh_token; + } + + get maxSize() { + return this.loggedIn + ? this.limits.MAX_FILE_SIZE + : this.limits.ANON.MAX_FILE_SIZE; + } + + get maxExpireSeconds() { + return this.loggedIn + ? this.limits.MAX_EXPIRE_SECONDS + : this.limits.ANON.MAX_EXPIRE_SECONDS; + } + + get maxDownloads() { + return this.loggedIn + ? this.limits.MAX_DOWNLOADS + : this.limits.ANON.MAX_DOWNLOADS; + } + + get loginRequired() { + return this.authConfig && this.authConfig.fxa_required; + } + + async metricId() { + return this.loggedIn ? hashId(this.info.uid) : undefined; + } + + async deviceId() { + return this.loggedIn ? hashId(this.storage.id) : hashId(anonId); + } + + async startAuthFlow(trigger, utms = {}) { + this.utms = utms; + this.trigger = trigger; + try { + const params = new URLSearchParams({ + entrypoint: `send-${trigger}`, + form_type: 'email', + utm_source: utms.source || 'send', + utm_campaign: utms.campaign || 'none' + }); + const res = await fetch( + `${this.authConfig.issuer}/metrics-flow?${params.toString()}`, + { + mode: 'cors' + } + ); + const { flowId, flowBeginTime } = await res.json(); + this.flowId = flowId; + this.flowBeginTime = flowBeginTime; + } catch (e) { + console.error(e); + this.flowId = null; + this.flowBeginTime = null; + } + } + + async login(email) { + const state = arrayToB64(crypto.getRandomValues(new Uint8Array(16))); + storage.set('oauthState', state); + const keys_jwk = await prepareScopedBundleKey(this.storage); + const code_challenge = await preparePkce(this.storage); + const options = { + action: 'email', + access_type: 'offline', + client_id: this.authConfig.client_id, + code_challenge, + code_challenge_method: 'S256', + response_type: 'code', + scope: `profile ${this.authConfig.key_scope}`, + state, + keys_jwk + }; + if (email) { + options.email = email; + } + if (this.flowId && this.flowBeginTime) { + options.flow_id = this.flowId; + options.flow_begin_time = this.flowBeginTime; + } + if (this.trigger) { + options.entrypoint = `send-${this.trigger}`; + } + if (this.utms) { + options.utm_campaign = this.utms.campaign || 'none'; + options.utm_content = this.utms.content || 'none'; + options.utm_medium = this.utms.medium || 'none'; + options.utm_source = this.utms.source || 'send'; + options.utm_term = this.utms.term || 'none'; + } + const params = new URLSearchParams(options); + location.assign( + `${this.authConfig.authorization_endpoint}?${params.toString()}` + ); + } + + async finishLogin(code, state) { + const localState = storage.get('oauthState'); + storage.remove('oauthState'); + if (state !== localState) { + throw new Error('state mismatch'); + } + const tokenResponse = await fetch(this.authConfig.token_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + code, + client_id: this.authConfig.client_id, + code_verifier: this.storage.get('pkceVerifier') + }) + }); + const auth = await tokenResponse.json(); + const infoResponse = await fetch(this.authConfig.userinfo_endpoint, { + method: 'GET', + headers: { + Authorization: `Bearer ${auth.access_token}` + } + }); + const userInfo = await infoResponse.json(); + userInfo.access_token = auth.access_token; + userInfo.refresh_token = auth.refresh_token; + userInfo.fileListKey = await getFileListKey(this.storage, auth.keys_jwe); + this.info = userInfo; + this.storage.remove('pkceVerifier'); + } + + async refresh() { + if (!this.refreshToken) { + return false; + } + try { + const tokenResponse = await fetch(this.authConfig.token_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + client_id: this.authConfig.client_id, + grant_type: 'refresh_token', + refresh_token: this.refreshToken + }) + }); + if (tokenResponse.ok) { + const auth = await tokenResponse.json(); + const info = { ...this.info, access_token: auth.access_token }; + this.info = info; + return true; + } + } catch (e) { + console.error(e); + } + await this.logout(); + return false; + } + + async logout() { + try { + if (this.refreshToken) { + await fetch(this.authConfig.revocation_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + refresh_token: this.refreshToken + }) + }); + } + if (this.bearerToken) { + await fetch(this.authConfig.revocation_endpoint, { + method: 'POST', + headers: { + 'Content-Type': 'application/json' + }, + body: JSON.stringify({ + token: this.bearerToken + }) + }); + } + } catch (e) { + console.error(e); + // oh well, we tried + } + this.storage.clearLocalFiles(); + this.info = {}; + } + + async syncFileList() { + let changes = { incoming: false, outgoing: false, downloadCount: false }; + if (!this.loggedIn) { + return this.storage.merge(); + } + let list = []; + const key = b64ToArray(this.info.fileListKey); + const sha = await crypto.subtle.digest('SHA-256', key); + const kid = arrayToB64(new Uint8Array(sha)).substring(0, 16); + const retry = async () => { + const refreshed = await this.refresh(); + if (refreshed) { + return await this.syncFileList(); + } else { + return { incoming: true }; + } + }; + try { + const encrypted = await getFileList(this.bearerToken, kid); + const decrypted = await streamToArrayBuffer( + decryptStream(blobStream(encrypted), key) + ); + list = JSON.parse(textDecoder.decode(decrypted)); + } catch (e) { + if (e.message === '401') { + return retry(e); + } + } + changes = await this.storage.merge(list); + if (!changes.outgoing) { + return changes; + } + try { + const blob = new Blob([ + textEncoder.encode(JSON.stringify(this.storage.files)) + ]); + const encrypted = await streamToArrayBuffer( + encryptStream(blobStream(blob), key) + ); + await setFileList(this.bearerToken, kid, encrypted); + } catch (e) { + if (e.message === '401') { + return retry(e); + } + } + return changes; + } + + toJSON() { + return this.info; + } +} diff --git a/app/utils.js b/app/utils.js index 9fea560c0..dd7fbf687 100644 --- a/app/utils.js +++ b/app/utils.js @@ -1,3 +1,10 @@ +/* global Android */ +let html; +try { + html = require('choo/html'); +} catch (e) { + // running in the service worker +} const b64 = require('base64-js'); function arrayToB64(array) { @@ -9,10 +16,11 @@ function arrayToB64(array) { } function b64ToArray(str) { - str = (str + '==='.slice((str.length + 3) % 4)) - .replace(/-/g, '+') - .replace(/_/g, '/'); - return b64.toByteArray(str); + return b64.toByteArray(str + '==='.slice((str.length + 3) % 4)); +} + +function locale() { + return document.querySelector('html').lang; } function loadShim(polyfill) { @@ -25,34 +33,8 @@ function loadShim(polyfill) { }); } -async function canHasSend(polyfill) { - try { - const key = await window.crypto.subtle.generateKey( - { - name: 'AES-GCM', - length: 128 - }, - true, - ['encrypt', 'decrypt'] - ); - - await window.crypto.subtle.encrypt( - { - name: 'AES-GCM', - iv: window.crypto.getRandomValues(new Uint8Array(12)), - tagLength: 128 - }, - key, - new ArrayBuffer(8) - ); - return true; - } catch (err) { - return loadShim(polyfill); - } -} - function isFile(id) { - return /^[0-9a-fA-F]{10}$/.test(id); + return /^[0-9a-fA-F]{10,16}$/.test(id); } function copyToClipboard(str) { @@ -64,7 +46,7 @@ function copyToClipboard(str) { if (navigator.userAgent.match(/iphone|ipad|ipod/i)) { const range = document.createRange(); range.selectNodeContents(aux); - const sel = window.getSelection(); + const sel = getSelection(); sel.removeAllRanges(); sel.addRange(range); aux.setSelectionRange(0, str.length); @@ -83,33 +65,35 @@ const LOCALIZE_NUMBERS = !!( typeof navigator === 'object' ); -const UNITS = ['B', 'kB', 'MB', 'GB']; +const UNITS = ['bytes', 'kb', 'mb', 'gb']; function bytes(num) { if (num < 1) { return '0B'; } const exponent = Math.min(Math.floor(Math.log10(num) / 3), UNITS.length - 1); - const n = Number(num / Math.pow(1000, exponent)); - let nStr = n.toFixed(1); + const n = Number(num / Math.pow(1024, exponent)); + const decimalDigits = Math.floor(n) === n ? 0 : 1; + let nStr = n.toFixed(decimalDigits); if (LOCALIZE_NUMBERS) { try { - const locale = document.querySelector('html').lang; - nStr = n.toLocaleString(locale, { - minimumFractionDigits: 1, - maximumFractionDigits: 1 + nStr = n.toLocaleString(locale(), { + minimumFractionDigits: decimalDigits, + maximumFractionDigits: decimalDigits }); } catch (e) { // fall through } } - return `${nStr}${UNITS[exponent]}`; + return translate('fileSize', { + num: nStr, + units: translate(UNITS[exponent]) + }); } function percent(ratio) { if (LOCALIZE_NUMBERS) { try { - const locale = document.querySelector('html').lang; - return ratio.toLocaleString(locale, { style: 'percent' }); + return ratio.toLocaleString(locale(), { style: 'percent' }); } catch (e) { // fall through } @@ -117,6 +101,13 @@ function percent(ratio) { return `${Math.floor(ratio * 100)}%`; } +function number(n) { + if (LOCALIZE_NUMBERS) { + return n.toLocaleString(locale()); + } + return n.toString(); +} + function allowedCopy() { const support = !!document.queryCommandSupported; return support ? document.queryCommandSupported('copy') : false; @@ -126,29 +117,13 @@ function delay(delay = 100) { return new Promise(resolve => setTimeout(resolve, delay)); } -function fadeOut(id) { - const classes = document.getElementById(id).classList; - classes.remove('fadeIn'); - classes.add('fadeOut'); +function fadeOut(selector) { + const classes = document.querySelector(selector).classList; + classes.remove('effect--fadeIn'); + classes.add('effect--fadeOut'); return delay(300); } -function saveFile(file) { - const dataView = new DataView(file.plaintext); - const blob = new Blob([dataView], { type: file.type }); - const downloadUrl = URL.createObjectURL(blob); - - if (window.navigator.msSaveBlob) { - return window.navigator.msSaveBlob(blob, file.name); - } - const a = document.createElement('a'); - a.href = downloadUrl; - a.download = file.name; - document.body.appendChild(a); - a.click(); - URL.revokeObjectURL(downloadUrl); -} - function openLinksInNewTab(links, should = true) { links = links || Array.from(document.querySelectorAll('a:not([target])')); if (should) { @@ -165,17 +140,170 @@ function openLinksInNewTab(links, should = true) { return links; } +function browserName() { + try { + // order of these matters + if (/firefox/i.test(navigator.userAgent)) { + return 'firefox'; + } + if (/edge/i.test(navigator.userAgent)) { + return 'edge'; + } + if (/edg/i.test(navigator.userAgent)) { + return 'edgium'; + } + if (/trident/i.test(navigator.userAgent)) { + return 'ie'; + } + if (/chrome/i.test(navigator.userAgent)) { + return 'chrome'; + } + if (/safari/i.test(navigator.userAgent)) { + return 'safari'; + } + if (/send android/i.test(navigator.userAgent)) { + return 'android-app'; + } + return 'other'; + } catch (e) { + return 'unknown'; + } +} + +async function streamToArrayBuffer(stream, size) { + const reader = stream.getReader(); + let state = await reader.read(); + + if (size) { + const result = new Uint8Array(size); + let offset = 0; + while (!state.done) { + result.set(state.value, offset); + offset += state.value.length; + state = await reader.read(); + } + return result.buffer; + } + + const parts = []; + let len = 0; + while (!state.done) { + parts.push(state.value); + len += state.value.length; + state = await reader.read(); + } + let offset = 0; + const result = new Uint8Array(len); + for (const part of parts) { + result.set(part, offset); + offset += part.length; + } + return result.buffer; +} + +function list(items, ulStyle = '', liStyle = '') { + const lis = items.map( + i => + html` +
  • ${i}
  • + ` + ); + return html` +
      + ${lis} +
    + `; +} + +function secondsToL10nId(seconds) { + if (seconds < 3600) { + return { id: 'timespanMinutes', num: Math.floor(seconds / 60) }; + } else if (seconds < 86400) { + return { id: 'timespanHours', num: Math.floor(seconds / 3600) }; + } else { + return { id: 'timespanDays', num: Math.floor(seconds / 86400) }; + } +} + +function timeLeft(milliseconds) { + if (milliseconds < 1) { + return { id: 'linkExpiredAlt' }; + } + const minutes = Math.floor(milliseconds / 1000 / 60); + const hours = Math.floor(minutes / 60); + const days = Math.floor(hours / 24); + if (days >= 1) { + return { + id: 'expiresDaysHoursMinutes', + days, + hours: hours % 24, + minutes: minutes % 60 + }; + } + if (hours >= 1) { + return { + id: 'expiresHoursMinutes', + hours, + minutes: minutes % 60 + }; + } else if (hours === 0) { + if (minutes === 0) { + return { id: 'expiresMinutes', minutes: '< 1' }; + } + return { id: 'expiresMinutes', minutes }; + } + return null; +} + +function platform() { + if (typeof Android === 'object') { + return 'android'; + } + return 'web'; +} + +const ECE_RECORD_SIZE = 1024 * 64; +const TAG_LENGTH = 16; +function encryptedSize(size, rs = ECE_RECORD_SIZE, tagLength = TAG_LENGTH) { + const chunk_meta = tagLength + 1; // Chunk metadata, tag and delimiter + return 21 + size + chunk_meta * Math.ceil(size / (rs - chunk_meta)); +} + +let translate = function() { + throw new Error('uninitialized translate function. call setTranslate first'); +}; +function setTranslate(t) { + translate = t; +} + +function concat(b1, b2) { + const result = new Uint8Array(b1.length + b2.length); + result.set(b1, 0); + result.set(b2, b1.length); + return result; +} + module.exports = { + concat, + locale, fadeOut, delay, allowedCopy, bytes, percent, + number, copyToClipboard, arrayToB64, b64ToArray, - canHasSend, + loadShim, isFile, - saveFile, - openLinksInNewTab + openLinksInNewTab, + browserName, + streamToArrayBuffer, + list, + secondsToL10nId, + timeLeft, + platform, + encryptedSize, + setTranslate }; diff --git a/app/zip.js b/app/zip.js new file mode 100644 index 000000000..bf62726f3 --- /dev/null +++ b/app/zip.js @@ -0,0 +1,186 @@ +import crc32 from './crc32'; + +const encoder = new TextEncoder(); + +function dosDateTime(dateTime = new Date()) { + const year = (dateTime.getFullYear() - 1980) << 9; + const month = (dateTime.getMonth() + 1) << 5; + const day = dateTime.getDate(); + const date = year | month | day; + const hour = dateTime.getHours() << 11; + const minute = dateTime.getMinutes() << 5; + const second = Math.floor(dateTime.getSeconds() / 2); + const time = hour | minute | second; + + return { date, time }; +} + +class File { + constructor(info) { + this.name = encoder.encode(info.name); + this.size = info.size; + this.bytesRead = 0; + this.crc = null; + this.dateTime = dosDateTime(); + } + + get header() { + const h = new ArrayBuffer(30 + this.name.byteLength); + const v = new DataView(h); + v.setUint32(0, 0x04034b50, true); // sig + v.setUint16(4, 20, true); // version + v.setUint16(6, 8, true); // bit flags (8 = use data descriptor) + v.setUint16(8, 0, true); // compression + v.setUint16(10, this.dateTime.time, true); // modified time + v.setUint16(12, this.dateTime.date, true); // modified date + v.setUint32(14, 0, true); // crc32 (in descriptor) + v.setUint32(18, 0, true); // compressed size (in descriptor) + v.setUint32(22, 0, true); // uncompressed size (in descriptor) + v.setUint16(26, this.name.byteLength, true); // name length + v.setUint16(28, 0, true); // extra field length + for (let i = 0; i < this.name.byteLength; i++) { + v.setUint8(30 + i, this.name[i]); + } + return new Uint8Array(h); + } + + get dataDescriptor() { + const dd = new ArrayBuffer(16); + const v = new DataView(dd); + v.setUint32(0, 0x08074b50, true); // sig + v.setUint32(4, this.crc, true); // crc32 + v.setUint32(8, this.size, true); // compressed size + v.setUint32(12, this.size, true); // uncompressed size + return new Uint8Array(dd); + } + + directoryRecord(offset) { + const dr = new ArrayBuffer(46 + this.name.byteLength); + const v = new DataView(dr); + v.setUint32(0, 0x02014b50, true); // sig + v.setUint16(4, 20, true); // version made + v.setUint16(6, 20, true); // version required + v.setUint16(8, 8, true); // bit flags (8 = use data descriptor) + v.setUint16(10, 0, true); // compression + v.setUint16(12, this.dateTime.time, true); // modified time + v.setUint16(14, this.dateTime.date, true); // modified date + v.setUint32(16, this.crc, true); // crc + v.setUint32(20, this.size, true); // compressed size + v.setUint32(24, this.size, true); // uncompressed size + v.setUint16(28, this.name.byteLength, true); // name length + v.setUint16(30, 0, true); // extra length + v.setUint16(32, 0, true); // comment length + v.setUint16(34, 0, true); // disk number + v.setUint16(36, 0, true); // internal file attrs + v.setUint32(38, 0, true); // external file attrs + v.setUint32(42, offset, true); // file offset + for (let i = 0; i < this.name.byteLength; i++) { + v.setUint8(46 + i, this.name[i]); + } + return new Uint8Array(dr); + } + + get byteLength() { + return this.size + this.name.byteLength + 30 + 16; + } + + append(data, controller) { + this.bytesRead += data.byteLength; + const endIndex = data.byteLength - Math.max(this.bytesRead - this.size, 0); + const buf = data.slice(0, endIndex); + this.crc = crc32(buf, this.crc); + controller.enqueue(buf); + if (endIndex < data.byteLength) { + return data.slice(endIndex, data.byteLength); + } + } +} + +function centralDirectory(files, controller) { + let directoryOffset = 0; + let directorySize = 0; + for (let i = 0; i < files.length; i++) { + const file = files[i]; + const record = file.directoryRecord(directoryOffset); + directoryOffset += file.byteLength; + controller.enqueue(record); + directorySize += record.byteLength; + } + controller.enqueue(eod(files.length, directorySize, directoryOffset)); +} + +function eod(fileCount, directorySize, directoryOffset) { + const e = new ArrayBuffer(22); + const v = new DataView(e); + v.setUint32(0, 0x06054b50, true); // sig + v.setUint16(4, 0, true); // disk number + v.setUint16(6, 0, true); // directory disk + v.setUint16(8, fileCount, true); // number of records + v.setUint16(10, fileCount, true); // total records + v.setUint32(12, directorySize, true); // size of directory + v.setUint32(16, directoryOffset, true); // offset of directory + v.setUint16(20, 0, true); // comment length + return new Uint8Array(e); +} + +class ZipStreamController { + constructor(files, source) { + this.files = files; + this.fileIndex = 0; + this.file = null; + this.reader = source.getReader(); + this.nextFile(); + this.extra = null; + } + + nextFile() { + this.file = this.files[this.fileIndex++]; + } + + async pull(controller) { + if (!this.file) { + // end of archive + centralDirectory(this.files, controller); + return controller.close(); + } + if (this.file.bytesRead === 0) { + // beginning of file + controller.enqueue(this.file.header); + if (this.extra) { + this.extra = this.file.append(this.extra, controller); + } + } + if (this.file.bytesRead >= this.file.size) { + // end of file + controller.enqueue(this.file.dataDescriptor); + this.nextFile(); + return this.pull(controller); + } + const data = await this.reader.read(); + if (data.done) { + this.nextFile(); + return this.pull(controller); + } + this.extra = this.file.append(data.value, controller); + } +} + +export default class Zip { + constructor(manifest, source) { + this.files = manifest.files.map(info => new File(info)); + this.source = source; + } + + get stream() { + return new ReadableStream(new ZipStreamController(this.files, this.source)); + } + + get size() { + const entries = this.files.reduce( + (total, file) => total + file.byteLength * 2 - file.size, + 0 + ); + const eod = 22; + return entries + eod; + } +} diff --git a/assets/add.svg b/assets/add.svg new file mode 100644 index 000000000..84db8c30d --- /dev/null +++ b/assets/add.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/addfiles.svg b/assets/addfiles.svg new file mode 100644 index 000000000..3d6749d94 --- /dev/null +++ b/assets/addfiles.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/assets/android-chrome-192x192.png b/assets/android-chrome-192x192.png new file mode 100644 index 000000000..36aed9fca Binary files /dev/null and b/assets/android-chrome-192x192.png differ diff --git a/assets/android-chrome-512x512.png b/assets/android-chrome-512x512.png new file mode 100644 index 000000000..20caf078e Binary files /dev/null and b/assets/android-chrome-512x512.png differ diff --git a/assets/apple-touch-icon.png b/assets/apple-touch-icon.png new file mode 100644 index 000000000..e147cb573 Binary files /dev/null and b/assets/apple-touch-icon.png differ diff --git a/assets/blue_file.svg b/assets/blue_file.svg new file mode 100644 index 000000000..803d979ac --- /dev/null +++ b/assets/blue_file.svg @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/check-16-blue.svg b/assets/check-16-blue.svg deleted file mode 100644 index a2633292b..000000000 --- a/assets/check-16-blue.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/check-16.svg b/assets/check-16.svg deleted file mode 100644 index 4243e0dcb..000000000 --- a/assets/check-16.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/close-16.svg b/assets/close-16.svg index 21207a15d..9a9da6d39 100644 --- a/assets/close-16.svg +++ b/assets/close-16.svg @@ -1 +1 @@ - + diff --git a/assets/completed.svg b/assets/completed.svg new file mode 100644 index 000000000..2c8e8b35d --- /dev/null +++ b/assets/completed.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/copy-16.svg b/assets/copy-16.svg index c5cee8268..56bed4a86 100644 --- a/assets/copy-16.svg +++ b/assets/copy-16.svg @@ -1 +1,5 @@ - \ No newline at end of file + + + + + \ No newline at end of file diff --git a/assets/cryptofill.js b/assets/cryptofill.js deleted file mode 100644 index db29a3327..000000000 --- a/assets/cryptofill.js +++ /dev/null @@ -1,22 +0,0 @@ -var liner=function(e){function r(n){if(t[n])return t[n].exports;var a=t[n]={i:n,l:!1,exports:{}};return e[n].call(a.exports,a,a.exports,r),a.l=!0,a.exports}var t={};return r.m=e,r.c=t,r.i=function(e){return e},r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=16)}([function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),function(e){function n(e){for(var r=[],t=1;t=0;s--){var c=i[s],u=c.arg.substring(1),h=c.index+1;a=a.substring(0,h)+arguments[+u]+a.substring(h+1+u.length)}return a=a.replace("%%","%")}function a(e){var r;r="string"==typeof e?{name:e}:e,h.checkAlgorithm(r);var t=e;return t.hash&&(t.hash=a(t.hash)),r}function o(e,r){if(!e)throw new s("Parameter '"+r+"' is required and cant be empty");if("undefined"!=typeof Buffer&&Buffer.isBuffer(e))return new Uint8Array(e);if(ArrayBuffer.isView(e))return new Uint8Array(e.buffer);if(e instanceof ArrayBuffer)return new Uint8Array(e);throw new s("Incoming parameter '"+r+"' has wrong data type. Must be ArrayBufferView or ArrayBuffer")}t.d(r,"WebCryptoError",function(){return s}),t.d(r,"AlgorithmError",function(){return c}),t.d(r,"CryptoKeyError",function(){return u}),t.d(r,"PrepareAlgorithm",function(){return a}),t.d(r,"PrepareData",function(){return o}),t.d(r,"BaseCrypto",function(){return h}),t.d(r,"AlgorithmNames",function(){return p}),t.d(r,"Base64Url",function(){return l}),t.d(r,"SubtleCrypto",function(){return W}),t.d(r,"Aes",function(){return m}),t.d(r,"AesAlgorithmError",function(){return A}),t.d(r,"AesWrapKey",function(){return w}),t.d(r,"AesEncrypt",function(){return v}),t.d(r,"AesECB",function(){return g}),t.d(r,"AesCBC",function(){return C}),t.d(r,"AesCTR",function(){return d}),t.d(r,"AesGCM",function(){return E}),t.d(r,"AesKW",function(){return P}),t.d(r,"RsaKeyGenParamsError",function(){return N}),t.d(r,"RsaHashedImportParamsError",function(){return G}),t.d(r,"Rsa",function(){return M}),t.d(r,"RsaSSA",function(){return B}),t.d(r,"RsaPSSParamsError",function(){return T}),t.d(r,"RsaPSS",function(){return D}),t.d(r,"RsaOAEPParamsError",function(){return x}),t.d(r,"RsaOAEP",function(){return H}),t.d(r,"EcKeyGenParamsError",function(){return S}),t.d(r,"Ec",function(){return _}),t.d(r,"EcAlgorithmError",function(){return U}),t.d(r,"EcDSA",function(){return L}),t.d(r,"EcDH",function(){return R}),t.d(r,"ShaAlgorithms",function(){return k}),t.d(r,"Sha",function(){return b});var i=t(6),s=function(e){function r(r){for(var t=[],a=1;a0&&e.length<=128))throw new A(A.PARAM_WRONG_VALUE,"length","number [1-128]")},r}(v);d.ALG_NAME=p.AesCTR;var E=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithmParams=function(e){if(this.checkAlgorithm(e),e.additionalData&&!(ArrayBuffer.isView(e.additionalData)||e.additionalData instanceof ArrayBuffer))throw new A(A.PARAM_WRONG_TYPE,"additionalData","ArrayBufferView or ArrayBuffer");if(!e.iv)throw new A(A.PARAM_REQUIRED,"iv");if(!(ArrayBuffer.isView(e.iv)||e.iv instanceof ArrayBuffer))throw new A(A.PARAM_WRONG_TYPE,"iv","ArrayBufferView or ArrayBuffer");if(e.tagLength){if(![32,64,96,104,112,120,128].some(function(r){return r===e.tagLength}))throw new A(A.PARAM_WRONG_VALUE,"tagLength","32, 64, 96, 104, 112, 120 or 128")}},r}(v);E.ALG_NAME=p.AesGCM;var P=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithmParams=function(e){this.checkAlgorithm(e)},r}(w);P.ALG_NAME=p.AesKW,P.KEY_USAGES=["wrapKey","unwrapKey"];var k=[p.Sha1,p.Sha256,p.Sha384,p.Sha512].join(" | "),b=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithm=function(r){var t;switch(t="string"==typeof r?{name:r}:r,e.checkAlgorithm.call(this,t),t.name.toUpperCase()){case p.Sha1:case p.Sha256:case p.Sha384:case p.Sha512:break;default:throw new c(c.WRONG_ALG_NAME,t.name,k)}},r.digest=function(e,r){var t=this;return new Promise(function(r,n){t.checkAlgorithm(e),r(void 0)})},r}(h),S=function(e){function r(){var r=null!==e&&e.apply(this,arguments)||this;return r.code=9,r}return t.i(i.a)(r,e),r}(c),_=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return t.i(i.a)(r,e),r.checkAlgorithm=function(e){if(e.name.toUpperCase()!==this.ALG_NAME.toUpperCase())throw new c(c.WRONG_ALG_NAME,e.name,this.ALG_NAME)},r.checkKeyGenParams=function(e){if(!e.namedCurve)throw new S(S.PARAM_REQUIRED,"namedCurve");if("string"!=typeof e.namedCurve)throw new S(S.PARAM_WRONG_TYPE,"namedCurve","string");switch(e.namedCurve.toUpperCase()){case"P-256":case"P-384":case"P-521":break;default:throw new S(S.PARAM_WRONG_VALUE,"namedCurve","P-256, P-384 or P-521")}},r.checkKeyGenUsages=function(e){var r=this;e.forEach(function(e){var t=0;for(t;t0&&e.length<=512))throw new c(c.PARAM_WRONG_VALUE,"length","more 0 and less than 512")},r.checkKeyGenUsages=function(e){var r=this;this.checkKeyUsages(e),e.forEach(function(e){var t=0;for(t;t=256&&r<=16384)||r%8)throw new N(N.PARAM_WRONG_VALUE,"modulusLength"," a multiple of 8 bits and >= 256 and <= 16384");var t=e.publicExponent;if(!t)throw new N(N.PARAM_REQUIRED,"publicExponent");if(!ArrayBuffer.isView(t))throw new N(N.PARAM_WRONG_TYPE,"publicExponent","ArrayBufferView");if(3!==t[0]&&(1!==t[0]||0!==t[1]||1!==t[2]))throw new N(N.PARAM_WRONG_VALUE,"publicExponent","Uint8Array([3]) | Uint8Array([1, 0, 1])");if(!e.hash)throw new N(N.PARAM_REQUIRED,"hash",k);b.checkAlgorithm(e.hash)},r.checkKeyGenUsages=function(e){var r=this;this.checkKeyUsages(e),e.forEach(function(e){var t=0;for(t;t>>16&65535,n=65535&e,a=r>>>16&65535,o=65535&r;return n*o+(t*o+n*a<<16>>>0)|0})},function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){function e(){}return e}();r.CryptoKey=n},function(e,r,t){"use strict";function n(e,r){function t(){this.constructor=e}a(e,r),e.prototype=null===r?Object.create(r):(t.prototype=r.prototype,new t)}r.a=n;/*! ***************************************************************************** -Copyright (c) Microsoft Corporation. All rights reserved. -Licensed under the Apache License, Version 2.0 (the "License"); you may not use -this file except in compliance with the License. You may obtain a copy of the -License at http://www.apache.org/licenses/LICENSE-2.0 - -THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED -WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, -MERCHANTABLITY OR NON-INFRINGEMENT. - -See the Apache Version 2.0 License for specific language governing permissions -and limitations under the License. -***************************************************************************** */ -var a=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])};Object.assign},function(e,r,t){"use strict";function n(e){for(var t in e)r.hasOwnProperty(t)||(r[t]=e[t])}Object.defineProperty(r,"__esModule",{value:!0}),n(t(4)),n(t(2))},function(e,r,t){"use strict";var n=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])};return function(r,t){function n(){this.constructor=r}e(r,t),r.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var a=t(0),o=t(1),i=t(5),s=t(3),c=t(4),u=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.generateKey=function(e,r,t){var n=this;return Promise.resolve().then(function(){n.checkModule();var a=c.nativeCrypto.getRandomValues(new Uint8Array(e.length/8)),o=new i.CryptoKey;return o.key=a,o.algorithm=e,o.extractable=r,o.type="secret",o.usages=t,o})},r.encrypt=function(e,r,t){return Promise.resolve().then(function(){var n;switch(e.name.toUpperCase()){case a.AlgorithmNames.AesECB:;n=asmCrypto.AES_ECB.encrypt(t,r.key,!0);break;case a.AlgorithmNames.AesCBC:var i=e;n=asmCrypto.AES_CBC.encrypt(t,r.key,void 0,a.PrepareData(i.iv,"iv"));break;case a.AlgorithmNames.AesGCM:var s=e;s.tagLength=s.tagLength||128;var c=void 0;s.additionalData&&(c=a.PrepareData(s.additionalData,"additionalData")),n=asmCrypto.AES_GCM.encrypt(t,r.key,s.iv,c,s.tagLength/8);break;default:throw new o.LinerError(a.AlgorithmError.UNSUPPORTED_ALGORITHM,e.name)}return n.buffer})},r.decrypt=function(e,r,t){return Promise.resolve().then(function(){var n;switch(e.name.toUpperCase()){case a.AlgorithmNames.AesECB:;n=asmCrypto.AES_ECB.decrypt(t,r.key,!0);break;case a.AlgorithmNames.AesCBC:var i=e;n=asmCrypto.AES_CBC.decrypt(t,r.key,void 0,a.PrepareData(i.iv,"iv"));break;case a.AlgorithmNames.AesGCM:var s=e;s.tagLength=s.tagLength||128;var c=void 0;s.additionalData&&(c=a.PrepareData(s.additionalData,"additionalData")),n=asmCrypto.AES_GCM.decrypt(t,r.key,s.iv,c,s.tagLength/8);break;default:throw new o.LinerError(a.AlgorithmError.UNSUPPORTED_ALGORITHM,e.name)}return n.buffer})},r.wrapKey=function(e,r,t,n){var a;return Promise.resolve().then(function(){return a=new h.Crypto,a.subtle.exportKey(e,r)}).then(function(e){var r;return r=e instanceof ArrayBuffer?new Uint8Array(e):s.string2buffer(JSON.stringify(e)),a.subtle.encrypt(n,t,r)})},r.unwrapKey=function(e,r,t,n,a,o,i){var c;return Promise.resolve().then(function(){return c=new h.Crypto,c.subtle.decrypt(n,t,r)}).then(function(r){var t;return t="jwk"===e.toLowerCase()?JSON.parse(s.buffer2string(new Uint8Array(r))):new Uint8Array(r),c.subtle.importKey(e,t,a,o,i)})},r.alg2jwk=function(e){return"A"+e.length+/-(\w+)/i.exec(e.name.toUpperCase())[1]},r.jwk2alg=function(e){throw new Error("Not implemented")},r.exportKey=function(e,r){var t=this;return Promise.resolve().then(function(){var n=r.key;if("jwk"===e.toLowerCase()){return{alg:t.alg2jwk(r.algorithm),ext:r.extractable,k:a.Base64Url.encode(n),key_ops:r.usages,kty:"oct"}}return n.buffer})},r.importKey=function(e,r,t,n,o){return Promise.resolve().then(function(){var n;if("jwk"===e.toLowerCase()){var s=r;n=a.Base64Url.decode(s.k)}else n=new Uint8Array(r);var c=new i.CryptoKey;return c.algorithm=t,c.type="secret",c.usages=o,c.key=n,c})},r.checkModule=function(){if("undefined"==typeof asmCrypto)throw new o.LinerError(o.LinerError.MODULE_NOT_FOUND,"asmCrypto","https://github.com/vibornoff/asmcrypto.js")},r}(a.BaseCrypto);r.AesCrypto=u;var h=t(2)},function(e,r,t){"use strict";function n(e){for(var r=new Uint8Array(e),t=[],n=0;n32?o>48?66:48:32,t.length32?o>48?66:48:32,t.length/232?o>48?66:48:32,a.length-1&&("public"===e.type||"secret"===e.type)&&e.usages.push(t)}),["sign","decrypt","unwrapKey","deriveKey","deriveBits"].forEach(function(t){r.indexOf(t)>-1&&("private"===e.type||"secret"===e.type)&&e.usages.push(t)})))})}function s(e,r,t){if(r&&A.BrowserInfo().name===A.Browser.IE){"extractable"in e&&(e.ext=e.extractable,delete e.extractable);var n=null;switch(r.name.toUpperCase()){case h.AlgorithmNames.RsaOAEP.toUpperCase():case h.AlgorithmNames.RsaPSS.toUpperCase():case h.AlgorithmNames.RsaSSA.toUpperCase():n=g.RsaCrypto;break;case h.AlgorithmNames.AesECB.toUpperCase():case h.AlgorithmNames.AesCBC.toUpperCase():case h.AlgorithmNames.AesGCM.toUpperCase():n=w.AesCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,r.name.toUpperCase())}n&&!e.alg&&(e.alg=n.alg2jwk(r)),"key_ops"in e||(e.key_ops=t)}}function c(e){A.BrowserInfo().name===A.Browser.IE&&("ext"in e&&(e.extractable=e.ext,delete e.ext),delete e.key_ops,delete e.alg)}var u=this&&this.__extends||function(){var e=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,r){e.__proto__=r}||function(e,r){for(var t in r)r.hasOwnProperty(t)&&(e[t]=r[t])};return function(r,t){function n(){this.constructor=r}e(r,t),r.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}}();Object.defineProperty(r,"__esModule",{value:!0});var h=t(0),p=t(0),f=t(0),l=t(4),y=t(2),m=t(1),A=t(3),w=t(8),v=t(11),g=t(10),C=t(9),d=[],E=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return u(r,e),r.prototype.generateKey=function(r,t,n){var o,s=arguments;return e.prototype.generateKey.apply(this,s).then(function(e){if(o=f.PrepareAlgorithm(r),(A.BrowserInfo().name!==A.Browser.Edge||o.name.toUpperCase()!==h.AlgorithmNames.AesGCM)&&l.nativeSubtle)try{return l.nativeSubtle.generateKey.apply(l.nativeSubtle,s).catch(function(e){console.warn("WebCrypto: native generateKey for "+o.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native generateKey for "+o.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return i(e,n),a(o,e),e;var r;switch(o.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():r=w.AesCrypto;break;case h.AlgorithmNames.EcDSA.toLowerCase():case h.AlgorithmNames.EcDH.toLowerCase():r=C.EcCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():case h.AlgorithmNames.RsaSSA.toLowerCase():r=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,o.name.toLowerCase())}return r.generateKey(o,t,n)})},r.prototype.digest=function(r,t){var n,a,o=arguments;return e.prototype.digest.apply(this,o).then(function(e){if(n=f.PrepareAlgorithm(r),a=f.PrepareData(t,"data"),l.nativeSubtle)try{return l.nativeSubtle.digest.apply(l.nativeSubtle,o).catch(function(e){console.warn("WebCrypto: native digest for "+n.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native digest for "+n.name+" doesn't work.",e.message||"")}}).then(function(e){return e||v.ShaCrypto.digest(n,a)})},r.prototype.sign=function(r,t,a){var i,s,c=arguments;return e.prototype.sign.apply(this,c).then(function(e){i=f.PrepareAlgorithm(r),s=f.PrepareData(a,"data");var n=o(t);if(n&&(c[0]=A.assign(i,n)),l.nativeSubtle)try{return l.nativeSubtle.sign.apply(l.nativeSubtle,c).catch(function(e){console.warn("WebCrypto: native sign for "+i.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native sign for "+i.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return e;var r;switch(i.name.toLowerCase()){case h.AlgorithmNames.EcDSA.toLowerCase():r=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():r=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,i.name.toLowerCase())}return n(t,r).then(function(e){return r.sign(i,e,s)})})},r.prototype.verify=function(r,t,a,i){var s,c,u,p=arguments;return e.prototype.verify.apply(this,p).then(function(e){s=f.PrepareAlgorithm(r),c=f.PrepareData(a,"data"),u=f.PrepareData(i,"data");var n=o(t);if(n&&(p[0]=A.assign(s,n)),l.nativeSubtle)try{return l.nativeSubtle.verify.apply(l.nativeSubtle,p).catch(function(e){console.warn("WebCrypto: native verify for "+s.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native verify for "+s.name+" doesn't work.",e.message||"")}}).then(function(e){if("boolean"==typeof e)return e;var r;switch(s.name.toLowerCase()){case h.AlgorithmNames.EcDSA.toLowerCase():r=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():r=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,s.name.toLowerCase())}return n(t,r).then(function(e){return r.verify(s,e,c,u)})})},r.prototype.deriveBits=function(r,t,n){var a,o=arguments;return e.prototype.deriveBits.apply(this,o).then(function(e){if(a=f.PrepareAlgorithm(r),l.nativeSubtle)try{return l.nativeSubtle.deriveBits.apply(l.nativeSubtle,o).catch(function(e){console.warn("WebCrypto: native deriveBits for "+a.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native deriveBits for "+a.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return e;var r;switch(a.name.toLowerCase()){case h.AlgorithmNames.EcDH.toLowerCase():r=C.EcCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"deriveBits")}return r.deriveBits(a,t,n)})},r.prototype.deriveKey=function(r,t,n,a,o){var s,c,u=arguments;return e.prototype.deriveKey.apply(this,u).then(function(e){if(s=f.PrepareAlgorithm(r),c=f.PrepareAlgorithm(n),l.nativeSubtle)try{return l.nativeSubtle.deriveKey.apply(l.nativeSubtle,u).catch(function(e){console.warn("WebCrypto: native deriveKey for "+s.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native deriveKey for "+s.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return i(e,o),e;var r;switch(s.name.toLowerCase()){case h.AlgorithmNames.EcDH.toLowerCase():r=C.EcCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"deriveBits")}return r.deriveKey(s,t,c,a,o)})},r.prototype.encrypt=function(r,t,a){var o,i,s=arguments;return e.prototype.encrypt.apply(this,s).then(function(e){if(o=f.PrepareAlgorithm(r),i=f.PrepareData(a,"data"),l.nativeSubtle)try{return l.nativeSubtle.encrypt.apply(l.nativeSubtle,s).catch(function(e){console.warn("WebCrypto: native 'encrypt' for "+o.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'encrypt' for "+o.name+" doesn't work.",e.message||"")}}).then(function(e){if(e){if(A.BrowserInfo().name===A.Browser.IE&&o.name.toUpperCase()===h.AlgorithmNames.AesGCM&&e.ciphertext){var r=new Uint8Array(e.ciphertext.byteLength+e.tag.byteLength),a=0;new Uint8Array(e.ciphertext).forEach(function(e){return r[a++]=e}),new Uint8Array(e.tag).forEach(function(e){return r[a++]=e}),e=r.buffer}return Promise.resolve(e)}var s;switch(o.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():s=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():s=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"encrypt")}return n(t,s).then(function(e){return s.encrypt(o,e,i)})})},r.prototype.decrypt=function(r,t,n){var a,o,i=arguments;return e.prototype.decrypt.apply(this,i).then(function(e){a=f.PrepareAlgorithm(r),o=f.PrepareData(n,"data");var i=o;if(A.BrowserInfo().name===A.Browser.IE&&a.name.toUpperCase()===h.AlgorithmNames.AesGCM){var s=o.byteLength-a.tagLength/8;i={ciphertext:o.buffer.slice(0,s),tag:o.buffer.slice(s,o.byteLength)}}if(t.key){var c=void 0;switch(a.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():c=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():c=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"decrypt")}return c.decrypt(a,t,o)}return l.nativeSubtle.decrypt.call(l.nativeSubtle,a,t,i)})},r.prototype.wrapKey=function(r,t,n,a){var o,i=arguments;return e.prototype.wrapKey.apply(this,i).then(function(e){if(o=f.PrepareAlgorithm(a),l.nativeSubtle)try{return l.nativeSubtle.wrapKey.apply(l.nativeSubtle,i).catch(function(e){console.warn("WebCrypto: native 'wrapKey' for "+o.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'wrapKey' for "+o.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return e;var a;switch(o.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():a=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():a=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"wrapKey")}return a.wrapKey(r,t,n,o)})},r.prototype.unwrapKey=function(r,t,n,a,o,s,c){var u,p,y,v=this,C=arguments;return e.prototype.unwrapKey.apply(this,C).then(function(e){if(u=f.PrepareAlgorithm(a),p=f.PrepareAlgorithm(o),y=f.PrepareData(t,"wrappedKey"),n.key){var d=void 0;switch(u.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():d=w.AesCrypto;break;case h.AlgorithmNames.RsaOAEP.toLowerCase():d=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.NOT_SUPPORTED,"unwrapKey")}return d.unwrapKey(r,y,n,u,p,s,c)}return l.nativeSubtle.unwrapKey.apply(l.nativeSubtle,C).catch(function(e){return v.decrypt(u,n,t).then(function(e){var t;return t="jwk"===r?JSON.parse(A.buffer2string(new Uint8Array(e))):e,v.importKey(r,t,p,s,c)})}).then(function(e){if(e)return i(e,c),e}).catch(function(e){throw console.error(e),new Error("Cannot unwrap key from incoming data")})})},r.prototype.exportKey=function(r,t){var n=arguments;return e.prototype.exportKey.apply(this,n).then(function(){if(l.nativeSubtle)try{return l.nativeSubtle.exportKey.apply(l.nativeSubtle,n).catch(function(e){console.warn("WebCrypto: native 'exportKey' for "+t.algorithm.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'exportKey' for "+t.algorithm.name+" doesn't work.",e.message||"")}}).then(function(e){if(e){"jwk"===r&&e instanceof ArrayBuffer&&(e=A.buffer2string(new Uint8Array(e)),e=JSON.parse(e));var n=o(t);return n||(n=A.assign({},t.algorithm)),s(e,n,t.usages),Promise.resolve(e)}if(!t.key)throw new m.LinerError("Cannot export native CryptoKey from JS implementation");var a;switch(t.algorithm.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():a=w.AesCrypto;break;case h.AlgorithmNames.EcDH.toLowerCase():case h.AlgorithmNames.EcDSA.toLowerCase():a=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():case h.AlgorithmNames.RsaOAEP.toLowerCase():a=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,t.algorithm.name.toLowerCase())}return a.exportKey(r,t)})},r.prototype.importKey=function(r,t,n,o,s){var u,p,y=arguments;return e.prototype.importKey.apply(this,y).then(function(e){if(u=f.PrepareAlgorithm(n),p=t,A.BrowserInfo().name!==A.Browser.Safari&&A.BrowserInfo().name!==A.Browser.IE||(A.BrowserInfo().name===A.Browser.IE&&(t=A.assign({},t),c(t)),y[1]=A.string2buffer(JSON.stringify(t)).buffer),ArrayBuffer.isView(t)&&(p=f.PrepareData(t,"keyData")),l.nativeSubtle)try{return l.nativeSubtle.importKey.apply(l.nativeSubtle,y).catch(function(e){console.warn("WebCrypto: native 'importKey' for "+u.name+" doesn't work.",e.message||"")})}catch(e){console.warn("WebCrypto: native 'importKey' for "+u.name+" doesn't work.",e.message||"")}}).then(function(e){if(e)return a(u,e),i(e,s),Promise.resolve(e);var t;switch(u.name.toLowerCase()){case h.AlgorithmNames.AesECB.toLowerCase():case h.AlgorithmNames.AesCBC.toLowerCase():case h.AlgorithmNames.AesGCM.toLowerCase():t=w.AesCrypto;break;case h.AlgorithmNames.EcDH.toLowerCase():case h.AlgorithmNames.EcDSA.toLowerCase():t=C.EcCrypto;break;case h.AlgorithmNames.RsaSSA.toLowerCase():case h.AlgorithmNames.RsaPSS.toLowerCase():case h.AlgorithmNames.RsaOAEP.toLowerCase():t=g.RsaCrypto;break;default:throw new m.LinerError(m.LinerError.UNSUPPORTED_ALGORITHM,u.name.toLowerCase())}return t.importKey(r,p,u,o,s)})},r}(p.SubtleCrypto);r.SubtleCrypto=E,Uint8Array.prototype.forEach||(Uint8Array.prototype.forEach=function(e){for(var r=0;re;e++){var g=a.charCodeAt(e);if(b&&g>=55296&&56319>=g){if(++e>=c)throw new Error("Malformed string, low surrogate expected at position "+e);g=(55296^g)<<10|65536|56320^a.charCodeAt(e)}else if(!b&&g>>>8)throw new Error("Wide characters are not allowed.");!b||127>=g?d[f++]=g:2047>=g?(d[f++]=192|g>>6,d[f++]=128|63&g):65535>=g?(d[f++]=224|g>>12,d[f++]=128|g>>6&63,d[f++]=128|63&g):(d[f++]=240|g>>18,d[f++]=128|g>>12&63,d[f++]=128|g>>6&63,d[f++]=128|63&g)}return d.subarray(0,f)}function g(a){var b=a.length;1&b&&(a="0"+a,b++);for(var c=new Uint8Array(b>>1),d=0;b>d;d+=2)c[d>>1]=parseInt(a.substr(d,2),16);return c}function h(a){return f(atob(a))}function i(a,b){b=!!b;for(var c=a.length,d=new Array(c),e=0,f=0;c>e;e++){var g=a[e];if(!b||128>g)d[f++]=g;else if(g>=192&&224>g&&c>e+1)d[f++]=(31&g)<<6|63&a[++e];else if(g>=224&&240>g&&c>e+2)d[f++]=(15&g)<<12|(63&a[++e])<<6|63&a[++e];else{if(!(g>=240&&248>g&&c>e+3))throw new Error("Malformed UTF8 character at byte offset "+e);var h=(7&g)<<18|(63&a[++e])<<12|(63&a[++e])<<6|63&a[++e];65535>=h?d[f++]=h:(h^=65536,d[f++]=55296|h>>10,d[f++]=56320|1023&h)}}for(var i="",j=16384,e=0;f>e;e+=j)i+=String.fromCharCode.apply(String,d.slice(e,f>=e+j?e+j:f));return i}function j(a){for(var b="",c=0;c>>1,a|=a>>>2,a|=a>>>4,a|=a>>>8,a|=a>>>16,a+=1}function m(a){return"number"==typeof a}function n(a){return"string"==typeof a}function o(a){return a instanceof ArrayBuffer}function p(a){return a instanceof Uint8Array}function q(a){return a instanceof Int8Array||a instanceof Uint8Array||a instanceof Int16Array||a instanceof Uint16Array||a instanceof Int32Array||a instanceof Uint32Array||a instanceof Float32Array||a instanceof Float64Array}function r(a,b){var c=b.heap,d=c?c.byteLength:b.heapSize||65536;if(4095&d||0>=d)throw new Error("heap size must be a positive integer and a multiple of 4096");return c=c||new a(new ArrayBuffer(d))}function s(a,b,c,d,e){var f=a.length-b,g=e>f?f:e;return a.set(c.subarray(d,d+g),b),g}function t(a){a=a||{},this.heap=r(Uint8Array,a).subarray(Xa.HEAP_DATA),this.asm=a.asm||Xa(b,null,this.heap.buffer),this.mode=null,this.key=null,this.reset(a)}function u(a){if(void 0!==a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("unexpected key type");a=f(a)}var b=a.length;if(16!==b&&24!==b&&32!==b)throw new d("illegal key size");var c=new DataView(a.buffer,a.byteOffset,a.byteLength);this.asm.set_key(b>>2,c.getUint32(0),c.getUint32(4),c.getUint32(8),c.getUint32(12),b>16?c.getUint32(16):0,b>16?c.getUint32(20):0,b>24?c.getUint32(24):0,b>24?c.getUint32(28):0),this.key=a}else if(!this.key)throw new Error("key is required")}function v(a){if(void 0!==a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("unexpected iv type");a=f(a)}if(16!==a.length)throw new d("illegal iv size");var b=new DataView(a.buffer,a.byteOffset,a.byteLength);this.iv=a,this.asm.set_iv(b.getUint32(0),b.getUint32(4),b.getUint32(8),b.getUint32(12))}else this.iv=null,this.asm.set_iv(0,0,0,0)}function w(a){void 0!==a?this.padding=!!a:this.padding=!0}function x(a){return a=a||{},this.result=null,this.pos=0,this.len=0,u.call(this,a.key),this.hasOwnProperty("iv")&&v.call(this,a.iv),this.hasOwnProperty("padding")&&w.call(this,a.padding),this}function y(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,c=this.heap,d=Xa.ENC[this.mode],e=Xa.HEAP_DATA,g=this.pos,h=this.len,i=0,j=a.length||0,k=0,l=h+j&-16,m=0,q=new Uint8Array(l);j>0;)m=s(c,g+h,a,i,j),h+=m,i+=m,j-=m,m=b.cipher(d,e+g,h),m&&q.set(c.subarray(g,g+m),k),k+=m,h>m?(g+=m,h-=m):(g=0,h=0);return this.result=q,this.pos=g,this.len=h,this}function z(a){var b=null,c=0;void 0!==a&&(b=y.call(this,a).result,c=b.length);var e=this.asm,f=this.heap,g=Xa.ENC[this.mode],h=Xa.HEAP_DATA,i=this.pos,j=this.len,k=16-j%16,l=j;if(this.hasOwnProperty("padding")){if(this.padding){for(var m=0;k>m;++m)f[i+j+m]=k;j+=k,l=j}else if(j%16)throw new d("data length must be a multiple of the block size")}else j+=k;var n=new Uint8Array(c+l);return c&&n.set(b),j&&e.cipher(g,h+i,j),l&&n.set(f.subarray(i,i+l),c),this.result=n,this.pos=0,this.len=0,this}function A(a){this.nonce=null,this.counter=0,this.counterSize=0,t.call(this,a),this.mode="CTR"}function B(a){A.call(this,a)}function C(a,b,c){if(void 0!==c){if(8>c||c>48)throw new d("illegal counter size");this.counterSize=c;var e=Math.pow(2,c)-1;this.asm.set_mask(0,0,e/4294967296|0,0|e)}else this.counterSize=c=48,this.asm.set_mask(0,0,65535,4294967295);if(void 0===a)throw new Error("nonce is required");if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("unexpected nonce type");a=f(a)}var g=a.length;if(!g||g>16)throw new d("illegal nonce size");this.nonce=a;var h=new DataView(new ArrayBuffer(16));if(new Uint8Array(h.buffer).set(a),this.asm.set_nonce(h.getUint32(0),h.getUint32(4),h.getUint32(8),h.getUint32(12)),void 0!==b){if(!m(b))throw new TypeError("unexpected counter type");if(0>b||b>=Math.pow(2,c))throw new d("illegal counter value");this.counter=b,this.asm.set_counter(0,0,b/4294967296|0,0|b)}else this.counter=b=0}function D(a){return a=a||{},x.call(this,a),C.call(this,a.nonce,a.counter,a.counterSize),this}function E(a){for(var b=this.heap,c=this.asm,d=0,e=a.length||0,f=0;e>0;){for(f=s(b,0,a,d,e),d+=f,e-=f;15&f;)b[f++]=0;c.mac(Xa.MAC.GCM,Xa.HEAP_DATA,f)}}function F(a){this.nonce=null,this.adata=null,this.iv=null,this.counter=1,this.tagSize=16,t.call(this,a),this.mode="GCM"}function G(a){F.call(this,a)}function H(a){F.call(this,a)}function I(a){a=a||{},x.call(this,a);var b=this.asm,c=this.heap;b.gcm_init();var e=a.tagSize;if(void 0!==e){if(!m(e))throw new TypeError("tagSize must be a number");if(4>e||e>16)throw new d("illegal tagSize value");this.tagSize=e}else this.tagSize=16;var g=a.nonce;if(void 0===g)throw new Error("nonce is required");if(p(g)||o(g))g=new Uint8Array(g);else{if(!n(g))throw new TypeError("unexpected nonce type");g=f(g)}this.nonce=g;var h=g.length||0,i=new Uint8Array(16);12!==h?(E.call(this,g),c[0]=c[1]=c[2]=c[3]=c[4]=c[5]=c[6]=c[7]=c[8]=c[9]=c[10]=0,c[11]=h>>>29,c[12]=h>>>21&255,c[13]=h>>>13&255,c[14]=h>>>5&255,c[15]=h<<3&255,b.mac(Xa.MAC.GCM,Xa.HEAP_DATA,16),b.get_iv(Xa.HEAP_DATA),b.set_iv(),i.set(c.subarray(0,16))):(i.set(g),i[15]=1);var j=new DataView(i.buffer);this.gamma0=j.getUint32(12),b.set_nonce(j.getUint32(0),j.getUint32(4),j.getUint32(8),0),b.set_mask(0,0,0,4294967295);var k=a.adata;if(void 0!==k&&null!==k){if(p(k)||o(k))k=new Uint8Array(k);else{if(!n(k))throw new TypeError("unexpected adata type");k=f(k)}if(k.length>$a)throw new d("illegal adata length");k.length?(this.adata=k,E.call(this,k)):this.adata=null}else this.adata=null;var l=a.counter;if(void 0!==l){if(!m(l))throw new TypeError("counter must be a number");if(1>l||l>4294967295)throw new RangeError("counter must be a positive 32-bit integer");this.counter=l,b.set_counter(0,0,0,this.gamma0+l|0)}else this.counter=1,b.set_counter(0,0,0,this.gamma0+1|0);var q=a.iv;if(void 0!==q){if(!m(l))throw new TypeError("counter must be a number");this.iv=q,v.call(this,q)}return this}function J(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");var b=0,c=a.length||0,d=this.asm,e=this.heap,g=this.counter,h=this.pos,i=this.len,j=0,k=i+c&-16,l=0;if((g-1<<4)+i+c>$a)throw new RangeError("counter overflow");for(var m=new Uint8Array(k);c>0;)l=s(e,h+i,a,b,c),i+=l,b+=l,c-=l,l=d.cipher(Xa.ENC.CTR,Xa.HEAP_DATA+h,i),l=d.mac(Xa.MAC.GCM,Xa.HEAP_DATA+h,l),l&&m.set(e.subarray(h,h+l),j),g+=l>>>4,j+=l,i>l?(h+=l,i-=l):(h=0,i=0);return this.result=m,this.counter=g,this.pos=h,this.len=i,this}function K(){var a=this.asm,b=this.heap,c=this.counter,d=this.tagSize,e=this.adata,f=this.pos,g=this.len,h=new Uint8Array(g+d);a.cipher(Xa.ENC.CTR,Xa.HEAP_DATA+f,g+15&-16),g&&h.set(b.subarray(f,f+g));for(var i=g;15&i;i++)b[f+i]=0;a.mac(Xa.MAC.GCM,Xa.HEAP_DATA+f,i);var j=null!==e?e.length:0,k=(c-1<<4)+g;return b[0]=b[1]=b[2]=0,b[3]=j>>>29,b[4]=j>>>21,b[5]=j>>>13&255,b[6]=j>>>5&255,b[7]=j<<3&255,b[8]=b[9]=b[10]=0,b[11]=k>>>29,b[12]=k>>>21&255,b[13]=k>>>13&255,b[14]=k>>>5&255,b[15]=k<<3&255,a.mac(Xa.MAC.GCM,Xa.HEAP_DATA,16),a.get_iv(Xa.HEAP_DATA),a.set_counter(0,0,0,this.gamma0),a.cipher(Xa.ENC.CTR,Xa.HEAP_DATA,16),h.set(b.subarray(0,d),g),this.result=h,this.counter=1,this.pos=0,this.len=0,this}function L(a){var b=J.call(this,a).result,c=K.call(this).result,d=new Uint8Array(b.length+c.length);return b.length&&d.set(b),c.length&&d.set(c,b.length),this.result=d,this}function M(a){if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");var b=0,c=a.length||0,d=this.asm,e=this.heap,g=this.counter,h=this.tagSize,i=this.pos,j=this.len,k=0,l=j+c>h?j+c-h&-16:0,m=j+c-l,q=0;if((g-1<<4)+j+c>$a)throw new RangeError("counter overflow");for(var r=new Uint8Array(l);c>m;)q=s(e,i+j,a,b,c-m),j+=q,b+=q,c-=q,q=d.mac(Xa.MAC.GCM,Xa.HEAP_DATA+i,q),q=d.cipher(Xa.DEC.CTR,Xa.HEAP_DATA+i,q),q&&r.set(e.subarray(i,i+q),k),g+=q>>>4,k+=q,i=0,j=0;return c>0&&(j+=s(e,0,a,b,c)),this.result=r,this.counter=g,this.pos=i,this.len=j,this}function N(){var a=this.asm,b=this.heap,d=this.tagSize,f=this.adata,g=this.counter,h=this.pos,i=this.len,j=i-d,k=0;if(d>i)throw new c("authentication tag not found");for(var l=new Uint8Array(j),m=new Uint8Array(b.subarray(h+j,h+i)),n=j;15&n;n++)b[h+n]=0;k=a.mac(Xa.MAC.GCM,Xa.HEAP_DATA+h,n),k=a.cipher(Xa.DEC.CTR,Xa.HEAP_DATA+h,n),j&&l.set(b.subarray(h,h+j));var o=null!==f?f.length:0,p=(g-1<<4)+i-d;b[0]=b[1]=b[2]=0,b[3]=o>>>29,b[4]=o>>>21,b[5]=o>>>13&255,b[6]=o>>>5&255,b[7]=o<<3&255,b[8]=b[9]=b[10]=0,b[11]=p>>>29,b[12]=p>>>21&255,b[13]=p>>>13&255,b[14]=p>>>5&255,b[15]=p<<3&255,a.mac(Xa.MAC.GCM,Xa.HEAP_DATA,16),a.get_iv(Xa.HEAP_DATA),a.set_counter(0,0,0,this.gamma0),a.cipher(Xa.ENC.CTR,Xa.HEAP_DATA,16);for(var q=0,n=0;d>n;++n)q|=m[n]^b[n];if(q)throw new e("data integrity check failed");return this.result=l,this.counter=1,this.pos=0,this.len=0,this}function O(a){var b=M.call(this,a).result,c=N.call(this).result,d=new Uint8Array(b.length+c.length);return b.length&&d.set(b),c.length&&d.set(c,b.length),this.result=d,this}function P(a,b,c,d,e){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");if(void 0===c)throw new SyntaxError("nonce required");return new F({heap:cb,asm:db,key:b,nonce:c,adata:d,tagSize:e}).encrypt(a).result}function Q(a,b,c,d,e){if(void 0===a)throw new SyntaxError("data required");if(void 0===b)throw new SyntaxError("key required");if(void 0===c)throw new SyntaxError("nonce required");return new F({heap:cb,asm:db,key:b,nonce:c,adata:d,tagSize:e}).decrypt(a).result}function R(){return this.result=null,this.pos=0,this.len=0,this.asm.reset(),this}function S(a){if(null!==this.result)throw new c("state must be reset before processing new data");if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),!p(a))throw new TypeError("data isn't of expected type");for(var b=this.asm,d=this.heap,e=this.pos,g=this.len,h=0,i=a.length,j=0;i>0;)j=s(d,e+g,a,h,i),g+=j,h+=j,i-=j,j=b.process(e,g),e+=j,g-=j,g||(e=0);return this.pos=e,this.len=g,this}function T(){if(null!==this.result)throw new c("state must be reset before processing new data");return this.asm.finish(this.pos,this.len,0),this.result=new Uint8Array(this.HASH_SIZE),this.result.set(this.heap.subarray(0,this.HASH_SIZE)),this.pos=0,this.len=0,this}function U(a,b,c){"use asm";var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0;var n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0;var D=new a.Uint8Array(c);function E(Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;da=da|0;var ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0;ea=d;fa=e;ga=f;ha=g;ia=h;ja=i;ka=j;la=k;ma=Q+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1116352408|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=R+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1899447441|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=S+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3049323471|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=T+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3921009573|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=U+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+961987163|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=V+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1508970993|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=W+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2453635748|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=X+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2870763221|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=Y+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3624381080|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=Z+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+310598401|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=$+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+607225278|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=_+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1426881987|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=aa+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1925078388|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=ba+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2162078206|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=ca+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2614888103|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ma=da+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3248222580|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Q=ma=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3835390401|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;R=ma=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(da>>>17^da>>>19^da>>>10^da<<15^da<<13)+R+$|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+4022224774|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;S=ma=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+264347078|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;T=ma=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+604807628|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;U=ma=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+770255983|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;V=ma=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1249150122|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;W=ma=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+da|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1555081692|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;X=ma=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1996064986|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Y=ma=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2554220882|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Z=ma=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2821834349|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;$=ma=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2952996808|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;_=ma=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3210313671|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;aa=ma=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3336571891|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ba=ma=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3584528711|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ca=ma=(da>>>7^da>>>18^da>>>3^da<<25^da<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+113926993|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;da=ma=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+da+Y|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+338241895|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Q=ma=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+666307205|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;R=ma=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(da>>>17^da>>>19^da>>>10^da<<15^da<<13)+R+$|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+773529912|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;S=ma=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1294757372|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;T=ma=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1396182291|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;U=ma=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1695183700|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;V=ma=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1986661051|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;W=ma=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+da|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2177026350|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;X=ma=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2456956037|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Y=ma=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2730485921|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Z=ma=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2820302411|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;$=ma=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3259730800|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;_=ma=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3345764771|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;aa=ma=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3516065817|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ba=ma=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3600352804|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ca=ma=(da>>>7^da>>>18^da>>>3^da<<25^da<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+4094571909|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;da=ma=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+da+Y|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+275423344|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Q=ma=(R>>>7^R>>>18^R>>>3^R<<25^R<<14)+(ca>>>17^ca>>>19^ca>>>10^ca<<15^ca<<13)+Q+Z|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+430227734|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;R=ma=(S>>>7^S>>>18^S>>>3^S<<25^S<<14)+(da>>>17^da>>>19^da>>>10^da<<15^da<<13)+R+$|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+506948616|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;S=ma=(T>>>7^T>>>18^T>>>3^T<<25^T<<14)+(Q>>>17^Q>>>19^Q>>>10^Q<<15^Q<<13)+S+_|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+659060556|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;T=ma=(U>>>7^U>>>18^U>>>3^U<<25^U<<14)+(R>>>17^R>>>19^R>>>10^R<<15^R<<13)+T+aa|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+883997877|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;U=ma=(V>>>7^V>>>18^V>>>3^V<<25^V<<14)+(S>>>17^S>>>19^S>>>10^S<<15^S<<13)+U+ba|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+958139571|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;V=ma=(W>>>7^W>>>18^W>>>3^W<<25^W<<14)+(T>>>17^T>>>19^T>>>10^T<<15^T<<13)+V+ca|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1322822218|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;W=ma=(X>>>7^X>>>18^X>>>3^X<<25^X<<14)+(U>>>17^U>>>19^U>>>10^U<<15^U<<13)+W+da|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1537002063|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;X=ma=(Y>>>7^Y>>>18^Y>>>3^Y<<25^Y<<14)+(V>>>17^V>>>19^V>>>10^V<<15^V<<13)+X+Q|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1747873779|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Y=ma=(Z>>>7^Z>>>18^Z>>>3^Z<<25^Z<<14)+(W>>>17^W>>>19^W>>>10^W<<15^W<<13)+Y+R|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+1955562222|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;Z=ma=($>>>7^$>>>18^$>>>3^$<<25^$<<14)+(X>>>17^X>>>19^X>>>10^X<<15^X<<13)+Z+S|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2024104815|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;$=ma=(_>>>7^_>>>18^_>>>3^_<<25^_<<14)+(Y>>>17^Y>>>19^Y>>>10^Y<<15^Y<<13)+$+T|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2227730452|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;_=ma=(aa>>>7^aa>>>18^aa>>>3^aa<<25^aa<<14)+(Z>>>17^Z>>>19^Z>>>10^Z<<15^Z<<13)+_+U|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2361852424|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;aa=ma=(ba>>>7^ba>>>18^ba>>>3^ba<<25^ba<<14)+($>>>17^$>>>19^$>>>10^$<<15^$<<13)+aa+V|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2428436474|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ba=ma=(ca>>>7^ca>>>18^ca>>>3^ca<<25^ca<<14)+(_>>>17^_>>>19^_>>>10^_<<15^_<<13)+ba+W|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+2756734187|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;ca=ma=(da>>>7^da>>>18^da>>>3^da<<25^da<<14)+(aa>>>17^aa>>>19^aa>>>10^aa<<15^aa<<13)+ca+X|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3204031479|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;da=ma=(Q>>>7^Q>>>18^Q>>>3^Q<<25^Q<<14)+(ba>>>17^ba>>>19^ba>>>10^ba<<15^ba<<13)+da+Y|0;ma=ma+la+(ia>>>6^ia>>>11^ia>>>25^ia<<26^ia<<21^ia<<7)+(ka^ia&(ja^ka))+3329325298|0;la=ka;ka=ja;ja=ia;ia=ha+ma|0;ha=ga;ga=fa;fa=ea;ea=ma+(fa&ga^ha&(fa^ga))+(fa>>>2^fa>>>13^fa>>>22^fa<<30^fa<<19^fa<<10)|0;d=d+ea|0;e=e+fa|0;f=f+ga|0;g=g+ha|0;h=h+ia|0;i=i+ja|0;j=j+ka|0;k=k+la|0}function F(Q){Q=Q|0;E(D[Q|0]<<24|D[Q|1]<<16|D[Q|2]<<8|D[Q|3],D[Q|4]<<24|D[Q|5]<<16|D[Q|6]<<8|D[Q|7],D[Q|8]<<24|D[Q|9]<<16|D[Q|10]<<8|D[Q|11],D[Q|12]<<24|D[Q|13]<<16|D[Q|14]<<8|D[Q|15],D[Q|16]<<24|D[Q|17]<<16|D[Q|18]<<8|D[Q|19],D[Q|20]<<24|D[Q|21]<<16|D[Q|22]<<8|D[Q|23],D[Q|24]<<24|D[Q|25]<<16|D[Q|26]<<8|D[Q|27],D[Q|28]<<24|D[Q|29]<<16|D[Q|30]<<8|D[Q|31],D[Q|32]<<24|D[Q|33]<<16|D[Q|34]<<8|D[Q|35],D[Q|36]<<24|D[Q|37]<<16|D[Q|38]<<8|D[Q|39],D[Q|40]<<24|D[Q|41]<<16|D[Q|42]<<8|D[Q|43],D[Q|44]<<24|D[Q|45]<<16|D[Q|46]<<8|D[Q|47],D[Q|48]<<24|D[Q|49]<<16|D[Q|50]<<8|D[Q|51],D[Q|52]<<24|D[Q|53]<<16|D[Q|54]<<8|D[Q|55],D[Q|56]<<24|D[Q|57]<<16|D[Q|58]<<8|D[Q|59],D[Q|60]<<24|D[Q|61]<<16|D[Q|62]<<8|D[Q|63])}function G(Q){Q=Q|0;D[Q|0]=d>>>24;D[Q|1]=d>>>16&255;D[Q|2]=d>>>8&255;D[Q|3]=d&255;D[Q|4]=e>>>24;D[Q|5]=e>>>16&255;D[Q|6]=e>>>8&255;D[Q|7]=e&255;D[Q|8]=f>>>24;D[Q|9]=f>>>16&255;D[Q|10]=f>>>8&255;D[Q|11]=f&255;D[Q|12]=g>>>24;D[Q|13]=g>>>16&255;D[Q|14]=g>>>8&255;D[Q|15]=g&255;D[Q|16]=h>>>24;D[Q|17]=h>>>16&255;D[Q|18]=h>>>8&255;D[Q|19]=h&255;D[Q|20]=i>>>24;D[Q|21]=i>>>16&255;D[Q|22]=i>>>8&255;D[Q|23]=i&255;D[Q|24]=j>>>24;D[Q|25]=j>>>16&255;D[Q|26]=j>>>8&255;D[Q|27]=j&255;D[Q|28]=k>>>24;D[Q|29]=k>>>16&255;D[Q|30]=k>>>8&255;D[Q|31]=k&255}function H(){d=1779033703;e=3144134277;f=1013904242;g=2773480762;h=1359893119;i=2600822924;j=528734635;k=1541459225;l=m=0}function I(Q,R,S,T,U,V,W,X,Y,Z){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;d=Q;e=R;f=S;g=T;h=U;i=V;j=W;k=X;l=Y;m=Z}function J(Q,R){Q=Q|0;R=R|0;var S=0;if(Q&63)return-1;while((R|0)>=64){F(Q);Q=Q+64|0;R=R-64|0;S=S+64|0}l=l+S|0;if(l>>>0>>0)m=m+1|0;return S|0}function K(Q,R,S){Q=Q|0;R=R|0;S=S|0;var T=0,U=0;if(Q&63)return-1;if(~S)if(S&31)return-1;if((R|0)>=64){T=J(Q,R)|0;if((T|0)==-1)return-1;Q=Q+T|0;R=R-T|0}T=T+R|0;l=l+R|0;if(l>>>0>>0)m=m+1|0;D[Q|R]=128;if((R|0)>=56){for(U=R+1|0;(U|0)<64;U=U+1|0)D[Q|U]=0;F(Q);R=0;D[Q|0]=0}for(U=R+1|0;(U|0)<59;U=U+1|0)D[Q|U]=0;D[Q|56]=m>>>21&255;D[Q|57]=m>>>13&255;D[Q|58]=m>>>5&255;D[Q|59]=m<<3&255|l>>>29;D[Q|60]=l>>>21&255;D[Q|61]=l>>>13&255;D[Q|62]=l>>>5&255;D[Q|63]=l<<3&255;F(Q);if(~S)G(S);return T|0}function L(){d=n;e=o;f=p;g=q;h=r;i=s;j=t;k=u;l=64;m=0}function M(){d=v;e=w;f=x;g=y;h=z;i=A;j=B;k=C;l=64;m=0}function N(Q,R,S,T,U,V,W,X,Y,Z,$,_,aa,ba,ca,da){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;V=V|0;W=W|0;X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;da=da|0;H();E(Q^1549556828,R^1549556828,S^1549556828,T^1549556828,U^1549556828,V^1549556828,W^1549556828,X^1549556828,Y^1549556828,Z^1549556828,$^1549556828,_^1549556828,aa^1549556828,ba^1549556828,ca^1549556828,da^1549556828);v=d;w=e;x=f;y=g;z=h;A=i;B=j;C=k;H();E(Q^909522486,R^909522486,S^909522486,T^909522486,U^909522486,V^909522486,W^909522486,X^909522486,Y^909522486,Z^909522486,$^909522486,_^909522486,aa^909522486,ba^909522486,ca^909522486,da^909522486); - -n=d;o=e;p=f;q=g;r=h;s=i;t=j;u=k;l=64;m=0}function O(Q,R,S){Q=Q|0;R=R|0;S=S|0;var T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0;if(Q&63)return-1;if(~S)if(S&31)return-1;_=K(Q,R,-1)|0;T=d,U=e,V=f,W=g,X=h,Y=i,Z=j,$=k;M();E(T,U,V,W,X,Y,Z,$,2147483648,0,0,0,0,0,0,768);if(~S)G(S);return _|0}function P(Q,R,S,T,U){Q=Q|0;R=R|0;S=S|0;T=T|0;U=U|0;var V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;if(Q&63)return-1;if(~U)if(U&31)return-1;D[Q+R|0]=S>>>24;D[Q+R+1|0]=S>>>16&255;D[Q+R+2|0]=S>>>8&255;D[Q+R+3|0]=S&255;O(Q,R+4|0,-1)|0;V=ba=d,W=ca=e,X=da=f,Y=ea=g,Z=fa=h,$=ga=i,_=ha=j,aa=ia=k;T=T-1|0;while((T|0)>0){L();E(ba,ca,da,ea,fa,ga,ha,ia,2147483648,0,0,0,0,0,0,768);ba=d,ca=e,da=f,ea=g,fa=h,ga=i,ha=j,ia=k;M();E(ba,ca,da,ea,fa,ga,ha,ia,2147483648,0,0,0,0,0,0,768);ba=d,ca=e,da=f,ea=g,fa=h,ga=i,ha=j,ia=k;V=V^d;W=W^e;X=X^f;Y=Y^g;Z=Z^h;$=$^i;_=_^j;aa=aa^k;T=T-1|0}d=V;e=W;f=X;g=Y;h=Z;i=$;j=_;k=aa;if(~U)G(U);return 0}return{reset:H,init:I,process:J,finish:K,hmac_reset:L,hmac_init:N,hmac_finish:O,pbkdf2_generate_block:P}}function V(a){a=a||{},this.heap=r(Uint8Array,a),this.asm=a.asm||U({Uint8Array:Uint8Array},null,this.heap.buffer),this.BLOCK_SIZE=eb,this.HASH_SIZE=fb,this.reset()}function W(){return null===hb&&(hb=new V({heapSize:1048576})),hb}function X(a){if(void 0===a)throw new SyntaxError("data required");return W().reset().process(a).finish().result}function Y(a){var b=X(a);return j(b)}function Z(a){var b=X(a);return k(b)}function $(a){if(a=a||{},!a.hash)throw new SyntaxError("option 'hash' is required");if(!a.hash.HASH_SIZE)throw new SyntaxError("option 'hash' supplied doesn't seem to be a valid hash function");return this.hash=a.hash,this.BLOCK_SIZE=this.hash.BLOCK_SIZE,this.HMAC_SIZE=this.hash.HASH_SIZE,this.key=null,this.verify=null,this.result=null,(void 0!==a.password||void 0!==a.verify)&&this.reset(a),this}function _(a,b){if(o(b)&&(b=new Uint8Array(b)),n(b)&&(b=f(b)),!p(b))throw new TypeError("password isn't of expected type");var c=new Uint8Array(a.BLOCK_SIZE);return c.set(b.length>a.BLOCK_SIZE?a.reset().process(b).finish().result:b),c}function aa(a){if(o(a)||p(a))a=new Uint8Array(a);else{if(!n(a))throw new TypeError("verify tag isn't of expected type");a=f(a)}if(a.length!==this.HMAC_SIZE)throw new d("illegal verification tag size");this.verify=a}function ba(a){a=a||{};var b=a.password;if(null===this.key&&!n(b)&&!b)throw new c("no key is associated with the instance");this.result=null,this.hash.reset(),(b||n(b))&&(this.key=_(this.hash,b));for(var d=new Uint8Array(this.key),e=0;e=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE,j=new Uint8Array(this.hmac.reset().process(a).process(new Uint8Array([g>>>24&255,g>>>16&255,g>>>8&255,255&g])).finish().result);this.result.set(j.subarray(0,i),h);for(var k=1;b>k;++k){j=new Uint8Array(this.hmac.reset().process(j).finish().result);for(var l=0;i>l;++l)this.result[h+l]^=j[l]}}return this}function oa(a){return a=a||{},a.hmac instanceof ea||(a.hmac=ha()),la.call(this,a),this}function pa(a,b,e){if(null!==this.result)throw new c("state must be reset before processing new data");if(!a&&!n(a))throw new d("bad 'salt' value");b=b||this.count,e=e||this.length,this.result=new Uint8Array(e);for(var f=Math.ceil(e/this.hmac.HMAC_SIZE),g=1;f>=g;++g){var h=(g-1)*this.hmac.HMAC_SIZE,i=(f>g?0:e%this.hmac.HMAC_SIZE)||this.hmac.HMAC_SIZE;this.hmac.reset().process(a),this.hmac.hash.asm.pbkdf2_generate_block(this.hmac.hash.pos,this.hmac.hash.len,g,b,0),this.result.set(this.hmac.hash.heap.subarray(0,i),h)}return this}function qa(){return null===ob&&(ob=new oa),ob}function ra(){if(void 0!==ub)d=new Uint8Array(32),nb.call(ub,d),xb(d);else{var a,c,d=new Wa(3);d[0]=sb(),d[1]=rb(),d[2]=vb(),d=new Uint8Array(d.buffer);var e="";void 0!==b.location?e+=b.location.href:void 0!==b.process&&(e+=b.process.pid+b.process.title);var f=qa();for(a=0;100>a;a++)d=f.reset({password:d}).generate(e,1e3,32).result,c=vb(),d[0]^=c>>>24,d[1]^=c>>>16,d[2]^=c>>>8,d[3]^=c;xb(d)}yb=0,zb=!0}function sa(a){if(!o(a)&&!q(a))throw new TypeError("bad seed type");var b=a.byteOffset||0,c=a.byteLength||a.length,d=new Uint8Array(a.buffer||a,b,c);xb(d),yb=0;for(var e=0,f=0;f=Cb}function ta(a){if(zb||ra(),!Ab&&void 0===ub){if(!Db)throw new e("No strong PRNGs available. Use asmCrypto.random.seed().");void 0!==qb&&qb.error("No strong PRNGs available; your security is greatly lowered. Use asmCrypto.random.seed().")}if(!Eb&&!Ab&&void 0!==ub&&void 0!==qb){var b=(new Error).stack;Fb[b]|=0,Fb[b]++||qb.warn("asmCrypto PRNG not seeded; your security relies on your system PRNG. If this is not acceptable, use asmCrypto.random.seed().")}if(!o(a)&&!q(a))throw new TypeError("unexpected buffer type");var c,d,f=a.byteOffset||0,g=a.byteLength||a.length,h=new Uint8Array(a.buffer||a,f,g);for(void 0!==ub&&nb.call(ub,h),c=0;g>c;c++)0===(3&c)&&(yb>=1099511627776&&ra(),d=wb(),yb++),h[c]^=d,d>>>=8;return a}function ua(){(!zb||yb>=1099511627776)&&ra();var a=(1048576*wb()+(wb()>>>12))/4503599627370496;return yb+=2,a}function va(a,b,c){"use asm";var d=0;var e=new a.Uint32Array(c);var f=a.Math.imul;function g(u){u=u|0;d=u=u+31&-32;return u|0}function h(u){u=u|0;var v=0;v=d;d=v+(u+31&-32)|0;return v|0}function i(u){u=u|0;d=d-(u+31&-32)|0}function j(u,v,w){u=u|0;v=v|0;w=w|0;var x=0;if((v|0)>(w|0)){for(;(x|0)<(u|0);x=x+4|0){e[w+x>>2]=e[v+x>>2]}}else{for(x=u-4|0;(x|0)>=0;x=x-4|0){e[w+x>>2]=e[v+x>>2]}}}function k(u,v,w){u=u|0;v=v|0;w=w|0;var x=0;for(;(x|0)<(u|0);x=x+4|0){e[w+x>>2]=v}}function l(u,v,w,x){u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0,B=0,C=0;if((x|0)<=0)x=v;if((x|0)<(v|0))v=x;z=1;for(;(C|0)<(v|0);C=C+4|0){y=~e[u+C>>2];A=(y&65535)+z|0;B=(y>>>16)+(A>>>16)|0;e[w+C>>2]=B<<16|A&65535;z=B>>>16}for(;(C|0)<(x|0);C=C+4|0){e[w+C>>2]=z-1|0}return z|0}function m(u,v,w,x){u=u|0;v=v|0;w=w|0;x=x|0;var y=0,z=0,A=0;if((v|0)>(x|0)){for(A=v-4|0;(A|0)>=(x|0);A=A-4|0){if(e[u+A>>2]|0)return 1}}else{for(A=x-4|0;(A|0)>=(v|0);A=A-4|0){if(e[w+A>>2]|0)return-1}}for(;(A|0)>=0;A=A-4|0){y=e[u+A>>2]|0,z=e[w+A>>2]|0;if(y>>>0>>0)return-1;if(y>>>0>z>>>0)return 1}return 0}function n(u,v){u=u|0;v=v|0;var w=0;for(w=v-4|0;(w|0)>=0;w=w-4|0){if(e[u+w>>2]|0)return w+4|0}return 0}function o(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0;if((v|0)<(x|0)){D=u,u=w,w=D;D=v,v=x,x=D}if((z|0)<=0)z=v+4|0;if((z|0)<(x|0))v=x=z;for(;(F|0)<(x|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)+(B&65535)|0)+C|0;E=((A>>>16)+(B>>>16)|0)+(D>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>>16}for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;D=(A&65535)+C|0;E=(A>>>16)+(D>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>>16}for(;(F|0)<(z|0);F=F+4|0){e[y+F>>2]=C|0;C=0}return C|0}function p(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0;if((z|0)<=0)z=(v|0)>(x|0)?v+4|0:x+4|0;if((z|0)<(v|0))v=z;if((z|0)<(x|0))x=z;if((v|0)<(x|0)){for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)-(B&65535)|0)+C|0;E=((A>>>16)-(B>>>16)|0)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}for(;(F|0)<(x|0);F=F+4|0){B=e[w+F>>2]|0;D=C-(B&65535)|0;E=(D>>16)-(B>>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}}else{for(;(F|0)<(x|0);F=F+4|0){A=e[u+F>>2]|0;B=e[w+F>>2]|0;D=((A&65535)-(B&65535)|0)+C|0;E=((A>>>16)-(B>>>16)|0)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}for(;(F|0)<(v|0);F=F+4|0){A=e[u+F>>2]|0;D=(A&65535)+C|0;E=(A>>>16)+(D>>16)|0;e[y+F>>2]=D&65535|E<<16;C=E>>16}}for(;(F|0)<(z|0);F=F+4|0){e[y+F>>2]=C|0}return C|0}function q(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0;if((v|0)>(x|0)){ua=u,va=v;u=w,v=x;w=ua,x=va}xa=v+x|0;if((z|0)>(xa|0)|(z|0)<=0)z=xa;if((z|0)<(v|0))v=z;if((z|0)<(x|0))x=z;for(;(ya|0)<(v|0);ya=ya+32|0){za=u+ya|0;I=e[(za|0)>>2]|0,J=e[(za|4)>>2]|0,K=e[(za|8)>>2]|0,L=e[(za|12)>>2]|0,M=e[(za|16)>>2]|0,N=e[(za|20)>>2]|0,O=e[(za|24)>>2]|0,P=e[(za|28)>>2]|0,A=I&65535,B=J&65535,C=K&65535,D=L&65535,E=M&65535,F=N&65535,G=O&65535,H=P&65535,I=I>>>16,J=J>>>16,K=K>>>16,L=L>>>16,M=M>>>16,N=N>>>16,O=O>>>16,P=P>>>16;ma=na=oa=pa=qa=ra=sa=ta=0;for(Aa=0;(Aa|0)<(x|0);Aa=Aa+32|0){Ba=w+Aa|0;Ca=y+(ya+Aa|0)|0;Y=e[(Ba|0)>>2]|0,Z=e[(Ba|4)>>2]|0,$=e[(Ba|8)>>2]|0,_=e[(Ba|12)>>2]|0,aa=e[(Ba|16)>>2]|0,ba=e[(Ba|20)>>2]|0,ca=e[(Ba|24)>>2]|0,da=e[(Ba|28)>>2]|0,Q=Y&65535,R=Z&65535,S=$&65535,T=_&65535,U=aa&65535,V=ba&65535,W=ca&65535,X=da&65535,Y=Y>>>16,Z=Z>>>16,$=$>>>16,_=_>>>16,aa=aa>>>16,ba=ba>>>16,ca=ca>>>16,da=da>>>16;ea=e[(Ca|0)>>2]|0,fa=e[(Ca|4)>>2]|0,ga=e[(Ca|8)>>2]|0,ha=e[(Ca|12)>>2]|0,ia=e[(Ca|16)>>2]|0,ja=e[(Ca|20)>>2]|0,ka=e[(Ca|24)>>2]|0,la=e[(Ca|28)>>2]|0;ua=((f(A,Q)|0)+(ma&65535)|0)+(ea&65535)|0;va=((f(I,Q)|0)+(ma>>>16)|0)+(ea>>>16)|0;wa=((f(A,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ea=wa<<16|ua&65535;ua=((f(A,R)|0)+(xa&65535)|0)+(fa&65535)|0;va=((f(I,R)|0)+(xa>>>16)|0)+(fa>>>16)|0;wa=((f(A,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;fa=wa<<16|ua&65535;ua=((f(A,S)|0)+(xa&65535)|0)+(ga&65535)|0;va=((f(I,S)|0)+(xa>>>16)|0)+(ga>>>16)|0;wa=((f(A,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(A,T)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(I,T)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(A,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(A,U)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(I,U)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(A,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(A,V)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(I,V)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(A,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(A,W)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(I,W)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(A,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(A,X)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(I,X)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(A,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(I,da)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ma=xa;ua=((f(B,Q)|0)+(na&65535)|0)+(fa&65535)|0;va=((f(J,Q)|0)+(na>>>16)|0)+(fa>>>16)|0;wa=((f(B,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;fa=wa<<16|ua&65535;ua=((f(B,R)|0)+(xa&65535)|0)+(ga&65535)|0;va=((f(J,R)|0)+(xa>>>16)|0)+(ga>>>16)|0;wa=((f(B,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(B,S)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(J,S)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(B,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(B,T)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(J,T)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(B,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(B,U)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(J,U)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(B,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(B,V)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(J,V)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(B,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(B,W)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(J,W)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(B,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(B,X)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(J,X)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(B,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(J,da)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;na=xa;ua=((f(C,Q)|0)+(oa&65535)|0)+(ga&65535)|0;va=((f(K,Q)|0)+(oa>>>16)|0)+(ga>>>16)|0;wa=((f(C,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ga=wa<<16|ua&65535;ua=((f(C,R)|0)+(xa&65535)|0)+(ha&65535)|0;va=((f(K,R)|0)+(xa>>>16)|0)+(ha>>>16)|0;wa=((f(C,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(C,S)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(K,S)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(C,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(C,T)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(K,T)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(C,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(C,U)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(K,U)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(C,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(C,V)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(K,V)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(C,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(C,W)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(K,W)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(C,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(C,X)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(K,X)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(C,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(K,da)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;oa=xa;ua=((f(D,Q)|0)+(pa&65535)|0)+(ha&65535)|0;va=((f(L,Q)|0)+(pa>>>16)|0)+(ha>>>16)|0;wa=((f(D,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ha=wa<<16|ua&65535;ua=((f(D,R)|0)+(xa&65535)|0)+(ia&65535)|0;va=((f(L,R)|0)+(xa>>>16)|0)+(ia>>>16)|0;wa=((f(D,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(D,S)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(L,S)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(D,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(D,T)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(L,T)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(D,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(D,U)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(L,U)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(D,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(D,V)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(L,V)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(D,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(D,W)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(L,W)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(D,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(D,X)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(L,X)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(D,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(L,da)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;pa=xa;ua=((f(E,Q)|0)+(qa&65535)|0)+(ia&65535)|0;va=((f(M,Q)|0)+(qa>>>16)|0)+(ia>>>16)|0;wa=((f(E,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ia=wa<<16|ua&65535;ua=((f(E,R)|0)+(xa&65535)|0)+(ja&65535)|0;va=((f(M,R)|0)+(xa>>>16)|0)+(ja>>>16)|0;wa=((f(E,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(E,S)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(M,S)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(E,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(E,T)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(M,T)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(E,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,_)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(E,U)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(M,U)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(E,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(E,V)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(M,V)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(E,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(E,W)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(M,W)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(E,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(E,X)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(M,X)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(E,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(M,da)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;qa=xa;ua=((f(F,Q)|0)+(ra&65535)|0)+(ja&65535)|0;va=((f(N,Q)|0)+(ra>>>16)|0)+(ja>>>16)|0;wa=((f(F,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ja=wa<<16|ua&65535;ua=((f(F,R)|0)+(xa&65535)|0)+(ka&65535)|0;va=((f(N,R)|0)+(xa>>>16)|0)+(ka>>>16)|0;wa=((f(F,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(F,S)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(N,S)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(F,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,$)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(F,T)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(N,T)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(F,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,_)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(F,U)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(N,U)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(F,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(F,V)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(N,V)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(F,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(F,W)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(N,W)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(F,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(F,X)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(N,X)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(F,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(N,da)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ra=xa;ua=((f(G,Q)|0)+(sa&65535)|0)+(ka&65535)|0;va=((f(O,Q)|0)+(sa>>>16)|0)+(ka>>>16)|0;wa=((f(G,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;ka=wa<<16|ua&65535;ua=((f(G,R)|0)+(xa&65535)|0)+(la&65535)|0;va=((f(O,R)|0)+(xa>>>16)|0)+(la>>>16)|0;wa=((f(G,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(G,S)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(O,S)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(G,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,$)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(G,T)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(O,T)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(G,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,_)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(G,U)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(O,U)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(G,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(G,V)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(O,V)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(G,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(G,W)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(O,W)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(G,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ua=((f(G,X)|0)+(xa&65535)|0)+(ra&65535)|0;va=((f(O,X)|0)+(xa>>>16)|0)+(ra>>>16)|0;wa=((f(G,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(O,da)|0)+(va>>>16)|0)+(wa>>>16)|0;ra=wa<<16|ua&65535;sa=xa;ua=((f(H,Q)|0)+(ta&65535)|0)+(la&65535)|0;va=((f(P,Q)|0)+(ta>>>16)|0)+(la>>>16)|0;wa=((f(H,Y)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,Y)|0)+(va>>>16)|0)+(wa>>>16)|0;la=wa<<16|ua&65535;ua=((f(H,R)|0)+(xa&65535)|0)+(ma&65535)|0;va=((f(P,R)|0)+(xa>>>16)|0)+(ma>>>16)|0;wa=((f(H,Z)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,Z)|0)+(va>>>16)|0)+(wa>>>16)|0;ma=wa<<16|ua&65535;ua=((f(H,S)|0)+(xa&65535)|0)+(na&65535)|0;va=((f(P,S)|0)+(xa>>>16)|0)+(na>>>16)|0;wa=((f(H,$)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,$)|0)+(va>>>16)|0)+(wa>>>16)|0;na=wa<<16|ua&65535;ua=((f(H,T)|0)+(xa&65535)|0)+(oa&65535)|0;va=((f(P,T)|0)+(xa>>>16)|0)+(oa>>>16)|0;wa=((f(H,_)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,_)|0)+(va>>>16)|0)+(wa>>>16)|0;oa=wa<<16|ua&65535;ua=((f(H,U)|0)+(xa&65535)|0)+(pa&65535)|0;va=((f(P,U)|0)+(xa>>>16)|0)+(pa>>>16)|0;wa=((f(H,aa)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,aa)|0)+(va>>>16)|0)+(wa>>>16)|0;pa=wa<<16|ua&65535;ua=((f(H,V)|0)+(xa&65535)|0)+(qa&65535)|0;va=((f(P,V)|0)+(xa>>>16)|0)+(qa>>>16)|0;wa=((f(H,ba)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,ba)|0)+(va>>>16)|0)+(wa>>>16)|0;qa=wa<<16|ua&65535;ua=((f(H,W)|0)+(xa&65535)|0)+(ra&65535)|0;va=((f(P,W)|0)+(xa>>>16)|0)+(ra>>>16)|0;wa=((f(H,ca)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,ca)|0)+(va>>>16)|0)+(wa>>>16)|0;ra=wa<<16|ua&65535;ua=((f(H,X)|0)+(xa&65535)|0)+(sa&65535)|0;va=((f(P,X)|0)+(xa>>>16)|0)+(sa>>>16)|0;wa=((f(H,da)|0)+(va&65535)|0)+(ua>>>16)|0;xa=((f(P,da)|0)+(va>>>16)|0)+(wa>>>16)|0;sa=wa<<16|ua&65535;ta=xa;e[(Ca|0)>>2]=ea,e[(Ca|4)>>2]=fa,e[(Ca|8)>>2]=ga,e[(Ca|12)>>2]=ha,e[(Ca|16)>>2]=ia,e[(Ca|20)>>2]=ja,e[(Ca|24)>>2]=ka,e[(Ca|28)>>2]=la}Ca=y+(ya+Aa|0)|0;e[(Ca|0)>>2]=ma,e[(Ca|4)>>2]=na,e[(Ca|8)>>2]=oa,e[(Ca|12)>>2]=pa,e[(Ca|16)>>2]=qa,e[(Ca|20)>>2]=ra,e[(Ca|24)>>2]=sa,e[(Ca|28)>>2]=ta}}function r(u,v,w){u=u|0;v=v|0;w=w|0;var x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,$=0,_=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0,oa=0,pa=0,qa=0,ra=0,sa=0,ta=0,ua=0,va=0,wa=0,xa=0,ya=0,za=0,Aa=0,Ba=0,Ca=0,Da=0,Ea=0,Fa=0,Ga=0;for(;(Ba|0)<(v|0);Ba=Ba+4|0){Ga=w+(Ba<<1)|0;F=e[u+Ba>>2]|0,x=F&65535,F=F>>>16;ra=f(x,x)|0;sa=(f(x,F)|0)+(ra>>>17)|0;ta=(f(F,F)|0)+(sa>>>15)|0;e[Ga>>2]=sa<<17|ra&131071;e[(Ga|4)>>2]=ta}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+8|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16;V=e[(Ea|4)>>2]|0,N=V&65535,V=V>>>16;ra=f(x,N)|0;sa=(f(x,V)|0)+(ra>>>16)|0;ta=(f(F,N)|0)+(sa&65535)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;xa=e[(Ga|4)>>2]|0;ra=(xa&65535)+((ra&65535)<<1)|0;ta=((xa>>>16)+((ta&65535)<<1)|0)+(ra>>>16)|0;e[(Ga|4)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|8)>>2]|0;ra=((xa&65535)+((wa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(wa>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|8)>>2]=ta<<16|ra&65535;ua=ta>>>16;if(ua){xa=e[(Ga|12)>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[(Ga|12)>>2]=ta<<16|ra&65535}}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+16|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16;V=e[(Ea|8)>>2]|0,N=V&65535,V=V>>>16,W=e[(Ea|12)>>2]|0,O=W&65535,W=W>>>16;ra=f(x,N)|0;sa=f(F,N)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=(f(x,O)|0)+(wa&65535)|0;sa=(f(F,O)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;da=wa;ra=(f(y,N)|0)+(ca&65535)|0;sa=(f(G,N)|0)+(ca>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ea=wa;xa=e[(Ga|8)>>2]|0;ra=(xa&65535)+((ba&65535)<<1)|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|8)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|12)>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|12)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|16)>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|16)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|20)>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|20)>>2]=ta<<16|ra&65535;ua=ta>>>16;for(Da=24;!!ua&(Da|0)<32;Da=Da+4|0){xa=e[(Ga|Da)>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[(Ga|Da)>>2]=ta<<16|ra&65535;ua=ta>>>16}}for(Aa=0;(Aa|0)<(v|0);Aa=Aa+32|0){Ea=u+Aa|0,Ga=w+(Aa<<1)|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16,H=e[(Ea|8)>>2]|0,z=H&65535,H=H>>>16,I=e[(Ea|12)>>2]|0,A=I&65535,I=I>>>16;V=e[(Ea|16)>>2]|0,N=V&65535,V=V>>>16,W=e[(Ea|20)>>2]|0,O=W&65535,W=W>>>16,X=e[(Ea|24)>>2]|0,P=X&65535,X=X>>>16,Y=e[(Ea|28)>>2]|0,Q=Y&65535,Y=Y>>>16;ra=f(x,N)|0;sa=f(F,N)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=(f(x,O)|0)+(wa&65535)|0;sa=(f(F,O)|0)+(wa>>>16)|0;ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=(f(x,P)|0)+(wa&65535)|0;sa=(f(F,P)|0)+(wa>>>16)|0;ta=((f(x,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=(f(x,Q)|0)+(wa&65535)|0;sa=(f(F,Q)|0)+(wa>>>16)|0;ta=((f(x,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;fa=wa;ra=(f(y,N)|0)+(ca&65535)|0;sa=(f(G,N)|0)+(ca>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(y,P)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(G,P)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(y,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(y,Q)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(G,Q)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(y,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ga=wa;ra=(f(z,N)|0)+(da&65535)|0;sa=(f(H,N)|0)+(da>>>16)|0;ta=((f(z,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(z,O)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(H,O)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(z,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(z,P)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(H,P)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(z,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(z,Q)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(H,Q)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(z,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ha=wa;ra=(f(A,N)|0)+(ea&65535)|0;sa=(f(I,N)|0)+(ea>>>16)|0;ta=((f(A,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(A,O)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(I,O)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(A,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(A,P)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(I,P)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(A,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(A,Q)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(I,Q)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(A,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ia=wa;xa=e[(Ga|16)>>2]|0;ra=(xa&65535)+((ba&65535)<<1)|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|16)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|20)>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|20)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|24)>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|24)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[(Ga|28)>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[(Ga|28)>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+32>>2]|0;ra=((xa&65535)+((fa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(fa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+32>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+36>>2]|0;ra=((xa&65535)+((ga&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ga>>>16<<1)|0)+(ra>>>16)|0;e[Ga+36>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+40>>2]|0;ra=((xa&65535)+((ha&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ha>>>16<<1)|0)+(ra>>>16)|0;e[Ga+40>>2]=ta<<16|ra&65535;ua=ta>>>16;xa=e[Ga+44>>2]|0;ra=((xa&65535)+((ia&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ia>>>16<<1)|0)+(ra>>>16)|0;e[Ga+44>>2]=ta<<16|ra&65535;ua=ta>>>16;for(Da=48;!!ua&(Da|0)<64;Da=Da+4|0){xa=e[Ga+Da>>2]|0;ra=(xa&65535)+ua|0;ta=(xa>>>16)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16}}for(ya=32;(ya|0)<(v|0);ya=ya<<1){za=ya<<1;for(Aa=0;(Aa|0)<(v|0);Aa=Aa+za|0){Ga=w+(Aa<<1)|0;va=0;for(Ba=0;(Ba|0)<(ya|0);Ba=Ba+32|0){Ea=(u+Aa|0)+Ba|0;F=e[Ea>>2]|0,x=F&65535,F=F>>>16,G=e[(Ea|4)>>2]|0,y=G&65535,G=G>>>16,H=e[(Ea|8)>>2]|0,z=H&65535,H=H>>>16,I=e[(Ea|12)>>2]|0,A=I&65535,I=I>>>16,J=e[(Ea|16)>>2]|0,B=J&65535,J=J>>>16,K=e[(Ea|20)>>2]|0,C=K&65535,K=K>>>16,L=e[(Ea|24)>>2]|0,D=L&65535,L=L>>>16,M=e[(Ea|28)>>2]|0,E=M&65535,M=M>>>16;ja=ka=la=ma=na=oa=pa=qa=ua=0;for(Ca=0;(Ca|0)<(ya|0);Ca=Ca+32|0){Fa=((u+Aa|0)+ya|0)+Ca|0;V=e[Fa>>2]|0,N=V&65535,V=V>>>16,W=e[(Fa|4)>>2]|0,O=W&65535,W=W>>>16,X=e[(Fa|8)>>2]|0,P=X&65535,X=X>>>16,Y=e[(Fa|12)>>2]|0,Q=Y&65535,Y=Y>>>16,Z=e[(Fa|16)>>2]|0,R=Z&65535,Z=Z>>>16,$=e[(Fa|20)>>2]|0,S=$&65535,$=$>>>16,_=e[(Fa|24)>>2]|0,T=_&65535,_=_>>>16,aa=e[(Fa|28)>>2]|0,U=aa&65535,aa=aa>>>16;ba=ca=da=ea=fa=ga=ha=ia=0;ra=((f(x,N)|0)+(ba&65535)|0)+(ja&65535)|0;sa=((f(F,N)|0)+(ba>>>16)|0)+(ja>>>16)|0;ta=((f(x,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ba=ta<<16|ra&65535;ra=((f(x,O)|0)+(ca&65535)|0)+(wa&65535)|0;sa=((f(F,O)|0)+(ca>>>16)|0)+(wa>>>16)|0; - -ta=((f(x,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(x,P)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(F,P)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(x,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(x,Q)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(F,Q)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(x,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(x,R)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(F,R)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(x,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(x,S)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(F,S)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(x,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(x,T)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(F,T)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(x,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(x,U)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(F,U)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(x,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(F,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ja=wa;ra=((f(y,N)|0)+(ca&65535)|0)+(ka&65535)|0;sa=((f(G,N)|0)+(ca>>>16)|0)+(ka>>>16)|0;ta=((f(y,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ca=ta<<16|ra&65535;ra=((f(y,O)|0)+(da&65535)|0)+(wa&65535)|0;sa=((f(G,O)|0)+(da>>>16)|0)+(wa>>>16)|0;ta=((f(y,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(y,P)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(G,P)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(y,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(y,Q)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(G,Q)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(y,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(y,R)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(G,R)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(y,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(y,S)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(G,S)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(y,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(y,T)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(G,T)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(y,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(y,U)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(G,U)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(y,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(G,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ka=wa;ra=((f(z,N)|0)+(da&65535)|0)+(la&65535)|0;sa=((f(H,N)|0)+(da>>>16)|0)+(la>>>16)|0;ta=((f(z,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;da=ta<<16|ra&65535;ra=((f(z,O)|0)+(ea&65535)|0)+(wa&65535)|0;sa=((f(H,O)|0)+(ea>>>16)|0)+(wa>>>16)|0;ta=((f(z,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(z,P)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(H,P)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(z,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(z,Q)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(H,Q)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(z,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(z,R)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(H,R)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(z,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(z,S)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(H,S)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(z,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(z,T)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(H,T)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(z,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(z,U)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(H,U)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(z,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(H,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;la=wa;ra=((f(A,N)|0)+(ea&65535)|0)+(ma&65535)|0;sa=((f(I,N)|0)+(ea>>>16)|0)+(ma>>>16)|0;ta=((f(A,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ea=ta<<16|ra&65535;ra=((f(A,O)|0)+(fa&65535)|0)+(wa&65535)|0;sa=((f(I,O)|0)+(fa>>>16)|0)+(wa>>>16)|0;ta=((f(A,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(A,P)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(I,P)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(A,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(A,Q)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(I,Q)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(A,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(A,R)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(I,R)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(A,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(A,S)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(I,S)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(A,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(A,T)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(I,T)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(A,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(A,U)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(I,U)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(A,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(I,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ma=wa;ra=((f(B,N)|0)+(fa&65535)|0)+(na&65535)|0;sa=((f(J,N)|0)+(fa>>>16)|0)+(na>>>16)|0;ta=((f(B,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;fa=ta<<16|ra&65535;ra=((f(B,O)|0)+(ga&65535)|0)+(wa&65535)|0;sa=((f(J,O)|0)+(ga>>>16)|0)+(wa>>>16)|0;ta=((f(B,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(B,P)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(J,P)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(B,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(B,Q)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(J,Q)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(B,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(B,R)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(J,R)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(B,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(B,S)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(J,S)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(B,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(B,T)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(J,T)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(B,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(B,U)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(J,U)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(B,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(J,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;na=wa;ra=((f(C,N)|0)+(ga&65535)|0)+(oa&65535)|0;sa=((f(K,N)|0)+(ga>>>16)|0)+(oa>>>16)|0;ta=((f(C,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ga=ta<<16|ra&65535;ra=((f(C,O)|0)+(ha&65535)|0)+(wa&65535)|0;sa=((f(K,O)|0)+(ha>>>16)|0)+(wa>>>16)|0;ta=((f(C,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(C,P)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(K,P)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(C,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(C,Q)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(K,Q)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(C,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(C,R)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(K,R)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(C,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(C,S)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(K,S)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(C,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(C,T)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(K,T)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(C,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(C,U)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(K,U)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(C,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(K,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;oa=wa;ra=((f(D,N)|0)+(ha&65535)|0)+(pa&65535)|0;sa=((f(L,N)|0)+(ha>>>16)|0)+(pa>>>16)|0;ta=((f(D,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ha=ta<<16|ra&65535;ra=((f(D,O)|0)+(ia&65535)|0)+(wa&65535)|0;sa=((f(L,O)|0)+(ia>>>16)|0)+(wa>>>16)|0;ta=((f(D,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(D,P)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(L,P)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(D,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(D,Q)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(L,Q)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(D,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(D,R)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(L,R)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(D,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(D,S)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(L,S)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(D,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(D,T)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(L,T)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(D,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;ra=((f(D,U)|0)+(oa&65535)|0)+(wa&65535)|0;sa=((f(L,U)|0)+(oa>>>16)|0)+(wa>>>16)|0;ta=((f(D,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(L,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;oa=ta<<16|ra&65535;pa=wa;ra=((f(E,N)|0)+(ia&65535)|0)+(qa&65535)|0;sa=((f(M,N)|0)+(ia>>>16)|0)+(qa>>>16)|0;ta=((f(E,V)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,V)|0)+(sa>>>16)|0)+(ta>>>16)|0;ia=ta<<16|ra&65535;ra=((f(E,O)|0)+(ja&65535)|0)+(wa&65535)|0;sa=((f(M,O)|0)+(ja>>>16)|0)+(wa>>>16)|0;ta=((f(E,W)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,W)|0)+(sa>>>16)|0)+(ta>>>16)|0;ja=ta<<16|ra&65535;ra=((f(E,P)|0)+(ka&65535)|0)+(wa&65535)|0;sa=((f(M,P)|0)+(ka>>>16)|0)+(wa>>>16)|0;ta=((f(E,X)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,X)|0)+(sa>>>16)|0)+(ta>>>16)|0;ka=ta<<16|ra&65535;ra=((f(E,Q)|0)+(la&65535)|0)+(wa&65535)|0;sa=((f(M,Q)|0)+(la>>>16)|0)+(wa>>>16)|0;ta=((f(E,Y)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,Y)|0)+(sa>>>16)|0)+(ta>>>16)|0;la=ta<<16|ra&65535;ra=((f(E,R)|0)+(ma&65535)|0)+(wa&65535)|0;sa=((f(M,R)|0)+(ma>>>16)|0)+(wa>>>16)|0;ta=((f(E,Z)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,Z)|0)+(sa>>>16)|0)+(ta>>>16)|0;ma=ta<<16|ra&65535;ra=((f(E,S)|0)+(na&65535)|0)+(wa&65535)|0;sa=((f(M,S)|0)+(na>>>16)|0)+(wa>>>16)|0;ta=((f(E,$)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,$)|0)+(sa>>>16)|0)+(ta>>>16)|0;na=ta<<16|ra&65535;ra=((f(E,T)|0)+(oa&65535)|0)+(wa&65535)|0;sa=((f(M,T)|0)+(oa>>>16)|0)+(wa>>>16)|0;ta=((f(E,_)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,_)|0)+(sa>>>16)|0)+(ta>>>16)|0;oa=ta<<16|ra&65535;ra=((f(E,U)|0)+(pa&65535)|0)+(wa&65535)|0;sa=((f(M,U)|0)+(pa>>>16)|0)+(wa>>>16)|0;ta=((f(E,aa)|0)+(sa&65535)|0)+(ra>>>16)|0;wa=((f(M,aa)|0)+(sa>>>16)|0)+(ta>>>16)|0;pa=ta<<16|ra&65535;qa=wa;Da=ya+(Ba+Ca|0)|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ba&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ba>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ca&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ca>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((da&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(da>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ea&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ea>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((fa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(fa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ga&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ga>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ha&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ha>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ia&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ia>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16}Da=ya+(Ba+Ca|0)|0;xa=e[Ga+Da>>2]|0;ra=(((xa&65535)+((ja&65535)<<1)|0)+ua|0)+va|0;ta=((xa>>>16)+(ja>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ka&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ka>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((la&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(la>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((ma&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(ma>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((na&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(na>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((oa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(oa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((pa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(pa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;ua=ta>>>16;Da=Da+4|0;xa=e[Ga+Da>>2]|0;ra=((xa&65535)+((qa&65535)<<1)|0)+ua|0;ta=((xa>>>16)+(qa>>>16<<1)|0)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;va=ta>>>16}for(Da=Da+4|0;!!va&(Da|0)>2]|0;ra=(xa&65535)+va|0;ta=(xa>>>16)+(ra>>>16)|0;e[Ga+Da>>2]=ta<<16|ra&65535;va=ta>>>16}}}}function s(u,v,w,x,y){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;var z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0;for(P=v-1&-4;(P|0)>=0;P=P-4|0){z=e[u+P>>2]|0;if(z){v=P;break}}for(P=x-1&-4;(P|0)>=0;P=P-4|0){A=e[w+P>>2]|0;if(A){x=P;break}}while((A&2147483648)==0){A=A<<1;B=B+1|0}D=e[u+v>>2]|0;if(B){C=D>>>(32-B|0);for(P=v-4|0;(P|0)>=0;P=P-4|0){z=e[u+P>>2]|0;e[u+P+4>>2]=D<>>(32-B|0):0);D=z}e[u>>2]=D<>2]|0;for(P=x-4|0;(P|0)>=0;P=P-4|0){A=e[w+P>>2]|0;e[w+P+4>>2]=E<>>(32-B|0);E=A}e[w>>2]=E<>2]|0;F=E>>>16,G=E&65535;for(P=v;(P|0)>=(x|0);P=P-4|0){Q=P-x|0;D=e[u+P>>2]|0;H=(C>>>0)/(F>>>0)|0,J=(C>>>0)%(F>>>0)|0,L=f(H,G)|0;while((H|0)==65536|L>>>0>(J<<16|D>>>16)>>>0){H=H-1|0,J=J+F|0,L=L-G|0;if((J|0)>=65536)break}N=0,O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;L=(f(H,A&65535)|0)+(N>>>16)|0;M=(f(H,A>>>16)|0)+(L>>>16)|0;A=N&65535|L<<16;N=M;z=e[u+Q+R>>2]|0;L=((z&65535)-(A&65535)|0)+O|0;M=((z>>>16)-(A>>>16)|0)+(L>>16)|0;e[u+Q+R>>2]=M<<16|L&65535;O=M>>16}L=((C&65535)-(N&65535)|0)+O|0;M=((C>>>16)-(N>>>16)|0)+(L>>16)|0;C=M<<16|L&65535;O=M>>16;if(O){H=H-1|0;O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;z=e[u+Q+R>>2]|0;L=(z&65535)+O|0;M=(z>>>16)+A+(L>>>16)|0;e[u+Q+R>>2]=M<<16|L&65535;O=M>>>16}C=C+O|0}D=e[u+P>>2]|0;z=C<<16|D>>>16;I=(z>>>0)/(F>>>0)|0,K=(z>>>0)%(F>>>0)|0,L=f(I,G)|0;while((I|0)==65536|L>>>0>(K<<16|D&65535)>>>0){I=I-1|0,K=K+F|0,L=L-G|0;if((K|0)>=65536)break}N=0,O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;L=(f(I,A&65535)|0)+(N&65535)|0;M=((f(I,A>>>16)|0)+(L>>>16)|0)+(N>>>16)|0;A=L&65535|M<<16;N=M>>>16;z=e[u+Q+R>>2]|0;L=((z&65535)-(A&65535)|0)+O|0;M=((z>>>16)-(A>>>16)|0)+(L>>16)|0;O=M>>16;e[u+Q+R>>2]=M<<16|L&65535}L=((C&65535)-(N&65535)|0)+O|0;M=((C>>>16)-(N>>>16)|0)+(L>>16)|0;O=M>>16;if(O){I=I-1|0;O=0;for(R=0;(R|0)<=(x|0);R=R+4|0){A=e[w+R>>2]|0;z=e[u+Q+R>>2]|0;L=((z&65535)+(A&65535)|0)+O|0;M=((z>>>16)+(A>>>16)|0)+(L>>>16)|0;O=M>>>16;e[u+Q+R>>2]=L&65535|M<<16}}e[y+Q>>2]=H<<16|I;C=e[u+P>>2]|0}if(B){D=e[u>>2]|0;for(P=4;(P|0)<=(x|0);P=P+4|0){z=e[u+P>>2]|0;e[u+P-4>>2]=z<<(32-B|0)|D>>>B;D=z}e[u+x>>2]=D>>>B}}function t(u,v,w,x,y,z){u=u|0;v=v|0;w=w|0;x=x|0;y=y|0;z=z|0;var A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0;A=h(x<<1)|0;k(x<<1,0,A);j(v,u,A);for(L=0;(L|0)<(x|0);L=L+4|0){C=e[A+L>>2]|0,D=C&65535,C=C>>>16;F=y>>>16,E=y&65535;G=f(D,E)|0,H=((f(D,F)|0)+(f(C,E)|0)|0)+(G>>>16)|0;D=G&65535,C=H&65535;K=0;for(M=0;(M|0)<(x|0);M=M+4|0){N=L+M|0;F=e[w+M>>2]|0,E=F&65535,F=F>>>16;J=e[A+N>>2]|0;G=((f(D,E)|0)+(K&65535)|0)+(J&65535)|0;H=((f(D,F)|0)+(K>>>16)|0)+(J>>>16)|0;I=((f(C,E)|0)+(H&65535)|0)+(G>>>16)|0;K=((f(C,F)|0)+(I>>>16)|0)+(H>>>16)|0;J=I<<16|G&65535;e[A+N>>2]=J}N=L+M|0;J=e[A+N>>2]|0;G=((J&65535)+(K&65535)|0)+B|0;H=((J>>>16)+(K>>>16)|0)+(G>>>16)|0;e[A+N>>2]=H<<16|G&65535;B=H>>>16}j(x,A+x|0,z);i(x<<1);if(B|(m(w,x,z,x)|0)<=0){p(z,x,w,x,z,x)|0}}return{sreset:g,salloc:h,sfree:i,z:k,tst:n,neg:l,cmp:m,add:o,sub:p,mul:q,sqr:r,div:s,mredc:t}}function wa(a){return a instanceof ya}function xa(a,b){return a*b|0}function ya(a){var b=Kb,c=0,d=0;if(n(a)&&(a=f(a)),o(a)&&(a=new Uint8Array(a)),void 0===a);else if(m(a)){var e=Math.abs(a);e>4294967295?(b=new Uint32Array(2),b[0]=0|e,b[1]=e/4294967296|0,c=52):e>0?(b=new Uint32Array(1),b[0]=e,c=32):(b=Kb,c=0),d=0>a?-1:1}else if(p(a)){for(var g=0;!a[g];g++);if(c=8*(a.length-g),!c)return Mb;b=new Uint32Array(c+31>>5);for(var h=a.length-4;h>=g;h-=4)b[a.length-4-h>>2]=a[h]<<24|a[h+1]<<16|a[h+2]<<8|a[h+3];g-h===3?b[b.length-1]=a[g]:g-h===2?b[b.length-1]=a[g]<<8|a[g+1]:g-h===1&&(b[b.length-1]=a[g]<<16|a[g+1]<<8|a[g+2]),d=1}else{if("object"!=typeof a||null===a)throw new TypeError("number is of unexpected type");b=new Uint32Array(a.limbs),c=a.bitLength,d=a.sign}this.limbs=b,this.bitLength=c,this.sign=d}function za(a){a=a||16;var b=this.limbs,c=this.bitLength,e="";if(16!==a)throw new d("bad radix");for(var f=(c+31>>5)-1;f>=0;f--){var g=b[f].toString(16);e+="00000000".substr(g.length),e+=g}return e=e.replace(/^0+/,""),e.length||(e="0"),this.sign<0&&(e="-"+e),e}function Aa(){var a=this.bitLength,b=this.limbs;if(0===a)return new Uint8Array(0);for(var c=a+7>>3,d=new Uint8Array(c),e=0;c>e;e++){var f=c-e-1;d[e]=b[f>>2]>>((3&f)<<3)}return d}function Ba(){var a=this.limbs,b=this.bitLength,c=this.sign;if(!c)return 0;if(32>=b)return c*(a[0]>>>0);if(52>=b)return c*(4294967296*(a[1]>>>0)+(a[0]>>>0));var d,e,f=0;for(d=a.length-1;d>=0;d--)if(0!==(e=a[d])){for(;0===(e<>>0):c*(1048576*((a[d]<>>32-f:0))>>>0)+((a[d-1]<1?a[d-2]>>>32-f:0))>>>12))*Math.pow(2,32*d-f-52)}function Ca(a){var b=this.limbs,c=this.bitLength;if(a>=c)return this;var d=new ya,e=a+31>>5,f=a%32;return d.limbs=new Uint32Array(b.subarray(0,e)),d.bitLength=a,d.sign=this.sign,f&&(d.limbs[e-1]&=-1>>>32-f),d}function Da(a,b){if(!m(a))throw new TypeError("TODO");if(void 0!==b&&!m(b))throw new TypeError("TODO");var c=this.limbs,d=this.bitLength;if(0>a)throw new RangeError("TODO");if(a>=d)return Mb;(void 0===b||b>d-a)&&(b=d-a);var e,f=new ya,g=a>>5,h=a+b+31>>5,i=b+31>>5,j=a%32,k=b%32;if(e=new Uint32Array(i),j){for(var l=0;h-g-1>l;l++)e[l]=c[g+l]>>>j|c[g+l+1]<<32-j;e[l]=c[g+l]>>>j}else e.set(c.subarray(g,h));return k&&(e[i-1]&=-1>>>32-k),f.limbs=e,f.bitLength=b,f.sign=this.sign,f}function Ea(){var a=new ya;return a.limbs=this.limbs,a.bitLength=this.bitLength,a.sign=-1*this.sign,a}function Fa(a){wa(a)||(a=new ya(a));var b=this.limbs,c=b.length,d=a.limbs,e=d.length,f=0;return this.signa.sign?1:(Jb.set(b,0),Jb.set(d,c),f=Hb.cmp(0,c<<2,c<<2,e<<2),f*this.sign)}function Ga(a){if(wa(a)||(a=new ya(a)),!this.sign)return a;if(!a.sign)return this;var b,c,d,e,f=this.bitLength,g=this.limbs,h=g.length,i=this.sign,j=a.bitLength,k=a.limbs,l=k.length,m=a.sign,n=new ya;b=(f>j?f:j)+(i*m>0?1:0),c=b+31>>5,Hb.sreset();var o=Hb.salloc(h<<2),p=Hb.salloc(l<<2),q=Hb.salloc(c<<2);return Hb.z(q-o+(c<<2),0,o),Jb.set(g,o>>2),Jb.set(k,p>>2),i*m>0?(Hb.add(o,h<<2,p,l<<2,q,c<<2),d=i):i>m?(e=Hb.sub(o,h<<2,p,l<<2,q,c<<2),d=e?m:i):(e=Hb.sub(p,l<<2,o,h<<2,q,c<<2),d=e?i:m),e&&Hb.neg(q,c<<2,q,c<<2),0===Hb.tst(q,c<<2)?Mb:(n.limbs=new Uint32Array(Jb.subarray(q>>2,(q>>2)+c)),n.bitLength=b,n.sign=d,n)}function Ha(a){return wa(a)||(a=new ya(a)),this.add(a.negate())}function Ia(a){if(wa(a)||(a=new ya(a)),!this.sign||!a.sign)return Mb;var b,c,d=this.bitLength,e=this.limbs,f=e.length,g=a.bitLength,h=a.limbs,i=h.length,j=new ya;b=d+g,c=b+31>>5,Hb.sreset();var k=Hb.salloc(f<<2),l=Hb.salloc(i<<2),m=Hb.salloc(c<<2);return Hb.z(m-k+(c<<2),0,k),Jb.set(e,k>>2),Jb.set(h,l>>2),Hb.mul(k,f<<2,l,i<<2,m,c<<2),j.limbs=new Uint32Array(Jb.subarray(m>>2,(m>>2)+c)),j.sign=this.sign*a.sign,j.bitLength=b,j}function Ja(){if(!this.sign)return Mb;var a,b,c=this.bitLength,d=this.limbs,e=d.length,f=new ya;a=c<<1,b=a+31>>5,Hb.sreset();var g=Hb.salloc(e<<2),h=Hb.salloc(b<<2);return Hb.z(h-g+(b<<2),0,g),Jb.set(d,g>>2),Hb.sqr(g,e<<2,h),f.limbs=new Uint32Array(Jb.subarray(h>>2,(h>>2)+b)),f.bitLength=a,f.sign=1,f}function Ka(a){wa(a)||(a=new ya(a));var b,c,d=this.bitLength,e=this.limbs,f=e.length,g=a.bitLength,h=a.limbs,i=h.length,j=Mb,k=Mb;Hb.sreset();var l=Hb.salloc(f<<2),m=Hb.salloc(i<<2),n=Hb.salloc(f<<2);return Hb.z(n-l+(f<<2),0,l),Jb.set(e,l>>2),Jb.set(h,m>>2),Hb.div(l,f<<2,m,i<<2,n),b=Hb.tst(n,f<<2)>>2,b&&(j=new ya,j.limbs=new Uint32Array(Jb.subarray(n>>2,(n>>2)+b)),j.bitLength=b<<5>d?d:b<<5,j.sign=this.sign*a.sign),c=Hb.tst(l,i<<2)>>2,c&&(k=new ya,k.limbs=new Uint32Array(Jb.subarray(l>>2,(l>>2)+c)),k.bitLength=c<<5>g?g:c<<5,k.sign=this.sign),{quotient:j,remainder:k}}function La(a,b){var c,d,e,f,g=0>a?-1:1,h=0>b?-1:1,i=1,j=0,k=0,l=1;for(a*=g,b*=h,f=b>a,f&&(e=a,a=b,b=e,e=g,g=h,h=e),d=Math.floor(a/b),c=a-d*b;c;)e=i-d*j,i=j,j=e,e=k-d*l,k=l,l=e,a=b,b=c,d=Math.floor(a/b),c=a-d*b;return j*=g,l*=h,f&&(e=j,j=l,l=e),{gcd:b,x:j,y:l}}function Ma(a,b){wa(a)||(a=new ya(a)),wa(b)||(b=new ya(b));var c=a.sign,d=b.sign;0>c&&(a=a.negate()),0>d&&(b=b.negate());var e=a.compare(b);if(0>e){var f=a;a=b,b=f,f=c,c=d,d=f}var g,h,i,j=Nb,k=Mb,l=b.bitLength,m=Mb,n=Nb,o=a.bitLength;for(g=a.divide(b);(h=g.remainder)!==Mb;)i=g.quotient,g=j.subtract(i.multiply(k).clamp(l)).clamp(l),j=k,k=g,g=m.subtract(i.multiply(n).clamp(o)).clamp(o),m=n,n=g,a=b,b=h,g=a.divide(b);if(0>c&&(k=k.negate()),0>d&&(n=n.negate()),0>e){var f=k;k=n,n=f}return{gcd:b,x:k,y:n}}function Na(){if(ya.apply(this,arguments),this.valueOf()<1)throw new RangeError;if(!(this.bitLength<=32)){var a;if(1&this.limbs[0]){var b=(this.bitLength+31&-32)+1,c=new Uint32Array(b+31>>5);c[c.length-1]=1,a=new ya,a.sign=1,a.bitLength=b,a.limbs=c;var d=La(4294967296,this.limbs[0]).y;this.coefficient=0>d?-d:4294967296-d,this.comodulus=a,this.comodulusRemainder=a.divide(this).remainder,this.comodulusRemainderSquare=a.square().divide(this).remainder}}}function Oa(a){return wa(a)||(a=new ya(a)),a.bitLength<=32&&this.bitLength<=32?new ya(a.valueOf()%this.valueOf()):a.compare(this)<0?a:a.divide(this).remainder}function Pa(a){a=this.reduce(a);var b=Ma(this,a);return 1!==b.gcd.valueOf()?null:(b=b.y,b.sign<0&&(b=b.add(this).clamp(this.bitLength)),b)}function Qa(a,b){wa(a)||(a=new ya(a)),wa(b)||(b=new ya(b));for(var c=0,d=0;d>>=1;var f=8;b.bitLength<=4536&&(f=7),b.bitLength<=1736&&(f=6),b.bitLength<=630&&(f=5),b.bitLength<=210&&(f=4),b.bitLength<=60&&(f=3),b.bitLength<=12&&(f=2),1<=c&&(f=1),a=Ra(this.reduce(a).multiply(this.comodulusRemainderSquare),this);var g=Ra(a.square(),this),h=new Array(1<d;d++)h[d]=Ra(h[d-1].multiply(g),this);for(var i=this.comodulusRemainder,j=i,d=b.limbs.length-1;d>=0;d--)for(var e=b.limbs[d],k=32;k>0;)if(2147483648&e){for(var l=e>>>32-f,m=f;0===(1&l);)l>>>=1,m--;for(var n=h[l>>>1];l;)l>>>=1,j!==i&&(j=Ra(j.square(),this));j=j!==i?Ra(j.multiply(n),this):n,e<<=m,k-=m}else j!==i&&(j=Ra(j.square(),this)),e<<=1,k--;return j=Ra(j,this)}function Ra(a,b){var c=a.limbs,d=c.length,e=b.limbs,f=e.length,g=b.coefficient;Hb.sreset();var h=Hb.salloc(d<<2),i=Hb.salloc(f<<2),j=Hb.salloc(f<<2);Hb.z(j-h+(f<<2),0,h),Jb.set(c,h>>2),Jb.set(e,i>>2),Hb.mredc(h,d<<2,i,f<<2,g,j);var k=new ya;return k.limbs=new Uint32Array(Jb.subarray(j>>2,(j>>2)+f)),k.bitLength=b.bitLength,k.sign=1,k}function Sa(a){var b=new ya(this),c=0;for(b.limbs[0]-=1;0===b.limbs[c>>5];)c+=32;for(;0===(b.limbs[c>>5]>>(31&c)&1);)c++;b=b.slice(c);for(var d=new Na(this),e=this.subtract(Nb),f=new ya(this),g=this.limbs.length-1;0===f.limbs[g];)g--;for(;--a>=0;){for(ta(f.limbs),f.limbs[0]<2&&(f.limbs[0]+=2);f.compare(e)>=0;)f.limbs[g]>>>=1;var h=d.power(f,b);if(0!==h.compare(Nb)&&0!==h.compare(e)){for(var i=c;--i>0;){if(h=h.square().divide(d).remainder,0===h.compare(Nb))return!1;if(0===h.compare(e))break}if(0===i)return!1}}return!0}function Ta(a){a=a||80;var b=this.limbs,c=0;if(0===(1&b[0]))return!1;if(1>=a)return!0;var d=0,e=0,f=0;for(c=0;c>>=2;for(var h=b[c];h;)e+=3&h,h>>>=2,e-=3&h,h>>>=2;for(var i=b[c];i;)f+=15&i,i>>>=4,f-=15&i,i>>>=4}return d%3&&e%5&&f%17?2>=a?!0:Sa.call(this,a>>>1):!1}function Ua(a){if(Pb.length>=a)return Pb.slice(0,a);for(var b=Pb[Pb.length-1]+2;Pb.length=d*d&&b%d!=0;d=Pb[++c]);d*d>b&&Pb.push(b)}return Pb}function Va(a,c){var d=a+31>>5,e=new ya({sign:1,bitLength:a,limbs:d}),f=e.limbs,g=1e4;512>=a&&(g=2200),256>=a&&(g=600);var h=Ua(g),i=new Uint32Array(g),j=a*b.Math.LN2|0,k=27;for(a>=250&&(k=12),a>=450&&(k=6),a>=850&&(k=3),a>=1300&&(k=2);;){ta(f),f[0]|=1,f[d-1]|=1<<(a-1&31),31&a&&(f[d-1]&=l(a+1&31)-1),i[0]=1;for(var m=1;g>m;m++)i[m]=e.divide(h[m]).remainder.valueOf();a:for(var n=0;j>n;n+=2,f[0]+=2){for(var m=1;g>m;m++)if((i[m]+n)%h[m]===0)continue a;if(("function"!=typeof c||c(e))&&Sa.call(e,k))return e}}}c.prototype=Object.create(Error.prototype,{name:{value:"IllegalStateError"}}),d.prototype=Object.create(Error.prototype,{name:{value:"IllegalArgumentError"}}),e.prototype=Object.create(Error.prototype,{name:{value:"SecurityError"}});var Wa=b.Float64Array||b.Float32Array;a.string_to_bytes=f,a.hex_to_bytes=g,a.base64_to_bytes=h,a.bytes_to_string=i,a.bytes_to_hex=j,a.bytes_to_base64=k,b.IllegalStateError=c,b.IllegalArgumentError=d,b.SecurityError=e;var Xa=function(){"use strict";function a(){e=[],f=[];var a,b,c=1;for(a=0;255>a;a++)e[a]=c,b=128&c,c<<=1,c&=255,128===b&&(c^=27),c^=e[a],f[e[a]]=a;e[255]=e[0],f[0]=0,k=!0}function b(a,b){var c=e[(f[a]+f[b])%255];return(0===a||0===b)&&(c=0),c}function c(a){var b=e[255-f[a]];return 0===a&&(b=0),b}function d(){function d(a){var b,d,e;for(d=e=c(a),b=0;4>b;b++)d=255&(d<<1|d>>>7),e^=d;return e^=99}k||a(),g=[],h=[],i=[[],[],[],[]],j=[[],[],[],[]];for(var e=0;256>e;e++){var f=d(e);g[e]=f,h[f]=e,i[0][e]=b(2,f)<<24|f<<16|f<<8|b(3,f),j[0][f]=b(14,e)<<24|b(9,e)<<16|b(13,e)<<8|b(11,e);for(var l=1;4>l;l++)i[l][e]=i[l-1][e]>>>8|i[l-1][e]<<24,j[l][f]=j[l-1][f]>>>8|j[l-1][f]<<24}}var e,f,g,h,i,j,k=!1,l=!1,m=function(a,b,c){function e(a,b,c,d,e,h,i,k,l){var m=f.subarray(0,60),o=f.subarray(256,316);m.set([b,c,d,e,h,i,k,l]);for(var p=a,q=1;4*a+28>p;p++){var r=m[p-1];(p%a===0||8===a&&p%a===4)&&(r=g[r>>>24]<<24^g[r>>>16&255]<<16^g[r>>>8&255]<<8^g[255&r]),p%a===0&&(r=r<<8^r>>>24^q<<24,q=q<<1^(128&q?27:0)),m[p]=m[p-a]^r}for(var s=0;p>s;s+=4)for(var t=0;4>t;t++){var r=m[p-(4+s)+(4-t)%4];4>s||s>=p-4?o[s+t]=r:o[s+t]=j[0][g[r>>>24]]^j[1][g[r>>>16&255]]^j[2][g[r>>>8&255]]^j[3][g[255&r]]}n.set_rounds(a+5)}l||d();var f=new Uint32Array(c);f.set(g,512),f.set(h,768);for(var k=0;4>k;k++)f.set(i[k],4096+1024*k>>2),f.set(j[k],8192+1024*k>>2);var m={Uint8Array:Uint8Array,Uint32Array:Uint32Array},n=function(a,b,c){"use asm";var d=0,e=0,f=0,g=0,h=0,i=0,j=0,k=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0;var y=new a.Uint32Array(c),z=new a.Uint8Array(c);function A(X,Y,Z,$,_,aa,ba,ca){X=X|0;Y=Y|0;Z=Z|0;$=$|0;_=_|0;aa=aa|0;ba=ba|0;ca=ca|0;var da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0;da=Z|1024,ea=Z|2048,fa=Z|3072;_=_^y[(X|0)>>2],aa=aa^y[(X|4)>>2],ba=ba^y[(X|8)>>2],ca=ca^y[(X|12)>>2];for(ka=16;(ka|0)<=$<<4;ka=ka+16|0){ga=y[(Z|_>>22&1020)>>2]^y[(da|aa>>14&1020)>>2]^y[(ea|ba>>6&1020)>>2]^y[(fa|ca<<2&1020)>>2]^y[(X|ka|0)>>2],ha=y[(Z|aa>>22&1020)>>2]^y[(da|ba>>14&1020)>>2]^y[(ea|ca>>6&1020)>>2]^y[(fa|_<<2&1020)>>2]^y[(X|ka|4)>>2],ia=y[(Z|ba>>22&1020)>>2]^y[(da|ca>>14&1020)>>2]^y[(ea|_>>6&1020)>>2]^y[(fa|aa<<2&1020)>>2]^y[(X|ka|8)>>2],ja=y[(Z|ca>>22&1020)>>2]^y[(da|_>>14&1020)>>2]^y[(ea|aa>>6&1020)>>2]^y[(fa|ba<<2&1020)>>2]^y[(X|ka|12)>>2];_=ga,aa=ha,ba=ia,ca=ja}d=y[(Y|_>>22&1020)>>2]<<24^y[(Y|aa>>14&1020)>>2]<<16^y[(Y|ba>>6&1020)>>2]<<8^y[(Y|ca<<2&1020)>>2]^y[(X|ka|0)>>2],e=y[(Y|aa>>22&1020)>>2]<<24^y[(Y|ba>>14&1020)>>2]<<16^y[(Y|ca>>6&1020)>>2]<<8^y[(Y|_<<2&1020)>>2]^y[(X|ka|4)>>2],f=y[(Y|ba>>22&1020)>>2]<<24^y[(Y|ca>>14&1020)>>2]<<16^y[(Y|_>>6&1020)>>2]<<8^y[(Y|aa<<2&1020)>>2]^y[(X|ka|8)>>2],g=y[(Y|ca>>22&1020)>>2]<<24^y[(Y|_>>14&1020)>>2]<<16^y[(Y|aa>>6&1020)>>2]<<8^y[(Y|ba<<2&1020)>>2]^y[(X|ka|12)>>2]}function B(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,X,Y,Z,$)}function C(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0;A(1024,3072,8192,x,X,$,Z,Y);_=e,e=g,g=_}function D(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h^X,i^Y,j^Z,k^$);h=d,i=e,j=f,k=g}function E(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0;A(1024,3072,8192,x,X,$,Z,Y);_=e,e=g,g=_;d=d^h,e=e^i,f=f^j,g=g^k;h=X,i=Y,j=Z,k=$}function F(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);h=d=d^X,i=e=e^Y,j=f=f^Z,k=g=g^$}function G(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);d=d^X,e=e^Y,f=f^Z,g=g^$;h=X,i=Y,j=Z,k=$}function H(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,h,i,j,k);h=d,i=e,j=f,k=g;d=d^X,e=e^Y,f=f^Z,g=g^$}function I(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;A(0,2048,4096,x,l,m,n,o);o=~s&o|s&o+1,n=~r&n|r&n+((o|0)==0),m=~q&m|q&m+((n|0)==0),l=~p&l|p&l+((m|0)==0);d=d^X,e=e^Y,f=f^Z,g=g^$}function J(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;var _=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0;X=X^h,Y=Y^i,Z=Z^j,$=$^k;_=t|0,aa=u|0,ba=v|0,ca=w|0;for(;(ha|0)<128;ha=ha+1|0){if(_>>>31){da=da^X,ea=ea^Y,fa=fa^Z,ga=ga^$}_=_<<1|aa>>>31,aa=aa<<1|ba>>>31,ba=ba<<1|ca>>>31,ca=ca<<1;ia=$&1;$=$>>>1|Z<<31,Z=Z>>>1|Y<<31,Y=Y>>>1|X<<31,X=X>>>1;if(ia)X=X^3774873600}h=da,i=ea,j=fa,k=ga}function K(X){X=X|0;x=X}function L(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;d=X,e=Y,f=Z,g=$}function M(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;h=X,i=Y,j=Z,k=$}function N(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;l=X,m=Y,n=Z,o=$}function O(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;p=X,q=Y,r=Z,s=$}function P(X,Y,Z,$){X=X|0;Y=Y|0;Z=Z|0;$=$|0;o=~s&o|s&$,n=~r&n|r&Z,m=~q&m|q&Y,l=~p&l|p&X}function Q(X){X=X|0;if(X&15)return-1;z[X|0]=d>>>24,z[X|1]=d>>>16&255,z[X|2]=d>>>8&255,z[X|3]=d&255,z[X|4]=e>>>24,z[X|5]=e>>>16&255,z[X|6]=e>>>8&255,z[X|7]=e&255,z[X|8]=f>>>24,z[X|9]=f>>>16&255,z[X|10]=f>>>8&255,z[X|11]=f&255,z[X|12]=g>>>24,z[X|13]=g>>>16&255,z[X|14]=g>>>8&255,z[X|15]=g&255;return 16}function R(X){X=X|0;if(X&15)return-1;z[X|0]=h>>>24,z[X|1]=h>>>16&255,z[X|2]=h>>>8&255,z[X|3]=h&255,z[X|4]=i>>>24,z[X|5]=i>>>16&255,z[X|6]=i>>>8&255,z[X|7]=i&255,z[X|8]=j>>>24,z[X|9]=j>>>16&255,z[X|10]=j>>>8&255,z[X|11]=j&255,z[X|12]=k>>>24,z[X|13]=k>>>16&255,z[X|14]=k>>>8&255,z[X|15]=k&255;return 16}function S(){B(0,0,0,0);t=d,u=e,v=f,w=g}function T(X,Y,Z){X=X|0;Y=Y|0;Z=Z|0;var $=0;if(Y&15)return-1;while((Z|0)>=16){V[X&7](z[Y|0]<<24|z[Y|1]<<16|z[Y|2]<<8|z[Y|3],z[Y|4]<<24|z[Y|5]<<16|z[Y|6]<<8|z[Y|7],z[Y|8]<<24|z[Y|9]<<16|z[Y|10]<<8|z[Y|11],z[Y|12]<<24|z[Y|13]<<16|z[Y|14]<<8|z[Y|15]);z[Y|0]=d>>>24,z[Y|1]=d>>>16&255,z[Y|2]=d>>>8&255,z[Y|3]=d&255,z[Y|4]=e>>>24,z[Y|5]=e>>>16&255,z[Y|6]=e>>>8&255,z[Y|7]=e&255,z[Y|8]=f>>>24,z[Y|9]=f>>>16&255,z[Y|10]=f>>>8&255,z[Y|11]=f&255,z[Y|12]=g>>>24,z[Y|13]=g>>>16&255,z[Y|14]=g>>>8&255,z[Y|15]=g&255;$=$+16|0,Y=Y+16|0,Z=Z-16|0}return $|0}function U(X,Y,Z){X=X|0;Y=Y|0;Z=Z|0;var $=0;if(Y&15)return-1;while((Z|0)>=16){W[X&1](z[Y|0]<<24|z[Y|1]<<16|z[Y|2]<<8|z[Y|3],z[Y|4]<<24|z[Y|5]<<16|z[Y|6]<<8|z[Y|7],z[Y|8]<<24|z[Y|9]<<16|z[Y|10]<<8|z[Y|11],z[Y|12]<<24|z[Y|13]<<16|z[Y|14]<<8|z[Y|15]);$=$+16|0,Y=Y+16|0,Z=Z-16|0}return $|0}var V=[B,C,D,E,F,G,H,I];var W=[D,J];return{set_rounds:K,set_state:L, -set_iv:M,set_nonce:N,set_mask:O,set_counter:P,get_state:Q,get_iv:R,gcm_init:S,cipher:T,mac:U}}(m,b,c);return n.set_key=e,n};return m.ENC={ECB:0,CBC:2,CFB:4,OFB:6,CTR:7},m.DEC={ECB:1,CBC:3,CFB:5,OFB:6,CTR:7},m.MAC={CBC:0,GCM:1},m.HEAP_DATA=16384,m}(),Ya=A.prototype;Ya.BLOCK_SIZE=16,Ya.reset=D,Ya.encrypt=z,Ya.decrypt=z;var Za=B.prototype;Za.BLOCK_SIZE=16,Za.reset=D,Za.process=y,Za.finish=z;var $a=68719476704,_a=F.prototype;_a.BLOCK_SIZE=16,_a.reset=I,_a.encrypt=L,_a.decrypt=O;var ab=G.prototype;ab.BLOCK_SIZE=16,ab.reset=I,ab.process=J,ab.finish=K;var bb=H.prototype;bb.BLOCK_SIZE=16,bb.reset=I,bb.process=M,bb.finish=N;var cb=new Uint8Array(1048576),db=Xa(b,null,cb.buffer);a.AES_GCM=F,a.AES_GCM.encrypt=P,a.AES_GCM.decrypt=Q,a.AES_GCM.Encrypt=G,a.AES_GCM.Decrypt=H;var eb=64,fb=32;V.BLOCK_SIZE=eb,V.HASH_SIZE=fb;var gb=V.prototype;gb.reset=R,gb.process=S,gb.finish=T;var hb=null;V.bytes=X,V.hex=Y,V.base64=Z,a.SHA256=V;var ib=$.prototype;ib.reset=ba,ib.process=ca,ib.finish=da,ea.BLOCK_SIZE=V.BLOCK_SIZE,ea.HMAC_SIZE=V.HASH_SIZE;var jb=ea.prototype;jb.reset=fa,jb.process=ca,jb.finish=ga;var kb=null;ea.bytes=ia,ea.hex=ja,ea.base64=ka,a.HMAC_SHA256=ea;var lb=la.prototype;lb.reset=ma,lb.generate=na;var mb=oa.prototype;mb.reset=ma,mb.generate=pa;var nb,ob=null,pb=function(){function a(){function a(){b^=d<<11,l=l+b|0,d=d+f|0,d^=f>>>2,m=m+d|0,f=f+l|0,f^=l<<8,n=n+f|0,l=l+m|0,l^=m>>>16,o=o+l|0,m=m+n|0,m^=n<<10,p=p+m|0,n=n+o|0,n^=o>>>4,b=b+n|0,o=o+p|0,o^=p<<8,d=d+o|0,p=p+b|0,p^=b>>>9,f=f+p|0,b=b+d|0}var b,d,f,l,m,n,o,p;h=i=j=0,b=d=f=l=m=n=o=p=2654435769;for(var q=0;4>q;q++)a();for(var q=0;256>q;q+=8)b=b+g[0|q]|0,d=d+g[1|q]|0,f=f+g[2|q]|0,l=l+g[3|q]|0,m=m+g[4|q]|0,n=n+g[5|q]|0,o=o+g[6|q]|0,p=p+g[7|q]|0,a(),e.set([b,d,f,l,m,n,o,p],q);for(var q=0;256>q;q+=8)b=b+e[0|q]|0,d=d+e[1|q]|0,f=f+e[2|q]|0,l=l+e[3|q]|0,m=m+e[4|q]|0,n=n+e[5|q]|0,o=o+e[6|q]|0,p=p+e[7|q]|0,a(),e.set([b,d,f,l,m,n,o,p],q);c(1),k=256}function b(b){var c,d,e,h,i;if(q(b))b=new Uint8Array(b.buffer);else if(m(b))h=new Wa(1),h[0]=b,b=new Uint8Array(h.buffer);else if(n(b))b=f(b);else{if(!o(b))throw new TypeError("bad seed type");b=new Uint8Array(b)}for(i=b.length,d=0;i>d;d+=1024){for(e=d,c=0;1024>c&&i>e;e=d|++c)g[c>>2]^=b[e]<<((3&c)<<3);a()}}function c(a){a=a||1;for(var b,c,d;a--;)for(j=j+1|0,i=i+j|0,b=0;256>b;b+=4)h^=h<<13,h=e[b+128&255]+h|0,c=e[0|b],e[0|b]=d=e[c>>>2&255]+(h+i|0)|0,g[0|b]=i=e[d>>>10&255]+c|0,h^=h>>>6,h=e[b+129&255]+h|0,c=e[1|b],e[1|b]=d=e[c>>>2&255]+(h+i|0)|0,g[1|b]=i=e[d>>>10&255]+c|0,h^=h<<2,h=e[b+130&255]+h|0,c=e[2|b],e[2|b]=d=e[c>>>2&255]+(h+i|0)|0,g[2|b]=i=e[d>>>10&255]+c|0,h^=h>>>16,h=e[b+131&255]+h|0,c=e[3|b],e[3|b]=d=e[c>>>2&255]+(h+i|0)|0,g[3|b]=i=e[d>>>10&255]+c|0}function d(){return k--||(c(1),k=255),g[k]}var e=new Uint32Array(256),g=new Uint32Array(256),h=0,i=0,j=0,k=0;return{seed:b,prng:c,rand:d}}(),qb=b.console,rb=b.Date.now,sb=b.Math.random,tb=b.performance,ub=b.crypto||b.msCrypto;void 0!==ub&&(nb=ub.getRandomValues);var vb,wb=pb.rand,xb=pb.seed,yb=0,zb=!1,Ab=!1,Bb=0,Cb=256,Db=!1,Eb=!1,Fb={};if(void 0!==tb)vb=function(){return 1e3*tb.now()|0};else{var Gb=1e3*rb()|0;vb=function(){return 1e3*rb()-Gb|0}}a.random=ua,a.random.seed=sa,Object.defineProperty(ua,"allowWeak",{get:function(){return Db},set:function(a){Db=a}}),Object.defineProperty(ua,"skipSystemRNGWarning",{get:function(){return Eb},set:function(a){Eb=a}}),a.getRandomValues=ta,a.getRandomValues.seed=sa,Object.defineProperty(ta,"allowWeak",{get:function(){return Db},set:function(a){Db=a}}),Object.defineProperty(ta,"skipSystemRNGWarning",{get:function(){return Eb},set:function(a){Eb=a}}),b.Math.random=ua,void 0===b.crypto&&(b.crypto={}),b.crypto.getRandomValues=ta;var Hb,Ib={Uint32Array:Uint32Array,Math:b.Math},Jb=new Uint32Array(1048576);void 0===Ib.Math.imul?(Ib.Math.imul=xa,Hb=va(Ib,null,Jb.buffer),delete Ib.Math.imul):Hb=va(Ib,null,Jb.buffer);var Kb=new Uint32Array(0),Lb=ya.prototype=new Number;Lb.toString=za,Lb.toBytes=Aa,Lb.valueOf=Ba,Lb.clamp=Ca,Lb.slice=Da,Lb.negate=Ea,Lb.compare=Fa,Lb.add=Ga,Lb.subtract=Ha,Lb.multiply=Ia,Lb.square=Ja,Lb.divide=Ka;var Mb=new ya(0),Nb=new ya(1);Object.freeze(Mb),Object.freeze(Nb);var Ob=Na.prototype=new ya;Ob.reduce=Oa,Ob.inverse=Pa,Ob.power=Qa;var Pb=[2,3];return Lb.isProbablePrime=Ta,ya.randomProbablePrime=Va,ya.ZERO=Mb,ya.ONE=Nb,ya.extGCD=Ma,a.BigNumber=ya,a.Modulus=Na,"function"==typeof define&&define.amd?define([],function(){return a}):"object"==typeof module&&module.exports?module.exports=a:b.asmCrypto=a,a}({},this); diff --git a/assets/dl.svg b/assets/dl.svg new file mode 100644 index 000000000..fc57a36a0 --- /dev/null +++ b/assets/dl.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/error.svg b/assets/error.svg new file mode 100644 index 000000000..e5bfdefe6 --- /dev/null +++ b/assets/error.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/favicon-120.png b/assets/favicon-120.png deleted file mode 100644 index 1fa60cd8b..000000000 Binary files a/assets/favicon-120.png and /dev/null differ diff --git a/assets/favicon-128.png b/assets/favicon-128.png deleted file mode 100644 index 45f37fceb..000000000 Binary files a/assets/favicon-128.png and /dev/null differ diff --git a/assets/favicon-144.png b/assets/favicon-144.png deleted file mode 100644 index 5f822567d..000000000 Binary files a/assets/favicon-144.png and /dev/null differ diff --git a/assets/favicon-152.png b/assets/favicon-152.png deleted file mode 100644 index afa2e978c..000000000 Binary files a/assets/favicon-152.png and /dev/null differ diff --git a/assets/favicon-167.png b/assets/favicon-167.png deleted file mode 100644 index d39f8a0c5..000000000 Binary files a/assets/favicon-167.png and /dev/null differ diff --git a/assets/favicon-16x16.png b/assets/favicon-16x16.png new file mode 100644 index 000000000..2b8e84d75 Binary files /dev/null and b/assets/favicon-16x16.png differ diff --git a/assets/favicon-180.png b/assets/favicon-180.png deleted file mode 100644 index 67a233920..000000000 Binary files a/assets/favicon-180.png and /dev/null differ diff --git a/assets/favicon-195.png b/assets/favicon-195.png deleted file mode 100644 index bb763ea56..000000000 Binary files a/assets/favicon-195.png and /dev/null differ diff --git a/assets/favicon-196.png b/assets/favicon-196.png deleted file mode 100644 index 8ca0f0b99..000000000 Binary files a/assets/favicon-196.png and /dev/null differ diff --git a/assets/favicon-228.png b/assets/favicon-228.png deleted file mode 100644 index 3df9e05cc..000000000 Binary files a/assets/favicon-228.png and /dev/null differ diff --git a/assets/favicon-32.png b/assets/favicon-32.png deleted file mode 100644 index 045edd376..000000000 Binary files a/assets/favicon-32.png and /dev/null differ diff --git a/assets/favicon-32x32.png b/assets/favicon-32x32.png new file mode 100644 index 000000000..e57a145e4 Binary files /dev/null and b/assets/favicon-32x32.png differ diff --git a/assets/favicon-96.png b/assets/favicon-96.png deleted file mode 100644 index ab8519025..000000000 Binary files a/assets/favicon-96.png and /dev/null differ diff --git a/assets/github-icon.svg b/assets/github-icon.svg deleted file mode 100644 index 44e074c89..000000000 --- a/assets/github-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/icon.svg b/assets/icon.svg new file mode 100644 index 000000000..d3eef44cf --- /dev/null +++ b/assets/icon.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/assets/illustration_download.svg b/assets/illustration_download.svg deleted file mode 100644 index 9425fc288..000000000 --- a/assets/illustration_download.svg +++ /dev/null @@ -1 +0,0 @@ -Untitled \ No newline at end of file diff --git a/assets/illustration_error.svg b/assets/illustration_error.svg deleted file mode 100644 index cba8d2e0d..000000000 --- a/assets/illustration_error.svg +++ /dev/null @@ -1 +0,0 @@ -illustration \ No newline at end of file diff --git a/assets/illustration_expired.svg b/assets/illustration_expired.svg deleted file mode 100644 index 1d569f085..000000000 --- a/assets/illustration_expired.svg +++ /dev/null @@ -1 +0,0 @@ -Group \ No newline at end of file diff --git a/assets/intro.svg b/assets/intro.svg new file mode 100644 index 000000000..c2b46d1cf --- /dev/null +++ b/assets/intro.svg @@ -0,0 +1,4 @@ + + + + diff --git a/assets/lock.svg b/assets/lock.svg new file mode 100644 index 000000000..d4e16c964 --- /dev/null +++ b/assets/lock.svg @@ -0,0 +1,4 @@ + + \ No newline at end of file diff --git a/assets/main.css b/assets/main.css deleted file mode 100644 index aa89c3e4e..000000000 --- a/assets/main.css +++ /dev/null @@ -1,1236 +0,0 @@ -/*** index.html ***/ -html { - background: url('./send_bg.svg'); - font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui', - 'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif; - font-weight: 200; - background-size: 110%; - background-repeat: no-repeat; - background-position: center top; - height: 100%; - margin: auto; -} - -body { - font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Text', 'segoe ui', - 'helvetica neue', helvetica, ubuntu, roboto, noto, arial, sans-serif; - display: flex; - flex-direction: column; - margin: 0; - min-height: 100vh; - position: relative; -} - -#progress circle { - stroke: #eee; - stroke-width: 0.75em; -} - -#progress #bar { - transition: stroke-dashoffset 300ms linear; - stroke: #3b9dff; -} - -.header { - align-items: flex-start; - box-sizing: border-box; - display: flex; - justify-content: space-between; - padding: 31px; - width: 100%; -} - -.send-logo { - display: flex; - position: relative; - align-items: center; -} - -.send-logo h1 { - transition: color 50ms; -} - -.send-logo h1:hover { - color: #0297f8; -} - -.send-logo > a { - display: flex; - flex-direction: row; -} - -.site-title { - color: #3e3d40; - font-size: 32px; - font-weight: 500; - margin: 0; - position: relative; - top: -1px; - letter-spacing: 1px; - margin-left: 8px; -} - -.site-subtitle { - color: #3e3d40; - font-size: 12px; - margin: 0 8px; -} - -.site-subtitle a { - font-weight: bold; - color: #3e3d40; - transition: color 50ms; -} - -.site-subtitle a:hover { - color: #0297f8; -} - -.feedback { - background-color: #0297f8; - background-image: url('./feedback.svg'); - background-position: 2px 4px; - background-repeat: no-repeat; - background-size: 18px; - border-radius: 3px; - border: 1px solid #0297f8; - box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1); - color: #fff; - cursor: pointer; - display: block; - float: right; - font-size: 12px; - line-height: 12px; - opacity: 0.9; - padding: 5px; - overflow: hidden; - min-width: 12px; - max-width: 12px; - text-indent: 17px; - transition: all 250ms ease-in-out; - white-space: nowrap; -} - -.feedback:hover, -.feedback:focus { - min-width: 30px; - max-width: 300px; - text-indent: 2px; - padding: 5px 5px 5px 20px; - background-color: #0287e8; -} - -.feedback:active { - background-color: #0277d8; -} - -.all { - flex: 1; - display: flex; - flex-direction: column; - justify-content: flex-start; - max-width: 650px; - margin: 0 auto; - padding: 0 20px; - box-sizing: border-box; - width: 96%; -} - -pre, -input, -select, -textarea, -button { - font-family: inherit; - margin: 0; -} - -pre { - font-family: monospace; - font-size: 18px; - font-weight: 600; - display: inline-block; -} - -a { - text-decoration: none; -} - -.btn { - font-weight: 500; -} - -/** page-one **/ - -.fadeOut { - opacity: 0; - animation: fadeout 200ms linear; -} - -@keyframes fadeout { - 0% { - opacity: 1; - } - - 100% { - opacity: 0; - } -} - -.fadeIn { - opacity: 1; - animation: fadein 200ms linear; -} - -@keyframes fadein { - 0% { - opacity: 0; - } - - 100% { - opacity: 1; - } -} - -.title { - font-size: 33px; - line-height: 40px; - margin: 20px auto; - text-align: center; - max-width: 520px; - font-family: 'SF Pro Text', sans-serif; - word-wrap: break-word; -} - -.description { - font-size: 15px; - line-height: 23px; - max-width: 630px; - text-align: center; - margin: 0 auto 60px; - color: #0c0c0d; - width: 92%; -} - -.upload-window { - border: 3px dashed rgba(0, 148, 251, 0.5); - margin: 0 auto 10px; - height: 255px; - border-radius: 4px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; - transition: transform 150ms; - padding: 15px; -} - -.upload-window.ondrag { - border: 5px dashed rgba(0, 148, 251, 0.5); - height: 251px; - transform: scale(1.04); - border-radius: 4.2px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; -} - -.upload-window.ondrag * { - pointer-events: none; -} - -.link { - color: #0094fb; - text-decoration: none; -} - -.link:hover { - color: #0287e8; -} - -#upload-text { - font-size: 22px; - color: #737373; - margin: 20px 0 10px; - font-family: 'SF Pro Text', sans-serif; -} - -.browse { - background: #0297f8; - border-radius: 5px; - font-size: 20px; - color: #fff; - min-width: 240px; - height: 60px; - display: flex; - justify-content: center; - align-items: center; - cursor: pointer; - padding: 0 10px; -} - -.browse:hover { - background-color: #0287e8; -} - -input[type='file'] { - opacity: 0; - overflow: hidden; - position: absolute; - z-index: -1; -} - -input[type='file'].has-focus + #browse, -input[type='file']:focus + #browse { - background-color: #0287e8; - outline: 1px dotted #000; - outline: -webkit-focus-ring-color auto 5px; -} - -#file-size-msg { - font-size: 12px; - line-height: 16px; - color: #737373; - margin-bottom: 22px; -} - -/** file-list **/ -th { - font-size: 16px; - color: #858585; - font-weight: lighter; - text-align: left; - background: rgba(0, 148, 251, 0.05); - height: 40px; - border-top: 1px solid rgba(0, 148, 251, 0.1); - padding: 0 19px; - white-space: nowrap; -} - -td { - font-size: 15px; - vertical-align: top; - color: #4a4a4a; - padding: 17px 19px 0; - line-height: 23px; - position: relative; -} - -table { - border-collapse: collapse; - font-family: 'Segoe UI', 'SF Pro Text', sans-serif; -} - -tbody { - word-wrap: break-word; - word-break: break-all; -} - -#uploaded-files { - margin: 45.3px auto; - table-layout: fixed; -} - -#uploaded-file { - width: 35%; -} - -#copy-file-list { - width: 25%; -} - -#expiry-time-file-list { - width: 25%; -} - -#expiry-downloads-file-list { - width: 8%; -} - -#delete-file-list { - width: 7%; -} - -.overflow-col { - text-overflow: ellipsis; - max-width: 0; - overflow: hidden; - white-space: nowrap; -} - -.center-col { - text-align: center; -} - -.icon-delete, -.icon-copy, -.icon-check { - cursor: pointer; -} - -.icon-copy[disabled='disabled'] { - pointer-events: none; - opacity: 0.3; -} - -.text-copied { - color: #0a8dff; -} - -/* Popup container */ -.popup { - position: absolute; - display: inline-block; -} - -/* The actual popup (appears on top) */ -.popup .popuptext { - visibility: hidden; - min-width: 204px; - min-height: 105px; - background-color: #fff; - color: #000; - border: 1px solid #d7d7db; - padding: 15px 24px; - box-sizing: content-box; - text-align: center; - border-radius: 5px; - position: absolute; - z-index: 1; - bottom: 20px; - left: -40px; - transition: opacity 0.5s; - opacity: 0; - outline: 0; - box-shadow: 3px 3px 7px rgba(136, 136, 136, 0.3); -} - -/* Popup arrow */ -.popup .popuptext::after { - content: ''; - position: absolute; - bottom: -11px; - left: 20px; - background-color: #fff; - display: block; - width: 20px; - height: 20px; - transform: rotate(45deg); - border-radius: 0 0 5px; - border-right: 1px solid #d7d7db; - border-bottom: 1px solid #d7d7db; - border-left: 1px solid #fff; - border-top: 1px solid #fff; -} - -.popup .show { - visibility: visible; - opacity: 1; -} - -.popup-message { - height: 40px; - display: flex; - justify-content: center; - align-items: center; - border-bottom: 1px #ebebeb solid; - color: #0c0c0d; - font-size: 15px; - font-weight: normal; - padding-bottom: 15px; - white-space: nowrap; - width: calc(100% + 48px); - margin-left: -24px; -} - -.popup-action { - margin-top: 15px; - display: flex; - flex-direction: row; - align-items: center; - justify-content: space-between; -} - -.popup-yes { - color: #fff; - background-color: #0297f8; - border-radius: 5px; - padding: 5px 25px; - font-weight: normal; - cursor: pointer; - min-width: 94px; - box-sizing: border-box; - white-space: nowrap; - margin-left: 12px; -} - -.popup-yes:hover { - background-color: #0287e8; -} - -.popup-no { - color: #4a4a4a; - background-color: #fbfbfb; - border: 1px #c1c1c1 solid; - border-radius: 5px; - padding: 5px 25px; - font-weight: normal; - min-width: 94px; - box-sizing: border-box; - cursor: pointer; - white-space: nowrap; -} - -.popup-no:hover { - background-color: #efeff1; -} - -/** upload-progress **/ -.progress-bar { - margin-top: 3px; - display: flex; - justify-content: center; - align-items: center; - text-align: center; - position: relative; -} - -.percentage { - letter-spacing: -0.78px; - font-family: 'Segoe UI', 'SF Pro Text', sans-serif; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; -} - -.percent-number { - font-size: 43.2px; - line-height: 58px; -} - -.percent-sign { - font-size: 28.8px; - stroke: none; - fill: #686868; -} - -.upload { - margin: 0 auto; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; - font-size: 15px; -} - -.progress-text { - color: rgba(0, 0, 0, 0.5); - letter-spacing: -0.4px; - margin-top: 24px; - margin-bottom: 74px; -} - -#cancel-upload { - color: #d70022; - background: #fff; - font-size: 15px; - border: 0; - cursor: pointer; - text-decoration: underline; -} - -#cancel-upload:disabled { - text-decoration: none; - cursor: auto; -} - -/** share-link **/ -#share-window { - margin: 0 auto; - display: flex; - justify-content: center; - flex-direction: column; - width: 100%; - max-width: 640px; -} - -#share-window-r > div { - font-size: 12px; - padding-bottom: 10px; -} - -#copy { - display: flex; - flex-wrap: nowrap; - width: 100%; -} - -#copy.wait-password #link, -#copy.wait-password #copy-btn { - opacity: 0.5; -} - -#copy-text { - align-self: flex-start; - margin-top: 60px; - margin-bottom: 10px; - color: #0c0c0d; - max-width: 614px; - word-wrap: break-word; -} - -#link { - flex: 1; - height: 56px; - border: 1px solid #0297f8; - border-radius: 6px 0 0 6px; - font-size: 20px; - color: #737373; - font-family: 'SF Pro Text', sans-serif; - letter-spacing: 0; - line-height: 23px; - font-weight: 300; - padding-left: 10px; - padding-right: 10px; -} - -#link:disabled { - border: 1px solid #05a700; - background: #fff; -} - -#copy-btn { - flex: 0 1 165px; - background: #0297f8; - border-radius: 0 6px 6px 0; - border: 1px solid #0297f8; - color: white; - cursor: pointer; - font-size: 15px; - padding-bottom: 4px; - padding-left: 10px; - padding-right: 10px; - white-space: nowrap; -} - -#copy-btn:not(:disabled):hover { - background-color: #0287e8; -} - -#copy-btn.success { - background: #05a700; - border: 1px solid #05a700; -} - -#copy-btn:disabled { - cursor: auto; -} - -#delete-file { - align-self: center; - width: 176px; - height: 44px; - background: #fff; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 5px; - font-size: 15px; - margin-top: 50px; - margin-bottom: 12px; - cursor: pointer; - color: #313131; -} - -#deletePopup { - position: relative; - align-self: center; - bottom: 50px; -} - -#delete-file:hover { - background: #efeff1; -} - -#resetButton { - width: 80px; - height: 30px; - background: #fff; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 5px; - font-size: 15px; - margin-top: 5px; - margin-left: 15px; - margin-bottom: 12px; - line-height: 24px; - cursor: pointer; - color: #313131; -} - -#resetButton:hover { - background: #efeff1; -} - -.send-new { - font-size: 15px; - margin: auto; - text-align: center; - color: #0094fb; - cursor: pointer; - text-decoration: underline; -} - -.send-new:hover, -.send-new:focus, -.send-new:active { - color: #0287e8; -} - -.hidden { - visibility: hidden; -} - -.selectPassword { - padding: 10px 0; - align-self: left; - max-width: 100%; - overflow-wrap: break-word; -} - -.passwordOriginal { - display: none; -} - -.selectPassword :hover .passwordOriginal { - display: inline; -} - -.selectPassword :hover .passwordMask { - display: none; -} - -.setPassword { - align-self: left; - display: flex; - flex-wrap: nowrap; - width: 80%; - padding: 10px 5px; -} - -/* upload-error */ -#upload-error { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; -} - -#upload-error[hidden], -#unsupported-browser[hidden] { - display: none; -} - -#upload-error-img { - margin: 51px 0 71px; -} - -/* unsupported-browser */ -#unsupported-browser { - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; -} - -.unsupported-description { - font-size: 13px; - line-height: 23px; - text-align: center; - color: #7d7d7d; - margin: 0 auto 23px; -} - -.firefox-logo { - width: 70px; -} - -.firefox-logo-small { - width: 24px; -} - -#dl-firefox, -#update-firefox { - margin-bottom: 181px; - height: 80px; - background: #98e02b; - border-radius: 3px; - cursor: pointer; - border: 0; - box-shadow: 0 5px 3px rgb(234, 234, 234); - font-family: 'Fira Sans', 'segoe ui', sans-serif; - font-weight: 500; - color: #fff; - font-size: 26px; - display: flex; - justify-content: center; - align-items: center; - line-height: 1; - padding: 0 25px; -} - -.unsupported-button-text { - text-align: left; - margin-left: 20.4px; -} - -.unsupported-button-text > span { - font-family: 'Fira Sans', 'segoe ui', sans-serif; - font-weight: 300; - font-size: 18px; - letter-spacing: -0.69px; -} - -/** download.html **/ -#download-btn { - font-size: 15px; - color: white; - width: 180px; - height: 44px; - margin-top: 20px; - margin-bottom: 30px; - text-align: center; - background: #0297f8; - border: 1px solid #0297f8; - border-radius: 5px; - cursor: pointer; -} - -#download-btn:hover { - background-color: #0287e8; -} - -#download-btn:disabled { - background: #47b04b; - cursor: auto; -} - -#download { - margin: 0 auto 30px; - display: flex; - justify-content: center; - align-items: center; - flex-direction: column; - text-align: center; -} - -#expired-img { - margin: 51px 0 71px; -} - -.expired-description { - font-size: 15px; - line-height: 23px; - text-align: center; - color: #7d7d7d; - margin: 0 auto 23px; -} - -#download-progress { - width: 590px; -} - -#download-progress[hidden] { - display: none; -} - -#download-img { - width: 283px; - height: 196px; -} - -.enterPassword { - text-align: left; - padding: 40px; -} - -.red { - color: red; -} - -#unlock { - display: flex; - flex-wrap: nowrap; - width: 100%; - padding: 10px 0; -} - -.unlock-input { - flex: 1; - height: 46px; - border: 1px solid #0297f8; - border-radius: 6px 0 0 6px; - font-size: 20px; - color: #737373; - font-family: 'SF Pro Text', sans-serif; - letter-spacing: 0; - line-height: 23px; - font-weight: 300; - padding-left: 10px; - padding-right: 10px; -} - -#unlock-btn, -#unlock-reset-btn { - flex: 0 1 165px; - background: #0297f8; - border-radius: 0 6px 6px 0; - border: 1px solid #0297f8; - color: white; - cursor: pointer; - - /* Force flat button look */ - -webkit-appearance: none; - font-size: 15px; - padding-bottom: 3px; - padding-left: 10px; - padding-right: 10px; - white-space: nowrap; -} - -#unlock-btn:hover, -#unlock-reset-btn:hover { - background-color: #0287e8; -} - -.btn-hidden { - display: none; -} - -.input-no-btn { - border-radius: 6px; -} - -/* footer */ -.footer { - right: 0; - bottom: 0; - left: 0; - font-size: 13px; - display: flex; - align-items: flex-end; - flex-direction: row; - justify-content: space-between; - padding: 50px 31px 41px; - width: 100%; - box-sizing: border-box; -} - -.mozilla-logo { - width: 112px; - height: 32px; - margin-bottom: -5px; -} - -.legal-links { - max-width: 81vw; - display: flex; - align-items: center; - flex-direction: row; -} - -.legal-links > a { - color: #858585; - opacity: 0.9; - white-space: nowrap; - margin-right: 2vw; -} - -.legal-links > a:hover { - opacity: 1; -} - -.legal-links > a:visited { - color: #858585; -} - -.social-links { - display: flex; - justify-content: space-between; - width: 94px; -} - -.social-links > a { - opacity: 0.9; -} - -.social-links > a:hover { - opacity: 1; -} - -.github, -.twitter { - width: 32px; - height: 32px; - margin-bottom: -5px; -} - -#addPasswordWrapper { - min-height: 24px; -} - -#addPassword { - position: absolute; - visibility: collapse; -} - -#addPasswordWrapper:hover label::before { - border: 1px solid #0297f8; -} - -#addPasswordWrapper label { - line-height: 23px; - cursor: pointer; - color: #737373; -} - -#addPassword:checked + label { - color: #000; -} - -#addPasswordWrapper label::before { - content: ''; - height: 20px; - width: 20px; - margin-right: 10px; - margin-left: 5px; - float: left; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 2px; -} - -#addPassword:checked + label::before { - background-image: url('./check-16-blue.svg'); - background-position: 2px 1px; -} - -.banner { - padding: 0 15px; - height: 48px; - background-color: #efeff1; - color: #4a4a4f; - font-size: 13px; - display: flex; - flex-direction: row; - align-content: center; - align-items: center; - justify-content: center; -} - -.banner > div { - display: flex; - align-items: center; - margin: 0 auto; -} - -.banner > div > span { - margin-left: 10px; -} - -.banner-blue { - background: linear-gradient(-180deg, #45a1ff 0%, #00feff 94%); - color: #fff; -} - -.banner-blue a { - color: #fff; - font-weight: bold; -} - -.banner-blue a:hover { - color: #eee; - font-weight: bold; -} - -.banner-pink { - background: linear-gradient(-180deg, #ff9400 0%, #ff1ad9 94%); - color: #fff; -} - -.banner-pink a { - color: #fff; - font-weight: bold; -} - -.banner-pink a:hover { - color: #eee; - font-weight: bold; -} - -.selectbox { - display: inline-block; - position: relative; - cursor: pointer; -} - -.selectSelected { - cursor: pointer; -} - -.selectOptions { - display: none; -} - -.selectOptions.active { - display: block; - position: absolute; - top: 0; - left: 0; - padding: 0; - margin: 40px 0; - background-color: white; - border: 1px solid rgba(12, 12, 13, 0.3); - border-radius: 4px; - box-shadow: 1px 2px 4px rgba(12, 12, 13, 0.3); -} - -.selectOption { - color: #737373; - font-size: 12pt; - list-style: none; - user-select: none; - white-space: nowrap; - padding: 0 60px; - border-bottom: 1px solid rgba(12, 12, 13, 0.3); -} - -.selectOption:hover { - background-color: #f4f4f4; -} - -@media (max-device-width: 992px), (max-width: 992px) { - .popup .popuptext { - left: auto; - right: -40px; - } - - .popup .popuptext::after { - left: auto; - right: 36px; - } -} - -@media (max-device-width: 768px), (max-width: 768px) { - .description { - margin: 0 auto 25px; - } - - #copy { - width: 100%; - } - - #link { - font-size: 18px; - } - - .footer { - flex-direction: column; - justify-content: flex-start; - align-items: flex-start; - max-width: 630px; - margin: auto; - } - - .mozilla-logo { - margin-left: -7px; - } - - .legal-links { - flex-direction: column; - margin: auto; - width: 100%; - max-width: 100%; - } - - .legal-links > * { - display: block; - padding: 10px 0; - align-self: flex-start; - } - - .social-links { - margin-top: 20px; - align-self: flex-start; - } -} - -@media (max-device-width: 520px), (max-width: 520px) { - .header { - flex-direction: column; - justify-content: flex-start; - } - - .feedback { - margin-top: 10px; - min-width: 30px; - max-width: 300px; - text-indent: 2px; - padding: 5px 5px 5px 20px; - } - - #copy, - .setPassword, - #unlock { - width: 100%; - flex-direction: column; - padding-left: 0; - } - - .selectPassword { - align-self: center; - min-width: 95%; - } - - #addPasswordWrapper label::before { - margin-left: 0; - } - - #link, - #unlock-input, - #unlock-reset-input { - font-size: 22px; - padding: 15px 10px; - border-radius: 6px 6px 0 0; - } - - #copy-btn, - #unlock-btn, - #unlock-reset-btn { - border-radius: 0 0 6px 6px; - flex: 0 1 65px; - } - - #copy-text { - text-align: center; - } - - th { - font-size: 14px; - padding: 0 5px; - } - - td { - font-size: 13px; - padding: 17px 5px 0; - } - - .popup .popuptext::after { - left: 125px; - } - - #deletePopup { - left: 83px; - } -} diff --git a/assets/master-logo.svg b/assets/master-logo.svg new file mode 100644 index 000000000..cdaeba190 --- /dev/null +++ b/assets/master-logo.svg @@ -0,0 +1,2 @@ + + diff --git a/assets/mozilla-logo.svg b/assets/mozilla-logo.svg deleted file mode 100644 index 3ea2e8687..000000000 --- a/assets/mozilla-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/notFound.svg b/assets/notFound.svg new file mode 100644 index 000000000..9ce3b9c0f --- /dev/null +++ b/assets/notFound.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/safari-pinned-tab.svg b/assets/safari-pinned-tab.svg new file mode 100644 index 000000000..dd02a166a --- /dev/null +++ b/assets/safari-pinned-tab.svg @@ -0,0 +1,7 @@ + + + + diff --git a/assets/select-arrow.svg b/assets/select-arrow.svg new file mode 100644 index 000000000..d43db4d07 --- /dev/null +++ b/assets/select-arrow.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/assets/send-fb.jpg b/assets/send-fb.jpg deleted file mode 100644 index 784fe51f8..000000000 Binary files a/assets/send-fb.jpg and /dev/null differ diff --git a/assets/send-twitter.jpg b/assets/send-twitter.jpg deleted file mode 100644 index d13d5f907..000000000 Binary files a/assets/send-twitter.jpg and /dev/null differ diff --git a/assets/send_bg.svg b/assets/send_bg.svg deleted file mode 100644 index a4557accb..000000000 --- a/assets/send_bg.svg +++ /dev/null @@ -1 +0,0 @@ -File transfer_homepage Copy{ } \ No newline at end of file diff --git a/assets/send_logo.svg b/assets/send_logo.svg deleted file mode 100644 index b13d138f8..000000000 --- a/assets/send_logo.svg +++ /dev/null @@ -1 +0,0 @@ -send logo \ No newline at end of file diff --git a/assets/share-24.svg b/assets/share-24.svg new file mode 100644 index 000000000..f85064c9c --- /dev/null +++ b/assets/share-24.svg @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/assets/twitter-icon.svg b/assets/twitter-icon.svg deleted file mode 100644 index 8816009ae..000000000 --- a/assets/twitter-icon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/assets/upload.svg b/assets/upload.svg deleted file mode 100644 index f98e6b2e6..000000000 --- a/assets/upload.svg +++ /dev/null @@ -1 +0,0 @@ -upload \ No newline at end of file diff --git a/assets/user.svg b/assets/user.svg new file mode 100644 index 000000000..3d052d07a --- /dev/null +++ b/assets/user.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/assets/wordmark.svg b/assets/wordmark.svg new file mode 100644 index 000000000..5b8d5cf2d --- /dev/null +++ b/assets/wordmark.svg @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/browserconfig.xml b/browserconfig.xml deleted file mode 100644 index a1ff7e28e..000000000 --- a/browserconfig.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - #0297F8 - - - \ No newline at end of file diff --git a/browserslist b/browserslist index d4ca6a4fd..6ba761ca8 100644 --- a/browserslist +++ b/browserslist @@ -1,5 +1,6 @@ last 2 chrome versions last 2 firefox versions +last 2 safari versions +last 2 edge versions +edge 18 firefox esr -ie >= 9 -safari >= 9 diff --git a/build/android_index_plugin.js b/build/android_index_plugin.js new file mode 100644 index 000000000..7f37d608b --- /dev/null +++ b/build/android_index_plugin.js @@ -0,0 +1,50 @@ +const path = require('path'); +const html = require('choo/html'); +const NAME = 'AndroidIndexPlugin'; + +function chunkFileNames(compilation) { + const names = {}; + for (const chunk of compilation.chunks) { + for (const file of chunk.files) { + if (!/\.map$/.test(file)) { + names[`${chunk.name}${path.extname(file)}`] = file; + } + } + } + return names; +} +class AndroidIndexPlugin { + apply(compiler) { + compiler.hooks.emit.tap(NAME, compilation => { + const files = chunkFileNames(compilation); + const page = html` + + + Send + + + + + + + + + ` + .toString() + .replace(/\n\s{6}/g, '\n'); + compilation.assets['android.html'] = { + source() { + return page; + }, + size() { + return page.length; + } + }; + }); + } +} + +module.exports = AndroidIndexPlugin; diff --git a/build/fluent_loader.js b/build/fluent_loader.js deleted file mode 100644 index 26d6ee564..000000000 --- a/build/fluent_loader.js +++ /dev/null @@ -1,57 +0,0 @@ -const { MessageContext } = require('fluent'); -const fs = require('fs'); - -function toJSON(map) { - return JSON.stringify(Array.from(map)); -} - -function merge(m1, m2) { - const result = new Map(m1); - for (const [k, v] of m2) { - result.set(k, v); - } - return result; -} - -module.exports = function(source) { - const localeExp = this.options.locale || /([^/]+)\/[^/]+\.ftl$/; - const result = localeExp.exec(this.resourcePath); - const locale = result && result[1]; - if (!locale) { - throw new Error(`couldn't find locale in: ${this.resourcePath}`); - } - // load default language and "merge" contexts - // TODO: make this configurable - const en_ftl = fs.readFileSync( - require.resolve('../public/locales/en-US/send.ftl'), - 'utf8' - ); - const en = new MessageContext('en-US'); - en.addMessages(en_ftl); - // pre-parse the ftl - const context = new MessageContext(locale); - context.addMessages(source); - - const merged = merge(en._messages, context._messages); - return ` -module.exports = \` -if (typeof window === 'undefined') { - var fluent = require('fluent'); -} -var ctx = new fluent.MessageContext('${locale}', {useIsolating: false}); -ctx._messages = new Map(${toJSON(merged)}); -function translate(id, data) { - var msg = ctx.getMessage(id); - if (typeof(msg) !== 'string' && !msg.val && msg.attrs) { - msg = msg.attrs.title || msg.attrs.alt - } - return ctx.format(msg, data); -} -if (typeof window === 'undefined') { - module.exports = translate; -} -else { - window.translate = translate; -} -\``; -}; diff --git a/build/generate_l10n_map.js b/build/generate_l10n_map.js deleted file mode 100644 index 57f73ab4c..000000000 --- a/build/generate_l10n_map.js +++ /dev/null @@ -1,22 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -function kv(d) { - return `"${d}": require('../public/locales/${d}/send.ftl')`; -} - -module.exports = function() { - const dirs = fs.readdirSync(path.join(__dirname, '..', 'public', 'locales')); - const code = ` - module.exports = { - translate: function (id, data) { return window.translate(id, data) }, - ${dirs.map(kv).join(',\n')} - };`; - return { - code, - dependencies: dirs.map(d => - require.resolve(`../public/locales/${d}/send.ftl`) - ), - cacheable: false - }; -}; diff --git a/build/package_json_loader.js b/build/package_json_loader.js deleted file mode 100644 index a03678f5c..000000000 --- a/build/package_json_loader.js +++ /dev/null @@ -1,11 +0,0 @@ -const commit = require('git-rev-sync').short(); - -module.exports = function(source) { - const pkg = JSON.parse(source); - const version = { - commit, - source: pkg.homepage, - version: process.env.CIRCLE_TAG || `v${pkg.version}` - }; - return `module.exports = '${JSON.stringify(version)}'`; -}; diff --git a/build/readme.md b/build/readme.md new file mode 100644 index 000000000..b8fc18d7a --- /dev/null +++ b/build/readme.md @@ -0,0 +1,14 @@ +# Custom Loaders + +## Android Index Plugin + +Generates the `index.html` page for the native android client + +## Version Plugin + +Creates a `version.json` file that gets exposed by the `/__version__` route from the `package.json` file and current git commit hash. + +# See Also + +- [docs/build.md](../docs/build.md) +- [webpack.config.js](../webpack.config.js) \ No newline at end of file diff --git a/build/version_loader.js b/build/version_loader.js deleted file mode 100644 index 78a2c0191..000000000 --- a/build/version_loader.js +++ /dev/null @@ -1,5 +0,0 @@ -const version = require('../package.json').version; - -module.exports = function(source) { - return source.replace('VERSION', version); -}; diff --git a/build/version_plugin.js b/build/version_plugin.js new file mode 100644 index 000000000..af351a3a0 --- /dev/null +++ b/build/version_plugin.js @@ -0,0 +1,33 @@ +const gitRevSync = require('git-rev-sync'); +const pkg = require('../package.json'); + +let commit = 'unknown'; + +try { + commit = gitRevSync.short(); +} catch (e) { + console.warn('Error fetching current git commit: ' + e); +} + +const version = JSON.stringify({ + commit, + source: pkg.homepage, + version: process.env.CIRCLE_TAG || `v${pkg.version}` +}); + +class VersionPlugin { + apply(compiler) { + compiler.hooks.emit.tap('VersionPlugin', compilation => { + compilation.assets['version.json'] = { + source() { + return version; + }, + size() { + return version.length; + } + }; + }); + } +} + +module.exports = VersionPlugin; diff --git a/circle.yml b/circle.yml deleted file mode 100644 index af5343623..000000000 --- a/circle.yml +++ /dev/null @@ -1,35 +0,0 @@ -machine: - node: - version: 8 - services: - - docker - - redis - environment: - PATH: "/home/ubuntu/send/firefox:$PATH" - -dependencies: - pre: - - npm i -g get-firefox geckodriver nsp - - get-firefox --platform linux --extract --target /home/ubuntu/send - -deployment: - latest: - branch: master - commands: - - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - - docker build -t mozilla/send:latest . - - docker push mozilla/send:latest - tags: - tag: /.*/ - owner: mozilla - commands: - - docker login -e $DOCKER_EMAIL -u $DOCKER_USER -p $DOCKER_PASS - - docker build -t mozilla/send:$CIRCLE_TAG . - - docker push mozilla/send:$CIRCLE_TAG - -test: - override: - - npm run build - - npm run lint - - npm test - - nsp check diff --git a/common/assets.js b/common/assets.js index b1db9acfd..f1a4657ec 100644 --- a/common/assets.js +++ b/common/assets.js @@ -1,6 +1,6 @@ -const genmap = require('../build/generate_asset_map'); +const genmap = require('./generate_asset_map'); const isServer = typeof genmap === 'function'; -const prefix = isServer ? '/' : ''; +let prefix = ''; let manifest = {}; try { //eslint-disable-next-line node/no-missing-require @@ -15,15 +15,38 @@ function getAsset(name) { return prefix + assets[name]; } +function setPrefix(name) { + prefix = name; +} + +function getMatches(match) { + return Object.keys(assets) + .filter(k => match.test(k)) + .map(getAsset); +} + const instance = { + setPrefix: setPrefix, get: getAsset, + match: getMatches, setMiddleware: function(middleware) { + function getManifest() { + return JSON.parse( + middleware.fileSystem.readFileSync( + middleware.getFilenameFromUrl('/manifest.json') + ) + ); + } if (middleware) { instance.get = function getAssetWithMiddleware(name) { - const f = middleware.fileSystem.readFileSync( - middleware.getFilenameFromUrl('/manifest.json') - ); - return prefix + JSON.parse(f)[name]; + const m = getManifest(); + return prefix + m[name]; + }; + instance.match = function matchAssetWithMiddleware(match) { + const m = getManifest(); + return Object.keys(m) + .filter(k => match.test(k)) + .map(k => prefix + m[k]); }; } } diff --git a/build/generate_asset_map.js b/common/generate_asset_map.js similarity index 53% rename from build/generate_asset_map.js rename to common/generate_asset_map.js index d1efebb1d..6289e54cc 100644 --- a/build/generate_asset_map.js +++ b/common/generate_asset_map.js @@ -1,3 +1,14 @@ +/* + This code is included by both the server and frontend via + common/assets.js + + When included from the server the export will be the function. + + When included from the frontend (via webpack) the export will + be an object mapping file names to hashed file names. Example: + "send_logo.svg": "send_logo.5fcfdf0e.svg" +*/ + const fs = require('fs'); const path = require('path'); @@ -8,12 +19,11 @@ function kv(f) { module.exports = function() { const files = fs.readdirSync(path.join(__dirname, '..', 'assets')); const code = `module.exports = { - "package.json": require('../package.json'), ${files.map(kv).join(',\n')} };`; return { code, dependencies: files.map(f => require.resolve('../assets/' + f)), - cacheable: false + cacheable: true }; }; diff --git a/common/locales.js b/common/locales.js deleted file mode 100644 index 17eb9c2a8..000000000 --- a/common/locales.js +++ /dev/null @@ -1,51 +0,0 @@ -const gen = require('../build/generate_l10n_map'); - -const isServer = typeof gen === 'function'; -const prefix = isServer ? '/' : ''; -let manifest = {}; -try { - //eslint-disable-next-line node/no-missing-require - manifest = require('../dist/manifest.json'); -} catch (e) { - // use middleware -} - -const locales = isServer ? manifest : gen; - -function getLocale(name) { - return prefix + locales[`public/locales/${name}/send.ftl`]; -} - -function serverTranslator(name) { - return require(`../dist/${locales[`public/locales/${name}/send.ftl`]}`); -} - -function browserTranslator() { - return locales.translate; -} - -const translator = isServer ? serverTranslator : browserTranslator; - -const instance = { - get: getLocale, - getTranslator: translator, - setMiddleware: function(middleware) { - if (middleware) { - const _eval = require('require-from-string'); - instance.get = function getLocaleWithMiddleware(name) { - const f = middleware.fileSystem.readFileSync( - middleware.getFilenameFromUrl('/manifest.json') - ); - return prefix + JSON.parse(f)[`public/locales/${name}/send.ftl`]; - }; - instance.getTranslator = function(name) { - const f = middleware.fileSystem.readFileSync( - middleware.getFilenameFromUrl(instance.get(name)) - ); - return _eval(f.toString()); - }; - } - } -}; - -module.exports = instance; diff --git a/common/readme.md b/common/readme.md new file mode 100644 index 000000000..0aaad7ac3 --- /dev/null +++ b/common/readme.md @@ -0,0 +1,7 @@ +# Common Code + +This directory contains code loaded by both the frontend `app` and backend `server`. The code here can be challenging to understand at first because the contexts for the two (three counting the dev server) environments that include them are quite different, but the purpose of these modules are quite simple, to provide mappings from the source assets (`copy-16.png`) to the concrete production assets (`copy-16.db66e0bf.svg`). + +## Generate Asset Map + +This loader enumerates all the files in `assets/` so that `common/assets.js` can provide mappings from the source filename to the hashed filename used on the site. \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f72bf1614..8ad9fc6fc 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,3 +10,10 @@ services: - REDIS_HOST=redis redis: image: redis:alpine + selenium-firefox: + image: b4handjr/selenium-firefox + ports: + - "${VNC_PORT:-5900}:5900" + shm_size: 2g + volumes: + - .:/code diff --git a/docs/acceptance-mobile.md b/docs/acceptance-mobile.md new file mode 100644 index 000000000..9480d1c25 --- /dev/null +++ b/docs/acceptance-mobile.md @@ -0,0 +1,78 @@ +# Send V2 UX Mobile Acceptance and Spec Annotations + +`Date Created: 8/20/2018` + +## Acceptance Criteria + +Adapted from [this spreadsheet](https://airtable.com/shrkcBPOLkvNFOrpp) + +- [ ] It should look and feel of an Android App +- [ ] It should look and feel like the Firefox Send Web Client + +### Main Screen +- [ ] It should clearly Indicate the name of the product +- [ ] If user has no existing Sends, it should make clear the primary benefits of the service (private, e2e encrypted, self-destructing file sharing) +- [ ] It should allow users to access the file picker to create Send links +- [ ] If the user has existing Sends, it should display a card-based list view of each [see Cards section below] + +### Non-Authenticated Users +- [ ] It should make clear the benefits of a Firefox Account +- [ ] It should allow users to log into or create a Firefox account +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit the sendable file size to 1GB +- [ ] It should allow users to set an expiration time of 5 minutes, 1 hour, or 24 hours +- [ ] It should allow users to set a download count of 1 downloads + +### Authenticated Users +- [ ] It should indicate that the user is signed in via Firefox Account +- [ ] It should allow the user to sign out +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit users to sending 2.5GB per Send +- [ ] It should allow users to extend Send times up to 1 Week +- [ ] It should allow users to extend Send download counts up to 100 times + +### Cards +- [ ] It should display the name of the sent file/files +- [ ] It should display the time remaining before expiration +- [ ] It should display the number of downloads remaining before expiration +- [ ] It should have a button that lets the user copy the send link to their clipboard +- [ ] It should show a preview icon (not a thumbnail) that has some relationship to the file types or content being sent* (see 5.1 in spec) +- [ ] It should have an overflow (meatball) menu that when triggered, gives the user share or delete buttons +- [ ] While encrypting / pushing to server, it should display a progress meter and a cancel button +- [ ] For authenticated users, it should be expandable to display all files in a send (5.1.1) +- [ ] If user cancels Send, or Upload fails, it should display a warning in the card +- [ ] It should display expired Sends below current sends with their UI greyed out and an expiration warning for 24 hours after expiration +- [ ] It should remove expired cards from display after 24 hours +- [ ] It should let users permanently delete records expired sends +- [ ] It should display a visual indicator when a Send is password protected +- [ ] It should allow the user to share via a native Android share sheet +- [ ] It should allow me to create Send links through intents from other apps + +### General/other +- [ ] It should allow users to set passwords to protect their Sends +- [ ] It should warn users when they are trying to upload files larger than their share limit + +### Stretch +- [ ] It should allow users to use the photo gallery to create Send links +- [ ] It should allow users to use their camera to create Send links +- [ ] It should allow users to opt into notification when a share link expires +- [ ] It should allow users to opt into notifications when their link is downloaded + +## Annotations on Mobile Spec +This document tracks differences between the UX spec for Firefox Send and the intended MVP. + +[Spec Link](https://mozilla.invisionapp.com/share/GNN6KKOQ5XS) + +* 1.1: Spec describes toolbar which may not be possible given the application framework we're using. In particular, issues with the spec include the color, logo and different font weights may be an issue. +* 1.2: Spec's treatment of FxA UI may be difficult to match. We should use the default OAuth implementation and re-evaluate UX once we see an implementation demo. Also, the landing page UI should display a log-in CTA directly and not require users click into the hamburger menu. +* 2.1: MVP will only include file picker. Signed in users will be able to select multiple files. File selection flow will be Android-native. Probably don't have the ability to add notifications as in the last screen on this page. +* 2.1: @fzzzy will provide screenshots of this flow for UX evaluation and comment. +* 3.1.4: The spec shows deleting the last item in an unshared set returning the user to the picker menu. Instead, it should return to the app home page. +* 3.1.5: Same as 3.1.5 notes. Both cases should show the warning dialog. +* 4.1: We may not be able to do a thumbnail here. Instead we should specify a set of icons to be displayed. +* 6.3: We're not going to allow cards to be edited. This page is deprecated. +* 6.4: Swiping cards to delete is stretched. +* 6.5: We're not 100% sure what happens on network connectivity errors, we should test this and adapt UX as necessary. +* 7.1: The last screen on this page depicts a network error notification on the selection screen. Instead the user should hit the send button, be taken back to the cards and display the card as in 5.1.2 +* 7.3: May not be necessary...we can ask for permissions on install. +* 8.1: Notifications do not block launch diff --git a/docs/acceptance-web.md b/docs/acceptance-web.md new file mode 100644 index 000000000..859ef2fdb --- /dev/null +++ b/docs/acceptance-web.md @@ -0,0 +1,73 @@ +# Send V2 UX Web Acceptance Criteria + +## General + +- [ ] It should match the spec provided. +- [ ] It should have a feedback button +- [ ] It should provide links to relevant legal documentation + +### Non-Authenticated Users + +- [ ] It should make clear the benefits of a Firefox Account +- [ ] It should allow users to log into or create a Firefox account +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit the sendable file size to 1GB +- [ ] It should allow users to set an expiration time of 5 minutes, 1 hour, or 24 hours +- [ ] It should allow users to set an download count of 1 downloads + +### Authenticated Users + +- [ ] It should indicate that the user is signed in via Firefox Account +- [ ] It should allow the user to sign out +- [ ] It should allow users to select and send multiple files in one URL +- [ ] It should limit users to sending 2.5GB per Send +- [ ] It should allow users to extend Send times up to 1 Week +- [ ] It should allow users to extend Send download counts up to 100 times + +### Main Screen + +- [ ] It should clearly indicate the name of the product +- [ ] If user has no existing Sends, it should make clear the primary benefits of the service (private, e2e encrypted, self-destructing file sharing) +- [ ] It should allow users to access the file picker to create Send links +- [ ] It should allow users to drag and drop files +- [ ] It should provide affordances to sign in to Send +- [ ] If the user has existing Sends, it should display a card-based list view of each + +### Upload UI + +- [ ] It should allow users to continue to add files to their upload up to a set limit +- [ ] It should allow users to set a password +- [ ] It should let users delete items from their upload bundle + +### Uploading UI + +- [ ] It should display an affordance to demonstrate the status of an upload + +### Share UI + +- [ ] It should provide a copiable URL to the bundle + +### Download UI + +- [ ] It should prompt the user for a password if one is required +- [ ] It should provide feedback for incorrect passwords +- [ ] It should provide a description of Send to make clear what this service is +- [ ] It should let the user see the files they are downloading +- [ ] It should let the user download their files + +### Download Complete UI + +- [ ] It should indicate that a download is complete +- [ ] It should provide a description of the Send service +- [ ] It should provide a link back to the upload UI + +### Expiry UI + +- [ ] It should provide a generic message indicating a share has expired +- [ ] It should allow the user to navigate back to the upload page + +### In Memory DL Page + +- [ ] It should show in case a user tries to download a large file on a suboptimal client +- [ ] It should suggest the user use Firefox +- [ ] It should let the user copy the download url \ No newline at end of file diff --git a/docs/build.md b/docs/build.md new file mode 100644 index 000000000..f440f4109 --- /dev/null +++ b/docs/build.md @@ -0,0 +1,22 @@ +Send has two build configurations, development and production. Both can be run via `npm` scripts, `npm start` for development and `npm run build` for production. Webpack is our only build tool and all configuration lives in [webpack.config.js](../webpack.config.js). + +# Development + +`npm start` launches a `webpack-dev-server` on port 8080 that compiles the assets and watches files for changes. It also serves the backend API and frontend unit tests via the `server/bin/dev.js` entrypoint. The frontend tests can be run in the browser by navigating to http://localhost:8080/test and will rerun automatically as the watched files are saved with changes. + +# Production + +`npm run build` compiles the assets and writes the files to the `dist/` directory. `npm run prod` launches an Express server on port 1443 that serves the backend API and frontend static assets from `dist/` via the `server/bin/prod.js` entrypoint. + +# Notable differences + +- Development compiles assets in memory, so no `dist/` directory is generated +- Development does not enable CSP headers +- Development frontend source is instrumented for code coverage +- Only development includes sourcemaps +- Only development exposes the `/test` route +- Production sets Cache-Control immutable headers on the hashed static assets + +# Custom Loaders + +The `build/` directory contains custom webpack loaders specific to Send. See [build/readme.md](../build/readme.md) for details on each loader. \ No newline at end of file diff --git a/docs/deployment.md b/docs/deployment.md new file mode 100644 index 000000000..3a8bd8b0c --- /dev/null +++ b/docs/deployment.md @@ -0,0 +1,68 @@ +## Requirements +This document describes how to do a full deployment of Firefox Send on your own Linux server. You will need: + +* A working (and ideally somewhat recent) installation of NodeJS and NPM +* GIT +* An Apache webserver +* Optionally telnet, to be able to quickly check your installation + +For Debian/Ubuntu systems this probably just means something like this: + +* apt install git apache2 nodejs npm telnet + +## Building +* We assume an already configured virtual-host on your webserver with an existing empty htdocs folder +* First, remove that htdocs folder - we will replace it with Firefox Send's version now +* git clone https://github.com/mozilla/send.git htdocs +* Make now sure you are NOT root but rather the user your webserver is serving files under (e.g. "su www-data" or whoever the owner of your htdocs folder is) +* npm install +* npm run build + +## Running +To have a permanently running version of Firefox Send as a background process: + +* Create a file "run.sh" with: +``` +#!/bin/bash +nohup su www-data -c "npm run prod" 2>/dev/null & +``` +* chmod +x run.sh +* ./run.sh + +Now the Firefox Send backend should be running on port 1443. You can check with: +* telnet localhost 1443 + +## Reverse Proxy +Of course, we don't want to expose the service on port 1443. Instead we want our normal webserver to forward all requests to Firefox send ("Reverse proxy"). + +# Apache webserver + +* a2enmod proxy +* a2enmod proxy_http +* a2enmod proxy_wstunnel + +In your Apache virtual host configuration file, insert this: + +``` + # Enable rewrite engine + RewriteEngine on + + # Make sure the original domain name is forwarded to Send + # Otherwise the generated URLs will be wrong + ProxyPreserveHost on + + # Make sure the generated URL is https:// + RequestHeader set X-Forwarded-Proto https + + # If it's a normal file (e.g. PNG, CSS) just return it + RewriteCond %{REQUEST_FILENAME} -f + RewriteRule .* - [L] + + # If it's a websocket connection, redirect it to a Send WS connection + RewriteCond %{HTTP:Upgrade} =websocket [NC] + RewriteRule /(.*) ws://127.0.0.1:1443/$1 [P,L] + + # Otherwise redirect it to a normal HTTP connection + RewriteRule ^/(.*)$ http://127.0.0.1:1443/$1 [P,QSA] + ProxyPassReverse "/" "http://127.0.0.1:1443" +``` diff --git a/docs/docker.md b/docs/docker.md index 9003412be..baf99eb87 100644 --- a/docs/docker.md +++ b/docs/docker.md @@ -1,13 +1,6 @@ ## Setup -Before building the Docker image, you must build the production assets: - -```sh -npm run build -``` - -Then you can run either `docker build` or `docker-compose up`. - +Run `docker build -t send:latest .` to create an image or `docker-compose up` to run a full testable stack. *We don't recommend using docker-compose for production.* ## Environment variables: @@ -16,11 +9,11 @@ Then you can run either `docker build` or `docker-compose up`. | `PORT` | Port the server will listen on (defaults to 1443). | `S3_BUCKET` | The S3 bucket name. | `REDIS_HOST` | Host name of the Redis server. -| `GOOGLE_ANALYTICS_ID` | Google Analytics ID | `SENTRY_CLIENT` | Sentry Client ID | `SENTRY_DSN` | Sentry DSN | `MAX_FILE_SIZE` | in bytes (defaults to 2147483648) | `NODE_ENV` | "production" +| `BASE_URL` | The HTTPS URL where traffic will be served (e.g. `https://send.firefox.com`) ## Example: @@ -28,8 +21,8 @@ Then you can run either `docker build` or `docker-compose up`. $ docker run --net=host -e 'NODE_ENV=production' \ -e 'S3_BUCKET=testpilot-p2p-dev' \ -e 'REDIS_HOST=dyf9s2r4vo3.bolxr4.0001.usw2.cache.amazonaws.com' \ - -e 'GOOGLE_ANALYTICS_ID=UA-35433268-78' \ -e 'SENTRY_CLIENT=https://51e23d7263e348a7a3b90a5357c61cb2@sentry.prod.mozaws.net/168' \ -e 'SENTRY_DSN=https://51e23d7263e348a7a3b90a5357c61cb2:65e23d7263e348a7a3b90a5357c61c44@sentry.prod.mozaws.net/168' \ + -e 'BASE_URL=https://send.firefox.com' \ mozilla/send:latest ``` diff --git a/docs/encryption.md b/docs/encryption.md new file mode 100644 index 000000000..17dcc2f83 --- /dev/null +++ b/docs/encryption.md @@ -0,0 +1,46 @@ +# File Encryption + +Send use 128-bit AES-GCM encryption via the [Web Crypto API](https://developer.mozilla.org/en-US/docs/Web/API/Web_Crypto_API) to encrypt files in the browser before uploading them to the server. The code is in [app/keychain.js](../app/keychain.js). + +## Steps + +### Uploading + +1. A new secret key is generated with `crypto.getRandomValues` +2. The secret key is used to derive more keys via HKDF SHA-256 + - a series of encryption keys for the file, via [ECE](https://tools.ietf.org/html/rfc8188) (AES-GCM) + - an encryption key for the file metadata (AES-GCM) + - a signing key for request authentication (HMAC SHA-256) +3. The file and metadata are encrypted with their corresponding keys +4. The encrypted data and signing key are uploaded to the server +5. An owner token and the share url are returned by the server and stored in local storage +6. The secret key is appended to the share url as a [#fragment](https://en.wikipedia.org/wiki/Fragment_identifier) and presented to the UI + +### Downloading + +1. The browser loads the share url page, which includes an authentication nonce +2. The browser imports the secret key from the url fragment +3. The same 3 keys as above are derived +4. The browser signs the nonce with its signing key and requests the metadata +5. The encrypted metadata is decrypted and presented on the page +6. The browser makes another authenticated request to download the encrypted file +7. The browser downloads and decrypts the file +8. The file prompts the save dialog or automatically saves depending on the browser settings + +### Passwords + +A password may optionally be set to authenticate the download request. When a password is set the following steps occur. + +#### Sender + +1. The original signing key derived from the secret key is discarded +2. A new signing key is generated via PBKDF2 from the user entered password and the full share url (including secret key fragment) +3. The new key is sent to the server, authenticated by the owner token +4. The server stores the new key and marks the record as needing a password + +#### Downloader + +1. The browser loads the share url page, which includes an authentication nonce and indicator that the file requires a password +2. The user is prompted for the password and the signing key is derived +3. The browser requests the metadata using the key to sign the nonce +4. If the password was correct the metadata is returned, otherwise a 401 diff --git a/docs/experiments.md b/docs/experiments.md new file mode 100644 index 000000000..f627204bf --- /dev/null +++ b/docs/experiments.md @@ -0,0 +1,84 @@ +# A/B experiment testing + +We're using Google Analytics Experiments for A/B testing. + +## Creating an experiment + +Navigate to the Behavior > Experiments section of Google Analytics and click the "Create experiment" button. + +The "Objective for this experiment" is the most complicated part. See the "Promo click (Goal ID 4 / Goal Set 1)" for an example. + +In step 2 add as many variants as you plan to test. The urls are not important since we aren't using their js library to choose the variants. The name will show up in the report so choose good ones. "Original page" becomes variant 0 and each variant increments by one. We'll use the numbers in our `app/experiments.js` code. + +Step 3 contains some script that we'll ignore. The important thing here is the **Experiment ID**. This is the value we need to name our experiment in `app/experiments.js`. Save the changes so far and wait until the code containing the experiment has been deployed to production **before** starting the experiment. + +## Experiment code + +Code for experiments live in [app/experiments.js](../app/experiments.js). There's an `experiments` object that contains the logic for deciding whether an experiment should run, which variant to use, and what to do. Each object needs to have these functions: + +### `eligible` function + +This function returns a boolean of whether this experiment should be active for this session. Any data available to the page can be used determine the result. + +### `variant` function + +This function returns which experimental group this session is placed in. The variant values need to match the values set up in Google Analytics, usually 0 thru N-1. This value is usually picked at random based on what percentage of each variant is desired. + +### `run` function + +This function gets the `variant` value chosen by the variant function and the `state` and `emitter` objects from the app. This function can do anything needed to change the app based on the experiment. A common pattern is to set or change a value on `state` that will be picked up by other parts of the app, like ui templates, to change how it looks or behaves. + +### Example + +Here's a full example of the experiment object: + +```js +const experiments = { + S9wqVl2SQ4ab2yZtqDI3Dw: { // The Experiment ID from Google Analytics + id: 'S9wqVl2SQ4ab2yZtqDI3Dw', + run: function(variant, state, emitter) { + switch (variant) { + case 1: + state.promo = 'blue'; + break; + case 2: + state.promo = 'pink'; + break; + default: + state.promo = 'grey'; + } + emitter.emit('render'); + }, + eligible: function() { + return ( + !/firefox|fxios/i.test(navigator.userAgent) && + document.querySelector('html').lang === 'en-US' + ); + }, + variant: function(state) { + const n = this.luckyNumber(state); + if (n < 0.33) { + return 0; + } + return n < 0.66 ? 1 : 2; + }, + luckyNumber: function(state) { + return luckyNumber( + `${this.id}:${state.storage.get('testpilot_ga__cid')}` + ); + } + } +}; +``` + +## Reporting results + +All metrics pings will include the variant and experiment id, but it's usually important to trigger a specific event to be counted as the experiment goal (the "Objective for this experiment" part from setup). Use an 'experiment' event to do this. For example: + +```js +emit('experiment', { cd3: 'promo' }); +``` + +where `emit` is the app emitter function passed to the [route handler](https://github.com/choojs/choo#approuteroutename-handlerstate-emit) + +The second argument can be an object with any additional parameters. It usually includes a custom dimension that we chose to filter on while creating the experiment in Google Analytics. \ No newline at end of file diff --git a/docs/faq.md b/docs/faq.md index 7809e48f4..c5f51e42e 100644 --- a/docs/faq.md +++ b/docs/faq.md @@ -1,6 +1,6 @@ ## How big of a file can I transfer with Firefox Send? -There is a 2GB file size limit built in to Send, however, in practice you may +There is a 2.5GB file size limit built in to Send(1GB for non-signed in users), however, in practice you may be unable to send files that large. Send encrypts and decrypts the files in the browser which is great for security but will tax your system resources. In particular you can expect to see your memory usage go up by at least the size @@ -31,12 +31,11 @@ Since Send is an open source project, you can see all of the cool ways we use Ja ## How long are files available for? Files are available to be downloaded for 24 hours, after which they are removed -from the server. They are also removed immediately after a download completes. +from the server. They are also removed immediately once the download limit is reached. ## Can a file be downloaded more than once? -Not currently, but we're considering multiple download support in a future -release. +Yes, once a file is submitted to Send you can select the download limit. *Disclaimer: Send is an experiment and under active development. The answers diff --git a/docs/localization.md b/docs/localization.md new file mode 100644 index 000000000..779210aed --- /dev/null +++ b/docs/localization.md @@ -0,0 +1,29 @@ +# Localization + +Send is localized in over 50 languages. We use the [fluent](http://projectfluent.org/) library and store our translations in [FTL](http://projectfluent.org/fluent/guide/) files in `public/locales/`. `en-US` is our base language, and other languages are managed by [pontoon](https://pontoon.mozilla.org/projects/test-pilot-firefox-send/). + +## Process + +Strings are added or removed from [public/locales/en-US/send.ftl] as needed. Strings **MUST NOT** be *changed* after they've been commited and pushed to master. Changing a string requires creating a new ID with a new name (preferably descriptive instead of incremented) and deletion of the obsolete ID. It's often useful to add a comment above the string with info about how and where the string is used. + +Once new strings are commited to master they are available for translators in Pontoon. All languages other than `en-US` should be edited via Pontoon. Translations get automatically commited to the github master branch. + +### Activation + +The development environment includes all locales in `public/locales` via the `L10N_DEV` environment variable. Production uses `package.json` as the list of locales to use. Once a locale has enough string coverage it should be added to `package.json`. + +## Code + +In `app/` we use the `state.translate()` function to translate strings to the best matching language base on the user's `Accept-Language` header. It's a wrapper around fluent's [FluentBundle.format](http://projectfluent.org/fluent.js/fluent/FluentBundle.html). It works the same for both server and client side rendering. + +### Examples + +```js +// simple string +const finishedString = state.translate('downloadFinish') +// with parameters +const progressString = state.translate('downloadingPageProgress', { + filename: state.fileInfo.name, + size: bytes(state.fileInfo.size) +}) +``` diff --git a/docs/metrics.md b/docs/metrics.md index abff91894..432e00f4a 100644 --- a/docs/metrics.md +++ b/docs/metrics.md @@ -1,156 +1,128 @@ -# Send Metrics -The metrics collection and analysis plan for Send, a forthcoming Test Pilot experiment. - -## Analysis -Data collected by Send will be used to answer the following high-level questions: - -- Do users send files? - - How often? How many? - - What is the retention? - - What is the distribution of senders? -- How do recipients interact with promotional UI elements? - - Are file recipients converted to file senders? - - Are non-Firefox users converted to Firefox users? -- Where does it go wrong? - - How often are there errors in uploading or downloading files? - - What types of errors to users commonly see? - - At what point do errors affect retention? - -## Collection -Data will be collected with Google Analytics and follow [Test Pilot standards](https://github.com/mozilla/testpilot/blob/master/docs/experiments/ga.md) for reporting. - -### Custom Metrics -- `cm1` - the size of the file, in bytes. -- `cm2` - the amount of time it took to complete the file transfer, in milliseconds. Only include if the file completed transferring (ref: `cd2`). -- `cm3` - the rate of the file transfer, in bytes per second. This is computed by dividing `cm1` by `cm2`, not by monitoring transfer speeds. Only include if the file completed transferring (ref: `cd2`). -- `cm4` - the amount of time until the file will expire, in milliseconds. -- `cm5` - the number of files the user has ever uploaded. -- `cm6` - the number of unexpired files the user has uploaded. -- `cm7` - the number of files the user has ever downloaded. -- `cm8` - the number of downloads permitted by the uploader. - -### Custom Dimensions -- `cd1` - the method by which the user initiated an upload. One of `drag`, `click`. -- `cd2` - the reason that the file transfer stopped. One of `completed`, `errored`, `cancelled`. -- `cd3` - the destination of a link click. One of `experiment-page`, `download-firefox`, `twitter`, `github`, `cookies`, `terms`, `privacy`, `about`, `legal`, `mozilla`. -- `cd4` - the location from which the user copied the URL to an upload file. One of `success-screen`, `upload-list`. -- `cd5` - the referring location. One of `completed-download`, `errored-download`, `cancelled-download`, `completed-upload`, `errored-upload`, `cancelled-upload`, `testpilot`, `external`. -- `cd6` - identifying information about an error. Exclude if there is no error involved. **TODO:** enumerate a list of possibilities. - -### Events - -_NB:_ due to how files are being tracked, there are no events indicating file expiry. This carries some risk: most notably, we can only derive expiration rates by looking at download rates, which is prone to skew if there are problems in data collection. - -#### `upload-started` -Triggered whenever a user begins uploading a file. Includes: - -- `ec` - `sender` -- `ea` - `upload-started` -- `cm1` -- `cm5` -- `cm6` -- `cm7` -- `cd1` -- `cd5` - -#### `upload-stopped` -Triggered whenever a user stops uploading a file. Includes: - -- `ec` - `sender` -- `ea` - `upload-stopped` -- `cm1` -- `cm2` -- `cm3` -- `cm5` -- `cm6` -- `cm7` -- `cd1` -- `cd2` -- `cd6` - -#### `download-limit-changed` -Triggered whenever the sender changes the download limit. Includes: - -- `ec` - `sender` -- `ea` - `download-limit-changed` -- `cm1` -- `cm5` -- `cm6` -- `cm7` -- `cm8` - -#### `password-added` -Triggered whenever a password is added to a file. Includes: - -- `cm1` -- `cm5` -- `cm6` -- `cm7` - -#### `download-started` -Triggered whenever a user begins downloading a file. Includes: - -- `ec` - `recipient` -- `ea` - `download-started` -- `cm1` -- `cm4` -- `cm5` -- `cm6` -- `cm7` - -#### `download-stopped` -Triggered whenever a user stops downloading a file. - -- `ec` - `recipient` -- `ea` - `download-stopped` -- `cm1` -- `cm2` (if possible and applicable) -- `cm3` (if possible and applicable) -- `cm5` -- `cm6` -- `cm7` -- `cd2` -- `cd6` - -#### `exited` -Fired whenever a user follows a link external to Send. - -- `ec` - `recipient`, `sender`, or `other`, as applicable. -- `ea` - `exited` -- `cd3` - -#### `upload-deleted` -Fired whenever a user deletes a file they’ve uploaded. - -- `ec` - `sender` -- `ea` - `upload-deleted` -- `cm1` -- `cm2` -- `cm3` -- `cm4` -- `cm5` -- `cm6` -- `cm7` -- `cd1` -- `cd4` - -#### `copied` -Fired whenever a user copies the URL of an upload file. - -- `ec` - `sender` -- `ea` - `copied` -- `cd4` - -#### `restarted` -Fired whenever the user interrupts any part of funnel to return to the start of it (e.g. with a “send another file” or “send your own files” link). - -- `ec` - `recipient`, `sender`, or `other`, as applicable. -- `ea` - `restarted` -- `cd2` - -#### `unsupported` -Fired whenever a user is presented a message saying that their browser is unsupported due to missing crypto APIs. - -- `ec` - `recipient` or `sender`, as applicable. -- `ea` - `unsupported` -- `cd6` +# Send V2 Metrics Definitions + +## Key Value Prop + +Quickly and privately transfer large files from any device to any device. + +## Key Business Question to Answer + +Is the value proposition of a large encrypted file transfer service enough to drive Firefox Account relationships for non-Firefox users. + +## Hypotheses to Test + +### Primary - In support of Relationships KPI + +We believe that a privacy-respecting file transfer service can drive Firefox Accounts beyond the Firefox Browser. + +We will know this to be true when we see 250k Firefox Account creations from non-Firefox contexts w/in six months of launch. + +### Secondary - In support of Revenue KPI + +We believe that a privacy respecting service accessible beyond the reach of Firefox will provide a valuable platform to research, communicate with, and market to conscious choosers we have traditionally found hard to reach. + +We will know this to be true when we can conduct six research tasks (surveys, A/B tests, fake doors, etc) in support of premium services KPIs in the first six months after launch. + +## Overview of Key Measures + +* Number of people using the service to send and receive files + * Why: measure of service size. Important for understanding addressable market size +* Percent of users who have or create an FxAccount via Send + * Why: representation of % of any service users who might be amenable to an upsell +* % of downloaders who convert into uploaders + * Why: represents a measure of our key growth-loop potential +* Count of uploads and size + * Why: Represents cost of service on a running basis + +## Key Funnels +* App Open or Visit `--- DESIRED OUTCOME --->` Successful Upload +* Download UI Visit `--- DESIRED OUTCOME --->` Successful Download +* FxA UI Engagement `--- DESIRED OUTCOME --->` Authenticate +* **STRETCH** App Open or Visit `--- DESIRED OUTCOME --->` Successful Download + +## Amplitude Schema + +Please see, **See Amplitude HTTP API**(https://amplitude.zendesk.com/hc/en-us/articles/204771828) for HTTP API reference. + +## Metric Events + +In support of our KPIs we collect events from two separate contexts, server and client. The events are designed to have minimal correlation between contexts. + +Server events collect lifecycle information about individual uploads but no user information; also time precision is truncated to hour increments. Client events collect information about how users interact with the UI but no upload identifiers. + +### Server Events + +Server events allow us to aggregate data about file lifecycle without collecting data about individual users. In this context `user_id` and `user_properties` describe the uploaded archive. + +* `session_id` -1 (not part of a session) +* `user_id` hash of (archive_id + owner_id) +* `app_version` package.json version +* `time` timestamp truncated to hour precision +* `country` +* `region` +* `event_type` [server_upload | server_download | server_delete] +* `user_properties` + * `download_limit` set number of downloads + * `time_limit` set expiry duration + * `size` approximate size (log10) + * `anonymous` true if anonymous, false if fxa +* `event_properties` + * `download_count` downloads completed + * `ttl` time remaining before expiry truncated to hour + * `agent` the browser name or first 6 characters of the user agent that made the request + +### Client Events + +Client events allow us to aggregate data about how the user interface is being used without tracking the lifecycle of individual files. In this context `user_id` and `user_properties` describe the user. The `user_id` and `device_id` change for all users at the beginning of each month. + +* `session_id` timestamp +* `user_id` hash of (fxa_id + Date.year + Date.month) +* `device_id` hash of (localStorage random id + Date.year + Date.month) +* `platform` [web | android] +* `country` +* `region` +* `language` +* `time` timestamp +* `os_name` +* `event_type` [client_visit | client_upload | client_download | client_delete | client_login | client_logout] +* `event_properties` + * `browser` + * `browser_version` + * `status` [ ok | error | cancel ] + * Event specific properties (see below) +* `user_properties` + * `active_count` number of active uploads + * `anonymous` true if anonymous, false if fxa + * `experiments` list of experiment ids the user is participating in + * `first_action` how this use came to Send the first time [ upload | download ] + +#### Visit Event + + * `entrypoint` [ upload | download ] + +#### Upload Event + + * `download_limit` download limit + * `file_count` number of files + * `password_protected` boolean + * `size` approximate size (log10) + * `time_limit` time limit + * `duration` approximate transfer duration (log10) + +#### Download Event + + * `password_protected` boolean + * `size` approximate size (log10) + * `duration` approximate transfer duration (log10) + +#### Delete Event + + * `age` hours since uploaded + * `downloaded` downloaded at least once + +#### Login Event + + * `trigger` [button | time | count | size] + +#### Logout Event + + * `trigger` [button | timeout] diff --git a/docs/notes/streams.md b/docs/notes/streams.md new file mode 100644 index 000000000..ec0c0b890 --- /dev/null +++ b/docs/notes/streams.md @@ -0,0 +1,34 @@ +# Web Streams + +- API + - https://developer.mozilla.org/en-US/docs/Web/API/Streams_API +- Reference Implementation + - https://github.com/whatwg/streams/tree/master/reference-implementation +- Examples + - https://github.com/mdn/dom-examples/tree/master/streams +- Polyfill + - https://github.com/MattiasBuelens/web-streams-polyfill + +# Encrypted Content Encoding + +- Spec + - https://trac.tools.ietf.org/html/rfc8188 +- node.js implementation + - https://github.com/web-push-libs/encrypted-content-encoding/tree/master/nodejs + +# Other APIs + +- Blobs + - https://developer.mozilla.org/en-US/docs/Web/API/Blob +- ArrayBuffers, etc + - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer + - https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Uint8Array +- FileReader + - https://developer.mozilla.org/en-US/docs/Web/API/FileReader + +# Other + +- node.js Buffer browser library + - https://github.com/feross/buffer +- StreamSaver + - https://github.com/jimmywarting/StreamSaver.js diff --git a/ios/generate-bundle.js b/ios/generate-bundle.js new file mode 100644 index 000000000..70f60c3d1 --- /dev/null +++ b/ios/generate-bundle.js @@ -0,0 +1,21 @@ +const child_process = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +child_process.execSync('npm run build'); + +const prefix = path.join('..', 'dist'); +const json_string = fs.readFileSync(path.join(prefix, 'manifest.json')); +const manifest = JSON.parse(json_string); + +const ios_filename = manifest['ios.js']; +fs.writeFileSync( + 'send-ios/assets/ios.js', + fs.readFileSync(`${prefix}${ios_filename}`) +); + +const vendor_filename = manifest['vendor.js']; +fs.writeFileSync( + 'send-ios/assets/vendor.js', + fs.readFileSync(`${prefix}${vendor_filename}`) +); diff --git a/ios/ios.js b/ios/ios.js new file mode 100644 index 000000000..23b7c4a34 --- /dev/null +++ b/ios/ios.js @@ -0,0 +1,158 @@ +/* global window, document, fetch */ + +const MAXFILESIZE = 1024 * 1024 * 1024 * 2; + +const EventEmitter = require('events'); +const emitter = new EventEmitter(); + +function dom(tagName, attributes, children = []) { + const node = document.createElement(tagName); + for (const name in attributes) { + if (name.indexOf('on') === 0) { + node[name] = attributes[name]; + } else if (name === 'htmlFor') { + node.htmlFor = attributes.htmlFor; + } else if (name === 'className') { + node.className = attributes.className; + } else { + node.setAttribute(name, attributes[name]); + } + } + if (!(children instanceof Array)) { + children = [children]; + } + for (let child of children) { + if (typeof child === 'string') { + child = document.createTextNode(child); + } + node.appendChild(child); + } + return node; +} + +function uploadComplete(file) { + document.body.innerHTML = ''; + const input = dom('input', { id: 'url', value: file.url }); + const copy = dom( + 'button', + { + id: 'copy-button', + className: 'button', + onclick: () => { + window.webkit.messageHandlers['copy'].postMessage(input.value); + copy.textContent = 'Copied!'; + setTimeout(function() { + copy.textContent = 'Copy to clipboard'; + }, 2000); + } + }, + 'Copy to clipboard' + ); + const node = dom( + 'div', + { id: 'striped' }, + dom('div', { id: 'white' }, [ + input, + copy, + dom( + 'button', + { id: 'send-another', className: 'button', onclick: render }, + 'Send another file' + ) + ]) + ); + document.body.appendChild(node); +} + +const state = { + storage: { + files: [], + remove: function(fileId) { + console.log('REMOVE FILEID', fileId); + }, + writeFile: function(file) { + console.log('WRITEFILE', file); + }, + addFile: uploadComplete, + totalUploads: 0 + }, + transfer: null, + uploading: false, + settingPassword: false, + passwordSetError: null, + route: '/' +}; + +function upload(event) { + console.log('UPLOAD'); + event.preventDefault(); + const target = event.target; + const file = target.files[0]; + if (file.size === 0) { + return; + } + if (file.size > MAXFILESIZE) { + console.log('file too big (no bigger than ' + MAXFILESIZE + ')'); + return; + } + + emitter.emit('upload', { file: file, type: 'click' }); +} + +function render() { + document.body.innerHTML = ''; + const striped = dom( + 'div', + { id: 'striped' }, + dom('div', { id: 'white' }, [ + dom('label', { id: 'label', htmlFor: 'input' }, 'Choose file'), + dom('input', { + id: 'input', + type: 'file', + name: 'input', + onchange: upload + }) + ]) + ); + document.body.appendChild(striped); +} + +emitter.on('render', function() { + document.body.innerHTML = ''; + const percent = + (state.transfer.progress[0] / state.transfer.progress[1]) * 100; + const node = dom( + 'div', + { style: 'background-color: white; width: 100%' }, + dom('span', { + style: `display: inline-block; width: ${percent}%; background-color: blue` + }) + ); + document.body.appendChild(node); +}); + +emitter.on('pushState', function(path) { + console.log('pushState ' + path + ' ' + JSON.stringify(state)); +}); + +const controller = require('../app/controller').default; +try { + controller(state, emitter); +} catch (e) { + console.error('error' + e); + console.error(e); +} + +function sendBase64EncodedFromSwift(encoded) { + fetch(encoded) + .then(res => res.blob()) + .then(blob => { + emitter.emit('upload', { file: blob, type: 'share' }); + }); +} + +window.sendBase64EncodedFromSwift = sendBase64EncodedFromSwift; + +render(); + +window.webkit.messageHandlers['loaded'].postMessage(''); diff --git a/ios/send-ios-action-extension/ActionViewController.swift b/ios/send-ios-action-extension/ActionViewController.swift new file mode 100644 index 000000000..9b202adb2 --- /dev/null +++ b/ios/send-ios-action-extension/ActionViewController.swift @@ -0,0 +1,77 @@ +// +// ActionViewController.swift +// send-ios-action-extension +// +// Created by Donovan Preston on 7/26/18. +// + +import UIKit +import WebKit +import MobileCoreServices + +var typesToLoad = [("com.adobe.pdf", "application/pdf"), ("public.png", "image/png"), + ("public.jpeg", "image/jpeg"), ("public.jpeg-2000", "image/jp2"), + ("com.compuserve.gif", "image/gif"), ("com.microsoft.bmp", "image/bmp"), + ("public.plain-text", "text/plain")] + +class ActionViewController: UIViewController, WKScriptMessageHandler { + + @IBOutlet var webView: WKWebView! + var typeToSend: String? + var dataToSend: Data? + + override func viewDidLoad() { + super.viewDidLoad() + self.webView.frame = self.view.bounds + self.webView?.configuration.userContentController.add(self, name: "loaded") + self.webView?.configuration.userContentController.add(self, name: "copy") + + if let url = Bundle.main.url( + forResource: "index", + withExtension: "html", + subdirectory: "assets") { + self.webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) + } + // Get the item[s] we're handling from the extension context. + + for item in self.extensionContext!.inputItems as! [NSExtensionItem] { + for provider in item.attachments! as! [NSItemProvider] { + for (type, mimeType) in typesToLoad { + if provider.hasItemConformingToTypeIdentifier(type) { + provider.loadDataRepresentation(forTypeIdentifier: type, completionHandler: { (data, error) in + OperationQueue.main.addOperation { + self.typeToSend = mimeType + self.dataToSend = data + } + }) + return + } + } + } + } + } + + public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + print("Message received: \(message.name) with body: \(message.body)") + if (message.name == "loaded") { + let stringToSend = "window.sendBase64EncodedFromSwift('data:\(self.typeToSend ?? "application/octet-stream");base64,\(self.dataToSend?.base64EncodedString() ?? "")')"; + self.webView.evaluateJavaScript(stringToSend) { (object: Any?, error: Error?) -> Void in + print("completed") + } + } else if (message.name == "copy") { + UIPasteboard.general.string = "\(message.body)" + } + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + @IBAction func done() { + // Return any edited content to the host app. + // This template doesn't do anything, so we just echo the passed in items. + self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems, completionHandler: nil) + } + +} diff --git a/ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard b/ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard new file mode 100644 index 000000000..5939032df --- /dev/null +++ b/ios/send-ios-action-extension/Base.lproj/MainInterface.storyboard @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/send-ios-action-extension/Info.plist b/ios/send-ios-action-extension/Info.plist new file mode 100644 index 000000000..10caa73ea --- /dev/null +++ b/ios/send-ios-action-extension/Info.plist @@ -0,0 +1,53 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleDisplayName + send-ios-action-extension + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + XPC! + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + NSExtension + + NSExtensionAttributes + + NSExtensionActivationRule + SUBQUERY ( + extensionItems, + $extensionItem, + SUBQUERY ( + $extensionItem.attachments, + $attachment, + ( + ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.adobe.pdf" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.image" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.plain-text" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.png" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "public.jpeg-2000" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.compuserve.gif" + || ANY $attachment.registeredTypeIdentifiers UTI-CONFORMS-TO "com.microsoft.bmp" + ) + ).@count == 1 + ).@count == 1 + + NSExtensionMainStoryboard + MainInterface + NSExtensionPointIdentifier + com.apple.ui-services + + + diff --git a/ios/send-ios.xcodeproj/project.pbxproj b/ios/send-ios.xcodeproj/project.pbxproj new file mode 100644 index 000000000..83f460b2a --- /dev/null +++ b/ios/send-ios.xcodeproj/project.pbxproj @@ -0,0 +1,526 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 50; + objects = { + +/* Begin PBXBuildFile section */ + E34149C621017A3A00930775 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34149C521017A3A00930775 /* AppDelegate.swift */; }; + E34149C821017A3A00930775 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E34149C721017A3A00930775 /* ViewController.swift */; }; + E34149CB21017A3A00930775 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E34149C921017A3A00930775 /* Main.storyboard */; }; + E34149CD21017A3D00930775 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = E34149CC21017A3D00930775 /* Assets.xcassets */; }; + E34149D021017A3D00930775 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E34149CE21017A3D00930775 /* LaunchScreen.storyboard */; }; + E355478521028193009D206E /* help.html in Resources */ = {isa = PBXBuildFile; fileRef = E355478421028193009D206E /* help.html */; }; + E355478921092E22009D206E /* assets in Resources */ = {isa = PBXBuildFile; fileRef = E355478821092E22009D206E /* assets */; }; + E355478C210A534F009D206E /* ios.js in Resources */ = {isa = PBXBuildFile; fileRef = E355478B210A534F009D206E /* ios.js */; }; + E355478E210A5357009D206E /* generate-bundle.js in Resources */ = {isa = PBXBuildFile; fileRef = E355478D210A5357009D206E /* generate-bundle.js */; }; + E397A0B2210A641C00A978D4 /* ActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = E397A0B1210A641C00A978D4 /* ActionViewController.swift */; }; + E397A0B5210A641C00A978D4 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = E397A0B3210A641C00A978D4 /* MainInterface.storyboard */; }; + E397A0B9210A641C00A978D4 /* send-ios-action-extension.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + E397A0BF210A6B5500A978D4 /* assets in Resources */ = {isa = PBXBuildFile; fileRef = E397A0BE210A6B5500A978D4 /* assets */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + E397A0B7210A641C00A978D4 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = E34149BA21017A3900930775 /* Project object */; + proxyType = 1; + remoteGlobalIDString = E397A0AE210A641C00A978D4; + remoteInfo = "send-ios-action-extension"; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + E397A0BD210A641C00A978D4 /* Embed App Extensions */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 13; + files = ( + E397A0B9210A641C00A978D4 /* send-ios-action-extension.appex in Embed App Extensions */, + ); + name = "Embed App Extensions"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + E34149C221017A3900930775 /* send-ios.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "send-ios.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + E34149C521017A3A00930775 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + E34149C721017A3A00930775 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + E34149CA21017A3A00930775 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + E34149CC21017A3D00930775 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + E34149CF21017A3D00930775 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + E34149D121017A3D00930775 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E355478421028193009D206E /* help.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; path = help.html; sourceTree = ""; }; + E355478821092E22009D206E /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; path = assets; sourceTree = ""; }; + E355478B210A534F009D206E /* ios.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ios.js; sourceTree = SOURCE_ROOT; }; + E355478D210A5357009D206E /* generate-bundle.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = "generate-bundle.js"; sourceTree = SOURCE_ROOT; }; + E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "send-ios-action-extension.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + E397A0B1210A641C00A978D4 /* ActionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionViewController.swift; sourceTree = ""; }; + E397A0B4210A641C00A978D4 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; }; + E397A0B6210A641C00A978D4 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + E397A0BE210A6B5500A978D4 /* assets */ = {isa = PBXFileReference; lastKnownFileType = folder; name = assets; path = "send-ios/assets"; sourceTree = SOURCE_ROOT; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + E34149BF21017A3900930775 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E397A0AC210A641C00A978D4 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + E34149B921017A3900930775 = { + isa = PBXGroup; + children = ( + E34149C421017A3900930775 /* send-ios */, + E397A0B0210A641C00A978D4 /* send-ios-action-extension */, + E34149C321017A3900930775 /* Products */, + ); + sourceTree = ""; + }; + E34149C321017A3900930775 /* Products */ = { + isa = PBXGroup; + children = ( + E34149C221017A3900930775 /* send-ios.app */, + E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */, + ); + name = Products; + sourceTree = ""; + }; + E34149C421017A3900930775 /* send-ios */ = { + isa = PBXGroup; + children = ( + E355478D210A5357009D206E /* generate-bundle.js */, + E355478B210A534F009D206E /* ios.js */, + E34149C521017A3A00930775 /* AppDelegate.swift */, + E34149C721017A3A00930775 /* ViewController.swift */, + E34149C921017A3A00930775 /* Main.storyboard */, + E34149CC21017A3D00930775 /* Assets.xcassets */, + E34149CE21017A3D00930775 /* LaunchScreen.storyboard */, + E34149D121017A3D00930775 /* Info.plist */, + E355478421028193009D206E /* help.html */, + E355478821092E22009D206E /* assets */, + ); + path = "send-ios"; + sourceTree = ""; + }; + E397A0B0210A641C00A978D4 /* send-ios-action-extension */ = { + isa = PBXGroup; + children = ( + E397A0BE210A6B5500A978D4 /* assets */, + E397A0B1210A641C00A978D4 /* ActionViewController.swift */, + E397A0B3210A641C00A978D4 /* MainInterface.storyboard */, + E397A0B6210A641C00A978D4 /* Info.plist */, + ); + path = "send-ios-action-extension"; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + E34149C121017A3900930775 /* send-ios */ = { + isa = PBXNativeTarget; + buildConfigurationList = E34149D421017A3D00930775 /* Build configuration list for PBXNativeTarget "send-ios" */; + buildPhases = ( + E355478A210A4C43009D206E /* ShellScript */, + E34149BE21017A3900930775 /* Sources */, + E34149BF21017A3900930775 /* Frameworks */, + E34149C021017A3900930775 /* Resources */, + E397A0BD210A641C00A978D4 /* Embed App Extensions */, + ); + buildRules = ( + ); + dependencies = ( + E397A0B8210A641C00A978D4 /* PBXTargetDependency */, + ); + name = "send-ios"; + productName = "send-ios"; + productReference = E34149C221017A3900930775 /* send-ios.app */; + productType = "com.apple.product-type.application"; + }; + E397A0AE210A641C00A978D4 /* send-ios-action-extension */ = { + isa = PBXNativeTarget; + buildConfigurationList = E397A0BC210A641C00A978D4 /* Build configuration list for PBXNativeTarget "send-ios-action-extension" */; + buildPhases = ( + E397A0AB210A641C00A978D4 /* Sources */, + E397A0AC210A641C00A978D4 /* Frameworks */, + E397A0AD210A641C00A978D4 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = "send-ios-action-extension"; + productName = "send-ios-action-extension"; + productReference = E397A0AF210A641C00A978D4 /* send-ios-action-extension.appex */; + productType = "com.apple.product-type.app-extension"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + E34149BA21017A3900930775 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftUpdateCheck = 0940; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = "Donovan Preston"; + TargetAttributes = { + E34149C121017A3900930775 = { + CreatedOnToolsVersion = 9.4.1; + }; + E397A0AE210A641C00A978D4 = { + CreatedOnToolsVersion = 9.4.1; + }; + }; + }; + buildConfigurationList = E34149BD21017A3900930775 /* Build configuration list for PBXProject "send-ios" */; + compatibilityVersion = "Xcode 9.3"; + developmentRegion = en; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = E34149B921017A3900930775; + productRefGroup = E34149C321017A3900930775 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + E34149C121017A3900930775 /* send-ios */, + E397A0AE210A641C00A978D4 /* send-ios-action-extension */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + E34149C021017A3900930775 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E355478C210A534F009D206E /* ios.js in Resources */, + E355478921092E22009D206E /* assets in Resources */, + E355478E210A5357009D206E /* generate-bundle.js in Resources */, + E34149D021017A3D00930775 /* LaunchScreen.storyboard in Resources */, + E355478521028193009D206E /* help.html in Resources */, + E34149CD21017A3D00930775 /* Assets.xcassets in Resources */, + E34149CB21017A3A00930775 /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E397A0AD210A641C00A978D4 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E397A0B5210A641C00A978D4 /* MainInterface.storyboard in Resources */, + E397A0BF210A6B5500A978D4 /* assets in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + E355478A210A4C43009D206E /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "node generate-bundle.js\n"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + E34149BE21017A3900930775 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E34149C821017A3A00930775 /* ViewController.swift in Sources */, + E34149C621017A3A00930775 /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + E397A0AB210A641C00A978D4 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + E397A0B2210A641C00A978D4 /* ActionViewController.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + E397A0B8210A641C00A978D4 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = E397A0AE210A641C00A978D4 /* send-ios-action-extension */; + targetProxy = E397A0B7210A641C00A978D4 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + E34149C921017A3A00930775 /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E34149CA21017A3A00930775 /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + E34149CE21017A3D00930775 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E34149CF21017A3D00930775 /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; + E397A0B3210A641C00A978D4 /* MainInterface.storyboard */ = { + isa = PBXVariantGroup; + children = ( + E397A0B4210A641C00A978D4 /* Base */, + ); + name = MainInterface.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + E34149D221017A3D00930775 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + E34149D321017A3D00930775 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + CODE_SIGN_IDENTITY = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu11; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 11.4; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + SWIFT_COMPILATION_MODE = wholemodule; + SWIFT_OPTIMIZATION_LEVEL = "-O"; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + E34149D521017A3D00930775 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E34149D621017A3D00930775 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; + E397A0BA210A641C00A978D4 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios-action-extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios.send-ios-action-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Debug; + }; + E397A0BB210A641C00A978D4 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CODE_SIGN_STYLE = Automatic; + INFOPLIST_FILE = "send-ios-action-extension/Info.plist"; + LD_RUNPATH_SEARCH_PATHS = ( + "$(inherited)", + "@executable_path/Frameworks", + "@executable_path/../../Frameworks", + ); + PRODUCT_BUNDLE_IDENTIFIER = "com.mozilla.send-ios.send-ios-action-extension"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_VERSION = 4.0; + TARGETED_DEVICE_FAMILY = "1,2"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + E34149BD21017A3900930775 /* Build configuration list for PBXProject "send-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E34149D221017A3D00930775 /* Debug */, + E34149D321017A3D00930775 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E34149D421017A3D00930775 /* Build configuration list for PBXNativeTarget "send-ios" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E34149D521017A3D00930775 /* Debug */, + E34149D621017A3D00930775 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + E397A0BC210A641C00A978D4 /* Build configuration list for PBXNativeTarget "send-ios-action-extension" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + E397A0BA210A641C00A978D4 /* Debug */, + E397A0BB210A641C00A978D4 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = E34149BA21017A3900930775 /* Project object */; +} diff --git a/ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 000000000..883bc6f43 --- /dev/null +++ b/ios/send-ios.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist b/ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist new file mode 100644 index 000000000..18d981003 --- /dev/null +++ b/ios/send-ios.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist @@ -0,0 +1,8 @@ + + + + + IDEDidComputeMac32BitWarning + + + diff --git a/ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/donovan.xcuserdatad/UserInterfaceState.xcuserstate b/ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/donovan.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 000000000..ccfe2abd4 Binary files /dev/null and b/ios/send-ios.xcodeproj/project.xcworkspace/xcuserdata/donovan.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 000000000..a53fd3572 --- /dev/null +++ b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,23 @@ + + + + + + + + + diff --git a/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcschemes/xcschememanagement.plist b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 000000000..566d89e1e --- /dev/null +++ b/ios/send-ios.xcodeproj/xcuserdata/donovan.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,19 @@ + + + + + SchemeUserState + + send-ios-action-extension.xcscheme + + orderHint + 1 + + send-ios.xcscheme + + orderHint + 0 + + + + diff --git a/ios/send-ios/AppDelegate.swift b/ios/send-ios/AppDelegate.swift new file mode 100644 index 000000000..bfb62d7a5 --- /dev/null +++ b/ios/send-ios/AppDelegate.swift @@ -0,0 +1,45 @@ +// +// AppDelegate.swift +// send-ios +// +// Created by Donovan Preston on 7/19/18. +// + +import UIKit + +@UIApplicationMain +class AppDelegate: UIResponder, UIApplicationDelegate { + + var window: UIWindow? + + + func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { + // Override point for customization after application launch. + return true + } + + func applicationWillResignActive(_ application: UIApplication) { + // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. + // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game. + } + + func applicationDidEnterBackground(_ application: UIApplication) { + // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(_ application: UIApplication) { + // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background. + } + + func applicationDidBecomeActive(_ application: UIApplication) { + // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. + } + + func applicationWillTerminate(_ application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json b/ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 000000000..d8db8d65f --- /dev/null +++ b/ios/send-ios/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,98 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "20x20", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "20x20", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "83.5x83.5", + "scale" : "2x" + }, + { + "idiom" : "ios-marketing", + "size" : "1024x1024", + "scale" : "1x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/send-ios/Assets.xcassets/Contents.json b/ios/send-ios/Assets.xcassets/Contents.json new file mode 100644 index 000000000..da4a164c9 --- /dev/null +++ b/ios/send-ios/Assets.xcassets/Contents.json @@ -0,0 +1,6 @@ +{ + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/ios/send-ios/Base.lproj/LaunchScreen.storyboard b/ios/send-ios/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 000000000..f83f6fd58 --- /dev/null +++ b/ios/send-ios/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/send-ios/Base.lproj/Main.storyboard b/ios/send-ios/Base.lproj/Main.storyboard new file mode 100644 index 000000000..09ae84fde --- /dev/null +++ b/ios/send-ios/Base.lproj/Main.storyboard @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ios/send-ios/Info.plist b/ios/send-ios/Info.plist new file mode 100644 index 000000000..16be3b681 --- /dev/null +++ b/ios/send-ios/Info.plist @@ -0,0 +1,45 @@ + + + + + CFBundleDevelopmentRegion + $(DEVELOPMENT_LANGUAGE) + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/ios/send-ios/ViewController.swift b/ios/send-ios/ViewController.swift new file mode 100644 index 000000000..289f07c4d --- /dev/null +++ b/ios/send-ios/ViewController.swift @@ -0,0 +1,39 @@ +// +// ViewController.swift +// send-ios +// +// Created by Donovan Preston on 7/19/18. +// + +import UIKit +import WebKit + +class ViewController: UIViewController, WKScriptMessageHandler { + @IBOutlet var webView: WKWebView! + + override func viewDidLoad() { + super.viewDidLoad() + self.webView.frame = self.view.bounds + self.webView?.configuration.userContentController.add(self, name: "loaded") + self.webView?.configuration.userContentController.add(self, name: "copy") + if let url = Bundle.main.url( + forResource: "index", + withExtension: "html", + subdirectory: "assets") { + webView.loadFileURL(url, allowingReadAccessTo: url.deletingLastPathComponent()) + } + } + + public func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) { + print("Message received: \(message.name) with body: \(message.body)") + UIPasteboard.general.string = "\(message.body)" + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/ios/send-ios/assets/background_1.jpg b/ios/send-ios/assets/background_1.jpg new file mode 100644 index 000000000..c92d3fb16 Binary files /dev/null and b/ios/send-ios/assets/background_1.jpg differ diff --git a/ios/send-ios/assets/index.css b/ios/send-ios/assets/index.css new file mode 100644 index 000000000..3dd18d2dc --- /dev/null +++ b/ios/send-ios/assets/index.css @@ -0,0 +1,84 @@ +body { + background: url('background_1.jpg'); + display: flex; + flex-direction: row; + flex: auto; + justify-content: center; + align-items: center; + padding: 0 20px; + box-sizing: border-box; + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +#striped { + background-image: repeating-linear-gradient( + 45deg, + white, + white 5px, + #ea000e 5px, + #ea000e 25px, + white 25px, + white 30px, + #0083ff 30px, + #0083ff 50px + ); + height: 350px; + width: 480px; +} + +#white { + display: flex; + justify-content: center; + align-items: center; + flex-direction: column; + height: 100%; + background-color: white; + margin: 0 10px; + padding: 1px 10px 0 10px; +} + +#label { + background: #0297f8; + border: 1px solid #0297f8; + color: white; + font-size: 24px; + font-weight: 500; + height: 60px; + width: 200px; + display: flex; + justify-content: center; + align-items: center; +} + +#input { + display: none; +} + +#url { + flex: 1; + width: 100%; + height: 32px; + font-size: 24px; + margin-top: 1em; +} + +.button { + flex: 1; + display: block; + background: #0297f8; + border: 1px solid #0297f8; + color: white; + font-size: 24px; + font-weight: 500; + width: 95%; + height: 32px; + margin-top: 1em; +} + +#send-another { + margin-bottom: 1em; +} diff --git a/ios/send-ios/assets/index.html b/ios/send-ios/assets/index.html new file mode 100644 index 000000000..14ad97340 --- /dev/null +++ b/ios/send-ios/assets/index.html @@ -0,0 +1,17 @@ + + + + + Send + + + + + + + + + + diff --git a/ios/send-ios/help.html b/ios/send-ios/help.html new file mode 100644 index 000000000..afbd39d55 --- /dev/null +++ b/ios/send-ios/help.html @@ -0,0 +1,5 @@ + + + HELLO WORLD + + diff --git a/package-lock.json b/package-lock.json index 6fd9ff4db..a454255b8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,1305 +1,4446 @@ { "name": "firefox-send", - "version": "2.3.1", + "version": "3.0.22", "lockfileVersion": 1, "requires": true, "dependencies": { - "@f/has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@f/has/-/has-1.0.1.tgz", - "integrity": "sha1-t08TK/OqpdwECe3+jucjN9bnP74=", + "@babel/code-frame": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz", + "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==", + "dev": true, + "requires": { + "@babel/highlight": "^7.8.3" + } + }, + "@babel/compat-data": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.10.5.tgz", + "integrity": "sha512-mPVoWNzIpYJHbWje0if7Ck36bpbtTvIxOi9+6WSK9wjGEXearAqlwBoTQvVjsAY2VIwgcs8V940geY3okzRCEw==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "semver": "^5.5.0" + } + }, + "@babel/core": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.10.5.tgz", + "integrity": "sha512-O34LQooYVDXPl7QWCdW9p4NR+QlzOr7xShPPJz8GsuCU3/8ua/wqTr7gmnxXv+WBESiGU/G5s16i6tUvHkNb+w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helpers": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.5", + "@babel/types": "^7.10.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.2", + "lodash": "^4.17.19", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/generator": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.6.tgz", + "integrity": "sha512-+htwWKJbH2bL72HRluF8zumBxzuX0ZZUFl3JLNyoUjM/Ho8wnVpPXM6aUz8cfKDqQ/h7zHqKt4xzJteUosckqQ==", + "dev": true, + "requires": { + "@babel/types": "^7.9.6", + "jsesc": "^2.5.1", + "lodash": "^4.17.13", + "source-map": "^0.5.0" + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.4.tgz", + "integrity": "sha512-XQlqKQP4vXFB7BN8fEEerrmYvHp3fK/rBkRFz9jaJbzK0B1DSfej9Kc7ZzE8Z/OnId1jpJdNAZ3BFQjWG68rcA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-compilation-targets": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.4.tgz", + "integrity": "sha512-a3rYhlsGV0UHNDvrtOXBg8/OpfV0OKTkxKPzIplS1zpx7CygDcWWxckxZeDd3gzPzC4kUT0A4nVFDK0wGMh4MQ==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "browserslist": "^4.12.0", + "invariant": "^2.2.4", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.5.tgz", + "integrity": "sha512-0nkdeijB7VlZoLT3r/mY3bUkw3T8WG/hNw+FATs/6+pG2039IJWjTYL0VTISqsNHMUTEnwbVnc89WIJX9Qed0A==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-member-expression-to-functions": "^7.10.5", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.4.tgz", + "integrity": "sha512-2/hu58IEPKeoLF45DBwx3XFqsbCXmkdAay4spVr2x0jYgRxrSNp+ePwvSsy9g6YSaNDcKIQVPXk1Ov8S2edk2g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-regex": "^7.10.4", + "regexpu-core": "^4.7.0" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.4.tgz", + "integrity": "sha512-4K71RyRQNPRrR85sr5QY4X3VwG4wtVoXZB9+L3r1Gp38DhELyHCtovqydRi7c1Ovb17eRGiQ/FD5s8JdU0Uy5A==", + "dev": true, + "requires": { + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-function-name": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz", + "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.8.3", + "@babel/template": "^7.8.3", + "@babel/types": "^7.9.5" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz", + "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.5.tgz", + "integrity": "sha512-HiqJpYD5+WopCXIAbQDG0zye5XYVvcO9w/DHp5GsaGkRUaamLj2bEtu6i8rnGGprAhHM3qidCMgp71HF4endhA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-module-imports": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.10.4.tgz", + "integrity": "sha512-nEQJHqYavI217oD9+s5MUBzk6x1IlvoS9WTPfgG43CbMEeStE0v+r+TucWdx8KFGowPGvyOkDT9+7DHedIDnVw==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-module-transforms": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.10.5.tgz", + "integrity": "sha512-4P+CWMJ6/j1W915ITJaUkadLObmCRRSC234uctJfn/vHrsLNxsR8dwlcXv9ZhJWzl77awf+mWXSZEKt5t0OnlA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.4.tgz", + "integrity": "sha512-n3UGKY4VXwXThEiKrgRAoVPBMqeoPgHVqiHZOanAJCG9nQUL2pLRQirUzl0ioKclHGpGqRgIOkgcIJaIWLpygg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-plugin-utils": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", + "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", + "dev": true + }, + "@babel/helper-regex": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.10.5.tgz", + "integrity": "sha512-68kdUAzDrljqBrio7DYAEgCoJHxppJOERHOgOrDN7WjOzP0ZQ1LsSDRXcemzVZaLvjaJsJEESb6qt+znNuENDg==", + "dev": true, + "requires": { + "lodash": "^4.17.19" + }, + "dependencies": { + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.4.tgz", + "integrity": "sha512-86Lsr6NNw3qTNl+TBcF1oRZMaVzJtbWTyTko+CQL/tvNvcGYEFKbLXDPxtW0HKk3McNOk4KzY55itGWCAGK5tg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.10.4.tgz", + "integrity": "sha512-sPxZfFXocEymYTdVK1UNmFPBN+Hv5mJkLPsYWwGBxZAxaWfFu+xqp7b6qWD0yjNuNL2VKc6L5M18tOXUP7NU0A==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-simple-access": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.10.4.tgz", + "integrity": "sha512-0fMy72ej/VEvF8ULmX6yb5MtHG4uH4Dbd6I/aHDb/JVg0bbivwt9Wg+h3uMvX+QSFtwr5MeItvazbrc4jtRAXw==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", + "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.9.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz", + "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.10.4.tgz", + "integrity": "sha512-6py45WvEF0MhiLrdxtRjKjufwLL1/ob2qDJgg5JgNdojBAZSAKnAjkyOCNug6n+OBl4VW76XjvgSFTdaMcW0Ug==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/helpers": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.10.4.tgz", + "integrity": "sha512-L2gX/XeUONeEbI78dXSrJzGdz4GQ+ZTA/aazfUsFaWjSe95kiCuOZ5HsXvkiw3iwF+mFHSRUfJU8t6YavocdXA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/generator": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.10.5.tgz", + "integrity": "sha512-3vXxr3FEW7E7lJZiWQ3bM4+v/Vyr9C+hpolQ8BGFr9Y8Ri2tFLWTixmwKBafDujO1WVah4fhZBeU1bieKdghig==", + "dev": true, + "requires": { + "@babel/types": "^7.10.5", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/traverse": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.10.5.tgz", + "integrity": "sha512-yc/fyv2gUjPqzTz0WHeRJH2pv7jA9kA7mBX2tXl/x5iOE81uaVPuGPtaYk7wmkx4b67mQ7NqI8rmT2pF47KYKQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/generator": "^7.10.5", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "@babel/parser": "^7.10.5", + "@babel/types": "^7.10.5", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/highlight": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.0", + "chalk": "^2.0.0", + "js-tokens": "^4.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" + } + }, + "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" + } + }, + "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" + } + } + } + }, + "@babel/parser": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.6.tgz", + "integrity": "sha512-AoeIEJn8vt+d/6+PXDRPaksYhnlbMIiejioBZvvMQsOjW/JYK6k/0dKnvvP3EhK5GfMBWDPtrxRtegWdAcdq9Q==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.5.tgz", + "integrity": "sha512-cNMCVezQbrRGvXJwm9fu/1sJj9bHdGAgKodZdLqOQIpfoH3raqmRPBM17+lh7CzhiKRRBrGtZL9WcjxSoGYUSg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.4.tgz", + "integrity": "sha512-vhwkEROxzcHGNu2mzUC0OFFNXdZ4M23ib8aRRcJSsW8BZK9pQMD7QB7csl97NBbgGZO7ZyHUyKDnxzOaP4IrCg==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.4.tgz", + "integrity": "sha512-up6oID1LeidOOASNXgv/CFbgBqTuKJ0cJjz6An5tWD+NVBNlp3VNSBxv2ZdU7SYl3NxJC7agAQDApZusV6uFwQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.4.tgz", + "integrity": "sha512-fCL7QF0Jo83uy1K0P2YXrfX11tj3lkpN7l4dMv9Y9VkowkhkQDwFHFd8IiwyK5MZjE8UpbgokkgtcReH88Abaw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.4.tgz", + "integrity": "sha512-wq5n1M3ZUlHl9sqT2ok1T2/MTt6AXE0e1Lz4WzWBr95LsAZ5qDXe4KnFuauYyEyLiohvXFMdbsOTMyLZs91Zlw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.4.tgz", + "integrity": "sha512-73/G7QoRoeNkLZFxsoCCvlg4ezE4eM+57PnOqgaPOozd5myfj7p0muD1mRVJvbUWbOzD+q3No2bWbaKy+DJ8DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.4.tgz", + "integrity": "sha512-6vh4SqRuLLarjgeOf4EaROJAHjvu9Gl+/346PbDH9yWbJyfnJ/ah3jmYKYtswEyCoWZiidvVHjHshd4WgjB9BA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.4.tgz", + "integrity": "sha512-LflT6nPh+GK2MnFiKDyLiqSqVHkQnVf7hdoAvyTnnKj9xB3docGRsdPuxp6qqqW19ifK3xgc9U5/FwrSaCNX5g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.4.tgz", + "integrity": "sha512-ZIhQIEeavTgouyMSdZRap4VPPHqJJ3NEs2cuHs5p0erH+iz6khB0qfgU8g7UuJkG88+fBMy23ZiU+nuHvekJeQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.4.tgz", + "integrity": "sha512-wh5GJleuI8k3emgTg5KkJK6kHNsGEr0uBTDBuQUBJwckk9xs1ez79ioheEVVxMLyPscB0LfkbVHslQqIzWV6Bw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.4.tgz", + "integrity": "sha512-H+3fOgPnEXFL9zGYtKQe4IDOPKYlZdF1kqFDQRRb8PK4B8af1vAGK04tF5iQAAsui+mHNBQSAtd2/ndEDe9wuA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.4.tgz", + "integrity": "sha512-GCSBF7iUle6rNugfURwNmCGG3Z/2+opxAMLs1nND4bhEG5PuxTIggDBoeYYSujAlLtsupzOHYJQgPS3pivwXIA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.4.tgz", + "integrity": "sha512-ni1brg4lXEmWyafKr0ccFWkJG0CeMt4WV1oyeBW6EFObF4oOHclbkj5cARxAPQyAQ2UTuplJyK4nfkXIMMFvsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.4.tgz", + "integrity": "sha512-9J/oD1jV0ZCBcgnoFWFq1vJd4msoKb/TCpGNFyyLt0zABdcvgK3aYikZ8HjzB14c26bc7E3Q1yugpwGy2aTPNA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.4.tgz", + "integrity": "sha512-F6nREOan7J5UXTLsDsZG3DXmZSVofr2tGNwfdrVwkDWHfQckbQXnXSPfD7iO+c/2HGqycwyLST3DnZ16n+cBJQ==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.4.tgz", + "integrity": "sha512-WzXDarQXYYfjaV1szJvN3AD7rZgZzC1JtjJZ8dMHUyiK8mxPRahynp14zzNjU3VkPqPsO38CzxiWO1c9ARZ8JA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.5.tgz", + "integrity": "sha512-6Ycw3hjpQti0qssQcA6AMSFDHeNJ++R6dIMnpRqUjFeBBTmTDPa8zgF90OVfTvAo11mXZTlVUViY1g8ffrURLg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-classes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.4.tgz", + "integrity": "sha512-2oZ9qLjt161dn1ZE0Ms66xBncQH4In8Sqw1YWgBUZuGVJJS5c0OFZXL6dP2MRHrkU/eKhWg8CzFJhRQl50rQxA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-split-export-declaration": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.4.tgz", + "integrity": "sha512-pySBTeoUff56fL5CBU2hWm9TesA4r/rOkI9DyJLvvgz09MB9YtfIYe3iBriVaYNaPe+Alua0vBIOVOLs2buWhg==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.4.tgz", + "integrity": "sha512-JFwVDXcP/hM/TbyzGq3l/XWGut7p46Z3QvqFMXTfk6/09m7xZHJUN9xHfsv7vqqD4YnfI5ueYdSJtXqqBLyjBw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.4.tgz", + "integrity": "sha512-+WmfvyfsyF603iPa6825mq6Qrb7uLjTOsa3XOFzlYcYDHSS4QmpOWOL0NNBY5qMbvrcf3tq0Cw+v4lxswOBpgA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.4.tgz", + "integrity": "sha512-ZEAVvUTCMlMFAbASYSVQoxIbHm2OkG2MseW6bV2JjIygOjdVv8tuxrCTzj1+Rynh7ODb8GivUy7dzEXzEhuPaA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.4.tgz", + "integrity": "sha512-GL0/fJnmgMclHiBTTWXNlYjYsA7rDrtsazHG6mglaGSTh0KsrW04qml+Bbz9FL0LcJIRwBWL5ZqlNHKTkU3xAA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.4.tgz", + "integrity": "sha512-S5HgLVgkBcRdyQAHbKj+7KyuWx8C6t5oETmUuwz1pt3WTWJhsUV0WIIXuVvfXMxl/QQyHKlSCNNtaIamG8fysw==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.4.tgz", + "integrity": "sha512-ItdQfAzu9AlEqmusA/65TqJ79eRcgGmpPPFvBnGILXZH975G0LNjP1yjHvGgfuCxqrPPueXOPe+FsvxmxKiHHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.4.tgz", + "integrity": "sha512-OcDCq2y5+E0dVD5MagT5X+yTRbcvFjDI2ZVAottGH6tzqjx/LKpgkUepu3hp/u4tZBzxxpNGwLsAvGBvQ2mJzg==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/code-frame": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.10.4.tgz", + "integrity": "sha512-vG6SvB6oYEhvgisZNFRmRCUkLz11c7rp+tbNTynGqc6mS1d5ATd/sGyV6W0KZZnXRKMTzZDRgQT3Ou9jhpAfUg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/helper-function-name": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.10.4.tgz", + "integrity": "sha512-YdaSyz1n8gY44EmN7x44zBn9zQ1Ry2Y+3GTA+3vH6Mizke1Vw0aWDM66FOYEPw8//qKkmqOckrGgTYa+6sceqQ==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.10.5.tgz", + "integrity": "sha512-wfryxy4bE1UivvQKSQDU4/X6dr+i8bctjUjj8Zyt3DQy7NtPizJXT8M52nqpNKL+nq2PW8lxk4ZqLj0fD4B4hQ==", + "dev": true + }, + "@babel/template": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.10.4.tgz", + "integrity": "sha512-ZCjD27cGJFUB6nmCB1Enki3r+L5kJveX9pq1SvAUKoICy6CZ9yD8xO086YXdYhvNjBdnekm4ZnaP5yC8Cs/1tA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "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" + } + } + } + }, + "@babel/plugin-transform-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.4.tgz", + "integrity": "sha512-Xd/dFSTEVuUWnyZiMu76/InZxLTYilOSr1UlHV+p115Z/Le2Fi1KXkJUYz0b42DfndostYlPub3m8ZTQlMaiqQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.4.tgz", + "integrity": "sha512-0bFOvPyAoTBhtcJLr9VcwZqKmSjFml1iVxvPL0ReomGU53CX53HsM4h2SzckNdkQcHox1bpAqzxBI1Y09LlBSw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.5.tgz", + "integrity": "sha512-elm5uruNio7CTLFItVC/rIzKLfQ17+fX7EVz5W0TMgIHFo1zY0Ozzx+lgwhL4plzl8OzVn6Qasx5DeEFyoNiRw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.4.tgz", + "integrity": "sha512-Xj7Uq5o80HDLlW64rVfDBhao6OX89HKUmb+9vWYaLXBZOma4gA6tw4Ni1O5qVDoZWUV0fxMYA0aYzOawz0l+1w==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.5.tgz", + "integrity": "sha512-f4RLO/OL14/FP1AEbcsWMzpbUz6tssRaeQg11RH1BP/XnPpRoVwgeYViMFacnkaw4k4wjRSjn3ip1Uw9TaXuMw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.10.5", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.4.tgz", + "integrity": "sha512-mohW5q3uAEt8T45YT7Qc5ws6mWgJAaL/8BfWD9Dodo1A3RKWli8wTS+WiQ/knF+tXlPirW/1/MqzzGfCExKECA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.10.4.tgz", + "integrity": "sha512-V6LuOnD31kTkxQPhKiVYzYC/Jgdq53irJC/xBSmqcNcqFGV+PER4l6rU5SH2Vl7bH9mLDHcc0+l9HUOe4RNGKA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.4.tgz", + "integrity": "sha512-YXwWUDAH/J6dlfwqlWsztI2Puz1NtUAubXhOPLQ5gjR/qmQ5U96DY4FQO8At33JN4XPBhrjB8I4eMmLROjjLjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.4.tgz", + "integrity": "sha512-5iTw0JkdRdJvr7sY0vHqTpnruUpTea32JHmq/atIWqsnNussbRzjEDyWep8UNztt1B5IusBYg8Irb0bLbiEBCQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.5.tgz", + "integrity": "sha512-xPHwUj5RdFV8l1wuYiu5S9fqWGM2DrYc24TMvUiRrPVm+SM3XeqU9BcokQX/kEUe+p2RBwy+yoiR1w/Blq6ubw==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-get-function-arity": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.4.tgz", + "integrity": "sha512-EkN3YDB+SRDgiIUnNgcmiD361ti+AVbL3f3Henf6dqqUyr5dMsorno0lJWJuLhDhkI5sYEpgj6y9kB8AOU1I2A==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.4.tgz", + "integrity": "sha512-ofsAcKiUxQ8TY4sScgsGeR2vJIsfrzqvFb9GvJ5UdXDzl+MyYCaBj/FGzXuv7qE0aJcjWMILny1epqelnFlz8g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.4.tgz", + "integrity": "sha512-3thAHwtor39A7C04XucbMg17RcZ3Qppfxr22wYzZNcVIkPHfpM9J0SO8zuCV6SZa265kxBJSrfKTvDCYqBFXGw==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.4.tgz", + "integrity": "sha512-hGsw1O6Rew1fkFbDImZIEqA8GoidwTAilwCyWqLBM9f+e/u/sQMQu7uX6dyokfOayRuuVfKOW4O7HvaBWM+JlQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.4.tgz", + "integrity": "sha512-AC2K/t7o07KeTIxMoHneyX90v3zkm5cjHJEokrPEAGEy3UCp8sLKfnfOIGdZ194fyN4wfX/zZUWT9trJZ0qc+Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-spread": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.4.tgz", + "integrity": "sha512-1e/51G/Ni+7uH5gktbWv+eCED9pP8ZpRhZB3jOaI3mmzfvJTWHkuyYTv0Z5PYtyM+Tr2Ccr9kUdQxn60fI5WuQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.4.tgz", + "integrity": "sha512-Ddy3QZfIbEV0VYcVtFDCjeE4xwVTJWTmUtorAJkn6u/92Z/nWJNV+mILyqHKrUxXYKA2EoCilgoPePymKL4DvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-regex": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.5.tgz", + "integrity": "sha512-V/lnPGIb+KT12OQikDvgSuesRX14ck5FfJXt6+tXhdkJ+Vsd0lDCVtF6jcB4rNClYFzaB2jusZ+lNISDk2mMMw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.4.tgz", + "integrity": "sha512-QqNgYwuuW0y0H+kUE/GWSR45t/ccRhe14Fs/4ZRouNNQsyd4o3PG4OtHiIrepbM2WKUBDAXKCAK/Lk4VhzTaGA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.4.tgz", + "integrity": "sha512-y5XJ9waMti2J+e7ij20e+aH+fho7Wb7W8rNuu72aKRwCHFqQdhkdU2lo3uZ9tQuboEJcUFayXdARhcxLQ3+6Fg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.4.tgz", + "integrity": "sha512-wNfsc4s8N2qnIwpO/WP2ZiSyjfpTamT2C9V9FDH/Ljub9zw6P3SjkXcFmc0RQUt96k2fmIvtla2MMjgTwIAC+A==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + } + } + }, + "@babel/preset-env": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.10.4.tgz", + "integrity": "sha512-tcmuQ6vupfMZPrLrc38d0sF2OjLT3/bZ0dry5HchNCQbrokoQi4reXqclvkkAT5b+gWc23meVWpve5P/7+w/zw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.10.4", + "@babel/helper-compilation-targets": "^7.10.4", + "@babel/helper-module-imports": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-proposal-async-generator-functions": "^7.10.4", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-proposal-dynamic-import": "^7.10.4", + "@babel/plugin-proposal-json-strings": "^7.10.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.10.4", + "@babel/plugin-proposal-numeric-separator": "^7.10.4", + "@babel/plugin-proposal-object-rest-spread": "^7.10.4", + "@babel/plugin-proposal-optional-catch-binding": "^7.10.4", + "@babel/plugin-proposal-optional-chaining": "^7.10.4", + "@babel/plugin-proposal-private-methods": "^7.10.4", + "@babel/plugin-proposal-unicode-property-regex": "^7.10.4", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.10.4", + "@babel/plugin-transform-arrow-functions": "^7.10.4", + "@babel/plugin-transform-async-to-generator": "^7.10.4", + "@babel/plugin-transform-block-scoped-functions": "^7.10.4", + "@babel/plugin-transform-block-scoping": "^7.10.4", + "@babel/plugin-transform-classes": "^7.10.4", + "@babel/plugin-transform-computed-properties": "^7.10.4", + "@babel/plugin-transform-destructuring": "^7.10.4", + "@babel/plugin-transform-dotall-regex": "^7.10.4", + "@babel/plugin-transform-duplicate-keys": "^7.10.4", + "@babel/plugin-transform-exponentiation-operator": "^7.10.4", + "@babel/plugin-transform-for-of": "^7.10.4", + "@babel/plugin-transform-function-name": "^7.10.4", + "@babel/plugin-transform-literals": "^7.10.4", + "@babel/plugin-transform-member-expression-literals": "^7.10.4", + "@babel/plugin-transform-modules-amd": "^7.10.4", + "@babel/plugin-transform-modules-commonjs": "^7.10.4", + "@babel/plugin-transform-modules-systemjs": "^7.10.4", + "@babel/plugin-transform-modules-umd": "^7.10.4", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.10.4", + "@babel/plugin-transform-new-target": "^7.10.4", + "@babel/plugin-transform-object-super": "^7.10.4", + "@babel/plugin-transform-parameters": "^7.10.4", + "@babel/plugin-transform-property-literals": "^7.10.4", + "@babel/plugin-transform-regenerator": "^7.10.4", + "@babel/plugin-transform-reserved-words": "^7.10.4", + "@babel/plugin-transform-shorthand-properties": "^7.10.4", + "@babel/plugin-transform-spread": "^7.10.4", + "@babel/plugin-transform-sticky-regex": "^7.10.4", + "@babel/plugin-transform-template-literals": "^7.10.4", + "@babel/plugin-transform-typeof-symbol": "^7.10.4", + "@babel/plugin-transform-unicode-escapes": "^7.10.4", + "@babel/plugin-transform-unicode-regex": "^7.10.4", + "@babel/preset-modules": "^0.1.3", + "@babel/types": "^7.10.4", + "browserslist": "^4.12.0", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + }, + "dependencies": { + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-validator-identifier": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.4.tgz", + "integrity": "sha512-3U9y+43hz7ZM+rzG24Qe2mufW5KhvFg/NhnNph+i9mgCtdTCtMJuI1TMkrIUiK7Ix4PYlRF9I5dhqaLYA/ADXw==", + "dev": true + }, + "@babel/types": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.10.5.tgz", + "integrity": "sha512-ixV66KWfCI6GKoA/2H9v6bQdbfXEwwpOdQ8cRvb4F+eyvhlaHxWFMQB4+3d9QFJXZsiiiqVrewNV0DFEQpyT4Q==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "lodash": { + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.3.tgz", + "integrity": "sha512-Ra3JXOHBq2xd56xSF7lMKXdjBn3T772Y1Wet3yWnkDly9zHvJki029tAFzvAAK5cf4YV3yoxuP61crYRol6SVg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.10.5.tgz", + "integrity": "sha512-otddXKhdNn7d0ptoFRHtMLa8LqDxLYwTjB4nYgM1yy5N6gU/MUf8zqyyLltCH3yAVitBzmwK4us+DD0l/MauAg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/traverse": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.6.tgz", + "integrity": "sha512-b3rAHSjbxy6VEAvlxM8OV/0X4XrG72zoxme6q1MOoe2vd0bEc+TwayhuC1+Dfgqh1QEG+pj7atQqvUprHIccsg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.9.6", + "@babel/helper-function-name": "^7.9.5", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/parser": "^7.9.6", + "@babel/types": "^7.9.6", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.13" + } + }, + "@babel/types": { + "version": "7.9.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.6.tgz", + "integrity": "sha512-qxXzvBO//jO9ZnoasKF1uJzHd2+M6Q2ZPIVfnFps8JJvXy0ZBbwbNOmE6SGIY5XOY6d1Bo5lb9d9RJ8nv3WSeA==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.9.5", + "lodash": "^4.17.13", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", "dev": true }, - "@f/is-svg": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@f/is-svg/-/is-svg-1.0.0.tgz", - "integrity": "sha1-Q0fYy1VBkl+F9WMXSMwx3GRQ70Y=", + "@dannycoates/elliptic": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/@dannycoates/elliptic/-/elliptic-6.4.2.tgz", + "integrity": "sha512-2G4qWMB2SRBk4H75d+BFBbz2b1cseIYCI8G7duGxtxdnjGxhewpripDsVr1lCagmijyYX4zDyfKTNoId5GGyow==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + } + }, + "@dannycoates/express-ws": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@dannycoates/express-ws/-/express-ws-5.0.3.tgz", + "integrity": "sha512-EvHGP+NU2GVeQQDzlJRclN86UxxGJP5er4v8ojVn55cu7zhLLXZ5/QQJu0RcIzh4WHMjgYEE7/bKCohVK946og==", + "requires": { + "esm": "^3.0.84", + "ws": "^7.1.1" + } + }, + "@dannycoates/webcrypto-liner": { + "version": "0.1.37", + "resolved": "https://registry.npmjs.org/@dannycoates/webcrypto-liner/-/webcrypto-liner-0.1.37.tgz", + "integrity": "sha512-EM29TDkn7GJaa/oOfLeS1vrAxEkyM+WfUsmHTz7OyrxvMZNqz2SiYdZkXBIvg+QCnKTfXc2x//ORAilesugQlg==", + "dev": true, + "requires": { + "@dannycoates/elliptic": "^6.4.2", + "asmcrypto.js": "^0.22.0", + "webcrypto-core": "github:dannycoates/webcrypto-core" + } + }, + "@fluent/bundle": { + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fluent/bundle/-/bundle-0.13.0.tgz", + "integrity": "sha512-Q3XQSoeCvptsWXdu4H3pJZLp45FX8JnhQ7A9OV9w6dU+czKJnuKJkC5xLv19N0OG/NRnVFKqhcQBrx+IWAk09g==" + }, + "@fluent/langneg": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@fluent/langneg/-/langneg-0.3.0.tgz", + "integrity": "sha512-ppMMw+xi4ma45P2Nyf0sfnzIxrCswTgy0SBvPeZ8LB0sD0Gj403ZYYJTg06MmAcQITXXku3fGIpt/u1k5Zq1tA==" + }, + "@fullhuman/postcss-purgecss": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-1.3.0.tgz", + "integrity": "sha512-zvfS3dPKD2FAtMcXapMJXGbDgEp9E++mLR6lTgSruv6y37uvV5xJ1crVktuC1gvnmMwsa7Zh1m05FeEiz4VnIQ==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "purgecss": "^1.4.0" + } + }, + "@google-cloud/common": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-3.3.2.tgz", + "integrity": "sha512-W7JRLBEJWYtZQQuGQX06U6GBOSLrSrlvZxv6kGNwJtFrusu6AVgZltQ9Pajuz9Dh9aSXy9aTnBcyxn2/O0EGUw==", + "requires": { + "@google-cloud/projectify": "^2.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.1", + "duplexify": "^4.1.1", + "ent": "^2.2.0", + "extend": "^3.0.2", + "google-auth-library": "^6.0.0", + "retry-request": "^4.1.1", + "teeny-request": "^7.0.0" + }, + "dependencies": { + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + } + } + }, + "@google-cloud/paginator": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@google-cloud/paginator/-/paginator-3.0.3.tgz", + "integrity": "sha512-bu9AUf6TvDOtA6z5Su+kRLmMTNEA23QFjr41lH/7UpcEjGoLmXxEiJIU1hwfiiBi9c6IrgtpTsA89Zy7gjxw3w==", + "requires": { + "arrify": "^2.0.0", + "extend": "^3.0.2" + } + }, + "@google-cloud/projectify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@google-cloud/projectify/-/projectify-2.0.1.tgz", + "integrity": "sha512-ZDG38U/Yy6Zr21LaR3BTiiLtpJl6RkPS/JwoRT453G+6Q1DhlV0waNf8Lfu+YVYGIIxgKnLayJRfYlFJfiI8iQ==" + }, + "@google-cloud/promisify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@google-cloud/promisify/-/promisify-2.0.2.tgz", + "integrity": "sha512-EvuabjzzZ9E2+OaYf+7P9OAiiwbTxKYL0oGLnREQd+Su2NTQBpomkdlkBowFvyWsaV0d1sSGxrKpSNcrhPqbxg==" + }, + "@google-cloud/storage": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/@google-cloud/storage/-/storage-5.1.2.tgz", + "integrity": "sha512-j2blsBVv6Tt5Z7ff6kOSIg5zVQPdlcTQh/4zMb9h7xMj4ekwndQA60le8c1KEa+Y6SR3EM6ER2AvKYK53P7vdQ==", + "requires": { + "@google-cloud/common": "^3.0.0", + "@google-cloud/paginator": "^3.0.0", + "@google-cloud/promisify": "^2.0.0", + "arrify": "^2.0.0", + "compressible": "^2.0.12", + "concat-stream": "^2.0.0", + "date-and-time": "^0.13.0", + "duplexify": "^3.5.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "gcs-resumable-upload": "^3.0.0", + "hash-stream-validation": "^0.2.2", + "mime": "^2.2.0", + "mime-types": "^2.0.8", + "onetime": "^5.1.0", + "p-limit": "^3.0.1", + "pumpify": "^2.0.0", + "readable-stream": "^3.4.0", + "snakeize": "^0.1.0", + "stream-events": "^1.0.1", + "through2": "^4.0.0", + "xdg-basedir": "^4.0.0" + }, + "dependencies": { + "p-limit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.0.2.tgz", + "integrity": "sha512-iwqZSOoWIW+Ew4kAGUlN16J4M7OB3ysMLSZtnhmqx7njIHFPlxWBX8xo3lVTyFVq6mI/lL9qt2IsN1sHwaxJkg==", + "requires": { + "p-try": "^2.0.0" + } + } + } + }, + "@mattiasbuelens/web-streams-polyfill": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/@mattiasbuelens/web-streams-polyfill/-/web-streams-polyfill-0.2.1.tgz", + "integrity": "sha512-oKuFCQFa3W7Hj7zKn0+4ypI8JFm4ZKIoncwAC6wd5WwFW2sL7O1hpPoJdSWpynQ4DJ4lQ6MvFoVDmCLilonDFg==", "dev": true, "requires": { - "@f/has": "1.0.1", - "@f/svg-elements": "1.0.1" + "@types/whatwg-streams": "^0.0.7" } }, - "@f/svg-elements": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@f/svg-elements/-/svg-elements-1.0.1.tgz", - "integrity": "sha1-qNMKizODbJiISNKOs8RgXZI1gd0=", - "dev": true - }, - "@f/svg-namespace": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@f/svg-namespace/-/svg-namespace-1.0.1.tgz", - "integrity": "sha1-9vGlzl05caSt6RoR0i1MRZrNN18=", - "dev": true - }, - "JSONStream": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", - "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", + "@mrmlnc/readdir-enhanced": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz", + "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==", "dev": true, "requires": { - "jsonparse": "0.0.5", - "through": "2.3.8" + "call-me-maybe": "^1.0.1", + "glob-to-regexp": "^0.3.0" } }, - "accepts": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", - "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "@nodelib/fs.scandir": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.3.tgz", + "integrity": "sha512-eGmwYQn3gxo4r7jdQnkrrN6bY478C3P+a/y72IJukF8LjB6ZHeB3c+Ehacj3sYeSmUXGlnA67/PmbM9CVwL7Dw==", + "dev": true, "requires": { - "mime-types": "2.1.17", - "negotiator": "0.6.1" + "@nodelib/fs.stat": "2.0.3", + "run-parallel": "^1.1.9" } }, - "acorn": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.2.1.tgz", - "integrity": "sha512-jG0u7c4Ly+3QkkW18V+NRDN+4bWHdln30NL1ZL2AvFZZmQe/BfopYCtghCKKVBUSetZ4QKcyA0pY6/4Gw8Pv8w==", + "@nodelib/fs.stat": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.3.tgz", + "integrity": "sha512-bQBFruR2TAwoevBEd/NWMoAAtNGzTRgdrqnYCc7dhzfoNvqPzLyqlEQnzZ3kVnNrSp25iyxE00/3h2fqGAGArA==", "dev": true }, - "acorn-dynamic-import": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-2.0.2.tgz", - "integrity": "sha1-x1K9IQvvZ5UBtsbLf8hPj0cVjMQ=", + "@nodelib/fs.walk": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.4.tgz", + "integrity": "sha512-1V9XOY4rDW0rehzbrcqAmHnz8e7SKvX27gh8Gt2WgB0+pdzdiLV83p72kZPU+jvMbS1qU5mauP2iOvO8rhmurQ==", "dev": true, "requires": { - "acorn": "4.0.13" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "@nodelib/fs.scandir": "2.1.3", + "fastq": "^1.6.0" } }, - "acorn-jsx": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", - "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", - "dev": true, + "@peculiar/asn1-schema": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@peculiar/asn1-schema/-/asn1-schema-2.0.5.tgz", + "integrity": "sha512-VIKJjsgMkv+yyWx3C+D4xo6/NeCg0XFBgNlavtkxELijV+aKAq53du5KkOJbeZtm1nn9CinQKny2PqL8zCfpeA==", + "requires": { + "@types/asn1js": "^0.0.1", + "asn1js": "^2.0.26", + "pvtsutils": "^1.0.10", + "tslib": "^1.11.1" + } + }, + "@peculiar/json-schema": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/@peculiar/json-schema/-/json-schema-1.1.10.tgz", + "integrity": "sha512-kbpnG9CkF1y6wwGkW7YtSA+yYK4X5uk4rAwsd1hxiaYE3Hkw2EsGlbGh/COkMLyFf+Fe830BoFiMSB3QnC/ItA==", "requires": { - "acorn": "3.3.0" + "tslib": "^1.11.1" + } + }, + "@peculiar/webcrypto": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@peculiar/webcrypto/-/webcrypto-1.1.1.tgz", + "integrity": "sha512-Bu2XgOvzirnLcojZYs4KQ8hOLf2ETpa0NL6btQt5NgsAwctI6yVkzgYP+EcG7Mm579RBP+V0LM5rXyMlTVx23A==", + "requires": { + "@peculiar/asn1-schema": "^2.0.3", + "@peculiar/json-schema": "^1.1.10", + "pvtsutils": "^1.0.10", + "tslib": "^1.11.2", + "webcrypto-core": "^1.1.0" }, "dependencies": { - "acorn": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", - "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", - "dev": true + "tslib": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.13.0.tgz", + "integrity": "sha512-i/6DQjL8Xf3be4K/E6Wgpekn5Qasl1usyw++dAA35Ue5orEn65VIxOA+YvNNl9HV3qv70T7CNwjODHZrLwvd1Q==" + }, + "webcrypto-core": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/webcrypto-core/-/webcrypto-core-1.1.2.tgz", + "integrity": "sha512-LxM/dTcXr/ZnwwKLox0tGEOIqvP7KIJ4Hk/fFPX20tr1EgqTmpEFZinmu4FzoGVbs6e4jI1priQKCDrOBD3L6w==", + "requires": { + "@peculiar/asn1-schema": "^2.0.1", + "@peculiar/json-schema": "^1.1.10", + "asn1js": "^2.0.26", + "pvtsutils": "^1.0.10", + "tslib": "^1.11.2" + } } } }, - "ajv": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.0.tgz", - "integrity": "sha1-6yhAdG6dxIvV4GOjbj/UAMXqtak=", + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", "dev": true, "requires": { - "co": "4.6.0", - "fast-deep-equal": "1.0.0", - "fast-json-stable-stringify": "2.0.0", - "json-schema-traverse": "0.3.1" + "any-observable": "^0.3.0" } }, - "ajv-keywords": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", - "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", - "dev": true + "@sentry/apm": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/apm/-/apm-5.20.1.tgz", + "integrity": "sha512-oqfyYqRR1CaM/U5qZg3KY9MxCe4OWYs3uiOvVGMOHCyx50dYsDZziM5DDVUvi6pOuokLCNbyXO9xGROSmploBQ==", + "requires": { + "@sentry/browser": "5.20.1", + "@sentry/hub": "5.20.1", + "@sentry/minimal": "5.20.1", + "@sentry/types": "5.20.1", + "@sentry/utils": "5.20.1", + "tslib": "^1.9.3" + } }, - "align-text": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", - "dev": true, + "@sentry/browser": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-5.20.1.tgz", + "integrity": "sha512-ClykuvrEsMKgAvifx5VHzRjchwYbJFX8YiIicYx+Wr3MXL2jLG6OEfHHJwJeyBL2C3vxd5O0KPK3pGMR9wPMLA==", "requires": { - "kind-of": "3.2.2", - "longest": "1.0.1", - "repeat-string": "1.6.1" + "@sentry/core": "5.20.1", + "@sentry/types": "5.20.1", + "@sentry/utils": "5.20.1", + "tslib": "^1.9.3" } }, - "alphanum-sort": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", - "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", - "dev": true + "@sentry/core": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-5.20.1.tgz", + "integrity": "sha512-gG622/UY2TePruF6iUzgVrbIX5vN8w2cjlWFo1Est8MvCfQsz8agGaLMCAyl5hCGJ6K2qTUZDOlbCNIKoMclxg==", + "requires": { + "@sentry/hub": "5.20.1", + "@sentry/minimal": "5.20.1", + "@sentry/types": "5.20.1", + "@sentry/utils": "5.20.1", + "tslib": "^1.9.3" + } }, - "ansi-escapes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.0.0.tgz", - "integrity": "sha512-O/klc27mWNUigtv0F8NJWbLF00OcegQalkqKURWdosW08YZKi4m6CnSUSvIZG1otNJbTWhN01Hhz389DW7mvDQ==", - "dev": true + "@sentry/hub": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-5.20.1.tgz", + "integrity": "sha512-Nv5BXf14BEc08acDguW6eSqkAJLVf8wki283FczEvTsQZZuSBHM9cJ5Hnehr6n+mr8wWpYLgUUYM0oXXigUmzQ==", + "requires": { + "@sentry/types": "5.20.1", + "@sentry/utils": "5.20.1", + "tslib": "^1.9.3" + } }, - "ansi-html": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", - "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", - "dev": true + "@sentry/minimal": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-5.20.1.tgz", + "integrity": "sha512-2PeJKDTHNsUd1jtSLQBJ6oRI+xrIJrYDQmsyK/qs9D7HqHfs+zNAMUjYseiVeSAFGas5IcNSuZbPRV4BnuoZ0w==", + "requires": { + "@sentry/hub": "5.20.1", + "@sentry/types": "5.20.1", + "tslib": "^1.9.3" + } }, - "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "@sentry/node": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-5.20.1.tgz", + "integrity": "sha512-43YFDnD7Rv+vGHV+Fmb3LaSSWrFzsPmFRu3wmf9eYMgWiuDks6c6/kWRCgkqX9Np9ImC89wcTZs/V6S4MlOm4g==", + "requires": { + "@sentry/apm": "5.20.1", + "@sentry/core": "5.20.1", + "@sentry/hub": "5.20.1", + "@sentry/types": "5.20.1", + "@sentry/utils": "5.20.1", + "cookie": "^0.4.1", + "https-proxy-agent": "^5.0.0", + "lru_map": "^0.3.3", + "tslib": "^1.9.3" + } }, - "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + "@sentry/types": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-5.20.1.tgz", + "integrity": "sha512-OU+i/lcjGpDJv0XkNpsKrI2r1VPp8qX0H6Knq8NuZrlZe3AbvO3jRJJK0pH14xFv8Xok5jbZZpKKoQLxYfxqsw==" }, - "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", - "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", - "dev": true, + "@sentry/utils": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-5.20.1.tgz", + "integrity": "sha512-dhK6IdO6g7Q2CoxCbB+q8gwUapDUH5VjraFg0UBzgkrtNhtHLylqmwx0sWQvXCcp14Q/3MuzEbb4euvoh8o8oA==", "requires": { - "micromatch": "2.3.11", - "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, - "requires": { - "remove-trailing-separator": "1.1.0" - } - } + "@sentry/types": "5.20.1", + "tslib": "^1.9.3" } }, - "app-root-path": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.0.1.tgz", - "integrity": "sha1-zWLc+OT9WkF+/GZNLlsQZTxlG0Y=", - "dev": true - }, - "application-config": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/application-config/-/application-config-0.1.2.tgz", - "integrity": "sha1-MnJTO1+fg7MjqeXWQKNVi1Cls4U=", + "@sinonjs/commons": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.2.tgz", + "integrity": "sha512-+DUO6pnp3udV/v2VfUWgaY5BIE1IfT7lLfeDzPVeMT1XKkaAp9LgSI9x5RtrFQoZ9Oi0PgXQQHPaoKu7dCjVxw==", "dev": true, "requires": { - "application-config-path": "0.1.0", - "mkdirp": "0.5.1" + "type-detect": "4.0.8" } }, - "application-config-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/application-config-path/-/application-config-path-0.1.0.tgz", - "integrity": "sha1-GTxfCoZUGkxm+6Hi3DhYM2LqXo8=", - "dev": true - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", - "dev": true - }, - "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "@sinonjs/formatio": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/@sinonjs/formatio/-/formatio-3.2.2.tgz", + "integrity": "sha512-B8SEsgd8gArBLMD6zpRw3juQ2FVSsmdd7qlevyDqzS9WTCtvF55/gAL+h6gue8ZvPYcdiPdvueM/qm//9XzyTQ==", "dev": true, "requires": { - "sprintf-js": "1.0.3" + "@sinonjs/commons": "^1", + "@sinonjs/samsam": "^3.1.0" } }, - "arr-diff": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", - "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "@sinonjs/samsam": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/@sinonjs/samsam/-/samsam-3.3.3.tgz", + "integrity": "sha512-bKCMKZvWIjYD0BLGnNrxVuw4dkWCYsLqFOUWw8VgKF/+5Y+mE7LfHWPIYoDXowH+3a9LsWDMo0uAP8YDosPvHQ==", "dev": true, "requires": { - "arr-flatten": "1.1.0" + "@sinonjs/commons": "^1.3.0", + "array-from": "^2.1.1", + "lodash": "^4.17.15" } }, - "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==", + "@sinonjs/text-encoding": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.1.tgz", + "integrity": "sha512-+iTbntw2IZPb/anVDbypzfQa+ay64MW0Zo8aJ8gZPWMMK6/OubMVb6lUPMagqjOPnmtauXnFCACVl3O7ogjeqQ==", "dev": true }, - "array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", - "dev": true + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==" }, - "array-filter": { + "@types/asn1js": { "version": "0.0.1", - "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", - "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", - "dev": true + "resolved": "https://registry.npmjs.org/@types/asn1js/-/asn1js-0.0.1.tgz", + "integrity": "sha1-74uflwjLFjKhw6nNJ3F8qr55O8I=", + "requires": { + "@types/pvutils": "*" + } }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "@types/color-name": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@types/color-name/-/color-name-1.1.1.tgz", + "integrity": "sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==", "dev": true }, - "array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" + "@types/events": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", + "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", + "dev": true }, - "array-includes": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", - "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", + "@types/glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", + "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", "dev": true, "requires": { - "define-properties": "1.1.2", - "es-abstract": "1.10.0" + "@types/events": "*", + "@types/minimatch": "*", + "@types/node": "*" } }, - "array-iterate": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-iterate/-/array-iterate-1.1.1.tgz", - "integrity": "sha1-hlv3+K851rCYLGCQKRSsdrwBCPY=", + "@types/mime-types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/mime-types/-/mime-types-2.1.0.tgz", + "integrity": "sha1-nKUs2jY/aZxpRmwqbM2q2RPqenM=", "dev": true }, - "array-map": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", - "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "@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 }, - "array-reduce": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", - "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "@types/node": { + "version": "13.13.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.4.tgz", + "integrity": "sha512-x26ur3dSXgv5AwKS0lNfbjpCakGIduWU1DU91Zz58ONRWrIKGunmZBNv4P7N+e27sJkiGDsw/3fT4AtsqQBrBA==", "dev": true }, - "array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", - "dev": true, - "requires": { - "array-uniq": "1.0.3" - } - }, - "array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "@types/normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", "dev": true }, - "array-unique": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", - "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", - "dev": true + "@types/pvutils": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/@types/pvutils/-/pvutils-0.0.2.tgz", + "integrity": "sha512-CgQAm7pjyeF3Gnv78ty4RBVIfluB+Td+2DR8iPaU0prF18pkzptHHP+DoKPfpsJYknKsVZyVsJEu5AuGgAqQ5w==" }, - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "@types/q": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz", + "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==", "dev": true }, - "asn1": { - "version": "0.1.11", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", - "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=", + "@types/unist": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.3.tgz", + "integrity": "sha512-FvUupuM3rlRsRtCN+fDudtmytGO6iHJuuRKS1Ss0pG5z8oX0diNEw94UEL7hgDbpN94rgaK5R7sWm6RrSkZuAQ==", "dev": true }, - "asn1.js": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.9.2.tgz", - "integrity": "sha512-b/OsSjvWEo8Pi8H0zsDd2P6Uqo2TK2pH8gNLSJtNLM2Db0v2QaAZ0pBQJXVjAn4gBuugeVDr7s63ZogpUIwWDg==", + "@types/vfile": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/vfile/-/vfile-3.0.2.tgz", + "integrity": "sha512-b3nLFGaGkJ9rzOcuXRfHkZMdjsawuDD0ENL9fzTophtBg8FJHSGbH7daXkEpcwy3v7Xol3pAvsmlYyFhR4pqJw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "@types/node": "*", + "@types/unist": "*", + "@types/vfile-message": "*" } }, - "assert": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz", - "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=", + "@types/vfile-message": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@types/vfile-message/-/vfile-message-2.0.0.tgz", + "integrity": "sha512-GpTIuDpb9u4zIO165fUy9+fXcULdD8HFRNli04GehoMVbeNq7D6OBnqSmg3lxZnC+UvgUhEWKxdKiwYUkGltIw==", "dev": true, "requires": { - "util": "0.10.3" + "vfile-message": "*" } }, - "assert-plus": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", - "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", - "dev": true - }, - "ast-types": { - "version": "0.9.6", - "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", - "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", - "dev": true - }, - "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.1", - "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", - "dev": true - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "@types/whatwg-streams": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@types/whatwg-streams/-/whatwg-streams-0.0.7.tgz", + "integrity": "sha512-6sDiSEP6DWcY2ZolsJ2s39ZmsoGQ7KVwBDI3sESQsEm9P2dHTcqnDIHRZFRNtLCzWp7hCFGqYbw5GyfpQnJ01A==", "dev": true }, - "autoprefixer": { - "version": "7.2.5", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-7.2.5.tgz", - "integrity": "sha512-XqHfo8Ht0VU+T5P+eWEVoXza456KJ4l62BPewu3vpNf3LP9s2+zYXkXBznzYby4XeECXgG3N4i+hGvOhXErZmA==", + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", "dev": true, "requires": { - "browserslist": "2.11.3", - "caniuse-lite": "1.0.30000792", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "6.0.17", - "postcss-value-parser": "3.3.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==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "browserslist": { - "version": "2.11.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.11.3.tgz", - "integrity": "sha512-yWu5cXT7Av6mVwzWc8lMsJMHWn4xyjSuGYi4IozbVTLUOEYPSagUB8kiMDUHA1fS3zjr8nkxkn9jdvug4BBRmA==", - "dev": true, - "requires": { - "caniuse-lite": "1.0.30000792", - "electron-to-chromium": "1.3.32" - } - }, - "caniuse-lite": { - "version": "1.0.30000792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz", - "integrity": "sha1-0M6pgfgRjzlhRxr7tDyaHlu/AzI=", - "dev": true - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "electron-to-chromium": { - "version": "1.3.32", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.32.tgz", - "integrity": "sha1-EdBoTAhA4APEvoko+KxfNdvCtOY=", - "dev": true - }, - "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" } }, - "aws-sdk": { - "version": "2.189.0", - "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.189.0.tgz", - "integrity": "sha1-TfZJuM+iAI/uCfNX/jqYNUZcTaQ=", - "requires": { - "buffer": "4.9.1", - "events": "1.1.1", - "jmespath": "0.15.0", - "querystring": "0.2.0", - "sax": "1.2.1", - "url": "0.10.3", - "uuid": "3.1.0", - "xml2js": "0.4.17", - "xmlbuilder": "4.2.1" - } + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true }, - "aws-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/aws-sign/-/aws-sign-0.3.0.tgz", - "integrity": "sha1-PYHKabR0seFlGHKLUcJP8Lvtxuk=", + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", "dev": true }, - "babel-code-frame": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", - "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", "dev": true, "requires": { - "chalk": "1.1.3", - "esutils": "2.0.2", - "js-tokens": "3.0.2" + "@webassemblyjs/wast-printer": "1.8.5" } }, - "babel-core": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", - "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "babel-generator": "6.26.0", - "babel-helpers": "6.24.1", - "babel-messages": "6.23.0", - "babel-register": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "convert-source-map": "1.5.1", - "debug": "2.6.9", - "json5": "0.5.1", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "path-is-absolute": "1.0.1", - "private": "0.1.8", - "slash": "1.0.0", - "source-map": "0.5.7" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } - } + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true }, - "babel-generator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.0.tgz", - "integrity": "sha1-rBriAHC3n248odMmlhMFN3TyDcU=", + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", "dev": true, "requires": { - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "detect-indent": "4.0.0", - "jsesc": "1.3.0", - "lodash": "4.17.4", - "source-map": "0.5.7", - "trim-right": "1.0.1" - }, - "dependencies": { - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - } + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" } }, - "babel-helper-bindify-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-bindify-decorators/-/babel-helper-bindify-decorators-6.24.1.tgz", - "integrity": "sha1-FMGeXxQte0fxmlJDHlKxzLxAozA=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true }, - "babel-helper-builder-binary-assignment-operator-visitor": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz", - "integrity": "sha1-zORReto1b0IgvK6KAsKzRvmlZmQ=", + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", "dev": true, "requires": { - "babel-helper-explode-assignable-expression": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" } }, - "babel-helper-call-delegate": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", - "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", "dev": true, "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "@xtuc/ieee754": "^1.2.0" } }, - "babel-helper-define-map": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", - "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "@xtuc/long": "4.2.2" } }, - "babel-helper-explode-assignable-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz", - "integrity": "sha1-8luCz33BBDPFX3BZLVdGQArCLKo=", + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" } }, - "babel-helper-explode-class": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-explode-class/-/babel-helper-explode-class-6.24.1.tgz", - "integrity": "sha1-fcKjkQ3uAHBW4eMdZAztPVTqqes=", + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", "dev": true, "requires": { - "babel-helper-bindify-decorators": "6.24.1", - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, - "babel-helper-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", - "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", "dev": true, "requires": { - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" } }, - "babel-helper-get-function-arity": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", - "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" } }, - "babel-helper-hoist-variables": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", - "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "babel-helper-optimise-call-expression": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", - "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" } }, - "babel-helper-regex": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", - "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true + }, + "@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true + }, + "JSONStream": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.4.tgz", + "integrity": "sha1-kWV9/m/4V0gwZhMrRhi2Lo9Ih70=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" + "jsonparse": "0.0.5", + "through": ">=2.2.7 <3" } }, - "babel-helper-remap-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz", - "integrity": "sha1-XsWBgnrXI/7N04HxySg5BnbkVRs=", - "dev": true, + "abort-controller": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz", + "integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==", "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "event-target-shim": "^5.0.0" } }, - "babel-helper-replace-supers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", - "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", - "dev": true, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", "requires": { - "babel-helper-optimise-call-expression": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "mime-types": "~2.1.24", + "negotiator": "0.6.2" } }, - "babel-helpers": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", - "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", - "dev": true, + "acorn": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==" + }, + "acorn-jsx": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.2.0.tgz", + "integrity": "sha512-HiUX/+K2YpkpJ+SzBffkM/AQ2YE03S0U1kjTLVpoJdhZMOWy8qvXVN9JdLqv2QsaQ6MPYQIuNmwD8zOiYUofLQ==", + "dev": true + }, + "acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" } }, - "babel-loader": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.2.tgz", - "integrity": "sha512-jRwlFbINAeyDStqK6Dd5YuY0k5YuzQUvlz2ZamuXrXmxav3pNqe9vfJ402+2G+OmlJSXxCOpB6Uz0INM7RQe2A==", - "dev": true, + "acorn-walk": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.1.1.tgz", + "integrity": "sha512-wdlPY2tm/9XBr7QkKlq0WQVgiuGTX6YWPyRyBviSoScBuLfTVQhvwg6wJ369GJ/1nPfTLMfnrFIfjqVg6d+jQQ==" + }, + "agent-base": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.1.tgz", + "integrity": "sha512-01q25QQDwLSsyfhrKbn8yuur+JNw0H+0Y4JiGIKd3z9aYk/w/2kxD/Upc+t2ZBBSUNff50VjPsSW2YxM8QYKVg==", "requires": { - "find-cache-dir": "1.0.0", - "loader-utils": "1.1.0", - "mkdirp": "0.5.1" + "debug": "4" } }, - "babel-messages": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", - "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "aggregate-error": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", + "integrity": "sha512-quoaXsZ9/BLNae5yiNoUz+Nhkwz83GhWwtYFglcjEQB2NDHCIpApbqXxIFnm4Pq/Nvhrsq5sYJFyohrrxnTGAA==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" } }, - "babel-plugin-check-es2015-constants": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", - "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", - "dev": true, + "ajv": { + "version": "6.12.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz", + "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==", "requires": { - "babel-runtime": "6.26.0" + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" } }, - "babel-plugin-syntax-async-functions": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz", - "integrity": "sha1-ytnK0RkbWtY0vzCuCHI5HgZHvpU=", + "ajv-errors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz", + "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==", "dev": true }, - "babel-plugin-syntax-async-generators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-async-generators/-/babel-plugin-syntax-async-generators-6.13.0.tgz", - "integrity": "sha1-a8lj67FuzLrmuStZbrfzXDQqi5o=", + "ajv-keywords": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.4.1.tgz", + "integrity": "sha512-RO1ibKvd27e6FEShVFfPALuHI3WjSVNeK5FIsmme/LYRNxjKuNj+Dt7bucLa6NdSv3JcVTyMlm9kGR84z1XpaQ==", "dev": true }, - "babel-plugin-syntax-class-properties": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz", - "integrity": "sha1-1+sjt5oxf4VDlixQW4J8fWysJ94=", + "alphanum-sort": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz", + "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=", "dev": true }, - "babel-plugin-syntax-decorators": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", - "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=", + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", "dev": true }, - "babel-plugin-syntax-dynamic-import": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-dynamic-import/-/babel-plugin-syntax-dynamic-import-6.18.0.tgz", - "integrity": "sha1-jWomIpyDdFqZgqRBBRVyyqF5sdo=", - "dev": true + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + }, + "dependencies": { + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + } + } }, - "babel-plugin-syntax-exponentiation-operator": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz", - "integrity": "sha1-nufoM3KQ2pUoggGmpX9BcDF4MN4=", + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", "dev": true }, - "babel-plugin-syntax-object-rest-spread": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz", - "integrity": "sha1-/WU28rzhODb/o6VFjEkDpZe7O/U=", - "dev": true + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" }, - "babel-plugin-syntax-trailing-function-commas": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz", - "integrity": "sha1-ugNgk3+NBuQBgKQ/4NVhb/9TLPM=", - "dev": true + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" }, - "babel-plugin-transform-async-generator-functions": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-generator-functions/-/babel-plugin-transform-async-generator-functions-6.24.1.tgz", - "integrity": "sha1-8FiQAUX9PpkHpt3yjaWfIVJYpds=", - "dev": true, - "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-generators": "6.13.0", - "babel-runtime": "6.26.0" - } + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true }, - "babel-plugin-transform-async-to-generator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz", - "integrity": "sha1-ZTbjeK/2yx1VF6wOQOs+n8jQh2E=", + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", "dev": true, "requires": { - "babel-helper-remap-async-to-generator": "6.24.1", - "babel-plugin-syntax-async-functions": "6.13.0", - "babel-runtime": "6.26.0" + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, - "babel-plugin-transform-class-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz", - "integrity": "sha1-anl2PqYdM9NvN7YRqp3vgagbRqw=", + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", "dev": true, "requires": { - "babel-helper-function-name": "6.24.1", - "babel-plugin-syntax-class-properties": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" + "default-require-extensions": "^2.0.0" } }, - "babel-plugin-transform-decorators": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators/-/babel-plugin-transform-decorators-6.24.1.tgz", - "integrity": "sha1-eIAT2PjGtSIr33s0Q5Df13Vp4k0=", - "dev": true, - "requires": { - "babel-helper-explode-class": "6.24.1", - "babel-plugin-syntax-decorators": "6.13.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==", + "dev": true }, - "babel-plugin-transform-es2015-arrow-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", - "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true }, - "babel-plugin-transform-es2015-block-scoped-functions": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", - "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "sprintf-js": "~1.0.2" } }, - "babel-plugin-transform-es2015-block-scoping": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", - "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "lodash": "4.17.4" - } + "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 }, - "babel-plugin-transform-es2015-classes": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", - "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", - "dev": true, - "requires": { - "babel-helper-define-map": "6.26.0", - "babel-helper-function-name": "6.24.1", - "babel-helper-optimise-call-expression": "6.24.1", - "babel-helper-replace-supers": "6.24.1", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" - } + "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 }, - "babel-plugin-transform-es2015-computed-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", - "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "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 }, - "babel-plugin-transform-es2015-destructuring": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", - "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true }, - "babel-plugin-transform-es2015-duplicate-keys": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", - "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true }, - "babel-plugin-transform-es2015-for-of": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", - "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" }, - "babel-plugin-transform-es2015-function-name": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", - "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", - "dev": true, - "requires": { - "babel-helper-function-name": "6.24.1", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "array-from": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/array-from/-/array-from-2.1.1.tgz", + "integrity": "sha1-z+nYwmYoudxa7MYqn12PHzUsEZU=", + "dev": true }, - "babel-plugin-transform-es2015-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", - "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "array-uniq": "^1.0.1" } }, - "babel-plugin-transform-es2015-modules-amd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", - "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true }, - "babel-plugin-transform-es2015-modules-commonjs": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", - "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", - "dev": true, - "requires": { - "babel-plugin-transform-strict-mode": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-types": "6.26.0" - } + "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 }, - "babel-plugin-transform-es2015-modules-systemjs": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", - "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", - "dev": true, - "requires": { - "babel-helper-hoist-variables": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "arrify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", + "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==" }, - "babel-plugin-transform-es2015-modules-umd": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", - "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", - "dev": true, - "requires": { - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0" - } + "asmcrypto.js": { + "version": "0.22.0", + "resolved": "https://registry.npmjs.org/asmcrypto.js/-/asmcrypto.js-0.22.0.tgz", + "integrity": "sha512-usgMoyXjMbx/ZPdzTSXExhMPur2FTdz/Vo5PVx2gIaBcdAAJNOFlsdgqveM8Cff7W0v+xrf9BwjOV26JSAF9qA==", + "dev": true }, - "babel-plugin-transform-es2015-object-super": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", - "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", - "dev": true, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", "requires": { - "babel-helper-replace-supers": "6.24.1", - "babel-runtime": "6.26.0" + "safer-buffer": "~2.1.0" } }, - "babel-plugin-transform-es2015-parameters": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", - "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "asn1.js": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz", + "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==", "dev": true, "requires": { - "babel-helper-call-delegate": "6.24.1", - "babel-helper-get-function-arity": "6.24.1", - "babel-runtime": "6.26.0", - "babel-template": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0" + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, - "babel-plugin-transform-es2015-shorthand-properties": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", - "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", - "dev": true, + "asn1js": { + "version": "2.0.26", + "resolved": "https://registry.npmjs.org/asn1js/-/asn1js-2.0.26.tgz", + "integrity": "sha512-yG89F0j9B4B0MKIcFyWWxnpZPLaNTjCj4tkE3fjbAoo0qmpGw0PYYqSbX/4ebnd9Icn8ZgK4K1fvDyEtW1JYtQ==", "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" + "pvutils": "^1.0.17" } }, - "babel-plugin-transform-es2015-spread": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", - "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", "dev": true, "requires": { - "babel-runtime": "6.26.0" + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } } }, - "babel-plugin-transform-es2015-sticky-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", - "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" }, - "babel-plugin-transform-es2015-template-literals": { - "version": "6.22.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", - "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "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 }, - "babel-plugin-transform-es2015-typeof-symbol": { - "version": "6.23.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", - "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0" - } + "ast-types": { + "version": "0.9.6", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz", + "integrity": "sha1-ECyenpAF0+fjgpvwxPok7oYu6bk=", + "dev": true }, - "babel-plugin-transform-es2015-unicode-regex": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", - "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", - "dev": true, - "requires": { - "babel-helper-regex": "6.26.0", - "babel-runtime": "6.26.0", - "regexpu-core": "2.0.0" - } + "astral-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", + "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", + "dev": true }, - "babel-plugin-transform-exponentiation-operator": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz", - "integrity": "sha1-KrDJx/MJj6SJB3cruBP+QejeOg4=", - "dev": true, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", "requires": { - "babel-helper-builder-binary-assignment-operator-visitor": "6.24.1", - "babel-plugin-syntax-exponentiation-operator": "6.13.0", - "babel-runtime": "6.26.0" + "lodash": "^4.17.14" } }, - "babel-plugin-transform-object-rest-spread": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz", - "integrity": "sha1-DzZpLVD+9rfi1LOsFHgTepY7ewY=", - "dev": true, - "requires": { - "babel-plugin-syntax-object-rest-spread": "6.13.0", - "babel-runtime": "6.26.0" - } + "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 }, - "babel-plugin-transform-regenerator": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", - "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", - "dev": true, - "requires": { - "regenerator-transform": "0.10.1" - } + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true }, - "babel-plugin-transform-strict-mode": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", - "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0" - } + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" }, - "babel-plugin-yo-yoify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/babel-plugin-yo-yoify/-/babel-plugin-yo-yoify-1.0.2.tgz", - "integrity": "sha512-M2aJCgNknRGpwju5sEXeauAsb4Ior4zgwq8EbUigqEU1B4UETa1ySs64nZff9F2BNddzZ2c7h4ypGrck0ppmSA==", - "dev": true, - "requires": { - "@f/is-svg": "1.0.0", - "@f/svg-namespace": "1.0.1", - "camel-case": "3.0.0", - "hyperx": "2.3.2", - "is-boolean-attribute": "0.0.1", - "normalize-html-whitespace": "0.2.0", - "yo-yoify": "4.2.0" - } + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true }, - "babel-polyfill": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", - "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", - "dev": true, - "requires": { - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "regenerator-runtime": "0.10.5" + "autoprefixer": { + "version": "9.7.6", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.7.6.tgz", + "integrity": "sha512-F7cYpbN7uVVhACZTeeIeealwdGM6wMtfWARVLTy5xmKtgVdBNJvbDRoCK3YO1orcs7gv/KwYlb3iXwu9Ug9BkQ==", + "dev": true, + "requires": { + "browserslist": "^4.11.1", + "caniuse-lite": "^1.0.30001039", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.27", + "postcss-value-parser": "^4.0.3" }, "dependencies": { - "regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=", - "dev": true + "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" + } + }, + "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" + } } } }, - "babel-preset-env": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.6.1.tgz", - "integrity": "sha512-W6VIyA6Ch9ePMI7VptNn2wBM6dbG0eSz25HEiL40nQXCsXGTGZSTZu1Iap+cj3Q0S5a7T9+529l/5Bkvd+afNA==", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0", - "browserslist": "2.9.1", - "invariant": "2.2.2", - "semver": "5.4.1" - } - }, - "babel-preset-es2015": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", - "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", - "dev": true, - "requires": { - "babel-plugin-check-es2015-constants": "6.22.0", - "babel-plugin-transform-es2015-arrow-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", - "babel-plugin-transform-es2015-block-scoping": "6.26.0", - "babel-plugin-transform-es2015-classes": "6.24.1", - "babel-plugin-transform-es2015-computed-properties": "6.24.1", - "babel-plugin-transform-es2015-destructuring": "6.23.0", - "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", - "babel-plugin-transform-es2015-for-of": "6.23.0", - "babel-plugin-transform-es2015-function-name": "6.24.1", - "babel-plugin-transform-es2015-literals": "6.22.0", - "babel-plugin-transform-es2015-modules-amd": "6.24.1", - "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", - "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", - "babel-plugin-transform-es2015-modules-umd": "6.24.1", - "babel-plugin-transform-es2015-object-super": "6.24.1", - "babel-plugin-transform-es2015-parameters": "6.24.1", - "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", - "babel-plugin-transform-es2015-spread": "6.22.0", - "babel-plugin-transform-es2015-sticky-regex": "6.24.1", - "babel-plugin-transform-es2015-template-literals": "6.22.0", - "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", - "babel-plugin-transform-es2015-unicode-regex": "6.24.1", - "babel-plugin-transform-regenerator": "6.26.0" - } - }, - "babel-preset-stage-2": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-2/-/babel-preset-stage-2-6.24.1.tgz", - "integrity": "sha1-2eKWD7PXEYfw5k7sYrwHdnIZvcE=", - "dev": true, - "requires": { - "babel-plugin-syntax-dynamic-import": "6.18.0", - "babel-plugin-transform-class-properties": "6.24.1", - "babel-plugin-transform-decorators": "6.24.1", - "babel-preset-stage-3": "6.24.1" - } - }, - "babel-preset-stage-3": { - "version": "6.24.1", - "resolved": "https://registry.npmjs.org/babel-preset-stage-3/-/babel-preset-stage-3-6.24.1.tgz", - "integrity": "sha1-g2raCp56f6N8sTj7kyb4eTSkg5U=", - "dev": true, - "requires": { - "babel-plugin-syntax-trailing-function-commas": "6.22.0", - "babel-plugin-transform-async-generator-functions": "6.24.1", - "babel-plugin-transform-async-to-generator": "6.24.1", - "babel-plugin-transform-exponentiation-operator": "6.24.1", - "babel-plugin-transform-object-rest-spread": "6.26.0" - } - }, - "babel-register": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", - "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", - "dev": true, + "aws-sdk": { + "version": "2.666.0", + "resolved": "https://registry.npmjs.org/aws-sdk/-/aws-sdk-2.666.0.tgz", + "integrity": "sha512-m4m4eHs/F7SRW0OnvxRWyrAyqcQE7kyVnfwyrhA7P0w92FOmmu+tw6JKI5LZNVBsaj2VBAfPn72V6nWzP3IIlw==", "requires": { - "babel-core": "6.26.0", - "babel-runtime": "6.26.0", - "core-js": "2.5.1", - "home-or-tmp": "2.0.0", - "lodash": "4.17.4", - "mkdirp": "0.5.1", - "source-map-support": "0.4.18" + "buffer": "4.9.1", + "events": "1.1.1", + "ieee754": "1.1.13", + "jmespath": "0.15.0", + "querystring": "0.2.0", + "sax": "1.2.1", + "url": "0.10.3", + "uuid": "3.3.2", + "xml2js": "0.4.19" + }, + "dependencies": { + "uuid": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz", + "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==" + } } }, - "babel-runtime": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "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=" + }, + "aws4": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz", + "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==" + }, + "babel-loader": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.1.0.tgz", + "integrity": "sha512-7q7nC1tYOrqvUrN3LQK4GwSk/TQorZSOlO9C+RZDZpODgyN4ZlCqE5q9cDsyWOliN+aU9B4JX01xK9eJXowJLw==", "dev": true, "requires": { - "core-js": "2.5.1", - "regenerator-runtime": "0.11.0" + "find-cache-dir": "^2.1.0", + "loader-utils": "^1.4.0", + "mkdirp": "^0.5.3", + "pify": "^4.0.1", + "schema-utils": "^2.6.5" } }, - "babel-template": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", - "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-traverse": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "lodash": "4.17.4" + "object.assign": "^4.1.0" } }, - "babel-traverse": { - "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", - "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "babel-plugin-istanbul": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-5.2.0.tgz", + "integrity": "sha512-5LphC0USA8t4i1zCtjbbNb6jJj/9+X6P37Qfirc/70EQ34xKlMW+a1RHGwxGI+SwWpNwZ27HqvzAobeqaXwiZw==", "dev": true, "requires": { - "babel-code-frame": "6.26.0", - "babel-messages": "6.23.0", - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "babylon": "6.18.0", - "debug": "2.6.9", - "globals": "9.18.0", - "invariant": "2.2.2", - "lodash": "4.17.4" + "@babel/helper-plugin-utils": "^7.0.0", + "find-up": "^3.0.0", + "istanbul-lib-instrument": "^3.3.0", + "test-exclude": "^5.2.3" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + } } }, - "babel-types": { + "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", - "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "esutils": "2.0.2", - "lodash": "4.17.4", - "to-fast-properties": "1.0.3" + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "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 + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==", + "dev": true + } } }, - "babylon": { - "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", - "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", - "dev": true - }, "bail": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.2.tgz", - "integrity": "sha1-99bBcxYwqfnw1NNe0fli4gdKF2Q=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bail/-/bail-1.0.5.tgz", + "integrity": "sha512-xFbRxM1tahm08yHBP16MMjVUAvDaBMD38zsM9EMAUN61omwLmKlOpB/Zku5QkjZ8TZ4vn53pj+t518cH0S03RQ==", "dev": true }, "balanced-match": { @@ -1308,10 +4449,74 @@ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, "base64-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.2.1.tgz", - "integrity": "sha512-dwVUVIXsBZXwTuwnXI9RK8sBmgq09NDHzyR9SAph9eqk76gKK2JSQmZARC2zRC81JC2QTtxD0ARU5qTS25gIGw==" + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", + "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } }, "batch": { "version": "0.6.1", @@ -1319,63 +4524,66 @@ "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", "dev": true }, - "bel": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/bel/-/bel-5.1.6.tgz", - "integrity": "sha512-qEjYYQgbMFbBwtrt+gVBk+IzdBNqyCgWjm7jtBqptcFlwaXRG/HgyHuzUucReYy155TB9UvIeF4P6/J2GpX80A==", + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", "requires": { - "hyperx": "2.3.2", - "is-electron": "2.1.0", - "pelo": "0.1.0" + "tweetnacl": "^0.14.3" } }, "big.js": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz", - "integrity": "sha512-+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", "dev": true }, + "bignumber.js": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/bignumber.js/-/bignumber.js-9.0.0.tgz", + "integrity": "sha512-t/OYhhJ2SD+YGBQcjY8GzzDHEk9f3nerxjtfa6tlMXfe7frs/WozhvCNoGvpM0P3bNf3Gq5ZRMlGr5f3r4/N8A==" + }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "bl": { - "version": "0.9.5", - "resolved": "https://registry.npmjs.org/bl/-/bl-0.9.5.tgz", - "integrity": "sha1-wGt5evCF6gC8Unr8jvzxHeIjIFQ=", + "bindings": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", + "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", "dev": true, + "optional": true, + "requires": { + "file-uri-to-path": "1.0.0" + } + }, + "bl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-2.2.0.tgz", + "integrity": "sha512-wbgvOpqopSr7uq6fJrLH8EsvYMJf9gzfo2jCsL2eTy75qXPukA4pCgHamOQkZtY5vmfVtjB+P3LNlMHW5CEZXA==", "requires": { - "readable-stream": "1.0.34" + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.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 - }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } } } }, - "bluebird": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", - "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", - "dev": true - }, "bn.js": { "version": "4.11.8", "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz", @@ -1383,20 +4591,35 @@ "dev": true }, "body-parser": { - "version": "1.18.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", - "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", "requires": { - "bytes": "3.0.0", - "content-type": "1.0.4", + "bytes": "3.1.0", + "content-type": "~1.0.4", "debug": "2.6.9", - "depd": "1.1.1", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", - "on-finished": "2.3.0", - "qs": "6.5.1", - "raw-body": "2.3.2", - "type-is": "1.6.15" + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } } }, "bonjour": { @@ -1405,58 +4628,50 @@ "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", "dev": true, "requires": { - "array-flatten": "2.1.1", - "deep-equal": "1.0.1", - "dns-equal": "1.0.0", - "dns-txt": "2.0.2", - "multicast-dns": "6.2.1", - "multicast-dns-service-types": "1.1.0" + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" }, "dependencies": { "array-flatten": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.1.tgz", - "integrity": "sha1-Qmu52oQJDBg42BLIFQryCoMx4pY=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true } } }, - "boom": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/boom/-/boom-0.4.2.tgz", - "integrity": "sha1-emNune1O/O+xnO9JR6PGffrukRs=", - "dev": true, - "requires": { - "hoek": "0.9.1" - }, - "dependencies": { - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", - "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 + }, + "bowser": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.9.0.tgz", + "integrity": "sha512-2ld76tuLBNFekRgmJfT2+3j5MIrP6bFict8WAIT3beq+srz1gcKNAdNKMqHqauQt63NmAa88HfP1/Ypa9Er3HA==" }, "brace-expansion": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.8.tgz", - "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { - "balanced-match": "1.0.0", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { - "version": "1.8.5", - "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", - "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dev": true, "requires": { - "expand-range": "1.8.2", - "preserve": "0.2.0", - "repeat-element": "1.1.2" + "fill-range": "^7.0.1" } }, "brorand": { @@ -1465,46 +4680,52 @@ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", "dev": true }, + "browser-process-hrtime": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", + "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==" + }, "browser-stdout": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", - "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "browserify-aes": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.1.1.tgz", - "integrity": "sha512-UGnTYAnB2a3YuYKIRy1/4FB2HdM866E0qC46JXvVTYKlBlZlnvfpSfY6OKfXZAkv70eJ2a1SqzpAo5CRhZGDFg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", "dev": true, "requires": { - "buffer-xor": "1.0.3", - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, "browserify-cipher": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.0.tgz", - "integrity": "sha1-mYgkSHS/XtTijalWZtzWasj8Njo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", "dev": true, "requires": { - "browserify-aes": "1.1.1", - "browserify-des": "1.0.0", - "evp_bytestokey": "1.0.3" + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" } }, "browserify-des": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.0.tgz", - "integrity": "sha1-2qJ3cXRwki7S/hhZQRihdUOXId0=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "des.js": "1.0.0", - "inherits": "2.0.3" + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "browserify-rsa": { @@ -1513,8 +4734,8 @@ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=", "dev": true, "requires": { - "bn.js": "4.11.8", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "randombytes": "^2.0.1" } }, "browserify-sign": { @@ -1523,13 +4744,13 @@ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "elliptic": "6.4.0", - "inherits": "2.0.3", - "parse-asn1": "5.1.0" + "bn.js": "^4.1.1", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.2", + "elliptic": "^6.0.0", + "inherits": "^2.0.1", + "parse-asn1": "^5.0.0" } }, "browserify-zlib": { @@ -1538,29 +4759,52 @@ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", "dev": true, "requires": { - "pako": "1.0.6" + "pako": "~1.0.5" } }, "browserslist": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-2.9.1.tgz", - "integrity": "sha512-3n3nPdbUqn3nWmsy4PeSQthz2ja1ndpoXta+dwFFNhveGjMg6FXpWYe12vsTpNoXJbzx3j7GZXdtoVIdvh3JbA==", + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz", + "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==", "dev": true, "requires": { - "caniuse-lite": "1.0.30000775", - "electron-to-chromium": "1.3.27" + "caniuse-lite": "^1.0.30001043", + "electron-to-chromium": "^1.3.413", + "node-releases": "^1.1.53", + "pkg-up": "^2.0.0" } }, + "btoa": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz", + "integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==", + "dev": true + }, "buffer": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz", "integrity": "sha1-bRu2AbB6TvztlwlBMgkwJ8lbwpg=", "requires": { - "base64-js": "1.2.1", - "ieee754": "1.1.8", - "isarray": "1.0.0" + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + }, + "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=" + }, + "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==" + }, "buffer-indexof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", @@ -1573,109 +4817,162 @@ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", "dev": true }, - "builtin-modules": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", - "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", - "dev": true - }, "builtin-status-codes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", "dev": true }, - "busboy": { - "version": "0.2.14", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-0.2.14.tgz", - "integrity": "sha1-bCpiLvz0fFe7vh4qnDetNseSVFM=", - "requires": { - "dicer": "0.2.5", - "readable-stream": "1.1.14" - } - }, "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" }, "cacache": { - "version": "10.0.2", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-10.0.2.tgz", - "integrity": "sha512-dljb7dk1jqO5ogE+dRpoR9tpHYv5xz9vPSNunh1+0wRuNdYxmzp9WmsyokgW/DUF1FDRVA/TMsmxt027R8djbQ==", + "version": "12.0.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", + "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", "dev": true, "requires": { - "bluebird": "3.5.1", - "chownr": "1.0.1", - "glob": "7.1.2", - "graceful-fs": "4.1.11", - "lru-cache": "4.1.1", - "mississippi": "1.3.1", - "mkdirp": "0.5.1", - "move-concurrently": "1.0.1", - "promise-inflight": "1.0.1", - "rimraf": "2.6.2", - "ssri": "5.1.0", - "unique-filename": "1.1.0", - "y18n": "3.2.1" + "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" + } + }, + "caching-transform": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz", + "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==", + "dev": true, + "requires": { + "hasha": "^3.0.0", + "make-dir": "^2.0.0", + "package-hash": "^3.0.0", + "write-file-atomic": "^2.4.2" } }, "call-matcher": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-2.0.0.tgz", + "integrity": "sha512-CIDC5wZZfZ2VjZu849WQckS58Z3pJXFfRaSjNjgo/q3in5zxkhTwVL83vttgtmvyLG7TuDlLlBya7SKP6CjDIA==", + "dev": true, + "requires": { + "deep-equal": "^1.0.0", + "espurify": "^2.0.0", + "estraverse": "^4.0.0" + } + }, + "call-me-maybe": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/call-matcher/-/call-matcher-1.0.1.tgz", - "integrity": "sha1-UTTQd5hPcSpU2tPL9i3ijc5BbKg=", + "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz", + "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=", + "dev": true + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", "dev": true, "requires": { - "core-js": "2.5.1", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0" + "callsites": "^2.0.0" } }, "caller-path": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", - "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", "dev": true, "requires": { - "callsites": "0.2.0" + "caller-callsite": "^2.0.0" } }, "callsites": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", - "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", "dev": true }, "camel-case": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz", "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", - "dev": true, "requires": { - "no-case": "2.3.2", - "upper-case": "1.1.3" + "no-case": "^2.2.0", + "upper-case": "^1.1.1" } }, "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + }, + "camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true }, "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", "dev": true, "requires": { - "camelcase": "2.1.1", - "map-obj": "1.0.1" + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" }, "dependencies": { "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", "dev": true } } @@ -1686,167 +4983,210 @@ "integrity": "sha1-FkpUg+Yw+kMh5a8HAg5TGDGyYJs=" }, "caniuse-api": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz", - "integrity": "sha1-tTTnxzTE+B7F++isoq0kNUuWLGw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000775", - "lodash.memoize": "4.1.2", - "lodash.uniq": "4.5.0" - }, - "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000775", - "electron-to-chromium": "1.3.27" - } - } + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" } }, - "caniuse-db": { - "version": "1.0.30000775", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000775.tgz", - "integrity": "sha1-BLzN0CFO3yW5f2GglmCfetaQQzM=", - "dev": true - }, "caniuse-lite": { - "version": "1.0.30000775", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000775.tgz", - "integrity": "sha1-dNJ/7dxH88hM+8sTDDCSo168LeI=", + "version": "1.0.30001048", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz", + "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, "ccount": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.2.tgz", - "integrity": "sha1-U7ai+BW7d7nChx97mnLDol8djok=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.0.5.tgz", + "integrity": "sha512-MOli1W+nfbPLlKEhInaxhRdp7KVLFxLN5ykwzHgLsLI3H3gs5jjFAK4Eoj3OzzcxCtumDaI8onoVDeQyWaNTkw==", "dev": true }, - "center-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", - "dev": true, - "requires": { - "align-text": "0.1.4", - "lazy-cache": "1.0.4" - } - }, "chalk": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", "requires": { - "ansi-styles": "2.2.1", - "escape-string-regexp": "1.0.5", - "has-ansi": "2.0.0", - "strip-ansi": "3.0.1", - "supports-color": "2.0.0" + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" } }, "character-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.1.tgz", - "integrity": "sha1-92hxvl72bdt/j440eOzDdMJ9bco=", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", "dev": true }, "character-entities-html4": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.1.tgz", - "integrity": "sha1-NZoqSg9+KdPcKsmb2+Ie45Q46lA=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz", + "integrity": "sha512-HRcDxZuZqMx3/a+qrzxdBKBPUpxWEq9xw2OPZ3a/174ihfrQKVsFhqtthBInFy1zZ9GgZyFXOatNujm8M+El3g==", "dev": true }, "character-entities-legacy": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.1.tgz", - "integrity": "sha1-9Ad53xoQGHK7UQo9KV4fzPFHIC8=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", "dev": true }, "character-reference-invalid": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.1.tgz", - "integrity": "sha1-lCg191Dk7GGjCOYMLvjMEBEgLvw=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", "dev": true }, "chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=", + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, - "charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha1-wKHS86cJLgN3S/qD8UwPxXkKhmc=" - }, "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", - "dev": true, - "requires": { - "anymatch": "1.3.2", - "async-each": "1.0.1", - "fsevents": "1.1.3", - "glob-parent": "2.0.0", - "inherits": "2.0.3", - "is-binary-path": "1.0.1", - "is-glob": "2.0.1", - "path-is-absolute": "1.0.1", - "readdirp": "2.1.0" + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": 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" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + } }, - "is-glob": { + "extend-shallow": { "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": 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, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.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 + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "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, + "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, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, "choo": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/choo/-/choo-6.7.0.tgz", - "integrity": "sha512-gbxdTbp/WByIr4j0DF7W5xsSgXvQPHqWKjBFWnbNAHR7Y8aMCPIvoTxiLJ5GlHH5+odRlxlec3iTVoUlD12iqA==", - "requires": { - "bel": "5.1.6", - "document-ready": "2.0.1", - "nanobus": "4.3.2", - "nanohref": "3.0.1", - "nanolocation": "1.0.0", - "nanomorph": "5.1.3", - "nanoquery": "1.2.0", - "nanoraf": "3.0.1", - "nanorouter": "3.0.1", - "nanotiming": "6.1.5", - "scroll-to-anchor": "1.1.0", - "xtend": "4.0.1" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/choo/-/choo-7.1.0.tgz", + "integrity": "sha512-E4Gcpw1W0vACY3jkuwsVQUTQcriaIsLgS8DZJXzZ3iuJez8ZY3yoAdYwJlbLFL9OMglNhfrb/E/1HBcUeRuisA==", + "requires": { + "document-ready": "^2.0.1", + "nanoassert": "^1.1.0", + "nanobus": "^4.4.0", + "nanocomponent": "^6.5.0", + "nanohref": "^3.0.0", + "nanohtml": "^1.1.0", + "nanolru": "^1.0.0", + "nanomorph": "^5.1.2", + "nanoquery": "^1.1.0", + "nanoraf": "^3.0.0", + "nanorouter": "^4.0.0", + "nanotiming": "^7.0.0", + "scroll-to-anchor": "^1.0.0" } }, "chownr": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", - "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", "dev": true }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, "ci-info": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-1.1.2.tgz", - "integrity": "sha512-uTGIPNx/nSpBdsF6xnseRXLLtfr9VLqkz8ZqHXr3Y7b6SftyRxBGjwMtJj1OhNbmlc1wZzLNAlAcvyIiE8a6ZA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", "dev": true }, "cipher-base": { @@ -1855,62 +5195,70 @@ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", "dev": true, "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" } }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, - "clap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", - "integrity": "sha512-4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==", + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", "dev": true, "requires": { - "chalk": "1.1.3" + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } } }, "cldr-core": { - "version": "32.0.0", - "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-32.0.0.tgz", - "integrity": "sha1-M7OO+WyaGD9SilZGBJRaqqTs6nE=" + "version": "35.1.0", + "resolved": "https://registry.npmjs.org/cldr-core/-/cldr-core-35.1.0.tgz", + "integrity": "sha512-fTexZlDx+dbjaRNOEzRMqgg9/NxxtPtdIz6CClUNA8rTXBC2RgmP7iag3Z1WCVXqjlIEvWqUvN71c0onhficIA==" }, "clean-css": { - "version": "4.1.9", - "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.1.9.tgz", - "integrity": "sha1-Nc7ornaHpJuYA09w3gDE7dOCYwE=", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.3.tgz", + "integrity": "sha512-VcMWDN54ZN/DS+g58HYL5/n4Zrqe8vHJpGA8KdgUXFU4fuP/aHNw8eld9SyEIyabIMJX/0RaY/fplOo5hYLSFA==", "dev": true, "requires": { - "source-map": "0.5.7" + "source-map": "~0.6.0" }, "dependencies": { "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "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=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", "dev": true, "requires": { - "restore-cursor": "2.0.0" + "restore-cursor": "^3.1.0" } }, - "cli-spinners": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-0.1.2.tgz", - "integrity": "sha1-u3ZNiOGF+54eaiofGXcjGPYF4xw=", - "dev": true - }, "cli-truncate": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", @@ -1918,7 +5266,7 @@ "dev": true, "requires": { "slice-ansi": "0.0.4", - "string-width": "1.0.2" + "string-width": "^1.0.1" }, "dependencies": { "is-fullwidth-code-point": { @@ -1927,7 +5275,7 @@ "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, "slice-ansi": { @@ -1942,81 +5290,104 @@ "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.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=", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", "dev": true }, "cliui": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", - "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wrap-ansi": "2.1.0" + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "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 }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "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": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "ansi-regex": "^4.1.0" } } } }, - "clone": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", - "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", - "dev": true - }, "clone-regexp": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-1.0.0.tgz", - "integrity": "sha1-6uCiQT9VwJQvgYwin+/OhF1/Oxw=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clone-regexp/-/clone-regexp-2.2.0.tgz", + "integrity": "sha512-beMpP7BOtTipFuW8hrJvREQ2DrRu3BE7by0ZpibtfBA+qfHYvMGTc2Yb1JMYPKg/JUw0CHYvpg796aNTSW9z7Q==", "dev": true, "requires": { - "is-regexp": "1.0.0", - "is-supported-regexp-flag": "1.0.0" + "is-regexp": "^2.0.0" + }, + "dependencies": { + "is-regexp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-2.1.0.tgz", + "integrity": "sha512-OZ4IlER3zmRIoB9AqNhEggVxqIH4ofDns5nRrPS6yQxXE1TPCUpFznBfRQmQa8uC+pXqjMnukiJBxCisIxiLGA==", + "dev": true + } } }, - "co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", - "dev": true - }, "coa": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz", - "integrity": "sha1-qe8VNmDWqGqL3sAomlxoTSF0Mv0=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", "dev": true, "requires": { - "q": "1.5.1" + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "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" + } + }, + "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" + } + } } }, "code-point-at": { @@ -2026,26 +5397,35 @@ "dev": true }, "collapse-white-space": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.3.tgz", - "integrity": "sha1-S5BvZw5aljqHt2sOFolkM0G2Ajw=", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-1.0.6.tgz", + "integrity": "sha512-jEovNnrhMuqyCcjfEJA56v0Xq8SkIoPKDyaHahwo3POf4qcSXqMYuwNcOTzp74vTsR9Tn08z4MxWqAhcekogkQ==", "dev": true }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + } + }, "color": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/color/-/color-0.11.4.tgz", - "integrity": "sha1-bXtcdPtl6EHNSHkq0e1eB7kE12Q=", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz", + "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==", "dev": true, "requires": { - "clone": "1.0.3", - "color-convert": "1.9.1", - "color-string": "0.3.0" + "color-convert": "^1.9.1", + "color-string": "^1.5.2" } }, "color-convert": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", - "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" @@ -2058,45 +5438,27 @@ "dev": true }, "color-string": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz", - "integrity": "sha1-J9RvtnAlxcL6JZk7+/V55HhBuZE=", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "colormin": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz", - "integrity": "sha1-6i90IKcrlogaOKrlnsEkpvcpgTM=", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", + "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", "dev": true, "requires": { - "color": "0.11.4", - "css-color-names": "0.0.4", - "has": "1.0.1" + "color-name": "^1.0.0", + "simple-swizzle": "^0.2.2" } }, - "colors": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true - }, "combined-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-0.0.7.tgz", - "integrity": "sha1-ATfmV7qlp1QcV6w3rF/AfXO03B8=", - "dev": true, + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "requires": { - "delayed-stream": "0.0.5" + "delayed-stream": "~1.0.0" } }, "commander": { - "version": "2.12.2", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.12.2.tgz", - "integrity": "sha512-BFnaq5ZOGcDN7FlrtBT4xxkgIToalIIxwjxLWVJ8bGTpe1LroqMiqQXdA7ygc7CRvaYS+9zfPGFnJqFSayx+AA==", - "dev": true + "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==" }, "commondir": { "version": "1.0.1", @@ -2105,100 +5467,92 @@ "dev": true }, "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "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 }, "compressible": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.12.tgz", - "integrity": "sha1-xZpcmdt2dn6YdlAOJx72OzSTvWY=", - "dev": true, + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "mime-db": "1.30.0" + "mime-db": ">= 1.43.0 < 2" } }, "compression": { - "version": "1.7.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.1.tgz", - "integrity": "sha1-7/JgPvwuIs+G810uuTWJ+YdTc9s=", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dev": true, "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.5", "bytes": "3.0.0", - "compressible": "2.0.12", + "compressible": "~2.0.16", "debug": "2.6.9", - "on-headers": "1.0.1", - "safe-buffer": "5.1.1", - "vary": "1.1.2" - } - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true - }, - "concat-stream": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", - "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "typedarray": "0.0.6" + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true } } }, - "connect-busboy": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/connect-busboy/-/connect-busboy-0.0.2.tgz", - "integrity": "sha1-rFyclmchcYheV2xmsr/ZXTuxEJc=", + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "configstore": { + "version": "github:dannycoates/configstore#45c19536db34e7005a50b435582692886322ab36", + "from": "github:dannycoates/configstore#master", "requires": { - "busboy": "0.2.14" + "dot-prop": "^5.1.0" } }, "connect-history-api-fallback": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", - "integrity": "sha1-sGhzk0vF40T+9hGhlqb6rgruAVo=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", "dev": true }, "console-browserify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", - "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", - "dev": true, - "requires": { - "date-now": "0.1.4" - } + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true }, "constants-browserify": { "version": "1.0.0", @@ -2207,14 +5561,17 @@ "dev": true }, "content-disposition": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", - "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=" + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "requires": { + "safe-buffer": "5.1.2" + } }, "content-security-policy-builder": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.0.0.tgz", - "integrity": "sha512-j+Nhmj1yfZAikJLImCvPJFE29x/UuBi+/MWqggGGc515JKaZrjuei2RhULJmy0MsstW3E3htl002bwmBNMKr7w==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/content-security-policy-builder/-/content-security-policy-builder-2.1.0.tgz", + "integrity": "sha512-/MtLWhJVvJNkA9dVLAp6fg9LxD2gfI6R2Fi1hPmfjYXSahJJzcfvoeDOxSyp4NvxMuwWv3WMssE9o31DoULHrQ==" }, "content-type": { "version": "1.0.4", @@ -2222,217 +5579,285 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", - "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", - "dev": true + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "requires": { + "safe-buffer": "~5.1.1" + } }, "convict": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/convict/-/convict-4.0.2.tgz", - "integrity": "sha1-oVFl1DwhHRJfV8ZNKLxWHcKdNb4=", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/convict/-/convict-5.2.0.tgz", + "integrity": "sha512-C3cdUwo47cCikZNzu5Vv8AL0MuXVVeg9t/Gyr9qyK5ZpCjOkMPmJ85KUF3CowNeSfj4UtztHxS+hoO9wGRh6kg==", "requires": { - "depd": "1.1.1", - "json5": "0.5.1", + "json5": "2.1.0", "lodash.clonedeep": "4.5.0", - "moment": "2.19.3", - "validator": "7.2.0", - "varify": "0.2.0", - "yargs-parser": "7.0.0" + "moment": "2.24.0", + "validator": "11.1.0", + "yargs-parser": "13.0.0" } }, "cookie": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", - "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=" - }, - "cookie-jar": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/cookie-jar/-/cookie-jar-0.3.0.tgz", - "integrity": "sha1-vJon1OK5fhhs1XyeIGPLmfpozMw=", - "dev": true + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" }, - "cookiejar": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.1.tgz", - "integrity": "sha1-Qa1XsbVVlR7BcUEqgZQrHoIA00o=", - "dev": true - }, "copy-concurrently": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", "dev": true, "requires": { - "aproba": "1.2.0", - "fs-write-stream-atomic": "1.0.10", - "iferr": "0.1.5", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" - } - }, - "copy-webpack-plugin": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.3.1.tgz", - "integrity": "sha512-xlcFiW/U7KrpS6dFuWq3r8Wb7koJx7QVc7LDFCosqkikaVSxkaYOnwDLwilbjrszZ0LYZXThDAJKcQCSrvdShQ==", - "dev": true, - "requires": { - "cacache": "10.0.2", - "find-cache-dir": "1.0.0", - "globby": "7.1.1", - "is-glob": "4.0.0", - "loader-utils": "0.2.17", - "lodash": "4.17.4", - "minimatch": "3.0.4", - "p-limit": "1.1.0", - "pify": "3.0.0", - "serialize-javascript": "1.4.0" + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" }, "dependencies": { - "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" + "glob": "^7.1.3" } - }, - "loader-utils": { - "version": "0.2.17", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz", - "integrity": "sha1-+G5jdNQyBabmxg6RlvF8Apm/s0g=", + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz", + "integrity": "sha512-P15M5ZC8dyCjQHWwd4Ia/dm0SgVvZJMYeykVIVYXbGyqO4dWB5oyPHp9i7wjwo5LhtlhKbiBCdS2NvM07Wlybg==", + "dev": true, + "requires": { + "cacache": "^12.0.3", + "find-cache-dir": "^2.1.0", + "glob-parent": "^3.1.0", + "globby": "^7.1.1", + "is-glob": "^4.0.1", + "loader-utils": "^1.2.3", + "minimatch": "^3.0.4", + "normalize-path": "^3.0.0", + "p-limit": "^2.2.1", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1", - "object-assign": "4.1.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } }, "core-js": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.1.tgz", - "integrity": "sha1-rmh03GaTd4m4B1T/VCjfZoGcpQs=", + "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 }, + "core-js-compat": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.6.5.tgz", + "integrity": "sha512-7ItTKOhOZbznhXAQ2g/slGg1PJV5zDO/WdkTwi7UEOJmkvsE32PWvx6mKtDjiMpjnR2CNf6BAD6sSxIlv7ptng==", + "dev": true, + "requires": { + "browserslist": "^4.8.5", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "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=" }, "cosmiconfig": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-1.1.0.tgz", - "integrity": "sha1-DeoPmATv37kp+7GxiOJVU+oFPTc=", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "pinkie-promise": "2.0.1", - "require-from-string": "1.2.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cp-file": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz", + "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "make-dir": "^2.0.0", + "nested-error-stacks": "^2.0.0", + "pify": "^4.0.1", + "safe-buffer": "^5.0.1" } }, "create-ecdh": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.0.tgz", - "integrity": "sha1-iIxyNZbN92EvZJgjPuvXo1MBc30=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz", + "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "elliptic": "6.4.0" + "bn.js": "^4.1.0", + "elliptic": "^6.0.0" } }, "create-hash": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.1.3.tgz", - "integrity": "sha1-YGBCrIuSYnUPSDyt2rD1gZFy2P0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" } }, "create-hmac": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.6.tgz", - "integrity": "sha1-rLniIaThe9sHbpBlfEK5PjcmzwY=", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", "dev": true, "requires": { - "cipher-base": "1.0.4", - "create-hash": "1.1.3", - "inherits": "2.0.3", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, "cross-env": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-5.1.3.tgz", - "integrity": "sha512-UOokgwvDzCT0mqRSLEkJzUhYXB1vK3E5UgDrD41QiXsm9UetcW2rCGHYz/O3p873lMJ1VZbFCF9Izkwh7nYR5A==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/cross-env/-/cross-env-6.0.3.tgz", + "integrity": "sha512-+KqxF6LCvfhWvADcDPqo64yVIB31gv/jQulX2NGzKS/g3GEVz6/pt4wjHFtFWsHMddebWD/sDthJemzM4MaAag==", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "is-windows": "1.0.1" + "cross-spawn": "^7.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "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" + } + } } }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "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" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", "dev": true, "requires": { - "lru-cache": "4.1.1", - "shebang-command": "1.2.0", - "which": "1.3.0" + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" } }, - "crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha1-iNf/fsDfuG9xPch7u0LQRNPmxBs=" + "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==" }, - "cryptiles": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-0.2.2.tgz", - "integrity": "sha1-7ZH/HxetE9N0gohZT4pIoNJvMlw=", + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", "dev": true, "requires": { - "boom": "0.4.2" + "postcss": "^7.0.5" } }, "css-color-names": { @@ -2441,142 +5866,103 @@ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=", "dev": true }, - "css-loader": { - "version": "0.28.9", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-0.28.9.tgz", - "integrity": "sha512-r3dgelMm/mkPz5Y7m9SeiGE46i2VsEU/OYbez+1llfxtv8b2y5/b5StaeEvPK3S5tlNQI+tDW/xDIhKJoZgDtw==", - "dev": true, - "requires": { - "babel-code-frame": "6.26.0", - "css-selector-tokenizer": "0.7.0", - "cssnano": "3.10.0", - "icss-utils": "2.1.0", - "loader-utils": "1.1.0", - "lodash.camelcase": "4.3.0", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-modules-extract-imports": "1.2.0", - "postcss-modules-local-by-default": "1.2.0", - "postcss-modules-scope": "1.1.0", - "postcss-modules-values": "1.3.0", - "postcss-value-parser": "3.3.0", - "source-list-map": "2.0.0" + "css-declaration-sorter": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz", + "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "timsort": "^0.3.0" + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "css-mqpacker": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/css-mqpacker/-/css-mqpacker-6.0.2.tgz", - "integrity": "sha512-01xogFCcK6KQmUS+EwSS5R5Sq/mp9rjLBw/7ej+xPZHKE0gzjsWk8uJpFuKOllQrVEOJqt7Y8H6rCNG+sMIg+Q==", - "dev": true, - "requires": { - "minimist": "1.2.0", - "postcss": "6.0.17" + "css-loader": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-3.5.3.tgz", + "integrity": "sha512-UEr9NH5Lmi7+dguAm+/JSPovNjYbm2k3TK58EiwQHzOHH5Jfq1Y+XoP2bQO6TMn7PptMd0opxxedAWcaSTRKHw==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "cssesc": "^3.0.0", + "icss-utils": "^4.1.1", + "loader-utils": "^1.2.3", + "normalize-path": "^3.0.0", + "postcss": "^7.0.27", + "postcss-modules-extract-imports": "^2.0.0", + "postcss-modules-local-by-default": "^3.0.2", + "postcss-modules-scope": "^2.2.0", + "postcss-modules-values": "^3.0.0", + "postcss-value-parser": "^4.0.3", + "schema-utils": "^2.6.6", + "semver": "^6.3.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==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - }, - "dependencies": { - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true - }, - "postcss": { - "version": "6.0.17", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.17.tgz", - "integrity": "sha512-Bl1nybsSzWYbP8O4gAVD8JIjZIul9hLNOPTGBIlVmZNUnNAGL+W0cpYWzVwfImZOwumct4c1SDvSbncVWKtXUw==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "5.1.0" - } - }, - "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } } } }, + "css-mqpacker": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/css-mqpacker/-/css-mqpacker-7.0.0.tgz", + "integrity": "sha512-temVrWS+sB4uocE2quhW8ru/KguDmGhCU7zN213KxtDvWOH3WS/ZUStfpF4fdCT7W8fPpFrQdWRFqtFtPPfBLA==", + "dev": true, + "requires": { + "minimist": "^1.2.0", + "postcss": "^7.0.0" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, "css-rule-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/css-rule-stream/-/css-rule-stream-1.1.0.tgz", "integrity": "sha1-N4bnGYmD2WWibjGVfgkHjLt3BaI=", "dev": true, "requires": { - "css-tokenize": "1.0.1", + "css-tokenize": "^1.0.1", "duplexer2": "0.0.2", - "ldjson-stream": "1.2.1", - "through2": "0.6.5" + "ldjson-stream": "^1.2.1", + "through2": "^0.6.3" }, "dependencies": { "isarray": { @@ -2591,209 +5977,262 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } }, - "css-selector-tokenizer": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz", - "integrity": "sha1-5piEdK6MlTR3v15+/s/OzNnPTIY=", + "css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", "dev": true, "requires": { - "cssesc": "0.1.0", - "fastparse": "1.1.1", - "regexpu-core": "1.0.0" - }, - "dependencies": { - "regexpu-core": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz", - "integrity": "sha1-hqdj9Y7k18L2sQLkdkBQ3n7ZDGs=", - "dev": true, - "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" - } - } + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" } }, + "css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==", + "dev": true + }, "css-tokenize": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/css-tokenize/-/css-tokenize-1.0.1.tgz", "integrity": "sha1-RiXLHtohwUOFi3+B1oA8HSb8FL4=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "1.1.14" - } - }, - "cssesc": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz", - "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", - "dev": true - }, - "cssnano": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz", - "integrity": "sha1-Tzj2zqK5sX+gFJDyPx3GjqZcHDg=", - "dev": true, - "requires": { - "autoprefixer": "6.7.7", - "decamelize": "1.2.0", - "defined": "1.0.0", - "has": "1.0.1", - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-calc": "5.3.1", - "postcss-colormin": "2.2.2", - "postcss-convert-values": "2.6.1", - "postcss-discard-comments": "2.0.4", - "postcss-discard-duplicates": "2.1.0", - "postcss-discard-empty": "2.1.0", - "postcss-discard-overridden": "0.1.1", - "postcss-discard-unused": "2.2.3", - "postcss-filter-plugins": "2.0.2", - "postcss-merge-idents": "2.1.7", - "postcss-merge-longhand": "2.0.2", - "postcss-merge-rules": "2.1.2", - "postcss-minify-font-values": "1.0.5", - "postcss-minify-gradients": "1.0.5", - "postcss-minify-params": "1.2.2", - "postcss-minify-selectors": "2.1.1", - "postcss-normalize-charset": "1.1.1", - "postcss-normalize-url": "3.0.8", - "postcss-ordered-values": "2.2.3", - "postcss-reduce-idents": "2.4.0", - "postcss-reduce-initial": "1.0.1", - "postcss-reduce-transforms": "1.0.4", - "postcss-svgo": "2.1.6", - "postcss-unique-selectors": "2.0.2", - "postcss-value-parser": "3.3.0", - "postcss-zindex": "2.2.0" - }, - "dependencies": { - "autoprefixer": { - "version": "6.7.7", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz", - "integrity": "sha1-Hb0cg1ZY41zj+ZhAmdsAWFx4IBQ=", - "dev": true, - "requires": { - "browserslist": "1.7.7", - "caniuse-db": "1.0.30000775", - "normalize-range": "0.1.2", - "num2fraction": "1.2.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - } - }, - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000775", - "electron-to-chromium": "1.3.27" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "inherits": "^2.0.1", + "readable-stream": "^1.0.33" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dev": true, + "requires": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "dependencies": { "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, + "css-unit-converter": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/css-unit-converter/-/css-unit-converter-1.1.1.tgz", + "integrity": "sha1-2bkoGtz9jO2TW9urqDeGiX9k6ZY=", + "dev": true + }, + "css-what": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz", + "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==", + "dev": true + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "cssnano": { + "version": "4.1.10", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz", + "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "cssnano-preset-default": "^4.0.7", + "is-resolvable": "^1.0.0", + "postcss": "^7.0.0" + } + }, + "cssnano-preset-default": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz", + "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==", + "dev": true, + "requires": { + "css-declaration-sorter": "^4.0.1", + "cssnano-util-raw-cache": "^4.0.1", + "postcss": "^7.0.0", + "postcss-calc": "^7.0.1", + "postcss-colormin": "^4.0.3", + "postcss-convert-values": "^4.0.1", + "postcss-discard-comments": "^4.0.2", + "postcss-discard-duplicates": "^4.0.2", + "postcss-discard-empty": "^4.0.1", + "postcss-discard-overridden": "^4.0.1", + "postcss-merge-longhand": "^4.0.11", + "postcss-merge-rules": "^4.0.3", + "postcss-minify-font-values": "^4.0.2", + "postcss-minify-gradients": "^4.0.2", + "postcss-minify-params": "^4.0.2", + "postcss-minify-selectors": "^4.0.2", + "postcss-normalize-charset": "^4.0.1", + "postcss-normalize-display-values": "^4.0.2", + "postcss-normalize-positions": "^4.0.2", + "postcss-normalize-repeat-style": "^4.0.2", + "postcss-normalize-string": "^4.0.2", + "postcss-normalize-timing-functions": "^4.0.2", + "postcss-normalize-unicode": "^4.0.1", + "postcss-normalize-url": "^4.0.1", + "postcss-normalize-whitespace": "^4.0.2", + "postcss-ordered-values": "^4.1.2", + "postcss-reduce-initial": "^4.0.3", + "postcss-reduce-transforms": "^4.0.2", + "postcss-svgo": "^4.0.2", + "postcss-unique-selectors": "^4.0.1" + } + }, + "cssnano-util-get-arguments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz", + "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=", + "dev": true + }, + "cssnano-util-get-match": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz", + "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=", + "dev": true + }, + "cssnano-util-raw-cache": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz", + "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "cssnano-util-same-parent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz", + "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==", + "dev": true + }, "csso": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz", - "integrity": "sha1-3dUsWHAz9J6Utx/FVWnyUuj/X4U=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz", + "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==", "dev": true, "requires": { - "clap": "1.2.3", - "source-map": "0.5.7" + "css-tree": "1.0.0-alpha.39" }, "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.39", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz", + "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==", + "dev": true, + "requires": { + "mdn-data": "2.0.6", + "source-map": "^0.6.1" + } + }, + "mdn-data": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz", + "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==", + "dev": true + }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true } } }, - "ctype": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", - "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=", - "dev": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", "dev": true, "requires": { - "array-find-index": "1.0.2" + "array-find-index": "^1.0.1" } }, "cyclist": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", - "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", "dev": true }, - "d": { + "dash-ast": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.0.tgz", - "integrity": "sha1-dUu1v+VUUdpppYuU1F9MWwRi1Y8=", - "dev": true, + "resolved": "https://registry.npmjs.org/dash-ast/-/dash-ast-1.0.0.tgz", + "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", "requires": { - "es5-ext": "0.10.37" + "assert-plus": "^1.0.0" } }, "dasherize": { @@ -2801,16 +6240,15 @@ "resolved": "https://registry.npmjs.org/dasherize/-/dasherize-2.0.0.tgz", "integrity": "sha1-bYCcnNDPe7iVLYD8hPoT1H3bEwg=" }, - "date-fns": { - "version": "1.29.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.29.0.tgz", - "integrity": "sha512-lbTXWZ6M20cWH8N9S6afb0SBm6tMk+uUg6z3MqHPKE9atmsY3kJkTm8vKe93izJ2B2+q5MV990sM2CHgtAZaOw==", - "dev": true + "date-and-time": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.13.1.tgz", + "integrity": "sha512-/Uge9DJAT+s+oAcDxtBhyR8+sKjUnZbYmyhbmWjTHNtX7B7oWD8YyYdeXcBRbwSj6hVvj+IQegJam7m7czhbFw==" }, - "date-now": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", - "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", "dev": true }, "dbug": { @@ -2819,39 +6257,135 @@ "integrity": "sha1-MrSzEF6IYQQ6b5rHVdgOVC02WzE=" }, "debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "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 }, - "deep-equal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", - "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=", + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", "dev": true }, + "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-is": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + } + }, "define-properties": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", - "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "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, "requires": { - "foreach": "2.0.5", - "object-keys": "1.0.11" + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } } }, "defined": { @@ -2861,47 +6395,95 @@ "dev": true }, "del": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", - "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", - "dev": true, - "requires": { - "globby": "5.0.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "rimraf": "2.6.2" + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/del/-/del-5.1.0.tgz", + "integrity": "sha512-wH9xOVHnczo9jN2IW68BabcecVPxacIA3g/7z6vhSU/4stOKQzeCRK0yD0A24WiAAUJmmVpWqrERcTxnLo3AnA==", + "dev": true, + "requires": { + "globby": "^10.0.1", + "graceful-fs": "^4.2.2", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.1", + "p-map": "^3.0.0", + "rimraf": "^3.0.0", + "slash": "^3.0.0" }, "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "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 + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "globby": { + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.2.tgz", + "integrity": "sha512-7dUi7RvCoT/xast/o/dLN53oqND4yk0nsHkhRgn9w65C4PofCLOoJ39iSOg+qVDdWQPIEj+eszMHQ+aLVwwQSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true } } }, "delayed-stream": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-0.0.5.tgz", - "integrity": "sha1-1LH0OpPoKW3+AmlPRoC8N6MTxz8=", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "denque": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", + "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" }, "depd": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", - "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "des.js": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz", - "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" } }, "destroy": { @@ -2909,55 +6491,53 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, - "detect-indent": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", - "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true }, "detect-node": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.3.tgz", - "integrity": "sha1-ogM8CcyOFY03dI+951B4Mr1s4Sc=", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", "dev": true }, - "dicer": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/dicer/-/dicer-0.2.5.tgz", - "integrity": "sha1-WZbAhrszIYyBLAkL3cCc0S+stw8=", + "detective": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/detective/-/detective-5.2.0.tgz", + "integrity": "sha512-6SsIx+nUUbuK0EthKjv0zrdnajCCXVYGmbYYiYjFVpzcjwEs/JMDZ8tPRG29J/HhN56t3GJp2cGSWDRjjot8Pg==", + "dev": true, "requires": { - "readable-stream": "1.1.14", - "streamsearch": "0.1.2" + "acorn-node": "^1.6.1", + "defined": "^1.0.0", + "minimist": "^1.1.1" } }, "diff": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", - "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "diffie-hellman": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.2.tgz", - "integrity": "sha1-tYNXOScM/ias9jIJn97SoH8gnl4=", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", "dev": true, "requires": { - "bn.js": "4.11.8", - "miller-rabin": "4.0.1", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" } }, "dir-glob": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz", - "integrity": "sha512-37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-2.2.2.tgz", + "integrity": "sha512-f9LBi5QWzIW3I6e//uxZoLBlUt9kcp66qo0sSCxL6YZKc75R1c4MFCoe/LaZiBGmgujvQdxc5Bn3QhfyvK5Hsw==", "dev": true, "requires": { - "arrify": "1.0.1", - "path-type": "3.0.0" + "path-type": "^3.0.0" } }, "dns-equal": { @@ -2967,173 +6547,310 @@ "dev": true }, "dns-packet": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.2.2.tgz", - "integrity": "sha512-kN+DjfGF7dJGUL7nWRktL9Z18t1rWP3aQlyZdY8XlpvU3Nc6GeFTQApftcjtWKxAZfiggZSGrCEoszNgvnpwDg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", "dev": true, "requires": { - "ip": "1.1.5", - "safe-buffer": "5.1.1" + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" } }, - "dns-prefetch-control": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dns-prefetch-control/-/dns-prefetch-control-0.1.0.tgz", - "integrity": "sha1-YN20V3dOF48flBXwyrsOhbCzALI=" - }, "dns-txt": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", "dev": true, "requires": { - "buffer-indexof": "1.1.1" + "buffer-indexof": "^1.0.0" } }, "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "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" + "esutils": "^2.0.2" } }, "document-ready": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/document-ready/-/document-ready-2.0.1.tgz", - "integrity": "sha1-PjvzHTI1uU4jLnssX6GmNOhzuuQ=" + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/document-ready/-/document-ready-2.0.2.tgz", + "integrity": "sha512-C0ht1cPSVzL5ALWnLiXDGfQXbzmNMJrLQ7wzc2fwz5x/wlZun+uzTGJGdKgfygZQ9i7RNRxI+OV909zXKFPycA==" }, "doiuse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.0.0.tgz", - "integrity": "sha512-j2KwY4eJdysCnRY/CVYG3/cE0t5SEOCtGMvdfVLkcmyay9W43rmZbb4bOmkCN25aJ9EkkRhxCJe44uMt92WqgQ==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/doiuse/-/doiuse-4.2.0.tgz", + "integrity": "sha512-FMptmRKtlEwlcP9KUQ1Vw4pdlcUchl5cWBZEfgZGDPO0WhiJ8sJf2UeuYO8FXlNmK45s3OyQvzJ7GIWzmDYEdQ==", "dev": true, "requires": { - "browserslist": "2.9.1", - "caniuse-lite": "1.0.30000775", - "css-rule-stream": "1.1.0", + "browserslist": "^4.1.1", + "caniuse-lite": "^1.0.30000887", + "css-rule-stream": "^1.1.0", "duplexer2": "0.0.2", - "jsonfilter": "1.1.2", - "ldjson-stream": "1.2.1", - "lodash": "4.17.4", - "multimatch": "2.1.0", - "postcss": "6.0.14", - "source-map": "0.5.7", - "through2": "0.6.5", - "yargs": "8.0.2" + "jsonfilter": "^1.1.2", + "ldjson-stream": "^1.2.1", + "multimatch": "^2.0.0", + "postcss": "^7.0.4", + "source-map": "^0.7.3", + "through2": "^2.0.3", + "yargs": "^12.0.2" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "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" } }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", "dev": true }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, "dom-serializer": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", - "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", "dev": true, "requires": { - "domelementtype": "1.1.3", - "entities": "1.1.1" + "domelementtype": "^2.0.1", + "entities": "^2.0.0" }, "dependencies": { "domelementtype": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", - "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz", + "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==", "dev": true } } }, "dom-walk": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.1.tgz", - "integrity": "sha1-ZyIm3HTI95mtNTB9+TaroRrNYBg=", - "dev": true + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz", + "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==" }, "domain-browser": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.1.7.tgz", - "integrity": "sha1-hnqksJP6oF8d4IwG9NeyH9+GmLw=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", "dev": true }, "domelementtype": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "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.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.1.tgz", - "integrity": "sha1-iS5HAAqZvlW783dP/qBWHYh5wlk=", + "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.3.0" + "domelementtype": "1" } }, "domutils": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.6.2.tgz", - "integrity": "sha1-GVjMC0yUJuntNn+xyOhUiRsPo/8=", + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", "dev": true, "requires": { - "dom-serializer": "0.1.0", - "domelementtype": "1.3.0" + "dom-serializer": "0", + "domelementtype": "1" } }, "dont-sniff-mimetype": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.0.0.tgz", - "integrity": "sha1-WTKJDcn04vGeXrAqIAJuXl78j1g=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/dont-sniff-mimetype/-/dont-sniff-mimetype-1.1.0.tgz", + "integrity": "sha512-ZjI4zqTaxveH2/tTlzS1wFp+7ncxNZaIEWYg3lzZRHkKf5zPT/MnEG6WL0BhHMJUabkh8GeU5NL5j+rEUCb7Ug==" }, "dot-prop": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.2.0.tgz", - "integrity": "sha512-tUMXrxlExSW6U2EXiiKGSBVdYgtV8qlHL+C10TsW4PURY/ic+eaysnSkwB4kA/mBlCyy/IKDJ+Lc3wbWeaXtuQ==", - "dev": true, + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz", + "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==", "requires": { - "is-obj": "1.0.1" + "is-obj": "^2.0.0" } }, - "double-ended-queue": { - "version": "2.1.0-0", - "resolved": "https://registry.npmjs.org/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz", - "integrity": "sha1-ED01J/0xUo9AGIEwyEHv3XgmTlw=" - }, "duplexer": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", @@ -3146,56 +6863,88 @@ "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", "dev": true, "requires": { - "readable-stream": "1.1.14" - } - }, - "duplexify": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", - "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", - "dev": true, - "requires": { - "end-of-stream": "1.4.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "stream-shift": "1.0.0" + "readable-stream": "~1.1.9" }, "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } } } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "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==", + "requires": { + "safe-buffer": "^5.0.1" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "electron-to-chromium": { - "version": "1.3.27", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz", - "integrity": "sha1-eOy4o5kGYYe7N07t412ccFZagD0=", + "version": "1.3.423", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.423.tgz", + "integrity": "sha512-jXdnLcawJ/EMdN+j77TC3YyeAWiIjo1U63DFCKrjtLv4cu8ToyoF4HYXtFvkVVHhEtIl7lU1uDd307Xj1/YDjw==", "dev": true }, "elegant-spinner": { @@ -3205,184 +6954,156 @@ "dev": true }, "elliptic": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.0.tgz", - "integrity": "sha1-ysmvh2LIWDYYcAPI3+GT5eLq5d8=", + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", + "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0", - "hash.js": "1.1.3", - "hmac-drbg": "1.0.1", - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" } }, + "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 + }, "emojis-list": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", - "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", "dev": true }, "encodeurl": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", - "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "end-of-stream": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", - "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", - "dev": true, + "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==", "requires": { - "once": "1.4.0" + "once": "^1.4.0" } }, "enhanced-resolve": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz", - "integrity": "sha1-BCHjOf1xQZs9oT0Smzl5BAIwR24=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz", + "integrity": "sha512-98p2zE+rL7/g/DzMHMTF4zZlCgeVdJ7yr6xzEpJRYwFYrGi9ANdn5DnJURg6RpBkyk60XYDnWIv51VfIhfNGuA==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "memory-fs": "0.4.1", - "object-assign": "4.1.1", - "tapable": "0.2.8" + "graceful-fs": "^4.1.2", + "memory-fs": "^0.5.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "memory-fs": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.5.0.tgz", + "integrity": "sha512-jA0rdU5KoQMC0e6ppoNRtpp6vjFq6+NY7r8hywnC7V+1Xj/MtHwGIbB1QaK/dunyjWteJzmkpd7ooeWg10T7GA==", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "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" + } + } } }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=" + }, "entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", - "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz", + "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==", "dev": true }, "errno": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.4.tgz", - "integrity": "sha1-uJbiOp5ei6M4cfyZar02NfyaHH0=", + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", + "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", "dev": true, "requires": { - "prr": "0.0.0" + "prr": "~1.0.1" } }, "error-ex": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", - "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "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" + "is-arrayish": "^0.2.1" } }, "es-abstract": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", - "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "version": "1.17.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz", + "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==", "dev": true, "requires": { - "es-to-primitive": "1.1.1", - "function-bind": "1.1.1", - "has": "1.0.1", - "is-callable": "1.1.3", - "is-regex": "1.0.4" + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.1.5", + "is-regex": "^1.0.5", + "object-inspect": "^1.7.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.0", + "string.prototype.trimleft": "^2.1.1", + "string.prototype.trimright": "^2.1.1" } }, "es-to-primitive": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", - "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", - "dev": true, - "requires": { - "is-callable": "1.1.3", - "is-date-object": "1.0.1", - "is-symbol": "1.0.1" - } - }, - "es5-ext": { - "version": "0.10.37", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.37.tgz", - "integrity": "sha1-DudB0Ui4AGm6J9AgOTdWryV978M=", - "dev": true, - "requires": { - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-symbol": "3.1.1" - } - }, - "es6-map": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", - "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", + "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": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-set": "0.1.5", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" } }, - "es6-promise": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.0.2.tgz", - "integrity": "sha1-AQ1YWEI6XxGJeWZfRkhqlcbuK7Y=", + "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-set": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", - "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1", - "event-emitter": "0.3.5" - } - }, - "es6-symbol": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", - "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" - } - }, "es6-templates": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz", "integrity": "sha1-XLmsn7He1usSOTQrgdeSu7QHjuQ=", "dev": true, "requires": { - "recast": "0.11.23", - "through": "2.3.8" - } - }, - "es6-weak-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.2.tgz", - "integrity": "sha1-XjqzIlH/0VOKH45f+hNXdy+S2W8=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37", - "es6-iterator": "2.0.3", - "es6-symbol": "3.1.1" + "recast": "~0.11.12", + "through": "~2.3.6" } }, "escape-html": { @@ -3396,192 +7117,236 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "escodegen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", - "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz", + "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==", "dev": true, "requires": { - "esprima": "3.1.3", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "optionator": "0.8.2", - "source-map": "0.5.7" + "esprima": "^4.0.1", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "dependencies": { - "esprima": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", - "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", - "dev": true - }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "optional": true } } }, - "escope": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/escope/-/escope-3.6.0.tgz", - "integrity": "sha1-4Bl16BJ4GhY6ba392AOY3GTIicM=", - "dev": true, - "requires": { - "es6-map": "0.1.5", - "es6-weak-map": "2.0.2", - "esrecurse": "4.2.0", - "estraverse": "4.2.0" - } - }, "eslint": { - "version": "4.17.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz", - "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==", - "dev": true, - "requires": { - "ajv": "5.5.0", - "babel-code-frame": "6.26.0", - "chalk": "2.3.0", - "concat-stream": "1.6.0", - "cross-spawn": "5.1.0", - "debug": "3.1.0", - "doctrine": "2.1.0", - "eslint-scope": "3.7.1", - "eslint-visitor-keys": "1.0.0", - "espree": "3.5.3", - "esquery": "1.0.0", - "esutils": "2.0.2", - "file-entry-cache": "2.0.0", - "functional-red-black-tree": "1.0.1", - "glob": "7.1.2", - "globals": "11.3.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "inquirer": "3.3.0", - "is-resolvable": "1.1.0", - "js-yaml": "3.10.0", - "json-stable-stringify-without-jsonify": "1.0.1", - "levn": "0.3.0", - "lodash": "4.17.4", - "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", - "require-uncached": "1.0.3", - "semver": "5.4.1", - "strip-ansi": "4.0.0", - "strip-json-comments": "2.0.1", - "table": "4.0.2", - "text-table": "0.2.0" + "version": "6.8.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz", + "integrity": "sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "ajv": "^6.10.0", + "chalk": "^2.1.0", + "cross-spawn": "^6.0.5", + "debug": "^4.0.1", + "doctrine": "^3.0.0", + "eslint-scope": "^5.0.0", + "eslint-utils": "^1.4.3", + "eslint-visitor-keys": "^1.1.0", + "espree": "^6.1.2", + "esquery": "^1.0.1", + "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", + "inquirer": "^7.0.0", + "is-glob": "^4.0.0", + "js-yaml": "^3.13.1", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.3.0", + "lodash": "^4.17.14", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "natural-compare": "^1.4.0", + "optionator": "^0.8.3", + "progress": "^2.0.0", + "regexpp": "^2.0.1", + "semver": "^6.1.2", + "strip-ansi": "^5.2.0", + "strip-json-comments": "^3.0.1", + "table": "^5.2.3", + "text-table": "^0.2.0", + "v8-compile-cache": "^2.0.3" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "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.1" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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": { - "ms": "2.0.0" + "is-glob": "^4.0.1" } }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - }, "globals": { - "version": "11.3.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", - "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "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" + } + }, + "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 }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "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": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" } }, - "strip-ansi": { + "resolve-from": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "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": "3.0.0" + "ansi-regex": "^4.1.0" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": "2.0.0" + "has-flag": "^3.0.0" } } } }, + "eslint-config-prettier": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz", + "integrity": "sha512-oB8cpLWSAjOVFEJhhyMZh6NOEOtBVziaqdDQ86+qhDHFbZXoRTM7pNSvFRfW/W/L/LrQ38C99J5CGuRBBzBsdA==", + "dev": true, + "requires": { + "get-stdin": "^6.0.0" + } + }, + "eslint-plugin-es": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-2.0.0.tgz", + "integrity": "sha512-f6fceVtg27BR02EYnBhgWLFQfK6bN4Ll0nQFrBHOlCsAyxeZkn0NHns5O0YZOPrV1B3ramd6cgFwaoFLcSkwEQ==", + "dev": true, + "requires": { + "eslint-utils": "^1.4.2", + "regexpp": "^3.0.0" + }, + "dependencies": { + "regexpp": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz", + "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==", + "dev": true + } + } + }, "eslint-plugin-mocha": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-4.11.0.tgz", - "integrity": "sha1-kRk6L1XiCl41l0BUoAidMBmO5Xg=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-mocha/-/eslint-plugin-mocha-6.3.0.tgz", + "integrity": "sha512-Cd2roo8caAyG21oKaaNTj7cqeYRWW1I2B5SfpKRp0Ip1gkfwoR1Ow0IGlPWnNjzywdF4n+kHL8/9vM6zCJUxdg==", "dev": true, "requires": { - "ramda": "0.24.1" + "eslint-utils": "^2.0.0", + "ramda": "^0.27.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.0.0.tgz", + "integrity": "sha512-0HCPuJv+7Wv1bACm8y5/ECVfYdfsAm9xmVb7saeFlxjPYALefjhbYoCkBjPdPzGH8wWyTpAez82Fh3VKYEZ8OA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + } } }, "eslint-plugin-node": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-5.2.1.tgz", - "integrity": "sha512-xhPXrh0Vl/b7870uEbaumb2Q+LxaEcOQ3kS1jtIXanBAwpMre1l5q/l2l/hESYJGEFKuI78bp6Uw50hlpr7B+g==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-10.0.0.tgz", + "integrity": "sha512-1CSyM/QCjs6PXaT18+zuAXsjXGIGo5Rw630rSKwokSs2jrYURQc4R5JZpoanNCqwNmepg+0eZ9L7YiRUJb8jiQ==", "dev": true, "requires": { - "ignore": "3.3.7", - "minimatch": "3.0.4", - "resolve": "1.5.0", - "semver": "5.3.0" + "eslint-plugin-es": "^2.0.0", + "eslint-utils": "^1.4.2", + "ignore": "^5.1.1", + "minimatch": "^3.0.4", + "resolve": "^1.10.1", + "semver": "^6.1.0" }, "dependencies": { + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, "semver": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", - "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true } } @@ -3592,87 +7357,103 @@ "integrity": "sha512-xlS7P2PLMXeqfhyf3NpqbvbnW04kN8M9NtmhpR3XGyOvt/vNKS7XPXT5EDbwKW9vCjWH4PpfQvgD/+JgN0VJKA==", "dev": true, "requires": { - "safe-regex": "1.1.0" + "safe-regex": "^1.1.0" } }, "eslint-scope": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", - "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", + "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "eslint-utils": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz", + "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==", "dev": true, "requires": { - "esrecurse": "4.2.0", - "estraverse": "4.2.0" + "eslint-visitor-keys": "^1.1.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==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", + "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, "espree": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", - "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz", + "integrity": "sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==", "dev": true, "requires": { - "acorn": "5.4.1", - "acorn-jsx": "3.0.1" - }, - "dependencies": { - "acorn": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", - "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", - "dev": true - } + "acorn": "^7.1.1", + "acorn-jsx": "^5.2.0", + "eslint-visitor-keys": "^1.1.0" } }, "esprima": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.0.0.tgz", - "integrity": "sha1-U88kes2ncxPlUcOqLnM0LT+099k=", - "optional": true + "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 }, "espurify": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/espurify/-/espurify-1.7.0.tgz", - "integrity": "sha1-HFz2y8zDLm9jk4C9T5kfq5up0iY=", - "dev": true, - "requires": { - "core-js": "2.5.1" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/espurify/-/espurify-2.0.1.tgz", + "integrity": "sha512-7w/dUrReI/QbJFHRwfomTlkQOXaB1NuCrBRn5Y26HXn5gvh18/19AgLbayVrNxXQfkckvgrJloWyvZDuJ7dhEA==", + "dev": true }, "esquery": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", - "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "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": "4.2.0" + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.1.0.tgz", + "integrity": "sha512-FyohXK+R0vE+y1nHLoBM7ZTyqRpqAlhdZHCWIWEviFLiGB8b04H6bQs8G+XTthacvT8VuwvteiP7RJSxMs8UEw==", + "dev": true + } } }, "esrecurse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", - "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", + "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { - "estraverse": "4.2.0", - "object-assign": "4.1.1" + "estraverse": "^4.1.0" } }, "estraverse": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", - "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, + "estree-is-member-expression": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/estree-is-member-expression/-/estree-is-member-expression-1.0.0.tgz", + "integrity": "sha512-Ec+X44CapIGExvSZN+pGkmr5p7HwUVQoPQSd458Lqwvaf4/61k/invHSh4BYK8OXnCkfEhWuIoG5hayKLQStIg==" + }, "esutils": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", - "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "etag": { @@ -3680,35 +7461,15 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dev": true, - "requires": { - "d": "1.0.0", - "es5-ext": "0.10.37" - } - }, - "event-stream": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", - "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "from": "0.1.7", - "map-stream": "0.1.0", - "pause-stream": "0.0.11", - "split": "0.3.3", - "stream-combiner": "0.0.4", - "through": "2.3.8" - } + "event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==" }, "eventemitter3": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.2.0.tgz", - "integrity": "sha1-HIaZHYFq0eUEdQ5zh0Ik7PO+xQg=", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.4.tgz", + "integrity": "sha512-rlaVLnVxtxvoyLsQQFBx53YmXHDxRIzzTLbdfxqi4yocpSjAxXwkU0cScM5JgSKMqEhrZpnvQ2D9gjylR0AimQ==", "dev": true }, "events": { @@ -3717,12 +7478,12 @@ "integrity": "sha1-nr23Y1rQmccNzEwqH1AEKI6L2SQ=" }, "eventsource": { - "version": "0.1.6", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", - "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", "dev": true, "requires": { - "original": "1.0.0" + "original": "^1.0.0" } }, "evp_bytestokey": { @@ -3731,192 +7492,397 @@ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", "dev": true, "requires": { - "md5.js": "1.3.4", - "safe-buffer": "5.1.1" + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" } }, "execa": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.8.0.tgz", - "integrity": "sha1-2NdrvBtVIX7RkP1t1J08d07PyNo=", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + } } }, "execall": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execall/-/execall-1.0.0.tgz", - "integrity": "sha1-c9CQTjlbPKsGWLCNCewlMH8pu3M=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/execall/-/execall-2.0.0.tgz", + "integrity": "sha512-0FU2hZ5Hh6iQnarpRtQurM/aAvp3RIbfvgLHrcqJYzhXyV2KFruhuChf9NC6waAhiUR7FFtlugkI4p7f2Fqlow==", "dev": true, "requires": { - "clone-regexp": "1.0.0" + "clone-regexp": "^2.1.0" } }, - "exit-hook": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/exit-hook/-/exit-hook-1.1.1.tgz", - "integrity": "sha1-8FyiM7SMBdVP/wd2XfhQfpXAL/g=", - "dev": true - }, "expand-brackets": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", - "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", - "dev": true, - "requires": { - "is-posix-bracket": "0.1.1" + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, - "expand-range": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", - "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", "dev": true, "requires": { - "fill-range": "2.2.3" + "homedir-polyfill": "^1.0.1" } }, - "expect-ct": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/expect-ct/-/expect-ct-0.1.0.tgz", - "integrity": "sha1-UnNWeN4YUwiQ2Ne5XwrGNkCVgJQ=" - }, "expose-loader": { - "version": "0.7.4", - "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.4.tgz", - "integrity": "sha512-lweINkewAXcQtNjd7j1gO3cd8O/8lNYijsEwH4YZ+Dv3gT2Kh9/YvJov5Mdp2A75QIhgOvsSyRa/ZG3wYjNZpA==", + "version": "0.7.5", + "resolved": "https://registry.npmjs.org/expose-loader/-/expose-loader-0.7.5.tgz", + "integrity": "sha512-iPowgKUZkTPX5PznYsmifVj9Bob0w2wTHVkt/eYNPSzyebkUgIedmskf/kcfEIWpiWjg3JRjnW+a17XypySMuw==", "dev": true }, "express": { - "version": "4.16.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", - "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.7", "array-flatten": "1.1.1", - "body-parser": "1.18.2", - "content-disposition": "0.5.2", - "content-type": "1.0.4", - "cookie": "0.3.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", "cookie-signature": "1.0.6", "debug": "2.6.9", - "depd": "1.1.1", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", - "finalhandler": "1.1.0", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", "fresh": "0.5.2", "merge-descriptors": "1.0.1", - "methods": "1.1.2", - "on-finished": "2.3.0", - "parseurl": "1.3.2", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", "path-to-regexp": "0.1.7", - "proxy-addr": "2.0.2", - "qs": "6.5.1", - "range-parser": "1.2.0", - "safe-buffer": "5.1.1", - "send": "0.16.1", - "serve-static": "1.13.1", - "setprototypeof": "1.1.0", - "statuses": "1.3.1", - "type-is": "1.6.15", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", "utils-merge": "1.0.1", - "vary": "1.1.2" + "vary": "~1.1.2" }, "dependencies": { - "setprototypeof": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } }, - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "extend": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", - "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", - "dev": true + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" }, - "external-editor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", - "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", "dev": true, "requires": { - "chardet": "0.4.2", - "iconv-lite": "0.4.19", - "tmp": "0.0.33" + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, - "extglob": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", - "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { - "is-extglob": "1.0.0" + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" }, "dependencies": { - "is-extglob": { + "define-property": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } } } }, "extract-loader": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-1.0.2.tgz", - "integrity": "sha512-hwlXWGHwzBXRNQCkDnLJuNgSkRsmYOwNz7wG9pHfA2EAgQaBCuQR71az7qL3rQT1JAMujiKPc+laet0kddVXWQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/extract-loader/-/extract-loader-3.1.0.tgz", + "integrity": "sha512-baiz/xalbyQJOTHwcMJKXYsHbhEHGWQ2loK26vqZVoqO6eeinrnSrMx9681pNZgGRqz2L/PsyNxz+PVDiSmNPg==", "dev": true, "requires": { - "loader-utils": "1.1.0" + "babel-runtime": "^6.26.0", + "btoa": "^1.2.1", + "loader-utils": "^1.1.0", + "resolve": "^1.8.1" } }, - "falafel": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.1.0.tgz", - "integrity": "sha1-lrsXdh2rqU9G0AFzizzt86Z/4Gw=", + "extract-text-webpack-plugin": { + "version": "4.0.0-beta.0", + "resolved": "https://registry.npmjs.org/extract-text-webpack-plugin/-/extract-text-webpack-plugin-4.0.0-beta.0.tgz", + "integrity": "sha512-Hypkn9jUTnFr0DpekNam53X47tXn3ucY08BQumv7kdGgeVUBLq3DJHJTi6HNxv4jl9W+Skxjz9+RnK0sJyqqjA==", "dev": true, "requires": { - "acorn": "5.2.1", - "foreach": "2.0.5", - "isarray": "0.0.1", - "object-keys": "1.0.11" + "async": "^2.4.1", + "loader-utils": "^1.1.0", + "schema-utils": "^0.4.5", + "webpack-sources": "^1.1.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } + } + }, + "extract-zip": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz", + "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==", + "dev": true, + "requires": { + "concat-stream": "^1.6.2", + "debug": "^2.6.9", + "mkdirp": "^0.5.4", + "yauzl": "^2.10.0" + }, + "dependencies": { + "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" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true + }, + "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" + } } } }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, "fast-deep-equal": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", - "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", - "dev": true + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", + "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==" + }, + "fast-glob": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.2.tgz", + "integrity": "sha512-UDV82o4uQyljznxwMxyVRJgZZt3O5wENYojjzbaGEGZgeOxkLFf+V4cnUD+krzb2F72E18RhamkMZ7AdeggF7A==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + }, + "dependencies": { + "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" + } + } + } }, "fast-json-stable-stringify": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -3924,55 +7890,88 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-text-encoding": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fast-text-encoding/-/fast-text-encoding-1.0.3.tgz", + "integrity": "sha512-dtm4QZH9nZtcDt8qJiOH9fcQd1NAgi+K1O2DbE6GG1PPCK/BWfOH3idCTRQ4ImXRUOyopDEgDEnVEE7Y/2Wrig==" + }, "fastparse": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz", - "integrity": "sha1-0eJkOzipTXWDtHkGDmxK/8lAcfg=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", "dev": true }, + "fastq": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.7.0.tgz", + "integrity": "sha512-YOadQRnHd5q6PogvAR/x62BGituF2ufiEA6s8aavQANw5YKHERI4AREboX6KotzP8oX2klxYF2wcV/7bn1clfQ==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "faye-websocket": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" + } + }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "requires": { + "pend": "~1.2.0" } }, + "feature-policy": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/feature-policy/-/feature-policy-0.3.0.tgz", + "integrity": "sha512-ZtijOTFN7TzCujt1fnNhfWPFPSHeZkesff9AXZj+UEjYBynWNUIYpC87Ve4wHzyexQsImicLu7WsC2LHq7/xrQ==" + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, "figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", "dev": true, "requires": { - "escape-string-regexp": "1.0.5" + "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=", + "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": "1.3.0", - "object-assign": "4.1.1" + "flat-cache": "^2.0.1" } }, "file-loader": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.6.tgz", - "integrity": "sha512-873ztuL+/hfvXbLDJ262PGO6XjERnybJu2gW1/5j8HUfxSiFJI9Hj/DhZ50ZGRUxBvuNiazb/cM2rh9pqrxP6Q==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.3.0.tgz", + "integrity": "sha512-aKrYPYjF1yG3oX0kWRrqrSMfgftm7oJW5M+m4owoldH5C51C0RkIwB++JbRvEW3IU6/ZG5n8UvEcdgwOt2UOWA==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "schema-utils": "0.3.0" + "loader-utils": "^1.2.3", + "schema-utils": "^2.5.0" } }, - "filename-regex": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", - "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", - "dev": true + "file-uri-to-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", + "dev": true, + "optional": true }, "fill-keys": { "version": "1.0.2", @@ -3980,61 +7979,57 @@ "integrity": "sha1-mo+jb06K1jTjv2tPPIiCVRRS6yA=", "dev": true, "requires": { - "is-object": "1.0.1", - "merge-descriptors": "1.0.1" - }, - "dependencies": { - "is-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", - "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", - "dev": true - } + "is-object": "~1.0.1", + "merge-descriptors": "~1.0.0" } }, "fill-range": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", - "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "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, "requires": { - "is-number": "2.1.0", - "isobject": "2.1.0", - "randomatic": "1.1.7", - "repeat-element": "1.1.2", - "repeat-string": "1.6.1" + "to-regex-range": "^5.0.1" } }, "finalhandler": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", - "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "requires": { "debug": "2.6.9", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "on-finished": "2.3.0", - "parseurl": "1.3.2", - "statuses": "1.3.1", - "unpipe": "1.0.0" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" }, "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "find-cache-dir": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz", - "integrity": "sha1-kojj6ePMN0hxfTnq3hfPcfww7m8=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", "dev": true, "requires": { - "commondir": "1.0.1", - "make-dir": "1.1.0", - "pkg-dir": "2.0.0" + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" } }, "find-up": { @@ -4043,211 +8038,327 @@ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { - "locate-path": "2.0.0" + "locate-path": "^2.0.0" } }, - "flat-cache": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", - "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "findup-sync": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-3.0.0.tgz", + "integrity": "sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg==", "dev": true, "requires": { - "circular-json": "0.3.3", - "del": "2.2.2", - "graceful-fs": "4.1.11", - "write": "0.2.1" + "detect-file": "^1.0.0", + "is-glob": "^4.0.0", + "micromatch": "^3.0.4", + "resolve-dir": "^1.0.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } } }, - "flatten": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz", - "integrity": "sha1-2uRqnXj74lKSJYzB54CkHZXAN4I=", - "dev": true - }, - "fluent": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/fluent/-/fluent-0.4.2.tgz", - "integrity": "sha512-P2w5DeSRYkq80J2VsuFC4SRZaG/jglAgVbHkUgLAaRoQtdDw6vdJjr36/ZH2zKk7bBwubGdIBuavNAhOVeuQxw==" - }, - "fluent-intl-polyfill": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fluent-intl-polyfill/-/fluent-intl-polyfill-0.1.0.tgz", - "integrity": "sha1-ETOUSrJHeINHOZVZaIPg05z4hc8=", + "flat": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", + "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "dev": true, "requires": { - "intl-pluralrules": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b" + "is-buffer": "~2.0.3" } }, - "fluent-langneg": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/fluent-langneg/-/fluent-langneg-0.1.0.tgz", - "integrity": "sha512-SzRtXNaIcCyRabIpcv+AQd0gn+tXv1wfDDvej3wtBo1/XV0iDnCw5XzbARRRmZMW+IEg+Q26jup6vYgnDam4dg==" - }, - "flush-write-stream": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.2.tgz", - "integrity": "sha1-yBuQ2HRnZvGmCaRoCZRsRd2K5Bc=", + "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": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "flatted": "^2.0.0", + "rimraf": "2.6.3", + "write": "1.0.3" }, "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "glob": "^7.1.3" } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + } + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.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": { - "safe-buffer": "5.1.1" + "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" } } } }, + "follow-redirects": { + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", + "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", + "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 }, - "for-own": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", - "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", - "dev": true, - "requires": { - "for-in": "1.0.2" - } - }, - "foreach": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", - "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", - "dev": true - }, - "forever-agent": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.5.2.tgz", - "integrity": "sha1-bQ4JxJIflKJ/Y9O0nF/v8epMUTA=", - "dev": true - }, - "form-data": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-0.0.8.tgz", - "integrity": "sha1-CJDNEAXFzOzAudJKiAUskkQtDbU=", + "foreground-child": { + "version": "1.5.6", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz", + "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=", "dev": true, "requires": { - "async": "0.2.10", - "combined-stream": "0.0.7", - "mime": "1.2.11" + "cross-spawn": "^4", + "signal-exit": "^3.0.0" }, "dependencies": { - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "dev": true, + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dev": true, + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", "dev": true } } }, - "formatio": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", - "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", - "dev": true, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "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==", "requires": { - "samsam": "1.3.0" + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" } }, - "formidable": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.1.1.tgz", - "integrity": "sha1-lriIb3w8NQi5Mta9cMTTqI818ak=", - "dev": true - }, "forwarded": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" }, - "frameguard": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.0.0.tgz", - "integrity": "sha1-e8rUae57lukdEs6zlZx4I1qScuk=" + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } }, "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, - "from": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", - "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", - "dev": true - }, "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" }, "dependencies": { "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "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" } } } }, + "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==" + }, "fs-extra": { - "version": "0.30.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.30.0.tgz", - "integrity": "sha1-8jP/zAjU2n1DLapEl3aYnbHfk/A=", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "jsonfile": "2.4.0", - "klaw": "1.3.1", - "path-is-absolute": "1.0.1", - "rimraf": "2.6.2" + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" } }, "fs-write-stream-atomic": { @@ -4256,10 +8367,27 @@ "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "iferr": "0.1.5", - "imurmurhash": "0.1.4", - "readable-stream": "1.1.14" + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + }, + "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" + } + } } }, "fs.realpath": { @@ -4269,135 +8397,63 @@ "dev": true }, "fsevents": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", - "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "version": "1.2.12", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz", + "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==", "dev": true, "optional": true, "requires": { - "nan": "2.8.0", - "node-pre-gyp": "0.6.39" + "bindings": "^1.5.0", + "nan": "^2.12.1", + "node-pre-gyp": "*" }, "dependencies": { "abbrev": { - "version": "1.1.0", + "version": "1.1.1", "bundled": true, "dev": true, "optional": true }, - "ajv": { - "version": "4.11.8", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "co": "4.6.0", - "json-stable-stringify": "1.0.1" - } - }, "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { - "version": "1.1.1", + "version": "1.2.0", "bundled": true, "dev": true, "optional": true }, "are-we-there-yet": { - "version": "1.1.4", + "version": "1.1.5", "bundled": true, "dev": true, "optional": true, "requires": { - "delegates": "1.0.0", - "readable-stream": "2.2.9" + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" } }, - "asn1": { - "version": "0.2.3", - "bundled": true, - "dev": true, - "optional": true - }, - "assert-plus": { - "version": "0.2.0", - "bundled": true, - "dev": true, - "optional": true - }, - "asynckit": { - "version": "0.4.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws-sign2": { - "version": "0.6.0", - "bundled": true, - "dev": true, - "optional": true - }, - "aws4": { - "version": "1.6.0", - "bundled": true, - "dev": true, - "optional": true - }, "balanced-match": { - "version": "0.4.2", - "bundled": true, - "dev": true - }, - "bcrypt-pbkdf": { - "version": "1.0.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "tweetnacl": "0.14.5" - } - }, - "block-stream": { - "version": "0.0.9", - "bundled": true, - "dev": true, - "requires": { - "inherits": "2.0.3" - } - }, - "boom": { - "version": "2.10.1", + "version": "1.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, "brace-expansion": { - "version": "1.1.7", + "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { - "balanced-match": "0.4.2", + "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, - "buffer-shims": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, - "caseless": { - "version": "0.12.0", - "bundled": true, - "dev": true, - "optional": true - }, - "co": { - "version": "4.6.0", + "chownr": { + "version": "1.1.4", "bundled": true, "dev": true, "optional": true @@ -4405,76 +8461,42 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true - }, - "combined-stream": { - "version": "1.0.5", - "bundled": true, "dev": true, - "requires": { - "delayed-stream": "1.0.0" - } + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "cryptiles": { - "version": "2.0.5", - "bundled": true, - "dev": true, - "requires": { - "boom": "2.10.1" - } - }, - "dashdash": { - "version": "1.14.1", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "debug": { - "version": "2.6.8", + "version": "3.2.6", "bundled": true, "dev": true, "optional": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, "deep-extend": { - "version": "0.4.2", + "version": "0.6.0", "bundled": true, "dev": true, "optional": true }, - "delayed-stream": { - "version": "1.0.0", - "bundled": true, - "dev": true - }, "delegates": { "version": "1.0.0", "bundled": true, @@ -4482,74 +8504,25 @@ "optional": true }, "detect-libc": { - "version": "1.0.2", - "bundled": true, - "dev": true, - "optional": true - }, - "ecc-jsbn": { - "version": "0.1.1", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "jsbn": "0.1.1" - } - }, - "extend": { - "version": "3.0.1", - "bundled": true, - "dev": true, - "optional": true - }, - "extsprintf": { - "version": "1.0.2", - "bundled": true, - "dev": true - }, - "forever-agent": { - "version": "0.6.1", + "version": "1.0.3", "bundled": true, "dev": true, "optional": true }, - "form-data": { - "version": "2.1.4", + "fs-minipass": { + "version": "1.2.7", "bundled": true, "dev": true, "optional": true, "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.15" + "minipass": "^2.6.0" } }, "fs.realpath": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "fstream": { - "version": "1.0.11", - "bundled": true, - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "inherits": "2.0.3", - "mkdirp": "0.5.1", - "rimraf": "2.6.1" - } - }, - "fstream-ignore": { - "version": "1.0.5", - "bundled": true, "dev": true, - "optional": true, - "requires": { - "fstream": "1.0.11", - "inherits": "2.0.3", - "minimatch": "3.0.4" - } + "optional": true }, "gauge": { "version": "2.7.4", @@ -4557,65 +8530,28 @@ "dev": true, "optional": true, "requires": { - "aproba": "1.1.1", - "console-control-strings": "1.1.0", - "has-unicode": "2.0.1", - "object-assign": "4.1.1", - "signal-exit": "3.0.2", - "string-width": "1.0.2", - "strip-ansi": "3.0.1", - "wide-align": "1.1.2" - } - }, - "getpass": { - "version": "0.1.7", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "assert-plus": "1.0.0" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" } }, "glob": { - "version": "7.1.2", - "bundled": true, - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "graceful-fs": { - "version": "4.1.11", - "bundled": true, - "dev": true - }, - "har-schema": { - "version": "1.0.5", - "bundled": true, - "dev": true, - "optional": true - }, - "har-validator": { - "version": "4.2.1", + "version": "7.1.6", "bundled": true, "dev": true, "optional": true, "requires": { - "ajv": "4.11.8", - "har-schema": "1.0.5" + "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" } }, "has-unicode": { @@ -4624,49 +8560,42 @@ "dev": true, "optional": true }, - "hawk": { - "version": "3.1.3", + "iconv-lite": { + "version": "0.4.24", "bundled": true, "dev": true, + "optional": true, "requires": { - "boom": "2.10.1", - "cryptiles": "2.0.5", - "hoek": "2.16.3", - "sntp": "1.0.9" + "safer-buffer": ">= 2.1.2 < 3" } }, - "hoek": { - "version": "2.16.3", - "bundled": true, - "dev": true - }, - "http-signature": { - "version": "1.1.1", + "ignore-walk": { + "version": "3.0.3", "bundled": true, "dev": true, "optional": true, "requires": { - "assert-plus": "0.2.0", - "jsprim": "1.4.0", - "sshpk": "1.13.0" + "minimatch": "^3.0.4" } }, "inflight": { "version": "1.0.6", "bundled": true, "dev": true, + "optional": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "once": "^1.3.0", + "wrappy": "1" } }, "inherits": { - "version": "2.0.3", + "version": "2.0.4", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { - "version": "1.3.4", + "version": "1.3.5", "bundled": true, "dev": true, "optional": true @@ -4675,178 +8604,146 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "number-is-nan": "1.0.1" + "number-is-nan": "^1.0.0" } }, - "is-typedarray": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - }, "isarray": { "version": "1.0.0", "bundled": true, - "dev": true - }, - "isstream": { - "version": "0.1.2", - "bundled": true, "dev": true, "optional": true }, - "jodid25519": { - "version": "1.0.2", + "minimatch": { + "version": "3.0.4", "bundled": true, "dev": true, "optional": true, "requires": { - "jsbn": "0.1.1" + "brace-expansion": "^1.1.7" } }, - "jsbn": { - "version": "0.1.1", + "minimist": { + "version": "1.2.5", "bundled": true, "dev": true, "optional": true }, - "json-schema": { - "version": "0.2.3", + "minipass": { + "version": "2.9.0", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } }, - "json-stable-stringify": { - "version": "1.0.1", + "minizlib": { + "version": "1.3.3", "bundled": true, "dev": true, "optional": true, "requires": { - "jsonify": "0.0.0" + "minipass": "^2.9.0" } }, - "json-stringify-safe": { - "version": "5.0.1", + "mkdirp": { + "version": "0.5.3", "bundled": true, "dev": true, - "optional": true + "optional": true, + "requires": { + "minimist": "^1.2.5" + } }, - "jsonify": { - "version": "0.0.0", + "ms": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "jsprim": { - "version": "1.4.0", + "needle": { + "version": "2.3.3", "bundled": true, "dev": true, "optional": true, "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.0.2", - "json-schema": "0.2.3", - "verror": "1.3.6" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" } }, - "mime-db": { - "version": "1.27.0", - "bundled": true, - "dev": true - }, - "mime-types": { - "version": "2.1.15", + "node-pre-gyp": { + "version": "0.14.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "mime-db": "1.27.0" + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4.4.2" } }, - "minimatch": { - "version": "3.0.4", + "nopt": { + "version": "4.0.3", "bundled": true, "dev": true, + "optional": true, "requires": { - "brace-expansion": "1.1.7" + "abbrev": "1", + "osenv": "^0.1.4" } }, - "minimist": { - "version": "0.0.8", - "bundled": true, - "dev": true - }, - "mkdirp": { - "version": "0.5.1", + "npm-bundled": { + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "minimist": "0.0.8" + "npm-normalize-package-bin": "^1.0.1" } }, - "ms": { - "version": "2.0.0", + "npm-normalize-package-bin": { + "version": "1.0.1", "bundled": true, "dev": true, "optional": true }, - "node-pre-gyp": { - "version": "0.6.39", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "detect-libc": "1.0.2", - "hawk": "3.1.3", - "mkdirp": "0.5.1", - "nopt": "4.0.1", - "npmlog": "4.1.0", - "rc": "1.2.1", - "request": "2.81.0", - "rimraf": "2.6.1", - "semver": "5.3.0", - "tar": "2.2.1", - "tar-pack": "3.4.0" - } - }, - "nopt": { - "version": "4.0.1", + "npm-packlist": { + "version": "1.4.8", "bundled": true, "dev": true, "optional": true, "requires": { - "abbrev": "1.1.0", - "osenv": "0.1.4" + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" } }, "npmlog": { - "version": "4.1.0", + "version": "4.1.2", "bundled": true, "dev": true, "optional": true, "requires": { - "are-we-there-yet": "1.1.4", - "console-control-strings": "1.1.0", - "gauge": "2.7.4", - "set-blocking": "2.0.0" + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" } }, "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "oauth-sign": { - "version": "0.8.2", - "bundled": true, "dev": true, "optional": true }, @@ -4860,8 +8757,9 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "os-homedir": { @@ -4877,201 +8775,126 @@ "optional": true }, "osenv": { - "version": "0.1.4", + "version": "0.1.5", "bundled": true, "dev": true, "optional": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" } }, "path-is-absolute": { "version": "1.0.1", "bundled": true, - "dev": true - }, - "performance-now": { - "version": "0.2.0", - "bundled": true, "dev": true, "optional": true }, "process-nextick-args": { - "version": "1.0.7", - "bundled": true, - "dev": true - }, - "punycode": { - "version": "1.4.1", - "bundled": true, - "dev": true, - "optional": true - }, - "qs": { - "version": "6.4.0", + "version": "2.0.1", "bundled": true, "dev": true, "optional": true }, "rc": { - "version": "1.2.1", + "version": "1.2.8", "bundled": true, "dev": true, "optional": true, "requires": { - "deep-extend": "0.4.2", - "ini": "1.3.4", - "minimist": "1.2.0", - "strip-json-comments": "2.0.1" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "bundled": true, - "dev": true, - "optional": true - } + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" } }, "readable-stream": { - "version": "2.2.9", - "bundled": true, - "dev": true, - "requires": { - "buffer-shims": "1.0.0", - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "1.0.1", - "util-deprecate": "1.0.2" - } - }, - "request": { - "version": "2.81.0", + "version": "2.3.7", "bundled": true, "dev": true, "optional": true, "requires": { - "aws-sign2": "0.6.0", - "aws4": "1.6.0", - "caseless": "0.12.0", - "combined-stream": "1.0.5", - "extend": "3.0.1", - "forever-agent": "0.6.1", - "form-data": "2.1.4", - "har-validator": "4.2.1", - "hawk": "3.1.3", - "http-signature": "1.1.1", - "is-typedarray": "1.0.0", - "isstream": "0.1.2", - "json-stringify-safe": "5.0.1", - "mime-types": "2.1.15", - "oauth-sign": "0.8.2", - "performance-now": "0.2.0", - "qs": "6.4.0", - "safe-buffer": "5.0.1", - "stringstream": "0.0.5", - "tough-cookie": "2.3.2", - "tunnel-agent": "0.6.0", - "uuid": "3.0.1" + "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" } }, "rimraf": { - "version": "2.6.1", + "version": "2.7.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "glob": "7.1.2" + "glob": "^7.1.3" } }, "safe-buffer": { - "version": "5.0.1", + "version": "5.1.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, - "semver": { - "version": "5.3.0", + "safer-buffer": { + "version": "2.1.2", "bundled": true, "dev": true, "optional": true }, - "set-blocking": { - "version": "2.0.0", + "sax": { + "version": "1.2.4", "bundled": true, "dev": true, "optional": true }, - "signal-exit": { - "version": "3.0.2", + "semver": { + "version": "5.7.1", "bundled": true, "dev": true, "optional": true }, - "sntp": { - "version": "1.0.9", + "set-blocking": { + "version": "2.0.0", "bundled": true, "dev": true, - "requires": { - "hoek": "2.16.3" - } + "optional": true }, - "sshpk": { - "version": "1.13.0", + "signal-exit": { + "version": "3.0.2", "bundled": true, "dev": true, - "optional": true, - "requires": { - "asn1": "0.2.3", - "assert-plus": "1.0.0", - "bcrypt-pbkdf": "1.0.1", - "dashdash": "1.14.1", - "ecc-jsbn": "0.1.1", - "getpass": "0.1.7", - "jodid25519": "1.0.2", - "jsbn": "0.1.1", - "tweetnacl": "0.14.5" - }, - "dependencies": { - "assert-plus": { - "version": "1.0.0", - "bundled": true, - "dev": true, - "optional": true - } - } + "optional": true }, "string-width": { "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" } }, "string_decoder": { - "version": "1.0.1", + "version": "1.1.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "safe-buffer": "5.0.1" + "safe-buffer": "~5.1.0" } }, - "stringstream": { - "version": "0.0.5", - "bundled": true, - "dev": true, - "optional": true - }, "strip-ansi": { "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-json-comments": { @@ -5081,94 +8904,46 @@ "optional": true }, "tar": { - "version": "2.2.1", - "bundled": true, - "dev": true, - "requires": { - "block-stream": "0.0.9", - "fstream": "1.0.11", - "inherits": "2.0.3" - } - }, - "tar-pack": { - "version": "3.4.0", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "debug": "2.6.8", - "fstream": "1.0.11", - "fstream-ignore": "1.0.5", - "once": "1.4.0", - "readable-stream": "2.2.9", - "rimraf": "2.6.1", - "tar": "2.2.1", - "uid-number": "0.0.6" - } - }, - "tough-cookie": { - "version": "2.3.2", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "punycode": "1.4.1" - } - }, - "tunnel-agent": { - "version": "0.6.0", + "version": "4.4.13", "bundled": true, "dev": true, "optional": true, "requires": { - "safe-buffer": "5.0.1" + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" } }, - "tweetnacl": { - "version": "0.14.5", - "bundled": true, - "dev": true, - "optional": true - }, - "uid-number": { - "version": "0.0.6", - "bundled": true, - "dev": true, - "optional": true - }, "util-deprecate": { "version": "1.0.2", "bundled": true, - "dev": true - }, - "uuid": { - "version": "3.0.1", - "bundled": true, "dev": true, "optional": true }, - "verror": { - "version": "1.3.6", - "bundled": true, - "dev": true, - "optional": true, - "requires": { - "extsprintf": "1.0.2" - } - }, "wide-align": { - "version": "1.1.2", + "version": "1.1.3", "bundled": true, "dev": true, "optional": true, "requires": { - "string-width": "1.0.2" + "string-width": "^1.0.2 || 2" } }, "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true + }, + "yallist": { + "version": "3.1.1", + "bundled": true, + "dev": true, + "optional": true } } }, @@ -5184,205 +8959,240 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, + "gaxios": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.4.tgz", + "integrity": "sha512-97NmFuMETFQh6gqPUxkqjxRMjmY8aRKRMphIkgO/b90AbCt5wAVuXsp8oWjIXlLN2pIK/fsXD8edcM7ULkFMLg==", + "requires": { + "abort-controller": "^3.0.0", + "extend": "^3.0.2", + "https-proxy-agent": "^5.0.0", + "is-stream": "^2.0.0", + "node-fetch": "^2.3.0" + } + }, + "gcp-metadata": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.4.tgz", + "integrity": "sha512-5J/GIH0yWt/56R3dNaNWPGQ/zXsZOddYECfJaqxFWgrZ9HC2Kvc5vl9upOgUUHKzURjAVf2N+f6tEJiojqXUuA==", + "requires": { + "gaxios": "^3.0.0", + "json-bigint": "^1.0.0" + } + }, + "gcs-resumable-upload": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-3.1.1.tgz", + "integrity": "sha512-RS1osvAicj9+MjCc6jAcVL1Pt3tg7NK2C2gXM5nqD1Gs0klF2kj5nnAFSBy97JrtslMIQzpb7iSuxaG8rFWd2A==", + "requires": { + "abort-controller": "^3.0.0", + "configstore": "^5.0.0", + "extend": "^3.0.2", + "gaxios": "^3.0.0", + "google-auth-library": "^6.0.0", + "pumpify": "^2.0.0", + "stream-events": "^1.0.4" + }, + "dependencies": { + "configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "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" + } + }, + "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==", + "requires": { + "semver": "^6.0.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "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==", + "requires": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + } + } + }, + "gensync": { + "version": "1.0.0-beta.1", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", + "integrity": "sha512-r8EC6NO1sngH/zdD9fiRDLdcgnbayXah+mLgManTaIZJqEC1MZstmnox8KpnI2/fxQwrp5OpCOYWLp4rBl4Jcg==", + "dev": true + }, "get-caller-file": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", - "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "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-own-enumerable-property-symbols": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-2.0.1.tgz", - "integrity": "sha512-TtY/sbOemiMKPRUDDanGCSgBYe7Mf0vbRsWnBZ+9yghpZ1MvcpSpuZFjHdEeY/LZjZy0vdLjS77L6HosisFiug==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==", "dev": true }, "get-stdin": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-5.0.1.tgz", - "integrity": "sha1-Ei4WFZHiH/TFJTAwVpPyDmOTo5g=", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-6.0.0.tgz", + "integrity": "sha512-jp4tHawyV7+fkkSKyvjuLZswblUtz+SQKzSWnBbii16BuZksJlU1wuBYXY75r+duh/llF1ur6oNwi+2ZzjKZ7g==", "dev": true }, "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "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" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, - "ghauth": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ghauth/-/ghauth-3.0.0.tgz", - "integrity": "sha1-gpKiTvR4mfGAo5x4DEgJVhKUvbw=", - "dev": true, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", "requires": { - "application-config": "0.1.2", - "bl": "0.9.5", - "hyperquest": "1.2.0", - "mkdirp": "0.5.1", - "read": "1.0.7", - "xtend": "4.0.1" + "assert-plus": "^1.0.0" } }, "git-rev-sync": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.9.1.tgz", - "integrity": "sha1-oMLj3TkqvPa3aWLif8dfsyI0Sc4=", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/git-rev-sync/-/git-rev-sync-1.12.0.tgz", + "integrity": "sha1-RGhAbH5sO6TPRYeZnhrbKNnRr1U=", "dev": true, "requires": { "escape-string-regexp": "1.0.5", "graceful-fs": "4.1.11", "shelljs": "0.7.7" - } - }, - "github": { - "version": "0.1.16", - "resolved": "https://registry.npmjs.org/github/-/github-0.1.16.tgz", - "integrity": "sha1-iV0qhbD+t5gNiawM5PRNyqA/F7U=", - "dev": true - }, - "github-changes": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/github-changes/-/github-changes-1.1.2.tgz", - "integrity": "sha512-S4lzHQHyPSyHm22JjE+Vsyr8/d797NPmYYpBqwfkPj9qHIbSwENoqKngyfGbaVbmPFTeE6QMgDbcX12TWy+fpg==", - "dev": true, - "requires": { - "bluebird": "1.0.3", - "ghauth": "3.0.0", - "github": "0.1.16", - "github-commit-stream": "0.1.0", - "lodash": "2.4.1", - "moment-timezone": "0.5.5", - "nomnom": "1.6.2", - "parse-link-header": "0.1.0", - "semver": "5.4.1" }, "dependencies": { - "bluebird": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-1.0.3.tgz", - "integrity": "sha1-xLRBGEgC47ZKYe7tRXgnG0yL9qw=", - "dev": true - }, - "lodash": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.1.tgz", - "integrity": "sha1-W3cjA03aTSYuWkb7LFjXzCL3FCA=", + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", "dev": true } } }, - "github-commit-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/github-commit-stream/-/github-commit-stream-0.1.0.tgz", - "integrity": "sha1-2823smeWcYa3DMc2ORgw2mNo16E=", - "dev": true, - "requires": { - "async": "0.2.10", - "parse-link-header": "0.1.0", - "request": "2.22.0", - "through": "2.3.8" - } - }, "glob": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", - "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", - "dev": true, - "requires": { - "fs.realpath": "1.0.0", - "inflight": "1.0.6", - "inherits": "2.0.3", - "minimatch": "3.0.4", - "once": "1.4.0", - "path-is-absolute": "1.0.1" - } - }, - "glob-base": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", - "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", "dev": true, "requires": { - "glob-parent": "2.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" } }, "glob-parent": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", - "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", "dev": true, "requires": { - "is-glob": "2.0.1" + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" }, "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", "dev": true, "requires": { - "is-extglob": "1.0.0" + "is-extglob": "^2.1.0" } } } }, + "glob-to-regexp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz", + "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=", + "dev": true + }, "global": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/global/-/global-4.3.2.tgz", - "integrity": "sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz", + "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==", + "requires": { + "min-document": "^2.19.0", + "process": "^0.11.10" + } + }, + "global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dev": true, + "requires": { + "global-prefix": "^3.0.0" + } + }, + "global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, "requires": { - "min-document": "2.19.0", - "process": "0.5.2" + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" } }, "globals": { - "version": "9.18.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", - "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "globby": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", - "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", + "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", "dev": true, "requires": { - "array-union": "1.0.2", - "arrify": "1.0.1", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "dir-glob": "^2.0.0", + "glob": "^7.1.2", + "ignore": "^3.3.5", + "pify": "^3.0.0", + "slash": "^1.0.0" }, "dependencies": { "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", "dev": true } } @@ -5393,31 +9203,103 @@ "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=", "dev": true }, + "gonzales-pe": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/gonzales-pe/-/gonzales-pe-4.3.0.tgz", + "integrity": "sha512-otgSPpUmdWJ43VXyiNgEYE4luzHCL2pz4wQ0OnDluC6Eg4Ko3Vexy/SrSynglw/eR+OhkzmqFCZa/OFa/RgAOQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "google-auth-library": { + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.6.tgz", + "integrity": "sha512-fWYdRdg55HSJoRq9k568jJA1lrhg9i2xgfhVIMJbskUmbDpJGHsbv9l41DGhCDXM21F9Kn4kUwdysgxSYBYJUw==", + "requires": { + "arrify": "^2.0.0", + "base64-js": "^1.3.0", + "ecdsa-sig-formatter": "^1.0.11", + "fast-text-encoding": "^1.0.0", + "gaxios": "^3.0.0", + "gcp-metadata": "^4.1.0", + "gtoken": "^5.0.0", + "jws": "^4.0.0", + "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, + "google-p12-pem": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.2.tgz", + "integrity": "sha512-tbjzndQvSIHGBLzHnhDs3cL4RBjLbLXc2pYvGH+imGVu5b4RMAttUTdnmW2UH0t11QeBTXZ7wlXPS7hrypO/tg==", + "requires": { + "node-forge": "^0.9.0" + } + }, "graceful-fs": { - "version": "4.1.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", - "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", - "dev": true + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" }, "growl": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", - "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, + "gtoken": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.3.tgz", + "integrity": "sha512-Nyd1wZCMRc2dj/mAD0LlfQLcAO06uKdpKJXvK85SGrF5+5+Bpfil9u/2aw35ltvEHjvl0h5FMKN5knEU+9JrOg==", + "requires": { + "gaxios": "^3.0.0", + "google-p12-pem": "^3.0.0", + "jws": "^4.0.0", + "mime": "^2.2.0" + } + }, "handle-thing": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-1.2.5.tgz", - "integrity": "sha1-/Xqtcmvxpf0W38KbL3pmAdJxOcQ=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz", + "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==", + "requires": { + "ajv": "^6.5.5", + "har-schema": "^2.0.0" + } + }, "has": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", - "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "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" + "function-bind": "^1.1.1" } }, "has-ansi": { @@ -5425,87 +9307,206 @@ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "has-flag": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", - "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "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, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "hash-base": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-2.0.2.tgz", - "integrity": "sha1-ZuodhW206KVHDK32/OI65SRO8uE=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", + "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", "dev": true, "requires": { - "inherits": "2.0.3" + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "hash-stream-validation": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/hash-stream-validation/-/hash-stream-validation-0.2.3.tgz", + "integrity": "sha512-OEohGLoUOh+bwsIpHpdvhIXFyRGjeLqJbT8Yc5QTZPbRM7LKywagTQxnX/6mghLDOrD9YGz88hy5mLN2eKflYQ==", + "requires": { + "through2": "^2.0.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } } }, "hash.js": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.3.tgz", - "integrity": "sha512-/UETyP0W22QILqS+6HowevwhEFJ3MBJnwTf75Qob9Wz9t0DPuisL8kW8YZMK62dHAKE1c1p+gY1TtOLY+USEHA==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", "dev": true, "requires": { - "inherits": "2.0.3", - "minimalistic-assert": "1.0.0" + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" } }, - "hawk": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/hawk/-/hawk-0.13.1.tgz", - "integrity": "sha1-NheViCH1gxHk1/beKR/KZitBLvQ=", + "hasha": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz", + "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=", "dev": true, "requires": { - "boom": "0.4.2", - "cryptiles": "0.2.2", - "hoek": "0.8.5", - "sntp": "0.2.4" + "is-stream": "^1.0.1" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + } } }, "he": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", - "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "helmet": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.10.0.tgz", - "integrity": "sha512-wVu5jSeImztLqNQPc4hqGr1DG0Ki2UJVmQ1KTugIrtl1f4Zw5SqVqh6QPyw5b6/Jo/iAnyTt+pcehB0RdEJsbw==", - "requires": { - "dns-prefetch-control": "0.1.0", - "dont-sniff-mimetype": "1.0.0", - "expect-ct": "0.1.0", - "frameguard": "3.0.0", - "helmet-csp": "2.7.0", - "hide-powered-by": "1.0.0", + "version": "3.23.3", + "resolved": "https://registry.npmjs.org/helmet/-/helmet-3.23.3.tgz", + "integrity": "sha512-U3MeYdzPJQhtvqAVBPntVgAvNSOJyagwZwyKsFdyRa8TV3pOKVFljalPOCxbw5Wwf2kncGhmP0qHjyazIdNdSA==", + "requires": { + "depd": "2.0.0", + "dont-sniff-mimetype": "1.1.0", + "feature-policy": "0.3.0", + "helmet-crossdomain": "0.4.0", + "helmet-csp": "2.10.0", + "hide-powered-by": "1.1.0", "hpkp": "2.0.0", - "hsts": "2.1.0", - "ienoopen": "1.0.0", - "nocache": "2.0.0", - "referrer-policy": "1.1.0", - "x-xss-protection": "1.0.0" + "hsts": "2.2.0", + "nocache": "2.1.0", + "referrer-policy": "1.2.0", + "x-xss-protection": "1.3.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } } }, + "helmet-crossdomain": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/helmet-crossdomain/-/helmet-crossdomain-0.4.0.tgz", + "integrity": "sha512-AB4DTykRw3HCOxovD1nPR16hllrVImeFp5VBV9/twj66lJ2nU75DP8FPL0/Jp4jj79JhTfG+pFI2MD02kWJ+fA==" + }, "helmet-csp": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.7.0.tgz", - "integrity": "sha512-IGIAkWnxjRbgMXFA2/kmDqSIrIaSfZ6vhMHlSHw7jm7Gm9nVVXqwJ2B1YEpYrJsLrqY+w2Bbimk7snux9+sZAw==", + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/helmet-csp/-/helmet-csp-2.10.0.tgz", + "integrity": "sha512-Rz953ZNEFk8sT2XvewXkYN0Ho4GEZdjAZy4stjiEQV3eN7GDxg1QKmYggH7otDyIA7uGA6XnUMVSgeJwbR5X+w==", "requires": { + "bowser": "2.9.0", "camelize": "1.0.0", - "content-security-policy-builder": "2.0.0", - "dasherize": "2.0.0", - "lodash.reduce": "4.6.0", - "platform": "1.3.5" + "content-security-policy-builder": "2.1.0", + "dasherize": "2.0.0" } }, + "hex-color-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz", + "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==", + "dev": true + }, "hide-powered-by": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.0.0.tgz", - "integrity": "sha1-SoWtZYgfYoV/xwr3F0oRhNzM4ys=" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hide-powered-by/-/hide-powered-by-1.1.0.tgz", + "integrity": "sha512-Io1zA2yOA1YJslkr+AJlWSf2yWFkKjvkcL9Ni1XSUqnGLr/qRQe2UI3Cn/J9MsJht7yEVCe0SscY1HgVMujbgg==" }, "hmac-drbg": { "version": "1.0.1", @@ -5513,31 +9514,24 @@ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", "dev": true, "requires": { - "hash.js": "1.1.3", - "minimalistic-assert": "1.0.0", - "minimalistic-crypto-utils": "1.0.1" + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" } }, - "hoek": { - "version": "0.8.5", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.8.5.tgz", - "integrity": "sha1-Hp/XcO9+vgJ0rfy1sIBqAlpeTp8=", - "dev": true - }, - "home-or-tmp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", - "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "homedir-polyfill": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", + "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, "requires": { - "os-homedir": "1.0.2", - "os-tmpdir": "1.0.2" + "parse-passwd": "^1.0.0" } }, "hosted-git-info": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", - "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==", "dev": true }, "hpack.js": { @@ -5546,34 +9540,25 @@ "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", "dev": true, "requires": { - "inherits": "2.0.3", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "wbuf": "1.7.2" + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" }, "dependencies": { "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "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" } } } @@ -5583,21 +9568,49 @@ "resolved": "https://registry.npmjs.org/hpkp/-/hpkp-2.0.0.tgz", "integrity": "sha1-EOFCJk52IVpdMMROxD3mTe5tFnI=" }, + "hsl-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz", + "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=", + "dev": true + }, + "hsla-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz", + "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=", + "dev": true + }, "hsts": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.1.0.tgz", - "integrity": "sha512-zXhh/DqgrTXJ7erTN6Fh5k/xjMhDGXCqdYN3wvxUvGUQvnxcFfUd8E+6vLg/nk3ss1TYMb+DhRl25fYABioTvA==" + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/hsts/-/hsts-2.2.0.tgz", + "integrity": "sha512-ToaTnQ2TbJkochoVcdXYm4HOCliNozlviNsg+X2XQLQvZNI/kCHR9rZxVYpJB3UPcHz80PgxRyWQ7PdU1r+VBQ==", + "requires": { + "depd": "2.0.0" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + } + } }, "html-comment-regex": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.1.tgz", - "integrity": "sha1-ZouTd26q5V696POtRkswekljYl4=", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz", + "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==", "dev": true }, "html-entities": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.1.tgz", - "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "html-loader": { @@ -5606,72 +9619,61 @@ "integrity": "sha512-7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==", "dev": true, "requires": { - "es6-templates": "0.2.3", - "fastparse": "1.1.1", - "html-minifier": "3.5.8", - "loader-utils": "1.1.0", - "object-assign": "4.1.1" + "es6-templates": "^0.2.3", + "fastparse": "^1.1.1", + "html-minifier": "^3.5.8", + "loader-utils": "^1.1.0", + "object-assign": "^4.1.1" } }, "html-minifier": { - "version": "3.5.8", - "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.8.tgz", - "integrity": "sha512-WX7D6PB9PFq05fZ1/CyxPUuyqXed6vh2fGOM80+zJT5wAO93D/cUjLs0CcbBFjQmlwmCgRvl97RurtArIpOnkw==", - "dev": true, - "requires": { - "camel-case": "3.0.0", - "clean-css": "4.1.9", - "commander": "2.12.2", - "he": "1.1.1", - "ncname": "1.0.0", - "param-case": "2.1.1", - "relateurl": "0.2.7", - "uglify-js": "3.3.9" + "version": "3.5.21", + "resolved": "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz", + "integrity": "sha512-LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==", + "dev": true, + "requires": { + "camel-case": "3.0.x", + "clean-css": "4.2.x", + "commander": "2.17.x", + "he": "1.2.x", + "param-case": "2.1.x", + "relateurl": "0.2.x", + "uglify-js": "3.4.x" + }, + "dependencies": { + "commander": { + "version": "2.17.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", + "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", + "dev": true + } } }, "html-tags": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-2.0.0.tgz", - "integrity": "sha1-ELMKOGCF9Dzt41PMj6fLDe7qZos=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.1.0.tgz", + "integrity": "sha512-1qYz89hW3lFDEazhjW0yVAV87lw8lVkrJocr72XmBkMKsoSVJCQx3W8BXsC7hO2qAt8BoVjYjtAcZ9perqGnNg==", "dev": true }, "htmlparser2": { - "version": "3.9.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.9.2.tgz", - "integrity": "sha1-G9+HrMoPP55T+k/M6w9LTLsAszg=", + "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.0", - "domhandler": "2.4.1", - "domutils": "1.6.2", - "entities": "1.1.1", - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "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" }, "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.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 } } }, @@ -5682,64 +9684,185 @@ "dev": true }, "http-errors": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", - "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", "requires": { - "depd": "1.1.1", + "depd": "~1.1.2", "inherits": "2.0.3", - "setprototypeof": "1.0.3", - "statuses": "1.4.0" + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } } }, - "http-parser-js": { - "version": "0.4.9", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.9.tgz", - "integrity": "sha1-6hoE+2St/wJC6ZdPKX3Uw8rSceE=", - "dev": true - }, "http-proxy": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.16.2.tgz", - "integrity": "sha1-Bt/ykpUr9k2+hHH6nfcwZtTzd0I=", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { - "eventemitter3": "1.2.0", - "requires-port": "1.0.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" } }, "http-proxy-middleware": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.17.4.tgz", - "integrity": "sha1-ZC6ISIUdZvCdTxJJEoRtuutBuDM=", + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", "dev": true, "requires": { - "http-proxy": "1.16.2", - "is-glob": "3.1.0", - "lodash": "4.17.4", - "micromatch": "2.3.11" + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" }, "dependencies": { - "is-glob": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", - "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "is-extglob": "2.1.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, "http-signature": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.10.1.tgz", - "integrity": "sha1-T72sEyVZqoMjEh5UB3nAoBKyfmY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "http_ece": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http_ece/-/http_ece-1.1.0.tgz", + "integrity": "sha512-bptAfCDdPJxOs5zYSe7Y3lpr772s1G346R4Td5LgRUeCwIGpCGDUTJxRrhTNcAXbx37spge0kWEIH7QAYWNTlA==", "dev": true, "requires": { - "asn1": "0.1.11", - "assert-plus": "0.1.5", - "ctype": "0.5.3" + "urlsafe-base64": "~1.0.0" } }, "https-browserify": { @@ -5748,99 +9871,184 @@ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", "dev": true }, - "husky": { - "version": "0.14.3", - "resolved": "https://registry.npmjs.org/husky/-/husky-0.14.3.tgz", - "integrity": "sha512-e21wivqHpstpoiWA/Yi8eFti8E+sQDSS53cpJsPptPs295QTOQR0ZwnHo2TXy1XOpZFD9rPOd3NpmqTK6uMLJA==", - "dev": true, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", "requires": { - "is-ci": "1.0.10", - "normalize-path": "1.0.0", - "strip-indent": "2.0.0" + "agent-base": "6", + "debug": "4" } }, - "hyperquest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/hyperquest/-/hyperquest-1.2.0.tgz", - "integrity": "sha1-OeH+9miI3Hzg3sbA3YFPb8iUStU=", - "dev": true, - "requires": { - "duplexer2": "0.0.2", - "through2": "0.6.5" + "husky": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/husky/-/husky-3.1.0.tgz", + "integrity": "sha512-FJkPoHHB+6s4a+jwPqBudBDvYZsoQW5/HBuMSehC8qDiCe50kpcxeqFoDSlow+9I6wg47YxBoT3WxaURlrDIIQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "ci-info": "^2.0.0", + "cosmiconfig": "^5.2.1", + "execa": "^1.0.0", + "get-stdin": "^7.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "read-pkg": "^5.2.0", + "run-node": "^1.0.0", + "slash": "^3.0.0" }, "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "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" + } + }, + "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" + } + }, + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", "dev": true }, - "readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "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": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" + "p-locate": "^4.1.0" } }, - "through2": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", - "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "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" + } + }, + "parse-json": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.0.0.tgz", + "integrity": "sha512-OOY5b7PAEFV0E2Fir1KOkxchnZNCdowAJgQ5NuxjpBKTRP3pQhwkrkxqQjeoKJ+fO7bCpmIZaogI4eZGDMEGOw==", + "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" + } + }, + "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 + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "requires": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "has-flag": "^3.0.0" } + }, + "type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true } } }, "hyperscript-attribute-to-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/hyperscript-attribute-to-property/-/hyperscript-attribute-to-property-1.0.0.tgz", - "integrity": "sha1-glMI1Ju44pV5I/cxmBvMgRytev8=" + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/hyperscript-attribute-to-property/-/hyperscript-attribute-to-property-1.0.2.tgz", + "integrity": "sha512-oerMul16jZCmrbNsUw8QgrtDzF8lKgFri1bKQjReLw1IhiiNkI59CWuzZjJDGT79UQ1YiWqXhJMv/tRMVqgtkA==" }, "hyperx": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/hyperx/-/hyperx-2.3.2.tgz", - "integrity": "sha512-fYFJn0kVMHpkLJKzqGXfs0+p26NH0R3PsLWQGZ5Enbp1jcyEK9U9uJGnsRKPgBCoQ6bVzkV+srwHVFc2+pHfYQ==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/hyperx/-/hyperx-2.5.4.tgz", + "integrity": "sha512-iOkSh7Yse7lsN/B9y7OsevLWjeXPqGuHQ5SbwaiJM5xAhWFqhoN6erpK1dQsS12OFU36lyai1pnx1mmzWLQqcA==", "requires": { - "hyperscript-attribute-to-property": "1.0.0" + "hyperscript-attribute-to-property": "^1.0.0" } }, "iconv-lite": { - "version": "0.4.19", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", - "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" - }, - "icss-replace-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz", - "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=", - "dev": true + "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" + } }, "icss-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz", - "integrity": "sha1-g/Cg7DeL8yRheLbCrZE28TWxyWI=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-4.1.1.tgz", + "integrity": "sha512-4aFq7wvWyMHKgxsH8QQtGpvbASCf+eM3wPRLI6R+MgAnTCZ6STYsRvttLvRWK0Nfif5piF394St3HeJDaljGPA==", "dev": true, "requires": { - "postcss": "6.0.14" + "postcss": "^7.0.14" } }, "ieee754": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.8.tgz", - "integrity": "sha1-vjPUCsEO8ZJnAfbwii2G+/0a0+Q=" - }, - "ienoopen": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.0.0.tgz", - "integrity": "sha1-NGpCj0dKrI9QzzeE6i0PFvYr2ms=" + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==" }, "iferr": { "version": "0.1.5", @@ -5849,31 +10057,65 @@ "dev": true }, "ignore": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", - "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz", + "integrity": "sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==", "dev": true }, - "immediate": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-lazy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", + "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", - "dev": true + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "dev": true, - "requires": { - "repeating": "2.0.1" - } + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true }, "indexes-of": { "version": "1.0.1", @@ -5881,10 +10123,10 @@ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", "dev": true }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", "dev": true }, "inflight": { @@ -5893,79 +10135,128 @@ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { - "once": "1.4.0", - "wrappy": "1.0.2" + "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=" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true }, "inquirer": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz", - "integrity": "sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==", - "dev": true, - "requires": { - "ansi-escapes": "3.0.0", - "chalk": "2.3.0", - "cli-cursor": "2.1.0", - "cli-width": "2.2.0", - "external-editor": "2.1.0", - "figures": "2.0.0", - "lodash": "4.17.4", - "mute-stream": "0.0.7", - "run-async": "2.3.0", - "rx-lite": "4.0.8", - "rx-lite-aggregates": "4.0.8", - "string-width": "2.1.1", - "strip-ansi": "4.0.0", - "through": "2.3.8" + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.1.0.tgz", + "integrity": "sha512-5fJMWEmikSYu0nv/flMc475MhGbB7TSPd/2IpFV4I4rMklboCH2rQjYY5kKiYGHqUF9gvaambupcJFFG9dvReg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^3.0.0", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.4.0", + "rxjs": "^6.5.3", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", "dev": true }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, - "strip-ansi": { + "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 + }, + "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 + }, + "has-flag": { "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "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": "3.0.0" + "ansi-regex": "^5.0.0" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^4.0.0" } } } @@ -5975,46 +10266,49 @@ "resolved": "https://registry.npmjs.org/intel/-/intel-1.2.0.tgz", "integrity": "sha1-EdEUfraz9Fgr31M3s31UFYTp5B4=", "requires": { - "chalk": "1.1.3", - "dbug": "0.4.2", - "stack-trace": "0.0.10", - "strftime": "0.10.0", - "symbol": "0.3.1", - "utcstring": "0.1.0" + "chalk": "^1.1.0", + "dbug": "~0.4.2", + "stack-trace": "~0.0.9", + "strftime": "~0.10.0", + "symbol": "~0.3.1", + "utcstring": "~0.1.0" } }, "internal-ip": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-1.2.0.tgz", - "integrity": "sha1-rp+/k7mEh4eF1QqN4bNWlWBYz1w=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", "dev": true, "requires": { - "meow": "3.7.0" + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" } }, "interpret": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", - "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", + "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", "dev": true }, "intl-pluralrules": { - "version": "github:projectfluent/IntlPluralRules#94cb0fa1c23ad943bc5aafef43cea132fa51d68b", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/intl-pluralrules/-/intl-pluralrules-1.2.0.tgz", + "integrity": "sha512-7v29fFKsaPquXezxttUNFdE6LQUD41I8JX76royEWBPuYIEruvfvprU3d8CsiNVIieVg/VeV2ee5WI0w0Vs2Sg==", "dev": true }, "invariant": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", - "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", "dev": true, "requires": { - "loose-envify": "1.3.1" + "loose-envify": "^1.0.0" } }, "invert-kv": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", - "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "ip": { @@ -6023,27 +10317,53 @@ "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", "dev": true }, - "ipaddr.js": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", - "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=" - }, - "is": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/is/-/is-0.2.7.tgz", - "integrity": "sha1-OzSixI81mXLzUEKEkZOucmS2NWI=", + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", "dev": true }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "is-absolute-url": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz", "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=", "dev": true }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "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 + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, "is-alphabetical": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.1.tgz", - "integrity": "sha1-x3B5zJHU76x3W+EDS/LSQ/lebwg=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", "dev": true }, "is-alphanumeric": { @@ -6053,15 +10373,21 @@ "dev": true }, "is-alphanumerical": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.1.tgz", - "integrity": "sha1-37SqTRCF4zvbYcLe6cgOnGwZ9Ts=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", "dev": true, "requires": { - "is-alphabetical": "1.0.1", - "is-decimal": "1.0.1" + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" } }, + "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", @@ -6074,82 +10400,102 @@ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", "dev": true, "requires": { - "binary-extensions": "1.11.0" + "binary-extensions": "^1.0.0" } }, "is-boolean-attribute": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/is-boolean-attribute/-/is-boolean-attribute-0.0.1.tgz", - "integrity": "sha1-JKtZt9y52jYSx3PmDGVlZeWgmAw=", - "dev": true + "integrity": "sha1-JKtZt9y52jYSx3PmDGVlZeWgmAw=" }, "is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" }, - "is-builtin-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", - "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "is-callable": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", + "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", + "dev": true + }, + "is-color-stop": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz", + "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=", "dev": true, "requires": { - "builtin-modules": "1.1.1" + "css-color-names": "^0.0.4", + "hex-color-regex": "^1.1.0", + "hsl-regex": "^1.0.0", + "hsla-regex": "^1.0.0", + "rgb-regex": "^1.0.1", + "rgba-regex": "^1.0.0" } }, - "is-callable": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", - "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", - "dev": true - }, - "is-ci": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-1.0.10.tgz", - "integrity": "sha1-9zkzayYyNlBhqdSCcM1WrjNpMY4=", + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", "dev": true, "requires": { - "ci-info": "1.1.2" + "kind-of": "^3.0.2" + }, + "dependencies": { + "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 + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, "is-date-object": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", - "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "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-decimal": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.1.tgz", - "integrity": "sha1-9ftqlJlq2ejjdh+/vQkfH8qMToI=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", "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, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, "is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", "dev": true }, - "is-dotfile": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", - "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", - "dev": true - }, - "is-electron": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.1.0.tgz", - "integrity": "sha512-dkg5xT383+M6zIbbXW/z7n2nz4SFUi2OSyhntnFYkRdtV+HVEfdjEK+5AWisfYgkpe3WYjTIuh7toaKmSfFVWw==" - }, - "is-equal-shallow": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", - "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", - "dev": true, - "requires": { - "is-primitive": "2.0.0" - } - }, "is-extendable": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", @@ -6162,15 +10508,6 @@ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, - "is-finite": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", - "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } - }, "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", @@ -6178,64 +10515,77 @@ "dev": true }, "is-glob": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz", - "integrity": "sha1-lSHHaEXMJhCoUgPd8ICpWML/q8A=", + "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-extglob": "^2.1.1" } }, "is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "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 + }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==" + }, + "is-object": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.1.tgz", - "integrity": "sha1-bghLvJIGH7sJcexYts5tQE4k2mk=", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", + "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=", "dev": true }, - "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", "dev": true, "requires": { - "kind-of": "3.2.2" + "symbol-observable": "^1.1.0" } }, - "is-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", - "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", - "dev": true - }, - "is-object": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/is-object/-/is-object-0.1.2.tgz", - "integrity": "sha1-AO+8CIFsM8/ErIJR0TLhDcZQmNc=", - "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=", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", "dev": true }, "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=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", "dev": true, "requires": { - "is-path-inside": "1.0.1" + "is-path-inside": "^2.1.0" + }, + "dependencies": { + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + } } }, "is-path-inside": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", - "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", - "dev": true, - "requires": { - "path-is-inside": "1.0.2" - } + "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-plain-obj": { "version": "1.1.0", @@ -6243,31 +10593,28 @@ "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", "dev": true }, - "is-posix-bracket": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", - "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", - "dev": true - }, - "is-primitive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", - "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", - "dev": true + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } }, "is-promise": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", - "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", "dev": true }, "is-regex": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", - "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", + "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", "dev": true, "requires": { - "has": "1.0.1" + "has": "^1.0.3" } }, "is-regexp": { @@ -6283,54 +10630,49 @@ "dev": true }, "is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", - "dev": true - }, - "is-supported-regexp-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-supported-regexp-flag/-/is-supported-regexp-flag-1.0.0.tgz", - "integrity": "sha1-i1IMhfrnolM4LUsCZS4EVXbhO7g=", - "dev": true + "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==" }, "is-svg": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz", - "integrity": "sha1-z2EJDaDZ77yrhyLeum8DIgjbsOk=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz", + "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==", "dev": true, "requires": { - "html-comment-regex": "1.1.1" + "html-comment-regex": "^1.1.0" } }, "is-symbol": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", - "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", - "dev": true + "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-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", - "dev": true + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, "is-whitespace-character": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.1.tgz", - "integrity": "sha1-muAXbzKCtlRXoZks2whPil+DPjs=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz", + "integrity": "sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==", "dev": true }, "is-windows": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", - "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "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 }, "is-word-character": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.1.tgz", - "integrity": "sha1-WgP6HqkazopusMfNdw64bWXIvvs=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-word-character/-/is-word-character-1.0.4.tgz", + "integrity": "sha512-5SMO8RVennx3nZrqtKwCGyyetPE9VDba5ugvKLaD4KopPG5kR4mQ7tNt/r7feL5yt5h3lpuBbIUmCOG2eSzXHA==", "dev": true }, "is-wsl": { @@ -6347,125 +10689,173 @@ "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", - "dev": true + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" }, "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", "dev": true, "requires": { - "isarray": "1.0.0" + "append-transform": "^1.0.0" } }, - "jest-get-type": { - "version": "21.2.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-21.2.0.tgz", - "integrity": "sha512-y2fFw3C+D0yjNSDp7ab1kcd6NUYfy3waPTlD8yWkAtiocJdBRQqNoRqVfMNxgj+IjT0V5cBIHJO0z9vuSSZ43Q==", - "dev": true + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "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 + } + } }, - "jest-validate": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-21.2.1.tgz", - "integrity": "sha512-k4HLI1rZQjlU+EC682RlQ6oZvLrE5SCh3brseQc24vbZTxzT/k/3urar5QMCVgjadmSO7lECeGdc6YxnM3yEGg==", + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", "dev": true, "requires": { - "chalk": "2.3.0", - "jest-get-type": "21.2.0", - "leven": "2.1.0", - "pretty-format": "21.2.1" + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.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==", + "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": { - "color-convert": "1.9.1" + "has-flag": "^3.0.0" } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "glob": "^7.1.3" } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } + "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 } } }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, "jmespath": { "version": "0.15.0", "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.15.0.tgz", "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=" }, - "js-base64": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.4.0.tgz", - "integrity": "sha512-Wehd+7Pf9tFvGb+ydPm9TjYjV8X1YHOVyG8QyELZxEMqOhemVwGRmoG8iQ/soqI3n8v4xn59zaLxiCJiaaRzKA==", - "dev": true - }, "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz", - "integrity": "sha1-XJZ93YN6m/3KXy3oQlOr6KHAO4A=", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "2.7.3" - }, - "dependencies": { - "esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=", - "dev": true - } + "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=" + }, "jsesc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", - "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-loader": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/json-loader/-/json-loader-0.5.7.tgz", - "integrity": "sha512-QLPs8Dj7lnf3e3QYS1zkCo+4ZwqOiF9d/nZnYozTISxXWCfNs9yuky5rJw4/W34s7POaNlbZmQGaB5NiXCbP4w==", - "dev": true + "json-bigint": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-bigint/-/json-bigint-1.0.0.tgz", + "integrity": "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ==", + "requires": { + "bignumber.js": "^9.0.0" + } }, "json-parse-better-errors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.1.tgz", - "integrity": "sha512-xyQpxeWWMKyJps9CuGJYeng6ssI5bpqS9ltQpdVQ90t4ql6NdnxFKh95JcRt2cun/DjMVNrdjniLPuMA69xmCw==", + "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=" + }, "json-schema-traverse": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", - "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", - "dev": true + "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==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -6474,29 +10864,31 @@ "dev": true }, "json-stringify-safe": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-4.0.0.tgz", - "integrity": "sha1-d8JxqupUMC5o7+rMtWq78GqbGlQ=", - "dev": true + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" }, "json3": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", - "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", "dev": true }, "json5": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", - "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.0.tgz", + "integrity": "sha512-8Mh9h6xViijj36g7Dxi+Y4S6hNGV96vcJZr/SrlHh1LR/pEn/8j/+qIBbs44YKl69Lrfctp4QD+AdWLTMqEZAQ==", + "requires": { + "minimist": "^1.2.0" + } }, "jsonfile": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", - "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "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.11" + "graceful-fs": "^4.1.6" } }, "jsonfilter": { @@ -6505,10 +10897,10 @@ "integrity": "sha1-Ie987cdRk4E8dZMulqmL4gW6WhE=", "dev": true, "requires": { - "JSONStream": "0.8.4", - "minimist": "1.2.0", - "stream-combiner": "0.2.2", - "through2": "0.6.5" + "JSONStream": "^0.8.4", + "minimist": "^1.1.0", + "stream-combiner": "^0.2.1", + "through2": "^0.6.3" }, "dependencies": { "isarray": { @@ -6517,33 +10909,23 @@ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", "dev": true }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "readable-stream": { "version": "1.0.34", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, - "stream-combiner": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", - "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", - "dev": true, - "requires": { - "duplexer": "0.1.1", - "through": "2.3.8" - } + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true }, "through2": { "version": "0.6.5", @@ -6551,102 +10933,79 @@ "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } }, - "jsonify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", - "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", - "dev": true - }, "jsonparse": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", "integrity": "sha1-MwVCrT8KZUZlt3jz6y2an6UHrGQ=", "dev": true }, - "jszip": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.1.5.tgz", - "integrity": "sha512-5W8NUaFRFRqTOL7ZDDrx5qWHJyBXy6velVudIzQUSoqAAYqzSh2Z7/m0Rf1QbmQJccegD0r+YZxBjzqoBiEeJQ==", - "dev": true, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", "requires": { - "core-js": "2.3.0", - "es6-promise": "3.0.2", - "lie": "3.1.1", - "pako": "1.0.6", - "readable-stream": "2.0.6" - }, - "dependencies": { - "core-js": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.3.0.tgz", - "integrity": "sha1-+rg/uwstjchfpjbEudNMdUIMbWU=", - "dev": true - }, - "readable-stream": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.6.tgz", - "integrity": "sha1-j5A0HmilPMySh4jaz80Rs265t44=", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "string_decoder": "0.10.31", - "util-deprecate": "1.0.2" - } - } + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" } }, "just-extend": { - "version": "1.1.27", - "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.27.tgz", - "integrity": "sha512-mJVp13Ix6gFo3SBAy9U/kL+oeZqzlYYYLQBwXVBlVzIsZwBqGREnOro24oC/8s8aox+rJhtZ2DiQof++IrkA+g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-4.1.0.tgz", + "integrity": "sha512-ApcjaOdVTJ7y4r08xI5wIqpvwS48Q0PBG4DJROcEkH1f8MdAiNFyFxz3xoL0LWAVwjrwPYZdVHHxhRHcx/uGLA==", "dev": true }, - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, + "jwa": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jwa/-/jwa-2.0.0.tgz", + "integrity": "sha512-jrZ2Qx916EA+fq9cEAeCROWPTfCwi1IVHqT2tapuqLEVVDKFDENFw1oL+MwrTvH6msKxsd1YTDVw6uKEcsrLEA==", "requires": { - "is-buffer": "1.1.6" + "buffer-equal-constant-time": "1.0.1", + "ecdsa-sig-formatter": "1.0.11", + "safe-buffer": "^5.0.1" } }, - "klaw": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz", - "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=", - "dev": true, + "jws": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jws/-/jws-4.0.0.tgz", + "integrity": "sha512-KDncfTmOZoOMTFG4mBlG0qUIOlc03fmzH+ru6RgYVZhPkyiy/92Owlt/8UEN+a4TXR1FQetfIpJE8ApdvdVxTg==", "requires": { - "graceful-fs": "4.1.11" + "jwa": "^2.0.0", + "safe-buffer": "^5.0.1" } }, - "known-css-properties": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.4.1.tgz", - "integrity": "sha512-n+ThoCKhyMFKkMfksdLMP5ndp+VzwDRzQdH6JlmZ2GTpUenYB2EeEKjOue2SErAAG/MmBSUISpwvawDhydWQdQ==", + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", "dev": true }, - "lazy-cache": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", - "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "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 + }, + "known-css-properties": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.16.0.tgz", + "integrity": "sha512-0g5vDDPvNnQk7WM/aE92dTDxXJoOE0biiIcUb3qkn/F6h/ZQZPlZIbE2XSXH2vFPfphkgCxuR2vH6HHnobEOaQ==", "dev": true }, "lcid": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", - "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { - "invert-kv": "1.0.0" + "invert-kv": "^2.0.0" } }, "ldjson-stream": { @@ -6655,8 +11014,8 @@ "integrity": "sha1-kb7O2lrE7SsX5kn7d356v6AYnCs=", "dev": true, "requires": { - "split2": "0.2.1", - "through2": "0.6.5" + "split2": "^0.2.1", + "through2": "^0.6.1" }, "dependencies": { "isarray": { @@ -6671,148 +11030,227 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } }, "leven": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", - "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, "levn": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", "dev": true, "requires": { - "prelude-ls": "1.1.2", - "type-check": "0.3.2" + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" } }, - "lie": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", - "integrity": "sha1-mkNrLMd0bKWd56QfpGmz77dr2H4=", - "dev": true, - "requires": { - "immediate": "3.0.6" - } + "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 }, "lint-staged": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-4.3.0.tgz", - "integrity": "sha512-C/Zxslg0VRbsxwmCu977iIs+QyrmW2cyRCPUV5NDFYOH/jtRFHH8ch7ua2fH0voI/nVC3Tpg7DykfgMZySliKw==", - "dev": true, - "requires": { - "app-root-path": "2.0.1", - "chalk": "2.3.0", - "commander": "2.12.2", - "cosmiconfig": "1.1.0", - "execa": "0.8.0", - "is-glob": "4.0.0", - "jest-validate": "21.2.1", - "listr": "0.12.0", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "minimatch": "3.0.4", - "npm-which": "3.0.1", - "p-map": "1.2.0", - "staged-git-files": "0.0.4", - "stringify-object": "3.2.1" + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz", + "integrity": "sha512-nawMob9cb/G1J98nb8v3VC/E8rcX1rryUYXVZ69aT9kde6YWX+uvNOEHY5yf2gcWcTJGiD0kqXmCnS3oD75GIA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "commander": "^2.20.0", + "cosmiconfig": "^5.2.1", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "del": "^5.0.0", + "execa": "^2.0.3", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "string-argv": "^0.3.0", + "stringify-object": "^3.3.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==", + "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.1" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "cross-spawn": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.2.tgz", + "integrity": "sha512-PD6G8QG3S4FK/XCGFbEQrDqO2AnMMsy0meR7lerlIOHAAbkuavGU/pOqprrlvfTNjvowivTeBsjebAL0NSoMxw==", "dev": true, "requires": { - "has-flag": "2.0.0" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } - } - } - }, - "listr": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/listr/-/listr-0.12.0.tgz", - "integrity": "sha1-a84sD1YD+klYDqF81qAMwOX6RRo=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "figures": "1.7.0", - "indent-string": "2.1.0", - "is-promise": "2.1.0", - "is-stream": "1.1.0", - "listr-silent-renderer": "1.1.1", - "listr-update-renderer": "0.2.0", - "listr-verbose-renderer": "0.4.1", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "ora": "0.2.3", - "p-map": "1.2.0", - "rxjs": "5.5.2", - "stream-to-observable": "0.1.0", - "strip-ansi": "3.0.1" - }, - "dependencies": { - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + }, + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" } }, - "log-symbols": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", - "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "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 + }, + "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" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { - "chalk": "1.1.3" + "isexe": "^2.0.0" } } } }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, "listr-silent-renderer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", @@ -6820,19 +11258,19 @@ "dev": true }, "listr-update-renderer": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.2.0.tgz", - "integrity": "sha1-yoDhd5tOcCZoB+ju0a1qvjmFUPk=", - "dev": true, - "requires": { - "chalk": "1.1.3", - "cli-truncate": "0.2.1", - "elegant-spinner": "1.0.1", - "figures": "1.7.0", - "indent-string": "3.2.0", - "log-symbols": "1.0.2", - "log-update": "1.0.2", - "strip-ansi": "3.0.1" + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" }, "dependencies": { "figures": { @@ -6841,8 +11279,8 @@ "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" } }, "indent-string": { @@ -6857,56 +11295,93 @@ "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", "dev": true, "requires": { - "chalk": "1.1.3" + "chalk": "^1.0.0" } } } }, "listr-verbose-renderer": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.4.1.tgz", - "integrity": "sha1-ggb0z21S3cWCfl/RSYng6WWTOjU=", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "date-fns": "1.29.0", - "figures": "1.7.0" + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^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" + } + }, + "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" + } + }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^2.0.0" } }, "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { - "escape-string-regexp": "1.0.5", - "object-assign": "4.1.1" + "escape-string-regexp": "^1.0.5" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "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": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "has-flag": "^3.0.0" } } } @@ -6917,39 +11392,46 @@ "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "4.0.0", - "pify": "3.0.0", - "strip-bom": "3.0.0" + "graceful-fs": "^4.1.2", + "parse-json": "^4.0.0", + "pify": "^3.0.0", + "strip-bom": "^3.0.0" }, "dependencies": { - "parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", - "dev": true, - "requires": { - "error-ex": "1.3.1", - "json-parse-better-errors": "1.0.1" - } + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true } } }, "loader-runner": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.0.tgz", - "integrity": "sha1-9IKuqC1UPgeSFwDVpG7yb9rGuKI=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", "dev": true }, "loader-utils": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz", - "integrity": "sha1-yYrvSIvM7aL/teLeZG1qdUQp9c0=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", "dev": true, "requires": { - "big.js": "3.2.0", - "emojis-list": "2.1.0", - "json5": "0.5.1" + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "dependencies": { + "json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + } } }, "locate-path": { @@ -6958,19 +11440,19 @@ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { - "p-locate": "2.0.0", - "path-exists": "3.0.0" + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" } }, "lodash": { - "version": "4.17.4", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", - "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=" + "version": "4.17.15", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, - "lodash.camelcase": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", - "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=", + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", "dev": true }, "lodash.clonedeep": { @@ -6978,10 +11460,10 @@ "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=" }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "lodash.flattendeep": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", + "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=", "dev": true }, "lodash.memoize": { @@ -6990,10 +11472,30 @@ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=", "dev": true }, - "lodash.reduce": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/lodash.reduce/-/lodash.reduce-4.6.0.tgz", - "integrity": "sha1-8atrg5KZrUj3hKu/R2WW8DuRTTs=" + "lodash.template": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", + "integrity": "sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0", + "lodash.templatesettings": "^4.0.0" + } + }, + "lodash.templatesettings": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz", + "integrity": "sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ==", + "dev": true, + "requires": { + "lodash._reinterpolate": "^3.0.0" + } + }, + "lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha1-JMS/zWsvuji/0FlNsRedjptlZWE=", + "dev": true }, "lodash.uniq": { "version": "4.5.0", @@ -7002,119 +11504,158 @@ "dev": true }, "log-symbols": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.1.0.tgz", - "integrity": "sha512-zLeLrzMA1A2vRF1e/0Mo+LNINzi6jzBylHj5WqvQ/WK/5WCZt8si9SyN4p9llr/HRYvVR1AoXHRHl4WTHyQAzQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", "dev": true, "requires": { - "chalk": "2.3.0" + "chalk": "^2.4.2" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "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.1" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": "2.0.0" + "has-flag": "^3.0.0" } } } }, "log-update": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-1.0.2.tgz", - "integrity": "sha1-GZKfZMQJPS0ucHWh2tivWcKWuNE=", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", "dev": true, "requires": { - "ansi-escapes": "1.4.0", - "cli-cursor": "1.0.2" + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" }, "dependencies": { "ansi-escapes": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", - "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { - "restore-cursor": "1.0.1" + "restore-cursor": "^2.0.0" } }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", "dev": true, "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" } } } }, "loglevel": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.0.tgz", - "integrity": "sha1-rgyqVhERSYxboTcj1vtjHSQAOTQ=", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, "lolex": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.3.2.tgz", - "integrity": "sha512-A5pN2tkFj7H0dGIAM6MFvHKMJcPnjZsOMvR7ujCjfgW5TbV6H9vb1PgxLtHvjqNZTHsUolz+6/WEO0N1xNx2ng==", - "dev": true - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-4.2.0.tgz", + "integrity": "sha512-gKO5uExCXvSm6zbF562EvM+rd1kQDnB9AZBbiQVzf1ZmdDpxUSvpnAaVOP83N/31mRK8Ml8/VE8DMvsAZQ+7wg==", "dev": true }, "longest-streak": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.2.tgz", - "integrity": "sha512-TmYTeEYxiAmSVdpbnQDXGtvYOIRsCMg89CVZzwzc2o7GFL1CjoiRPjH5ec0NFAVlAx3fVof9dX/t6KKRAo2OWA==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-2.0.4.tgz", + "integrity": "sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==", "dev": true }, "loose-envify": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", - "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { - "js-tokens": "3.0.2" + "js-tokens": "^3.0.0 || ^4.0.0" } }, "loud-rejection": { @@ -7123,136 +11664,141 @@ "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", "dev": true, "requires": { - "currently-unhandled": "0.4.1", - "signal-exit": "3.0.2" + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" } }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", - "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=", - "dev": true + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" }, "lru-cache": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", - "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { - "pseudomap": "1.0.2", - "yallist": "2.1.2" + "yallist": "^3.0.2" } }, - "lsmod": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lsmod/-/lsmod-1.0.0.tgz", - "integrity": "sha1-mgD3bco26yP6BTUK/htYXUKZ5ks=" + "lru_map": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", + "integrity": "sha1-tcg1G5Rky9dQM1p5ZQoOwOVhGN0=" }, - "macaddress": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/macaddress/-/macaddress-0.2.8.tgz", - "integrity": "sha1-WQTcU3w57G2+/q6QIycTX6hRHxI=", - "dev": true + "magic-string": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.23.2.tgz", + "integrity": "sha512-oIUZaAxbcxYIp4AyLafV6OVKoB3YouZs0UTCJ8mOKBHNyJgGDaMJ4TgA+VylJh6fx7EQCC52XkbURxxG9IoJXA==", + "requires": { + "sourcemap-codec": "^1.4.1" + } }, "make-dir": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.1.0.tgz", - "integrity": "sha512-0Pkui4wLJ7rxvmfUvs87skoEaxmu0hCUApF8nonzpl7q//FWp9zu8W61Scz4sd/kUiqDxvUhtoam2efDyiBzcA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", "dev": true, "requires": { - "pify": "3.0.0" + "pify": "^4.0.1", + "semver": "^5.6.0" } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", "dev": true }, - "map-stream": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", - "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "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 }, - "markdown-escapes": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.1.tgz", - "integrity": "sha1-GZTfLTr0gR3lmmcUk0wrIpJzRRg=", + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", "dev": true }, - "markdown-table": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.1.tgz", - "integrity": "sha1-Sz3ToTPRUYuO8NvHCb8qG0gkvIw=", + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "markdown-escapes": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/markdown-escapes/-/markdown-escapes-1.0.4.tgz", + "integrity": "sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg==", "dev": true }, - "math-expression-evaluator": { - "version": "1.2.17", - "resolved": "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz", - "integrity": "sha1-3oGf282E3M2PrlnGrreWFbnSZqw=", + "markdown-table": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/markdown-table/-/markdown-table-1.1.3.tgz", + "integrity": "sha512-1RUZVgQlpJSPWYbFSpmudq5nHY1doEIv89gBtF0s4gW1GF2XorxcA/70M5vq7rLv0a6mhOUccRsqkwhwLCIQ2Q==", "dev": true }, "mathml-tag-names": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.0.1.tgz", - "integrity": "sha1-jUEmgWi/htEQK5gQnijlMeejRXg=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", + "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, - "md5": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", - "integrity": "sha1-U6s41f48iJG6RlMp6iP6wFQBJvk=", - "requires": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "1.1.6" - } - }, "md5.js": { - "version": "1.3.4", - "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.4.tgz", - "integrity": "sha1-6b296UogpawYsENA/Fdk1bCdkB0=", + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", "dev": true, "requires": { - "hash-base": "3.0.4", - "inherits": "2.0.3" - }, - "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=", - "dev": true, - "requires": { - "inherits": "2.0.3", - "safe-buffer": "5.1.1" - } - } + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "mdast-util-compact": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.1.tgz", - "integrity": "sha1-zbX4TitqLTEU3zO9BdnLMuPECDo=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mdast-util-compact/-/mdast-util-compact-1.0.4.tgz", + "integrity": "sha512-3YDMQHI5vRiS2uygEFYaqckibpJtKq5Sj2c8JioeOQBU6INpKbdWzfyLqFFnDwEcEnRFIdMsguzs5pC1Jp4Isg==", "dev": true, "requires": { - "unist-util-modify-children": "1.1.1", - "unist-util-visit": "1.2.0" + "unist-util-visit": "^1.1.0" } }, + "mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==", + "dev": true + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, "mem": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", - "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { - "mimic-fn": "1.1.0" + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" } }, "memory-fs": { @@ -7260,208 +11806,121 @@ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", "dev": true, - "requires": { - "errno": "0.1.4", - "readable-stream": "2.3.3" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } - } - }, - "memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", - "dev": true - }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "dev": true, - "requires": { - "camelcase-keys": "2.1.0", - "decamelize": "1.2.0", - "loud-rejection": "1.6.0", - "map-obj": "1.0.1", - "minimist": "1.2.0", - "normalize-package-data": "2.4.0", - "object-assign": "4.1.1", - "read-pkg-up": "1.0.1", - "redent": "1.0.0", - "trim-newlines": "1.0.0" - }, - "dependencies": { - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "dev": true, - "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - } - }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + }, + "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": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "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" } + } + } + }, + "memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", + "dev": true + }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true }, "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", "dev": true, "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", "dev": true, "requires": { - "is-utf8": "0.2.1" + "camelcase": "^4.1.0" } } } }, "merge": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", - "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.1.tgz", + "integrity": "sha512-VjFo4P5Whtj4vsLzsYBu5ayHhoHJ0UqNm7ibvShmbmoz7tGi0vXaoJbGdB+GmDMLUdg8DpQXEIeVDAe8MaABvQ==" }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" }, + "merge-source-map": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz", + "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=", + "requires": { + "source-map": "^0.5.6" + } + }, + "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 + }, + "merge2": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz", + "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==", + "dev": true + }, "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", - "dev": true, - "requires": { - "arr-diff": "2.0.0", - "array-unique": "0.2.1", - "braces": "1.8.5", - "expand-brackets": "0.1.5", - "extglob": "0.3.2", - "filename-regex": "2.0.1", - "is-extglob": "1.0.0", - "is-glob": "2.0.1", - "kind-of": "3.2.2", - "normalize-path": "2.1.1", - "object.omit": "2.0.1", - "parse-glob": "3.0.4", - "regex-cache": "0.4.4" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - }, - "normalize-path": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", - "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", - "dev": true, - "requires": { - "remove-trailing-separator": "1.1.0" - } - } + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" } }, "miller-rabin": { @@ -7470,47 +11929,45 @@ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", "dev": true, "requires": { - "bn.js": "4.11.8", - "brorand": "1.1.0" + "bn.js": "^4.0.0", + "brorand": "^1.0.1" } }, "mime": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", - "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.4.tgz", + "integrity": "sha512-LRxmNwziLPT828z+4YkNzloCFC2YM4wrB99k+AV5ZbEyfGNWfG8SO1FUXLmLDBSo89NrJZ4DIWeLjy1CHGhMGA==" }, "mime-db": { - "version": "1.30.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", - "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=" + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" }, "mime-types": { - "version": "2.1.17", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", - "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "version": "2.1.27", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", + "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", "requires": { - "mime-db": "1.30.0" + "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=", - "dev": true + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "min-document": { "version": "2.19.0", "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz", "integrity": "sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=", - "dev": true, "requires": { - "dom-walk": "0.1.1" + "dom-walk": "^0.1.0" } }, "minimalistic-assert": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.0.tgz", - "integrity": "sha1-cCvi3aazf0g2vLP121ZkG2Sh09M=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", "dev": true }, "minimalistic-crypto-utils": { @@ -7525,86 +11982,325 @@ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "dev": true, "requires": { - "brace-expansion": "1.1.8" + "brace-expansion": "^1.1.7" } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } + } }, "mississippi": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-1.3.1.tgz", - "integrity": "sha512-/6rB8YXFbAtsUVRphIRQqB0+9c7VaPHCjVtvto+JqwVxgz8Zz+I+f68/JgQ+Pb4VlZb2svA9OtdXnHHsZz7ltg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + }, + "dependencies": { + "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" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "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" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } + }, + "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, "requires": { - "concat-stream": "1.6.0", - "duplexify": "3.5.3", - "end-of-stream": "1.4.1", - "flush-write-stream": "1.0.2", - "from2": "2.3.0", - "parallel-transform": "1.1.0", - "pump": "1.0.3", - "pumpify": "1.4.0", - "stream-each": "1.2.2", - "through2": "2.0.3" + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "mocha": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.0.0.tgz", - "integrity": "sha512-ukB2dF+u4aeJjc6IGtPNnJXfeby5d4ZqySlIBT0OEyva/DrMjVm5HkQxKnHDLKEfEQBsEnwTg9HHhtPHJdTd8w==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.3.tgz", + "integrity": "sha512-0R/3FvjIGH3eEuG17ccFPk117XL2rWxatr81a57D+r/x2uTYZRbdZ4oVidEUMh2W2TJDa7MdAb12Lm2/qrKajg==", "dev": true, "requires": { - "browser-stdout": "1.3.0", - "commander": "2.11.0", - "debug": "3.1.0", - "diff": "3.3.1", + "ansi-colors": "3.2.3", + "browser-stdout": "1.3.1", + "debug": "3.2.6", + "diff": "3.5.0", "escape-string-regexp": "1.0.5", - "glob": "7.1.2", - "growl": "1.10.3", - "he": "1.1.1", - "mkdirp": "0.5.1", - "supports-color": "4.4.0" + "find-up": "3.0.0", + "glob": "7.1.3", + "growl": "1.10.5", + "he": "1.2.0", + "js-yaml": "3.13.1", + "log-symbols": "2.2.0", + "minimatch": "3.0.4", + "mkdirp": "0.5.4", + "ms": "2.1.1", + "node-environment-flags": "1.0.5", + "object.assign": "4.1.0", + "strip-json-comments": "2.0.1", + "supports-color": "6.0.0", + "which": "1.3.1", + "wide-align": "1.1.3", + "yargs": "13.3.2", + "yargs-parser": "13.1.2", + "yargs-unparser": "1.6.0" }, "dependencies": { - "commander": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", - "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "ansi-colors": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", + "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, + "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" + } + } + } + }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "^2.1.1" } }, - "diff": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", - "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + } + }, + "mkdirp": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", - "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", + "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "has-flag": "2.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -7616,17 +12312,44 @@ "dev": true }, "moment": { - "version": "2.19.3", - "resolved": "https://registry.npmjs.org/moment/-/moment-2.19.3.tgz", - "integrity": "sha1-vbmdJw1tf9p4zA+6zoVeJ/59pp8=" + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz", + "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==" }, - "moment-timezone": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.5.tgz", - "integrity": "sha1-odVBCnLBil8pPyouYocKgK1DLa4=", + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "dev": true, "requires": { - "moment": "2.19.3" + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } } }, "move-concurrently": { @@ -7635,12 +12358,23 @@ "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", "dev": true, "requires": { - "aproba": "1.2.0", - "copy-concurrently": "1.0.5", - "fs-write-stream-atomic": "1.0.10", - "mkdirp": "0.5.1", - "rimraf": "2.6.2", - "run-queue": "1.0.3" + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } } }, "mozlog": { @@ -7648,23 +12382,23 @@ "resolved": "https://registry.npmjs.org/mozlog/-/mozlog-2.2.0.tgz", "integrity": "sha1-Rwk8XHEuKBDecnCYMFFk0SyK6SM=", "requires": { - "intel": "1.2.0", - "merge": "1.2.0" + "intel": "^1.0.0", + "merge": "^1.2.0" } }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "multicast-dns": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.1.tgz", - "integrity": "sha512-uV3/ckdsffHx9IrGQrx613mturMdMqQ06WTq+C09NsStJ9iNG6RcUWgPKs1Rfjy+idZT6tfQoXEusGNnEZhT3w==", + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", "dev": true, "requires": { - "dns-packet": "1.2.2", - "thunky": "0.1.0" + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" } }, "multicast-dns-service-types": { @@ -7679,22 +12413,35 @@ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", "dev": true, "requires": { - "array-differ": "1.0.0", - "array-union": "1.0.2", - "arrify": "1.0.1", - "minimatch": "3.0.4" + "array-differ": "^1.0.0", + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "minimatch": "^3.0.0" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + } } }, "mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, + "mutexify": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/mutexify/-/mutexify-1.3.0.tgz", + "integrity": "sha512-WNPlgZ3AHETGSa4jeRP4aW6BPQ/a++MwoMFFIgrDg80+m70mbxuNOrevANfBDmur82zxTFAY3OwvMAvqrkV2sA==" + }, "nan": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz", + "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==", "dev": true, "optional": true }, @@ -7703,58 +12450,163 @@ "resolved": "https://registry.npmjs.org/nanoassert/-/nanoassert-1.1.0.tgz", "integrity": "sha1-TzFS4JVA/eKMdvRLGbvNHVpCR40=" }, + "nanobench": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nanobench/-/nanobench-2.1.1.tgz", + "integrity": "sha512-z+Vv7zElcjN+OpzAxAquUayFLGK3JI/ubCl0Oh64YQqsTGG09CGqieJVQw4ui8huDnnAgrvTv93qi5UaOoNj8A==", + "requires": { + "browser-process-hrtime": "^0.1.2", + "chalk": "^1.1.3", + "mutexify": "^1.1.0", + "pretty-hrtime": "^1.0.2" + } + }, "nanobus": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.3.2.tgz", - "integrity": "sha512-yFvJ+3HfALzGAFLlBlDkMCjn/IVrv/mgD06lg9ZnGfWlC0XQYN+4tMKq21msDz0p6pMcFYNqrIpAn5Z91CviJg==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/nanobus/-/nanobus-4.4.0.tgz", + "integrity": "sha512-Hv9USGyH8EsPy0o8pPWE7x3YRIfuZDgMBirzjU6XLebhiSK2g53JlfqgolD0c39ne6wXAfaBNcIAvYe22Bav+Q==", "requires": { - "nanotiming": "6.1.5", - "remove-array-items": "1.0.0" + "nanoassert": "^1.1.0", + "nanotiming": "^7.2.0", + "remove-array-items": "^1.0.0" + } + }, + "nanocomponent": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/nanocomponent/-/nanocomponent-6.5.3.tgz", + "integrity": "sha512-upVuPqukP+ybmCuq8Tru0Ae2ele5bjCU1D/tNy12VJmsmehtRMsIfvSMAr14yL3wCfk/4LqYE6bUKOr/EHHMDg==", + "requires": { + "global": "^4.3.1", + "nanoassert": "^1.1.0", + "nanomorph": "^5.1.2", + "nanotiming": "^7.2.0", + "on-load": "^3.3.4" } }, "nanohref": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nanohref/-/nanohref-3.0.1.tgz", - "integrity": "sha512-YfDhNcglFDIISfKVnXHovDaaglTauD2ThidaTZuyV6NE0lQMvGs5UfSoa1GvX6Nd9p2TfFeYzzc+TtjH+htu+Q==" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nanohref/-/nanohref-3.1.0.tgz", + "integrity": "sha512-2DyDzc8B/29xRCDprTt8UscdsF3E/axcHQMIBFR+WM1cj1ku7hqxQWwMYDOajfEuv5fZdVTh+NBuFronappMQQ==", + "requires": { + "nanoassert": "^1.1.0" + } + }, + "nanohtml": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/nanohtml/-/nanohtml-1.9.1.tgz", + "integrity": "sha512-4snfp20yKdA6+dT1vv0F4l1oYmnFXPNHk3ZFTfOldD9LamFxQZ9gWk4gJz7wflq3XROLzrGQHfo0HT4V4kSkhQ==", + "requires": { + "acorn-node": "^1.8.2", + "camel-case": "^3.0.0", + "convert-source-map": "^1.5.1", + "estree-is-member-expression": "^1.0.0", + "hyperx": "^2.5.0", + "is-boolean-attribute": "0.0.1", + "nanoassert": "^1.1.0", + "nanobench": "^2.1.0", + "normalize-html-whitespace": "^0.2.0", + "through2": "^2.0.3", + "transform-ast": "^2.4.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + } + } }, - "nanolocation": { + "nanolru": { "version": "1.0.0", - "resolved": "https://registry.npmjs.org/nanolocation/-/nanolocation-1.0.0.tgz", - "integrity": "sha1-FbXHrwWJXRqfIfDRNkldmURQaGs=" + "resolved": "https://registry.npmjs.org/nanolru/-/nanolru-1.0.0.tgz", + "integrity": "sha512-GyQkE8M32pULhQk7Sko5raoIbPalAk90ICG+An4fq6fCsFHsP6fB2K46WGXVdoJpy4SGMnZ/EKbo123fZJomWg==" + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } }, "nanomorph": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/nanomorph/-/nanomorph-5.1.3.tgz", - "integrity": "sha512-VydkKjFWU/DAO0R10awFASRNXQKHrZUMdMIiNcdmWm+IhuifuPOw/dDtpiQ1cNROF8f3ATPrcKRVarEayQJOqA==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/nanomorph/-/nanomorph-5.4.0.tgz", + "integrity": "sha512-PJPh+P/NeiKphHNmCO8afkIhRbmeWxwpWhM1imKGWQMyuK1ul4rfnzKqrf3PEhbXYsqhMWCBEMm+q4jddYGODw==", "requires": { - "nanoassert": "1.1.0" + "nanoassert": "^1.1.0" } }, "nanoquery": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.2.0.tgz", - "integrity": "sha512-o4JC1cLsNSu8gLMLeALBFPzILMPyc3HltXT0727vncM29N1qB802oQyza3lQRjI9iylRRK0X5jjTjiPZyCw0gg==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/nanoquery/-/nanoquery-1.3.0.tgz", + "integrity": "sha512-eZv8Ct2PZn/CdOmD2BgLNwjhhPmxg4tXhygp0roaRer5RqBFB0gm0wHIb5VZcL0CS0r+yWQ1kBVYG7S1jUyG0A==", "requires": { - "nanoassert": "1.1.0" + "nanoassert": "^1.1.0" } }, "nanoraf": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nanoraf/-/nanoraf-3.0.1.tgz", - "integrity": "sha1-q5+5wle5rcxx2CmCy1jY+jUDdko=" + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nanoraf/-/nanoraf-3.1.0.tgz", + "integrity": "sha512-7Emv5Pv/fvgVK6yrud93WsdO4d3AUqLoP38Cpn0chYe+tT/wu25Yl2guxBjE3ngRrI5Yd9DxaTCgCFi1uq7hgQ==", + "requires": { + "nanoassert": "^1.1.0" + } }, "nanorouter": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/nanorouter/-/nanorouter-3.0.1.tgz", - "integrity": "sha512-i3PLabdN+Lc7agnJ3dTgQSHy5e5xOyuAeoIvPC0hlLOlFegt95mlg9xFhFC17+PK0A1iP6ev2FCkSMMTVt6zUA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/nanorouter/-/nanorouter-4.0.0.tgz", + "integrity": "sha512-HQ6VeNpFhIx/vKjqQiVUodeu0SvRb6ekkmkzf4pXMjkAZy0RS2jsIWZmzob9s6ORW0dfhYHpL7+w7T+bE5kNCQ==", + "requires": { + "nanoassert": "^1.1.0", + "wayfarer": "^7.0.0" + } + }, + "nanoscheduler": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/nanoscheduler/-/nanoscheduler-1.0.3.tgz", + "integrity": "sha512-jBbrF3qdU9321r8n9X7yu18DjP31Do2ItJm3mWrt90wJTrnDO+HXpoV7ftaUglAtjgj9s+OaCxGufbvx6pvbEQ==", "requires": { - "wayfarer": "6.6.3" + "nanoassert": "^1.1.0" } }, "nanotiming": { - "version": "6.1.5", - "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-6.1.5.tgz", - "integrity": "sha512-cMM+WkW9wqx3Kr3vKAhWKXN5vK4eElE8ooKEoLsfmxByCV+zob0fNJexG07sBa8vpFYAgXRlLhxcZ3b5k9yWrw==" + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/nanotiming/-/nanotiming-7.3.1.tgz", + "integrity": "sha512-l3lC7v/PfOuRWQa8vV29Jo6TG10wHtnthLElFXs4Te4Aas57Fo4n1Q8LH9n+NDh9riOzTVvb2QNBhTS4JUKNjw==", + "requires": { + "nanoassert": "^1.1.0", + "nanoscheduler": "^1.0.2" + } }, "natural-compare": { "version": "1.4.0", @@ -7762,31 +12614,39 @@ "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, - "ncname": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ncname/-/ncname-1.0.0.tgz", - "integrity": "sha1-W1etGLHKCShk72Kwse2BlPODtxw=", - "dev": true, - "requires": { - "xml-char-classes": "1.0.0" - } - }, "negotiator": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", - "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=" + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "neo-async": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.1.tgz", + "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", + "dev": true + }, + "nested-error-stacks": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz", + "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==", + "dev": true + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, "nise": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.2.tgz", - "integrity": "sha512-rvxf+PSZeCKtP0DgmwMmNf1G3I6X1r4WHiP2H88PlIkOkt7mGqufdokjS8caoHBgZzVx0ee/5ytGcGHbZaUw8w==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.5.3.tgz", + "integrity": "sha512-Ymbac/94xeIrMf59REBPOv0thr+CJVFMhrlAkW/gjCIE58BGQdCj0x7KRCb3yz+Ga2Rz3E9XXSvUyyxqqhjQAQ==", "dev": true, "requires": { - "formatio": "1.2.0", - "just-extend": "1.1.27", - "lolex": "1.6.0", - "path-to-regexp": "1.7.0", - "text-encoding": "0.6.4" + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/text-encoding": "^0.7.1", + "just-extend": "^4.0.2", + "lolex": "^5.0.1", + "path-to-regexp": "^1.7.0" }, "dependencies": { "isarray": { @@ -7796,15 +12656,18 @@ "dev": true }, "lolex": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", - "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", - "dev": true + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-5.1.2.tgz", + "integrity": "sha512-h4hmjAvHTmd+25JSwrtTIuwbKdwg5NzZVRMLn9saij4SZaepCrTCxPr35H/3bjwfMJtN+t3CX8672UIkglz28A==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.7.0" + } }, "path-to-regexp": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", - "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "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" @@ -7816,100 +12679,94 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", - "dev": true, "requires": { - "lower-case": "1.1.4" + "lower-case": "^1.1.1" } }, "nocache": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.0.0.tgz", - "integrity": "sha1-ICtIAhoMTL3i34DeFaF0Q8i0OYA=" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/nocache/-/nocache-2.1.0.tgz", + "integrity": "sha512-0L9FvHG3nfnnmaEQPjT9xhfN4ISk0A8/2j4M37Np4mcDesJjHgEUfgPhdCyZuFI954tjokaIj/A3NdpFNdEh4Q==" }, - "node-forge": { - "version": "0.6.33", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.6.33.tgz", - "integrity": "sha1-RjgRh59XPUUVWtap9D3ClujoXrw=", - "dev": true + "node-emoji": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.10.0.tgz", + "integrity": "sha512-Yt3384If5H6BYGVHiHwTL+99OzJKHhgp82S8/dktEK73T26BazdgZ4JZh92xSVtGNJvz9UbXdNAc5hcrXV42vw==", + "dev": true, + "requires": { + "lodash.toarray": "^4.4.0" + } }, - "node-libs-browser": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz", - "integrity": "sha512-5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==", + "node-environment-flags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", + "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { - "assert": "1.4.1", - "browserify-zlib": "0.2.0", - "buffer": "4.9.1", - "console-browserify": "1.1.0", - "constants-browserify": "1.0.0", - "crypto-browserify": "3.12.0", - "domain-browser": "1.1.7", - "events": "1.1.1", - "https-browserify": "1.0.0", - "os-browserify": "0.3.0", - "path-browserify": "0.0.0", - "process": "0.11.10", - "punycode": "1.3.2", - "querystring-es3": "0.2.1", - "readable-stream": "2.3.3", - "stream-browserify": "2.0.1", - "stream-http": "2.7.2", - "string_decoder": "1.0.3", - "timers-browserify": "2.0.4", + "object.getownpropertydescriptors": "^2.0.3", + "semver": "^5.7.0" + } + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "node-forge": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz", + "integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==" + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", "tty-browserify": "0.0.0", - "url": "0.11.0", - "util": "0.10.3", - "vm-browserify": "0.0.4" + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" }, "dependencies": { - "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", - "dev": true, - "requires": { - "browserify-cipher": "1.0.0", - "browserify-sign": "4.0.4", - "create-ecdh": "4.0.0", - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "diffie-hellman": "5.0.2", - "inherits": "2.0.3", - "pbkdf2": "3.0.14", - "public-encrypt": "4.0.0", - "randombytes": "2.0.5", - "randomfill": "1.0.3" - } - }, - "process": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", - "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "events": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz", + "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==", "dev": true }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "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" } }, "url": { @@ -7924,46 +12781,33 @@ } } }, - "nomnom": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/nomnom/-/nomnom-1.6.2.tgz", - "integrity": "sha1-hKZqJgF0QI/Ft3oY+IjszET7aXE=", - "dev": true, - "requires": { - "colors": "0.5.1", - "underscore": "1.4.4" - }, - "dependencies": { - "colors": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/colors/-/colors-0.5.1.tgz", - "integrity": "sha1-fQAj6usVTo7p/Oddy5I9DtFmd3Q=", - "dev": true - } - } + "node-releases": { + "version": "1.1.53", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz", + "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==", + "dev": true }, "normalize-html-whitespace": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-0.2.0.tgz", - "integrity": "sha1-EBci9kI1Ucdc24+dEE/4UNrx4Q4=", - "dev": true + "integrity": "sha1-EBci9kI1Ucdc24+dEE/4UNrx4Q4=" }, "normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { - "hosted-git-info": "2.5.0", - "is-builtin-module": "1.0.0", - "semver": "5.4.1", - "validate-npm-package-license": "3.0.1" + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" } }, "normalize-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-1.0.0.tgz", - "integrity": "sha1-MtDkcvkf80VwHBWoMRAY07CpA3k=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "normalize-range": { @@ -7979,70 +12823,61 @@ "dev": true }, "normalize-url": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", - "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "prepend-http": "1.0.4", - "query-string": "4.3.4", - "sort-keys": "1.1.2" - } + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz", + "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==", + "dev": true }, - "npm-path": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/npm-path/-/npm-path-2.0.3.tgz", - "integrity": "sha1-Fc/04ciaONp39W9gVbJPl137K74=", - "dev": true, - "requires": { - "which": "1.3.0" - } + "normalize.css": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/normalize.css/-/normalize.css-8.0.1.tgz", + "integrity": "sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==", + "dev": true }, "npm-run-all": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.2.tgz", - "integrity": "sha512-Z2aRlajMK4SQ8u19ZA75NZZu7wupfCNQWdYosIi8S6FgBdGf/8Y6Hgyjdc8zU2cYmIRVCx1nM80tJPkdEd+UYg==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "chalk": "2.3.0", - "cross-spawn": "5.1.0", - "memorystream": "0.3.1", - "minimatch": "3.0.4", - "ps-tree": "1.1.0", - "read-pkg": "3.0.0", - "shell-quote": "1.6.1", - "string.prototype.padend": "3.0.0" + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", + "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "chalk": "^2.4.1", + "cross-spawn": "^6.0.5", + "memorystream": "^0.3.1", + "minimatch": "^3.0.4", + "pidtree": "^0.3.0", + "read-pkg": "^3.0.0", + "shell-quote": "^1.6.1", + "string.prototype.padend": "^3.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==", + "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.1" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -8053,18 +12888,16 @@ "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { - "path-key": "2.0.1" + "path-key": "^2.0.0" } }, - "npm-which": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/npm-which/-/npm-which-3.0.1.tgz", - "integrity": "sha1-kiXybsOihcIJyuZ8OxGmtKtxQKo=", + "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": { - "commander": "2.12.2", - "npm-path": "2.0.3", - "which": "1.3.0" + "boolbase": "~1.0.0" } }, "num2fraction": { @@ -8079,11 +12912,139 @@ "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, + "nyc": { + "version": "14.1.1", + "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.1.1.tgz", + "integrity": "sha512-OI0vm6ZGUnoGZv/tLdZ2esSVzDwUC88SNs+6JoSOMVxA+gKMB8Tk7jBwgemLx4O40lhhvZCVw1C+OYLOBOPXWw==", + "dev": true, + "requires": { + "archy": "^1.0.0", + "caching-transform": "^3.0.2", + "convert-source-map": "^1.6.0", + "cp-file": "^6.2.0", + "find-cache-dir": "^2.1.0", + "find-up": "^3.0.0", + "foreground-child": "^1.5.6", + "glob": "^7.1.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.4", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "merge-source-map": "^1.1.0", + "resolve-from": "^4.0.0", + "rimraf": "^2.6.3", + "signal-exit": "^3.0.2", + "spawn-wrap": "^1.4.2", + "test-exclude": "^5.2.3", + "uuid": "^3.3.2", + "yargs": "^13.2.2", + "yargs-parser": "^13.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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 + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "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 + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + } + } + }, "oauth-sign": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.3.0.tgz", - "integrity": "sha1-y1QPk7srIqfVlBaRoojWDo6pOG4=", - "dev": true + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" }, "object-assign": { "version": "4.1.1", @@ -8091,26 +13052,133 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "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 + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", + "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", + "dev": true + }, + "object-is": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.2.tgz", + "integrity": "sha512-5lHCz+0uufF6wZ7CRFWJN3hp8Jqblpgve06U5CMQ3f//6iDjPr2PEo9MWCjEssDsa+UZEL4PkFpr+BMop6aKzQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" + } + }, "object-keys": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", - "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "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.omit": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", - "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", "dev": true, "requires": { - "for-own": "0.1.5", - "is-extendable": "0.1.1" + "isobject": "^3.0.0" } }, - "obuf": { + "object.assign": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", + "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", + "dev": true, + "requires": { + "define-properties": "^1.1.2", + "function-bind": "^1.1.1", + "has-symbols": "^1.0.0", + "object-keys": "^1.0.11" + } + }, + "object.entries": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.1.tgz", + "integrity": "sha512-ilqR7BgdyZetJutmDPfXCDffGa0/Yzl2ivVNpbx/g4UeWrCdRnFDUBrKJGLhGieRHDATnyZXWBeCb29k9CJysQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", + "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.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, + "requires": { + "isobject": "^3.0.1" + } + }, + "object.values": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.1.tgz", - "integrity": "sha1-EEEktsYCxnlogaBCVB0220OlJk4=", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz", + "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1", + "function-bind": "^1.1.1", + "has": "^1.0.3" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", "dev": true }, "on-finished": { @@ -8122,120 +13190,72 @@ } }, "on-headers": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", - "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "dev": true }, "on-load": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/on-load/-/on-load-3.3.4.tgz", - "integrity": "sha512-WhwvSW0hZndA7HjN1O3AypgaAahFPTOmJ43bQUTQHsiHhtp9/kk+WlMnd/skqBkWuiNcQqNwKo2ZiwwRWStJIA==", - "dev": true, + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/on-load/-/on-load-3.4.1.tgz", + "integrity": "sha512-Q3v6aurn5Pif4Rk1QZhnH/azZiKZqiroCcRkPlEccwTl4UFomAGFAqZz8XRCGN/KtuX4DwXCn9SB/edSSoV+Hg==", "requires": { - "global": "4.3.2", - "nanoassert": "1.1.0" + "global": "^4.3.2", + "nanoassert": "^1.1.0" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { - "wrappy": "1.0.2" + "wrappy": "1" } }, "onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", - "dev": true, - "requires": { - "mimic-fn": "1.1.0" - } - }, - "opn": { "version": "5.1.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.1.0.tgz", - "integrity": "sha512-iPNl7SyM8L30Rm1sjGdLLheyHVw5YXVfi3SKWJzBI7efxRwHojfRFjwE/OLM6qp9xJYMgab8WicTU1cPoY+Hpg==", - "dev": true, + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.0.tgz", + "integrity": "sha512-5NcSkPHhwTVFIQN+TUqXoS5+dlElHXdpAWu9I0HP20YOtIi+aZ0Ct82jdlILDxjLEAWwvm+qj1m6aEtsDVmm6Q==", "requires": { - "is-wsl": "1.1.0" + "mimic-fn": "^2.1.0" } }, - "optionator": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", - "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", - "dev": true, - "requires": { - "deep-is": "0.1.3", - "fast-levenshtein": "2.0.6", - "levn": "0.3.0", - "prelude-ls": "1.1.2", - "type-check": "0.3.2", - "wordwrap": "1.0.0" - } + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true }, - "ora": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/ora/-/ora-0.2.3.tgz", - "integrity": "sha1-N1J9Igrc1Tw5tzVx11QVbV22V6Q=", + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { - "chalk": "1.1.3", - "cli-cursor": "1.0.2", - "cli-spinners": "0.1.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "cli-cursor": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-1.0.2.tgz", - "integrity": "sha1-ZNo/fValRBLll5S9Ytw1KV6PKYc=", - "dev": true, - "requires": { - "restore-cursor": "1.0.1" - } - }, - "onetime": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-1.1.0.tgz", - "integrity": "sha1-ofeDj4MUxRbwXs78vEzP4EtO14k=", - "dev": true - }, - "restore-cursor": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-1.0.1.tgz", - "integrity": "sha1-NGYfRohjJ/7SmRR5FSJS35LapUE=", - "dev": true, - "requires": { - "exit-hook": "1.1.1", - "onetime": "1.1.0" - } - } + "is-wsl": "^1.1.0" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dev": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" } }, "original": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", - "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", "dev": true, "requires": { - "url-parse": "1.0.5" - }, - "dependencies": { - "url-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", - "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", - "dev": true, - "requires": { - "querystringify": "0.0.4", - "requires-port": "1.0.0" - } - } + "url-parse": "^1.4.3" } }, "os-browserify": { @@ -8251,31 +13271,14 @@ "dev": true }, "os-locale": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", - "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { - "execa": "0.7.0", - "lcid": "1.0.0", - "mem": "1.1.0" - }, - "dependencies": { - "execa": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", - "dev": true, - "requires": { - "cross-spawn": "5.1.0", - "get-stream": "3.0.0", - "is-stream": "1.1.0", - "npm-run-path": "2.0.2", - "p-finally": "1.0.0", - "signal-exit": "3.0.2", - "strip-eof": "1.0.0" - } - } + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" } }, "os-tmpdir": { @@ -8284,72 +13287,124 @@ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "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-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, - "p-limit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.1.0.tgz", - "integrity": "sha1-sH/y2aXYi+yAYDWJWiurZqJ5iLw=", + "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": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { - "p-limit": "1.1.0" + "p-limit": "^1.1.0" + }, + "dependencies": { + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } } }, "p-map": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-1.2.0.tgz", - "integrity": "sha512-r6zKACMNhjPJMTl8KcFH4li//gkrXWfbD6feV8l6doRHlzljFWGJ2AP6iKaCJXyZmAUMOPtvbW7EXkbWO/pLEA==", - "dev": true + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-3.0.0.tgz", + "integrity": "sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.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==" + }, + "package-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz", + "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "hasha": "^3.0.0", + "lodash.flattendeep": "^4.4.0", + "release-zalgo": "^1.0.0" + } }, "pako": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz", - "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", "dev": true }, "parallel-transform": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", - "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", "dev": true, "requires": { - "cyclist": "0.2.2", - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" }, "dependencies": { "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "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" } } } @@ -8360,115 +13415,91 @@ "integrity": "sha1-35T9jPZTHs915r75oIWPvHK+Ikc=", "dev": true, "requires": { - "no-case": "2.3.2" + "no-case": "^2.2.0" } }, - "parse-asn1": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.0.tgz", - "integrity": "sha1-N8T5t+06tlx0gXtfJICTf7+XxxI=", + "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": { - "asn1.js": "4.9.2", - "browserify-aes": "1.1.1", - "create-hash": "1.1.3", - "evp_bytestokey": "1.0.3", - "pbkdf2": "3.0.14" + "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-entities": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.1.1.tgz", - "integrity": "sha1-gRLYhHExnyerrk1klksSL+ThuJA=", + "parse-asn1": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz", + "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==", "dev": true, "requires": { - "character-entities": "1.2.1", - "character-entities-legacy": "1.1.1", - "character-reference-invalid": "1.1.1", - "is-alphanumerical": "1.0.1", - "is-decimal": "1.0.1", - "is-hexadecimal": "1.0.1" + "asn1.js": "^4.0.0", + "browserify-aes": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" } }, - "parse-glob": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", - "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "parse-entities": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-1.2.2.tgz", + "integrity": "sha512-NzfpbxW/NPrzZ/yYSoQxyqUZMZXIdCfE0OIN4ESsnptHJECoUk3FZktxNuzQf4tjt5UEopnxpYJbvYuxIFDdsg==", "dev": true, "requires": { - "glob-base": "0.3.0", - "is-dotfile": "1.0.3", - "is-extglob": "1.0.0", - "is-glob": "2.0.1" - }, - "dependencies": { - "is-extglob": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", - "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", - "dev": true - }, - "is-glob": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", - "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", - "dev": true, - "requires": { - "is-extglob": "1.0.0" - } - } + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", "dev": true, "requires": { - "error-ex": "1.3.1" + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" } }, - "parse-link-header": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/parse-link-header/-/parse-link-header-0.1.0.tgz", - "integrity": "sha1-VQP6f7LzVLsjQlXBxCHaPrBbkYU=", - "dev": true, - "requires": { - "xtend": "2.0.6" - }, - "dependencies": { - "object-keys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-0.2.0.tgz", - "integrity": "sha1-zd7AKZiwkb5CvxA1rjLknxy26mc=", - "dev": true, - "requires": { - "foreach": "2.0.5", - "indexof": "0.0.1", - "is": "0.2.7" - } - }, - "xtend": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-2.0.6.tgz", - "integrity": "sha1-XqZXptukRwacLlnFihE4ywxebO4=", - "dev": true, - "requires": { - "is-object": "0.1.2", - "object-keys": "0.2.0" - } - } - } + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true }, "parseurl": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", - "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=" + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true }, "path-browserify": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz", - "integrity": "sha1-oLhwcpquIUAFt9UDLsLLuw+0RRo=", + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": 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 }, "path-exists": { @@ -8492,13 +13523,12 @@ "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, "path-parse": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", - "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "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": { @@ -8512,1433 +13542,1266 @@ "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { - "pify": "3.0.0" - } - }, - "pause-stream": { - "version": "0.0.11", - "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", - "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", - "dev": true, - "requires": { - "through": "2.3.8" + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "dev": true + } } }, "pbkdf2": { - "version": "3.0.14", - "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.14.tgz", - "integrity": "sha512-gjsZW9O34fm0R7PaLHRJmLLVfSoesxztjPjE9o6R+qtVJij90ltg1joIovN9GKrRW3t1PzhDDG3UMEMFfZ+1wA==", + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", + "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==", "dev": true, "requires": { - "create-hash": "1.1.3", - "create-hmac": "1.1.6", - "ripemd160": "2.0.1", - "safe-buffer": "5.1.1", - "sha.js": "2.4.9" + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" } }, - "pelo": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/pelo/-/pelo-0.1.0.tgz", - "integrity": "sha512-+oVixa69fxS/X+3s1DaSJVQLG/ukHfjK2pHCmpIgjRChp73lnAfbqOYZ0MEo5C5yVkYeUJSoWAcRK0lx0hvOjQ==" + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", - "dev": true + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" }, - "pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, - "pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", - "dev": true, - "requires": { - "pinkie": "2.0.4" - } - }, - "pkg-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", - "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", - "dev": true, - "requires": { - "find-up": "2.1.0" - } - }, - "platform": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz", - "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==" - }, - "pluralize": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", - "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "pidtree": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", + "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, - "portfinder": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.13.tgz", - "integrity": "sha1-uzLs2HwnEErm7kS1o8y/Drsa7ek=", - "dev": true, - "requires": { - "async": "1.5.2", - "debug": "2.6.9", - "mkdirp": "0.5.1" - }, - "dependencies": { - "async": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", - "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", - "dev": true - } - } - }, - "postcss": { - "version": "6.0.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.14.tgz", - "integrity": "sha512-NJ1z0f+1offCgadPhz+DvGm5Mkci+mmV5BqD13S992o0Xk9eElxUfPPF+t2ksH5R/17gz4xVK8KWocUQ5o3Rog==", - "dev": true, - "requires": { - "chalk": "2.3.0", - "source-map": "0.6.1", - "supports-color": "4.5.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==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - }, - "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", - "dev": true, - "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" - } - }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", - "dev": true, - "requires": { - "has-flag": "2.0.0" - } - } - } - }, - "postcss-calc": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz", - "integrity": "sha1-d7rnypKK2FcW4v2kLyYb98HWW14=", - "dev": true, - "requires": { - "postcss": "5.2.18", - "postcss-message-helpers": "2.0.0", - "reduce-css-calc": "1.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } - } + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true }, - "postcss-colormin": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz", - "integrity": "sha1-ZjFBfV8OkJo9fsJrJMio0eT5bks=", - "dev": true, - "requires": { - "colormin": "1.1.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "dev": true + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dev": true, + "requires": { + "pinkie": "^2.0.0" } }, - "postcss-convert-values": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz", - "integrity": "sha1-u9hZPFwf0uPRwyK7kl3K6Nrk1i0=", + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "find-up": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "locate-path": "^3.0.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 + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "p-limit": "^2.0.0" } } } }, - "postcss-discard-comments": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz", - "integrity": "sha1-vv6J+v1bPazlzM5Rt2uBUUvgDj0=", + "pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz", + "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=", + "dev": true, + "requires": { + "find-up": "^2.1.0" + } + }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", "dev": true, "requires": { - "postcss": "5.2.18" + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "ms": "^2.1.1" } } } }, - "postcss-discard-duplicates": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz", - "integrity": "sha1-uavye4isGIFYpesSq8riAmO5GTI=", + "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 + }, + "postcss": { + "version": "7.0.27", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz", + "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==", "dev": true, "requires": { - "postcss": "5.2.18" + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "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" + } }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "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": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "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" + } + } } }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "1.0.0" + "has-flag": "^3.0.0" } } } }, - "postcss-discard-empty": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz", - "integrity": "sha1-0rS9nVztXr2Nyt52QMfXzX9PkrU=", + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-calc": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz", + "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==", + "dev": true, + "requires": { + "postcss": "^7.0.27", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-colormin": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz", + "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==", "dev": true, "requires": { - "postcss": "5.2.18" + "browserslist": "^4.0.0", + "color": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-discard-overridden": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz", - "integrity": "sha1-ix6vVU9ob7KIzYdMVWZ7CqNmjVg=", + "postcss-convert-values": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz", + "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-discard-unused": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz", - "integrity": "sha1-vOMLLMWR/8Y0Mitfs0ZLbZNPRDM=", + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", "dev": true, "requires": { - "postcss": "5.2.18", - "uniqs": "2.0.0" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-filter-plugins": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.2.tgz", - "integrity": "sha1-bYWGJTTXNaxCDkqFgG4fXUKG2Ew=", + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", "dev": true, "requires": { - "postcss": "5.2.18", - "uniqid": "4.1.1" + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-html": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.11.0.tgz", - "integrity": "sha512-ruCTbRZWY+qOV4FNYNm6E0ucIbCkkuYHIqQ4W3iSVIc1aUVBTKMG0iUo2nPUAG2lhFaTmfBaZ17017osZ18ddA==", + "postcss-discard-comments": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz", + "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==", "dev": true, "requires": { - "htmlparser2": "3.9.2", - "remark": "8.0.0", - "unist-util-find-all-after": "1.0.1" + "postcss": "^7.0.0" } }, - "postcss-less": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-1.1.3.tgz", - "integrity": "sha512-WS0wsQxRm+kmN8wEYAGZ3t4lnoNfoyx9EJZrhiPR1K0lMHR0UNWnz52Ya5QRXChHtY75Ef+kDc05FpnBujebgw==", + "postcss-discard-duplicates": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz", + "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-empty": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz", + "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-discard-overridden": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz", + "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-font-variant": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.0.tgz", + "integrity": "sha512-M8BFYKOvCrI2aITzDad7kWuXXTm0YhGdP9Q8HanmN4EF1Hmcgs1KK5rSHylt/lUJe8yLxiSwWAHdScoEiIxztg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-functions": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-functions/-/postcss-functions-3.0.0.tgz", + "integrity": "sha1-DpTQFERwCkgd4g3k1V+yZAVkJQ4=", "dev": true, "requires": { - "postcss": "5.2.18" + "glob": "^7.1.2", + "object-assign": "^4.1.1", + "postcss": "^6.0.9", + "postcss-value-parser": "^3.3.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true + "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" + } }, "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "version": "6.0.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz", + "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==", "dev": true, "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" + "chalk": "^2.4.1", + "source-map": "^0.6.1", + "supports-color": "^5.4.0" } }, + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "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": "1.0.0" + "has-flag": "^3.0.0" } } } }, - "postcss-load-config": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-1.2.0.tgz", - "integrity": "sha1-U56a/J3chiASHr+djDZz4M5Q0oo=", + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", "dev": true, "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1", - "postcss-load-options": "1.2.0", - "postcss-load-plugins": "2.3.0" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } + "postcss": "^7.0.2" } }, - "postcss-load-options": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-load-options/-/postcss-load-options-1.2.0.tgz", - "integrity": "sha1-sJixVZ3awt8EvAuzdfmaXP4rbYw=", + "postcss-html": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-html/-/postcss-html-0.36.0.tgz", + "integrity": "sha512-HeiOxGcuwID0AFsNAL0ox3mW6MHH5cstWN1Z3Y+n6H+g12ih7LHdYxWwEA/QmrebctLjo79xz9ouK3MroHwOJw==", "dev": true, "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } + "htmlparser2": "^3.10.0" } }, - "postcss-load-plugins": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/postcss-load-plugins/-/postcss-load-plugins-2.3.0.tgz", - "integrity": "sha1-dFdoEWWZrKLwCfrUJrABdQSdjZI=", + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", "dev": true, "requires": { - "cosmiconfig": "2.2.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "cosmiconfig": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-2.2.2.tgz", - "integrity": "sha512-GiNXLwAFPYHy25XmTPpafYvn3CLAkJ8FLsscq78MQd1Kh0OU6Yzhn4eV2MVF4G9WEQZoWEGltatdR+ntGPMl5A==", - "dev": true, - "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.7.0", - "minimist": "1.2.0", - "object-assign": "4.1.1", - "os-homedir": "1.0.2", - "parse-json": "2.2.0", - "require-from-string": "1.2.1" - } - }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, - "require-from-string": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-1.2.1.tgz", - "integrity": "sha1-UpyczvJzgK3+yaL5ZbZJu+5jZBg=", - "dev": true - } + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" } }, - "postcss-loader": { + "postcss-initial": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.2.tgz", + "integrity": "sha512-ugA2wKonC0xeNHgirR4D3VWHs2JcU08WAi1KFLVcnb7IN89phID6Qtg2RIctWbnvp1TM2BOmDtX8GGLCKdR8YA==", + "dev": true, + "requires": { + "lodash.template": "^4.5.0", + "postcss": "^7.0.2" + } + }, + "postcss-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-2.0.3.tgz", + "integrity": "sha512-zS59pAk3deu6dVHyrGqmC3oDXBdNdajk4k1RyxeVXCrcEDBUBHoIhE4QTsmhxgzXxsaqFDAkUZfmMa5f/N/79w==", + "dev": true, + "requires": { + "camelcase-css": "^2.0.1", + "postcss": "^7.0.18" + } + }, + "postcss-jsx": { + "version": "0.36.4", + "resolved": "https://registry.npmjs.org/postcss-jsx/-/postcss-jsx-0.36.4.tgz", + "integrity": "sha512-jwO/7qWUvYuWYnpOb0+4bIIgJt7003pgU3P6nETBLaOyBXuTD55ho21xnals5nBrlpTIFodyd3/jBi6UO3dHvA==", + "dev": true, + "requires": { + "@babel/core": ">=7.2.2" + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-less": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-less/-/postcss-less-3.1.4.tgz", + "integrity": "sha512-7TvleQWNM2QLcHqvudt3VYjULVB49uiW6XzEUFmvwHzvsOEF5MwBrIXZDJQvJNFGjJQTzSzZnDoCJ8h/ljyGXA==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + } + }, + "postcss-load-config": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-2.1.0.tgz", - "integrity": "sha512-S/dKzpDwGFmP9g8eyCu9sUIV+/+3UooeTpYlsKf23qKDdrhHuA4pTSfytVu0rEJ0iDqUavXrgtOPq5KhNyNMOw==", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.0.tgz", + "integrity": "sha512-4pV3JJVPLd5+RueiVVB+gFOAa7GWc25XQcMp86Zexzke69mKf6Nx9LRcQywdz7yZI9n1udOxmLuAwTBypypF8Q==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", "dev": true, "requires": { - "loader-utils": "1.1.0", - "postcss": "6.0.14", - "postcss-load-config": "1.2.0", - "schema-utils": "0.4.3" + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" }, "dependencies": { "schema-utils": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.3.tgz", - "integrity": "sha512-sgv/iF/T4/SewJkaVpldKC4WjSkz0JsOh2eKtxCPpCO1oR05+7MOF+H476HVRbLArkgA7j5TRJJ4p2jdFkUGQQ==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "ajv": "5.5.0", - "ajv-keywords": "2.1.1" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } } } }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-markdown": { + "version": "0.36.0", + "resolved": "https://registry.npmjs.org/postcss-markdown/-/postcss-markdown-0.36.0.tgz", + "integrity": "sha512-rl7fs1r/LNSB2bWRhyZ+lM/0bwKv9fhl38/06gF6mKMo/NPnp55+K1dSTosSVjFZc0e1ppBlu+WT91ba0PMBfQ==", + "dev": true, + "requires": { + "remark": "^10.0.1", + "unist-util-find-all-after": "^1.0.2" + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, "postcss-media-query-parser": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz", "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=", "dev": true }, - "postcss-merge-idents": { - "version": "2.1.7", - "resolved": "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz", - "integrity": "sha1-TFUwMTwI4dWzu/PSu8dH4njuonA=", + "postcss-merge-longhand": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz", + "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==", "dev": true, "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "css-color-names": "0.0.4", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "stylehacks": "^4.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-merge-longhand": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz", - "integrity": "sha1-I9kM0Sewp3mUkVMyc5A0oaTz1lg=", + "postcss-merge-rules": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz", + "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==", "dev": true, "requires": { - "postcss": "5.2.18" + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "cssnano-util-same-parent": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0", + "vendors": "^1.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "has-flag": "1.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-merge-rules": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz", - "integrity": "sha1-0d9d+qexrMO+VT8OnhDofGG19yE=", + "postcss-minify-font-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz", + "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==", "dev": true, "requires": { - "browserslist": "1.7.7", - "caniuse-api": "1.6.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3", - "vendors": "1.0.1" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "browserslist": { - "version": "1.7.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz", - "integrity": "sha1-C9dnBCWL6CmyOYu1Dkti0aFmsLk=", - "dev": true, - "requires": { - "caniuse-db": "1.0.30000775", - "electron-to-chromium": "1.3.27" - } - }, - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-message-helpers": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz", - "integrity": "sha1-pPL0+rbk/gAvCu0ABHjN9S+bpg4=", - "dev": true - }, - "postcss-minify-font-values": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz", - "integrity": "sha1-S1jttWZB66fIR0qzUmyv17vey2k=", + "postcss-minify-gradients": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz", + "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==", "dev": true, "requires": { - "object-assign": "4.1.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "cssnano-util-get-arguments": "^4.0.0", + "is-color-stop": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-minify-gradients": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz", - "integrity": "sha1-Xb2hE3NwP4PPtKPqOIHY11/15uE=", + "postcss-minify-params": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz", + "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "alphanum-sort": "^1.0.0", + "browserslist": "^4.0.0", + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "uniqs": "^2.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-minify-params": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz", - "integrity": "sha1-rSzgcTc7lDs9kwo/pZo1jCjW8fM=", + "postcss-minify-selectors": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz", + "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "uniqs": "2.0.0" + "alphanum-sort": "^1.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "has-flag": "1.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, - "postcss-minify-selectors": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz", - "integrity": "sha1-ssapjAByz5G5MtGkllCBFDEXNb8=", + "postcss-modules-extract-imports": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz", + "integrity": "sha512-LaYLDNS4SG8Q5WAWqIJgdHPJrDDr/Lv775rMBFUbgjTz6j34lUznACHcdRWroPvXANP2Vj7yNK57vp9eFqzLWQ==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + } + }, + "postcss-modules-local-by-default": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz", + "integrity": "sha512-jM/V8eqM4oJ/22j0gx4jrp63GSvDH6v86OqyTHHUvk4/k1vceipZsaymiZ5PvocqZOl5SFHiFJqjs3la0wnfIQ==", + "dev": true, + "requires": { + "icss-utils": "^4.1.1", + "postcss": "^7.0.16", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.0.0" + } + }, + "postcss-modules-scope": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz", + "integrity": "sha512-YyEgsTMRpNd+HmyC7H/mh3y+MeFWevy7V1evVhJWewmMbjDHIbZbOXICC2y+m1xI1UVfIT1HMW/O04Hxyu9oXQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^6.0.0" + } + }, + "postcss-modules-values": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz", + "integrity": "sha512-1//E5jCBrZ9DmRX+zCtmQtRSV6PV42Ix7Bzj9GbwJceduuf7IqP8MgeTXuRDHOWj2m0VzZD5+roFWDuU8RQjcg==", + "dev": true, + "requires": { + "icss-utils": "^4.0.0", + "postcss": "^7.0.6" + } + }, + "postcss-nested": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-4.2.1.tgz", + "integrity": "sha512-AMayXX8tS0HCp4O4lolp4ygj9wBn32DJWXvG6gCv+ZvJrEa00GUxJcJEEzMh87BIe6FrWdYkpR2cuyqHKrxmXw==", + "dev": true, + "requires": { + "postcss": "^7.0.21", + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-normalize-charset": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz", + "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==", + "dev": true, + "requires": { + "postcss": "^7.0.0" + } + }, + "postcss-normalize-display-values": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz", + "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-selector-parser": "2.2.3" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-modules-extract-imports": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz", - "integrity": "sha1-ZhQOzs447wa/DT41XWm/WdFB6oU=", + "postcss-normalize-positions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz", + "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==", "dev": true, "requires": { - "postcss": "6.0.14" + "cssnano-util-get-arguments": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "postcss-modules-local-by-default": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz", - "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=", + "postcss-normalize-repeat-style": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz", + "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.14" + "cssnano-util-get-arguments": "^4.0.0", + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "postcss-modules-scope": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz", - "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=", + "postcss-normalize-string": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz", + "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==", "dev": true, "requires": { - "css-selector-tokenizer": "0.7.0", - "postcss": "6.0.14" + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "postcss-modules-values": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz", - "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=", + "postcss-normalize-timing-functions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz", + "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==", "dev": true, "requires": { - "icss-replace-symbols": "1.1.0", - "postcss": "6.0.14" + "cssnano-util-get-match": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", + "dev": true + } } }, - "postcss-normalize-charset": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz", - "integrity": "sha1-757nEhLX/nWceO0WL2HtYrXLk/E=", + "postcss-normalize-unicode": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz", + "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==", "dev": true, "requires": { - "postcss": "5.2.18" + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, "postcss-normalize-url": { - "version": "3.0.8", - "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz", - "integrity": "sha1-EI90s/L82viRov+j6kWSJ5/HgiI=", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz", + "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==", "dev": true, "requires": { - "is-absolute-url": "2.1.0", - "normalize-url": "1.9.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "is-absolute-url": "^2.0.0", + "normalize-url": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-ordered-values": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz", - "integrity": "sha1-7sbCpntsQSqNsgQud/6NpD+VwR0=", + "postcss-normalize-whitespace": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz", + "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-reduce-idents": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz", - "integrity": "sha1-wsbSDMlYKE9qv75j92Cb9AkFmtM=", + "postcss-ordered-values": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz", + "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==", "dev": true, "requires": { - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "cssnano-util-get-arguments": "^4.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, - "postcss-reduce-initial": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz", - "integrity": "sha1-aPgGlfBF0IJjqHmtJA343WT2ROo=", + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", "dev": true, "requires": { - "postcss": "5.2.18" + "postcss": "^7.0.2" + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", "dev": true }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", "dev": true, "requires": { - "has-flag": "1.0.0" + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } } } }, + "postcss-reduce-initial": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz", + "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "caniuse-api": "^3.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0" + } + }, "postcss-reduce-transforms": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz", - "integrity": "sha1-/3b02CEkN7McKYpC0uFEQCV3GuE=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz", + "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==", "dev": true, "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0" + "cssnano-util-get-match": "^4.0.0", + "has": "^1.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0" }, "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + } + }, "postcss-reporter": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-5.0.0.tgz", - "integrity": "sha512-rBkDbaHAu5uywbCR2XE8a25tats3xSOsGNx6mppK6Q9kSFGKc/FyAzfci+fWM2l+K402p1D0pNcfDGxeje5IKg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-reporter/-/postcss-reporter-6.0.1.tgz", + "integrity": "sha512-LpmQjfRWyabc+fRygxZjpRxfhRf9u/fdlKf4VHG4TSPbV2XNsuISzYW1KL+1aQzx53CAppa1bKG4APIB/DOXXw==", "dev": true, "requires": { - "chalk": "2.3.0", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "postcss": "6.0.14" + "chalk": "^2.4.1", + "lodash": "^4.17.11", + "log-symbols": "^2.2.0", + "postcss": "^7.0.7" }, "dependencies": { "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "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.1" + "color-convert": "^1.9.0" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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" + } + }, + "log-symbols": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", + "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "chalk": "^2.0.1" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -9950,177 +14813,116 @@ "dev": true }, "postcss-safe-parser": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-3.0.1.tgz", - "integrity": "sha1-t1Pv9sfArqXoN1++TN6L+QY/8UI=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-4.0.2.tgz", + "integrity": "sha512-Uw6ekxSWNLCPesSv/cmqf2bY/77z11O7jZGPax3ycZMFU/oi2DMH9i89AdHc1tRwFg/arFoEwX0IS3LCUxJh1g==", + "dev": true, + "requires": { + "postcss": "^7.0.26" + } + }, + "postcss-sass": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/postcss-sass/-/postcss-sass-0.4.4.tgz", + "integrity": "sha512-BYxnVYx4mQooOhr+zer0qWbSPYnarAy8ZT7hAQtbxtgVf8gy+LSLT/hHGe35h14/pZDTw1DsxdbrwxBN++H+fg==", "dev": true, "requires": { - "postcss": "6.0.14" + "gonzales-pe": "^4.3.0", + "postcss": "^7.0.21" } }, "postcss-scss": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-1.0.2.tgz", - "integrity": "sha1-/0XPM1S4ee6JpOtoaA9GrJuxT5Q=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-2.0.0.tgz", + "integrity": "sha512-um9zdGKaDZirMm+kZFKKVsnKPF7zF7qBAtIfTSnZXD1jZ0JNZIxdB6TxQOjCnlSzLRInVl2v3YdBh/M881C4ug==", "dev": true, "requires": { - "postcss": "6.0.14" + "postcss": "^7.0.0" } }, - "postcss-selector-parser": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz", - "integrity": "sha1-+UN3iGBsPJrO4W/+jYsWKX8nu5A=", + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", "dev": true, "requires": { - "flatten": "1.0.2", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" } }, - "postcss-svgo": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz", - "integrity": "sha1-tt8YqmE7Zm4TPwittSGcJoSsEI0=", + "postcss-selector-not": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.0.tgz", + "integrity": "sha512-W+bkBZRhqJaYN8XAnbbZPLWMvZD1wKTu0UxtFKdhtGjWYmxhkUneoeOhRJKdAE5V7ZTlnbHfCR+6bNwK9e1dTQ==", "dev": true, "requires": { - "is-svg": "2.1.0", - "postcss": "5.2.18", - "postcss-value-parser": "3.3.0", - "svgo": "0.7.2" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" } }, - "postcss-unique-selectors": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz", - "integrity": "sha1-mB1X0p3csz57Hf4f1DuGSfkzyh0=", + "postcss-selector-parser": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz", + "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==", "dev": true, "requires": { - "alphanum-sort": "1.0.2", - "postcss": "5.2.18", - "uniqs": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "cssesc": "^3.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "postcss-svgo": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz", + "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==", + "dev": true, + "requires": { + "is-svg": "^3.0.0", + "postcss": "^7.0.0", + "postcss-value-parser": "^3.0.0", + "svgo": "^1.0.0" + }, + "dependencies": { + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } } } }, + "postcss-syntax": { + "version": "0.36.2", + "resolved": "https://registry.npmjs.org/postcss-syntax/-/postcss-syntax-0.36.2.tgz", + "integrity": "sha512-nBRg/i7E3SOHWxF3PpF5WnJM/jQ1YpY9000OaVXlAQj6Zp/kIqJxEDWIZ67tAd7NLuk7zqN4yqe9nc0oNAOs1w==", + "dev": true + }, + "postcss-unique-selectors": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz", + "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==", + "dev": true, + "requires": { + "alphanum-sort": "^1.0.0", + "postcss": "^7.0.0", + "uniqs": "^2.0.0" + } + }, "postcss-value-parser": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.0.tgz", - "integrity": "sha1-h/OPnxj3dKSrTIojL1xc6IcqnRU=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", "dev": true }, - "postcss-zindex": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz", - "integrity": "sha1-0hCd3AVbka9n/EyzsCWUZjnSryI=", + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", "dev": true, "requires": { - "has": "1.0.1", - "postcss": "5.2.18", - "uniqs": "2.0.0" - }, - "dependencies": { - "has-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", - "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", - "dev": true - }, - "postcss": { - "version": "5.2.18", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", - "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", - "dev": true, - "requires": { - "chalk": "1.1.3", - "js-base64": "2.4.0", - "source-map": "0.5.7", - "supports-color": "3.2.3" - } - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "supports-color": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", - "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=", - "dev": true, - "requires": { - "has-flag": "1.0.0" - } - } + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, "prelude-ls": { @@ -10129,50 +14931,16 @@ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", "dev": true }, - "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", - "dev": true - }, - "preserve": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", - "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", - "dev": true - }, "prettier": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.10.2.tgz", - "integrity": "sha512-TcdNoQIWFoHblurqqU6d1ysopjq7UX0oRcT/hJ8qvBAELiYWn+Ugf0AXdnzISEJ7vuhNnQ98N8jR8Sh53x4IZg==", + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==", "dev": true }, - "pretty-format": { - "version": "21.2.1", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-21.2.1.tgz", - "integrity": "sha512-ZdWPGYAnYfcVP8yKA3zFjCn8s4/17TeYH28MXuC8vTp0o21eXjbFGcOAXZEaDaOFJjc3h2qa7HQNHNshhvoh2A==", - "dev": true, - "requires": { - "ansi-regex": "3.0.0", - "ansi-styles": "3.2.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", - "dev": true, - "requires": { - "color-convert": "1.9.1" - } - } - } + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" }, "private": { "version": "0.1.8", @@ -10181,22 +14949,19 @@ "dev": true }, "process": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/process/-/process-0.5.2.tgz", - "integrity": "sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=", - "dev": true + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=" }, "process-nextick-args": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", - "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", - "dev": true + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", - "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", - "dev": true + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise-inflight": { "version": "1.0.1", @@ -10205,96 +14970,90 @@ "dev": true }, "proxy-addr": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", - "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", "requires": { - "forwarded": "0.1.2", - "ipaddr.js": "1.5.2" + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" } }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "proxyquire": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-1.8.0.tgz", - "integrity": "sha1-AtUUpb7ZhvBMuyCTrxZ0FTX3ntw=", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/proxyquire/-/proxyquire-2.1.3.tgz", + "integrity": "sha512-BQWfCqYM+QINd+yawJz23tbBM40VIGXOdDw3X344KcclI/gtBbdWF6SlQ4nK/bYhF9d27KYug9WzljHC6B9Ysg==", "dev": true, "requires": { - "fill-keys": "1.0.2", - "module-not-found-error": "1.0.1", - "resolve": "1.1.7" - }, - "dependencies": { - "resolve": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", - "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs=", - "dev": true - } + "fill-keys": "^1.0.2", + "module-not-found-error": "^1.0.1", + "resolve": "^1.11.1" } }, "prr": { - "version": "0.0.0", - "resolved": "https://registry.npmjs.org/prr/-/prr-0.0.0.tgz", - "integrity": "sha1-GoS4WQgyVQFBGFPQCB7j+obikmo=", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", "dev": true }, - "ps-tree": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/ps-tree/-/ps-tree-1.1.0.tgz", - "integrity": "sha1-tCGyQUDWID8e08dplrRCewjowBQ=", - "dev": true, - "requires": { - "event-stream": "3.3.4" - } - }, "pseudomap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", "dev": true }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, "public-encrypt": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.0.tgz", - "integrity": "sha1-OfaZ86RlYN1eusvKaTyvfGXBjMY=", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", "dev": true, "requires": { - "bn.js": "4.11.8", - "browserify-rsa": "4.0.1", - "create-hash": "1.1.3", - "parse-asn1": "5.1.0", - "randombytes": "2.0.5" + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" } }, "pump": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-1.0.3.tgz", - "integrity": "sha512-8k0JupWme55+9tCVE+FS5ULT3K6AbgqrGa58lTT49RpyfwwcGedHqaC5LlQNdEAumn/wFsu6aPwkuPMioy8kqw==", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" } }, "pumpify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz", - "integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==", - "dev": true, + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-2.0.1.tgz", + "integrity": "sha512-m7KOje7jZxrmutanlkS1daj1dS6z6BgslzOXmcSEpIlCxM3VJH7lG5QLeck/6hgF6F4crFf01UtQmNsJfweTAw==", "requires": { - "duplexify": "3.5.3", - "inherits": "2.0.3", - "pump": "2.0.1" + "duplexify": "^4.1.1", + "inherits": "^2.0.3", + "pump": "^3.0.0" }, "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "dev": true, + "duplexify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.1.tgz", + "integrity": "sha512-DY3xVEmVHTv1wSzKNbwoU6nVjzI369Y6sPoqfYr0/xlx3IdX2n94xIszTcjPO8W8ZIv0Wb0PXNcjuZyT4wiICA==", "requires": { - "end-of-stream": "1.4.1", - "once": "1.4.0" + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" } } } @@ -10304,6 +15063,85 @@ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=" }, + "puppeteer": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-2.1.1.tgz", + "integrity": "sha512-LWzaDVQkk1EPiuYeTOj+CZRIjda4k2s5w4MK4xoH2+kgWV/SDlkYHmxatDdtYrciHUKSXTsGgPgPP8ILVdBsxg==", + "dev": true, + "requires": { + "@types/mime-types": "^2.1.0", + "debug": "^4.1.0", + "extract-zip": "^1.6.6", + "https-proxy-agent": "^4.0.0", + "mime": "^2.0.3", + "mime-types": "^2.1.25", + "progress": "^2.0.1", + "proxy-from-env": "^1.0.0", + "rimraf": "^2.6.1", + "ws": "^6.1.0" + }, + "dependencies": { + "agent-base": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-5.1.1.tgz", + "integrity": "sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==", + "dev": true + }, + "https-proxy-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-4.0.0.tgz", + "integrity": "sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==", + "dev": true, + "requires": { + "agent-base": "5", + "debug": "4" + } + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + } + } + }, + "purgecss": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-1.4.2.tgz", + "integrity": "sha512-hkOreFTgiyMHMmC2BxzdIw5DuC6kxAbP/gGOGd3MEsF3+5m69rIvUEPaxrnoUtfODTFKe9hcXjGwC6jcjoyhOw==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "postcss": "^7.0.14", + "postcss-selector-parser": "^6.0.0", + "yargs": "^14.0.0" + } + }, + "pvtsutils": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/pvtsutils/-/pvtsutils-1.0.10.tgz", + "integrity": "sha512-8ZKQcxnZKTn+fpDh7wL4yKax5fdl3UJzT8Jv49djZpB/dzPxacyN1Sez90b6YLdOmvIr9vaySJ5gw4aUA1EdSw==", + "requires": { + "tslib": "^1.10.0" + } + }, + "pvutils": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/pvutils/-/pvutils-1.0.17.tgz", + "integrity": "sha512-wLHYUQxWaXVQvKnwIDWFVKDJku9XDCvyhhxoq8dc5MFdIlRenyPI9eSfEtcvgHgD7FlvCyGAlWgOzRnZD99GZQ==" + }, "q": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", @@ -10311,19 +15149,9 @@ "dev": true }, "qs": { - "version": "6.5.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", - "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==" - }, - "query-string": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", - "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", - "dev": true, - "requires": { - "object-assign": "4.1.1", - "strict-uri-encode": "1.1.0" - } + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" }, "querystring": { "version": "0.2.0", @@ -10337,131 +15165,66 @@ "dev": true }, "querystringify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", - "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, - "ramda": { - "version": "0.24.1", - "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.24.1.tgz", - "integrity": "sha1-w7d1UZfzW43DUCIoJixMkd22uFc=", + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", "dev": true }, - "randomatic": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", - "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", - "dev": 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, - "requires": { - "kind-of": "3.2.2" - }, - "dependencies": { - "kind-of": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } - }, - "kind-of": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", - "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", - "dev": true, - "requires": { - "is-buffer": "1.1.6" - } - } - } + "ramda": { + "version": "0.27.0", + "resolved": "https://registry.npmjs.org/ramda/-/ramda-0.27.0.tgz", + "integrity": "sha512-pVzZdDpWwWqEVVLshWUHjNwuVP7SfcmPraYuqocJp1yo2U1R7P+5QAfDhdItkuoGqIBnBYrtPp7rEPqDn9HlZA==", + "dev": true }, "randombytes": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.5.tgz", - "integrity": "sha512-8T7Zn1AhMsQ/HI1SjcCfT/t4ii3eAqco3yOcSzS4mozsOz69lHLsoMXmF9nZgnFanYscnSlUSgs8uZyKzpE6kg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "safe-buffer": "^5.1.0" } }, "randomfill": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.3.tgz", - "integrity": "sha512-YL6GrhrWoic0Eq8rXVbMptH7dAxCs0J+mh5Y0euNekPPYaxEmdVGim6GdoxoRzKW2yJoU8tueifS7mYxvcFDEQ==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", "dev": true, "requires": { - "randombytes": "2.0.5", - "safe-buffer": "5.1.1" + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" } }, "range-parser": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", - "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=" - }, - "raven": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/raven/-/raven-2.4.0.tgz", - "integrity": "sha1-SbfV+DjliT8x3XL4LQWjXkIgP2A=", - "requires": { - "cookie": "0.3.1", - "lsmod": "1.0.0", - "md5": "2.2.1", - "stack-trace": "0.0.9", - "timed-out": "4.0.1", - "uuid": "3.0.0" - }, - "dependencies": { - "stack-trace": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.9.tgz", - "integrity": "sha1-qPbq7KkGdMMz58Q5U/J1tFFRBpU=" - }, - "uuid": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.0.tgz", - "integrity": "sha1-Zyj8BFnEUNeWqZwxg3VpvfZy1yg=" - } - } - }, - "raven-js": { - "version": "3.22.1", - "resolved": "https://registry.npmjs.org/raven-js/-/raven-js-3.22.1.tgz", - "integrity": "sha512-2Y8czUl5a9usbvXbpV8a+GPAiDXjxQjaHImZL0TyJWI5k5jV/6o+wceaBAg9g6RpO9OOJp0/w2mMs6pBoqOyDA==", - "dev": true + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", - "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", "requires": { - "bytes": "3.0.0", - "http-errors": "1.6.2", - "iconv-lite": "0.4.19", + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", "unpipe": "1.0.0" } }, - "read": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/read/-/read-1.0.7.tgz", - "integrity": "sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ=", + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", "dev": true, "requires": { - "mute-stream": "0.0.7" + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" } }, "read-pkg": { @@ -10470,113 +15233,194 @@ "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", "dev": true, "requires": { - "load-json-file": "4.0.0", - "normalize-package-data": "2.4.0", - "path-type": "3.0.0" + "load-json-file": "^4.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^3.0.0" } }, "read-pkg-up": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", - "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz", + "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==", "dev": true, "requires": { - "find-up": "2.1.0", - "read-pkg": "2.0.0" + "find-up": "^3.0.0", + "read-pkg": "^3.0.0" }, "dependencies": { - "load-json-file": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", - "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "strip-bom": "3.0.0" + "locate-path": "^3.0.0" } }, - "path-type": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", - "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + } + } + }, + "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==", + "requires": { + "inherits": "^2.0.3", + "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, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.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, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "pify": "2.3.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - }, - "read-pkg": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", - "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", "dev": true, "requires": { - "load-json-file": "2.0.0", - "normalize-package-data": "2.4.0", - "path-type": "2.0.0" + "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" } - } - } - }, - "readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "0.0.1", - "string_decoder": "0.10.31" - }, - "dependencies": { - "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" - } - } - }, - "readdirp": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", - "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", - "dev": true, - "requires": { - "graceful-fs": "4.1.11", - "minimatch": "3.0.4", - "readable-stream": "2.3.3", - "set-immediate-shim": "1.0.1" - }, - "dependencies": { + }, "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "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.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } @@ -10588,9 +15432,9 @@ "dev": true, "requires": { "ast-types": "0.9.6", - "esprima": "3.1.3", - "private": "0.1.8", - "source-map": "0.5.7" + "esprima": "~3.1.0", + "private": "~0.1.5", + "source-map": "~0.5.0" }, "dependencies": { "esprima": { @@ -10598,12 +15442,6 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", "dev": true - }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true } } }, @@ -10613,168 +15451,168 @@ "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", "dev": true, "requires": { - "resolve": "1.5.0" + "resolve": "^1.1.6" } }, "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", "dev": true, "requires": { - "indent-string": "2.1.0", - "strip-indent": "1.0.1" + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" }, "dependencies": { - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", "dev": true - }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "dev": true, - "requires": { - "get-stdin": "4.0.1" - } } } }, - "redeyed": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-1.0.1.tgz", - "integrity": "sha1-6WwZO0DAgWsArshCaY5hGF5VSYo=", - "optional": true, - "requires": { - "esprima": "3.0.0" - } - }, "redis": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/redis/-/redis-2.8.0.tgz", - "integrity": "sha512-M1OkonEQwtRmZv4tEWF2VgpG0JWJ8Fv1PhlgT5+B+uNq2cA3Rt1Yt/ryoR+vQNOQcIEgdCdfH0jr3bDpihAw1A==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", + "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", "requires": { - "double-ended-queue": "2.1.0-0", - "redis-commands": "1.3.1", - "redis-parser": "2.6.0" + "denque": "^1.4.1", + "redis-commands": "^1.5.0", + "redis-errors": "^1.2.0", + "redis-parser": "^3.0.0" } }, "redis-commands": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.3.1.tgz", - "integrity": "sha1-gdgm9F+pyLIBH0zXoP5ZfSQdRCs=" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", + "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" + }, + "redis-errors": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", + "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" }, "redis-mock": { - "version": "0.20.0", - "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.20.0.tgz", - "integrity": "sha1-lKOVhlurvOv1OLa1mUFyPkgHMBA=", + "version": "0.47.0", + "resolved": "https://registry.npmjs.org/redis-mock/-/redis-mock-0.47.0.tgz", + "integrity": "sha512-Kbyy7xB+Sj+fPZlwtJGIVus8QfPDFxXi1d2YJ0XXxKEIPN8ciSUFt45uw8G/gGfNm+BsT3bcvBp7D+7du7s/9Q==", "dev": true }, "redis-parser": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-2.6.0.tgz", - "integrity": "sha1-Uu0J2srBCPGmMcB+m2mUHnoZUEs=" - }, - "reduce-css-calc": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz", - "integrity": "sha1-dHyRTgSWFKTJz7umKYca0dKSdxY=", - "dev": true, + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", + "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", "requires": { - "balanced-match": "0.4.2", - "math-expression-evaluator": "1.2.17", - "reduce-function-call": "1.0.2" - }, - "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", - "dev": true - } + "redis-errors": "^1.0.0" } }, - "reduce-function-call": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz", - "integrity": "sha1-WiAL+S4ON3UXUv5FsKszD9S2vpk=", + "reduce-css-calc": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-2.1.7.tgz", + "integrity": "sha512-fDnlZ+AybAS3C7Q9xDq5y8A2z+lT63zLbynew/lur/IR24OQF5x98tfNwf79mzEdfywZ0a2wpM860FhFfMxZlA==", "dev": true, "requires": { - "balanced-match": "0.4.2" + "css-unit-converter": "^1.1.1", + "postcss-value-parser": "^3.3.0" }, "dependencies": { - "balanced-match": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", - "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "postcss-value-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz", + "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==", "dev": true } } }, "referrer-policy": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.1.0.tgz", - "integrity": "sha1-NXdOtzW/UPtsB46DM0tHI1AgfXk=" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/referrer-policy/-/referrer-policy-1.2.0.tgz", + "integrity": "sha512-LgQJIuS6nAy1Jd88DCQRemyE3mS+ispwlqMk3b0yjZ257fI1v9c+/p6SD5gP5FGyXUIgrNOAfmyioHwZtYv2VA==" }, "regenerate": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", - "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.1.tgz", + "integrity": "sha512-j2+C8+NtXQgEKWk49MMP5P/u2GhnahTtVkRIHr5R5lVRlbKvmQ+oS+A5aLKWp2ma5VkT8sh6v+v4hbH0YHR66A==", "dev": true }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, "regenerator-runtime": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz", - "integrity": "sha512-/aA0kLeRb5N9K0d4fw7ooEbI+xDe+DKD499EQqygGqeS8N3xto15p09uY2xj7ixP81sNPXvRLnAQIqdVStgb1A==", + "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 }, "regenerator-transform": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", - "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", "dev": true, "requires": { - "babel-runtime": "6.26.0", - "babel-types": "6.26.0", - "private": "0.1.8" + "@babel/runtime": "^7.8.4" } }, - "regex-cache": { - "version": "0.4.4", - "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", - "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", "dev": true, "requires": { - "is-equal-shallow": "0.1.3" + "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" + } + }, + "regexpp": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", + "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", + "dev": true + }, "regexpu-core": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", - "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz", + "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==", "dev": true, "requires": { - "regenerate": "1.3.3", - "regjsgen": "0.2.0", - "regjsparser": "0.1.5" + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" } }, "regjsgen": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", - "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", - "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz", + "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==", "dev": true, "requires": { - "jsesc": "0.5.0" + "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { @@ -10791,66 +15629,75 @@ "integrity": "sha1-VNvzd+UUQKypCkzSdGANP/LYiKk=", "dev": true }, + "release-zalgo": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", + "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=", + "dev": true, + "requires": { + "es6-error": "^4.0.1" + } + }, "remark": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/remark/-/remark-8.0.0.tgz", - "integrity": "sha512-K0PTsaZvJlXTl9DN6qYlvjTkqSZBFELhROZMrblm2rB+085flN84nz4g/BscKRMqDvhzlK1oQ/xnWQumdeNZYw==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/remark/-/remark-10.0.1.tgz", + "integrity": "sha512-E6lMuoLIy2TyiokHprMjcWNJ5UxfGQjaMSMhV+f4idM625UjjK4j798+gPs5mfjzDE6vL0oFKVeZM6gZVSVrzQ==", "dev": true, "requires": { - "remark-parse": "4.0.0", - "remark-stringify": "4.0.0", - "unified": "6.1.6" + "remark-parse": "^6.0.0", + "remark-stringify": "^6.0.0", + "unified": "^7.0.0" } }, "remark-parse": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-4.0.0.tgz", - "integrity": "sha512-XZgICP2gJ1MHU7+vQaRM+VA9HEL3X253uwUM/BGgx3iv6TH2B3bF3B8q00DKcyP9YrJV+/7WOWEWBFF/u8cIsw==", - "dev": true, - "requires": { - "collapse-white-space": "1.0.3", - "is-alphabetical": "1.0.1", - "is-decimal": "1.0.1", - "is-whitespace-character": "1.0.1", - "is-word-character": "1.0.1", - "markdown-escapes": "1.0.1", - "parse-entities": "1.1.1", - "repeat-string": "1.6.1", - "state-toggle": "1.0.0", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-6.0.3.tgz", + "integrity": "sha512-QbDXWN4HfKTUC0hHa4teU463KclLAnwpn/FBn87j9cKYJWWawbiLgMfP2Q4XwhxxuuuOxHlw+pSN0OKuJwyVvg==", + "dev": true, + "requires": { + "collapse-white-space": "^1.0.2", + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "is-word-character": "^1.0.0", + "markdown-escapes": "^1.0.0", + "parse-entities": "^1.1.0", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", "trim": "0.0.1", - "trim-trailing-lines": "1.1.0", - "unherit": "1.1.0", - "unist-util-remove-position": "1.1.1", - "vfile-location": "2.0.2", - "xtend": "4.0.1" + "trim-trailing-lines": "^1.0.0", + "unherit": "^1.0.4", + "unist-util-remove-position": "^1.0.0", + "vfile-location": "^2.0.0", + "xtend": "^4.0.1" } }, "remark-stringify": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-4.0.0.tgz", - "integrity": "sha512-xLuyKTnuQer3ke9hkU38SUYLiTmS078QOnoFavztmbt/pAJtNSkNtFgR0U//uCcmG0qnyxao+PDuatQav46F1w==", - "dev": true, - "requires": { - "ccount": "1.0.2", - "is-alphanumeric": "1.0.0", - "is-decimal": "1.0.1", - "is-whitespace-character": "1.0.1", - "longest-streak": "2.0.2", - "markdown-escapes": "1.0.1", - "markdown-table": "1.1.1", - "mdast-util-compact": "1.0.1", - "parse-entities": "1.1.1", - "repeat-string": "1.6.1", - "state-toggle": "1.0.0", - "stringify-entities": "1.3.1", - "unherit": "1.1.0", - "xtend": "4.0.1" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/remark-stringify/-/remark-stringify-6.0.4.tgz", + "integrity": "sha512-eRWGdEPMVudijE/psbIDNcnJLRVx3xhfuEsTDGgH4GsFF91dVhw5nhmnBppafJ7+NWINW6C7ZwWbi30ImJzqWg==", + "dev": true, + "requires": { + "ccount": "^1.0.0", + "is-alphanumeric": "^1.0.0", + "is-decimal": "^1.0.0", + "is-whitespace-character": "^1.0.0", + "longest-streak": "^2.0.1", + "markdown-escapes": "^1.0.0", + "markdown-table": "^1.1.0", + "mdast-util-compact": "^1.0.0", + "parse-entities": "^1.0.2", + "repeat-string": "^1.5.4", + "state-toggle": "^1.0.0", + "stringify-entities": "^1.0.1", + "unherit": "^1.0.4", + "xtend": "^4.0.1" } }, "remove-array-items": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.0.0.tgz", - "integrity": "sha1-B79CyzMvTPboXq2DteToltIyayE=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/remove-array-items/-/remove-array-items-1.1.1.tgz", + "integrity": "sha512-MXW/jtHyl5F1PZI7NbpS8SOtympdLuF20aoWJT5lELR1p/HJDd5nqW8Eu9uLh/hCRY3FgvrIT5AwDCgBODklcA==" }, "remove-trailing-separator": { "version": "1.1.0", @@ -10859,9 +15706,9 @@ "dev": true }, "repeat-element": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", - "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", "dev": true }, "repeat-string": { @@ -10870,15 +15717,6 @@ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", "dev": true }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "dev": true, - "requires": { - "is-finite": "1.0.2" - } - }, "replace-ext": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", @@ -10886,42 +15724,41 @@ "dev": true }, "request": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/request/-/request-2.22.0.tgz", - "integrity": "sha1-uIOnacxKkJVx61AEs0TEPPflFZI=", - "dev": true, - "requires": { - "aws-sign": "0.3.0", - "cookie-jar": "0.3.0", - "forever-agent": "0.5.2", - "form-data": "0.0.8", - "hawk": "0.13.1", - "http-signature": "0.10.1", - "json-stringify-safe": "4.0.0", - "mime": "1.2.11", - "node-uuid": "1.4.8", - "oauth-sign": "0.3.0", - "qs": "0.6.6", - "tunnel-agent": "0.3.0" + "version": "2.88.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz", + "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==", + "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.0", + "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.4.3", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" }, "dependencies": { - "mime": { - "version": "1.2.11", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.11.tgz", - "integrity": "sha1-WCA+7Ybjpe8XrtK32evUfwpg3RA=", - "dev": true - }, - "node-uuid": { - "version": "1.4.8", - "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.8.tgz", - "integrity": "sha1-sEDrCSOWivq/jTL7HxfxFn/auQc=", - "dev": true - }, "qs": { - "version": "0.6.6", - "resolved": "https://registry.npmjs.org/qs/-/qs-0.6.6.tgz", - "integrity": "sha1-bgFQmP9RlouKPIGQAdXyyJvEsQc=", - "dev": true + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" } } }, @@ -10931,28 +15768,12 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, - "require-from-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.1.tgz", - "integrity": "sha1-xUUjPp19pmFunVmt+zn8n1iGdv8=", - "dev": true - }, "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "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=", - "dev": true, - "requires": { - "caller-path": "0.1.0", - "resolve-from": "1.0.1" - } - }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -10960,28 +15781,79 @@ "dev": true }, "resolve": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", - "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz", + "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==", "dev": true, "requires": { - "path-parse": "1.0.5" + "path-parse": "^1.0.6" } }, - "resolve-from": { + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-dir": { "version": "1.0.1", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", - "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.0", + "global-modules": "^1.0.0" + }, + "dependencies": { + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "^1.0.1", + "is-windows": "^1.0.1", + "resolve-dir": "^1.0.0" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "^2.0.2", + "homedir-polyfill": "^1.0.1", + "ini": "^1.3.4", + "is-windows": "^1.0.1", + "which": "^1.2.14" + } + } + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", "dev": true }, "restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", "dev": true, "requires": { - "onetime": "2.0.1", - "signal-exit": "3.0.2" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" } }, "ret": { @@ -10990,42 +15862,86 @@ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", "dev": true }, - "right-align": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", - "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", - "dev": true, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "retry-request": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/retry-request/-/retry-request-4.1.1.tgz", + "integrity": "sha512-BINDzVtLI2BDukjWmjAIRZ0oglnCAkpP2vQjM3jdLhmT62h0xnQgciPwBRDAvHqpkPT2Wo1XuUyLyn6nbGrZQQ==", "requires": { - "align-text": "0.1.4" + "debug": "^4.1.1", + "through2": "^3.0.1" + }, + "dependencies": { + "through2": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-3.0.2.tgz", + "integrity": "sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==", + "requires": { + "inherits": "^2.0.4", + "readable-stream": "2 || 3" + } + } } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rgb-regex": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz", + "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=", + "dev": true + }, + "rgba-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz", + "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=", + "dev": true + }, "rimraf": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", - "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "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.2" + "glob": "^7.1.3" } }, "ripemd160": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.1.tgz", - "integrity": "sha1-D0WEKVxTo2KK9+bXmsohzlfRxuc=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", "dev": true, "requires": { - "hash-base": "2.0.2", - "inherits": "2.0.3" + "hash-base": "^3.0.0", + "inherits": "^2.0.1" } }, "run-async": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", - "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", - "dev": true, - "requires": { - "is-promise": "2.1.0" - } + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/run-node/-/run-node-1.0.0.tgz", + "integrity": "sha512-kc120TBlQ3mih1LSzdAJXo4xn/GWS2ec0l3S+syHDXP9uRr0JAT8Qd3mdMuyjqCzeZktgP3try92cEgf9Nks8A==", + "dev": true + }, + "run-parallel": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.9.tgz", + "integrity": "sha512-DEqnSRTDw/Tc3FXf49zedI638Z9onwUotBMiUFKmrO2sdFKIbXamXGQ3Axd4qgphxKB4kw/qP1w5kTxnfU1B9Q==", + "dev": true }, "run-queue": { "version": "1.0.3", @@ -11033,37 +15949,22 @@ "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", "dev": true, "requires": { - "aproba": "1.2.0" - } - }, - "rx-lite": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz", - "integrity": "sha1-Cx4Rr4vESDbwSmQH6S2kJGe3lEQ=", - "dev": true - }, - "rx-lite-aggregates": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz", - "integrity": "sha1-dTuHqJoRyVRnxKwWJsTvxOBcZ74=", - "dev": true, - "requires": { - "rx-lite": "4.0.8" + "aproba": "^1.1.1" } }, "rxjs": { - "version": "5.5.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.5.2.tgz", - "integrity": "sha512-oRYoIKWBU3Ic37fLA5VJu31VqQO4bWubRntcHSJ+cwaDQBwdnZ9x4zmhJfm/nFQ2E82/I4loSioHnACamrKGgA==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.5.tgz", + "integrity": "sha512-WfQI+1gohdf0Dai/Bbmk5L5ItH5tYqm3ki2c5GdWhKjalzjg93N3avFjVStyZZz+A2Em+ZxKH5bNghw9UeylGQ==", "dev": true, "requires": { - "symbol-observable": "1.1.0" + "tslib": "^1.9.0" } }, "safe-buffer": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", - "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -11071,14 +15972,13 @@ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", "dev": true, "requires": { - "ret": "0.1.15" + "ret": "~0.1.10" } }, - "samsam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", - "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", - "dev": true + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sax": { "version": "1.2.1", @@ -11086,12 +15986,30 @@ "integrity": "sha1-e45lYZCyKOgaZq6nSEgNgozS03o=" }, "schema-utils": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.3.0.tgz", - "integrity": "sha1-9YdyIs4+kx7a4DnxfrNxbnE3+M8=", + "version": "2.6.6", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.6.6.tgz", + "integrity": "sha512-wHutF/WPSbIi9x6ctjGGk2Hvl0VOz5l3EKEuKbjPlB30mKZUzb9A5k9yEXRX3pwyqVLPvpfZZEllaFq/M718hA==", + "dev": true, + "requires": { + "ajv": "^6.12.0", + "ajv-keywords": "^3.4.1" + } + }, + "script-loader": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/script-loader/-/script-loader-0.7.2.tgz", + "integrity": "sha512-UMNLEvgOAQuzK8ji8qIscM3GIrRCWN6MmMXGD4SD5l6cSycgGsCo0tX5xRnfQcoghqct0tjHjcykgI1PyBE2aA==", "dev": true, "requires": { - "ajv": "5.5.0" + "raw-loader": "~0.5.1" + }, + "dependencies": { + "raw-loader": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-0.5.1.tgz", + "integrity": "sha1-DD0L6u2KAclm2Xh793goElKpeao=", + "dev": true + } } }, "scroll-to-anchor": { @@ -11105,75 +16023,105 @@ "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", "dev": true }, - "selenium-webdriver": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", - "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", - "dev": true, + "selenium-standalone": { + "version": "6.17.0", + "resolved": "https://registry.npmjs.org/selenium-standalone/-/selenium-standalone-6.17.0.tgz", + "integrity": "sha512-5PSnDHwMiq+OCiAGlhwQ8BM9xuwFfvBOZ7Tfbw+ifkTnOy0PWbZmI1B9gPGuyGHpbQ/3J3CzIK7BYwrQ7EjtWQ==", "requires": { - "jszip": "3.1.5", - "rimraf": "2.6.2", - "tmp": "0.0.30", - "xml2js": "0.4.17" - }, - "dependencies": { - "tmp": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", - "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", - "dev": true, - "requires": { - "os-tmpdir": "1.0.2" - } - } + "async": "^2.6.2", + "commander": "^2.19.0", + "cross-spawn": "^6.0.5", + "debug": "^4.1.1", + "lodash": "^4.17.11", + "minimist": "^1.2.0", + "mkdirp": "^0.5.1", + "progress": "2.0.3", + "request": "2.88.0", + "tar-stream": "2.0.0", + "urijs": "^1.19.1", + "which": "^1.3.1", + "yauzl": "^2.10.0" } }, "selfsigned": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.1.tgz", - "integrity": "sha1-v4y3uDJWxFUeMTR8YxF3jbme7FI=", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.7.tgz", + "integrity": "sha512-8M3wBCzeWIJnQfl43IKwOmC4H/RAp50S8DF60znzjW5GVqTcSe2vWclt7hmYVPkKPlHWOu5EaWOMZ2Y6W8ZXTA==", "dev": true, "requires": { - "node-forge": "0.6.33" + "node-forge": "0.9.0" + }, + "dependencies": { + "node-forge": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.0.tgz", + "integrity": "sha512-7ASaDa3pD+lJ3WvXFsxekJQelBKRpne+GOVbLbtHYdd7pFspyeuJHnWfLplGf3SwKGbfs/aYl5V/JCIaHVUKKQ==", + "dev": true + } } }, "semver": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.4.1.tgz", - "integrity": "sha512-WfG/X9+oATh81XtllIo/I8gOiY9EXRdv1cQdyykeXK17YcUW3EXUAi2To4pcH6nZtJPr7ZOpM5OMyWJZm+8Rsg==", + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, "send": { - "version": "0.16.1", - "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", - "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", "requires": { "debug": "2.6.9", - "depd": "1.1.1", - "destroy": "1.0.4", - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "etag": "1.8.1", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", "fresh": "0.5.2", - "http-errors": "1.6.2", - "mime": "1.4.1", - "ms": "2.0.0", - "on-finished": "2.3.0", - "range-parser": "1.2.0", - "statuses": "1.3.1" + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" }, "dependencies": { - "statuses": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", - "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=" + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "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==" } } }, "serialize-javascript": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.4.0.tgz", - "integrity": "sha1-fJWFFNtqwkQ6irwGLcn3iGp/YAU=", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", + "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", "dev": true }, "serve-index": { @@ -11182,24 +16130,65 @@ "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", "dev": true, "requires": { - "accepts": "1.3.4", + "accepts": "~1.3.4", "batch": "0.6.1", "debug": "2.6.9", - "escape-html": "1.0.3", - "http-errors": "1.6.2", - "mime-types": "2.1.17", - "parseurl": "1.3.2" + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } } }, "serve-static": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", - "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", "requires": { - "encodeurl": "1.0.1", - "escape-html": "1.0.3", - "parseurl": "1.3.2", - "send": "0.16.1" + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" } }, "set-blocking": { @@ -11208,11 +16197,28 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, - "set-immediate-shim": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", - "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", - "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, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } }, "setimmediate": { "version": "1.0.5", @@ -11221,46 +16227,38 @@ "dev": true }, "setprototypeof": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", - "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { - "version": "2.4.9", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.9.tgz", - "integrity": "sha512-G8zektVqbiPHrylgew9Zg1VRB1L/DtXNUVAM6q4QLy8NE3qtHlFXTf8VLL4k1Yl6c7NMjtZUTdXV+X44nFaT6A==", + "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.3", - "safe-buffer": "5.1.1" + "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=", - "dev": true, "requires": { - "shebang-regex": "1.0.0" + "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true + "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.1", - "array-map": "0.0.0", - "array-reduce": "0.0.0", - "jsonify": "0.0.0" - } + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.7.2.tgz", + "integrity": "sha512-mRz/m/JVscCrkMyPqHc/bczi3OQHkLTqXHEFu0zDhK/qfv3UcOA4SVmRCLmos4bhjr9ekVQubj/R7waKapmiQg==", + "dev": true }, "shelljs": { "version": "0.7.7", @@ -11268,39 +16266,55 @@ "integrity": "sha1-svXHfvlxSPS09uImguELuoZnz/E=", "dev": true, "requires": { - "glob": "7.1.2", - "interpret": "1.1.0", - "rechoir": "0.6.2" + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" } }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", - "dev": true + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" }, - "sinon": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.2.2.tgz", - "integrity": "sha512-BEa593xl+IkIc94nKo0O0LauQC/gQy8Gyv4DkzPwF/9DweC5phr1y+42zibCpn9abfkdHxt9r8AhD0R6u9DE/Q==", + "simple-swizzle": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", + "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", "dev": true, "requires": { - "diff": "3.2.0", - "formatio": "1.2.0", - "lodash.get": "4.4.2", - "lolex": "2.3.2", - "nise": "1.2.2", - "supports-color": "5.1.0", - "type-detect": "4.0.8" + "is-arrayish": "^0.3.1" + }, + "dependencies": { + "is-arrayish": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", + "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", + "dev": true + } + } + }, + "sinon": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-7.5.0.tgz", + "integrity": "sha512-AoD0oJWerp0/rY9czP/D6hDTTUYGpObhZjMpd7Cl/A6+j0xBE+ayL/ldfggkBXUs0IkvIiM1ljM8+WkOc5k78Q==", + "dev": true, + "requires": { + "@sinonjs/commons": "^1.4.0", + "@sinonjs/formatio": "^3.2.1", + "@sinonjs/samsam": "^3.3.3", + "diff": "^3.5.0", + "lolex": "^4.2.0", + "nise": "^1.5.2", + "supports-color": "^5.5.0" }, "dependencies": { "supports-color": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.1.0.tgz", - "integrity": "sha512-Ry0AwkoKjDpVKK4sV4h6o3UJmNRbjYm2uXhwfj3J56lMVdvnUNqzQVRztOOMGQ++w1K/TjNDFvpJk0F/LoeBCQ==", + "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": "2.0.0" + "has-flag": "^3.0.0" } } } @@ -11312,201 +16326,363 @@ "dev": true }, "slice-ansi": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", - "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", + "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { - "is-fullwidth-code-point": "2.0.0" + "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" + } + } } }, - "sntp": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/sntp/-/sntp-0.2.4.tgz", - "integrity": "sha1-+4hfGLDzqtGJ+CSGJTa87ux1CQA=", + "snakeize": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/snakeize/-/snakeize-0.1.0.tgz", + "integrity": "sha1-EMCI2LWOsHazIpu1oE4jLOEmQi0=" + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", "dev": true, "requires": { - "hoek": "0.9.1" + "kind-of": "^3.2.0" }, "dependencies": { - "hoek": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/hoek/-/hoek-0.9.1.tgz", - "integrity": "sha1-PTIkYrrfB3Fup+uFuviAec3c5QU=", + "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 + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } } } }, "sockjs": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.18.tgz", - "integrity": "sha1-2bKJMWyn33dZXvKZ4HXw+TfrQgc=", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { - "faye-websocket": "0.10.0", - "uuid": "2.0.3" + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" }, "dependencies": { "uuid": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-2.0.3.tgz", - "integrity": "sha1-Z+LoY3lyFVMN/zGOW/nc6/1Hsho=", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", "dev": true } } }, "sockjs-client": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.1.4.tgz", - "integrity": "sha1-W6vjhrd15M8U51IJEUUmVAFsixI=", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", "dev": true, "requires": { - "debug": "2.6.9", - "eventsource": "0.1.6", - "faye-websocket": "0.11.1", - "inherits": "2.0.3", - "json3": "3.3.2", - "url-parse": "1.2.0" + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" }, "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, "faye-websocket": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.1.tgz", - "integrity": "sha1-8O/hjE9W5PQK/H4Gxxn9XuYYjzg=", + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", "dev": true, "requires": { - "websocket-driver": "0.7.0" + "websocket-driver": ">=0.5.1" } } } }, - "sort-keys": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", - "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", - "dev": true, - "requires": { - "is-plain-obj": "1.1.0" - } - }, "source-list-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.0.tgz", - "integrity": "sha512-I2UmuJSRr/T8jisiROLU3A3ltr+swpniSmNPI4Ml3ZCX6tVnDsuZzK7F2hl5jTqbZBWCEKlj5HRQiPExXLgE8A==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==", "dev": true }, "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 + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "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, + "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.4.18", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", - "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "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": { - "source-map": "0.5.7" + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" }, "dependencies": { "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "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-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 + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" + }, + "spawn-wrap": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.3.tgz", + "integrity": "sha512-IgB8md0QW/+tWqcavuFgKYR/qIRvJkRLPJDFaoXtLLUaVcCDK0+HeFTkmQHj3eprcYhc+gOl0aEA1w7qZlYezw==", + "dev": true, + "requires": { + "foreground-child": "^1.5.6", + "mkdirp": "^0.5.0", + "os-homedir": "^1.0.1", + "rimraf": "^2.6.2", + "signal-exit": "^3.0.2", + "which": "^1.3.0" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, "spdx-correct": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", - "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", + "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { - "spdx-license-ids": "1.2.2" + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" } }, - "spdx-expression-parse": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", - "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, + "spdx-expression-parse": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", + "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", + "dev": true, + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, "spdx-license-ids": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", - "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", + "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "spdy": { - "version": "3.4.7", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-3.4.7.tgz", - "integrity": "sha1-Qv9B7OXMD5mjpsKKq7c/XDsDrLw=", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { - "debug": "2.6.9", - "handle-thing": "1.2.5", - "http-deceiver": "1.2.7", - "safe-buffer": "5.1.1", - "select-hose": "2.0.0", - "spdy-transport": "2.0.20" + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" } }, "spdy-transport": { - "version": "2.0.20", - "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-2.0.20.tgz", - "integrity": "sha1-c15yBUxIayNU/onnAiVgBKOazk0=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", "dev": true, "requires": { - "debug": "2.6.9", - "detect-node": "2.0.3", - "hpack.js": "2.1.6", - "obuf": "1.1.1", - "readable-stream": "2.3.3", - "safe-buffer": "5.1.1", - "wbuf": "1.7.2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } - } + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" } }, "specificity": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.3.2.tgz", - "integrity": "sha512-Nc/QN/A425Qog7j9aHmwOrlwX2e7pNI47ciwxwy4jOlvbbMHkNNJchit+FX+UjF3IAdiaaV5BKeWuDUnws6G1A==", + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/specificity/-/specificity-0.4.1.tgz", + "integrity": "sha512-1klA3Gi5PD1Wv9Q0wUoOQN1IWAuPu0D1U03ThXTr0cJ20+/iq2tHSDnK7Kk/0LXJ1ztUB2/1Os0wKmfyNgUQfg==", "dev": true }, - "split": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", - "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", "dev": true, "requires": { - "through": "2.3.8" + "extend-shallow": "^3.0.0" } }, "split2": { @@ -11515,7 +16691,7 @@ "integrity": "sha1-At2smtwD7Au3jBKC7Aecpuha6QA=", "dev": true, "requires": { - "through2": "0.6.5" + "through2": "~0.6.1" }, "dependencies": { "isarray": { @@ -11530,20 +16706,26 @@ "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", "isarray": "0.0.1", - "string_decoder": "0.10.31" + "string_decoder": "~0.10.x" } }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, "through2": { "version": "0.6.5", "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", "dev": true, "requires": { - "readable-stream": "1.0.34", - "xtend": "4.0.1" + "readable-stream": ">=1.0.33-1 <1.1.0-0", + "xtend": ">=4.0.0 <4.1.0-0" } } } @@ -11554,157 +16736,173 @@ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "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" + } + }, "ssri": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-5.1.0.tgz", - "integrity": "sha512-TevC8fgxQKTfQ1nWtM9GNzr3q5rrHNntG9CDMH1k3QhSZI6Kb+NbjLRs8oPFZa2Hgo7zoekL+UTvoEk7tsbjQg==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", "dev": true, "requires": { - "safe-buffer": "5.1.1" + "figgy-pudding": "^3.5.1" } }, + "stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "dev": true + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" }, - "staged-git-files": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/staged-git-files/-/staged-git-files-0.0.4.tgz", - "integrity": "sha1-15fhtVHKemOd7AI33G60u5vhfTU=", - "dev": true - }, "state-toggle": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.0.tgz", - "integrity": "sha1-0g+aYWu08MO5i5GSLSW2QKorxCU=", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/state-toggle/-/state-toggle-1.0.3.tgz", + "integrity": "sha512-d/5Z4/2iiCnHw6Xzghyhb+GcmF89bxwgXG60wjIiZaxnymbyOmI8Hk4VqHXiVVp6u2ysaskFfXg3ekCj4WNftQ==", "dev": true }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, "statuses": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", - "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" }, "stream-browserify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz", - "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", "dev": true, "requires": { - "inherits": "2.0.3", - "readable-stream": "2.3.3" + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" }, "dependencies": { "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "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" } } } }, "stream-combiner": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", - "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.2.2.tgz", + "integrity": "sha1-rsjLrBd7Vrb0+kec7YwZEs7lKFg=", "dev": true, "requires": { - "duplexer": "0.1.1" + "duplexer": "~0.1.1", + "through": "~2.3.4" } }, "stream-each": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", - "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", "dev": true, "requires": { - "end-of-stream": "1.4.1", - "stream-shift": "1.0.0" + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-events": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/stream-events/-/stream-events-1.0.5.tgz", + "integrity": "sha512-E1GUzBSgvct8Jsb3v2X15pjzN1tYebtbLaMg+eBOUOAxgbLoSbT2NS91ckc5lJD1KfLjId+jXJRgo0qnV5Nerg==", + "requires": { + "stubs": "^3.0.0" } }, "stream-http": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.7.2.tgz", - "integrity": "sha512-c0yTD2rbQzXtSsFSVhtpvY/vS6u066PcXOX9kBB3mSO76RiUQzL340uJkGBWnlBg4/HZzqiUXtaVA7wcRcJgEw==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", "dev": true, "requires": { - "builtin-status-codes": "3.0.0", - "inherits": "2.0.3", - "readable-stream": "2.3.3", - "to-arraybuffer": "1.0.1", - "xtend": "4.0.1" + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" }, "dependencies": { "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "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" } } } }, "stream-shift": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", - "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", - "dev": true - }, - "stream-to-observable": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/stream-to-observable/-/stream-to-observable-0.1.0.tgz", - "integrity": "sha1-Rb8dny19wJvtgfHDB8Qw5ouEz/4=", - "dev": true - }, - "streamsearch": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-0.1.2.tgz", - "integrity": "sha1-gIudDlb8Jz2Am6VzOOkpkZoanxo=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" }, "strftime": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/strftime/-/strftime-0.10.0.tgz", "integrity": "sha1-s/D6QZKVICpaKJ9ta+n0kJphcZM=" }, - "strict-uri-encode": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", - "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", "dev": true }, "string-hash": { @@ -11714,69 +16912,122 @@ "dev": true }, "string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "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": { - "is-fullwidth-code-point": "2.0.0", - "strip-ansi": "4.0.0" + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" }, "dependencies": { "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "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": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "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": "3.0.0" + "ansi-regex": "^4.1.0" } } } }, "string.prototype.padend": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.0.0.tgz", - "integrity": "sha1-86rvfBcZ8XDF6rHDK/eA2W4h8vA=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.0.tgz", + "integrity": "sha512-3aIv8Ffdp8EZj8iLwREGpQaUZiPyrWrpzMBHvkiSW/bK/EGve9np07Vwy7IJ5waydpGXzQZu/F8Oze2/IWkBaA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "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" + } + }, + "string.prototype.trimleft": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz", + "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimstart": "^1.0.0" + } + }, + "string.prototype.trimright": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz", + "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5", + "string.prototype.trimend": "^1.0.0" + } + }, + "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.2", - "es-abstract": "1.10.0", - "function-bind": "1.1.1" + "define-properties": "^1.1.3", + "es-abstract": "^1.17.5" } }, "string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } }, "stringify-entities": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.1.tgz", - "integrity": "sha1-sVDsLXKsTBtfMktR+2soyc3/BYw=", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-1.3.2.tgz", + "integrity": "sha512-nrBAQClJAPN2p+uGCVJRPIPakKeKWZ9GtBCmormE7pWOSlHat7+x5A8gx85M7HM5Dt0BP3pP5RhVW77WdbJJ3A==", "dev": true, "requires": { - "character-entities-html4": "1.1.1", - "character-entities-legacy": "1.1.1", - "is-alphanumerical": "1.0.1", - "is-hexadecimal": "1.0.1" + "character-entities-html4": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-hexadecimal": "^1.0.0" } }, "stringify-object": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.2.1.tgz", - "integrity": "sha512-jPcQYw/52HUPP8uOE4kkjxl5bB9LfHkKCTptIk3qw7ozP5XMIMlHMLjt00GGSwW6DJAf/njY5EU6Vpwl4LlBKQ==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", "dev": true, "requires": { - "get-own-enumerable-property-symbols": "2.0.1", - "is-obj": "1.0.1", - "is-regexp": "1.0.0" + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "dependencies": { + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + } } }, "strip-ansi": { @@ -11784,7 +17035,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "requires": { - "ansi-regex": "2.1.1" + "ansi-regex": "^2.0.0" } }, "strip-bom": { @@ -11799,6 +17050,12 @@ "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "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-indent": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", @@ -11806,320 +17063,498 @@ "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=", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.0.tgz", + "integrity": "sha512-e6/d0eBu7gHtdCqFt0xJr642LdToM5/cN4Qb9DbHjVx1CP5RyeM+zH7pbecEmDv/lBqb0QH+6Uqq75rxFPkM0w==", "dev": true }, + "stubs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stubs/-/stubs-3.0.0.tgz", + "integrity": "sha1-6NK6H6nJBXAwPAMLaQD31fiavls=" + }, "style-search": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", "integrity": "sha1-eVjHk+R+MuB9K1yv5cC/jhLneQI=", "dev": true }, + "stylehacks": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz", + "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==", + "dev": true, + "requires": { + "browserslist": "^4.0.0", + "postcss": "^7.0.0", + "postcss-selector-parser": "^3.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", + "dev": true, + "requires": { + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + } + } + }, "stylelint": { - "version": "8.3.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-8.3.1.tgz", - "integrity": "sha512-v5K6tv+Ky3SoJfNqGOvgzRDLqZV133CZ7Wtu3y5aAGjQHVi+6dixFLgI82VrJZJdC4HwZplafJcRP+4r7EUt5g==", - "dev": true, - "requires": { - "autoprefixer": "7.2.5", - "balanced-match": "1.0.0", - "chalk": "2.3.0", - "cosmiconfig": "3.1.0", - "debug": "3.1.0", - "execall": "1.0.0", - "file-entry-cache": "2.0.0", - "get-stdin": "5.0.1", - "globby": "7.1.1", - "globjoin": "0.1.4", - "html-tags": "2.0.0", - "ignore": "3.3.7", - "imurmurhash": "0.1.4", - "known-css-properties": "0.4.1", - "lodash": "4.17.4", - "log-symbols": "2.1.0", - "mathml-tag-names": "2.0.1", - "meow": "3.7.0", - "micromatch": "2.3.11", - "normalize-selector": "0.2.0", - "pify": "3.0.0", - "postcss": "6.0.14", - "postcss-html": "0.11.0", - "postcss-less": "1.1.3", - "postcss-media-query-parser": "0.2.3", - "postcss-reporter": "5.0.0", - "postcss-resolve-nested-selector": "0.1.1", - "postcss-safe-parser": "3.0.1", - "postcss-scss": "1.0.2", - "postcss-selector-parser": "3.1.1", - "postcss-value-parser": "3.3.0", - "resolve-from": "4.0.0", - "specificity": "0.3.2", - "string-width": "2.1.1", - "style-search": "0.1.0", - "sugarss": "1.0.1", - "svg-tags": "1.0.0", - "table": "4.0.2" + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-11.1.1.tgz", + "integrity": "sha512-Vx6TAJsxG6qksiFvxQTKriQhp1CqUWdpTDITEkAjTR+l+8Af7qNlvrUDXfpuFJgXh/ayF8xdMSKE+SstcsPmMA==", + "dev": true, + "requires": { + "autoprefixer": "^9.5.1", + "balanced-match": "^1.0.0", + "chalk": "^2.4.2", + "cosmiconfig": "^5.2.0", + "debug": "^4.1.1", + "execall": "^2.0.0", + "file-entry-cache": "^5.0.1", + "get-stdin": "^7.0.0", + "global-modules": "^2.0.0", + "globby": "^9.2.0", + "globjoin": "^0.1.4", + "html-tags": "^3.0.0", + "ignore": "^5.0.6", + "import-lazy": "^4.0.0", + "imurmurhash": "^0.1.4", + "known-css-properties": "^0.16.0", + "leven": "^3.1.0", + "lodash": "^4.17.14", + "log-symbols": "^3.0.0", + "mathml-tag-names": "^2.1.0", + "meow": "^5.0.0", + "micromatch": "^4.0.0", + "normalize-selector": "^0.2.0", + "postcss": "^7.0.14", + "postcss-html": "^0.36.0", + "postcss-jsx": "^0.36.3", + "postcss-less": "^3.1.4", + "postcss-markdown": "^0.36.0", + "postcss-media-query-parser": "^0.2.3", + "postcss-reporter": "^6.0.1", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^4.0.1", + "postcss-sass": "^0.4.1", + "postcss-scss": "^2.0.0", + "postcss-selector-parser": "^3.1.0", + "postcss-syntax": "^0.36.2", + "postcss-value-parser": "^4.0.2", + "resolve-from": "^5.0.0", + "signal-exit": "^3.0.2", + "slash": "^3.0.0", + "specificity": "^0.4.1", + "string-width": "^4.1.0", + "strip-ansi": "^5.2.0", + "style-search": "^0.1.0", + "sugarss": "^2.0.0", + "svg-tags": "^1.0.0", + "table": "^5.2.3", + "v8-compile-cache": "^2.1.0" }, "dependencies": { + "@nodelib/fs.stat": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz", + "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==", + "dev": true + }, + "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 + }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "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.1" + "color-convert": "^1.9.0" + } + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "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.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "cosmiconfig": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-3.1.0.tgz", - "integrity": "sha512-zedsBhLSbPBms+kE7AH4vHg6JsKDz6epSv2/+5XHs8ILHlgDciSJfSWf8sX9aQ52Jb7KI7VswUTsLpR/G0cr2Q==", + "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 + }, + "fast-glob": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz", + "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==", "dev": true, "requires": { - "is-directory": "0.3.1", - "js-yaml": "3.10.0", - "parse-json": "3.0.0", - "require-from-string": "2.0.1" + "@mrmlnc/readdir-enhanced": "^2.2.1", + "@nodelib/fs.stat": "^1.1.2", + "glob-parent": "^3.1.0", + "is-glob": "^4.0.0", + "merge2": "^1.2.3", + "micromatch": "^3.1.10" + }, + "dependencies": { + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + } } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", "dev": true, "requires": { - "ms": "2.0.0" + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "get-stdin": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-7.0.0.tgz", + "integrity": "sha512-zRKcywvrXlXsA0v0i9Io4KDRaAw7+a1ZpjRwl9Wox8PFlVCCHra7E9c4kqXCoCM9nR5tBkaTTZRBoCm60bFqTQ==", "dev": true }, "globby": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz", - "integrity": "sha1-+yzP+UAfhgCUXfral0QMypcrhoA=", + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-9.2.0.tgz", + "integrity": "sha512-ollPHROa5mcxDEkwg6bPt3QbEf4pDQSNtd6JPL1YvOvAo/7/0VAm9TccUeoTmarjPw4pfUthSCqcyfNB1I3ZSg==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^1.0.2", + "dir-glob": "^2.2.2", + "fast-glob": "^2.2.6", + "glob": "^7.1.3", + "ignore": "^4.0.3", + "pify": "^4.0.1", + "slash": "^2.0.0" + }, + "dependencies": { + "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 + }, + "slash": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", + "dev": true + } + } + }, + "ignore": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", + "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", + "dev": true + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-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 + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", "dev": true, "requires": { - "array-union": "1.0.2", - "dir-glob": "2.0.0", - "glob": "7.1.2", - "ignore": "3.3.7", - "pify": "3.0.0", - "slash": "1.0.0" + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } } }, - "js-yaml": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", - "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "postcss-selector-parser": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz", + "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==", "dev": true, "requires": { - "argparse": "1.0.9", - "esprima": "4.0.0" + "dot-prop": "^5.2.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" } }, - "parse-json": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "slash": { "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-3.0.0.tgz", - "integrity": "sha1-+m9HsY4jgm6tMvJj50TQ4ehH+xM=", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "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": { - "error-ex": "1.3.1" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "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" + } + } } }, - "postcss-selector-parser": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.1.tgz", - "integrity": "sha1-T4dfSvsMllc9XPTXQBGu4lCn6GU=", + "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": { - "dot-prop": "4.2.0", - "indexes-of": "1.0.1", - "uniq": "1.0.1" + "ansi-regex": "^4.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 + } } }, - "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 - }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "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" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "has-flag": "2.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, "stylelint-config-recommended": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-1.0.0.tgz", - "integrity": "sha512-wp50rY5A6MWndIIkKNNzJv/S58lTvqQEriS7CXTBN1SwtoY/YjHhCLIOkjundLnUWMvJJska6GnciLbs76UQrA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz", + "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==", "dev": true }, "stylelint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-17.0.0.tgz", - "integrity": "sha512-G8jMZ0KsaVH7leur9XLZVhwOBHZ2vdbuJV8Bgy0ta7/PpBhEHo6fjVDaNchyCGXB5sRcWVq6O9rEU/MvY9cQDQ==", + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-19.0.0.tgz", + "integrity": "sha512-VvcODsL1PryzpYteWZo2YaA5vU/pWfjqBpOvmeA8iB2MteZ/ZhI1O4hnrWMidsS4vmEJpKtjdhLdfGJmmZm6Cg==", "dev": true, "requires": { - "stylelint-config-recommended": "1.0.0" + "stylelint-config-recommended": "^3.0.0" } }, "stylelint-no-unsupported-browser-features": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-1.0.1.tgz", - "integrity": "sha512-6uaoXV/WA5BLKo9bbjERFE3oAOA0UY4FgGDaQWarV9x3qrDLS2o2SJqk0TaxwAIAgROwj9RhbQ2FF1QKRzZBNw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylelint-no-unsupported-browser-features/-/stylelint-no-unsupported-browser-features-3.0.2.tgz", + "integrity": "sha512-TLHYlaiwFa1zM1JGVsIEmQFq7tpxwgZ6xvUf1EVh1cMYKeci3TmNRUHv7GPKumxBlMzPDLPeg7zTOTEnEcTdpw==", "dev": true, "requires": { - "doiuse": "4.0.0", - "lodash": "4.17.4", - "postcss": "6.0.14", - "stylelint": "8.3.1" + "doiuse": "^4.2.0", + "lodash": "^4.17.4", + "postcss": "^7.0.0" } }, "sugarss": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-1.0.1.tgz", - "integrity": "sha512-3qgLZytikQQEVn1/FrhY7B68gPUUGY3R1Q1vTiD5xT+Ti1DP/8iZuwFet9ONs5+bmL8pZoDQ6JrQHVgrNlK6mA==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sugarss/-/sugarss-2.0.0.tgz", + "integrity": "sha512-WfxjozUk0UVA4jm+U1d736AUpzSrNsQcIbyOkoE364GrtWmIrFdk5lksEupgWMD4VaT/0kVx1dobpiDumSgmJQ==", "dev": true, "requires": { - "postcss": "6.0.14" + "postcss": "^7.0.2" } }, - "superagent": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-3.8.1.tgz", - "integrity": "sha512-VMBFLYgFuRdfeNQSMLbxGSLfmXL/xc+OO+BZp41Za/NRDBet/BNbkRJrYzCUu0u4GU0i/ml2dtT8b9qgkw9z6Q==", - "dev": true, - "requires": { - "component-emitter": "1.2.1", - "cookiejar": "2.1.1", - "debug": "3.1.0", - "extend": "3.0.1", - "form-data": "2.3.1", - "formidable": "1.1.1", - "methods": "1.1.2", - "mime": "1.4.1", - "qs": "6.5.1", - "readable-stream": "2.3.3" + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", + "dev": true + }, + "svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" }, "dependencies": { - "combined-stream": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", - "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "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": { - "delayed-stream": "1.0.0" + "color-convert": "^1.9.0" } }, - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "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": { - "ms": "2.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" } }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", "dev": true }, - "form-data": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", - "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", - "dev": true, - "requires": { - "asynckit": "0.4.0", - "combined-stream": "1.0.5", - "mime-types": "2.1.17" - } - }, - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", - "dev": true, - "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" - } - }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "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": { - "safe-buffer": "5.1.1" + "has-flag": "^3.0.0" } } } - }, - "supertest": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-3.0.0.tgz", - "integrity": "sha1-jUu2j9GDDuBwM7HFpamkAhyWUpY=", - "dev": true, - "requires": { - "methods": "1.1.2", - "superagent": "3.8.1" - } - }, - "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" - }, - "svg-tags": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", - "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=", - "dev": true - }, - "svgo": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz", - "integrity": "sha1-n1dyQTlSE1xv779Ar+ak+qiLS7U=", + }, + "svgo-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/svgo-loader/-/svgo-loader-2.2.1.tgz", + "integrity": "sha512-9dyz/h6ae04pAVRz7QY8bLXtMbwA19NPpCPfCixgW0qXNDCOlHbDRqvtT5/2gzRxfuibWCUP6ZBQmZWF9rjWhQ==", "dev": true, "requires": { - "coa": "1.0.4", - "colors": "1.1.2", - "csso": "2.3.2", - "js-yaml": "3.7.0", - "mkdirp": "0.5.1", - "sax": "1.2.1", - "whet.extend": "0.9.9" + "js-yaml": "^3.13.1", + "loader-utils": "^1.0.3" } }, "symbol": { @@ -12128,154 +17563,275 @@ "integrity": "sha1-tvmpANSWpX8CQI8iGYwQndoGMEE=" }, "symbol-observable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.1.0.tgz", - "integrity": "sha512-dQoid9tqQ+uotGhuTKEY11X4xhyYePVnqGSoSm3OGKh2E8LZ6RPULp1uXTctk33IeERlrRJYoVSBglsL05F5Uw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", "dev": true }, "table": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", - "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "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": "5.5.0", - "ajv-keywords": "2.1.1", - "chalk": "2.3.0", - "lodash": "4.17.4", - "slice-ansi": "1.0.0", - "string-width": "2.1.1" + "ajv": "^6.10.2", + "lodash": "^4.17.14", + "slice-ansi": "^2.1.0", + "string-width": "^3.0.0" + } + }, + "tailwindcss": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-1.4.0.tgz", + "integrity": "sha512-Np/VKalw2CI8EUSKNwGLFoqWIiBYVv5LpzBjQKI8XajA2SaVDj/C+YKHctmSZKR97LiiB1S81itZwtGT+BQAiQ==", + "dev": true, + "requires": { + "@fullhuman/postcss-purgecss": "^2.1.2", + "autoprefixer": "^9.4.5", + "browserslist": "^4.12.0", + "bytes": "^3.0.0", + "chalk": "^4.0.0", + "color": "^3.1.2", + "detective": "^5.2.0", + "fs-extra": "^8.0.0", + "lodash": "^4.17.15", + "node-emoji": "^1.8.1", + "normalize.css": "^8.0.1", + "postcss": "^7.0.11", + "postcss-functions": "^3.0.0", + "postcss-js": "^2.0.0", + "postcss-nested": "^4.1.1", + "postcss-selector-parser": "^6.0.0", + "pretty-hrtime": "^1.0.3", + "reduce-css-calc": "^2.1.6", + "resolve": "^1.14.2" }, "dependencies": { + "@fullhuman/postcss-purgecss": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@fullhuman/postcss-purgecss/-/postcss-purgecss-2.1.2.tgz", + "integrity": "sha512-Jf34YVBK9GtXTblpu0svNUJdA7rTQoRMz+yEJe6mwTnXDIGipWLzaX/VgU/x6IPC6WvU5SY/XlawwqhxoyFPTg==", + "dev": true, + "requires": { + "postcss": "7.0.27", + "purgecss": "^2.1.2" + } + }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", - "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", "dev": true, "requires": { - "color-convert": "1.9.1" + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" } }, "chalk": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.0.tgz", - "integrity": "sha512-Az5zJR2CBujap2rqXGaJKaPHyJ0IrUimvYNX+ncCy8PJP4ltOGTrHUIo097ZaL2zMeKYpiCdqDvS6zdrTFok3Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.0.0.tgz", + "integrity": "sha512-N9oWFcegS0sFr9oh1oz2d7Npos6vNoWW9HvtCg5N1KRFpUhaAhvTv5Y58g880fZaEYSNm3qDz8SU1UrGvp+n7A==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "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 + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "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 + }, + "purgecss": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-2.1.2.tgz", + "integrity": "sha512-5oDBxiT9VonwKmEMohPFRFZrj8fdSVKxHPwq7G5Rx/2pXicZFJu+D4m5bb3NuV0sSK3ooNxq5jFIwwHzifP5FA==", "dev": true, "requires": { - "ansi-styles": "3.2.0", - "escape-string-regexp": "1.0.5", - "supports-color": "4.5.0" + "commander": "^5.0.0", + "glob": "^7.0.0", + "postcss": "7.0.27", + "postcss-selector-parser": "^6.0.2" } }, "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", "dev": true, "requires": { - "has-flag": "2.0.0" + "has-flag": "^4.0.0" } } } }, "tapable": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz", - "integrity": "sha1-mTcqXJmb8t8WCvwNdL7U9HlIzSI=", - "dev": true - }, - "testpilot-ga": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/testpilot-ga/-/testpilot-ga-0.3.0.tgz", - "integrity": "sha512-z4PJbw3KK0R0iflA+u/3BhWZrtsLHLu+0rMviMd8H1wp8qPV0rggNBjsKckBJCcXq4uEjXETGZzApHH7Tovpzw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", "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 + "tar-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.0.0.tgz", + "integrity": "sha512-n2vtsWshZOVr/SY4KtslPoUlyNh06I2SGgAOCZmquCEjlbV/LjY2CY80rDtdQRHFOYXNlgBDo6Fr3ww2CWPOtA==", + "requires": { + "bl": "^2.2.0", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", - "dev": true + "teeny-request": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/teeny-request/-/teeny-request-7.0.0.tgz", + "integrity": "sha512-kWD3sdGmIix6w7c8ZdVKxWq+3YwVPGWz+Mq0wRZXayEKY/YHb63b8uphfBzcFDmyq8frD9+UTc3wLyOhltRbtg==", + "requires": { + "http-proxy-agent": "^4.0.0", + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.2.0", + "stream-events": "^1.0.5", + "uuid": "^8.0.0" + } }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "terser": { + "version": "4.6.12", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz", + "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "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 + } + } }, - "through2": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", - "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "terser-webpack-plugin": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", + "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", "dev": true, "requires": { - "readable-stream": "2.3.3", - "xtend": "4.0.1" + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^2.1.2", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" }, "dependencies": { - "readable-stream": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", - "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "core-util-is": "1.0.2", - "inherits": "2.0.3", - "isarray": "1.0.0", - "process-nextick-args": "1.0.7", - "safe-buffer": "5.1.1", - "string_decoder": "1.0.3", - "util-deprecate": "1.0.2" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "string_decoder": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", - "dev": true, - "requires": { - "safe-buffer": "5.1.1" - } + "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 } } }, - "thunky": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/thunky/-/thunky-0.1.0.tgz", - "integrity": "sha1-vzAUaCTituZ7Dy16Ssi+smkIaE4=", + "test-exclude": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.3.tgz", + "integrity": "sha512-M+oxtseCFO3EDtAaGH7iiej3CBkzXqFMbzqYAACdzKui4eZA+pq3tZEwChvOdNfa7xxy8BfbmgJSIr43cC/+2g==", + "dev": true, + "requires": { + "glob": "^7.1.3", + "minimatch": "^3.0.4", + "read-pkg-up": "^4.0.0", + "require-main-filename": "^2.0.0" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, - "time-stamp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-2.0.0.tgz", - "integrity": "sha1-lcakRTDhW6jW9KPsuMOj+sRto1c=", + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, - "timed-out": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", - "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=" + "through2": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", + "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", + "requires": { + "readable-stream": "3" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true }, "timers-browserify": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.4.tgz", - "integrity": "sha512-uZYhyU3EX8O7HQP+J9fTVYwsq90Vr68xPEFo7yrVImIxYvHgukBEgOB/SgGoorWVTzGM/3Z+wUNnboA4M8jWrg==", + "version": "2.0.11", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz", + "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==", "dev": true, "requires": { - "setimmediate": "1.0.5" + "setimmediate": "^1.0.4" } }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=", + "dev": true + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { - "os-tmpdir": "1.0.2" + "os-tmpdir": "~1.0.2" } }, "to-arraybuffer": { @@ -12285,11 +17841,93 @@ "dev": true }, "to-fast-properties": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", - "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "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 + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "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, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "tough-cookie": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz", + "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==", + "requires": { + "psl": "^1.1.24", + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + } + } + }, + "transform-ast": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/transform-ast/-/transform-ast-2.4.4.tgz", + "integrity": "sha512-AxjeZAcIOUO2lev2GDe3/xZ1Q0cVGjIMk5IsriTy8zbWlsEnjeB025AhkhBJHoy997mXpLd4R+kRbvnnQVuQHQ==", + "requires": { + "acorn-node": "^1.3.0", + "convert-source-map": "^1.5.1", + "dash-ast": "^1.0.0", + "is-buffer": "^2.0.0", + "magic-string": "^0.23.2", + "merge-source-map": "1.0.4", + "nanobench": "^2.1.1" + } + }, "trim": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/trim/-/trim-0.0.1.tgz", @@ -12297,29 +17935,28 @@ "dev": true }, "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", - "dev": true - }, - "trim-right": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", - "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", "dev": true }, "trim-trailing-lines": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.0.tgz", - "integrity": "sha1-eu+7eAjfnWafbaLkOMrIxGradoQ=", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/trim-trailing-lines/-/trim-trailing-lines-1.1.3.tgz", + "integrity": "sha512-4ku0mmjXifQcTVfYDfR5lpgV7zVqPg6zV9rdZmwOPqq0+Zq19xDqEgagqVbc4pOOShbncuAOIs59R3+3gcF3ZA==", "dev": true }, "trough": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.1.tgz", - "integrity": "sha1-qf2LA5Swro//guBjOgo2zK1bX4Y=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/trough/-/trough-1.0.5.tgz", + "integrity": "sha512-rvuRbTarPXmMb79SmzEp8aqXNKcK+y0XaB298IXueQ8I2PsrATcPBCSPyK/dDNa2iWOhKlfNnOjdAOTBU/nkFA==", "dev": true }, + "tslib": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.11.1.tgz", + "integrity": "sha512-aZW88SY8kQbU7gpV19lN24LtXh/yD4ZZg6qieAJDDg+YBsJcSmLGK9QpnUjAKVG/xefmvJGd1WUmfpT/g6AJGA==" + }, "tty-browserify": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", @@ -12327,10 +17964,17 @@ "dev": true }, "tunnel-agent": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.3.0.tgz", - "integrity": "sha1-rWgbaPUyGtKCfEz7G31d8s/pQu4=", - "dev": true + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "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=" }, "type-check": { "version": "0.3.2", @@ -12338,7 +17982,7 @@ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", "dev": true, "requires": { - "prelude-ls": "1.1.2" + "prelude-ls": "~1.1.2" } }, "type-detect": { @@ -12347,163 +17991,142 @@ "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 + }, "type-is": { - "version": "1.6.15", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", - "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "requires": { "media-typer": "0.3.0", - "mime-types": "2.1.17" + "mime-types": "~2.1.24" } }, "typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", - "dev": true + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, - "uglify-js": { - "version": "3.3.9", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.3.9.tgz", - "integrity": "sha512-J2t8B5tj9JdPTW4+sNZXmiIWHzTvcoITkaqzTiilu/biZF/9crqf/Fi7k5hqbOmVRh9/hVNxAxBYIMF7N6SqMQ==", - "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==", "requires": { - "commander": "2.13.0", - "source-map": "0.6.1" - }, - "dependencies": { - "commander": { - "version": "2.13.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.13.0.tgz", - "integrity": "sha512-MVuS359B+YzaWqjCL/c+22gfryv+mCBPHAv3zyVI2GN8EY6IRP8VwtasXn8jyyhvvq84R4ImN1OKRtcbIasjYA==", - "dev": true - } + "is-typedarray": "^1.0.0" } }, - "uglify-to-browserify": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", - "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", - "dev": true, - "optional": true + "ua-parser-js": { + "version": "0.7.21", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.21.tgz", + "integrity": "sha512-+O8/qh/Qj8CgC6eYBVBykMrNtp5Gebn4dlGD/kKXVkJNDwyrAwSIqwz8CDf+tsAIWVycKcku6gIXJ0qwx/ZXaQ==" }, - "uglifyjs-webpack-plugin": { - "version": "0.4.6", - "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-0.4.6.tgz", - "integrity": "sha1-uVH0q7a9YX5m9j64kUmOORdj4wk=", + "uglify-js": { + "version": "3.4.10", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.10.tgz", + "integrity": "sha512-Y2VsbPVs0FIshJztycsO2SfPk7/KAF/T72qzv9u5EpQ4kB2hQoHlhNQTsNyy6ul7lQtqJN/AoWeS23OzEiEFxw==", "dev": true, "requires": { - "source-map": "0.5.7", - "uglify-js": "2.8.29", - "webpack-sources": "1.1.0" + "commander": "~2.19.0", + "source-map": "~0.6.1" }, "dependencies": { - "camelcase": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "commander": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz", + "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==", "dev": true }, - "cliui": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", - "dev": true, - "requires": { - "center-align": "0.1.3", - "right-align": "0.1.3", - "wordwrap": "0.0.2" - } - }, "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true - }, - "uglify-js": { - "version": "2.8.29", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", - "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", - "dev": true, - "requires": { - "source-map": "0.5.7", - "uglify-to-browserify": "1.0.2", - "yargs": "3.10.0" - } - }, - "wordwrap": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true - }, - "yargs": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", - "dev": true, - "requires": { - "camelcase": "1.2.1", - "cliui": "2.1.0", - "decamelize": "1.2.0", - "window-size": "0.1.0" - } } } }, "unassert": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.5.1.tgz", - "integrity": "sha1-y8iOw4dBfFpeTALTzQe+mL11/3Y=", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/unassert/-/unassert-1.6.0.tgz", + "integrity": "sha512-GoMtWTwGSxSFuRD0NKmbjlx3VJkgvSogzDzMPpJXYmBZv6MIWButsyMqEYhMx3NI4osXACcZA9mXiBteXyJtRw==", "dev": true, "requires": { - "acorn": "4.0.13", - "call-matcher": "1.0.1", - "deep-equal": "1.0.1", - "espurify": "1.7.0", - "estraverse": "4.2.0", - "esutils": "2.0.2", - "object-assign": "4.1.1" - }, - "dependencies": { - "acorn": { - "version": "4.0.13", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz", - "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c=", - "dev": true - } + "acorn": "^7.0.0", + "call-matcher": "^2.0.0", + "deep-equal": "^1.0.0", + "espurify": "^2.0.1", + "estraverse": "^4.1.0", + "esutils": "^2.0.2", + "object-assign": "^4.1.0" } }, - "underscore": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.4.4.tgz", - "integrity": "sha1-YaajIBBiKvoHljvzJSA88SI51gQ=", + "unherit": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.3.tgz", + "integrity": "sha512-Ft16BJcnapDKp0+J/rqFC3Rrk6Y/Ng4nzsC028k2jdDII/rdZ7Wd3pPT/6+vIIxRagwRc9K0IUX0Ra4fKvw+WQ==", + "dev": true, + "requires": { + "inherits": "^2.0.0", + "xtend": "^4.0.0" + } + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, - "unherit": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unherit/-/unherit-1.1.0.tgz", - "integrity": "sha1-a5qu379z3xdWrZ4xbdmBiFhAzX0=", + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { - "inherits": "2.0.3", - "xtend": "4.0.1" + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" } }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, "unified": { - "version": "6.1.6", - "resolved": "https://registry.npmjs.org/unified/-/unified-6.1.6.tgz", - "integrity": "sha512-pW2f82bCIo2ifuIGYcV12fL96kMMYgw7JKVEgh7ODlrM9rj6vXSY3BV+H6lCcv1ksxynFf582hwWLnA1qRFy4w==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/unified/-/unified-7.1.0.tgz", + "integrity": "sha512-lbk82UOIGuCEsZhPj8rNAkXSDXd6p0QLzIuSsCdxrqnqU56St4eyOB+AlXsVgVeRmetPTYydIuvFfpDIed8mqw==", + "dev": true, + "requires": { + "@types/unist": "^2.0.0", + "@types/vfile": "^3.0.0", + "bail": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^1.1.0", + "trough": "^1.0.0", + "vfile": "^3.0.0", + "x-is-string": "^0.1.0" + } + }, + "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, "requires": { - "bail": "1.0.2", - "extend": "3.0.1", - "is-plain-obj": "1.1.0", - "trough": "1.0.1", - "vfile": "2.3.0", - "x-is-function": "1.0.4", - "x-is-string": "0.1.0" + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" } }, "uniq": { @@ -12512,15 +18135,6 @@ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", "dev": true }, - "uniqid": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/uniqid/-/uniqid-4.1.1.tgz", - "integrity": "sha1-iSIN32t1GuUrX3JISGNShZa7hME=", - "dev": true, - "requires": { - "macaddress": "0.2.8" - } - }, "uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -12528,80 +18142,174 @@ "dev": true }, "unique-filename": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", - "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", "dev": true, "requires": { - "unique-slug": "2.0.0" + "unique-slug": "^2.0.0" } }, "unique-slug": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", - "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", "dev": true, "requires": { - "imurmurhash": "0.1.4" + "imurmurhash": "^0.1.4" + } + }, + "unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "requires": { + "crypto-random-string": "^2.0.0" } }, "unist-util-find-all-after": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.1.tgz", - "integrity": "sha1-TlUSq/734GFnga7Pex7XUcAK+Qg=", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/unist-util-find-all-after/-/unist-util-find-all-after-1.0.5.tgz", + "integrity": "sha512-lWgIc3rrTMTlK1Y0hEuL+k+ApzFk78h+lsaa2gHf63Gp5Ww+mt11huDniuaoq1H+XMK2lIIjjPkncxXcDp3QDw==", + "dev": true, + "requires": { + "unist-util-is": "^3.0.0" + } + }, + "unist-util-is": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-3.0.0.tgz", + "integrity": "sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==", + "dev": true + }, + "unist-util-remove-position": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.4.tgz", + "integrity": "sha512-tLqd653ArxJIPnKII6LMZwH+mb5q+n/GtXQZo6S6csPRs5zB0u79Yw8ouR3wTw8wxvdJFhpP6Y7jorWdCgLO0A==", + "dev": true, + "requires": { + "unist-util-visit": "^1.1.0" + } + }, + "unist-util-stringify-position": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-2.0.3.tgz", + "integrity": "sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==", "dev": true, "requires": { - "unist-util-is": "2.1.1" + "@types/unist": "^2.0.2" } }, - "unist-util-is": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-2.1.1.tgz", - "integrity": "sha1-DDEmKeP5YMZukx6BLT2A53AQlHs=", - "dev": true - }, - "unist-util-modify-children": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-modify-children/-/unist-util-modify-children-1.1.1.tgz", - "integrity": "sha1-ZtfmpEnm9nIguXarPLi166w55R0=", + "unist-util-visit": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.4.1.tgz", + "integrity": "sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==", "dev": true, "requires": { - "array-iterate": "1.1.1" + "unist-util-visit-parents": "^2.0.0" } }, - "unist-util-remove-position": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-remove-position/-/unist-util-remove-position-1.1.1.tgz", - "integrity": "sha1-WoXBVV/BugwQG4ZwfRXlD6TIcbs=", + "unist-util-visit-parents": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-2.1.2.tgz", + "integrity": "sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==", "dev": true, "requires": { - "unist-util-visit": "1.2.0" + "unist-util-is": "^3.0.0" } }, - "unist-util-stringify-position": { + "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 + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "unquote": { "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.1.tgz", - "integrity": "sha1-PMvcU2ee7W7PN3fdf14yKcG2qjw=", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", "dev": true }, - "unist-util-visit": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-1.2.0.tgz", - "integrity": "sha512-lI+jyPlDztHZ2CJhUchcRMQ7MNc0yASgYFxwRTxs0EZ+9HbYFBLVGDJ2FchTBy+pra0O1LVEn0Wkgf19mDVDzw==", + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", "dev": true, "requires": { - "unist-util-is": "2.1.1" + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } } }, - "unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true }, "upper-case": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", - "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "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==" + } + } + }, + "urijs": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/urijs/-/urijs-1.19.2.tgz", + "integrity": "sha512-s/UIq9ap4JPZ7H1EB5ULo/aOUbWqfDi7FKzMC2Nz+0Si8GiT1rIEaprt8hy3Vy2Ex2aJPpOQv4P4DuOZ+K1c6w==" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", "dev": true }, "url": { @@ -12614,41 +18322,45 @@ } }, "url-parse": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", - "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", "dev": true, "requires": { - "querystringify": "1.0.0", - "requires-port": "1.0.0" - }, - "dependencies": { - "querystringify": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", - "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", - "dev": true - } + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" } }, + "urlsafe-base64": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/urlsafe-base64/-/urlsafe-base64-1.0.0.tgz", + "integrity": "sha1-I/iQaabGL0bPOh07ABac77kL4MY=", + "dev": true + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, "utcstring": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/utcstring/-/utcstring-0.1.0.tgz", "integrity": "sha1-Qw/VEKt/yVtdWRDJAteYgMIIQ2s=" }, "util": { - "version": "0.10.3", - "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", - "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", "dev": true, "requires": { - "inherits": "2.0.1" + "inherits": "2.0.3" }, "dependencies": { "inherits": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", - "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", "dev": true } } @@ -12656,8 +18368,19 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", - "dev": true + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + } }, "utils-merge": { "version": "1.0.1", @@ -12665,43 +18388,52 @@ "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" }, "uuid": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", - "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==" + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.0.tgz", + "integrity": "sha512-fX6Z5o4m6XsXBdli9g7DtWgAx+osMsRRZFKma1mIUsLCz6vRvv+pz5VNbyu9UEDzpMWulZfvpgb/cmDXVulYFQ==" + }, + "v8-compile-cache": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", + "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", + "dev": true }, "val-loader": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-1.1.0.tgz", - "integrity": "sha512-8m62XF42FcfrBBl02rtDY9hQhDcDczrEcr60/aSMxlzJiXAcbAimRPvsDoDa5QcGAusOgOmVTpFtK5EbfZdDwA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/val-loader/-/val-loader-1.1.1.tgz", + "integrity": "sha512-JLqLXJWCVLXTxbUeHhLpWkgl3+X3U8Bl0vY7rTFZgFSbLJaEtAxuD2ixy/cM8w/gzC7sS3NE5IDSzClDt332sw==", "dev": true, "requires": { - "loader-utils": "1.1.0" + "loader-utils": "^1.0.0", + "schema-utils": "^0.4.5" + }, + "dependencies": { + "schema-utils": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz", + "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0" + } + } } }, "validate-npm-package-license": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", - "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { - "spdx-correct": "1.0.2", - "spdx-expression-parse": "1.0.4" + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" } }, "validator": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/validator/-/validator-7.2.0.tgz", - "integrity": "sha512-c8NGTUYeBEcUIGeMppmNVKHE7wwfm3mYbNZxV+c5mlv9fDHI7Ad3p07qfNrn/CvpdkK2k61fOLRO2sTEhgQXmg==" - }, - "varify": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/varify/-/varify-0.2.0.tgz", - "integrity": "sha1-GR2p/p3EzWjQ0USY1OKpEP9OZRY=", - "optional": true, - "requires": { - "redeyed": "1.0.1", - "through": "2.3.8" - } + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/validator/-/validator-11.1.0.tgz", + "integrity": "sha512-qiQ5ktdO7CD6C/5/mYV4jku/7qnqzjrxb3C/Q5wR3vGGinHTgJZN/TdFT3ZX4vXhX2R1PXx42fB1cn5W+uJ4lg==" }, "vary": { "version": "1.1.2", @@ -12709,223 +18441,482 @@ "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" }, "vendors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.1.tgz", - "integrity": "sha1-N61zyO5Bf7PVgOeFMSMH0nSEfyI=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz", + "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==", "dev": true }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, "vfile": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-2.3.0.tgz", - "integrity": "sha512-ASt4mBUHcTpMKD/l5Q+WJXNtshlWxOogYyGYYrg4lt/vuRjC1EFQtlAofL5VmtVNIZJzWYFJjzGWZ0Gw8pzW1w==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vfile/-/vfile-3.0.1.tgz", + "integrity": "sha512-y7Y3gH9BsUSdD4KzHsuMaCzRjglXN0W2EcMf0gpvu6+SbsGhMje7xDc8AEoeXy6mIwCKMI6BkjMsRjzQbhMEjQ==", "dev": true, "requires": { - "is-buffer": "1.1.6", + "is-buffer": "^2.0.0", "replace-ext": "1.0.0", - "unist-util-stringify-position": "1.1.1", - "vfile-message": "1.0.0" + "unist-util-stringify-position": "^1.0.0", + "vfile-message": "^1.0.0" + }, + "dependencies": { + "unist-util-stringify-position": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-1.1.2.tgz", + "integrity": "sha512-pNCVrk64LZv1kElr0N1wPiHEUoXNVFERp+mlTg/s9R5Lwg87f9bM/3sQB99w+N9D/qnM9ar3+AKDBwo/gm/iQQ==", + "dev": true + }, + "vfile-message": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.1.1.tgz", + "integrity": "sha512-1WmsopSGhWt5laNir+633LszXvZ+Z/lxveBf6yhGsqnQIhlhzooZae7zV6YVM1Sdkw68dtAW3ow0pOdPANugvA==", + "dev": true, + "requires": { + "unist-util-stringify-position": "^1.1.1" + } + } } }, "vfile-location": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.2.tgz", - "integrity": "sha1-02dcWch3SY5JK0dW/2Xkrxp1IlU=", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/vfile-location/-/vfile-location-2.0.6.tgz", + "integrity": "sha512-sSFdyCP3G6Ka0CEmN83A2YCMKIieHx0EDaj5IDP4g1pa5ZJ4FJDvpO0WODLxo4LUX4oe52gmSCK7Jw4SBghqxA==", "dev": true }, "vfile-message": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-1.0.0.tgz", - "integrity": "sha512-HPREhzTOB/sNDc9/Mxf8w0FmHnThg5CRSJdR9VRFkD2riqYWs+fuXlj5z8mIpv2LrD7uU41+oPWFOL4Mjlf+dw==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-2.0.4.tgz", + "integrity": "sha512-DjssxRGkMvifUOJre00juHoP9DPWuzjxKuMDrhNbk2TdaYYBNMStsNhEOt3idrtI12VQYM/1+iM0KOzXi4pxwQ==", "dev": true, "requires": { - "unist-util-stringify-position": "1.1.1" + "@types/unist": "^2.0.0", + "unist-util-stringify-position": "^2.0.0" } }, "vm-browserify": { - "version": "0.0.4", - "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz", - "integrity": "sha1-XX6kW7755Kb/ZflUOOCofDV9WnM=", - "dev": true, - "requires": { - "indexof": "0.0.1" - } + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true }, "watchpack": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.4.0.tgz", - "integrity": "sha1-ShRyvLuVK9Cpu0A2gB+VTfs5+qw=", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.1.tgz", + "integrity": "sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==", "dev": true, "requires": { - "async": "2.6.0", - "chokidar": "1.7.0", - "graceful-fs": "4.1.11" - }, - "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.4" - } - } + "chokidar": "^2.1.8", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0" } }, "wayfarer": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/wayfarer/-/wayfarer-6.6.3.tgz", - "integrity": "sha512-DiScqFrKfETMeJ0OTmSv9Cncw/Yq3+pSs2+AlqLvgINpLlbnyts8dvFEdX3ggHdpt1nmQ7YE26mfpHXBowo0yQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/wayfarer/-/wayfarer-7.0.1.tgz", + "integrity": "sha512-yf+kAlOYnJRjLxflLy+1+xEclb6222EAVvAjSY+Yz2qAIDrXeN5wLl/G302Mwv3E0KMg1HT/WDGsvSymX0U7Rw==", "requires": { - "xtend": "4.0.1" + "nanoassert": "^1.1.0" } }, "wbuf": { - "version": "1.7.2", - "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.2.tgz", - "integrity": "sha1-1pe5nx9ZUS3ydRvkJ2nBWAtYAf4=", + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webcrypto-core": { + "version": "github:dannycoates/webcrypto-core#8e0152a66d3ae6329cf080ccb3085eb06637070f", + "from": "github:dannycoates/webcrypto-core", "dev": true, "requires": { - "minimalistic-assert": "1.0.0" + "tslib": "^1.7.1" } }, "webpack": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-3.10.0.tgz", - "integrity": "sha512-fxxKXoicjdXNUMY7LIdY89tkJJJ0m1Oo8PQutZ5rLgWbV5QVKI15Cn7+/IHnRTd3vfKfiwBx6SBqlorAuNA8LA==", - "dev": true, - "requires": { - "acorn": "5.2.1", - "acorn-dynamic-import": "2.0.2", - "ajv": "5.5.0", - "ajv-keywords": "2.1.1", - "async": "2.6.0", - "enhanced-resolve": "3.4.1", - "escope": "3.6.0", - "interpret": "1.1.0", - "json-loader": "0.5.7", - "json5": "0.5.1", - "loader-runner": "2.3.0", - "loader-utils": "1.1.0", - "memory-fs": "0.4.1", - "mkdirp": "0.5.1", - "node-libs-browser": "2.1.0", - "source-map": "0.5.7", - "supports-color": "4.5.0", - "tapable": "0.2.8", - "uglifyjs-webpack-plugin": "0.4.6", - "watchpack": "1.4.0", - "webpack-sources": "1.1.0", - "yargs": "8.0.2" - }, - "dependencies": { - "async": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.0.tgz", - "integrity": "sha512-xAfGg1/NTLBBKlHFmnd7PlmUW9KhVQIUuSrYem9xzFUZy13ScvtyGGejaae9iAVRiRq9+Cx7DPFaAAhCpyxyPw==", - "dev": true, - "requires": { - "lodash": "4.17.4" + "version": "4.38.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.38.0.tgz", + "integrity": "sha512-lbuFsVOq8PZY+1Ytz/mYOvYOo+d4IJ31hHk/7iyoeWtwN33V+5HYotSH+UIb9tq914ey0Hot7z6HugD+je3sWw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.0", + "ajv": "^6.1.0", + "ajv-keywords": "^3.1.0", + "chrome-trace-event": "^1.0.0", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.0", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.3.0", + "loader-utils": "^1.1.0", + "memory-fs": "~0.4.1", + "micromatch": "^3.1.8", + "mkdirp": "~0.5.0", + "neo-async": "^2.5.0", + "node-libs-browser": "^2.0.0", + "schema-utils": "^1.0.0", + "tapable": "^1.1.0", + "terser-webpack-plugin": "^1.1.0", + "watchpack": "^1.5.0", + "webpack-sources": "^1.3.0" + }, + "dependencies": { + "acorn": { + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } } }, - "source-map": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "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 }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", + "dev": true, + "requires": { + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", "dev": true, "requires": { - "has-flag": "2.0.0" + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" } } } }, - "webpack-dev-middleware": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz", - "integrity": "sha512-FCrqPy1yy/sN6U/SaEZcHKRXGlqU0DUaEBL45jkUYoB8foVb6wCnbIJ1HKIx+qUFTW+3JpVcCJCxZ8VATL4e+A==", + "webpack-cli": { + "version": "3.3.12", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.3.12.tgz", + "integrity": "sha512-NVWBaz9k839ZH/sinurM+HcDvJOTXwSjYp1ku+5XKeOC03z8v5QitnK/x+lAxGXFyhdayoIf/GOpv85z3/xPag==", "dev": true, "requires": { - "memory-fs": "0.4.1", - "mime": "1.6.0", - "path-is-absolute": "1.0.1", - "range-parser": "1.2.0", - "time-stamp": "2.0.0" + "chalk": "^2.4.2", + "cross-spawn": "^6.0.5", + "enhanced-resolve": "^4.1.1", + "findup-sync": "^3.0.0", + "global-modules": "^2.0.0", + "import-local": "^2.0.0", + "interpret": "^1.4.0", + "loader-utils": "^1.4.0", + "supports-color": "^6.1.0", + "v8-compile-cache": "^2.1.1", + "yargs": "^13.3.2" }, "dependencies": { - "mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "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" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "interpret": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", + "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==", + "dev": true + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "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" + } + }, + "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 + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } } } }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + } + }, "webpack-dev-server": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-2.9.1.tgz", - "integrity": "sha512-qFKs4Wg6JI6FkAQ6WFqeDCCxXEBLsDHkqJB3f9tmlqx8C68Y9vQWwcaMT4Q9H8WF32Q6QUNmgK4qQkdHfXvj/g==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", - "array-includes": "3.0.3", - "bonjour": "3.5.0", - "chokidar": "1.7.0", - "compression": "1.7.1", - "connect-history-api-fallback": "1.5.0", - "del": "3.0.0", - "express": "4.16.2", - "html-entities": "1.2.1", - "http-proxy-middleware": "0.17.4", - "internal-ip": "1.2.0", - "ip": "1.1.5", - "loglevel": "1.6.0", - "opn": "5.1.0", - "portfinder": "1.0.13", - "selfsigned": "1.10.1", - "serve-index": "1.9.1", - "sockjs": "0.3.18", - "sockjs-client": "1.1.4", - "spdy": "3.4.7", - "strip-ansi": "3.0.1", - "supports-color": "4.5.0", - "webpack-dev-middleware": "1.12.2", - "yargs": "6.6.0" + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" }, "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha1-MvxLn82vhF/N9+c7uXysImHwqwo=", - "dev": true - }, "del": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-3.0.0.tgz", - "integrity": "sha1-U+z2mf/LyzljdpGrE7rxYIGXZuU=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", "dev": true, "requires": { - "globby": "6.1.0", - "is-path-cwd": "1.0.0", - "is-path-in-cwd": "1.0.0", - "p-map": "1.2.0", - "pify": "3.0.0", - "rimraf": "2.6.2" + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" } }, "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { - "path-exists": "2.1.0", - "pinkie-promise": "2.0.1" + "locate-path": "^3.0.0" } }, "globby": { @@ -12934,11 +18925,11 @@ "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", "dev": true, "requires": { - "array-union": "1.0.2", - "glob": "7.1.2", - "object-assign": "4.1.1", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" }, "dependencies": { "pify": { @@ -12949,179 +18940,180 @@ } } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "1.0.1" - } + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "parse-json": "2.2.0", - "pify": "2.3.0", - "pinkie-promise": "2.0.1", - "strip-bom": "2.0.0" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" } }, - "os-locale": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", - "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { - "lcid": "1.0.0" + "p-limit": "^2.0.0" } }, - "path-exists": { + "p-map": { "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "dev": true, - "requires": { - "pinkie-promise": "2.0.1" - } + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", "dev": true, "requires": { - "graceful-fs": "4.1.11", - "pify": "2.3.0", - "pinkie-promise": "2.0.1" - }, - "dependencies": { - "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", - "dev": true - } + "glob": "^7.1.3" } }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "schema-utils": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz", + "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==", "dev": true, "requires": { - "load-json-file": "1.1.0", - "normalize-package-data": "2.4.0", - "path-type": "1.1.0" + "ajv": "^6.1.0", + "ajv-errors": "^1.0.0", + "ajv-keywords": "^3.1.0" } }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "dev": true, - "requires": { - "find-up": "1.1.2", - "read-pkg": "1.1.0" - } + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "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": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "has-flag": "^3.0.0" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", "dev": true, "requires": { - "is-utf8": "0.2.1" + "punycode": "1.3.2", + "querystring": "0.2.0" } }, - "supports-color": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.5.0.tgz", - "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", "dev": true, "requires": { - "has-flag": "2.0.0" + "async-limiter": "~1.0.0" } }, - "which-module": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz", - "integrity": "sha1-u6Y8qGGUiZT/MHc2CJ47lgJsKk8=", - "dev": true - }, "yargs": { - "version": "6.6.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz", - "integrity": "sha1-eC7CHvQDNF+DCoCMo9UTr1YGUgg=", - "dev": true, - "requires": { - "camelcase": "3.0.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "1.4.0", - "read-pkg-up": "1.0.1", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "1.0.2", - "which-module": "1.0.0", - "y18n": "3.2.1", - "yargs-parser": "4.2.1" + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } }, "yargs-parser": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz", - "integrity": "sha1-KczqwNxPA8bIe0qfIX3RjJ90hxw=", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { - "camelcase": "3.0.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + }, + "dependencies": { + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + } + } + }, "webpack-manifest-plugin": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-1.3.2.tgz", - "integrity": "sha512-MX60Bv2G83Zks9pi3oLOmRgnPAnwrlMn+lftMrWBm199VQjk46/xgzBi9lPfpZldw2+EI2S+OevuLIaDuxCWRw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-2.2.0.tgz", + "integrity": "sha512-9S6YyKKKh/Oz/eryM1RyLVDVmy3NSPV0JXMRhZ18fJsq+AwGxUY34X54VNwkzYcEmEkDwNxuEOboCZEebJXBAQ==", "dev": true, "requires": { - "fs-extra": "0.30.0", - "lodash": "4.17.4" + "fs-extra": "^7.0.0", + "lodash": ">=3.5 <5", + "object.entries": "^1.1.0", + "tapable": "^1.0.0" + }, + "dependencies": { + "fs-extra": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", + "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + } } }, "webpack-sources": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.1.0.tgz", - "integrity": "sha512-aqYp18kPphgoO5c/+NaUvEeACtZjMESmDChuD3NBciVpah3XpMEU9VAAtIaB1BsfJWWTSdv8Vv1m3T0aRk2dUw==", + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", "dev": true, "requires": { - "source-list-map": "2.0.0", - "source-map": "0.6.1" + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "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 + } } }, "webpack-unassert-loader": { @@ -13130,49 +19122,33 @@ "integrity": "sha1-GE/d6xb5Yno9TGGHylMZ6WIOn/Y=", "dev": true, "requires": { - "escodegen": "1.9.0", - "esprima": "4.0.0", - "estraverse": "4.2.0", - "unassert": "1.5.1" - }, - "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", - "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", - "dev": true - } + "escodegen": "^1.6.1", + "esprima": "^4.0.0", + "estraverse": "^4.0.0", + "unassert": "^1.5.0" } }, "websocket-driver": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.0.tgz", - "integrity": "sha1-DK+dLXVdk67gSdS90NP+LMoqJOs=", + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", "dev": true, "requires": { - "http-parser-js": "0.4.9", - "websocket-extensions": "0.1.3" + "websocket-extensions": ">=0.1.1" } }, "websocket-extensions": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz", - "integrity": "sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==", - "dev": true - }, - "whet.extend": { - "version": "0.9.9", - "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz", - "integrity": "sha1-+HfVv2SMl+WqVC+twW1qJZucEaE=", + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", - "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", - "dev": true, + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "requires": { - "isexe": "2.0.0" + "isexe": "^2.0.0" } }, "which-module": { @@ -13181,46 +19157,90 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "window-size": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", - "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", - "dev": true + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } }, - "wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "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 }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", "dev": true, "requires": { - "string-width": "1.0.2", - "strip-ansi": "3.0.1" + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" }, "dependencies": { - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "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 + }, + "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": { - "number-is-nan": "1.0.1" + "color-convert": "^1.9.0" } }, - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "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": { - "code-point-at": "1.1.0", - "is-fullwidth-code-point": "1.0.0", - "strip-ansi": "3.0.1" + "ansi-regex": "^4.1.0" } } } @@ -13228,23 +19248,32 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "write": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", - "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "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" + "mkdirp": "^0.5.1" } }, - "x-is-function": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/x-is-function/-/x-is-function-1.0.4.tgz", - "integrity": "sha1-XSlNw9Joy90GJYDgxd93o5HR+h4=", - "dev": true + "write-file-atomic": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.3.tgz", + "integrity": "sha512-GaETH5wwsX+GcnzhPgKcKjJ6M2Cq3/iZp1WyY/X1CSqrW+jVNM9Y7D8EC2sM4ZG/V8wZlSniJnCKWPmBYAucRQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "imurmurhash": "^0.1.4", + "signal-exit": "^3.0.2" + } + }, + "ws": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.5.tgz", + "integrity": "sha512-C34cIU4+DB2vMyAbmEKossWq2ZQDr6QEyuuCzWrM9zfw1sGc0mYiJ0UnG9zzNykt49C2Fi34hvr2vssFQRS6EA==" }, "x-is-string": { "version": "0.1.0", @@ -13253,90 +19282,190 @@ "dev": true }, "x-xss-protection": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.0.0.tgz", - "integrity": "sha1-iYr7k4abJGYc+cUvnujbjtB2Tdk=" + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/x-xss-protection/-/x-xss-protection-1.3.0.tgz", + "integrity": "sha512-kpyBI9TlVipZO4diReZMAHWtS0MMa/7Kgx8hwG/EuZLiA6sg4Ah/4TRdASHhRRN3boobzcYgFRUFSgHRge6Qhg==" }, - "xml-char-classes": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/xml-char-classes/-/xml-char-classes-1.0.0.tgz", - "integrity": "sha1-ZGV4SKIP/F31g6Qq2KJ3tFErvE0=", - "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==" }, "xml2js": { - "version": "0.4.17", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.17.tgz", - "integrity": "sha1-F76T6q4/O3eTWceVtBlwWogX6Gg=", + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.19.tgz", + "integrity": "sha512-esZnJZJOiJR9wWKMyuvSE1y6Dq5LCuJanqhxslH2bxM6duahNZ+HMpCLhBQGZkbX6xRf8x1Y2eJlgt2q3qo49Q==", "requires": { - "sax": "1.2.1", - "xmlbuilder": "4.2.1" + "sax": ">=0.6.0", + "xmlbuilder": "~9.0.1" } }, "xmlbuilder": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-4.2.1.tgz", - "integrity": "sha1-qlijBBoGb5DqoWwvU4n/GfP0YaU=", - "requires": { - "lodash": "4.17.4" - } + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-9.0.7.tgz", + "integrity": "sha1-Ey7mPS7FVlxVfiD0wi35rKaGsQ0=" }, "xtend": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", - "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "y18n": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", - "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "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 }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "yargs": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", - "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", - "dev": true, - "requires": { - "camelcase": "4.1.0", - "cliui": "3.2.0", - "decamelize": "1.2.0", - "get-caller-file": "1.0.2", - "os-locale": "2.1.0", - "read-pkg-up": "2.0.0", - "require-directory": "2.1.1", - "require-main-filename": "1.0.1", - "set-blocking": "2.0.0", - "string-width": "2.1.1", - "which-module": "2.0.0", - "y18n": "3.2.1", - "yargs-parser": "7.0.0" + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz", + "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^15.0.1" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "yargs-parser": { + "version": "15.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz", + "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } }, "yargs-parser": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", - "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", + "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "requires": { - "camelcase": "4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } }, - "yo-yoify": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/yo-yoify/-/yo-yoify-4.2.0.tgz", - "integrity": "sha512-ZgmFaE1nKw0ZIXu9Ag82A0mjFJtSDCp/qpxI2PSZTlePr+eAa0N5/5qWFwZFCw1t0MMv/RrGm/V751K2gq/MNQ==", + "yargs-unparser": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.6.0.tgz", + "integrity": "sha512-W9tKgmSn0DpSatfri0nx52Joq5hVXgeLiqR/5G0sZNDoLZFOr/xjBUDcShCOGNsBnEMNo1KAMBkTej1Hm62HTw==", "dev": true, "requires": { - "acorn": "5.2.1", - "falafel": "2.1.0", - "hyperx": "2.3.2", - "on-load": "3.3.4", - "through2": "2.0.3" + "flat": "^4.1.0", + "lodash": "^4.17.15", + "yargs": "^13.3.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "dev": true, + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.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": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" } } } diff --git a/package.json b/package.json index 50fecee58..135a042c8 100644 --- a/package.json +++ b/package.json @@ -1,18 +1,17 @@ { "name": "firefox-send", "description": "File Sharing Experiment", - "version": "2.3.1", + "version": "3.0.22", "author": "Mozilla (https://mozilla.org)", "repository": "mozilla/send", "homepage": "https://github.com/mozilla/send/", "license": "MPL-2.0", "private": true, "scripts": { - "precommit": "lint-staged", "clean": "rimraf dist", - "build": "npm run clean && webpack -p", + "build": "npm run clean && webpack", "lint": "npm-run-all lint:*", - "lint:css": "stylelint 'assets/*.css'", + "lint:css": "stylelint app/*.css app/**/*.css", "lint:js": "eslint .", "lint-locales": "node scripts/lint-locales", "lint-locales:dev": "npm run lint-locales", @@ -20,12 +19,25 @@ "format": "prettier '**/*.js' 'assets/*.css' --single-quote --write", "get-prod-locales": "node scripts/get-prod-locales", "get-prod-locales:write": "npm run get-prod-locales -- --write", - "changelog": "github-changes -o mozilla -r send --only-pulls --use-commit-body --no-merges", "contributors": "git shortlog -s | awk -F\\t '{print $2}' > CONTRIBUTORS", "release": "npm-run-all contributors changelog", - "test": "mocha test/unit", - "start": "cross-env NODE_ENV=development webpack-dev-server", - "prod": "node server/prod.js" + "test": "npm-run-all test:*", + "test:backend": "nyc --reporter=lcovonly mocha --reporter=min test/backend", + "test:frontend": "cross-env NODE_ENV=development FXA_REQUIRED=false node test/frontend/runner.js", + "test:report": "nyc report --reporter=html", + "test-integration": "cross-env NODE_ENV=development wdio test/wdio.docker.conf.js", + "circleci-test-integration": "echo 'webdriverio tests need to be updated to node 12'", + "start": "npm run clean && cross-env NODE_ENV=development L10N_DEV=true FXA_CLIENT_ID=fced6b5e3f4c66b9 BASE_URL=http://localhost:1337 webpack-dev-server --port=1337 --mode=development", + "android": "cross-env ANDROID=1 npm start", + "prod": "node server/bin/prod.js" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged", + "pre-push": "npm test", + "post-merge": "npm install", + "post-checkout": "scripts/sync-npm-dependencies.sh" + } }, "lint-staged": { "*.js": [ @@ -39,119 +51,176 @@ "git add" ] }, + "nyc": { + "reporter": [ + "text" + ], + "cache": true + }, "engines": { - "node": ">=8.2.0" + "node": "^12.16.3" }, "devDependencies": { - "autoprefixer": "^7.2.5", - "babel-core": "^6.26.0", - "babel-loader": "^7.1.2", - "babel-plugin-yo-yoify": "^1.0.2", - "babel-polyfill": "^6.26.0", - "babel-preset-env": "^1.6.1", - "babel-preset-es2015": "^6.24.1", - "babel-preset-stage-2": "^6.24.1", - "base64-js": "^1.2.1", - "copy-webpack-plugin": "^4.3.1", - "cross-env": "^5.1.3", - "css-loader": "^0.28.9", - "css-mqpacker": "^6.0.2", - "cssnano": "^3.10.0", - "eslint": "^4.17.0", - "eslint-plugin-mocha": "^4.11.0", - "eslint-plugin-node": "^5.2.1", + "@babel/core": "^7.10.5", + "@babel/plugin-proposal-class-properties": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.2.0", + "@babel/preset-env": "^7.10.4", + "@dannycoates/webcrypto-liner": "^0.1.37", + "@fullhuman/postcss-purgecss": "^1.3.0", + "@mattiasbuelens/web-streams-polyfill": "0.2.1", + "@sentry/browser": "^5.20.1", + "asmcrypto.js": "^0.22.0", + "babel-loader": "^8.0.6", + "babel-plugin-istanbul": "^5.2.0", + "base64-js": "^1.3.1", + "content-disposition": "^0.5.3", + "copy-webpack-plugin": "^5.0.5", + "core-js": "^3.4.0", + "cross-env": "^6.0.3", + "css-loader": "^3.2.0", + "css-mqpacker": "^7.0.0", + "cssnano": "^4.1.10", + "eslint": "^6.6.0", + "eslint-config-prettier": "^6.5.0", + "eslint-plugin-mocha": "^6.2.1", + "eslint-plugin-node": "^10.0.0", "eslint-plugin-security": "^1.4.0", - "expose-loader": "^0.7.4", - "extract-loader": "^1.0.2", - "file-loader": "^1.1.6", - "fluent-intl-polyfill": "^0.1.0", - "git-rev-sync": "^1.9.1", - "github-changes": "^1.1.2", + "expose-loader": "^0.7.5", + "extract-loader": "^3.1.0", + "extract-text-webpack-plugin": "^4.0.0-beta.0", + "fast-text-encoding": "^1.0.3", + "file-loader": "^4.2.0", + "git-rev-sync": "^1.12.0", "html-loader": "^0.5.5", - "husky": "^0.14.3", - "lint-staged": "^4.3.0", - "mocha": "^5.0.0", - "nanobus": "^4.3.2", - "npm-run-all": "^4.1.2", - "postcss-loader": "^2.1.0", - "prettier": "^1.10.2", - "proxyquire": "^1.8.0", - "raven-js": "^3.22.1", - "redis-mock": "^0.20.0", - "require-from-string": "^2.0.1", - "rimraf": "^2.6.2", - "selenium-webdriver": "^3.6.0", - "sinon": "^4.2.2", + "http_ece": "^1.1.0", + "husky": "^3.0.9", + "intl-pluralrules": "^1.1.1", + "lint-staged": "^9.4.2", + "mocha": "^6.2.2", + "morgan": "^1.9.1", + "nanobus": "^4.4.0", + "nanohtml": "^1.9.0", + "nanotiming": "^7.3.1", + "npm-run-all": "^4.1.5", + "nyc": "^14.1.1", + "postcss-loader": "^3.0.0", + "postcss-preset-env": "^6.7.0", + "prettier": "^1.19.1", + "proxyquire": "^2.1.3", + "puppeteer": "^2.0.0", + "raw-loader": "^3.1.0", + "redis-mock": "^0.47.0", + "rimraf": "^3.0.0", + "script-loader": "^0.7.2", + "sinon": "^7.5.0", "string-hash": "^1.1.3", - "stylelint-config-standard": "^17.0.0", - "stylelint-no-unsupported-browser-features": "^1.0.1", - "supertest": "^3.0.0", - "testpilot-ga": "^0.3.0", - "val-loader": "^1.1.0", - "webpack": "^3.10.0", - "webpack-dev-server": "2.9.1", - "webpack-manifest-plugin": "^1.3.2", + "stylelint": "^11.1.1", + "stylelint-config-standard": "^19.0.0", + "stylelint-no-unsupported-browser-features": "^3.0.2", + "svgo": "^1.3.2", + "svgo-loader": "^2.2.1", + "tailwindcss": "^1.1.3", + "val-loader": "^1.1.1", + "webpack": "4.38.0", + "webpack-cli": "^3.3.12", + "webpack-dev-middleware": "^3.7.2", + "webpack-dev-server": "^3.11.0", + "webpack-manifest-plugin": "^2.2.0", "webpack-unassert-loader": "^1.2.0" }, "dependencies": { - "aws-sdk": "^2.189.0", - "body-parser": "^1.18.2", - "choo": "^6.7.0", - "cldr-core": "^32.0.0", - "connect-busboy": "0.0.2", - "convict": "^4.0.1", - "express": "^4.16.2", - "fluent": "^0.4.1", - "fluent-langneg": "^0.1.0", - "helmet": "^3.10.0", + "@dannycoates/express-ws": "^5.0.3", + "@fluent/bundle": "^0.13.0", + "@fluent/langneg": "^0.3.0", + "@google-cloud/storage": "^5.1.2", + "@peculiar/webcrypto": "^1.1.1", + "@sentry/node": "^5.20.1", + "aws-sdk": "^2.568.0", + "body-parser": "^1.19.0", + "choo": "^7.0.0", + "cldr-core": "^35.1.0", + "configstore": "github:dannycoates/configstore#master", + "convict": "^5.2.0", + "express": "^4.17.1", + "helmet": "^3.23.3", "mkdirp": "^0.5.1", "mozlog": "^2.2.0", - "raven": "^2.4.0", - "redis": "^2.8.0" + "node-fetch": "^2.6.0", + "redis": "^3.0.2", + "selenium-standalone": "^6.15.6", + "ua-parser-js": "^0.7.21" }, "availableLanguages": [ "en-US", + "an", + "ar", "ast", - "az", - "bs", + "azz", + "be", + "bn", + "br", "ca", "cak", "cs", "cy", + "da", "de", "dsb", "el", + "en-CA", + "en-GB", "es-AR", "es-CL", "es-ES", "es-MX", "et", + "eu", "fa", + "fi", "fr", "fy-NL", + "gn", + "he", + "hr", "hsb", "hu", + "hus", + "hy-AM", + "ia", "id", "it", "ja", "ka", "kab", "ko", - "ms", + "lt", + "meh", + "mix", + "ml", "nb-NO", "nl", "nn-NO", + "oc", + "pa-IN", + "pl", + "ppl", "pt-BR", "pt-PT", + "quc", + "ro", "ru", "sk", "sl", + "sq", "sr", + "su", "sv-SE", - "tl", + "te", + "th", "tr", "uk", "vi", + "zgh", "zh-CN", "zh-TW" ] diff --git a/postcss.config.js b/postcss.config.js index 861256848..bef8b68fe 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,15 +1,40 @@ -const autoprefixer = require('autoprefixer'); -const cssnano = require('cssnano'); -const mqpacker = require('css-mqpacker'); - -const config = require('./server/config'); +class TailwindExtractor { + static extract(content) { + return content.match(/[A-Za-z0-9-_:/]+/g) || []; + } +} const options = { - plugins: [autoprefixer, mqpacker, cssnano] + plugins: [ + require('tailwindcss')('./tailwind.config.js'), + require('postcss-preset-env') + ] }; -if (config.env === 'development') { +if (process.env.NODE_ENV === 'development') { options.map = { inline: true }; +} else { + options.plugins.push( + require('@fullhuman/postcss-purgecss')({ + content: [ + './app/*.js', + './app/ui/*.js', + './android/*.js', + './android/pages/*.js' + ], + extractors: [ + { + extractor: TailwindExtractor, + extensions: ['js'] + } + ] + }) + ); + options.plugins.push( + require('cssnano')({ + preset: 'default' + }) + ); } module.exports = options; diff --git a/public/Inter-Black.woff b/public/Inter-Black.woff new file mode 100644 index 000000000..b2c4e27c5 Binary files /dev/null and b/public/Inter-Black.woff differ diff --git a/public/Inter-Black.woff2 b/public/Inter-Black.woff2 new file mode 100644 index 000000000..5e7bd9f14 Binary files /dev/null and b/public/Inter-Black.woff2 differ diff --git a/public/Inter-BlackItalic.woff b/public/Inter-BlackItalic.woff new file mode 100644 index 000000000..ff10955ec Binary files /dev/null and b/public/Inter-BlackItalic.woff differ diff --git a/public/Inter-BlackItalic.woff2 b/public/Inter-BlackItalic.woff2 new file mode 100644 index 000000000..97f3c0b3c Binary files /dev/null and b/public/Inter-BlackItalic.woff2 differ diff --git a/public/Inter-Bold.woff b/public/Inter-Bold.woff new file mode 100644 index 000000000..43dfb67fe Binary files /dev/null and b/public/Inter-Bold.woff differ diff --git a/public/Inter-Bold.woff2 b/public/Inter-Bold.woff2 new file mode 100644 index 000000000..b26180b16 Binary files /dev/null and b/public/Inter-Bold.woff2 differ diff --git a/public/Inter-BoldItalic.woff b/public/Inter-BoldItalic.woff new file mode 100644 index 000000000..0aa33d061 Binary files /dev/null and b/public/Inter-BoldItalic.woff differ diff --git a/public/Inter-BoldItalic.woff2 b/public/Inter-BoldItalic.woff2 new file mode 100644 index 000000000..07ad99d9d Binary files /dev/null and b/public/Inter-BoldItalic.woff2 differ diff --git a/public/Inter-ExtraBold.woff b/public/Inter-ExtraBold.woff new file mode 100644 index 000000000..a814de5c1 Binary files /dev/null and b/public/Inter-ExtraBold.woff differ diff --git a/public/Inter-ExtraBold.woff2 b/public/Inter-ExtraBold.woff2 new file mode 100644 index 000000000..fc1e3e2ab Binary files /dev/null and b/public/Inter-ExtraBold.woff2 differ diff --git a/public/Inter-ExtraBoldItalic.woff b/public/Inter-ExtraBoldItalic.woff new file mode 100644 index 000000000..6eaf0b237 Binary files /dev/null and b/public/Inter-ExtraBoldItalic.woff differ diff --git a/public/Inter-ExtraBoldItalic.woff2 b/public/Inter-ExtraBoldItalic.woff2 new file mode 100644 index 000000000..79a245281 Binary files /dev/null and b/public/Inter-ExtraBoldItalic.woff2 differ diff --git a/public/Inter-ExtraLight.woff b/public/Inter-ExtraLight.woff new file mode 100644 index 000000000..131a66fc7 Binary files /dev/null and b/public/Inter-ExtraLight.woff differ diff --git a/public/Inter-ExtraLight.woff2 b/public/Inter-ExtraLight.woff2 new file mode 100644 index 000000000..e080a70ea Binary files /dev/null and b/public/Inter-ExtraLight.woff2 differ diff --git a/public/Inter-ExtraLightItalic.woff b/public/Inter-ExtraLightItalic.woff new file mode 100644 index 000000000..257b53a11 Binary files /dev/null and b/public/Inter-ExtraLightItalic.woff differ diff --git a/public/Inter-ExtraLightItalic.woff2 b/public/Inter-ExtraLightItalic.woff2 new file mode 100644 index 000000000..0ccb9b64b Binary files /dev/null and b/public/Inter-ExtraLightItalic.woff2 differ diff --git a/public/Inter-Italic.woff b/public/Inter-Italic.woff new file mode 100644 index 000000000..7e07d71ef Binary files /dev/null and b/public/Inter-Italic.woff differ diff --git a/public/Inter-Italic.woff2 b/public/Inter-Italic.woff2 new file mode 100644 index 000000000..435fe822f Binary files /dev/null and b/public/Inter-Italic.woff2 differ diff --git a/public/Inter-Light.woff b/public/Inter-Light.woff new file mode 100644 index 000000000..0b46abc09 Binary files /dev/null and b/public/Inter-Light.woff differ diff --git a/public/Inter-Light.woff2 b/public/Inter-Light.woff2 new file mode 100644 index 000000000..c5fcddd38 Binary files /dev/null and b/public/Inter-Light.woff2 differ diff --git a/public/Inter-LightItalic.woff b/public/Inter-LightItalic.woff new file mode 100644 index 000000000..d1101cfe9 Binary files /dev/null and b/public/Inter-LightItalic.woff differ diff --git a/public/Inter-LightItalic.woff2 b/public/Inter-LightItalic.woff2 new file mode 100644 index 000000000..fafad9a52 Binary files /dev/null and b/public/Inter-LightItalic.woff2 differ diff --git a/public/Inter-Medium.woff b/public/Inter-Medium.woff new file mode 100644 index 000000000..15079dcff Binary files /dev/null and b/public/Inter-Medium.woff differ diff --git a/public/Inter-Medium.woff2 b/public/Inter-Medium.woff2 new file mode 100644 index 000000000..7d0fbe9ed Binary files /dev/null and b/public/Inter-Medium.woff2 differ diff --git a/public/Inter-MediumItalic.woff b/public/Inter-MediumItalic.woff new file mode 100644 index 000000000..7d8c12227 Binary files /dev/null and b/public/Inter-MediumItalic.woff differ diff --git a/public/Inter-MediumItalic.woff2 b/public/Inter-MediumItalic.woff2 new file mode 100644 index 000000000..fa86742cb Binary files /dev/null and b/public/Inter-MediumItalic.woff2 differ diff --git a/public/Inter-Regular.woff b/public/Inter-Regular.woff new file mode 100644 index 000000000..e8587fd87 Binary files /dev/null and b/public/Inter-Regular.woff differ diff --git a/public/Inter-Regular.woff2 b/public/Inter-Regular.woff2 new file mode 100644 index 000000000..46568fdcd Binary files /dev/null and b/public/Inter-Regular.woff2 differ diff --git a/public/Inter-SemiBold.woff b/public/Inter-SemiBold.woff new file mode 100644 index 000000000..de40b73e8 Binary files /dev/null and b/public/Inter-SemiBold.woff differ diff --git a/public/Inter-SemiBold.woff2 b/public/Inter-SemiBold.woff2 new file mode 100644 index 000000000..6bb8bee18 Binary files /dev/null and b/public/Inter-SemiBold.woff2 differ diff --git a/public/Inter-SemiBoldItalic.woff b/public/Inter-SemiBoldItalic.woff new file mode 100644 index 000000000..47b0df3a9 Binary files /dev/null and b/public/Inter-SemiBoldItalic.woff differ diff --git a/public/Inter-SemiBoldItalic.woff2 b/public/Inter-SemiBoldItalic.woff2 new file mode 100644 index 000000000..9bfbdb842 Binary files /dev/null and b/public/Inter-SemiBoldItalic.woff2 differ diff --git a/public/Inter-Thin.woff b/public/Inter-Thin.woff new file mode 100644 index 000000000..46d147273 Binary files /dev/null and b/public/Inter-Thin.woff differ diff --git a/public/Inter-Thin.woff2 b/public/Inter-Thin.woff2 new file mode 100644 index 000000000..382a46456 Binary files /dev/null and b/public/Inter-Thin.woff2 differ diff --git a/public/Inter-ThinItalic.woff b/public/Inter-ThinItalic.woff new file mode 100644 index 000000000..6c284f348 Binary files /dev/null and b/public/Inter-ThinItalic.woff differ diff --git a/public/Inter-ThinItalic.woff2 b/public/Inter-ThinItalic.woff2 new file mode 100644 index 000000000..f9471a08c Binary files /dev/null and b/public/Inter-ThinItalic.woff2 differ diff --git a/public/Inter-italic.var.woff2 b/public/Inter-italic.var.woff2 new file mode 100644 index 000000000..83fb63143 Binary files /dev/null and b/public/Inter-italic.var.woff2 differ diff --git a/public/Inter-upright.var.woff2 b/public/Inter-upright.var.woff2 new file mode 100644 index 000000000..db2b70ccb Binary files /dev/null and b/public/Inter-upright.var.woff2 differ diff --git a/public/Inter.var.woff2 b/public/Inter.var.woff2 new file mode 100644 index 000000000..e8d430914 Binary files /dev/null and b/public/Inter.var.woff2 differ diff --git a/public/contribute.json b/public/contribute.json index db85d7a29..76ec22014 100644 --- a/public/contribute.json +++ b/public/contribute.json @@ -15,8 +15,8 @@ }, "urls": { "prod": "https://send.firefox.com/", - "stage": "https://send.stage.mozaws.net/", - "dev": "https://send.dev.mozaws.net/" + "stage": "https://stage.send.nonprod.cloudops.mozgcp.net/", + "dev": "https://send2.dev.lcip.org/" }, "keywords": [ "JavaScript", diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 000000000..0e38c438b Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/inter.css b/public/inter.css new file mode 100644 index 000000000..3ad9e2f84 --- /dev/null +++ b/public/inter.css @@ -0,0 +1,161 @@ +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 100; + font-display: optional; + src: url('Inter-Thin.woff2') format('woff2'), + url('Inter-Thin.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 100; + font-display: optional; + src: url('Inter-ThinItalic.woff2') format('woff2'), + url('Inter-ThinItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 200; + font-display: optional; + src: url('Inter-ExtraLight.woff2') format('woff2'), + url('Inter-ExtraLight.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 200; + font-display: optional; + src: url('Inter-ExtraLightItalic.woff2') format('woff2'), + url('Inter-ExtraLightItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 300; + font-display: optional; + src: url('Inter-Light.woff2') format('woff2'), + url('Inter-Light.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 300; + font-display: optional; + src: url('Inter-LightItalic.woff2') format('woff2'), + url('Inter-LightItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 400; + font-display: optional; + src: url('Inter-Regular.woff2') format('woff2'), + url('Inter-Regular.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 400; + font-display: optional; + src: url('Inter-Italic.woff2') format('woff2'), + url('Inter-Italic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 500; + font-display: optional; + src: url('Inter-Medium.woff2') format('woff2'), + url('Inter-Medium.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 500; + font-display: optional; + src: url('Inter-MediumItalic.woff2') format('woff2'), + url('Inter-MediumItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 600; + font-display: optional; + src: url('Inter-SemiBold.woff2') format('woff2'), + url('Inter-SemiBold.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 600; + font-display: optional; + src: url('Inter-SemiBoldItalic.woff2') format('woff2'), + url('Inter-SemiBoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 700; + font-display: optional; + src: url('Inter-Bold.woff2') format('woff2'), + url('Inter-Bold.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 700; + font-display: optional; + src: url('Inter-BoldItalic.woff2') format('woff2'), + url('Inter-BoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 800; + font-display: optional; + src: url('Inter-ExtraBold.woff2') format('woff2'), + url('Inter-ExtraBold.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 800; + font-display: optional; + src: url('Inter-ExtraBoldItalic.woff2') format('woff2'), + url('Inter-ExtraBoldItalic.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: normal; + font-weight: 900; + font-display: optional; + src: url('Inter-Black.woff2') format('woff2'), + url('Inter-Black.woff') format('woff'); +} + +@font-face { + font-family: 'Inter'; + font-style: italic; + font-weight: 900; + font-display: optional; + src: url('Inter-BlackItalic.woff2') format('woff2'), + url('Inter-BlackItalic.woff') format('woff'); +} diff --git a/public/locales/an/send.ftl b/public/locales/an/send.ftl new file mode 100644 index 000000000..30101d25c --- /dev/null +++ b/public/locales/an/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Se ye importando… +encryptingFile = Se ye cifrando… +decryptingFile = Se ye descifrando… +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas + } +timespanHours = + { $num -> + [one] hora + *[other] { $num } horas + } +copiedUrl = Copiau! +unlockInputPlaceholder = Clau +unlockButtonLabel = Desblocar +downloadButtonLabel = Descargar +downloadFinish = Descarga completa +fileSizeProgress = ({ $partialSize } de { $totalSize }) +sendYourFilesLink = Preba Send +errorPageHeader = I ha habiu bell problema! +fileTooBig = Ixe fichero ye masiau gran pa cargar-lo. Ha de tener menos de { $size } +linkExpiredAlt = Lo vinclo ye caducau +notSupportedHeader = Lo suyo navegador no ye compatible +notSupportedLink = Per qué no ye compatible lo mío navegador? +notSupportedOutdatedDetail = Esta versión de Firefox no admite la tecnolochía web con que funciona lo Send. Habrás d'esviellar lo navegador. +updateFirefox = Esviellar Firefox +deletePopupCancel = Cancelar +deleteButtonHover = Borrar +footerLinkLegal = Aviso legal +footerLinkPrivacy = Privacidat +footerLinkCookies = Cookies +passwordTryAgain = La contrasenya ye incorrecta. Torne-lo a intentar. +javascriptRequired = Send necesita JavaScript +whyJavascript = Per qué Send necesita JavaScript? +enableJavascript = Activa JavaScript y torna-lo a intentar. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Maxima lonchitut d'a clau: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No s'ha puesto definir la clau + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartición de fichers simpla y privada +introDescription = { -send-brand } te permite de compartir fichers cifraus de cabo a cabo, y tamién un vinclo que expira automaticament. Asinas, puetz mantener en privau lo que compartes y asegurar-te de que los tuyos contenius no se quedan pa cutio en linia. +notifyUploadEncryptDone = Lo fichero s'ha cifrau y ye presto pa ninviar-se +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca dimpués de { $downloadCount } u { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 fichero + *[other] { $num } fichers + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Mida total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar lo vinclo que quiers compartir +copyLinkButton = Copiar lo vinclo +downloadTitle = Descargar los fichers +downloadDescription = Este fichero s'ha compartiu per medio de { -send-brand } con cifrau de cabo a cabo y un vinclo que caduca automaticament. +trySendDescription = Preba { -send-brand } pa una compartición de fichers simpla y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Nomás se puet puyar 1 fitxer de vez. + *[other] Nomás se pueden puyar { $count } fichers de vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Nomás se permite 1 ficher. + *[other] Nomás se permiten { $count } fichers. + } +expiredTitle = Este vinclo ye caducau. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona millor con a zaguera versión de { -firefox } y funcionará con a versión mas recient d'a mayor parte de navegadors. +downloadFirefox = Descargar { -firefox } +legalTitle = Aviso de privacidat de { -send-short-brand } +legalDateStamp = Versió 1.0, con data d'o 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min +addFilesButton = Triar los fichers a cargar +trustWarningMessage = Asegura-te de que confías en o destinatario quan compartas datos confidencials. +uploadButton = Cargar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrociega y suelta los fichers +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = u fes clic aquí pa ninviar dica { $size } +addPassword = Protecher con una clau +emailPlaceholder = Escribe la tuya adreza de correu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Inicia una sesión pa ninviar dica { $size } +signInOnlyButton = Iniciar la sesión +accountBenefitTitle = Crea una cuenta de { -firefox } u dentra-ie +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir fichers dica { $size } +accountBenefitDownloadCount = Compartir fichers con mas chent +accountBenefitTimeLimit = + { $count -> + [one] Mantiene los vinclos activos dica 1 dia + *[other] Mantiene los vinclos activos dica { $count } días + } +accountBenefitSync = Chestiona los fichers compartius dende qualsequier dispositivo +accountBenefitMoz = Descubre mas cosas sobre los atros servicios de { -mozilla } +signOut = Zarrar la sesión +okButton = Vale +downloadingTitle = Se ye descargando +noStreamsWarning = Este navegador talment no pueda descifrar un fichero tant gran. +noStreamsOptionCopy = Copia lo vinclo pa ubrir-lo en belatro navegador +noStreamsOptionFirefox = Preba lo nuestro navegador favorito +noStreamsOptionDownload = Continar con este navegador +downloadFirefoxPromo = Lo nuevo { -firefox } t'ofreix { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Comparte lo vinclo enta lo tuyo fichero: +shareLinkButton = Compartir lo vinclo +# $name is the name of the file +shareMessage = Baixa-te «{ $name }» con { -send-brand }: compartición de fiches simpla y segura +trailheadPromo = I hai una manera de protecher la tuya privacidat. Une-te a Firefox. +learnMore = Mas información +downloadFlagged = Este vinclo s'ha desactivau per violar las condiciones d'uso. +downloadConfirmTitle = Una coseta mas +downloadConfirmDescription = Asegura-te de que confías en a persona que t'ha ninviau este fichero, perque no podemos verificar que no danyará lo tuyo dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Confío en a persona que ha ninviau este fichero + *[other] Confío en a persona que ha ninviau estes fichers + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Sinyalar este fichero como sospeitoso + *[other] Sinyalar estes fichers como sospeitoso + } +reportDescription = Aduya-nos a comprender qué ha pasau. Quál creyes que ye lo problema con estes fichers? +reportUnknownDescription = Vest ta la URL d'o vinclo que quiers sinyalar y fe clic en « { reportFile } ». +reportButton = Informar +reportReasonMalware = Estes fichers contienen malware u fan parte d'un ataque de phishing. +reportReasonPii = Estes fichers contienen información personal identificable sobre yo. +reportReasonAbuse = Estes fichers contienen conteniu ilegal u abusivo. +reportReasonCopyright = Pa informar sobre una violación de dreitos d'autor u de marca, sigue lo procedimiento descrito en esta pachina. +reportedTitle = Fichers sinyalaus +reportedDescription = Gracias. Hemos recibiu lo tuyo informe sobre estes fichers. diff --git a/public/locales/ar/send.ftl b/public/locales/ar/send.ftl index fd0829e6c..f5838f36a 100644 --- a/public/locales/ar/send.ftl +++ b/public/locales/ar/send.ftl @@ -1,35 +1,11 @@ -// Firefox Send is a brand name and should not be localized. +# Send is a brand name and should not be localized. title = فَيَرفُكس سِنْد -siteSubtitle = تجربة وِبّيّة siteFeedback = الانطباعات -uploadPageHeader = شارِك ملفاتك بخصوصية وتعمية -uploadPageExplainer = أرسل الملفات عبر رابط آمن خاص ومعمّى تنتهي صلاحيته تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد. -uploadPageLearnMore = اطّلع على المزيد -uploadPageDropMessage = أسقِط ملفّك هنا لبدء الرفع -uploadPageSizeMessage = لتتحصل على أفضل تجربة، من المستحسن أن يكون الملف أصغر من 1 غ.بايت -uploadPageBrowseButton = اختر ملفّا على حاسوبك - .title = اختر ملفّا على حاسوبك -uploadPageBrowseButton1 = اختر ملفّا لرفعه -uploadPageMultipleFilesAlert = رفع عدة ملفات (أو رفع مجلد) ليس مدعوما حاليا. -uploadPageBrowseButtonTitle = ارفع ملفًا -uploadingPageProgress = يرفع { $filename } ({ $size }) importingFile = يستورد… -verifyingFile = يتحقق… encryptingFile = يعمّي… decryptingFile = يفك التعمية… -notifyUploadDone = انتهى الرفع. -uploadingPageMessage = ما إن يُرفع الملف سيُتاح ضبط خيارات انتهاء صلاحيته. -uploadingPageCancel = ألغِ الرفع - .title = ألغِ الرفع -uploadCancelNotification = أُلغي الرفع. -uploadingPageLargeFileMessage = هذا الملف كبير الحجم وسيأخذ رفعه وقتا. انتظر رجاءً. -uploadingFileNotification = أعلِمني عندما يكتمل الرفع. -uploadSuccessConfirmHeader = جاهز للإرسال -uploadSvgAlt - .alt = ارفع -uploadSuccessTimingHeader = ستنتهي صلاحية الرابط الذي يشير إلى الملف في حال: نُزِّل لأول مرة، أو مرّ ٢٤ ساعة على رفعه. -expireInfo = ستنتهي صلاحية رابط الملف بعد { $downloadCount } أو { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [zero] لا تنزيلات [one] تنزيل واحد [two] تنزيلين @@ -37,7 +13,8 @@ downloadCount = { $num -> [many] { $num } تنزيلًا *[other] { $num } تنزيل } -timespanHours = { $num -> +timespanHours = + { $num -> [zero] أقل من ساعة [one] ساعة [two] ساعتين @@ -45,90 +22,170 @@ timespanHours = { $num -> [many] { $num } ساعة *[other] { $num } ساعة } -copyUrlFormLabelWithName = انسخ الرابط وشاركه لإرسال الملف: { $filename } -copyUrlFormButton = انسخ إلى الحافظة - .title = انسخ إلى الحافظة copiedUrl = نُسخ! -deleteFileButton = احذف الملف - .title = احذف الملف -sendAnotherFileLink = أرسل ملفّا آخر - .title = أرسل ملفّا آخر -// Alternative text used on the download link/button (indicates an action). -downloadAltText - .alt = نزّل -downloadsFileList = التنزيلات -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = الوقت -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = نزّل { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = أدخل كلمة السر unlockInputPlaceholder = كلمة السر unlockButtonLabel = افتح القفل -downloadFileTitle = نزِّل الملف المعمّى -// Firefox Send is a brand name and should not be localized. -downloadMessage = يُرسل إليك صديقك ملفا عبر «فَيَرفُكس سِنْد»، وهي خدمة تتيح لك مشاركة الملفات عبر رابط آمن وخاص ومعمّى، حيث تنتهي صلاحياتها تلقائيا لتضمن عدم بقاء ما ترسله إلى الأبد. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = نزّل - .title = نزّل -downloadNotification = لقد اكتمل التنزيل. downloadFinish = اكتمل التنزيل -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } من أصل { $totalSize }) -// Firefox Send is a brand name and should not be localized. sendYourFilesLink = جرِّب «فَيَرفُكس سِنْد» -downloadingPageProgress = ينزّل { $filename } ({ $size }) -downloadingPageMessage = رجاء أبقِ هذا اللسان مفتوحا حتى نجلب الملف ونفك تعميته. -errorAltText - .alt = خطأ أثناء الرفع errorPageHeader = حدث خطب ما. -errorPageMessage = حدث خطب ما أثناء رفع الملف. -errorPageLink = أرسل ملفا آخر fileTooBig = حجم الملف كبير للغاية لرفعه. يجب أن يكون أصغر من { $size }. linkExpiredAlt = انتهت صلاحية الرابط -expiredPageHeader = انتهت صلاحية هذا الرابط أو لم يكن موجودا في المقام الأول! notSupportedHeader = متصفحك غير مدعوم. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = للأسف فإن متصفحك لا يدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تجربة متصفح آخر، ونحن ننصحك بِفَيَرفُكس! notSupportedLink = لماذا متصفحي غير مدعوم؟ notSupportedOutdatedDetail = للأسف فإن إصدارة فَيَرفُكس هذه لا تدعم تقنية الوِب التي يعتمد عليها «فَيَرفُكس سِنْد». عليك تحديث متصفحك. updateFirefox = حدّث فَيَرفُكس -downloadFirefoxButtonSub = تنزيل مجاني -uploadedFile = ملف -copyFileList = انسخ الرابط -// expiryFileList is used as a column header -expiryFileList = ينتهي في -deleteFileList = احذف -nevermindButton = لا بأس -legalHeader = الشروط والخصوصية -legalNoticeTestPilot = «فَيَرفُكس سِنْد» جزء من اختبار تجريبي حاليًا و يخضع لبنود خدمة الاختبار التجريبي و تنويه الخصوصية. يمكنك التعرف على مزيد من المعلومات حول هذه التجربة وجمع البياناتهنا. -legalNoticeMozilla = يخضع استخدام موقع «فَيَرفُكس سِنْد» إلىتنويه خصوصية المواقع و بنود خدمة المواقع. -deletePopupText = أأحذف هذا الملف؟ -deletePopupYes = نعم deletePopupCancel = ألغِ -deleteButtonHover - .title = احذف -copyUrlHover - .title = انسخ الرابط +deleteButtonHover = احذف footerLinkLegal = القانونية -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = حول الاختبار التجريبي footerLinkPrivacy = الخصوصية -footerLinkTerms = الشروط footerLinkCookies = الكعكات -requirePasswordCheckbox = اطلب كلمة سر لتنزيل هذا الملف -addPasswordButton = أضِف كلمة سر -changePasswordButton = غيّر passwordTryAgain = كلمة السر خاطئة. أعِد المحاولة. -// This label is followed by the password needed to download a file -passwordResult = كلمة السر: { $password } -reportIPInfringement = أبلغ عن انتهاك للملكية الفكرية javascriptRequired = يتطلب فَيَرفُكس سِنْد جافاسكربت whyJavascript = لماذا يتطلب فَيَرفُكس سِنْد جافاسكربت؟ enableJavascript = رجاء فعّل جافاسكربت ثم أعد المحاولة. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }س { $minutes }د -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }د +# A short status message shown when the user enters a long password +maxPasswordLength = أقصر طول لكلمة السر: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = يجب ألا تُضبط كلمة السر هذه + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = شارِك ملفاتك بلا عناء وبخصوصية تامة +introDescription = يتيح لك { -send-brand } مشاركة الملفات عبر تعميتها من الطرفين وإتاحتها في رابط ينقضي أجله تلقائيا. هكذا يمكنك إبقاء ما شاركته خاصًا فتضمن بأن ملفاتك لن تبقى في الوِب أبد الدهر. +notifyUploadEncryptDone = اكتملت تعمية الملف وأصبح جاهزًا لإرساله +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = ينقضي بعد { $downloadCount } أو { $timespan } +timespanMinutes = + { $num -> + [zero] أقل من دقيقة + [one] دقيقة واحدة + [two] دقيقتين اثنتين + [few] { $num } دقائق + [many] { $num } دقيقة + *[other] { $num } دقيقة + } +timespanDays = + { $num -> + [zero] أقل من يوم + [one] يوم واحد + [two] يومين اثنين + [few] { $num } أيام + [many] { $num } يومًا + *[other] { $num } يوم + } +timespanWeeks = + { $num -> + [zero] أقل من أسبوع + [one] أسبوع واحد + [two] أسبوعين اثنين + [few] { $num } أسابيع + [many] { $num } أسبوعًا + *[other] { $num } أسبوع + } +fileCount = + { $num -> + [zero] { $num } ملف + [one] ملف واحد + [two] ملفان اثنان + [few] { $num } ملفات + [many] { $num } ملفًا + *[other] { $num } ملف + } +# byte abbreviation +bytes = بايت +# kibibyte abbreviation +kb = ك.بايت +# mebibyte abbreviation +mb = م.بايت +# gibibyte abbreviation +gb = ج.بايت +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = إجمالي الحجم: { $size } +# the next line after the colon contains a file name +copyLinkDescription = انسخ هذا الرابط لتُشارك الملف: +copyLinkButton = انسخ الرابط +downloadTitle = نزّل الملفات +downloadDescription = شارك أحد هذا الملف معك عبر { -send-brand } وعمّاه بتعمية من الطرفين وبرابط ينقضي أجله تلقائيا. +trySendDescription = جرِّب { -send-brand } وشارِك ملفاتك بلا عناء وبخصوصية تامة. +# count will always be > 10 +tooManyFiles = + { $count -> + [zero] لا يمكنك تنزيل أي ملف في آن واحد. + [one] لا يمكنك تنزيل ما يزيد على ملف واحد في آن واحد. + [two] لا يمكنك تنزيل ما يزيد على ملفين اثنين في آن واحد. + [few] لا يمكنك تنزيل ما يزيد على { $count } ملفات في آن واحد. + [many] لا يمكنك تنزيل ما يزيد على { $count } ملفًا في آن واحد. + *[other] لا يمكنك تنزيل ما يزيد على { $count } ملف في آن واحد. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [zero] الأرشيفات ممنوعة. + [one] لا يُسمح إلا بأرشيف واحد. + [two] لا يُسمح إلا بأرشيفين اثنين. + [few] لا يُسمح إلا ب‍ { $count } أرشيفات. + [many] لا يُسمح إلا ب‍ { $count } أرشيفًا. + *[other] لا يُسمح إلا ب‍ { $count } أرشيف. + } +expiredTitle = انقضى وقت الرابط. +notSupportedDescription = لن يعمل { -send-brand } في هذا المتصفح. أفضل المتصفحات التي يعمل معها { -send-short-brand } هو { -firefox } بآخر إصدارة، كما وأحدث إصدارة من أغلب المتصفحات الموجودة. +downloadFirefox = نزِّل { -firefox } +legalTitle = تنويه خصوصية { -send-short-brand } +legalDateStamp = الإصدارة ١٫٠ بتاريخ ١٢ مارس ٢٠١٩ +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }يوم { $hours }سا { $minutes }دق +addFilesButton = حدّد الملفات التي تريد رفعها +uploadButton = ارفع +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = اسحب الملفات وأفلِتها هنا +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = أو انقر لإرسال ملفات يصل حجمها { $size } +addPassword = احمِه بكلمة سر +emailPlaceholder = أدخل بريدك الإلكتروني +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = لِج وأرسِل ملفات يصل حجمها { $size } +signInOnlyButton = لِج +accountBenefitTitle = أنشِئ حساب { -firefox } أو لِج إلى حسابك +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = شارِك ملفات يصل حجمها { $size } +accountBenefitDownloadCount = شارِك الملفات مع أناس أكثر وأكثر +accountBenefitTimeLimit = + { $count -> + [zero] لا تُبقِ أي روابط نشطة + [one] أبقِ الروابط نشطة لمدة تصل إلى يوم واحد + [two] أبقِ الروابط نشطة لمدة تصل إلى يومين اثنين + [few] أبقِ الروابط نشطة لمدة تصل إلى { $count } أيام + [many] أبقِ الروابط نشطة لمدة تصل إلى { $count } يومًا + *[other] أبقِ الروابط نشطة لمدة تصل إلى { $count } يوم + } +accountBenefitSync = أدِر ملفاتك التي شاركتها من أيّ جهاز تريد +accountBenefitMoz = اطّلع على المزيد حول خدمات { -mozilla } +signOut = اخرج +okButton = حسنًا +downloadingTitle = يجري التنزيل +noStreamsWarning = هناك احتمال بألا يقدر هذا المتصفح على فكّ تعمية الملفات الكبيرة كهذا. +noStreamsOptionCopy = انسخ الرابط لتفتحه في متصفح آخر +noStreamsOptionFirefox = جرّب متصفّحنا المفضل +noStreamsOptionDownload = واصِل بهذا المتصفح +downloadFirefoxPromo = ‏{ -send-short-brand } تقدمة { -firefox } الجديد الأنيق. +# the next line after the colon contains a file name +shareLinkDescription = شارِك الرابط الذي يصل إلى الملف: +shareLinkButton = شارِك الرابط +# $name is the name of the file +shareMessage = نزِّل ”{ $name }“ عبر { -send-brand }: خدمة لمشاركة الملفات بلا عناء وبخصوصية تامة +trailheadPromo = يمكنك حماية خصوصيتك، طبعا. انضم إلى فَيَرفُكس. +learnMore = اطّلع على المزيد. diff --git a/public/locales/ast/send.ftl b/public/locales/ast/send.ftl index 8f00923ec..2fe75389d 100644 --- a/public/locales/ast/send.ftl +++ b/public/locales/ast/send.ftl @@ -1,91 +1,152 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = esperimentu web -siteFeedback = Feedback -uploadPageHeader = Compartición privada y cifrada de ficheros -uploadPageExplainer = Unvia ficheros pente un enllaz seguru, priváu y cifráu que caduca automáticamente p'asegurar que les tos coses nun queden siempres na rede. -uploadPageLearnMore = Deprendi más -uploadPageDropMessage = Suelta equí'l to ficheru p'aniciar la xuba -uploadPageSizeMessage = Pal meyor funcionamientu, lo meyor ye que'l to ficheru seya menor de 1GB -uploadPageBrowseButton = Esbilla un ficheru nel to ordenador -uploadPageBrowseButton1 = Esbilla un ficheru pa unviar -uploadPageMultipleFilesAlert = Anguaño nun se sofita la xuba múltiple de ficheros o carpetes. -uploadPageBrowseButtonTitle = Xubir ficheru -uploadingPageProgress = Xubiendo { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importando... -verifyingFile = Verificando... encryptingFile = Cifrando... decryptingFile = Descifrando... -notifyUploadDone = Finó la to xuba. -uploadingPageMessage = Namái que'l ficheru xuba, sedrás a afitar les opciones de caducidá. -uploadingPageCancel = Encaboxar xuba -uploadCancelNotification = Encaboxóse la to xuba. -uploadingPageLargeFileMessage = Esti ficheru ye grande y pue entardar daqué en xubir. ¡Paciencia! -uploadingFileNotification = Avísame cuando se complete la xuba. -uploadSuccessConfirmHeader = Preparáu pa unviar -uploadSvgAlt = Xubir -uploadSuccessTimingHeader = L'enllaz del to ficheru caducará dempués d'una descarga o en 24 hores. -copyUrlFormLabelWithName = Copia y comparti l'enllaz pa unviar el to ficheru: { $filename } -copyUrlFormButton = Copiar al cartafueyu +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargues + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } hores + } copiedUrl = ¡Copióse! -deleteFileButton = Desaniciar ficheru -sendAnotherFileLink = Unviar otru ficheru -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Baxar -downloadFileName = Baxar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introducir contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquiar -downloadFileTitle = Baxar ficheru cifráu -// Firefox Send is a brand name and should not be localized. -downloadMessage = El to collaciu unvióte un ficheru usando Firefox Send, un serviciu que te permite compartir ficheros con un enllaz seguru, priváu y cifráu que caduca automáticamente p'asegurar que les to coses nun queden siempres na rede. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Baxar -downloadNotification = Completóse la to descarga. -downloadFinish = Descarga completada -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Completóse la descarga fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prueba Firefox Send -downloadingPageProgress = Baxando { $filename } ({ $size }) -downloadingPageMessage = Dexa esta llingüeta abierta entrín vamos en cata del to ficheru y lu desciframos, por favor. -errorAltText = Fallu de xuba -errorPageHeader = ¡Daqué foi mal! -errorPageMessage = Hebo un fallu xubiendo'l ficheru. -errorPageLink = Unviar otru ficheru +sendYourFilesLink = Probar Send +errorPageHeader = ¡Asocedió daqué malo! fileTooBig = Esti ficheru ye mui grande como pa xubilu. Debería tener menos de { $size }. -linkExpiredAlt = Enllaz caducáu -expiredPageHeader = ¡Esti enllaz caducó o enxamás nun esistó! +linkExpiredAlt = Caducó l'enllaz notSupportedHeader = El to restolador nun ta sofitáu. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Desafortunadamente esti restolador nun sofita la teunoloxía web qu'usa Firefox Send. Precisarás d'usar otru restolador. ¡Aconseyámoste Firefox! notSupportedLink = ¿Por qué'l mio restolador nun ta sofitáu? -notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Firefox Send. Precisarás d'anovar Firefox. +notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox nun sofita la teunoloxía web qu'usa Send. Vas precisar anovar el restolador. updateFirefox = Anovar Firefox -downloadFirefoxButtonSub = Descarga de baldre -uploadedFile = Ficheru -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Caduca en -deleteFileList = Desaniciar -nevermindButton = Nun m'importa -legalHeader = Términos y privacidá -legalNoticeTestPilot = Anguaño Firefox Send ye un esperimentu de Test Pilot y ta suxetu a los Términos de serviciu y l'Avisu de privacidá de Test Pilot. Equí pues deprender más tocante a esti esperimentu y la so recoyida de datos. -legalNoticeMozilla = L'usu de Firefox Send tamién ta suxetu al Avisu de privacidá y a los Términos d'usu de la páxina web de Mozilla. -deletePopupText = ¿Desaniciar esti ficheru? -deletePopupYes = Sí deletePopupCancel = Encaboxar deleteButtonHover = Desaniciar -copyUrlHover = Copiar URL footerLinkLegal = Llegal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Tocante a Test Pilot footerLinkPrivacy = Privacidá -footerLinkTerms = Términos footerLinkCookies = Cookies -requirePasswordCheckbox = Riquir una contraseña pa baxar esti ficheru -addPasswordButton = Amestar contraseña -passwordTryAgain = Contraseña incorreuta. Volvi tentalo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } +passwordTryAgain = La contraseña ye incorreuta. Volvi tentalo. +javascriptRequired = Send rique JavaScript +whyJavascript = ¿Por qué Send rique JavaScript? +enableJavascript = Activa JavaScript y volvi tentalo, por favor. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Llargor máximu de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nun pudo afitase esta contraseña + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartición de ficheros privada y cenciella +introDescription = { -send-brand } déxate compartir ficheros con cifráu puntu a puntu y un enllaz que caduca automáticamente. D'esti mou, asegúreste de que lo que compartes ye privao y nun va tar siempres en llinia. +notifyUploadEncryptDone = El ficheru ta cifráu y preparáu pa unviase +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca dempués de { $downloadCount } ó { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutu + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } díes + } +timespanWeeks = + { $num -> + [one] 1 selmana + *[other] { $num } selmanes + } +fileCount = + { $num -> + [one] 1 ficheru + *[other] { $num } ficheros + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamañu total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copia l'enllaz pa compartir el ficheru: +copyLinkButton = Copiar l'enllaz +downloadTitle = Descarga de ficheros +downloadDescription = Esti ficheru compartióse per { -send-brand } con cifráu puntu a puntu y un enllaz que caduca automáticamente. +trySendDescription = Prueba { -send-brand } pa una compartición de ficheros cenciella y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Namás pue xubise 1 ficheru al empar. + *[other] Namás puen xubise { $count } ficheros al empar. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Namás se permite 1 archivu + *[other] Namás se permiten { $count } archivos + } +expiredTitle = Esti enllaz caducó. +notSupportedDescription = { -send-brand } nun va funcionar con esti restolador. { -send-short-brand } funciona meyor cola última versión de { -firefox } y l'actual de la mayoría de restoladores. +downloadFirefox = Baxar { -firefox } +legalTitle = Avisu de privacidá de { -send-short-brand } +legalDateStamp = Versión 1.0, con data del 12 de marzu de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Esbillar los ficheros a unviar +trustWarningMessage = Asegúrate de que t'enfotes nel destinatariu al compartir datos sensibles. +uploadButton = Xubir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastra y suelta ficheros +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o calca pa unviar hasta { $size } +addPassword = Protexer con una contraseña +emailPlaceholder = Introduz el to corréu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Anicia sesión pa unviar hasta { $size } +signInOnlyButton = Aniciar sesión +accountBenefitTitle = Creación d'una cuenta de { -firefox } o aniciu de sesión nella +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Comparti ficheros d'hasta { $size } +accountBenefitDownloadCount = Comparti ficheros con más xente +accountBenefitTimeLimit = + { $count -> + [one] Caltién activos los enllaces demientres 1 día + *[other] Caltién activos los enllaces demientres { $count } díes + } +accountBenefitSync = Xestiona los ficheros compartíos dende cualesquier preséu +accountBenefitMoz = Deprendi más tocante a otros servicios de { -mozilla } +signOut = Zarrar sesión +okButton = Aceutar +downloadingTitle = Baxando +noStreamsWarning = Esti restolador quiciabes nun seya a descifrar un ficheru d'esti tamañu. +trailheadPromo = Hai un mou de protexer la to privacidá. Xúnite a Firefox. +learnMore = Deprender más. +downloadFlagged = Esti enllaz desactivóse por violar los términos del serviciu. +downloadConfirmTitle = Una cosa más +reportReasonMalware = Estos ficheros contienen malware o son parte d'un ataque de phishing +reportReasonPii = Estos ficheros contienen información que m'identifica. +reportReasonAbuse = Estos ficheros contienen conteníu illegal o abusivu. +reportedDescription = Gracies. Recibiemos l'informe tocante a estos ficheros. diff --git a/public/locales/az/send.ftl b/public/locales/az/send.ftl index 568a46175..c88eb6e73 100644 --- a/public/locales/az/send.ftl +++ b/public/locales/az/send.ftl @@ -1,115 +1,72 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = web eksperiment +# Send is a brand name and should not be localized. +title = Send siteFeedback = Geri dönüş -uploadPageHeader = Məxfi, Şifrələnmiş Fayl Paylaşma -uploadPageExplainer = Fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silinən keçidlə göndərin. -uploadPageLearnMore = Ətraflı öyrən -uploadPageDropMessage = Yükləmək üçün faylınızı buraya daşıyın -uploadPageSizeMessage = Xidmətin daha yaxşı işləməsi üçün faylınız 1 GB-dan az olmalıdır -uploadPageBrowseButton = Kompüterinizdən fayl seçin -uploadPageBrowseButton1 = Yüklənəcək faylı seçin -uploadPageMultipleFilesAlert = Birdən çox fayl və ya qovluq yükləmə hələlik dəstəklənmir. -uploadPageBrowseButtonTitle = Fayl yüklə -uploadingPageProgress = { $filename } ({ $size }) yüklənir importingFile = İdxal edilir… -verifyingFile = Təsdiqlənir… encryptingFile = Şifrələnir... decryptingFile = Şifrə açılır... -notifyUploadDone = Yükləməniz hazırdır. -uploadingPageMessage = Faylınız yükləndikdən sonra vaxtı çıxma seçimlərini qura biləcəksiz. -uploadingPageCancel = Yükləməni ləğv et -uploadCancelNotification = Yükləməniz ləğv edildi. -uploadingPageLargeFileMessage = Fayl böyükdür və yükləmək çox vaxt ala bilər. Səbirli olun! -uploadingFileNotification = Yükləmə bitdiyində xəbər ver. -uploadSuccessConfirmHeader = Göndərməyə hazır -uploadSvgAlt = Yüklə -uploadSuccessTimingHeader = Faylınızın keçidinin 1 endirmədən və ya 24 saatdan sonra vaxtı çıxacaq. -expireInfo = Faylınız üçün keçidin vaxtı { $downloadCount } sonra və ya { $timespan } tarixində keçəcək. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 endirmə *[other] { $num } endirmə } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 saat *[other] { $num } saat } -copyUrlFormLabelWithName = Faylınızı göndərmək üçün keçidi köçürün: { $filename } -copyUrlFormButton = Buferə köçür copiedUrl = Köçürüldü! -deleteFileButton = Faylı sil -sendAnotherFileLink = Başqa fayl göndər -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Endir -downloadsFileList = Endirmələr -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Vaxt -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } faylını endir -downloadFileSize = ({ $size }) -unlockInputLabel = Parol daxil edin unlockInputPlaceholder = Parol unlockButtonLabel = Aç -downloadFileTitle = Şifrələnmiş Faylı Endir -// Firefox Send is a brand name and should not be localized. -downloadMessage = Yoldaşınız Firefox Send ilə sizə fayl göndərir, fayllarınızı təhlükəsiz, məxfi, şifrələnmiş və daima onlayn qalmaması üçün avtomatik silən fayl göndərmə xidməti. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Endir -downloadNotification = Endirməniz tamamlandı. downloadFinish = Endirmə Tamamlandı -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send Yoxla -downloadingPageProgress = { $filename } faylı ({ $size }) endirilir -downloadingPageMessage = Lütfən faylı endirib şifrəsini açarkən vərəqi açıq buraxın. -errorAltText = Yükləmə xətası +sendYourFilesLink = Send Yoxla errorPageHeader = Nəsə səhv getdi! -errorPageMessage = Faylı yüklərkən xəta baş verdi. -errorPageLink = Başqa fayl göndər fileTooBig = Fayl yükləmək üçün çox böyükdür. Fayl { $size }-dan az olmalıdır. linkExpiredAlt = Keçidin vaxtı çıxıb -expiredPageHeader = Keçidin vaxtı çıxıb və ya heç vaxt olmayıb! notSupportedHeader = Səyyahınız dəstəklənmir. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Heyf ki, bu səyyah Firefox Send-ə güc verən web texnologiyalarını dəstəkləmir. Fərqli bir səyyah yoxlamalısınız. Biz Firefox məsləhət görürük! notSupportedLink = Səyyahım niyə dəstəklənmir? -notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Firefox Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz. +notSupportedOutdatedDetail = Heyf ki, Firefox səyyahının bu versiyası Send-ə güc verən web texnologiyalarını dəstəkləmir. Səyyahınızı yeniləməlisiniz. updateFirefox = Firefox-u Yenilə -downloadFirefoxButtonSub = Pulsuz Endir -uploadedFile = Fayl -copyFileList = Keçidi Köçürt -// expiryFileList is used as a column header -expiryFileList = Vaxtı çıxma tarixi -deleteFileList = Sil -nevermindButton = Vacib deyil -legalHeader = Şərtlər və Məxfilik -legalNoticeTestPilot = Firefox Send Test Pilot eksperimentidir, Test Pilot Xidmət ŞərtləriMəxfilik Bildirişi-nə tabedir. Bu eksperiment və məlumat yığma haqqında buradan öyrənə bilərsiz. -legalNoticeMozilla = Firefox Send saytının istifadəsi həmçinin Mozilla-nın Saytlar üçün Məxfilik BildirişiSayt İstifadə Şərtləri-nə tabedir. -deletePopupText = Fayl silinsin? -deletePopupYes = Bəli deletePopupCancel = Ləğv et deleteButtonHover = Sil -copyUrlHover = Keçidi Köçürt footerLinkLegal = Hüquqi -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot Haqqında footerLinkPrivacy = Məxfilik -footerLinkTerms = Şərtlər footerLinkCookies = Çərəzlər -requirePasswordCheckbox = Bu faylı endirmək üçün parol tələb et -addPasswordButton = Parol əlavə et -changePasswordButton = Dəyişdir passwordTryAgain = Səhv parol. Təkrar yoxlayın. -// This label is followed by the password needed to download a file -passwordResult = Parol: { $password } -reportIPInfringement = Əqli-mülkiyyət pozuntusu bildir -javascriptRequired = Firefox Send üçün JavaScript lazımdır -whyJavascript = Firefox Send niyə JavaScript tələb edir? +javascriptRequired = Send üçün JavaScript lazımdır +whyJavascript = Send niyə JavaScript tələb edir? enableJavascript = Lütfən JavaScript-i aktiv edib təkrar yoxlayın. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } saat { $minutes } dəq -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } dəq +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum parol uzunluğu: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Parol qurula bilmədi + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +copyLinkButton = Keçidi köçür +uploadButton = Yüklə +signInOnlyButton = Daxil ol +signOut = Çıx +okButton = Tamam +downloadingTitle = Endirilir +shareLinkButton = Keçidi paylaş diff --git a/public/locales/azz/send.ftl b/public/locales/azz/send.ftl new file mode 100644 index 000000000..eed956eb3 --- /dev/null +++ b/public/locales/azz/send.ftl @@ -0,0 +1,146 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Nikan uelis tikijkuilos tein tiknemilijtos +importingFile = Mokalakijtok… +encryptingFile = Motatijtok… +decryptingFile = Kichiujtok se uelis kiixtajtoltis ya… +downloadCount = + { $num -> + *[undefined] 1 kitemouijtok / { $num } kintemouijtok + } +timespanHours = + { $num -> + *[undefined] 1 hora / { $num } hora + } +copiedUrl = ¡Moixkopinak! +unlockInputPlaceholder = Ichtakatajtol +unlockButtonLabel = Xikajchiua tein amo kikaua maj tekiti +downloadButtonLabel = Xiktemoui +downloadFinish = Nochi motemouij ya +fileSizeProgress = ({ $partialSize } itech { $totalSize }) +sendYourFilesLink = Xikejeko Send +errorPageHeader = ¡Tensa amo kuali kisak! +fileTooBig = Nejin tajkuilol semi ueyi. Moneki amo panos { $size } +linkExpiredAlt = Nejin tein tikpatskilij amo tekititok ya +notSupportedHeader = Monavegador amo kualtia. +notSupportedLink = ¿Keyej nonavegador amo kualtia? +notSupportedOutdatedDetail = Tetayokoltij, Firefox tein tikuitok amo kiselia tepostekitilis tecnología web tein ika tekiti Send. Moneki tikyankuilis monavegador. +updateFirefox = Maj Firefox moyankuili +deletePopupCancel = Maj motsakuili uan amo tami tein kichiujtok +deleteButtonHover = Maj majchiua +footerLinkLegal = Keniuj motekitiltis +footerLinkPrivacy = Keniuj tikyekpiaj tein tikseliaj +footerLinkCookies = Cookies +passwordTryAgain = Amo yektik ichtakatajtol. Oksepa xikijkuilo. +javascriptRequired = Send kineki maj moajsi JavaScript +whyJavascript = ¿Keyej Send kineki maj moajsi JavaScript? +enableJavascript = Se kualtakayot, xikaua maj peua tekiti JavaScript uan oksepa xikejeko. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Keniuj ueyak ichtakatajtol, maj amo pano: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nejin ichtakatajtol amo uel kiixtaliani + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Xiktitani +-firefox = Firefox +-mozilla = Mozilla +introTitle = Amo ouij uan ichtaka xikinpanoltili oksekin motajkuiloluan archivos +introDescription = { -send-brand } mitspaleuia uan ijkon tikinpanoltilis oksekin motajkuiloluan archivos ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no kitemaka kampa se kipatskilis tein niman ixpoliui. Ijkuin uelis tikichtakaeuas tein tikintitanilis oksekin uan tikyekmatis tein moaxka amo nochipaya mokauas itech Internet. +notifyUploadEncryptDone = Moarchivo moijkuiloj ya kemej amo akin uelis kiixtajtoltis uan se uelis kititanis ya +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Poliui ijkuak tiajsis { $downloadCount } oso { $timespan } +timespanMinutes = + { $num -> + *[undefined] 1 minuto / { $num } minuto + } +timespanDays = + { $num -> + *[undefined] 1 tonal / { $num } tonalmej + } +timespanWeeks = + { $num -> + *[undefined] 1 semana / { $num } semana + } +fileCount = + { $num -> + *[undefined] 1 archivo / { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Nochi tamachiua: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Xikixkopina tein se kipatskilis uan xikinpanoltili oksekin moarchivo: +copyLinkButton = Xikixkopina tein se kipatskilis +downloadTitle = Xiktemoui tajkuilolmej archivos +downloadDescription = Nejin archivo mopanoltij itechkopa { -send-brand } ika tapoualmej tein amo aksa uelis kiajsikamatis, uan no tein ika se kipatskilis tein niman ixpoliui. +trySendDescription = Xikejeko { -send-brand } ijkon amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] Sayoj { $count } tajkuilolmej archivos uelis tikolochtejkoltis saj. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] Sayoj { $count } tajkuilolmej archivos uelis moajsiskej saj. + } +expiredTitle = Nejin tein tikpatskilij amo tekititos ok. +notSupportedDescription = { -send-brand } amo tekiti ika nejin navegador. { -send-short-brand } okachi kuali tekiti tein ika okachi yankuik { -firefox }, uan no tekitis tein ika okachi yankuikej tel miak navegadores. +downloadFirefox = Xiktemoui { -firefox } +legalTitle = { -send-short-brand } tanauatia ika yekpialis tein moaxka itech tepos +legalDateStamp = Versión 1.0 tein kikixtijkej 12 tonal metsti marzo 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }t { $hours }h { $minutes }m +addFilesButton = Xikinixpejpena tajkuilolmej archivos tein tikintejkoltis +uploadButton = Xiktejkolti +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Xikintilana uan xikinkajkaua tajkuilolmej archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = oso xikpatskili uan tiktitanis, sayoj tein amo panoua { $size } +addPassword = Xikyekpia ika se ichtakatajtol +emailPlaceholder = Xikijkuilo mocorreo itech tepos +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Xikalakteua uan uelis tiktitanis tein amo panos { $size } +signInOnlyButton = Kampa se kalakteua +accountBenefitTitle = Ximochiuili se cuenta itech { -firefox } oso xikalakteua +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Xikintitani tajkuilolmej archivos tein amo panouaj { $size } +accountBenefitDownloadCount = Xikintitanili tajkuilolmej archivos oksekin +accountBenefitTimeLimit = + { $count -> + *[undefined] Kampa se kipatskilis maj kisentokakan kualtiakan se tonal ok / { $count } tonalmej ok + } +accountBenefitSync = Itech tein yeski tepos xikixyekana motajkuiloluan archivos tein tikinpanoltilij oksekin +accountBenefitMoz = Okachi tikmatis okseki tapaleuilmej tein kitemaka { -mozilla } +signOut = Kampa se kisa +okButton = Kuali yetok +downloadingTitle = Kitemouijtok +noStreamsWarning = Xa navegador amo uelis kitalij nejin tajkuilol archivo tein tel ueyi kemej se uelis kiyekixtajtoltis ya. +noStreamsOptionCopy = Xikixkopina tein se kipatskilis uan ijkon se uelis kitatapos itech okse navegador +noStreamsOptionFirefox = Xikejeko navegador tein semi techuelita +noStreamsOptionDownload = Maj niksentoka niktatekiujti nejin navegador +downloadFirefoxPromo = Yankuik { -firefox } mitsixpantilia { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Xikinpanoltili oksekin tein se kipatskilis uan teuika motajkuilol archivo: +shareLinkButton = Kampa se kipatskilis tein uelis tikinpanoltilis oksekin +# $name is the name of the file +shareMessage = Xiktemoui “{ $name }” ika { -send-brand }: amo ouij uelis tikinpanoltilis oksekin motajkuiloluan archivos uan tikyekmatis ke amo tej kipanos +trailheadPromo = Kemaj, uelis tikyekpias tein moaxka itech tepos. Xipoui Firefox. +learnMore = Xiktemoui tajkuilolmej archivos. diff --git a/public/locales/be/send.ftl b/public/locales/be/send.ftl new file mode 100644 index 000000000..95d1a6575 --- /dev/null +++ b/public/locales/be/send.ftl @@ -0,0 +1,196 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Імпартаванне... +encryptingFile = Зашыфроўка... +decryptingFile = Расшыфроўка... +downloadCount = + { $num -> + [one] { $num } сцягванне + [few] { $num } сцягванні + *[many] { $num } сцягванняў + } +timespanHours = + { $num -> + [one] { $num } гадзіна + [few] { $num } гадзіны + *[many] { $num } гадзін + } +copiedUrl = Скапіявана! +unlockInputPlaceholder = Пароль +unlockButtonLabel = Разблакаваць +downloadButtonLabel = Сцягнуць +downloadFinish = Сцягванне скончана +fileSizeProgress = ({ $partialSize } з { $totalSize }) +sendYourFilesLink = Паспрабуйце Send +errorPageHeader = Нешта пайшло не так! +fileTooBig = Гэты файл надта вялікі. Ён мусіць быць меншым за { $size } +linkExpiredAlt = Тэрмін дзеяння спасылкі сышоў +notSupportedHeader = Ваш браўзер не падтрымліваецца. +notSupportedLink = Чаму мой браўзер не падтрымліваецца? +notSupportedOutdatedDetail = На жаль, гэтая версія Firefox не падтрымлівае вэб-тэхналогію, што забяспечвае працу Send. Вам трэба абнавіць свой браўзер. +updateFirefox = Абнавіць Firefox +deletePopupCancel = Скасаваць +deleteButtonHover = Выдаліць +footerLinkLegal = Прававыя звесткі +footerLinkPrivacy = Прыватнасць +footerLinkCookies = Кукі +passwordTryAgain = Некарэктны пароль. Паспрабуйце зноў. +javascriptRequired = Для Send неабходны JavaScript +whyJavascript = Чаму для Send неабходны JavaScript? +enableJavascript = Калі ласка, уключыце JavaScript і паспрабуйце зноў. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } г. { $minutes } хв. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } хв. +# A short status message shown when the user enters a long password +maxPasswordLength = Максімальная даўжыня пароля: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Гэты пароль немагчыма паставіць + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Просты і прыватны абмен файламі +introDescription = { -send-brand } дазваляе вам абменьвацца файламі са скразным шыфраваннем і спасылкамі з абмежаваным тэрмінам дзеяння. Такім чынам, вы можаце дзяліцца файламі прыватна і быць упэўненым, што яны не застануцца ў сеціве назаўжды. +notifyUploadEncryptDone = Ваш файл зашыфраваны і гатовы да адпраўкі +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Тэрмін дзеяння сыдзе праз { $downloadCount } або { $timespan } +timespanMinutes = + { $num -> + [one] { $num } хвіліна + [few] { $num } хвіліны + *[many] { $num } хвілін + } +timespanDays = + { $num -> + [one] { $num } дзень + [few] { $num } дні + *[many] { $num } дзён + } +timespanWeeks = + { $num -> + [one] { $num } тыдзень + [few] { $num } тыдні + *[many] { $num } тыдняў + } +fileCount = + { $num -> + [one] { $num } файл + [few] { $num } файлы + *[many] { $num } файлаў + } +# byte abbreviation +bytes = Б +# kibibyte abbreviation +kb = КБ +# mebibyte abbreviation +mb = МБ +# gibibyte abbreviation +gb = ГБ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Агульны памер: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Скапіруйце спасылку, каб падзяліцца сваім файлам: +copyLinkButton = Скапіраваць спасылку +downloadTitle = Сцягнуць файлы +downloadDescription = Гэтым файлам падзяліліся праз { -send-brand } са скразным шыфраваннем і спасылкай з абмежаваным тэрмінам дзеяння. +trySendDescription = Паспрабуйце { -send-brand } для простага і бяспечнага абмену файламі. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Толькі { $count } файл можна загрузіць за раз. + [few] Толькі { $count } файлы можна загрузіць за раз. + *[many] Толькі { $count } файлаў можна загрузіць за раз. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Толькі { $count } архіў дазволены. + [few] Толькі { $count } архівы дазволены. + *[many] Толькі { $count } архіваў дазволена. + } +expiredTitle = Тэрмін дзеяння гэтай спасылкі сышоў. +notSupportedDescription = { -send-brand } не будзе працаваць у гэтым браўзеры. Лепей за ўсё { -send-short-brand } працуе з апошняй версіяй { -firefox } і будзе працаваць з бягучай версіяй большасці браўзераў. +downloadFirefox = Сцягнуць { -firefox } +legalTitle = Палітыка прыватнасці { -send-short-brand } +legalDateStamp = Версія 1.0 ад 12 сакавіка 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } д. { $hours } г. { $minutes } хв. +addFilesButton = Выберыце файлы для загрузкі +trustWarningMessage = Пераканайцеся, што давяраеце атрымальніку, калі дзеліцеся канфідэнцыяльнымі звесткамі. +uploadButton = Загрузіць +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Перацягніце файлы сюды +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = або клікніце, каб адправіць да { $size }: +addPassword = Абараніць паролем +emailPlaceholder = Увядзіце сваю электронную пошту +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Увайдзіце, каб адпраўляць да { $size } +signInOnlyButton = Увайсці +accountBenefitTitle = Стварыце ўліковы запіс { -firefox } або ўвайдзіце +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Дзяліцеся файламі да { $size } +accountBenefitDownloadCount = Дзяліцеся файламі з большай колькасцю людзей +accountBenefitTimeLimit = + { $count -> + [one] Трымайце спасылкі актыўнымі да { $count } дня + [few] Трымайце спасылкі актыўнымі да { $count } дзён + *[many] Трымайце спасылкі актыўнымі да { $count } дзён + } +accountBenefitSync = Кіруйце адпраўленымі файламі з любой прылады +accountBenefitMoz = Даведайцеся пра іншыя сэрвісы { -mozilla } +signOut = Выйсці +okButton = ОК +downloadingTitle = Сцягваецца +noStreamsWarning = Гэты браўзер не мае магчымасці расшыфраваць такі вялікі файл. +noStreamsOptionCopy = Скапіруйце спасылку, каб адкрыць у іншым браўзеры +noStreamsOptionFirefox = Паспрабуйце наш любімы браўзер +noStreamsOptionDownload = Працягнуць з гэтым браўзерам +downloadFirefoxPromo = { -send-short-brand } прыйшоў да вас з цалкам новага { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Падзяліцеся спасылкай на свой файл: +shareLinkButton = Падзяліцца спасылкай +# $name is the name of the file +shareMessage = Сцягніце «{ $name }» з { -send-brand }: простага і бяспечнага файлаабменніка +trailheadPromo = Ёсць спосаб абараніць вашу прыватнасць. Далучайцеся да Firefox. +learnMore = Падрабязней. +downloadFlagged = Гэта спасылка адключана за парушэнне ўмоў прадастаўлення паслуг. +downloadConfirmTitle = Яшчэ адна рэч +downloadConfirmDescription = Пераканайцеся, што давяраеце адпраўніку гэтага файла, бо мы не можам пераканацца, што ён не нашкодзіць Вашай прыладзе. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Я давяраю адпраўніку гэтага файла + [few] Я давяраю адпраўніку гэтых файлаў + *[many] Я давяраю адпраўніку гэтых файлаў + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Паведаміць, што гэты файл падазроныя + [few] Паведаміць, што гэтыя файлы падазроныя + *[many] Паведаміць, што гэтыя файлы падазроныя + } +reportDescription = Дапамажыце нам зразумець, што адбываецца. Як вы лічыце, што не так з гэтымі файламі? +reportUnknownDescription = Калі ласка, перайдзіце да адрасу спасылкі, пра якую хочаце паведаміць, і націсніце “{ reportFile }”. +reportButton = Паведаміць +reportReasonMalware = Гэтыя файлы ўтрымліваюць шкоднасныя праграмы альбо з'яўляюцца часткай фішынг-атакі. +reportReasonPii = Гэтыя файлы ўтрымліваюць асабістую інфармацыю пра мяне. +reportReasonAbuse = Гэтыя файлы ўтрымліваюць незаконнае альбо абразлівае змесціва. +reportReasonCopyright = Каб паведаміць аб парушэнні аўтарскіх правоў або гандлёвых марак, скарыстайцеся алгарытмам, апісаным на гэтай старонцы. +reportedTitle = Пра файлы паведамлена +reportedDescription = Дзякуй. Мы атрымалі Вашу заяву наконт гэтых файлаў. diff --git a/public/locales/bn-BD/send.ftl b/public/locales/bn-BD/send.ftl deleted file mode 100644 index e2f88d0da..000000000 --- a/public/locales/bn-BD/send.ftl +++ /dev/null @@ -1,72 +0,0 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ওয়েব গবেষণা -siteFeedback = প্রতিক্রিয়া -uploadPageHeader = ব্যক্তিগত, এনক্রিপ্ট করা ফাইল শেয়ারিং -uploadPageLearnMore = আরও জানুন -uploadPageBrowseButton = আপনার কম্পিউটারে ফাইল নির্বাচন করুন -uploadPageBrowseButtonTitle = ফাইল আপলোড -importingFile = ইম্পোর্ট হচ্ছে... -verifyingFile = যাচাই হচ্ছে... -encryptingFile = ইনক্রিপট হচ্ছে... -decryptingFile = ডিক্রিপট হচ্ছে... -notifyUploadDone = আপনার আপলোড সম্পন্ন হয়েছে। -uploadingPageCancel = আপলোড বাতিল করুন -uploadCancelNotification = আপনার অাপলোড বাতিল করা হয়েছে। -uploadSuccessConfirmHeader = পাঠানোর জন্য প্রস্তুত -uploadSvgAlt = আপলোড -downloadCount = { $num -> - [one] 1 ডাউনলোড - *[other] { $num } ডাউনলোডগুলো - } -timespanHours = { $num -> - [one] 1 ঘন্টা - *[other] { $num } ঘন্টা - } -copyUrlFormButton = ক্লিপবোর্ডে কপি করুন -copiedUrl = কপি করা হয়েছে! -deleteFileButton = ফাইল মুছুন -sendAnotherFileLink = আরেকটি ফাইল পাঠান -// Alternative text used on the download link/button (indicates an action). -downloadAltText = ডাউনলোড -downloadsFileList = ডাউনলোডগুলো -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = সময় -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = ডাউনলোড { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = পাসওয়ার্ড লিখুন -unlockInputPlaceholder = পাসওয়ার্ড -unlockButtonLabel = আনলক করুন -// Text and title used on the download link/button (indicates an action). -downloadButtonLabel = ডাউনলোড -downloadNotification = আপনার ডাউনলোড সম্পন্ন হয়েছে। -downloadFinish = ডাউনলোড সম্পন্ন -errorAltText = আপালোডে ত্রুটি -errorPageHeader = কোন সমস্যা হয়েছে! -errorPageLink = আরেকটি ফাইল পাঠান -expiredPageHeader = এই লিঙ্কটির মেয়াদ শেষ হয়ে গেছে বা কখনই প্রথম স্থানে নেই! -notSupportedHeader = আপনার ব্রাউজার সমর্থিত নয়। -updateFirefox = Firefox হালনাগাদ করুন -downloadFirefoxButtonSub = বিনামূল্যে ডাউনলোড -uploadedFile = ফাইল -copyFileList = URL অনুলিপি করুন -// expiryFileList is used as a column header -expiryFileList = মেয়াদোত্তীর্ণ তারিখ -deleteFileList = মুছে ফেলুন -nevermindButton = কিছু মনে করবেন না -legalHeader = শর্তাবলী এবং গোপনীয়তা -deletePopupText = ফাইলটি মুছতে চান? -deletePopupYes = হ্যাঁ -deletePopupCancel = বাতিল -deleteButtonHover = মুছে ফেলুন -copyUrlHover = URL অনুলিপি করুন -footerLinkLegal = আইনগত -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot পরিচিতি -footerLinkPrivacy = গোপনীয়তা -footerLinkTerms = শর্তাবলী -footerLinkCookies = কুকি -changePasswordButton = পরিবর্তন diff --git a/public/locales/bn/send.ftl b/public/locales/bn/send.ftl new file mode 100644 index 000000000..35c30c08a --- /dev/null +++ b/public/locales/bn/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = প্রতিক্রিয়া +importingFile = ইম্পোর্ট হচ্ছে... +encryptingFile = ইনক্রিপট হচ্ছে... +decryptingFile = ডিক্রিপট হচ্ছে... +downloadCount = + { $num -> + [one] 1 ডাউনলোড + *[other] { $num } ডাউনলোডগুলো + } +timespanHours = + { $num -> + [one] 1 ঘন্টা + *[other] { $num } ঘন্টা + } +copiedUrl = কপি করা হয়েছে! +unlockInputPlaceholder = পাসওয়ার্ড +unlockButtonLabel = আনলক করুন +downloadButtonLabel = ডাউনলোড +downloadFinish = ডাউনলোড সম্পন্ন +fileSizeProgress = ({ $totalSize } এর { $partialSize }) +sendYourFilesLink = Send পরখ করে দেখুন +errorPageHeader = কোন সমস্যা হয়েছে! +fileTooBig = ফাইলটি আপলোড করার জন্যে খুব বড়। এটি { $size } এর চেয়ে কম হওয়া উচিত। +linkExpiredAlt = লিঙ্ক মেয়াদউত্তীর্ণ হয়েছে +notSupportedHeader = আপনার ব্রাউজার সমর্থিত নয়। +notSupportedLink = আমার ব্রাউজার কেন সমর্থিত নয়? +notSupportedOutdatedDetail = দুর্ভাগ্যবশত Firefox এই সংস্করণটি ওয়েব প্রযুক্তিকে সমর্থন করে না যা Send কে সমর্থন করে। আপনাকে আপনার ব্রাউজারটি আপডেট করতে হবে। +updateFirefox = Firefox হালনাগাদ করুন +deletePopupCancel = বাতিল +deleteButtonHover = মুছে ফেলুন +footerLinkLegal = আইনগত +footerLinkPrivacy = গোপনীয়তা +footerLinkCookies = কুকি +passwordTryAgain = ভুল পাসওয়ার্ড। আবার চেষ্টা করুন। +javascriptRequired = Send এর জাভাস্ক্রিপ্ট প্রয়োজন। +whyJavascript = কেন Send এর জাভাস্ক্রিপ্ট প্রয়োজন? +enableJavascript = জাভাস্ক্রিপ্ট সক্রিয় করুন এবং আবার চেষ্টা করুন। +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ঘ { $minutes }মি +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }মি +# A short status message shown when the user enters a long password +maxPasswordLength = সর্বোচ্চ পাসওয়ার্ড দৈর্ঘ্য:{ $length } +# A short status message shown when there was an error setting the password +passwordSetError = এই পাসওয়ার্ড সেট করা যাবে না + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = প্রেরণ +-firefox = Firefox +-mozilla = Mozilla +introTitle = সহজ, ব্যক্তিগত ফাইল শেয়ার +introDescription = { -send-brand } ফাইল এনক্রিপশন ও স্বয়ংক্রিয়ভাবে মেয়াদ শেষ হবে এমন একটি লিঙ্কের মাধ্যমে শুরু-থেকে-শেষ পর্যন্ত শেয়ার করতে দেয়। একারণে আপনি যা শেয়ার করেন তা গোপন রাখতে এবং আপনার জিনিস চিরদিনের জন্য অনলাইনে থাকবে না তা নিশ্চিত করতে পারেন। +notifyUploadEncryptDone = আপনার ফাইল এনক্রিপ্ট করা হয়েছে এবং প্রেরণ করতে প্রস্তুত +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } বা { $timespan } পরে মেয়াদ শেষ হবে +timespanMinutes = + { $num -> + [one] ১ মিনিট + *[other] { $num } মিনিট + } +timespanDays = + { $num -> + [one] ১ দিন + *[other] { $num } দিন + } +timespanWeeks = + { $num -> + [one] ১ সপ্তাহ + *[other] { $num } সপ্তাহ + } +fileCount = + { $num -> + [one] ১টি ফাইল + *[other] { $num }টি ফাইল + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = মোট আকার: { $size } +# the next line after the colon contains a file name +copyLinkDescription = আপনার ফাইল শেয়ার করতে লিঙ্ক অনুলিপি করুন: +copyLinkButton = লিঙ্ক অনুলিপি +downloadTitle = ফাইল ডাউনলোড +downloadDescription = ফাইলটি { -send-brand } এর মাধ্যমে এনক্রিপশন ও স্বয়ংক্রিয় মেয়াদ শেষ হবে এমন একটি লিঙ্কের মাধ্যমে শুরু-থেকে-শেষ পর্যন্ত শেয়ার করা হয়েছে। +trySendDescription = সহজ ও নিরাপদ ফাইল শেয়ারের জন্য { -send-brand } ব্যবহার করুন। +# count will always be > 10 +tooManyFiles = + { $count -> + [one] একবারে কেবল ১টি ফাইল আপলোড করা যাবে। + *[other] একবারে কেবল { $count }টি ফাইল আপলোড করা যাবে। + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] কেবল ১টি আর্কাইভ অনুমোদিত। + *[other] কেবল { $count } আর্কাইভ অনুমোদিত। + } +expiredTitle = এই লিঙ্কের মেয়াদ শেষ হয়ে গেছে। +notSupportedDescription = { -send-brand } এই ব্রাউজারের সাথে কাজ করবে না। { -firefox } এর সাম্প্রতিকতম সংস্করণে { -send-short-brand } সর্বোত্তমভাবে কাজ করবে, এবং এটি বেশিরভাগ ব্রাউজারের বর্তমান সংস্করণে কাজ করবে। +downloadFirefox = { -firefox } ডাউনলোড করুন +legalTitle = { -send-short-brand } গোপনীয়তা নোটিশ +legalDateStamp = সংস্করণ ১.০, ১২ মার্চ, ২০১৯ তারিখ +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }দি { $hours }ঘ { $minutes }মি +addFilesButton = আপলোডের জন্য ফাইল নির্বাচন করুন +uploadButton = আপলোড +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ফাইল টেনে এনে ছাড়ুন +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = বা সর্বোচ্চ { $size } আকারের ফাইল পাঠাতে ক্লিক করুন +addPassword = পাসওয়ার্ড দ্বারা সুরক্ষিত রাখুন +emailPlaceholder = আপনার ইমেইল দিন +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = সর্বোচ্চ { $size } আকারের ফাইল প্রেরণ করতে সাইন ইন করুন +signInOnlyButton = সাইন ইন +accountBenefitTitle = { -firefox } অ্যাকাউন্ট তৈরি অথবা সাইন ইন করুন +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = সর্বোচ্চ { $size } আকারের ফাইল শেয়ার করুন +accountBenefitDownloadCount = আরও মানুষের সাথে ফাইল শেয়ার করুন +accountBenefitTimeLimit = + { $count -> + [one] ১ দিন পর্যন্ত লিঙ্ক সক্রিয় রাখুন + *[other] { $count } দিন পর্যন্ত লিঙ্ক সক্রিয় রাখুন + } +accountBenefitSync = যেকোন ডিভাইস থেকে শেয়ার করা ফাইল পরিচালনা করুন +accountBenefitMoz = অন্যান্য { -mozilla } সেবা সম্পর্কে জানুন +signOut = সাইন আউট +okButton = ঠিক আছে +downloadingTitle = ডাউনলোড হচ্ছে +noStreamsWarning = এই ব্রাউজার এতো বড় একটি ফাইল ডিক্রিপ্ট করতে সক্ষম নয়। +noStreamsOptionCopy = অন্য ব্রাউজারে খুলতে লিঙ্ক অনুলিপি করুন +noStreamsOptionFirefox = আমাদের জনপ্রিয় ব্রাউজার ব্যবহার করুন +noStreamsOptionDownload = এই ব্রাউজার ব্যবহার অব্যহত রাখুন +downloadFirefoxPromo = { -send-short-brand } আপনারদের জন্য নিয়ে এসেছে একেবারে নতুন { -firefox }। +# the next line after the colon contains a file name +shareLinkDescription = আপনার ফাইলে লিঙ্ক শেয়ার করুন: +shareLinkButton = লিঙ্ক শেয়ার করুন +# $name is the name of the file +shareMessage = { -send-brand } এর মাধ্যমে "{ $name }" ডাউনলোড করুন: সরল, নিরাপদ ফাইল শেয়ারিং +trailheadPromo = আপনার গোপনীয়তা রক্ষা করার একটি উপায় আছে। Firefox এ যোগ দিন। +learnMore = আরও জানুন। diff --git a/public/locales/br/send.ftl b/public/locales/br/send.ftl new file mode 100644 index 000000000..a2524ad27 --- /dev/null +++ b/public/locales/br/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Oc'h enporzhiañ … +encryptingFile = Oc'h enrinegañ.. +decryptingFile = Oc'h ezrinegañ... +downloadCount = + { $num -> + [one] { $num } bellgargadenn + [two] { $num } bellgargadenn + [few] { $num } fellgargadenn + [many] { $num } a bellgargadennoù + *[other] { $num } pellgargadenn + } +timespanHours = + { $num -> + [one] { $num } eur + [two] { $num } eur + [few] { $num } eur + [many] { $num } a eurioù + *[other] { $num } eur + } +copiedUrl = Eilet! +unlockInputPlaceholder = Ger-tremen +unlockButtonLabel = Dibrennañ +downloadButtonLabel = Pellgargañ +downloadFinish = Pellgargadur echu +fileSizeProgress = ({ $partialSize } war { $totalSize }) +sendYourFilesLink = Esaeit Send +errorPageHeader = Degouezhet ez eus bet ur fazi! +fileTooBig = Re vras eo ar restr-mañ evit e pellgas. Rankout a ra bezañ nebeutoc'h eget { $size } +linkExpiredAlt = Ere diamzeret +notSupportedHeader = N'eo ket skoret ho merdeer. +notSupportedLink = Perak n'eo ket skoret ma merdeer? +notSupportedOutdatedDetail = Siwazh n'eo ket skoret ar c'halvezerezhioù implijet evit Send gant an handelv-mañ eus Firefox. Ret e vo deoc'h hizivaat ho merdeer. +updateFirefox = Hizivaat Firefox +deletePopupCancel = Nullañ +deleteButtonHover = Dilemel +footerLinkLegal = Lezennel +footerLinkPrivacy = Buhez prevez +footerLinkCookies = Toupinoù +passwordTryAgain = Ger-tremen direizh. Klaskit en-dro. +javascriptRequired = Send a azgoulenn Javascript +whyJavascript = Perak e azgoulenn Send Javascript? +enableJavascript = Gweredekait Javascript ha klaskit en-dro. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }e { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Hirder brasañ aotreet evit ar ger-tremen: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = N'haller ket despizañ ar ger-tremen + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Rannañ restroù en un doare eeun ha prevez +introDescription = A-drugarez da { -send-brand } a c'hallit rannañ restroù gant un enrinegañ penn-ouzh-penn hag un ere a ziamzero ent emgefreek. Evel-se e c'hallit mirout ar pezh a rannit prevez ha bezañ sur ne chomo ket ho traoù enlinenn da viken. +notifyUploadEncryptDone = Enrineget eo ho restr ha prest eo da vezañ kaset +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Diamzeriñ a raio goude { $downloadCount } pe { $timespan } +timespanMinutes = + { $num -> + [one] { $num } vunutenn + [two] { $num } vunutenn + [few] { $num } munutenn + [many] { $num } a vunutennoù + *[other] { $num } munutenn + } +timespanDays = + { $num -> + [one] { $num } devezh + [two] { $num } zevezh + [few] { $num } devezh + [many] { $num } a zevezhioù + *[other] { $num } devezh + } +timespanWeeks = + { $num -> + [one] { $num } sizhun + [two] { $num } sizhun + [few] { $num } sizhun + [many] { $num } a sizhunioù + *[other] { $num } sizhun + } +fileCount = + { $num -> + [one] { $num } restr + [two] { $num } restr + [few] { $num } restr + [many] { $num } a restroù + *[other] { $num } restr + } +# byte abbreviation +bytes = e +# kibibyte abbreviation +kb = Ke +# mebibyte abbreviation +mb = Me +# gibibyte abbreviation +gb = Ge +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ment hollek: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Eilit an ere evit rannañ ho restr +copyLinkButton = Eilañ an ere +downloadTitle = Pellgargañ ar restroù +downloadDescription = Dre { -send-brand } eo bet rannet ar restr-mañ, gant un enrinegañ penn-ouzh-penn hag un ere a ziamzer ent emgefreek. +trySendDescription = Esaeit { -send-brand } evit rannañ restroù en un doare eeun ha prevez. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] N'haller pellgas nemet { $count } restr er memes mare. + [two] N'haller pellgas nemet { $count } restr er memes mare. + [few] N'haller pellgas nemet { $count } restr er memes mare. + [many] N'haller pellgas nemet { $count } a restroù er memes mare. + *[other] N'haller pellgas nemet { $count } restr er memes mare. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Aotreet eo{ $count } diell nemetken. + [two] Aotreet eo{ $count } ziell nemetken. + [few] Aotreet eo{ $count } diell nemetken. + [many] Aotreet eo{ $count } a zielloù nemetken. + *[other] Aotreet eo{ $count } diell nemetken. + } +expiredTitle = Diamzeret eo an ere. +notSupportedDescription = { -send-brand } n'aio ket en-dro war ar merdeer-mañ. { -send-short-brand } a za en-dro gwelloc'h gant handelv diwezhañ { -firefox }, ha mont a raio en-dro gant handelv bremanel lodenn vrasañ ar merdeerioù. +downloadFirefox = Pellgargañ { -firefox } +legalTitle = Evezhiadenn a fed buhez prevez { -send-short-brand } +legalDateStamp = Handelv 1.0, d'an 12 a viz Meurzh 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }e { $minutes }m +addFilesButton = Diuzit ur restr da bellgas +trustWarningMessage = Bezit sur ho peus fiziañs en ho tegemerer pa rannit roadennoù kizidik. +uploadButton = Pellgas +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Riklit ha laoskit restroù +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = pe klikit evit kas betek { $size } +addPassword = Gwareziñ gant ur ger-tremen +emailPlaceholder = Enankit ho chomlec'h postel +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kennaskit evit kas betek { $size } +signInOnlyButton = Kennaskañ +accountBenefitTitle = Krouit ur gont { -firefox } pe kennaskit +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Rannit restroù betek { $size } +accountBenefitDownloadCount = Rannit restroù gant muioc'h a dud +accountBenefitTimeLimit = + { $count -> + [one] Dalc'hit an ereoù oberiant e-pad { $count } devezh + [two] Dalc'hit an ereoù oberiant e-pad { $count } zevezh + [few] Dalc'hit an ereoù oberiant e-pad { $count } devezh + [many] Dalc'hit an ereoù oberiant e-pad { $count } a zevezhioù + *[other] Dalc'hit an ereoù oberiant e-pad { $count } devezh + } +accountBenefitSync = Merit ar restroù rannet gant forzh peseurt trevnad +accountBenefitMoz = Gouzout hiroc'h a-zivout gwazerezhioù all { -mozilla } +signOut = Digennaskañ +okButton = Mat eo +downloadingTitle = O pellgargañ +noStreamsWarning = Posupl eo ne vefe ket gouest ar merdeer-mañ da ezrinegañ ur restr ken bras. +noStreamsOptionCopy = Eilit an ere evit digeriñ anezhañ en ur merdeer all +noStreamsOptionFirefox = Esaeit hor merdeer karetañ +noStreamsOptionDownload = Kenderc'hel gant ar merdeer-mañ +downloadFirefoxPromo = { -send-short-brand } a zo kinniget deoc'h gant ar { -firefox } nevez-flamm. +# the next line after the colon contains a file name +shareLinkDescription = Rannit an ere etrezek ho restr: +shareLinkButton = Rannañ an ere +# $name is the name of the file +shareMessage = Pellgargañ "{ $name }" gant { -send-brand }: rannañ restroù en un doare eeun ha prevez +trailheadPromo = Un doare a zo da wareziñ ho puhez prevez. Tremenit da Firefox. +learnMore = Gouzout hiroc'h. +downloadFlagged = Diweredekaet eo bet an ere-se dre ma ne zouje ket ouzh an divizoù arver. +downloadConfirmTitle = Un draig ouzhpenn +downloadConfirmDescription = Bezit sur ho peus fiziañs en deus en deus kaset ar restr-mañ dre ma n'haller ket gwiriañ ne freuzo ket ho trevnad. diff --git a/public/locales/bs/send.ftl b/public/locales/bs/send.ftl index 342fd0957..fe0918646 100644 --- a/public/locales/bs/send.ftl +++ b/public/locales/bs/send.ftl @@ -1,5 +1,5 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send +# Send is a brand name and should not be localized. +title = Send siteSubtitle = web eksperiment siteFeedback = Povratne informacije uploadPageHeader = Privatno, šifrovano dijeljenje datoteka @@ -26,12 +26,14 @@ uploadSuccessConfirmHeader = Spremno za slanje uploadSvgAlt = Otpremi uploadSuccessTimingHeader = Veza prema vašoj datoteci će isteći nakon prvog preuzimanja ili za 24 sata. expireInfo = Link za vašu datoteku će isteći nakon { $downloadCount } ili { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 preuzimanja [few] { $num } preuzimanja *[other] { $num } preuzimanja } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 sat [few] { $num } sata *[other] { $num } sati @@ -41,30 +43,30 @@ copyUrlFormButton = Kopiraj u međuspremnik copiedUrl = Kopirano! deleteFileButton = Izbriši datoteku sendAnotherFileLink = Pošalji drugu datoteku -// Alternative text used on the download link/button (indicates an action). +# Alternative text used on the download link/button (indicates an action). downloadAltText = Preuzmi downloadsFileList = Preuzimanja -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") +# Used as header in a column indicating the amount of time left before a +# download link expires (e.g. "10h 5m") timeFileList = Vrijeme -// Used as header in a column indicating the number of times a file has been -// downloaded +# Used as header in a column indicating the number of times a file has been +# downloaded downloadFileName = Preuzmi { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Unesite lozinku unlockInputPlaceholder = Lozinka unlockButtonLabel = Otključaj downloadFileTitle = Preuzmi šifrovanu datoteku -// Firefox Send is a brand name and should not be localized. -downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Firefox Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu. -// Text and title used on the download link/button (indicates an action). +# Send is a brand name and should not be localized. +downloadMessage = Vaš prijatelj vam je poslao datoteku preko usluge Send koja vam omogućava da dijelite datoteke preko sigurne, privatne i šifrovane veze koja samostalno ističe da vaše stvari ne ostanu zauvijek na internetu. +# Text and title used on the download link/button (indicates an action). downloadButtonLabel = Preuzmi downloadNotification = Vaše preuzimanje je završeno. downloadFinish = Preuzimanje završeno -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } od { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Probajte Firefox Send +# Send is a brand name and should not be localized. +sendYourFilesLink = Probajte Send downloadingPageProgress = Preuzimanje { $filename } ({ $size }) downloadingPageMessage = Ostavite ovaj tab otvorenim dok ne dobavimo vašu datoteku i dok je ne dešifrujemo. errorAltText = Greška pri otpremanju @@ -75,28 +77,28 @@ fileTooBig = Ta datoteka je prevelika za otpremanje. Treba biti manja od { $size linkExpiredAlt = Veza istekla expiredPageHeader = Veza je istekla ili nikad nije postojala! notSupportedHeader = Vaš pretraživač nije podržan. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Firefox Send. Trebate probati drugi pretraživač. Preporučujemo Firefox! +# Send is a brand name and should not be localized. +notSupportedDetail = Ovaj pretraživač nažalost ne podržava web tehnologiju koja omogućava Send. Trebate probati drugi pretraživač. Preporučujemo Firefox! notSupportedLink = Zašto moj pretraživač nije podržan? -notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Firefox Send. Morate ažurirati vaš pretraživač. +notSupportedOutdatedDetail = Nažalost ova verzija Firefoxa ne podržava web tehnologiju koja omogućava Send. Morate ažurirati vaš pretraživač. updateFirefox = Ažuriraj Firefox downloadFirefoxButtonSub = Besplatno preuzimanje uploadedFile = Datoteka copyFileList = Kopiraj URL -// expiryFileList is used as a column header +# expiryFileList is used as a column header expiryFileList = Ističe za deleteFileList = Izbriši nevermindButton = Zanemari legalHeader = Uslovi i privatnost -legalNoticeTestPilot = Firefox Send je trenutno Test Pilot eksperiment i podržan je uslovima korištenja i obavještenjem o privatnosti. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka ovdje. -legalNoticeMozilla = Korištenje Firefox Send web stranice podlaže Mozillinom obavještenju o privatnosti na web stranicama i uslovima korištenja web stranica. +legalNoticeTestPilot = Send je trenutno Test Pilot eksperiment i podržan je uslovima korištenja i obavještenjem o privatnosti. Možete saznati više o ovom eksperimentu i o njegovom sakupljanju podataka ovdje. +legalNoticeMozilla = Korištenje Send web stranice podlaže Mozillinom obavještenju o privatnosti na web stranicama i uslovima korištenja web stranica. deletePopupText = Izbrisati ovu datoteku? deletePopupYes = Da deletePopupCancel = Otkaži deleteButtonHover = Izbriši copyUrlHover = Kopiraj URL footerLinkLegal = Pravno -// Test Pilot is a proper name and should not be localized. +# Test Pilot is a proper name and should not be localized. footerLinkAbout = O Test Pilotu footerLinkPrivacy = Privatnost footerLinkTerms = Uslovi @@ -105,13 +107,17 @@ requirePasswordCheckbox = Zahtjevaj lozinku za preuzimanje ove datoteke addPasswordButton = Dodaj lozinku changePasswordButton = Promijeni passwordTryAgain = Netačna lozinka. Pokušajte ponovo. -// This label is followed by the password needed to download a file -passwordResult = Lozinka: { $password } reportIPInfringement = Prijavite IP prekršaj -javascriptRequired = Firefox Send zahtjeva JavaScript -whyJavascript = Zašto Firefox Send zahtjeva JavaScript? +javascriptRequired = Send zahtjeva JavaScript +whyJavascript = Zašto Send zahtjeva JavaScript? enableJavascript = Molimo omogućite JavaScript i pokušajte ponovo. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when a password is successfully set +passwordIsSet = Lozinka postavljena +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna veličina lozinke: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ova lozinka se ne može postaviti diff --git a/public/locales/ca/send.ftl b/public/locales/ca/send.ftl index 1888b5bb6..099e59a8b 100644 --- a/public/locales/ca/send.ftl +++ b/public/locales/ca/send.ftl @@ -1,101 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experiment web -siteFeedback = Comentaris -uploadPageHeader = Compartició de fitxers privada i xifrada -uploadPageExplainer = Envieu fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre. -uploadPageLearnMore = Més informació -uploadPageDropMessage = Arrossegueu el fitxer aquí per començar a pujar-lo -uploadPageSizeMessage = Funciona millor quan els fitxers tenen menys d'1 GB -uploadPageBrowseButton = Trieu un fitxer de l'ordinador -uploadPageBrowseButton1 = Seleccioneu el fitxer que voleu pujar -uploadPageMultipleFilesAlert = Actualment no es permet pujar diversos fitxers ni una carpeta. -uploadPageBrowseButtonTitle = Puja el fitxer -uploadingPageProgress = S'està pujant { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = S'està important… -verifyingFile = S'està verificant… encryptingFile = S'està xifrant… decryptingFile = S'està desxifrant… -notifyUploadDone = La pujada ha acabat. -uploadingPageMessage = Quan s'hagi acabat de pujat el fitxer, podreu definir les opcions de caducitat. -uploadingPageCancel = Cancel·la la pujada -uploadCancelNotification = La pujada s'ha cancel·lat. -uploadingPageLargeFileMessage = Aquest fitxer és gros i pot trigar una estona a pujar. Espereu assegut… -uploadingFileNotification = Notifica'm quan s'acabi de pujar. -uploadSuccessConfirmHeader = Llest per enviar -uploadSvgAlt = Puja -uploadSuccessTimingHeader = L'enllaç al fitxer caducarà quan es baixi una vegada o d'aquí 24 hores. -expireInfo = L'enllaç al fitxer caducarà en fer { $downloadCount } o d'aquí { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 baixada *[other] { $num } baixades } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hora *[other] { $num } hores } -copyUrlFormLabelWithName = Copieu l'enllaç i compartiu-lo per enviar el fitxer: { $filename } -copyUrlFormButton = Copia al porta-retalls copiedUrl = Copiat! -deleteFileButton = Suprimeix el fitxer -sendAnotherFileLink = Envieu un altre fitxer -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Baixa -downloadFileName = Baixeu { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introduïu la contrasenya unlockInputPlaceholder = Contrasenya unlockButtonLabel = Desbloca -downloadFileTitle = Baixa el fitxer xifrat -// Firefox Send is a brand name and should not be localized. -downloadMessage = Un amic us ha enviat un fitxer amb el Firefox Send, un servei que permet compartir fitxers mitjançant un enllaç segur, privat i xifrat que caduca automàticament per tal que les vostres dades no es conservin a Internet per sempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Baixa -downloadNotification = La baixada ha acabat. downloadFinish = Ha acabat la baixada -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Proveu el Firefox Send -downloadingPageProgress = S'està baixant { $filename } ({ $size }) -downloadingPageMessage = Deixeu aquesta pestanya oberta per tal que el fitxer es pugui baixar i desxifrar. -errorAltText = S'ha produït un error en pujar +sendYourFilesLink = Proveu el Send errorPageHeader = Hi ha hagut un problema -errorPageMessage = S'ha produït un error en pujar el fitxer. -errorPageLink = Envieu un altre fitxer fileTooBig = Aquest fitxer és massa gros per pujar-lo. Ha de tenir menys de { $size }. linkExpiredAlt = L'enllaç ha caducat -expiredPageHeader = Aquest enllaç ha caducat o no existeix. notSupportedHeader = El vostre navegador no és compatible. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Aquest navegador no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'utilitzar un altre navegador. Us recomanem el Firefox! notSupportedLink = Per què el meu navegador no és compatible? -notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Firefox Send. Haureu d'actualitzar el navegador. +notSupportedOutdatedDetail = Aquesta versió del Firefox no admet la tecnologia web amb què funciona el Send. Haureu d'actualitzar el navegador. updateFirefox = Actualitza el Firefox -downloadFirefoxButtonSub = Baixada gratuïta -uploadedFile = Fitxer -copyFileList = Copia l'URL -// expiryFileList is used as a column header -expiryFileList = Caduca d'aquí -deleteFileList = Suprimeix -nevermindButton = No, gràcies -legalHeader = Condicions d'ús i privadesa -legalNoticeTestPilot = Actualment el Firefox Send és un experiment del Test Pilot i està subjecte a les Condicions del servei i a l'Avís de privadesa del Test Pilot. Podeu obtenir més informació sobre aquest experiment i la recollida de dades aquí. -legalNoticeMozilla = L'ús del Firefox Send també està subjecte a l'Avís de privadesa de llocs web i a les Condicions d'ús de llocs web de Mozilla. -deletePopupText = Voleu suprimir aquest fitxer? -deletePopupYes = Sí deletePopupCancel = Cancel·la deleteButtonHover = Suprimeix -copyUrlHover = Copia l'URL footerLinkLegal = Avís legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Quant al Test Pilot footerLinkPrivacy = Privadesa -footerLinkTerms = Condicions d'ús footerLinkCookies = Galetes -requirePasswordCheckbox = Sol·licita una contrasenya per baixar aquest fitxer -addPasswordButton = Afegeix una contrasenya passwordTryAgain = La contrasenya és incorrecta. Torneu-ho a provar. -// This label is followed by the password needed to download a file -passwordResult = Contrasenya: { $password } -reportIPInfringement = Denuncieu una infracció de propietat intel·lectual +javascriptRequired = El Send necessita JavaScript +whyJavascript = Per què el Send necessita JavaScript? +enableJavascript = Activeu el JavaScript i torneu-ho a provar. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud màxima de la contrasenya: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No s'ha pogut definir la contrasenya + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartició de fitxers senzilla i privada +introDescription = El { -send-brand } permet compartir fitxers amb xifratge d'extrem a extrem mitjançant un enllaç que caduca automàticament. Per tant, us assegureu que tot allò que compartiu és privat i que no es mantindrà a Internet per sempre. +notifyUploadEncryptDone = El fitxer s'ha xifrat i està llest per enviar-se +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca després de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + *[other] { $num } minuts + } +timespanDays = + { $num -> + [one] 1 dia + *[other] { $num } dies + } +timespanWeeks = + { $num -> + [one] 1 setmana + *[other] { $num } setmanes + } +fileCount = + { $num -> + [one] 1 fitxer + *[other] { $num } fitxers + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Mida total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copieu l'enllaç per compartir el fitxer: +copyLinkButton = Copia l'enllaç +downloadTitle = Baixa els fitxers +downloadDescription = Aquest fitxer s'ha compartit mitjançant el { -send-brand } amb xifratge d'extrem a extrem i un enllaç que caduca automàticament. +trySendDescription = Proveu el { -send-brand } per compartir fitxers de forma senzilla i privada. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Només es pot pujar 1 fitxer alhora. + *[other] Només es poden pujar { $count } fitxers alhora. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Només es permet 1 fitxer. + *[other] Només es permeten { $count } fitxers. + } +expiredTitle = Aquest enllaç ha caducat. +notSupportedDescription = El { -send-brand } no funcionarà amb aquest navegador. El { -send-short-brand } funciona millor amb l'última versió del { -firefox } i funcionarà amb la versió més recent de la majoria de navegadors. +downloadFirefox = Baixa el { -firefox } +legalTitle = Avís de privadesa del { -send-short-brand } +legalDateStamp = Versió 1.0, amb data del 12 de març de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min +addFilesButton = Seleccioneu els fitxers que voleu pujar +trustWarningMessage = Assegureu-vos que confieu en el destinatari quan compartiu dades confidencials. +uploadButton = Puja +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrossegueu i deixeu anar els fitxers +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o feu clic aquí per enviar fins a { $size } +addPassword = Protegeix amb contrasenya +emailPlaceholder = Introduïu la vostra adreça electrònica +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Inicieu la sessió per enviar fins a { $size } +signInOnlyButton = Inicia la sessió +accountBenefitTitle = Creeu un compte del { -firefox } o inicieu la sessió +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartiu fitxers fins a { $size } +accountBenefitDownloadCount = Compartiu fitxers amb més persones +accountBenefitTimeLimit = + { $count -> + [one] Manteniu els enllaços actius fins a 1 dia + *[other] Manteniu els enllaços actius fins a { $count } dies + } +accountBenefitSync = Gestioneu els fitxers compartits des de qualsevol dispositiu +accountBenefitMoz = Descobriu els altres serveis de { -mozilla } +signOut = Tanca la sessió +okButton = D'acord +downloadingTitle = S'està baixant +noStreamsWarning = Pot ser que aquest navegador no pugui desxifrar un fitxer tan gran. +noStreamsOptionCopy = Copieu l'enllaç per obrir-lo en un altre navegador +noStreamsOptionFirefox = Proveu el nostre navegador preferit +noStreamsOptionDownload = Segueix amb aquest navegador +downloadFirefoxPromo = El nou { -firefox } us ofereix el { -send-short-brand } +# the next line after the colon contains a file name +shareLinkDescription = Compartiu l'enllaç al vostre fitxer: +shareLinkButton = Comparteix l'enllaç +# $name is the name of the file +shareMessage = Baixeu «{ $name }» amb el { -send-brand }: compartició de fitxers senzilla i segura +trailheadPromo = Hi ha una manera de protegir la vostra privadesa. Uniu-vos al Firefox. +learnMore = Més informació. +downloadFlagged = Aquest enllaç s'ha desactivat per infringir les condicions del servei. +downloadConfirmTitle = Una cosa més +downloadConfirmDescription = Assegureu-vos que confieu en la persona que us ha enviat aquest fitxer, perquè nosaltres no podem verificar que no malmeti el vostre dispositiu. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Confio en la persona que ha enviat aquest fitxer + *[other] Confio en la persona que ha enviat aquests fitxers + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Informa que aquest fitxer és sospitós + *[other] Informa que aquests fitxers són sospitos + } +reportDescription = Ajudeu-nos a entendre què passa. Quin problema creieu que tenen aquests fitxers? +reportUnknownDescription = Aneu a l'URL de l'enllaç sobre el qual voleu informar i feu clic a «{ reportFile }». +reportButton = Informa +reportReasonMalware = Aquests fitxers contenen programari maliciós o formen part d'un atac de pesca electrònica. +reportReasonPii = Aquests fitxers contenen informació d'identificació personal meva. +reportReasonAbuse = Aquests fitxers inclouen contingut il·legal o abusiu. +reportReasonCopyright = Per informar sobre una infracció de drets d’autor o de marca comercial, utilitzeu el procés descrit en aquesta pàgina. +reportedTitle = S'ha informat d'aquests fitxers +reportedDescription = Gràcies. Hem rebut el vostre informe sobre aquests fitxers. diff --git a/public/locales/cak/send.ftl b/public/locales/cak/send.ftl index 201562f53..0d9fd6470 100644 --- a/public/locales/cak/send.ftl +++ b/public/locales/cak/send.ftl @@ -1,115 +1,155 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ajk'amaya'l solna'onem +# Send is a brand name and should not be localized. +title = Send siteFeedback = Rutzijol -uploadPageHeader = Kekomonïx Ichinan chuqa' Ewan Kisik'ixik taq Yakb'äl -uploadPageExplainer = Ketaq taq yakb'äl rik'in jun ewan rusik'ixik, ichinan chuqa' jikon ximonel, ri ruyonil xtikis ruq'ijul richin ke ri' ri taq atzij man e okel ta pa k'amaya'l junelïk. -uploadPageLearnMore = Tetamäx ch'aqa' chik -uploadPageDropMessage = Tajik'a' pe ri ayakb'al wawe' richin nachäp kijotob'axik -uploadPageSizeMessage = Richin chi ütz nel ri samaj, k'o ta chi ri yakb'äl man tik'o chi re ri 1GB -uploadPageBrowseButton = Tacha' jun yakb'äl pan akematz'ib' -uploadPageBrowseButton1 = Tacha' jun yakb'äl richin najotob'a' -uploadPageMultipleFilesAlert = K'a man nuk'öch ta nijotob'äx jalajöj yakb'äl o jun molwuj. -uploadPageBrowseButtonTitle = Tijotob'äx yakb'äl -uploadingPageProgress = Tajin nijotob'äx { $filename } ({ $size }) importingFile = Tajin nijik… -verifyingFile = Tajin nijikib'äx... -encryptingFile = Tajin newäx rusik'ixik... +encryptingFile = Tajin newäx rusik'ixik… decryptingFile = Tajin netamäx rusik'ixik... -notifyUploadDone = Xak'is rujotob'axik. -uploadingPageMessage = Toq xtijotob'äx ri yakb'äl xkatikïr xtak'ëx pa taq cha'oj ri ruq'ijul xtik'is. -uploadingPageCancel = Tiq'at jotob'anïk -uploadCancelNotification = Xq'at ri ajotob'anik -uploadingPageLargeFileMessage = Yalan nïm re yakb'äl re' ruma ri' toq xtiyoke' richin xtijote'. ¡Man tik'o ak'u'x! -uploadingFileNotification = Tiya' pe rutzijol chwe toq xtitz'aqät rujotob'axik. -uploadSuccessConfirmHeader = Ütz chik richin Nitaq -uploadSvgAlt = Tijotob'äx -uploadSuccessTimingHeader = Ri ruximonel yakb'äl xtik'is ruq'ijul toq xtiqasäx jumul o pa 24 ramaj. -expireInfo = Ri ruximöy ayakb'al xtik'is ruq'ijul chi rij ri { $downloadCount } o { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 qasanïk *[other] { $num } taq qasanïk } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 ramaj *[other] { $num } taq ramaj } -copyUrlFormLabelWithName = Tiwachib'ëx chuqa' tikomonïx ri ximonel richin nitaq ri ayakb'äl: { $filename } -copyUrlFormButton = Tiwachib'ëx pa molwuj copiedUrl = ¡Xwachib'ëx! -deleteFileButton = Tiyuj yakb'äl -sendAnotherFileLink = Titaq jun chik yakb'äl -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Tiqasäx -downloadsFileList = Taq qasanïk -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Q'ijul -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Tiqasäx { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Titz'ib'äx Ewan Tzij unlockInputPlaceholder = Ewan tzij unlockButtonLabel = Titzij chik -downloadFileTitle = Tiqasäx Yakb'äl Ewan Rusik'ixik -// Firefox Send is a brand name and should not be localized. -downloadMessage = Jun awachib'il xutäq jun yakb'äl chawe rik'in ri Firefox Send, jun samaj ri nuya' q'ij chawe ye'akomonij taq yakb'äl rik'in jun jikïl, ichinan chuqa' ewan rusik'ixik ximonel, ri nik'is ruq'ijul pa ruyonil richin chi ri taq awachinaq man junelïk ta e okel pa k'amab'ey. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Tiqasäx -downloadNotification = Xtz'aqät ri aqasanik. downloadFinish = Xtz'aqät qasanïk -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } richin { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Titojtob'ëx Firefox Send -downloadingPageProgress = Tajin niqasäx { $filename } ({ $size }) -downloadingPageMessage = Tijaq kan re ruwi' re' richin niqaqasaj ri yakb'äl chuqa' richin niqetamaj rusik'ixik. -errorAltText = Xsach toq nijotob'äx +sendYourFilesLink = Titojtob'ëx Send errorPageHeader = ¡K'o ri man ütz ta xub'än! -errorPageMessage = Xk'ulwachitäj jun sachoj toq tajin nijotob'äx ri yakb'äl. -errorPageLink = Titaq jun chik yakb'äl fileTooBig = Yalan nïm re yakb'äl re' richin nijotob'äx. K'o ta chi man nik'o ta chi re ri { $size }. linkExpiredAlt = Xk'is ruq'ijul ri ximonel -expiredPageHeader = ¡Xk'is ruq'ijul re ximonel re' o rik'in jub'a' majub'ey xk'oje'! notSupportedHeader = Man koch'el ta ri awokik'amaya'l. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = K'ayew ruma re okik'amaya'l re' man nuköch' ta ajk'amaya'l na'ob'äl nik'atzin chi re ri Firefox Send. K'o chi natojtob'ej jun chik okik'amaya'l. ¡Niqachilab'ej chawe ri Firefox! notSupportedLink = ¿Achike ruma man nikoch' taq ri wokik'amaya'l? -notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Firefox Send. Rajowaxik nak'ëx ri awokik'amaya'l. +notSupportedOutdatedDetail = K'ayew ruma re ruwäch Firefox re' man nuköch' ta ri ajk'amaya'l na'ob'äl nrajo' ri Send. Rajowaxik nak'ëx ri awokik'amaya'l. updateFirefox = Tik'ex ri Firefox -downloadFirefoxButtonSub = Sipan Ruqasaxik -uploadedFile = Yakb'äl -copyFileList = Tiwachib'ëx URL -// expiryFileList is used as a column header -expiryFileList = Nik'is Ruq'ijul Pa -deleteFileList = Tiyuj -nevermindButton = Junam nub'än -legalHeader = Ojqanem chuqa' Ichinanem -legalNoticeTestPilot = Firefox Send k'a jun rutojtob'enik Test Pilot, chuqa' rutaqen rutzij ri Rojqanem Samaj chuqa' rik'in ri Rutzijol Ichinanem. Yatikïr nawetamaj ch'aq'a' chik chi rij re solna'oj re' chuqa' ri rumolik tzij wawe'. -legalNoticeMozilla = Richin nokisäx ri ruxaq ruk'amaya'l Firefox Send k'o chi nitaqëx ri Rutzijol Richinanem Ajk'amaya'l Ruxaq chuqa' Rojqanem rokisaxik Ajk'amaya'l Ruxaq. -deletePopupText = ¿La niyuj el re yakb'äl re'? -deletePopupYes = Ja' deletePopupCancel = Tiq'at deleteButtonHover = Tiyuj -copyUrlHover = Tiwachib'ëx URL footerLinkLegal = Taqanel tzijol -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Chi rij Test Pilot footerLinkPrivacy = Ichinanem -footerLinkTerms = Taq ojqanem footerLinkCookies = Taq kaxlanwey -requirePasswordCheckbox = Tik'utüx jun ewan tzij richin niqasäx re yakb'äl re' -addPasswordButton = Titz'aqatisäx Ewan Tzij -changePasswordButton = Tijalwachïx passwordTryAgain = Itzel ri ewan tzij. Tatojtob'ej chik. -// This label is followed by the password needed to download a file -passwordResult = Ewan tzij: { $password } -reportIPInfringement = Tiya' rutzijol ri Ritzelanik Ajna'oj Ichinil -javascriptRequired = K'atzinel JavaScript chi re ri Firefox Send -whyJavascript = +javascriptRequired = K'atzinel JavaScript chi re ri Send +whyJavascript = ¿Achike ruma toq ri Send nrajo' JavaScript? enableJavascript = Titz'ij JavaScript richin nitojtob'ëx chik. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }r { $minutes }ch -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }ch +# A short status message shown when the user enters a long password +maxPasswordLength = Nïm raqän ewan tzij: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Man tikirel ta ninuk' re ewan tzij re' + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Titaq +-firefox = Firefox +-mozilla = Mozilla +introTitle = Kijunamaxik relik chuqa' ichinan yakb'äl +introDescription = { -send-brand } nuya' q'ij chawe ye'akomonij taq yakb'äl ri ewan kisik'ixik chijun chuqa' jun ximonel ri nik'is ruq'ijul pa ruyonil. Ke ri' nawichinaj ronojel ri nakomonij chuqa' yajike' chi ronojel ri taq awachinaq man jumul ta kek'oje' pa k'amab'ey. +notifyUploadEncryptDone = Ewan chik rusik'ixik ri ayakb'al chuqa' ütz chik richin nitaq +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Nik'is ruq'ij chi rij { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 ch'utiramaj + *[other] { $num } taq ch'utiramaj + } +timespanDays = + { $num -> + [one] 1 q'ij + *[other] { $num } taq q'ij + } +timespanWeeks = + { $num -> + [one] 1 wuqq'ij + *[other] { $num } taq wuqq'ij + } +fileCount = + { $num -> + [one] 1 yakb'äl + *[other] { $num } taq yakb'äl + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ronojel runimilem: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Tawachib'ej ri ximonel richin nakomonij ri ayakb'al: +copyLinkButton = Tiwachib'ëx ximonel +downloadTitle = Keqasäx taq yakb'äl +downloadDescription = Xkomonïx re yakb'äl re' pa { -send-brand } rik'in chijun ewan rusik'ixik chuqa' nik'is ruq'ijul pa ruyonil. +trySendDescription = Tatojtob'ej { -send-brand } richin chanin chuqa' jikïl ye'akomonij taq yakb'äl. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Xa xe 1 yakb'äl tikirel nijotob'äx pa ri ramaj. + *[other] Xa xe { $count } taq yakb'äl tikirel yejotob'äx pa ri ramaj. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Xa xe 1 yakb'äl niya' q'ij chi re. + *[other] Xa xe { $count } taq yakb'äl niya' q'ij chi ke. + } +expiredTitle = Xk'is yan ruq'ij re ximonel re'. +notSupportedDescription = Man xtisamäj ta ri { -send-brand } rik'in re okik'amaya'l re'. Nisamäj ütz ri { -send-short-brand } rik'in ri ruk'isib'äl ruwäch { -firefox }, chuqa' xtisamäj rik'in ri ruwäch k'o wakami pa ronojel okik'amaya'l. +downloadFirefox = Tiqasäx { -firefox } +legalTitle = Rutzijol Richinanem { -send-short-brand } +legalDateStamp = Ruwäch 1.0, ruq'ijul marso 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }q { $hours }r { $minutes }ch' +addFilesButton = Kecha' taq yakb'äl richin yejotob'äx +uploadButton = Tijotob'äx +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Keqirirëx chuqa' ke'osq'opïx taq yakb'äl +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o tapitz'a' richin natäq k'a { $size } +addPassword = Tichajïx rik'in ewan tzij +emailPlaceholder = Tatz'ib'aj ataqoya'l +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Tatikirisaj molojri'ïl richin natäq k'a { $size } +signInOnlyButton = Titikirisäx molojri'ïl +accountBenefitTitle = Tatz'uku' jun { -firefox } Rub'i' Ataqoy'al o Tatikirisaj molojri'ïl +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ke'akomonij taq yakb'äl k'a { $size } +accountBenefitDownloadCount = Ke'akomonij taq yakb'äl kik'in ch'aqa' chik winaqi' +accountBenefitTimeLimit = + { $count -> + [one] Ke' atzija' ri taq ximonel chi 1 q'ij + *[other] Ke'atzija' ri taq ximonel chi { $count } taq q'ij + } +accountBenefitSync = Ke'anuk'samajij komonin taq yakb'äl pa xab'achike okisab'äl +accountBenefitMoz = Tawetamaj chij ch'aqa' chik { -mozilla } taq samaj +signOut = Titz'apïx molojri'ïl +okButton = ÜTZ +downloadingTitle = Niqasäx +noStreamsWarning = Rik'in jub'a' re okik'amaya'l re' man nitikïr ta nretamaj rusik'ixik nima'q taq yakb'äl. +noStreamsOptionCopy = Tiwachib'ëx ri ximonel richin nijaq pa jun chik okik'amaya'l +noStreamsOptionFirefox = Tatojtob'ej ri jeb'ël qokik'amaya'l +noStreamsOptionDownload = Kisamäj na rik'in re okik'amaya'l re' +downloadFirefoxPromo = Ja ri k'ak'a' { -firefox } nusüj ri { -send-short-brand } chawe. +# the next line after the colon contains a file name +shareLinkDescription = Nakomonij ri ximonel rik'in ri awokisab'al: +shareLinkButton = Tikomonïx ximonel +# $name is the name of the file +shareMessage = Tiqasäx "{ $name }" rik'in { -send-brand }: man k'ayew ta chuqa' ütz kikomonik ri yakb'äl +trailheadPromo = K'o jun rub'anikil richin nachajij ri awichinanem. Tatunu' awi' rik'in ri Firefox. +learnMore = Tetamäx ch'aqa' chik. diff --git a/public/locales/ckb/send.ftl b/public/locales/ckb/send.ftl new file mode 100644 index 000000000..433bc104f --- /dev/null +++ b/public/locales/ckb/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = ڕەخنەوپێشنیار +importingFile = هاوردەکردن... +encryptingFile = بەهێماکردن... +decryptingFile = هێمالابردن... +downloadCount = + { $num -> + [one] 1 داگرتن + *[other] { $num } داگرتن + } +timespanHours = + { $num -> + [one] 1 کاژێر + *[other] { $num } کاژێر + } +copiedUrl = لەبەرگیرا! +unlockInputPlaceholder = وشەی تێپەڕبوون +unlockButtonLabel = کردنەوە +downloadButtonLabel = داگرتن +downloadFinish = داگرتن تەواو بوو +fileSizeProgress = ({ $partialSize } لە { $totalSize }) +sendYourFilesLink = Firefox ناردن تاقیبکەرەوە +errorPageHeader = هەڵەیەک ڕوویدا +fileTooBig = ئەم پەڕگەیە زۆر گەورەیە بۆ بارکردن. پێویستە لە { $size } بچووک تر بێت +linkExpiredAlt = بەستەر بەسەرچووە +notSupportedHeader = وێبگەڕەکەت پشتگیری ناکرێت +notSupportedLink = بۆ وێبگەڕەکەم پشتگیری ناکرێت؟ +notSupportedOutdatedDetail = بەداخەوە ئەم وەشانەی Firefox پشتگیری ئەو جۆرە تەکنەلۆژییە ناکات کە پێویستە بۆ Send. پێویستە وێبگەڕەکەت نوێبکەیتەوە. +updateFirefox = فاەرفۆکس نوێبکەرەوە +deletePopupCancel = پاشگەزبوونەوە +deleteButtonHover = سڕینەوە +footerLinkLegal = یاسایی +footerLinkPrivacy = تایبەتیی +footerLinkCookies = شەکرۆکە +passwordTryAgain = وشەی تێپەڕبوون هەڵەیە. هەوڵ بدەرەوە. +javascriptRequired = فارفۆکسی ناردن پێویستە بە JavaScript هەیە +whyJavascript = بۆچی پێویستی بە JavaScript هەیە؟ +enableJavascript = تکایە JavaScript چالاک بکە وهەوڵ بدەرەوە. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ک { $minutes }خ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }خ +# A short status message shown when the user enters a long password +maxPasswordLength = زۆرترین درێژی وشەی تێپەڕی ڕێگەپێدراو: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ناتوانرێت وشەی تێپەڕ دابنرێت + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = سانا، بڵاوکەرەوەی پەڕگەی تایبەتیی +introDescription = { -send-brand } ڕێگەت دەدات پەڕگەکان بڵاوبکەیتەوە بە شێوەی هێما کردنی کۆتا-بۆ-کۆتا و بەستەرێک کە خۆکارانە بەسەردەچێت. بۆیە دەتوانیت ئاگاداری ئەوە بیت کە چ پەڕگەیەک بە تایبەتی بڵاودەکەیتەوە و دڵنیادەبیتەوە کە شتەکانت بە سەرهێڵی نامێننەوە هەتا کۆتایی. +notifyUploadEncryptDone = پەڕگەیە بەهێماکراوە ئێستا ئامادەیە بۆ ناردن +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = بەسەردەچێت دووای { $downloadCount } یان { $timespan } +timespanMinutes = + { $num -> + [one] 1 خولەک + *[other] { $num } خولەک + } +timespanDays = + { $num -> + [one] 1 ڕؤژ + *[other] { $num } ڕۆژ + } +timespanWeeks = + { $num -> + [one] 1 هەفتە + *[other] { $num } هەفتە + } +fileCount = + { $num -> + [one] 1 پەڕگە + *[other] { $num } پەڕگە + } +# byte abbreviation +bytes = بایت +# kibibyte abbreviation +kb = ک.بایت +# mebibyte abbreviation +mb = م.بایت +# gibibyte abbreviation +gb = گ.بایت +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = قەبارەی گشتی: { $size } +# the next line after the colon contains a file name +copyLinkDescription = بەستەر لەبەربگرەوە بۆ بڵاوکردنەوەی پەڕگە: +copyLinkButton = بەستەر لەبەربگرەوە +downloadTitle = پەڕگەکان دابگرە +downloadDescription = ئەم پەڕگەیە لە لایەن { -send-brand } بلاوکراوەتەوە کە بەهێماکراوە بە شێوەی کۆتا-بۆ-کۆتا بە بەستەرێک کە خۆکارانە بەسەردەچێت. +trySendDescription = { -send-brand } تاقیبکەرەوە بۆ سانایی، پارێزراو لە بڵاوکردنەوەی پەڕگە. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] تەنها 1 پەڕگە دەتوانیت باربکەیت لەم کاتەدا. + *[other] تەنها { $count } پەڕگە دەتوانی باربکەیت لەم کاتەدا. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] تەنها 1 ئەرشیف ڕێپێدراوە. + *[other] تەنها { $count } ئەرشیف ڕێپێدراوە. + } +expiredTitle = بەستەر بەسەرچووە. +notSupportedDescription = { -send-brand } کارنکات لەگەڵ ئەم وێبگەڕە. { -send-short-brand } باش کاردەکات لەگەڵ کۆتا وەشانی { -firefox }، وکاردەکات لەگەڵ زۆربەی وەشانی ئێستای وێبگەڕەکان. +downloadFirefox = { -firefox } دابگرە +legalTitle = تێبینی تایبەتیی { -send-short-brand } +legalDateStamp = وەشان 1.0، بەروار کراو لە 12 ئازار، 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ڕ { $hours } ک{ $minutes } خ +addFilesButton = پەڕگەکان هەڵبژێرە بۆ بارکردن +uploadButton = بارکردن +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ڕاکێشان و دانانی پەڕگەکان +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = یان کرتە بکە بۆ ناردنی قەبارەی تاوەکوو { $size } +addPassword = بپارێزە لەگەڵ وشەی تێپەڕ +emailPlaceholder = پۆستی ئەلکترۆنی بنووسە +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = بچۆژوورەوە بۆ ناردنی قەبارەی تاوەکوو { $size } +signInOnlyButton = بچۆژوورەوە +accountBenefitTitle = هەژماری { -firefox } درووست بکە یان بچۆژوورەوە +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = پەڕگە بڵاوبکەرەوە تاوەکوو قەبارەی { $size } +accountBenefitDownloadCount = پەڕگەکان لەگەڵ خەڵکی زیاتر بڵاوبکەرەوە +accountBenefitTimeLimit = + { $count -> + [one] بەستەرەکان بەکارایی بهێڵەوە تا 1 ڕۆژ + *[other] بەستەرەکان بەکارایی بهێڵەوە تا { $count } ڕۆژ + } +accountBenefitSync = پەڕگە بڵآوکراوەکان بەڕێوەبەرە لەهەر ئامێرێکەوە +accountBenefitMoz = زیاتر بزانە دەربارەی خزمەتگوزارییەکانی تری { -mozilla } +signOut = بچۆ دەرەوە +okButton = باشە +downloadingTitle = دادەگیرێت... +noStreamsWarning = لەوانەیە ئەم وێبگەڕە نەتوانێت پەڕگەی وا گەورە بە هێما بکات. +noStreamsOptionCopy = بەستەر لەبەربگرەوە بۆ کردنەوەی لە وێبگەڕێکی تر +noStreamsOptionFirefox = وێبگەڕی دڵخوازی ئێمە تاقیبکەرەوە +noStreamsOptionDownload = بەردەوام بە لەگەڵ ئەم وێبگەڕە +downloadFirefoxPromo = { -send-short-brand } پیشکەش کراوە بە تۆ لە لایەن { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = بەستەر بڵاوبکەرەوە بۆ پەڕگەکەت: +shareLinkButton = بەستەر بڵاوبکەرەوە +# $name is the name of the file +shareMessage = “{ $name }” دابگرە لەگەڵ { -send-brand }: سانا، پاریزراو لە بڵاوکردنەوەی پەڕگە +trailheadPromo = ڕێگەیەک هەیە بۆ پارێزگاریکردنی تایبەتێتی خۆت. بەشدار بە لە فایەرفۆکس. +learnMore = زیاتر بزانە diff --git a/public/locales/cs/send.ftl b/public/locales/cs/send.ftl index ca3125d20..3e26148c2 100644 --- a/public/locales/cs/send.ftl +++ b/public/locales/cs/send.ftl @@ -1,117 +1,232 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webový experiment -siteFeedback = Zpětná vazba -uploadPageHeader = Soukromé a šifrované sdílení souborů -uploadPageExplainer = Posílejte soubory přes bezpečné, soukromé a šifrované odkazy, které automaticky soubor smažou, aby nezůstal na internetu navěky. -uploadPageLearnMore = Zjistit více -uploadPageDropMessage = Přesunutím souboru sem spustíte jeho nahrávání -uploadPageSizeMessage = Nahrávání funguje nejlépe pro soubory do velikosti 1 GB. -uploadPageBrowseButton = Vybrat soubor z počítače -uploadPageBrowseButton1 = Zvolte soubor k nahrání -uploadPageMultipleFilesAlert = Nahrávání více souborů najednou nebo celých složek zatím není podporováno. -uploadPageBrowseButtonTitle = Nahrát soubor -uploadingPageProgress = Nahrávání souboru { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Probíhá import… -verifyingFile = Probíhá ověřování… encryptingFile = Probíhá šifrování… decryptingFile = Probíhá dešifrování… -notifyUploadDone = Nahrávání vašeho souboru bylo dokončeno. -uploadingPageMessage = Po dokončení nahrávání můžete nastavit dobu expirace souboru. -uploadingPageCancel = Zrušit nahrávání -uploadCancelNotification = Nahrávání vašeho souboru bylo zrušeno. -uploadingPageLargeFileMessage = Tento soubor je veliký a jeho nahrávání může chvíli trvat. Posaďte se na chvilku. -uploadingFileNotification = Upozornit, až bude nahrávání dokončeno. -uploadSuccessConfirmHeader = Připraveno k odeslání -uploadSvgAlt = Nahrát -uploadSuccessTimingHeader = Platnost odkazu na váš soubor vyprší po jeho prvním stažení, nebo po 24 hodinách. -expireInfo = Platnost odkazu na váš soubor vyprší po { $downloadCount } nebo { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] jednom stažení [few] { $num } staženích *[other] { $num } staženích } -timespanHours = { $num -> - [one] hodina - [few] hodiny - *[other] hodin +timespanHours = + { $num -> + [one] hodinu + [few] { $num } hodiny + *[other] { $num } hodin } -copyUrlFormLabelWithName = Zkopírujte a sdílejte odkaz na váš soubor: { $filename } -copyUrlFormButton = Zkopírovat do schránky copiedUrl = Zkopírováno! -deleteFileButton = Smazat soubor -sendAnotherFileLink = Poslat další soubor -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Stáhnout -downloadsFileList = Stažení -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Zbývá -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Stáhnout { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Zadejte heslo unlockInputPlaceholder = Heslo unlockButtonLabel = Odemknout -downloadFileTitle = Stáhnout šifrovaný soubor -// Firefox Send is a brand name and should not be localized. -downloadMessage = Někdo vám posílá soubor pomocí služby Firefox Send, které umožňuje bezpečné, soukromé a šifrované sdílení souborů, které jsou pak automaticky smazány, aby nezůstaly na internetu navěky. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Stáhnout -downloadNotification = Stahování bylo dokončeno. downloadFinish = Stahování dokončeno -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Vyzkoušejte Firefox Send -downloadingPageProgress = Stahování { $filename } ({ $size }) -downloadingPageMessage = Ponechte prosím tento panel otevřený, dokud nepřipravíme váš soubor a nedešifrujeme ho. -errorAltText = Chyba při nahrávání souboru +sendYourFilesLink = Vyzkoušet Send errorPageHeader = Nastala chyba! -errorPageMessage = Při nahrávání souboru se vyskytl problém. -errorPageLink = Poslat další soubor fileTooBig = Tento soubor je příliš veliký. Velikost nahrávaných souborů by neměla překročit { $size }. linkExpiredAlt = Platnost odkazu vypršela -expiredPageHeader = Platnost tohoto odkazu buď vypršela, nebo vůbec nikdy neexistoval. notSupportedHeader = Váš prohlížeč není podporován. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Bohužel tento prohlížeč nepodporuje technologii, kterou Firefox Send používá. Zkuste prosím jiný prohlížeč, doporučujeme Firefox! notSupportedLink = Proč není můj prohlížeč podporovaný? -notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Firefox Send. Musíte aktualizovat svůj prohlížeč. +notSupportedOutdatedDetail = Tato verze Firefoxu bohužel nepodporuje webovou technologii, která pohání Send. Musíte aktualizovat svůj prohlížeč. updateFirefox = Aktualizovat Firefox -downloadFirefoxButtonSub = Stáhnout zdarma -uploadedFile = Soubor -copyFileList = Kopírovat URL -// expiryFileList is used as a column header -expiryFileList = Platnost vyprší za -deleteFileList = Smazat -nevermindButton = Nevadí -legalHeader = Podmínky a ochrana soukromí -legalNoticeTestPilot = Firefox Send je ve fázi experimentu projektu Test Pilot a platí tak pro něj stejné Podmínky používání a Zásady ochrany soukromí. Více o tomto experimentu a sbíraných datech se dozvíte zde. -legalNoticeMozilla = Používání webové služby Firefox Send se řídí Zásadami ochrany soukromí a Podmínkami používání webových stránek Mozilly. -deletePopupText = Smazat tento soubor? -deletePopupYes = Ano deletePopupCancel = Zrušit deleteButtonHover = Smazat -copyUrlHover = Kopírovat URL footerLinkLegal = Právní informace -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = O programu Test Pilot footerLinkPrivacy = Soukromí -footerLinkTerms = Podmínky footerLinkCookies = Cookies -requirePasswordCheckbox = Vyžadovat heslo pro stažení tohoto souboru -addPasswordButton = Přidat heslo -changePasswordButton = Změnit passwordTryAgain = Špatné heslo. Zkuste to znovu. -// This label is followed by the password needed to download a file -passwordResult = Heslo: { $password } -reportIPInfringement = Nahlásit porušení autorských práv -javascriptRequired = Firefox Send vyžaduje povolený JavaScript -whyJavascript = Proč Firefox Send vyžaduje povolený JavaScript? +javascriptRequired = Send vyžaduje povolený JavaScript +whyJavascript = Proč Send vyžaduje povolený JavaScript? enableJavascript = Povolte JavaScript a zkuste to znovu. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" -expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" -expiresMinutes = { $minutes }m +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximální délka hesla: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Toto heslo nemohlo být nastaveno + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = + { $case -> + *[nom] Send + [gen] Firefoxu Send + [dat] Firefoxu Send + [acc] Send + [voc] Firefoxe Send + [loc] Firefoxu Send + [ins] Firefoxem Send + } +-send-short-brand = + { $case -> + *[nom] Send + [gen] Sendu + [dat] Sendu + [acc] Send + [voc] Sende + [loc] Sendu + [ins] Sendem + } +-firefox = + { $case -> + *[nom] Firefox + [gen] Firefoxu + [dat] Firefoxu + [acc] Firefox + [voc] Firefoxe + [loc] Firefoxu + [ins] Firefoxem + } +-mozilla = + { $case -> + *[nom] Mozilla + [gen] Mozilly + [dat] Mozille + [acc] Mozillu + [voc] Mozillo + [loc] Mozille + [ins] Mozillou + } +introTitle = Jednoduché a soukromé sdílení souborů +introDescription = S { -send-brand(case: "ins") } jsou sdílené soubory šifrované end-to-end, takže ani my nevíme, co sdílíte. Platnost odkazů je navíc omezená. Soubory tak můžete sdílet soukromě a s jistotou, že se nezůstanou na internetu válet navždy. +notifyUploadEncryptDone = Váš soubor je zašifrovaný a připraven k odeslání +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Platnost vyprší po { $downloadCount } nebo za { $timespan } +timespanMinutes = + { $num -> + [one] jednu minutu + [few] { $num } minuty + *[other] { $num } minut + } +timespanDays = + { $num -> + [one] jeden den + [few] { $num } dny + *[other] { $num } dní + } +timespanWeeks = + { $num -> + [one] týden + [few] { $num } týdny + *[other] { $num } týdnů + } +fileCount = + { $num -> + [one] jeden soubor + [few] { $num } soubory + *[other] { $num } souborů + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Celková velikost: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Soubor můžete sdílet tímto odkazem: +copyLinkButton = Zkopírovat odkaz +downloadTitle = Stáhnout soubory +downloadDescription = Tento soubor byl sdílen přes { -send-brand(case: "acc") } s end-to-end šifrováním a odkazem s omezenou platností. +trySendDescription = Vyzkoušejte jednoduché a bezpečné sdílení souborů s { -send-brand(case: "ins") } +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Najednou lze nahrávat jen jeden soubor. + [few] Najednou lze nahrávat jen { $count } soubory. + *[other] Najednou lze nahrávat jen { $count } souborů. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Povolen je nejvýše jeden archiv. + [few] Povoleny jsou nejvýše { $count } archivy. + *[other] Povoleno je nejvýše { $count } archivů. + } +expiredTitle = Platnost tohoto odkazu vypršela. +notSupportedDescription = { -send-brand } nebude v tomto prohlížeči fungovat. Nejlépe { -send-short-brand } funguje v nejnovějším { -firefox(case: "gen") } nebo aktuálních verzích nejpoužívanějších prohlížečů. +downloadFirefox = Stáhnout { -firefox(case: "acc") } +legalTitle = Zásady { -send-short-brand(case: "acc") } pro ochranu osobních údajů +legalDateStamp = Verze 1.0, 12. března 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Vyberte soubory k nahrání +trustWarningMessage = Ujistěte se, že adresátovi důvěřujete pro sdílení vašich důvěrných dat. +uploadButton = Nahrát +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Přetažením myší nebo kliknutím sem +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = můžete poslat až { $size } +addPassword = Ochránit heslem +emailPlaceholder = Zadejte svoji e-mailovou adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Pro odesílání souborů o velikosti až { $size } se prosím přihlaste +signInOnlyButton = Přihlásit se +accountBenefitTitle = Vytvořte si účet { -firefox(case: "gen") } nebo se přihlaste +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Sdílejte soubory o velikosti až { $size } +accountBenefitDownloadCount = Sdílejte soubory s více lidmi +accountBenefitTimeLimit = + { $count -> + [one] Odkazy platné až jeden den + [few] Odkazy platné až { $count } dny + *[other] Odkazy platné až { $count } dní + } +accountBenefitSync = Správa sdílených souborů z jakéhokoliv zařízení +accountBenefitMoz = Více informací o dalších službách od { -mozilla(case: "gen") } +signOut = Odhlásit se +okButton = OK +downloadingTitle = Stahování +noStreamsWarning = Dešifrování tak velikého souboru se v tomto prohlížeči nemusí podařit. +noStreamsOptionCopy = Zkopírujte odkaz pro otevření v jiném prohlížeči +noStreamsOptionFirefox = Vyzkoušejte náš oblíbený prohlížeč +noStreamsOptionDownload = Pokračovat v tomto prohlížeči +downloadFirefoxPromo = { -send-short-brand } od aplikace { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Sdílet odkaz na soubor: +shareLinkButton = Sdílet odkaz +# $name is the name of the file +shareMessage = Stáhněte si soubor „{ $name }“ s { -send-brand(case: "ins") } - jednoduché a bezpečné sdílení souborů +trailheadPromo = Existuje způsob, jak ochránit své soukromí. Používejte Firefox. +learnMore = Zjistit více. +downloadFlagged = Tento odkaz byl pro porušení podmínek používání služby deaktivován. +downloadConfirmTitle = Ještě jedna věc +downloadConfirmDescription = Ujistěte se, že opravdu důvěřujete odesílateli tohoto souboru, protože nemůžeme potvrdit bezpečnost jeho otevření na vašem zařízení. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Odesílateli tohoto souboru důvěřuji + [few] Odesílateli těchto souborů důvěřuji + *[other] Odesílateli těchto souborů důvěřuji + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Nahlásit tento soubor jako podezřelý + [few] Nahlásit tyto soubory jako podezřelé + *[other] Nahlásit tyto soubory jako podezřelé + } +reportDescription = Pomozte nám. Co si myslíte, že je s těmito soubory špatně? +reportUnknownDescription = Otevřete odkaz, který chcete nahlásit, a klepněte na „{ reportFile }“. +reportButton = Nahlásit +reportReasonMalware = Tyto soubory obsahují malware nebo jsou součástí phishingového útoku. +reportReasonPii = Tyto soubory obsahují mé osobní údaje. +reportReasonAbuse = Tyto soubory obsahují nelegální nebo urážlivý obsah. +reportReasonCopyright = Chcete-li nahlásit porušení autorských práv nebo ochranných známek, použijte postup popsaný na této stránce. +reportedTitle = Soubory byly nahlášeny +reportedDescription = Děkujeme vám za zaslané hlášení ohledně těchto souborů. diff --git a/public/locales/cy/send.ftl b/public/locales/cy/send.ftl index 32e93da34..6be545d23 100644 --- a/public/locales/cy/send.ftl +++ b/public/locales/cy/send.ftl @@ -1,119 +1,229 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = arbrawf gwe -siteFeedback = Adborth -uploadPageHeader = Rhannu Ffeiliau wedi eu Hamgryptio yn Breifat -uploadPageExplainer = Anfon ffeiliau drwy ddolen diogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich pethau'n bodoli ar lein am byth. -uploadPageLearnMore = Dysgu rhagor -uploadPageDropMessage = Gollyngwch eich ffeiliau yma i gychwyn llwytho i fyny -uploadPageSizeMessage = Mae'n well cadw maint y ffeiliau o dan 1GB er mwyn iddo weithio ar ei orau. -uploadPageBrowseButton = Dewiswch ffeil ar eich cyfrifiadur -uploadPageBrowseButton1 = Dewiswch ffeil i'w llwytho i fyny -uploadPageMultipleFilesAlert = Nid yw llwytho nifer lluosog o ffeiliau neu ffolder yn cael ei gynnal ar hyn o bryd. -uploadPageBrowseButtonTitle = Llwytho ffeil i fyny -uploadingPageProgress = Llwytho $filename} i fyny ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Mewnforio… -verifyingFile = Wrthi'n gwirio… encryptingFile = Wrthi'n amgryptio… decryptingFile = Wrthi'n dadgryptio… -notifyUploadDone = Mae eich llwytho wedi gorffen. -uploadingPageMessage = Unwaith y bydd eich ffeil wedi llwytho bydd modd gosod y manylion dod i ben. -uploadingPageCancel = Diddymu'r llwytho -uploadCancelNotification = Cafodd eich llwytho ei ddiddymu. -uploadingPageLargeFileMessage = Mae'r ffeil yn fawr a gall gymryd peth amser i'w llwytho. Amynedd! -uploadingFileNotification = Dweud pan fydd y llwytho wedi gorffen. -uploadSuccessConfirmHeader = Yn Barod i Anfon -uploadSvgAlt = Llwytho i Fyny -uploadSuccessTimingHeader = Bydd y ddolen i'ch ffeil y dod i ben ar ôl 1 llwytho neu o fewn 24 awr. -expireInfo = Bydd y ddolen i'ch ffeil yn dod i ben ym mhen { $downloadCount } neu { $timespan }. -downloadCount = { $num -> - [one] Llwyth i lawr - [two] Lwyth i lawr - [few] Llwyth i lawr - *[other] Llwyth i lawr +downloadCount = + { $num -> + [zero] Dim llwythi i lawr + [one] 1 llwyth i lawr + [two] { $num } llwyth i lawr + [few] { $num } llwyth i lawr + [many] { $num } llwyth i lawr + *[other] { $num } llwyth i lawr } -timespanHours = { $num -> - [one] awr - [two] awr - [few] awr - *[other] awr +timespanHours = + { $num -> + [zero] awr + [one] 1 awr + [two] { $num } awr + [few] { $num } awr + [many] { $num } awr + *[other] { $num } awr } -copyUrlFormLabelWithName = Copïo a rhannu'r ddolen i anfon eich ffeil: { $filename } -copyUrlFormButton = Copïo i'r clipfwrdd copiedUrl = Wedi eu copïo! -deleteFileButton = Dileu ffeil -sendAnotherFileLink = Anfon ffeil arall -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Llwytho i lawr -downloadsFileList = Llwythi -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Amser -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Llwytho i lawr { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Rhowch Gyfrinair unlockInputPlaceholder = Cyfrinair unlockButtonLabel = Datgloi -downloadFileTitle = Llwythwch Ffeil wedi ei Hamgryptio i Lawr -// Firefox Send is a brand name and should not be localized. -downloadMessage = Mae ffrind i chi yn anfon ffeil atoch drwy Firefox Send, gwasanaeth sy'n caniatáu i chi rannu ffeiliau drwy ddolen ddiogel, breifat ac wedi ei amgryptio sy'n dod i ben yn awtomatig er mwyn sicrhau nad yw eich deunydd yn aros ar-lein am byth. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Llwytho i Lawr -downloadNotification = Mae eich llwytho wedi gorffen downloadFinish = Llwytho wedi Gorffen -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } o { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Rhowch gynnig ar Firefox Send -downloadingPageProgress = Llwytho i lawr { $filename } ({ $size }) -downloadingPageMessage = Gadewch y tab yma ar agor tra fyddwn yn estyn eich ffeil a'i dad-amgryptio. -errorAltText = Gwall llwytho +sendYourFilesLink = Rhowch gynnig ar Send errorPageHeader = Aeth rhywbeth o'i le! -errorPageMessage = Bu gwall wrth lwytho'r ffeil. -errorPageLink = Anfon ffeil arall fileTooBig = Mae'r ffeil yn rhy fawr i'w llwytho. Dylai fod yn llai na { $size }. linkExpiredAlt = Mae'r ddolen wedi dod i ben -expiredPageHeader = Mae'r ddolen wedi dod i ben neu nad yw wedi bodoli erioed! notSupportedHeader = Nid yw eich porwr yn cael ei gynnal. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Yn anffodus, nid yw'r porwr hwn yn cynnal y technoleg gwe sy'n cynnal Firefox Send. Bydd angen i chi ddefnyddio porwr arall. Rydym ni'n argymell Firefox! notSupportedLink = Pam nad yw fy mhorwr yn cael ei gynnal? -notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Firefox Send. Bydd angen i chi ddiweddaru eich porwr. +notSupportedOutdatedDetail = Yn anffodus, nid yw'r fersiwn yma o Firefox yn cynnal y technoleg gwe sy'n gyrru Send. Bydd angen i chi ddiweddaru eich porwr. updateFirefox = Diweddaru Firefox -downloadFirefoxButtonSub = Llwytho i Lawr am Ddim -uploadedFile = Ffeil -copyFileList = Copïo URL -// expiryFileList is used as a column header -expiryFileList = Daw i ben ymhen -deleteFileList = Dileu -nevermindButton = Dim ots -legalHeader = Amodau a Phreifatrwydd -legalNoticeTestPilot = Ar hyn o mae Firefox Send yn arbrawf o fewn rhaglen Test Pilot ac yn destun Amodau Gwasanaeth a Hysbysiad Preifatrwydd Test Pilot . Gallwch ddysgu rhagor am yr arbrawf a'r data mae'n ei gasglu yma. -legalNoticeMozilla = Mae'r defnydd o wefan Firefox Send hefyd yn destun Hysbysiad Preifatrwydd Gwefannau ac Amodau Defnydd Gwefannau Mozilla. -deletePopupText = Dileu'r ffeil? -deletePopupYes = Iawn deletePopupCancel = Diddymu deleteButtonHover = Dileu -copyUrlHover = Copïo'r URL footerLinkLegal = Cyfreithiol -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Ynghylch Test Pilot footerLinkPrivacy = Preifatrwydd -footerLinkTerms = Amodau footerLinkCookies = Cwcis -requirePasswordCheckbox = Gosod angen cyfrinair i lwytho'r ffeil hon i lawr -addPasswordButton = Ychwanegu Cyfrinair -changePasswordButton = Newid passwordTryAgain = Cyfrinair anghywir. Ceisiwch eto. -// This label is followed by the password needed to download a file -passwordResult = Cyfrinair: { $password } -reportIPInfringement = Adrodd ar Gamddefnydd o'r IP -javascriptRequired = Mae Firefox Send angen JavaScript -whyJavascript = Pam fod Firefox Send angen JavaScript? +javascriptRequired = Mae Send angen JavaScript +whyJavascript = Pam fod Send angen JavaScript? enableJavascript = Galluogwch JavaScript a cheisio eto. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }a { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Hyd mwyaf cyfrinair: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nid oedd modd gosod y cyfrinair hwn + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Anfon +-firefox = Firefox +-mozilla = Mozilla +introTitle = Rhannu ffeiliau syml a phreifat +introDescription = Mae { -send-brand } yn gadael i chi rannu ffeiliau gydag amgryptio o'r dechrau i'r diwedd a dolen sy'n dod i ben yn awtomatig. Felly gallwch chi gadw'r hyn rydych chi'n ei rannu'n breifat a sicrhau nad yw'ch pethau'n aros ar-lein am byth. +notifyUploadEncryptDone = Mae eich ffeil wedi'i hamgryptio ac yn barod i'w hanfon +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Yn dod i ben ar ôl { $downloadCount } neu { $timespan } +timespanMinutes = + { $num -> + [zero] 0 munud + [one] 1 munud + [two] { $num } munud + [few] { $num } munud + [many] { $num } munud + *[other] { $num } munud + } +timespanDays = + { $num -> + [zero] 0 diwrnod + [one] 1 diwrnod + [two] { $num } diwrnod + [few] { $num } diwrnod + [many] { $num } diwrnod + *[other] { $num } diwrnod + } +timespanWeeks = + { $num -> + [zero] 0 wythnos + [one] 1 wythnos + [two] { $num } wythnos + [few] { $num } wythnos + [many] { $num } wythnos + *[other] { $num } wythnos + } +fileCount = + { $num -> + [zero] 0 ffeil + [one] 1 ffeil + [two] { $num } ffeil + [few] { $num } ffeil + [many] { $num } ffeil + *[other] { $num } ffeil + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Cyfanswm maint: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copïwch y ddolen i rannu eich ffeil: +copyLinkButton = Copïo'r ddolen +downloadTitle = Llwytho ffeiliau i lawr +downloadDescription = Rhannwyd y ffeil hon trwy { -send-brand } gydag amgryptiad o'r dechrau i'r diwedd a dolen sy'n dod i ben yn awtomatig. +trySendDescription = Rhowch gynnig ar { -send-brand } ar gyfer rhannu ffeiliau syml a diogel. +# count will always be > 10 +tooManyFiles = + { $count -> + [zero] Nid oes modd llwytho ffeiliau i fyny. + [one] Dim ond 1 ffeil y mae modd ei llwytho i fyny ar y tro. + [two] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + [few] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + [many] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + *[other] Dim ond ffeiliau { $count } y mae modd eu llwytho i fyny ar y tro. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [zero] Dim caniatâd i archifau. + [one] Dim ond 1 archif y'n cael ei ganiatáu. + [two] Dim ond { $count } archif sy'n cael eu caniatáu. + [few] Dim ond { $count } archif sy'n cael eu caniatáu. + [many] Dim ond { $count } archif sy'n cael eu caniatáu. + *[other] Dim ond { $count } archif sy'n cael eu caniatáu. + } +expiredTitle = Mae'r ddolen hon wedi dod i ben. +notSupportedDescription = Ni fydd { -send-brand } yn gweithio gyda'r porwr hwn. Mae { -send-short-brand } yn gweithio orau gyda'r fersiwn ddiweddaraf o { -firefox }, a bydd yn gweithio gyda'r fersiwn gyfredol o'r rhan fwyaf o borwyr. +downloadFirefox = Llwytho { -firefox } i Lawr +legalTitle = Hysbysiad Preifatrwydd { -send-short-brand } +legalDateStamp = Fersiwn 1.0, dyddiedig Mawrth 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } a { $minutes } m +addFilesButton = Dewis ffeiliau i'w llwytho i fyny +trustWarningMessage = Gwnewch yn siŵr eich bod yn ymddiried yn eich derbynnydd pan yn rhannu data sensitif. +uploadButton = Llwytho i fyny +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Llusgo a gollwng ffeiliau +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = neu glicio i anfon hyd at { $size } +addPassword = Diogelu gyda chyfrinair +emailPlaceholder = Rhowch eich e-bost +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Mewngofnodi i anfon hyd at { $size } +signInOnlyButton = Mewngofnodi +accountBenefitTitle = Creu Cyfrif { -firefox } neu fewngofnodi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Rhannu ffeiliau hyd at { $size } +accountBenefitDownloadCount = Rhannu ffeiliau gyda mwy o bobl +accountBenefitTimeLimit = + { $count -> + [zero] Cadw dolenni'n weithredol am hyd at 0 diwrnod + [one] Cadw dolenni'n weithredol am hyd at 1 diwrnod + [two] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + [few] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + [many] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + *[other] Cadw dolenni'n weithredol am hyd at { $count } diwrnod + } +accountBenefitSync = Rheoli ffeiliau sy'n cael eu rhannu o unrhyw ddyfais +accountBenefitMoz = Dysgu am wasanaethau eraill { -mozilla } +signOut = Allgofnodi +okButton = Iawn +downloadingTitle = Llwytho i Lawr +noStreamsWarning = Efallai na fydd y porwr hwn yn gallu dadgryptio ffeil mor fawr a hon. +noStreamsOptionCopy = Copïwch y ddolen i'w agor mewn porwr arall +noStreamsOptionFirefox = Rhowch gynnig ar ein hoff porwr +noStreamsOptionDownload = Parhau gyda'r porwr hwn +downloadFirefoxPromo = Mae { -send-short-brand } yn cael ei gynnig i ci gan y { -firefox } newydd. +# the next line after the colon contains a file name +shareLinkDescription = Rhannu'r ddolen i'ch ffeil: +shareLinkButton = Rhannu'r ddolen +# $name is the name of the file +shareMessage = Llwytho i lawr “{ $name }” gyda { -send-brand }: rhannu ffeiliau syml a diogel +trailheadPromo = Mae ffordd o ddiogelu eich preifatrwydd. Ymunwch â Firefox. +learnMore = Dysgu rhagor. +downloadFlagged = Mae'r ddolen wedi'i analluogi am fynd yn groes i'r telerau gwasanaeth. +downloadConfirmTitle = Un peth arall +downloadConfirmDescription = Gwnewch yn siŵr eich bod yn ymddiried yn y person a anfonodd y ffeil hon atoch oherwydd nid ydym yn gallu gwirio na fydd yn niweidio'ch dyfais. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [zero] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma + [one] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma + [two] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma + [few] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma + [many] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma + *[other] Rwy'n ymddiried yn y person anfonodd yr { $count } ffeil yma + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [zero] Adrodd y { $count } ffeil yma fel rhai amheus + [one] Adrodd y { $count } ffeil yma fel un amheus + [two] Adrodd y { $count } ffeil yma fel rhai amheus + [few] Adrodd y { $count } ffeil yma fel rhai amheus + [many] Adrodd y { $count } ffeil yma fel rhai amheus + *[other] Adrodd y { $count } ffeil yma fel rhai amheus + } +reportDescription = Helpwch ni i ddeall beth sy'n digwydd. Beth ydych chi'n meddwl sydd o'i le gyda'r ffeiliau hyn? +reportUnknownDescription = Ewch i url y ddolen rydych am adrodd amdani a chlicio “{ reportFile }”. +reportButton = Adrodd +reportReasonMalware = Mae'r ffeiliau hyn yn cynnwys meddalwedd maleisus neu'n rhan o ymosodiad gwe-rwydo. +reportReasonPii = Mae'r ffeiliau hyn yn cynnwys gwybodaeth bersonol adnabyddadwy amdanaf i. +reportReasonAbuse = Mae'r ffeiliau hyn yn cynnwys deunydd anghyfreithlon neu ymosodol. +reportReasonCopyright = I adrodd ar dorri hawlfraint neu nod masnach, defnyddiwch y broses sy'n cael ei ddisgrifio yn y dudalen hon. +reportedTitle = Ffeiliau Adroddwyd Amdanynt +reportedDescription = Diolch. Rydym wedi derbyn eich adroddiad ar y ffeiliau hyn. diff --git a/public/locales/da/send.ftl b/public/locales/da/send.ftl index e69de29bb..8b9c4cd5a 100644 --- a/public/locales/da/send.ftl +++ b/public/locales/da/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Importerer… +encryptingFile = Krypterer… +decryptingFile = Dekrypterer… +downloadCount = + { $num -> + [one] 1 hentning + *[other] { $num } hentninger + } +timespanHours = + { $num -> + [one] 1 time + *[other] { $num } timer + } +copiedUrl = Kopieret! +unlockInputPlaceholder = Adgangskode +unlockButtonLabel = Lås op +downloadButtonLabel = Hent +downloadFinish = Hentning fuldført +fileSizeProgress = ({ $partialSize } af { $totalSize }) +sendYourFilesLink = Prøv Send +errorPageHeader = Der gik noget galt! +fileTooBig = Den fil er for stor at uploade. Den skal være mindre end { $size }. +linkExpiredAlt = Link er udløbet +notSupportedHeader = Din browser understøttes ikke. +notSupportedLink = Hvorfor understøttes min browser ikke? +notSupportedOutdatedDetail = Desværre understøtter denne version af Firefox ikke den webteknologi, som driver Send. Du skal opdatere din browser. +updateFirefox = Opdater Firefox +deletePopupCancel = Annuller +deleteButtonHover = Slet +footerLinkLegal = Juridisk +footerLinkPrivacy = Privatliv +footerLinkCookies = Cookies +passwordTryAgain = Forkert adgangskode. Prøv igen. +javascriptRequired = Send kræver JavaScript +whyJavascript = Hvorfor kræver Send JavaScript? +enableJavascript = Aktiver JavaScript og prøv igen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } t { $minutes } m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum længde af adgangskode: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Adgangskoden kunne ikke sættes + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildeling +introDescription = { -send-brand } gør det muligt at dele filer via et tidsbegrænset link og med end to end-kryptering. På den måde kan du dele filer privat og samtidig være sikker på, at det delte ikke forbliver online for evigt. +notifyUploadEncryptDone = Din fil er krypteret og klar til at blive sendt +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Udløber efter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + *[other] { $num } minutter + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dage + } +timespanWeeks = + { $num -> + [one] 1 uge + *[other] { $num } uger + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Samlet størrelse: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopier linket for at dele din fil: +copyLinkButton = Kopier link +downloadTitle = Hent filer +downloadDescription = Denne fil blev delt via { -send-brand } med end to end-kryptering og et link, der automatisk udløber. +trySendDescription = Prøv { -send-brand } for enkel og sikker fildeling. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Du kan kun uploade 1 fil ad gangen. + *[other] Du kan kun uploade { $count } filer ad gangen. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Kun 1 arkiv er tilladt. + *[other] Kun { $count } arkiver er tilladt. + } +expiredTitle = Dette link er udløbet. +notSupportedDescription = { -send-brand } virker ikke med denne browser. { -send-short-brand } virker bedst med den nyeste version af { -firefox } og med de fleste andre nye browsere. +downloadFirefox = Hent { -firefox } +legalTitle = { -send-short-brand }, om privatlivspolitik +legalDateStamp = Version 1.0, udsendt d. 12. marts 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d. { $hours } t. { $minutes } m. +addFilesButton = Vælg filer, der skal uploades +trustWarningMessage = Vær sikker på, at du stoler på modtageren, når du deler følsomme data. +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Træk og slip filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klik for at sende filer på op til { $size } +addPassword = Beskyt med adgangskode +emailPlaceholder = Indtast din mailadresse +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Log ind for at sende filer på op til { $size } +signInOnlyButton = Log ind +accountBenefitTitle = Opret en { -firefox }-konto eller log ind +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Del filer på op til { $size } +accountBenefitDownloadCount = Del filer med flere personer +accountBenefitTimeLimit = + { $count -> + [one] Bevar links aktive i op til 1 dag + *[other] Bevar links aktive i op til { $count } dage + } +accountBenefitSync = Håndter delte filer på enhver enhed +accountBenefitMoz = Læs om andre tjenester fra { -mozilla } +signOut = Log ud +okButton = OK +downloadingTitle = Henter +noStreamsWarning = Denne browser kan muligvis ikke dekryptere en fil, der er så stor. +noStreamsOptionCopy = Kopier linket for at åbne det i en anden browser +noStreamsOptionFirefox = Prøv vores favorit-browser +noStreamsOptionDownload = Fortsæt med denne browser +downloadFirefoxPromo = { -send-short-brand } præsenteres af den nye { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Del linket til din fil: +shareLinkButton = Del link +# $name is the name of the file +shareMessage = Hent { $name } med { -send-brand } - simpel og sikker fildeling +trailheadPromo = Beskyt dine digitale rettigheder. Slut dig til Firefox. +learnMore = Læs mere. +downloadFlagged = Dette link er blevet deaktiveret for overtrædelse af tjenestevilkårene. +downloadConfirmTitle = En ting til +downloadConfirmDescription = Vær sikker på, at du stoler på afsenderen af ​​denne fil, da vi ikke kan garantere, at den ikke vil skade din enhed. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Jeg stoler på personen, som sendte denne fil + *[other] Jeg stoler på personen, som sendte disse filer + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Rapportér denne fil som mistænkelig + *[other] Rapportér disse filer som mistænkelige + } +reportDescription = Hjælp os med at forstå, hvad der foregår. Hvad er der i vejen med disse filer? +reportUnknownDescription = Gå til adressen på det link, du vil rapportere, og klik på “{ reportFile }”. +reportButton = Rapportér +reportReasonMalware = Disse filer indeholder malware eller er en del af et phishing-angreb. +reportReasonPii = Disse filer indeholder oplysninger om mig, der er personligt identificerbare. +reportReasonAbuse = Disse filer indeholder ulovligt eller voldeligt indhold. +reportReasonCopyright = Hvis du vil rapportere overtrædelse af ophavsrettigheder eller varemærker, skal du bruge processen, som er beskrevet på denne side. +reportedTitle = Rapporterede filer +reportedDescription = Tak. Vi har modtaget din rapport om disse filer. diff --git a/public/locales/de/send.ftl b/public/locales/de/send.ftl index 3650d0058..0e550a6fa 100644 --- a/public/locales/de/send.ftl +++ b/public/locales/de/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Web-Experiment -siteFeedback = Feedback -uploadPageHeader = Privates, verschlüsseltes Austauschen von Dateien -uploadPageExplainer = Senden Sie Dateien über einen sicheren, privaten und verschlüsselten Link, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben. -uploadPageLearnMore = Mehr erfahren -uploadPageDropMessage = Ziehen Sie eine Datei zum Hochladen hierher -uploadPageSizeMessage = Dateien unter 1 GB sorgen für erhöhte Zuverlässigkeit des Betriebs -uploadPageBrowseButton = Wählen Sie eine Datei auf Ihrem Computer aus -uploadPageBrowseButton1 = Datei zum Hochladen auswählen -uploadPageMultipleFilesAlert = Hochladen mehrerer Dateien oder eines Ordners wird derzeit nicht unterstützt. -uploadPageBrowseButtonTitle = Datei hochladen -uploadingPageProgress = { $filename } ({ $size }) wird hochgeladen +# Send is a brand name and should not be localized. +title = Send importingFile = Wird importiert… -verifyingFile = Wird überprüft… encryptingFile = Wird verschlüsselt… decryptingFile = Wird entschlüsselt… -notifyUploadDone = Ihr Upload ist abgeschlossen. -uploadingPageMessage = Sobald Ihre Datei hochgeladen wird, können Sie die Optionen zum Ablaufdatum auswählen. -uploadingPageCancel = Hochladen abbrechen -uploadCancelNotification = Ihr Upload wurde abgebrochen. -uploadingPageLargeFileMessage = Diese Datei ist groß, sodass das hochladen einige Zeit dauern könnte. Haben Sie Geduld! -uploadingFileNotification = Mich benachrichtigen, wenn der Upload abgeschlossen ist. -uploadSuccessConfirmHeader = Bereit zum Senden -uploadSvgAlt = Hochladen -uploadSuccessTimingHeader = Der Link zu Ihrer Datei läuft nach einem Download oder in 24 Stunden ab. -expireInfo = Der Link zu Ihrer Datei läuft nach { $downloadCount } oder { $timespan } ab. -downloadCount = { $num -> +downloadCount = + { $num -> [one] einem Download *[other] { $num } Downloads } -timespanHours = { $num -> +timespanHours = + { $num -> [one] einer Stunde *[other] { $num } Stunden } -copyUrlFormLabelWithName = Kopieren und teilen Sie den Link, um Ihre Datei zu senden: { $filename } -copyUrlFormButton = In Zwischenablage kopieren copiedUrl = Kopiert! -deleteFileButton = Datei löschen -sendAnotherFileLink = Eine weitere Datei senden -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Herunterladen -downloadsFileList = Downloads -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Zeit -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } herunterladen -downloadFileSize = ({ $size }) -unlockInputLabel = Passwort eingeben unlockInputPlaceholder = Passwort unlockButtonLabel = Entsperren -downloadFileTitle = Verschlüsselte Datei herunterladen -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ihr Freund schickt Ihnen eine Datei mit Firefox Send, einem Dienst, mit dem Sie Dateien über einen sicheren, privaten und verschlüsselten Link teilen können, der automatisch abläuft, damit Ihre Daten nicht für immer im Internet bleiben. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Herunterladen -downloadNotification = Der Download wurde abgeschlossen. downloadFinish = Download abgeschlossen -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } von { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send ausprobieren -downloadingPageProgress = { $filename } ({ $size }) wird heruntergeladen -downloadingPageMessage = Bitte lassen Sie diesen Tab geöffnet, während Ihre Datei heruntergeladen und entschlüsselt wird. -errorAltText = Fehler beim Hochladen +sendYourFilesLink = Send ausprobieren errorPageHeader = Ein Fehler ist aufgetreten! -errorPageMessage = Beim Hochladen der Datei ist ein Fehler aufgetreten. -errorPageLink = Eine weitere Datei senden fileTooBig = Die Datei ist zu groß zum Hochladen. Sie sollte maximal { $size } groß sein. linkExpiredAlt = Link abgelaufen -expiredPageHeader = Dieser Link ist abgelaufen oder hat nie existiert! -notSupportedHeader = Ihr Browser wird nicht unterstützt. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Leider unterstützt dieser Browser die Web-Technologie nicht, auf der Firefox Send basiert. Sie benötigen einen anderen Browser. Wir empfehlen Firefox! +notSupportedHeader = Dein Browser wird nicht unterstützt. notSupportedLink = Warum wird mein Browser nicht unterstützt? -notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Firefox Send basiert. Sie müssen Ihren Browser aktualisieren. +notSupportedOutdatedDetail = Leider unterstützt diese Firefox-Version die Web-Technologie nicht, auf der Send basiert. Du musst deinen Browser aktualisieren. updateFirefox = Firefox aktualisieren -downloadFirefoxButtonSub = Kostenloser Download -uploadedFile = Datei -copyFileList = Adresse kopieren -// expiryFileList is used as a column header -expiryFileList = Läuft ab in -deleteFileList = Löschen -nevermindButton = Egal -legalHeader = Nutzungsbedingungen und Datenschutz -legalNoticeTestPilot = Firefox Send ist aktuell ein Test-Pilot-Experiment und unterliegt den Nutzungsbedingungen und dem Datenschutzhinweis von Test Pilot. Mehr über diese Experiment und die Daten, die es sammelt, erfahren Sie hier. -legalNoticeMozilla = Die Nutzung der Website von Firefox Send unterliegt außerdem Mozillas Datenschutzhinweis für Websites und Nutzungsbedingungen für Websites. -deletePopupText = Diese Datei löschen? -deletePopupYes = Ja deletePopupCancel = Abbrechen deleteButtonHover = Löschen -copyUrlHover = Adresse kopieren footerLinkLegal = Rechtliches -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Über Test Pilot footerLinkPrivacy = Datenschutz -footerLinkTerms = Nutzungsbedingungen footerLinkCookies = Cookies -requirePasswordCheckbox = Zum Herunterladen dieser Datei soll ein Passwort erforderlich sein -addPasswordButton = Passwort hinzufügen -changePasswordButton = Ändern -passwordTryAgain = Falsches Passwort. Versuchen Sie es erneut. -// This label is followed by the password needed to download a file -passwordResult = Passwort: { $password } -reportIPInfringement = IP-Verletzung melden -javascriptRequired = Firefox Send benötigt JavaScript -whyJavascript = Warum benötigt Firefox Send JavaScript? -enableJavascript = Bitte akivieren Sie JavaScript und versuchen Sie es erneut. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +passwordTryAgain = Falsches Passwort. Versuche es nochmal. +javascriptRequired = Send benötigt JavaScript +whyJavascript = Warum benötigt Send JavaScript? +enableJavascript = Bitte aktiviere JavaScript und versuche es erneut. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximale Passwortlänge: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dieses Passwort konnte nicht eingerichtet werden + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Einfach und privat Dateien versenden +introDescription = Mit { -send-brand } kannst du Dateien sicher mit anderen teilen – mit End-to-End-Verschlüsselung und einem Freigabe-Link, der automatisch abläuft. So bleiben deine geteilten Inhalte privat und du kannst sicherstellen, dass deine Daten nicht für immer im Web herumschwirren. +notifyUploadEncryptDone = Deine Datei ist verschlüsselt und zum Senden bereit +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Läuft ab nach { $downloadCount } oder { $timespan } +timespanMinutes = + { $num -> + [one] 1 Minute + *[other] { $num } Minuten + } +timespanDays = + { $num -> + [one] 1 Tag + *[other] { $num } Tage + } +timespanWeeks = + { $num -> + [one] 1 Woche + *[other] { $num } Wochen + } +fileCount = + { $num -> + [one] 1 Datei + *[other] { $num } Dateien + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Gesamtgröße: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiere den Link, um deine Datei zu teilen: +copyLinkButton = Link kopieren +downloadTitle = Dateien herunterladen +downloadDescription = Diese Datei wurde über { -send-brand } mit End-to-End-Verschlüsselung und einem automatisch ablaufenden Link geteilt. +trySendDescription = Probiere { -send-brand } aus, um einfach und sicher Dateien zu versenden. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Es kann maximal eine Datei auf einmal hochgeladen werden. + *[other] Es können maximal { $count } Dateien auf einmal hochgeladen werden. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Es ist nur ein Archiv erlaubt. + *[other] Es sind nur { $count } Archive erlaubt. + } +expiredTitle = Dieser Link ist abgelaufen. +notSupportedDescription = { -send-brand } funktioniert nicht mit diesem Browser. { -send-short-brand } funktioniert am besten mit der neuesten Version von { -firefox } und funktioniert mit der aktuellen Version der meisten Browser. +downloadFirefox = { -firefox } herunterladen +legalTitle = Datenschutzerklärung zu { -send-short-brand } +legalDateStamp = Version 1.0, Stand 12. März 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Dateien zum Hochladen auswählen +trustWarningMessage = Sie sollten dem Empfänger vertrauen, wenn Sie vertrauliche Daten weitergeben. +uploadButton = Hochladen +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dateien per Drag & Drop einfügen +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = oder klicken, um bis zu { $size } zu senden +addPassword = Mit Passwort schützen +emailPlaceholder = E-Mail-Adresse eingeben +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Melde dich an, um Dateien bis { $size } zu senden +signInOnlyButton = Anmelden +accountBenefitTitle = Erstelle ein { -firefox }-Konto oder melde dich an +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dateien bis zu { $size } teilen +accountBenefitDownloadCount = Teile Dateien mit weiteren Leuten +accountBenefitTimeLimit = + { $count -> + [one] Link bis zu einen Tag lang aktiv halten + *[other] Link bis zu { $count } Tage lang aktiv halten + } +accountBenefitSync = Geteilte Dateien von anderen Geräten aus verwalten +accountBenefitMoz = Erfahre mehr über andere { -mozilla }-Dienste +signOut = Abmelden +okButton = OK +downloadingTitle = Wird heruntergeladen… +noStreamsWarning = Dieser Browser kann eine so große Datei möglicherweise nicht entschlüsseln. +noStreamsOptionCopy = Kopiere den Link, um ihn in einem anderen Browser zu öffnen +noStreamsOptionFirefox = Probiere unseren Lieblingsbrowser aus +noStreamsOptionDownload = Mit diesem Browser weitermachen +downloadFirefoxPromo = { -send-short-brand } wird Ihnen präsentiert vom brandneuen { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Teilen Sie den Link zu Ihrer Datei: +shareLinkButton = Link teilen +# $name is the name of the file +shareMessage = Laden Sie „{ $name }“ mit { -send-brand } herunter: einfaches, sicheres Teilen von Dateien +trailheadPromo = Es gibt einen Weg, deine Privatsphäre zu schützen. Komm zu Firefox. +learnMore = Mehr erfahren. +downloadFlagged = Dieser Link wurde wegen Verstoßes gegen die Nutzungsbedingungen deaktiviert. +downloadConfirmTitle = Eine Sache noch +downloadConfirmDescription = Sie sollten dem Absender dieser Datei vertrauen, da wir nicht überprüfen können, ob Ihr Gerät dadurch beschädigt wird. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Ich vertraue der Person, die diese Datei gesendet hat + *[other] Ich vertraue der Person, die diese Dateien gesendet hat + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Diese Datei als verdächtig melden + *[other] Diese Dateien als verdächtig melden + } +reportDescription = Helfen Sie uns mit weiteren Informationen. Wo liegt das Problem bei diesen Dateien? +reportUnknownDescription = Bitte besuchen Sie die Adresse des Links, den Sie melden möchten, und klicken Sie auf „{ reportFile }“. +reportButton = Melden +reportReasonMalware = Diese Dateien enthalten Malware oder sind Teil eines Phishing-Angriffs. +reportReasonPii = Diese Dateien enthalten personenbezogene Daten über mich. +reportReasonAbuse = Diese Dateien enthalten illegale oder missbräuchliche Inhalte. +reportReasonCopyright = Um Urheber- oder Markenrechtsverletzungen zu melden, nutzen Sie bitte das auf dieser Seite beschriebene Verfahren. +reportedTitle = Dateien gemeldet +reportedDescription = Vielen Dank. Wir haben Ihren Bericht über diese Dateien erhalten. diff --git a/public/locales/dsb/send.ftl b/public/locales/dsb/send.ftl index af469c333..e5d77c2df 100644 --- a/public/locales/dsb/send.ftl +++ b/public/locales/dsb/send.ftl @@ -1,119 +1,207 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webeksperiment -siteFeedback = Komentar -uploadPageHeader = Priwatne, skoděrowane źělenje datajow -uploadPageExplainer = Pósćelśo dataje pśez wěsty, priwatny a skoděrowany wótkaz, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali. -uploadPageLearnMore = Dalšne informacije -uploadPageDropMessage = Śěgniśo swóju dataju sem, aby ju nagrał -uploadPageSizeMessage = Wužywajśo nejlěpje dataje, kótarež su mjeńše ako 1 GB za lěpšu spušćobnosć. -uploadPageBrowseButton = Wubjeŕśo dataju na swójom licadle -uploadPageBrowseButton1 = Wubjeŕśo dataju za nagraśe -uploadPageMultipleFilesAlert = Nagrawanje někotarych datajow abo zarědnika se tuchylu njepódpěra. -uploadPageBrowseButtonTitle = Dataju nagraś -uploadingPageProgress = { $filename } ({ $size }) se nagrawa +# Send is a brand name and should not be localized. +title = Send importingFile = Importěrujo se... -verifyingFile = Pśespytujo se... encryptingFile = Koděrujo se... decryptingFile = Dešifrěrujo se... -notifyUploadDone = Wašo nagraśe jo dokóńcone. -uploadingPageMessage = Gaž se waša dataja nagrawa, móžośo nastajenja spadnjenja póstajiś. -uploadingPageCancel = Nagraśe pśetergnus -uploadCancelNotification = Wašo nagraśe jo se pśetergnuło. -uploadingPageLargeFileMessage = Toś ta dataja jo wjelika a nagrawanje mógło chylku traś. Buźćo sćerpliwy! -uploadingFileNotification = K wěsći daś, gaž nagraśe jo dokóńcone. -uploadSuccessConfirmHeader = Gótowy za słanje -uploadSvgAlt = Nagraś -uploadSuccessTimingHeader = Wótkaz k wašej dataji pó 1 ześěgnjenju abo 24 góźinach spadnjo. -expireInfo = Wótkaz k wašej dataji pó { $downloadCount } abo { $timespan } spadnjo. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 ześěgnjenje [two] { $num } ześěgnjeni [few] { $num } ześěgnjenja *[other] { $num } ześěgnjenjow } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 góźina [two] { $num } góźinje [few] { $num } góźiny *[other] { $num } góźin } -copyUrlFormLabelWithName = Kopěrujśo a źělśo wótkaz, aby swóju dataju pósłał: { $filename } -copyUrlFormButton = Do mjazywótkłada kopěrowaś copiedUrl = Kopěrowany! -deleteFileButton = Dataju wulašowaś -sendAnotherFileLink = Drugu dataju pósłaś -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Ześěgnuś -downloadsFileList = Ześěgnjenja -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Cas -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } ześěgnuś -downloadFileSize = ({ $size }) -unlockInputLabel = Gronidło zapódaś unlockInputPlaceholder = Gronidło unlockButtonLabel = Wótwóriś -downloadFileTitle = Skoděrowanu dataju ześěgnuś -// Firefox Send is a brand name and should not be localized. -downloadMessage = Waš pśijaśel wam dataju z Firefox Send sćelo, słužba, kótaraž wam zmóžnja, dataje pśez wěsty, priwatny a skoděrowany wótkaz źěliś, kótaryž awtomatiski spadnjo, až njeby waše daty na pśecej online wóstawali. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Ześěgnuś -downloadNotification = Wašo ześěgnjenje jo dokóńcone. downloadFinish = Ześěgnjenje dokóńcone -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send wopytaś -downloadingPageProgress = { $filename } ({ $size }) se ześěgujo -downloadingPageMessage = Pšosym wóstajśo toś ten rejtark wócynjony, mjaztym až wašu dataju ześěgujomy a dešifrěrujomy. -errorAltText = Nagrawańska zmólka +sendYourFilesLink = Send wopytaś errorPageHeader = Něco njejo se raźiło! -errorPageMessage = Pśi nagrawanju dataje jo zmólka nastała. -errorPageLink = Drugu dataju pósłaś fileTooBig = Toś ta dataja jo pśewjelika za nagraśe. Měła mjeńša ako { $size } byś. linkExpiredAlt = Wótkaz spadnjony -expiredPageHeader = Toś ten wótkaz jo spadnjony abo njejo nigda eksistěrował! notSupportedHeader = Waš wobglědowak se njepódpěra. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Bóžko toś ten wobglědowak webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo drugi wobglědowak wužywaś. My Firefox dopórucujomy! notSupportedLink = Cogodla se mój wobglědowak njepódpěra? -notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Firefox Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś. +notSupportedOutdatedDetail = Bóžko toś ta wersija Firefox webtechnologiju njepódpěra, na kótarejž Send bazěrujo. Musyśo swój wobglědowak aktualizěrowaś. updateFirefox = Firefox aktualizěrowaś -downloadFirefoxButtonSub = Dermotne ześěgnjenje -uploadedFile = Dataja -copyFileList = URL kopěrowaś -// expiryFileList is used as a column header -expiryFileList = Spadnjo za -deleteFileList = Wulašowaś -nevermindButton = Wšojadno -legalHeader = Wuměnjenja a priwatnosć -legalNoticeTestPilot = Firefox jo tuchylu eksperiment Test Pilot, a pódlažy wužywańskim wuměnjenjam a pokazce priwatnosći Test Pilot. Wěcej wó toś tom eksperimenśe a daty, kótarež gromaźi, how zgónijośo. -legalNoticeMozilla = Teke wužywanje websedła Firefox Send pokazce priwatnosći za websedła a wužywańskim wuměnjenjam za websedła Mozilla pódlažy. -deletePopupText = Toś tu dataju lašowaś? -deletePopupYes = Jo deletePopupCancel = Pśetergnuś deleteButtonHover = Wulašowaś -copyUrlHover = URL kopěrowaś footerLinkLegal = Pšawniske -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Wó Test Pilot footerLinkPrivacy = Priwatnosć -footerLinkTerms = Wuměnjenja footerLinkCookies = Cookieje -requirePasswordCheckbox = Gronidło za ześěgnjenje toś teje dataje pominaś -addPasswordButton = Gronidło pśidaś -changePasswordButton = Změniś passwordTryAgain = Wopacne gronidło. Wopytajśo hyšći raz. -// This label is followed by the password needed to download a file -passwordResult = Gronidło: { $password } -reportIPInfringement = Pśekśiwjenje IP k wěsći daś -javascriptRequired = Firefox Send JavaScript trjeba -whyJavascript = Cogodla Firefox Send JavaScript trjeba? +javascriptRequired = Send JavaScript trjeba +whyJavascript = Cogodla Send JavaScript trjeba? enableJavascript = Pšosym zmóžniśo JavaScript a wopytajśo hyšći raz. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } góź. { $minutes } min. -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min. +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna dłujkosć gronidła: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Toś to gronidło njedajo se nastajiś + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jadnore, priwatne datajowe źělenje +introDescription = { -send-brand } wam zmóžnja, dataje z koděrowanim kóńc do kóńca a wótkazom źěliś, kótaryž awtomatiski spadnjo. Tak móžośo źělone wopśimjeśe priwatne źaržaś a zawěsćiś, až waše daty online na pśecej njewóstanu. +notifyUploadEncryptDone = Waša dataja jo skoděrowana za słanje +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Spadnjo pó { $downloadCount } abo { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minuta + [two] { $num } minuśe + [few] { $num } minuty + *[other] { $num } minutow + } +timespanDays = + { $num -> + [one] { $num } źeń + [two] { $num } dnja + [few] { $num } dny + *[other] { $num } dnjow + } +timespanWeeks = + { $num -> + [one] { $num } tyźeń + [two] { $num } tyźenja + [few] { $num } tyźenje + *[other] { $num } tyźenjow + } +fileCount = + { $num -> + [one] { $num } dataja + [two] { $num } dataji + [few] { $num } dataje + *[other] { $num } datajow + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Cełkowna wjelikosć: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopěrujśo wótkaz, aby swóju dataju źělił: +copyLinkButton = Wótkaz kopěrowaś +downloadTitle = Dataje ześěgnuś +downloadDescription = Toś ta dataja jo se pśez { -send-brand } z koděrowanim kóńc do kóńca a wótkazom źěliła, kótaryž awtomatiski spadnjo. +trySendDescription = Wopytajśo { -send-brand } za jadnore, wěste datajowe źělenje. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Jano { $count } dataja dajo se naraz nagraś. + [two] Jano { $count } dataji dajotej se naraz nagraś. + [few] Jano { $count } dataje daju se naraz nagraś. + *[other] Jano { $count } datajow dajo se naraz nagraś. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Jano { $count } archiw jo dowólony. + [two] Jano { $count } archiwa stej dowólonej. + [few] Jano { $count } archiwy su dowólone. + *[other] Jano { $count } archiwow jo dowólone. + } +expiredTitle = Toś ten wótkaz jo spadnjony. +notSupportedDescription = { -send-brand } z toś tym wobglědowakom njefunkcioněrujo. { -send-short-brand } nejlěpjej z nejnowšeju wersiju { -firefox } funkcioněrujo, a funkcioněrujo z aktualneju wersiju nejwěcej wobglědowakow. +downloadFirefox = { -firefox } ześěgnuś +legalTitle = Powěźeńka priwatnosći { -send-short-brand } +legalDateStamp = Wersija 1.0 wót 12. měrca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }ź { $hours }g { $minutes }m +addFilesButton = Dataje za nagrawanje wubraś +trustWarningMessage = Wy měł dostawarjeju dowěriś, gaž sensibelne daty źěliśo. +uploadButton = Nagraś +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Śěgniśo a wótpołožćo dataje +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = abo klikniśo, aby do { $size } pósłał +addPassword = Z gronidłom šćitaś +emailPlaceholder = Zapódajśo swóju e-mailowu adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Pśizjawśo se, aby do { $size } pósłał +signInOnlyButton = Pśizjawiś +accountBenefitTitle = Załožćo konto { -firefox } abo pśizjawśo se +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dataje do { $size } źěliś +accountBenefitDownloadCount = Dataje z wěcej luźimi źěliś +accountBenefitTimeLimit = + { $count -> + [one] Wótkaze do { $count } dnja aktiwne źaržaś + [two] Wótkaze do { $count } dnjowu aktiwne źaržaś + [few] Wótkaze do { $count } dnjow aktiwne źaržaś + *[other] Wótkaze do { $count } dnjow aktiwne źaržaś + } +accountBenefitSync = Źělone dataje z někakego rěda zastojaś +accountBenefitMoz = Zgóńśo wěcej wó drugich słužbach { -mozilla } +signOut = Wótzjawiś +okButton = W pórěźe +downloadingTitle = Ześěgujo se +noStreamsWarning = Toś ten wobglědowak njamógał taku wjeliku dataju dešifrěrowaś. +noStreamsOptionCopy = Kopěrujśo wótkaz, aby jen w drugim wobglědowaku wócynił +noStreamsOptionFirefox = Wopytajśo naš nejlubšy wobglědowak +noStreamsOptionDownload = Z toś tym wobglědowakom pókšacowaś +downloadFirefoxPromo = { -send-short-brand } se wam pśez cele nowy { -firefox } pśinjaso. +# the next line after the colon contains a file name +shareLinkDescription = Źělśo wótkaz k swójej dataji: +shareLinkButton = Wótkaz źěliś +# $name is the name of the file +shareMessage = Ześěgniśo „{ $name }“ z { -send-brand }: jadnore, wěste źělenje datajow +trailheadPromo = Jo móžnosć, wašu priwatnosć šćitaś. Pśiźćo k Firefox. +learnMore = Dalšne informacije. +downloadFlagged = Toś ten wótkaz jo se znjemóžnił pśestupjenja wužywańskich wuměnjenjow dla. +downloadConfirmTitle = Jadna wěc hyšći +downloadConfirmDescription = Wy měł wótpósłarjeju toś teje dataje dowěriś, dokulaž njamóžomy pśeglědaś, lěc to waš rěd kazy. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Dowěrim wósobje, kótaraž jo pósłała toś tu dataju + [two] Dowěrim wósobje, kótaraž jo pósłała toś tej dataji + [few] Dowěrim wósobje, kótaraž jo pósłała toś te dataje + *[other] Dowěrim wósobje, kótaraž jo pósłała toś te dataje + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Toś tu dataju ako suspektnu k wěsći daś + [two] Toś tej dataji ako suspektnej k wěsći daś + [few] Toś te dataje ako suspektne k wěsći daś + *[other] Toś te dataje ako suspektne k wěsći daś + } +reportDescription = Pomagajśo nam rozumić, co se stawa. Co pó wašom měnjenju njejo w pórědku z toś tymi datajami? +reportUnknownDescription = Źiśo pšosym k URL wótkaza, kótaryž cośo k wěsći daś a klikniśo na „{ reportFile }“. +reportButton = K wěsći daś +reportReasonMalware = Toś te dataje škódnu softwaru wopśimuju abo su źěl napada kšadnjenja datow. +reportReasonPii = Toś te dataje wósobinske informacije wó mnje, kótarež mógu mě identificěrowaś. +reportReasonAbuse = Toś te dataje njedowólone abo ranjece wopśimjeśe wopśimuju. +reportReasonCopyright = Aby pśestupjenje awtorskego pšawa abo pšawa wikowwych markow k wěsći dał, wužywajśo póstupowanje, kótarež se na toś tom boku wopisujo. +reportedTitle = Dataje k wěsći dane +reportedDescription = Wjeliki źěk. Smy dostali wašu rozpšawu wó toś tych datajach. diff --git a/public/locales/el/send.ftl b/public/locales/el/send.ftl index 51040d0fb..700f500d4 100644 --- a/public/locales/el/send.ftl +++ b/public/locales/el/send.ftl @@ -1,101 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = πείραμα διαδικτύου -siteFeedback = Σχόλια -uploadPageHeader = Ιδιωτική, κρυπτογραφημένη κοινή χρήση αρχείων -uploadPageExplainer = Στείλτε αρχεία μέσω ασφαλούς, ιδιωτικού και κρυπτογραφημένου συνδέσμου που λήγει αυτόματα ώστε να διασφαλίσετε ότι τα περιεχόμενά σας δεν θα παραμείνουν στο διαδίκτυο για πάντα. -uploadPageLearnMore = Μάθετε περισσότερα -uploadPageDropMessage = Εναποθέστε το αρχείο σας εδώ για έναρξη μεταφόρτωσης -uploadPageSizeMessage = Για περισσότερο αξιόπιστη λειτουργία, προτείνεται να διατηρήσετε το αρχείο κάτω από 1GB -uploadPageBrowseButton = Επιλέξτε αρχείο από τον υπολογιστή σας -uploadPageBrowseButton1 = Επιλέξτε ένα αρχείο για μεταφόρτωση -uploadPageMultipleFilesAlert = Η μεταφόρτωση πολλαπλών αρχείων ή φακέλου δεν υποστηρίζεται αυτή τη στιγμή. -uploadPageBrowseButtonTitle = Μεταφόρτωση αρχείου -uploadingPageProgress = Μεταφόρτωση του { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Εισαγωγή… -verifyingFile = Επαλήθευση... encryptingFile = Κρυπτογράφηση… decryptingFile = Αποκρυπτογράφηση… -notifyUploadDone = Η μεταφόρτωσή σας ολοκληρώθηκε. -uploadingPageMessage = Αφού μεταφορτωθούν τα αρχεία σας, θα μπορείτε να ορίσετε επιλογές λήξης. -uploadingPageCancel = Ακύρωση μεταφόρτωσης -uploadCancelNotification = Η μεταφόρτωσή σας ακυρώθηκε. -uploadingPageLargeFileMessage = Αυτό το αρχείο είναι μεγάλο και ίσως χρειαστεί λίγος αρκετός χρόνος για μεταφόρτωση. Χαλαρώστε! -uploadingFileNotification = Ειδοποίηση όταν ολοκληρωθεί η μεταφόρτωση. -uploadSuccessConfirmHeader = Έτοιμο για αποστολή -uploadSvgAlt = Μεταφόρτωση -uploadSuccessTimingHeader = Ο σύνδεσμος του αρχείου σας θα λήξει έπειτα από 1 λήψη ή 24 ώρες. -expireInfo = Ο σύνδεσμος για το αρχείο σας θα λήξει μετά από { $downloadCount } ή { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 λήψη *[other] { $num } λήψεις } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 ώρα *[other] { $num } ώρες } -copyUrlFormLabelWithName = Αντιγράψτε και μοιραστείτε τον σύνδεσμο για αποστολή του αρχείου σας : { $filename } -copyUrlFormButton = Αντιγραφή στο πρόχειρο copiedUrl = Αντιγράφτηκε! -deleteFileButton = Διαγραφή αρχείου -sendAnotherFileLink = Αποστολή άλλου αρχείου -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Λήψη -downloadFileName = Λήψη του { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Εισαγωγή κωδικού πρόσβασης unlockInputPlaceholder = Κωδικός πρόσβασης unlockButtonLabel = Ξεκλείδωμα -downloadFileTitle = Λήψη κρυπτογραφημένου αρχείου -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ο/Η φίλος/-η σας, σάς στέλνει ένα αρχείο με τη βοήθεια του Firefox Send, μιας υπηρεσίας που επιτρέπει τον διαμοιρασμό αρχείων μέσω ενός ασφαλούς, ιδιωτικού και κρυπτογραφημένου συνδέσμου που λήγει αυτόματα, ώστε να είστε σίγουροι ότι τα αρχεία σας δεν θα παραμείνουν στο διαδίκτυο για πάντα. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Λήψη -downloadNotification = Η λήψη σας ολοκληρώθηκε. downloadFinish = Η λήψη ολοκληρώθηκε -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } από { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Δοκιμάστε το Firefox Send -downloadingPageProgress = Γίνεται λήψη του { $filename } ({ $size }) -downloadingPageMessage = Παρακαλώ αφήστε ανοικτή αυτή την καρτέλα όσο λαμβάνουμε και αποκρυπτογραφούμε το αρχείο σας. -errorAltText = Σφάλμα μεταφόρτωσης +sendYourFilesLink = Δοκιμάστε το Send errorPageHeader = Κάτι πήγε στραβά! -errorPageMessage = Παρουσιάστηκε σφάλμα κατά τη μεταφόρτωση του αρχείου. -errorPageLink = Αποστολή άλλου αρχείου fileTooBig = Αυτό το αρχείο είναι πολύ μεγάλο για μεταφόρτωση. Πρέπει να είναι μικρότερο από { $size }. linkExpiredAlt = Ο σύνδεσμος έληξε -expiredPageHeader = Αυτός ο σύνδεσμος έχει λήξει ή δεν υπήρξε ποτέ! notSupportedHeader = Το πρόγραμμα περιήγησής σας δεν υποστηρίζεται. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Δυστυχώς, αυτό το πρόγραμμα περιήγησης δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Firefox Send. Θα πρέπει να δοκιμάσετε ένα άλλο πρόγραμμα περιήγησης. Προτείνουμε το Firefox! notSupportedLink = Γιατί δεν υποστηρίζεται το πρόγραμμα περιήγησής μου; -notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Firefox Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας. +notSupportedOutdatedDetail = Δυστυχώς, αυτή η έκδοση του Firefox δεν υποστηρίζει την τεχνολογία ιστού στην οποία βασίζεται το Send. Πρέπει να ενημερώσετε το πρόγραμμα περιήγησής σας. updateFirefox = Ενημέρωση Firefox -downloadFirefoxButtonSub = Δωρεάν λήψη -uploadedFile = Αρχείο -copyFileList = Αντιγραφή URL -// expiryFileList is used as a column header -expiryFileList = Λήγει σε -deleteFileList = Διαγραφή -nevermindButton = Μην ανησυχείτε -legalHeader = Όροι & απόρρητο -legalNoticeTestPilot = Το Firefox Send αποτελεί προς το παρόν ένα πείραμα Test Pilot και υπόκειται στους όρους υπηρεσίας και την πολιτική απορρήτου του Test Pilot. Μπορείτε να μάθετε περισσότερα γι' αυτό το πείραμα και τη συλλογή δεδομένων εδώ. -legalNoticeMozilla = Η χρήση της ιστοσελίδας Firefox Send υπόκειται επίσης στην πολιτική απορρήτου ιστοσελίδων και τους όρους χρήσης ιστοσελίδων της Mozilla. -deletePopupText = Διαγραφή αρχείου; -deletePopupYes = Ναι deletePopupCancel = Ακύρωση deleteButtonHover = Διαγραφή -copyUrlHover = Αντιγραφή URL footerLinkLegal = Νομικά -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Σχετικά με το Test Pilot footerLinkPrivacy = Απόρρητο -footerLinkTerms = Όροι footerLinkCookies = Cookies -requirePasswordCheckbox = Απαίτηση κωδικού πρόσβασης για λήψη του αρχείου -addPasswordButton = Προσθήκη κωδικού πρόσβασης passwordTryAgain = Λάθος κωδικός πρόσβασης. Δοκιμάστε ξανά. -// This label is followed by the password needed to download a file -passwordResult = Κωδικός πρόσβασης: { $password } -reportIPInfringement = Αναφορά παραβίασης IP +javascriptRequired = Το Send απαιτεί JavaScript +whyJavascript = Γιατί το Send απαιτεί JavaScript; +enableJavascript = Παρακαλώ ενεργοποιήστε το JavaScript και δοκιμάστε ξανά. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ώ { $minutes }λ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }λ +# A short status message shown when the user enters a long password +maxPasswordLength = Μέγιστο μήκος κωδικού: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Δεν ήταν δυνατός ο ορισμός αυτού του κωδικού + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Απλή, ιδιωτική κοινή χρήση αρχείων +introDescription = Το { -send-brand } σάς επιτρέπει να μοιράζεστε αρχεία με από άκρη σε άκρη κρυπτογράφηση και ένα σύνδεσμο που λήγει αυτόματα. Έτσι, ό,τι μοιράζεστε παραμένει ιδιωτικό και είστε βέβαιοι πως δεν παραμένει στο διαδίκτυο για πάντα. +notifyUploadEncryptDone = Το αρχείο σας έχει κρυπτογραφηθεί και είναι έτοιμο για αποστολή +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Λήγει μετά από { $downloadCount } ή { $timespan } +timespanMinutes = + { $num -> + [one] 1 λεπτό + *[other] { $num } λεπτά + } +timespanDays = + { $num -> + [one] 1 ημέρα + *[other] { $num } ημέρες + } +timespanWeeks = + { $num -> + [one] 1 εβδομάδα + *[other] { $num } εβδομάδες + } +fileCount = + { $num -> + [one] 1 αρχείο + *[other] { $num } αρχεία + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Συνολικό μέγεθος: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Αντιγράψτε το σύνδεσμο για να μοιραστείτε το αρχείο: +copyLinkButton = Αντιγραφή συνδέσμου +downloadTitle = Λήψη αρχείων +downloadDescription = Αυτό το αρχείο διαμοιράστηκε μέσω του { -send-brand } με κρυπτογράφηση από άκρο σε άκρο και με ένα σύνδεσμο που λήγει αυτόματα. +trySendDescription = Δοκιμάστε το { -send-brand } για απλό, ασφαλή διαμοιρασμό αρχείων. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Μόνο 1 αρχείο μπορεί να μεταφορτωθεί κάθε φορά. + *[other] Μόνο { $count } αρχεία μπορούν να μεταφορτωθούν κάθε φορά. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Μόνο 1 αρχείο επιτρέπεται. + *[other] Μόνο { $count } αρχεία επιτρέπονται. + } +expiredTitle = Αυτός ο σύνδεσμος έχει λήξει. +notSupportedDescription = Το { -send-brand } δεν θα λειτουργήσει με αυτό το πρόγραμμα περιήγησης. Το { -send-short-brand } λειτουργεί καλύτερα με την πιο πρόσφατη έκδοση του { -firefox }, καθώς και με την τρέχουσα έκδοση των περισσότερων προγραμμάτων περιήγησης. +downloadFirefox = Λήψη του { -firefox } +legalTitle = Σημείωση Απορρήτου { -send-short-brand } +legalDateStamp = Έκδοση 1.0, από 12 Μαρτίου 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }η { $hours }ώ { $minutes }λ +addFilesButton = Επιλέξτε αρχεία για μεταφόρτωση +trustWarningMessage = Βεβαιωθείτε ότι ο παραλήπτης είναι έμπιστος πριν μοιραστείτε ευαίσθητα δεδομένα. +uploadButton = Μεταφόρτωση +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Σύρετε και εναποθέστε αρχεία +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ή κάντε κλικ για να στείλετε μέχρι { $size } +addPassword = Προστασία με κωδικό πρόσβασης +emailPlaceholder = Εισάγετε το email σας +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Συνδεθείτε για να στείλετε μέχρι { $size } +signInOnlyButton = Σύνδεση +accountBenefitTitle = Δημιουργία λογαριασμού { -firefox } ή σύνδεση +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Μοιραστείτε αρχεία έως { $size } +accountBenefitDownloadCount = Μοιραστείτε αρχεία με περισσότερα άτομα +accountBenefitTimeLimit = + { $count -> + [one] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και 1 ημέρα + *[other] Να παραμείνουν οι σύνδεσμοι ενεργοί έως και { $count } ημέρες + } +accountBenefitSync = Διαχειριστείτε τα διαμοιρασμένα αρχεία από οποιαδήποτε συσκευή +accountBenefitMoz = Μάθετε για τις άλλες υπηρεσίες της { -mozilla } +signOut = Αποσύνδεση +okButton = OK +downloadingTitle = Γίνεται λήψη +noStreamsWarning = Αυτό το πρόγραμμα περιήγησης ενδέχεται να μην μπορέσει να αποκρυπτογραφήσει αρχεία αυτού του μεγέθους. +noStreamsOptionCopy = Αντιγράψτε το σύνδεσμο για άνοιγμα σε άλλο πρόγραμμα περιήγησης +noStreamsOptionFirefox = Δοκιμάστε το αγαπημένο μας πρόγραμμα περιήγησης +noStreamsOptionDownload = Συνέχεια με αυτό το πρόγραμμα περιήγησης +downloadFirefoxPromo = Το { -send-short-brand } παρέχεται σε εσάς από το ολοκαίνουριο { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Μοιραστείτε το σύνδεσμο του αρχείου σας: +shareLinkButton = Κοινή χρήση συνδέσμου +# $name is the name of the file +shareMessage = Λήψη του “{ $name }” με το { -send-brand }: απλός και ασφαλής διαμοιρασμός αρχείων +trailheadPromo = Υπάρχει τρόπος να προστατέψετε το απόρρητό σας. Γίνετε μέλος του Firefox. +learnMore = Μάθετε περισσότερα. +downloadFlagged = Αυτός ο σύνδεσμος έχει απενεργοποιηθεί λόγω παραβίασης των όρων υπηρεσίας. +downloadConfirmTitle = Κάτι ακόμα +downloadConfirmDescription = Βεβαιωθείτε ότι το αρχείο προέρχεται από έμπιστο άτομο, καθώς δεν μπορούμε να επαληθεύσουμε ότι δεν θα βλάψει τη συσκευή σας. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Εμπιστεύομαι το άτομο που έστειλε το αρχείο + *[other] Εμπιστεύομαι το άτομο που έστειλε τα αρχεία + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Αναφορά ύποπτου αρχείου + *[other] Αναφορά ύποπτων αρχείων + } +reportDescription = Βοηθήστε μας να καταλάβουμε τι συμβαίνει. Τι νομίζετε ότι δεν πάει καλά με αυτά τα αρχεία; +reportUnknownDescription = Παρακαλούμε μεταβείτε στο URL του συνδέσμου που θέλετε να αναφέρετε και κάντε κλικ στο "{ reportFile }". +reportButton = Αναφορά +reportReasonMalware = Αυτά τα αρχεία περιέχουν κακόβουλο λογισμικό ή αποτελούν μέρος μιας επίθεσης ηλεκτρονικού ψαρέματος. +reportReasonPii = Αυτά τα αρχεία περιέχουν προσωπικές μου πληροφορίες ταυτοποίησης. +reportReasonAbuse = Αυτά τα αρχεία περιέχουν παράνομο ή καταχρηστικό περιεχόμενο. +reportReasonCopyright = Για να αναφέρετε παραβίαση πνευματικών δικαιωμάτων ή εμπορικών σημάτων, χρησιμοποιήστε τη διαδικασία που περιγράφεται σε αυτή τη σελίδα. +reportedTitle = Έγινε αναφορά των αρχείων +reportedDescription = Σας ευχαριστούμε. Λάβαμε την αναφορά σας για τα αρχεία. diff --git a/public/locales/en-CA/send.ftl b/public/locales/en-CA/send.ftl new file mode 100644 index 000000000..a8bac8c43 --- /dev/null +++ b/public/locales/en-CA/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Importing… +encryptingFile = Encrypting… +decryptingFile = Decrypting… +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = + { $num -> + [one] 1 hour + *[other] { $num } hours + } +copiedUrl = Copied! +unlockInputPlaceholder = Password +unlockButtonLabel = Unlock +downloadButtonLabel = Download +downloadFinish = Download Complete +fileSizeProgress = ({ $partialSize } of { $totalSize }) +sendYourFilesLink = Try Send +errorPageHeader = Something went wrong! +fileTooBig = That file is too big to upload. It should be less than { $size }. +linkExpiredAlt = Link expired +notSupportedHeader = Your browser is not supported. +notSupportedLink = Why is my browser not supported? +notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. +updateFirefox = Update Firefox +deletePopupCancel = Cancel +deleteButtonHover = Delete +footerLinkLegal = Legal +footerLinkPrivacy = Privacy +footerLinkCookies = Cookies +passwordTryAgain = Incorrect password. Try again. +javascriptRequired = Send requires JavaScript +whyJavascript = Why does Send require JavaScript? +enableJavascript = Please enable JavaScript and try again. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximum password length: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = This password could not be set + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simple, private file sharing +introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. +notifyUploadEncryptDone = Your file is encrypted and ready to send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = + { $num -> + [one] 1 day + *[other] { $num } days + } +timespanWeeks = + { $num -> + [one] 1 week + *[other] { $num } weeks + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } files + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total size: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copy the link to share your file: +copyLinkButton = Copy link +downloadTitle = Download files +downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. +trySendDescription = Try { -send-brand } for simple, safe file sharing. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Only 1 file can be uploaded at a time. + *[other] Only { $count } files can be uploaded at a time. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Only 1 archive is allowed. + *[other] Only { $count } archives are allowed. + } +expiredTitle = This link has expired. +notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. +downloadFirefox = Download { -firefox } +legalTitle = { -send-short-brand } Privacy Notice +legalDateStamp = Version 1.0, dated March 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Select files to upload +trustWarningMessage = Make sure you trust your recipient when sharing sensitive data. +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Drag and drop files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = or click to send up to { $size } +addPassword = Protect with password +emailPlaceholder = Enter your email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Sign in to send up to { $size } +signInOnlyButton = Sign in +accountBenefitTitle = Create a { -firefox } Account or sign in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Share files up to { $size } +accountBenefitDownloadCount = Share files with more people +accountBenefitTimeLimit = + { $count -> + [one] Keep links active for up to 1 day + *[other] Keep links active for up to { $count } days + } +accountBenefitSync = Manage shared files from any device +accountBenefitMoz = Learn about other { -mozilla } services +signOut = Sign out +okButton = OK +downloadingTitle = Downloading +noStreamsWarning = This browser might not be able to decrypt a file this big. +noStreamsOptionCopy = Copy the link to open in another browser +noStreamsOptionFirefox = Try our favourite browser +noStreamsOptionDownload = Continue with this browser +downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Share the link to your file: +shareLinkButton = Share link +# $name is the name of the file +shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing +trailheadPromo = There is a way to protect your privacy. Join Firefox. +learnMore = Learn more. +downloadFlagged = This link has been disabled for violating the terms of service. +downloadConfirmTitle = One more thing +downloadConfirmDescription = Make sure you trust the person who sent you this file because we can’t verify that it will not harm your device. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] I trust the person who sent this file + *[other] I trust the person who sent these files + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Report this file as suspicious + *[other] Report these files as suspicious + } +reportDescription = Help us understand what’s going on. What do you think is wrong with these files? +reportUnknownDescription = Please go to the URL of the link you wish to report and click “{ reportFile }”. +reportButton = Report +reportReasonMalware = These files contain malware or are part of a phishing attack. +reportReasonPii = These files contain personally identifiable information about me. +reportReasonAbuse = These files contain illegal or abusive content. +reportReasonCopyright = To report copyright or trademark infringement, use the process described at this page. +reportedTitle = Files Reported +reportedDescription = Thank you. We have received your report on these files. diff --git a/public/locales/en-GB/send.ftl b/public/locales/en-GB/send.ftl new file mode 100644 index 000000000..5f9f2576b --- /dev/null +++ b/public/locales/en-GB/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Importing… +encryptingFile = Encrypting… +decryptingFile = Decrypting… +downloadCount = + { $num -> + [one] 1 download + *[other] { $num } downloads + } +timespanHours = + { $num -> + [one] 1 hour + *[other] { $num } hours + } +copiedUrl = Copied! +unlockInputPlaceholder = Password +unlockButtonLabel = Unlock +downloadButtonLabel = Download +downloadFinish = Download Complete +fileSizeProgress = ({ $partialSize } of { $totalSize }) +sendYourFilesLink = Try Send +errorPageHeader = Something went wrong! +fileTooBig = That file is too big to upload. It should be less than { $size }. +linkExpiredAlt = Link expired +notSupportedHeader = Your browser is not supported. +notSupportedLink = Why is my browser not supported? +notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. +updateFirefox = Update Firefox +deletePopupCancel = Cancel +deleteButtonHover = Delete +footerLinkLegal = Legal +footerLinkPrivacy = Privacy +footerLinkCookies = Cookies +passwordTryAgain = Incorrect password. Try again. +javascriptRequired = Send requires JavaScript +whyJavascript = Why does Send require JavaScript? +enableJavascript = Please enable JavaScript and try again. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximum password length: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = This password could not be set + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simple, private file sharing +introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. +notifyUploadEncryptDone = Your file is encrypted and ready to send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = + { $num -> + [one] 1 day + *[other] { $num } days + } +timespanWeeks = + { $num -> + [one] 1 week + *[other] { $num } weeks + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } files + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total size: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copy the link to share your file: +copyLinkButton = Copy link +downloadTitle = Download files +downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. +trySendDescription = Try { -send-brand } for simple, safe file sharing. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Only 1 file can be uploaded at a time. + *[other] Only { $count } files can be uploaded at a time. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Only 1 archive is allowed. + *[other] Only { $count } archives are allowed. + } +expiredTitle = This link has expired. +notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. +downloadFirefox = Download { -firefox } +legalTitle = { -send-short-brand } Privacy Notice +legalDateStamp = Version 1.0, dated March 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Select files to upload +trustWarningMessage = Make sure you trust your recipient when sharing sensitive data. +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Drag and drop files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = or click to send up to { $size } +addPassword = Protect with password +emailPlaceholder = Enter your email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Sign in to send up to { $size } +signInOnlyButton = Sign in +accountBenefitTitle = Create a { -firefox } Account or sign in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Share files up to { $size } +accountBenefitDownloadCount = Share files with more people +accountBenefitTimeLimit = + { $count -> + [one] Keep links active for up to 1 day + *[other] Keep links active for up to { $count } days + } +accountBenefitSync = Manage shared files from any device +accountBenefitMoz = Learn about other { -mozilla } services +signOut = Sign out +okButton = OK +downloadingTitle = Downloading +noStreamsWarning = This browser might not be able to decrypt a file this big. +noStreamsOptionCopy = Copy the link to open in another browser +noStreamsOptionFirefox = Try our favourite browser +noStreamsOptionDownload = Continue with this browser +downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Share the link to your file: +shareLinkButton = Share link +# $name is the name of the file +shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing +trailheadPromo = There is a way to protect your privacy. Join Firefox. +learnMore = Learn more. +downloadFlagged = This link has been disabled for violating the terms of service. +downloadConfirmTitle = One more thing +downloadConfirmDescription = Make sure you trust the person who sent you this file because we can’t verify that it will not harm your device. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] I trust the person who sent this file + *[other] I trust the person who sent these files + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Report this file as suspicious + *[other] Report these files as suspicious + } +reportDescription = Help us understand what’s going on. What do you think is wrong with these files? +reportUnknownDescription = Please go to the url of the link you wish to report and click “{ reportFile }”. +reportButton = Report +reportReasonMalware = These files contain malware or are part of a phishing attack. +reportReasonPii = These files contain personally identifiable information about me. +reportReasonAbuse = These files contain illegal or abusive content. +reportReasonCopyright = To report copyright or trademark infringement, use the process described at this page. +reportedTitle = Files Reported +reportedDescription = Thank you. We have received your report on these files. diff --git a/public/locales/en-US/send.ftl b/public/locales/en-US/send.ftl index 049c498e3..3893ad161 100644 --- a/public/locales/en-US/send.ftl +++ b/public/locales/en-US/send.ftl @@ -1,31 +1,8 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = web experiment -siteFeedback = Feedback -uploadPageHeader = Private, Encrypted File Sharing -uploadPageExplainer = Send files through a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever. -uploadPageLearnMore = Learn more -uploadPageDropMessage = Drop your file here to start uploading -uploadPageSizeMessage = For the most reliable operation, it’s best to keep your file under 1GB -uploadPageBrowseButton = Select a file on your computer -uploadPageBrowseButton1 = Select a file to upload -uploadPageMultipleFilesAlert = Uploading multiple files or a folder is currently not supported. -uploadPageBrowseButtonTitle = Upload file -uploadingPageProgress = Uploading { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importing… -verifyingFile = Verifying… encryptingFile = Encrypting… decryptingFile = Decrypting… -notifyUploadDone = Your upload has finished. -uploadingPageMessage = Once your file uploads you will be able to set expiry options. -uploadingPageCancel = Cancel upload -uploadCancelNotification = Your upload was cancelled. -uploadingPageLargeFileMessage = This file is large and may take a while to upload. Sit tight! -uploadingFileNotification = Notify me when the upload is complete. -uploadSuccessConfirmHeader = Ready to Send -uploadSvgAlt = Upload -uploadSuccessTimingHeader = The link to your file will expire after 1 download or in 24 hours. -expireInfo = The link to your file will expire after { $downloadCount } or { $timespan }. downloadCount = { $num -> [one] 1 download *[other] { $num } downloads @@ -34,82 +11,167 @@ timespanHours = { $num -> [one] 1 hour *[other] { $num } hours } -copyUrlFormLabelWithName = Copy and share the link to send your file: { $filename } -copyUrlFormButton = Copy to clipboard copiedUrl = Copied! -deleteFileButton = Delete file -sendAnotherFileLink = Send another file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Download -downloadsFileList = Downloads -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Time -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Download { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Enter Password unlockInputPlaceholder = Password unlockButtonLabel = Unlock -downloadFileTitle = Download Encrypted File -// Firefox Send is a brand name and should not be localized. -downloadMessage = Your friend is sending you a file with Firefox Send, a service that allows you to share files with a safe, private, and encrypted link that automatically expires to ensure your stuff does not remain online forever. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Download -downloadNotification = Your download has completed. -downloadFinish = Download Complete -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Download complete fileSizeProgress = ({ $partialSize } of { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Try Firefox Send -downloadingPageProgress = Downloading { $filename } ({ $size }) -downloadingPageMessage = Please leave this tab open while we fetch your file and decrypt it. -errorAltText = Upload error +sendYourFilesLink = Try Send errorPageHeader = Something went wrong! -errorPageMessage = There has been an error uploading the file. -errorPageLink = Send another file -fileTooBig = That file is too big to upload. It should be less than { $size }. +fileTooBig = That file is too big to upload. It should be less than { $size } linkExpiredAlt = Link expired -expiredPageHeader = This link has expired or never existed in the first place! notSupportedHeader = Your browser is not supported. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Unfortunately this browser does not support the web technology that powers Firefox Send. You’ll need to try another browser. We recommend Firefox! notSupportedLink = Why is my browser not supported? -notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Firefox Send. You’ll need to update your browser. +notSupportedOutdatedDetail = Unfortunately this version of Firefox does not support the web technology that powers Send. You’ll need to update your browser. updateFirefox = Update Firefox -downloadFirefoxButtonSub = Free Download -uploadedFile = File -copyFileList = Copy URL -// expiryFileList is used as a column header -expiryFileList = Expires In -deleteFileList = Delete -nevermindButton = Never mind -legalHeader = Terms & Privacy -legalNoticeTestPilot = Firefox Send is currently a Test Pilot experiment, and subject to the Test Pilot Terms of Service and Privacy Notice. You can learn more about this experiment and its data collection here. -legalNoticeMozilla = Use of the Firefox Send website is also subject to Mozilla’s Websites Privacy Notice and Websites Terms of Use. -deletePopupText = Delete this file? -deletePopupYes = Yes deletePopupCancel = Cancel deleteButtonHover = Delete -copyUrlHover = Copy URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = About Test Pilot footerLinkPrivacy = Privacy -footerLinkTerms = Terms footerLinkCookies = Cookies -requirePasswordCheckbox = Require a password to download this file -addPasswordButton = Add password -changePasswordButton = Change passwordTryAgain = Incorrect password. Try again. -// This label is followed by the password needed to download a file -passwordResult = Password: { $password } -reportIPInfringement = Report IP Infringement -javascriptRequired = Firefox Send requires JavaScript -whyJavascript = Why does Firefox Send require JavaScript? +javascriptRequired = Send requires JavaScript +whyJavascript = Why does Send require JavaScript? enableJavascript = Please enable JavaScript and try again. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" -expiresMinutes = { $minutes }m \ No newline at end of file +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximum password length: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = This password could not be set + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla + +introTitle = Simple, private file sharing +introDescription = { -send-brand } lets you share files with end-to-end encryption and a link that automatically expires. So you can keep what you share private and make sure your stuff doesn’t stay online forever. +notifyUploadEncryptDone = Your file is encrypted and ready to send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expires after { $downloadCount } or { $timespan } +timespanMinutes = { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = { $num -> + [one] 1 day + *[other] { $num } days + } +timespanWeeks = { $num -> + [one] 1 week + *[other] { $num } weeks + } +fileCount = { $num -> + [one] 1 file + *[other] { $num } files +} +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total size: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copy the link to share your file: +copyLinkButton = Copy link +downloadTitle = Download files +downloadDescription = This file was shared via { -send-brand } with end-to-end encryption and a link that automatically expires. +trySendDescription = Try { -send-brand } for simple, safe file sharing. +# count will always be > 10 +tooManyFiles = { $count -> + [one] Only 1 file can be uploaded at a time. + *[other] Only { $count } files can be uploaded at a time. +} +# count will always be > 10 +tooManyArchives = { $count -> + [one] Only 1 archive is allowed. + *[other] Only { $count } archives are allowed. +} +expiredTitle = This link has expired. +notSupportedDescription = { -send-brand } will not work with this browser. { -send-short-brand } works best with the latest version of { -firefox }, and will work with the current version of most browsers. +downloadFirefox = Download { -firefox } +legalTitle = { -send-short-brand } Privacy Notice +legalDateStamp = Version 1.0, dated March 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Select files to upload +trustWarningMessage = Make sure you trust your recipient when sharing sensitive data. +uploadButton = Upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Drag and drop files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = or click to send up to { $size } +addPassword = Protect with password +emailPlaceholder = Enter your email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Sign in to send up to { $size } +signInOnlyButton = Sign in +accountBenefitTitle = Create a { -firefox } Account or sign in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Share files up to { $size } +accountBenefitDownloadCount = Share files with more people +accountBenefitTimeLimit = { $count -> + [one] Keep links active for up to 1 day + *[other] Keep links active for up to { $count } days +} +accountBenefitSync = Manage shared files from any device +accountBenefitMoz = Learn about other { -mozilla } services +signOut = Sign out +okButton = OK +downloadingTitle = Downloading +noStreamsWarning = This browser might not be able to decrypt a file this big. +noStreamsOptionCopy = Copy the link to open in another browser +noStreamsOptionFirefox = Try our favorite browser +noStreamsOptionDownload = Continue with this browser +downloadFirefoxPromo = { -send-short-brand } is brought to you by the all-new { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Share the link to your file: +shareLinkButton = Share link +# $name is the name of the file +shareMessage = Download “{ $name }” with { -send-brand }: simple, safe file sharing +trailheadPromo = There is a way to protect your privacy. Join Firefox. +learnMore = Learn more. +downloadFlagged = This link has been disabled for violating the terms of service. +downloadConfirmTitle = One more thing +downloadConfirmDescription = Make sure you trust the person who sent you this file because we can’t verify that it will not harm your device. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] I trust the person who sent this file + *[other] I trust the person who sent these files + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Report this file as suspicious + *[other] Report these files as suspicious + } +reportDescription = Help us understand what’s going on. What do you think is wrong with these files? +reportUnknownDescription = Please go to the url of the link you wish to report and click “{ reportFile }”. +reportButton = Report +reportReasonMalware = These files contain malware or are part of a phishing attack. +reportReasonPii = These files contain personally identifiable information about me. +reportReasonAbuse = These files contain illegal or abusive content. +reportReasonCopyright = To report copyright or trademark infringement, use the process described at this page. +reportedTitle = Files Reported +reportedDescription = Thank you. We have received your report on these files. diff --git a/public/locales/es-AR/send.ftl b/public/locales/es-AR/send.ftl index 795495240..7e4365f46 100644 --- a/public/locales/es-AR/send.ftl +++ b/public/locales/es-AR/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Opinión -uploadPageHeader = Compartir archivos cifrados y privados -uploadPageExplainer = Enviá archivos a través de un enlace cifrado, privado y seguro que expirará automáticamente para que tus datos no queden en línea para siempre. -uploadPageLearnMore = Conocer más -uploadPageDropMessage = Arrastrá el archivo hasta acá para empezar a subir -uploadPageSizeMessage = Para una operación más confiable, es mejor que el archivo tenga menos de 1GB -uploadPageBrowseButton = Seleccioná un archivo en tu computadora -uploadPageBrowseButton1 = Seleccioná un archivo para subir -uploadPageMultipleFilesAlert = Cargar múltiples archivos o una carpeta todavía no está soportado. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importando… -verifyingFile = Verificando… encryptingFile = Cifrando… decryptingFile = Descifrando… -notifyUploadDone = La carga ha terminado. -uploadingPageMessage = Una vez que se cargue el archivo podrás modificar las opciones de expiración. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = La subida fue cancelada. -uploadingPageLargeFileMessage = El archivo es grande y puede tardar un rato en subir. ¡Quedate quieto! -uploadingFileNotification = Notificarme cuando la subida se complete. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace al archivo expirará después de 1 descarga o en 24 horas. -expireInfo = El enlace a tu archivo expirará después de { $downloadCount } o { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 descarga *[other] { $num } descargas } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hora *[other] { $num } horas } -copyUrlFormLabelWithName = Copiá y compartí el enlace para enviar tu archivo: { $filename } -copyUrlFormButton = Copiar al portapapeles copiedUrl = ¡Copiado! -deleteFileButton = Borrar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadsFileList = Descargas -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tiempo -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Descargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ingresar contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Descargar archivo cifrado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que permite compartir archivos con un enlace cifrado, seguro y privado que expira automáticamente para asegurar que tus datos no quedan en línea para siempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = La descarga se completó. downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Probá Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Dejá esta pestaña abierta mientras descargamos el archivo y lo desciframos. -errorAltText = Error de subida +sendYourFilesLink = Probá Send errorPageHeader = ¡Algo falló! -errorPageMessage = Hubo un error al subir el archivo. -errorPageLink = Enviar otro archivo fileTooBig = El archivo es demasiado grande para subir. Debería tener menos de { $size }. linkExpiredAlt = Enlace explirado -expiredPageHeader = ¡Este enlace ha expirado o nunca existió en primer lugar! notSupportedHeader = El navegador no está soportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Desafortunadamente este navegador no soporta la tecnología web que necesita Firefox Send. Deberías probar otro navegador. ¡Te recomendamos Firefox! notSupportedLink = ¿Por qué mi navegador no está soportado? -notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Firefox Send. Necesitás actualizar el navegador. +notSupportedOutdatedDetail = Desafortunadamente esta versión de Firefox no soporta la tecnología web que necesita Send. Necesitás actualizar el navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira en -deleteFileList = Borrar -nevermindButton = No importa -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send es actualmente un experimento de Test Pilot y está sujeto a los términos de servicio y la nota de privacidad de Test Pilot. Podés conocer más sobre este experimento y su recolección de datos aquí. -legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto a la nota de privacidad de sitios web y los términos de uso de sitios web de Mozilla. -deletePopupText = ¿Borrar este archivo? -deletePopupYes = Si deletePopupCancel = Cancelar deleteButtonHover = Borrar -copyUrlHover = Copiar URL footerLinkLegal = Legales -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca de Test Pilot footerLinkPrivacy = Privacidad -footerLinkTerms = Términos footerLinkCookies = Cookies -requirePasswordCheckbox = Requerir contraseña para descargar este archivo -addPasswordButton = Agregar contraseña -changePasswordButton = Cambiar passwordTryAgain = Contraseña incorrecta. Intentá nuevamente. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } -reportIPInfringement = Informar violación de propiedad intelectual -javascriptRequired = Firefox Send requiere JavaScript -whyJavascript = ¿Por qué Firefox Send requiere Java Script? +javascriptRequired = Send requiere JavaScript +whyJavascript = ¿Por qué Send requiere Java Script? enableJavascript = Por favor habilite JavaScript y pruebe de nuevo. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = h { $hours } m { $minutes } -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = m { $minutes } +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No se pudo establecer la contraseña + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Intercambio de archivos sencillo y privado +introDescription = { -send-brand } le permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así puede mantener privado lo que comparte y asegurarse de que sus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = Su archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Vence después de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir su archivo: +copyLinkButton = Copiar enlace +downloadTitle = Descargar archivos +downloadDescription = Este archivo se compartió a través de { -send-brand } con cifrado de extremo a extremo y un enlace que caduca automáticamente. +trySendDescription = Pruebe { -send-brand } para compartir archivos de forma sencilla y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo se puede subir 1 archivo a la vez. + *[other] Solo se pueden subir archivos { $count } a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo se permite 1 archivo. + *[other] Solo se permiten { $count } archivos. + } +expiredTitle = Este enlace caducó. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox }, y funcionará con la versión actual de la mayoría de los navegadores. +downloadFirefox = Descargue { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0, con fecha 12 de marzo de 2019. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Seleccionar archivos para subir +trustWarningMessage = Asegurate de que confiás en tu destinatario cuando compartís datos confidenciales. +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastrar y soltar archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o haga clic para enviar hasta { $size } +addPassword = Proteger con contraseña +emailPlaceholder = Ingrese su correo electrónico +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Inicie sesión para enviar hasta { $size } +signInOnlyButton = Iniciar sesión +accountBenefitTitle = Cree una cuenta de { -firefox } o inicie la sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir archivos hasta { $size } +accountBenefitDownloadCount = Compartir archivos con más personas +accountBenefitTimeLimit = + { $count -> + [one] Mantenga los enlaces activos hasta por 1 día + *[other] Mantenga los enlaces activos hasta por { $count } días + } +accountBenefitSync = Administre archivos compartidos desde cualquier dispositivo. +accountBenefitMoz = Conocer sobre otros servicios de { -mozilla } +signOut = Salir +okButton = Aceptar +downloadingTitle = Descargando +noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador. +noStreamsOptionFirefox = Pruebe nuestro navegador favorito +noStreamsOptionDownload = Continuar con este navegador +downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Compartir el enlace con tu dispositivo: +shareLinkButton = Compartir el enlace +# $name is the name of the file +shareMessage = Descargar "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura +trailheadPromo = Hay una forma de proteger tu privacidad. Unite a Firefox. +learnMore = Conocer más. +downloadFlagged = Este enlace fue deshabilitado por violar los términos del servicio. +downloadConfirmTitle = Una cosa más +downloadConfirmDescription = Asegurate de confiar en la persona que te envió este archivo porque no podemos verificar que no va a dañar tu dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Confío en la persona que envió este archivo + *[other] Confío en la persona que envió estos archivos + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Denunciar este archivo como sospechoso + *[other] Denunciar estos archivos como sospechosos + } +reportDescription = Ayudanos a entender lo que está pasando. ¿Qué creés que está mal con estos archivos? +reportUnknownDescription = Navegá a la url del enlace que querés denunciar y hacé clic en "{ reportFile }". +reportButton = Denunciar +reportReasonMalware = Estos archivos contienen programas dañinos o son parte de un fraude electrónico. +reportReasonPii = Estos archivos contienen información personal que me puede identificar. +reportReasonAbuse = Estos archivos contienen contenido ilegal o abusivo. +reportReasonCopyright = Para denunciar una infracción de derechos de autor o de marca registrada, seguí el proceso descrito en esta página. +reportedTitle = Archivos denunciados +reportedDescription = Gracias. Recibimos tu denuncia sobre estos archivos. diff --git a/public/locales/es-CL/send.ftl b/public/locales/es-CL/send.ftl index 856d84d94..49f89f865 100644 --- a/public/locales/es-CL/send.ftl +++ b/public/locales/es-CL/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Comentarios -uploadPageHeader = Compartir archivos de forma privada y cifrada -uploadPageExplainer = Enviar archivos a través de un enlace seguro, privado y cifrado que automáticamente expira para asegurar que tus cosas no permanecerán en línea por la eternidad. -uploadPageLearnMore = Aprender más -uploadPageDropMessage = Suelta tu archivo aquí para empezar a subirlo -uploadPageSizeMessage = Para una operación más confiable, es mejor mantener el tamaño del archivo bajo 1 GB -uploadPageBrowseButton = Selecciona un archivo en tu computador -uploadPageBrowseButton1 = Selecciona un archivo a subir -uploadPageMultipleFilesAlert = Subir múltiples archivos o una carpeta actualmente no es posible. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importando… -verifyingFile = Verificando… encryptingFile = Cifrando… decryptingFile = Descifrando… -notifyUploadDone = Tu subida ha terminado. -uploadingPageMessage = Una vez que tu archivo sea subido podrás ajustar las opciones de expiración. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = Tu subida fue cancelada. -uploadingPageLargeFileMessage = Este archivo es grande y puede tardar un rato en subir. ¡Aprovecha de hacer algo mientras! -uploadingFileNotification = Notificarme cuando la subida sea completada. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace a tu archivo expirará tras 1 descarga o en 24 horas. -expireInfo = El enlace a tu archivo expirará después de { $downloadCount } o { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 descarga *[other] { $num } descargas } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hora *[other] { $num } horas } -copyUrlFormLabelWithName = Copia y comparte el enlace para enviar tu archivo: { $filename } -copyUrlFormButton = Copiar al portapapeles copiedUrl = ¡Copiado! -deleteFileButton = Eliminar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadsFileList = Descargas -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tiempo -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Descargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ingresar contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Bajar archivo cifrado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo con Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que expira automáticamente para asegurar que tus cosas no queden en línea de por vida. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = Tu descarga se completó. downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Probar Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Por favor, deja esta pestaña abierta mientras recibimos tu archivo y lo desciframos. -errorAltText = Error de subida +sendYourFilesLink = Probar Send errorPageHeader = ¡Algo se fue a las pailas! -errorPageMessage = Hubo un error al subir el archivo. -errorPageLink = Enviar otro archivo fileTooBig = Ese archivo es muy grande para ser subido. Debiera tener un tamaño menor a { $size }. linkExpiredAlt = Enlace expirado -expiredPageHeader = ¡Este enlace ha expirado o quizá jamás existió! notSupportedHeader = Tu navegador no está soportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Lamentablemente este navegador no soporta la tecnología web que potencia a Firefox Send. Deberás probar en otro navegador. ¡Recomendamos Firefox! notSupportedLink = ¿Por qué mi navegador no es soportado? -notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador. +notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira en -deleteFileList = Eliminar -nevermindButton = Da lo mismo -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send es actualmente un experimento de Test Pilot, y está sujeto a los Términos del servicio y la Política de privacidad de Test Pilot. Puedes aprender más sobre este experimento y su recolección de datos aquí. -legalNoticeMozilla = El uso del sitio web de Firefox Send también está sujeto a la Política de privacidad de sitios web y los Términos de uso de sitios web de Mozilla. -deletePopupText = ¿Eliminar este archivo? -deletePopupYes = Sí deletePopupCancel = Cancelar deleteButtonHover = Eliminar -copyUrlHover = Copiar URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca de Test Pilot footerLinkPrivacy = Privacidad -footerLinkTerms = Términos footerLinkCookies = Cookies -requirePasswordCheckbox = Requerir una contraseña para descargar este archivo -addPasswordButton = Añadir contraseña -changePasswordButton = Cambiar passwordTryAgain = Contraseña incorrecta. Vuelve a intentarlo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } -reportIPInfringement = Reportar infracción de PI -javascriptRequired = Firefox Send requiere JavaScript. -whyJavascript = ¿Por qué Firefox Send requiere JavaScript? +javascriptRequired = Send requiere JavaScript. +whyJavascript = ¿Por qué Send requiere JavaScript? enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Esta contraseña no pudo ser establecida + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Intercambio de archivos simple y privado +introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que expira automáticamente. Así puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira después de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir el archivo: +copyLinkButton = Copiar enlace +downloadTitle = Bajando archivos +downloadDescription = Este archivo fue compartido a través de { -send-brand } con cifrado de punto a punto y un enlace que expira automáticamente. +trySendDescription = Prueba { -send-brand } para compartir archivos de forma simple y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo 1 archivo puede ser subido a la vez. + *[other] Solo { $count } archivos pueden ser subidos a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo 1 archivo está permitido. + *[other] Solo { $count } archivos están permitidos. + } +expiredTitle = Este enlace ha expirado. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox } y con la versión actual de la mayoría de los navegadores. +downloadFirefox = Bajar { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selecciona los archivos a subir +trustWarningMessage = Asegúrate de que confías en tu destinatario cuando compartas datos sensibles. +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastra y suelta archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o haz clic para enviar hasta { $size } +addPassword = Protegido con contraseña +emailPlaceholder = Ingresa tu correo +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Conéctate para enviar hasta { $size } +signInOnlyButton = Conectarse +accountBenefitTitle = Crea una cuenta de { -firefox } o conéctate +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Comparte archivos de hasta { $size } +accountBenefitDownloadCount = Comparte archivos con más personas +accountBenefitTimeLimit = + { $count -> + [one] Mantener enlaces activos durante 1 día + *[other] Mantener enlaces activos durante { $count } días + } +accountBenefitSync = Administrar los archivos compartidos desde cualquier dispositivo +accountBenefitMoz = Aprender más acerca de otros servicios de { -mozilla } +signOut = Salir +okButton = Aceptar +downloadingTitle = Bajando +noStreamsWarning = Es posible que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador +noStreamsOptionFirefox = Prueba nuestro navegador favorito +noStreamsOptionDownload = Continuar con este navegador +downloadFirefoxPromo = { -send-short-brand } es traído a ti por el renovado { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Comparte el enlace a tu dispositivo: +shareLinkButton = Compartir enlace +# $name is the name of the file +shareMessage = Baja "{ $name }" con { -send-brand }: compartir archivos de forma simple y segura +trailheadPromo = Hay una forma de proteger tu privacidad. Únete a Firefox. +learnMore = Aprender más. +downloadFlagged = Este enlace ha sido deshabilitado por violar los términos del servicio. +downloadConfirmTitle = Una cosa más +downloadConfirmDescription = Asegúrate de confiar en la persona que te envió este archivo porque no podemos verificar que no dañará tu dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Confío en la persona que envió es archivo + *[other] Confío en la persona que envió estos archivos + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Reportar este archivo como sospechoso + *[other] Reportar estos archivos como sospechosos + } +reportDescription = Ayúdanos a entender lo que está pasando. ¿Qué crees que está mal con estos archivos? +reportUnknownDescription = Por favor, ve a la url del enlace que quieres reportar y haz clic en "{ reportFile }". +reportButton = Reportar +reportReasonMalware = Estos archivos contienen malware o son parte de un ataque de phishing. +reportReasonPii = Estos archivos contienen información personal identificable sobre mí. +reportReasonAbuse = Estos archivos contienen contenido ilegal o abusivo. +reportReasonCopyright = Para denunciar una infracción de derechos de autor o de marca registrada, sigue el proceso descrito en esta página. +reportedTitle = Archivos reportados +reportedDescription = Gracias. Hemos recibido tu reporte sobre estos archivos. diff --git a/public/locales/es-ES/send.ftl b/public/locales/es-ES/send.ftl index 6f73ac4df..1e399f26c 100644 --- a/public/locales/es-ES/send.ftl +++ b/public/locales/es-ES/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Comentario -uploadPageHeader = Compartir archivos cifrados y privados -uploadPageExplainer = Envía archivos a través de un enlace cifrado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida. -uploadPageLearnMore = Descubre más -uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo -uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB -uploadPageBrowseButton = Seleccionar un archivo en el equipo -uploadPageBrowseButton1 = Seleccionar un archivo para subir -uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) -importingFile = Imporando... -verifyingFile = Comprobando... -encryptingFile = Encriptando... -decryptingFile = Desencriptando... -notifyUploadDone = La subida ha finalizado. -uploadingPageMessage = Cuando se suba tu archivo podrás condigurar las opciones de caducidad. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = Se canceló la subida. -uploadingPageLargeFileMessage = El archivo es grande y puede tardar unos minutos en subirse. ¡Tómatelo con calma! -uploadingFileNotification = Notificarme cuando se complete la subida. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace al archivo caducará tras descargarlo una vez o en 24 horas. -expireInfo = El enlace al archivo expirará tras { $downloadCount } o { $timespan }. -downloadCount = { $num -> +# Send is a brand name and should not be localized. +title = Send +importingFile = Importando... +encryptingFile = Cifrando... +decryptingFile = Descifrando... +downloadCount = + { $num -> [one] 1 descarga *[other] { $num } descargas } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hora *[other] { $num } horas } -copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: { $filename } -copyUrlFormButton = Copiar en el portapapeles copiedUrl = ¡Copiado! -deleteFileButton = Eliminar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadsFileList = Descargas -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Fecha -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Descargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introducir contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Descargar archivo encriptado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y cifrado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = Se completó la descarga. downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prueba Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos. -errorAltText = Error en la subida -errorPageHeader = ¡Se produjo un error! -errorPageMessage = Se produjo un error al subir el archivo. -errorPageLink = Enviar otro archivo +sendYourFilesLink = Prueba Send +errorPageHeader = ¡Se ha producido un error! fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }. linkExpiredAlt = Enlace caducado -expiredPageHeader = ¡El enlace ha caducado o nunca existió! -notSupportedHeader = Tu navegador no está admitido. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox! -notSupportedLink = ¿Por qué no se admite mi navegador? -notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Firefox Send. Tendrás que actualizar tu navegador. +notSupportedHeader = Tu navegador no es compatible. +notSupportedLink = ¿Por qué mi navegador no es compatible? +notSupportedOutdatedDetail = Lamentablemente, esta versión de Firefox no admite la tecnología web que impulsa Send. Tendrás que actualizar tu navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Caduca en -deleteFileList = Eliminar -nevermindButton = Da igual -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujero a las Condiciones del servicio y al Aviso de privacidad de Test Pilot. -legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto al Aviso de privacidad sobre sitios web y a los Términos de uso sobre sitios web. -deletePopupText = ¿Eliminar el archivo? -deletePopupYes = Sí deletePopupCancel = Cancelar deleteButtonHover = Eliminar -copyUrlHover = Copiar URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Sobre Test Pilot footerLinkPrivacy = Privacidad -footerLinkTerms = Términos footerLinkCookies = Cookies -requirePasswordCheckbox = Requerir una contraseña para descargar este archivo -addPasswordButton = Añadir contraseña -changePasswordButton = Cambiar -passwordTryAgain = Contraseña incorrecta. Inténtelo de nuevo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } -reportIPInfringement = Denunciar vulneración de propiedad intelectual -javascriptRequired = Firefox Send requiere JavaScript -whyJavascript = ¿Por qué Firefox Send requiere JavaScript? +passwordTryAgain = Contraseña incorrecta. Inténtalo de nuevo. +javascriptRequired = Send requiere JavaScript +whyJavascript = ¿Por qué Send requiere JavaScript? enableJavascript = Por favor, activa JavaScript y vuelve a intentarlo. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No se ha podido establecer la contraseña + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Enviar +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartir archivos de forma sencilla y privada +introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así que puedes mantener lo que compartes en privado y asegurarte de que tus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = El archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Caduca tras { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir el archivo: +copyLinkButton = Copiar enlace +downloadTitle = Descargar archivos +downloadDescription = Este archivo se compartió a través de { -send-brand } con cifrado de extremo a extremo y un enlace que caduca automáticamente. +trySendDescription = Prueba { -send-brand } para compartir archivos de forma sencilla y segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo se puede subir 1 archivo a la vez. + *[other] Solo se pueden subir { $count } archivos a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo se permite 1 archivo. + *[other] Solo se permiten { $count } archivos. + } +expiredTitle = Este enlace ha expirado. +notSupportedDescription = { -send-brand } no funciona con este navegador. { -send-short-brand } funciona mejor con la última versión de { -firefox }, y funciona con la última versión de la mayoría de los navegadores. +downloadFirefox = Descargar { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Seleccionar archivos para subir +trustWarningMessage = Asegúrate de que confías en tu destinatario cuando compartas datos sensibles. +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastrar y soltar archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o hacer clic para enviar hasta { $size } +addPassword = Proteger con contraseña +emailPlaceholder = Introducir dirección de correo +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Iniciar sesión para enviar hasta { $size } +signInOnlyButton = Iniciar sesión +accountBenefitTitle = Crear una cuenta { -firefox } o iniciar sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir archivos de hasta { $size } +accountBenefitDownloadCount = Compartir archivos con más gente +accountBenefitTimeLimit = + { $count -> + [one] Mantener enlaces activos durante 1 día + *[other] Mantener enlaces activos durante { $count } días + } +accountBenefitSync = Administrar los archivos compartidos desde cualquier dispositivo +accountBenefitMoz = Saber más sobre otros servicios de { -mozilla } +signOut = Cerrar sesión +okButton = Vale +downloadingTitle = Descargando +noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrirlo en otro navegador +noStreamsOptionFirefox = Probar nuestro navegador favorito +noStreamsOptionDownload = Continuar en este navegador +downloadFirefoxPromo = El nuevo { -firefox } te ofrece { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Compartir el enlace a tu archivo: +shareLinkButton = Compartir enlace +# $name is the name of the file +shareMessage = Descargar “{ $name }” con { -send-brand }: comparte archivos de forma segura y sencilla +trailheadPromo = Existe la forma de proteger tu privacidad. Únete a Firefox. +learnMore = Saber más. +downloadFlagged = Este enlace ha sido desactivado por violar los términos del servicio. +downloadConfirmTitle = Una cosa más +downloadConfirmDescription = Asegúrate de confiar en la persona que te envió este archivo porque no podemos verificar que no va a dañar tu dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Confío en la persona que envió este archivo + *[other] Confío en la persona que envió estos archivos + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Denunciar este archivo como sospechoso + *[other] Denunciar estos archivos como sospechosos + } +reportDescription = Ayúdanos a entender lo que está pasando. ¿Qué crees que está mal con estos archivos? +reportUnknownDescription = Por favor, ve a la url del enlace que quieres denunciar y haz clic en “{ reportFile }”. +reportButton = Denunciar +reportReasonMalware = Estos archivos contienen malware o son parte de un ataque de phishing. +reportReasonPii = Estos archivos contienen información personal identificable sobre mí. +reportReasonAbuse = Estos archivos tienen contenido ilegal o abusivo. +reportReasonCopyright = Para denunciar una infracción de derechos de autor o marca registrada, sigue el proceso descrito en esta página. +reportedTitle = Archivos denunciados +reportedDescription = Gracias. Hemos recibido tu denuncia sobre estos archivos. diff --git a/public/locales/es-MX/send.ftl b/public/locales/es-MX/send.ftl index 5d404574f..81b40e409 100644 --- a/public/locales/es-MX/send.ftl +++ b/public/locales/es-MX/send.ftl @@ -1,114 +1,155 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web +# Send is a brand name and should not be localized. +title = Send siteFeedback = Comentario -uploadPageHeader = Compartir archivos encriptados y privados -uploadPageExplainer = Enviar archivos a través de un enlace encriptado, privado y seguro que caducará automáticamente para que tus datos no sean accesibles en línea de por vida. -uploadPageLearnMore = Saber más -uploadPageDropMessage = Suelta aquí tu archivo para empezar a subirlo -uploadPageSizeMessage = Para que la operación sea más segura, el archivo debería ocupar menos de 1GB -uploadPageBrowseButton = Selecciona un archivo de tu computadora -uploadPageBrowseButton1 = Seleccionar un archivo para subir -uploadPageMultipleFilesAlert = Aún no se pueden subir varios archivos o una carpeta. -uploadPageBrowseButtonTitle = Subir archivo -uploadingPageProgress = Subiendo { $filename } ({ $size }) importingFile = Importando... -verifyingFile = Verificando... -encryptingFile = Encriptando... -decryptingFile = Desencriptando... -notifyUploadDone = La subida ha terminado. -uploadingPageMessage = Una vez que tu archivo haya subido podrás configurar las opciones de caducidad. -uploadingPageCancel = Cancelar subida -uploadCancelNotification = Se canceló la subida. -uploadingPageLargeFileMessage = Este archivo es grande y puede tomar un rato para que suba. ¡Mantente tranquilo! -uploadingFileNotification = Avísame cuando la subida del archivo esté completa. -uploadSuccessConfirmHeader = Listo para enviar -uploadSvgAlt = Subir -uploadSuccessTimingHeader = El enlace a tu archivo expirará después de una descarga o en 24 horas. -expireInfo = El enlace a tu archivo expirará después de { $downloadCount } o { $timespan }. -downloadCount = { $num -> - *[one] 1 descarga +encryptingFile = Encriptando… +decryptingFile = Desencriptando… +downloadCount = + { $num -> + [one] 1 descarga + *[other] { $num } descargas } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hora *[other] { $num } horas } -copyUrlFormLabelWithName = Copiar y compartir el enlace para enviar tu archivo: ($filename) -copyUrlFormButton = Copiar a portapapeles copiedUrl = ¡Copiado! -deleteFileButton = Eliminar archivo -sendAnotherFileLink = Enviar otro archivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descargar -downloadsFileList = Descargas -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Hora -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Descargar ($filename) -downloadFileSize = ({ $size }) -unlockInputLabel = Ingresar contraseña unlockInputPlaceholder = Contraseña unlockButtonLabel = Desbloquear -downloadFileTitle = Descargar archivo encriptado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amigo te está enviando un archivo a través de Firefox Send, un servicio que te permite compartir archivos con un enlace seguro, privado y encriptado que caduca automáticamente para que tus cosas no sean accesibles en línea de por vida. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descargar -downloadNotification = Tu descarga se ha completado downloadFinish = Descarga completa -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prueba Firefox Send -downloadingPageProgress = Descargando { $filename } ({ $size }) -downloadingPageMessage = Deja esta pestaña abierta mientras buscamos tu archivo y lo desencriptamos. -errorAltText = Error en la subida +sendYourFilesLink = Prueba Send errorPageHeader = ¡Algo salió mal! -errorPageMessage = Ha ocurrido un error mientras subiamos tu archivo. -errorPageLink = Enviar otro archivo fileTooBig = Ese archivo es muy grande. Debería ocupar menos de { $size }. linkExpiredAlt = Enlace caducado -expiredPageHeader = ¡Este enlace ha caducado o nunca existió en primer lugar! notSupportedHeader = Tu navegador no está soportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Lamentablemente, este navegador no admite la tecnología web que necesita Firefox Send. Tendrás que probar otro navegador. ¡Te recomendamos Firefox! notSupportedLink = ¿Por qué mi navegador no tiene soporte? -notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Firefox Send. Deberás actualizar tu navegador. +notSupportedOutdatedDetail = Lamentablemente esta versión de Firefox no soporta la tecnología web que potencia a Send. Deberás actualizar tu navegador. updateFirefox = Actualizar Firefox -downloadFirefoxButtonSub = Descarga gratuita -uploadedFile = Archivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Caduca en -deleteFileList = Eliminar -nevermindButton = Da igual -legalHeader = Términos y privacidad -legalNoticeTestPilot = Firefox Send sigue siendo un experimento de Test Pilot y está sujeto a las Condiciones del servicio y al Aviso de privacidad de Test Pilot. Puedes saber más acerca de este experimento y si recolección de datos aquí. -legalNoticeMozilla = El uso de la página de Firefox Send también está sujeto al Aviso de privacidad sobre sitios web y a los Términos de uso sobre sitios web. -deletePopupText = ¿Eliminar este archivo? -deletePopupYes = Sí deletePopupCancel = Cancelar deleteButtonHover = Eliminar -copyUrlHover = Copiar URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca de Test Pilot footerLinkPrivacy = Privacidad -footerLinkTerms = Términos footerLinkCookies = Cookies -requirePasswordCheckbox = Se necesita una contraseña para descargar este archivo -addPasswordButton = Agregar contraseña -changePasswordButton = Cambiar passwordTryAgain = Contraseña incorrecta. Intenta de nuevo. -// This label is followed by the password needed to download a file -passwordResult = Contraseña: { $password } -reportIPInfringement = Denunciar una infracción de PI -javascriptRequired = Firefox Send requiere JavaScript -whyJavascript = ¿Por qué Firefox Send requiere JavaScript? +javascriptRequired = Send requiere JavaScript +whyJavascript = ¿Por qué Send requiere JavaScript? enableJavascript = Por favor, habilita JavaScript e intenta de nuevo. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Longitud máxima de la contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = No se ha podido establecer la contraseña + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Enviar +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartir archivos fácil y privado +introDescription = { -send-brand } te permite compartir archivos con cifrado de extremo a extremo y un enlace que caduca automáticamente. Así puedes mantener en privado lo que compartes y asegurarte de que tus cosas no permanezcan en línea para siempre. +notifyUploadEncryptDone = Tu archivo está cifrado y listo para enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira después de { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaño total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiar el enlace para compartir el archivo: +copyLinkButton = Copiar enlace +downloadTitle = Descargar archivos +downloadDescription = Este archivo fue compartido vía { -send-brand } con un cifrado de punto a punto y un enlace que expira automáticamente. +trySendDescription = Intenta con { -send-brand } para compartir fácil y seguro. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solo 1 archivo puede ser cargado a la vez. + *[other] Solo { $count } archivos pueden ser cargados a la vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo 1 archivo está permitido. + *[other] Solo { $count } archivos están permitidos. + } +expiredTitle = Este enlace ha expirado. +notSupportedDescription = { -send-brand } no funcionará con este navegador. { -send-short-brand } trabaja mejor que la última versión de { -firefox }, y trabajará con la versión actual de la mayoría de la navegadores. +downloadFirefox = Descargar { -firefox } +legalTitle = Aviso de privacidad de { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Seleccionar archivos para subir +uploadButton = Subir +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastrar y soltar archivos +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o hacer clic para enviar hasta { $size } +addPassword = Protegido con contraseña +emailPlaceholder = Ingresa tu correo electrónico +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Iniciar sesión para enviar hasta { $size } +signInOnlyButton = Iniciar sesión +accountBenefitTitle = Crear una cuenta de { -firefox } o iniciar sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartir archivos de hasta { $size } +accountBenefitDownloadCount = Compartir archivos con más personas +accountBenefitTimeLimit = + { $count -> + [one] Mantener enlaces activos por 1 día + *[other] Mantener enlaces activos hasta { $count } días + } +accountBenefitSync = Administrar archivos compartidos desde cualquier dispositivo +accountBenefitMoz = Saber más sobre otros servicios de { -mozilla } +signOut = Cerrar sesión +okButton = Aceptar +downloadingTitle = Descargando +noStreamsWarning = Puede que este navegador no pueda descifrar un archivo tan grande. +noStreamsOptionCopy = Copiar el enlace para abrir en otro navegador +noStreamsOptionFirefox = Prueba nuestro navegador favorito +noStreamsOptionDownload = Continuar con este navegador +downloadFirefoxPromo = { -send-short-brand } te lo ofrece el nuevo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Comparte el enlace a tu archivo: +shareLinkButton = Enlace para compartir +# $name is the name of the file +shareMessage = Descarga «{ $name }» con { -send-brand }: es sencillo y seguro +trailheadPromo = Existe una forma de proteger tu privacidad. Únete a Firefox. +learnMore = Saber más. diff --git a/public/locales/et/send.ftl b/public/locales/et/send.ftl index 836dd8777..a7a11c5d7 100644 --- a/public/locales/et/send.ftl +++ b/public/locales/et/send.ftl @@ -1,91 +1,155 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = veebieksperiment +# Send is a brand name and should not be localized. +title = Send siteFeedback = Tagasiside -uploadPageHeader = Privaatne ja krüpteeritud failiedastus -uploadPageExplainer = Firefox Send võimaldab saata faile üle ohutu, privaatse ja krüpteeritud kanali. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks. -uploadPageLearnMore = Rohkem teavet -uploadPageDropMessage = Faili üleslaadimiseks lohista see siia -uploadPageSizeMessage = Parima kogemuse saamiseks tasub faili suurus hoida alla 1GB -uploadPageBrowseButton = Vali fail arvutist -uploadPageBrowseButton1 = Vali fail üleslaadimiseks -uploadPageMultipleFilesAlert = Mitme faili või kausta üleslaadimine pole praegu toetatud. -uploadPageBrowseButtonTitle = Laadi fail üles -uploadingPageProgress = Faili { $filename } ({ $size }) üleslaadimine importingFile = Importimine... -verifyingFile = Kontrollimine… encryptingFile = Krüptimine… decryptingFile = Dekrüptimine... -notifyUploadDone = Üleslaadimine on lõpetatud. -uploadingPageMessage = Aegumise sätteid saab muuta siis, kui faili üles laaditakse. -uploadingPageCancel = Katkesta üleslaadimine -uploadCancelNotification = Üleslaadimine katkestati -uploadingPageLargeFileMessage = Fail on suur ja selle üleslaadimine võib aega võtta. -uploadingFileNotification = Teavita mind üleslaadimise lõppemisest. -uploadSuccessConfirmHeader = Saatmiseks valmis -uploadSvgAlt = Laadi üles -uploadSuccessTimingHeader = Link failile aegub pärast 1. allalaadimist või 24 tunni möödumisel. -copyUrlFormLabelWithName = Kopeeri ja jaga linki faili allalaadimiseks: { $filename } -copyUrlFormButton = Kopeeri vahemällu +downloadCount = + { $num -> + [one] üht allalaadimist + *[other] { $num } allalaadimist + } +timespanHours = + { $num -> + [one] 1 tunni + *[other] { $num } tunni + } copiedUrl = Kopeeritud! -deleteFileButton = Kustuta fail -sendAnotherFileLink = Saada järgmine fail -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Laadi alla -downloadFileName = Laadi fail { $filename } alla -downloadFileSize = ({ $size }) -unlockInputLabel = Sisesta parool unlockInputPlaceholder = Parool unlockButtonLabel = Ava -downloadFileTitle = Krüptitud faili allalaadimine -// Firefox Send is a brand name and should not be localized. -downloadMessage = Sulle on saadetud fail Firefox Sendiga - teenusega, mis lubab faile ohutult, privaatselt ja krüpteeritult jagada. Failid kustutatakse automaatselt, et need ei jääks internetti igaveseks. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Laadi alla -downloadNotification = Allalaadimine on lõpetatud. downloadFinish = Allalaadimine lõpetati -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize }/{ $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Proovi Firefox Sendi -downloadingPageProgress = Faili { $filename } ({ $size }) allalaadimine -downloadingPageMessage = Palun jäta see kaart lahti, kuni fail on alla laaditud ja dekrüptitud. -errorAltText = Viga üleslaadimisel +sendYourFilesLink = Proovi Send'i errorPageHeader = Midagi läks valesti! -errorPageMessage = Faili üleslaadimisel esines viga. -errorPageLink = Saada järgmine fail fileTooBig = Fail on üleslaadimiseks liiga suur. See peaks olema väiksem kui { $size }. linkExpiredAlt = Link on aegunud -expiredPageHeader = See link on aegunud või seda pole kunagi olnudki! notSupportedHeader = Sinu brauser pole toetatud. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Kahjuks ei toeta see brauser veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead proovima teise brauseriga. Me soovitame Firefoxi! notSupportedLink = Miks mu brauser toetatud pole? -notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Firefox Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama. +notSupportedOutdatedDetail = Kahjuks ei toeta see Firefoxi versioon veebitehnoloogiaid, mis teevad Sendi toimimise võimalikuks. Sa pead oma brauserit uuendama. updateFirefox = Uuenda Firefox -downloadFirefoxButtonSub = Laadi alla tasuta -uploadedFile = Fail -copyFileList = Kopeeri URL -// expiryFileList is used as a column header -expiryFileList = Aegub -deleteFileList = Kustuta -nevermindButton = Ära pane tähele -legalHeader = Tingimused ja privaatsusreeglid -legalNoticeTestPilot = Firefox Send on praegu Test Piloti eksperiment ja sellele rakenduvad Test Piloti teenusetingimused ning privaatsusreeglid. Rohkem teavet selle eksperimendi ja kogutavate andmete kohta leiab siit. -legalNoticeMozilla = Firefox Sendi veebilehe kasutamisele rakenduvad ka Mozilla veebilehtede privaatsusreeglid ja veebilehtede teenusetingimused. -deletePopupText = Kas kustutada see fail? -deletePopupYes = Jah deletePopupCancel = Loobu deleteButtonHover = Kustuta -copyUrlHover = Kopeeri URL footerLinkLegal = Õiguslik teave -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilotist footerLinkPrivacy = Privaatsusest -footerLinkTerms = Teenusetingimused footerLinkCookies = Küpsistest -requirePasswordCheckbox = Selle faili allalaadimiseks nõutakse parooli -addPasswordButton = Lisa parool passwordTryAgain = Vale parool. Palun proovi uuesti. -// This label is followed by the password needed to download a file -passwordResult = Parool: { $password } +javascriptRequired = Send'i kasutamiseks tuleb JavaScript lubada +whyJavascript = Miks Send JavaScripti vajab? +enableJavascript = Palun luba JavaScript ja proovi uuesti. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }t { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimaalne parooli pikkus: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Parooli muutmine ebaõnnestus + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Lihtne ja privaatne failijagamine +introDescription = { -send-brand } võimaldab sul faile jagada otspunktkrüpteerimise ning automaatselt aeguva lingiga. Nii saad jagatava privaatsena hoida ja kindlustada, et su asjad igavesti internetti vedelema ei jää. +notifyUploadEncryptDone = Sinu fail on krüptitud ja saatmiseks valmis +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Aegub peale { $downloadCount } või { $timespan } järel +timespanMinutes = + { $num -> + [one] 1 minuti + *[other] { $num } minuti + } +timespanDays = + { $num -> + [one] 1 päeva + *[other] { $num } päeva + } +timespanWeeks = + { $num -> + [one] 1 nädala + *[other] { $num } nädala + } +fileCount = + { $num -> + [one] 1 fail + *[other] { $num } faili + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Kogusuurus: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Faili jagamiseks kopeeri link: +copyLinkButton = Kopeeri link +downloadTitle = Failide allalaadimine +downloadDescription = See fail jagati teenuse { -send-brand } kaudu otspunktkrüpteeritult ja automaatselt aeguva lingiga. +trySendDescription = Proovi lihtsaks ja turvaliseks failijagamiseks { -send-brand } teenust. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Korraga saab üles laadida vaid 1 faili. + *[other] Korraga saab üles laadida vaid { $count } faili. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Vaid 1 arhiveerimine on lubatud. + *[other] Vaid { $count } arhiveerimist on lubatud. + } +expiredTitle = Link on aegunud. +notSupportedDescription = { -send-brand } ei tööta selle veebilehitsejaga. Kõige paremini töötab { -send-short-brand } uusima { -firefox }iga ja töötab ka enamikes teistes uuendatud brauserites. +downloadFirefox = Laadi { -firefox } alla +legalTitle = { -send-short-brand } privaatsusteade +legalDateStamp = Versioon 1.0, alates 12. märts 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }p { $hours }t { $minutes }m +addFilesButton = Vali failid üleslaadimiseks +uploadButton = Laadi üles +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Lohista failid siia +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = või klõpsa kuni { $size } suuruste failide saatmiseks +addPassword = Kaitse parooliga +emailPlaceholder = Sisesta e-posti aadress +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logi sisse ning saad saata kuni { $size } suuruseid faile +signInOnlyButton = Logi sisse +accountBenefitTitle = Loo { -firefox }i konto või logi sisse +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Jaga kuni { $size } suuruseid faile +accountBenefitDownloadCount = Jaga faile enamate inimestega +accountBenefitTimeLimit = + { $count -> + [one] Hoia linke aktiivsena 1 päev + *[other] Hoia linke aktiivsena kuni { $count } päeva + } +accountBenefitSync = Jagatud faile saad hallata mis tahes seadmes +accountBenefitMoz = Rohkem teavet teistest { -mozilla } teenustest +signOut = Logi välja +okButton = Olgu +downloadingTitle = Allalaadimine +noStreamsWarning = Sinu veebilehitseja ei pruugi suuta nii suurt faili dekrüptida. +noStreamsOptionCopy = Kopeeri link teises brauseris avamiseks +noStreamsOptionFirefox = Proovi meie lemmikbrauserit +noStreamsOptionDownload = Jätka selle brauseriga +downloadFirefoxPromo = { -send-short-brand } toob sinuni uhiuus { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Jaga linki failile: +shareLinkButton = Jaga linki +# $name is the name of the file +shareMessage = Laadi “{ $name }” alla teenusega { -send-brand }, mis pakub lihtsat ja turvalist failijagamist +trailheadPromo = Oma privaatsust on võimalik kaitsta. Liitu Firefoxiga. +learnMore = Rohkem teavet. diff --git a/public/locales/eu/send.ftl b/public/locales/eu/send.ftl new file mode 100644 index 000000000..c8028cdba --- /dev/null +++ b/public/locales/eu/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Iritzia +importingFile = Inportatzen… +encryptingFile = Zifratzen... +decryptingFile = Deszifratzen... +downloadCount = + { $num -> + [one] Deskarga bat + *[other] { $num } deskarga + } +timespanHours = + { $num -> + [one] Ordubete + *[other] { $num } ordu + } +copiedUrl = Kopiatuta! +unlockInputPlaceholder = Pasahitza +unlockButtonLabel = Desblokeatu +downloadButtonLabel = Deskargatu +downloadFinish = Deskarga burututa +fileSizeProgress = ({ $totalSize } / { $partialSize }) +sendYourFilesLink = Probatu Send +errorPageHeader = Zerbait gaizki joan da! +fileTooBig = Fitxategia handiegia da kargatzeko. { $size } baino txikiagoa izan behar du. +linkExpiredAlt = Lotura iraungi da +notSupportedHeader = Zure nabigatzailea ez da onartzen. +notSupportedLink = Zergatik ez da nire nabigatzailea onartzen? +notSupportedOutdatedDetail = Zoritxarrez Firefox bertsio honek ez du Send-ek behar duen web teknologia onartzen. Zure nabigatzailea eguneratu behar duzu. +updateFirefox = Eguneratu Firefox +deletePopupCancel = Utzi +deleteButtonHover = Ezabatu +footerLinkLegal = Lege-oharra +footerLinkPrivacy = Pribatutasuna +footerLinkCookies = Cookieak +passwordTryAgain = Pasahitz okerra. Saiatu berriro. +javascriptRequired = JavaScript beharrezkoa da Send erabiltzeko. +whyJavascript = Zergatik behar du Send-ek JavasScript? +enableJavascript = Gaitu JavaScript eta saiatu berriro. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Pasahitzaren gehienezko luzera: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Pasahitz hau ezin da ezarri + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partekatu fitxategiak modu sinple eta pribatuan +introDescription = { -send-brand } tresna fitxategiak partekatzeko da, muturretik muturrera zifratuta eta automatikoki iraungitzen diren loturekin. Hortaz, partekatzen duzuna pribatua izango da eta ziur egon zaitezke zure fitxategiak ez direla online egongo betirako. +notifyUploadEncryptDone = Zure fitxategia zifratuta eta bidaltzeko prest dago +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } edo { $timespan } ondoren iraungiko da +timespanMinutes = + { $num -> + [one] minutu 1 + *[other] { $num } minutu + } +timespanDays = + { $num -> + [one] egun 1 + *[other] { $num } egun + } +timespanWeeks = + { $num -> + [one] aste 1 + *[other] { $num } aste + } +fileCount = + { $num -> + [one] fitxategi 1 + *[other] { $num } fitxategi + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamaina guztira: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiatu fitxategia partekatzeko lotura: +copyLinkButton = Kopiatu lotura +downloadTitle = Deskargatu fitxategiak +downloadDescription = { -send-brand } bidez partekatu da fitxategia muturretik muturrera zifratuta eta automatikoki iraungitzen den lotura batekin. +trySendDescription = Probatu { -send-brand } fitxategiak partekatzeko modu sinple eta segururako. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Soilik fitxategi bakarra igo daiteke aldi berean. + *[other] Soilik { $count } fitxategi igo daitezke aldi berean. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Soilik artxibo bakarra onartzen da. + *[other] Soilik { $count } artxibo onartzen dira. + } +expiredTitle = Lotura hau iraungi da. +notSupportedDescription = { -send-brand } ez da nabigatzaile honetan ibiliko. { -send-short-brand } hobeto dabil { -firefox }(r)en azken bertsioarekin; halaber, nabigatzaile gehienen azken bertsioarekin ibiliko da. +downloadFirefox = Deskargatu { -firefox } +legalTitle = { -send-short-brand } pribatutasun-oharra +legalDateStamp = 1.0 bertsioa, 2019ko martxoaren 12koa. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }e { $hours }h { $minutes }m +addFilesButton = Hautatu igotzeko fitxategiak +uploadButton = Igo +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arrastatu eta jaregin fitxategiak +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = edo egin klik { $size } arte igotzeko +addPassword = Babestu pasahitzarekin +emailPlaceholder = Idatzi zure helbide elektronikoa +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Hasi saioa { $size } arte bidaltzeko +signInOnlyButton = Hasi saioa +accountBenefitTitle = Sortu { -firefox } kontu bat edo hasi saioa +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partekatu { $size } arteko fitxategiak +accountBenefitDownloadCount = Partekatu fitxategiak jende gehiagorekin +accountBenefitTimeLimit = + { $count -> + [one] Utzi loturak erabilgarri egun batez + *[other] Utzi loturak erabilgarri { $count } egunez + } +accountBenefitSync = Kudeatu partekatutako fitxategiak edozein gailutatik +accountBenefitMoz = { -mozilla }ren beste zerbitzuei buruzko argibide gehiago +signOut = Amaitu saioa +okButton = Ados +downloadingTitle = Deskargatzen +noStreamsWarning = Baliteke nabigatzailea gai ez izatea horrelako tamaina handiko fitxategiak deszifratzeko. +noStreamsOptionCopy = Kopiatu lotura beste nabigatzaile batean irekitzeko +noStreamsOptionFirefox = Probatu gure nabigatzaile gogokoena +noStreamsOptionDownload = Jarraitu nabigatzaile honekin +downloadFirefoxPromo = Erabat berritutako { -firefox }(e)k eskaintzen dizu { -send-short-brand } +# the next line after the colon contains a file name +shareLinkDescription = Partekatu zure fitxategirako lotura: +shareLinkButton = Partekatu lotura +# $name is the name of the file +shareMessage = Deskargatu "{ $name }" { -send-brand } erabiliz: fitxategi-partekatze sinple eta segurua +trailheadPromo = Badago zure pribatutasuna babesteko modua. Egizu bat Firefoxekin. +learnMore = Argibide gehiago. diff --git a/public/locales/fa/send.ftl b/public/locales/fa/send.ftl index 460a68e54..7a983c05c 100644 --- a/public/locales/fa/send.ftl +++ b/public/locales/fa/send.ftl @@ -1,113 +1,155 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = آزمایش وب +# Send is a brand name and should not be localized. +title = Send siteFeedback = بازخورد -uploadPageHeader = اشتراک‌گذاری پرونده‌ها، رمزنگاری شده و خصوصی -uploadPageExplainer = پرونده های خود را به صورت ایمن، خصوصی و رمزنگاری شده با تعیین تاریخ انقضا خودکار ارسال کنید تا اطمینان پیدا کنید چیزهای شما همیشه آنلاین باقی نماند. -uploadPageLearnMore = بیشتر بدانید -uploadPageDropMessage = برای شروع بارگذاری پرونده‌های خود را اینجا بیاندازید -uploadPageSizeMessage = برای بیشترین قابلیت اطمینان، بهتر است که پرونده‌تان کمتر از ۱ گیگابایت باشد -uploadPageBrowseButton = یک پرونده را از روی کامپیوتر خود انتخاب کنید -uploadPageBrowseButton1 = یک پرونده را برای بارگذاری انتخاب کنید -uploadPageMultipleFilesAlert = بارگذاری چندین پرونده یا یک پوشه در حال حاضر پشتیبانی نمی‌شود. -uploadPageBrowseButtonTitle = بارگذاری پرونده -uploadingPageProgress = در حال بارگذاری پرونده { $filename } ({ $size }) importingFile = در حال وارد کردن… -verifyingFile = در حال تایید… encryptingFile = در حال رمزنگاری… decryptingFile = در حال رمزگشایی… -notifyUploadDone = بارگذاری شما پایان یافت. -uploadingPageMessage = به محض بارگذاری پرونده شما قادر خواهید بود برای آن گزینه انقضا تعیین کنید. -uploadingPageCancel = لغو بارگذاری -uploadCancelNotification = بارگذاری شما لغو شد -uploadingPageLargeFileMessage = پرونده بزرگ است و ممکن است بارگذاری آن مدتی طول بکشد. محکم بشینید! -uploadingFileNotification = هر وقت بارگذاری تمام شد به من اطلاع بده. -uploadSuccessConfirmHeader = آماده برای ارسال -uploadSvgAlt = بارگذاری -uploadSuccessTimingHeader = پیوند به پرونده شما بعد از ۱ بار دانلود یا ۲۴ ساعت حذف خواهد شد. -expireInfo = این پیوند به فایل شما پس از { $downloadCount } یا { $timespan } منقضی خواهد شد. -downloadCount = { $num -> - *[other] ۱ بارگذاری +downloadCount = + { $num -> + [one] ۱ بارگیری + *[other] { $num } بارگیری } -timespanHours = { $num -> - *[other] ۱ ساعت +timespanHours = + { $num -> + [one] ۱ ساعت + *[other] { $num } ساعت } -copyUrlFormLabelWithName = برای ارسال پرونده پیوند آن را رونوشت و به اشتراک بگذارید: { $filename } -copyUrlFormButton = رونوشت به کلیپ‌بورد copiedUrl = رونوشت شد! -deleteFileButton = حذف پرونده -sendAnotherFileLink = ارسال پرونده دیگر -// Alternative text used on the download link/button (indicates an action). -downloadAltText = دریافت -downloadsFileList = دریافت‌ها -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = زمان -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = بارگیری { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = گذرواژه را وارد کنید unlockInputPlaceholder = گذرواژه unlockButtonLabel = باز کردن -downloadFileTitle = دریافت پروندهٔ رمزنگاری شده -// Firefox Send is a brand name and should not be localized. -downloadMessage = دوست شما درحال ارسال پرونده ای به وسیله Firefox Send است،‌ این سرویس این امکان را به شما می‌دهد تا پرونده‌های خود را به صورت ایمن،‌خصوصی و رمزنگاری شده به همراه پیوند انقضا خودکار همرسانی کنید تا اطمینان حاصل کنید چیزهای شما برای همیشه آنلاین باقی نخواهد ماند. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = بارگیری -downloadNotification = بارگیری شما کامل شد. downloadFinish = بارگیری کامل شد -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } از { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send را امتحان کنید -downloadingPageProgress = دریافت { $filename } ({ $size }) -downloadingPageMessage = لطفا این زبانه را باز بگذارید در حالی که ما فایل شما را دریافت می‌کنیم و کدگذاری می‌کنیم. -errorAltText = خطا در بارگذاری -errorPageHeader = چیزی دچار اشکال شده است! -errorPageMessage = خطایی در هنگام بارگذاری پرونده شما رخ داده است. -errorPageLink = پرونده دیگری ارسال کنید. +sendYourFilesLink = Send را امتحان کنید +errorPageHeader = خطایی رخ داد! fileTooBig = این پرونده بسیار حجیم است. حجم آن می‌بایستی کم تر { $size } باشد. linkExpiredAlt = پیوند منقضی شده است -expiredPageHeader = پیوند منقضی شده است یا در از همان ابتدا وجود نداشته است! -notSupportedHeader = مرورگر شما پشتیبانی نمی‌کند. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = متاسفانه این مرورگر این تکنولوژی وب را که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما بایستی مرورگری دیگری را امتحان کنید. پیشنهاد ما به شما فایرفاکس است ! -notSupportedLink = چرا مرورگر من پشتیبانی نمی‌کند؟ -notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Firefox Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید. +notSupportedHeader = مرورگر شما پشتیبانی نمی‌شود. +notSupportedLink = چرا از مرورگر من پشتیبانی نمی‌شود؟ +notSupportedOutdatedDetail = متاسفانه این نسخه از فایرفاکس این تکنولوژی وب که به Send قدرت می‌بخشد را پشتیبانی نمی‌کند. شما نیاز دارید تا مرورگر خود را بروز کنید. updateFirefox = بروزرسانی فایرفاکس -downloadFirefoxButtonSub = دریافت رایگان -uploadedFile = پرونده‌ -copyFileList = رونوشت از نشانی -// expiryFileList is used as a column header -expiryFileList = زمان انقضا -deleteFileList = حذف -nevermindButton = بیخیال -legalHeader = شرایط و حریم‌خصوصی -legalNoticeTestPilot = Firefox Send در حال حاضر در نسخه آزمایشی خود به صورت می‌دهد و تحت عنوان خلبان آموزشی شرایط و خدمات و موارد حریم خصوصی کار می‌کند. شما می‌توانید اطلاعات بیشتر در مورد این آزمایش و اطلاعات که ذخیره می‌کنید را از اینجا کسب کنید. -legalNoticeMozilla = استفاده از Firefox Send همچنین منصوب به موزیلا است. پایگاه اینترنتی نکات حریم شخصی و پایگاه اطلاع رسانی شرایط خدمات و استفاده . -deletePopupText = حذف این پرونده؟ -deletePopupYes = بله deletePopupCancel = انصراف deleteButtonHover = حذف -copyUrlHover = رونوشت از نشانی footerLinkLegal = ملاحظات حقوقی -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = درباره Test Pilot footerLinkPrivacy = حریم‌خصوصی -footerLinkTerms = شرایط footerLinkCookies = کوکی‌ها -requirePasswordCheckbox = دریافت این پرونده نیاز به گذرواژه دارد -addPasswordButton = افزودن گذرواژه -changePasswordButton = تغییر passwordTryAgain = کلمه عبور اشتباه است. مجدد تلاش کنید. -// This label is followed by the password needed to download a file -passwordResult = گذرواژه: { $password } -reportIPInfringement = گزارش تخلف IP -javascriptRequired = Firefox Send نیازمند جاوااسکریپت است -whyJavascript = چراFirefox Send جاوااسکریپت لازم دارد؟ +javascriptRequired = Send نیازمند جاوااسکریپت است +whyJavascript = چرا Send جاوااسکریپت لازم داد؟ enableJavascript = لطفا جاوااسکریپت را فعال کنید و مجددا تلاش کنید. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ساعت { $minutes }دقیقه -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } دقیقه +# A short status message shown when the user enters a long password +maxPasswordLength = حداکثر اندازهٔ گذرواژه: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = امکان ثبت این گذواژه نیست + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = ارسال +-firefox = فایرفاکس +-mozilla = موزیلا +introTitle = اشتراک‌گذاری ساده و خصوصیِ پرونده‌ها +introDescription = { -send-brand } به شما امکان اشتراک‌گذاری فایل‌ها با رمزگذاری سرتاسری و لینکی که به طور خودکار منقضی می شود را می‌دهد. در نتیجه می‌توانید اشتراک گذاری‌های خود را خصوصی نگه دارید و اطمینان حاصل کنید که فایل‌های شما تا همیشه آنلاین دردسترس نخواهند ماند. +notifyUploadEncryptDone = پرونده شما رمزگذاری شده و آماده ارسال است +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = پس از { $downloadCount } یا { $timespan } منقضی می‌شود +timespanMinutes = + { $num -> + [one] 1 دقیقه + *[other] { $num } دقیقه + } +timespanDays = + { $num -> + [one] 1 روز + *[other] { $num } روز + } +timespanWeeks = + { $num -> + [one] 1 هفته + *[other] { $num } هفته + } +fileCount = + { $num -> + [one] 1 پرونده + *[other] { $num } پرونده + } +# byte abbreviation +bytes = بایت +# kibibyte abbreviation +kb = کیلوبایت +# mebibyte abbreviation +mb = مگابایت +# gibibyte abbreviation +gb = گیگابایت +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = حجم کل: { $size } +# the next line after the colon contains a file name +copyLinkDescription = برای به اشتراک گذاشتن فایل خود، لینک را کپی کنید: +copyLinkButton = رونوشت از پیوند +downloadTitle = دریافت پرونده‌ها +downloadDescription = این پرونده از طریق { -send-brand } با رمزگذاری سرتاسری و پیوندی که به طور خودکار منقضی می شود، به اشتراک گذاشته شد. +trySendDescription = { -send-brand } را برای اشتراک گذاری ساده و ایمن پرونده امتحان کنید. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] تنها 1 پرونده می‌تواند در لحظه بارگزاری شود. + *[other] تنها { $count } پرونده می‌تواند در لحظه بارگزاری شود. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] تنها 1 بایگانی مجاز است. + *[other] تنها { $count } بایگانی مجاز است. + } +expiredTitle = این پیوند منقضی شده است. +notSupportedDescription = { -send-brand } با این مرورگر کار نخواهد کرد. { -send-short-brand } بهترین عملکرد را با آخرین نسخه { -firefox } خواهد داشت، و با آخرین نسخه اکثر مرورگر‌های کنونی کار می‌کند. +downloadFirefox = دریافت { -firefox } +legalTitle = { -send-short-brand } نکات حفظ حریم خصوصی +legalDateStamp = نسخه ۱.۰، مورخ ۱۲، ۲۰۱۹ +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } روز { $hours } ساعت { $minutes } دقیقه +addFilesButton = پرونده‌ها را برای بارگذاری انتخاب کنید +uploadButton = بارگذاری +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = فایل‌ها را بکشید و اینجا رها کنید +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = یا برای ارسال تا { $size } کلیک کنید +addPassword = با گذرواژه محافظت کنید +emailPlaceholder = ایمیل خود را وارد کنید +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = برای ارسال تا { $size } وارد شوید +signInOnlyButton = ورود +accountBenefitTitle = یک حساب { -firefox } ایجاد کنید یا وارد شوید +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = پرونده‌هایی تا { $size } را اشتراک‌گذاری کنید +accountBenefitDownloadCount = پرونده‌ها را با افراد بیشتری به اشتراک بگذارید +accountBenefitTimeLimit = + { $count -> + [one] پیوند‌ها را تا 1 روز فعال نگه دارید + *[other] پیوند‌ها را تا { $count } روز فعال نگه دارید + } +accountBenefitSync = فایل‌های اشتراکی را از هر دستگاه مدیریت کنید +accountBenefitMoz = در مورد سایر خدمات { -mozilla } اطلاعات کسب کنید +signOut = خروج +okButton = تأیید +downloadingTitle = در حال بارگیری +noStreamsWarning = ممکن است این مرورگر نتواند یک پرونده به این بزرگی را رمزگشایی کند. +noStreamsOptionCopy = لینک را کپی کنید تا در مرورگر دیگری باز شود +noStreamsOptionFirefox = مرورگر مورد علاقه ما را امتحان کنید +noStreamsOptionDownload = با این مرورگر ادامه دهید +downloadFirefoxPromo = { -send-short-brand } با جدیدترین { -firefox } برای شما آماده شده است. +# the next line after the colon contains a file name +shareLinkDescription = پیوند مربوط به پرونده خود را به اشتراک بگذارید: +shareLinkButton = اشتراک‌گذاری پیوند +# $name is the name of the file +shareMessage = “{ $name }” را با { -send-brand } دانلود کنید: اشتراک‌گذاری ساده و امن فایل +trailheadPromo = راهی برای محافظت از حریم خصوصی شما وجود دارد. به Firefox بپیوندید. +learnMore = بیشتر بدانید. diff --git a/public/locales/fi/send.ftl b/public/locales/fi/send.ftl new file mode 100644 index 000000000..702c57f0a --- /dev/null +++ b/public/locales/fi/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Tuodaan… +encryptingFile = Salataan... +decryptingFile = Puretaan salausta... +downloadCount = + { $num -> + [one] yhden latauksen + *[other] { $num } latauksen + } +timespanHours = + { $num -> + [one] 1 tunnin + *[other] { $num } tunnin + } +copiedUrl = Kopioitu! +unlockInputPlaceholder = Salasana +unlockButtonLabel = Avaa +downloadButtonLabel = Lataa +downloadFinish = Lataus valmis +fileSizeProgress = { $partialSize } / { $totalSize } +sendYourFilesLink = Kokeile Send -palvelua +errorPageHeader = Jokin meni pieleen! +fileTooBig = Tämä tiedosto on liian suuri ladattavaksi. Sen pitäisi olla pienempi kuin { $size }. +linkExpiredAlt = Linkki on vanhentunut +notSupportedHeader = Selaintasi ei tueta. +notSupportedLink = Miksi selaintani ei tueta? +notSupportedOutdatedDetail = Valitettavasti tämä Firefoxin versio ei tue Sendiä käyttävää web-tekniikkaa. Sinun on päivitettävä selaimesi. +updateFirefox = Päivitä Firefox +deletePopupCancel = Peruuta +deleteButtonHover = Poista +footerLinkLegal = Juridiset asiat +footerLinkPrivacy = Tietosuoja +footerLinkCookies = Evästeet +passwordTryAgain = Väärä salasana. Yritä uudelleen. +javascriptRequired = Firefox-Send vaatii JavaScriptin +whyJavascript = Miksi Send vaatii JavaScriptin? +enableJavascript = Ota JavaScript käyttöön ja yritä uudelleen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } t { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Salasanan enimmäispituus: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Tätä salasanaa ei voitu asettaa + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Helppoa ja yksityistä tiedostonjakoa +introDescription = { -send-brand } mahdollistaa tiedostojen jakamisen automaattisesti vanhenevalla linkillä. Tiedostojen jakaminen tapahtuu päästä päähän -salattuna. Näin jakamasi tiedostot pysyvät yksityisinä ja voit olla varma, etteivät lähettämäsi tiedostot pysy verkossa ikuisesti. +notifyUploadEncryptDone = Tiedosto on salattu ja valmis lähetettäväksi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Vanhenee { $downloadCount } tai { $timespan } jälkeen +timespanMinutes = + { $num -> + [one] 1 minuutin + *[other] { $num } minuutin + } +timespanDays = + { $num -> + [one] 1 päivän + *[other] { $num } päivän + } +timespanWeeks = + { $num -> + [one] 1 viikon + *[other] { $num } viikon + } +fileCount = + { $num -> + [one] 1 tiedosto + *[other] { $num } tiedostoa + } +# byte abbreviation +bytes = t +# kibibyte abbreviation +kb = kt +# mebibyte abbreviation +mb = Mt +# gibibyte abbreviation +gb = Gt +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Koko yhteensä: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopioi linkki jakaaksesi tiedoston: +copyLinkButton = Kopioi linkki +downloadTitle = Lataa tiedostot +downloadDescription = Tämä tiedosto jaettiin { -send-brand } -palvelun kautta päästä päähän -salattuna ja automaattisesti vanhenevalla linkillä. +trySendDescription = Kokeile { -send-brand } -palvelua jakaaksesi tiedostoja helposti ja turvallisesti. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Vain 1 tiedosto on mahdollistaa lähettää kerralla. + *[other] Vain { $count } tiedostoa on mahdollista lähettää kerralla. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Vain 1 arkisto on sallittu. + *[other] Vain { $count } arkistoa on sallittu. + } +expiredTitle = Tämä linkki on vanhentunut. +notSupportedDescription = { -send-brand } ei toimi tällä selaimella. { -send-short-brand } toimii parhaiten { -firefox }in uusimmalla versiolla, ja toimii useimpien selainten uusimmilla versioilla. +downloadFirefox = Lataa { -firefox } +legalTitle = { -send-short-brand }-yksityisyyskäytäntö +legalDateStamp = Versio 1.0, päivätty 13. maaliskuuta 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } pv { $hours } t { $minutes } min +addFilesButton = Valitse lähetettävät tiedostot +trustWarningMessage = Varmista, että luotat vastaanottajaan jakaessasi arkaluontoisia tietoja. +uploadButton = Lähetä +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Vedä ja pudota tiedostot +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = tai napsauta lähettääksesi tiedostoja, joiden koko voi olla enintään { $size } +addPassword = Suojaa salasanalla +emailPlaceholder = Kirjoita sähköpostiosoitteesi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kirjautumalla voit lähettää jopa { $size } kokoisia tiedostoja +signInOnlyButton = Kirjaudu sisään +accountBenefitTitle = Luo { -firefox }-tili tai kirjaudu sisään +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Jaa jopa { $size } kokoisia tiedostoja +accountBenefitDownloadCount = Jaa tiedostoja useamman ihmisen kesken +accountBenefitTimeLimit = + { $count -> + [one] Säilytä linkit aktiivisina 1 päivän ajan + *[other] Säilytä linkit aktiivisina { $count } päivän ajan + } +accountBenefitSync = Hallitse jaettuja tiedostoja miltä tahansa laitteelta +accountBenefitMoz = Lue lisää muista { -mozilla }-palveluista +signOut = Kirjaudu ulos +okButton = OK +downloadingTitle = Ladataan +noStreamsWarning = Tämä selain ei välttämättä osaa purkaa salausta näin suurikokoisista tiedostoista. +noStreamsOptionCopy = Kopioi linkki avataksesi sen toisessa selaimessa +noStreamsOptionFirefox = Kokeile suosikkiselaintamme +noStreamsOptionDownload = Jatka tällä selaimella +downloadFirefoxPromo = { -send-short-brand } on olemassa kiitos uuden { -firefox }in. +# the next line after the colon contains a file name +shareLinkDescription = Jaa linkki tiedostoosi: +shareLinkButton = Jaa linkki +# $name is the name of the file +shareMessage = Lataa tiedosto ”{ $name }” { -send-brand } -palvelusta: yksinkertaista ja turvallista tiedostonjakoa +trailheadPromo = On tapa suojata yksityisyyttään. Liity Firefoxiin. +learnMore = Lue lisää. +downloadFlagged = Tämä linkki on poistettu käytöstä palvelun käyttöehtojen rikkomisen vuoksi. +downloadConfirmTitle = Vielä yksi asia +downloadConfirmDescription = Varmista, että luotat sinulle tämän tiedoston lähettäneeseen henkilöön, koska emme voi vahvistaa, ettei kyseinen tiedosto vahingoita laitettasi. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Luotan henkilöön, joka lähetti tämän tiedoston + *[other] Luotan henkilöön, joka lähetti nämä tiedostot + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Ilmoita tämä tiedosto epäilyttävänä + *[other] Ilmoita nämä tiedostot epäilyttävinä + } +reportDescription = Auta meitä ymmärtämään mitä tapahtuu. Mikä on mielestäsi vialla näissä tiedostoissa? +reportUnknownDescription = Siirry sen linkin osoitteeseen, josta haluat tehdä ilmoituksen, ja napsauta “{ reportFile }”. +reportButton = Ilmoita +reportReasonMalware = Nämä tiedostot sisältävät haittaohjelmia tai ovat osa tietojenkalasteluhyökkäystä. +reportReasonPii = Nämä tiedostot sisältävät henkilökohtaisia tietoja minusta. +reportReasonAbuse = Nämä tiedostot sisältävät laitonta tai loukkaavaa sisältöä. +reportReasonCopyright = Ilmoita tekijänoikeuksien tai tavaramerkkien loukkauksista tällä sivulla kuvatun prosessin mukaisesti. +reportedTitle = Tiedostot ilmoitettu +reportedDescription = Kiitos. Olemme vastaanottaneet raporttisi näistä tiedostoista. diff --git a/public/locales/fr/send.ftl b/public/locales/fr/send.ftl index f662d7321..e82f2756d 100644 --- a/public/locales/fr/send.ftl +++ b/public/locales/fr/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = expérience web -siteFeedback = Votre avis -uploadPageHeader = Partage de fichiers de façon confidentielle et chiffrée -uploadPageExplainer = Envoyez des fichiers de façon sécurisée, confidentielle et chiffrée, via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment. -uploadPageLearnMore = En savoir plus -uploadPageDropMessage = Déposez votre fichier ici pour l’envoyer -uploadPageSizeMessage = Pour un résultat fiable, il est conseillé d’utiliser des fichiers de taille inférieure à 1 Go -uploadPageBrowseButton = Sélectionner un fichier sur l’ordinateur -uploadPageBrowseButton1 = Choisir un fichier à envoyer -uploadPageMultipleFilesAlert = L’envoi de plusieurs fichiers ou de dossiers n’est pas pris en charge pour le moment. -uploadPageBrowseButtonTitle = Envoyer le fichier -uploadingPageProgress = Envoi en cours de { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importation… -verifyingFile = Vérification… encryptingFile = Chiffrement… decryptingFile = Déchiffrement… -notifyUploadDone = L’envoi est terminé. -uploadingPageMessage = Une fois l’envoi terminé, vous serez en mesure de régler les options d’expiration. -uploadingPageCancel = Annuler l’envoi -uploadCancelNotification = L’envoi a été annulé. -uploadingPageLargeFileMessage = Ce fichier est volumineux et son envoi peut prendre un peu de temps. -uploadingFileNotification = M’envoyer une notification lorsque l’envoi est terminé. -uploadSuccessConfirmHeader = Paré à l’envoi -uploadSvgAlt = Envoyer -uploadSuccessTimingHeader = Le lien vers votre fichier expirera après le premier téléchargement ou au bout de 24 heures. -expireInfo = Le lien vers votre fichier expirera après { $downloadCount } ou { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 téléchargement *[other] { $num } téléchargements } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 heure *[other] { $num } heures } -copyUrlFormLabelWithName = Copiez et partagez le lien pour envoyer votre fichier : { $filename } -copyUrlFormButton = Copier dans le presse-papiers copiedUrl = Lien copié ! -deleteFileButton = Supprimer le fichier -sendAnotherFileLink = Envoyer un autre fichier -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Télécharger -downloadsFileList = Téléchargements -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Heure -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Télécharger { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Saisissez le mot de passe unlockInputPlaceholder = Mot de passe unlockButtonLabel = Déverrouiller -downloadFileTitle = Télécharger le fichier chiffré -// Firefox Send is a brand name and should not be localized. -downloadMessage = Votre ami⋅e vous a envoyé un fichier avec Firefox Send, un service qui permet d’envoyer des fichiers de façon sécurisée, confidentielle et chiffrée via un lien qui expire automatiquement pour que vos informations ne restent pas en ligne indéfiniment. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Télécharger -downloadNotification = Le téléchargement est terminé. downloadFinish = Téléchargement terminé -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } sur { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Essayer Firefox Send -downloadingPageProgress = Téléchargement en cours de { $filename } ({ $size }) -downloadingPageMessage = Merci de laisser cet onglet ouvert pendant que nous récupérons le fichier et que nous le déchiffrons. -errorAltText = Erreur lors de l’envoi +sendYourFilesLink = Essayer Send errorPageHeader = Une erreur s’est produite. -errorPageMessage = Une erreur s’est produite lors de l’envoi du fichier. -errorPageLink = Envoyer un autre fichier fileTooBig = Ce fichier est trop volumineux pour être envoyé. Sa taille doit être inférieure à { $size }. linkExpiredAlt = Le lien a expiré -expiredPageHeader = Ce lien a expiré ou n’a jamais existé. notSupportedHeader = Votre navigateur n’est pas pris en charge. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Malheureusement, ce navigateur ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devrez utiliser un autre navigateur. Nous vous recommandons Firefox ! notSupportedLink = Pourquoi mon navigateur n’est-il pas pris en charge ? -notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Firefox Send. Vous devez mettre à jour votre navigateur. +notSupportedOutdatedDetail = Malheureusement, cette version de Firefox ne prend pas en charge les technologies web utilisées par Send. Vous devez mettre à jour votre navigateur. updateFirefox = Mettre à jour Firefox -downloadFirefoxButtonSub = Téléchargement gratuit -uploadedFile = Fichier -copyFileList = Copier le lien -// expiryFileList is used as a column header -expiryFileList = Expire dans -deleteFileList = Supprimer -nevermindButton = Non merci -legalHeader = Confidentialité et conditions d’utilisation -legalNoticeTestPilot = Firefox Send est actuellement une expérience Test Pilot, et en tant que tel est soumis aux conditions d’utilisation et à la politique de confidentialité de Test Pilot. Vous pouvez en apprendre plus sur cette expérience et sur la collecte de données ici. -legalNoticeMozilla = L’utilisation du site web Firefox Send est aussi soumise à l’avis de confidentialité relatif aux sites Web ainsi qu’aux conditions d’utilisation des sites Web de Mozilla. -deletePopupText = Supprimer ce fichier ? -deletePopupYes = Oui deletePopupCancel = Annuler deleteButtonHover = Supprimer -copyUrlHover = Copier le lien footerLinkLegal = Mentions légales -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = À propos de Test Pilot footerLinkPrivacy = Confidentialité -footerLinkTerms = Conditions d’utilisation footerLinkCookies = Cookies -requirePasswordCheckbox = Exiger un mot de passe pour télécharger ce fichier -addPasswordButton = Ajouter un mot de passe -changePasswordButton = Changer passwordTryAgain = Mot de passe incorrect. Veuillez réessayer. -// This label is followed by the password needed to download a file -passwordResult = Mot de passe : { $password } -reportIPInfringement = Signaler une violation de la p.i. -javascriptRequired = Firefox Send nécessite JavaScript -whyJavascript = Pourquoi Firefox Send nécessite-t-il JavaScript ? +javascriptRequired = Send nécessite JavaScript +whyJavascript = Pourquoi Send nécessite-t-il JavaScript ? enableJavascript = Veuillez activer JavaScript puis réessayer. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } h { $minutes } min -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Longueur maximale du mot de passe : { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ce mot de passe n’a pas pu être défini + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partage de fichiers simple et privé +introDescription = { -send-brand } vous permet de partager des fichiers chiffrés de bout en bout ainsi qu’un lien qui expire automatiquement. Ainsi, vous pouvez garder ce que vous partagez en privé et vous assurer que vos contenus ne restent pas en ligne pour toujours. +notifyUploadEncryptDone = Votre fichier est chiffré et prêt à l’envoi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expire après { $downloadCount } ou { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minutes + } +timespanDays = + { $num -> + [one] 1 jour + *[other] { $num } jours + } +timespanWeeks = + { $num -> + [one] 1 semaine + *[other] { $num } semaines + } +fileCount = + { $num -> + [one] 1 fichier + *[other] { $num } fichiers + } +# byte abbreviation +bytes = o +# kibibyte abbreviation +kb = Ko +# mebibyte abbreviation +mb = Mo +# gibibyte abbreviation +gb = Go +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Taille totale : { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiez le lien pour partager votre fichier : +copyLinkButton = Copier le lien +downloadTitle = Télécharger les fichiers +downloadDescription = Ce fichier a été partagé via { -send-brand } avec un chiffrement de bout en bout et un lien qui expire automatiquement. +trySendDescription = Essayez { -send-brand } pour un partage de fichiers simple et sécurisé. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Un seul fichier peut être envoyé à la fois. + *[other] Seuls { $count } fichiers peuvent être envoyés à la fois. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Une seule archive est autorisée. + *[other] Seules { $count } archives sont autorisées. + } +expiredTitle = Ce lien a expiré. +notSupportedDescription = { -send-brand } ne fonctionnera pas avec ce navigateur. { -send-short-brand } fonctionne mieux avec la dernière version de { -firefox } et fonctionnera avec la dernière version de la plupart des navigateurs. +downloadFirefox = Télécharger { -firefox } +legalTitle = Politique de confidentialité de { -send-short-brand } +legalDateStamp = Version 1.0 du 12 mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } j { $hours } h { $minutes } min +addFilesButton = Sélectionnez des fichiers à envoyer +trustWarningMessage = Assurez-vous de faire confiance au destinataire lorsque vous partagez des données sensibles. +uploadButton = Envoyer +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Glissez-déposez des fichiers +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ou cliquez pour envoyer jusqu’à { $size } +addPassword = Protéger par mot de passe +emailPlaceholder = Votre adresse électronique +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Connectez-vous pour envoyer jusqu’à { $size } +signInOnlyButton = Connexion +accountBenefitTitle = Créez un compte { -firefox } ou connectez-vous +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partagez des fichiers jusqu’à { $size } +accountBenefitDownloadCount = Partagez des fichiers avec davantage de personnes +accountBenefitTimeLimit = + { $count -> + [one] Maintenez les liens actifs jusqu’à 1 journée + *[other] Maintenez les liens actifs jusqu’à { $count } jours + } +accountBenefitSync = Gérez les fichiers partagés à partir de n’importe quel appareil +accountBenefitMoz = Apprenez-en davantage sur les autres services { -mozilla } +signOut = Se déconnecter +okButton = OK +downloadingTitle = Téléchargement en cours +noStreamsWarning = Ce navigateur pourrait ne pas être en mesure de déchiffrer un fichier aussi volumineux. +noStreamsOptionCopy = Copiez le lien pour l’ouvrir dans un autre navigateur +noStreamsOptionFirefox = Essayez notre navigateur préféré +noStreamsOptionDownload = Continuer avec ce navigateur +downloadFirefoxPromo = { -send-short-brand } vous est proposé par le tout nouveau { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Partagez le lien vers votre fichier : +shareLinkButton = Partager le lien +# $name is the name of the file +shareMessage = Télécharger « { $name } » avec { -send-brand } : un moyen simple et sûr de partager des fichiers +trailheadPromo = Il existe un moyen de protéger votre vie privée. Rejoignez Firefox. +learnMore = En savoir plus. +downloadFlagged = Ce lien a été désactivé en raison d’une violation des conditions d’utilisation. +downloadConfirmTitle = Une dernière chose +downloadConfirmDescription = Assurez-vous de faire confiance à la personne qui vous a envoyé ce fichier, car nous ne pouvons pas vérifier qu’il n’endommagera pas votre appareil. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Je fais confiance à la personne qui a envoyé ce fichier + *[other] Je fais confiance à la personne qui a envoyé ces fichiers + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Signaler ce fichier comme suspect + *[other] Signaler ces fichiers comme suspects + } +reportDescription = Aidez-nous à comprendre ce qui se passe. Selon vous, quel est le problème avec ces fichiers ? +reportUnknownDescription = Accédez à l’adresse du lien que vous souhaitez signaler et cliquez sur « { reportFile } ». +reportButton = Signaler +reportReasonMalware = Ces fichiers contiennent des logiciels malveillants ou contribuent à une attaque de hameçonnage. +reportReasonPii = Ces fichiers contiennent des informations personnelles qui me concernent. +reportReasonAbuse = Ces fichiers contiennent du contenu illégal ou abusif. +reportReasonCopyright = Pour signaler une violation de droit d’auteur ou de marque, suivez la procédure décrite sur cette page. +reportedTitle = Fichiers signalés +reportedDescription = Merci, nous avons reçu votre signalement relatif à ces fichiers. diff --git a/public/locales/fy-NL/send.ftl b/public/locales/fy-NL/send.ftl index 3e4ce8b24..855ebe76e 100644 --- a/public/locales/fy-NL/send.ftl +++ b/public/locales/fy-NL/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webeksperiment -siteFeedback = Kommentaar -uploadPageHeader = Privee, fersifere bestânsdieling -uploadPageExplainer = Ferstjoer bestannen troch in feilich, privee en fersifere keppeling dy't automatysk ferrint, om foar te kommen dat jo guod net foar altyd online bliuwt. -uploadPageLearnMore = Mear ynfo -uploadPageDropMessage = Sleep jo bestân hjir hinne om opladen te starten -uploadPageSizeMessage = Foar de meast betroubere wurking, is it it bêste om jo bestân lytser as 1 GB te hâlden -uploadPageBrowseButton = Selektearje in bestân op jo kompjûter -uploadPageBrowseButton1 = Selektearje in bestân om op te laden -uploadPageMultipleFilesAlert = Opladen fan mear bestannen tagelyk of in map wurdt op dit stuit net stipe. -uploadPageBrowseButtonTitle = Bestân oplade -uploadingPageProgress = { $filename } ({ $size }) wurdt oplaad +# Send is a brand name and should not be localized. +title = Send importingFile = Ymportearje… -verifyingFile = Ferifiearje… encryptingFile = Fersiferje… decryptingFile = Untsiferje… -notifyUploadDone = Jo oplaad is foltôge. -uploadingPageMessage = Sa gau as jo bestân opladen wurdt, kinne jo de opsjes foar de ferrindatum ynstelle. -uploadingPageCancel = Opladen annulearje -uploadCancelNotification = Jo oplaad is annulearre. -uploadingPageLargeFileMessage = Dit is in grut bestân en it opladen kin efkes duorje. In amerijke! -uploadingFileNotification = Jou in melding as de oplaad foltôge is. -uploadSuccessConfirmHeader = Ree om te ferstjoeren -uploadSvgAlt = Oplaad -uploadSuccessTimingHeader = De keppeling nei jo bestân sil nei 1 download ferrinne of nei 24 oeren. -expireInfo = De keppeling nei jo bestân sil nei { $downloadCount } of { $timespan } ferrinne. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 download *[other] { $num } downloads } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 oer - *[other] { $num } oeren + *[other] { $num } oer } -copyUrlFormLabelWithName = Kopiearje en diel de keppeling om jo bestân te ferstjoeren: { $filename } -copyUrlFormButton = Nei klamboerd kopiearje copiedUrl = Kopiearre! -deleteFileButton = Bestân fuortsmite -sendAnotherFileLink = Noch in bestân ferstjoere -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Downloade -downloadsFileList = Downloads -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tiid -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } downloade -downloadFileSize = ({ $size }) -unlockInputLabel = Wachtwurd ynfiere unlockInputPlaceholder = Wachtwurd unlockButtonLabel = Deblokkearje -downloadFileTitle = Fersifere bestân downloade -// Firefox Send is a brand name and should not be localized. -downloadMessage = Jo freon stjoert jo in best^n mei Firefox Send, in tsjinst dy't jo yn steat stelt bestannen te dielen mei in feilige, privee en fersifere keppeling dy't automatysk ferrint om wis te wêzen dat jo guod net foar altyd online bliuwt. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Downloade -downloadNotification = Jo download is foltôge. downloadFinish = Download foltôge -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } fan { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send probearje -downloadingPageProgress = { $filename } ({ $size }) wurdt download -downloadingPageMessage = Lit dit ljepblêd iepen wylst wy jo bestân krije en ûntsiferje. -errorAltText = Oplaadflater +sendYourFilesLink = Send probearje errorPageHeader = Der is wat misgien! -errorPageMessage = Der is in flater bard wylst it opladen fan jo bestân. -errorPageLink = Noch in bestân ferstjoere fileTooBig = It bestân is te grut om op te laden. It moat lytser wêze as { $size }. linkExpiredAlt = Keppeling ferrûn -expiredPageHeader = Dizze keppeling is ferrûn of hat nea bestien! notSupportedHeader = Jo browser wurdt net stipe. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Spitigernôch stipet dizze browser de webtechnology dy't Firefox Send mooglik makket net. Jo moatte in oare browser probearje. Wy rekommandearje Firefox! notSupportedLink = Wêrom wurdt myn browser net stipe? -notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Firefox Send mooflik makket net. Jo moatte jo browser fernije. +notSupportedOutdatedDetail = Spitigernôch stipet dizze ferzje fan Firefox de webtechnology dy't Send mooflik makket net. Jo moatte jo browser fernije. updateFirefox = Firefox fernije -downloadFirefoxButtonSub = Fergese download -uploadedFile = Bestân -copyFileList = URL kopiearje -// expiryFileList is used as a column header -expiryFileList = Ferrint oer -deleteFileList = Fuortsmite -nevermindButton = Lit mar -legalHeader = Betingsten en privacy -legalNoticeTestPilot = Firefox Send is op dit stuit in Test Pilot-eksperimint en falt ûnder de Betingsten en Privacybelied fan Test Pilot. Mear ynformaasje oer dit eksperimint en de gegevenssamling stiethjir. -legalNoticeMozilla = Gebrûk fan de Firefox Send-website falt ek ûnder it Websites Privacybelied en Websites Gebrûksbetingsten fan Mozilla. -deletePopupText = Dit bestân fuortsmite -deletePopupYes = Ja deletePopupCancel = Annulearje deleteButtonHover = Fuortsmite -copyUrlHover = URL kopiearje footerLinkLegal = Juridysk -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Oer Test Pilot footerLinkPrivacy = Privacy -footerLinkTerms = Betingsten footerLinkCookies = Cookies -requirePasswordCheckbox = Om dit bestân te downloaden is in wachtwurd fereaske -addPasswordButton = Wachtwurd tafoegje -changePasswordButton = Wizigje passwordTryAgain = Net krekt wachtwurd. Probearje it opnij. -// This label is followed by the password needed to download a file -passwordResult = Wachtwurd: { $password } -reportIPInfringement = IP-ynbrek melde -javascriptRequired = Firefox Send fereasket JavaScript. -whyJavascript = Werom hat Firefox Send JavaScript nedich? +javascriptRequired = Send fereasket JavaScript. +whyJavascript = Werom hat Send JavaScript nedich? enableJavascript = Skeakelje JavaScript yn en probearje nochris. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }o { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimale wachtwurdlingte: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dit wachtwurd koe net ynsteld wurde + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Ienfâldich, privee bestannen diele +introDescription = Mei { -send-brand } kinne jo bestannen mei ein-ta-ein-fersifering en in automatysk ferrinnende keppeling diele. Sa kinne jo de dielde ynhâld privee hâlde, sadat jo gegevens net foar altyd online bliuwt. +notifyUploadEncryptDone = Jo bestân is fersifere en ree om te ferstjoeren +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ferrint nei { $downloadCount } of { $timespan } +timespanMinutes = + { $num -> + [one] 1 minute + *[other] { $num } minuten + } +timespanDays = + { $num -> + [one] 1 dei + *[other] { $num } dagen + } +timespanWeeks = + { $num -> + [one] 1 wike + *[other] { $num } wiken + } +fileCount = + { $num -> + [one] 1 bestân + *[other] { $num } bestannen + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Totale grutte: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiearje de keppeling, om jo bestannen te dielen: +copyLinkButton = Keppeling kopierje +downloadTitle = Bestannen downloade +downloadDescription = Dit bestân is mei ein-ta-ein-fersifering en in keppeling dy't automatysk ferrint dield fia { -send-brand }. +trySendDescription = Probearje { -send-brand }, om ienfâldich en privee bestannen te dielen. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Der kin maksimaal ien bestân opladen wurde. + *[other] Der kinne maksimaal { $count } bestannen opladen wurde. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Der is mar ien argyf tastien. + *[other] Der binne mar { $count } argiven tastien. + } +expiredTitle = Dizze keppeling is ferrûn. +notSupportedDescription = { -send-brand } funksjonearret net mei dizze browser. { -send-short-brand } funksjonearret it bêste mei de nijste ferzje fan { -firefox } en funksjonearret mei de aktuele ferzje fan de measte browsers. +downloadFirefox = { -firefox } downloade +legalTitle = { -send-short-brand }-privacyferklearring +legalDateStamp = Ferzje 1.0, datearre 12 maart 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }o { $minutes }m +addFilesButton = Bestannen selektearje om op te laden +trustWarningMessage = Soargje derfoar dat jo jo ûntfanger fertrouwe wannear't jo gefoelige gegevens diele. +uploadButton = Oplade +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Sleep en pleats bestannen +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = of stjoer oant { $size } troch te klikken +addPassword = Mei wachtwurd beskermje +emailPlaceholder = Fier jo e-mailadres yn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Meld jo oan, om bestannen oant { $size } te stjoeren +signInOnlyButton = Oanmelde +accountBenefitTitle = Meitsje in { -firefox }-account of meld jo oan +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Diel bestannen oant { $size } +accountBenefitDownloadCount = Diel bestannen mei mear minsken +accountBenefitTimeLimit = + { $count -> + [one] Keppeling oant ien dei lang aktyf hâlde + *[other] Keppeling oant { $count } dagen lang aktyf hâlde + } +accountBenefitSync = Behear dielde bestannen fan elk apparaat ôf +accountBenefitMoz = Lês mear oer oare { -mozilla }-tsjinsten +signOut = Ofmelde +okButton = OK +downloadingTitle = Downloade +noStreamsWarning = Dizze browser kin in sa'n grut bestân mooglik net fersiferje. +noStreamsOptionCopy = Kopiearje de koppeling om yn in oare browser te iepenjen +noStreamsOptionFirefox = Probearje ús favorite browser +noStreamsOptionDownload = Trochgean mei dizze browser +downloadFirefoxPromo = { -send-short-brand } wurdt jo oanbean troch it folslein fernijde { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Diel de keppeling nei jo bestân: +shareLinkButton = Keppeling diele +# $name is the name of the file +shareMessage = Download ‘{ $name }’ mei { -send-brand }: ienfâldich, feilich bestannen diele +trailheadPromo = Der is in manier om jo privacy te beskermjen. Doch mei mei Firefox. +learnMore = Mear ynfo. +downloadFlagged = Dizze keppeling is útskeakele fanwegen skeining fan de servicebetingsten. +downloadConfirmTitle = Noch ien ding +downloadConfirmDescription = Soargje derfoar dat jo de persoan fertrouwe dy't jo dit bestân stjoerd hat, omdat wy net ferifiearje kinne dat it jo apparaat net skansearje sil. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Ik fertrou de persoan dy't dit bestân stjoerd hat + *[other] Ik fertrou de persoan dy't dizze bestannen stjoerd hat + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Dit bestân as fertocht rapportearje + *[other] Dizze bestannen as fertocht rapportearje + } +reportDescription = Help ús te begripen wat der oan de hân is. Wat is der neffens jo mis mei dizze bestannen? +reportUnknownDescription = Gean nei de URL fan de keppeling dy't jo melde wolle en klik op ‘{ reportFile }’. +reportButton = Rapportearje +reportReasonMalware = Dizze bestannen befetsje malware of binne part fan in phishingoanfal. +reportReasonPii = Dizze bestannen befetsje persoanlik identifisearjende ynformaasje oer my. +reportReasonAbuse = Dizze bestannen befetsje yllegale of beledigjende ynhâld. +reportReasonCopyright = Brûk de proseduere op dizze side om ynbreuk op auteursrjochten of hannelsmerken te melden. +reportedTitle = Bestannen rapportearre +reportedDescription = Tank. Wy hawwe jo rapport oer dizze bestannen ûntfongen. diff --git a/public/locales/gn/send.ftl b/public/locales/gn/send.ftl new file mode 100644 index 000000000..162a069be --- /dev/null +++ b/public/locales/gn/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Ojegueruhína… +encryptingFile = Mo’ãmby… +decryptingFile = Ñemo’ã’o… +downloadCount = + { $num -> + [one] 1 mboguejy + *[other] { $num } mboguejy + } +timespanHours = + { $num -> + [one] 1 aravo + *[other] { $num } aravo + } +copiedUrl = Monguatiapyre! +unlockInputPlaceholder = Ñe’ẽñemi +unlockButtonLabel = Mbojera +downloadButtonLabel = Mboguejy +downloadFinish = Oguejypáma +fileSizeProgress = ({ $partialSize } rehe { $totalSize }) +sendYourFilesLink = Eipuru Send +errorPageHeader = ¡Oiko jejavy! +fileTooBig = Marandurenda tuichaiterei ehupi hag̃ua. Michĩveva’erã { $size } gui. +linkExpiredAlt = Juajuha ndoikóiva +notSupportedHeader = Ne kundaha ndorekói pytyvõ. +notSupportedLink = ¿Mba’ére che kundahára ndorekói ñepytyvõ? +notSupportedOutdatedDetail = Ko Firefox rembiapo ndaipu’akái ñanduti rembipurupyahu oikotevẽva Send. Embohekopyahúke ne kundahára. +updateFirefox = Firefox mbohekopyahu +deletePopupCancel = Heja +deleteButtonHover = Mboguete +footerLinkLegal = Añetegua +footerLinkPrivacy = Ñemigua +footerLinkCookies = Kookie +passwordTryAgain = Ñe’ẽñemi ndoikóiva. Eha’ãjey. +javascriptRequired = Send oikotevẽ JavaScript +whyJavascript = ¿Mba’ére Send oikotevẽ JavaScript? +enableJavascript = Ikatúpa embojuruja JavaScript ha eha’ãjey uperire. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } m +# A short status message shown when the user enters a long password +maxPasswordLength = Ñe’ẽñemi pukukue: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ndaikatúi oikóvo ko ñe’ẽñemi + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Marandurenda ñemoambue hasy’ỹ ha ñemiguáva +introDescription = { -send-brand } omoherakuãkuaa marandurenda papapýpe ñepyrũ guive opa peve ha juajuha opareíva ijehegui. Ikatu oreko ñemihápe emoherakuãva ha ehecháta mba’éicha ne mba’ekuéra noĩri ñandutípe opa ára. +notifyUploadEncryptDone = Ne marandurenda oñemo’ã ha ikatúma emondo +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Opáta { $downloadCount } rire térã { $timespan } +timespanMinutes = + { $num -> + [one] 1 aravo’i + *[other] { $num } aravo’i + } +timespanDays = + { $num -> + [one] 1 ára + *[other] { $num } ára + } +timespanWeeks = + { $num -> + [one] 1 arapokõindy + *[other] { $num } arapokõindy + } +fileCount = + { $num -> + [one] 1 marandurenda + *[other] { $num } marandurenda + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tuichakue: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Emonguatia juajuha ha emoherakuã ne marandurenda: +copyLinkButton = Emonguatia juajuha +downloadTitle = Emboguejy marandurenda +downloadDescription = Ko marandurenda omoherakuã { -send-brand } rupive papapýpe ñepyrũ guive opa peve ha juajuha opáva ijehegui reheve. +trySendDescription = Eipuru { -send-brand } emoherakuã hag̃ua marandurenda tasy’ỹ ha tekorosãme. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ikatu ehupi 1 marandurenda oñondive + *[other] Ikatu ehupi { $count } marandurenda oñondive + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Oñemoneĩ 1 marandurenda añoite + *[other] Oñemoneĩ { $count } marandurenda añoite + } +expiredTitle = Ko juajuha ndoikovéima. +notSupportedDescription = { -send-brand } ndoikomo’ãi ko kundahára ndive. { -send-short-brand } oikoporãvéta { -firefox } rembiapokue ipyahuvéva ndive, ha oikóta opavavete kundahára ndive. +downloadFirefox = Emboguejy { -firefox } +legalTitle = { -send-short-brand } Marandu ñemigua +legalDateStamp = Mba’epyahu 1.0, 12 jasyapy 2019 peguare +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Eiporavo marandurenda ehupi hag̃ua +trustWarningMessage = Ejerovia añetépa emondotaháre emoherakuãvo mba’ekuaarã kañyguáva. +uploadButton = Hupi +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Embosyryry ha epoi marandurenda +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = térã eikutu emondo hag̃ua { $size } peve +addPassword = Ñe’ẽñemíme mo’ãmbyre +emailPlaceholder = Emoinge ne ñanduti veve +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Eñepyrũ tembiapo emondo hag̃ua { $size } peve +signInOnlyButton = Eñepyrũ tembiapo +accountBenefitTitle = Emoheñói { -firefox } mba’ete térã eñepyrũ tembiapo +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Emoherakuã marandurenda { $size } peve +accountBenefitDownloadCount = Emoherakuã marandurenda hetave tapicha ndive +accountBenefitTimeLimit = + { $count -> + [one] Eguereko juajuha hendyhápe 1 ára + *[other] Eguereko juajuha hendyhápe { $count } ára + } +accountBenefitSync = Eñangareko marandurenda moherakuãmbyrére oimeraẽ mba’e’oka guive. +accountBenefitMoz = Eikuaa ambue { -mozilla } mba’epytyvõrã +signOut = Emboty tembiapo +okButton = OK +downloadingTitle = Oñemboguejyhína +noStreamsWarning = Ikatu ko kundahára ndoikuaái marandurenda tuichaitereíva. +noStreamsOptionCopy = Embokuatia juajuha embojuruja hag̃ua ambue kundahárape. +noStreamsOptionFirefox = Eipuru ore kundahára rohayhuvéva +noStreamsOptionDownload = Eku’ejey ko kundahára ndive +downloadFirefoxPromo = Ipyahúva { -firefox } ome’ẽse ndéve { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Emoherakuã juajuha ne mba’e’oka ndive: +shareLinkButton = Emoherakuã juajuha +# $name is the name of the file +shareMessage = Emboguejy “{ $name }” { -send-brand } ndive: emoherakuã marandurenda tasy’ỹ ha tekorosãme +trailheadPromo = Mba’éichapa emo’ãta ne ñemigua. Eipuru Firefox. +learnMore = Kuaave. +downloadFlagged = Ko juajuha ojepe’áma ombyai rupi mba’epytyvõrã ñemboguata. +downloadConfirmTitle = Peteĩ mba’eve +downloadConfirmDescription = Ejerovia añetépa pe tapicha oguerukáva ndéve ko marandurenda ndaikatúire rohechajey ne mba’e’oka. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Ajerovia tapicháre orukáva ko marandurenda + *[other] Ajerovia umi tapicha orukáva ko’ã marandurenda + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Ehechauka ko marandurenda imarãkuaávarõ + *[other] Ehechauka ko’ã marandurenda imarãkuaávarõ + } +reportDescription = Orepytyvõ roikumbývo mba’épa oiko. ¿Mba’épa ere oĩvaiha ko’ã marandurenda ndive? +reportUnknownDescription = Eikundaha pe url juajuha ekoroiseha ndive ha eikutu “{ reportFile }”. +reportButton = Ekorói +reportReasonMalware = Ko’ã marandurenda oreko tembiaporape imarãva térã oñembyaikuaáva. +reportReasonPii = Ko’ã marandurenda oreko marandu nemba’etéva che kuaaukakuaáva. +reportReasonAbuse = Ko’ã marandurenda oreko tetepy ivai térã imbaretéva. +reportReasonCopyright = Ekoróitarõ derécho ñembyaíre térã marca registrada, ehecha jehaipyre ko kuatiaroguépe. +reportedTitle = Marandurenda jekoroihague +reportedDescription = Aguyje. Og̃uahẽ nde jekorói ko’ã marandurenda rehegua. diff --git a/public/locales/gor/send.ftl b/public/locales/gor/send.ftl new file mode 100644 index 000000000..f0c55744d --- /dev/null +++ b/public/locales/gor/send.ftl @@ -0,0 +1,63 @@ +# Send is a brand name and should not be localized. +title = Firefox Molawo +siteSubtitle = web yimontalo +siteFeedback = Potunu +uploadPageLearnMore = Pobalajariya po'olo +uploadPageBrowseButton = Tulawota berkas to delomo komputermu +uploadPageBrowseButton1 = Tulawota berkas u detohulo +uploadPageBrowseButtonTitle = Detohe berkas +uploadingPageProgress = Hemodetohu { $filename } ({ $size }) +notifyUploadDone = Diletohumu ma yilapato +uploadingPageMessage = Bataliya modetohu +uploadingPageCancel = Bataliya modetohu +uploadCancelNotification = Diletohumu ma bilatali +uploadingPageLargeFileMessage = Berkas botiya damango wawu paralu wakutu ngope'e mopodetohu. Potihulo'opo! +uploadingFileNotification = Poleleya ola'u wonu ma yilapato lodetohu. +uploadSuccessConfirmHeader = Siap Molawo +uploadSvgAlt = Detohe +timespanHours = + { $num -> + *[other] { $num } jam + } +copiedUrl = Yilami +deleteFileButton = Luluta berkas +sendAnotherFileLink = Lawola berkas uwewo +# Alternative text used on the download link/button (indicates an action). +downloadAltText = Mopohuli +downloadsFileList = Mopohuli +# Used as header in a column indicating the amount of time left before a +# download link expires (e.g. "10h 5m") +timeFileList = Wakutu +# Used as header in a column indicating the number of times a file has been +# downloaded +downloadFileName = Mopohuli { $filename } +downloadFileSize = ({ $size }) +unlockInputLabel = Tuwota Password +unlockInputPlaceholder = Password +unlockButtonLabel = Hu'owa +downloadFileTitle = Mopohuli Enskripsi Berkas +# Text and title used on the download link/button (indicates an action). +downloadButtonLabel = Mopohuli +downloadNotification = U pilopohulimu ma yilapato. +downloadFinish = Mopohuli Yilapato +# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +fileSizeProgress = ({ $partialSize } meyalo { $totalSize }) +# Send is a brand name and should not be localized. +sendYourFilesLink = Yimontali Firefox Molawo +downloadingPageProgress = Modetohu { $filename } ({ $size }) +downloadFirefoxButtonSub = Pereyi Mopohuli +uploadedFile = Berkas +copyFileList = Kupe'iya URL +# expiryFileList is used as a column header +expiryFileList = Mopulito To +deleteFileList = Luluta +nevermindButton = Sambelo +deletePopupText = Luluta berkas botiya? +deletePopupYes = Joo +deletePopupCancel = Bataliya +deleteButtonHover = Luluta +copyUrlHover = Kupe'iya URL +footerLinkLegal = Legal +# Test Pilot is a proper name and should not be localized. +footerLinkAbout = Tomimbihu Test Pilot +changePasswordButton = Boli'a diff --git a/public/locales/he/send.ftl b/public/locales/he/send.ftl index ffecb54f5..29e93a3e9 100644 --- a/public/locales/he/send.ftl +++ b/public/locales/he/send.ftl @@ -1,73 +1,186 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ניסוי אינטרנט -siteFeedback = משוב -uploadPageHeader = שיתוף קבצים פרטי, מוצפן -uploadPageExplainer = לשלוח קבצים דרך קישור בטוח, פרטי ומוצפן שפג אוטומטית, כדי לוודא שהתכנים הפרטיים שלך לא יהיו ברשת לנצח. -uploadPageLearnMore = מידע נוסף -uploadPageDropMessage = יש לגרור קבצים לכאן כדי להתחיל בהעלאה -uploadPageSizeMessage = להשגת ביצועים מיטביים, מוטב לשמור על הקובץ מתחת לגודל של 1 ג״ב -uploadPageBrowseButton1 = נא לבחור קובץ להעלאה -uploadPageMultipleFilesAlert = העלאה של מספר קבצים או ספריה אינה נתמכת כרגע. -uploadPageBrowseButtonTitle = העלאת קובץ -uploadingPageProgress = { $filename } ({ $size }) בהעלאה -importingFile = מתבצע ייבוא... -verifyingFile = מתבצע אימות… +# Send is a brand name and should not be localized. +title = Send +importingFile = מתבצע ייבוא… encryptingFile = מתבצעת הצפנה... decryptingFile = מתבצע פענוח... -notifyUploadDone = ההעלאה שלך הסתיימה -uploadingPageMessage = אחרי שהקובץ שלך יעלה, ניתן יהיה להגדיר אפשרויות תפוגה. -uploadCancelNotification = ההעלאה שלך בוטלה. -uploadingPageLargeFileMessage = קובץ זה גדול ועלול לקחת זמן להעלות אותו. סבלנות! -uploadingFileNotification = נא להודיע לי כשתסתיים ההעלאה. -uploadSuccessConfirmHeader = מוכן לשליחה -uploadSvgAlt - .alt = להעלות -uploadSuccessTimingHeader = הקישור לקובץ שלך יפוג אחרי הורדה אחת או בעוד 24 שעות. -copyUrlFormLabelWithName = ניתן להעתיק ולשתף את הקישור כדי לשלוח את הקובץ שלך: { $filename } +downloadCount = + { $num -> + [one] הורדה אחת + *[other] { $num } הורדות + } +timespanHours = + { $num -> + [one] שעה אחת + [two] שעתיים + *[other] { $num } שעות + } copiedUrl = הועתק! -deleteFileButton = מחיקת קובץ - .title = מחיקת קובץ -sendAnotherFileLink = שליחת קובץ נוסף - .title = שליחת קובץ נוסף -// Alternative text used on the download link/button (indicates an action). -downloadAltText - .alt = הורדה -downloadFileName = ההורדה נכשלה -downloadFileSize = ({ $size }) -// Text and title used on the download link/button (indicates an action). +unlockInputPlaceholder = ססמה +unlockButtonLabel = שחרור נעילה downloadButtonLabel = הורדה - .title = הורדה -downloadNotification = ההורדה הושלמה. downloadFinish = ההורדה הושלמה -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } מתוך { $totalSize }) -downloadingPageProgress = בהורדה: { $filename } ({ $size }) -errorAltText - .alt = תקלה בהעלאה +sendYourFilesLink = נסו את Send errorPageHeader = משהו השתבש! -errorPageLink = שליחת קובץ נוסף fileTooBig = הקובץ הזה גדול מידי להעלאה. עליו להיות קטן מ־{ $size }. -linkExpiredAlt - .alt = קישור פג +linkExpiredAlt = הקישור פג notSupportedHeader = הדפדפן שלך לא נתמך. notSupportedLink = למה אין תמיכה בדפדפן שלי? -downloadFirefoxButtonSub = הורדה בחינם -uploadedFile = קובץ -copyFileList = העתקת כתובת -// expiryFileList is used as a column header -expiryFileList = יפוג בעוד -deleteFileList = מחיקה -nevermindButton = לא משנה -legalHeader = תנאי שירות ופרטיות -deletePopupText = למחוק דף זה? -deletePopupYes = כן +notSupportedOutdatedDetail = לצערנו גרסת Firefox זו לא תומכת בטכנולוגית הרשת שמפעילה את Send. יש לעדכן את הגרסה של הדפדפן שלך. +updateFirefox = עדכון Firefox deletePopupCancel = ביטול -deleteButtonHover - .title = מחיקה -copyUrlHover - .title = העתקת קישור +deleteButtonHover = מחיקה footerLinkLegal = מידע משפטי footerLinkPrivacy = פרטיות -footerLinkTerms = תנאי שימוש footerLinkCookies = קובצי עוגיות +passwordTryAgain = סיסמה שגויה. נא לנסות שוב. +javascriptRequired = ל־Send דרוש JavaScript +whyJavascript = למה ל־Send דרוש JavaScript? +enableJavascript = נא להפעיל JavaScript ולנסות שוב. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } שע׳ { $minutes } דק׳ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } דק׳ +# A short status message shown when the user enters a long password +maxPasswordLength = אורך הססמה המרבי: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = לא ניתן להגדיר את הססמה הזאת + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = שיתוף קבצים פרטי ופשוט +introDescription = { -send-brand } מאפשר לך לשתף קבצים עם הצפנה מקצה לקצה וקישור עם תפוגה אוטומטית. בצורה זו תוכלו לשתף קבצים באופן פרטי ולהבטיח שהדברים שלכם לא נשארים ברשת לנצח. +notifyUploadEncryptDone = הקובץ שלך מוצפן ומוכן לשליחה +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = יפוג לאחר { $downloadCount } או { $timespan } +timespanMinutes = + { $num -> + [one] דקה אחת + *[other] { $num } דקות + } +timespanDays = + { $num -> + [one] יום אחד + [two] יומיים + *[other] { $num } ימים + } +timespanWeeks = + { $num -> + [one] שבוע אחד + [two] שבועיים + *[other] { $num } שבועות + } +fileCount = + { $num -> + [one] קובץ אחד + *[other] { $num } קבצים + } +# byte abbreviation +bytes = בתים +# kibibyte abbreviation +kb = ק״ב +# mebibyte abbreviation +mb = מ״ב +# gibibyte abbreviation +gb = ג״ב +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = גודל כולל: { $size } +# the next line after the colon contains a file name +copyLinkDescription = יש להעתיק את הקישור כדי לשתף את הקובץ שלך: +copyLinkButton = העתקת קישור +downloadTitle = הורדת קבצים +downloadDescription = קובץ זה שותף באמצעות { -send-brand } עם הצפנה מקצה לקצה וקישור שפג באופן אוטומטי. +trySendDescription = כדאי לנסות את { -send-brand } לשיתוף קבצים פשוט ומאובטח. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ניתן להעלות רק קובץ אחד בכל פעם. + *[other] ניתן להעלות רק { $count } קבצים בכל פעם. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] רק ארכיון אחד מורשה. + *[other] רק { $count } ארכיונים מורשים. + } +expiredTitle = פג תוקפו של קישור זה. +notSupportedDescription = ‏{ -send-brand } לא יפעל עם דפדפן זה. { -send-short-brand } פועל בצורה הטובה ביותר עם הגרסה העדכנית ביותר של { -firefox }, ויעבוד עם הגרסה הנוכחית של רוב הדפדפנים. +downloadFirefox = הורדת { -firefox } +legalTitle = הצהרת פרטיות של { -send-short-brand } +legalDateStamp = גרסה 1.0, בתאריך 12 במרץ 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ימים { $hours } שעות { $minutes } דקות +addFilesButton = בחירת קבצים להעלאה +trustWarningMessage = עליך לוודא שבעת שיתוף מידע רגיש הנמענים שלך הם מהימנים. +uploadButton = העלאה +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = גרירה והשלכת קבצים +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = או ללחוץ כדי לשלוח קבצים עד לגודל של { $size } +addPassword = הגנה באמצעות ססמה +emailPlaceholder = נא להכניס כתובת דוא״ל +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = נא להירשם כדי לשלוח קבצים עד גודל של { $size } +signInOnlyButton = כניסה +accountBenefitTitle = נא ליצור חשבון { -firefox } או להיכנס לחשבון +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = שיתוף קבצים עד גודל של { $size } +accountBenefitDownloadCount = שיתוף קבצים עם יותר אנשים +accountBenefitTimeLimit = + { $count -> + [one] שמירה על קישורים פעילים עד ליום אחד + *[other] שמירה על קישורים פעילים עד ל־{ $count } ימים + } +accountBenefitSync = ניהול קבצים משותפים מכל מכשיר +accountBenefitMoz = מידע נוסף על שירותי { -mozilla } אחרים +signOut = יציאה +okButton = אישור +downloadingTitle = בהורדה +noStreamsWarning = ייתכן שדפדפן זה לא יוכל לפענח קובץ בגודל כזה. +noStreamsOptionCopy = העתקת הקישור לפתיחה בדפדפן אחר +noStreamsOptionFirefox = נסו את הדפדפן המועדף עלינו +noStreamsOptionDownload = המשך בדפדפן זה +downloadFirefoxPromo = { -send-short-brand } מובא אליך בחסות { -firefox } +# the next line after the colon contains a file name +shareLinkDescription = שיתוף הקישור לקובץ שלך: +shareLinkButton = שיתוף קישור +# $name is the name of the file +shareMessage = הורדת ״{ $name }״ עם { -send-brand }: שיתוף קבצים פשוט ובטוח +trailheadPromo = ישנן דרכים נוספות להגן על הפרטיות שלכם. הצטרפו אל Firefox. +learnMore = מידע נוסף. +downloadFlagged = קישור זה הושבת מכיוון שהפר את תנאי השירות. +downloadConfirmTitle = דבר אחד אחרון +downloadConfirmDescription = נא לוודא שמי ששלח לך את הקובץ הזה מהימן כיוון שאין לנו אפשרות לוודא שהוא לא יפגע במכשיר שלך. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] שולח הקובץ הזה מהימן + *[other] שולח הקבצים האלו מהימן + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] דיווח על קובץ זה כחשוד + *[other] דיווח על קבצים אלו כחשודים + } +reportUnknownDescription = נא לגשת אל כתובת הקישור עליו ברצונך לדווח וללחוץ על ״{ reportFile }״. +reportButton = דיווח +reportReasonMalware = קבצים אלה מכילים תוכנה זדונית או שהינם חלק מהתקפת דיוג. +reportReasonAbuse = קבצים אלה מכילים תוכן בלתי חוקי או פוגע. +reportReasonCopyright = כדי לדווח על הפרה של זכויות יוצרים או סימני מסחר, יש להשתמש בתהליך המתואר בדף זה. +reportedTitle = קבצים שדווחו +reportedDescription = תודה. קיבלנו את הדיווח שלך על קבצים אלה. diff --git a/public/locales/hr/send.ftl b/public/locales/hr/send.ftl new file mode 100644 index 000000000..97211a653 --- /dev/null +++ b/public/locales/hr/send.ftl @@ -0,0 +1,196 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Uvoz… +encryptingFile = Šifriranje … +decryptingFile = Dešifriranje … +downloadCount = + { $num -> + [one] { $num } preuzimanje + [few] { $num } preuzimanja + *[other] { $num } preuzimanja + } +timespanHours = + { $num -> + [one] { $num } sat + [few] { $num } sata + *[other] { $num } sati + } +copiedUrl = Kopirano! +unlockInputPlaceholder = Lozinka +unlockButtonLabel = Otključaj +downloadButtonLabel = Preuzmi +downloadFinish = Preuzimanje je završeno. +fileSizeProgress = ({ $partialSize } od { $totalSize }) +sendYourFilesLink = Isprobaj Send +errorPageHeader = Dogodila se neka greška! +fileTooBig = Datoteka je prevelika za prijenos. Mora biti manja od { $size }. +linkExpiredAlt = Poveznica je istekla +notSupportedHeader = Tvoj preglednik nije podržan. +notSupportedLink = Zašto moj preglednik nije podržan? +notSupportedOutdatedDetail = Nažalost, ovo izdanje Firefoxa ne podržava web tehnologiju koja omogućava Send. Morat ćeš ažurirati preglednik. +updateFirefox = Ažuriraj Firefox +deletePopupCancel = Odustani +deleteButtonHover = Obriši +footerLinkLegal = Pravni podaci +footerLinkPrivacy = Privatnost +footerLinkCookies = Kolačići +passwordTryAgain = Netočna lozinka. Pokušaj ponovo. +javascriptRequired = Za Send potreban je JavaScript +whyJavascript = Zašto je za Send potreban JavaScript? +enableJavascript = Aktiviraj JavaScript i pokušaj ponovo. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }s { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }min +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna duljina lozinke: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Lozinku nije moguće postaviti + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jednostavno i privatno dijeljenje datoteka +introDescription = { -send-brand } omogućava dijeljenje datoteka sa šifriranjem i poveznicom koja će automatski isteći. Ovim putem, stvari koje dijeliš ostaju privatne i osiguravaš se da ne ostaju zauvijek dostupne na internetu. +notifyUploadEncryptDone = Tvoja je datoteka šifrirana i spremna za slanje. +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Isteći će nakon { $downloadCount } ili { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minuta + [few] { $num } minute + *[other] { $num } minuta + } +timespanDays = + { $num -> + [one] { $num } dan + [few] { $num } dana + *[other] { $num } dana + } +timespanWeeks = + { $num -> + [one] { $num } tjedan + [few] { $num } tjedna + *[other] { $num } tjedana + } +fileCount = + { $num -> + [one] { $num } datoteka + [few] { $num } datoteke + *[other] { $num } datoteka + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ukupna veličina: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiraj poveznicu za dijeljenje svoje datoteke: +copyLinkButton = Kopiraj poveznicu +downloadTitle = Preuzmi datoteke +downloadDescription = Ova se datoteka dijelila putem usluge { -send-brand } sa šifriranjem i poveznicom koja će automatski isteći. +trySendDescription = Probaj { -send-brand } za jednostavno i sigurno dijeljenje datoteka. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Istovremeno se može prenijeti samo { $count } datoteka. + [few] Istovremeno se može prenijeti samo { $count } datoteke. + *[other] Istovremeno se može prenijeti samo { $count } datoteka. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Dozvoljena je samo { $count } arhiva. + [few] Dozvoljene su samo { $count } arhive. + *[other] Dozvoljeno je samo { $count } arhiva. + } +expiredTitle = Poveznica je istekla. +notSupportedDescription = { -send-brand } neće raditi s ovim preglednikom. { -send-short-brand } najbolje radi sa zadnjom { -firefox } verzijom i radit će s aktualnim verzijama većine preglednika. +downloadFirefox = Preuzmi { -firefox } +legalTitle = { -send-short-brand } politika privatnosti +legalDateStamp = Verzija 1.0, od 12. ožujka 2019. godine +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }s { $minutes }m +addFilesButton = Odaberi datoteke za prijenos +trustWarningMessage = Budite sigurni da vjerujete primatelju prije dijeljenja osjetljivih podataka. +uploadButton = Prijenos +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Povuci i ispusti datoteke +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ili pritisni gumb, za slanje do { $size } +addPassword = Zaštiti s lozinkom +emailPlaceholder = Upiši svoju e-adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Prijavi se, za slanje do { $size } +signInOnlyButton = Prijavi se +accountBenefitTitle = Otvori { -firefox } račun ili se prijavi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dijeli datoteke do { $size } +accountBenefitDownloadCount = Dijeli datoteke s više osoba +accountBenefitTimeLimit = + { $count -> + [one] Ostavi poveznice aktivnima { $count } dan + [few] Ostavi poveznice aktivnima { $count } dana + *[other] Ostavi poveznice aktivnima { $count } dana + } +accountBenefitSync = Upravljaj dijeljenim datotekama s bilo kojeg uređaja +accountBenefitMoz = Saznaj više o drugim { -mozilla } uslugama +signOut = Odjavi se +okButton = U redu +downloadingTitle = Preuzimanje +noStreamsWarning = Ovaj preglednik možda neće moći dešifrirati datoteku ove veličine. +noStreamsOptionCopy = Za otvaranje u drugom pregledniku, kopiraj poveznicu +noStreamsOptionFirefox = Isprobaj naš omiljeni preglednik +noStreamsOptionDownload = Nastavi s ovim preglednikom +downloadFirefoxPromo = Potpuno novi { -firefox } donosi { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Dijeli poveznicu na tvoju datoteku: +shareLinkButton = Dijeli poveznicu +# $name is the name of the file +shareMessage = Preuzmi „{ $name }” pomoću { -send-brand }: jednostavno i sigurno dijeljenje datoteka +trailheadPromo = Postoji način, kako zaštititi vlastitu privatnost. Pridruži se Firefoxu. +learnMore = Saznaj više. +downloadFlagged = Poveznica je onemogućena zbog kršenja uvjeta pružanja usluge. +downloadConfirmTitle = Još jedna stvar +downloadConfirmDescription = Budite sigurni da vjerujete osobi koja vam je poslala ovu datoteku, zato što mi ne možemo provjeriti da li će ova datoteka naštetiti vašem uređaju. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Vjerujem osobi koja je poslala ove datoteke + [few] Vjerujem osobi koja je poslala ove datoteke + *[other] Vjerujem osobi koja je poslala ove datoteke + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Prijavi ove datoteke kao sumnjive + [few] Prijavi ove datoteke kao sumnjive + *[other] Prijavi ove datoteke kao sumnjive + } +reportDescription = Pomozite nam da shvatimo što se dešava. Zašto mislite da nešto nije u redu s ovim datotekama? +reportUnknownDescription = Idite na poveznicu koju želite prijaviti i kliknite “{ reportFile }”. +reportButton = Prijavi datoteku +reportReasonMalware = Ove datoteke sadrže zlonamjerni softver ili su dio napada za krađu identiteta. +reportReasonPii = Ove datoteke sadrže moje osobne podatke. +reportReasonAbuse = Ove datoteke sadrže ilegalni ili nasilni sadržaj. +reportReasonCopyright = Kako biste prijavili kršenje autorskih prava, koristite proces opisan na ovoj stranici. +reportedTitle = Datoteke prijavljene +reportedDescription = Hvala vam. Primili smo vašu prijavu za ove datoteke. diff --git a/public/locales/hsb/send.ftl b/public/locales/hsb/send.ftl index d121cd233..f63b60e39 100644 --- a/public/locales/hsb/send.ftl +++ b/public/locales/hsb/send.ftl @@ -1,119 +1,207 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webeksperiment -siteFeedback = Komentar -uploadPageHeader = Priwatne, zaklučowane dźělenje datajow -uploadPageExplainer = Pósćelće dataje přez wěsty, priwatny a zaklučowany wotkaz, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostali. -uploadPageLearnMore = Dalše informacije -uploadPageDropMessage = Ćehńće swoju dataju sem, zo byšće ju nahrał -uploadPageSizeMessage = Wužiwajće najlěpje dataje, kotrež su mjeńše hač 1 GB za lěpšu spušćomnosć. -uploadPageBrowseButton = Wubjerće dataju na swojim ličaku -uploadPageBrowseButton1 = Wubjerće dataju za nahraće -uploadPageMultipleFilesAlert = Nahrawanje wjacorych datajow abo rjadowaka so tuchwilu njepodpěruje. -uploadPageBrowseButtonTitle = Dataju nahrać -uploadingPageProgress = { $filename } ({ $size }) so nahrawa +# Send is a brand name and should not be localized. +title = Send importingFile = Importuje so... -verifyingFile = Přepruwuje so... encryptingFile = Zaklučuje so... decryptingFile = Dešifruje so... -notifyUploadDone = Waše nahraće je dokónčene. -uploadingPageMessage = Hdyž so waša dataja nahrawa, móžeće nastajenja spadnjenja postajić. -uploadingPageCancel = Nahraće přetorhnyć -uploadCancelNotification = Waše nahraće je so přetorhnyło. -uploadingPageLargeFileMessage = Tuta dataja je wulka a nahrawanje móhło chwilku trać. Budźće sćerpliwy! -uploadingFileNotification = Zdźělić, hdyž nahraće je dokónčene. -uploadSuccessConfirmHeader = Hotowy za słanje -uploadSvgAlt = Nahrać -uploadSuccessTimingHeader = Wotkaz k wašej dataji po 1 sćehnjenju abo 24 hodźinach spadnje. -expireInfo = Wotkaz k wašej dataji po { $downloadCount } abo { $timespan } spadnje. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 sćehnjenje [two] { $num } sćehnjeni [few] { $num } sćehnjenja *[other] { $num } sćehnjenjow } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hodźina [two] { $num } hodźinje [few] { $num } hodźiny *[other] { $num } hodźin } -copyUrlFormLabelWithName = Kopěrujće a dźělće wotkaz, zo byšće swoju dataju pósłał: { $filename } -copyUrlFormButton = Do mjezyskłada kopěrować copiedUrl = Kopěrowany! -deleteFileButton = Dataju zhašeć -sendAnotherFileLink = Druhu dataju pósłać -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Sćahnyć -downloadsFileList = Sćehnjenja -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Čas -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } sćahnyć -downloadFileSize = ({ $size }) -unlockInputLabel = Hesło zapodać unlockInputPlaceholder = Hesło unlockButtonLabel = Wotewrěć -downloadFileTitle = Zaklučowanu dataju sćahnyć -// Firefox Send is a brand name and should not be localized. -downloadMessage = Waš přećel wam dataju z Firefox Send sćele, słužba, kotraž wam zmóžnja, dataje přez wěsty, priwatny a zaklučowany wotkaz dźělić, kotryž awtomatisce spadnje, zo njebychu waše daty na přeco online wostawali. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Sćahnyć -downloadNotification = Waše sćehnjenje je dokónčene. downloadFinish = Sćehnjenje dokónčene -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send wupruwować -downloadingPageProgress = { $filename } ({ $size }) so sćahuje -downloadingPageMessage = Prošu wostajće tutón rajtark wočinjeny, mjeztym zo wašu dataju sćahujemy a dešifrujemy. -errorAltText = Nahrawanski zmylk +sendYourFilesLink = Send wupruwować errorPageHeader = Něšto je so nimokuliło! -errorPageMessage = Při nahrawanju dataje je zmylk wustupił. -errorPageLink = Druhu dataju pósłać fileTooBig = Tuta dataja je přewulka za nahraće. Měła mjeńša hač { $size } być. linkExpiredAlt = Wotkaz je spadnjeny -expiredPageHeader = Tutón wotkaz je spadnjeny abo njeje ženje eksistował! notSupportedHeader = Waš wobhladowak so njepodpěruje. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Bohužel tutón wobhladowak webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće druhi wobhladowak wužiwać. My Firefox doporučemy! notSupportedLink = Čehodla so mój wobhladowak njepodpěruje? -notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Firefox Send bazuje. Dyrbiće swój wobhladowak aktualizować. +notSupportedOutdatedDetail = Bohužel tuta wersija Firefox webtechnologiju njepodpěruje, na kotrejž Send bazuje. Dyrbiće swój wobhladowak aktualizować. updateFirefox = Firefox aktualizować -downloadFirefoxButtonSub = Darmotne sćehnjenje -uploadedFile = Dataja -copyFileList = URL kopěrować -// expiryFileList is used as a column header -expiryFileList = Spadnje za -deleteFileList = Zhašeć -nevermindButton = Wšojedne -legalHeader = Wuměnjenja a priwatnosć -legalNoticeTestPilot = Firefox je tuchwilu eksperiment Test Pilot, a podleži wužiwanskim wuměnjenjam a pokazce priwatnosće Test Pilot. Wjace wo tutym eksperimenće a daty, kotrež hromadźi, tu zhoniće. -legalNoticeMozilla = Tež wužiwanje websydła Firefox Send pokazce priwatnosće za websydła a wužiwanskim wuměnjenjam za websydła Mozilla podleži. -deletePopupText = Tutu dataju zhašeć? -deletePopupYes = Haj deletePopupCancel = Přetorhnyć deleteButtonHover = Zhašeć -copyUrlHover = URL kopěrować footerLinkLegal = Prawniske -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Wo Test Pilot footerLinkPrivacy = Priwatnosć -footerLinkTerms = Wuměnjenja footerLinkCookies = Placki -requirePasswordCheckbox = Žadajće sej hesło za sćehnjenje tuteje dataje -addPasswordButton = Hesło přidać -changePasswordButton = Změnić passwordTryAgain = Wopačne hesło. Prošu spytajće hišće raz. -// This label is followed by the password needed to download a file -passwordResult = Hesło: { $password } -reportIPInfringement = Zranjenje IP zdźělić -javascriptRequired = Firefox Send JavaScript trjeba -whyJavascript = Čehodla Firefox Send JavaScript trjeba? +javascriptRequired = Send JavaScript trjeba +whyJavascript = Čehodla Send JavaScript trjeba? enableJavascript = Prošu zmóžńće JavaScript a spytajće hišće raz. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } hodź. { $minutes } mjeń. -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } mjeń. +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimalna dołhosć hesła: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Tute hesło njeda so nastajić + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jednore, priwatne datajowe dźělenje +introDescription = { -send-brand } wam zmóžnja, dataje ze zaklučowanjom kónc do kónca a wotkazom dźělić, kotryž awtomatisce spadnje. Tak móžeće dźěleny wobsah priwatny dźeržeć a zawěsćić, zo waše daty online na přeco njewóstanu. +notifyUploadEncryptDone = Waša dataja je zaklučowana a hotowa za słanje +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Spadnje po { $downloadCount } abo { $timespan } +timespanMinutes = + { $num -> + [one] { $num } mjeńšina + [two] { $num } mjeńšinje + [few] { $num } mjeńšiny + *[other] { $num } mjeńšin + } +timespanDays = + { $num -> + [one] { $num } dźeń + [two] { $num } dnjej + [few] { $num } dny + *[other] { $num } dnjow + } +timespanWeeks = + { $num -> + [one] { $num } tydźeń + [two] { $num } njedźeli + [few] { $num } njedźele + *[other] { $num } njedźel + } +fileCount = + { $num -> + [one] { $num } dataja + [two] { $num } dataji + [few] { $num } dataje + *[other] { $num } datajow + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Cyłkowna wulkosć: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopěrujće wotkaz, zo byšće swoju dataju dźělił: +copyLinkButton = Wotkaz kopěrować +downloadTitle = Dataje sćahnyć +downloadDescription = Tuta dataja je so přez { -send-brand } ze zaklučowanjom kónc do kónca a wotkazom dźěliła, kotryž awtomatisce spadnje. +trySendDescription = Spytajće { -send-brand } za jednore, wěste datajowe dźělenje. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Jenož { $count } dataja da so na jedne dobo nahrać. + [two] Jenož { $count } dataji datej so na jedne dobo nahrać. + [few] Jenož { $count } dataje dadźa so na jedne dobo nahrać. + *[other] Jenož { $count } datajow da so na jedne dobo nahrać. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Jenož { $count } archiw je dowoleny. + [two] Jenož { $count } archiwaj stej dowolenej. + [few] Jenož { $count } archiwy su dowolene. + *[other] Jenož { $count } archiwow je dowolene. + } +expiredTitle = Tutón wotkaz je spadnjeny. +notSupportedDescription = { -send-brand } z tutym wobhladowakom njefunguje. { -send-short-brand } najlěpje z najnowšej wersiju { -firefox } funguje, a funguje z aktualnej wersiju najwjace wobhladowakow. +downloadFirefox = { -firefox } scáhnyć +legalTitle = Zdźělenka priwatnosće { -send-short-brand } +legalDateStamp = Wersija 1.0 wot 12. měrca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Dataje za nahrawanje wubrać +trustWarningMessage = Wy měł přijimarjej dowěrić, hdyž sensibelne daty dźěliće. +uploadButton = Nahrać +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ćehńće a wotkładźće dataje +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = abo klikńće, zo byšće do { $size } pósłał +addPassword = Z hesłom škitać +emailPlaceholder = Zapodajće swoju e-mejlowu adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Přizjewće so, zo byšće do { $size } pósłał +signInOnlyButton = Přizjewić +accountBenefitTitle = Załožće konto { -firefox } abo přizjewće so +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dataje do { $size } dźělić +accountBenefitDownloadCount = Dataje z wjace ludźimi dźělić +accountBenefitTimeLimit = + { $count -> + [one] Wotkazy do { $count } dnja aktiwne dźeržeć + [two] Wotkazy do { $count } dnjow aktiwne dźeržeć + [few] Wotkazy do { $count } dnjow aktiwne dźeržeć + *[other] Wotkazy do { $count } dnjow aktiwne dźeržeć + } +accountBenefitSync = Dźělene dataje z někajkeho grata rjadować +accountBenefitMoz = ZHońće wjace wo druhich słužbach { -mozilla } +signOut = Wotzjewić +okButton = W porjadku +downloadingTitle = Sćahuje so +noStreamsWarning = Tutón wobhladowak njemóhł tajku wulku dataju dešifrować. +noStreamsOptionCopy = Kopěrujće wotkaz, zo byšće jón w druhim wobhladowaku wočinił +noStreamsOptionFirefox = Wupruwujće naš najlubši wobhladowak +noStreamsOptionDownload = Z tutym wobhladowakom pokročować +downloadFirefoxPromo = { -send-short-brand } so wam přez cyle nowy { -firefox } přinjese. +# the next line after the colon contains a file name +shareLinkDescription = Dźělće wotkaz k swojej dataji: +shareLinkButton = Wotkaz dźělić +# $name is the name of the file +shareMessage = Sćehńće „{ $name }“ z { -send-brand }: jednore, wěste dźělenje datajow +trailheadPromo = Je móžnosć, wašu priwatnosć škitać. Přińdźće k Firefox. +learnMore = Dalše informacije. +downloadFlagged = Tutón wotkaz je so přestupjenja wužiwanskich wuměnjenjow dla znjemóžnił. +downloadConfirmTitle = Jedna wěc hišće +downloadConfirmDescription = Wy měł wotpósłarjej tuteje dataje dowěrić, dokelž njemóžemy přepruwować, hač to wašemu gratej wadźi. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Dowěrju wosobje, kotraž je tutu dataju pósłała + [two] Dowěrju wosobje, kotraž je tutej dataji pósłała + [few] Dowěrju wosobje, kotraž je tute dataje pósłała + *[other] Dowěrju wosobje, kotraž je tute dataje pósłała + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Tutu dataju jako podhladnu zdźělić + [two] Tutej dataji jako podhladnej zdźělić + [few] Tute dataje jako podhladne zdźělić + *[other] Tute dataje jako podhladne zdźělić + } +reportDescription = Pomhajće nam rozumić, što so stawa. Što po wašim zdaću z tutymi datajemi w porjadku njeje? +reportUnknownDescription = Dźiće prošu k URL wotkaza, kotryž chceće zdźělić a klikńće na „{ reportFile }“. +reportButton = Zdźělić +reportReasonMalware = Tute dataje škódnu softwaru wobsahuja abo su dźěl nadpada kradnjenja datow. +reportReasonPii = Tute dataje wosobinske informacije wo mni, kotrež móža mje identifikować. +reportReasonAbuse = Tute dataje njedowoleny abo ranjacy wobsah wobsahuja. +reportReasonCopyright = Zo byšće zranjenje awtorskeho prawa abo prawa wikowanskich znamjenjow zdźělił, wužiwajće postupowanje, kotrež so na tutej stronje wopisuje. +reportedTitle = Dataje su zdźělene +reportedDescription = Wulki dźak. Smy wašu rozprawu wo tutych datajach dóstali. diff --git a/public/locales/hu/send.ftl b/public/locales/hu/send.ftl index b7e7c1ee2..028868902 100644 --- a/public/locales/hu/send.ftl +++ b/public/locales/hu/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webes kísérlet -siteFeedback = Visszajelzés -uploadPageHeader = Privát, titkosított fájlmegosztás -uploadPageExplainer = Küldjön át fájlokat biztonságos, privát és titkosított hivatkozáson keresztül, amely automatikusan elévül, hogy ne maradjanak a dolgai örökké online. -uploadPageLearnMore = Tudjon meg többet -uploadPageDropMessage = Dobja ide a fájljait, és kezdjen feltölteni -uploadPageSizeMessage = A megbízható működés érdekében a legjobb, ha a fájlok 1 GB-nál kisebbek maradnak -uploadPageBrowseButton = Válasszon egy fájlt a számítógépén -uploadPageBrowseButton1 = Válassza ki a feltöltendő fájlt -uploadPageMultipleFilesAlert = Több fájl vagy mappa feltöltése pillanatnyilag nem támogatott. -uploadPageBrowseButtonTitle = Fájl feltöltése -uploadingPageProgress = { $filename } ({ $size }) feltöltése +# Send is a brand name and should not be localized. +title = Send importingFile = Importálás… -verifyingFile = Ellenőrzés… encryptingFile = Titkosítás… decryptingFile = Visszafejtés… -notifyUploadDone = A feltöltése befejeződött. -uploadingPageMessage = Ha a fájl feltöltésre került, akkor megadhatja a lejárati beállításokat. -uploadingPageCancel = Feltöltés megszakítása -uploadCancelNotification = A feltöltés megszakításra került. -uploadingPageLargeFileMessage = Ez a fájl nagy, és a feltöltése eltarthat egy ideig. Türelmét kérjük! -uploadingFileNotification = Értesítsen, ha a feltöltés elkészült. -uploadSuccessConfirmHeader = Küldésre kész -uploadSvgAlt = Feltöltés -uploadSuccessTimingHeader = A fájl hivatkozása lejár 1 letöltés vagy 24 óra múlva. -expireInfo = A fájlhoz tartozó hivatkozás { $downloadCount } vagy { $timespan } múlva lejár. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 letöltés *[other] { $num } letöltés } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 óra *[other] { $num } óra } -copyUrlFormLabelWithName = Másolja és ossza meg a hivatkozást a fájl küldéséhez: { $filename } -copyUrlFormButton = Vágólapra másolás copiedUrl = Másolva! -deleteFileButton = Fájl törlése -sendAnotherFileLink = Még egy fájl küldése -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Letöltés -downloadsFileList = Letöltések -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Idő -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } letöltése -downloadFileSize = ({ $size }) -unlockInputLabel = Adja meg a jelszót unlockInputPlaceholder = Jelszó unlockButtonLabel = Feloldás -downloadFileTitle = Titkosított fájl letöltése -// Firefox Send is a brand name and should not be localized. -downloadMessage = Az ismerőse egy fájlt küld a Firefox Senddel, egy olyan fájlmegosztó szolgáltatással, amely biztonságos, privát és titkosított hivatkozáson keresztül működik, amely automatikusan elévül, így biztosítva hogy a dolga ne maradjon örökre online. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Letöltés -downloadNotification = A letöltés befejeződött. downloadFinish = A letöltés befejeződött -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Próbálja ki a Firefox Sendet -downloadingPageProgress = { $filename } letöltése ({ $size }) -downloadingPageMessage = Hagyja nyitva ezt a lapot, amíg lekérésre és visszafejtésre kerül a fájlja. -errorAltText = Feltöltési hiba +sendYourFilesLink = Próbálja ki a Sendet errorPageHeader = Hiba történt! -errorPageMessage = Hiba történt a fájl feltöltésekor. -errorPageLink = Még egy fájl küldése fileTooBig = Ez a fájl túl nagy a feltöltéshez. Kevesebb mint { $size } kell legyen. linkExpiredAlt = A hivatkozás lejárt -expiredPageHeader = Ez a hivatkozás lejárt, vagy sosem létezett! notSupportedHeader = A böngésző nem támogatott. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Sajnos ez a böngésző nem támogatja a Firefox Send alapját képező webes technológiát. Egy másik böngészőben kell megpróbálnia. Mi a Firefoxot javasoljuk! notSupportedLink = Miért nem támogatott a böngészőm? -notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Firefox Send alapját képező technológiát. Frissítenie kell a böngészőjét. +notSupportedOutdatedDetail = Sajnos a Firefox ezen verziója nem támogatja a Send alapját képező technológiát. Frissítenie kell a böngészőjét. updateFirefox = Firefox frissítése -downloadFirefoxButtonSub = Ingyenes letöltés -uploadedFile = Fájl -copyFileList = URL másolása -// expiryFileList is used as a column header -expiryFileList = Lejár: -deleteFileList = Törlés -nevermindButton = Mindegy -legalHeader = Feltételek és adatvédelem -legalNoticeTestPilot = A Firefox Send pillanatnyilag egy Tesztpilóta kísérlet, és a Szolgáltatási feltételek valamint az Adatvédelmi nyilatkozat vonatkozik rá. Többet tudhat meg a kísérletről, és az adatgyűjtéséről itt. -legalNoticeMozilla = A Firefox Send weboldal használatakor a Mozilla Webhelyekre vonatkozó adatvédelmi nyilatkozata és a Weboldalak felhasználási feltételei is vonatkoznak Önre. -deletePopupText = Törli ezt a fájlt? -deletePopupYes = Igen deletePopupCancel = Mégse deleteButtonHover = Törlés -copyUrlHover = URL másolása footerLinkLegal = Jogi információk -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = A Tesztpilóta névjegye footerLinkPrivacy = Adatvédelem -footerLinkTerms = Feltételek footerLinkCookies = Sütik -requirePasswordCheckbox = Jelszó megkövetelése a fájl letöltéséhez -addPasswordButton = Jelszó hozzáadása -changePasswordButton = Módosítás passwordTryAgain = Helytelen jelszó. Próbálja meg újra. -// This label is followed by the password needed to download a file -passwordResult = Jelszó: { $password } -reportIPInfringement = Szellemi tulajdon megsértésének bejelentése -javascriptRequired = A Firefox Sendhez JavaScript szükséges -whyJavascript = Miért van szükség JavaScriptre a Firefox Sendhez? +javascriptRequired = A Sendhez JavaScript szükséges +whyJavascript = Miért van szükség JavaScriptre a Sendhez? enableJavascript = Kérjük engedélyezze a JavaScriptet, majd próbálkozzon újra. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ó { $minutes }p -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }p +# A short status message shown when the user enters a long password +maxPasswordLength = Maximális jelszóhossz: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ez a jelszó nem állítható be + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Egyszerű, privát fájlmegosztás +introDescription = A { -send-brand }del végpontok közötti titkosítással oszthat meg fájlokat, a hivatkozások pedig automatikusan lejárnak. Így bizalmasan tarthatja azt, amit megoszt, és biztosíthatja, hogy a dolgok nem maradnak örökre online. +notifyUploadEncryptDone = A fájl titkosítva és készen áll a küldésre +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } vagy { $timespan } után elévül +timespanMinutes = + { $num -> + [one] 1 perc + *[other] { $num } perc + } +timespanDays = + { $num -> + [one] 1 nap + *[other] { $num } nap + } +timespanWeeks = + { $num -> + [one] 1 hét + *[other] { $num } hét + } +fileCount = + { $num -> + [one] 1 fájl + *[other] { $num } fájl + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Teljes méret: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Másolja a hivatkozást a fájl megosztásához: +copyLinkButton = Hivatkozás másolása +downloadTitle = Fájlok letöltése +downloadDescription = Ez a fájl a { -send-brand } szolgáltatással lett megosztva, végpontok közötti titkosítással, és a hivatkozás automatikusan elévül. +trySendDescription = Próbálja ki a { -send-brand }et az egyszerű, biztonságos fájlmegosztásért. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Egyszerre csak 1 fájl tölthető fel. + *[other] Egyszerre csak { $count } fájl tölthető fel. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Csak 1 archívum engedélyezett. + *[other] Csak { $count } archívum engedélyezett. + } +expiredTitle = Ez a hivatkozás elévült. +notSupportedDescription = A { -send-brand } nem működik ebben a böngészőben. A { -send-short-brand } a { -firefox } legfrissebb verziójával működik a legjobban, de működik a legtöbb böngésző aktuális verziójával is. +downloadFirefox = A { -firefox } letöltése +legalTitle = { -send-short-brand } adatvédelmi nyilatkozat +legalDateStamp = 1.0-s verzió, kelt 2019. március 12-én +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }n { $hours }ó { $minutes }p +addFilesButton = Válassza ki a feltöltendő fájlokat +trustWarningMessage = Érzékeny adatok megosztásakor győződjön meg róla, hogy megbízik-e a címzettben. +uploadButton = Feltöltés +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Húzza ide a fájlokat +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = vagy jelentkezzen be, és küldjön legfeljebb { $size }-ot +addPassword = Jelszavas védelem +emailPlaceholder = Adja meg az e-mail címét +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Jelentkezzen be, és küldjön legfeljebb { $size }-ot +signInOnlyButton = Bejelentkezés +accountBenefitTitle = Hozzon létre egy { -firefox } fiókot vagy jelentkezzen be +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Osszon meg fájlokat { $size }-ig +accountBenefitDownloadCount = Osszon meg fájlokat több emberrel +accountBenefitTimeLimit = + { $count -> + [one] A hivatkozások aktívan tartása legfeljebb 1 napig + *[other] A hivatkozások aktívan tartása legfeljebb { $count } napig + } +accountBenefitSync = Kezelje a megosztott fájlokat bármely eszközről +accountBenefitMoz = Ismerje meg a többi { -mozilla } szolgáltatást +signOut = Kijelentkezés +okButton = OK +downloadingTitle = Letöltés +noStreamsWarning = Előfordulhat, hogy a böngésző nem fog tudni visszafejteni egy ekkora fájlt. +noStreamsOptionCopy = Másolja a hivatkozást, és nyissa meg egy másik böngészőben +noStreamsOptionFirefox = Próbálja ki a kedvenc böngészőnket +noStreamsOptionDownload = Folytatás ezzel a böngészővel +downloadFirefoxPromo = A { -send-short-brand }et a vadonatúj { -firefox } hozza el Önnek. +# the next line after the colon contains a file name +shareLinkDescription = Ossza meg a fájlja hivatkozását: +shareLinkButton = Hivatkozás megosztása +# $name is the name of the file +shareMessage = „{ $name }” letöltése a { -send-brand } segítségével: egyszerű, biztonságos fájlmegosztás +trailheadPromo = Védje meg a magánszféráját. Csatlakozzon a Firefoxhoz. +learnMore = További tudnivalók. +downloadFlagged = Ezt a hivatkozást a szolgáltatási feltételek megsértése miatt letiltottuk. +downloadConfirmTitle = Még egy dolog +downloadConfirmDescription = Győződjön meg arról, hogy megbízik-e abban, aki küldte a fájlt, mert nem tudjuk ellenőrizni, hogy nem okoz-e kárt az eszközén. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Megbízom abban a személyben, aki elküldte ezt a fájlt + *[other] Megbízom abban a személyben, aki elküldte ezeket a fájlokat + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Fájl jelentése gyanúsként + *[other] Fájlok jelentése gyanúsként + } +reportDescription = Segítsen megérteni, hogy mi a helyzet. Ön szerint mi a baj ezekkel a fájlokkal? +reportUnknownDescription = Ugorjon a jelentendő hivatkozás URL-jéhez, és kattintson a „{ reportFile }” gombra. +reportButton = Jelentés +reportReasonMalware = Ezek a fájlok rosszindulatú programokat tartalmaznak, vagy adathalász támadás részét képezik. +reportReasonPii = Ezek a fájlok személyesen azonosítható információkat tartalmaznak rólam. +reportReasonAbuse = Ezek a fájlok illegális vagy visszaélésszerű tartalmúak. +reportReasonCopyright = A szerzői jogok vagy védjegyek megsértésének jelentéséhez használja az ezen az oldalon írt folyamatot. +reportedTitle = Fájlok jelentve +reportedDescription = Köszönjük. Megkaptuk a jelentését ezekről a fájlokról. diff --git a/public/locales/hus/send.ftl b/public/locales/hus/send.ftl new file mode 100644 index 000000000..619dc05d6 --- /dev/null +++ b/public/locales/hus/send.ftl @@ -0,0 +1,152 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Ka olna' max jant'oj yab u t'ojnal alwa' +importingFile = k'wajat i chiyál... +encryptingFile = K'wajat i tsinat dheyál... +decryptingFile = K'wajat i exal ki wila'... +downloadCount = + { $num -> + *[other] 1 pa'badh { $num } pa'badh + } +timespanHours = + { $num -> + *[other] 1 hora { $num } hora + } +copiedUrl = Letsbadh... +unlockInputPlaceholder = Tsinat japixtal +unlockButtonLabel = Ka japiy +downloadButtonLabel = Ka pa'ba' +downloadFinish = Tala' pa'iyits +fileSizeProgress = { $partialSize } xi ti { $totalSize } +sendYourFilesLink = Ka eyendha' Send +errorPageHeader = ¡Yab kalej alwa'! +fileTooBig = Tekedh pulik axi a le' ka kadh'ba', kwa'al kin alemna' { $size } +linkExpiredAlt = Yabats u awil ki ela' +notSupportedHeader = Yab u awil ka japiyat k'al axi NAVEGADOR +notSupportedLink = ¿Jale' ti u NAVEGADOR yab in japiyal? +notSupportedOutdatedDetail = Yab u awil ka eyendha' Send kom an NAVEGADOR Firefox biyalits. Ka Pa'ba' axi it. +updateFirefox = Ka itmedha' Firefox +deletePopupCancel = Ka kuba' +deleteButtonHover = Ka pakuw +footerLinkLegal = Axi walkadh ka t'ajan +footerLinkPrivacy = Tsinataláb +footerLinkCookies = Cookies +passwordTryAgain = Yab ja' an tsinat japixtaláb. Ka exa' junil. +javascriptRequired = Send in yejenchal JavaScript +whyJavascript = ¿Jale' Send in yejenchal JavaScript? +enableJavascript = Ka lek'wtsiy JavaScript ani ka exa' junil. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = In puwél an tsinat japixtaláb pel: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Axi tsinat japixtaláb yab u awil ka eyendha' + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Yab k'ibat, a tsinat t'ojlabil u awil ka buk'uw +introDescription = { -send-brand } in t'ajál abal ka buk'uw a t'ojlabil po axé' tsinat abal an atikláb axi tat yab a le' kin tsu'uw yab kin ejtow, aniyej an enlace abal ka pa'ba' an t'ojláb u talél kwetém. Antsan patal axi ka abna' u awil ka buk'uw tsinat ani antsan jayej axi ka buk'uw yab u jilk'onal ets'ey ti ébtsolom (internet). +notifyUploadEncryptDone = A t'ojlabil xo' tsinadhits ani u awilits ka abna' +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ne'ets ka taliy ti { $downloadCount } o ti { $timespan } +timespanMinutes = + { $num -> + *[other] 1 minuto { $num } + } +timespanDays = + { $num -> + *[other] 1 k'icháj { $num } k'ichajchik + } +timespanWeeks = + { $num -> + *[other] 1 semana { $num } i semanachik + } +fileCount = + { $num -> + *[other] 1 t'ojláb { $num } t'ojlabchik + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = In puwél an t'ojláb: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Ka k'ot'biy an enlace abal ka ejtow ka buk'uw a t'ojlabil: +copyLinkButton = ka k'ot'biy an enlace +downloadTitle = Ka pa'ba' an t'ojláb +downloadDescription = Axi t'ojláb aban k'al in tolmixtal an { -send-brand } ani tsinat, aniyej in tsap an enlace u talél kwetém. +trySendDescription = Ka eyendha' { -send-brand } abal ka abna' a t'ojlabil, yab k'ibat ani k'anidh. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] + Expidh u awil ka k'adhba' 1 i t'ojláb + Expidh u awil ka k'adhba' { $count } i t'ojláb. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] + Expidh u awil 1 i t'ojláb. + Expidh u awil { $count } i t'ojláb. + } +expiredTitle = An enlace talíts in tsap. +notSupportedDescription = { -send-brand } yab u t'ojnal al axi navegador. { -send-short-brand } u t'ojnal alwa' k'al an { -firefox } axi it, ani ne'ets ka t'ojon alwa' k'al an it navegadorchik. +downloadFirefox = Ka pa'ba' { -firefox } +legalTitle = Tin kwentaj an "Tsinaxtaláb a k'al" { -send-short-brand } +legalDateStamp = Versión 1.0 ani t'ajadh ti Marzo 12 ti tamub 2019. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } k'icháj { $hours } hora { $minutes } minuto +addFilesButton = Ka takuy an t'ojláb axi ne'ets ka k'adhba' +uploadButton = Ka k'adhba' +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ka kina' a t'ojlabil ani ka walka' te' +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o ka t'aja' an clic abal ka abna' ma { $size } +addPassword = Ka k'aniy k'al jún i tsinat japixtaláb +emailPlaceholder = Ka punuw a abnax dhuchlab Correo Electrónico. +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kit otsits abal ka ejtow ka abna' ma { $size } +signInOnlyButton = Kit otsits +accountBenefitTitle = Ka ts'ejka' jún a it k'al (cuenta) { -firefox } o kit otsits max a kwa'alits jún. +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ka buk'uw a t'ojlabil, ma { $size } +accountBenefitDownloadCount = Ka buk'uw a t'ojlabil k'al pil i atiklabchik +accountBenefitTimeLimit = + { $count -> + *[other] + Ka ko'oy an enlace ma 1 a k'icháj + Ka ko'oy an enlacechik ma { $count } a k'icháhchik + } +accountBenefitSync = Ka ejtow tit t'ojnal k'al t'ojlabil al jawakitsk'ij tum eyendhabnél +accountBenefitMoz = Ka exla' jant'oj ti pidhál { -mozilla } +signOut = Kit kalej +okButton = Ka bats'uw +downloadingTitle = K'wajat ti pa'íl +noStreamsWarning = Walám axi navegador yab ne'ets kin ejtow kin japiy jún i t'ojláb tekedh pulik. +noStreamsOptionCopy = Ka k'ot'biy an enlace abal ka japiy al pil i navegador +noStreamsOptionFirefox = Ka eyendha' i navegador +noStreamsOptionDownload = yab kit kalej al axi navegador +downloadFirefoxPromo = An it { -firefox } ti pidhál { -send-short-brand } +# the next line after the colon contains a file name +shareLinkDescription = Ka abna' an enlace al an eyendhanél: +shareLinkButton = Ka abna' an enlace +# $name is the name of the file +shareMessage = Ka pa'ba' “{ $name }” k'al { -send-brand }: ka abna' a t'ojlabil, yab k'ibat ani k'anidh +trailheadPromo = U awil ka k'aniy axi tat a k'al. Kit tamkun k'al Firefox. +learnMore = Ka ajiy más. diff --git a/public/locales/hy-AM/send.ftl b/public/locales/hy-AM/send.ftl new file mode 100644 index 000000000..2a91dbfe4 --- /dev/null +++ b/public/locales/hy-AM/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Արձագանք +importingFile = Ներմուծում... +encryptingFile = Գաղտնագրում… +decryptingFile = Վերծանում… +downloadCount = + { $num -> + [one] 1 ներբեռնում + *[other] { $num } ներբեռնումներ + } +timespanHours = + { $num -> + [one] 1 ժամ + *[other] { $num } ժամ + } +copiedUrl = Պատճենված +unlockInputPlaceholder = Գաղտնաբառ +unlockButtonLabel = Ապակողպել +downloadButtonLabel = Ներբեռնել +downloadFinish = Ներբեռնումն ավարտված է +fileSizeProgress = ({ $partialSize }-ը { $totalSize })-ից +sendYourFilesLink = Փորձել Send-ը +errorPageHeader = Ինչ-որ բան այն չէ +fileTooBig = Այդ ֆայլը չափազանց մեծ է վերբեռնելու համար: Այն պետք է լինի ավելի քիչ, քան { $size }-ը +linkExpiredAlt = Հղումն ավարտված է +notSupportedHeader = Ձեր զննարկիչը չի աջակցվում: +notSupportedLink = Ինչու իմ զննարկիչը չի աջակցվում: +notSupportedOutdatedDetail = Դժբախտաբար, Firefox- ի այս տարբերակը չի աջակցում այն վեբ տեխնոլոգիան, որը պետք է Send-ի համար: Դուք պետք է թարմացնեք ձեր զննարկիչը: +updateFirefox = Թարմացնել Firefox-ը +deletePopupCancel = Չեղարկել +deleteButtonHover = Ջնջել +footerLinkLegal = Իրավական +footerLinkPrivacy = Գաղտնիություն +footerLinkCookies = Cookie-ներ +passwordTryAgain = Սխալ գաղտնաբառ. Կրկին փորձեք: +javascriptRequired = Send-ը պահանջում է JavaScript +whyJavascript = Ինչո՞ւ է Send-ը պահանջում JavaScript. +enableJavascript = Խնդրում ենք միացնել JavaScript-ը և կրկին փորձել: +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ժ { $minutes }ր +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ր +# A short status message shown when the user enters a long password +maxPasswordLength = Գանղտնաբառի առավելագույն չափ. { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Այս գաղտնաբառը հնարավոր չէ սահմանել + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Ուղարկել +-firefox = Firefox +-mozilla = Mozilla +introTitle = Պարզ, մասնավոր ֆայլերի փոխանակում +introDescription = { -send-brand }-ը թույլ է տալիս փոխանակել ֆայլեր ծայրից ծայր գաղտնագրման միջոցով և այնպիսի հղում, որն ինքնաբերաբար ավարտվում է: Այսպիսով, դուք կարող եք վերահսկել այն, ինչով կիսվում եք և համոզված լինեք, որ ձեր նյութերը հավերժ չեն մնա առցանց: +notifyUploadEncryptDone = Ձեր ֆայլը գաղտնագրված է և պատրաստ է ուղարկել +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ավարտվելու է { $downloadCount }-ից կամ { $timespan }-ից +timespanMinutes = + { $num -> + [one] 1 րոպե + *[other] { $num } րոպե + } +timespanDays = + { $num -> + [one] 1 օր + *[other] { $num } օր + } +timespanWeeks = + { $num -> + [one] 1 շաբաթ + *[other] { $num } շաբաթ + } +fileCount = + { $num -> + [one] 1 ֆայլ + *[other] { $num } ֆայլեր + } +# byte abbreviation +bytes = Բ +# kibibyte abbreviation +kb = ԿԲ +# mebibyte abbreviation +mb = ՄԲ +# gibibyte abbreviation +gb = ԳԲ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ընդհանուր չափ՝ { $size } +# the next line after the colon contains a file name +copyLinkDescription = Պատճենեք հղումը՝ ֆայլը համօգտագործելու համար. +copyLinkButton = Պատճենել հղումը +downloadTitle = Ներբեռնել ֆայլերը +downloadDescription = Հայլը համօգտագործվել է { -send-brand }-ի միջոցով ՝ ծայրից ծայր գաղտնագրմամբ և ինքնաբերաբար ավարտվող հղմամբ: +trySendDescription = Փորձեք { -send-brand }-ը՝ ֆայլերի պարզ և անվտանգ փոխանակման համար: +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Միաժամանակ միայն 1 ֆայլ կարող է վերբեռնվել: + *[other] Միաժամանակ միայն { $count } ֆայլեր կարող են վերբեռնվել: + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Միայն 1 արխիվ է թույլատրված: + *[other] Միայն { $count } արխիվներ են թույլատրված: + } +expiredTitle = Այս հղումն ավարտված է: +notSupportedDescription = { -send-brand }-ը չի աշխատի այս զննարկչի հետ: { -send-short-brand }-ը լավագույն կերպով աշխատում է { -firefox }-ի վերջին տարբերակի հետ և կաշխատի զննարկիչների մեծամասնության վերջին տարբերակների հետ: +downloadFirefox = Ներբեռնել { -firefox }-ը +legalTitle = { -send-short-brand }-ի Գաղտնիության ծանուցում +legalDateStamp = Տարբերակ 1.0, թվագրված՝ 2019 թ. մարտի 12-ով +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }օր { $hours }ժ { $minutes }ր +addFilesButton = Ընտրեք ֆայլեր՝ վերբեռնելու համար +uploadButton = Վերբեռնել +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Քաշեք և գցեք ֆայլերը +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = կամ կտտացրեք`ուղարկելու համար մինչև { $size } +addPassword = Պաշտպանեք գաղտնաբառով +emailPlaceholder = Մուտքագրեք ձեր էլ. փոստը +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Մուտք գործեք՝ { $size } ուղարկելու համար +signInOnlyButton = Մուտք գործել +accountBenefitTitle = Ստեղծեք { -firefox } հաշիվ կամ մուտք գործեք +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Կիսվեք մինչև { $size } ֆայլերով +accountBenefitDownloadCount = Կիսվեք ֆայլերով ավելի շատ մարդկանց հետ +accountBenefitTimeLimit = + { $count -> + [one] Հղումներն ակտիվ պահել մինչև 1 օր + *[other] Հղումներն ակտիվ պահել մինչև { $count } օր + } +accountBenefitSync = Կառավարեք համօգտագործվող ֆայլերը ցանկացած սարքից +accountBenefitMoz = Իմացեք { -mozilla }-ի այլ ծառայությունների մասին +signOut = Դուրս գրվել +okButton = Լավ +downloadingTitle = Ներբեռնվում է +noStreamsWarning = Այս զննարկիչը չի կարողանա վերծանել այսպիսի մեծ ֆայլը +noStreamsOptionCopy = Պատճենեք հղումը`այլ զննարկիչում բացելու համար +noStreamsOptionFirefox = Փորձեք մեր սիրած զննարկիչը +noStreamsOptionDownload = Շարունակեք այս զննարկիչով +downloadFirefoxPromo = { -send-short-brand }-ը ձեզ է առաջարկում ամբողջովին նոր { -firefox }: +# the next line after the colon contains a file name +shareLinkDescription = Կիսվեք ձեր ֆայլի հղումով. +shareLinkButton = Համօգտագործել հղումը +# $name is the name of the file +shareMessage = Ներբեռնեք “{ $name }”-ը { -send-brand }-ով ՝ պարզ և ապահով՝ ֆայլերի համօգտագործում +trailheadPromo = Ձեր գաղտնիությունը պաշտպանելու միջոց կա: Միացեք Firefox- ին: +learnMore = Իմանալ ավելին diff --git a/public/locales/ia/send.ftl b/public/locales/ia/send.ftl index c26f0bd90..d8ef63d87 100644 --- a/public/locales/ia/send.ftl +++ b/public/locales/ia/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = un experimento web -siteFeedback = Reaction -uploadPageHeader = Compartimento de files private e cryptate -uploadPageExplainer = Invia files per un ligamine secur, private e cryptate que automaticamente expira pro assecurar que tu datos non resta in linea per sempre. -uploadPageLearnMore = Saper plus -uploadPageDropMessage = Depone ci tu file pro comenciar a lo cargar -uploadPageSizeMessage = Pro evitar problemas, mantene tu file sub 1GB -uploadPageBrowseButton = Elige un file sur tu computator -uploadPageBrowseButton1 = Elige un file a cargar -uploadPageMultipleFilesAlert = Le cargamento de plure files o de un plica actualmente non es supportate. -uploadPageBrowseButtonTitle = Cargar le file -uploadingPageProgress = Cargamento de { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importation… -verifyingFile = Verifica… encryptingFile = Cryptation... decryptingFile = Decryptation… -notifyUploadDone = Cargamento terminate -uploadingPageMessage = Post cargate tu file, tu potera definir le optiones de expiration. -uploadingPageCancel = Cancellar le cargamento -uploadCancelNotification = Cargamento cancellate. -uploadingPageLargeFileMessage = Iste file es grande e pote prender multe tempore pro le cargamento. Patientia! -uploadingFileNotification = Notificar me quando le cargamento es complete. -uploadSuccessConfirmHeader = Preste a inviar -uploadSvgAlt = Cargamento -uploadSuccessTimingHeader = Le ligamine a tu file expirara post un discargamento o in 24 horas. -expireInfo = Le ligamine a tu file expirara post { $downloadCount } o { $timespan } -downloadCount = { $num -> - [one] discargamento - *[other] discargamentos +downloadCount = + { $num -> + [one] { $num } discargamento + *[other] { $num } discargamentos } -timespanHours = { $num -> - [one] hora - *[other] horas +timespanHours = + { $num -> + [one] { $num } hora + *[other] { $num } horas } -copyUrlFormLabelWithName = Copia e comparti le ligamine pro inviar tu file: { $filename } -copyUrlFormButton = Copiar al area de transferentia copiedUrl = Copiate! -deleteFileButton = Deler le file -sendAnotherFileLink = Inviar un altere file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Discargar -downloadsFileList = Discargamentos -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tempore -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Discargar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Insere le contrasigno unlockInputPlaceholder = Contrasigno unlockButtonLabel = Disblocar -downloadFileTitle = Discargar le file cryptate -// Firefox Send is a brand name and should not be localized. -downloadMessage = Tu amico te invia un file per Firefox Send, un servicio que te permitte de compartir files per un ligamine secur, private e cryptate, que expira automaticamente pro te assecurar que tu datos non resta online per sempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Discargar -downloadNotification = Tu discargamento es completate. downloadFinish = Discargamento completate -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Proba Firefox Send -downloadingPageProgress = Discargamento de { $filename } ({ $size }) -downloadingPageMessage = Per favor lassa iste scheda aperte durante que nos prende tu file e lo decifra. -errorAltText = Error de cargamento. +sendYourFilesLink = Proba Send errorPageHeader = Un error occurreva! -errorPageMessage = Un error occurreva durante le cargamento del file. -errorPageLink = Inviar un altere file -fileTooBig = Iste file es troppo grande pro lo cargar. Illo debe ser inferior a { $size }. +fileTooBig = Iste file es troppo grande pro incargar. Illo debe esser inferior a { $size }. linkExpiredAlt = Ligamine expirate -expiredPageHeader = Iste ligamine expirava o illo non existeva jammais! notSupportedHeader = Tu navigator non es supportate -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Infelicemente iste navigator non supporta le nove technologias web que move Firefox Send. Tu besonia de probar un altere navigator. Nos recommenda Firefox! -notSupportedLink = Perque iste navigator non es supportate? -notSupportedOutdatedDetail = Infelicemente iste version de Firefox non supporta le nove technologias web que move Firefox Send. Tu besonia de actualisar tu navigator. +notSupportedLink = Proque non es mi navigator supportate? +notSupportedOutdatedDetail = Infelicemente iste version de Firefox non supporta le nove technologia web que actiona Send. Tu debe actualisar tu navigator. updateFirefox = Actualisar Firefox -downloadFirefoxButtonSub = Discargamento gratuite -uploadedFile = File -copyFileList = Copiar le URL -// expiryFileList is used as a column header -expiryFileList = Expira in -deleteFileList = Deler -nevermindButton = No, gratias -legalHeader = Terminos & confidentialitate -legalNoticeTestPilot = Firefox Send es actualmente un Experimento pilota, e subjecte a Terminos de servicio e Notitia de confidentialitate de Experimento pilota. Tu pote saper plus re iste experimento e su recolta de datos hic. -legalNoticeMozilla = Le uso del sito web de Firefox Send es anque subjecte a Notitia de confidentialitate de sito web e Terminos de servicio sito web. -deletePopupText = Deler iste file? -deletePopupYes = deletePopupCancel = Cancellar deleteButtonHover = Deler -copyUrlHover = Copiar le URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Re Test Pilot footerLinkPrivacy = Confidentialitate -footerLinkTerms = Terminos footerLinkCookies = Cookies -requirePasswordCheckbox = Requirer un contrasigno pro discargar iste file -addPasswordButton = Adder contrasigno -changePasswordButton = Cambiar passwordTryAgain = Contrasigno incorrecte. Retenta. -// This label is followed by the password needed to download a file -passwordResult = Contrasigno: { $password } -reportIPInfringement = Reportar un violation de proprietate intellectual -javascriptRequired = Firefox Send require JavaScript -whyJavascript = Proque Firefox Send require JavaScript? +javascriptRequired = Send require JavaScript +whyJavascript = Proque Send require JavaScript? enableJavascript = Por favor activa JavaScript e tenta novemente. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maxime longor del contrasigno: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Iste contrasigno non ha potite esser establite + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Comparti file in maniera confidential +introDescription = { -send-brand } te pone in grado de compartir files con cryptographia bilateral e un ligamine que automaticamente expira. Assi que tu pote mantener private lo que tu comparti e liberar te del anxietate que tu problema resta online per sempre. +notifyUploadEncryptDone = Tu file es cryptate e preste pro esser inviate +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira post { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuta + *[other] { $num } minutas + } +timespanDays = + { $num -> + [one] 1 die + *[other] { $num } dies + } +timespanWeeks = + { $num -> + [one] 1 septimana + *[other] { $num } septimanas + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } files + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Dimension total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copia le ligamine pro compartir le file: +copyLinkButton = Copiar ligamine +downloadTitle = Discargar files +downloadDescription = Iste file era compartite via { -send-brand } con cryptographia bilateral e un ligamine que expira automaticamente. +trySendDescription = Prova { -send-brand } pro le compartimento de file simple e secur. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Solmente 1 file pote ser incargate al vice. + *[other] Solmente { $count } files pote esser incargate al vice. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Solo 1 archivo es permittite. + *[other] Solo { $count } archivos es permitter. + } +expiredTitle = Iste ligamine ha expirate. +notSupportedDescription = { -send-brand } non functionara con iste navigator. { -send-short-brand } functiona melio con le ultime version de { -firefox }, e functionara con le version actual de plure navigatores. +downloadFirefox = Discargar { -firefox } +legalTitle = Aviso de confidentialitate de { -send-short-brand } +legalDateStamp = Version 1.0 del 12 martio 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selige le files a incargar +trustWarningMessage = Verifica que tu te fide a tu destinatario quando tu comparti datos sensibile. +uploadButton = Incargar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Traher e deponer files +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o cliccar pro inviar usque { $size } +addPassword = Proteger per contrasigno +emailPlaceholder = Insere tu adresse de e-mail +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Aperi session pro inviar usque a { $size } +signInOnlyButton = Aperir session +accountBenefitTitle = Crea un conto { -firefox } o registra te +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Comparti files usque { $size } +accountBenefitDownloadCount = Comparti files con plus de personas +accountBenefitTimeLimit = + { $count -> + [one] Retene active le ligamine pro 1 die + *[other] Retene active le ligamine pro { $count } dies + } +accountBenefitSync = Gere files compartite ab non importa qual apparato +accountBenefitMoz = Discoperi altere servicios de { -mozilla } +signOut = Clauder session +okButton = OK +downloadingTitle = Discargamento +noStreamsWarning = Es possibile que iste navigator non pote decryptar un file de iste proportiones. +noStreamsOptionCopy = Copiar le ligamine e aperir lo in un altere navigator +noStreamsOptionFirefox = Prova nostre navigator favorite +noStreamsOptionDownload = Continuar con iste navigator +downloadFirefoxPromo = { -send-short-brand } es portate a te per le novissime { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Condivide le ligamine a tu file: +shareLinkButton = Condivide ligamine +# $name is the name of the file +shareMessage = Discarga “{ $name }” con { -send-brand }: condivide files in modo simple e secur +trailheadPromo = Il ha un via pro proteger tu confidentialitate. Junge te a Firefox! +learnMore = Saper plus. +downloadFlagged = Iste ligamine ha essite disactivate per violation del terminos de servicio. +downloadConfirmTitle = Un altere cosa +downloadConfirmDescription = Verifica que tu te fide al persona qui te inviava iste file, perque nos non pote verificar que illo non violara tu apparato. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Io me fide al persona qui inviava iste file + *[other] Io me fide al persona qui inviava iste files + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] reportar iste file como suspecte + *[other] reportar iste files como suspecte + } +reportDescription = Adjuta nos a comprender lo que eveni. Que pensa tu es problematic con iste files? +reportUnknownDescription = Va al URL del ligamine que tu desira signalar e clicca “{ reportFile }”. +reportButton = Reportar +reportReasonMalware = Iste files contine malware o es parte de un attacco fraudulente. +reportReasonPii = Iste files contine informationes personal identificabile re me. +reportReasonAbuse = Iste files contine contento illegal o abusive. +reportReasonCopyright = Pro signalar violation de derectos de autor o marca de fabrica, usa le procedura describite a iste pagina. +reportedTitle = Files reportate +reportedDescription = Gratias. Nos ha recipite tu reporto sur iste files. diff --git a/public/locales/id/send.ftl b/public/locales/id/send.ftl index 1190bc63e..740bc35f1 100644 --- a/public/locales/id/send.ftl +++ b/public/locales/id/send.ftl @@ -1,100 +1,174 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = eksperimen web -siteFeedback = Saran -uploadPageHeader = Pribadi, Berbagi Berkas Terenskripsi -uploadPageExplainer = Kirim berkas melalui tautan yang aman, pribadi, dan terenkripsi yang secara otomatis kedaluwarsa untuk memastikan berkas Anda tidak daring selamanya. -uploadPageLearnMore = Pelajari lebih lanjut -uploadPageDropMessage = Lepas berkas Anda di sini untuk mulai mengunggah -uploadPageSizeMessage = Untuk pengoperasian yang paling andal, sebaiknya jaga berkas Anda di bawah 1GB -uploadPageBrowseButton = Pilih berkas pada komputer Anda -uploadPageBrowseButton1 = Pilih berkas untuk diunggah - .title = Pilih berkas untuk diunggah -uploadPageMultipleFilesAlert = Saat ini belum mendukung pengunggahan beberapa berkas atau folder. -uploadPageBrowseButtonTitle = Unggah berkas -uploadingPageProgress = Mengunggah { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Mengimpor… -verifyingFile = Memverifikasi… encryptingFile = Mengenkripsi... decryptingFile = Mendekripsi... -notifyUploadDone = Unggahan Anda telah selesai. -uploadingPageMessage = Setelah berkas diunggah, Anda dapat mengatur pilihan kedaluwarsa. -uploadingPageCancel = Batal unggah -uploadCancelNotification = Unggahan Anda dibatalkan. -uploadingPageLargeFileMessage = Berkas ini berukuran besar dan mungkin perlu beberapa saat untuk mengunggahnya. Silakan tunggu! -uploadingFileNotification = Beri tahu saya ketika unggahan telah selesai. -uploadSuccessConfirmHeader = Siap untuk Dikirim -uploadSvgAlt = Unggah -uploadSuccessTimingHeader = Tautan ke berkas Anda akan berakhir setelah 1 unduhan atau dalam 24 jam. -expireInfo = Tautan ke berkas Anda akan kedaluwarsa setelah { $downloadCount } atau { $timespan }. -downloadCount = { $num -> - *[other] { $number } unduhan +downloadCount = + { $num -> + *[other] { $num } unduhan } -timespanHours = { $num -> - *[other] { $number } jam +timespanHours = + { $num -> + *[other] { $num } jam } -copyUrlFormLabelWithName = Salin dan bagikan tautan untuk mengirim berkas Anda: { $filename } -copyUrlFormButton = Salin ke papan klip copiedUrl = Tersalin! -deleteFileButton = Hapus berkas -sendAnotherFileLink = Kirim berkas lain -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Unduh -downloadFileName = Unduh { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Masukkan Sandi unlockInputPlaceholder = Sandi unlockButtonLabel = Buka -downloadFileTitle = Unduh Berkas Terenkripsi -// Firefox Send is a brand name and should not be localized. -downloadMessage = Teman Anda mengirimkan berkas dengan Firefox Send, layanan yang memungkinkan Anda berbagi berkas dengan tautan yang aman, pribadi, dan terenkripsi yang secara otomatis berakhir untuk memastikan berkas Anda tidak daring selamanya. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Unduh -downloadNotification = Unduhan Anda telah selesai. downloadFinish = Unduhan Selesai -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } dari { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Coba Firefox Send -downloadingPageProgress = Mengunduh { $filename } ({ $size }) -downloadingPageMessage = Sila biarkan tab ini terbuka sementara kami memproses berkas Anda dan mendekripsinya. -errorAltText = Unggahan bermasalah +sendYourFilesLink = Coba Send errorPageHeader = Terjadi kesalahan! -errorPageMessage = Terjadi kesalahan saat mengunggah berkas. -errorPageLink = Kirim berkas lain fileTooBig = Berkas terlalu besar untuk diunggah. Harus kurang dari { $size }. linkExpiredAlt = Tautan kedaluwarsa -expiredPageHeader = Tautan ini telah kedaluwarsa atau tidak pernah ada! notSupportedHeader = Peramban Anda tidak mendukung. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Sayangnya peramban ini tidak mendukung teknologi web yang menggerakkan Firefox Send. Anda perlu mencoba peramban lain. Kami merekomendasikan Firefox! notSupportedLink = Mengapa peramban saya tidak didukung? -notSupportedOutdatedDetail = Sayangnya Firefox versi ini tidak mendukung teknologi web yang menggerakkan Firefox Send. Anda perlu memperbarui peramban Anda. +notSupportedOutdatedDetail = Sayangnya Firefox versi ini tidak mendukung teknologi web yang menggerakkan Send. Anda perlu memperbarui peramban Anda. updateFirefox = Perbarui Firefox -downloadFirefoxButtonSub = Unduh Gratis -uploadedFile = Berkas -copyFileList = Salin URL -// expiryFileList is used as a column header -expiryFileList = Kedaluwarsa Pada -deleteFileList = Hapus -nevermindButton = Abaikan -legalHeader = Syarat & Privasi -legalNoticeTestPilot = Saat ini Firefox Send merupakan eksperimen Test Pilot, dan merupakan subyek dari Ketentuan Layanan dan Pemberitahuan Privasi Test Pilot. Anda dapat mempelajari lebih lanjut tentang eksperimen ini dan pengumpulan datanya di sini. -legalNoticeMozilla = Penggunaan situs Firefox Send juga merupakan subyek dari Pemberitahuan Privasi Situs Web dan Persyaratan Penggunaan Situs Web Mozilla. -deletePopupText = Hapus berkas ini? -deletePopupYes = Ya deletePopupCancel = Batal deleteButtonHover = Hapus -copyUrlHover = Salin URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Tentang Test Pilot footerLinkPrivacy = Privasi -footerLinkTerms = Ketentuan footerLinkCookies = Kuki -requirePasswordCheckbox = Membutuhkan sandi untuk mengunduh berkas ini -addPasswordButton = Tambahkan Sandi passwordTryAgain = Sandi salah. Silakan coba lagi. -// This label is followed by the password needed to download a file -passwordResult = Sandi: { $password } -reportIPInfringement = Laporkan Pelanggaran IP +javascriptRequired = Send membutuhkan JavaScript. +whyJavascript = Mengapa Send membutuhkan JavaScript? +enableJavascript = Silakan aktifkan JavaScript dan coba lagi. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }j { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Panjang sandi maksimal: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Tidak bisa menyetel sandi ini + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Berbagi berkas dengan mudah dan privat +introDescription = { -send-brand } mudahkan Anda membagikan berkas dengan enkripsi ujung-ke-ujung dan tautan yang otomatis kadaluarsa. Sehingga Anda dapat menjaga apa yang Anda bagikan secara privat dan memastikan barang Anda tidak selamanya ada di daring. +notifyUploadEncryptDone = Berkas Anda terenkripsi dan siap untuk dikirim +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Berakhir setelah { $downloadCount } atau { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } menit + } +timespanDays = + { $num -> + *[other] { $num } hari + } +timespanWeeks = + { $num -> + *[other] { $num } pekan + } +fileCount = + { $num -> + *[other] { $num } berkas + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total ukuran: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Salin tautan untuk membagikan berkas Anda: +copyLinkButton = Salin tautan +downloadTitle = Unduh berkas +downloadDescription = Berkas ini dibagikan lewat { -send-brand } dengan enkripsi ujung-ke-ujung dan tautan yang otomatis kadaluarsa. +trySendDescription = Coba { -send-brand } untuk berbagi berkas dengan mudah dan aman. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] Hanya { $count } berkas dapat diunggah dalam sekali waktu. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] Hanya { $count } arsip diperbolehkan. + } +expiredTitle = Tautan ini telah kadaluarsa. +notSupportedDescription = { -send-brand } tidak dapat digunakan dengan peramban ini. { -send-short-brand } bekerja maksimal dengan versi terbaru { -firefox }, dan akan bekerja dengan versi terkini mayoritas peramban. +downloadFirefox = Unduh { -firefox } +legalTitle = Pemberitahuan Privasi { -send-short-brand } +legalDateStamp = Versi 1.0, tertanggal 12 Maret 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }h { $hours }j { $minutes }m +addFilesButton = Pilih berkas untuk diunggah +trustWarningMessage = Pastikan Anda mempercayai penerima Anda saat berbagi data sensitif. +uploadButton = Unggah +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Seret dan jatuhkan berkas +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = atau klik untuk mengirim hingga { $size } +addPassword = Lindungi dengan kata sandi +emailPlaceholder = Masukkan surel Anda +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Masuk untuk dapat mengirim hingga { $size } +signInOnlyButton = Masuk +accountBenefitTitle = Buat { -firefox } Account atau masuk +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bagikan berkas hingga { $size } +accountBenefitDownloadCount = Bagikan berkas kepada lebih banyak orang +accountBenefitTimeLimit = + { $count -> + *[other] Buat tautan aktif selama { $count } hari + } +accountBenefitSync = Kelola berkas yang dibagikan dari perangkat apa pun +accountBenefitMoz = Pelajari tentang layanan { -mozilla } lainnya +signOut = Keluar +okButton = Oke +downloadingTitle = Mengunduh +noStreamsWarning = Peramban ini mungkin tidak dapat mendekripsi berkas sebesar ini. +noStreamsOptionCopy = Salin tautan untuk dibuka di peramban lainnya +noStreamsOptionFirefox = Coba peramban favorit kami +noStreamsOptionDownload = Lanjutkan dengan peramban ini +downloadFirefoxPromo = { -send-short-brand } dipersembahkan untuk Anda oleh { -firefox } terbaru. +# the next line after the colon contains a file name +shareLinkDescription = Bagikan tautan ke berkas Anda: +shareLinkButton = Bagikan tautan +# $name is the name of the file +shareMessage = Unduh "{ $name }" dengan { -send-brand }: berbagi berkas dengan sederhana dan aman +trailheadPromo = Ada cara untuk melindungi privasi Anda. Bergabunglah dengan Firefox. +learnMore = Pelajari lebih lanjut. +downloadFlagged = Tautan ini telah dinonaktifkan karena melanggar persyaratan layanan. +downloadConfirmTitle = Satu hal lagi +downloadConfirmDescription = Pastikan Anda memercayai orang yang mengirimi Anda file ini karena kami tidak dapat memverifikasi bahwa hal itu tidak akan merusak perangkat Anda. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] Saya percaya orang yang mengirim file-file ini + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] Laporkan file-file ini karena mencurigakan + } +reportDescription = Bantu kami memahami apa yang sedang terjadi. Apa yang menurut Anda salah dengan file-file ini? +reportUnknownDescription = Buka url tautan yang ingin Anda laporkan dan klik “{ reportFile }”. +reportButton = Melaporkan +reportReasonMalware = File-file ini mengandung malware atau merupakan bagian dari serangan phishing. +reportReasonPii = File-file ini mengandung informasi pribadi tentang saya. +reportReasonAbuse = File-file ini mengandung konten ilegal atau kasar. +reportReasonCopyright = Untuk melaporkan pelanggaran hak cipta atau merek dagang, gunakan proses yang dijelaskan di laman ini . +reportedTitle = File Dilaporkan +reportedDescription = Terima kasih. Kami telah menerima laporan Anda tentang file-file ini. diff --git a/public/locales/ig/send.ftl b/public/locales/ig/send.ftl new file mode 100644 index 000000000..01ff15637 --- /dev/null +++ b/public/locales/ig/send.ftl @@ -0,0 +1,93 @@ +# Send is a brand name and should not be localized. +title = Firefox Zipu +importingFile = Mbubata… +encryptingFile = ezoro ezo... +decryptingFile = Kpebie +downloadCount = + { $num -> + [one] ụbọchị { $num } + *[other] Abuọ + } +timespanHours = + { $num -> + [one] { $num } otu + *[other] { $num } abụọ + } +copiedUrl = edepụtachaghiri +unlockInputPlaceholder = okwuntughe +unlockButtonLabel = imeghe +downloadButtonLabel = budata +downloadFinish = Mbudata zuru ezu +fileSizeProgress = ({ $partialSize } nke { $totalSize }) +sendYourFilesLink = Firefox Zipu +errorPageHeader = Onwere ihe na-adighi mma +fileTooBig = Failu a ebuka ibulite. Ọ kwẹsịghi ịkalị { $size } +linkExpiredAlt = Njiko jedebe +notSupportedHeader = Adighi akwado ihe nchogharị gị +notSupportedLink = Gịnị kpatara na akwadoghị ihe nchọgharị m? +notSupportedOutdatedDetail = Ọ dị nwute na ụdị Firefox a anaghị akwado teknụzụ weebụ na-eji Firefox Zipụ. Ikwesiri imelite ihe nchọgharị gị. +updateFirefox = Melite Firefox +deletePopupCancel = Kagbuo +deleteButtonHover = Hichapụ +footerLinkLegal = n'Iwu +footerLinkPrivacy = nzuzo +footerLinkCookies = Kuki ga +passwordTryAgain = okwuntughe ezighi ezi.Nwaa ọzọ +javascriptRequired = Firefox Zipu chọrọ +whyJavascript = Kedu ihe kpatara Send jiri chọ JavaScript? +enableJavascript = Biko họrọ JavaScript ma nwaa ọzọ +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Oke okwuntughe kachasị: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Enweghị ike ịtọ paswọọdụ a + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Zipu, Ziga +-firefox = Firefox +-mozilla = Mozilla +introTitle = Mfe, nkekọrịta faịlụ nkeonwe +introDescription = na-ahapu gị ịkekọrịta faịlụ na izo ya na njedebe na njedebe na-akwụsị na akpaghị aka. Yabụ ị nwere ike idobe ihe ị na -eche ma hụ na ngwongwo gị agaghị adị n'ịntanetị ruo mgbe ebighi ebi. +notifyUploadEncryptDone = Failu gi zoro ezo ma di njikere iziga +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ọ ga-agwu mgbe { $downloadCount } ma ọ bụ { $timespan } gasịrị +timespanDays = + { $num -> + [one] 1 ụbọchị + *[other] ụbọchị { $num } + } +timespanWeeks = + { $num -> + [one] 1 izu + *[other] izu { $num } + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $Number } { $nkeji } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = { $nha } +# the next line after the colon contains a file name +copyLinkDescription = Detuo njikọ ahụ iji kee faịlụ gị +copyLinkButton = Detuo njikọ +downloadTitle = Budata faịlụ gasi +downloadDescription = Nkekọrịta faịlụ a site na site na iji zoo njedebe na-njedebe yana otu njikọ na-akwụsị na-akpaghị aka. +trySendDescription = Gbalịa maka nyefe faịlụ dị mfe. +expiredTitle = Njikọ a emebiela. +notSupportedDescription = agaghị eji ihe nchọgharị a rụọ ọrụ. na arụ ọrụ kacha mma na ụdị nke , ọ ga-arụkwa ụdị nke ihe nchọgharị ka ugbu a. +downloadFirefox = Budata +legalTitle = Nkwupụta Nzuzo +legalDateStamp = 1.dị 1.0, akara ụbọchị Maachi 12, 2019 +okButton = O diff --git a/public/locales/it/send.ftl b/public/locales/it/send.ftl index 0cf927e10..ac227c2dd 100644 --- a/public/locales/it/send.ftl +++ b/public/locales/it/send.ftl @@ -1,115 +1,177 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = un esperimento web -siteFeedback = Feedback -uploadPageHeader = Condivisione di file riservata e crittata -uploadPageExplainer = Invia file in modo sicuro, riservato e crittato, con un link che scade automaticamente per garantire che i tuoi dati non rimangano online per sempre. -uploadPageLearnMore = Ulteriori informazioni -uploadPageDropMessage = Trascina qui un file per caricarlo -uploadPageSizeMessage = Per evitare problemi è consigliabile caricare file di dimensione inferiore a 1 GB -uploadPageBrowseButton = Seleziona un file sul computer -uploadPageBrowseButton1 = Seleziona un file da caricare -uploadPageMultipleFilesAlert = Il caricamento di più file o cartelle non è attualmente supportato. -uploadPageBrowseButtonTitle = Carica file -uploadingPageProgress = Caricamento { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importazione in corso… -verifyingFile = Verifica in corso… encryptingFile = Crittazione in corso… decryptingFile = Decrittazione in corso… -notifyUploadDone = Caricamento completato. -uploadingPageMessage = È possibile impostare le opzioni di scadenza del file al termine del caricamento. -uploadingPageCancel = Annulla caricamento -uploadCancelNotification = Caricamento annullato. -uploadingPageLargeFileMessage = Si tratta di un file di grandi dimensioni e potrebbe richiedere un po' di tempo. -uploadingFileNotification = Invia una notifica quando il caricamento è completato. -uploadSuccessConfirmHeader = Pronto per l’invio -uploadSvgAlt = Carica -uploadSuccessTimingHeader = Il link al file scadrà dopo 1 download o in 24 ore. -expireInfo = Il link a questo file scadrà dopo { $downloadCount } o { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 download *[other] { $num } download } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 ora *[other] { $num } ore } -copyUrlFormLabelWithName = Copia e condividi il link per inviare il tuo file: { $filename } -copyUrlFormButton = Copia negli appunti copiedUrl = Copiato -deleteFileButton = Elimina file -sendAnotherFileLink = Invia un altro file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Scarica -downloadsFileList = Download -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Scadenza -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Scarica { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Inserire la password unlockInputPlaceholder = Password unlockButtonLabel = Sblocca -downloadFileTitle = Scarica il file crittato -// Firefox Send is a brand name and should not be localized. -downloadMessage = Qualcuno ha utilizzato Firefox Send per inviarti un file. Si tratta di un servizio che permette di condividere file in modo sicuro, riservato e crittato, utilizzando un link che smette di funzionare automaticamente dopo un certo periodo di tempo, garantendo così che i tuoi dati non rimangano online per sempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Scarica -downloadNotification = Download completato. downloadFinish = Download completato -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } di { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prova Firefox Send -downloadingPageProgress = Download in corso di { $filename } ({ $size }) -downloadingPageMessage = Mantieni aperta questa scheda mentre il file viene scaricato e decrittato. -errorAltText = Errore durante il caricamento +sendYourFilesLink = Prova Send errorPageHeader = Si è verificato un errore. -errorPageMessage = Si è verificato un errore durante il caricamento del file. -errorPageLink = Invia un altro file fileTooBig = Le dimensioni di questo file sono eccessive. Dovrebbe essere inferiore a { $size }. linkExpiredAlt = Link scaduto -expiredPageHeader = Questo link è scaduto oppure non è mai esistito. notSupportedHeader = Il browser in uso non è supportato. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Purtroppo questo browser non supporta le tecnologie web alla base di Firefox Send. Devi utilizzare un altro browser. Ti consigliamo Firefox! notSupportedLink = Perché questo browser non risulta supportato? -notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Firefox Send. È necessario aggiornare il browser. +notSupportedOutdatedDetail = Purtroppo questa versione di Firefox non supporta le tecnologie web alla base di Send. È necessario aggiornare il browser. updateFirefox = Aggiorna Firefox -downloadFirefoxButtonSub = Download gratuito -uploadedFile = File -copyFileList = Copia indirizzo -// expiryFileList is used as a column header -expiryFileList = Scade in -deleteFileList = Elimina -nevermindButton = No, grazie -legalHeader = Termini di utilizzo e privacy -legalNoticeTestPilot = Firefox Send è attualmente un esperimento di Test Pilot ed è soggetto alle Condizioni di utilizzo e all’Informativa sulla privacy di Test Pilot. Per ulteriori informazioni su questo esperimento e i dati raccolti, consulta questa pagina. -legalNoticeMozilla = L’utilizzo del sito di Firefox Send è soggetto all’Informativa sulla privacy e le Condizioni di utilizzo dei siti web Mozilla. -deletePopupText = Eliminare questo file? -deletePopupYes = Sì deletePopupCancel = Annulla deleteButtonHover = Elimina -copyUrlHover = Copia indirizzo footerLinkLegal = Note legali -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Informazioni su Test Pilot footerLinkPrivacy = Privacy -footerLinkTerms = Condizioni di utilizzo footerLinkCookies = Cookie -requirePasswordCheckbox = Richiedi una password per poter scaricare questo file -addPasswordButton = Aggiungi password -changePasswordButton = Modifica passwordTryAgain = Password errata, riprovare. -// This label is followed by the password needed to download a file -passwordResult = Password: { $password } -reportIPInfringement = Segnala violazione della proprietà intellettuale -javascriptRequired = Firefox Send richiede JavaScript -whyJavascript = Perché Firefox Send richiede JavaScript? +javascriptRequired = Send richiede JavaScript +whyJavascript = Perché Send richiede JavaScript? enableJavascript = Attiva JavaScript e riprova. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Lunghezza massima della password: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Impossibile impostare la password + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Condividi file in modo semplice e riservato +introDescription = { -send-brand } permette di condividere file con crittografia end-to-end attraverso un link che scade automaticamente. In questo modo hai la garanzia che i tuoi contenuti vengano condivisi in modo riservato e non rimangano online per sempre. +notifyUploadEncryptDone = Il file è crittato e pronto per l’invio +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Scade dopo { $downloadCount } o tra { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minuti + } +timespanDays = + { $num -> + [one] 1 giorno + *[other] { $num } giorni + } +timespanWeeks = + { $num -> + [one] 1 settimana + *[other] { $num } settimane + } +fileCount = { $num } file +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Dimensione totale: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copia il link per condividere il file: +copyLinkButton = Copia link +downloadTitle = Scarica file +downloadDescription = Questo file è stato condiviso tramite { -send-brand } con crittografia end-to-end e un link che scade automaticamente. +trySendDescription = Prova { -send-brand } per condividere file in modo semplice e sicuro. +# count will always be > 10 +tooManyFiles = È possibile caricare solo { $count } file alla volta. +# count will always be > 10 +tooManyArchives = + { $count -> + [one] È consentito solo un archivio. + *[other] Sono consentiti solo { $count } archivi. + } +expiredTitle = Questo link è scaduto. +notSupportedDescription = Non è possibile utilizzare { -send-brand } con questo browser. { -send-short-brand } funziona al meglio con l’ultima versione di { -firefox } ma è compatibile con l’ultima versione della maggior parte dei browser. +downloadFirefox = Scarica { -firefox } +legalTitle = Informativa sulla privacy di { -send-short-brand } +legalDateStamp = Versione 1.0 del 12 marzo 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }g { $hours }h { $minutes }m +addFilesButton = Seleziona i file da caricare +trustWarningMessage = Assicurati che il destinatario sia affidabile quando condividi dati sensibili. +uploadButton = Carica +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Trascina e rilascia i file +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o fai clic per inviare fino a { $size } +addPassword = Proteggi con una password +emailPlaceholder = Inserisci il tuo indirizzo email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Accedi per inviare fino a { $size } +signInOnlyButton = Accedi +accountBenefitTitle = Crea un account { -firefox } o accedi +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Condividi file fino a { $size } +accountBenefitDownloadCount = Condividi file con più persone +accountBenefitTimeLimit = + { $count -> + [one] Mantieni link attivi per 1 giorno + *[other] Mantieni link attivi per { $count } giorni + } +accountBenefitSync = Gestisci i file condivisi da qualsiasi dispositivo +accountBenefitMoz = Scopri altri servizi { -mozilla } +signOut = Disconnetti +okButton = OK +downloadingTitle = Download in corso… +noStreamsWarning = Questo browser potrebbe non essere in grado di decrittare un file così grande. +noStreamsOptionCopy = Copia il link e aprilo in un altro browser +noStreamsOptionFirefox = Prova il nostro browser preferito +noStreamsOptionDownload = Continua con questo browser +downloadFirefoxPromo = { -send-short-brand } è offerto dal nuovissimo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Condividi il link al tuo file: +shareLinkButton = Condividi link +# $name is the name of the file +shareMessage = Scarica “{ $name }” con { -send-brand }: condivisione di file semplice e sicura +trailheadPromo = C’è un modo per proteggere la tua privacy. Entra in Firefox. +learnMore = Ulteriori informazioni. +downloadFlagged = Questo link è stato disattivato perché vìola i termini di servizio. +downloadConfirmTitle = Un’ultima cosa +downloadConfirmDescription = Assicurati che la persona che ti ha inviato questo file sia affidabile perché non possiamo garantire che non sia in grado di danneggiare il tuo dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Considero affidabile la persona che ha inviato questo file + *[other] Considero affidabile la persona che ha inviato questi file + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Segnala questo file come sospetto + *[other] Segnala questi file come sospetti + } +reportDescription = Aiutaci a capire che cosa è successo. Qual è il problema con questi file? +reportUnknownDescription = Vai all’indirizzo del link che vuoi segnalare e fai clic su “{ reportFile }”. +reportButton = Segnala +reportReasonMalware = Questi file contengono malware o fanno parte di un attacco phishing. +reportReasonPii = Questi file contengono informazioni personali identificabili che mi riguardano. +reportReasonAbuse = Questi file contengono contenuti illegali o offensivi. +reportReasonCopyright = Per segnalare violazioni del copyright o abusi di marchi registrati, utilizzare la procedura descritta in questa pagina. +reportedTitle = File segnalati +reportedDescription = Grazie, abbiamo ricevuto la tua segnalazione relativa a questi file. diff --git a/public/locales/ixl/send.ftl b/public/locales/ixl/send.ftl new file mode 100644 index 000000000..0c8b006f9 --- /dev/null +++ b/public/locales/ixl/send.ftl @@ -0,0 +1,58 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Aq'a yol sti' +importingFile = Eq'otzan +encryptingFile = La muj isik'lele +decryptingFile = Ni jaj ve't isik'lele' +downloadCount = + { $num -> + [one] Eq'omal ku'tzan + *[other] { $num } Eq'omalaj ku'tzan + } +timespanHours = + { $num -> + [one] 1 Ch'ich' + *[other] { $num } Nimalaj ch'ich' + } +copiedUrl = Eesamal ivatz! +unlockInputPlaceholder = Kach'ub'al +unlockButtonLabel = Eesa ikach'ub'al +downloadButtonLabel = Eq'o ku'tzan +downloadFinish = Eq'o ku'tzan kaajayil +fileSizeProgress = ({ $partialSize }tetz{ $totalSize }) +sendYourFilesLink = B'anb'e ve't u Send +errorPageHeader = At ma'l kam valexh kat eli! +notSupportedHeader = U chukb'al aq'one' ye' ni toleb'e'. +notSupportedLink = Kam q'ii uve' ye' kuxh ni toleb' u chukb'al vaq'one'? +updateFirefox = Tz'ajsa tatine' Firefox +deletePopupCancel = Ya'samal +deleteButtonHover = Sojsa +footerLinkPrivacy = Tetz kuxhtu' +footerLinkCookies = Cookies +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Aq'b'en +-firefox = Firefox +-mozilla = Mozilla +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +emailPlaceholder = Aq'ku' a correo +shareLinkButton = La jatxb'en u vaa' +learnMore = Ootzi ka'te. diff --git a/public/locales/ja/send.ftl b/public/locales/ja/send.ftl index 1a0c7874b..bb61fb302 100644 --- a/public/locales/ja/send.ftl +++ b/public/locales/ja/send.ftl @@ -1,113 +1,174 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = ウェブ実験 -siteFeedback = フィードバック -uploadPageHeader = プライベートな暗号化されたファイル共有 -uploadPageExplainer = 安全で、プライベートで、暗号化されたリンクを通じてファイルを送信。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。 -uploadPageLearnMore = 詳しくはこちら -uploadPageDropMessage = ここにファイルをドロップしてアップロードを開始 -uploadPageSizeMessage = 確実に処理できるよう、ファイルサイズは 1 GB 以下にすることを推奨します。 -uploadPageBrowseButton = コンピューター上のファイルを選択 -uploadPageBrowseButton1 = アップロードするファイルを選択 -uploadPageMultipleFilesAlert = 今のところ複数ファイルやフォルダーのアップロードには対応していません。 -uploadPageBrowseButtonTitle = ファイルをアップロード -uploadingPageProgress = { $filename } ({ $size }) をアップロード中 +# Send is a brand name and should not be localized. +title = Send importingFile = インポート中... -verifyingFile = 検証中... encryptingFile = 暗号化中... decryptingFile = 復号化中... -notifyUploadDone = アップロードが完了しました。 -uploadingPageMessage = ファイルのアップロード完了後に期限を設定できます。 -uploadingPageCancel = アップロードを中止 -uploadCancelNotification = アップロードは中止されました。 -uploadingPageLargeFileMessage = このファイルは大きいのでアップロードに多少時間が掛かるかもしれません。しばらくお待ちください。 -uploadingFileNotification = アップロード完了時に通知を受け取る -uploadSuccessConfirmHeader = 送信準備完了 -uploadSvgAlt = アップロード -uploadSuccessTimingHeader = ファイルへのリンクは、1 回ダウンロードされた後、もしくは 24 時間以内に期限切れとなります。 -expireInfo = このファイルへのリンクは { $downloadCount } あるいは { $timespan } 後に期限切れとなります。 -downloadCount = { $num -> +downloadCount = + { $num -> *[other] { $num } 回のダウンロード } -timespanHours = { $num -> +timespanHours = + { $num -> *[other] { $num } 時間 } -copyUrlFormLabelWithName = ファイルを送信するにはこのリンクをコピー、共有してください: { $filename } -copyUrlFormButton = クリップボードへコピー copiedUrl = コピー完了! -deleteFileButton = ファイルを削除 -sendAnotherFileLink = 他のファイルを送信 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = ダウンロード -downloadsFileList = ダウンロード -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = 時間 -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } をダウンロード -downloadFileSize = ({ $size }) -unlockInputLabel = パスワードを入力 unlockInputPlaceholder = パスワード unlockButtonLabel = ロック解除 -downloadFileTitle = 暗号化されたファイルをダウンロード -// Firefox Send is a brand name and should not be localized. -downloadMessage = あなたの友人が Firefox Send を通じてファイルを送ってきています。これは、安全で、プライベートで、暗号化されたリンクを通じてファイルを共有できるサービスです。あなたのものがずっとオンラインに残らないよう、リンクは自動的に期限切れとなります。 -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = ダウンロード -downloadNotification = ダウンロードが完了しました。 downloadFinish = ダウンロード完了 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send を試す -downloadingPageProgress = { $filename } ({ $size }) をダウンロードしています -downloadingPageMessage = ファイルの取得と復号化が完了するまでこのタブを開いたままにしておいてください。 -errorAltText = アップロードエラー +sendYourFilesLink = Send を試す errorPageHeader = 何か問題が発生しました。 -errorPageMessage = ファイルのアップロード中に問題が発生しました。 -errorPageLink = 他のファイルを送信 fileTooBig = このファイルは大きすぎるためアップロードできません。上限は { $size } です。 linkExpiredAlt = リンク期限切れ -expiredPageHeader = このリンクは期限切れとなったか元々存在していません。 notSupportedHeader = お使いのブラウザーには対応していません。 -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 残念ながらお使いのブラウザーは Firefox Send が活用しているウェブ技術に対応していません。他のブラウザーで試してください。私たちは Firefox をお勧めします! -notSupportedLink = なぜ私のブラウザには対応していないのでしょうか? -notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Firefox Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。 +notSupportedLink = なぜ私のブラウザーには対応していないのでしょうか? +notSupportedOutdatedDetail = 残念ながらお使いのバージョンの Firefox は Send が活用しているウェブ技術に対応していません。ブラウザーを更新する必要があります。 updateFirefox = Firefox を更新 -downloadFirefoxButtonSub = 無料ダウンロード -uploadedFile = ファイル -copyFileList = URL をコピー -// expiryFileList is used as a column header -expiryFileList = 有効期限: -deleteFileList = 削除 -nevermindButton = 気にしないでください -legalHeader = 利用規約とプライバシー -legalNoticeTestPilot = Firefox Send は今のところ Test Pilot 実験のひとつであり、Test Pilot 利用規約プライバシー通知 が適用されます。この実験とそのデータ収集に関する詳細は こちら をご覧ください。 -legalNoticeMozilla = Firefox Send のサイトの利用には、Mozilla の ウェブサイトプライバシー通知ウェブサイト利用規約 も適用されます。 -deletePopupText = このファイルを削除しますか? -deletePopupYes = はい deletePopupCancel = キャンセル deleteButtonHover = 削除 -copyUrlHover = URL をコピー footerLinkLegal = 法的情報 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot について footerLinkPrivacy = プライバシー -footerLinkTerms = 利用規約 footerLinkCookies = Cookie -requirePasswordCheckbox = このファイルをダウンロードするにはパスワードが必要です -addPasswordButton = パスワードを追加 -changePasswordButton = 変更 passwordTryAgain = パスワードが正しくありません。再度入力してください。 -// This label is followed by the password needed to download a file -passwordResult = パスワード: { $password } -reportIPInfringement = 知的財産侵害報告 -javascriptRequired = Firefox Send を使うには JavaScript が必要です -whyJavascript = Firefox Send が JavaScript を必要とする理由 +javascriptRequired = Send を使うには JavaScript が必要です +whyJavascript = Send が JavaScript を必要とする理由 enableJavascript = JavaScript を有効にして再度試してください。 -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } 時間 { $minutes } 分 -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } 分 +# A short status message shown when the user enters a long password +maxPasswordLength = パスワード最長文字数: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = このパスワードは設定できませんでした + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 簡単に、プライベートにファイル共有 +introDescription = { -send-brand } では、暗号化してファイル共有でき、リンクは自動的に期限切れになります。そのため、共有するものをプライベートに保管でき、オンライン上に永遠に残さないようにできます。 +notifyUploadEncryptDone = ファイルが暗号化され、送信する準備ができました +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = 有効期間: { $downloadCount } または { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } 分 + } +timespanDays = + { $num -> + *[other] { $num } 日 + } +timespanWeeks = + { $num -> + *[other] { $num } 週間 + } +fileCount = + { $num -> + *[other] { $num } ファイル + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 合計サイズ: { $size } +# the next line after the colon contains a file name +copyLinkDescription = リンクをコピーしてファイルを共有: +copyLinkButton = リンクをコピー +downloadTitle = ファイルをダウンロード +downloadDescription = このファイルは { -send-brand } により、暗号化されて共有されました。リンクは自動的に期限切れになります。 +trySendDescription = 簡単で安全なファイル共有ができる { -send-brand } を試してください。 +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] 一度にアップロードできるのは { $count } ファイルまでです。 + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] { $count } 回までしかダウンロードできません。 + } +expiredTitle = このリンクは期限切れです。 +notSupportedDescription = { -send-brand } は、このブラウザーでは動作しません。{ -send-short-brand } は最新バージョンの { -firefox } で最もよく動作し、その他の現バージョンのブラウザーでも動作します。 +downloadFirefox = { -firefox } をダウンロード +legalTitle = { -send-short-brand } プライバシー通知 +legalDateStamp = バージョン 1.0, 2019年3月12日時点 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } 日 { $hours } 時 { $minutes } 分 +addFilesButton = アップロードするファイルを選択 +trustWarningMessage = 機密データを共有する場合は、受信者が信頼できる相手であることを確認してください。 +uploadButton = アップロード +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ファイルをドラッグ&ドロップ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = または、クリックして最大 { $size } のファイルを送信 +addPassword = パスワードで保護 +emailPlaceholder = メールアドレスを入力 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = ログインすると最大 { $size } のファイルを送信できます +signInOnlyButton = ログイン +accountBenefitTitle = { -firefox } アカウントを作成またはログイン +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = 最大 { $size } までのファイルを共有 +accountBenefitDownloadCount = より多くの人とファイルを共有 +accountBenefitTimeLimit = + { $count -> + *[other] リンクを { $count } 日間有効化 + } +accountBenefitSync = 様々な端末から共有したファイルを管理 +accountBenefitMoz = { -mozilla } の他のサービスについて詳しく学ぶ +signOut = ログアウト +okButton = OK +downloadingTitle = ダウンロード中 +noStreamsWarning = このブラウザーは、この大きさのファイルを復号化できません。 +noStreamsOptionCopy = リンクをコピーして他のブラウザーで開いてください +noStreamsOptionFirefox = Firefox を試してみる +noStreamsOptionDownload = このブラウザーで続ける +downloadFirefoxPromo = { -send-short-brand } はすべてが新しくなった { -firefox } により提供されています。 +# the next line after the colon contains a file name +shareLinkDescription = ファイルへのリンクを共有しましょう: +shareLinkButton = リンクを共有 +# $name is the name of the file +shareMessage = { -send-brand } で "{ $name }" をダウンロード: シンプルで安全なファイル共有 +trailheadPromo = プライバシーを保護する方法があります。Firefox を試してください。 +learnMore = 詳細情報 +downloadFlagged = サービス利用規約に違反しているため、このリンクは無効になっています。 +downloadConfirmTitle = さらにもう一つ +downloadConfirmDescription = このファイルが端末に悪影響を及ぼさないことを確かめられないため、送信者が信頼できる相手であることを確認してください。 +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] ファイルの送信者を信頼します + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] 疑わしいファイルとして報告する + } +reportDescription = 詳しく調べるためにお知らせください。これらのファイルの何が問題だと思われますか? +reportUnknownDescription = 報告したい内容のリンクの URL にアクセスし、“{ reportFile }” をクリックしてください。 +reportButton = 問題を報告 +reportReasonMalware = これらのファイルにはマルウェアが含まれているか、フィッシング詐欺攻撃の一部です。 +reportReasonPii = これらのファイルには私に関する個人情報が含まれています。 +reportReasonAbuse = これらのファイルには違法または虐待的なコンテンツが含まれています。 +reportReasonCopyright = 著作権または商標の侵害を報告するには、このページ に記載された手続きに従ってください。 +reportedTitle = ファイルを報告しました +reportedDescription = ご協力ありがとうございました。これらのファイルに関する報告を受け取りました。 diff --git a/public/locales/ka/send.ftl b/public/locales/ka/send.ftl index e63691a93..c8f422eac 100644 --- a/public/locales/ka/send.ftl +++ b/public/locales/ka/send.ftl @@ -1,113 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = საცდელი -siteFeedback = გამოხმაურება -uploadPageHeader = ფაილების უსაფრთხო, დაშიფრული გაზიარება -uploadPageExplainer = გააგზავნეთ ფაილები უსაფრთხოდ, დაფარულად და დაშიფრულად ბმულის საშუალებით, წინასწარ განსაზღვრული ვადით, რაც საწინდარია იმის, რომ თქვენი კუთვნილი მასალა, არ დარჩება ინტერნეტში სამუდამოდ. -uploadPageLearnMore = ვრცლად -uploadPageDropMessage = გადმოიტანეთ ფაილი აქ, ასატვირთად -uploadPageSizeMessage = ყველაზე საიმედო მომსახურება, შეგიძლიათ ატვირთოთ არაუმეტეს 1GB ზომის ფაილი -uploadPageBrowseButton = ფაილის არჩევა კომპიუტერიდან -uploadPageBrowseButton1 = ფაილის არჩევა ასატვირთად -uploadPageMultipleFilesAlert = ერთდროულად რამდენიმე ფაილის, ან საქაღალდის ატვირთვა, ამჟამად არაა ხელმისაწვდომი. -uploadPageBrowseButtonTitle = ფაილის ატვირთვა -uploadingPageProgress = მიმდინარეობს ატვირთვა { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = გადმოტანა... -verifyingFile = დამოწმება... encryptingFile = დაშიფვრა... decryptingFile = გაშიფვრა... -notifyUploadDone = ფაილის ატვირთვა დასრულებულია. -uploadingPageMessage = ფაილის ატვირთვის შემდეგ, შეგიძლიათ მიუთითოთ შენახვის ვადა. -uploadingPageCancel = ატვირთვის გაუქმება -uploadCancelNotification = ფაილის ატვირთვა გაუქმებულია. -uploadingPageLargeFileMessage = ფაილი დიდია და ატვირთვამ შესაძლოა დიდხანს გასტანოს. ასე რომ, მოკალათდით! -uploadingFileNotification = შეტყობინება, ატვირთვის დასრულებისას. -uploadSuccessConfirmHeader = მზადაა გასაგზავნად -uploadSvgAlt = ატვირთვა -uploadSuccessTimingHeader = ფაილს ვადა გაუვა 1 ჩამოტვირთვის, ან 24 საათის მერე. -expireInfo = ფაილის ბმულს, ვადა გაუვა { $downloadCount }, ან { $timespan } მერე. -downloadCount = { $num -> +downloadCount = + { $num -> + [one] 1 ჩამოტვირთვა *[other] { $num } ჩამოტვირთვა } -timespanHours = { $num -> +timespanHours = + { $num -> + [one] 1 საათი *[other] { $num } საათი } -copyUrlFormLabelWithName = დააკოპირეთ და გააზიარეთ ბმული, ფაილის გასაგზავნად: { $filename } -copyUrlFormButton = დაკოპირება -copiedUrl = დაკოპირდა! -deleteFileButton = ფაილის წაშლა -sendAnotherFileLink = სხვა ფაილის გაგზავნა -// Alternative text used on the download link/button (indicates an action). -downloadAltText = ჩამოტვირთვა -downloadsFileList = ჩამოტვირთვები -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = დრო -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } ჩამოტვირთვა -downloadFileSize = ({ $size }) -unlockInputLabel = შეიყვანეთ პაროლი +copiedUrl = ასლი აღებულია! unlockInputPlaceholder = პაროლი unlockButtonLabel = გახსნა -downloadFileTitle = დაშიფრული ფაილის ჩამოტვირთვა -// Firefox Send is a brand name and should not be localized. -downloadMessage = თქვენი მეგობარი გიგზავნით ფაილს Firefox Send მომსახურების მეშვეობით, რომლითაც შეგიძლიათ ფაილების უსაფრთხოდ, დაფარულად და დაშიფრულად გაზიარება ბმულის საშუალებით, წინასწარ განსაზღვრული ვადით, რაც საწინდარია იმის, რომ თქვენი კუთვნილი მასალა, არ დარჩება ინტერნეტში სამუდამოდ. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = ჩამოტვირთვა -downloadNotification = თქვენი ჩამოტვირთვა დასრულებულია. downloadFinish = ჩამოტვირთვა დასრულდა -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } { $totalSize }-იდან) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = გამოცადეთ Firefox Send -downloadingPageProgress = მიმდინარეობს ჩამოტვირთვა { $filename } ({ $size }) -downloadingPageMessage = გთხოვთ დატოვოთ ეს ჩანართი გახსნილი, სანამ ფაილი ჩამოიტვირთება და გაიშიფრება. -errorAltText = შეცდომა ატვირთვისას +sendYourFilesLink = გამოცადეთ Send errorPageHeader = რაღაც ხარვეზია! -errorPageMessage = ფაილის ატვირთვისას წარმოიშვა შეცდომა. -errorPageLink = სხვა ფაილის გაგზავნა fileTooBig = ფაილი ზედმეტად დიდია. უნდა იყოს { $size } ზომაზე ნაკლები. linkExpiredAlt = ბმული ვადაგასულია -expiredPageHeader = ბმული ან ვადაგასულია, ან არ არსებობს! notSupportedHeader = თქვენი ბრაუზერი არაა მხარდაჭერილი. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = სამწუხაროდ, ამ ბრაუზერს არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ სხვა ბრაუზერი. ჩვენ შეგვიძლია გირჩიოთ Firefox! notSupportedLink = რატომ არაა ჩემი ბრაუზერი მხარდაჭერილი? -notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Firefox Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება. +notSupportedOutdatedDetail = სამწუხაროდ, Firefox-ის ამ ვერსიას არ გააჩნია ის ტექნოლოგია, რომელიც აუცილებელია Send-ის მუშაობისთვის. გესაჭიროებათ, ბრაუზერის განახლება. updateFirefox = Firefox-ის განახლება -downloadFirefoxButtonSub = უფასო ჩამოტვირთვა -uploadedFile = ფაილი -copyFileList = URL ბმულის დაკოპირება -// expiryFileList is used as a column header -expiryFileList = ვადის გასვლის დრო -deleteFileList = წაშლა -nevermindButton = არ აქვს მნიშვნელობა -legalHeader = პირობები და პირადულობა -legalNoticeTestPilot = Firefox Send ამჟამად Test Pilot-ის საცდელი პროექტია და ექვემდებარება Test Pilot-ის მომსახურების პირობებსა და პირადი მონაცემების დაცვის დებულებას. ვრცლად, ამ საცდელი პროექტისა და მონაცემების აღრიცხვის შესახებ, შეგიძლიათ იხილოთ აქ. -legalNoticeMozilla = Firefox Send ვებსაიტი, ასევე ექვემდებარება Mozilla-ს ვებსაიტების პირადი მონაცემების შესახებ დებულებას და ვებსაიტების გამოყენების პირობებს. -deletePopupText = გსურთ ამ ფაილის წაშლა? -deletePopupYes = დიახ deletePopupCancel = გაუქმება deleteButtonHover = წაშლა -copyUrlHover = URL-ს დაკოპირება -footerLinkLegal = იურიდიული ინფორმაცია -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot-ის შესახებ +footerLinkLegal = სამართლებრივი საკითხები footerLinkPrivacy = პირადულობა -footerLinkTerms = პირობები footerLinkCookies = ფუნთუშები -requirePasswordCheckbox = პაროლის მოთხოვნა, ფაილის ჩამოტვირთვისას -addPasswordButton = პაროლის დამატება -changePasswordButton = შეცვლა passwordTryAgain = პაროლი არასწორია. სცადეთ ხელახლა. -// This label is followed by the password needed to download a file -passwordResult = პაროლი: { $password } -reportIPInfringement = მოხსენება დარღვევაზე -javascriptRequired = Firefox Send საჭიროებს JavaScript-ს -whyJavascript = რატომ საჭიროებს Firefox Send JavaScript-ს? +javascriptRequired = Send საჭიროებს JavaScript-ს +whyJavascript = რატომ საჭიროებს Send JavaScript-ს? enableJavascript = გთხოვთ ჩართოთ JavaScript და სცადოთ ხელახლა. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }სთ { $minutes }წთ -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }წთ +# A short status message shown when the user enters a long password +maxPasswordLength = პაროლის დაშვებული ზომა: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ამ პაროლის დაყენება ვერ ხერხდება + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = ფაილის გაზიარება მარტივად, დაცულად +introDescription = { -send-brand } საშუალებას გაძლევთ გააზიაროთ ფაილები გამჭოლი დაშიფვრითა და ბმულით, რომელიც გარკვეული დროის შემდეგ თავისთავად გაუქმდება. ასე რომ, რასაც გააზიარებთ იქნება საიდუმლო და არც ინტერნეტში არ დარჩება სამუდამოდ. +notifyUploadEncryptDone = თქვენი ფაილი დაშიფრულია და მზადაა გასაგზავნად +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = ვადის გასვლამდე დარჩენილია { $downloadCount } ან { $timespan } +timespanMinutes = + { $num -> + [one] 1 წუთი + *[other] { $num } წუთი + } +timespanDays = + { $num -> + [one] 1 დღე + *[other] { $num } დღე + } +timespanWeeks = + { $num -> + [one] 1 კვირა + *[other] { $num } კვირა + } +fileCount = + { $num -> + [one] 1 ფაილი + *[other] { $num } ფაილი + } +# byte abbreviation +bytes = ბ +# kibibyte abbreviation +kb = კბ +# mebibyte abbreviation +mb = მბ +# gibibyte abbreviation +gb = გბ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = სულ ზომა: { $size } +# the next line after the colon contains a file name +copyLinkDescription = ბმულის ასლი ფაილის გასაზიარებლად: +copyLinkButton = ბმულის ასლი +downloadTitle = ფაილების ჩამოტვირთვა +downloadDescription = ფაილი გაზიარებულია { -send-brand }-ის საშუალებით, გამჭოლი დაშიფვრითა და ვადიანი ბმულით. +trySendDescription = გამოსცადეთ { -send-brand }, ფაილების გაზიარება მარტივად, დაცულად. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] მხოლოდ 1 ფაილი შეიძლება აიტვირთოს ერთ ჯერზე. + *[other] მხოლოდ { $count } ფაილი შეიძლება აიტვირთოს ერთ ჯერზე. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] მხოლოდ 1 არქივია დაშვებული. + *[other] მხოლოდ { $count } არქივია დაშვებული. + } +expiredTitle = ბმული ვადაგასულია. +notSupportedDescription = { -send-brand } არ იმუშავებს ამ ბრაუზერთან. { -send-short-brand } საუკეთესოდ მუშაობს ახალ { -firefox }-ზე და აგრეთვე უმეტესი ბრაუზერების უახლეს ვერსიებზე. +downloadFirefox = ჩამოტვირთეთ { -firefox } +legalTitle = { -send-short-brand } პირადულობის განაცხადი +legalDateStamp = ვერსია 1.0, დათარიღებული 12 მარტით, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } დღე { $hours } სთ { $minutes } წთ +addFilesButton = ფაილების შერჩევა ასატვირთად +trustWarningMessage = დარწმუნდით, რომ ენდობით მიმღებს, სანამ მნიშვნელოვან მონაცემებს გაუზიარებთ. +uploadButton = ატვირთვა +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = გადმოიტანეთ და მოათავსეთ ფაილები +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ან დაწკაპეთ გასაგზავნად { $size }-მდე +addPassword = პაროლით დაცვა +emailPlaceholder = შეიყვანეთ ელფოსტა +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = შედით ანგარიშზე, რომ გაგზავნოთ { $size }-მდე +signInOnlyButton = შესვლა +accountBenefitTitle = შექმენით { -firefox }-ანგარიში ან შედით +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = გააზიარეთ ფაილები { $size }-მდე +accountBenefitDownloadCount = გაუზიარეთ ფაილები მეტ ხალხს +accountBenefitTimeLimit = + { $count -> + [one] დატოვეთ ფაილები 1 დღემდე + *[other] დატოვეთ ფაილები { $count } დღემდე + } +accountBenefitSync = მართეთ გაზიარებული ფაილები ნებისმიერი მოწყობილობიდან +accountBenefitMoz = გაეცანით { -mozilla }-ს სხვა მომსახურებებს +signOut = გამოსვლა +okButton = კარგი +downloadingTitle = მიმდინარეობს ჩამოტვირთვა +noStreamsWarning = ამ ბრაუზერმა, შესაძლოა ვერ მოახერხოს ასეთი დიდი ფაილის გაშიფვრა. +noStreamsOptionCopy = ბმულის ასლის აღება სხვა ბრაუზერში გასახსნელად +noStreamsOptionFirefox = სცადეთ ჩვენი რჩეული ბრაუზერი +noStreamsOptionDownload = განაგრძეთ ამ ბრაუზერით +downloadFirefoxPromo = { -send-short-brand }-ს წარმოგიდგინეთ უახლესი { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = ფაილის ბმულის გაზიარება: +shareLinkButton = ბმულის გაზიარება +# $name is the name of the file +shareMessage = ჩამოტვირთეთ „{ $name }“ { -send-brand }-ით: ფაილების გაზიარება მარტივად, უსაფრთხოდ +trailheadPromo = გზა, თქვენი პირადულობის დასაცავად. შემოუერთდით Firefox-ს. +learnMore = იხილეთ ვრცლად. +downloadFlagged = ბმული გაუქმებულია, მომსახურების პირობების დარღვევის გამო. +downloadConfirmTitle = კიდევ ერთი რამ +downloadConfirmDescription = დარწმუნდით, რომ სანდოა პირი, ვინც ეს ფაილი გამოგიგზავნათ, რადგან ჩვენ ვერ დაგპირდებით, რომ არ დააზიანებს თქვენს მოწყობილობას. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] ვენდობი პირს, რომელმაც ეს ფაილი გამომიგზავნა + *[other] ვენდობი პირს, რომელმაც ეს ფაილები გამომიგზავნა + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] მოხსენება, საეჭვო ფაილზე + *[other] მოხსენება, საეჭვო ფაილებზე + } +reportDescription = დაგვეხმარეთ გარკვევაში. თქვენი აზრით, რა ფაილებია? +reportUnknownDescription = გთხოვთ გადახვიდეთ ბმულზე, რომლზეც გსურთ გვაცნობოთ და დაწკაპეთ „{ reportFile }“. +reportButton = მოხსენება +reportReasonMalware = ეს ფაილები შეიცავს მავნე კოდს ან თაღლითური შეტევის ნაწილია. +reportReasonPii = ეს ფაილები შეიცავს ვინაობის ამსახველ მასალას ჩემზე. +reportReasonAbuse = ეს ფაილები შეიცავს უკანონო ან შეურაცხმყოფელ მასალას. +reportReasonCopyright = საავტორო უფლებებთან ან სავაჭრო ნიშნებთან დაკავშირებულ დარღვევებზე მოხსენებისთვის, გთხოვთ იხილოთ განმარტებითი მითითებები ამ გვერდზე. +reportedTitle = ფაილებზე მოხსენება გაგზავნილია +reportedDescription = გმადლობთ. მივიღეთ თქვენი მოხსენება, ამ ფაილებზე. diff --git a/public/locales/kab/send.ftl b/public/locales/kab/send.ftl index 578901fee..dd9af986b 100644 --- a/public/locales/kab/send.ftl +++ b/public/locales/kab/send.ftl @@ -1,101 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Tarmit web -siteFeedback = Tikti -uploadPageHeader = Beṭṭu n ifuyla s uwgelhen akked tbaḍnit -uploadPageExplainer = Azen ifuyla s wudem aɣelsant, s tbaḍnit akked uwgelhen, s useqdec n useɣwen ara yemten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda. -uploadPageLearnMore = Issin ugar -uploadPageDropMessage = Zuɣeṛ afaylu-ik ar dagi akken ad tebduḍ asali -uploadPageSizeMessage = I ugmuḍ ufrin, yelha ad tesqedceḍ ifuyla daw n 1 GAṬ -uploadPageBrowseButton = Fren afaylu sef uselkim-ik -uploadPageBrowseButton1 = Fren afaylu ad tazneḍ -uploadPageMultipleFilesAlert = Asali n ddeqs n ifuyla neɣ ikaramen ur ittusefrak ara yakan. -uploadPageBrowseButtonTitle = Sali ifuyla -uploadingPageProgress = Tuzna n { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Akter... -verifyingFile = Asenqed... encryptingFile = Awgelhen... decryptingFile = Azmek... -notifyUploadDone = Asali n ufaylu yemmed. -uploadingPageMessage = Ticki afaylu-ik yettali, ad tizmired ad ternuḍ iɣewwaṛen n wazen n tagara. -uploadingPageCancel = Sefsex asali -uploadCancelNotification = Asali-ik yefsex. -uploadingPageLargeFileMessage = Afaylu meqqer aṭas ihi yezmer ad yawi ddeqs n wakud. Rǧu ihi! -uploadingFileNotification = Lɣu-yid ticki yemmed usali. -uploadSuccessConfirmHeader = Ihegga i walluy -uploadSvgAlt = Sali -uploadSuccessTimingHeader = Aseɣwen ar ufaylu-ik ad yemmet ticki yuder-d neɣ deffir n 24 n yisragen. -expireInfo = Aseɣwen icudden ar ufaylu-inek ad yemmet send { $downloadCount } naɣ { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 usider *[other] { $num } isidar } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 usrag *[other] { $num } isragen } -copyUrlFormLabelWithName = Nɣel sakin Bḍu aseɣwen akken ad tazneḍ afaylu-ik: { $filename } -copyUrlFormButton = Sers ɣef afus copiedUrl = Yenɣel! -deleteFileButton = Kkes afaylu -sendAnotherFileLink = Azen afaylu-nniḍen -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Sider -downloadFileName = Sider { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Sekcem awal uffir unlockInputPlaceholder = Awal uffir unlockButtonLabel = Serreḥ -downloadFileTitle = Sider afaylu awgelhan -// Firefox Send is a brand name and should not be localized. -downloadMessage = Amdakel-ik yuzen-ak-d afaylu s Firefox Firefox Send, ameẓlu ara yeǧǧen tuzna n ifuyla s wudem aɣelsan, s tbadnit akked uwgelhen s useqdec n useqwen ara yeùten s wudem awurman akken talqut-ik ur tettɣimi ara srid i lebda. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Sider -downloadNotification = Asider-ik yemmed. downloadFinish = Asider yemmed -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } seg { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Ɛreḍ Firefox Send -downloadingPageProgress = Asider n { $filename } ({ $size }) -downloadingPageMessage = Eǧǧ iccer-agi yeldi ticki nettnadi afaylu akken ad newgelhen. -errorAltText = Tuccḍa n tuzna +sendYourFilesLink = Ɛreḍ Send errorPageHeader = Yella wayen yeḍran! -errorPageMessage = Teḍra-d tuccḍa deg usali n ufaylu. -errorPageLink = Azen afaylu-nniḍen -fileTooBig = Afaylu-agi meqqeṛ aṭas. Yessefk ad yili daw n { $size }. +fileTooBig = Afaylu-agi meqqer aṭas. Yessefk ad yili daw n { $size }. linkExpiredAlt = Aseɣwen yemmut -expiredPageHeader = Aseɣwen-agi yemmut neɣ wurǧin yella seg tazwara! notSupportedHeader = Iminig-ik ur ittusefrak ara -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ad nesḥissef imi iminig-ik ur isefrak ara tatiknulujit web iseqdac Firefox Send. Yessefk ad tesqedceḍ iminig-nniḍen. Seqdec Firefox! notSupportedLink = Ayγer iminig inu ur yettwasefrek ara? -notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Firefox Send. Yessefk ad tleqmeḍ iminig-ik. +notSupportedOutdatedDetail = Ad nesḥissef imilqem-agi n Firefox Firefox ur isefrak ara titiknulujiyin web yettwaseqdacen di Send. Yessefk ad tleqmeḍ iminig-ik. updateFirefox = Leqqem Firefox -downloadFirefoxButtonSub = Asider ilelli -uploadedFile = Afaylu -copyFileList = Nɣel URL -// expiryFileList is used as a column header -expiryFileList = Ad ifak di -deleteFileList = Kkes -nevermindButton = Wicqa -legalHeader = Tiwtilin &tabaḍnit -legalNoticeTestPilot = Firefox Send yettwasekyad akka tura am tarmit Test Pilot, ihi ad yili daw n n tewtilin n useqdec n Test Pilot akked Tasertit n tbaḍnit. Tzemreḍ ad teẓreḍ ugar ɣeef tarmit-agi akked ulqaḍ n isefka dagihere. -legalNoticeMozilla = Aseqdec n usmel n Firefox Send yella daw n ilugan tbaḍnit n yismal web n Mozilla akked Tiwtilin n useqdec n yismal Web n Mozilla. -deletePopupText = Kkes afaylu-agi? -deletePopupYes = Ih deletePopupCancel = Sefsex deleteButtonHover = Kkes -copyUrlHover = Nɣel URL. footerLinkLegal = Usḍif -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Ɣef Test Pilot footerLinkPrivacy = Tabaḍnit -footerLinkTerms = Tiwtilin footerLinkCookies = Inagan n tuqqna -requirePasswordCheckbox = YEsra awal uffir akken ad isider afaylu-agi -addPasswordButton = rnu awal uffir passwordTryAgain = Yir awal uffir. Ɛreḍ tikelt nniḍen. -// This label is followed by the password needed to download a file -passwordResult = Awal uffir: { $password } -reportIPInfringement = Neqqes akukel n IP +javascriptRequired = Send yesra JavaScript +whyJavascript = Ayɣer firefox Send yesra JavaScript? +enableJavascript = Ma ulac aɣilif rmed JavaScript sakin ɛreḍ tikkelt nniḍen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }Isragen { $minutes }Tisdatin +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }Tisdatin +# A short status message shown when the user enters a long password +maxPasswordLength = Tuγzi tafellayt n wawal uffir: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Awal-agi uffir ur izmir ara ad ittwabaded + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Afessas, beṭṭu n ifuyla s wudem uslig +introDescription = { -send-brand } ad k·kem-yeǧǧ ad tebḍuḍ ifuyla iwgelhanen si ṭṭerf ɣer ṭṭerf akked useɣwen ara yemmten s wudem awurman. Daɣen, ad tizmireḍ ad tḥerzeḍ ayen i tbeṭṭuḍ s wudem uslig daɣen ad tamneḍ imi agbur-ik·im ur yettɣimi ara i lebda. +notifyUploadEncryptDone = Afaylu-ik yewgelhen daɣen ihegga i tuzna +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ad yemmet deffir { $downloadCount } neɣ { $timespan } +timespanMinutes = + { $num -> + [one] 1 n tsedat + *[other] { $num } n tsedatin + } +timespanDays = + { $num -> + [one] 1 n wass + *[other] { $num } n wussan + } +timespanWeeks = + { $num -> + [one] 1 n dduṛt + *[other] { $num } n ledwaṛ + } +fileCount = + { $num -> + [one] 1 n ufaylu + *[other] { $num } n yifuyla + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KAṬ +# mebibyte abbreviation +mb = MAṬ +# gibibyte abbreviation +gb = GAṬ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tuɣzi s umata: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Nɣel aseɣwen akken ad tebḍuḍ afaylu-inek +copyLinkButton = Nɣel aseɣwen +downloadTitle = Sider ifuyla +downloadDescription = Afaylu-a yettwabḍa s { -send-brand } s uwgelhen s ṭṭerf ɣer ṭṭerf s useɣwen ara yemmten s wudem awurman. +trySendDescription = Ɛreḍ { -send-brand } i beḍḍu afessas n ifuyla s wudem ameɣtu. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ala 1 n ufaylu i yemzren ad yali i tikkelt. + *[other] Ala { $count } n yifuyla i yemzren ad alin i tikkelt. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Ala 1 n teṛcibt i yettwasirgen. + *[other] Ala { $count } n teṛcibin i yettwasiregn. + } +expiredTitle = Immut useɣwen. +notSupportedDescription = { -send-brand } ur iteddu ara s yiminig-a. { -send-short-brand } iteddu akken iwata s lqem aneggaru n { -firefox }, daɣen iteddu s lqem amiran n tuget n yiminigen. +downloadFirefox = Sider { -firefox } +legalTitle = Tasertit tabaḍnit n { -send-short-brand } +legalDateStamp = Lqem 1.0, azemz n 12 Meɣres 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ass { $hours } srg { $minutes } tsd +addFilesButton = Fren ifuyla ad tessaliḍ +trustWarningMessage = Ḍmen d akken tumneḍ anermis ticki tebḍiḍ isefka n tbadnit. +uploadButton = Sali +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ẓuɣer sakin sers ifuyla +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = neɣ sit akken ad tazneḍ arma d { $size } +addPassword = Ḥrez s wawal uffir +emailPlaceholder = Sekcem imayl inek +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Qqen akken ad tazneḍ arma d { $size } +signInOnlyButton = Qqen +accountBenefitTitle = Rnu amiḍan { -firefox } akken ad teqqneḍ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bḍu ifuyla arma d { $size } +accountBenefitDownloadCount = Bḍu ifuyla d wugan n medden +accountBenefitTimeLimit = + { $count -> + [one] Eǧǧ iseɣwan d urmiden arma d 1 n wass + *[other] Eǧǧ iseɣwan d urmiden arma d { $count } n wassan + } +accountBenefitSync = Sefrek ifuyla yebdan seg yal ibenk +accountBenefitMoz = Issin ugar ɣef yimeẓla-nniḍen n { -mozilla } +signOut = Ffeɣ +okButton = IH +downloadingTitle = Azdam +noStreamsWarning = Iminig-a ur yezmir ara ad yezmek afaylu meqqren. +noStreamsOptionCopy = Nɣel aseɣwen i tulya deg yiminig-nniden +noStreamsOptionFirefox = Ɛreḍ iminig-ik ufrin +noStreamsOptionDownload = Kemmel akked iminig-a +downloadFirefoxPromo = { -send-short-brand } yettwasumer i yal { -firefox } amaynut. +# the next line after the colon contains a file name +shareLinkDescription = Bḍu aseɣwen ɣer ufaylu-ik: +shareLinkButton = Bḍu aseɣwen +# $name is the name of the file +shareMessage = Sider "{ $name }" s { -send-brand }: d fessas, d aɣelsan i beṭṭu n yifuyla. +trailheadPromo = Yella wallal n ummesten n tudert-ik tusligt. Ddu ɣer Firefox. +learnMore = Issin ugar. +downloadFlagged = Aseɣwen-a yensa acku ur iquder ara tiwtilin n useqdec. +downloadConfirmTitle = Taɣawsa-nniḍen +downloadConfirmDescription = Ḍmen d akken tumneḍ amdan i ak-d-yuznen afaylu-a acku ur nezmir ara ad nwali ma yella ur iṭuṛṛu ara ibenk-ik. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Umneɣ amdan i yi-d-yuznen afaylu-a. + *[other] Umneɣ amdan i yi-d-yuznen ifuyla-a. + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Mmel-d afaylu-a ma tkukraḍ + *[other] Mmel-d ifuyla-a ma tkukraḍ + } +reportDescription = Mudd-aɣ-d afus n tallalt akken ad negzu acu i la iḍerrun. Acu twalaḍ cwiya-t kan deg yifuyla-a? +reportUnknownDescription = Ttxil-k·m rzu ɣer url n useɣwen i tebɣiḍ ad t-tceggreḍ syen sit ɣef “{ reportFile }”. +reportButton = Aneqqis +reportReasonMalware = Ifuyla-a deg-sen yir iseɣzanen neɣ d aḥric seg uẓdam n ṣṣyada. +reportReasonPii = Ifuyla-a deg-sen talɣut tudmawant yettwassnen i yi-yeɛnan. +reportReasonAbuse = Ifuyla-a deg-sen agbur arusḍif neɣ anaffal. +reportReasonCopyright = I ucegger n tkerḍa n yizerfan n umeskar neɣ n tecraḍ, seqdec asesfer i d-yettwagelmen ɣef usebter-a. +reportedTitle = Ifuyla i d-yettwaceqqren +reportedDescription = Tanemmirt. Nermes-d aneqqis-ik·im ɣef yifuyla-a. diff --git a/public/locales/ko/send.ftl b/public/locales/ko/send.ftl index 5bbcb7597..20e9973f0 100644 --- a/public/locales/ko/send.ftl +++ b/public/locales/ko/send.ftl @@ -1,96 +1,168 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = 웹 실험 -siteFeedback = 사용자 의견 -uploadPageHeader = 개인적이고, 암호화된 파일 공유 -uploadPageExplainer = 안전하고, 개인적이며, 암호화된 링크를 통해 파일을 공유하세요. 사용자의 파일이 더 이상 온라인 상에 남지 않도록 링크는 자동적으로 만료됩니다. -uploadPageLearnMore = 더 알아보기 -uploadPageDropMessage = 파일을 끌어 놓아 업로드 시작 -uploadPageSizeMessage = 확실한 작동을 위해서, 파일의 크기가 1GB보다 작은 것이 좋음 -uploadPageBrowseButton = 컴퓨터의 파일을 선택 -uploadPageBrowseButton1 = 업로드 할 파일 선택 - .title = 업로드 할 파일 선택 -uploadPageMultipleFilesAlert = 여러 개의 파일 또는 폴더를 업로드하는 것은 현재로선 지원되지 않습니다. -uploadPageBrowseButtonTitle = 파일 업로드 -uploadingPageProgress = { $filename } ({ $size }) 업로드 중 +# Send is a brand name and should not be localized. +title = Send importingFile = 가져오는 중… -verifyingFile = 확인하는 중… encryptingFile = 암호화 중… decryptingFile = 복호화 중… -notifyUploadDone = 업로드가 완료되었습니다. -uploadingPageMessage = 파일이 업로드 되고나서 만료 옵션을 설정할 수 있습니다. -uploadingPageCancel = 업로드 취소 -uploadCancelNotification = 업로드가 취소되었습니다. -uploadingPageLargeFileMessage = 이 파일은 크기가 커서 시간이 다소 걸릴 수 있습니다. 잠시만 기다려주세요! -uploadingFileNotification = 업로드가 완료되면 알림을 표시해 주세요. -uploadSuccessConfirmHeader = 보낼 준비 완료 -uploadSvgAlt = 업로드 -uploadSuccessTimingHeader = 이 파일의 링크는 한 번의 다운로드 후 또는 24시간이 지난 뒤에 만료됩니다. -expireInfo = 이 파일의 링크는 { $downloadCount }나 { $timespan } 후에 만료됩니다. -downloadCount = 1 다운로드 -timespanHours = 1 시간 -copyUrlFormLabelWithName = 파일을 보내기 위해 이 링크를 복사하고 공유하세요: { $filename } -copyUrlFormButton = 클립보드에 복사 +downloadCount = 다운로드 { $num }회 +timespanHours = { $num }시간 copiedUrl = 복사 완료! -deleteFileButton = 파일 삭제 -sendAnotherFileLink = 다른 파일 보내기 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = 다운로드 -downloadFileName = { $filename } 다운로드 -downloadFileSize = ({ $size }) -unlockInputLabel = 비밀번호 입력 unlockInputPlaceholder = 비밀번호 unlockButtonLabel = 잠금 해제 -downloadFileTitle = 암호화된 파일 다운로드 -// Firefox Send is a brand name and should not be localized. -downloadMessage = 당신의 친구가 Firefox Send를 통해 파일을 보내고 있습니다. 이 서비스는 안전하고, 개인적이며, 암호화된 링크를 통해 파일을 공유하는 서비스입니다. 사용자의 파일이 더 이상 온라인 상에 남지 않도록 링크는 자동적으로 만료됩니다. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = 다운로드 -downloadNotification = 다운로드가 완료되었습니다. downloadFinish = 다운로드 완료 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send 써보기 -downloadingPageProgress = { $filename } ({ $size }) 다운로드 중 -downloadingPageMessage = 파일을 가져오고 복호화하는 동안 탭을 닫지 말아주세요. -errorAltText = 업로드 오류 +sendYourFilesLink = Send 써보기 errorPageHeader = 오류가 발생했습니다! -errorPageMessage = 파일을 업로드하는 도중 오류가 발생했습니다. -errorPageLink = 다른 파일 보내기 fileTooBig = 파일의 크기가 너무 큽니다. { $size } 보다 작아야 합니다. linkExpiredAlt = 링크가 만료됨 -expiredPageHeader = 이 링크는 만료되었거나 애초부터 존재하지 않았습니다! notSupportedHeader = 이 브라우저는 지원되지 않습니다. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 안타깝게도 이 브라우저는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 다른 브라우저로 다시 시도해주세요. Firefox를 추천합니다! notSupportedLink = 왜 이 브라우저는 지원이 되지 않나요? -notSupportedOutdatedDetail = 안타깝게도 현재 브라우저 버전에서는 Firefox Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다. +notSupportedOutdatedDetail = 안타깝게도 사용중인 Firefox 버전에서는 Send에 사용되는 웹 기술을 지원하지 않습니다. 브라우저 업데이트가 필요합니다. updateFirefox = Firefox 업데이트 -downloadFirefoxButtonSub = 무료 다운로드 -uploadedFile = 파일 -copyFileList = URL 복사 -// expiryFileList is used as a column header -expiryFileList = 만료기한 -deleteFileList = 삭제 -nevermindButton = 괜찮습니다 -legalHeader = 이용약관 & 개인정보 보호 -legalNoticeTestPilot = Firefox Send는 현재 Test Pilot 실험 중이고, Test Pilot 이용 약관개인정보 보호공지가 적용됩니다. 이 실험과 데이터 수집에 관해서는 여기에서 더 알아볼 수 있습니다. -legalNoticeMozilla = 또한, Firefox Send 웹사이트 사용에는 웹사이트 개인정보 공지웹 사이트 이용약관이 적용됩니다. -deletePopupText = 이 파일을 지우시겠습니까? -deletePopupYes = 예 deletePopupCancel = 아니오 deleteButtonHover = 삭제 -copyUrlHover = URL 복사 footerLinkLegal = 법적 정보 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilot 정보 footerLinkPrivacy = 개인정보 보호 -footerLinkTerms = 이용 약관 footerLinkCookies = 쿠키 -requirePasswordCheckbox = 이 파일을 다운로드하려면 비밀번호가 필요함 -addPasswordButton = 비밀번호 추가 passwordTryAgain = 비밀번호가 맞지 않습니다. 다시 시도해 주세요. -// This label is followed by the password needed to download a file -passwordResult = 비밀번호: { $password } -reportIPInfringement = 지적 재산권 침해 신고 +javascriptRequired = Send는 JavaScript를 필요로 합니다 +whyJavascript = 왜 Send에 JavaScript가 필요하죠? +enableJavascript = JavaScript를 활성화하고 다시 시도해 주세요. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }시간 { $minutes }분 +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }분 +# A short status message shown when the user enters a long password +maxPasswordLength = 최대 비밀번호 길이: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = 이 비밀번호를 설정할 수 없었습니다 + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 간단하고, 사생활을 보호하는 파일 공유 +introDescription = { -send-brand }를 사용하면 종단 암호화와 자동으로 만료되는 링크를 사용해 파일을 공유할 수 있습니다. 안전하게 공유할 수 있고 공유된 파일이 계속 온라인에 남지 않게 됩니다. +notifyUploadEncryptDone = 파일이 암호화 되어서 보낼 수 있게 됐습니다 +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } 혹은 { $timespan } 후 만료됨 +timespanMinutes = + { $num -> + *[other] { $num }분 + } +timespanDays = + { $num -> + *[other] { $num }일 + } +timespanWeeks = + { $num -> + *[other] { $num }주 + } +fileCount = + { $num -> + *[other] { $num } 파일 + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 전체 크기: { $size } +# the next line after the colon contains a file name +copyLinkDescription = 링크를 복사해서 파일을 공유하세요: +copyLinkButton = 링크 복사 +downloadTitle = 파일 다운로드 +downloadDescription = 이 파일은 종단간 암호화 및 자동으로 만료되는 링크를 지원하는 { -send-brand }를 통해 공유되었습니다. +trySendDescription = 간단하고 안전한 파일 공유를 원하시나요? { -send-brand }를 사용해보세요. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] 한번에 { $count }개의 파일만 업로드 할 수 있습니다. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] { $count }개의 아카이브만 허용됩니다. + } +expiredTitle = 이 링크는 만료되었습니다. +notSupportedDescription = { -send-brand }는 이 브라우저와 작동하지 않습니다. { -send-short-brand }는 최신 { -firefox }와 가장 잘 작동하며, 대부분의 최신 웹 브라우저와도 잘 작동합니다. +downloadFirefox = { -firefox } 다운로드 +legalTitle = { -send-short-brand } 개인정보처리방침 +legalDateStamp = 버전 1.0, 2019년 3월 12일자 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }일 { $hours }시간 { $minutes }분 +addFilesButton = 업로드할 파일들을 선택하세요 +trustWarningMessage = 중요한 정보를 공유할 때는 수신자들이 모두 믿을 만한 사람들인지를 꼭 확인하세요. +uploadButton = 업로드 +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = 파일들을 여기에 끌어서 놓으세요 +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = 또는 여기를 클릭하여 { $size }까지의 파일을 공유하세요. +addPassword = 비밀번호로 파일 보호 +emailPlaceholder = 이메일 입력 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size }까지 파일을 보낼 수 있게 로그인 +signInOnlyButton = 로그인 +accountBenefitTitle = { -firefox } 계정 생성 또는 로그인 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size }까지의 파일 공유 +accountBenefitDownloadCount = 더 많은 사람들과 함께 파일 공유 +accountBenefitTimeLimit = + { $count -> + *[other] 최대 { $count }일까지 링크 유지 + } +accountBenefitSync = 어떤 기기에서든지 공유된 링크 관리 +accountBenefitMoz = 다른 { -mozilla } 서비스에 대해 알아보기 +signOut = 로그아웃 +okButton = 확인 +downloadingTitle = 다운로드 중 +noStreamsWarning = 이 브라우저는 이렇게 큰 파일은 암호화 해제를 못할 수도 있습니다. +noStreamsOptionCopy = 다른 브라우저에서 열 수 있도록 링크를 복사 +noStreamsOptionFirefox = 우리가 애용하는 브라우저를 사용해 보세요 +noStreamsOptionDownload = 이 브라우저로 계속하기 +downloadFirefoxPromo = 완전히 새로운 { -firefox }로 { -send-short-brand }가 제공됩니다. +# the next line after the colon contains a file name +shareLinkDescription = 파일 링크 공유: +shareLinkButton = 링크 공유 +# $name is the name of the file +shareMessage = { -send-brand }으로 “{ $name }” 파일을 내려받으세요: 쉽고 안전한 파일 공유입니다. +trailheadPromo = 개인 정보를 보호하는 방법이 있습니다. Firefox에 가입하세요. +learnMore = 더 알아보기. +downloadFlagged = 서비스 약관 위반으로 인해 비활성화된 링크입니다. +downloadConfirmTitle = 한 가지 더 +downloadConfirmDescription = 이 파일이 기기에 해를 끼치지 않는 다는 점을 확인하지 못했기 때문에 이 파일을 보낸 사람을 신뢰할 수 있는지 확인하세요. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] 이 파일을 보낸 사람을 신뢰함 + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] 이 파일을 의심스러운 것으로 신고 + } +reportDescription = 어떤 일이 발생했는지 알려 주세요. 이 파일의 어느 부분이 문제인 것 같나요? +reportUnknownDescription = 신고하려는 링크의 URL로 가서 “{ reportFile }”를 클릭하세요. +reportButton = 신고 +reportReasonMalware = 이 파일은 악성 코드를 포함하고 있거나 피싱 공격의 일부입니다. +reportReasonPii = 이 파일에는 본인에 대한 개인 식별 정보가 포함되어 있습니다. +reportReasonAbuse = 이 파일에는 불법적이거나 모욕적인 내용이 들어 있습니다. +reportReasonCopyright = 저작권 또는 상표권 침해를 신고하려면 이 페이지에 설명된 절차를 따르십시오. +reportedTitle = 파일 신고됨 +reportedDescription = 파일에 대한 신고를 접수했습니다. 감사합니다. diff --git a/public/locales/lt/send.ftl b/public/locales/lt/send.ftl new file mode 100644 index 000000000..f30f107a3 --- /dev/null +++ b/public/locales/lt/send.ftl @@ -0,0 +1,204 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Importuojama… +encryptingFile = Šifruojama… +decryptingFile = Iššifruojama… +downloadCount = + { $num -> + [one] { $num } kartą + [few] { $num } kartus + *[other] { $num } kartų + } +timespanHours = + { $num -> + [one] { $num } valandos + [few] { $num } valandų + *[other] { $num } valandų + } +copiedUrl = Nukopijuota! +unlockInputPlaceholder = Slaptažodis +unlockButtonLabel = Atrakinti +downloadButtonLabel = Parsisiųsti +downloadFinish = Parsiuntimas baigtas +fileSizeProgress = ({ $partialSize } iš { $totalSize }) +sendYourFilesLink = Išbandyti „Send“ +errorPageHeader = Nutiko kažkas negero! +fileTooBig = Pasirinktas failas yra per didelis, kad jį būtų galima įkelti. Failo dydis neturėtų viršyti { $size } +linkExpiredAlt = Saitas nebegalioja +notSupportedHeader = Jūsų naršyklė nepalaikoma. +notSupportedLink = Kodėl mano naršyklė nepalaikoma? +notSupportedOutdatedDetail = Deja, šioje „Firefox“ naršyklės laidoje nepalaikoma „Send“ veikti reikalinga technologija. Jeigu norite naudotis šia paslauga, turėsite atnaujinti savo naršyklę. +updateFirefox = Atnaujinti „Firefox“ +deletePopupCancel = Atsisakyti +deleteButtonHover = Šalinti +footerLinkLegal = Teisinė informacija +footerLinkPrivacy = Privatumas +footerLinkCookies = Slapukai +passwordTryAgain = Slaptažodis netinka. Bandykite dar kartą. +javascriptRequired = „Send“ veikimui būtina įgalinti „JavaScript“ palaikymą +whyJavascript = Kodėl „Send“ neveikia išjungus „JavaScript“? +enableJavascript = Įgalinkit „JavaScript“ ir bandykite dar kartą. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } val. { $minutes } min. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min. +# A short status message shown when the user enters a long password +maxPasswordLength = Didžiausias leistinas slaptažodžio ilgis: { $length } simb. +# A short status message shown when there was an error setting the password +passwordSetError = Slaptažodžio nustatyti nepavyko + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = + { $case -> + *[nominative] Mozilla + [genitive] Mozillos + [dative] Mozillai + [accusative] Mozillą + [instrumental] Mozilla + [locative] Mozilloje + } +introTitle = Paprastas ir privatus dalijimasis failais +introDescription = „{ -send-brand }“ suteikia galimybę dalintis failais, pasitelkiant abipusį šifravimą ir riboto galiojimo saitus. Tai padeda pasidalintus failus išlaikyti privačiais ir užtikrina, jog trumpam įkelti failai neliks pasiekiami internete amžinai. +notifyUploadEncryptDone = Failas užšifruotas ir parengtas išsiuntimui +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Nustos galioti parsisiuntus { $downloadCount } arba po { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minutės + [few] { $num } minučių + *[other] { $num } minučių + } +timespanDays = + { $num -> + [one] { $num } dienos + [few] { $num } dienų + *[other] { $num } dienų + } +timespanWeeks = + { $num -> + [one] { $num } savaitės + [few] { $num } savaičių + *[other] { $num } savaičių + } +fileCount = + { $num -> + [one] { $num } failas + [few] { $num } failai + *[other] { $num } failų + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Bendras dydis: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Nukopijuokite saitą, jeigu norite pasidalinti failu: +copyLinkButton = Kopijuoti saitą +downloadTitle = Parsisiųsti failus +downloadDescription = Šiuo failu pasidalinta per „{ -send-brand }“, pasitelkiant abipusį šifravimą ir riboto galiojimo saitą. +trySendDescription = Išbandykite „{ -send-brand }“ paprastam ir saugiam dalijimuisi failais. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Vienu metu galima įkelti ne daugiau kaip { $count } failą. + [few] Vienu metu galima įkelti ne daugiau kaip { $count } failus. + *[other] Vienu metu galima įkelti ne daugiau kaip { $count } failų. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Leidžiama turėti iki ne daugiau kaip { $count } archyvą. + [few] Leidžiama turėti iki ne daugiau kaip { $count } archyvus. + *[other] Leidžiama turėti iki ne daugiau kaip { $count } archyvų. + } +expiredTitle = Šis saitas nebegalioja. +notSupportedDescription = „{ -send-brand }“ su šia naršykle neveikia. „{ -send-short-brand }“ geriausiai veikia su paskiausia „{ -firefox }“ laida, o taip pat veikia su daugumos kitų naršyklių paskiausiomis laidomis. +downloadFirefox = Parsisiųsti „{ -firefox }“ +legalTitle = „{ -send-short-brand }“ privatumo pranešimas +legalDateStamp = 1.0 versija, 2019 m. kovo 12 d +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d. { $hours } val. { $minutes } min. +addFilesButton = Rinktis failus įkėlimui +trustWarningMessage = Dalindamiesi svarbiais duomenimis įsitikinkite, kad pasitikite gavėju. +uploadButton = Įkelti +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Užtempkite ir numeskite failus čia +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = arba spustelėkite mygtuką ir dalinkitės failais iki { $size } +addPassword = Apsaugoti slaptažodžiu +emailPlaceholder = Įveskite savo el. pašto adresą +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Prisijunkite, jeigu norite siųsti iki { $size } +signInOnlyButton = Prisijungti +accountBenefitTitle = Susikurkite „{ -firefox }“ paskyrą arba prisijunkite +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dalinkitės iki { $size } dydžio failais +accountBenefitDownloadCount = Dalinkitės su daugiau žmonių +accountBenefitTimeLimit = + { $count -> + [one] Išlaikykite saitus galiojančiais iki { $count } dienos. + [few] Išlaikykite saitus galiojančiais iki { $count } dienų. + *[other] Išlaikykite saitus galiojančiais iki { $count } dienų. + } +accountBenefitSync = Tvarkykite failus, kuriais dalijatės, iš bet kurio įrenginio +accountBenefitMoz = Sužinokite apie kitas „{ -mozilla(case: "genitive") }“ paslaugas +signOut = Atsijungti +okButton = Gerai +downloadingTitle = Parsiunčiama +noStreamsWarning = jūsų naršyklei gali nepavykti iššifruoti tokio didelio failo. +noStreamsOptionCopy = Nukopijuokite saitą ir atverkite jį kita naršykle +noStreamsOptionFirefox = Išbandykite mūsų mėgstamiausią naršyklę +noStreamsOptionDownload = Tęsti naudojantis šia naršykle +downloadFirefoxPromo = „{ -send-short-brand }“ jums atkeliauja iš naujosios „{ -firefox }“. +# the next line after the colon contains a file name +shareLinkDescription = Pasidalinkite saitu į jūsų failą: +shareLinkButton = Dalintis saitu +# $name is the name of the file +shareMessage = Atsisiųskite „{ $name }“ su „{ -send-brand }“: paprastas, saugus dalinimasis failais +trailheadPromo = Yra būdas apsaugoti jūsų privatumą. Naudokite „Firefox“. +learnMore = Sužinoti daugiau. +downloadFlagged = Šis saitas panaikintas dėl paslaugos teikimo nuostatų pažeidimo. +downloadConfirmTitle = Dar vienas dalykas +downloadConfirmDescription = Įsitikinkite, kad pasitikite asmeniu, atsiuntusiu šį failą, nes mes negalime užtikrinti, kad jis nepakenks jūsų įrenginiui. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Aš pasitikiu asmeniu, atsiuntusiu šį failą + [few] Aš pasitikiu asmeniu, atsiuntusiu šiuos failus + *[other] Aš pasitikiu asmeniu, atsiuntusiu šiuos failus + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Pranešti apie įtartiną failą + [few] Pranešti apie įtartinus failus + *[other] Pranešti apie įtartinus failus + } +reportDescription = Padėkite mums suprasti situaciją. Kas jūsų nuomone negerai su šiais failais? +reportUnknownDescription = Atverkite saitą, apie kurį norite pranešti, ir spustelėkite „{ reportFile }“. +reportButton = Pranešti +reportReasonMalware = Šiuose failuose yra kenkėjiškos programinės įrangos, arba jie yra dalis sukčiavimo atakos. +reportReasonPii = Šiuose failuose yra mano asmeninės informacijos. +reportReasonAbuse = Šiuose failuose yra nelegalaus arba neteisėto turinio. +reportReasonCopyright = Norėdami pranešti apie autorių teisių ar prekės ženklo pažeidimus, vadovaukitės šiame puslapyje aprašytu procesu. +reportedTitle = Apie failus pranešta +reportedDescription = Ačiū. Mes gavome jūsų pranešimą apie šiuos failus. diff --git a/public/locales/lus/send.ftl b/public/locales/lus/send.ftl new file mode 100644 index 000000000..d8c257c39 --- /dev/null +++ b/public/locales/lus/send.ftl @@ -0,0 +1,5 @@ +encryptingFile = Encrypting... +decryptingFile = Decrypting + +## Send version 2 strings + diff --git a/public/locales/meh/send.ftl b/public/locales/meh/send.ftl new file mode 100644 index 000000000..cf1aea1c4 --- /dev/null +++ b/public/locales/meh/send.ftl @@ -0,0 +1,154 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Tu'un jianininu +importingFile = Nasia´a… +encryptingFile = Encriptando... +decryptingFile = Desencriptando… +downloadCount = + { $num -> + *[other] { $num } nxinuun + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } +copiedUrl = Ntɨɨn +unlockInputPlaceholder = Contraseña +unlockButtonLabel = Nkasɨ +downloadButtonLabel = Xinuu +downloadFinish = Nnɨ´ɨ xinuu +fileSizeProgress = ({ $partialSize } de { $totalSize }) +sendYourFilesLink = Ni´i Send +errorPageHeader = ¡Iyo iin ntu nkene va´a! +fileTooBig = Archivo ya´a ka´nu. Nejia chunku´va { $size } +linkExpiredAlt = Nnɨ´ɨ enlace +notSupportedHeader = Ntu íyo tiñu nuu ka̱a̱ nánuku ya´a. +notSupportedLink = ¿Navi ntu satiñu nuu ka̱a̱ nánuku ya´a? +notSupportedOutdatedDetail = Tuni Firefox ya´a ntu satiñu vii jii Send. Nejika xinunu a jíía ka̱a̱ nánuku. +updateFirefox = Naxi´ñá Firefox +deletePopupCancel = Nkuvi-ka +deleteButtonHover = Xita +footerLinkLegal = Tu´un nichi +footerLinkPrivacy = Tu´un xitu a kumiji noo´o +footerLinkCookies = Cookies +passwordTryAgain = Contraseña ntu vatu. Nachu´un tuku. +javascriptRequired = Send ni´i JavaScript +whyJavascript = ¿Navi Send ni´i JavaScript? +enableJavascript = Kua´a jia´a JavaScript jee nachu´un tuku. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Naja ka´nu koo contraseña: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ntu nkuvi sá´á contraseña + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Kua´a daa archivo ñama jee yu´u +introDescription = { -send-brand } taji jia´anu archivos jii cifrado uvi nuu jee iin enlace nɨ´ɨ. Sukuan kuvi kumi yu´unu daa archivo jia´anu jee kuninu nkino daa ya´a kue´e kuiya íchi nuu. +notifyUploadEncryptDone = Archivo noo´o íyo cifrado jee kuvi chu´un íchi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Nɨ'ɨ dee nña´a { $downloadCount } a xiin { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 día + *[other] { $num } días + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 archivo + *[other] { $num } archivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ka´nu: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Tɨɨn enlace jee kua´a archivo: +copyLinkButton = Tɨɨn enlacae +downloadTitle = Xinuu archivo +downloadDescription = Archivo ya´a nsajia { -send-brand } jíí cifrado punto a punto jee iin enlace naa. +trySendDescription = Nasá´á jii { -send-brand } kua´a ñama jee vatu. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ntuxini 1 archivo kuvi ska. + *[other] Ntuxini { $count } archivos kuvi ska. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Ntu xini 1 archivo íyo + *[other] Ntu xini { $count } archivos íyo + } +expiredTitle = Nnɨ'ɨ link ya´a. +notSupportedDescription = { -send-brand } nsatiñu jii ka̱a̱ nánuku ya´a. { -send-short-brand } satiñu va´a jii tuni íchi yata { -firefox }, jee satiñu va´a jii tuni íyo ntañu´u kuaiyo daa ka̱a̱ nánuku. +downloadFirefox = Xinuun { -firefox } +legalTitle = Tu´un xitu a kumiji noo´o { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Kaji archivos ska +uploadButton = Ska +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Staka jee sía daa archivo +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = a xiin kuaxin saa chu´un íchi nee { $size } +addPassword = Iyo yu´u jii contraseña +emailPlaceholder = Chu´un email noo´o +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Kajie´e sesión saa chu´un íchi nee { $size } +signInOnlyButton = Kajie´e sesión +accountBenefitTitle = Sá´á iin cuenta { -firefox } a xiin kajie´e sesión +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Kua´a archivo ka´nu { $size } +accountBenefitDownloadCount = Kua´a archivos jii inka ñivɨ +accountBenefitTimeLimit = + { $count -> + [one] Kuteku enlaces 1 kivɨ + *[other] Kuteku daa enlaces { $count } kivɨ + } +accountBenefitSync = Tetiñu archivos jia´anu ntaka ka̱a̱ +accountBenefitMoz = Ka´vi kue´eka jiee inka tiñu { -mozilla } +signOut = Kasɨ sesión +okButton = Kuvi +downloadingTitle = Xinuu +noStreamsWarning = Kuvi ka̱a̱ nánaku ya´a nxituvi a vaji nuu iin archivo ka´nu. +noStreamsOptionCopy = Tɨɨn enlace jee síne nuu inka ka̱a̱ nánuku +noStreamsOptionFirefox = Ni´i ka̱a̱ nánuku va´a +noStreamsOptionDownload = Kaka jii ka̱a̱ nánuku ya´a +downloadFirefoxPromo = { -send-short-brand } taji jíía { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Kua´a enlace archivo noo´o +shareLinkButton = Kua´a link +# $name is the name of the file +shareMessage = Xinuu “{ $name }” jii { -send-brand }: ntu viji +trailheadPromo = Iyo iin kuvi kumi privacidad noo´o. Nayonika Firefox. +learnMore = Ka´vi kue´eka diff --git a/public/locales/mix/send.ftl b/public/locales/mix/send.ftl new file mode 100644 index 000000000..24a18c09b --- /dev/null +++ b/public/locales/mix/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Ndakiin… +encryptingFile = Ndasami tu'un… +decryptingFile = Nchiko tu'un… +downloadCount = + { $num -> + [one] 1 snuú + *[other] { $num } snuú + } +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } +copiedUrl = ¡Tsa ndatavi ña! +unlockInputPlaceholder = Tu'un seè +unlockButtonLabel = Kuna +downloadButtonLabel = Snuù +downloadFinish = Ntsinu snui +fileSizeProgress = ({ $partialSize } ña { $totalSize }) +sendYourFilesLink = Kuachu'un Send +errorPageHeader = ¡Yee ña va'a! +fileTooBig = Kanu tutu yo. Tsini ñu'u koi tana { $size }. +linkExpiredAlt = Ntoo enlace +notSupportedHeader = Kue ku kuni página. +notSupportedLink = ¿Chanu kue ku kuncheuña? +notSupportedOutdatedDetail = Firefox kue ku kuni página web takua kuachu'un Send. tsiniñu'u ndu tsa'a navegador. +updateFirefox = Ndu tsa'a Firefox +deletePopupCancel = Kunchatu +deleteButtonHover = Stoò +footerLinkLegal = Aviso legal +footerLinkPrivacy = Ña meu +footerLinkCookies = Cookies +passwordTryAgain = Kue vaa ni chau sivi siki. Chai tuku. +javascriptRequired = Send tsiniñui JavaScript +whyJavascript = ¿Chanu Send tsiniñui JavaScript? +enableJavascript = Saá ña mani katsi JavaScript chá kitsa tuku. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Kua tu'un see: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ma ku ntanii tu'un see + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Stucha kue tutu ku +introDescription = { -send-brand } ku stuchaku tutu seé tsi inkana tsi iin enlace ña ntóo mituin. Sa'an ku kunka va'a ña stuchaku cha ma ku kunchee na kue tutu ku. +notifyUploadEncryptDone = Tsa inka va'a tutu ku tsa ku stuchaku ña +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Ku kunkai mancha { $downloadCount } a { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 kii + *[other] { $num } kii + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 tutu + *[other] { $num } tutu + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Kua: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Ndatava enlace takua stuchaku tutú. +copyLinkButton = Ndatava enlace +downloadTitle = Snuú tutu +downloadDescription = Tutu yo stuchaku ña tsi { -send-brand } inka si'i chá ku nto'o mituin. +trySendDescription = Kuachu'un { -send-brand } takua stuchaku nchi tutu niku +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ku skau 1 tutu ni. + *[other] Mitu'un { $count }tutu ku skau. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] 1 tutu ni ku. + *[other] Mitu'un { $count } tutu ni ku. + } +expiredTitle = Koo enlace inka +notSupportedDescription = { -send-brand } ma ku Kuachu'un navegador yo. { -send-short-brand } Sachu'in va'a la versión da ntii { -firefox }, sachu'un tsi versión tsa'a su inka kue navegador. +downloadFirefox = Snuú { -firefox } +legalTitle = Tu'un privacidad { -send-short-brand } +legalDateStamp = Versión 1.0 del 12 de marzo de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Katsi tutu ku skau +trustWarningMessage = Kunche'e a va'a nu ku ntachuún ña. +uploadButton = Skaa +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Xita cha sia kue tutu +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = katavi takua stuchaku ña mancha { $size } +addPassword = Inka vai tsi tu'un seé +emailPlaceholder = Chaa korreo ku +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = kitsa takua kuachu'una mancha { $size } +signInOnlyButton = Kitsaa +accountBenefitTitle = Saa iin kuenta ña { -firefox } a kitsa +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Stucha tutu mancha { $size } +accountBenefitDownloadCount = Stucha tutu tsi kuaka nivi +accountBenefitTimeLimit = + { $count -> + [one] Ku kunka tutu ku mancha 1 kii + *[other] Ku kunka tutu ku mancha { $count } kii + } +accountBenefitSync = Stucha tutu tsí nchi kaa ndusu niku +accountBenefitMoz = Kavi tutú tsa { -mozilla } +signOut = Kee +okButton = Vaá +downloadingTitle = Snuì +noStreamsWarning = Ku ña navegador yo ma ku mini iin tutú kanu. +noStreamsOptionCopy = Ndatava enlace takua kunu tsí inka navegador +noStreamsOptionFirefox = Kuachu'un navegador ña va'a nu ntia +noStreamsOptionDownload = Kunka tsi navegador yo +downloadFirefoxPromo = { -send-short-brand } snai ña tsaa { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Stucha enlace tutu ku: +shareLinkButton = Stucha Enlace +# $name is the name of the file +shareMessage = Snuu «{ $name }» tsi { -send-brand }: kue nchichi +trailheadPromo = Ku china vau ña chau. Kita'an tsi Firefox. +learnMore = Skua'a kuakaa. +downloadFlagged = Va'á enlace yo. +downloadConfirmTitle = Una cosa más +downloadConfirmDescription = A tsinu nivo tachu'un tutu yo takua ma stivia kàa ndusu ku. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Va'a nivi ntachu'un tutu yo + *[other] Va'a nivi ntachu'un tutu yo + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Katu'un ña va'á tutu yo + *[other] Katu'un ña va'á kue tutu yo + } +reportDescription = Chinche kue yu na kunikue ña yee. ¿A va'á kue tutu yo? +reportUnknownDescription = Sa'a ña mani kuncheu, url ña enlace ña va'á cha katavi “{ reportFile }”. +reportButton = Ka tu'un +reportReasonMalware = Inka ña va'á nu kue tutu yo. +reportReasonPii = Inka kue tu'un me nu kue tutu yo. +reportReasonAbuse = Yee ña va'á nu kue tutu yo. +reportReasonCopyright = Tatu ye ña va'á nu derechos de autor a marca registrada, kavi tutu yo esta página. +reportedTitle = Ku ncheé tutu +reportedDescription = Ti tsavu. tsa kumikue tu'un tsa'a tutuku. diff --git a/public/locales/ml/send.ftl b/public/locales/ml/send.ftl new file mode 100644 index 000000000..b689abfa0 --- /dev/null +++ b/public/locales/ml/send.ftl @@ -0,0 +1,153 @@ +# Send is a brand name and should not be localized. +title = ഫയർഫോക്സ് സെൻഡ് +siteFeedback = പ്രതികരണം +importingFile = ഇറക്കുമതി ചെയ്യുന്നു... +encryptingFile = എൻക്രിപ്റ്റ് ചെയ്യുന്നു... +decryptingFile = ഡീക്രിപ്റ്റ് ചെയ്യുന്നു... +downloadCount = + { $num -> + [one] ഒരു ഡൗൺലോഡ് + *[other] { $num } ഡൗൺലോഡുകൾ + } +timespanHours = + { $num -> + [one] 1 മണിക്കൂർ + *[other] { $num } മണിക്കൂറുകൾ + } +copiedUrl = പകർത്തി! +unlockInputPlaceholder = രഹസ്യവാക്ക് +unlockButtonLabel = തുറക്കുക +downloadButtonLabel = ഡൗൺലോഡ് +downloadFinish = ഡൗൺലോഡ് പൂർത്തിയായി +fileSizeProgress = ({ $totalSize } -ന്റെ { $partialSize }) +sendYourFilesLink = ഫയർഫോക്സ് സെൻഡ് പരീക്ഷിക്കൂ +errorPageHeader = എന്തോ പ്രശ്നമുണ്ട്! +fileTooBig = ഈ ഫയൽ വളരെ വലുതായതിനാൽ അപ്‌ലോഡ് ചെയ്യാൻ സാധിച്ചില്ല. പരമാവധി വലുപ്പം { $size } ആണ്. +linkExpiredAlt = കണ്ണി കാലഹരണപ്പെട്ടു +notSupportedHeader = താങ്കളുടെ ബ്രൗസറിന് പിന്തുണയില്ല. +notSupportedLink = എന്തുകൊണ്ടാണ് എന്റെ ബ്രൗസറിന് പിന്തുണയില്ലാത്തത്? +notSupportedOutdatedDetail = ദൗർഭാഗ്യവശാൽ ഫയർഫോക്സിന്റെ ഈ പതിപ്പ് ഫയർഫോക്സ് സെൻഡ് ഉപയോഗിക്കുന്ന വെബ് സാങ്കേതികവിദ്യ പിന്തുണയ്ക്കുന്നില്ല. താങ്കൾ താങ്കളുടെ ബ്രൗസർ പുതുക്കേണ്ടി വരും. +updateFirefox = ഫയർഫോക്സ് പുതുക്കൂ +deletePopupCancel = റദ്ദാക്കുക +deleteButtonHover = നീക്കം ചെയ്യുക +footerLinkLegal = നിയമസംബന്ധവിവരങ്ങൾ +footerLinkPrivacy = സ്വകാര്യത +footerLinkCookies = കുക്കികൾ +passwordTryAgain = രഹസ്യവാക്ക് തെറ്റാണ്. വീണ്ടും ശ്രമിക്കുക. +javascriptRequired = ഫയർഫോക്സ് സെൻഡ് പ്രവർത്തിക്കാൻ ജാവാസ്ക്രിപ്റ്റ് വേണം +whyJavascript = ഫയർഫോക്സ് സെൻഡ് പ്രവർത്തിക്കാൻ എന്തിനാണ് ജാവാസ്ക്രിപ്റ്റ്? +enableJavascript = ദയവായി ജാവാസ്ക്രിപ്റ്റ് പ്രവർത്തനസജ്ജമാക്കിയിട്ട് വീണ്ടും ശ്രമിക്കുക. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } മണിക്കൂർ { $minutes } മിനുട്ട് +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } മിനുട്ട് +# A short status message shown when the user enters a long password +maxPasswordLength = രഹസ്യവാക്കിന്റെ പരമാവധി നീളം: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ഈ രഹസ്യവാക്ക് ക്രമീകരിക്കാനായില്ല + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = ഫയർഫോക്സ് സെൻഡ് +-send-short-brand = സെൻഡ് +-firefox = ഫയർഫോക്സ് +-mozilla = മോസില്ല +introTitle = ലളിതവും സ്വകാര്യവുമായ ഫയൽ പങ്കിടൽ +introDescription = തനിയെ കാലഹരണപ്പെടുന്ന ലിങ്ക് ഉപയോഗിച്ച് തുടക്കം മുതല്‍ അവസാനം വരെയുള്ള എന്‍ക്രിപ്ഷന്‍ സാങ്കേതികതയോടെ ഫയലുകള്‍ പങ്കിടാന്‍ { -send-brand } ഉപയോഗിക്കാം. അത് കൊണ്ട് തന്നെ നിങ്ങള്‍ പങ്കിടുന്നത് സ്വകാര്യമായി സൂക്ഷിക്കാനും അത് ഓണ്‍ലൈനില്‍ എക്കാലവും കാണില്ലെന്ന് ഉറപ്പാക്കാനും പറ്റും. +notifyUploadEncryptDone = നിങ്ങളുടെ ഫയൽ എൻക്രിപ്റ്റ് ചെയ്തിരിക്കുന്നു, അയയ്ക്കാൻ തയ്യാറാണ് +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } അല്ലെങ്കിൽ { $timespan } കഴിഞ്ഞാൽ കാലഹരണപ്പെടും +timespanMinutes = + { $num -> + [one] മിനുട്ട് + *[other] { $num } മിനുട്ട് + } +timespanDays = + { $num -> + [one] 1 ദിവസം + *[other] { $num } ദിവസം + } +timespanWeeks = + { $num -> + [one] 1 ആഴ്ച + *[other] { $num } ആഴ്ച + } +fileCount = + { $num -> + [one] 1 ഫയൽ + *[other] { $num } ഫയലുകൾ + } +# byte abbreviation +bytes = ബൈറ്റ് +# kibibyte abbreviation +kb = കി.ബൈ +# mebibyte abbreviation +mb = എംബി +# gibibyte abbreviation +gb = ജിബി +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ആകെ വലിപ്പം: { $size } +# the next line after the colon contains a file name +copyLinkDescription = നിങ്ങളുടെ ഫയൽ പങ്കിടാനുള്ള ലിങ്ക് പകർത്തുക: +copyLinkButton = ലിങ്ക് പകർത്തുക +downloadTitle = ഫയലുകൾ ഡൗൺലോഡുചെയ്യുക +downloadDescription = ഈ ഫയൽ { -send-brand } ഉപയോഗിച്ച് എൻഡ്-ടു-എൻഡ് എൻക്രിപ്ഷനോടും തനിയെ കാലഹരണപ്പെടുന്ന ഒരു ലിങ്കോടും കൂടി പങ്കിട്ടതാണ്. +trySendDescription = ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടലിനായി { -send-brand } പരീക്ഷിക്കുക. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ഒരേസമയം 1 ഫയൽ മാത്രമേ അപ്‌ലോഡു ചെയ്യാൻ കഴിയൂ. + *[other] ഒരേസമയം { $count } ഫയലുകൾ മാത്രമേ അപ്‌ലോഡു ചെയ്യാൻ കഴിയൂ. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] ഒരു ആർക്കൈവ് മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ. + *[other] { $count } ആർക്കൈവുകൾ മാത്രമേ അനുവദിച്ചിട്ടുള്ളൂ. + } +expiredTitle = ഈ ലിങ്ക് കാലഹരണപ്പെട്ടു. +notSupportedDescription = ഈ ബ്രൌസറിൽ { -send-brand } പ്രവർത്തിക്കില്ല. { -send-short-brand } { -firefox }- ന്റെ ഏറ്റവും പുതിയ പതിപ്പിൽ വളരെ നന്നായി പ്രവർത്തിക്കുന്നു, കൂടാതെ മിക്ക ബ്രൌസറുകളുടെയും നിലവിലെ പതിപ്പിൽ പ്രവർത്തിക്കുകയും ചെയ്യും. +downloadFirefox = { -firefox } ഡൗണ്‍ലോഡ് ചെയ്യുക +legalTitle = { -send-short-brand } സ്വകാര്യതാ അറിയിപ്പ് +legalDateStamp = 2019 മാർച്ച് 12 തീയതിയിൽ പതിപ്പ് 1.0 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ദിവസം { $hours } മണിക്കൂർ { $minutes } മിനിറ്റ് +addFilesButton = അപ്‌ലോഡ് ചെയ്യാനുള്ള ഫയലുകൾ തിരഞ്ഞെടുക്കുക +uploadButton = അപ്‍ലോഡ് +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ഫയലുകൾ വലിച്ചിടുക +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = അല്ലെങ്കിൽ { $size } വരെ അയയ്ക്കുന്നതിന് അമർത്തുക +addPassword = രഹസ്യവാക്ക് ഉപയോഗിച്ച് സംരക്ഷിക്കുക +emailPlaceholder = നിങ്ങളുടെ ഇമെയിൽ നൽകുക +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size } വരെയുള്ള ഫയലുകൾ അയയ്ക്കുന്നതിന് പ്രവേശിക്കുക +signInOnlyButton = പ്രവേശിയ്ക്കുക +accountBenefitTitle = ഒരു { -firefox } അക്കൗണ്ട് സൃഷ്ടിക്കുക അല്ലെങ്കിൽ പ്രവേശിക്കുക +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } വരെയുള്ള ഫയലുകൾ പങ്കിടുക +accountBenefitDownloadCount = കൂടുതൽ ആളുകളുമായി ഫയലുകൾ പങ്കിടുക +accountBenefitTimeLimit = + { $count -> + [one] ഒരു ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക + *[other] { $count } ദിവസം വരെ ലിങ്കുകൾ സജീവമായി നിലനിർത്തുക + } +accountBenefitSync = ഏതൊരു ഉപകരണത്തിൽ നിന്നും പങ്കിട്ട ഫയലുകൾ കൈകാര്യം ചെയ്യുക +accountBenefitMoz = മറ്റ് { -mozilla } സേവനങ്ങളെക്കുറിച്ച് അറിയുക +signOut = പുറത്തിറങ്ങുക +okButton = ശരി +downloadingTitle = ഡൌണ്‍ലോഡ് ചെയ്യുന്നു +noStreamsWarning = ഇത്ര വലിയ ഫയൽ ബ്രൌസറില്‍ ഡീക്രിപ്റ്റ് ചെയ്യാൻ കഴിഞ്ഞേക്കില്ല. +noStreamsOptionCopy = മറ്റൊരു ബ്രൗസറിൽ തുറക്കുന്നതിന് ലിങ്ക് പകർത്തുക +noStreamsOptionFirefox = ഞങ്ങളുടെ പ്രിയപ്പെട്ട ബ്രൗസർ പരീക്ഷിക്കുക +noStreamsOptionDownload = ഈ ബ്രൗസറിൽ തുടരുക +downloadFirefoxPromo = എറ്റവും പുതിയ { -firefox } { -send-short-brand } മുഖേന നിങ്ങൾക്ക് എത്തിച്ചിരിക്കുന്നു. +# the next line after the colon contains a file name +shareLinkDescription = നിങ്ങളുടെ ഫയലിനുള്ള കണ്ണി പങ്കിടുക: +shareLinkButton = കണ്ണി പങ്കിടുക +# $name is the name of the file +shareMessage = "{ -send-brand }" ഉപയോഗിച്ച് { $name } ഡൌൺലോഡ് ചെയ്യുക: ലളിതവും സുരക്ഷിതവുമായ ഫയൽ പങ്കിടൽ diff --git a/public/locales/ms/send.ftl b/public/locales/ms/send.ftl index 4ea949b7b..1f2a84954 100644 --- a/public/locales/ms/send.ftl +++ b/public/locales/ms/send.ftl @@ -1,5 +1,5 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send +# Send is a brand name and should not be localized. +title = Send siteSubtitle = experimen web siteFeedback = Maklum balas uploadPageHeader = Peribadi, Perkongsian Fail Dienkrip @@ -26,10 +26,12 @@ uploadSuccessConfirmHeader = Sedia untuk Hantar uploadSvgAlt = Muat naik uploadSuccessTimingHeader = Pautan ke fail anda akan luput selepas 1 muat turun atau dalam 24 jam. expireInfo = Pautan ke fail anda akan luput selepas { $downloadCount } atau { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> *[other] { $num } muat turun } -timespanHours = { $num -> +timespanHours = + { $num -> *[other] { $num } jam } copyUrlFormLabelWithName = Salin dan kongsi pautan untuk menghantar fail anda: { $filename } @@ -37,30 +39,30 @@ copyUrlFormButton = Salin ke Klipbod copiedUrl = Disalin! deleteFileButton = Buang Fail sendAnotherFileLink = Hantar fail lain -// Alternative text used on the download link/button (indicates an action). +# Alternative text used on the download link/button (indicates an action). downloadAltText = Muat turun downloadsFileList = Muat turun -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") +# Used as header in a column indicating the amount of time left before a +# download link expires (e.g. "10h 5m") timeFileList = Masa -// Used as header in a column indicating the number of times a file has been -// downloaded +# Used as header in a column indicating the number of times a file has been +# downloaded downloadFileName = Muat turun { $filename } downloadFileSize = ({ $size }) unlockInputLabel = Masukkan Kata Laluan unlockInputPlaceholder = Kata laluan unlockButtonLabel = Buka downloadFileTitle = Muat turun Fail Enkripsi -// Firefox Send is a brand name and should not be localized. -downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Firefox Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya. -// Text and title used on the download link/button (indicates an action). +# Send is a brand name and should not be localized. +downloadMessage = Rakan anda menghantar satu fail kepada anda menggunakan Send, satu perkhidmatan yang membolehkan anda berkongsi fail dengan pautan yang selamat, peribadi dan dienkrip, yang secara automatik akan luput bagi memastikan fail anda tidak terus berada dalam talian selama-lamanya. +# Text and title used on the download link/button (indicates an action). downloadButtonLabel = Muat turun downloadNotification = Muat turun anda sudah siap. downloadFinish = Muat turun Selesai -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +# This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } daripada { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Cuba Firefox Send +# Send is a brand name and should not be localized. +sendYourFilesLink = Cuba Send downloadingPageProgress = Memuat turun { $filename } ({ $size }) downloadingPageMessage = Sila biarkan tab ini terbuka semasa kami mengambil fail anda dan menghuraikannya. errorAltText = Ralat memuat naik @@ -71,28 +73,28 @@ fileTooBig = Fail terlalu besar untuk dimuat naik. Perlu kurang daripada { $size linkExpiredAlt = Pautan sudah luput expiredPageHeader = Pautan ini sudah luput atau pun tidak pernah wujud! notSupportedHeader = Pelayar anda tidak disokong. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Firefox Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox! +# Send is a brand name and should not be localized. +notSupportedDetail = Malangnya, pelayar ini tidak menyokong teknologi web yang melaksanakan Send. Anda perlu cuba pelayar lain. Kami syorkan Firefox! notSupportedLink = Kenapa pelayar saya tidak disokong? -notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Firefox Send. Anda perlu mengemaskini pelayar anda. +notSupportedOutdatedDetail = Malangnya versi Firefox ini tidak menyokong teknologi web yang menguasakan Send. Anda perlu mengemaskini pelayar anda. updateFirefox = Kemaskini Firefox downloadFirefoxButtonSub = Muat turun Percuma uploadedFile = Fail copyFileList = Salin URL -// expiryFileList is used as a column header +# expiryFileList is used as a column header expiryFileList = Luput Pada deleteFileList = Buang nevermindButton = Tak apalah legalHeader = Terma & Privasi -legalNoticeTestPilot = Firefox Send adalah eksperimen Ujian Perintis, dan tertakluk kepada Terma Perkhidmatan dan Notis Privasi Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data di sini. -legalNoticeMozilla = Penggunaan laman web Firefox Send juga tertakluk kepada Notis Privasi Laman web dan Terma Penggunaan Laman web Mozilla. +legalNoticeTestPilot = Send adalah eksperimen Ujian Perintis, dan tertakluk kepada Terma Perkhidmatan dan Notis Privasi Ujian Perintis. Anda boleh ketahui selanjutnya perihal eksperimen ini dan pengumpulan data di sini. +legalNoticeMozilla = Penggunaan laman web Send juga tertakluk kepada Notis Privasi Laman web dan Terma Penggunaan Laman web Mozilla. deletePopupText = Buang fail ini? deletePopupYes = Ya deletePopupCancel = Batal deleteButtonHover = Buang copyUrlHover = Salin URL footerLinkLegal = Perundangan -// Test Pilot is a proper name and should not be localized. +# Test Pilot is a proper name and should not be localized. footerLinkAbout = Perihal Ujian Perintis footerLinkPrivacy = Privasi footerLinkTerms = Terma @@ -101,13 +103,17 @@ requirePasswordCheckbox = Perlu kata laluan untuk memuat turun fail ini addPasswordButton = Tambah Kata laluan changePasswordButton = Tukar passwordTryAgain = Kata laluan tidak betul. Cuba lagi. -// This label is followed by the password needed to download a file -passwordResult = Kata laluan: { $password } reportIPInfringement = Lapor Pencerobohan IP -javascriptRequired = Firefox Send perlukan JavaScript -whyJavascript = Kenapa Firefox Send perlukan JavaScript? +javascriptRequired = Send perlukan JavaScript +whyJavascript = Kenapa Send perlukan JavaScript? enableJavascript = Sila dayakan JavaScript dan cuba lagi. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when a password is successfully set +passwordIsSet = Kata laluan ditetapkan +# A short status message shown when the user enters a long password +maxPasswordLength = Panjang kata laluan maksimum: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Kata laluan ini tidak boleh ditetapkan diff --git a/public/locales/nb-NO/send.ftl b/public/locales/nb-NO/send.ftl index 3208f1a0e..6ad7da929 100644 --- a/public/locales/nb-NO/send.ftl +++ b/public/locales/nb-NO/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = netteksperiment -siteFeedback = Tilbakemelding -uploadPageHeader = Privat, kryptert fildeling -uploadPageExplainer = Send filer gjennom en sikker, privat og kryptert lenke som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid. -uploadPageLearnMore = Les mer -uploadPageDropMessage = Slipp din fil her for å starte opplastingen -uploadPageSizeMessage = For den mest problemfrie bruken, er det best å holde filen under 1 GB -uploadPageBrowseButton = Velg en fil på din datamaskin -uploadPageBrowseButton1 = Velg en fil til å laste opp -uploadPageMultipleFilesAlert = Opplasting av flere filer eller en mappe støttes ikke for øyeblikket. -uploadPageBrowseButtonTitle = Last opp fil -uploadingPageProgress = Laster opp { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importerer… -verifyingFile = Verifiserer... encryptingFile = Krypterer... decryptingFile = Dekrypterer... -notifyUploadDone = Opplastingen din er ferdig. -uploadingPageMessage = Når filopplastingen din er ferdig, kan du angi utløpsalternativer. -uploadingPageCancel = Avbryt opplasting -uploadCancelNotification = Din opplasting ble avbrutt -uploadingPageLargeFileMessage = Denne filen er stor, og det kan ta litt tid å laste opp. Vent litt! -uploadingFileNotification = Varsle meg når opplastingen er ferdig. -uploadSuccessConfirmHeader = Klar til å sende -uploadSvgAlt = Last opp -uploadSuccessTimingHeader = Lenken til filen din utløper etter 1 nedlasting eller om 24 timer. -expireInfo = Lenken til filen din vil gå ut etter { $downloadCount } eller { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 nedlasting *[other] { $num } nedlastinger } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 time *[other] { $num } timer } -copyUrlFormLabelWithName = Kopier og del linken for å sende filen: { $filename } -copyUrlFormButton = Kopier til utklippstavle copiedUrl = Kopiert! -deleteFileButton = Slett fil -sendAnotherFileLink = Send en annen fil -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Last ned -downloadsFileList = Nedlastinger -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tid -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Last ned { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Skriv inn passord unlockInputPlaceholder = Passord unlockButtonLabel = Lås opp -downloadFileTitle = Last ned kryptert fil -// Firefox Send is a brand name and should not be localized. -downloadMessage = Din venn sender deg en fil med Firefox Send, en tjeneste som lar deg dele filer med en sikker, privat og kryptert lenke, som automatisk utløper, for å sikre at ting ikke forblir på nettet for alltid. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Last ned -downloadNotification = Nedlastingen er fullført. downloadFinish = Nedlastingen er fullført. -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } av { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prøv Firefox Send -downloadingPageProgress = Laster ned { $filename } ({ $size }) -downloadingPageMessage = La denne fanen være åpen mens vi henter filen og dekrypterer den. -errorAltText = Opplastingsfeil +sendYourFilesLink = Prøv Send errorPageHeader = Det oppstod en feil. -errorPageMessage = Det har oppstått en feil under opplasting av filen. -errorPageLink = Send en annen fil fileTooBig = Filen er for stor til å laste opp. Det må være mindre enn { $size }. linkExpiredAlt = Lenke utløpt -expiredPageHeader = Denne lenken er utløpt eller har aldri eksistert i utgangspunktet! notSupportedHeader = Din nettleser er ikke støttet. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Dessverre støtter denne nettleseren ikke webteknologien som driver Firefox Send. Du må prøve en annen nettleser. Vi anbefaler Firefox! notSupportedLink = Hvorfor er ikke nettleseren min støttet? -notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Firefox Send. Du trenger å oppdatere nettleseren din. +notSupportedOutdatedDetail = Dessverre støtter ikke denne versjonen av Firefox netteknologien som driver Send. Du trenger å oppdatere nettleseren din. updateFirefox = Oppdater Firefox -downloadFirefoxButtonSub = Gratis nedlasting -uploadedFile = Fil -copyFileList = Kopier URL -// expiryFileList is used as a column header -expiryFileList = Utløper om -deleteFileList = Slett -nevermindButton = Glem det -legalHeader = Vilkår og personvern -legalNoticeTestPilot = Firefox Send er for øyeblikket et Test Pilot-eksperiment, og er underlagt Test Pilots tjenestevilkår og personvernbestemmelser. Du kan lære mer om dette eksperimentet og datainnsamlingen her. -legalNoticeMozilla = Bruk av Firefox Send-nettsiden er også underlagt Mozillas personvernbestemmelser for nettsider og brukervilkår for nettsider. -deletePopupText = Slette denne filen? -deletePopupYes = Ja deletePopupCancel = Avbryt deleteButtonHover = Slett -copyUrlHover = Kopier URL footerLinkLegal = Juridisk informasjon -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Om Test Pilot footerLinkPrivacy = Personvern -footerLinkTerms = Vilkår footerLinkCookies = Infokapsler -requirePasswordCheckbox = Krever et passord for å laste ned denne filen -addPasswordButton = Legg til passord -changePasswordButton = Endre passwordTryAgain = Feil passord. Prøv igjen. -// This label is followed by the password needed to download a file -passwordResult = Passord: { $password } -reportIPInfringement = Rapporter brudd på åndsverk -javascriptRequired = Firefox Send krever JavaScript. -whyJavascript = Hvorfor krever Firefox Send JavaScript? +javascriptRequired = Send krever JavaScript. +whyJavascript = Hvorfor krever Send JavaScript? enableJavascript = Slå på JavaScript og prøv igjen. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }t { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum passordlengde: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dette passordet kunne ikke settes + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildeling +introDescription = { -send-brand } lar deg dele filer via en tidsbegrenset lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samtidig være trygg på at filene dine ikke blir liggende på nettet for alltid. +notifyUploadEncryptDone = Filen din er kryptert og klar til å sende +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Utløper etter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutt + *[other] { $num } minutter + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dager + } +timespanWeeks = + { $num -> + [one] 1 uke + *[other] { $num } uker + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total størrelse: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopier lenken for å dele filen din: +copyLinkButton = Kopier lenke +downloadTitle = Last ned filer +downloadDescription = Denne filen ble delt via { -send-brand } med ende-til-ende-kryptering og en lenke som automatisk utløper. +trySendDescription = Prøv { -send-brand } for enkel, sikker fildeling. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Kun 1 fil kan lastes opp om gangen. + *[other] Kun { $count } filer kan lastes opp om gangen. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Kun 1 arkiv er tillatt. + *[other] Kun { $count } arkiver er tillatt. + } +expiredTitle = Denne lenken er utløpt. +notSupportedDescription = { -send-brand } virker ikke med denne nettleseren. { -send-short-brand } fungerer best med den nyeste versjonen av { -firefox }, og vil fungere med den nyeste versjonen av de fleste nettlesere. +downloadFirefox = Last ned { -firefox } +legalTitle = { -send-short-brand } Personvernerklæring +legalDateStamp = Versjon 1.0, datert den 12. mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m +addFilesButton = Velg filer du vil laste opp +trustWarningMessage = Forsikre deg om at du stoler på mottakeren din når du deler sensitive data. +uploadButton = Last opp +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dra og slipp filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klikk for å sende filer på opptil { $size } +addPassword = Beskytt med passord +emailPlaceholder = Skriv inn e-postadressen din +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logg inn for å sende opptil { $size } +signInOnlyButton = Logg inn +accountBenefitTitle = Opprett en { -firefox }-konto eller logg inn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Del filer på opptil { $size } +accountBenefitDownloadCount = Del filer med flere personer +accountBenefitTimeLimit = + { $count -> + [one] Hold lenker aktiv opptil 1 dag + *[other] Hold lenker aktiv opptil { $count } dager + } +accountBenefitSync = Behandle delte filer fra en hvilken som helst enhet +accountBenefitMoz = Les om andre { -mozilla }-tjenester +signOut = Logg ut +okButton = OK +downloadingTitle = Laster ned +noStreamsWarning = Denne nettleseren kan kanskje ikke dekryptere en så stor fil. +noStreamsOptionCopy = Kopier lenken for å åpne den i en annen nettleser +noStreamsOptionFirefox = Prøv favorittnettleseren vår +noStreamsOptionDownload = Fortsett med denne nettleseren +downloadFirefoxPromo = { -send-short-brand } presenteres for deg av den helt nye { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Del lenken til filen din: +shareLinkButton = Del lenke +# $name is the name of the file +shareMessage = Last ned ‹{ $name }› med { -send-brand }: enkel, trygg fildeling +trailheadPromo = Det finnes en måte å ta vare på personvernet ditt. Bruk Firefox. +learnMore = Les mer. +downloadFlagged = Denne koblingen er deaktivert på grunn av brudd på vilkårene for tjenesten. +downloadConfirmTitle = En ting til +downloadConfirmDescription = Forsikre deg om at du stoler på personen som sendte deg denne filen, fordi vi ikke kan bekrefte at den ikke vil skade enheten din. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Jeg stoler på personen som sendte denne filen + *[other] Jeg stoler på personen som sendte disse filene + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Rapporter denne filen som mistenkelig + *[other] Rapporter disse filene som mistenkelige + } +reportDescription = Hjelp oss å forstå hva som skjer. Hva tror du er galt med disse filene? +reportUnknownDescription = Gå til adressen til lenken du ønsker å rapportere, og klikk «{ reportFile }». +reportButton = Rapporter +reportReasonMalware = Disse filene inneholder skadelig programvare eller er del av et nettfiskingsangrep (phishing-angrep). +reportReasonPii = Disse filene inneholder personlig identifiserbar informasjon om meg. +reportReasonAbuse = Disse filene inneholder ulovlig eller voldelig innhold. +reportReasonCopyright = For å rapportere brudd på opphavsrett eller varemerke, bruk prosessen som er beskrevet på denne siden. +reportedTitle = Filer rapportert +reportedDescription = Takk skal du ha. Vi har mottatt rapporten din om disse filene. diff --git a/public/locales/nl/send.ftl b/public/locales/nl/send.ftl index 4494a5b15..fe84afe97 100644 --- a/public/locales/nl/send.ftl +++ b/public/locales/nl/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webexperiment -siteFeedback = Feedback -uploadPageHeader = Privé, versleuteld bestanden delen -uploadPageExplainer = Stuur bestanden via een veilige, private en versleutelde koppeling die automatisch verloopt, zodat u zeker weet dat uw zaken niet onbeperkt online blijven. -uploadPageLearnMore = Meer info -uploadPageDropMessage = Sleep uw bestand hiernaartoe om het te uploaden -uploadPageSizeMessage = Voor de meest betrouwbare werking kunt u uw bestand het beste onder de 1 GB houden -uploadPageBrowseButton = Selecteer een bestand op uw computer -uploadPageBrowseButton1 = Selecteer een bestand om te uploaden -uploadPageMultipleFilesAlert = Het uploaden van meerdere bestanden of een map wordt momenteel niet ondersteund. -uploadPageBrowseButtonTitle = bestand uploaden -uploadingPageProgress = { $filename } ({ $size }) wordt geüpload +# Send is a brand name and should not be localized. +title = Send importingFile = Importeren… -verifyingFile = Verifiëren… encryptingFile = Versleutelen… -decryptingFile = Ontcijferen… -notifyUploadDone = Uw upload is voltooid. -uploadingPageMessage = Zodra uw bestand wordt geüpload, kunt u vervalopties instellen. -uploadingPageCancel = Uploaden annuleren -uploadCancelNotification = Uw upload is geannuleerd. -uploadingPageLargeFileMessage = Dit bestand is groot en het uploaden kan even duren. Even geduld… -uploadingFileNotification = Mij waarschuwen zodra het uploaden is voltooid -uploadSuccessConfirmHeader = Gereed voor verzending -uploadSvgAlt = Uploaden -uploadSuccessTimingHeader = De koppeling naar uw bestand zal na 1 download of 24 uur verlopen. -expireInfo = De koppeling naar uw bestand zal na { $downloadCount } of { $timespan } verlopen. -downloadCount = { $num -> +decryptingFile = Ontsleutelen… +downloadCount = + { $num -> [one] 1 download *[other] { $num } downloads } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 uur *[other] { $num } uur } -copyUrlFormLabelWithName = Kopieer en deel de koppeling om uw bestand te verzenden: { $filename } -copyUrlFormButton = Kopiëren naar klembord copiedUrl = Gekopieerd! -deleteFileButton = Bestand verwijderen -sendAnotherFileLink = Nog een bestand verzenden -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Downloaden -downloadsFileList = Downloads -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tijd -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } downloaden -downloadFileSize = ({ $size }) -unlockInputLabel = Voer wachtwoord in unlockInputPlaceholder = Wachtwoord unlockButtonLabel = Ontgrendelen -downloadFileTitle = Versleuteld bestand downloaden -// Firefox Send is a brand name and should not be localized. -downloadMessage = Uw vriend(in) stuurt u een bestand met Firefox Send, een dienst waarmee u bestanden kunt verzenden met een veilige, private en versleutelde koppeling die automatisch verloopt, zodat u zeker weet dat uw zaken niet onbeperkt online blijven. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Downloaden -downloadNotification = Uw download is voltooid. downloadFinish = Downloaden voltooid -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } van { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send proberen -downloadingPageProgress = { $filename } ({ $size }) wordt gedownload -downloadingPageMessage = Laat dit tabblad geopend terwijl uw bestand wordt opgehaald en ontcijferd. -errorAltText = Uploadfout +sendYourFilesLink = Send proberen errorPageHeader = Er is iets misgegaan! -errorPageMessage = Er is een fout opgetreden bij het uploaden van het bestand. -errorPageLink = Nog een bestand verzenden fileTooBig = Dat bestand is te groot om te worden geüpload. Het moet kleiner zijn dan { $size }. linkExpiredAlt = Koppeling verlopen -expiredPageHeader = Deze koppeling is verlopen of heeft überhaupt nooit bestaan! notSupportedHeader = Uw browser wordt niet ondersteund. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Helaas ondersteunt deze browser de webtechnologie die Firefox Send gebruikt niet. U dient een andere browser te proberen. Firefox wordt aanbevolen! notSupportedLink = Waarom wordt mijn browser niet ondersteund? -notSupportedOutdatedDetail = Helaas ondersteunt deze versie van Firefox de webtechnologie die Firefox Send gebruikt niet. U dient uw browser bij te werken. +notSupportedOutdatedDetail = Helaas ondersteunt deze versie van Firefox de webtechnologie die Send gebruikt niet. U dient uw browser bij te werken. updateFirefox = Firefox bijwerken -downloadFirefoxButtonSub = Gratis download -uploadedFile = Bestand -copyFileList = URL kopiëren -// expiryFileList is used as a column header -expiryFileList = Verloopt over -deleteFileList = Verwijderen -nevermindButton = Maakt niet uit -legalHeader = Voorwaarden en privacy -legalNoticeTestPilot = Firefox Send is momenteel een Test Pilot-experiment en onderhevig aan de Servicevoorwaarden en Privacyverklaring van Test Pilot. Hier vindt u meer info over dit experiment en de gegevensverzameling ervan. -legalNoticeMozilla = Gebruik van de Firefox Send-website is ook onderhevig aan de Privacyverklaring voor websites en Servicevoorwaarden voor websites van Mozilla. -deletePopupText = Dit bestand verwijderen? -deletePopupYes = Ja deletePopupCancel = Annuleren deleteButtonHover = Verwijderen -copyUrlHover = URL kopiëren footerLinkLegal = Juridisch -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Over Test Pilot footerLinkPrivacy = Privacy -footerLinkTerms = Voorwaarden footerLinkCookies = Cookies -requirePasswordCheckbox = Een wachtwoord vereisen om dit bestand te downloaden -addPasswordButton = Wachtwoord toevoegen -changePasswordButton = Wijzigen passwordTryAgain = Onjuist wachtwoord. Probeer het opnieuw. -// This label is followed by the password needed to download a file -passwordResult = Wachtwoord: { $password } -reportIPInfringement = IE-inbreuk melden -javascriptRequired = Firefox Send vereist JavaScript -whyJavascript = Waarom vereist Firefox Send JavaScript? +javascriptRequired = Send vereist JavaScript +whyJavascript = Waarom vereist Send JavaScript? enableJavascript = Schakel JavaScript in en probeer het opnieuw. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }u { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximale wachtwoordlengte: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dit wachtwoord kon niet worden ingesteld + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Eenvoudig, privé bestanden delen +introDescription = Met { -send-brand } kunt u bestanden delen met end-to-endversleuteling en een koppeling die automatisch verloopt. Hierdoor kunt u privé houden wat u wilt delen en er zeker van zijn dat uw zaken niet voor altijd online blijven. +notifyUploadEncryptDone = Uw bestand is versleuteld en klaar voor verzending +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Verloopt na { $downloadCount } of { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuut + *[other] { $num } minuten + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dagen + } +timespanWeeks = + { $num -> + [one] 1 week + *[other] { $num } weken + } +fileCount = + { $num -> + [one] 1 bestand + *[other] { $num } bestanden + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Totale grootte: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopieer de koppeling om uw bestand te delen: +copyLinkButton = Koppeling kopiëren +downloadTitle = Bestanden downloaden +downloadDescription = Dit bestand is gedeeld via { -send-brand } met end-to-endversleuteling en een koppeling die automatisch verloopt. +trySendDescription = Probeer { -send-brand } voor eenvoudig, veilig bestanden delen. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Er kan slechts één bestand tegelijk worden geüpload. + *[other] Er kunnen slechts { $count } bestanden tegelijk worden geüpload. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Slechts één archief is toegestaan. + *[other] Slechts { $count } archieven zijn toegestaan. + } +expiredTitle = Deze koppeling is verlopen. +notSupportedDescription = { -send-brand } werkt niet met deze browser. { -send-short-brand } werkt het beste met de nieuwste versie van { -firefox }, en werkt met de huidige versie van de meeste browsers. +downloadFirefox = { -firefox } downloaden +legalTitle = Privacybeleid van { -send-short-brand } +legalDateStamp = Versie 1.0 d.d. 12 maart 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }u { $minutes }m +addFilesButton = Selecteer te uploaden bestanden +trustWarningMessage = Zorg ervoor dat u uw ontvanger vertrouwt wanneer u gevoelige gegevens deelt. +uploadButton = Uploaden +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Versleep bestanden +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = of klik om tot { $size } te versturen +addPassword = Beveiligen met wachtwoord +emailPlaceholder = Voer uw e-mailadres in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Meld u aan om tot { $size } te versturen +signInOnlyButton = Aanmelden +accountBenefitTitle = Maak een { -firefox }-account of meld u aan +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bestanden tot { $size } delen +accountBenefitDownloadCount = Bestanden met meerdere personen delen +accountBenefitTimeLimit = + { $count -> + [one] Koppelingen tot één dag actief houden + *[other] Koppelingen tot { $count } dagen actief houden + } +accountBenefitSync = Gedeelde bestanden vanaf andere apparaten beheren +accountBenefitMoz = Info over andere services van { -mozilla } +signOut = Afmelden +okButton = OK +downloadingTitle = Downloaden +noStreamsWarning = Deze browser kan een bestand van deze omvang mogelijk niet ontcijferen. +noStreamsOptionCopy = Koppeling kopiëren om in een andere browser te openen +noStreamsOptionFirefox = Onze favoriete browser proberen +noStreamsOptionDownload = Doorgaan met deze browser +downloadFirefoxPromo = { -send-short-brand } wordt u aangeboden door het volledig vernieuwde { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Deel de koppeling naar uw bestand: +shareLinkButton = Koppeling delen +# $name is the name of the file +shareMessage = Download ‘{ $name }’ met { -send-brand }: eenvoudig, veilig bestanden delen +trailheadPromo = Er is een manier om uw privacy te beschermen. Doe mee met Firefox. +learnMore = Meer info. +downloadFlagged = Deze koppeling is uitgeschakeld wegens schending van de servicevoorwaarden. +downloadConfirmTitle = Nog een ding +downloadConfirmDescription = Zorg ervoor dat u de persoon vertrouwt die u dit bestand heeft gestuurd, omdat we niet kunnen verifiëren dat het uw apparaat niet zal schaden. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Ik vertrouw de persoon die dit bestand heeft verzonden + *[other] Ik vertrouw de persoon die deze bestanden heeft verzonden + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Dit bestand als verdacht rapporteren + *[other] Deze bestanden als verdacht rapporteren + } +reportDescription = Help ons te begrijpen wat er aan de hand is. Wat is er volgens u mis met deze bestanden? +reportUnknownDescription = Ga naar de URL van de koppeling die u wilt melden en klik op ‘{ reportFile }’. +reportButton = Rapporteren +reportReasonMalware = Deze bestanden bevatten malware of zijn onderdeel van een phishingaanval. +reportReasonPii = Deze bestanden bevatten persoonlijk identificeerbare informatie over mij. +reportReasonAbuse = Deze bestanden bevatten illegale of beledigende inhoud. +reportReasonCopyright = Gebruik de procedure op deze pagina om inbreuk op auteursrechten of handelsmerken te melden. +reportedTitle = Bestanden gerapporteerd +reportedDescription = Dank u. We hebben uw rapport over deze bestanden ontvangen. diff --git a/public/locales/nn-NO/send.ftl b/public/locales/nn-NO/send.ftl index 1737f5cae..97ae9f32f 100644 --- a/public/locales/nn-NO/send.ftl +++ b/public/locales/nn-NO/send.ftl @@ -1,108 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = netteksperiment -siteFeedback = Tilbakemelding -uploadPageHeader = Privat, kryptert fildeling -uploadPageExplainer = Send filer gjennom ei sikker, privat og kryptert lenke som automatisk går ut, for å sikre at ting ikkje vert verande på nettet for alltid. -uploadPageLearnMore = Les meir -uploadPageDropMessage = Slepp fila di her for å starte opplastinga -uploadPageSizeMessage = For mest problemfrie bruk, er det best å halde fila under 1 GB -uploadPageBrowseButton = Vel ei fil på datamaskina di -uploadPageBrowseButton1 = Vel ei fil å laste opp -uploadPageMultipleFilesAlert = Opplasting av fleire filer eller ei mappe er for tida ikkje støtta. -uploadPageBrowseButtonTitle = Last opp fil -uploadingPageProgress = Lastar opp { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importerer… -verifyingFile = Stadfestar… encryptingFile = Krypterer… decryptingFile = Dekrypterer... -notifyUploadDone = Opplastinga di er ferdig. -uploadingPageMessage = Når filopplastinga di er ferdig, kan du spesifisere utgått-alternativ. -uploadingPageCancel = Avbryt opplasting -uploadCancelNotification = Opplastinga di vart avbroten -uploadingPageLargeFileMessage = Denne fila er stor, og det kan ta litt tid å laste henne opp. Ver tolmodig! -uploadingFileNotification = Varsle meg når opplastinga er ferdig. -uploadSuccessConfirmHeader = Klår til å senda -uploadSvgAlt = Last opp -uploadSuccessTimingHeader = Lenka til fila di går ut etter 1 nedlasting eller om 24 timar. -expireInfo = Lenka til fila di vil gå ut etter { $downloadCount } eller { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 nedlasting *[other] { $num } nedlastingar } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 time *[other] { $num } timar } -copyUrlFormLabelWithName = Kopier og del lenka for å sende fila: { $filename } -copyUrlFormButton = Kopier til utklippstavla copiedUrl = Kopiert! -deleteFileButton = Slett fil -sendAnotherFileLink = Send ei anna fil -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Last ned -downloadsFileList = Nedlastingar -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tid -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Last ned { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Skriv inn passord unlockInputPlaceholder = Passord unlockButtonLabel = Lås opp -downloadFileTitle = Last ned kryptert fil -// Firefox Send is a brand name and should not be localized. -downloadMessage = Vennen din sender deg eni fil med Firefox Send, ei teneste som lar deg dele filer med ei sikker, privat og kryptert lenke, som automatisk går ut, for å sikre at ting ikkje vert verande på nettet for alltid. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Last ned -downloadNotification = Nedlastinga er fullført. downloadFinish = Nedlastinga er fullført. -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } av { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Prøv Firefox Send -downloadingPageProgress = Lastar ned { $filename } ({ $size }) -downloadingPageMessage = La denne fana vere open mens vi hentar filen og dekrypterar henne. -errorAltText = Opplastingsfeil +sendYourFilesLink = Prøv Send errorPageHeader = Noko gjekk gale! -errorPageMessage = Dett oppstod ein feil under opplasting av fila. -errorPageLink = Send ei anna fil fileTooBig = Fila er for stor, og kan ikkje lastast opp. Ho må vere mindre enn { $size }. linkExpiredAlt = Lenka har gått ut -expiredPageHeader = Denne lenka har gått ut eller har aldri eksistert i utgangspunktet! notSupportedHeader = Nettlesaren din er ikkje støtta. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Diverre støttar denne nettlesaren ikkje webteknologien som driv Firefox Send. Du må prøve ein annan nettleser. Vi tilrår Firefox! notSupportedLink = Kvifor er ikkje nettlesaren min støtta? -notSupportedOutdatedDetail = Dessverre støttar ikkje denne versjonen av Firefox nett-teknologien som driv Firefox Send. Du må å oppdatere nettlesaren din. +notSupportedOutdatedDetail = Dessverre støttar ikkje denne versjonen av Firefox nett-teknologien som driv Send. Du må å oppdatere nettlesaren din. updateFirefox = Oppdater Firefox -downloadFirefoxButtonSub = Gratis nedlasting -uploadedFile = Fil -copyFileList = Kopier URL -// expiryFileList is used as a column header -expiryFileList = Går ut om -deleteFileList = Slett -nevermindButton = Gløym det -legalHeader = Vilkår og personvern -legalNoticeTestPilot = Firefox Send er for tida eit Test Pilot-eksperiment, og er underlagt tenestevilkåra og personvernvilkåra til Test Pilot. Du kan lære meir om dette eksperimentet og datainnsamlinga her. -legalNoticeMozilla = Bruk av Firefox Send-nettsida er også underlagt Mozillas personvernvilkår for nettsider og brukarvilkår for nettsider. -deletePopupText = Slette denne fila? -deletePopupYes = Ja deletePopupCancel = Avbryt deleteButtonHover = Slett -copyUrlHover = Kopier URL footerLinkLegal = Juridisk informasjon -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Om Test Pilot footerLinkPrivacy = Personvern -footerLinkTerms = Vilkår footerLinkCookies = Infokapslar -requirePasswordCheckbox = Krev eit passord for å laste ned denne fila -addPasswordButton = Legg til passord -changePasswordButton = Endre passwordTryAgain = Feil passord. Prøv på nytt. -// This label is followed by the password needed to download a file -passwordResult = Passord: { $password } -reportIPInfringement = Rapporter brot på åndsverk +javascriptRequired = Send krev JavaScript. +whyJavascript = Kvifor krev Send JavaScript? +enableJavascript = Slå på JavaScript og prøv igjen. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }t { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum passordlengde: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Dette passordet kunne ikkje stillast inn + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildeling +introDescription = { -send-brand } lèt deg dele filer via ei tidsavgrensa lenke med ende-til-ende-kryptering. På den måten kan du dele filer privat og samstundes vere trygg på at det ikkje ligg på nettet for alltid. +notifyUploadEncryptDone = Fila di er kryptert og klar til å bli sendt +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Går ut etter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutt + *[other] { $num } minutt + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dagar + } +timespanWeeks = + { $num -> + [one] 1 veke + *[other] { $num } veker + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total storleik: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopier lenka for å dele fila di: +copyLinkButton = Kopier lenke +downloadTitle = Last ned filer +downloadDescription = Denne fila vart delt via { -send-brand }, med ende-til-ende-kryptering, og ei lenke som automatisk går ut. +trySendDescription = Prøv { -send-brand } for enkel og sikker fildeling. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Berre 1 fil kan lastast opp om gongen. + *[other] Berre { $count } filer kan lastast opp om gongen. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Berre 1 arkiv er lov. + *[other] Berre { $count } arkiv er lov. + } +expiredTitle = Denne lenka har gått ut. +notSupportedDescription = { -send-brand } fungerer ikkje med denne nettlesaren. { -send-short-brand } fungerer best med siste versjon av { -firefox } og med dei fleste andre nye nettlesarar. +downloadFirefox = Last ned { -firefox } +legalTitle = { -send-short-brand }, om personvernpraksis +legalDateStamp = Versjon 1.0, datert den 12 mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m +addFilesButton = Vel filer som skal lastast opp +trustWarningMessage = Forsikre deg om at du stolar på mottakaren din når du deler sensitive data. +uploadButton = Last opp +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dra og slepp filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klikk for å sende filer på opptil { $size } +addPassword = Vern med passord +emailPlaceholder = Skriv inn e-postadressa di +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logg inn for å sende filer på opptil { $size } +signInOnlyButton = Logg inn +accountBenefitTitle = Lag ein { -firefox }-konto eller logg inn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Del filer på opptil { $size } +accountBenefitDownloadCount = Del filer med fleire personar +accountBenefitTimeLimit = + { $count -> + [one] Hald lenka aktiv opptil 1 dag + *[other] Hald lenker aktive opptil { $count } dagar + } +accountBenefitSync = Handter delte filer frå kva som helst eining +accountBenefitMoz = Les om andre { -mozilla }-tenster +signOut = Logg ut +okButton = OK +downloadingTitle = Lastar ned +noStreamsWarning = Denne nettlesaren kan kanskje ikkje dekryptere ei så stor fil. +noStreamsOptionCopy = Kopier lenka for å opne henne i ein annan nettlesar +noStreamsOptionFirefox = Prøv favorittnettlesaren vår +noStreamsOptionDownload = Fortset med denne nettlesaren +downloadFirefoxPromo = { -send-short-brand } vert presentert for deg av den heilt nye { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Del lenka til fila di: +shareLinkButton = Del lenke +# $name is the name of the file +shareMessage = Last ned "{ $name }" med { -send-brand }: enkel, trygg fildelning +trailheadPromo = Det finst ein måte å ta vare på personvernet ditt. Ver med Firefox på ferda. +learnMore = Les meir. +downloadFlagged = Denne koplinga er deaktivert på grunn av brot på vilkåra for tenesta. +downloadConfirmTitle = Ein ting til +downloadConfirmDescription = Forsikre deg om at du stolar på personen som sende deg denne fila fordi, vi ikkje kan stadfeste at ho ikkje vil skade eininga di. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Eg stolar på personen som sende denne fila + *[other] Eg stolar på personen som sende desse filene + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Rapporter denne fila som mistenkjeleg + *[other] Rapporter desse filene som mistenkjelege + } +reportDescription = Hjelp oss å forstå kva som skjer. Kva trur du er gale med desse filene? +reportUnknownDescription = Gå til lenkeadressa du ønskjer å rapportere, og klikk «{ reportFile }». +reportButton = Rapporter +reportReasonMalware = Desse filene inneheld skadeleg programvare eller er del av eit nettfiskingsangrep (phishing-angrep). +reportReasonPii = Desse filene inneheld personleg identifiserbar informasjon om meg. +reportReasonAbuse = Desse filene inneheld ulovleg eller valdeleg innhald. +reportReasonCopyright = For å rapportere brot på opphavsrett eller varemerke, bruk prosessen som er beskriven på denne sida. +reportedTitle = Rapporterte filer +reportedDescription = Takk skal du ha. Vi har fått rapporten din om desse filene. diff --git a/public/locales/oc/send.ftl b/public/locales/oc/send.ftl new file mode 100644 index 000000000..a6e4f94e5 --- /dev/null +++ b/public/locales/oc/send.ftl @@ -0,0 +1,185 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Importacion… +encryptingFile = Chiframent… +decryptingFile = Deschiframent… +downloadCount = + { $num -> + [one] 1 telecargament + *[other] { $num } telecargaments + } +timespanHours = + { $num -> + [one] 1 ora + *[other] { $num } oras + } +copiedUrl = Copiat ! +unlockInputPlaceholder = Senhal +unlockButtonLabel = Desverrolhar +downloadButtonLabel = Telecargar +downloadFinish = Telecargament acabat +fileSizeProgress = ({ $partialSize } sus { $totalSize }) +sendYourFilesLink = Ensajar Send +errorPageHeader = I a quicòm que truca. +fileTooBig = Aqueste fichièr es tròp gròs per l’enviar. Sa talha deu èsser inferiora a { $size }. +linkExpiredAlt = Lo ligam a expirat +notSupportedHeader = Vòstre navegador es pas compatible. +notSupportedLink = Perqué mon navegador es pas compatible ? +notSupportedOutdatedDetail = Aquesta version de Firefox es pas compatibla amb la tecnologia web amb la quala fonciona Send. Vos cal metre a jorn lo navegador. +updateFirefox = Metre a jorn Firefox +deletePopupCancel = Anullar +deleteButtonHover = Suprimir +footerLinkLegal = Mencions legalas +footerLinkPrivacy = Vida privada +footerLinkCookies = Cookies +passwordTryAgain = Senhal incorrècte. Tornatz ensajar. +javascriptRequired = Send requesís JavaScript +whyJavascript = Perque Send requesís JavaScript ? +enableJavascript = Volgatz activar lo JavaScript e ensajatz tornamai. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } h { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Talha maximala del senhal : { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Aqueste senhal a pas pogut èsser definit + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partatge simple e privat de fichièrs +introDescription = { -send-brand } vos permet de partejar de fichièr amb un chiframent del cap a la fin e un ligam qu’expira automaticament. Atal podètz gardar privat çò que partejatz e vos assegurar que demorarà pas en linha per totjorn. +notifyUploadEncryptDone = Vòstre fichièr es chifrat e prèst per mandadís +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira aprèp { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuta + *[other] { $num } minutas + } +timespanDays = + { $num -> + [one] 1 jorn + *[other] { $num } jorns + } +timespanWeeks = + { $num -> + [one] 1 setmana + *[other] { $num } setmanas + } +fileCount = + { $num -> + [one] 1 fichièr + *[other] { $num } fichièrs + } +# byte abbreviation +bytes = o +# kibibyte abbreviation +kb = Ko +# mebibyte abbreviation +mb = Mo +# gibibyte abbreviation +gb = Go +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Talha totala : { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiatz lo ligam per partejar vòstre fichièr : +copyLinkButton = Copiar lo ligam +downloadTitle = Telecargar los fichièrs +downloadDescription = Aqueste fichièr foguèt partejat via { -send-brand } amb chiframent del cap a la fin e un ligam qu’expira automaticament. +trySendDescription = Ensajatz { -send-brand } per un partiment de fichièrs simple e segur. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Òm pòt pas qu’enviar 1 fichièr al còp. + *[other] Òm pòt pas qu’enviar { $count } fichièrs al còp. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Pas qu’un archiu es autorizat. + *[other] Pas que { $count } archius son autorizats. + } +expiredTitle = Aqueste ligam a expirat. +notSupportedDescription = { -send-brand } foncionarà pas amb aqueste navegador. { -send-short-brand } fonciona melhor amb la darrièra version de { -firefox } e foncionarà amb la version mai recenta de la màger part dels navegadors. +downloadFirefox = Telecargar { -firefox } +legalTitle = Avís de confidencialitat de { -send-short-brand } +legalDateStamp = Version 1.0 del 12 de març de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } j { $hours } h { $minutes } min +addFilesButton = Seleccionatz los fichièrs de mandar +trustWarningMessage = Asseguratz-vos que vos fisatz del destinari quand partejatz de donadas confidencialas. +uploadButton = Enviar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Lisatz-depausatz de fichièrs +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = o clicatz per enviar fins a { $size } +addPassword = Protegir amb un senhal +emailPlaceholder = Picatz vòstra adreça electronica +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Connectatz-vos per enviar fins a { $size } +signInOnlyButton = Connexion +accountBenefitTitle = Creatz un compte { -firefox } o connectatz-vos +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partejatz de fichièrs fins a { $size } +accountBenefitDownloadCount = Partejatz de fichièrs amb mai de personas +accountBenefitTimeLimit = + { $count -> + [one] Mantenètz los ligams actius fins a 1 jorn + *[other] Mantenètz los ligams actius fins a { $count } jorns + } +accountBenefitSync = Gerissètz los fichièrs partejats de qualque siá periferic estant +accountBenefitMoz = Aprenètz-ne mai suls autres servicis { -mozilla } +signOut = Desconnexion +okButton = D'acòrd +downloadingTitle = Telecargament +noStreamsWarning = Pòt arribar qu’aqueste navegador pòsca pas deschifrar un fichièr tan gròs. +noStreamsOptionCopy = Copiatz lo ligam per lo dobrir dins un autre navegador +noStreamsOptionFirefox = Ensajatz nòstre navegador preferit +noStreamsOptionDownload = Contunhar amb aqueste navegador +downloadFirefoxPromo = Lo nòu { -firefox } vos provesís { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Partejatz lo ligam cap a vòstre fichièr : +shareLinkButton = Partejar lo ligam +# $name is the name of the file +shareMessage = Telecargar « { $name } » amb { -send-brand } : un biais simple e segur de partejar de fichièrs. +trailheadPromo = Existís un biais de protegir vòstra vida privada. Rejonhètz Firefox. +learnMore = Ne saber mai. +downloadFlagged = Aqueste ligam foguèt desactivat a causa d’una infraccions a las condicions d’utilizacion. +downloadConfirmTitle = Un quicomet mai +downloadConfirmDescription = Asseguratz-vos que la persona que vos mandèt aqueste fichièr perque podèm pas verificar qu’es pas malfasent per vòstre periferic +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Me fisi de la persona que me mandèt lo fichièr + *[other] Me fisi de la persona que me mandèt los fichièrs + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Senhalar aqueste fichièr coma suspècte + *[other] Senhalar aquestes fichièrs coma suspèctes + } +reportDescription = Ajudatz-nos a comprendre qué passa. Qué vos fa pensar que quicòm truca amb aquestes fichièrs ? +reportUnknownDescription = Anatz a l’URL del ligam que volètz senhalar e clicatz « { reportFile } ». +reportButton = Senhalar +reportReasonMalware = Aquestes fichièrs contenon de logicials malvolents o forman part d’un atac de pesca electronica. +reportReasonPii = Aquestes fichièrs contenon d’informacions d’identificacion personala que me concernisson. +reportReasonAbuse = Aquestes fichièrs contenon de contengut illegal o abusiu. +reportReasonCopyright = Per senhalar una violacion de drech d’autor o de marca, seguissètz la procedura descricha sus aquesta pagina. +reportedTitle = Fichièrs senhalats +reportedDescription = Mercés. Avèm recebut vòstre senhalament d’aquestes fichièrs. diff --git a/public/locales/pa-IN/send.ftl b/public/locales/pa-IN/send.ftl new file mode 100644 index 000000000..e7aac9695 --- /dev/null +++ b/public/locales/pa-IN/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = ...ਦਰਾਮਦ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +encryptingFile = ...ਇੰਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +decryptingFile = ...ਡਿਕ੍ਰਿਪਟ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +downloadCount = + { $num -> + [one] 1 ਡਾਊਨਲੋਡ + *[other] { $num } ਡਾਊਨਲੋਡ + } +timespanHours = + { $num -> + [one] 1 ਘੰਟਾ + *[other] { $num } ਘੰਟੇ + } +copiedUrl = ਨਕਲ ਕੀਤਾ! +unlockInputPlaceholder = ਪਾਸਵਰਡ +unlockButtonLabel = ਅਣ-ਲਾਕ ਕਰੋ +downloadButtonLabel = ਡਾਊਨਲੋਡ ਕਰੋ +downloadFinish = ਡਾਊਨਲੋਡ ਪੂਰਾ ਹੋਇਆ +fileSizeProgress = ({ $totalSize } ਵਿੱਚੋਂ { $partialSize }) +sendYourFilesLink = Send ਵਰਤੋ +errorPageHeader = ਕੁਝ ਗਲਤ ਵਾਪਰਿਆ! +fileTooBig = ਇਹ ਫਾਇਲ ਅੱਪਲੋਡ ਕਰਨ ਲਈ ਬਹੁਤ ਵੱਡੀ ਹੈ। ਇਸ { $size } ਤੋਂ ਘੱਟ ਚਾਹੀਦੀ ਹੈ +linkExpiredAlt = ਲਿੰਕ ਦੀ ਮਿਆਦ ਪੁੱਗੀ +notSupportedHeader = ਤੁਹਾਡਾ ਬਰਾਊਜ਼ਰ ਸਹਾਇਕ ਨਹੀਂ ਹੈ। +notSupportedLink = ਮੇਰਾ ਬਰਾਊਜ਼ਰ ਸਹਾਇਕ ਕਿਉ ਨਹੀਂ ਹੈ? +notSupportedOutdatedDetail = ਅਫ਼ਸੋਸ ਹੈ ਕਿ ਫਾਇਰਫਾਕਸ ਦਾ ਇਹ ਵਰਜ਼ਨ ਵੈੱਬ ਤਕਨਾਲੋਜੀ ਲਈ ਸਹਾਇਕ ਨਹੀਂ ਹੈ, ਜੋ ਕਿ Send ਨੂੰ ਬਣਾਉਂਦੀਆਂ ਹਨ। ਤੁਹਾਨੂੰ ਆਪਣੇ ਬਰਾਊਜ਼ਰ ਨੂੰ ਅੱਪਡੇਟ ਕਰਨ ਦੀ ਲੋੜ ਹੋਵੇਗੀ। +updateFirefox = ਫਾਇਰਫਾਕਸ ਅੱਪਡੇਟ ਕਰੋ +deletePopupCancel = ਰੱਦ ਕਰੋ +deleteButtonHover = ਹਟਾਓ +footerLinkLegal = ਕਨੂੰਨ +footerLinkPrivacy = ਪਰਦੇਦਾਰੀ +footerLinkCookies = ਕੂਕੀਜ਼ +passwordTryAgain = ਗਲਤ ਪਾਸਵਰਡ ਹੈ। ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +javascriptRequired = Send ਲਈ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਚਾਹੀਦੀ ਹੈ +whyJavascript = Send ਨੂੰ ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਦੀ ਲੋੜ ਕਿਓ ਹੈ? +enableJavascript = ਜਾਵਾ-ਸਕ੍ਰਿਪਟ ਸਮਰੱਥ ਕਰੋ ਤੇ ਮੁੜ ਕੋਸ਼ਿਸ਼ ਕਰੋ। +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ਘੰ { $minutes }ਮਿੰ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ਮਿੰ +# A short status message shown when the user enters a long password +maxPasswordLength = ਵੱਧ ਤੋਂ ਵੱਧ ਪਾਸਵਰਡ ਦੀ ਲੰਬਾਈ: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ਇਹ ਪਾਸਵਰਡ ਸੈੱਟ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਿਆ + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = ਭੇਜੋ +-firefox = ਫਾਇਰਫਾਕਸ +-mozilla = ਮੋਜ਼ੀਲਾ +introTitle = ਸੌਖਾ, ਪ੍ਰਾਈਵੇਟ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ +introDescription = { -send-brand } ਤੁਹਾਨੂੰ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਸ਼ਨ ਨਾਲ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨ ਦਿੰਦਾ ਹੈ ਅਤੇ ਲਿੰਕ ਦੀ ਮਿਆਦ ਆਪਣੇ ਆਪ ਪੁੱਗ ਜਾਂਦੀ ਹੈ। ਇਸ ਕਰਕੇ ਤੁਸੀਂ ਤੁਹਾਡੇ ਵਲੋਂ ਸਾਂਝੇ ਕੀਤੇ ਨੂੰ ਨਿੱਜੀ ਬਣਾਈ ਰੱਖਦੇ ਹੋ ਅਤੇ ਪੱਕਾ ਕਰਦੇ ਹੋ ਕਿ ਤੁਹਾਡਾ ਸਾਮਾਨ ਹਮੇਸ਼ਾਂ ਆਨਲਾਈਨ ਨਹੀਂ ਰਹਿੰਦਾ ਹੈ। +notifyUploadEncryptDone = ਤੁਹਾਡਾ ਫਾਇਲ ਇੰਕ੍ਰਿਪਟ ਕੀਤੀ ਗਈ ਤੇ ਭੇਜਣ ਲਈ ਤਿਆਰ ਹੈ +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } ਜਾਂ { $timespan } ਦੇ ਬਾਅਦ ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ +timespanMinutes = + { $num -> + [one] 1 ਮਿੰਟ + *[other] { $num } ਮਿੰਟ + } +timespanDays = + { $num -> + [one] 1 ਦਿਨ + *[other] { $num } ਦਿਨ + } +timespanWeeks = + { $num -> + [one] 1 ਹਫ਼ਤਾ + *[other] { $num } ਹਫ਼ਤੇ + } +fileCount = + { $num -> + [one] 1 ਫ਼ਾਇਲ + *[other] { $num } ਫ਼ਾਇਲ + } +# byte abbreviation +bytes = ਬਾਈਟ +# kibibyte abbreviation +kb = ਕਿਲੋਬਾਈਟ +# mebibyte abbreviation +mb = ਮੈਗਾਬਾਈਟ +# gibibyte abbreviation +gb = ਗੀਗਾਬਾਈਟ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ਕੁੱਲ ਆਕਾਰ: { $size } +# the next line after the colon contains a file name +copyLinkDescription = ਆਪਣੀ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨ ਲਈ ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ: +copyLinkButton = ਲਿੰਕ ਕਾਪੀ ਕਰੋ +downloadTitle = ਫਾਇਲਾਂ ਡਾਊਨਲੋਡ ਕਰੋ +downloadDescription = ਇਹ ਫਾਇਲ ਨੂੰ ਸਿਰੇ-ਤੋਂ-ਸਿਰੇ ਤੱਕ ਇੰਕ੍ਰਿਪਟ ਕਰਕੇ { -send-brand } ਸਾਂਝਾ ਕੀਤਾ ਗਿਆ ਸੀ ਅਤੇ ਲਿੰਕ ਆਪਣੇ-ਆਪ ਮਿਆਦ ਪੁੱਗਦੀ ਹੈ। +trySendDescription = ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰਨ ਲਈ { -send-brand } ਵਰਤ ਕੇ ਵੇਕੋ। +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ਇੱਕ ਵੇਲੇ ਸਿਰਫ਼ 1 ਫਾਇਲ ਹੀ ਅੱਪਲੋਡ ਕੀਤੀ ਜਾ ਸਕਦੀ ਹੈ। + *[other] ਇੱਕ ਵੇਲੇ ਸਿਰਫ਼ { $count } ਫਾਇਲਾਂ ਨੂੰ ਅੱਪਲੋਡ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] ਸਿਰਫ਼ 1 ਅਕਾਇਵ ਦੀ ਇਜਾਜ਼ਤ ਹੈ। + *[other] ਸਿਰਫ਼ { $count } ਅਕਾਇਵਾਂ ਦੀ ਇਜਾਜ਼ਤ ਹੈ। + } +expiredTitle = ਇਹ ਲਿੰਕ ਦੀ ਮਿਆਦ ਪੁੱਗੀ ਹੈ। +notSupportedDescription = { -send-brand } ਇਸ ਬਰਾਊਜ਼ਰ ਨਾਲ ਕੰਮ ਨਹੀਂ ਕਰਦਾ ਹੈ। { -send-short-brand } { -firefox } ਦੇ ਨਵੇਂ ਵਰਜ਼ਨ ਨਾਲ ਸਭ ਤੋਂ ਵਧੀਆ ਕੰਮ ਕਰਦਾ ਹੈ ਅਤੇ ਬਹੁਤੇ ਬਰਾਊਜ਼ਰ ਦੇ ਮੌਜੂਦਾ ਵਰਜ਼ਨ ਨਾਲ ਕੰਮ ਕਰਦਾ ਹੈ। +downloadFirefox = { -firefox } ਡਾਊਨਲੋਡ ਕਰੋ +legalTitle = { -send-short-brand } ਪਰਦੇਦਾਰੀ ਸੂਚਨਾ +legalDateStamp = ਵਰਜ਼ਨ 1.0, ਮਿਤੀ 12 ਮਾਰਚ 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ਦਿਨ { $hours } ਘੰ { $minutes } ਮਿੰ +addFilesButton = ਚੁਣੀਆਂ ਫਾਇਲਾਂ ਅੱਪਲੋਡ ਕਰੋ +uploadButton = ਅੱਪਲੋਡ ਕਰੋ +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ਫਾਇਲਾਂ ਖਿੱਚੋ ਅਤੇ ਸੁੱਟੋ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ਜਾਂ { $size } ਤੱਕ ਭੇਜਣ ਲਈ ਕਲਿੱਕ ਕਰੋ +addPassword = ਪਾਸਵਰਡ ਨਾਲ ਸੁਰੱਖਿਅਤ ਕਰੋ +emailPlaceholder = ਆਪਣੀ ਈਮੇਲ ਦਿਓ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size } ਤੱਕ ਭੇਜਣ ਲਈ ਸਾਇਨ ਅੱਪ ਕਰੋ +signInOnlyButton = ਸਾਇਨ ਇਨ +accountBenefitTitle = { -firefox } ਖਾਤਾ ਬਣਾਓ ਜਾਂ ਸਾਇਨ ਕਰੋ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } ਤੱਕ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰੋ +accountBenefitDownloadCount = ਹੋਰ ਲੋਕਾਂ ਨਾਲ ਫਾਇਲਾਂ ਸਾਂਝੀਆਂ ਕਰੋ +accountBenefitTimeLimit = + { $count -> + [one] ਲਿੰਕਾਂ ਨੂੰ 1 ਦਿਨ ਲਈ ਸਰਗਰਮ ਰੱਖੋ + *[other] ਲਿੰਕਾਂ ਨੂੰ { $count } ਦਿਨਾਂ ਲਈ ਸਰਗਰਮ ਰੱਖੋ + } +accountBenefitSync = ਕਿਸੇ ਵੀ ਡਿਵਾਇਸ ਤੋਂ ਸਾਂਝੀਆਂ ਕੀਤੀਆਂ ਫਾਇਲਾਂ ਦਾ ਬੰਦੋਬਸਤ ਕਰੋ +accountBenefitMoz = ਹੋਰ { -mozilla } ਸੇਵਾਵਾਂ ਬਾਰੇ ਜਾਣੋ +signOut = ਸਾਈਨ ਆਉਟ +okButton = ਠੀਕ ਹੈ +downloadingTitle = ਡਾਊਨਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ +noStreamsWarning = ਇਹ ਬਰਾਊਜ਼ਰ ਨੂੰ ਇਸ ਵੱਡੀ ਫਾਇਲ ਨੂੰ ਡਿਕ੍ਰਿਪਟ ਕਰਨ ਲਈ ਸਮਰੱਥ ਨਹੀਂ ਹੋ ਸਕਦਾ ਹੈ। +noStreamsOptionCopy = ਹੋਰ ਬਰਾਊਜ਼ਰ ਵਿੱਚ ਖੋਲ੍ਹਣ ਲਈ ਲਿੰਕ ਨੂੰ ਕਾਪੀ ਕਰੋ +noStreamsOptionFirefox = ਸਾਡੇ ਮਨਪਸੰਦ ਬਰਾਊਜ਼ਰ ਵਰਤ ਕੇ ਵੇਖੋ +noStreamsOptionDownload = ਇਸ ਬਰਾਊਜ਼ਰ ਨਾਲ ਜਾਰੀ ਰੱਖੋ +downloadFirefoxPromo = { -send-short-brand } ਤੁਹਾਡੇ ਲਈ ਬਿਲਕੁਲ ਨਵਾਂ { -firefox } ਹੈ। +# the next line after the colon contains a file name +shareLinkDescription = ਆਪਣੀ ਫਾਇਲ ਲਈ ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ: +shareLinkButton = ਲਿੰਕ ਸਾਂਝਾ ਕਰੋ +# $name is the name of the file +shareMessage = { -send-brand } ਨਾਲ "{ $name }" ਡਾਊਨਲੋਡ ਕਰੋ: ਸੌਖਾ, ਸੁਰੱਖਿਅਤ ਫਾਇਲ ਸਾਂਝਾ ਕਰਨਾ +trailheadPromo = ਤੁਹਾਡੀ ਪਰਦੇਦਾਰੀ ਦੀ ਸੁਰੱਖਿਆ ਦਾ ਢੰਗ ਹੈ। ਫਾਇਰਫਾਕਸ ਨਾਲ ਜੁੜੋ। +learnMore = ਹੋਰ ਸਿੱਖੋ +downloadConfirmTitle = ਇੱਕ ਗੱਲ ਹੋਰ diff --git a/public/locales/pai/send.ftl b/public/locales/pai/send.ftl new file mode 100644 index 000000000..7d26f82ab --- /dev/null +++ b/public/locales/pai/send.ftl @@ -0,0 +1,4 @@ +siteFeedback = Tkweek uk kabyuwuha + +## Send version 2 strings + diff --git a/public/locales/pl/send.ftl b/public/locales/pl/send.ftl new file mode 100644 index 000000000..690e7544c --- /dev/null +++ b/public/locales/pl/send.ftl @@ -0,0 +1,196 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Importowanie… +encryptingFile = Szyfrowanie… +decryptingFile = Odszyfrowywanie… +downloadCount = + { $num -> + [one] 1 pobraniu + [few] { $num } pobraniach + *[many] { $num } pobraniach + } +timespanHours = + { $num -> + [one] godzinie + [few] { $num } godzinach + *[many] { $num } godzinach + } +copiedUrl = Skopiowano +unlockInputPlaceholder = Hasło +unlockButtonLabel = Odblokuj +downloadButtonLabel = Pobierz +downloadFinish = Ukończono pobieranie +fileSizeProgress = ({ $partialSize } z { $totalSize }) +sendYourFilesLink = Wypróbuj Send +errorPageHeader = Coś się nie udało. +fileTooBig = Ten plik jest za duży, aby go wysłać. Musi być mniejszy niż { $size } +linkExpiredAlt = Odnośnik wygasł +notSupportedHeader = Używana przeglądarka nie jest obsługiwana. +notSupportedLink = Dlaczego ta przeglądarka nie jest obsługiwana? +notSupportedOutdatedDetail = Ta wersja Firefoksa nie obsługuje technologii internetowej, która napędza Send. Należy uaktualnić przeglądarkę. +updateFirefox = Uaktualnij Firefoksa +deletePopupCancel = Anuluj +deleteButtonHover = Usuń +footerLinkLegal = Kwestie prawne +footerLinkPrivacy = Prywatność +footerLinkCookies = Ciasteczka +passwordTryAgain = Niepoprawne hasło. Spróbuj ponownie. +javascriptRequired = Send wymaga języka JavaScript +whyJavascript = Dlaczego Send wymaga języka JavaScript? +enableJavascript = Włącz obsługę języka JavaScript i spróbuj ponownie. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } godz. { $minutes } min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } min +# A short status message shown when the user enters a long password +maxPasswordLength = Maksymalna długość hasła: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Nie można ustawić tego hasła + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Proste, prywatne udostępnianie plików +introDescription = { -send-brand } umożliwia udostępnianie plików za pomocą szyfrowania typu „end-to-end” i odnośników, które automatycznie wygasają. Dzięki temu możesz mieć pewność, że to co udostępniasz jest bezpieczne i nie pozostanie w Internecie na zawsze. +notifyUploadEncryptDone = Plik jest zaszyfrowany i gotowy do wysłania +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Wygasa po { $downloadCount } lub { $timespan } +timespanMinutes = + { $num -> + [one] minucie + [few] { $num } minutach + *[many] { $num } minutach + } +timespanDays = + { $num -> + [one] dniu + [few] { $num } dniach + *[many] { $num } dniach + } +timespanWeeks = + { $num -> + [one] tygodniu + [few] { $num } tygodniach + *[many] { $num } tygodniach + } +fileCount = + { $num -> + [one] 1 plik + [few] { $num } pliki + *[many] { $num } plików + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Całkowity rozmiar: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Skopiuj odnośnik, aby udostępnić plik: +copyLinkButton = Kopiuj odnośnik +downloadTitle = Pobierz pliki +downloadDescription = Ten plik został udostępniony przez { -send-brand } za pomocą szyfrowania typu „end-to-end” i odnośnika, który automatycznie wygasa. +trySendDescription = Wypróbuj { -send-brand }, aby prosto i bezpiecznie udostępniać pliki. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Jednocześnie można wysyłać tylko jeden plik. + [few] Jednocześnie można wysyłać tylko { $count } pliki. + *[many] Jednocześnie można wysyłać tylko { $count } plików. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Dozwolone jest tylko jedno archiwum. + [few] Dozwolone są tylko { $count } archiwa. + *[many] Dozwolonych jest tylko { $count } archiwów. + } +expiredTitle = Ten odnośnik wygasł. +notSupportedDescription = { -send-brand } nie będzie działać w tej przeglądarce. { -send-short-brand } najlepiej działa w najnowszej wersji przeglądarki { -firefox }, ale będzie działać także w aktualnych wersjach większości przeglądarek. +downloadFirefox = Pobierz przeglądarkę { -firefox } +legalTitle = Zasady ochrony prywatności serwisu { -send-short-brand } +legalDateStamp = Wersja 1.0 z 12 marca 2019 r. +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d. { $hours } godz. { $minutes } min +addFilesButton = Wybierz pliki do wysłania +trustWarningMessage = Upewnij się, że ufasz odbiorcy, kiedy udostępniasz prywatne dane. +uploadButton = Wyślij +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Przeciągnij pliki +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = lub kliknij, aby wysłać do { $size } +addPassword = Chroń hasłem +emailPlaceholder = Wpisz adres e-mail +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Zaloguj się, aby wysłać do { $size } +signInOnlyButton = Zaloguj się +accountBenefitTitle = Utwórz konto { -firefox } lub zaloguj się +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Udostępniaj pliki do { $size } +accountBenefitDownloadCount = Udostępniaj pliki większej liczbie osób +accountBenefitTimeLimit = + { $count -> + [one] Odnośniki aktywne przez jeden dzień + [few] Odnośniki aktywne przez { $count } dni + *[many] Odnośniki aktywne przez { $count } dni + } +accountBenefitSync = Zarządzaj udostępnionymi plikami z każdego urządzenia +accountBenefitMoz = Poznaj inne serwisy organizacji { -mozilla } +signOut = Wyloguj się +okButton = OK +downloadingTitle = Pobieranie +noStreamsWarning = Ta przeglądarka może nie być w stanie odszyfrować tak dużego pliku. +noStreamsOptionCopy = Skopiuj odnośnik, aby otworzyć w innej przeglądarce +noStreamsOptionFirefox = Wypróbuj naszą ulubioną przeglądarkę +noStreamsOptionDownload = Kontynuuj za pomocą tej przeglądarki +downloadFirefoxPromo = { -send-short-brand } jest oferowany przez zupełnie nową przeglądarkę { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Udostępnij odnośnik do pliku: +shareLinkButton = Udostępnij odnośnik +# $name is the name of the file +shareMessage = Pobierz „{ $name }” za pomocą { -send-brand }: prostego i bezpiecznego udostępniania plików +trailheadPromo = Jest sposób na ochronę swojej prywatności. Dołącz do Firefoksa. +learnMore = Więcej informacji. +downloadFlagged = Ten odnośnik został wyłączony z powodu naruszenia warunków korzystania z usługi. +downloadConfirmTitle = Jeszcze jedna rzecz +downloadConfirmDescription = Upewnij się, że ufasz osobie, która wysłała Ci ten plik, ponieważ nie możemy zweryfikować, czy nie spowoduje on uszkodzenia Twojego urządzenia. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Ufam osobie, która wysłała ten plik + [few] Ufam osobie, która wysłała te pliki + *[many] Ufam osobie, która wysłała te pliki + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Zgłoś ten plik jako podejrzany + [few] Zgłoś te pliki jako podejrzane + *[many] Zgłoś te pliki jako podejrzane + } +reportDescription = Pomóż nam zrozumieć, co się stało. Co według Ciebie jest nie tak z tymi plikami? +reportUnknownDescription = Przejdź do adresu odnośnika, który chcesz zgłosić, i kliknij „{ reportFile }”. +reportButton = Zgłoś +reportReasonMalware = Te pliki zawierają złośliwe oprogramowanie lub są częścią próby oszustwa. +reportReasonPii = Te pliki zawierają informacje umożliwiające identyfikację mojej osoby. +reportReasonAbuse = Te pliki zawierają nielegalne lub obraźliwe treści. +reportReasonCopyright = Aby zgłosić naruszenie praw autorskich lub znaków towarowych, skorzystaj z procedury opisanej na ten stronie. +reportedTitle = Pliki zostały zgłoszone +reportedDescription = Dziękujemy. Otrzymaliśmy Twoje zgłoszenie dotyczące tych plików. diff --git a/public/locales/ppl/send.ftl b/public/locales/ppl/send.ftl new file mode 100644 index 000000000..8e858d23d --- /dev/null +++ b/public/locales/ppl/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Shitechnawati +importingFile = Mukalaktia nemi… +encryptingFile = Tikichtakawiat tinemit… +decryptingFile = Tikichtakapuat tinemit… +downloadCount = + { $num -> + [one] temultijtuk + *[other] { $num } temultijtuk + } +timespanHours = + { $num -> + [one] oraj + *[other] { $num } oraj + } +copiedUrl = Muishkupintuk! +unlockInputPlaceholder = Ichtakatajkwilul +unlockButtonLabel = Shiktapua +downloadButtonLabel = Shiktemulti +downloadFinish = Senkiska mutemultij +fileSizeProgress = ({ $partialSize } ipal { $totalSize }) +sendYourFilesLink = Shikejeku Send +errorPageHeader = IJtakawtuk! +fileTooBig = Ini tajkwilul sujsul etek pal tiktejkultia. Ma nemi san { $size }. +linkExpiredAlt = Ne ilpika pulijtuk +notSupportedHeader = Te tikishmatit ne mutachialuni. +notSupportedLink = Taika te ankishmatit nutachialuni? +notSupportedOutdatedDetail = Ini tamakalis ipal Firefox tesu kimati ne tzawaltekitilis ne kiyulitia Send. Nemi pal tikyankwilia ne mutachialuni. +updateFirefox = Shikyankwili Firefox +deletePopupCancel = Shikilwi tesu +deleteButtonHover = Shikpulu +footerLinkLegal = Ipanpa ne tajtuli +footerLinkPrivacy = Teichtakayu +footerLinkCookies = Cookies +passwordTryAgain = Ne ichtakatajkwilul tesu yek. Shikejeku uksenpa. +javascriptRequired = Send muneki JavaScript +whyJavascript = Taika Send muneki JavaScript? +enableJavascript = Shichiwa ma JavaScript tekiti wan shikejeku uksenpa. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Ne iweyaka ne ichtakatajkwilul muneki: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Te tiweliket tiktaliat ini ichtakataketzalis + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Shiktitani +-firefox = Firefox +-mozilla = Mozilla +introTitle = Shikmajmaka se tajkwilul, te uij wan ichtaka +introDescription = { -send-brand } metzpalewia tikmajmaka se tajkwilul iwan taichtakawilis wan se ilpika puliwi nemanha. Yajika, tikpia muichtakayu pal tikmajmaka wan tesu naka senpa mutajtatka tik matapan. +notifyUploadEncryptDone = Ne archivoj nemi ichtakawijtuk wan weli tiktitania +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Puliwi kwak ajsi { $downloadCount } ush { $timespan } +timespanMinutes = + { $num -> + [one] { $num } minutoj + *[other] { $num } minutoj + } +timespanDays = + { $num -> + [one] { $num } tunal + *[other] { $num } tunal + } +timespanWeeks = + { $num -> + [one] { $num } semanaj + *[other] { $num } semanaj + } +fileCount = + { $num -> + [one] { $num } tajkwilul + *[other] { $num } tajkwilul + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Itamachiwka: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Shikishkupina ne ilpika pal tikmajmaka mutajkwilul: +copyLinkButton = Shikishkupina ne ilpika +downloadTitle = Shiktemulti tajkwilul +downloadDescription = Ini tajkwilul kiski itech { -send-brand } iwan taichtakawilis wan se ilpika ka puliwi nemanha. +trySendDescription = Shikejeku { -send-brand } wan shiktakuli ichtaka wan te uij. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Semaya se tajkwilul weli pal tiktejkultia sansepa. + *[other] Semaya { $count } tajkwilul weli pal tiktejkultia sansepa. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Semaya se amapial weli mutitania. + *[other] Semaya { $count } amapial weli mutitania. + } +expiredTitle = Ne ilpika puliwik. +notSupportedDescription = { -send-brand } tesu yawi tekiti iwan ini tachialuni. { -send-short-brand } tekiti sujsul yek iwan ne tipan tamakalis ipal { -firefox }, wan nusan iwan ne tipan tamakalis ipal miak tachialuni. +downloadFirefox = Shiktemulti { -firefox } +legalTitle = { -send-short-brand } Tanawatilis ipanpa teichtakayu +legalDateStamp = Tamakalis 1.0, tik marzoj 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } t { $hours } h { $minutes } m +addFilesButton = Shikpejpena ne tajkwilul pal tiktejkultia +uploadButton = Shiktejkulti +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Shiktilana wan shikmayawi ne tajkwilul +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = u shikpachu pal tiktitania { $size } +addPassword = Shiktajpia iwan ichtakatajkwilul +emailPlaceholder = Shiktali mutepusamaw +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Shiktali mutukay pal tiktitania { $size } +signInOnlyButton = Shiktali mutukay +accountBenefitTitle = Shikchiwa se mutapujka tik { -firefox } ush shiktali mutukay +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Shiktakuli tajtajkwilul ka { $size } +accountBenefitDownloadCount = Shiktakuli tajtajkwilul iwan seuk +accountBenefitTimeLimit = + { $count -> + [one] Shikpia ne ilpika tapujtuk 1 tunal + *[other] Shikpia ne ilpika tapujtuk { $count } tunal + } +accountBenefitSync = Shiktajpia ne tajkwilul takulijtuk ka kanaj +accountBenefitMoz = Shikmati ipanpa ukse { -mozilla } tayekultilis +signOut = Shikisa +okButton = Yek +downloadingTitle = Kitemultia nemi +noStreamsWarning = Ini tachialuni anka te weli kichtakapua ini tajkwilul wey. +noStreamsOptionCopy = Shikishkupina ne ilpika pal tiktapua tik ukse tachialuni +noStreamsOptionFirefox = Shikejeku ne tachialuni tikishwelitat +noStreamsOptionDownload = Ma ninemi senpa iwan ini tachialuni +downloadFirefoxPromo = Ne yankwik { -firefox } metzwikilia { -send-short-brand }. +# the next line after the colon contains a file name +shareLinkDescription = Shiktakuli ne ilpika ipal mutajkwilul: +shareLinkButton = Shiktakuli ne ilpika +# $name is the name of the file +shareMessage = Shiktemulti “{ $name }” iwan { -send-brand }: ichtaka wan te uij +trailheadPromo = Nemi ken pal tiktajpia ne muichtakayu. Shimuishtuka iwan Firefox. +learnMore = Shimumachti ukchupi. diff --git a/public/locales/pt-BR/send.ftl b/public/locales/pt-BR/send.ftl index 8815cf6f2..1892650cc 100644 --- a/public/locales/pt-BR/send.ftl +++ b/public/locales/pt-BR/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experimento web -siteFeedback = Opinião -uploadPageHeader = Compartilhamento de arquivos privados e criptografados -uploadPageExplainer = Envie arquivos por meio de um link seguro, privado e criptografado que expira automaticamente para garantir que as suas coisas não permaneçam on-line para sempre. -uploadPageLearnMore = Saiba mais -uploadPageDropMessage = Arraste o arquivo para cá para iniciar o envio -uploadPageSizeMessage = Para uma operação mais confiável, é melhor manter seu arquivo menor que 1GB -uploadPageBrowseButton = Selecione um arquivo em seu computador -uploadPageBrowseButton1 = Selecione um arquivo para carregar -uploadPageMultipleFilesAlert = Enviar múltiplos arquivos ou uma pasta ainda não é suportado. -uploadPageBrowseButtonTitle = Enviar arquivo -uploadingPageProgress = Enviando { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importando… -verifyingFile = Verificando… encryptingFile = Criptografando… decryptingFile = Descriptografando… -notifyUploadDone = Arquivo enviado. -uploadingPageMessage = Uma vez que seu arquivo seja enviado você poderá definir opções de expiração. -uploadingPageCancel = Cancelar envio -uploadCancelNotification = Você cancelou o envio. -uploadingPageLargeFileMessage = Esse arquivo é grande e pode demorar para ser enviado. Aguarde! -uploadingFileNotification = Me avise quando completar o envio. -uploadSuccessConfirmHeader = Pronto para enviar -uploadSvgAlt = Enviado -uploadSuccessTimingHeader = O link para o seu arquivo expirará após 1 download ou em 24 horas. -expireInfo = O link para o seu arquivo expirará após { $downloadCount } ou { $timepan }. -downloadCount = { $num -> - [one] 1 download - *[other] { $num } downloads +downloadCount = + { $num -> + [one] baixar 1 vez + *[other] baixar { $num } vezes } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hora *[other] { $num } horas } -copyUrlFormLabelWithName = Copie e compartilhe o link para enviar o seu arquivo: { $filename } -copyUrlFormButton = Copiar para área de transferência copiedUrl = Copiado! -deleteFileButton = Excluir arquivo -sendAnotherFileLink = Enviar outro arquivo -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Baixar -downloadsFileList = Downloads -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Hora -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Baixar { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Insira a senha unlockInputPlaceholder = Senha unlockButtonLabel = Desbloquear -downloadFileTitle = Baixar arquivo criptografado -// Firefox Send is a brand name and should not be localized. -downloadMessage = Seu amigo está te enviando um arquivo através do Firefox Send, um serviço que permite compartilhar arquivos com um link seguro, privado e criptografado que automaticamente expira para garantir que suas coisas não permaneçam on-line eternamente. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Baixar -downloadNotification = Seu download terminou. -downloadFinish = Download completo -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Download concluído fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Experimente o Firefox Send -downloadingPageProgress = Baixando { $filename } ({ $size }) -downloadingPageMessage = Por favor, deixe essa aba aberta enquanto buscamos seu arquivo e o descriptografamos. -errorAltText = Erro no envio +sendYourFilesLink = Experimente o Send errorPageHeader = Oops, ocorreu um erro! -errorPageMessage = Houve um erro ao enviar o arquivo. -errorPageLink = Enviar outro arquivo -fileTooBig = Esse arquivo é muito grande. Ele deve ser menor que { $size }. -linkExpiredAlt = Link expirou -expiredPageHeader = Esse link expirou, ou talvez nunca tenha existido! -notSupportedHeader = Seu navegador não tem suporte. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Infelizmente esse navegador não suporta a tecnologia utilizada pelo Firefox Send. Tente com outro navegador. Nós recomendamos o Firefox! ;-) +fileTooBig = Esse arquivo ou grupo de arquivos é grande demais para ser enviado. Deve ser menor que { $size }. +linkExpiredAlt = Link expirado +notSupportedHeader = Seu navegador não é suportado. notSupportedLink = Por que meu navegador não é suportado? -notSupportedOutdatedDetail = Infelizmente essa versão do Firefox não suporta a tecnologia web que faz o Firefox Send funcionar. Você precisa atualizar o seu navegador. +notSupportedOutdatedDetail = Infelizmente essa versão do Firefox não suporta a tecnologia web que faz o Send funcionar. Você precisa atualizar o seu navegador. updateFirefox = Atualizar o Firefox -downloadFirefoxButtonSub = Download gratuito -uploadedFile = Arquivo -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira em -deleteFileList = Excluir -nevermindButton = Esqueça -legalHeader = Termos e privacidade -legalNoticeTestPilot = Firefox Send é um experimento do Test Pilot, e sujeito aos Termos de Serviço e Políticas de Privacidade do Test Pilot. Você pode aprender mais sobre esse experimento e a coleta de dados aqui. -legalNoticeMozilla = O uso do site Firefox Send também está sujeito a Política de Privacidade e ao Termos de Uso de Sites da Mozilla. -deletePopupText = Excluir este arquivo? -deletePopupYes = Sim deletePopupCancel = Cancelar -deleteButtonHover = Excluir -copyUrlHover = Copiar URL +deleteButtonHover = Remover da lista footerLinkLegal = Jurídico -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Sobre o Test Pilot footerLinkPrivacy = Privacidade -footerLinkTerms = Termos footerLinkCookies = Cookies -requirePasswordCheckbox = Para baixar esse arquivo é necessário uma senha -addPasswordButton = Adicionar senha -changePasswordButton = Alterar passwordTryAgain = Senha incorreta. Tente novamente. -// This label is followed by the password needed to download a file -passwordResult = Senha: { $password } -reportIPInfringement = Reportar violação de IP -javascriptRequired = O Firefox Send requer JavaScript -whyJavascript = Por que o Firefox Send precisa do JavaScript? -enableJavascript = Habilite o JavaScript e tente novamente. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" -expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" -expiresMinutes = { $minutes }m +javascriptRequired = O Send requer JavaScript +whyJavascript = Por que o Send precisa do JavaScript? +enableJavascript = Ative o JavaScript e tente novamente. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }min +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }min +# A short status message shown when the user enters a long password +maxPasswordLength = Tamanho máximo da senha: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Essa senha não pôde ser definida + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Compartilhamento de arquivos fácil e privativo +introDescription = O { -send-brand } permite compartilhar arquivos com criptografia de ponta a ponta através de um link que expira automaticamente. Assim você pode proteger o que compartilha e ter certeza que suas coisas não ficarão online para sempre. +notifyUploadEncryptDone = Seu arquivo foi criptografado e está pronto para ser enviado +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira após { $downloadCount } ou { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 dia + *[other] { $num } dias + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 arquivo + *[other] { $num } arquivos + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamanho total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copie o link para compartilhar seu arquivo: +copyLinkButton = Copiar link +downloadTitle = Baixar arquivos +downloadDescription = Este arquivo foi compartilhado via { -send-brand } com criptografia de ponta a ponta e um link que expira automaticamente. +trySendDescription = Experimente o { -send-brand } para compartilhar arquivos com simplicidade e segurança. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Somente 1 arquivo pode ser enviado por vez. + *[other] Somente { $count } arquivos podem ser enviados por vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Só é permitido 1 pacote. + *[other] Só são permitidos { $count } pacotes. + } +expiredTitle = Este link expirou. +notSupportedDescription = O { -send-brand } não funciona com este navegador. O { -send-short-brand } funciona melhor com a versão mais recente do { -firefox } e funcionará com a versão atual da maioria dos navegadores. +downloadFirefox = Baixar o { -firefox } +legalTitle = Aviso de privacidade do { -send-short-brand } +legalDateStamp = Versão 1.0, de 12 de março de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selecionar arquivos para enviar +trustWarningMessage = Certifique-se de que confia no destinatário ao compartilhar dados sensíveis. +uploadButton = Enviar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arraste e solte arquivos aqui +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ou clique para enviar até { $size } +addPassword = Proteger com senha +emailPlaceholder = Informe seu e-mail +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Entre na sua conta para enviar até { $size } +signInOnlyButton = Entrar +accountBenefitTitle = Crie uma Conta { -firefox } ou entre se já tiver +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Compartilhe arquivos até { $size }. +accountBenefitDownloadCount = Compartilhe arquivos com mais pessoas. +accountBenefitTimeLimit = + { $count -> + [one] Mantenha links ativos por até 1 dia. + *[other] Mantenha links ativos por até { $count } dias. + } +accountBenefitSync = Gerencie arquivos compartilhados a partir de qualquer dispositivo. +accountBenefitMoz = Conheça outros serviços da { -mozilla }. +signOut = Sair +okButton = OK +downloadingTitle = Baixando +noStreamsWarning = Este navegador pode não conseguir descriptografar um arquivo tão grande. +noStreamsOptionCopy = Copiar o link para abrir em outro navegador +noStreamsOptionFirefox = Experimente nosso navegador preferido +noStreamsOptionDownload = Continuar com este navegador +downloadFirefoxPromo = O { -send-short-brand } é apresentado pelo novo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Compartilhe o link para o seu arquivo: +shareLinkButton = Compartilhar link +# $name is the name of the file +shareMessage = Baixe "{ $name }" com o { -send-brand }: compartilhamento de arquivos simples e seguro +trailheadPromo = Existe um meio de proteger sua privacidade. Use o Firefox. +learnMore = Saiba mais. +downloadFlagged = Este link foi desativado por violar os termos do serviço. +downloadConfirmTitle = Mais uma coisa +downloadConfirmDescription = Certifique-se de que confia na pessoa que enviou este arquivo, pois não podemos conferir se não prejudicará seu dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Eu confio na pessoa que enviou este arquivo + *[other] Eu confio na pessoa que enviou estes arquivos + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Denunciar este arquivo como suspeito + *[other] Denunciar estes arquivos como suspeitos + } +reportDescription = Ajude-nos a entender o que está acontecendo. O que você acha que há de errado com estes arquivos? +reportUnknownDescription = Acesse o endereço do link que deseja denunciar e clique em “{ reportFile }”. +reportButton = Denunciar +reportReasonMalware = Estes arquivos contêm malware (código malicioso) ou fazem parte de um ataque de phishing (fraude). +reportReasonPii = Estes arquivos contêm informações de identificação pessoal sobre mim. +reportReasonAbuse = Estes arquivos contêm conteúdo ilegal ou abusivo. +reportReasonCopyright = Para denunciar violação de direitos autorais ou de marca, siga o procedimento descrito nesta página. +reportedTitle = Arquivos denunciados +reportedDescription = Obrigado. Recebemos sua denúncia sobre estes arquivos. diff --git a/public/locales/pt-PT/send.ftl b/public/locales/pt-PT/send.ftl index 6948f9889..dc4f08408 100644 --- a/public/locales/pt-PT/send.ftl +++ b/public/locales/pt-PT/send.ftl @@ -1,112 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experiência web -siteFeedback = Feedback -uploadPageHeader = Partilha de ficheiros privada e encriptada -uploadPageExplainer = Envie ficheiros através de uma ligação segura, privada e encriptada que expira automaticamente para garantir que as suas coisas não fiquem online para sempre. -uploadPageLearnMore = Saber mais -uploadPageDropMessage = Largue o seu ficheiro aqui para começar a carregar -uploadPageSizeMessage = Para uma operação mais confiável, é melhor manter o seu ficheiro abaixo de 1GB -uploadPageBrowseButton = Selecionar um ficheiro no seu computador -uploadPageBrowseButton1 = Selecione um ficheiro a enviar -uploadPageMultipleFilesAlert = Carregar múltiplos ficheiros ou uma pasta não é atualmente suportado. -uploadPageBrowseButtonTitle = Carregar ficheiro -uploadingPageProgress = A carregar { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = A importar... -verifyingFile = A verificar... encryptingFile = A encriptar... decryptingFile = A desencriptar... -notifyUploadDone = O seu carregamento terminou. -uploadingPageMessage = Assim que o seu ficheiro carregar irá poder definir as opções de expiração. -uploadingPageCancel = Cancelar carregamento -uploadCancelNotification = O seu carregamento foi cancelado. -uploadingPageLargeFileMessage = Este ficheiro é grande e pode demorar um pouco a carregar. Fique onde está! -uploadingFileNotification = Notificar-me quando o carregamento estiver completo. -uploadSuccessConfirmHeader = Pronto para enviar -uploadSvgAlt = Carregar -uploadSuccessTimingHeader = A ligação para o seu ficheiro irá expirar depois de 1 transferência ou em 24 horas. -expireInfo = A ligação para o seu ficheiro irá expirar depois de { $downloadCount } or { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 transferência *[other] { $num } transferências } -timespanHours = 1 hora -copyUrlFormLabelWithName = Copie e partilhe a ligação para enviar o seu ficheiro: { $filename } -copyUrlFormButton = Copiar para a área de transferência +timespanHours = + { $num -> + [one] 1 hora + *[other] { $num } horas + } copiedUrl = Copiado! -deleteFileButton = Apagar ficheiro -sendAnotherFileLink = Enviar outro ficheiro -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Transferir -downloadsFileList = Transferências -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tempo -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Transferir { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Digitar palavra-passe unlockInputPlaceholder = Palavra-passe unlockButtonLabel = Desbloquear -downloadFileTitle = Transferir ficheiro encriptado -// Firefox Send is a brand name and should not be localized. -downloadMessage = O seu amigo está a enviar-lhe um ficheiro com o Firefox Send, um serviço que lhe permite partilhar ficheiro com uma ligação segura, privada e encriptada que expira automaticamente para garantir que as suas coisas não fiquem online para sempre. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Transferir -downloadNotification = A sua transferência foi concluída. downloadFinish = Transferência concluída -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } de { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Experimentar o Firefox Send -downloadingPageProgress = A transferir { $filename } ({ $size }) -downloadingPageMessage = Por favor deixe este separador aberto enquanto obtemos o seu ficheiro e o desencriptamos. -errorAltText = Erro ao carregar +sendYourFilesLink = Experimentar o Send errorPageHeader = Algo correu mal. -errorPageMessage = Houve um erro ao carregar o ficheiro. -errorPageLink = Enviar outro ficheiro fileTooBig = Esse ficheiro é muito grande para carregar. Deve ser menor do que { $size }. linkExpiredAlt = Ligação expirada -expiredPageHeader = Esta ligação expirou ou nunca existiu em primeiro lugar! notSupportedHeader = O seu navegador não é suportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Infelizmente este navegador não suporta a tecnologia web que faz o Firefox Send funcionar. Irá precisar de tentar outro navegador. Nós recomendamos o Firefox! notSupportedLink = Porque é que o meu navegador não é suportado? -notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Firefox Send funcionar. Precisa de atualizar o seu navegador. +notSupportedOutdatedDetail = Infelizmente esta versão do Firefox não suporta a tecnologia web que faz o Send funcionar. Precisa de atualizar o seu navegador. updateFirefox = Atualizar o Firefox -downloadFirefoxButtonSub = Transferência gratuita -uploadedFile = Ficheiro -copyFileList = Copiar URL -// expiryFileList is used as a column header -expiryFileList = Expira em -deleteFileList = Apagar -nevermindButton = Esquecer -legalHeader = Termos e privacidade -legalNoticeTestPilot = O Firefox Send é atualmente uma experiência do Test Pilot, e sujeita aos Termos de serviço e Aviso de privacidade do Test Pilot. Pode saber mais acerca desta experiência e a sua recolha de dados aqui. -legalNoticeMozilla = A utilização do website do Firefox Send está também sujeita ao Aviso de privacidade dos websites e Termos de utilização dos websites da Mozilla. -deletePopupText = Apagar este ficheiro? -deletePopupYes = Sim deletePopupCancel = Cancelar deleteButtonHover = Apagar -copyUrlHover = Copiar URL -footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Acerca do Test Pilot +footerLinkLegal = Informação legal footerLinkPrivacy = Privacidade -footerLinkTerms = Termos footerLinkCookies = Cookies -requirePasswordCheckbox = Requerer uma palavra-passe para transferir este ficheiro -addPasswordButton = Adicionar palavra-passe -changePasswordButton = Alterar passwordTryAgain = Palavra-passe incorreta. Tente novamente. -// This label is followed by the password needed to download a file -passwordResult = Palavra-passe: { $password } -reportIPInfringement = Reportar violação de PI -javascriptRequired = O Firefox Send requer JavaScript -whyJavascript = Porque é que o Firefox Send requer JavaScript? +javascriptRequired = O Send requer JavaScript +whyJavascript = Porque é que o Send requer JavaScript? enableJavascript = Por favor ative o JavaScript e tente novamente. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Comprimento máximo de palavra-passe: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Esta palavra-passe não pôde ser definida + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partilha de ficheiros simples e privada +introDescription = O { -send-brand } permite partilhar ficheiros com encriptação de ponta a ponta e uma ligação que expira automaticamente. Para que possa manter o que partilha privado e garantir que as suas coisas não fiquem online para sempre. +notifyUploadEncryptDone = O seu ficheiro está encriptado e pronto a enviar +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expira após { $downloadCount } ou { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } minutos + } +timespanDays = + { $num -> + [one] 1 dia + *[other] { $num } dias + } +timespanWeeks = + { $num -> + [one] 1 semana + *[other] { $num } semanas + } +fileCount = + { $num -> + [one] 1 ficheiro + *[other] { $num } ficheiros + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tamanho total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copie a ligação para partilhar o seu ficheiro: +copyLinkButton = Copiar ligação +downloadTitle = Transfira ficheiros +downloadDescription = Este ficheiro foi partilhado via { -send-brand } com encriptação de ponta a ponta e uma ligação que expira automaticamente. +trySendDescription = Experimente o { -send-brand } para uma partilha de ficheiros simples e segura. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Apenas 1 ficheiro pode ser carregado de cada vez. + *[other] Apenas { $count } ficheiros podem ser carregados de cada vez. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Apenas 1 ficheiro é permitido. + *[other] Apenas { $count } ficheiros são permitidos. + } +expiredTitle = Esta ligação expirou. +notSupportedDescription = O { -send-brand } não funciona com este navegador. O { -send-short-brand } funciona melhor com a versão mais recente do { -firefox } e irá funcionar com a versão atual da maioria dos navegadores. +downloadFirefox = Transferir o { -firefox } +legalTitle = Aviso de privacidade do { -send-short-brand } +legalDateStamp = Versão 1.0, de 12 de março de 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Selecionar ficheiros para carregar +trustWarningMessage = Tenha a certeza que confia no destinatário ao partilhar dados sensíveis. +uploadButton = Carregar +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Arraste e largue ficheiros +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ou clique para enviar até { $size } +addPassword = Proteger com palavra-passe +emailPlaceholder = Introduzir o seu email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Iniciar sessão para enviar até { $size } +signInOnlyButton = Iniciar sessão +accountBenefitTitle = Crie uma Conta { -firefox } ou inicie sessão +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partilhe ficheiros até { $size } +accountBenefitDownloadCount = Partilhe ficheiros com mais pessoas +accountBenefitTimeLimit = + { $count -> + [one] Mantenha ligações ativas até 1 dia + *[other] Mantenha ligações ativas até { $count } dias + } +accountBenefitSync = Gira ficheiros partilhas a partir de qualquer dispositivo +accountBenefitMoz = Saiba mais acerca de outros serviços da { -mozilla } +signOut = Terminar sessão +okButton = OK +downloadingTitle = A transferir +noStreamsWarning = Este navegador pode não conseguir desencriptar um ficheiro tão grande. +noStreamsOptionCopy = Copie a ligação para abrir noutro navegador +noStreamsOptionFirefox = Experimente o nosso navegador favorito +noStreamsOptionDownload = Continuar com este navegador +downloadFirefoxPromo = O { -send-short-brand } é trazido a si pelo novo { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Partilhe a ligação para o seu ficheiro: +shareLinkButton = Partilhar ligação +# $name is the name of the file +shareMessage = Transferir “{ $name }“ com o { -send-brand }: partilha de ficheiros simples e segura +trailheadPromo = Existe um modo para proteger a sua privacidade. Adira ao Firefox. +learnMore = Saiba mais. +downloadFlagged = Esta ligação foi desativada por violar os termos do serviço. +downloadConfirmTitle = Mais uma coisa +downloadConfirmDescription = Tenha a certeza que confia na pessoa que lhe enviou este ficheiro, pois não podemos garantir que o mesmo não irá danificar o seu dispositivo. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Eu confio na pessoa que enviou este ficheiro + *[other] Eu confio na pessoa que enviou estes ficheiros + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Denunciar este ficheiro como suspeito + *[other] Denunciar estes ficheiros como suspeitos + } +reportDescription = Ajude-nos a compreender o que está a acontecer. O que acha que está errado com estes ficheiros? +reportUnknownDescription = Por favor, aceda ao endereço da ligação que pretende denunciar e clique em “{ reportFile }”. +reportButton = Denunciar +reportReasonMalware = Estes ficheiros contêm software malicioso ou fazem parte de um ataque de phishing. +reportReasonPii = Estes ficheiros contêm dados pessoais sobre mim. +reportReasonAbuse = Estes ficheiros contêm conteúdo ilegal ou abusivo. +reportReasonCopyright = Para denunciar violação de direitos de autor ou de marca comercial, utilize o procedimento descrito nesta página. +reportedTitle = Ficheiros denunciados +reportedDescription = Obrigado. Recebemos a sua denúncia sobre estes ficheiros. diff --git a/public/locales/quc/send.ftl b/public/locales/quc/send.ftl new file mode 100644 index 000000000..badafac07 --- /dev/null +++ b/public/locales/quc/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Utzijoxik +importingFile = Ujek'ik… +encryptingFile = Uwiqik… +decryptingFile = Usolik… +downloadCount = + { $num -> + [one] 1 uqasaxik + *[other] { $num } taq uqasaxik + } +timespanHours = + { $num -> + [one] 1 ramaj + *[other] { $num } taq ramaj + } +copiedUrl = Copied! +unlockInputPlaceholder = Retokib'al +unlockButtonLabel = Utzoqopixik +downloadButtonLabel = Uqasaxik +downloadFinish = Tz'aqat uqasaxik +fileSizeProgress = ({ $partialSize } rech { $totalSize }) +sendYourFilesLink = Chak'amb'ejaj Send +errorPageHeader = K'o man utz ta xub'ano +fileTooBig = Le kemk'olib'al sib'alaj nim chech upaqab'isaxik. Rajawaxik nitz' chi uwach{ $size } +linkExpiredAlt = Xq'ax uq'ijol kemwiqb'al +notSupportedHeader = Man toq'am ta le anik'onel +notSupportedLink = ¿Jasche man toq'am ta le nunik'onel? +notSupportedOutdatedDetail = Chakuyu' we okib'al rech Firefox man kutoq'aj ta le k'ak'eta'm rech web' le kuya' uchuq'ab' Send. Rajawaxik kak'ak'arisaj le anik'onel. +updateFirefox = Chak'ak'arisaj Firefox +deletePopupCancel = Uq'atexik +deleteButtonHover = Uchupik +footerLinkLegal = Nim wuj +footerLinkPrivacy = Echeb'alil +footerLinkCookies = Cookies +passwordTryAgain = Man utz ta le retokib'al. Chab'ana' chi jumul. +javascriptRequired = Le Send kajawataj JavaScript chech +whyJavascript = ¿jasche kajawataj JavaScript chech Send? +enableJavascript = Chatzija' JavaScript k'ate k'u ri' chab'ana' chi jumul. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Nimalaj unimal retokib'al: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Man kkowimb'ex ta ujeqeb'axik le retokib'al + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Utaqik +-firefox = Firefox +-mozilla = Mozilla +introTitle = Man k'ax taj, ukomonexik taq kemk'olib'al pa echeb'alil +introDescription = { -send-brand } kuya' bé chi awech kakomonej taq kemk'olib'al ruk' wiqitajem chi'l jun kemwiqb'al le kq'ax uq'ijol pa utukelam. Are chi man katzaq ta le kakomone'j pa echeb'alil chi'l chasuk'ub'a' rilik chi le taq ajastaq man kk'oji' ta pa nimk'atz pa junelik. +notifyUploadEncryptDone = Le akemk'olib'al wiqitalik chi'l utz chi kataqo +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Kq'ax uq'ijol chi rij { $downloadCount } on { $timespan } +timespanMinutes = + { $num -> + [one] 1 kajb'al + *[other] { $num } taq kajb'al + } +timespanDays = + { $num -> + [one] 1 q'ij + *[other] { $num } taq q'ij + } +timespanWeeks = + { $num -> + [one] 1 wuqq'ij + *[other] { $num } taq wuqq'ij + } +fileCount = + { $num -> + [one] 1 kemk'olib'al + *[other] { $num } taq kemk'olib'al + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ronojel unimal: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Chawinaqirisaj uwach le kemwiqb'al chech ukomone'xik le akemk'olib'al: +copyLinkButton = Relesaxik uwach kemwiqb'al +downloadTitle = Uqasaxik taq kemwiqb'al +downloadDescription = We kemk'olib'al xkomone'x pa { -send-brand } ruk' wiqitajem pa xkut chi xkut chi'l jun kemwiqb'al le kq'ax uq'ijol pa utukelam. +trySendDescription = Chak'amb'ejaj { -send-brand } chech man k'ax taj, ukomonexik kemk'olib'al pa chajib'al. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Xa 1 kemk'olib'al kkowinb'ex upaqab'isaxik pa jun uq'ijol. + *[other] Xew { $count } taq kemk'olib'al kkowinb'ex upaqab'isaxik pa jun uq'ijol. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Xew 1 kemk'olib'al ya'om b'e chech. + *[other] Xew { $count } taq kemk'olib'al ya'om b'e chech + } +expiredTitle = Xq'ax uq'ijol we kemwiqb'al +notSupportedDescription = { -send-brand } man kchakun ta ruk' we nik'onel. { -send-short-brand } are qas utz uchakunem ruk' le maja naj okib'al rech { -firefox }, xuquje' kchakun ruk' le okib'al rech chanim rech nima ronojel taq nik'onelab'. +downloadFirefox = Uqasaxik { -firefox } +legalTitle = { -send-short-brand } ub'ixikil rech echeb'alil +legalDateStamp = Okib'al 1.0, uq'ijol rech urox ik' 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Ucha'ik taq kemk'olib'al chech upaqab'isaxik +uploadButton = Upaqab'isaxik +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Uchararexik chi'l utzoqopixik taq kemk'olib'al +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = on chapitz'a' chech utaqik chech { $size } +addPassword = Chajital rumal retokib'al +emailPlaceholder = Chach'apa' le ataqoqxa'nib'al +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Chamajij kemchak chech utaqik chech { $size } +signInOnlyButton = Chamajij kemchak +accountBenefitTitle = Chawinaqirisaj jun { -firefox } kemb'i'aj on chamajij kemchak +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Chakomone'j taq kemk'olib'al kq'ax pa uwi' { $size } +accountBenefitDownloadCount = Chakomone'j taq kemk'olib'al kuk' nik'aj chi winaq +accountBenefitTimeLimit = + { $count -> + [one] Chatzija' taq kemwiqb'al are chi kq'ax pa uwi' 1 q'ij + *[other] Chatzija' taq kemwiqb'al are chi kq'ax pa uwi' { $count } taq q'ij + } +accountBenefitSync = Chawilawachij komone'tal taq kemk'olib'al pa apachike wiqkemchakub'al +accountBenefitMoz = Chaweta'maj chi rij jun chi { -mozilla } taq patanib'al +signOut = Chatz'apij kemchak +okButton = Ja'e +downloadingTitle = Ktajin uqasaxik +noStreamsWarning = We nik'onel wene man kkowin taj kusol jun jewa' unimal kemk'olib'al +noStreamsOptionCopy = Chawelesaj uwach le kemwiqb'al chech ujaqik jun chi nik'onel +noStreamsOptionFirefox = Chak'amb'ejaj le ajawatal nik'onel +noStreamsOptionDownload = Chab'ana' na ruk' we nik'onel +downloadFirefoxPromo = { -send-short-brand } k'amom la chi awech rumal le k'ak' { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Chakomone'j le kemwiqb'al chech le akemk'olib'al: +shareLinkButton = Chakomone'j kemwiqb'al +# $name is the name of the file +shareMessage = Chaqasaj “{ $name }” ruk' { -send-brand }: man k'ax ta ub'anik, ukomone'xik kemk'olib'al pa chajib'al +trailheadPromo = K'o jun ub'e'al chech uchajixik le a'echeb'alil. Chat'iqa' awib' pa. Firefox. +learnMore = Chaweta'maj nik'aj chik diff --git a/public/locales/ro/send.ftl b/public/locales/ro/send.ftl index 2c0555df4..5cfa4b850 100644 --- a/public/locales/ro/send.ftl +++ b/public/locales/ro/send.ftl @@ -1,106 +1,196 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = un experiment web -siteFeedback = Feedback -uploadPageHeader = Partajare de fișiere privată și criptată -uploadPageExplainer = Trimite fișiere printr-un link sigur, privat și criptat care expiră automat pentru ca informațiile să rămână în siguranță. -uploadPageLearnMore = Află mai multe -uploadPageDropMessage = Aruncă fișierul aici pentru a începe încărcarea. -uploadPageSizeMessage = Pentru a lucra mai ușor, recomandăm să păstrezi fișierul sub 1GB -uploadPageBrowseButton = Alege un fișier din calculator. -uploadPageBrowseButton1 = Selectează un fișier pentru încărcare -uploadPageMultipleFilesAlert = Încărcarea mai multor fișiere deodată sau a dosarelor nu este suportată. -uploadPageBrowseButtonTitle = Încarcă fișier -uploadingPageProgress = Se încarcă { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Se importă… -verifyingFile = Se verifică... encryptingFile = Se criptează… decryptingFile = Se decriptează… -notifyUploadDone = Încărcarea s-a finalizat. -uploadingPageMessage = -uploadingPageCancel = Anulează încărcarea -uploadCancelNotification = Încărcarea a fost anulată. -uploadingPageLargeFileMessage = Stai calm! Acest fișier este mare. S-ar putea să dureze un timp încărcarea. -uploadingFileNotification = Notifică-mă când încărcarea este încheiată. -uploadSuccessConfirmHeader = Pregătit pentru trimitere -uploadSvgAlt = Încarcă -uploadSuccessTimingHeader = Linkul către fișierul tău va expira după 1 descărcare sau în 24 de ore. -expireInfo = Linkul la fișier va expira după { $downloadCount } sau { $timespan }. -downloadCount = -timespanHours = { $num -> +downloadCount = + { $num -> + [one] 1 descărcare + [few] { $num } descărcări + *[other] { $num } de descărcări + } +timespanHours = + { $num -> [one] 1 oră - [few] ore - *[other] de ore + [few] { $num } ore + *[other] { $num } de ore } -copyUrlFormLabelWithName = Copiază și împărtășește linkul de la fișierul de trimis: { $filename } -copyUrlFormButton = Copiază în clipboard copiedUrl = Copiat! -deleteFileButton = Șterge fișierul -sendAnotherFileLink = Trimite un alt fișier -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Descarcă -downloadsFileList = Descărcări -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Timp -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Descarcă { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Introdu parola unlockInputPlaceholder = Parolă unlockButtonLabel = Deblochează -downloadFileTitle = Descarcă fișierul criptat -// Firefox Send is a brand name and should not be localized. -downloadMessage = Un prieten îți trimite un fișier prin Firefox Send, un serviciu care îți permite să împărtășești un fișier printr-un link sigur, privat și criptat care expiră automat pentru a păstra informațiile tale online doar temporar. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Descarcă -downloadNotification = Descărcarea s-a încheiat. downloadFinish = Descărcare încheiată -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } din { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Încearcă Firefox Send -downloadingPageProgress = Se descarcă { $filename } ({ $size }) -downloadingPageMessage = Te rugăm să păstrezi această file deschisă în timp ce preluăm fișierul și îl decriptăm. -errorAltText = Eroare la încărcare -errorPageHeader = Ceva a mers prost! -errorPageMessage = A apărut o eroare la încărcarea fișierului. -errorPageLink = Trimite un alt fișier -fileTooBig = Acest fișier este prea mare. Trebuie să fie sub { $size }. +sendYourFilesLink = Încearcă Send +errorPageHeader = Ceva nu a funcționat! +fileTooBig = Acest fișier este prea mare. Ar trebuie să fie sub { $size }. linkExpiredAlt = Link expirat -expiredPageHeader = Acest link a expirat sau nu a existat de la bun început! notSupportedHeader = Browserul tău nu este suportat. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Din păcate acest browser nu suportă tehnologii web precum Firefox Send. Trebuie să încerci alt browser. Îți recomandăm Firefox! notSupportedLink = De ce browserul meu nu este suportat? -notSupportedOutdatedDetail = Din păcate această versiune de Firefox nu suportă tehnologiile web din spatele Firefox Sent. Îți recomandăm să actualizezi browserul. +notSupportedOutdatedDetail = Din păcate, această versiune de Firefox nu suportă tehnologiile web din spatele Send. Va trebui să actualizezi browserul. updateFirefox = Actualizează Firefox -downloadFirefoxButtonSub = Descărcare gratuită -uploadedFile = Fișier -copyFileList = Copiază URL-ul -// expiryFileList is used as a column header -expiryFileList = Expiră în -deleteFileList = Șterge -nevermindButton = Uită -legalHeader = Termeni de utilizare și politica de confidențialitate -legalNoticeTestPilot = Firefox Send este momentan un experiment Test Pilot și supus Termenilor de utilizare Test Pilot și a Politicii de confidențialitate. Poți afla mai multe despre acest experiment aici. -legalNoticeMozilla = Folosirea site-ului Firefox Send mai este supusă Politicii de confidențialitate pentru site-uri web și a Termenilor de folosire a site-urilor web. -deletePopupText = Ștergi aceast fișier? -deletePopupYes = Da deletePopupCancel = Renunță deleteButtonHover = Șterge -copyUrlHover = Copiază URL-ul footerLinkLegal = Mențiuni legale -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Despre Test Pilot footerLinkPrivacy = Confidențialitate -footerLinkTerms = Termeni footerLinkCookies = Cookie-uri -requirePasswordCheckbox = Este necesară o parolă pentru a descărca acest fișier -addPasswordButton = Adaugă parolă -changePasswordButton = Modifică -passwordTryAgain = Parola este incorectă. Încearcă din nou. -// This label is followed by the password needed to download a file -passwordResult = Parola: { $password } -reportIPInfringement = Raportează încălcarea proprietății intelectuale +passwordTryAgain = Parolă incorectă. Încearcă din nou. +javascriptRequired = Send necesită JavaScript +whyJavascript = De ce Send necesită JavaScript? +enableJavascript = Te rugăm să reactivezi JavaScript și să încerci din nou. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Lungime minimă a parolei: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Această parolă nu a putut fi setată + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Partajare de fișiere simplă și privată +introDescription = { -send-brand } îți permite să partajezi fișiere cu criptare capăt-la-capăt și un link care expiră automat. Deci, poți păstra confidențial ceea ce partajezi și te poți asigura că ce ai partajat nu rămâne online pentru totdeauna. +notifyUploadEncryptDone = Fișierul tău este criptat și gata de trimitere +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Expiră după { $downloadCount } sau { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + [few] { $num } minute + *[other] { $num } de minute + } +timespanDays = + { $num -> + [one] 1 zi + [few] { $num } zile + *[other] { $num } de zile + } +timespanWeeks = + { $num -> + [one] 1 săptămână + [few] { $num } săptămâni + *[other] { $num } de săptămâni + } +fileCount = + { $num -> + [one] 1 fișier + [few] { $num } fișiere + *[other] { $num } de fișiere + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Mărime totală: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Copiază linkul pentru partajarea fișierului: +copyLinkButton = Copiază linkul +downloadTitle = Descarcă fișierele +downloadDescription = Acest fișier a fost partajat prin { -send-brand }, cu criptare capăt-la-capăt și un link care expiră automat. +trySendDescription = Încearcă { -send-brand } pentru o partajare simplă și sigură a fișierelor. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Numai 1 fișier poate fi încărcat simultan. + [few] Numai { $count } fișiere pot fi încărcate simultan. + *[other] Numai { $count } de fișiere pot fi încărcate simultan. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Numai 1 arhivă este permisă. + [few] Numai { $count } arhive sunt permise. + *[other] Numai { $count } de arhive sunt permise. + } +expiredTitle = Acest link a expirat. +notSupportedDescription = { -send-brand } nu va funcționa pe acest browser. { -send-short-brand } funcționează cel mai bine cu ultima versiune de { -firefox } și va funcționa cu versiunea curentă a majorității browserelor. +downloadFirefox = Descarcă { -firefox } +legalTitle = Notificare privind confidențialitatea { -send-short-brand } +legalDateStamp = Versiunea 1.0 din data de 12 martie 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }z { $hours }h { $minutes }m +addFilesButton = Selectează fișierele pentru încărcare +trustWarningMessage = Asigură-te că destinatarul este de încredere când partajezi date sensibile. +uploadButton = Încarcă +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Trage și plasează fișierele +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = sau dă clic pentru a trimite până la { $size } +addPassword = Protejează cu parolă +emailPlaceholder = Introdu e-mailul tău +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Autentifică-te pentru a trimite până la { $size } +signInOnlyButton = Autentificare +accountBenefitTitle = Creează un cont { -firefox } sau autentifică-te +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Partajează fișiere de până la { $size } +accountBenefitDownloadCount = Partajează fișiere cu mai multe persoane +accountBenefitTimeLimit = + { $count -> + [one] Păstrează linkurile active până la 1 zi + [few] Păstrează linkurile active până la { $count } zile + *[other] Păstrează linkurile active până la { $count } de zile + } +accountBenefitSync = Gestionează fișierele partajate de pe orice dispozitiv +accountBenefitMoz = Află despre celelalte servicii { -mozilla } +signOut = Deconectare +okButton = Ok +downloadingTitle = Se descarcă +noStreamsWarning = Este posibil ca acest browser să nu poată decripta un fișier atât de mare. +noStreamsOptionCopy = Copiază linkul pentru a-l deschide într-un alt browser +noStreamsOptionFirefox = Încearcă browserul nostru favorit +noStreamsOptionDownload = Continuă cu acest browser +downloadFirefoxPromo = { -send-short-brand } îți este adus de noul { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Partajează linkul către fișier: +shareLinkButton = Partajează linkul +# $name is the name of the file +shareMessage = Descarcă „{ $name }” cu { -send-brand }: partajare simplă și sigură a fișierelor +trailheadPromo = Există o modalitate de a-ți proteja viața privată. Folosește Firefox. +learnMore = Află mai multe. +downloadFlagged = Acest link a fost dezactivat pentru că încalcă termenii de utilizare a serviciului. +downloadConfirmTitle = Încă ceva +downloadConfirmDescription = Asigură-te că persoana care ți-a trimis acest fișier este de încredere pentru că noi nu putem verifica dacă nu cumva îți va afecta dispozitivul. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Am încredere în persoana care a trimis acest fișier + [few] Am încredere în persoana care a trimis aceste fișiere + *[other] Am încredere în persoana care a trimis aceste fișiere + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Raportează acest fișier ca suspect + [few] Raportează aceste fișiere ca suspecte + *[other] Raportează aceste fișiere ca suspecte + } +reportDescription = Ajută-ne să înțelegem ce se întâmplă. Ce crezi că e în neregulă cu aceste fișiere? +reportUnknownDescription = Intră pe URL-ul linkului pe care vrei să îl raportezi și dă clic pe „{ reportFile }”. +reportButton = Raportează +reportReasonMalware = Aceste fișiere conțin cod rău-intenționat sau fac parte dintr-un atac de înșelăciune. +reportReasonPii = Aceste fișiere conțin date cu caracter personal identificabile despre mine. +reportReasonAbuse = Aceste fișiere au un conținut ilegal sau ofensator. +reportReasonCopyright = Pentru a raporta o încălcare a drepturilor de reproducere sau a mărcilor comerciale, folosește procedura descrisă aici. +reportedTitle = Fișiere raportate +reportedDescription = Îți mulțumim. Am primit raportarea ta despre aceste fișiere. diff --git a/public/locales/ru/send.ftl b/public/locales/ru/send.ftl index 97316c34e..b60ecf798 100644 --- a/public/locales/ru/send.ftl +++ b/public/locales/ru/send.ftl @@ -1,117 +1,196 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = веб-эксперимент -siteFeedback = Отзывы -uploadPageHeader = Приватный, зашифрованный обмен файлами -uploadPageExplainer = Отсылайте файлы, используя безопасные, приватные и зашифрованные ссылки, по истечении срока действия которых ваши файлы не останутся в сети навсегда. -uploadPageLearnMore = Подробнее -uploadPageDropMessage = Перетащите свой файл сюда, чтобы начать загрузку -uploadPageSizeMessage = Для более надёжной работы сервиса, размер вашего файла не должен превышать 1ГБ. -uploadPageBrowseButton = Выбрать файл с моего компьютера -uploadPageBrowseButton1 = Выбрать файл для загрузки -uploadPageMultipleFilesAlert = Загрузка нескольких файлов или папок в настоящее время не поддерживается. -uploadPageBrowseButtonTitle = Загрузить файл -uploadingPageProgress = Загружаю { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Импортирование... -verifyingFile = Проверка... encryptingFile = Шифрование... decryptingFile = Расшифровка... -notifyUploadDone = Ваша загрузка завершена. -uploadingPageMessage = Как только вы загрузите свой файл, вы сможете установить срок хранения. -uploadingPageCancel = Отменить загрузку -uploadCancelNotification = Ваша загрузка была отменена. -uploadingPageLargeFileMessage = Этот файл довольно большой и его загрузка может занять продолжительное время. Держитесь! -uploadingFileNotification = Оповестить меня, когда загрузка завершится. -uploadSuccessConfirmHeader = Готов к отправке -uploadSvgAlt = Загрузить -uploadSuccessTimingHeader = Ссылка на ваш файл станет недоступна после 1 загрузки файла или через 24 часа. -expireInfo = Ссылка на ваш файл станет недоступна после { $downloadCount } файла или через { $timespan }. -downloadCount = { $num -> - [one] { $number } загрузки - [few] { $number } загрузок - *[other] { $number } загрузок +downloadCount = + { $num -> + [one] { $num } загрузки + [few] { $num } загрузок + *[other] { $num } загрузок } -timespanHours = { $num -> - [one] { $number } час - [few] { $number } часа - *[other] { $number } часов +timespanHours = + { $num -> + [one] { $num } час + [few] { $num } часа + *[other] { $num } часов } -copyUrlFormLabelWithName = Скопировать и поделиться ссылкой на отправку вашего файла: { $filename } -copyUrlFormButton = Скопировать в буфер обмена copiedUrl = Скопировано! -deleteFileButton = Удалить файл -sendAnotherFileLink = Отправить другой файл -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Загрузить -downloadsFileList = Загрузки -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Время -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Загрузить { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Введите пароль unlockInputPlaceholder = Пароль unlockButtonLabel = Разблокировать -downloadFileTitle = Загрузить зашифрованный файл -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ваш друг отправил вам файл с помощью Firefox Send, сервиса, который позволяет вам делиться файлами, используя безопасные, приватные и зашифрованные ссылки, по истечении срока действия которых ваши файлы не остаются в сети навсегда. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Загрузить -downloadNotification = Ваша загрузка завершена. downloadFinish = Загрузка завершена -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } из { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Попробовать Firefox Send -downloadingPageProgress = Загрузка { $filename } ({ $size }) -downloadingPageMessage = Пожалуйста, оставьте эту вкладку открытой, пока мы загружаем ваш файл и расшифровываем его. -errorAltText = Ошибка загрузки +sendYourFilesLink = Попробовать Send errorPageHeader = Что-то пошло не так! -errorPageMessage = Произошла ошибка при загрузке файла. -errorPageLink = Отправить другой файл. -fileTooBig = Этот файл слишком большой для загрузки. Он должен быть меньше { $size }. +fileTooBig = Файл слишком большой. Он должен быть меньше { $size }. linkExpiredAlt = Истёк срок действия ссылки -expiredPageHeader = Истёк срок действия ссылки или ее никогда не существовало! notSupportedHeader = Ваш браузер не поддерживается. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = К сожалению, этот браузер не поддерживает веб-технологию, благодаря которой работает Firefox Send. Ваш нужно попробовать использовать другой браузер. Мы рекомендуем Firefox! notSupportedLink = Почему мой браузер не поддерживается? -notSupportedOutdatedDetail = К сожалению, эта версия Firefox не поддерживает веб-технологию, благодаря которой работает Firefox Send. Ваш нужно обновить свой браузер. +notSupportedOutdatedDetail = К сожалению, эта версия Firefox не поддерживает веб-технологию, благодаря которой работает Send. Ваш нужно обновить свой браузер. updateFirefox = Обновить Firefox -downloadFirefoxButtonSub = Бесплатная загрузка -uploadedFile = Файл -copyFileList = Скопировать URL -// expiryFileList is used as a column header -expiryFileList = Срок действия истекает через -deleteFileList = Удалить -nevermindButton = Неважно -legalHeader = Условия и конфиденциальность -legalNoticeTestPilot = Firefox Send в настоящее время является экспериментом лётчика-испытателя, и поэтому подпадает под условия службы и уведомление о приватности лётчика-испытателя. Вы можете узнать больше об этом эксперименте и его сборе данных здесь. -legalNoticeMozilla = Использование сайта Firefox Send также подпадает под уведомление о конфиденциальности веб-сайтов и правила использования веб-сайтов Mozilla. -deletePopupText = Удалить этот файл? -deletePopupYes = Да deletePopupCancel = Отмена deleteButtonHover = Удалить -copyUrlHover = Скопировать URL footerLinkLegal = Права -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = О программе лётчика-испытателя footerLinkPrivacy = Приватность -footerLinkTerms = Условия footerLinkCookies = Куки -requirePasswordCheckbox = Требовать пароль для загрузки этого файла -addPasswordButton = Добавить пароль -changePasswordButton = Изменить passwordTryAgain = Неверный пароль. Попробуйте снова. -// This label is followed by the password needed to download a file -passwordResult = Пароль: { $password } -reportIPInfringement = Сообщить о нарушении прав на интеллектуальную собственность -javascriptRequired = Для Firefox Send необходим JavaScript -whyJavascript = Почему Firefox Send требуется JavaScript? +javascriptRequired = Для Send необходим JavaScript +whyJavascript = Почему Send требуется JavaScript? enableJavascript = Пожалуйста, включите JavaScript и попробуйте снова. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } ч. { $minutes } мин. -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } мин. +# A short status message shown when the user enters a long password +maxPasswordLength = Максимальная длина пароля: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Этот пароль не может быть установлен + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Простой и безопасный обмен файлами +introDescription = { -send-brand } позволяет вам делиться файлами со сквозным шифрованием и ограниченным сроком действия ссылки на загрузку. Так что, вы сможете делиться файлами приватно и они не останутся в сети навсегда. +notifyUploadEncryptDone = Ваш файл зашифрован и готов к отправке +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Срок хранения истекает после { $downloadCount } или через { $timespan } +timespanMinutes = + { $num -> + [one] { $num } минуту + [few] { $num } минуты + *[other] { $num } минут + } +timespanDays = + { $num -> + [one] { $num } день + [few] { $num } дня + *[other] { $num } дней + } +timespanWeeks = + { $num -> + [one] { $num } неделю + [few] { $num } недели + *[other] { $num } недель + } +fileCount = + { $num -> + [one] { $num } файл + [few] { $num } файла + *[other] { $num } файлов + } +# byte abbreviation +bytes = Б +# kibibyte abbreviation +kb = КБ +# mebibyte abbreviation +mb = МБ +# gibibyte abbreviation +gb = ГБ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Общий размер: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Скопируйте ссылку, чтобы поделиться своим файлом: +copyLinkButton = Копировать ссылку +downloadTitle = Загрузить файлы +downloadDescription = Этот файл был отправлен через { -send-brand } со сквозным шифрованием и ограниченным сроком действия ссылки на загрузку. +trySendDescription = Испытайте простой и безопасный обмен файлами с помощью { -send-brand }. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Только { $count } файл может загружаться одновременно. + [few] Только { $count } файла могут загружаться одновременно. + *[other] Только { $count } файлов могут загружаться одновременно. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Только { $count } архив разрешён. + [few] Только { $count } архива разрешено. + *[other] Только { $count } архивов разрешено. + } +expiredTitle = Срок действия этой ссылки истёк. +notSupportedDescription = { -send-brand } не будет работать в этом браузере. { -send-short-brand } лучше всего работает с последней версией { -firefox }, и будет работать с последними версиями популярных браузеров. +downloadFirefox = Загрузить { -firefox } +legalTitle = Уведомление о конфиденциальности { -send-short-brand } +legalDateStamp = Версия 1.0, от 12 марта 2019 года +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } дн. { $hours } ч. { $minutes } мин. +addFilesButton = Выберите файлы для выгрузки +trustWarningMessage = Убедитесь, что вы доверяете своему получателю при обмене конфиденциальными данными. +uploadButton = Выгрузить +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Перетащите файлы сюда +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = или щёлкните здесь, чтобы отправить их (до { $size }) +addPassword = Защитить паролем +emailPlaceholder = Введите ваш адрес электронной почты +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Войдите, чтобы отправлять файлы до { $size } +signInOnlyButton = Войти +accountBenefitTitle = Создайте Аккаунт { -firefox } или войдите +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Делитесь файлами до { $size } +accountBenefitDownloadCount = Делитесь файлами с несколькими людьми +accountBenefitTimeLimit = + { $count -> + [one] Оставить ссылку активной в течение { $count } дня + [few] Оставить ссылку активной в течение { $count } дней + *[other] Оставить ссылку активной в течение { $count } дней + } +accountBenefitSync = Управляйте своими файлами с любого устройства +accountBenefitMoz = Узнайте о других службах { -mozilla } +signOut = Выйти +okButton = OK +downloadingTitle = Загрузка +noStreamsWarning = Этот браузер может не иметь возможности расшифровать такой большой файл. +noStreamsOptionCopy = Скопируйте ссылку, чтобы открыть в другом браузере +noStreamsOptionFirefox = Попробуйте наш любимый браузер +noStreamsOptionDownload = Продолжить в этом браузере +downloadFirefoxPromo = { -send-short-brand } доступен вам в полностью новом { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Поделитесь ссылкой на ваш файл: +shareLinkButton = Поделиться ссылкой +# $name is the name of the file +shareMessage = Загрузите «{ $name }» с { -send-brand }: простой и безопасный обмен файлами +trailheadPromo = Существует способ защитить вашу приватность. Присоединяйтесь к Firefox. +learnMore = Подробнее. +downloadFlagged = Эта ссылка была отключена за нарушение условий использования. +downloadConfirmTitle = Ещё один совет +downloadConfirmDescription = Убедитесь, что вы доверяете человеку, который отправил вам этот файл, потому что мы не знаем, не повредит ли файл вашему устройству. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Я доверяю человеку, который отправил этот файл + [few] Я доверяю человеку, который отправил эти файлы + *[many] Я доверяю человеку, который отправил эти файлы + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Сообщить об этом файле как о подозрительном + [few] Сообщить об этих файлах как о подозрительных + *[many] Сообщить об этих файлах как о подозрительных + } +reportDescription = Помогите нам понять, что происходит. Что по вашему мнению не так с этими файлами? +reportUnknownDescription = Перейдите к адресу ссылки, о которой хотите сообщить, и щёлкните «{ reportFile }». +reportButton = Сообщить +reportReasonMalware = Эти файлы содержат вредоносные программы или являются частью фишинговой атаки. +reportReasonPii = Эти файлы содержат мои личные данные. +reportReasonAbuse = Эти файлы содержат незаконный или оскорбительный контент. +reportReasonCopyright = Чтобы сообщить о нарушении авторских прав или товарных знаков, используйте процедуру, описанную на этой странице. +reportedTitle = О файлах сообщено +reportedDescription = Спасибо. Мы получили вашу жалобу на эти файлы. diff --git a/public/locales/sk/send.ftl b/public/locales/sk/send.ftl index 32f4fc306..4f43bc777 100644 --- a/public/locales/sk/send.ftl +++ b/public/locales/sk/send.ftl @@ -1,117 +1,196 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = experiment pre web -siteFeedback = Spätná väzba -uploadPageHeader = Súkromné a šifrované zdieľanie súborov -uploadPageExplainer = Odosielajte súbory pomocou bezpečného, súkromného a šifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory nezostanú na internete naveky. -uploadPageLearnMore = Ďalšie informácie -uploadPageDropMessage = Presunutím súboru sem začnete nahrávanie -uploadPageSizeMessage = Pre zaistenie čo najväčšej spoľahlivosti vám odporúčame nahrávať súbory menšie než 1GB. -uploadPageBrowseButton = Vyberte súbor vo vašom počítači -uploadPageBrowseButton1 = Vyberte súbor na nahratie -uploadPageMultipleFilesAlert = Nahrávanie viacerých súborov alebo priečinkov momentálne nie je podporované. -uploadPageBrowseButtonTitle = Nahrať súbor -uploadingPageProgress = Nahrávanie súboru { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importuje sa… -verifyingFile = Overuje sa… encryptingFile = Šifruje sa… decryptingFile = Dešifruje sa… -notifyUploadDone = Vaše nahrávanie sa dokončilo. -uploadingPageMessage = Po nahratí súboru budete môcť nastaviť vypršanie platnosti. -uploadingPageCancel = Zrušiť nahrávanie -uploadCancelNotification = Vaše nahrávanie bolo zrušené. -uploadingPageLargeFileMessage = Tento súbor je veľký. Nahrávanie tak môže chvíľu trvať. -uploadingFileNotification = Upozorniť ma na ukončenie nahrávania -uploadSuccessConfirmHeader = Pripravené na odoslanie -uploadSvgAlt = Nahrať -uploadSuccessTimingHeader = Platnosť odkazu vyprší po 1 prevzatí alebo po uplynutí 24 hodín. -expireInfo = Platnosť odkazu na váš súbor vyprší po { $downloadCount } alebo po { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 prevzatí [few] { $num } prevzatiach *[other] { $num } prevzatiach } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 hodine [few] { $num } hodinách *[other] { $num } hodinách } -copyUrlFormLabelWithName = Skopírovaním a zdieľaním odkazu odošlete váš súbor: { $filename } -copyUrlFormButton = Kopírovať do schránky copiedUrl = Skopírované! -deleteFileButton = Odstrániť súbor -sendAnotherFileLink = Odoslať ďalší súbor -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Prevziať -downloadsFileList = Prevzatí -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Zostáva -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Prevziať { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Zadajte heslo unlockInputPlaceholder = Heslo unlockButtonLabel = Odomknúť -downloadFileTitle = Prevziať šifrovaný súbor -// Firefox Send is a brand name and should not be localized. -downloadMessage = Váš priateľ vám odoslal súbor pomocou služby Firefox Send - táto vám umožňuje zdieľať súbory pomocou bezpečného, súkromného a zašifrovaného odkazu, ktorého platnosť automaticky vyprší. Vďaka tomu máte istotu, že vaše súbory neostanú na internete naveky. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Prevziať -downloadNotification = Vaše preberanie bolo dokončené. downloadFinish = Preberanie bolo dokončené -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } z { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Vyskúšajte Firefox Send -downloadingPageProgress = Preberá sa { $filename } ({ $size }) -downloadingPageMessage = Prosím, ponechajte túto kartu otvorenú zatiaľ čo váš súbor prevezmeme a dešifrujeme. -errorAltText = Pri nahrávaní sa vyskytla chyba +sendYourFilesLink = Vyskúšajte Send errorPageHeader = Vyskytol sa problém. -errorPageMessage = Pri nahrávaní súboru nastala chyba. -errorPageLink = Odošlite ďalší súbor fileTooBig = Súbor je príliš veľký. Mal by byť menší než { $size }. linkExpiredAlt = Platnosť odkazu vypršala -expiredPageHeader = Platnosť tohto odkazu vypršala alebo daný odkaz nikdy neexistoval. notSupportedHeader = Váš prehliadač nie je podporovaný. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Žiaľ, tento prehliadač nepodporuje webovú technológiu, ktorá poháňa službu Firefox Send. Budete musieť vyskúšať iný prehliadač. My vám odporúčame Firefox! notSupportedLink = Prečo nie je môj prehliadač podporovaný? -notSupportedOutdatedDetail = Žiaľ, táto verzia Firefoxu nepodporuje webovú technológiu, ktorá poháňa Firefox Send. Budete musieť aktualizovať svoj prehliadač. +notSupportedOutdatedDetail = Žiaľ, táto verzia Firefoxu nepodporuje webovú technológiu, ktorá poháňa Send. Budete musieť aktualizovať svoj prehliadač. updateFirefox = Aktualizovať Firefox -downloadFirefoxButtonSub = Prevziať zadarmo -uploadedFile = Súbor -copyFileList = Kopírovať adresu URL -// expiryFileList is used as a column header -expiryFileList = Platnosť vyprší -deleteFileList = Odstrániť -nevermindButton = Zrušiť -legalHeader = Podmienky používania a súkromie -legalNoticeTestPilot = Firefox Send je v súčasnosti experimentom projektu Test Pilot a vzťahujú sa naň podmienky používania a zásady ochrany súkromia Test Pilotu. Viac sa o zbieraní údajov experimentami dozviete tu. -legalNoticeMozilla = Na použitie webovej stránky služby Firefox Send sa vzťahujú zásady ochrany súkromia na webových stránkach a podmienky použitia webových stránok Mozilly. -deletePopupText = Naozaj chcete odstrániť tento súbor? -deletePopupYes = Áno deletePopupCancel = Zrušiť deleteButtonHover = Odstrániť -copyUrlHover = Skopírovať adresu URL footerLinkLegal = Právne informácie -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = O projekte Test Pilot footerLinkPrivacy = Súkromie -footerLinkTerms = Podmienky používania footerLinkCookies = Cookies -requirePasswordCheckbox = Pri preberaní súboru vyžadovať heslo -addPasswordButton = Pridať heslo -changePasswordButton = Zmeniť passwordTryAgain = Nesprávne heslo. Skúste to znova. -// This label is followed by the password needed to download a file -passwordResult = Heslo: { $password } -reportIPInfringement = Nahlásiť porušenie práv duševného vlastníctva -javascriptRequired = Firefox Send vyžaduje JavaScript -whyJavascript = Prečo Firefox Send vyžaduje JavaScript? +javascriptRequired = Send vyžaduje JavaScript +whyJavascript = Prečo Send vyžaduje JavaScript? enableJavascript = Prosím, povoľte JavaScript a skúste to znova. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } hod. { $minutes } min. -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } min. +# A short status message shown when the user enters a long password +maxPasswordLength = Maximálna dĺžka hesla: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Heslo nešlo nastaviť + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Jednoduché a súkromné zdieľanie súborov +introDescription = S { -send-brand(case: "ins") } sú zdieľané súbory šifrované end-to-end, takže ani my nevieme, čo zdieľate. Platnosť odkazu je navyše obmedzená. Súbory tak môžete zdieľať súkromne a s istotou, že neostanú na internete naveky. +notifyUploadEncryptDone = Váš súbor je zašifrovaný a pripravený na odoslanie +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Platnosť odkazu vyprší po { $downloadCount } alebo po { $timespan } +timespanMinutes = + { $num -> + [one] 1 minúte + [few] { $num } minútach + *[other] { $num } minútach + } +timespanDays = + { $num -> + [one] 1 dni + [few] { $num } dňoch + *[other] { $num } dňoch + } +timespanWeeks = + { $num -> + [one] 1 týždni + [few] { $num } týždňoch + *[other] { $num } týždňoch + } +fileCount = + { $num -> + [one] 1 súbor + [few] { $num } súbory + *[other] { $num } súborov + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Celková veľkosť: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Súbor môžete zdieľať pomocou tohto odkazu: +copyLinkButton = Kopírovať odkaz +downloadTitle = Prevziať súbory +downloadDescription = Tento súbor bol zdieľaný prostredníctvom služby { -send-brand }, ktorá poskytuje end-to-end šifrovanie a odkazy s obmedzenou platnosťou. +trySendDescription = Vyskúšajte jednoduché a bezpečné zdieľanie súborov so službou { -send-brand } +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Naraz možno nahrávať len 1 súbor. + [few] Naraz možno nahrávať len { $count } súbory. + *[other] Naraz možno nahrávať len { $count } súborov. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Povolený je najviac 1 archív. + [few] Povolené sú najviac { $count } archívy. + *[other] Povolených je najviac { $count } archívov. + } +expiredTitle = Platnosť odkazu vypršala. +notSupportedDescription = { -send-brand } nebude v tomto prehliadači fungovať. { -send-short-brand } najlepšie funguje v najnovšej verzii { -firefox(case: "gen") } alebo aktuálnych verziách najpoužívanejších prehliadačov. +downloadFirefox = Prevziať { -firefox } +legalTitle = Zásady ochrany súkromia služby { -send-short-brand } +legalDateStamp = Verzia 1.0, z 12. marca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } d { $hours } h { $minutes } min +addFilesButton = Vyberte súbory pre nahratie +trustWarningMessage = Uistite sa, že pri zdieľaní citlivých údajov dôverujete adresátovi. +uploadButton = Nahrať +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Pretiahnutím súboru alebo kliknutím sem +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = môžete poslať až { $size } +addPassword = Chrániť heslom +emailPlaceholder = Zadajte e-mailovú adresu +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Pre odoslanie súborov s veľkosťou až { $size }, sa, prosím, prihláste +signInOnlyButton = Prihlásiť sa +accountBenefitTitle = Vytvorte si účet { -firefox } alebo sa prihláste +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Zdieľanie súborov s veľkosťou až { $size } +accountBenefitDownloadCount = Zdieľanie súborov s viacerými ľuďmi +accountBenefitTimeLimit = + { $count -> + [one] Odkazy platné až 1 deň + [few] Odkazy platné až { $count } dni + *[other] Odkazy platné až { $count } dní + } +accountBenefitSync = Správa zdieľaných súborov z akéhokoľvek zariadenia +accountBenefitMoz = Ďalšie informácie o ďalších službách od { -mozilla(case: "gen") } +signOut = Odhlásiť sa +okButton = OK +downloadingTitle = Preberá sa +noStreamsWarning = Tento prehliadač nemusí byť schopný dešifrovať takto veľký súbor. +noStreamsOptionCopy = Skopírovať odkaz pre otvorenie v inom prehliadači +noStreamsOptionFirefox = Vyskúšajte náš obľúbený prehliadač +noStreamsOptionDownload = Pokračovať v tomto prehliadači +downloadFirefoxPromo = { -send-short-brand } vám prináša najnovší { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Zdieľajte odkaz na súbor: +shareLinkButton = Zdieľať odkaz +# $name is the name of the file +shareMessage = Prevezmite si súbor „{ $name }“ so službou { -send-brand } - jednoduché a bezpečné zdieľanie súborov +trailheadPromo = Existuje spôsob, ako chrániť vaše súkromie. Prihláste sa do Firefoxu. +learnMore = Ďalšie informácie. +downloadFlagged = Tento odkaz bol pre porušenie podmienok používania služby deaktivovaný. +downloadConfirmTitle = Ešte jedna vec +downloadConfirmDescription = Uistite sa, že naozaj dôverujete odosielateľovi tohto súboru, pretože nemôžeme overiť jeho bezpečnosť. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Dôverujem odosielateľovi tohto súboru + [few] Dôverujem odosielateľovi týchto súborov + *[other] Dôverujem odosielateľovi týchto súborov + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Nahlásiť tento súbor ako podozrivý + [few] Nahlásiť tieto súbory ako podozrivé + *[other] Nahlásiť tieto súbory ako podozrivé + } +reportDescription = Pomôžte nám pochopiť, čo sa deje. Čo si myslíte, že s týmito súbormi nie je v poriadku? +reportUnknownDescription = Otvorte odkaz, ktorý chcete nahlásiť, a kliknite na „{ reportFile }“. +reportButton = Nahlásiť +reportReasonMalware = Tieto súbory obsahujú malvér alebo sú súčasťou pshishingového útoku. +reportReasonPii = Tieto súbory obsahujú moje osobné údaje. +reportReasonAbuse = Tieto súbory obsahujú nelegálny alebo urážlivý obsah. +reportReasonCopyright = Ak chcete nahlásiť porušenie autorských práv alebo zneužitie ochranných známok, použite postup popísaný na tejto stránke. +reportedTitle = Súbory boli nahlásené +reportedDescription = Ďakujeme vám za nahlásenie týchto súborov. diff --git a/public/locales/sl/send.ftl b/public/locales/sl/send.ftl index a385aa853..9cf110fd1 100644 --- a/public/locales/sl/send.ftl +++ b/public/locales/sl/send.ftl @@ -1,119 +1,223 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = spletni poskus -siteFeedback = Povratne informacije -uploadPageHeader = Zasebno, šifrirano deljenje datotek -uploadPageExplainer = Pošljite datoteke preko varne, zasebne in šifrirane povezave, ki samodejno poteče, kar vam zagotavlja, da vaše datoteke ne bodo ostale za vedno na spletu. -uploadPageLearnMore = Več o tem -uploadPageDropMessage = Tukaj spustite datoteko za začetek nalaganja -uploadPageSizeMessage = Za zanesljivo delovanje je najbolje, da datoteka ne presega 1 GB -uploadPageBrowseButton = Izberite datoteko na računalniku -uploadPageBrowseButton1 = Izberite datoteko za nalaganje -uploadPageMultipleFilesAlert = Nalaganje več datotek ali map trenutno ni podprto. -uploadPageBrowseButtonTitle = Naloži datoteko -uploadingPageProgress = Nalaganje { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Uvažanje … -verifyingFile = Preverjanje … encryptingFile = Šifriranje ... decryptingFile = Dešifriranje ... -notifyUploadDone = Nalaganje je končano. -uploadingPageMessage = Ko bo vaša datoteka naložena, boste lahko nastavili možnosti poteka. -uploadingPageCancel = Prekliči nalaganje -uploadCancelNotification = Nalaganje je preklicano. -uploadingPageLargeFileMessage = Datoteka je velika in lahko traja nekaj časa, da se naloži. Počakajte trenutek! -uploadingFileNotification = Obvesti me, ko bo nalaganje končano. -uploadSuccessConfirmHeader = Pripravljeno za pošiljanje -uploadSvgAlt = Naloži -uploadSuccessTimingHeader = Povezava do vaše datoteke bo potekla po enem prenosu ali v 24 urah. -expireInfo = Povezava do vaše datoteke bo potekla čez { $downloadCount } ali { $timespan }. -downloadCount = { $num -> - [one] 1 prenos - [two] { $num } prenosa - [few] { $num } prenosi - *[other] { $num } prenosov +downloadCount = + { $num -> + [one] 1 prenosu + [two] { $num } prenosih + [few] { $num } prenosih + *[other] { $num } prenosih } -timespanHours = { $num -> - [one] 1 ura +timespanHours = + { $num -> + [one] 1 uro [two] { $num } uri [few] { $num } ure *[other] { $num } ur } -copyUrlFormLabelWithName = Kopirajte in delite to povezavo, da pošljete datoteko: { $filename } -copyUrlFormButton = Kopiraj v odložišče copiedUrl = Kopirano! -deleteFileButton = Izbriši datoteko -sendAnotherFileLink = Pošlji drugo datoteko -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Prenesi -downloadsFileList = Prenosi -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Čas -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Prenesi { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Vnesite geslo unlockInputPlaceholder = Geslo unlockButtonLabel = Odkleni -downloadFileTitle = Prenesi šifrirano datoteko -// Firefox Send is a brand name and should not be localized. -downloadMessage = Prijatelj vam pošilja datoteko preko storitve Firefox Send, ki vam omogoča deljenje datotek preko varne, zasebne in šifrirane povezave, ki samodejno poteče, kar vam zagotavlja, da vaše stvari ne ostanejo na spletu za vedno. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Prenesi -downloadNotification = Vaš prenos je končan. downloadFinish = Prenos končan -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } od { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Preskusite Firefox Send -downloadingPageProgress = Prenašanje { $filename } ({ $size }) -downloadingPageMessage = Medtem ko pridobivamo vašo datoteko in jo dešifriramo, pustite ta zavihek odprt. -errorAltText = Napaka pri nalaganju +sendYourFilesLink = Preskusite Send errorPageHeader = Prišlo je do težave! -errorPageMessage = Pri nalaganju vaše datoteke je prišlo do napake. -errorPageLink = Pošlji drugo datoteko fileTooBig = Ta datoteka je prevelika za nalaganje. Največja možna velikost je { $size }. linkExpiredAlt = Povezava je potekla -expiredPageHeader = Ta povezava je potekla ali pa sploh ni obstajala! notSupportedHeader = Vaš brskalnik ni podprt. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ta brskalnik na žalost ne podpira tehnologije, na kateri temelji Firefox Send. Uporabiti boste morali drug brskalnik. Priporočamo Firefox! notSupportedLink = Zakaj moj brskalnik ni podprt? -notSupportedOutdatedDetail = Ta brskalnik žal ne podpira tehnologije, na kateri temelji Firefox Send. Svoj brskalnik boste morali posodobiti. +notSupportedOutdatedDetail = Ta brskalnik žal ne podpira tehnologije, na kateri temelji Send. Svoj brskalnik boste morali posodobiti. updateFirefox = Posodobi Firefox -downloadFirefoxButtonSub = Brezplačen prenos -uploadedFile = Datoteka -copyFileList = Kopiraj spletni naslov -// expiryFileList is used as a column header -expiryFileList = Poteče -deleteFileList = Izbriši -nevermindButton = Pozabi -legalHeader = Pogoji in zasebnost -legalNoticeTestPilot = Firefox Send je trenutno poskus projekta Test Pilot ter zanj veljajo pogoji uporabe in obvestilo o zasebnosti Test Pilota. Več o tem poskusu in njegovem zbiranju podatkov lahko izveste tukaj. -legalNoticeMozilla = Za uporabo spletne strani Firefox Send veljajo Mozillini obvestilo o zasebnosti za spletne strani in pogoji uporabe spletnih strani. -deletePopupText = Izbrišem to datoteko? -deletePopupYes = Da deletePopupCancel = Prekliči deleteButtonHover = Izbriši -copyUrlHover = Kopiraj spletni naslov footerLinkLegal = Pravno obvestilo -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = O programu Test Pilot footerLinkPrivacy = Zasebnost -footerLinkTerms = Pogoji footerLinkCookies = Piškotki -requirePasswordCheckbox = Zahtevaj geslo za prenos te datoteke -addPasswordButton = Dodaj geslo -changePasswordButton = Spremeni passwordTryAgain = Napačno geslo. Poskusite znova. -// This label is followed by the password needed to download a file -passwordResult = Geslo: { $password } -reportIPInfringement = Prijavite kršitev naslova IP -javascriptRequired = Firefox Send zahteva JavaScript -whyJavascript = Zakaj Firefox Send zahteva JavaScript? +javascriptRequired = Send zahteva JavaScript +whyJavascript = Zakaj Send zahteva JavaScript? enableJavascript = Omogočite JavaScript in poskusite znova. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Največja dolžina gesla: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Gesla ni mogoče nastaviti + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = + { $sklon -> + *[imenovalnik] Firefox + [rodilnik] Firefoxa + [dajalnik] Firefoxu + [tozilnik] Firefox + [mestnik] Firefoxu + [orodnik] Firefoxom + } +-mozilla = + { $sklon -> + *[imenovalnik] Mozilla + [rodilnik] Mozille + [dajalnik] Mozilli + [tozilnik] Mozillo + [mestnik] Mozilli + [orodnik] Mozillo + } +introTitle = Preprosto, zasebno deljenje datotek +introDescription = { -send-brand } vam omogoča v celoti šifrirano pošiljanje datotek s povezavo, ki samodejno poteče. Z njim lahko zasebno delite svoje datoteke in zagotovite, da ne bodo za vedno ostale na spletu. +notifyUploadEncryptDone = Vaša datoteka je šifrirana in pripravljena za pošiljanje +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Poteče po { $downloadCount } ali čez { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + [two] { $num } minuti + [few] { $num } minute + *[other] { $num } minut + } +timespanDays = + { $num -> + [one] 1 dan + [two] { $num } dni + [few] { $num } dni + *[other] { $num } dni + } +timespanWeeks = + { $num -> + [one] 1 teden + [two] { $num } tedna + [few] { $num } tedne + *[other] { $num } tednov + } +fileCount = + { $num -> + [one] 1 datoteka + [two] { $num } datoteki + [few] { $num } datoteke + *[other] { $num } datotek + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Skupna velikost: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopirajte povezavo za deljenje datoteke: +copyLinkButton = Kopiraj povezavo +downloadTitle = Prenesi datoteke +downloadDescription = Ta datoteka je bila v skupni rabi preko { -send-brand } s šifriranjem od konca do konca in povezavo, ki samodejno poteče. +trySendDescription = Preizkusite { -send-brand } za preprosto in varno deljenje datotek. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Naložite lahko največ 1 datoteko naenkrat. + [two] Naložite lahko največ { $count } datoteki naenkrat. + [few] Naložite lahko največ { $count } datoteke naenkrat. + *[other] Naložite lahko največ { $count } datotek naenkrat. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Dovoljen je največ 1 arhiv. + [two] Dovoljena sta največ { $count } arhiva. + [few] Dovoljeni so največ { $count } arhivi. + *[other] Dovoljenih je največ { $count } arhivov. + } +expiredTitle = Ta povezava je potekla. +notSupportedDescription = { -send-brand } v tem brskalniku ne bo deloval. { -send-short-brand } najbolje deluje v najnovejši različici { -firefox(sklon: "rodilnik") }, deloval pa bo tudi v trenutni različici večine brskalnikov. +downloadFirefox = Prenesite { -firefox } +legalTitle = Obvestilo o zasebnosti za { -send-short-brand } +legalDateStamp = Različica 1.0, v veljavi od 12. marca 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Izberite datoteke za nalaganje +trustWarningMessage = Pri deljenju občutljivih podatkov bodite prepričani, da zaupate prejemniku. +uploadButton = Naloži +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Povlecite in spustite datoteke +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ali kliknite za pošiljanje do { $size } +addPassword = Zaščiti z geslom +emailPlaceholder = Vnesite e-poštni naslov +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Prijavite se za pošiljanje do { $size } +signInOnlyButton = Prijava +accountBenefitTitle = Ustvarite { -firefox } Račun ali se prijavite +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Delite datoteke do velikosti { $size } +accountBenefitDownloadCount = Delite datoteke z več osebami +accountBenefitTimeLimit = + { $count -> + [one] Ohranite povezave dejavne do en dan + [two] Ohranite povezave dejavne do { $count } dni + [few] Ohranite povezave dejavne do { $count } dni + *[other] Ohranite povezave dejavne do { $count } dni + } +accountBenefitSync = Upravljajte deljene datoteke s katerekoli naprave +accountBenefitMoz = Več o drugih storitvah { -mozilla(sklon: "rodilnik") } +signOut = Odjava +okButton = V redu +downloadingTitle = Prenašanje +noStreamsWarning = Ta brskalnik morda ne bo zmogel dešifrirati tako velike datoteke. +noStreamsOptionCopy = Kopirajte povezavo, da jo odprete v drugem brskalniku +noStreamsOptionFirefox = Poskusite z našim najljubšim brskalnikom +noStreamsOptionDownload = Nadaljujte s tem brskalnikom +downloadFirefoxPromo = { -send-short-brand } vam omogoča čisto novi { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Delite povezavo do datoteke: +shareLinkButton = Deli povezavo +# $name is the name of the file +shareMessage = Prenesite "{ $name }" s { -send-brand }om: enostavno in varno deljenje datotek +trailheadPromo = Vašo zasebnost lahko zaščitite. Pridružite se Firefoxu. +learnMore = Več o tem. +downloadFlagged = Ta povezava je bila onemogočena, ker je kršila pogoje storitve. +downloadConfirmTitle = Še to +downloadConfirmDescription = Bodite prepričani, da zaupate osebi, ki vam je poslala to datoteko, ker ne moremo preveriti, da ne bo škodovala vaši napravi. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Zaupam pošiljatelju te datoteke + [two] Zaupam pošiljatelju teh datotek + [few] Zaupam pošiljatelju teh datotek + *[other] Zaupam pošiljatelju teh datotek + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Prijavi sumljivo datoteko + [two] Prijavi sumljivi datoteki + [few] Prijavi sumljive datoteke + *[other] Prijavi sumljive datoteke + } +reportDescription = Pomagajte nam razumeti, kaj se dogaja. Kaj mislite, da je s temi datotekami narobe? +reportUnknownDescription = Obiščite naslov povezave, ki jo želite prijaviti, in kliknite »{ reportFile }«. +reportButton = Prijavi +reportReasonMalware = Te datoteke vsebujejo zlonamerno programsko opremo ali so del napada lažnega predstavljanja. +reportReasonPii = Te datoteke vsebujejo osebne podatke o meni. +reportReasonAbuse = Te datoteke vsebujejo nezakonito ali nasilno vsebino. +reportReasonCopyright = Za prijavo kršitve avtorskih pravic ali blagovne znamke sledite postopku, opisanem na tej strani. +reportedTitle = Datoteke prijavljene +reportedDescription = Hvala. Prejeli smo vašo prijavo teh datotek. diff --git a/public/locales/sn/send.ftl b/public/locales/sn/send.ftl new file mode 100644 index 000000000..340f6587c --- /dev/null +++ b/public/locales/sn/send.ftl @@ -0,0 +1,17 @@ +# Send is a brand name and should not be localized. +title = Send +siteFeedback = Zvirikutaurwa +importingFile = Kutora faira +encryptingFile = Kuinikiriputa +enableJavascript = Ndinokumbira mubvumidze JavaScript moedza zvekare +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }maawa { $minutes }mineti +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }mineti +# A short status message shown when the user enters a long password +maxPasswordLength = Pasiwedhi haipfuuri mavara:{ $length } +# A short status message shown when there was an error setting the password +passwordSetError = Pasiwedhi haina kuita + +## Send version 2 strings + diff --git a/public/locales/sq/send.ftl b/public/locales/sq/send.ftl index 196f00251..27180351e 100644 --- a/public/locales/sq/send.ftl +++ b/public/locales/sq/send.ftl @@ -1,101 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = eksperiment web -siteFeedback = Përshtypje -uploadPageHeader = Shkëmbim Privat, i Fshehtëzuar, Kartelash -uploadPageExplainer = Dërgoni kartela përmes një lidhjeje të parrezik, private dhe të fshehtëzuar, që skadon automatikisht për të garantuar që gjërat tuaja nuk mbesin në internet përgjithmonë. -uploadPageLearnMore = Mësoni më tepër -uploadPageDropMessage = Që të fillojë ngarkimi, hidheni kartelën tuaj këtu -uploadPageSizeMessage = Për ecurinë më të qëndrueshme, më e mira është t’i mbani kartelat tuaja nën 1GB -uploadPageBrowseButton = Përzgjidhni një kartelë nga kompjuteri juaj -uploadPageBrowseButton1 = Përzgjidhni një kartelë për ngarkim -uploadPageMultipleFilesAlert = Ngarkimi i shumë kartelave njëherësh, ose i një dosjeje, hëpërhë nuk mbulohen. -uploadPageBrowseButtonTitle = Ngarkoje kartelën -uploadingPageProgress = Po ngarkohet { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Po importohet… -verifyingFile = Po verifikohet… encryptingFile = Po fshehtëzohet… decryptingFile = Po shfshehtëzohet… -notifyUploadDone = Ngarkimi juaj përfundoi. -uploadingPageMessage = Do të jeni në gjendje të caktoni parametra skadimi sapo kartela juaj të jetë ngarkuar. -uploadingPageCancel = Anuloje ngarkimin -uploadCancelNotification = Ngarkimi juaj u anulua. -uploadingPageLargeFileMessage = Kjo kartelë është e madhe dhe mund të dojë ca kohë të ngarkohet. Rrini këtu! -uploadingFileNotification = Njoftomë kur të jetë plotësuar ngarkimi . -uploadSuccessConfirmHeader = Gati për Dërgim -uploadSvgAlt = Ngarkoje -uploadSuccessTimingHeader = Lidhja për te kartela juaj do të skadojë pas 1 shkarkimi ose pas 24 orësh. -expireInfo = Lidhja për te kartela juaj do të skadojë pas { $downloadCount } ose { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 shkarkimi *[other] { $num } shkarkimesh } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 ore *[other] { $num } orësh } -copyUrlFormLabelWithName = Kopjojeni dhe jepuani të tjerëve lidhje që të dërgoni kartelën tuaj: { $filename } -copyUrlFormButton = Kopjoje te e papastra copiedUrl = U kopjua! -deleteFileButton = Fshije kartelën -sendAnotherFileLink = Dërgoni një kartelë tjetër -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Shkarkoje -downloadFileName = Shkarkoje { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Jepni Fjalëkalimin unlockInputPlaceholder = Fjalëkalim unlockButtonLabel = Zhbllokoje -downloadFileTitle = Shkarko Kartelën e Fshehtëzuar -// Firefox Send is a brand name and should not be localized. -downloadMessage = Shoku juaj po ju dërgon një kartelë me Firefox Send, një shërbim që ju lejon të shkëmbeni kartela përmes një lidhjeje të parrezik, private, dhe të fshehtëzuar, që skadon automatikisht, për të garantuar që gjërat tuaja të mos mbeten në internet përgjithmonë. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Shkarkoje -downloadNotification = Shkarkimi juaj u plotësua. downloadFinish = Shkarkim i Plotësuar -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } nga { $totalSize }) gjithsej -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Provoni Firefox Send -downloadingPageProgress = Po shkarkohet { $filename } ({ $size }) -downloadingPageMessage = Ju lutemi, lëreni hapur këtë skedë ndërkohë që ne sjellim dhe shfshehtëzojmë kartelën tuaj. -errorAltText = Gabim ngarkimi +sendYourFilesLink = Provoni Send errorPageHeader = Diç shkoi ters! -errorPageMessage = Pati një gabim gjatë ngarkimit të kartelës. -errorPageLink = Dërgoni një kartelë tjetër fileTooBig = Kjo kartelë është shumë e madhe për ngarkim. Do të duhej të ishte më pak se { $size }. linkExpiredAlt = Lidhja skadoi -expiredPageHeader = Kjo lidhje ka skaduar ose s’ka ekzistuar kurrë! notSupportedHeader = Shfletuesi juaj nuk mbulohet. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Mjerisht, ky shfletues nuk mbulon teknologjinë web mbi të cilën bazohet Firefox Send.Do t’ju duhet të provoni një shfletues tjetër. Ju këshillojmë Firefox-in! notSupportedLink = Pse nuk mbulohet ky shfletues? -notSupportedOutdatedDetail = Mjerisht, ky version i Firefox-it nuk e mbulon teknologjinë web mbi të cilën bazohet Firefox Send. Do t’ju duhet të përditësoni shfletuesin tuaj. +notSupportedOutdatedDetail = Mjerisht, ky version i Firefox-it nuk e mbulon teknologjinë web mbi të cilën bazohet Send. Do t’ju duhet të përditësoni shfletuesin tuaj. updateFirefox = Përditësojeni Firefox-in -downloadFirefoxButtonSub = Shkarkim Falas -uploadedFile = Kartelë -copyFileList = Kopjo URL-në -// expiryFileList is used as a column header -expiryFileList = Skadon Më -deleteFileList = Fshije -nevermindButton = S’prish punë -legalHeader = Kushte & Privatësi -legalNoticeTestPilot = Firefox Send është një eksperiment Pilot Testesh dhe subjekt i Kushteve të Shërbimit dhe Shënim Privacësie për Pilot Testesh. Këtu mund të mësoni më tepër mbi këtë eksperiment dhe grumbullimit të të dhënave që ai kryen. -legalNoticeMozilla = Përdorimi i sajtit Firefox Send është gjithashtu subjekt i Shënimit Mbi Privatësi Sajtesh të Mozilla-s dhe Kushteve të Përdorimit të Sajtit. -deletePopupText = Të fshihet kjo kartelë? -deletePopupYes = Po deletePopupCancel = Anuloje deleteButtonHover = Fshije -copyUrlHover = Kopjoji URL-në footerLinkLegal = Ligjore -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Rreth Pilot Testesh footerLinkPrivacy = Privatësi -footerLinkTerms = Kushte footerLinkCookies = Cookies -requirePasswordCheckbox = Kërko doemos një fjalëkalim për shkarkim të kësaj kartele -addPasswordButton = Shtoni fjalëkalim passwordTryAgain = Fjalëkalim i pasaktë. Riprovoni. -// This label is followed by the password needed to download a file -passwordResult = Fjalëkalim: { $password } -reportIPInfringement = Raportoni Cenim IP-je +javascriptRequired = Send lyp JavaScript +whyJavascript = Ç’i duhet Send-it JavaScript-i? +enableJavascript = Ju lutemi, aktivizoni JavaScript-in dhe riprovoni. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Gjatësi maksimum fjalëkalimi: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ky fjalëkalim s’u caktua dot + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Ndarje e thjeshtë, private, kartelash me të tjerët +introDescription = { -send-brand } ju lejon të ndani kartela me të tjerët, me fshehtëzim skaj-më-skaj dhe me një lidhje që skadon automatikisht. Kështu mund ta mbani private atë që ndani me të tjerë dhe të garantoni që gjërat tuaja s’do të qëndrojnë në linjë përgjithmonë. +notifyUploadEncryptDone = Kartela juaj është fshehtëzuar dhe gati për dërgim +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Skadon pas { $downloadCount } ose { $timespan } +timespanMinutes = + { $num -> + [one] 1 minutë + *[other] { $num } minuta + } +timespanDays = + { $num -> + [one] 1 ditë + *[other] { $num } ditë + } +timespanWeeks = + { $num -> + [one] 1 javë + *[other] { $num } javë + } +fileCount = + { $num -> + [one] 1 kartelë + *[other] { $num } kartela + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Madhësia gjithsej: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopjoni lidhjen për dhënien e kartelës tuaj: +copyLinkButton = Kopjoje lidhjen +downloadTitle = Shkarkoni kartela +downloadDescription = Kjo kartelë u nda me të tjerët përmes { -send-brand }, me fshehtëzim skaj-më-skaj dhe një lidhje që skadon automatikisht. +trySendDescription = Provoni { -send-brand }, për ndarje të thjeshtë, të parrezik, kartelash me të tjerët. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Mund të ngarkohet vetëm 1 kartelë në herë. + *[other] Mund të ngarkohen vetëm { $count } kartela në herë. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Lejohet vetëm 1 arkiv. + *[other] Lejohen vetëm { $count } arkiva. + } +expiredTitle = Kjo lidhje ka skaduar. +notSupportedDescription = { -send-brand } s’do të funksionojë me këtë shfletues. { -send-short-brand } funksionin më mirë me versionin më të ri të { -firefox }, dhe do të funksionojë me versionin e tanishëm të shumicës së shfletuesve. +downloadFirefox = Shkarkoni { -firefox } +legalTitle = Njoftim Privatësie Për { -send-short-brand } +legalDateStamp = Version 1.0, daton 12 mars, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Përzgjidhni kartela për ngarkim +trustWarningMessage = Sigurohuni se i besoni marrësit tuaj, kur ndani me të të dhëna rezervat. +uploadButton = Ngarkoje +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Tërhiqni dhe lini kartela +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ose klikoni që të dërgohen deri në { $size } +addPassword = Mbrojini me fjalëkalim +emailPlaceholder = Jepni email-in tuaj +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Bëni hyrjen që të dërgoni deri më { $size } +signInOnlyButton = Hyni +accountBenefitTitle = Krijoni një Llogari { -firefox } ose bëni hyrjen në një të tillë +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ndani me të tjerët kartela deri { $size } +accountBenefitDownloadCount = Ndani kartela me më tepër persona +accountBenefitTimeLimit = + { $count -> + [one] Mbaji aktive lidhjet për deri 1 ditë + *[other] Mbaji aktive lidhjet për deri { $count } ditë + } +accountBenefitSync = Administroni nga çfarëdo pajisje kartela të përbashkëta +accountBenefitMoz = Mësoni më tepër rreth shërbimesh { -mozilla } +signOut = Dilni +okButton = OK +downloadingTitle = Shkarkim +noStreamsWarning = Ky shfletues mund të mos jetë në gjendje të shfshehtëzojë një kartelë kaq të madhe. +noStreamsOptionCopy = Kopjoje lidhjen për ta hapur në një tjetër shfletues +noStreamsOptionFirefox = Provoni shfletuesin tonë të parapëlqyer +noStreamsOptionDownload = Vazhdo me këtë shfletues +downloadFirefoxPromo = { -send-short-brand } ju vjen nga { -firefox }-i i ri fringo. +# the next line after the colon contains a file name +shareLinkDescription = Ndani me të tjerët lidhjen për te kartela juaj: +shareLinkButton = Ndani me të tjerët lidhjen +# $name is the name of the file +shareMessage = Shkarkojeni “{ $name }” me { -send-brand }: shkëmbim kartelash dhe thjesht dhe pa rrezik +trailheadPromo = Ka një rrugë për të mbrojtur privatësinë tuaj. Bëhuni pjesë e Firefox-it. +learnMore = Mësoni më tepër. +downloadFlagged = Kjo lidhje është çaktivizuar, ngaqë cenon kushtet e shërbimit. +downloadConfirmTitle = Edhe një gjë të fundit +downloadConfirmDescription = Sigurohuni se i besoni personit që ju dërgoi këtë kartelë, ngaqë s’mund të verifikojmë se nuk do të vërë në rrezik pajisjen tuaj. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] I besoj personit që dërgoi këtë kartelë + *[other] I besoj personit që dërgoi këto kartela + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Raportojeni këtë kartelë si të dyshimtë + *[other] Raportojeni këto kartela si të dyshimta + } +reportDescription = Ndihmonani të kuptojmë ç’po ndodh. Çfarë mendoni se është gabim me këto kartela? +reportUnknownDescription = Ju lutemi, shkoni te url-ja e lidhjes që doni të raportoni dhe klikoni mbi “{ reportFile }”. +reportButton = Raportoje +reportReasonMalware = Këto kartela përmbajnë malware ose janë pjesë e një sulmi karremëzimi. +reportReasonPii = Këto kartela përmbajnë të dhëna personalisht të identifikueshme rreth meje. +reportReasonAbuse = Këto kartela përmbajnë lëndë të paligjshme ose abuzive. +reportReasonCopyright = Për të raportuar cenim të drejtash kopjimi ose shenjash tregtare, përdorni procesin e përshkruar në këtë faqe. +reportedTitle = Kartela të Raportuara +reportedDescription = Faleminderit. E kemimarrë raportin tuaj rreth këtyre kartelave. diff --git a/public/locales/sr/send.ftl b/public/locales/sr/send.ftl index efbed56c1..85e15cfda 100644 --- a/public/locales/sr/send.ftl +++ b/public/locales/sr/send.ftl @@ -1,117 +1,196 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = веб експеримент -siteFeedback = Повратне информације -uploadPageHeader = Приватно и шифровано дељење датотека -uploadPageExplainer = Шаљите датотеке преко безбедне, приватне и шифроване везе која самостално истиче да ваше ствари не би остале на нету заувек. -uploadPageLearnMore = Сазнајте више -uploadPageDropMessage = Превуците ваше датотеке овде да бисте кренули са отпремањем -uploadPageSizeMessage = За бољи рад предлажемо да датотека не буде већа од 1GB -uploadPageBrowseButton = Изаберите датотеку на рачунару -uploadPageBrowseButton1 = Изаберите датотеку за отпремање -uploadPageMultipleFilesAlert = Отпремање фасцикли или више датотека тренутно није подржано. -uploadPageBrowseButtonTitle = Отпреми датотеку -uploadingPageProgress = Отпремам { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Увозим… -verifyingFile = Потврђујем… encryptingFile = Шифрујем… decryptingFile = Дешифрујем… -notifyUploadDone = Ваше отпремање је завршено. -uploadingPageMessage = Након што се ваша датотека отпреми, моћи ћете да подесите опције истека. -uploadingPageCancel = Откажи отпремање -uploadCancelNotification = Ваше отпремање је отказано. -uploadingPageLargeFileMessage = Ово је велика датотека и отпремање може потрајати. Будите стрпљиви! -uploadingFileNotification = Обавести ме када се отпремање заврши. -uploadSuccessConfirmHeader = Спреман за слање -uploadSvgAlt = Отпреми -uploadSuccessTimingHeader = Веза ка вашој датотеци ће истећи након једног преузимања или након 24 сата. -expireInfo = Веза ка вашој датотеци ће истећи након { $downloadCount } или { $timespan }. -downloadCount = { $num -> - [one] преузимања - [few] преузимања - *[other] преузимања +downloadCount = + { $num -> + [one] { $num } преузимања + [few] { $num } преузимања + *[other] { $num } преузимања } -timespanHours = { $num -> - [one] сата - [few] сата - *[other] сати +timespanHours = + { $num -> + [one] { $num } сата + [few] { $num } сата + *[other] { $num } сати } -copyUrlFormLabelWithName = Ископирајте и поделите везу да бисте послали вашу датотеку: { $filename } -copyUrlFormButton = Копирај у оставу copiedUrl = Ископирано! -deleteFileButton = Обриши датотеку -sendAnotherFileLink = Пошаљи другу датотеку -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Преузми -downloadsFileList = Преузимања -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Време -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Преузимање датотеке { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Унесите лозинку unlockInputPlaceholder = Лозинка unlockButtonLabel = Откључај -downloadFileTitle = Преузми шифровану датотеку -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ваш пријатељ вам је послао датотеку преко услуге Firefox Send која вам омогућава да делите датотеке преко безбедне, приватне и шифроване везе која самостално истиче да ваше ствари не би остале на нету заувек. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Преузми -downloadNotification = Ваше преузимање је завршено. downloadFinish = Преузимање је завршено. -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } од { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Испробајте Firefox Send -downloadingPageProgress = Преузимам датотеку { $filename } ({ $size }) -downloadingPageMessage = Оставите овај језичак отвореним док не добавимо вашу датотеку и док је не дешифрујемо. -errorAltText = Грешка при отпремању +sendYourFilesLink = Испробајте Send errorPageHeader = Нешто је пошло наопако! -errorPageMessage = Догодила се грешка приликом отпремања датотеке. -errorPageLink = Пошаљи другу датотеку fileTooBig = Та датотека је превелика за отпремање. Треба да буде мања од { $size }. linkExpiredAlt = Веза је истекла -expiredPageHeader = Веза је или истекла, или никада није ни постојала! notSupportedHeader = Ваш прегледач није подржан. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Нажалост, овај прегледач не подржава веб технологију која омогућава Firefox Send. Мораћете да пробате са другим прегледачем. Ми предлажемо Firefox! notSupportedLink = Зашто мој прегледач није подржан? -notSupportedOutdatedDetail = Нажалост, ово издање Firefox-a не подржава веб технологију која омогућава Firefox Send. Мораћете да ажурирате ваш прегледач. +notSupportedOutdatedDetail = Нажалост, ово издање Firefox-a не подржава веб технологију која омогућава Send. Мораћете да ажурирате ваш прегледач. updateFirefox = Ажурирај Firefox -downloadFirefoxButtonSub = Бесплатно преузимање -uploadedFile = Датотека -copyFileList = URL за копирање -// expiryFileList is used as a column header -expiryFileList = Истиче за -deleteFileList = Брисање -nevermindButton = Занемари -legalHeader = Услови и приватност -legalNoticeTestPilot = Firefox Send је тренутно Тест Пилот експеримент и подложан је условима коришћења Тест Пилота и обавештењем о приватности. Можете сазнати више о овом експерименту и о његовом сакупљању података овде. -legalNoticeMozilla = Коришћење Firefox Send веб сајта подлеже Mozilla-ином обавештењу о приватности на веб сајтовима и условима коришћења веб сајтова. -deletePopupText = Обрисати ову датотеку? -deletePopupYes = Да deletePopupCancel = Откажи deleteButtonHover = Обриши -copyUrlHover = Ископирај URL footerLinkLegal = Правни подаци -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = О Тест Пилоту footerLinkPrivacy = Приватност -footerLinkTerms = Услови footerLinkCookies = Колачићи -requirePasswordCheckbox = Захтевај лозинку да би преузео ову датотеку -addPasswordButton = Додај лозинку -changePasswordButton = Промени passwordTryAgain = Нетачна лозинка. Пробајте поново. -// This label is followed by the password needed to download a file -passwordResult = Лозинка: { $password } -reportIPInfringement = Пријавите IP прекршај -javascriptRequired = За Firefox Send је потребан JavaScript -whyJavascript = Зашто је потребан JavaScript за Firefox Send? +javascriptRequired = За Send је потребан JavaScript +whyJavascript = Зашто је потребан JavaScript за Send? enableJavascript = Омогућите JavaScript и пробајте поново. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }ч { $minutes }м -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }м +# A short status message shown when the user enters a long password +maxPasswordLength = Највећа дужина лозинке: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Не можемо поставити ову лозинку + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Једноставно и приватно дељење датотека +introDescription = { -send-brand } вам дозвољава да делите датотеке које су шифроване с краја на крај преко везе која самостално истиче. Тако да можете приватно делити ваше ствари које неће остати на вебу заувек. +notifyUploadEncryptDone = Ваша датотека је шифрована и спремна за слање +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Истиче након { $downloadCount } или { $timespan } +timespanMinutes = + { $num -> + [one] { $num } минут + [few] { $num } минута + *[other] { $num } минута + } +timespanDays = + { $num -> + [one] { $num } дан + [few] { $num } дана + *[other] { $num } дана + } +timespanWeeks = + { $num -> + [one] { $num } недеља + [few] { $num } недеље + *[other] { $num } недеља + } +fileCount = + { $num -> + [one] { $num } датотека + [few] { $num } датотеке + *[other] { $num } датотека + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Укупна величина: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Копирајте везу да бисте поделили вашу датотеку: +copyLinkButton = Копирај везу +downloadTitle = Преузми датотеке +downloadDescription = Ова датотека је подељена преко услуге { -send-brand } која омогућава шифровање с краја на крај преко везе која самостално истиче. +trySendDescription = Пробајте { -send-brand } за једноставно и безбедно дељење датотека. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Можете отпремити само { $count } датотеку истовремено. + [few] Можете отпремити само { $count } датотеке истовремено. + *[other] Можете отпремити само { $count } датотека истовремено. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Дозвољена је само { $count } архива. + [few] Дозвољене су само { $count } архиве. + *[other] Дозвољено је само { $count } архива. + } +expiredTitle = Ова веза је истекла. +notSupportedDescription = { -send-brand } неће радити у овом прегледачу. { -send-short-brand } најбоље ради са последњим издањем прегледача { -firefox } и радиће са тренутним издањима већине других прегледача. +downloadFirefox = Преузми { -firefox } +legalTitle = Политика приватности услуге { -send-short-brand } +legalDateStamp = Издање 1.0, датум објављивања 12. март 2019. године +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }д { $hours }ч { $minutes }м +addFilesButton = Изаберите датотеке за отпремање +trustWarningMessage = Будите сигурни да верујете примаоцу пре дељења осетљивих података. +uploadButton = Отпреми +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Превуците и пустите датотеке +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = или кликните за слање садржаја великог до { $size } +addPassword = Заштитите лозинком +emailPlaceholder = Унесите вашу е-адресу +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Пријавите се да пошаљете садржај до { $size } +signInOnlyButton = Пријавите се +accountBenefitTitle = Направите { -firefox } налог или се пријавите +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Поделите датотеке велике до { $size } +accountBenefitDownloadCount = Поделите датотеке са више особа +accountBenefitTimeLimit = + { $count -> + [one] Остави везе активним највише { $count } дан + [few] Остави везе активним највише { $count } дана + *[other] Остави везе активним највише { $count } дана + } +accountBenefitSync = Управљајте подељеним датотекама са било ког уређаја +accountBenefitMoz = Сазнајте више о другим { -mozilla }-иним услугама +signOut = Одјава +okButton = У реду +downloadingTitle = Преузимам +noStreamsWarning = Овај прегледач можда неће моћи да дешифрује оволико велику датотеку. +noStreamsOptionCopy = Копирај везу за отварање у другом прегледачу +noStreamsOptionFirefox = Пробајте наш омиљени прегледач +noStreamsOptionDownload = Наставите у овом прегледачу +downloadFirefoxPromo = { -send-short-brand } вам је омогућен захваљући потпуно новом програму { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Поделите везу до датотеке: +shareLinkButton = Поделите везу +# $name is the name of the file +shareMessage = Преузмите „{ $name }“ помоћу програма { -send-brand }: једноставно и безбедно дељење датотека +trailheadPromo = Постоји начин да заштитите вашу приватност. Придружите се Firefox-у. +learnMore = Сазнајте више. +downloadFlagged = Ова веза је онемогућена због кршења услова услуге. +downloadConfirmTitle = Још једна ствар +downloadConfirmDescription = Будите сигурни да верујете особи која вам је послала ову датотеку, јер не можемо обећати да неће оштетити ваш уређа. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Верујем особи која је послала ову датотеку + [few] Верујем особи која је послала ове датотеке + *[other] Верујем особама које су послале ове датотеке + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Пријави ову датотеку као сумњиву + [few] Пријави ове датотеке као сумњиве + *[other] Пријави ове датотеке као сумњиве + } +reportDescription = Помозите нам да схватимо шта се дешава. Шта мислите да није у реду са овим датотекама? +reportUnknownDescription = Идите на адресу везе коју желите да пријавите и изаберите “{ reportFile }”. +reportButton = Пријави +reportReasonMalware = Ове датотеке садрже злонамеран софтвер или су део напада за крађу идентитета. +reportReasonPii = Ове датотеке садрже моје личне податке. +reportReasonAbuse = Ове датотеке садрже илегални или насилни садржај. +reportReasonCopyright = Да бисте пријавили кршење ауторских права или заштитног знака, следите кораке на овој страници. +reportedTitle = Датотеке су пријављене +reportedDescription = Хвала вам. Примили смо вашу пријаву ових датотека. diff --git a/public/locales/su/send.ftl b/public/locales/su/send.ftl new file mode 100644 index 000000000..1a5d431c2 --- /dev/null +++ b/public/locales/su/send.ftl @@ -0,0 +1,181 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Ngimpor... +encryptingFile = Ngénkripsi... +decryptingFile = Ngadékripsi... +downloadCount = + { $num -> + *[other] { $num } undeuran + } +timespanHours = + { $num -> + *[other] { $num } jam + } +copiedUrl = Ditiron! +unlockInputPlaceholder = Kecap sandi +unlockButtonLabel = Laan konci +downloadButtonLabel = Undeur +downloadFinish = Undeuran anggeus +fileSizeProgress = ({ $partialSize } ti { $totalSize }) +sendYourFilesLink = Pecakan Send +errorPageHeader = Aya nu salah! +fileTooBig = Koropak unjalkeuneun badag teuing. Kudu kurang ti { $size }. +linkExpiredAlt = Tutumbu kadaluwarsa +notSupportedHeader = Panyungsi anjeun teu dirojong +notSupportedLink = Naha panyungsi kuring teu dirojong? +notSupportedOutdatedDetail = Hanjakal Firefox vérsi ieu teu ngarojong téhnologi wéb nu ngagerakkeun Send. Anjeun perlu ngapdét panyungsi anjeun. +updateFirefox = Apdét Firefox +deletePopupCancel = Bolay +deleteButtonHover = Pupus +footerLinkLegal = Légal +footerLinkPrivacy = Privasi +footerLinkCookies = Réréméh +passwordTryAgain = Kecap sandi salah. Pecakan deui. +javascriptRequired = Send merlukeun JavaScript +whyJavascript = Naha Send merlukeun JavaScript? +enableJavascript = Prak hurungkeun JavaScript sarta pecakan deui. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }j { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Panjang sandi maksimal: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Ieu kecap sandi teu bisa disét + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simpel, babagi koropak privat +introDescription = { -send-brand } migampang anjeun babagi koropak kalawan énkripsi tungtung-ka-tungtung sarta tutumbu nu otomatis kadaluwarsa. Sahingga anjeun bisa ngaraksa naon nu ku anjeun bagi sacara privat jeung mastikeun banda anjeun teu salawasna daring. +notifyUploadEncryptDone = Koropak anjeun kaénkripsi sarta siap dikirim. +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Kadaluwarsa sanggeu { $downloadCount } atawa { $timespan } +timespanMinutes = + { $num -> + [one] samenit + *[other] { $num } menit + } +timespanDays = + { $num -> + [one] sapoé + *[other] { $num } poé + } +timespanWeeks = + { $num -> + [one] saminggu + *[other] { $num } minggu + } +fileCount = + { $num -> + [one] sakoropak + *[other] { $num } koropak + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Ukuran total: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Tiron tutumbu pikeun babagi koropak anjeun: +copyLinkButton = Tiron tutumbu +downloadTitle = Undeur koropak +downloadDescription = Ieu koropak geus dibagikeun liwat { -send-brand } kalawan énkripsi tungtung-ka-tungtung sarta tutumbuna otomatis kadaluwarsa. +trySendDescription = Pecakan { -send-brand } pikeun simpelna, babagi koropak aman. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Ayeuna kur sakoropak nu bisa diunjal. + *[other] Ngan { $count } koropak nu bisa diunjal sakaligus. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Ngan saarsip nu diidinan. + *[other] Ngan { $count } arsip nu diidinan. + } +expiredTitle = Ieu tutumbu geus kadaluwarsa. +notSupportedDescription = { -send-brand } moal jalan di ieu panyungsi. { -send-short-brand } jalan naker dina { -firefox } vérsi pamganyarna, sarta bakal jalan di loba panyungsi vérsi kiwari. +downloadFirefox = Undeur { -firefox } +legalTitle = { -send-short-brand } Wawar Privasi +legalDateStamp = Versi 1.0, kaping 12 Maret 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }p { $hours }j { $minutes }m +addFilesButton = Pilih koropak unjalkeuneun +trustWarningMessage = Sing yakin yén anjeun percaya nalika ngabagi data sénsitip ka nu nampa. +uploadButton = Unjal +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Ésérkeun sarta ésotkeun koropak +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = atawa klik pikeun ngirim nika { $size } +addPassword = Piningan ku kecap sandi +emailPlaceholder = Asupkeun surélék anjeun +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Asup sangkan bisa ngirim nika { $size } +signInOnlyButton = Asup +accountBenefitTitle = Jieun akun { -firefox } atawa asup +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Bagikeun koropak nika { $size } +accountBenefitDownloadCount = Bagikeun koropak ka balaréa +accountBenefitTimeLimit = + { $count -> + [one] Aktipkeun tutumbu jang sapoéeun + *[other] Aktipkeun tutumbu jang { $count } poé + } +accountBenefitSync = Kokolakeun koropak nu dibagikeun ti parangkat mana wé +accountBenefitMoz = Tengetan ngeunaan layanan { -mozilla } lianna +signOut = Kaluar +okButton = OKÉH +downloadingTitle = Ngundeur +noStreamsWarning = Ieu panyungsi kawasna mah teu bisa ngadékrip koropak badag kieu. +noStreamsOptionCopy = Tiron tutumbu jang bukaeun di panyungsi séjén +noStreamsOptionFirefox = Pecakan panyungsi karesep kami +noStreamsOptionDownload = Tuluykeun ku ieu panyungsi +downloadFirefoxPromo = { -send-short-brand } téh disanggakeun keur anjeun kalawan { -firefox } sarwa anyar. +# the next line after the colon contains a file name +shareLinkDescription = Bagikeun tutumbu ka koropak anjeun: +shareLinkButton = Bagikeun tutumbu +# $name is the name of the file +shareMessage = Undeur "{ $name }" ku { -send-brand }: simpel, babagi koropak aman +trailheadPromo = Aya cara pikeun ngamankeun privasi anjeun. Jabung jeung Firefox. +learnMore = Lenyepan. +downloadFlagged = Ieu tutumbu ditumpurkeun alatan ngarumpak katangtuan layanan. +downloadConfirmTitle = Hiji deui +downloadConfirmDescription = Sing yakin yén anjeun percaya ka jalma nu ngirim ieu berkas kusabab kami teu bisa mariksa kaamanan ieu berkas. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] Kami percaya ka jalma nu ngirim ieu berkas + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] Laporkeun ieu berkas salaku picurigaeun + } +reportDescription = Béjakeun ka kami masalahna. Naon anu sakirana salah dina ieu berkas? +reportUnknownDescription = Mangga buka url tutumbu anu rék dilaporkeun sarta klik “{ reportFile }”. +reportButton = Laporkeun +reportReasonMalware = Ieu berkas ngandung malwér atawa bagian ti tarajang pising. +reportReasonPii = Ieu berkas ngandung émbaran pribadi kami. +reportReasonAbuse = Ieu berkas ngandung kontén ilégal atawa panyalahgunaan. +reportReasonCopyright = Pikeun ngalaporkeun rumpakan hak cipta atawa mérk dagang, paké prosés anu diécéskeun di dieu. +reportedTitle = Berkas Dilaporkeun +reportedDescription = Nuhun. Laporan anjeun ngeunaan ieu berkas geus katampa. diff --git a/public/locales/sv-SE/send.ftl b/public/locales/sv-SE/send.ftl index 8737da76f..8d5dc8c2a 100644 --- a/public/locales/sv-SE/send.ftl +++ b/public/locales/sv-SE/send.ftl @@ -1,115 +1,185 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = webbexperiment -siteFeedback = Återkoppling -uploadPageHeader = Privat, krypterad fildelning -uploadPageExplainer = Skicka filer via en säker, privat och krypterad länk som automatiskt upphör för att säkerställa att dina saker inte förblir på nätet för alltid. -uploadPageLearnMore = Läs mer -uploadPageDropMessage = Släpp filen här för att börja ladda upp -uploadPageSizeMessage = För den mest tillförlitliga driften är det bäst att hålla din fil under 1 GB -uploadPageBrowseButton = Välj en fil på din dator -uploadPageBrowseButton1 = Välj en fil att ladda upp -uploadPageMultipleFilesAlert = Överföring av flera filer eller en mapp stöds för närvarande inte. -uploadPageBrowseButtonTitle = Ladda upp fil -uploadingPageProgress = Laddar upp { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Importerar… -verifyingFile = Verifierar… encryptingFile = Krypterar… decryptingFile = Avkodar… -notifyUploadDone = Din uppladdning har slutförts. -uploadingPageMessage = När din filuppladdning är klar kommer du att kunna ange alternativ för upphörande. -uploadingPageCancel = Avbryt uppladdning -uploadCancelNotification = Din uppladdning avbröts. -uploadingPageLargeFileMessage = Den här filen är stor och kan ta ett tag att ladda upp. Ha tålamod! -uploadingFileNotification = Meddela mig när uppladdningen är klar. -uploadSuccessConfirmHeader = Klar för att skicka -uploadSvgAlt = Ladda upp -uploadSuccessTimingHeader = Länken till din fil upphör att gälla efter 1 nedladdning eller om 24 timmar. -expireInfo = Länken till din fil upphör att gälla efter { $downloadCount } eller { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 nedladdning *[other] { $num } nedladdningar } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 timme *[other] { $num } timmar } -copyUrlFormLabelWithName = Kopiera och dela länken för att skicka din fil: { $filename } -copyUrlFormButton = Kopiera till urklipp copiedUrl = Kopierad! -deleteFileButton = Ta bort fil -sendAnotherFileLink = Skicka en annan fil -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Ladda ner -downloadsFileList = Nedladdningar -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Tid -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = Ladda ner { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ange lösenord unlockInputPlaceholder = Lösenord unlockButtonLabel = Lås upp -downloadFileTitle = Hämta krypterad fil -// Firefox Send is a brand name and should not be localized. -downloadMessage = Din vän skickar dig en fil med Firefox Send, en tjänst som låter dig dela filer med en säker, privat och krypterad länk som automatiskt upphör för att säkerställa att dina saker inte förblir på nätet för alltid. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Ladda ner -downloadNotification = Din nedladdning har slutförts. downloadFinish = Nedladdning klar -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } av { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Testa Firefox Send -downloadingPageProgress = Laddar ner { $filename } ({ $size }) -downloadingPageMessage = Lämna den här fliken öppen medan vi laddar ner din fil och dekrypterar den. -errorAltText = Uppladdningsfel +sendYourFilesLink = Testa Send errorPageHeader = Något gick fel! -errorPageMessage = Det har uppstått ett fel vid uppladdning av filen. -errorPageLink = Skicka en annan fil fileTooBig = Den filen är för stor för att ladda upp. Det ska vara mindre än { $size }. linkExpiredAlt = Länk upphörd -expiredPageHeader = Den här länken har upphört eller har aldrig existerat i första hand! notSupportedHeader = Din webbläsare stöds inte. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Tyvärr stöder inte webbläsaren den webbteknologi som används av Firefox Send. Du måste försöka med en annan webbläsare. Vi rekommenderar Firefox! notSupportedLink = Varför stöds inte min webbläsare? -notSupportedOutdatedDetail = Tyvärr stödjer den här versionen av Firefox inte webbtekniken som driver Firefox Send. Du måste uppdatera din webbläsare. +notSupportedOutdatedDetail = Tyvärr stödjer den här versionen av Firefox inte webbtekniken som driver Send. Du måste uppdatera din webbläsare. updateFirefox = Uppdatera Firefox -downloadFirefoxButtonSub = Gratis nedladdning -uploadedFile = Fil -copyFileList = Kopiera URL -// expiryFileList is used as a column header -expiryFileList = Upphör -deleteFileList = Ta bort -nevermindButton = Glöm det -legalHeader = Villkor och sekretess -legalNoticeTestPilot = Firefox Send är för närvarande ett Test Pilot experiment och omfattas av Test Pilots användarvillkor och sekretesspolicy. Du kan läsa dig mer om detta experiment och dess datainsamling här. -legalNoticeMozilla = Användning av webbplatsen för Firefox Send är också föremål för Mozillas sekretesspolicy för webbplatser och användarvillkor för webbplatser. -deletePopupText = Ta bort den här filen? -deletePopupYes = Ja deletePopupCancel = Avbryt deleteButtonHover = Ta bort -copyUrlHover = Kopiera URL footerLinkLegal = Juridisk information -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Om Test Pilot footerLinkPrivacy = Sekretess -footerLinkTerms = Villkor footerLinkCookies = Kakor -requirePasswordCheckbox = Kräver ett lösenord för att ladda ner den här filen -addPasswordButton = Lägg till lösenord -changePasswordButton = Ändra passwordTryAgain = Felaktigt lösenord. Försök igen. -// This label is followed by the password needed to download a file -passwordResult = Lösenord: { $password } -reportIPInfringement = Rapportera IP-överträdelse -javascriptRequired = Firefox Send kräver JavaScript -whyJavascript = Varför kräver Firefox Send JavaScript? +javascriptRequired = Send kräver JavaScript +whyJavascript = Varför kräver Send JavaScript? enableJavascript = Aktivera JavaScript och försök igen. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }t { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Maximal lösenordslängd: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Det här lösenordet kunde inte ställas in + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Enkel, privat fildelning +introDescription = { -send-brand } låter dig dela filer med end-to-end-kryptering och en länk som automatiskt upphör. Så att du kan behålla det du delar privat och se till att dina saker inte stannar online för alltid. +notifyUploadEncryptDone = Din fil är krypterad och redo att skickas +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Förfaller efter { $downloadCount } eller { $timespan } +timespanMinutes = + { $num -> + [one] 1 minut + *[other] { $num } minuter + } +timespanDays = + { $num -> + [one] 1 dag + *[other] { $num } dagar + } +timespanWeeks = + { $num -> + [one] 1 vecka + *[other] { $num } veckor + } +fileCount = + { $num -> + [one] 1 fil + *[other] { $num } filer + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = kB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Total storlek: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopiera länken för att dela din fil: +copyLinkButton = Kopiera länk +downloadTitle = Ladda ner filer +downloadDescription = Den här filen delades via { -send-brand } med end-to-end-kryptering och en länk som automatiskt upphör. +trySendDescription = Prova { -send-brand } för enkel, säker fildelning. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Endast 1 fil kan laddas upp i taget. + *[other] Endast { $count } filer kan laddas upp i taget. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Endast 1 arkiv är tillåten. + *[other] Endast { $count } arkiv är tillåtna. + } +expiredTitle = Den här länken har upphört. +notSupportedDescription = { -send-brand } fungerar inte med den här webbläsaren. { -send-short-brand } fungerar bäst med den senaste versionen av { -firefox } och kommer att fungera med den nuvarande versionen av de flesta webbläsare. +downloadFirefox = Hämta { -firefox } +legalTitle = { -send-short-brand } sekretesspolicy +legalDateStamp = Version 1.0, daterad den 12 mars 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }t { $minutes }m +addFilesButton = Välj filer som ska laddas upp +trustWarningMessage = Se till att du litar på din mottagare när du delar känslig information. +uploadButton = Ladda upp +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dra och släpp filer +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = eller klicka för att skicka upp till { $size } +addPassword = Skydda med lösenord +emailPlaceholder = Ange din e-postadress +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Logga in för att skicka upp till { $size } +signInOnlyButton = Logga in +accountBenefitTitle = Skapa ett { -firefox }-konto eller logga in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Dela filer upp till { $size } +accountBenefitDownloadCount = Dela filer med fler personer +accountBenefitTimeLimit = + { $count -> + [one] Håll länk aktiv i upp till 1 dag + *[other] Håll länkar aktiva i upp till { $count } dagar + } +accountBenefitSync = Hantera delade filer från vilken enhet som helst +accountBenefitMoz = Läs om andra { -mozilla }-tjänster +signOut = Logga ut +okButton = OK +downloadingTitle = Laddar ner +noStreamsWarning = Den här webbläsaren kanske inte kan dekryptera en så stor fil. +noStreamsOptionCopy = Kopiera länken för att öppna i en annan webbläsare +noStreamsOptionFirefox = Prova vår favoritwebbläsare +noStreamsOptionDownload = Fortsätt med den här webbläsaren +downloadFirefoxPromo = { -send-short-brand } presenteras för dig av den helt nya { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Dela länken till din fil: +shareLinkButton = Dela länk +# $name is the name of the file +shareMessage = Ladda ner "{ $name }" med { -send-brand }: enkel, säker fildelning +trailheadPromo = Det finns ett sätt att skydda din integritet. Gå med i Firefox. +learnMore = Läs mer. +downloadFlagged = Den här länken har inaktiverats pga brott mot användarvillkoren. +downloadConfirmTitle = En sak till +downloadConfirmDescription = Se till att du litar på personen som skickade dig den här filen eftersom vi inte kan verifiera att den inte skadar din enhet. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Jag litar på personen som skickade denna filen + *[other] Jag litar på personen som skickade dessa filer + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Rapportera denna filen som misstänkt + *[other] Rapportera dessa filer som misstänkta + } +reportDescription = Hjälp oss att förstå vad som händer. Vad tycker du är fel med dessa filer? +reportUnknownDescription = Gå till den url till länken du vill rapportera och klicka på "{ reportFile }". +reportButton = Rapportera +reportReasonMalware = Dessa filer innehåller skadlig kod eller är en del av en nätfiskeattack. +reportReasonPii = Dessa filer innehåller personlig identifierbar information om mig. +reportReasonAbuse = Dessa filer innehåller olagligt eller våldsamt innehåll. +reportReasonCopyright = För att rapportera intrång i upphovsrätt eller varumärke, använd processen som beskrivs på den här sidan. +reportedTitle = Rapporterade filer +reportedDescription = Tack. Vi har fått din rapport om dessa filer. diff --git a/public/locales/te/send.ftl b/public/locales/te/send.ftl index ad523f2b8..55dbca60b 100644 --- a/public/locales/te/send.ftl +++ b/public/locales/te/send.ftl @@ -1,79 +1,136 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = జాల ప్రయోగం -siteFeedback = అభిప్రాయం -uploadPageLearnMore = ఇంకా తెలుసుకోండి -uploadPageDropMessage = ఎగుమతిని ప్రారంభించడానికి మీ ఫైలును ఇక్కడ విడిచిపెట్టండి -uploadPageSizeMessage = అత్యంత నమ్మకమైన కార్యం కోసం, మీ ఫైలును 1GB కంటే తక్కువగా ఉంచడం ఉత్తమం -uploadPageBrowseButton = మీ కంప్యూటర్లో ఒక ఫైలును ఎంచుకోండి -uploadPageBrowseButton1 = ఎక్కించటానికి ఒక ఫైలును ఎంచుకోండి -uploadPageBrowseButtonTitle = ఫైలును ఎగుమతి చేయండి -uploadingPageProgress = { $filename } ({ $size }) ఎక్కుతోంది +# Send is a brand name and should not be localized. +title = Send importingFile = దిగుమతవుతోంది... -verifyingFile = పరిశీలిస్తున్నది… encryptingFile = గుప్తీకరిస్తోంది... decryptingFile = వ్యక్తపరుస్తోంది... -notifyUploadDone = మీ ఎగుమతి పూర్తయింది. -uploadingPageMessage = మీ ఫైలును మీరు ఎగుమతి చేసిన తర్వాత గడువు ఎంపికలను సరిగా ఏర్పాటు చేయగలరు. -uploadingPageCancel = ఎగుమతి రద్దు చేయండి -uploadCancelNotification = మీ ఎగుమతి రద్దు చేయబడింది. -uploadingPageLargeFileMessage = ఈ ఫైలు పెద్దగా ఉంది అందువలన ఎగుమతి చేయడానికి కొంత సమయం పట్టవచ్చు. వేచి ఉండండి! -uploadingFileNotification = ఎగుమతి పూర్తయినప్పుడు నాకు తెలియచేయండి. -uploadSuccessConfirmHeader = పంపించడానికి సిద్ధంగా ఉంది -uploadSvgAlt = ఎగుమతి చేయండి -uploadSuccessTimingHeader = మీ ఫైలు లంకె గడువు 1 దిగుమతి తరువాత లేదా 24 గంటల తరువాత ముగుస్తుంది. -copyUrlFormLabelWithName = మీ ఫైల్ను పంపడానికి లంకెను నకలు చేయండి మరియు పంచండి: { $filename } -copyUrlFormButton = క్లిప్బోర్డ్కు నకలు చేయండి +downloadCount = + { $num -> + [one] 1 దింపుకోలు + *[other] { $num } దింపుకోళ్ళు + } +timespanHours = + { $num -> + [one] 1 గంట + *[other] { $num } గంటలు + } copiedUrl = నకలు చేయబడింది! -deleteFileButton = ఫైలును తొలగించండి -sendAnotherFileLink = మరో ఫైలును పంపండి -// Alternative text used on the download link/button (indicates an action). -downloadAltText = దిగుమతి -downloadFileName = దిగుమతి { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = సంకేతపదాన్ని తెలపండి unlockInputPlaceholder = సంకేతపదం unlockButtonLabel = తాళం తీయి -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = దిగుమతి -downloadNotification = మీ దిగుమతి పూర్తయ్యింది. downloadFinish = దిగుమతి పూర్తయింది -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = { $totalSize }) యొక్క ({ $partialSize } -// Firefox Send is a brand name and should not be localized. sendYourFilesLink = Firefox sendను ప్రయత్నించండి -downloadingPageProgress = దిగుమతిచేస్తున్నది { $filename } ({ $size }) -errorAltText = ఎగుమతిలో లోపం errorPageHeader = ఏదో తప్పిదం జరిగింది! -errorPageMessage = ఫైల్ను ఎగుమతి చేయడంలో లోపం ఉంది. -errorPageLink = మరో ఫైలును పంపండి +fileTooBig = ఆ ఫైలు ఎక్కించడానికి చాలా పెద్దగా ఉంది. ఫైళ్ళు { $size } కంటే తక్కువ పరిమాణంలో ఉండాలి. linkExpiredAlt = లంకె గడువు ముగిసింది -expiredPageHeader = ఈ లంకె గడువు ముగిసింది లేదా ముందు ఎప్పుడూ ఉనికిలో లేదు! notSupportedHeader = మీ విహారిణికి మద్దతు లేదు. notSupportedLink = నా విహారిణికి ఎందుకు మద్దతు లేదు? notSupportedOutdatedDetail = దురదృష్టవశాత్తు Firefox యొక్క ఈ వెర్షన్ Firefox సాంకేతికతను పంపే వెబ్ సాంకేతికతకు మద్దతు ఇవ్వదు. మీరు మీ బ్రౌజర్ని నవీకరించాలి. updateFirefox = Firefoxను నవీకరించు -downloadFirefoxButtonSub = ఉచిత దిగుమతులు -uploadedFile = దస్త్రం -copyFileList = URL నకలుతీయి -// expiryFileList is used as a column header -expiryFileList = ఇంతలో గడువుతీరును -deleteFileList = తొలగించు -nevermindButton = పర్వాలేదు -legalHeader = నిబంధనలు మరియు గోప్యత -deletePopupText = ఈ ఫైలును తొలగించాలా? -deletePopupYes = అవును deletePopupCancel = రద్దుచేయి deleteButtonHover = తొలగించు -copyUrlHover = URLను నకలు చేయండి footerLinkLegal = చట్టపరమైన -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = టెస్ట్ పైలట్ గురించి footerLinkPrivacy = గోప్యత -footerLinkTerms = నియమాలు footerLinkCookies = కుకీలు -requirePasswordCheckbox = ఈ ఫైల్ను దింపుకోటానికి సంకేతపదం అవసరం -addPasswordButton = సంకేతపదం జోడించండి passwordTryAgain = సరికాని సంకేతపదం. మళ్ళీ ప్రయత్నించండి. -// This label is followed by the password needed to download a file -passwordResult = సంకేతపదం: { $password } +javascriptRequired = Sendకి జావాస్క్రిప్టు కావాలి +whyJavascript = Sendకి జావాస్క్రిప్టు ఎందుకు కావాలి? +enableJavascript = జావాస్క్రిప్టు చేతనంచేసి మళ్ళీ ప్రయత్నించండి. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }గం { $minutes }ని +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ని +# A short status message shown when the user enters a long password +maxPasswordLength = సంకేతపదం గరిష్ఠ పొడవు: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ఈ సంకేతపదం పెట్టలేకపోయాం + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = పంపించు +-firefox = Firefox +-mozilla = Mozilla +notifyUploadEncryptDone = మీ ఫైలు గుప్తీకరించబడింది, పంపడానికి సిద్ధంగా ఉంది +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } లేదా { $timespan } తర్వాత కాలంచెల్లుతుంది +timespanMinutes = + { $num -> + [one] 1 నిమిషం + *[other] { $num } నిమిషాలు + } +timespanDays = + { $num -> + [one] 1 రోజు + *[other] { $num } రోజులు + } +timespanWeeks = + { $num -> + [one] 1 వారం + *[other] { $num } వారాలు + } +fileCount = + { $num -> + [one] 1 ఫైలు + *[other] { $num } ఫైళ్లు + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = మొత్తం పరిమాణం: { $size } +# the next line after the colon contains a file name +copyLinkDescription = మీ ఫైలును భాగస్వామ్యం చేయడానికి ఈ లంకెను నకలు చేయండి: +copyLinkButton = లంకెను నకలుతీయి +downloadTitle = ఫైళ్లను దింపుకోండి +expiredTitle = ఈ లంకె గడువు ముగిసింది. +downloadFirefox = { -firefox } ను దింపుకోండి +legalTitle = { -send-short-brand } గోప్యతా నోటీసు +legalDateStamp = వెర్షన్ 1.0, మార్చి 12, 2019 నాటిది +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = ఎక్కించడానికి ఫైళ్ళను ఎంచుకోండి +uploadButton = ఎక్కించు +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ఫైళ్ళను లాగండి మరియు వదలండి +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = లేదా { $size } వరకు పంపడానికి నొక్కండి +addPassword = సంకేతపదంతో రక్షించండి +emailPlaceholder = ఈ ఈమెయిలును ఇవ్వండి +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size } వరకు పంపడానికి ప్రవేశించండి +signInOnlyButton = ప్రవేశించండి +accountBenefitTitle = ఒక { -firefox } ఖాతాని సృష్టించండి లేదా ప్రవేశించండి +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } పరిమాణం ఫైళ్ళ వరకు పంచుకోండి +accountBenefitDownloadCount = ఫైళ్లను ఎక్కువ మందితో పంచుకోండి +accountBenefitTimeLimit = + { $count -> + *[other] లంకెలను { $count } రోజుల వరకు చేతనంగా ఉంచు + } +accountBenefitSync = ఏదైనా పరికరం నుండి పంచుకున్న ఫైళ్ళను నిర్వహించండి +accountBenefitMoz = ఇతర { -mozilla } సేవల గురించి తెలుసుకోండి +signOut = నిష్క్రమించు +okButton = సరే +downloadingTitle = దింపుకుంటోంది +noStreamsWarning = ఈ బ్రౌజర్ ఈ ఫైలును పెద్దగా డీక్రిప్ట్ చేయలేకపోవచ్చు. +noStreamsOptionCopy = మరొక బ్రౌజర్‌లో తెరవడానికి లంకెను నకలు చేయండి +noStreamsOptionFirefox = మా అభిమాన బ్రౌజర్‌ను ప్రయత్నించండి +noStreamsOptionDownload = ఈ బ్రౌజర్‌తో కొనసాగించండి +downloadFirefoxPromo = { -send-short-brand } క్రొత్త { -firefox } ద్వారా మీ ముందుకు తీసుకురాబడుతుంది. +# the next line after the colon contains a file name +shareLinkDescription = మీ ఫైలుకు లంకెను పంచుకోండి: +shareLinkButton = లంకెను పంచుకోండి +# $name is the name of the file +shareMessage = “{ $name }”‌ని { -send-brand }తో దించుకోండి: తేలికైన, సురక్షితమైన ఫైలు పంచుకోలు సేవ +trailheadPromo = మీ అంతరంగికతను కాపాడుకోడానికి ఓ మార్గం ఉంది. Firefoxతో చేరండి. +learnMore = ఇంకా తెలుసుకోండి. diff --git a/public/locales/th/send.ftl b/public/locales/th/send.ftl new file mode 100644 index 000000000..e8970fe34 --- /dev/null +++ b/public/locales/th/send.ftl @@ -0,0 +1,174 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = กำลังนำเข้า… +encryptingFile = กำลังเข้ารหัส… +decryptingFile = กำลังถอดรหัส… +downloadCount = + { $num -> + *[other] { $num } การดาวน์โหลด + } +timespanHours = + { $num -> + *[other] { $num } ชั่วโมง + } +copiedUrl = คัดลอกแล้ว! +unlockInputPlaceholder = รหัสผ่าน +unlockButtonLabel = ปลดล็อก +downloadButtonLabel = ดาวน์โหลด +downloadFinish = การดาวน์โหลดเสร็จสมบูรณ์ +fileSizeProgress = ({ $partialSize } จาก { $totalSize }) +sendYourFilesLink = ลองใช้ Send +errorPageHeader = มีบางอย่างผิดพลาด! +fileTooBig = ไฟล์นั้นใหญ่เกินกว่าจะอัปโหลดได้ ไฟล์ที่จะอัปโหลดควรมีขนาดน้อยกว่า { $size } +linkExpiredAlt = ลิงก์หมดอายุแล้ว +notSupportedHeader = ไม่รองรับเบราว์เซอร์ของคุณ +notSupportedLink = ทำไมจึงไม่รองรับเบราว์เซอร์ของฉัน? +notSupportedOutdatedDetail = น่าเสียดายที่ Firefox รุ่นนี้ไม่สนับสนุนเทคโนโลยีเว็บที่ขับเคลื่อน Send คุณจะต้องอัปเดตเบราว์เซอร์ของคุณ +updateFirefox = อัปเดต Firefox +deletePopupCancel = ยกเลิก +deleteButtonHover = ลบ +footerLinkLegal = ข้อกฎหมาย +footerLinkPrivacy = ความเป็นส่วนตัว +footerLinkCookies = คุกกี้ +passwordTryAgain = รหัสผ่านไม่ถูกต้อง ลองอีกครั้ง +javascriptRequired = Send จำเป็นต้องใช้ JavaScript +whyJavascript = ทำไม Send จึงจำเป็นต้องใช้ JavaScript? +enableJavascript = โปรดเปิดใช้งาน JavaScript แล้วลองอีกครั้ง +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } ชม. { $minutes } นาที +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } นาที +# A short status message shown when the user enters a long password +maxPasswordLength = ความยาวรหัสผ่านสูงสุด: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ไม่สามารถตั้งรหัสผ่านนี้ได้ + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = การแบ่งปันไฟล์ที่ง่ายและเป็นส่วนตัว +introDescription = { -send-brand } ให้คุณแบ่งปันไฟล์ด้วยการเข้ารหัสจากต้นทางถึงปลายทางและลิงก์ที่หมดอายุโดยอัตโนมัติ คุณจึงสามารถเก็บสิ่งที่คุณแบ่งปันไว้เป็นส่วนตัวและตรวจสอบให้แน่ใจว่าข้อมูลของคุณจะไม่ออนไลน์ตลอดไป +notifyUploadEncryptDone = ไฟล์ของคุณได้รับการเข้ารหัสและพร้อมส่ง +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = หมดอายุหลังจาก { $downloadCount } หรือ { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } นาที + } +timespanDays = + { $num -> + *[other] { $num } วัน + } +timespanWeeks = + { $num -> + *[other] { $num } สัปดาห์ + } +fileCount = + { $num -> + *[other] { $num } ไฟล์ + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ขนาดรวม: { $size } +# the next line after the colon contains a file name +copyLinkDescription = คัดลอกลิงก์เพื่อแบ่งปันไฟล์ของคุณ: +copyLinkButton = คัดลอกลิงก์ +downloadTitle = ดาวน์โหลดไฟล์ +downloadDescription = ไฟล์นี้ถูกแบ่งปันผ่าน { -send-brand } พร้อมการเข้ารหัสจากต้นทางถึงปลายทางและลิงก์ที่หมดอายุโดยอัตโนมัติ +trySendDescription = ลองใช้ { -send-brand } สำหรับการแบ่งปันไฟล์ที่ง่ายและปลอดภัย +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] สามารถอัปโหลดได้ครั้งละ { $count } ไฟล์เท่านั้น + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] สามารถอัปโหลดไฟล์เก็บถาวรได้เพียง { $count } ไฟล์เท่านั้น + } +expiredTitle = ลิงก์นี้หมดอายุแล้ว +notSupportedDescription = { -send-brand } จะไม่ทำงานกับเบราว์เซอร์นี้ { -send-short-brand } จะทำงานได้ดีที่สุดกับ { -firefox } รุ่นล่าสุด และจะทำงานกับเบราว์เซอร์ส่วนใหญ่ที่เป็นรุ่นปัจจุบัน +downloadFirefox = ดาวน์โหลด { -firefox } +legalTitle = ประกาศความเป็นส่วนตัวของ { -send-short-brand } +legalDateStamp = รุ่น 1.0 วันที่ 12 มีนาคม 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } วัน { $hours } ชม. { $minutes } นาที +addFilesButton = เลือกไฟล์ที่จะอัปโหลด +trustWarningMessage = ตรวจสอบให้แน่ใจว่าคุณเชื่อใจผู้รับของคุณขณะที่คุณแบ่งปันข้อมูลที่ละเอียดอ่อน +uploadButton = อัปโหลด +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ลากแล้วปล่อยไฟล์ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = หรือคลิกเพื่อส่งได้ถึง { $size } +addPassword = ปกป้องด้วยรหัสผ่าน +emailPlaceholder = ป้อนอีเมลของคุณ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = ลงชื่อเข้าเพื่อส่งได้ถึง { $size } +signInOnlyButton = ลงชื่อเข้า +accountBenefitTitle = สร้างบัญชี { -firefox } หรือลงชื่อเข้า +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = แบ่งปันไฟล์สูงสุดถึง { $size } +accountBenefitDownloadCount = แบ่งปันไฟล์กับผู้คนมากขึ้น +accountBenefitTimeLimit = + { $count -> + *[other] ให้ลิงก์ใช้งานได้นานถึง { $count } วัน + } +accountBenefitSync = จัดการไฟล์ที่แบ่งปันจากอุปกรณ์ใด ๆ +accountBenefitMoz = เรียนรู้เกี่ยวกับบริการ { -mozilla } อื่น ๆ +signOut = ลงชื่อออก +okButton = ตกลง +downloadingTitle = กำลังดาวน์โหลด +noStreamsWarning = เบราว์เซอร์นี้อาจไม่สามารถถอดรหัสไฟล์ขนาดใหญ่เท่านี้ได้ +noStreamsOptionCopy = คัดลอกลิงก์เพื่อเปิดในเบราว์เซอร์อื่น +noStreamsOptionFirefox = ลองเบราว์เซอร์โปรดของเรา +noStreamsOptionDownload = ดำเนินการต่อด้วยเบราว์เซอร์นี้ +downloadFirefoxPromo = { -send-short-brand } สนับสนุนโดย { -firefox } โฉมใหม่ +# the next line after the colon contains a file name +shareLinkDescription = แบ่งปันลิงก์ไปยังไฟล์ของคุณ: +shareLinkButton = แบ่งปันลิงก์ +# $name is the name of the file +shareMessage = ดาวน์โหลด “{ $name }” ด้วย { -send-brand }: การแบ่งปันไฟล์ที่ง่ายและเป็นส่วนตัว +trailheadPromo = มีวิธีปกป้องความเป็นส่วนตัวของคุณ เข้าร่วม Firefox +learnMore = เรียนรู้เพิ่มเติม +downloadFlagged = ลิงก์นี้ถูกปิดการใช้งานเนื่องจากละเมิดข้อกำหนดในการให้บริการ +downloadConfirmTitle = อีกหนึ่งอย่าง +downloadConfirmDescription = ตรวจสอบให้แน่ใจว่าคุณเชื่อถือคนที่ส่งไฟล์นี้ให้คุณ เพราะเราไม่สามารถยืนยันได้ว่าไฟล์นี้จะไม่เป็นอันตรายต่ออุปกรณ์ของคุณ +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] ฉันเชื่อใจคนที่ส่งไฟล์เหล่านี้ + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] รายงานไฟล์เหล่านี้ว่าน่าสงสัย + } +reportDescription = ช่วยให้เราเข้าใจสิ่งที่เกิดขึ้น คุณคิดอย่างไรว่าไฟล์เหล่านี้ผิดปกติ? +reportUnknownDescription = โปรดไปที่ URL ของลิงก์ที่คุณต้องการรายงานและคลิก “{ reportFile }” +reportButton = รายงาน +reportReasonMalware = ไฟล์เหล่านี้มีมัลแวร์หรือเป็นส่วนหนึ่งของการโจมตีแบบฟิชชิ่ง +reportReasonPii = ไฟล์เหล่านี้มีข้อมูลที่สามารถระบุตัวบุคคลได้เกี่ยวกับฉัน +reportReasonAbuse = ไฟล์เหล่านี้มีเนื้อหาที่ผิดกฎหมายหรือไม่เหมาะสม +reportReasonCopyright = หากต้องการรายงานการละเมิดลิขสิทธิ์หรือเครื่องหมายการค้าให้ใช้กระบวนการที่อธิบายไว้ใน หน้านี้ +reportedTitle = ไฟล์ถูกรายงานแล้ว +reportedDescription = ขอบคุณ เราได้รับรายงานของคุณเกี่ยวกับไฟล์เหล่านี้แล้ว diff --git a/public/locales/tl/send.ftl b/public/locales/tl/send.ftl index c29f56e50..c7b05fe57 100644 --- a/public/locales/tl/send.ftl +++ b/public/locales/tl/send.ftl @@ -1,114 +1,118 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Ipadala -siteSubtitle = eksperimento sa web +# Send is a brand name and should not be localized. +title = Send siteFeedback = Feedback -uploadPageHeader = Pribadong, Naka-encrypt na Pagbabahagi ng File -uploadPageExplainer = Magpadala ng mga file sa pamamagitan ng isang ligtas, pribado, at naka-encrypt na link na awtomatikong mawawalan ng bisa upang matiyak na ang iyong mga bagay-bagay ay hindi mananatiling online magpakailanman. -uploadPageLearnMore = Matuto ng higit pa -uploadPageDropMessage = I-drop ang iyong file dito upang simulan ang pag-upload -uploadPageSizeMessage = Para sa pinaka maaasahang operasyon, pinakamahusay na panatilihin ang iyong file sa ilalim ng 1GB -uploadPageBrowseButton = Pumili ng isang file sa iyong computer -uploadPageBrowseButton1 = Pumili ng isang file na mai-upload -uploadPageMultipleFilesAlert = Kasalukuyang hindi sinusuportahan ang pag-upload ng maramihang mga file o isang folder. -uploadPageBrowseButtonTitle = I-upload ang file -uploadingPageProgress = Uploading { $filename } ({ $size }) importingFile = Importing… -verifyingFile = Pinatutunayan... encryptingFile = Encrypting… decryptingFile = Decrypting… -notifyUploadDone = Natapos na ang iyong pag-upload. -uploadingPageMessage = Sa sandaling mag-upload ang iyong file, makakapagtakda ka ng mga expire na pagpipilian. -uploadingPageCancel = Kanselahin ang pag-upload -uploadCancelNotification = Kinansela ang iyong pag-upload. -uploadingPageLargeFileMessage = Ang file na ito ay malaki at maaaring tumagal ng ilang sandali upang mag-upload. Umupo nang masikip! -uploadingFileNotification = Abisuhan ako kapag nakumpleto na ang pag-upload. -uploadSuccessConfirmHeader = Handa nang Ipadala -uploadSvgAlt = I-upload -uploadSuccessTimingHeader = Mag-e-expire ang link sa iyong file pagkatapos ng 1 pag-download o sa loob ng 24 na oras. -expireInfo = Mag-e-expire ang link sa iyong file pagkatapos ng { $downloadCount } o { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 pag-download *[other] { $num } na mga pag-download } -timespanHours = { $num -> - *[one] 1 oras - } -copyUrlFormLabelWithName = Kopyahin at ibahagi ang link upang ipadala ang iyong file: { $filename } -copyUrlFormButton = Kopyahin sa clipboard copiedUrl = Naikopya! -deleteFileButton = Burahin ang file -sendAnotherFileLink = Magpadala ng isang file -// Alternative text used on the download link/button (indicates an action). -downloadAltText = I-download -downloadsFileList = Mga Pag-download -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Oras -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = I-download { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Ilagay ang Password unlockInputPlaceholder = Password unlockButtonLabel = I-unlock -downloadFileTitle = I-download ang Na-encrypt na File -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ang iyong kaibigan ay nagpapadala sa iyo ng isang file na may Firefox Send, isang serbisyo na nagbibigay-daan sa iyo upang magbahagi ng mga file sa isang ligtas, pribado, at naka-encrypt na link na awtomatikong mawawalan ng bisa upang matiyak na ang iyong mga bagay-bagay ay hindi mananatiling online magpakailanman. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = I-download -downloadNotification = Nakumpleto na ang iyong pag-download. downloadFinish = Kumpleto ang Download -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } ng { $totalSize }) -// Firefox Send is a brand name and should not be localized. sendYourFilesLink = Subukan ang Firefox Ipadala -downloadingPageProgress = Downloading { $filename } ({ $size }) -downloadingPageMessage = Paki-iwan ang tab na ito habang binuksan namin ang iyong file at i-decrypt ito. -errorAltText = Mag-upload ng error errorPageHeader = May nagkamali! -errorPageMessage = Nagkaroon ng error sa pag-upload ng file. -errorPageLink = Magpadala ng isang file fileTooBig = Ang file na iyon ay masyadong malaki upang mag-upload. Dapat itong mas mababa sa { $size }. linkExpiredAlt = Nag-expire na ang link -expiredPageHeader = Nag-expire na ang link na ito o hindi kailanman umiiral sa unang lugar! notSupportedHeader = Ang iyong browser ay hindi suportado. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Sa kasamaang palad hindi sinusuportahan ng browser na ito ang teknolohiya sa web na nagpapagana ng Firefox Send. Kailangan mong subukan ang ibang browser. Inirerekomenda namin ang Firefox! notSupportedLink = Bakit hindi suportado ang aking browser? -notSupportedOutdatedDetail = Sa kasamaang palad ang bersyon na ito ng Firefox ay hindi sumusuporta sa teknolohiya ng web na nagpapagana ng Firefox Send. Kailangan mong i-update ang iyong browser. +notSupportedOutdatedDetail = Sa kasamaang palad ang bersyon na ito ng Firefox ay hindi sumusuporta sa teknolohiya ng web na nagpapagana ng Send. Kailangan mong i-update ang iyong browser. updateFirefox = I-update ang Firefox -downloadFirefoxButtonSub = Libreng Download -uploadedFile = File -copyFileList = Kopyahin ang URL -// expiryFileList is used as a column header -expiryFileList = Magtatapos Sa -deleteFileList = I-delete -nevermindButton = Hindi bale -legalHeader = Mga Tuntunin at Pagkapribado -legalNoticeTestPilot = Ang Firefox Ipadala ay kasalukuyang eksperimentong Test Pilot, at napapailalim sa Mga Tuntunin ng Serbisyo at Paunawa sa Privacy. Maaari kang matuto nang higit pa tungkol sa eksperimentong ito at ang koleksyon ng data nito dito. -legalNoticeMozilla = Ang paggamit ng website ng Ipadala ang Firefox ay napapailalim din sa Mga Patakaran sa Privacy ng Website ng Mozilla at Mga Tuntunin ng Paggamit ng Website. -deletePopupText = Tanggalin ang file na ito? -deletePopupYes = Oo deletePopupCancel = Kanselahin deleteButtonHover = I-delete -copyUrlHover = Kopyahin ang URL footerLinkLegal = Legal -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Tungkol sa Test Pilot footerLinkPrivacy = Privacy -footerLinkTerms = Mga term footerLinkCookies = Mga cookie -requirePasswordCheckbox = Mangailangan ng isang password upang i-download ang file na ito -addPasswordButton = Magdagdag ng password -changePasswordButton = Palitan passwordTryAgain = Maling password. Subukan muli. -// This label is followed by the password needed to download a file -passwordResult = Password: { $password } -reportIPInfringement = Report IP Infringement -javascriptRequired = Nangangailangan ang JavaScript sa JavaScript -whyJavascript = Bakit ang JavaScript ay nangangailangan ng JavaScript? +javascriptRequired = Nangangailangan ang Send ng JavaScript +whyJavascript = Bakit ang Send ay nangangailangan ng JavaScript? enableJavascript = Mangyaring paganahin ang JavaScript at subukan muli. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours }h { $minutes }m -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Pinakamataas na haba ng password: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Hindi maitakda ang password na ito + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Firefox send +-send-short-brand = I-send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Simple, pribadong pagbabahagi ng file +notifyUploadEncryptDone = Ang iyong file ay naka-encrypt at handa na i-send +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = mag-e-expire pagkatapos { $downloadCount } o { $timespan } +timespanMinutes = + { $num -> + [one] 1 minuto + *[other] { $num } mga minuto + } +timespanDays = + { $num -> + [one] 1 araw + *[other] { $num } mga araw + } +timespanWeeks = + { $num -> + [one] 1 linggo + *[other] { $num } mga linggo + } +fileCount = + { $num -> + [one] 1 file + *[other] { $num } mga file + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Kabuuang sukat: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Kopyahin ang link upang ibahagi ang iyong file: +copyLinkButton = Kopyahin ang link +downloadTitle = I-download ang mga file +expiredTitle = Ang link na ito ay nag-expire. +downloadFirefox = I-download { -firefox } +legalTitle = { -send-short-brand } Abiso sa Privacy +legalDateStamp = Bersyon 1.0, petsa ng Marso 12, 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }d { $hours }h { $minutes }m +addFilesButton = Piliin ang mga file na mai-upload +uploadButton = I-upload +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = I-drag at i-drop ang mga file +addPassword = Protektahan gamit ang password +emailPlaceholder = Ipasok ang iyong email +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Mag-sign in upang magpadala ng hanggang sa { $size } +signInOnlyButton = Mag sign-in +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Ibahagi ang mga file hanggang sa { $size } +accountBenefitDownloadCount = Ibahagi ang mga file sa ibang tao +accountBenefitMoz = Alamin ang tungkol sa iba pang mga serbisyo ng { -mozilla } +signOut = Mag sign-out +okButton = OK +downloadingTitle = Pag-download +noStreamsWarning = Maaaring hindi mai-decrypt ng browser na ito ang isang file na malaki. +noStreamsOptionCopy = Kopyahin ang link upang buksan sa isa pang browser +noStreamsOptionFirefox = Subukan ang aming paboritong browser +noStreamsOptionDownload = Magpatuloy sa browser na ito +shareLinkButton = Ibahagi ang link +learnMore = Matuto ng higit pa. diff --git a/public/locales/tr/send.ftl b/public/locales/tr/send.ftl index 6be4c401f..cecae5b80 100644 --- a/public/locales/tr/send.ftl +++ b/public/locales/tr/send.ftl @@ -1,111 +1,181 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = web deneyi -siteFeedback = Görüş bildir -uploadPageHeader = Kişiye özel, şifrelenmiş dosya paylaşımı -uploadPageExplainer = Dosyalarınızı güvenli, size özel, şifrelenmiş ve otomatik olarak silinen bir bağlantıyla gönderin. Özel dosyalarınız sonsuza dek internette kalmasın. -uploadPageLearnMore = Daha fazla bilgi alın -uploadPageDropMessage = Yüklemeyi başlatmak için dosyanızı buraya bırakın -uploadPageSizeMessage = Sorun yaşamamak adına dosyanızın 1 GB’den küçük olmasını öneririz -uploadPageBrowseButton = Bilgisayarınızdan bir dosya seçin -uploadPageBrowseButton1 = Yüklenecek dosyayı seçin -uploadPageMultipleFilesAlert = Birden fazla dosya veya klasör yükleme şimdilik desteklenmiyor. -uploadPageBrowseButtonTitle = Dosyayı yükle -uploadingPageProgress = { $filename } yükleniyor ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = İçe aktarılıyor… -verifyingFile = Doğrulanıyor… encryptingFile = Şifreleniyor… decryptingFile = Şifre çözülüyor… -notifyUploadDone = Yüklemeniz tamamlandı. -uploadingPageMessage = Dosyanız yüklendikten sonra zaman aşımını ayarlayabileceksiniz. -uploadingPageCancel = Yüklemeyi iptal et -uploadCancelNotification = Yüklemeniz iptal edildi. -uploadingPageLargeFileMessage = Bu dosya büyük olduğu için yüklenmesi zaman alabilir. Sayfayı kapatmayın! -uploadingFileNotification = Yükleme bitince bana haber ver. -uploadSuccessConfirmHeader = Göndermeye hazır -uploadSvgAlt = Yükle -uploadSuccessTimingHeader = Dosyanız 1 kez indirildikten veya 24 saat geçtikten sonra linkiniz geçersiz olacaktır. -expireInfo = Dosyanızın bağlantısı { $downloadCount } sonra veya { $timespan } zaman aşımına uğrayacaktır. downloadCount = { $num } indirme -timespanHours = { $num -> - *[one] { $num } saat +timespanHours = + { $num -> + [one] 1 saat + *[other] { $num } saat } -copyUrlFormLabelWithName = { $filename } dosyanızı başkasına göndermek için aşağıdaki linki kopyalayın. -copyUrlFormButton = Panoya kopyala copiedUrl = Kopyalandı! -deleteFileButton = Dosyayı sil -sendAnotherFileLink = Başka bir dosya daha gönder -// Alternative text used on the download link/button (indicates an action). -downloadAltText = İndir -downloadsFileList = İndirme -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = Süre -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = { $filename } dosyasını indir -downloadFileSize = ({ $size }) -unlockInputLabel = Parolayı yazın unlockInputPlaceholder = Parola unlockButtonLabel = Kilidi aç -downloadFileTitle = Şifrelenmiş dosyayı indir -// Firefox Send is a brand name and should not be localized. -downloadMessage = Arkadaşınız size Firefox Send ile bir dosya gönderdi. Firefox Send; dosyalarınızı güvenli, size özel, şifrelenmiş ve otomatik olarak silinen bir bağlantıyla paylaşmayı sağlar. Böylece özel dosyalarınız sonsuza dek internette kalmaz. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = İndir -downloadNotification = İndirme tamamlandı. downloadFinish = İndirme tamamlandı -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Firefox Send’i deneyin -downloadingPageProgress = { $filename } indiriliyor ({ $size }) -downloadingPageMessage = Dosyanız indirilip şifresi çözülürken lütfen bu sekmeyi açık bırakın. -errorAltText = Yükleme hatası +sendYourFilesLink = Send’i deneyin errorPageHeader = Bir şeyler ters gitti! -errorPageMessage = Dosyanız yüklenirken bir hata oluştu. -errorPageLink = Başka bir dosya gönder fileTooBig = Dosyanız çok büyük. En fazla { $size } boyutunda olmalı. linkExpiredAlt = Bağlantı zaman aşımına uğramış -expiredPageHeader = Bu bağlantı zaman aşımına uğramış veya böyle bir bağlantı hiç yoktu. notSupportedHeader = Tarayıcınız desteklenmiyor. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Ne yazık ki tarayıcınız Firefox Send için gereken web teknolojilerini desteklemiyor. Başka bir tarayıcıyla deneyebilirsiniz. Önerimiz tabii ki Firefox! notSupportedLink = Tarayıcım neden desteklenmiyor? -notSupportedOutdatedDetail = Kullandığınız Firefox sürümü Firefox Send için gereken web teknolojilerini desteklemiyor. Tarayıcınızı güncellemeniz gerekiyor. +notSupportedOutdatedDetail = Kullandığınız Firefox sürümü Send için gereken web teknolojilerini desteklemiyor. Tarayıcınızı güncellemeniz gerekiyor. updateFirefox = Firefox’u güncelle -downloadFirefoxButtonSub = Ücretsiz indirin -uploadedFile = Dosya -copyFileList = Adresi kopyala -// expiryFileList is used as a column header -expiryFileList = Bitiş süresi -deleteFileList = Sil -nevermindButton = Boş ver -legalHeader = Şart ve Koşullar -legalNoticeTestPilot = Firefox Send bir Test Pilotu deneyidir ve Test Pilotu Hizmet Koşulları ile Gizlilik Bildirimi’ne tabidir. Bu deney ve topladığı veriler hakkında daha fazla bilgi almak isterseniz buraya bakabilirsiniz. -legalNoticeMozilla = Firefox Send’i kullanmak Mozilla’nın Web Siteleri Gizlilik Bildirimi ve Web Siteleri Kullanım Koşulları’na da tabidir. -deletePopupText = Bu dosya silinsin mi? -deletePopupYes = Evet deletePopupCancel = Vazgeç deleteButtonHover = Sil -copyUrlHover = Adresi kopyala footerLinkLegal = Yasal Bilgiler -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Test Pilotu hakkında footerLinkPrivacy = Gizlilik -footerLinkTerms = Şartlar footerLinkCookies = Çerezler -requirePasswordCheckbox = Bu dosyayı indirmek için parola iste -addPasswordButton = Parola ekle -changePasswordButton = Değiştir passwordTryAgain = Yanlış parola. Yeniden deneyin. -// This label is followed by the password needed to download a file -passwordResult = Parola: { $password } -reportIPInfringement = Telif hakkı ihlali bildir -javascriptRequired = Firefox Send için JavaScript gerekir -whyJavascript = Firefox Send neden JavaScript kullanıyor? +javascriptRequired = Send için JavaScript gerekir +whyJavascript = Send neden JavaScript kullanıyor? enableJavascript = Lütfen JavaScript'i etkinleştirip yeniden deneyin. -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } sa { $minutes } dk -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } dk +# A short status message shown when the user enters a long password +maxPasswordLength = Maksimum parola uzunluğu: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Parola ayarlanamadı + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Basit ve gizli dosya paylaşımı +introDescription = { -send-brand } ile dosyalarınızı uçtan uca şifreleme ve otomatik olarak silinen bir bağlantıyla paylaşın. Böylece özel dosyalarınız güvenle saklanır, bir süre sonra kendi kendine silinir. +notifyUploadEncryptDone = Dosyanız şifrelendi ve gönderilmeye hazır +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } veya { $timespan } sonra silinecek +timespanMinutes = + { $num -> + [one] 1 dakika + *[other] { $num } dakika + } +timespanDays = + { $num -> + [one] 1 gün + *[other] { $num } gün + } +timespanWeeks = + { $num -> + [one] 1 hafta + *[other] { $num } hafta + } +fileCount = + { $num -> + [one] 1 dosya + *[other] { $num } dosya + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Toplam boyut: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Dosyanızı paylaşmak için bağlantıyı kopyalayın: +copyLinkButton = Bağlantıyı kopyala +downloadTitle = Dosyaları indir +downloadDescription = Bu dosya { -send-brand } üzerinden paylaşıldı. Uçtan uca şifreleme ve kendiliğinden silinen bağlantı koruması { -send-brand }’de. +trySendDescription = Basit ve güvenli dosya paylaşımı için { -send-brand }’i deneyin. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Bir kerede en fazla 1 dosya yükleyebilirsiniz. + *[other] Bir kerede en fazla { $count } dosya yükleyebilirsiniz. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] En fazla 1 arşive izin veriliyor. + *[other] En fazla { $count } arşive izin veriliyor. + } +expiredTitle = Bu bağlantının süresi doldu. +notSupportedDescription = { -send-brand } bu tarayıcıyı desteklemiyor. { -send-short-brand } en iyi şekilde { -firefox }’un son sürümüyle ve çoğu tarayıcının güncel sürümüyle çalışır. +downloadFirefox = { -firefox }’u indir +legalTitle = { -send-short-brand } Gizlilik Bildirimi +legalDateStamp = Sürüm 1.0, 12 Mart 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } g { $hours } sa { $minutes } dk +addFilesButton = Yüklenecek dosyaları seçin +trustWarningMessage = Hassas verileri paylaşırken alıcıya güvendiğinizden emin olun. +uploadButton = Yükle +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Dosyaları sürükleyip bırakarak +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = veya buraya tıklayarak { $size }’ye kadar dosyalarınızı gönderebilirsiniz +addPassword = Parola koruması ekle +emailPlaceholder = E-posta adresinizi yazın +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = { $size }’ye kadar dosya göndermek için giriş yapın +signInOnlyButton = Giriş yap +accountBenefitTitle = { -firefox } Hesabı açın veya giriş yapın +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = { $size } boyutlu dosyaları paylaşma +accountBenefitDownloadCount = Daha fazla kişiyle dosya paylaşma +accountBenefitTimeLimit = + { $count -> + [one] Bağlantıları 1 güne kadar aktif tutma + *[other] Bağlantıları { $count } güne kadar aktif tutma + } +accountBenefitSync = Paylaştığınız dosyaları başka cihazlardan yönetebilme +accountBenefitMoz = Diğer { -mozilla } servisleri hakkında bilgi alma +signOut = Çıkış yap +okButton = Tamam +downloadingTitle = İndiriliyor +noStreamsWarning = Bu tarayıcı bu kadar büyük bir dosyanın şifresini çözemeyebilir. +noStreamsOptionCopy = Bağlantıyı başka bir tarayıcıda açmak için kopyala +noStreamsOptionFirefox = En sevdiğimiz tarayıcıyı deneyin +noStreamsOptionDownload = Bu tarayıcıyla devam edin +downloadFirefoxPromo = { -send-short-brand }, yepyeni { -firefox } tarafından sunulmaktadır. +# the next line after the colon contains a file name +shareLinkDescription = Dosyanızın bağlantısını paylaşın: +shareLinkButton = Bağlantıyı paylaş +# $name is the name of the file +shareMessage = “{ $name }” dosyasını { -send-brand } ile indirin: basit ve güvenli dosya paylaşımı +trailheadPromo = Gizliliğinizi korumanın bir yolu var. Firefox’a katılın. +learnMore = Daha fazla bilgi alın. +downloadFlagged = Bu bağlantı hizmet koşullarımızı ihlal ettiği için devre dışı bırakıldı. +downloadConfirmTitle = Bir şey daha +downloadConfirmDescription = Bu dosyayı gönderen kişiye güvendiğinizden emin olun. Dosyanın cihazınıza zarar vermeyeceğini garanti edemeyiz. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Bu dosyayı gönderen kişiye güveniyorum + *[other] Bu dosyaları gönderen kişiye güveniyorum + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Bu dosyanın şüpheli olduğunu bildir + *[other] Bu dosyaların şüpheli olduğunu bildir + } +reportDescription = Meseleyi anlamamıza yardımcı olun. Bu dosyalardaki sorun nedir? +reportUnknownDescription = Lütfen rapor etmek istediğiniz bağlantının adresine girip “{ reportFile }” bağlantısına tıklayın. +reportButton = Şikâyet et +reportReasonMalware = Bu dosyalar kötü amaçlı yazılım içeriyor veya kimlik avı saldırında kullanılıyor. +reportReasonPii = Bu dosyalar benim hakkımda kişisel bilgiler içeriyor. +reportReasonAbuse = Bu dosyalar yasa dışı veya istismar amaçlı içerik içeriyor. +reportReasonCopyright = Telif hakkı veya ticari marka ihlallerini bildirmek için bu sayfadaki adımları izlemelisiniz. +reportedTitle = Dosyalar rapor edildi +reportedDescription = Teşekkür ederiz. Bu dosyalarla ilgili şikâyetinizi aldık. diff --git a/public/locales/trs/send.ftl b/public/locales/trs/send.ftl new file mode 100644 index 000000000..a6a84c853 --- /dev/null +++ b/public/locales/trs/send.ftl @@ -0,0 +1,106 @@ +# Send is a brand name and should not be localized. +title = Send +importingFile = Hìaj a'nïn huan'ānj… +encryptingFile = Nagi'iaj hùij… +decryptingFile = Hìaj nâ'nïn… +downloadCount = + { $num -> + [one] 1 sa nadunin + *[other] { $num } nej sa nadunin + } +timespanHours = + { $num -> + [one] 1 ôra + *[other] { $num } nej ôra + } +copiedUrl = Ngà gisîj guxunj! +unlockInputPlaceholder = Da'nga' huìi +unlockButtonLabel = Na'nïn riñanj +downloadButtonLabel = Nadunïnj +downloadFinish = Ngà nahui nanïnj +fileSizeProgress = ({ $partialSize } guendâ { $totalSize }) +sendYourFilesLink = Garahuè dàj 'iaj sun Send +errorPageHeader = Huā sa gahui a'nan'! +fileTooBig = Ûta yachìj hua archibô dan. Da'ui gā li doj ga da' { $size } +linkExpiredAlt = Nitāj si ni'ñānj lînk gà' +notSupportedHeader = Nitāj si huā hue'ê riña sa nana'uî't. +notSupportedLink = Nù huin saj nitāj si huā hue'ê riña sa nana'uí? +notSupportedOutdatedDetail = Nu unùkuaj Firefox nan gi'iaj sunj ngà sa 'iaj sun ngà Send. Da'uît nāgi'iaj nakàt riña sa nana'uî't han. +updateFirefox = Nagi'iaj nakà Firefox +deletePopupCancel = Duyichin' +deleteButtonHover = Dure' +footerLinkLegal = Nuguan' a'nï'ïn +footerLinkPrivacy = Sa hùii +footerLinkCookies = Nej kôki +passwordTryAgain = Sê da'nga' huì dan huin. Ginù huin ñû. +javascriptRequired = Ni'ñānj Send JavaScript +whyJavascript = Nù huin saj ni'ñānj Send JavaScript rà'aj? +enableJavascript = Gi'iaj sunūj u ga'nïn gi'iaj sun JavaScript nī yakāj da'nga' ñû. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }h { $minutes }m +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m +# A short status message shown when the user enters a long password +maxPasswordLength = Dānaj gā yachìj da'nga huìi: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Na'ue gārayinaj da'nga huìi + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Hìo nī huì ga’ue duyingâ’t archîbo +introDescription = { -send-brand } a’nïn duyingâ’t archîbo ngà ‘ngō da’nga’rán hia nī ngà ‘ngō lînk nare’ man‘an. Dànanj nī ‘ngō rïnt ni’in sa duyingâ’t nī si lînk si ginu yitïn riña lînia. +notifyUploadEncryptDone = Ngà huā ran si archibôt nī ngà huā yugui da’ ga’nïnjt gan’an +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Narè’ man ne’ rukù { $downloadCount } asi { $timespan } +timespanMinutes = + { $num -> + [one] 1 minûtu + *[other] { $num } minûtu + } +timespanDays = + { $num -> + [one] 1 gui + *[other] { $num } gui + } +timespanWeeks = + { $num -> + [one] 1 semâna + *[other] { $num } semâna + } +fileCount = + { $num -> + [one] 1 archîbo + *[other] { $num } archîbo + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Dàj nìko yàchi: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Guxūn lînk da' ga'ue duyingâ't archibô: +copyLinkButton = Guxûn lînk +downloadTitle = Nadunïnj nej archîbo +downloadFirefox = Nadunïnj { -firefox } +legalTitle = Nuguan huì nikāj { -send-short-brand } +uploadButton = Nādusîj +addPassword = Dugumî da’nga’ huìi man +emailPlaceholder = Gāchrūn si korreot +signInOnlyButton = Gāyi'ì sēsiûn +signOut = Narun' sesiôn +okButton = Ga'ue +downloadingTitle = Hìaj nadunīnj man +shareLinkButton = Duguachîn enlâse +learnMore = Gāhuin chrūn doj. diff --git a/public/locales/uk/send.ftl b/public/locales/uk/send.ftl index 64c6cb338..8c661dd48 100644 --- a/public/locales/uk/send.ftl +++ b/public/locales/uk/send.ftl @@ -1,103 +1,196 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = веб-експеримент -siteFeedback = Відгуки -uploadPageHeader = Приватний, зашифрований обмін файлами -uploadPageExplainer = Надсилайте файли, використовуючи безпечні, приватні та зашифровані посилання, термін дії яких автоматично закінчується, щоб ваші файли не лишилися в Інтернеті назавжди. -uploadPageLearnMore = Докладніше -uploadPageDropMessage = Перетягніть свій файл сюди, щоб почати вивантаження -uploadPageSizeMessage = Для більш надійної роботи сервісу, розмір вашого файлу не має перевищувати 1ГБ. -uploadPageBrowseButton = Виберіть файл на комп'ютері -uploadPageBrowseButton1 = Виберіть файл для вивантаження -uploadPageMultipleFilesAlert = Вивантаження кількох файлів чи тек на даний момент не підтримується. -uploadPageBrowseButtonTitle = Вивантажити файл -uploadingPageProgress = Вивантажуємо { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Імпортуємо... -verifyingFile = Перевіряємо... encryptingFile = Шифруємо... decryptingFile = Розшифровуємо... -notifyUploadDone = Ваше вивантаження завершено. -uploadingPageMessage = Як тільки ваш вайл вивантажиться,ви зможете встановити термін зберігання. -uploadingPageCancel = Скасувати вивантаження -uploadCancelNotification = Ваше вивантаження було скасовано. -uploadingPageLargeFileMessage = Цей файл доволі великий і його вивантаження може зайняти певний час. Тримайтеся! -uploadingFileNotification = Сповістити мене, коли вивантаження буде готово. -uploadSuccessConfirmHeader = Готовий до надсилання -uploadSvgAlt = Вивантажити -uploadSuccessTimingHeader = Час дії цього посилання закінчиться після 1 завантаження, або через 24 години. -expireInfo = Посилання на ваш файл стане недійсним після { $downloadCount } файла, або через { $timespan }. -downloadCount = { $num -> +downloadCount = + { $num -> [one] 1 завантаження [few] { $num } завантаження *[other] { $num } завантажень } -timespanHours = { $num -> +timespanHours = + { $num -> [one] 1 година [few] { $num } години *[other] { $num } годин } -copyUrlFormLabelWithName = Скопіювати і поділитися посиланням на ваш файл: { $filename } -copyUrlFormButton = Копіювати у буфер обміну copiedUrl = Скопійовано! -deleteFileButton = Видалити файл -sendAnotherFileLink = Надіслати інший файл -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Завантаживи -downloadFileName = Завантажити { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = Введіть пароль unlockInputPlaceholder = Пароль unlockButtonLabel = Розблокувати -downloadFileTitle = Завантажити зашифрований файл -// Firefox Send is a brand name and should not be localized. -downloadMessage = Ваш друг надіслав файл за допомогою Firefox Send, який дозволяє ділитися файлами, використовуючи безпечні, приватні та зашифровані посилання, термін дії яких автоматично закінчується, щоб ваші файли не лишилися в Інтернеті назавжди. -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = Завантажити -downloadNotification = Ваше завантаження готово. -downloadFinish = Завантаження готово -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +downloadFinish = Завантаження завершено fileSizeProgress = ({ $partialSize } з { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Спробуйте Firefox Send -downloadingPageProgress = Завантаження { $filename } ({ $size }) -downloadingPageMessage = Будь ласка, залиште цю вкладку відкритою, поки ми завантажуємо ваш файл і розшифровуємо його. -errorAltText = Помилка вивантаження +sendYourFilesLink = Спробуйте Send errorPageHeader = Щось пішло не так! -errorPageMessage = Сталась помилка при вивантаженні цього файлу. -errorPageLink = Надіслати інший файл fileTooBig = Цей файл завеликий для вивантаження. Він має бути меншим за { $size }. linkExpiredAlt = Час дії посилання минув -expiredPageHeader = Посилання не існує, або час його дії минув! notSupportedHeader = Ваш браузер не підтримується. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = На жаль, цей браузер не підтримує веб-технологію, завдяки якій працює Firefox Send. Вам треба скористатися іншим браузером. Ми рекомендуємо Firefox! notSupportedLink = Чому мій браузер не підтримується? -notSupportedOutdatedDetail = На жаль, ця версія Firefox не підтримує веб-технологію, завдяки якій працює Firefox Send. Вам потрібно оновити свій браузер. +notSupportedOutdatedDetail = На жаль, ця версія Firefox не підтримує веб-технологію, завдяки якій працює Send. Вам потрібно оновити свій браузер. updateFirefox = Оновити Firefox -downloadFirefoxButtonSub = Безкоштовне завантаження -uploadedFile = Файл -copyFileList = Копіювати URL -// expiryFileList is used as a column header -expiryFileList = Термін дії закінчується -deleteFileList = Видалити -nevermindButton = Не важливо -legalHeader = Умови та конфіденційність -legalNoticeTestPilot = Firefox Send в даний час є експериментом Test Pilot, і тому підпадає під умови служби і повідомлення про приватність Test Pilot. Ви можете дізнатись більше про цей експеримент і його збір даних тут. -legalNoticeMozilla = Використання сайту Firefox Send також підпадає під повідомлення про конфіденційність веб-сайтів та правила використання веб-сайтів Mozilla. -deletePopupText = Видалити цей файл? -deletePopupYes = Так deletePopupCancel = Скасувати deleteButtonHover = Видалити -copyUrlHover = Копіювати URL footerLinkLegal = Права -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Про Test Pilot footerLinkPrivacy = Приватність -footerLinkTerms = Умови footerLinkCookies = Куки -requirePasswordCheckbox = Вимагати пароль для завантаження цього файлу -addPasswordButton = Додати пароль passwordTryAgain = Невірний пароль. Спробуйте знову. -// This label is followed by the password needed to download a file -passwordResult = Пароль: { $password } -reportIPInfringement = Повідомити про порушення прав на інтелектуальну власність +javascriptRequired = Send потребує JavaScript +whyJavascript = Чому для Send потрібен JavaScript? +enableJavascript = Будь ласка, увімкніть JavaScript та спробуйте знову. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } год. { $minutes } хв. +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } хв. +# A short status message shown when the user enters a long password +maxPasswordLength = Найбільша довжина паролю: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Неможливо встановити цей пароль + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Простий, приватний обмін файлами +introDescription = { -send-brand } дозволяє обмінюватися файлами з використанням наскрізного шифрування та посиланнями з обмеженим терміном дії. Отже, ви можете бути певними, що ваші дані зберігаються приватно і не залишаться в мережі назавжди. +notifyUploadEncryptDone = Ваш файл зашифрований і готовий до надсилання +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Термін зберігання завершується після { $downloadCount } або { $timespan } +timespanMinutes = + { $num -> + [one] 1 хвилина + [few] { $num } хвилини + *[other] { $num } хвилин + } +timespanDays = + { $num -> + [one] 1 день + [few] { $num } дні + *[other] { $num } днів + } +timespanWeeks = + { $num -> + [one] 1 тиждень + [few] { $num } тижні + *[other] { $num } тижнів + } +fileCount = + { $num -> + [one] 1 файл + [few] { $num } файли + *[other] { $num } файлів + } +# byte abbreviation +bytes = Б +# kibibyte abbreviation +kb = КБ +# mebibyte abbreviation +mb = МБ +# gibibyte abbreviation +gb = ГБ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Загальний розмір: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Скопіюйте посилання для спільного доступу: +copyLinkButton = Копіювати посилання +downloadTitle = Завантажити файли +downloadDescription = Цей файл було надіслано через { -send-brand } з використанням наскрізного шифрування і посиланням, що має обмежений термін дії. +trySendDescription = Спробуйте { -send-brand } для простого, захищеного обміну файлами. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] Лише 1 файл можна вивантажити за один раз. + [few] Лише { $count } файли можна вивантажити за один раз. + *[other] Лише { $count } файлів можна вивантажити за один раз. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] Дозволяється лише 1 архів. + [few] Дозволяється лише { $count } архіви. + *[other] Дозволяється лише { $count } архівів. + } +expiredTitle = Термін дії цього посилання завершився. +notSupportedDescription = { -send-brand } не працюватиме з цим браузером. { -send-short-brand } найкраще працює з найновішою версією { -firefox }, а також з більшістю інших браузерів. +downloadFirefox = Завантажити { -firefox } +legalTitle = Повідомлення про приватність { -send-short-brand } +legalDateStamp = Версія 1.0 від 12 березня 2019 року +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }д { $hours }г { $minutes }хв +addFilesButton = Оберіть файли для вивантаження +trustWarningMessage = Переконайтеся, що довіряєте одержувачу коли ділитеся вразливими даними. +uploadButton = Вивантажити +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Перетягуйте файли +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = або натисніть, щоб надіслати до { $size } +addPassword = Захист паролем +emailPlaceholder = Введіть свою електронну пошту +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Увійдіть, щоб надсилати файли розміром до { $size } +signInOnlyButton = Увійти +accountBenefitTitle = Створіть обліковий запис { -firefox } або увійдіть +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Обмінюйтесь файлами розміром до { $size } +accountBenefitDownloadCount = Обмінюйтесь файлами з більшою кількістю людей +accountBenefitTimeLimit = + { $count -> + [one] Термін дії посилання 1 день + [few] Термін дії посилання { $count } дні + *[many] Термін дії посилання { $count } днів + } +accountBenefitSync = Керуйте спільними файлами з буль-якого пристрою +accountBenefitMoz = Дізнайтеся про інші сервіси { -mozilla } +signOut = Вийти +okButton = Гаразд +downloadingTitle = Завантаження +noStreamsWarning = Цьому браузеру може не вдатися розшифрувати такий великий файл. +noStreamsOptionCopy = Скопіюйте посилання, щоб відкрити його в іншому браузері +noStreamsOptionFirefox = Спробуйте наш улюблений браузер +noStreamsOptionDownload = Продовжити в цьому браузері +downloadFirefoxPromo = { -send-short-brand } доступний для вас в цілком новому { -firefox }. +# the next line after the colon contains a file name +shareLinkDescription = Надішліть посилання на свій файл: +shareLinkButton = Поділитись посиланням +# $name is the name of the file +shareMessage = Завантажте “{ $name }” з { -send-brand }: простий та безпечний обмін файлами +trailheadPromo = Існує спосіб захистити вашу приватність. Приєднуйтесь до Firefox. +learnMore = Докладніше. +downloadFlagged = Це посилання вимкнено через порушення умов надання послуг. +downloadConfirmTitle = Ще порада +downloadConfirmDescription = Переконайтеся, що довіряєте відправнику цього файлу, оскільки ми не можемо перевірити, чи він не зашкодить вашому пристрою. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] Я довіряю відправнику цього файлу + [few] Я довіряю відправнику цих файлів + *[many] Я довіряю відправнику цих файлів + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] Повідомити, що цей файл є підозрілим + [few] Повідомити, що ці файли є підозрілими + *[many] Повідомити, що ці файли є підозрілими + } +reportDescription = Допоможіть нам зрозуміти, що відбувається. Що, на вашу думку, з цими файлами не так? +reportUnknownDescription = Перейдіть до url-адреси посилання, про яке хочете надіслати звіт, та натисніть “{ reportFile }”. +reportButton = Надіслати звіт +reportReasonMalware = Ці файли містять зловмисне програмне забезпечення або є частиною фішинг-атаки. +reportReasonPii = Ці файли містять мої особисті дані. +reportReasonAbuse = Ці файли містять незаконний або образливий вміст. +reportReasonCopyright = Щоб повідомити про порушення авторських прав або торговельних марок, скористайтеся настановами з цієї сторінки. +reportedTitle = Звіт про файли надіслано +reportedDescription = Дякуємо. Ми отримали ваш звіт про ці файли. diff --git a/public/locales/vi/send.ftl b/public/locales/vi/send.ftl index 81692eff8..88ad9e2bb 100644 --- a/public/locales/vi/send.ftl +++ b/public/locales/vi/send.ftl @@ -1,82 +1,174 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Thử nghiệm trên web -siteFeedback = Phản hồi -uploadPageHeader = Chia sẻ tập tin riêng tư, được mã hóa -uploadPageExplainer = Gửi tập tin qua một liên kết an toàn, riêng tư, được mã hóa và tự động hết hạn để chắc chắn rằng dữ liệu của bạn không nằm mãi mãi trên Internet. -uploadPageLearnMore = Tìm hiểu thêm -uploadPageDropMessage = Kéo thả tập tin của bạn vào đây và bắt đầu tải lên -uploadPageSizeMessage = Để có thể hoạt động tốt nhất, hãy giữ tập tin của bạn dưới 1GB. -uploadPageBrowseButton = Chọn một tập tin từ máy tính -uploadPageBrowseButton1 = Chọn tập tin để tải lên -uploadPageMultipleFilesAlert = Tải lên nhiều tập tin một lúc hoặc tải lên một thư mục chưa được hỗ trợ. -uploadPageBrowseButtonTitle = Tải tập tin lên -uploadingPageProgress = Đang tải lên { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = Đang nhập... -verifyingFile = Đang xác thực... encryptingFile = Đang mã hóa... decryptingFile = Đang giải mã... -notifyUploadDone = Quá trình tải lên đã hoàn tất. -uploadingPageMessage = Một khi tập tin được tải lên, bạn sẽ có thể thiết lập các tùy chọn hết hạn của tập tin. -uploadingPageCancel = Hủy tải lên -uploadCancelNotification = Quá trình tải lên đã bị hủy. -uploadingPageLargeFileMessage = Tập tin này khá nặng và sẽ tốn một chút thời gian để tải lên. Chờ chút nhé! -uploadingFileNotification = Thông báo cho tôi khi tải lên hoàn tất. -uploadSuccessConfirmHeader = Đã sẵn sàng để Gửi -uploadSvgAlt = Tải lên -uploadSuccessTimingHeader = Liên kết đến tập tin của bạn sẽ hết hạn sau 1 lượt tải về hoặc trong 24 giờ. -copyUrlFormLabelWithName = Sao chép và chia sẻ liên kết để gửi tập tin của bạn: { $filename } -copyUrlFormButton = Sao chép vào vùng nhớ tạm +downloadCount = + { $num -> + *[other] { $num } lượt tải + } +timespanHours = + { $num -> + *[other] { $num } giờ + } copiedUrl = Đã sao chép! -deleteFileButton = Xóa tập tin -sendAnotherFileLink = Gửi tập tin khác -// Alternative text used on the download link/button (indicates an action). -downloadAltText = Tải về -downloadFileName = Tải về { $filename } -downloadFileSize = ({ $size }) -// Firefox Send is a brand name and should not be localized. -downloadMessage = Bạn của bạn đang gửi một tập tin thông qua Firefox Send, một dịch vụ cho phép bạn chia sẻ tập tin một cách an toàn, riêng tư, có liên kết được mã hóa và sẽ tự động hết hạn để chắc chắn rằng dữ liệu của bạn không nằm mãi mãi trên Internet. -// Text and title used on the download link/button (indicates an action). -downloadButtonLabel = Tải về -downloadNotification = Quá trình tải về đã hoàn tất. -downloadFinish = Tải về hoàn tất -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". +unlockInputPlaceholder = Mật khẩu +unlockButtonLabel = Mở khóa +downloadButtonLabel = Tải xuống +downloadFinish = Tải xuống hoàn tất fileSizeProgress = ({ $partialSize } trong { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = Dùng thử Firefox Send -downloadingPageProgress = Đang tải về { $filename } ({ $size }) -downloadingPageMessage = Vui lòng giữ cửa sổ này mở trong khi chúng tôi lấy tập tin và giải mã chúng. -errorAltText = Lỗi tải lên +sendYourFilesLink = Dùng thử Send errorPageHeader = Có gì đó không ổn! -errorPageMessage = Đã có lỗi trong quá trình tải lên tập tin. -errorPageLink = Gửi tập tin khác fileTooBig = Tập tin này quá lớn để tải lên. Kích thước tập tin phải nhỏ hơn { $size }. linkExpiredAlt = Liên kết đã hết hạn -expiredPageHeader = Liên kết này đã hết hạn hoặc chưa từng được sử dụng! notSupportedHeader = Trình duyệt của bạn không được hỗ trợ. -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = Thật không may trình duyệt này không hỗ trợ công nghệ đã tạo nên Firefox Send. Bạn cần thử với trình duyệt khác. Chúng tôi khuyên dùng Firefox! notSupportedLink = Tại sao trình duyệt của tôi không được hỗ trợ? -notSupportedOutdatedDetail = Thật không may là phiên bản Firefox này không hỗ trợ công nghệ được sử dụng trong Firefox Send. Bạn cần cập nhật trình duyệt của bạn. +notSupportedOutdatedDetail = Thật không may là phiên bản Firefox này không hỗ trợ công nghệ được sử dụng trong Send. Bạn cần cập nhật trình duyệt của bạn. updateFirefox = Cập nhật Firefox -downloadFirefoxButtonSub = Tải về miễn phí -uploadedFile = Tập tin -copyFileList = Sao chép URL -// expiryFileList is used as a column header -expiryFileList = Hết hạn trong -deleteFileList = Xóa -nevermindButton = Đừng bận tâm -legalHeader = Điều khoản & Quyền riêng tư -legalNoticeTestPilot = Firefox Send hiện tại đang là một thử nghiệm Test Pilot, và phải tuân theo Điều khoản dịch vụLưu ý về Quyền riêng tư. Bạn có thể tìm hiểu thêm về thử nghiệm này và dữ liệu được thu thập tại đây. -legalNoticeMozilla = Sử dụng trang web Firefox Send cũng phải tuân theo Mozilla's Lưu ý về Quyền riêng tư của trang webĐiều khoản sử dụng của trang web. -deletePopupText = Xóa tập tin này? -deletePopupYes = Đồng ý deletePopupCancel = Hủy bỏ deleteButtonHover = Xóa -copyUrlHover = Sao chép URL footerLinkLegal = Pháp lý -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = Về Test Pilot footerLinkPrivacy = Quyền riêng tư -footerLinkTerms = Điều khoản -footerLinkCookies = Cookies +footerLinkCookies = Cookie +passwordTryAgain = Sai mật khẩu. Vui lòng thử lại. +javascriptRequired = Send cần JavaScript +whyJavascript = Tại sao Send cần JavaScript? +enableJavascript = Vui lòng kích hoạt JavaScript và thử lại. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } giờ { $minutes } phút +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } phút +# A short status message shown when the user enters a long password +maxPasswordLength = Độ dài mật khẩu tối đa: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = Không thể đặt mật khẩu này + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = Chia sẻ tập tin đơn giản, riêng tư +introDescription = { -send-brand } cho phép bạn chia sẻ các tập tin với mã hóa đầu cuối và một liên kết tự động hết hạn. Vì vậy, bạn có thể giữ những gì bạn chia sẻ riêng tư và đảm bảo dữ liệu của bạn không trực tuyến vĩnh viễn. +notifyUploadEncryptDone = Tập tin của bạn được mã hóa và sẵn sàng để gửi +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = Hết hạn sau { $downloadCount } hoặc { $timespan } +timespanMinutes = + { $num -> + *[other] { $num } phút + } +timespanDays = + { $num -> + *[other] { $num } ngày + } +timespanWeeks = + { $num -> + *[other] { $num } tuần + } +fileCount = + { $num -> + *[other] { $num } tập tin + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = Tổng kích thước: { $size } +# the next line after the colon contains a file name +copyLinkDescription = Sao chép liên kết để chia sẻ tập tin của bạn: +copyLinkButton = Sao chép liên kết +downloadTitle = Tải xuống tập tin +downloadDescription = Tập tin này đã được chia sẻ qua { -send-brand } với mã hóa đầu cuối và liên kết tự động hết hạn. +trySendDescription = Hãy thử { -send-brand } để chia sẻ tập tin đơn giản, an toàn. +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] Chỉ { $count } tập tin có thể tải lên mỗi lần. + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] Chỉ cho phép { $count } lưu trữ. + } +expiredTitle = Liên kết này đã hết hạn. +notSupportedDescription = { -send-brand } sẽ không hoạt động với trình duyệt này. { -send-short-brand } hoạt động tốt nhất với phiên bản { -firefox } mới nhất và sẽ hoạt động với phiên bản hiện tại của hầu hết các trình duyệt. +downloadFirefox = Tải xuống { -firefox } +legalTitle = Thông báo bảo mật { -send-short-brand } +legalDateStamp = Phiên bản 1.0, ngày 12 tháng 3 năm 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } ngày { $hours } giờ { $minutes } phút +addFilesButton = Chọn tập tin để tải lên +trustWarningMessage = Hãy chắc chắn rằng bạn tin tưởng người nhận khi chia sẻ dữ liệu nhạy cảm. +uploadButton = Tải lên +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = Kéo và thả tập tin +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = hoặc nhấp để gửi tối đa { $size } +addPassword = Bảo vệ bằng mật khẩu +emailPlaceholder = Nhập email của bạn +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = Đăng nhập để gửi tối đa { $size } +signInOnlyButton = Đăng nhập +accountBenefitTitle = Tạo tài khoản { -firefox } hoặc đăng nhập +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = Chia sẻ tập tin lên tới { $size } +accountBenefitDownloadCount = Chia sẻ tập tin với nhiều người hơn +accountBenefitTimeLimit = + { $count -> + *[other] Giữ liên kết hoạt động tối đa { $count } ngày + } +accountBenefitSync = Quản lý tập tin được chia sẻ từ mọi thiết bị +accountBenefitMoz = Tìm hiểu về các dịch vụ khác của { -mozilla } +signOut = Đăng xuất +okButton = OK +downloadingTitle = Đang tải xuống +noStreamsWarning = Trình duyệt này có khả năng không thể giải mã một tập tin lớn này. +noStreamsOptionCopy = Sao chép liên kết để mở trong một trình duyệt khác +noStreamsOptionFirefox = Hãy dùng thử trình duyệt yêu thích của chúng tôi +noStreamsOptionDownload = Tiếp tục với trình duyệt này +downloadFirefoxPromo = { -send-short-brand } được mang đến cho bạn bởi { -firefox } hoàn toàn mới. +# the next line after the colon contains a file name +shareLinkDescription = Chia sẻ liên kết đến tập tin của bạn: +shareLinkButton = Chia sẻ liên kết +# $name is the name of the file +shareMessage = Tải xuống “{ $name }“ với { -send-brand }: chia sẻ tập tin đơn giản, an toàn +trailheadPromo = Đây là một cách để bảo vệ sự riêng tư của bạn. Tham gia Firefox. +learnMore = Tìm hiểu thêm. +downloadFlagged = Liên kết này đã bị vô hiệu hóa do vi phạm các điều khoản dịch vụ. +downloadConfirmTitle = Một điều nữa +downloadConfirmDescription = Hãy chắc chắn rằng bạn tin tưởng người đã gửi cho bạn tập tin này vì chúng tôi không thể xác minh rằng nó sẽ không gây hại cho thiết bị của bạn. +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] Tôi tin tưởng người đã gửi những tập tin này + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] Báo cáo các tập tin này là đáng ngờ + } +reportDescription = Hãy giúp chúng tôi hiểu những gì đang diễn ra. Bạn nghĩ gì có gì không đúng với những tập tin này? +reportUnknownDescription = Vui lòng truy cập url của liên kết bạn muốn báo cáo và nhấp vào “{ reportFile }”. +reportButton = Báo cáo +reportReasonMalware = Những tập tin này chứa phần mềm độc hại hoặc là một phần của cuộc tấn công lừa đảo. +reportReasonPii = Những tập tin này chứa thông tin cá nhân về tôi. +reportReasonAbuse = Những tập tin này chứa nội dung bất hợp pháp hoặc lạm dụng. +reportReasonCopyright = Để báo cáo vi phạm bản quyền hoặc nhãn hiệu, hãy sử dụng quy trình được mô tả tại trang này. +reportedTitle = Đã báo cáo tập tin +reportedDescription = Cảm ơn bạn. Chúng tôi đã nhận được báo cáo của bạn về các tập tin này. diff --git a/public/locales/yo/send.ftl b/public/locales/yo/send.ftl new file mode 100644 index 000000000..e9a538cb1 --- /dev/null +++ b/public/locales/yo/send.ftl @@ -0,0 +1,118 @@ +# Send is a brand name and should not be localized. +title = Send je oruko ile-ise kan, kò sì ye ki a so di ibile. +importingFile = akowọle… +encryptingFile = Fifi ọrọ ṣiṣẹ… +decryptingFile = Ti nkọ nkan… +downloadCount = + { $num -> + [one] ìsíwá kan… + *[other] ọ̀pọ̀ ìsíwá… + } +timespanHours = + { $num -> + [one] Wákàtí kan + *[other] Ọ̀pọ wákàtí + } +copiedUrl = dakọ +unlockInputPlaceholder = + aṣínà + ọ̀rọ̀-aṣínà + ọ̀rọ̀-agbaniwọlé +unlockButtonLabel = ṣí +downloadButtonLabel = Ìgbasílẹ̀ +downloadFinish = + Ìsíwá parí + Ìgbasílẹ̀ parí +sendYourFilesLink = + Gbìyànjúu Send + Gbìyànjú lo Send + Dán Send wò +errorPageHeader = Nnkan o lo daadaa! +fileTooBig = + Fáìlì yìí tóbijù láti gbà sókè. Ó ní láti kéré sí { $size } + Fáìlì yìí tóbijù láti gbà sókè. Ó ní láti kéré ju { $size } lọ +linkExpiredAlt = + Ojú-òpó ti kásẹ̀ + Ojú-òpó ti pajújé + Ọ̀nà-òpó ti kásẹ̀ + Ọ̀nà-òpó ti pajújé +notSupportedHeader = + Èrọ-ìfarakọ́ra rẹ ò ní ìbátan + Ojú-òpó ìfarakọ́ra rẹ ò ní ìbátan +notSupportedLink = + Kí ló ṣe tí ẹ̀rọ-ìfarakọ́ra mi ò ní ìbátan? + Kí ló ṣe tí ẹ̀rọ-aṣàwárí mi ò ní ìbátan? + Kí nìdí tí ẹ̀rọ-ìfarakọ́ra mi ò ní ìbátan? + Kí nìdí tí ẹ̀rọ-aṣàwárí mi ò ní ìbátan? +notSupportedOutdatedDetail = Ó ṣe, wípé ẹ̀dà Firefox yí ò ní àtìlẹyìn ẹ̀rọ-alátagbà tí ó ń mú Send ṣiṣẹ́. O ní láti ṣe àgbéga èdà ẹ̀rọ-aṣàwárí rẹ kó bágbàmu. +updateFirefox = Mú Firefox bágbàmu +deletePopupCancel = + Nù kúrò + Parẹ́ +deleteButtonHover = + Mú kúrò + Parẹ́ +footerLinkLegal = + b’ófin mu + n’ílànà òfin +footerLinkPrivacy = + Ibi ìkọ̀kọ̀ + Ibi ìpamọ́ +footerLinkCookies = + Cookie + Àmì-ẹ̀rọ aránṣẹ́-jíṣẹ́ +passwordTryAgain = + Ọ̀rọ̀-aṣínà kò tọ́. Gbìyànjú síi + Ọ̀rọ̀-aṣíde kò tọ́. Gbìyànjú síi +javascriptRequired = Send nílòo JavaScript +whyJavascript = + Kí nìdí tí Firefox fi nílòo JavaScript? + Kí nìdí tí Firefox ṣe nílòo JavaScript? +enableJavascript = + Jọ̀wọ́ tán JavaScript sílẹ̀ kí o sì gbìyànjú si. + Jọ̀wọ́ ṣí JavaScript sílẹ̀ kí o sì gbìyànjú si. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = + { $hours }w { $minutes }i + { $hours }wákàtí { $minutes }iṣẹ́jú +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }i +# A short status message shown when the user enters a long password +maxPasswordLength = Ìdíwọ̀n ọ̀rọ̀-aṣínà: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = + Ọ̀rọ̀-aṣínà yí kò ṣeé gbé kalẹ̀ + Ọ̀rọ̀-aṣínà yí kò leè fẹsẹ̀ múlẹ̀ + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = + Fi ránṣẹ́ + Firánṣẹ́ +-firefox = Firefox +-mozilla = Mozilla +introTitle = + Fáìlì pípín níkọ̀kọ̀ tó dẹrùn + Fáìlì pípín níkọ̀kọ̀ onírọ̀rùn +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = Kilobaiti +# mebibyte abbreviation +mb = Megabaiti +# gibibyte abbreviation +gb = Gigabaiti +downloadTitle = Se igabisile faili +addFilesButton = E yan awon faili lati gbasoke +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = E mu awon faili ki ede ju si bi +emailPlaceholder = E fi imeli si +accountBenefitDownloadCount = E pin faili pelu awon eyan si +okButton = O DA +downloadingTitle = N se igabsile +noStreamsOptionFirefox = E gbiyanju asawakiri to je ayanfe wa +noStreamsOptionDownload = Tesiwaju pelu aṣàwákiri yi +trailheadPromo = Ona wa lati dabobo ipamo re. Darapo mo Firefox +learnMore = Keeko si diff --git a/public/locales/yua/send.ftl b/public/locales/yua/send.ftl new file mode 100644 index 000000000..b714c2990 --- /dev/null +++ b/public/locales/yua/send.ftl @@ -0,0 +1,20 @@ +# Send is a brand name and should not be localized. +title = Send +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }m + +## Send version 2 strings + +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } diff --git a/public/locales/zgh/send.ftl b/public/locales/zgh/send.ftl new file mode 100644 index 000000000..270515e5a --- /dev/null +++ b/public/locales/zgh/send.ftl @@ -0,0 +1,155 @@ +# Send is a brand name and should not be localized. +title = ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ +siteFeedback = ⵜⴰⵙⴷⵎⵉⵔⵜ +importingFile = ⴰⵙⴽⵛⵎ... +encryptingFile = ⴰⵙⵙⵏⵜⵍ... +decryptingFile = ⵜⵓⴽⴽⵙⴰ ⵏ ⵓⵙⵙⵏⵜⵍ... +downloadCount = + { $num -> + [one] { $num } ⵜⴰⴳⴰⵎⵜ + *[other] { $num } ⵜⴰⴳⴰⵎⵉⵏ + } +timespanHours = + { $num -> + [one] { $num } ⵜⵙⵔⴰⴳⵜ + *[other] { $num } ⵜⵙⵔⴰⴳⵉⵏ + } +copiedUrl = ⵉⵏⵖⵍ! +unlockInputPlaceholder = ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ +unlockButtonLabel = ⴽⴽⵙ ⴰⵔⴳⴰⵍ +downloadButtonLabel = ⴰⴳⵎ +downloadFinish = ⵉⵎⴷⴰ ⵡⴰⴳⴰⵎ +fileSizeProgress = ({ $partialSize } ⵙⴳ { $totalSize }) +sendYourFilesLink = ⴰⵔⵎ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ +errorPageHeader = ⵜⵙⴰⵔ ⴽⵔⴰ ⵏ ⵜⵣⴳⴰⵍⵜ! +fileTooBig = ⵉⵎⵇⵇⵓⵔ ⴱⴰⵀⵔⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵖⴼ ⵓⵙⵙⴽⵜⵔ. ⵉⵅⵚⵚⴰ ⵜ ⴰⴷ ⵢⵉⵍⵉ ⴷⴷⴰⵡ ⵏ { $size } +linkExpiredAlt = ⵉⵎⵎⵓⵜ ⵓⵙⵖⵏ +notSupportedHeader = ⵓⵔ ⵉⵜⵜⵡⴰⵏⵏⴰⵍ ⵓⵎⵙⵙⴰⵔⴰ ⵏⵏⵓⵏ. +notSupportedLink = ⵎⴰⵖⴼ ⵓⵔ ⵉⵜⵜⵡⴰⵏⵏⴰⵍ ⵓⵎⵙⵙⴰⵔⴰ ⵉⵏⵓ? +notSupportedOutdatedDetail = ⵙ ⵜⵎⴳⵕⵥⴰ, ⵜⴰⵍⵇⵇⵎⵜ ⴰ ⵏ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵓⵔ ⴷⴰ ⵜⴻⵜⵜⵏⴰⵍ ⵜⴰⵜⵉⴽⵏⵓⵍⵓⵊⵉⵜ ⵏ ⵓⵡⵉⴱ ⵏⵏⴰ ⵙ ⵉⵙⵡⵓⵔⵓⵢ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ. ⵔⴰⴷ ⵜⴰⵙⵔⵎ ⴰⴷ ⵜⵙⴷⵖⵉⵎ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵓⵏ. +updateFirefox = ⵙⴷⵖⵉ ⴼⴰⵢⵔⴼⵓⴽⵙ +deletePopupCancel = ⵙⵔ +deleteButtonHover = ⴽⴽⵙ +footerLinkLegal = ⵓⵙⴹⵉⴼ +footerLinkPrivacy = ⵜⵉⵏⵏⵓⵜⵍⴰ +footerLinkCookies = ⵉⴽⵓⴽⵉⵜⵏ +passwordTryAgain = ⵜⴰⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ ⵓⵔ ⵢⵓⵖⵉⴷⵏ. ⴰⵔⵎ ⴷⴰⵖ. +javascriptRequired = ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ +whyJavascript = ⵎⴰⵖⴼ ⴷⴰ ⵉⵜⵜⴰⵙⵔ ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ? +enableJavascript = ⵎⴽ ⵜⵓⴼⴰⵎ, ⵙⵏⵓⵛⵛⴳⴰⵜ ⵊⴰⴼⴰⵙⴽⵔⵉⴱⵜ, ⵜⴰⵔⵎⵎ ⴷⴰⵖ. +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours }ⵙⵔⴳ { $minutes }ⵙⴷ +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes }ⵙⴷ +# A short status message shown when the user enters a long password +maxPasswordLength = ⵜⵉⵖⵣⵉ ⵜⴰⵎⵓⵣⵣⵓⵔⵜ ⵏ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = ⵓⵔ ⵜⵣⵎⵉⵔ ⵜⴳⵓⵔⵉ ⴰ ⵏ ⵓⵣⵔⴰⵢ ⴰⴷ ⵜⴻⵜⵜⵓⵙⵖⵍ + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = ⴼⴰⵢⵔⴼⵓⴽⵙ ⵙⵉⵏⴷ +-send-short-brand = ⵙⵉⵏⴷ +-firefox = ⴼⴰⵢⵔⴼⵓⴽⵙ +-mozilla = ⵎⵓⵣⵉⵍⴰ +introTitle = ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ +introDescription = ⴷⴰ ⴽⵯⵏ ⵉⵜⵜⴰⵊⵊⴰ { -send-brand } ⴰⴷ ⵜⴱⴹⵓⵎ ⵉⴼⵓⵢⵍⴰ ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. ⵙ ⵓⵢⴰ, ⵜⵣⵎⵔⵎ ⴰⴷ ⵜⴰⵊⵊⵎ ⴰⵢⵏⵏⴰ ⵜⴱⵟⵟⵓⵎ ⴷ ⵓⵙⵍⵉⴳ, ⵜⵙⵙⵉⵖⵥⵉⵏⵎ ⵎⴰⵙ ⵓⵔ ⵔⴰⴷ ⴰⴱⴷⴰ ⵉⵇⵇⵉⵎ ⵡⴰⵏⵏⴰⴷ ⵏⵏⵓⵏ ⴳ ⵉⴼⵉⵍⵉ. +notifyUploadEncryptDone = ⵉⵏⵜⵍ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ, ⵉⵃⵢⵢⵍ ⵉ ⵡⴰⵣⴰⵏ +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = ⴰⴷ ⵉⵎⵎⵜ ⴷⴼⴼⵉⵔ { $downloadCount } ⵏⵉⵖ ⴷ { $timespan } +timespanMinutes = + { $num -> + [one] { $num } ⵜⵓⵙⴷⵉⴷⵜ + *[other] { $num } ⵜⵓⵙⴷⵉⴷⵉⵏ + } +timespanDays = + { $num -> + [one] { $num } ⵡⴰⵙⵙ + *[other] { $num } ⵡⵓⵙⵙⴰⵏ + } +timespanWeeks = + { $num -> + [one] { $num } ⵉⵎⴰⵍⴰⵙⵙ + *[other] { $num } ⵉⵎⴰⵍⴰⵙⵙⵏ + } +fileCount = + { $num -> + [one] { $num } ⵓⴼⴰⵢⵍⵓ + *[other] { $num } ⵉⴼⵓⵢⵍⴰ + } +# byte abbreviation +bytes = ⵜ +# kibibyte abbreviation +kb = ⴽⵜ +# mebibyte abbreviation +mb = ⵎⵜ +# gibibyte abbreviation +gb = ⵊⵜ +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = ⵜⵉⴷⴷⵉ ⵉⵎⵎⵓⵜⵜⵔⵏ: { $size } +# the next line after the colon contains a file name +copyLinkDescription = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜⴱⴹⵓⵎ ⴰⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ: +copyLinkButton = ⵙⵙⵏⵖⵍ ⴰⵙⵖⵏ +downloadTitle = ⴰⴳⵎ ⵉⴼⵓⵢⵍⴰ +downloadDescription = ⵉⵜⵜⵓⴱⴹⴰ ⵓⴼⴰⵢⵍⵓ ⴰ ⵙⴳ { -send-brand } ⵙ ⵓⵙⵙⵏⵜⵍ ⵙⴳ ⵜⴰⵎⴰ ⴰⵔ ⵜⴰⵎⴰ ⴷ ⵢⴰⵏ ⵓⵙⵖⵏ ⵏⵏⴰ ⵉⵜⵜⵎⵎⵜⴰⵜⵏ ⵙ ⵓⵡⵔⵎⴰⵏ. +trySendDescription = ⴰⵔⵎⴰⵜ { -send-brand } ⵉ ⵓⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⴼⵔⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ. +# count will always be > 10 +tooManyFiles = + { $count -> + [one] ⵖⴰⵙ { $count } ⵓⴼⴰⵢⵍⵓ ⴰⵢ ⵉⵣⵎⵔⵏ ⴰⴷ ⵉⴽⵜⵔ ⴳ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ. + *[other] ⵖⴰⵙ { $count } ⵉⴼⵓⵢⵍⴰ ⴰⵢ ⵉⵣⵎⵔⵏ ⴰⴷ ⴽⵜⵔⵏ ⴳ ⵢⴰⵜ ⵜⵉⴽⴽⵍⵜ. + } +# count will always be > 10 +tooManyArchives = + { $count -> + [one] ⵖⴰⵙ { $count } ⵜⵎⵃⴹⵉⵜ ⴰⵢ ⵉⵔⵔⴳⵏ. + *[other] ⵖⴰⵙ { $count } ⵜⵎⵃⴹⴰⵢ ⴰⵢ ⵉⵔⵔⴳⵏ. + } +expiredTitle = ⵉⵎⵎⵓⵜ ⵓⵙⵖⵏ ⴰ. +notSupportedDescription = ⵓⵔ ⵔⴰⴷ ⵉⵙⵡⵓⵔⵉ { -send-brand } ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ. ⴷⴰ ⵉⵙⵡⵓⵔⵓⵢ { -send-short-brand } ⵎⵍⵉⵃ ⵙ ⵜⵍⵇⵇⵎⵜ ⵜⴰⵎⴳⴳⴰⵔⵓⵜ ⵏ { -firefox }, ⴷ ⵔⴰⴷ ⵉⵙⵡⵓⵔⵉ ⵙ ⵜⵍⵇⵇⵎⵜ ⵜⴰⵎⵉⵔⴰⵏⵜ ⵏ ⵓⵎⴰⵜⴰ ⵏ ⵉⵎⵙⵙⴰⵔⴰⵜⵏ. +downloadFirefox = ⴰⴳⵎ { -firefox } +legalTitle = ⵜⵓⵙⵎⵉⵔⵜ ⵏ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏ { -send-short-brand } +legalDateStamp = ⵜⴰⵍⵇⵇⵎⵜ 1.0, ⵜⵉⵏ 12 ⵎⴰⵕⵚ 2019 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days }ⵙ { $hours }ⵙⵔⴳ { $minutes }ⵙⴷ +addFilesButton = ⵙⵜⵢ ⵉⴼⵓⵢⵍⴰ ⵉ ⵓⵙⵙⴽⵜⵔ +uploadButton = ⵙⵙⴽⵜⵔ +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = ⵙⵓⵛⵛⴹⴰⵜ, ⵜⵙⵔⵙⵎ ⵉⴼⵓⵢⵍⴰ +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = ⵏⵉⵖ ⵜⴽⵍⵉⴽⵉⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⵎ ⴰⵔ { $size } +addPassword = ⴰⵔⵢ ⵙ ⵜⴳⵓⵔⵉ ⵏ ⵓⵣⵔⴰⵢ +emailPlaceholder = ⵙⵙⴽⵛⵎⴰⵜ ⵉⵎⴰⵢⵍ ⵏⵏⵓⵏ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = ⴽⵛⵎ ⴰⴼⴰⴷ ⴰⴷ ⵜⴰⵣⵏⴷ ⴰⵔ { $size } +signInOnlyButton = ⴽⵛⵎ +accountBenefitTitle = ⵙⵏⴼⵍⵓⵍ ⴰⵎⵉⴹⴰⵏ ⵏ { -firefox } ⵏⵉⵖ ⵜⵣⵎⵎⴻⵎⴷ +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⵔ { $size } +accountBenefitDownloadCount = ⴱⴹⵓ ⵉⴼⵓⵢⵍⴰ ⴰⴽⴷ ⵡⵓⴳⴳⴰⵔ ⵏ ⵎⴷⴷⵏ +accountBenefitTimeLimit = + { $count -> + [one] ⴰⵊⵊⴰⵜ ⵉⵙⵖⴰⵏ ⴰⴷ ⵜⵜⵏⵓⵛⵛⵓⴳⵏ ⴰⵔ { $count } ⵡⴰⵙⵙ + *[other] ⴰⵊⵊⴰⵜ ⵉⵙⵖⴰⵏ ⴰⴷ ⵜⵜⵏⵓⵛⵛⵓⴳⵏ ⴰⵔ { $count } ⵡⵓⵙⵙⴰⵏ + } +accountBenefitSync = ⵙⵡⵓⴷⴷⵡⴰⵜ ⵉⴼⵓⵢⵍⴰ ⵜⵜⵓⴱⴹⴰⵏⵉⵏ ⵙⴳ ⴽⵓ ⴰⵍⵍⴰⵍ +accountBenefitMoz = ⵍⵎⴷ ⵖⴼ ⵜⵏⵓⴼⴰ ⵢⴰⴹⵏⵉⵏ ⵏ { -mozilla } +signOut = ⴼⴼⵖ +okButton = ⵡⴰⵅⵅⴰ +downloadingTitle = ⴰⴳⴰⵎ +noStreamsWarning = ⵉⵣⵎⵔ ⵓⵎⵙⵙⴰⵔⴰ ⴰ ⴰⴷ ⵓⵔ ⵉⵖⴰⵢ ⴰⴷ ⵉⴽⴽⵙ ⴰⵙⵙⵏⵜⵍ ⵉ ⵢⴰⵏ ⵓⴼⴰⵢⵍⵓ ⵉⵎⵇⵇⵓⵔⵏ ⵙ ⵡⴰⵏⵛⵜ ⴰ. +noStreamsOptionCopy = ⵙⵙⵏⵖⵍⴰⵜ ⴰⵙⵖⵏ ⴰⴼⴰⴷ ⴰⴷ ⵜ ⵜⵕⵥⵎⵎ ⴳ ⴽⵔⴰ ⵏ ⵓⵎⵙⵙⴰⵔⴰ ⵢⴰⴹⵏ +noStreamsOptionFirefox = ⴰⵔⵎⴰⵜ ⴰⵎⵙⵙⴰⵔⴰ ⵏⵏⵖ ⴰⵎⵓⴼⴰⵢ +noStreamsOptionDownload = ⵙⵎⴷ ⵙ ⵓⵎⵙⵙⴰⵔⴰ ⴰ +downloadFirefoxPromo = ⵉⵜⵜⵓⵙⵓⵎⵔ ⴰⵡⵏ { -send-short-brand } ⵙⴳ ⵖⵓⵔ { -firefox } ⴰⵎⴰⵢⵏⵓ ⴰⴽⴽⵯ. +# the next line after the colon contains a file name +shareLinkDescription = ⴱⴹⵓⵢⴰⵜ ⴰⵙⵖⵏ ⵖⵔ ⵓⴼⴰⵢⵍⵓ ⵏⵏⵓⵏ: +shareLinkButton = ⴱⴹⵓ ⴰⵙⵖⵏ +# $name is the name of the file +shareMessage = ⴰⴳⵎⴰⵜ "{ $name }" ⵙ { -send-brand }: ⴰⴱⵟⵟⵓ ⴰⴼⵔⴰⵔ ⴷ ⵡⵓⵙⵍⵉⴳ ⵏ ⵉⴼⵓⵢⵍⴰ +trailheadPromo = ⵜⵍⵍⴰ ⵢⴰⵜ ⵜⵖⴰⵔⴰⵙⵜ ⴰⴼⴰⴷ ⴰⴷ ⵜⴼⵔⴳⵎ ⵜⵉⵏⵏⵓⵜⵍⴰ ⵏⵏⵓⵏ. ⵍⴽⵎⴰⵜ ⴼⴰⵢⵔⴼⵓⴽⵙ. +learnMore = ⵙⵙⵏ ⵓⴳⴳⴰⵔ. diff --git a/public/locales/zh-CN/send.ftl b/public/locales/zh-CN/send.ftl index 1e3d95907..0b9906382 100644 --- a/public/locales/zh-CN/send.ftl +++ b/public/locales/zh-CN/send.ftl @@ -1,113 +1,182 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = Web 实验 -siteFeedback = 反馈 -uploadPageHeader = 私密、安全的文件分享服务 -uploadPageExplainer = 通过安全、私密且受加密的链接发送文件,链接到期后文件将从网上彻底抹除。 -uploadPageLearnMore = 详细了解 -uploadPageDropMessage = 把文件拖到到此处开始上传 -uploadPageSizeMessage = 为保证运行稳定,建议文件大小不超过 1GB -uploadPageBrowseButton = 选择一个您电脑上的文件 -uploadPageBrowseButton1 = 选择一个要上传的文件 -uploadPageMultipleFilesAlert = 目前不支持上传多个文件或上传文件夹。 -uploadPageBrowseButtonTitle = 上传文件 -uploadingPageProgress = 正在上传 { $filename } ({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = 正在导入… -verifyingFile = 正在验证… encryptingFile = 正在加密… decryptingFile = 正在解密… -notifyUploadDone = 您的上传已完成。 -uploadingPageMessage = 在文件上传后,您可以设定过期选项。 -uploadingPageCancel = 取消上传 -uploadCancelNotification = 您的上传已取消。 -uploadingPageLargeFileMessage = 此文件较大,可能要花费一些时间。请稍候。 -uploadingFileNotification = 上传完成后通知我。 -uploadSuccessConfirmHeader = 准备好发送 -uploadSvgAlt = 上传 -uploadSuccessTimingHeader = 您的文件的链接将在首次下载或 24 小时后过期。 -expireInfo = 指向该文件的链接将在 { $downloadCount } 或 { $timespan } 后过期。 -downloadCount = { $num -> +downloadCount = + { $num -> *[other] { $num } 次下载 } -timespanHours = { $num -> +timespanHours = + { $num -> *[other] { $num } 小时 } -copyUrlFormLabelWithName = 复制并分享链接以发送您的文件:{ $filename } -copyUrlFormButton = 复制到剪贴板 copiedUrl = 已复制! -deleteFileButton = 删除文件 -sendAnotherFileLink = 发送其他文件 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = 下载 -downloadsFileList = 下载次数 -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = 时间 -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = 下载 { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = 请输入密码 unlockInputPlaceholder = 密码 unlockButtonLabel = 解锁 -downloadFileTitle = 下载加密的文件 -// Firefox Send is a brand name and should not be localized. -downloadMessage = 您的朋友使用 Firefox Send 向您发送一个文件。该服务允许用户以安全、私密、受加密的链接分享一个文件,链接到期后文件将从网上彻底抹除。 -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = 下载 -downloadNotification = 您的下载已完成。 downloadFinish = 下载完成 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize } / { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = 尝试 Firefox Send -downloadingPageProgress = 正在下载 { $filename } ({ $size }) -downloadingPageMessage = 在我们获取您的文件并解密的期间,请不要关闭此网页。 -errorAltText = 上传出错 +sendYourFilesLink = 试试 Send errorPageHeader = 我们遇到错误。 -errorPageMessage = 上传文件时发生错误。 -errorPageLink = 发送其他文件 fileTooBig = 此文件太大。文件大小上限为 { $size }。 linkExpiredAlt = 链接已过期 -expiredPageHeader = 此链接已过期或者从未生效。 notSupportedHeader = 不支持您的浏览器。 -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 很可惜,您的浏览器不支持 Firefox Send 所使用的 Web 技术。请改用其他浏览器。我们推荐使用 Firefox! notSupportedLink = 为什么不支持我的浏览器? -notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支持 Firefox Send 所使用的 Web 技术。您需要更新浏览器才能使用它。 +notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支持 Send 所使用的 Web 技术。您需要更新浏览器才能使用它。 updateFirefox = 更新 Firefox -downloadFirefoxButtonSub = 免费下载 -uploadedFile = 文件 -copyFileList = 复制网址 -// expiryFileList is used as a column header -expiryFileList = 过期时间 -deleteFileList = 删除 -nevermindButton = 没关系 -legalHeader = 条款和隐私 -legalNoticeTestPilot = Firefox Send 目前是一个 Test Pilot 实验,并遵守 Test Pilot 服务条款隐私声明。您可以在这里了解此实验及数据收集的有关信息。 -legalNoticeMozilla = 使用 Firefox Send 网站亦受到 Mozilla 网站隐私声明网站使用条款的约束。 -deletePopupText = 删除此文件? -deletePopupYes = 是 deletePopupCancel = 取消 deleteButtonHover = 删除 -copyUrlHover = 复制网址 footerLinkLegal = 法律 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = 关于 Test Pilot footerLinkPrivacy = 隐私 -footerLinkTerms = 条款 footerLinkCookies = Cookie -requirePasswordCheckbox = 持有密码才能下载此文件 -addPasswordButton = 添加密码 -changePasswordButton = 更改 passwordTryAgain = 密码不正确。请重试。 -// This label is followed by the password needed to download a file -passwordResult = 密码:{ $password } -reportIPInfringement = 举报知识产权侵权 -javascriptRequired = Firefox Send 需要 JavaScript -whyJavascript = 为什么 Firefox Send 需要 JavaScript? +javascriptRequired = Send 需要 JavaScript +whyJavascript = 为什么 Send 需要 JavaScript? enableJavascript = 请启用 JavaScript 并重试。 -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" -expiresHoursMinutes = { $hours }时 { $minutes }分 -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" -expiresMinutes = { $minutes }分 +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +expiresHoursMinutes = { $hours } 小时 { $minutes } 分钟 +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +expiresMinutes = { $minutes } 分钟 +# A short status message shown when the user enters a long password +maxPasswordLength = 最大密码长度:{ $length } +# A short status message shown when there was an error setting the password +passwordSetError = 未能设置此密码 + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 简单、私密的文件分享服务 +introDescription = 使用 { -send-brand } 端到端加密分享文件,链接到期即焚。分享更私密,文件到期真正无痕迹。 +notifyUploadEncryptDone = 您的文件已加密,现在可以发送 +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount }或 { $timespan }后过期 +timespanMinutes = + { $num -> + [one] 1 分钟 + *[other] { $num } 分钟 + } +timespanDays = + { $num -> + [one] 1 天 + *[other] { $num } 天 + } +timespanWeeks = + { $num -> + [one] 1 周 + *[other] { $num } 周 + } +fileCount = + { $num -> + [one] 1 个文件 + *[other] { $num } 个文件 + } +# byte abbreviation +bytes = B +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num }{ $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 总大小:{ $size } +# the next line after the colon contains a file name +copyLinkDescription = 复制链接以分享文件: +copyLinkButton = 复制链接 +downloadTitle = 下载文件 +downloadDescription = 此文件通过端到端加密的 { -send-brand } 与您分享,链接到期即焚。 +trySendDescription = 试试 { -send-brand },简单、私密的文件分享服务。 +# count will always be > 10 +tooManyFiles = + { $count -> + [one] 一次只可上传 1 个文件。 + *[other] 一次只可上传 { $count } 个文件。 + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] 只可上传 { $count } 个压缩文件。 + } +expiredTitle = 此链接已过期。 +notSupportedDescription = { -send-brand } 无法在此浏览器上正常工作。{ -send-short-brand } 与最新版本 { -firefox } 配合使用体验最佳,也适用于目前的大多数浏览器。 +downloadFirefox = 下载 { -firefox } +legalTitle = { -send-short-brand } 隐私声明 +legalDateStamp = 版本 1.0,于 2019年3月12日 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } 天 { $hours } 小时 { $minutes } 分钟 +addFilesButton = 选择要上传的文件 +trustWarningMessage = 分享敏感数据时,请确保您信任接收人。 +uploadButton = 上传 +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = 拖放文件 +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = 或点此传送最大 { $size } 的文件 +addPassword = 密码保护 +emailPlaceholder = 请输入您的电子邮件地址 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = 登录以传送最大 { $size } 文件 +signInOnlyButton = 登录 +accountBenefitTitle = 创建一个 { -firefox } 账户或登录 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = 分享最大 { $size } 文件 +accountBenefitDownloadCount = 可以与更多人分享 +accountBenefitTimeLimit = + { $count -> + [one] 链接有效期延至 1 天 + *[other] 链接有效期延至 { $count } 天 + } +accountBenefitSync = 任何设备上都能管理分享的文件 +accountBenefitMoz = 了解其他 { -mozilla } 服务 +signOut = 退出 +okButton = 确定 +downloadingTitle = 正在下载 +noStreamsWarning = 此浏览器可能无法解密这么大的文件。 +noStreamsOptionCopy = 复制链接以在其他浏览器中打开 +noStreamsOptionFirefox = 试试大家最爱的浏览器 +noStreamsOptionDownload = 使用此浏览器继续 +downloadFirefoxPromo = { -send-short-brand } 由焕然一新的 { -firefox } 为您奉上。 +# the next line after the colon contains a file name +shareLinkDescription = 您的文件链接: +shareLinkButton = 分享链接 +# $name is the name of the file +shareMessage = 使用 { -send-brand } 下载“{ $name }”:简单、安全的文件分享服务 +trailheadPromo = 捍卫隐私不是幻想。加入 Firefox 一同抗争。 +learnMore = 详细了解。 +downloadFlagged = 由于违反服务条款,此链接已被禁用。 +downloadConfirmTitle = 除此之外 +downloadConfirmDescription = 请确保您信任发送此文件的人,因为我们无法验证该文件是否会损坏您的设备。 +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + [one] 我信任发送此文件的人 + *[other] 我信任发送这些文件的人 + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + [one] 举报此可疑文件 + *[other] 举报这些可疑文件 + } +reportDescription = 帮助我们了解发生了什么。您认为这些文件存在什么问题? +reportUnknownDescription = 请转至您要举报的链接 URL,然后点击 “{ reportFile }”。 +reportButton = 举报 +reportReasonMalware = 这些文件包含恶意软件或是网络钓鱼攻击的一环。 +reportReasonPii = 这些文件包含我的个人身份信息。 +reportReasonAbuse = 这些文件包含非法或滥用内容。 +reportReasonCopyright = 要举报版权或商标侵权,请按照此页面中所述步骤。 +reportedTitle = 文件已举报 +reportedDescription = 感谢,我们已收到您关于这些文件的举报。 diff --git a/public/locales/zh-TW/send.ftl b/public/locales/zh-TW/send.ftl index 8a48241da..6c91012e2 100644 --- a/public/locales/zh-TW/send.ftl +++ b/public/locales/zh-TW/send.ftl @@ -1,113 +1,174 @@ -// Firefox Send is a brand name and should not be localized. -title = Firefox Send -siteSubtitle = 網頁實驗 -siteFeedback = 意見回饋 -uploadPageHeader = 私密、有加密的檔案分享服務 -uploadPageExplainer = 透過安全、隱私、加密過的管道來傳送檔案,而且鏈結會自動過期,可確保您的東西不會在網路上無限停留。 -uploadPageLearnMore = 了解更多 -uploadPageDropMessage = 將檔案放到此處開始上傳 -uploadPageSizeMessage = 為了讓系統能最穩定地執行,請盡量將檔案控制在 1GB 以下。 -uploadPageBrowseButton = 選擇您電腦上的檔案 -uploadPageBrowseButton1 = 選擇要上傳的檔案 -uploadPageMultipleFilesAlert = 目前暫不支援上傳多個檔案或資料夾。 -uploadPageBrowseButtonTitle = 上傳檔案 -uploadingPageProgress = 正在上傳 { $filename }({ $size }) +# Send is a brand name and should not be localized. +title = Send importingFile = 匯入中… -verifyingFile = 驗證中… encryptingFile = 加密中… decryptingFile = 解密中… -notifyUploadDone = 已完成上傳。 -uploadingPageMessage = 檔案上傳後,即可設定過期時間。 -uploadingPageCancel = 取消上傳 -uploadCancelNotification = 已取消上傳。 -uploadingPageLargeFileMessage = 這個檔案有點大,可能需要花點時間上傳,再等會兒! -uploadingFileNotification = 上傳完成時通知我。 -uploadSuccessConfirmHeader = 準備好傳送 -uploadSvgAlt = 上傳 -uploadSuccessTimingHeader = 您的檔案鏈結將會在首次下載,或 24 小時後失效。 -expireInfo = 檔案鏈結將在 { $downloadCount }或 { $timespan }後失效。 -downloadCount = { $num -> +downloadCount = + { $num -> *[other] { $num } 次下載 } -timespanHours = { $num -> +timespanHours = + { $num -> *[other] { $num } 小時 } -copyUrlFormLabelWithName = 複製並分享鏈結來傳送您的檔案: { $filename } -copyUrlFormButton = 複製到剪貼簿 copiedUrl = 已複製! -deleteFileButton = 刪除檔案 -sendAnotherFileLink = 傳送另一個檔案 -// Alternative text used on the download link/button (indicates an action). -downloadAltText = 下載 -downloadsFileList = 下載次數 -// Used as header in a column indicating the amount of time left before a -// download link expires (e.g. "10h 5m") -timeFileList = 剩餘時間 -// Used as header in a column indicating the number of times a file has been -// downloaded -downloadFileName = 下載 { $filename } -downloadFileSize = ({ $size }) -unlockInputLabel = 輸入密碼 unlockInputPlaceholder = 密碼 unlockButtonLabel = 解鎖 -downloadFileTitle = 下載加密過的檔案 -// Firefox Send is a brand name and should not be localized. -downloadMessage = 您的朋友正透過 Firefox Send 傳送檔案給您。這是一個可讓您透過安全、隱密、並且會將鏈結加密過,自動失效以確保檔案不會在網路上無限停留的檔案分享服務。 -// Text and title used on the download link/button (indicates an action). downloadButtonLabel = 下載 -downloadNotification = 下載完成。 downloadFinish = 下載完成 -// This message is displayed when uploading or downloading a file, e.g. "(1,3 MB of 10 MB)". fileSizeProgress = ({ $partialSize },共 { $totalSize }) -// Firefox Send is a brand name and should not be localized. -sendYourFilesLink = 試用 Firefox Send -downloadingPageProgress = 正在下載 { $filename }({ $size }) -downloadingPageMessage = 請保留此分頁開啟,我們將取回這個檔案並進行解密。 -errorAltText = 上傳錯誤 +sendYourFilesLink = 試用 Send errorPageHeader = 有些東西不對勁! -errorPageMessage = 上傳檔案時發生錯誤。 -errorPageLink = 傳送另一個檔案 fileTooBig = 檔案太大無法上傳。檔案大小限制為 { $size }。 linkExpiredAlt = 鏈結已過期 -expiredPageHeader = 鏈結已失效,或根本不存在! notSupportedHeader = 不支援您的瀏覽器。 -// Firefox Send is a brand name and should not be localized. -notSupportedDetail = 很可惜,您使用的瀏覽器並不支援 Firefox Send 所需的 Web 技術。請改用其他瀏覽器,我們推薦使用 Firefox! notSupportedLink = 為什麼我的瀏覽器不支援? -notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支援 Firefox Send 所需的 Web 技術。請更新瀏覽器後再使用。 +notSupportedOutdatedDetail = 很可惜,此版本的 Firefox 不支援 Send 所需的 Web 技術。請更新瀏覽器後再使用。 updateFirefox = 更新 Firefox -downloadFirefoxButtonSub = 免費下載 -uploadedFile = 檔案 -copyFileList = 複製網址 -// expiryFileList is used as a column header -expiryFileList = 失效於 -deleteFileList = 刪除 -nevermindButton = 沒關係 -legalHeader = 使用條款及隱私權 -legalNoticeTestPilot = Firefox Send 目前是一個 Test Pilot 實驗,依照 Test Pilot 的服務條款隱私權公告提供服務。您可以在此處了解實驗內容,以及所收集資料的詳細資訊。 -legalNoticeMozilla = 使用 Firefox Send 網站時,亦受到 Mozilla 的網站隱私權公告以及網站使用條款約束。 -deletePopupText = 真的要刪除這個檔案嗎? -deletePopupYes = 好的,刪除 -deletePopupCancel = 不要刪除 +deletePopupCancel = 取消 deleteButtonHover = 刪除 -copyUrlHover = 複製網址 footerLinkLegal = 法律資訊 -// Test Pilot is a proper name and should not be localized. -footerLinkAbout = 關於 Test Pilot footerLinkPrivacy = 隱私權 -footerLinkTerms = 使用條款 footerLinkCookies = Cookie -requirePasswordCheckbox = 需要密碼才能下載此檔案 -addPasswordButton = 新增密碼 -changePasswordButton = 變更 passwordTryAgain = 密碼不正確,請再試一次。 -// This label is followed by the password needed to download a file -passwordResult = 密碼: { $password } -reportIPInfringement = 回報智慧財產權濫用情況 -javascriptRequired = Firefox Send 需要開啟 JavaScript 功能 -whyJavascript = 為什麼 Firefox Send 需要 JavaScript 才能使用? +javascriptRequired = Send 需要開啟 JavaScript 功能 +whyJavascript = 為什麼 Send 需要 JavaScript 才能使用? enableJavascript = 請開啟 JavaScript 功能後再試一次。 -// A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" +# A short representation of a countdown timer containing the number of hours and minutes remaining as digits, example "13h 47m" expiresHoursMinutes = { $hours } 時 { $minutes } 分 -// A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" +# A short representation of a countdown timer containing the number of minutes remaining as digits, example "56m" expiresMinutes = { $minutes } 分鐘 +# A short status message shown when the user enters a long password +maxPasswordLength = 最大密碼長度: { $length } +# A short status message shown when there was an error setting the password +passwordSetError = 無法設定此密碼 + +## Send version 2 strings + +# Send, Send, Firefox, Mozilla are proper names and should not be localized +-send-brand = Send +-send-short-brand = Send +-firefox = Firefox +-mozilla = Mozilla +introTitle = 簡單而私密的檔案共享服務 +introDescription = { -send-brand } 讓您可透過點對點加密的方式來分享檔案,並提供會自動失效的鏈結。這樣一來就可以保留分享時的隱私,也確保檔案不會永久保存於網路上。 +notifyUploadEncryptDone = 已加密您的檔案,可以傳送 +# downloadCount is from the downloadCount string and timespan is a timespanMinutes string. ex. 'Expires after 2 downloads or 25 minutes' +archiveExpiryInfo = { $downloadCount } 或 { $timespan } 後失效 +timespanMinutes = + { $num -> + *[other] { $num } 分鐘 + } +timespanDays = + { $num -> + *[other] { $num } 天 + } +timespanWeeks = + { $num -> + *[other] { $num } 週 + } +fileCount = + { $num -> + *[other] { $num } 個檔案 + } +# byte abbreviation +bytes = 位元組 +# kibibyte abbreviation +kb = KB +# mebibyte abbreviation +mb = MB +# gibibyte abbreviation +gb = GB +# localized number and byte abbreviation. example "2.5MB" +fileSize = { $num } { $units } +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +totalSize = 總大小: { $size } +# the next line after the colon contains a file name +copyLinkDescription = 複製鏈結即可分享您的檔案: +copyLinkButton = 複製鏈結 +downloadTitle = 下載檔案 +downloadDescription = 此檔案是透過 { -send-brand } 進行分享,以點對點加密的方式來分享檔案,並提供會自動失效的鏈結。 +trySendDescription = 快試試 { -send-brand },簡單安全的檔案分享機制。 +# count will always be > 10 +tooManyFiles = + { $count -> + *[other] 一次僅能上傳 { $count } 個檔案。 + } +# count will always be > 10 +tooManyArchives = + { $count -> + *[other] 僅允許 { $count } 個壓縮檔。 + } +expiredTitle = 此鏈結已經失效。 +notSupportedDescription = 無法於此瀏覽器使用 { -send-brand }。在最新版的 { -firefox } 中使用 { -send-short-brand } 會有最佳效果,也可在大部分瀏覽器的最新版本當中使用。 +downloadFirefox = 下載 { -firefox } +legalTitle = { -send-short-brand } 隱私權公告 +legalDateStamp = 1.0 版,2019 年 3 月 12 日生效 +# A short representation of a countdown timer containing the number of days, hours, and minutes remaining as digits, example "2d 11h 56m" +expiresDaysHoursMinutes = { $days } 天 { $hours } 小時 { $minutes } 分鐘 +addFilesButton = 選擇要上傳的檔案 +trustWarningMessage = 分享敏感資料時,請務必確認收件者是可信任的人。 +uploadButton = 上傳 +# the first part of the string 'Drag and drop files or click to send up to 1GB' +dragAndDropFiles = 拖放檔案到此處 +# the second part of the string 'Drag and drop files or click to send up to 1GB' +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +orClickWithSize = 或點擊即可傳送最大 { $size } 的檔案 +addPassword = 使用密碼保護 +emailPlaceholder = 輸入您的電子郵件地址 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +signInSizeBump = 登入後即可傳送最大 { $size } 的檔案 +signInOnlyButton = 登入 +accountBenefitTitle = 註冊 { -firefox } 帳號或登入 +# $size is the size of the file, displayed using the fileSize message as format (e.g. "2.5MB") +accountBenefitLargeFiles = 分享最大 { $size } 的檔案 +accountBenefitDownloadCount = 分享檔案給更多人 +accountBenefitTimeLimit = + { $count -> + *[other] 將檔案鏈結保留 { $count } 天有效 + } +accountBenefitSync = 從任何裝置管理分享的檔案 +accountBenefitMoz = 了解其他 { -mozilla } 服務的更多資訊 +signOut = 登出 +okButton = 確定 +downloadingTitle = 下載中 +noStreamsWarning = 此瀏覽器無法解密這麼大的檔案。 +noStreamsOptionCopy = 複製鏈結,用其他瀏覽器開啟 +noStreamsOptionFirefox = 試試我們最愛的瀏覽器 +noStreamsOptionDownload = 繼續使用目前的瀏覽器 +downloadFirefoxPromo = { -send-short-brand } 是由全新的 { -firefox } 提供。 +# the next line after the colon contains a file name +shareLinkDescription = 您的檔案鏈結: +shareLinkButton = 分享鏈結 +# $name is the name of the file +shareMessage = 使用 { -send-brand } 下載「{ $name }」: 簡單安全的檔案分享機制 +trailheadPromo = 有種方法可以保護您的隱私,加入 Firefox。 +learnMore = 了解更多。 +downloadFlagged = 由於違反了服務條款,已停用此鏈結。 +downloadConfirmTitle = 還有一件事 +downloadConfirmDescription = 因為我們無法檢查此檔案是否會傷害您的裝置,請務必確認發送者是否可受信任。 +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +downloadTrustCheckbox = + { $count -> + *[other] 我信任傳送檔案給我的人 + } +# This string has a special case for '1' and [other] (default). If necessary for +# your language, you can add {$count} to your translations and use the +# standard CLDR forms, or only use the form for [other] if both strings should +# be identical. +reportFile = + { $count -> + *[other] 回報檔案為可疑檔案 + } +reportDescription = 請幫助我們釐清發生了什麼事。您覺得這些檔案有什麼問題? +reportUnknownDescription = 請到想要回報的鏈結網址點擊「{ reportFile }」。 +reportButton = 回報 +reportReasonMalware = 這些檔案包含惡意軟體,或是釣魚攻擊的一部分。 +reportReasonPii = 這些檔案包含我的個人資訊。 +reportReasonAbuse = 這些檔案包含非法或濫用內容。 +reportReasonCopyright = 若檔案內容侵犯了著作權或商標,請根據此頁面當中描述的方式進行回報。 +reportedTitle = 已回報檔案問題 +reportedDescription = 感謝您。我們已經收到您對這些檔案的問題回報。 diff --git a/public/robots.txt b/public/robots.txt deleted file mode 100644 index 72abb7a8e..000000000 --- a/public/robots.txt +++ /dev/null @@ -1,2 +0,0 @@ -User-agent: * -Disallow: /download/ diff --git a/scripts/bin/run-integration-test-circleci.sh b/scripts/bin/run-integration-test-circleci.sh new file mode 100755 index 000000000..183e478c2 --- /dev/null +++ b/scripts/bin/run-integration-test-circleci.sh @@ -0,0 +1,28 @@ +#!/bin/bash +set -ex + +GECKODRIVER_URL=$( + curl -s 'https://api.github.com/repos/mozilla/geckodriver/releases/latest' | + python -c "import sys, json; r = json.load(sys.stdin); print([a for a in r['assets'] if 'linux64' in a['name']][0]['browser_download_url']);" +); + + +curl -L -o geckodriver.tar.gz $GECKODRIVER_URL +gunzip -c geckodriver.tar.gz | tar xopf - +chmod +x geckodriver +sudo mv geckodriver /bin +geckodriver --version +# Install pip +sudo apt-get install python-pip +sudo pip install --upgrade pip + +sudo pip install mozdownload mozinstall==1.15 + +mkdir -p ~/project/firefox-downloads/ +find ~/project/firefox-downloads/ -type f -mtime +90 -delete +mozdownload --version latest --type daily --destination ~/project/firefox-downloads/firefox_nightly/ + +export PATH=~/project/firefox:$PATH +mozinstall $(ls -t firefox-downloads/firefox_nightly/*.tar.bz2 | head -1) +firefox --version + npm run circleci-test-integration \ No newline at end of file diff --git a/scripts/get-prod-locales.js b/scripts/get-prod-locales.js index 27c86e266..c6aae630b 100755 --- a/scripts/get-prod-locales.js +++ b/scripts/get-prod-locales.js @@ -19,8 +19,8 @@ exec(cmd) const locales = Object.keys(summary) .filter(locale => { const loc = summary[locale]; - const hasMissing = loc.hasOwnProperty('missing'); - const hasErrors = loc.hasOwnProperty('errors'); + const hasMissing = Object.prototype.hasOwnProperty.call(loc, 'missing'); + const hasErrors = Object.prototype.hasOwnProperty.call(loc, 'errors'); return !hasMissing && !hasErrors; }) .sort(); diff --git a/scripts/lint-locales.js b/scripts/lint-locales.js index fbcf84ef5..db1a29de9 100644 --- a/scripts/lint-locales.js +++ b/scripts/lint-locales.js @@ -33,7 +33,7 @@ function filterErrors(details) { .sort() .map(locale => { const data = details[locale] - .filter(item => item.hasOwnProperty('error')) + .filter(item => Object.prototype.hasOwnProperty.call(item, 'error')) .map(({ error }) => error); return { locale, data }; }) diff --git a/scripts/sync-npm-dependencies.sh b/scripts/sync-npm-dependencies.sh new file mode 100755 index 000000000..6e5e100f1 --- /dev/null +++ b/scripts/sync-npm-dependencies.sh @@ -0,0 +1,13 @@ +#!/bin/bash + +echo "checking package-lock.json for changes" +IFS=' ' +read -ra G_PARAMS <<< "$HUSKY_GIT_PARAMS" +PREV=${G_PARAMS[0]} +NEXT=${G_PARAMS[1]} +if [ "$PREV" != "$NEXT" ]; then + DIFF=$(git diff $PREV $NEXT package-lock.json) + if [ "$DIFF" != "" ]; then + npm install + fi +fi \ No newline at end of file diff --git a/server/amplitude.js b/server/amplitude.js new file mode 100644 index 000000000..116dc750a --- /dev/null +++ b/server/amplitude.js @@ -0,0 +1,193 @@ +const crypto = require('crypto'); +const fetch = require('node-fetch'); +const config = require('./config'); +const pkg = require('../package.json'); + +const HOUR = 1000 * 60 * 60; + +function truncateToHour(timestamp) { + return Math.floor(timestamp / HOUR) * HOUR; +} + +function orderOfMagnitude(n) { + return Math.floor(Math.log10(n)); +} + +function userId(fileId, ownerId) { + const hash = crypto.createHash('sha256'); + hash.update(fileId); + hash.update(ownerId); + return hash.digest('hex').substring(32); +} + +function statUploadEvent(data) { + const event = { + session_id: -1, + country: data.country, + region: data.state, + user_id: userId(data.id, data.owner), + app_version: pkg.version, + time: truncateToHour(Date.now()), + event_type: 'server_upload', + user_properties: { + download_limit: data.dlimit, + time_limit: data.timeLimit, + size: orderOfMagnitude(data.size), + anonymous: data.anonymous + }, + event_properties: { + agent: data.agent + }, + event_id: 0 + }; + return sendBatch([event]); +} + +function statDownloadEvent(data) { + const event = { + session_id: -1, + country: data.country, + region: data.state, + user_id: userId(data.id, data.owner), + app_version: pkg.version, + time: truncateToHour(Date.now()), + event_type: 'server_download', + event_properties: { + agent: data.agent, + download_count: data.download_count, + ttl: data.ttl + }, + event_id: data.download_count + }; + return sendBatch([event]); +} + +function statDeleteEvent(data) { + const event = { + session_id: -1, + country: data.country, + region: data.state, + user_id: userId(data.id, data.owner), + app_version: pkg.version, + time: truncateToHour(Date.now()), + event_type: 'server_delete', + event_properties: { + agent: data.agent, + download_count: data.download_count, + ttl: data.ttl + }, + event_id: data.download_count + 1 + }; + return sendBatch([event]); +} + +function statReportEvent(data) { + const event = { + session_id: -1, + country: data.country, + region: data.state, + user_id: userId(data.id, data.owner), + app_version: pkg.version, + time: truncateToHour(Date.now()), + event_type: 'server_report', + event_properties: { + reason: data.reason, + agent: data.agent, + download_limit: data.dlimit, + download_count: data.download_count, + ttl: data.ttl + }, + event_id: data.download_count + 1 + }; + return sendBatch([event]); +} + +function clientEvent( + event, + ua, + language, + session_id, + deltaT, + platform, + country, + state +) { + const ep = event.event_properties || {}; + const up = event.user_properties || {}; + const event_properties = { + browser: ua.browser.name, + browser_version: ua.browser.version, + status: ep.status, + + age: ep.age, + downloaded: ep.downloaded, + download_limit: ep.download_limit, + duration: ep.duration, + entrypoint: ep.entrypoint, + file_count: ep.file_count, + password_protected: ep.password_protected, + referrer: ep.referrer, + size: ep.size, + time_limit: ep.time_limit, + trigger: ep.trigger, + ttl: ep.ttl, + utm_campaign: ep.utm_campaign, + utm_content: ep.utm_content, + utm_medium: ep.utm_medium, + utm_source: ep.utm_source, + utm_term: ep.utm_term, + experiment: ep.experiment, + variant: ep.variant + }; + const user_properties = { + active_count: up.active_count, + anonymous: up.anonymous, + experiments: up.experiments, + first_action: up.first_action + }; + return { + app_version: pkg.version, + country: country, + device_id: event.device_id, + event_properties, + event_type: event.event_type, + language, + os_name: ua.os.name, + os_version: ua.os.version, + platform, + region: state, + session_id, + time: event.time + deltaT, + user_id: event.user_id, + user_properties + }; +} + +async function sendBatch(events, timeout = 1000) { + if (!config.amplitude_id) { + return 200; + } + try { + const result = await fetch('https://api.amplitude.com/batch', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + api_key: config.amplitude_id, + events + }), + timeout + }); + return result.status; + } catch (e) { + return 500; + } +} + +module.exports = { + statUploadEvent, + statDownloadEvent, + statDeleteEvent, + statReportEvent, + clientEvent, + sendBatch +}; diff --git a/server/bin/dev.js b/server/bin/dev.js new file mode 100644 index 000000000..a2e0e5221 --- /dev/null +++ b/server/bin/dev.js @@ -0,0 +1,46 @@ +const assets = require('../../common/assets'); +const routes = require('../routes'); +const pages = require('../routes/pages'); +const tests = require('../../test/frontend/routes'); +const express = require('express'); +const expressWs = require('@dannycoates/express-ws'); +const morgan = require('morgan'); +const config = require('../config'); + +const ID_REGEX = '([0-9a-fA-F]{10, 16})'; + +module.exports = function(app, devServer) { + const wsapp = express(); + expressWs(wsapp, null, { perMessageDeflate: false }); + routes(wsapp); + wsapp.ws('/api/ws', require('../routes/ws')); + wsapp.listen(1338, config.listen_address); + + assets.setMiddleware(devServer.middleware); + app.use(morgan('dev', { stream: process.stderr })); + function android(req, res) { + const index = devServer.middleware.fileSystem + .readFileSync(devServer.middleware.getFilenameFromUrl('/android.html')) + .toString() + .replace( + '', + '' + ); + res.set('Content-Type', 'text/html'); + res.send(index); + } + if (process.env.ANDROID) { + // map all html routes to the android index.html + app.get('/', android); + app.get(`/share/:id${ID_REGEX}`, android); + app.get('/completed', android); + app.get('/preferences', android); + app.get('/options', android); + app.get('/oauth', android); + } + routes(app); + tests(app); + // webpack-dev-server routes haven't been added yet + // so wait for next tick to add 404 handler + process.nextTick(() => app.use(pages.notfound)); +}; diff --git a/server/bin/prod.js b/server/bin/prod.js new file mode 100644 index 000000000..f1baa37b3 --- /dev/null +++ b/server/bin/prod.js @@ -0,0 +1,32 @@ +const express = require('express'); +const path = require('path'); +const Sentry = require('@sentry/node'); +const config = require('../config'); +const routes = require('../routes'); +const pages = require('../routes/pages'); +const expressWs = require('@dannycoates/express-ws'); + +if (config.sentry_dsn) { + Sentry.init({ dsn: config.sentry_dsn }); +} + +const app = express(); + +expressWs(app, null, { perMessageDeflate: false }); +routes(app); +app.ws('/api/ws', require('../routes/ws')); + +app.use( + express.static(path.resolve(__dirname, '../../dist/'), { + setHeaders: function(res, path) { + if (!/serviceWorker\.js$/.test(path)) { + res.set('Cache-Control', 'public, max-age=31536000, immutable'); + } + res.removeHeader('Pragma'); + } + }) +); + +app.use(pages.notfound); + +app.listen(config.listen_port, config.listen_address); diff --git a/server/bin/test.js b/server/bin/test.js new file mode 100644 index 000000000..5cbed848b --- /dev/null +++ b/server/bin/test.js @@ -0,0 +1,16 @@ +const assets = require('../../common/assets'); +const routes = require('../routes'); +const pages = require('../routes/pages'); +const tests = require('../../test/frontend/routes'); +const expressWs = require('@dannycoates/express-ws'); + +module.exports = function(app, devServer) { + assets.setMiddleware(devServer.middleware); + expressWs(app, null, { perMessageDeflate: false }); + routes(app); + app.ws('/api/ws', require('../routes/ws')); + tests(app); + // webpack-dev-server routes haven't been added yet + // so wait for next tick to add 404 handler + process.nextTick(() => app.use(pages.notfound)); +}; diff --git a/server/clientConstants.js b/server/clientConstants.js new file mode 100644 index 000000000..0df501c21 --- /dev/null +++ b/server/clientConstants.js @@ -0,0 +1,21 @@ +const config = require('./config'); + +module.exports = { + LIMITS: { + ANON: { + MAX_FILE_SIZE: config.anon_max_file_size, + MAX_DOWNLOADS: config.anon_max_downloads, + MAX_EXPIRE_SECONDS: config.anon_max_expire_seconds + }, + MAX_FILE_SIZE: config.max_file_size, + MAX_DOWNLOADS: config.max_downloads, + MAX_EXPIRE_SECONDS: config.max_expire_seconds, + MAX_FILES_PER_ARCHIVE: config.max_files_per_archive, + MAX_ARCHIVES_PER_USER: config.max_archives_per_user + }, + DEFAULTS: { + DOWNLOAD_COUNTS: config.download_counts, + EXPIRE_TIMES_SECONDS: config.expire_times_seconds, + EXPIRE_SECONDS: config.default_expire_seconds + } +}; diff --git a/server/config.js b/server/config.js index 55eef764e..48ffa501b 100644 --- a/server/config.js +++ b/server/config.js @@ -9,9 +9,69 @@ const conf = convict({ default: '', env: 'S3_BUCKET' }, + s3_endpoint: { + format: String, + default: '', + env: 'S3_ENDPOINT' + }, + s3_use_path_style_endpoint: { + format: Boolean, + default: false, + env: 'S3_USE_PATH_STYLE_ENDPOINT' + }, + gcs_bucket: { + format: String, + default: '', + env: 'GCS_BUCKET' + }, + expire_times_seconds: { + format: Array, + default: [300, 3600, 86400, 604800], + env: 'EXPIRE_TIMES_SECONDS' + }, + default_expire_seconds: { + format: Number, + default: 86400, + env: 'DEFAULT_EXPIRE_SECONDS' + }, + max_expire_seconds: { + format: Number, + default: 86400 * 7, + env: 'MAX_EXPIRE_SECONDS' + }, + anon_max_expire_seconds: { + format: Number, + default: 86400, + env: 'ANON_MAX_EXPIRE_SECONDS' + }, + download_counts: { + format: Array, + default: [1, 2, 3, 4, 5, 20, 50, 100], + env: 'DOWNLOAD_COUNTS' + }, + max_downloads: { + format: Number, + default: 100, + env: 'MAX_DOWNLOADS' + }, + anon_max_downloads: { + format: Number, + default: 5, + env: 'ANON_MAX_DOWNLOADS' + }, + max_files_per_archive: { + format: Number, + default: 64, + env: 'MAX_FILES_PER_ARCHIVE' + }, + max_archives_per_user: { + format: Number, + default: 16, + env: 'MAX_ARCHIVES_PER_USER' + }, redis_host: { format: String, - default: 'localhost', + default: 'mock', env: 'REDIS_HOST' }, redis_event_expire: { @@ -19,6 +79,16 @@ const conf = convict({ default: false, env: 'REDIS_EVENT_EXPIRE' }, + redis_retry_time: { + format: Number, + default: 10000, + env: 'REDIS_RETRY_TIME' + }, + redis_retry_delay: { + format: Number, + default: 500, + env: 'REDIS_RETRY_DELAY' + }, listen_address: { format: 'ipaddress', default: '0.0.0.0', @@ -30,6 +100,11 @@ const conf = convict({ arg: 'port', env: 'PORT' }, + amplitude_id: { + format: String, + default: '', + env: 'AMPLITUDE_ID' + }, analytics_id: { format: String, default: '', @@ -45,6 +120,11 @@ const conf = convict({ default: '', env: 'SENTRY_DSN' }, + sentry_host: { + format: String, + default: 'https://sentry.prod.mozaws.net', + env: 'SENTRY_HOST' + }, env: { format: ['production', 'development', 'test'], default: 'development', @@ -52,13 +132,13 @@ const conf = convict({ }, max_file_size: { format: Number, - default: 1024 * 1024 * 1024 * 2, + default: 1024 * 1024 * 1024 * 2.5, env: 'MAX_FILE_SIZE' }, - expire_seconds: { + anon_max_file_size: { format: Number, - default: 86400, - env: 'EXPIRE_SECONDS' + default: 1024 * 1024 * 1024, + env: 'ANON_MAX_FILE_SIZE' }, l10n_dev: { format: Boolean, @@ -74,6 +154,56 @@ const conf = convict({ format: 'String', default: `${tmpdir()}${path.sep}send-${randomBytes(4).toString('hex')}`, env: 'FILE_DIR' + }, + fxa_required: { + format: Boolean, + default: false, + env: 'FXA_REQUIRED' + }, + fxa_url: { + format: 'url', + default: 'http://localhost:3030', + env: 'FXA_URL' + }, + fxa_client_id: { + format: String, + default: '', // disabled + env: 'FXA_CLIENT_ID' + }, + fxa_key_scope: { + format: String, + default: 'https://identity.mozilla.com/apps/send', + env: 'FXA_KEY_SCOPE' + }, + fxa_csp_oauth_url: { + format: String, + default: '', + env: 'FXA_CSP_OAUTH_URL' + }, + fxa_csp_content_url: { + format: String, + default: '', + env: 'FXA_CSP_CONTENT_URL' + }, + fxa_csp_profile_url: { + format: String, + default: '', + env: 'FXA_CSP_PROFILE_URL' + }, + fxa_csp_profileimage_url: { + format: String, + default: '', + env: 'FXA_CSP_PROFILEIMAGE_URL' + }, + survey_url: { + format: String, + default: '', + env: 'SURVEY_URL' + }, + ip_db: { + format: String, + default: '', + env: 'IP_DB' } }); diff --git a/server/dev.js b/server/dev.js deleted file mode 100644 index a21bb65d8..000000000 --- a/server/dev.js +++ /dev/null @@ -1,13 +0,0 @@ -const assets = require('../common/assets'); -const locales = require('../common/locales'); -const routes = require('./routes'); -const pages = require('./routes/pages'); - -module.exports = function(app, devServer) { - assets.setMiddleware(devServer.middleware); - locales.setMiddleware(devServer.middleware); - routes(app); - // webpack-dev-server routes haven't been added yet - // so wait for next tick to add 404 handler - process.nextTick(() => app.use(pages.notfound)); -}; diff --git a/server/fxa.js b/server/fxa.js new file mode 100644 index 000000000..47d3bd6e6 --- /dev/null +++ b/server/fxa.js @@ -0,0 +1,54 @@ +const fetch = require('node-fetch'); +const config = require('./config'); + +const KEY_SCOPE = config.fxa_key_scope; +let fxaConfig = null; +let lastConfigRefresh = 0; + +async function getFxaConfig() { + if (fxaConfig && Date.now() - lastConfigRefresh < 1000 * 60 * 5) { + return fxaConfig; + } + try { + const res = await fetch( + `${config.fxa_url}/.well-known/openid-configuration`, + { timeout: 3000 } + ); + fxaConfig = await res.json(); + fxaConfig.key_scope = KEY_SCOPE; + lastConfigRefresh = Date.now(); + } catch (e) { + // continue with previous fxaConfig + } + return fxaConfig; +} + +module.exports = { + getFxaConfig, + verify: async function(token) { + if (!token) { + return null; + } + + const c = await getFxaConfig(); + try { + const verifyUrl = c.jwks_uri.replace('jwks', 'verify'); //HACK + const result = await fetch(verifyUrl, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ token }) + }); + const info = await result.json(); + if ( + info.scope && + Array.isArray(info.scope) && + info.scope.includes(KEY_SCOPE) + ) { + return info.user; + } + } catch (e) { + // gulp + } + return null; + } +}; diff --git a/server/initScript.js b/server/initScript.js new file mode 100644 index 000000000..2c4ae4135 --- /dev/null +++ b/server/initScript.js @@ -0,0 +1,61 @@ +const html = require('choo/html'); +const raw = require('choo/html/raw'); +const config = require('./config'); +const clientConstants = require('./clientConstants'); + +let sentry = ''; +if (config.sentry_id) { + //eslint-disable-next-line node/no-missing-require + const version = require('../dist/version.json'); + sentry = ` +var SENTRY_CONFIG = { + dsn: '${config.sentry_id}', + release: '${version.version}', + beforeSend: function (data) { + var hash = window.location.hash; + if (hash) { + return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); + } + return data; + } +} +`; +} + +module.exports = function(state) { + const authConfig = state.authConfig + ? `var AUTH_CONFIG = ${JSON.stringify(state.authConfig)};` + : ''; + + /* eslint-disable no-useless-escape */ + const jsconfig = ` + var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent); + var isUnsupportedPage = /\\\/unsupported/.test(location.pathname); + if (isIE && !isUnsupportedPage) { + window.location.assign('/unsupported/ie'); + } + if ( + // Firefox < 50 + /firefox/i.test(navigator.userAgent) && + parseInt(navigator.userAgent.match(/firefox\\/*([^\\n\\r]*)\./i)[1], 10) < 50 + ) { + window.location.assign('/unsupported/outdated'); + } + + var LIMITS = ${JSON.stringify(clientConstants.LIMITS)}; + var DEFAULTS = ${JSON.stringify(clientConstants.DEFAULTS)}; + var PREFS = ${JSON.stringify(state.prefs)}; + var downloadMetadata = ${ + state.downloadMetadata ? raw(JSON.stringify(state.downloadMetadata)) : '{}' + }; + ${authConfig}; + ${sentry} + `; + return state.cspNonce + ? html` + + ` + : ''; +}; diff --git a/server/keychain.js b/server/keychain.js new file mode 100644 index 000000000..e7dc0156d --- /dev/null +++ b/server/keychain.js @@ -0,0 +1,53 @@ +const { Crypto } = require('@peculiar/webcrypto'); +const crypto = new Crypto(); + +const encoder = new TextEncoder(); +const decoder = new TextDecoder(); + +module.exports = class Keychain { + constructor(secretKeyB64) { + if (secretKeyB64) { + this.rawSecret = new Uint8Array(Buffer.from(secretKeyB64, 'base64')); + } else { + throw new Error('key is required'); + } + this.secretKeyPromise = crypto.subtle.importKey( + 'raw', + this.rawSecret, + 'HKDF', + false, + ['deriveKey'] + ); + this.metaKeyPromise = this.secretKeyPromise.then(function(secretKey) { + return crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('metadata'), + hash: 'SHA-256' + }, + secretKey, + { + name: 'AES-GCM', + length: 128 + }, + false, + ['decrypt'] + ); + }); + } + + async decryptMetadata(ciphertext) { + const metaKey = await this.metaKeyPromise; + const plaintext = await crypto.subtle.decrypt( + { + name: 'AES-GCM', + iv: new Uint8Array(12), + tagLength: 128 + }, + metaKey, + ciphertext + ); + return JSON.parse(decoder.decode(plaintext)); + } +}; diff --git a/server/languages.js b/server/languages.js deleted file mode 100644 index d9121eefb..000000000 --- a/server/languages.js +++ /dev/null @@ -1,16 +0,0 @@ -const { availableLanguages } = require('../package.json'); -const config = require('./config'); -const fs = require('fs'); -const path = require('path'); - -function allLangs() { - return fs.readdirSync( - path.join(__dirname, '..', 'dist', 'public', 'locales') - ); -} - -if (config.l10n_dev) { - module.exports = allLangs(); -} else { - module.exports = availableLanguages; -} diff --git a/server/layout.js b/server/layout.js index 18bef3cd6..8de998616 100644 --- a/server/layout.js +++ b/server/layout.js @@ -1,77 +1,68 @@ const html = require('choo/html'); const assets = require('../common/assets'); -const locales = require('../common/locales'); +const initScript = require('./initScript'); module.exports = function(state, body = '') { - const firaTag = state.fira - ? html`` - : ''; return html` - - - - - - + + + + ${state.title} + + + + + + + + - - - - - - - - - - - ${state.title} - - - - - - - - - - - - - - - - - - - - - - - - - - ${firaTag} - - - - - - - ${body} - + + + + + + + + + + + ${body} ${initScript(state)} + `; }; diff --git a/server/limiter.js b/server/limiter.js new file mode 100644 index 000000000..feb9d42a7 --- /dev/null +++ b/server/limiter.js @@ -0,0 +1,21 @@ +const { Transform } = require('stream'); + +class Limiter extends Transform { + constructor(limit) { + super(); + this.limit = limit; + this.length = 0; + } + + _transform(chunk, encoding, callback) { + this.length += chunk.length; + this.push(chunk); + if (this.length > this.limit) { + console.error('LIMIT', this.length, this.limit); + return callback(new Error('limit')); + } + callback(); + } +} + +module.exports = Limiter; diff --git a/server/locale.js b/server/locale.js new file mode 100644 index 000000000..f4ae10460 --- /dev/null +++ b/server/locale.js @@ -0,0 +1,26 @@ +const fs = require('fs'); +const path = require('path'); +const { FluentBundle } = require('@fluent/bundle'); +const localesPath = path.resolve(__dirname, '../public/locales'); +const locales = fs.readdirSync(localesPath); + +function makeBundle(locale) { + const bundle = new FluentBundle(locale, { useIsolating: false }); + bundle.addMessages( + fs.readFileSync(path.resolve(localesPath, locale, 'send.ftl'), 'utf8') + ); + return [locale, bundle]; +} + +const bundles = new Map(locales.map(makeBundle)); + +module.exports = function getTranslator(locale) { + const defaultBundle = bundles.get('en-US'); + const bundle = bundles.get(locale) || defaultBundle; + return function(id, data) { + if (bundle.hasMessage(id)) { + return bundle.format(bundle.getMessage(id), data); + } + return defaultBundle.format(defaultBundle.getMessage(id), data); + }; +}; diff --git a/server/metadata.js b/server/metadata.js new file mode 100644 index 000000000..a0ca9e10e --- /dev/null +++ b/server/metadata.js @@ -0,0 +1,46 @@ +const crypto = require('crypto'); + +function makeToken(secret, counter) { + const hmac = crypto.createHmac('sha256', secret); + hmac.update(String(counter)); + return hmac.digest('hex'); +} + +class Metadata { + constructor(obj, storage) { + this.id = obj.id; + this.dl = +obj.dl || 0; + this.dlToken = +obj.dlToken || 0; + this.dlimit = +obj.dlimit || 1; + this.pwd = !!+obj.pwd; + this.owner = obj.owner; + this.metadata = obj.metadata; + this.auth = obj.auth; + this.nonce = obj.nonce; + this.flagged = !!obj.flagged; + this.dead = !!obj.dead; + this.fxa = !!+obj.fxa; + this.storage = storage; + } + + async getDownloadToken() { + if (this.dlToken >= this.dlimit) { + throw new Error('limit'); + } + this.dlToken = await this.storage.incrementField(this.id, 'dlToken'); + // another request could have also incremented + if (this.dlToken > this.dlimit) { + throw new Error('limit'); + } + return makeToken(this.owner, this.dlToken); + } + + async verifyDownloadToken(token) { + const validTokens = Array.from({ length: this.dlToken }, (_, i) => + makeToken(this.owner, i + 1) + ); + return validTokens.includes(token); + } +} + +module.exports = Metadata; diff --git a/server/middleware/auth.js b/server/middleware/auth.js new file mode 100644 index 000000000..b1af98565 --- /dev/null +++ b/server/middleware/auth.js @@ -0,0 +1,96 @@ +const assert = require('assert'); +const crypto = require('crypto'); +const storage = require('../storage'); +const fxa = require('../fxa'); + +module.exports = { + hmac: async function(req, res, next) { + const id = req.params.id; + const authHeader = req.header('Authorization'); + if (id && authHeader) { + try { + const auth = req.header('Authorization').split(' ')[1]; + const meta = await storage.metadata(id); + if (!meta) { + return res.sendStatus(404); + } + const hmac = crypto.createHmac( + 'sha256', + Buffer.from(meta.auth, 'base64') + ); + hmac.update(Buffer.from(meta.nonce, 'base64')); + const verifyHash = hmac.digest(); + if (crypto.timingSafeEqual(verifyHash, Buffer.from(auth, 'base64'))) { + req.nonce = crypto.randomBytes(16).toString('base64'); + storage.setField(id, 'nonce', req.nonce); + res.set('WWW-Authenticate', `send-v1 ${req.nonce}`); + req.authorized = true; + req.meta = meta; + } else { + res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); + req.authorized = false; + } + } catch (e) { + req.authorized = false; + } + } + if (req.authorized) { + next(); + } else { + res.sendStatus(401); + } + }, + owner: async function(req, res, next) { + const id = req.params.id; + const ownerToken = req.body.owner_token; + if (id && ownerToken) { + try { + req.meta = await storage.metadata(id); + if (!req.meta || req.meta.dead) { + return res.sendStatus(404); + } + const metaOwner = Buffer.from(req.meta.owner, 'utf8'); + const owner = Buffer.from(ownerToken, 'utf8'); + assert(metaOwner.length > 0); + assert(metaOwner.length === owner.length); + req.authorized = crypto.timingSafeEqual(metaOwner, owner); + } catch (e) { + req.authorized = false; + } + } + if (req.authorized) { + next(); + } else { + res.sendStatus(401); + } + }, + fxa: async function(req, res, next) { + const authHeader = req.header('Authorization'); + if (authHeader && /^Bearer\s/i.test(authHeader)) { + const token = authHeader.split(' ')[1]; + req.user = await fxa.verify(token); + } + if (req.user) { + next(); + } else { + res.sendStatus(401); + } + }, + dlToken: async function(req, res, next) { + const authHeader = req.header('Authorization'); + if (authHeader && /^Bearer\s/i.test(authHeader)) { + const token = authHeader.split(' ')[1]; + const id = req.params.id; + req.meta = await storage.metadata(id); + if (!req.meta || req.meta.dead) { + return res.sendStatus(404); + } + req.authorized = await req.meta.verifyDownloadToken(token); + } + if (req.authorized) { + next(); + } else { + res.sendStatus(401); + } + } +}; diff --git a/server/middleware/language.js b/server/middleware/language.js new file mode 100644 index 000000000..0de27e9b2 --- /dev/null +++ b/server/middleware/language.js @@ -0,0 +1,42 @@ +const { availableLanguages } = require('../../package.json'); +const config = require('../config'); +const fs = require('fs'); +const path = require('path'); +const { negotiateLanguages } = require('@fluent/langneg'); +const langData = require('cldr-core/supplemental/likelySubtags.json'); + +// We return early in the middleware if the lang header is long. +// If that ever changes we should re-evaluate this regex. +// eslint-disable-next-line security/detect-unsafe-regex +const acceptLanguages = /(([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?/g; + +function allLangs() { + return fs.readdirSync(path.join(__dirname, '..', '..', 'public', 'locales')); +} + +const languages = config.l10n_dev ? allLangs() : availableLanguages; + +module.exports = function(req, res, next) { + const header = req.headers['accept-language'] || 'en-US'; + if (header.length > 255) { + req.language = 'en-US'; + return next(); + } + const langs = header.replace(/\s/g, '').match(acceptLanguages) || ['en-US']; + const preferred = langs + .map(l => { + const parts = l.split(';'); + return { + locale: parts[0], + q: parts[1] ? parseFloat(parts[1].split('=')[1]) : 1 + }; + }) + .sort((a, b) => b.q - a.q) + .map(x => x.locale); + req.language = negotiateLanguages(preferred, languages, { + strategy: 'lookup', + likelySubtags: langData.supplemental.likelySubtags, + defaultLocale: 'en-US' + })[0]; + next(); +}; diff --git a/server/prod.js b/server/prod.js deleted file mode 100644 index 4177b1606..000000000 --- a/server/prod.js +++ /dev/null @@ -1,27 +0,0 @@ -const express = require('express'); -const path = require('path'); -const Raven = require('raven'); -const config = require('./config'); -const routes = require('./routes'); -const pages = require('./routes/pages'); - -if (config.sentry_dsn) { - Raven.config(config.sentry_dsn).install(); -} - -const app = express(); - -routes(app); - -app.use( - express.static(path.resolve(__dirname, '../dist/'), { - setHeaders: function(res) { - res.set('Cache-Control', 'public, max-age=31536000, immutable'); - res.removeHeader('Pragma'); - } - }) -); - -app.use(pages.notfound); - -app.listen(config.listen_port, config.listen_address); diff --git a/server/readme.md b/server/readme.md new file mode 100644 index 000000000..82b68f276 --- /dev/null +++ b/server/readme.md @@ -0,0 +1,19 @@ +# Server Code + +The server provides the API, serves static assets, and renders the pages for Send. The production entrypoint is [prod.js](./bin/prod.js) and the development entrypoint is [dev.js](./bin/dev.js) via `webpack-dev-server`. + +## Server configuration + +[config.js](./config.js) contains the schema for our configuration options. Environment variables are the preferred method for setting configuration. + +## Middleware + +Contains authentication and localization middleware. + +## Routes + +Contains all the server routes and handlers for the API and pages + +## Storage + +Contains implementations of possible storage engines for the files and metadata diff --git a/server/routes/delete.js b/server/routes/delete.js index 080b7a696..586cd9dc1 100644 --- a/server/routes/delete.js +++ b/server/routes/delete.js @@ -1,20 +1,23 @@ const storage = require('../storage'); +const { statDeleteEvent } = require('../amplitude'); module.exports = async function(req, res) { - const id = req.params.id; - - const ownerToken = req.body.owner_token || req.body.delete_token; - - if (!ownerToken) { - res.sendStatus(404); - return; - } - try { - const err = await storage.delete(id, ownerToken); - if (!err) { - res.sendStatus(200); - } + const id = req.params.id; + const meta = req.meta; + const ttl = await storage.ttl(id); + await storage.kill(id); + res.sendStatus(200); + statDeleteEvent({ + id, + ip: req.ip, + country: req.geo.country, + state: req.geo.state, + owner: meta.owner, + download_count: meta.dl, + ttl, + agent: req.ua.browser.name || req.ua.ua.substring(0, 6) + }); } catch (e) { res.sendStatus(404); } diff --git a/server/routes/done.js b/server/routes/done.js new file mode 100644 index 000000000..8c61a084f --- /dev/null +++ b/server/routes/done.js @@ -0,0 +1,31 @@ +const storage = require('../storage'); +const { statDownloadEvent } = require('../amplitude'); + +module.exports = async function(req, res) { + try { + const id = req.params.id; + const meta = req.meta; + const ttl = await storage.ttl(id); + statDownloadEvent({ + id, + ip: req.ip, + owner: meta.owner, + download_count: meta.dl, + ttl, + agent: req.ua.browser.name || req.ua.ua.substring(0, 6) + }); + await storage.incrementField(id, 'dl'); + if (meta.dl + 1 >= meta.dlimit) { + // Only dlimit number of tokens will be issued + // after which /download/token will return 403 + // however the protocol doesn't prevent one token + // from making all the downloads and assumes + // clients are well behaved. If this becomes + // a problem we can keep track of used tokens. + await storage.kill(id); + } + res.sendStatus(200); + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/download.js b/server/routes/download.js index 56a0f23ee..17fcb7a8e 100644 --- a/server/routes/download.js +++ b/server/routes/download.js @@ -1,48 +1,14 @@ const storage = require('../storage'); -const mozlog = require('../log'); -const log = mozlog('send.download'); -const crypto = require('crypto'); module.exports = async function(req, res) { const id = req.params.id; - try { - const auth = req.header('Authorization').split(' ')[1]; - const meta = await storage.metadata(id); - const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64')); - hmac.update(Buffer.from(meta.nonce, 'base64')); - const verifyHash = hmac.digest(); - if (!verifyHash.equals(Buffer.from(auth, 'base64'))) { - res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); - return res.sendStatus(401); - } - const nonce = crypto.randomBytes(16).toString('base64'); - storage.setField(id, 'nonce', nonce); - const contentLength = await storage.length(id); + const { length, stream } = await storage.get(id); res.writeHead(200, { - 'Content-Disposition': 'attachment', 'Content-Type': 'application/octet-stream', - 'Content-Length': contentLength, - 'X-File-Metadata': meta.metadata, - 'WWW-Authenticate': `send-v1 ${nonce}` - }); - const file_stream = storage.get(id); - - file_stream.on('end', async () => { - const dl = (+meta.dl || 0) + 1; - const dlimit = +meta.dlimit || 1; - try { - if (dl >= dlimit) { - await storage.forceDelete(id); - } else { - await storage.setField(id, 'dl', dl); - } - } catch (e) { - log.info('StorageError:', id); - } + 'Content-Length': length }); - - file_stream.pipe(res); + stream.pipe(res); } catch (e) { res.sendStatus(404); } diff --git a/server/routes/exists.js b/server/routes/exists.js index c8039887c..5f4fdeee1 100644 --- a/server/routes/exists.js +++ b/server/routes/exists.js @@ -1,13 +1,14 @@ const storage = require('../storage'); module.exports = async (req, res) => { - const id = req.params.id; - try { - const meta = await storage.metadata(id); + const meta = await storage.metadata(req.params.id); + if (!meta || meta.dead) { + return res.sendStatus(404); + } res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); res.send({ - password: meta.pwd !== '0' + requiresPassword: meta.pwd }); } catch (e) { res.sendStatus(404); diff --git a/server/routes/filelist.js b/server/routes/filelist.js new file mode 100644 index 000000000..eb000b311 --- /dev/null +++ b/server/routes/filelist.js @@ -0,0 +1,49 @@ +const crypto = require('crypto'); +const config = require('../config'); +const storage = require('../storage'); +const Limiter = require('../limiter'); + +function id(user, kid) { + const sha = crypto.createHash('sha256'); + sha.update(user); + sha.update(kid); + const hash = sha.digest('hex'); + return `filelist-${hash}`; +} + +module.exports = { + async get(req, res) { + const kid = req.params.id; + try { + const fileId = id(req.user, kid); + const { length, stream } = await storage.get(fileId); + res.writeHead(200, { + 'Content-Type': 'application/octet-stream', + 'Content-Length': length + }); + stream.pipe(res); + } catch (e) { + res.sendStatus(404); + } + }, + + async post(req, res) { + const kid = req.params.id; + try { + const limiter = new Limiter(1024 * 1024 * 10); + const fileStream = req.pipe(limiter); + await storage.set( + id(req.user, kid), + fileStream, + null, + config.max_expire_seconds + ); + res.sendStatus(200); + } catch (e) { + if (e.message === 'limit') { + return res.sendStatus(413); + } + res.sendStatus(500); + } + } +}; diff --git a/server/routes/index.js b/server/routes/index.js index f2c7e79d7..5e17e0b8e 100644 --- a/server/routes/index.js +++ b/server/routes/index.js @@ -1,41 +1,20 @@ -const busboy = require('connect-busboy'); -const helmet = require('helmet'); +const crypto = require('crypto'); const bodyParser = require('body-parser'); -const languages = require('../languages'); +const helmet = require('helmet'); +const uaparser = require('ua-parser-js'); const storage = require('../storage'); const config = require('../config'); +const auth = require('../middleware/auth'); +const language = require('../middleware/language'); const pages = require('./pages'); -const { negotiateLanguages } = require('fluent-langneg'); +const filelist = require('./filelist'); +const clientConstants = require('../clientConstants'); + const IS_DEV = config.env === 'development'; -const acceptLanguages = /(([a-zA-Z]+(-[a-zA-Z0-9]+){0,2})|\*)(;q=[0-1](\.[0-9]+)?)?/g; -const langData = require('cldr-core/supplemental/likelySubtags.json'); -const idregx = '([0-9a-fA-F]{10})'; +const ID_REGEX = '([0-9a-fA-F]{10,16})'; module.exports = function(app) { - app.use(function(req, res, next) { - const header = req.headers['accept-language'] || 'en-US'; - if (header.length > 255) { - req.language = 'en-US'; - return next(); - } - const langs = header.replace(/\s/g, '').match(acceptLanguages); - const preferred = langs - .map(l => { - const parts = l.split(';'); - return { - locale: parts[0], - q: parts[1] ? parseFloat(parts[1].split('=')[1]) : 1 - }; - }) - .sort((a, b) => b.q - a.q) - .map(x => x.locale); - req.language = negotiateLanguages(preferred, languages, { - strategy: 'lookup', - likelySubtags: langData.supplemental.likelySubtags, - defaultLocale: 'en-US' - })[0]; - next(); - }); + app.set('trust proxy', true); app.use(helmet()); app.use( helmet.hsts({ @@ -43,62 +22,128 @@ module.exports = function(app) { force: !IS_DEV }) ); + app.use(function(req, res, next) { + req.ua = uaparser(req.header('user-agent')); + next(); + }); + app.use(function(req, res, next) { + req.cspNonce = crypto.randomBytes(16).toString('hex'); + next(); + }); if (!IS_DEV) { - app.use( - helmet.contentSecurityPolicy({ - directives: { - defaultSrc: ["'self'"], - connectSrc: [ - "'self'", - 'https://sentry.prod.mozaws.net', - 'https://www.google-analytics.com' - ], - imgSrc: ["'self'", 'https://www.google-analytics.com'], - scriptSrc: ["'self'"], - styleSrc: [ - "'self'", - "'unsafe-inline'", - 'https://code.cdn.mozilla.net' - ], - fontSrc: ["'self'", 'https://code.cdn.mozilla.net'], - formAction: ["'none'"], - frameAncestors: ["'none'"], - objectSrc: ["'none'"], - reportUri: '/__cspreport__' - } - }) - ); - } - app.use( - busboy({ - limits: { - fileSize: config.max_file_size + let csp = { + directives: { + defaultSrc: ["'self'"], + connectSrc: [ + "'self'", + config.base_url.replace(/^https:\/\//, 'wss://') + ], + imgSrc: ["'self'"], + scriptSrc: [ + "'self'", + function(req) { + return `'nonce-${req.cspNonce}'`; + } + ], + formAction: ["'none'"], + frameAncestors: ["'none'"], + objectSrc: ["'none'"], + reportUri: '/__cspreport__' } - }) - ); + }; + if (config.fxa_client_id) { + csp.directives.connectSrc.push('https://accounts.firefox.com'); + csp.directives.connectSrc.push('https://*.accounts.firefox.com'); + csp.directives.imgSrc.push('https://firefoxusercontent.com'); + csp.directives.imgSrc.push('https://secure.gravatar.com'); + } + if (config.sentry_id) { + csp.directives.connectSrc.push(config.sentry_host); + } + if ( + /^https:\/\/.*\.dev\.lcip\.org$/.test(config.base_url) || + /^https:\/\/.*\.send\.nonprod\.cloudops\.mozgcp\.net$/.test( + config.base_url + ) + ) { + csp.directives.connectSrc.push('https://*.dev.lcip.org'); + csp.directives.imgSrc.push('https://*.dev.lcip.org'); + } + if (config.fxa_csp_oauth_url != '') { + csp.directives.connectSrc.push(config.fxa_csp_oauth_url); + } + if (config.fxa_csp_content_url != '') { + csp.directives.connectSrc.push(config.fxa_csp_content_url); + } + if (config.fxa_csp_profile_url != '') { + csp.directives.connectSrc.push(config.fxa_csp_profile_url); + } + if (config.fxa_csp_profileimage_url != '') { + csp.directives.imgSrc.push(config.fxa_csp_profileimage_url); + } + + app.use(helmet.contentSecurityPolicy(csp)); + } + app.use(function(req, res, next) { res.set('Pragma', 'no-cache'); - res.set('Cache-Control', 'no-cache'); + res.set( + 'Cache-Control', + 'private, no-cache, no-store, must-revalidate, max-age=0' + ); + next(); + }); + app.use(function(req, res, next) { + try { + // set by the load balancer + const [country, state] = req.header('X-Client-Geo-Location').split(','); + req.geo = { + country, + state + }; + } catch (e) { + req.geo = {}; + } next(); }); app.use(bodyParser.json()); - app.get('/', pages.index); - app.get('/legal', pages.legal); - app.get('/jsconfig.js', require('./jsconfig')); - app.get(`/share/:id${idregx}`, pages.blank); - app.get(`/download/:id${idregx}`, pages.download); - app.get('/completed', pages.blank); - app.get('/unsupported/:reason', pages.unsupported); - app.get(`/api/download/:id${idregx}`, require('./download')); - app.get(`/api/exists/:id${idregx}`, require('./exists')); - app.get(`/api/metadata/:id${idregx}`, require('./metadata')); - app.post('/api/upload', require('./upload')); - app.post(`/api/delete/:id${idregx}`, require('./delete')); - app.post(`/api/password/:id${idregx}`, require('./password')); - app.post(`/api/params/:id${idregx}`, require('./params')); - app.post(`/api/info/:id${idregx}`, require('./info')); - + app.use(bodyParser.text()); + app.get('/', language, pages.index); + app.get('/config', function(req, res) { + res.json(clientConstants); + }); + app.get('/error', language, pages.blank); + app.get('/oauth', language, pages.blank); + app.get('/login', language, pages.index); + app.get('/report', language, pages.blank); + app.get('/app.webmanifest', language, require('./webmanifest')); + app.get(`/download/:id${ID_REGEX}`, language, pages.download); + app.get('/unsupported/:reason', language, pages.unsupported); + app.get(`/api/download/token/:id${ID_REGEX}`, auth.hmac, require('./token')); + app.get(`/api/download/:id${ID_REGEX}`, auth.dlToken, require('./download')); + app.get( + `/api/download/blob/:id${ID_REGEX}`, + auth.dlToken, + require('./download') + ); + app.post( + `/api/download/done/:id${ID_REGEX}`, + auth.dlToken, + require('./done.js') + ); + app.get(`/api/exists/:id${ID_REGEX}`, require('./exists')); + app.get(`/api/metadata/:id${ID_REGEX}`, auth.hmac, require('./metadata')); + app.get('/api/filelist/:id([\\w-]{16})', auth.fxa, filelist.get); + app.post('/api/filelist/:id([\\w-]{16})', auth.fxa, filelist.post); + // app.post('/api/upload', auth.fxa, require('./upload')); + app.post(`/api/delete/:id${ID_REGEX}`, auth.owner, require('./delete')); + app.post(`/api/password/:id${ID_REGEX}`, auth.owner, require('./password')); + app.post(`/api/params/:id${ID_REGEX}`, auth.owner, require('./params')); + app.post(`/api/info/:id${ID_REGEX}`, auth.owner, require('./info')); + app.post(`/api/report/:id${ID_REGEX}`, auth.hmac, require('./report')); + app.post('/api/metrics', require('./metrics')); app.get('/__version__', function(req, res) { + // eslint-disable-next-line node/no-missing-require res.sendFile(require.resolve('../../dist/version.json')); }); diff --git a/server/routes/info.js b/server/routes/info.js index f133c35cb..b993706d0 100644 --- a/server/routes/info.js +++ b/server/routes/info.js @@ -1,21 +1,11 @@ const storage = require('../storage'); module.exports = async function(req, res) { - const id = req.params.id; - const ownerToken = req.body.owner_token; - if (!ownerToken) { - return res.sendStatus(400); - } - try { - const meta = await storage.metadata(id); - if (meta.owner !== ownerToken) { - return res.sendStatus(400); - } - const ttl = await storage.ttl(id); + const ttl = await storage.ttl(req.params.id); return res.send({ - dlimit: +meta.dlimit, - dtotal: +meta.dl, + dlimit: +req.meta.dlimit, + dtotal: +req.meta.dl, ttl }); } catch (e) { diff --git a/server/routes/jsconfig.js b/server/routes/jsconfig.js deleted file mode 100644 index 23e073747..000000000 --- a/server/routes/jsconfig.js +++ /dev/null @@ -1,46 +0,0 @@ -const config = require('../config'); - -let sentry = ''; -if (config.sentry_id) { - //eslint-disable-next-line node/no-missing-require - const version = require('../../dist/version.json'); - sentry = ` -var RAVEN_CONFIG = { - release: '${version.version}', - tags: { - commit: '${version.commit}' - }, - dataCallback: function (data) { - var hash = window.location.hash; - if (hash) { - return JSON.parse(JSON.stringify(data).replace(new RegExp(hash.slice(1), 'g'), '')); - } - return data; - } -} -var SENTRY_ID = '${config.sentry_id}'; -`; -} - -let ga = ''; -if (config.analytics_id) { - ga = `var GOOGLE_ANALYTICS_ID = '${config.analytics_id}';`; -} - -/* eslint-disable no-useless-escape */ -const jsconfig = ` -var isIE = /trident\\\/7\.|msie/i.test(navigator.userAgent); -var isUnsupportedPage = /\\\/unsupported/.test(location.pathname); -if (isIE && !isUnsupportedPage) { - window.location.replace('/unsupported/ie'); -} -var MAXFILESIZE = ${config.max_file_size}; -var EXPIRE_SECONDS = ${config.expire_seconds}; -${ga} -${sentry} -`; - -module.exports = function(req, res) { - res.set('Content-Type', 'application/javascript'); - res.send(jsconfig); -}; diff --git a/server/routes/metadata.js b/server/routes/metadata.js index a99942d2d..ff4d130ad 100644 --- a/server/routes/metadata.js +++ b/server/routes/metadata.js @@ -1,29 +1,17 @@ const storage = require('../storage'); -const crypto = require('crypto'); module.exports = async function(req, res) { const id = req.params.id; - + const meta = req.meta; try { - const auth = req.header('Authorization').split(' ')[1]; - const meta = await storage.metadata(id); - const hmac = crypto.createHmac('sha256', Buffer.from(meta.auth, 'base64')); - hmac.update(Buffer.from(meta.nonce, 'base64')); - const verifyHash = hmac.digest(); - if (!verifyHash.equals(Buffer.from(auth, 'base64'))) { - res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); - return res.sendStatus(401); + if (meta.dead && !meta.flagged) { + return res.sendStatus(404); } - const nonce = crypto.randomBytes(16).toString('base64'); - storage.setField(id, 'nonce', nonce); - res.set('WWW-Authenticate', `send-v1 ${nonce}`); - - const size = await storage.length(id); const ttl = await storage.ttl(id); res.send({ metadata: meta.metadata, - finalDownload: +meta.dl + 1 === +meta.dlimit, - size, + flagged: !!meta.flagged, + finalDownload: meta.dlToken + 1 === meta.dlimit, ttl }); } catch (e) { diff --git a/server/routes/metrics.js b/server/routes/metrics.js new file mode 100644 index 000000000..0f6f64aae --- /dev/null +++ b/server/routes/metrics.js @@ -0,0 +1,24 @@ +const { sendBatch, clientEvent } = require('../amplitude'); + +module.exports = async function(req, res) { + try { + const data = JSON.parse(req.body); // see http://crbug.com/490015 + const deltaT = Date.now() - data.now; + const events = data.events.map(e => + clientEvent( + e, + req.ua, + data.lang, + data.session_id + deltaT, + deltaT, + data.platform, + req.geo.country, + req.geo.state + ) + ); + const status = await sendBatch(events); + res.sendStatus(status); + } catch (e) { + res.sendStatus(500); + } +}; diff --git a/server/routes/pages.js b/server/routes/pages.js index 74f633f18..fda62da00 100644 --- a/server/routes/pages.js +++ b/server/routes/pages.js @@ -9,26 +9,31 @@ function stripEvents(str) { } module.exports = { - index: function(req, res) { - res.send(stripEvents(routes.toString('/', state(req)))); + index: async function(req, res) { + const appState = await state(req); + res.send(stripEvents(routes().toString('/blank', appState))); }, - blank: function(req, res) { - res.send(stripEvents(routes.toString('/blank', state(req)))); + blank: async function(req, res) { + const appState = await state(req); + res.send(stripEvents(routes().toString('/blank', appState))); }, download: async function(req, res, next) { const id = req.params.id; - + const appState = await state(req); try { - const { nonce, pwd } = await storage.metadata(id); + const { nonce, pwd, dead, flagged } = await storage.metadata(id); + if (dead && !flagged) { + return next(); + } res.set('WWW-Authenticate', `send-v1 ${nonce}`); res.send( stripEvents( - routes.toString( - `/download/${req.params.id}`, - Object.assign(state(req), { - fileInfo: { nonce, requiresPassword: +pwd } + routes().toString( + `/download/${id}`, + Object.assign(appState, { + downloadMetadata: { nonce, pwd, flagged } }) ) ) @@ -38,22 +43,26 @@ module.exports = { } }, - unsupported: function(req, res) { + unsupported: async function(req, res) { + const appState = await state(req); res.send( stripEvents( - routes.toString( - `/unsupported/${req.params.reason}`, - Object.assign(state(req), { fira: true }) - ) + routes().toString(`/unsupported/${req.params.reason}`, appState) ) ); }, - legal: function(req, res) { - res.send(stripEvents(routes.toString('/legal', state(req)))); - }, - - notfound: function(req, res) { - res.status(404).send(stripEvents(routes.toString('/404', state(req)))); + notfound: async function(req, res) { + const appState = await state(req); + res + .status(404) + .send( + stripEvents( + routes().toString( + '/404', + Object.assign(appState, { downloadMetadata: { status: 404 } }) + ) + ) + ); } }; diff --git a/server/routes/params.js b/server/routes/params.js index 90219d933..ac9118867 100644 --- a/server/routes/params.js +++ b/server/routes/params.js @@ -1,23 +1,15 @@ +const config = require('../config'); const storage = require('../storage'); -module.exports = async function(req, res) { - const id = req.params.id; - const ownerToken = req.body.owner_token; - if (!ownerToken) { - return res.sendStatus(400); - } - +module.exports = function(req, res) { + const max = req.meta.fxa ? config.max_downloads : config.anon_max_downloads; const dlimit = req.body.dlimit; - if (!dlimit || dlimit > 20) { + if (!dlimit || dlimit > max) { return res.sendStatus(400); } try { - const meta = await storage.metadata(id); - if (meta.owner !== ownerToken) { - return res.sendStatus(400); - } - storage.setField(id, 'dlimit', dlimit); + storage.setField(req.params.id, 'dlimit', dlimit); res.sendStatus(200); } catch (e) { res.sendStatus(404); diff --git a/server/routes/password.js b/server/routes/password.js index 2be6fe9ab..7662b6dd8 100644 --- a/server/routes/password.js +++ b/server/routes/password.js @@ -1,21 +1,13 @@ const storage = require('../storage'); -module.exports = async function(req, res) { +module.exports = function(req, res) { const id = req.params.id; - const ownerToken = req.body.owner_token; - if (!ownerToken) { - return res.sendStatus(404); - } const auth = req.body.auth; if (!auth) { return res.sendStatus(400); } try { - const meta = await storage.metadata(id); - if (meta.owner !== ownerToken) { - return res.sendStatus(404); - } storage.setField(id, 'auth', auth); storage.setField(id, 'pwd', 1); res.sendStatus(200); diff --git a/server/routes/report.js b/server/routes/report.js new file mode 100644 index 000000000..5598e926b --- /dev/null +++ b/server/routes/report.js @@ -0,0 +1,24 @@ +const storage = require('../storage'); +const { statReportEvent } = require('../amplitude'); + +module.exports = async function(req, res) { + try { + const id = req.params.id; + const meta = await storage.metadata(id); + storage.flag(id); + statReportEvent({ + id, + ip: req.ip, + country: req.geo.country, + state: req.geo.state, + owner: meta.owner, + reason: req.body.reason, + download_limit: meta.dlimit, + download_count: meta.dl, + agent: req.ua.browser.name || req.ua.ua.substring(0, 6) + }); + res.sendStatus(200); + } catch (e) { + res.sendStatus(404); + } +}; diff --git a/server/routes/token.js b/server/routes/token.js new file mode 100644 index 000000000..3ec5cf9b7 --- /dev/null +++ b/server/routes/token.js @@ -0,0 +1,17 @@ +module.exports = async function(req, res) { + const meta = req.meta; + try { + if (meta.dead || meta.flagged) { + return res.sendStatus(404); + } + const token = await meta.getDownloadToken(); + res.send({ + token + }); + } catch (e) { + if (e.message === 'limit') { + return res.sendStatus(403); + } + res.sendStatus(404); + } +}; diff --git a/server/routes/upload.js b/server/routes/upload.js index 6dac96aea..7f16410a8 100644 --- a/server/routes/upload.js +++ b/server/routes/upload.js @@ -2,11 +2,13 @@ const crypto = require('crypto'); const storage = require('../storage'); const config = require('../config'); const mozlog = require('../log'); +const Limiter = require('../limiter'); +const { encryptedSize } = require('../../app/utils'); const log = mozlog('send.upload'); -module.exports = function(req, res) { - const newId = crypto.randomBytes(5).toString('hex'); +module.exports = async function(req, res) { + const newId = crypto.randomBytes(8).toString('hex'); const metadata = req.header('X-File-Metadata'); const auth = req.header('Authorization'); if (!metadata || !auth) { @@ -14,42 +16,31 @@ module.exports = function(req, res) { } const owner = crypto.randomBytes(10).toString('hex'); const meta = { - dlimit: 1, - dl: 0, owner, - delete: owner, // delete is deprecated metadata, - pwd: 0, auth: auth.split(' ')[1], nonce: crypto.randomBytes(16).toString('base64') }; - req.pipe(req.busboy); - req.busboy.on('file', async (fieldname, file) => { - try { - await storage.set(newId, file, meta); - const protocol = config.env === 'production' ? 'https' : req.protocol; - const url = `${protocol}://${req.get('host')}/download/${newId}/`; - res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); - res.json({ - url, - owner: meta.owner, - id: newId - }); - } catch (e) { - log.error('upload', e); - if (e.message === 'limit') { - return res.sendStatus(413); - } - res.sendStatus(500); + try { + const limiter = new Limiter(encryptedSize(config.max_file_size)); + const fileStream = req.pipe(limiter); + //this hasn't been updated to expiration time setting yet + //if you want to fallback to this code add this + await storage.set(newId, fileStream, meta, config.default_expire_seconds); + const protocol = config.env === 'production' ? 'https' : req.protocol; + const url = `${protocol}://${req.get('host')}/download/${newId}/`; + res.set('WWW-Authenticate', `send-v1 ${meta.nonce}`); + res.json({ + url, + owner: meta.owner, + id: newId + }); + } catch (e) { + if (e.message === 'limit') { + return res.sendStatus(413); } - }); - - req.on('close', async err => { - try { - await storage.forceDelete(newId); - } catch (e) { - log.info('DeleteError:', newId); - } - }); + log.error('upload', e); + res.sendStatus(500); + } }; diff --git a/server/routes/webmanifest.js b/server/routes/webmanifest.js new file mode 100644 index 000000000..276ddd24f --- /dev/null +++ b/server/routes/webmanifest.js @@ -0,0 +1,28 @@ +const assets = require('../../common/assets'); + +module.exports = function(req, res) { + const manifest = { + name: 'Firefox Send', + short_name: 'Send', + lang: req.language, + icons: [ + { + src: assets.get('android-chrome-192x192.png'), + type: 'image/png', + sizes: '192x192' + }, + { + src: assets.get('android-chrome-512x512.png'), + type: 'image/png', + sizes: '512x512' + } + ], + start_url: '/', + display: 'standalone', + orientation: 'portrait', + theme_color: '#220033', + background_color: 'white' + }; + res.set('Content-Type', 'application/manifest+json'); + res.json(manifest); +}; diff --git a/server/routes/ws.js b/server/routes/ws.js new file mode 100644 index 000000000..dfd9d4d29 --- /dev/null +++ b/server/routes/ws.js @@ -0,0 +1,137 @@ +const crypto = require('crypto'); +const storage = require('../storage'); +const config = require('../config'); +const mozlog = require('../log'); +const Limiter = require('../limiter'); +const fxa = require('../fxa'); +const { statUploadEvent } = require('../amplitude'); +const { encryptedSize } = require('../../app/utils'); + +const { Transform } = require('stream'); + +const log = mozlog('send.upload'); + +module.exports = function(ws, req) { + let fileStream; + + ws.on('close', e => { + if (e !== 1000 && fileStream !== undefined) { + fileStream.destroy(); + } + }); + + ws.once('message', async function(message) { + try { + const newId = crypto.randomBytes(8).toString('hex'); + const owner = crypto.randomBytes(10).toString('hex'); + + const fileInfo = JSON.parse(message); + const timeLimit = fileInfo.timeLimit || config.default_expire_seconds; + const dlimit = fileInfo.dlimit || 1; + const metadata = fileInfo.fileMetadata; + const auth = fileInfo.authorization; + const user = await fxa.verify(fileInfo.bearer); + const maxFileSize = user + ? config.max_file_size + : config.anon_max_file_size; + const maxExpireSeconds = user + ? config.max_expire_seconds + : config.anon_max_expire_seconds; + const maxDownloads = user + ? config.max_downloads + : config.anon_max_downloads; + + if (config.fxa_required && !user) { + ws.send( + JSON.stringify({ + error: 401 + }) + ); + return ws.close(); + } + if ( + !metadata || + !auth || + timeLimit <= 0 || + timeLimit > maxExpireSeconds || + dlimit > maxDownloads + ) { + ws.send( + JSON.stringify({ + error: 400 + }) + ); + return ws.close(); + } + + const meta = { + owner, + fxa: user ? 1 : 0, + metadata, + dlimit, + auth: auth.split(' ')[1], + nonce: crypto.randomBytes(16).toString('base64') + }; + + const protocol = config.env === 'production' ? 'https' : req.protocol; + const url = `${protocol}://${req.get('host')}/download/${newId}/`; + + ws.send( + JSON.stringify({ + url, + ownerToken: meta.owner, + id: newId + }) + ); + const limiter = new Limiter(encryptedSize(maxFileSize)); + const eof = new Transform({ + transform: function(chunk, encoding, callback) { + if (chunk.length === 1 && chunk[0] === 0) { + this.push(null); + } else { + this.push(chunk); + } + callback(); + } + }); + const wsStream = ws.constructor.createWebSocketStream(ws); + + fileStream = wsStream.pipe(eof).pipe(limiter); // limiter needs to be the last in the chain + + await storage.set(newId, fileStream, meta, timeLimit); + + if (ws.readyState === 1) { + // if the socket is closed by a cancelled upload the stream + // ends without an error so we need to check the state + // before sending a reply. + + // TODO: we should handle cancelled uploads differently + // in order to avoid having to check socket state and clean + // up storage, possibly with an exception that we can catch. + ws.send(JSON.stringify({ ok: true })); + statUploadEvent({ + id: newId, + ip: req.ip, + country: req.geo.country, + state: req.geo.state, + owner, + dlimit, + timeLimit, + anonymous: !user, + size: limiter.length, + agent: req.ua.browser.name || req.ua.ua.substring(0, 6) + }); + } + } catch (e) { + log.error('upload', e); + if (ws.readyState === 1) { + ws.send( + JSON.stringify({ + error: e === 'limit' ? 413 : 500 + }) + ); + } + } + ws.close(); + }); +}; diff --git a/server/state.js b/server/state.js index 152ccd602..914ffe31f 100644 --- a/server/state.js +++ b/server/state.js @@ -1,12 +1,39 @@ const config = require('./config'); const layout = require('./layout'); -const locales = require('../common/locales'); +const assets = require('../common/assets'); +const getTranslator = require('./locale'); +const { getFxaConfig } = require('./fxa'); -module.exports = function(req) { +module.exports = async function(req) { const locale = req.language || 'en-US'; + let authConfig = null; + let robots = 'none'; + if (req.route && req.route.path === '/') { + robots = 'all'; + } + if (config.fxa_client_id) { + try { + authConfig = await getFxaConfig(); + authConfig.client_id = config.fxa_client_id; + authConfig.fxa_required = config.fxa_required; + } catch (e) { + if (config.auth_required) { + throw new Error('fxa_required is set but no config was found'); + } + // continue without accounts + } + } + const prefs = {}; + if (config.survey_url) { + prefs.surveyUrl = config.survey_url; + } return { + archive: { + numFiles: 0 + }, locale, - translate: locales.getTranslator(locale), + capabilities: { account: false }, + translate: getTranslator(locale), title: 'Firefox Send', description: 'Encrypt and send files with a link that automatically expires to ensure your important documents don’t stay online forever.', @@ -15,8 +42,12 @@ module.exports = function(req) { storage: { files: [] }, - fira: false, fileInfo: {}, + cspNonce: req.cspNonce, + user: { avatar: assets.get('user.svg'), loggedIn: false }, + robots, + authConfig, + prefs, layout }; }; diff --git a/server/storage.js b/server/storage.js deleted file mode 100644 index 35ec64183..000000000 --- a/server/storage.js +++ /dev/null @@ -1,285 +0,0 @@ -const AWS = require('aws-sdk'); -const s3 = new AWS.S3(); -const mkdirp = require('mkdirp'); - -const config = require('./config'); -const fs = require('fs'); -const path = require('path'); - -const mozlog = require('./log'); - -const log = mozlog('send.storage'); - -const redis_lib = - config.env === 'development' && config.redis_host === 'localhost' - ? 'redis-mock' - : 'redis'; - -const redis = require(redis_lib); -const redis_client = redis.createClient({ - host: config.redis_host, - connect_timeout: 10000 -}); - -redis_client.on('error', err => { - log.error('Redis:', err); -}); - -const fileDir = config.file_dir; - -if (config.s3_bucket) { - module.exports = { - exists: exists, - ttl: ttl, - length: awsLength, - get: awsGet, - set: awsSet, - setField: setField, - delete: awsDelete, - forceDelete: awsForceDelete, - ping: awsPing, - flushall: flushall, - quit: quit, - metadata - }; -} else { - mkdirp.sync(config.file_dir); - log.info('fileDir', fileDir); - module.exports = { - exists: exists, - ttl: ttl, - length: localLength, - get: localGet, - set: localSet, - setField: setField, - delete: localDelete, - forceDelete: localForceDelete, - ping: localPing, - flushall: flushall, - quit: quit, - metadata - }; -} - -if (config.redis_event_expire) { - const forceDelete = config.s3_bucket ? awsForceDelete : localForceDelete; - const redis_sub = redis_client.duplicate(); - const subKey = '__keyevent@0__:expired'; - redis_sub.psubscribe(subKey, function() { - log.info('Redis:', 'subscribed to expired key events'); - }); - - redis_sub.on('pmessage', function(channel, message, id) { - log.info('RedisExpired:', id); - forceDelete(id); - }); -} - -function flushall() { - redis_client.flushdb(); -} - -function quit() { - redis_client.quit(); -} - -function metadata(id) { - return new Promise((resolve, reject) => { - redis_client.hgetall(id, (err, reply) => { - if (err || !reply) { - return reject(err); - } - resolve(reply); - }); - }); -} - -function ttl(id) { - return new Promise((resolve, reject) => { - redis_client.ttl(id, (err, reply) => { - if (err || !reply) { - return reject(err); - } - resolve(reply * 1000); - }); - }); -} - -function exists(id) { - return new Promise((resolve, reject) => { - redis_client.exists(id, (rediserr, reply) => { - if (reply === 1 && !rediserr) { - resolve(); - } else { - reject(rediserr); - } - }); - }); -} - -function setField(id, key, value) { - redis_client.hset(id, key, value); -} - -function localLength(id) { - return new Promise((resolve, reject) => { - try { - resolve(fs.statSync(path.join(fileDir, id)).size); - } catch (err) { - reject(); - } - }); -} - -function localGet(id) { - return fs.createReadStream(path.join(fileDir, id)); -} - -function localSet(newId, file, meta) { - return new Promise((resolve, reject) => { - const filepath = path.join(fileDir, newId); - const fstream = fs.createWriteStream(filepath); - file.pipe(fstream); - file.on('limit', () => { - file.unpipe(fstream); - fstream.destroy(new Error('limit')); - }); - fstream.on('finish', () => { - redis_client.hmset(newId, meta); - redis_client.expire(newId, config.expire_seconds); - log.info('localSet:', 'Upload Finished of ' + newId); - resolve(meta.owner); - }); - - fstream.on('error', err => { - log.error('localSet:', 'Failed upload of ' + newId); - fs.unlinkSync(filepath); - reject(err); - }); - }); -} - -function localDelete(id, ownerToken) { - return new Promise((resolve, reject) => { - redis_client.hget(id, 'delete', (err, reply) => { - if (!reply || ownerToken !== reply) { - reject(); - } else { - redis_client.del(id); - log.info('Deleted:', id); - resolve(fs.unlinkSync(path.join(fileDir, id))); - } - }); - }); -} - -function localForceDelete(id) { - return new Promise((resolve, reject) => { - redis_client.del(id); - resolve(fs.unlinkSync(path.join(fileDir, id))); - }); -} - -function localPing() { - return new Promise((resolve, reject) => { - redis_client.ping(err => { - return err ? reject() : resolve(); - }); - }); -} - -function awsLength(id) { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - return new Promise((resolve, reject) => { - s3.headObject(params, function(err, data) { - if (!err) { - resolve(data.ContentLength); - } else { - reject(); - } - }); - }); -} - -function awsGet(id) { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - - try { - return s3.getObject(params).createReadStream(); - } catch (err) { - return null; - } -} - -function awsSet(newId, file, meta) { - const params = { - Bucket: config.s3_bucket, - Key: newId, - Body: file - }; - let hitLimit = false; - const upload = s3.upload(params); - file.on('limit', () => { - hitLimit = true; - upload.abort(); - }); - return upload.promise().then( - () => { - redis_client.hmset(newId, meta); - redis_client.expire(newId, config.expire_seconds); - }, - err => { - if (hitLimit) { - throw new Error('limit'); - } else { - throw err; - } - } - ); -} - -function awsDelete(id, ownerToken) { - return new Promise((resolve, reject) => { - redis_client.hget(id, 'delete', (err, reply) => { - if (!reply || ownerToken !== reply) { - reject(); - } else { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - - s3.deleteObject(params, function(err, _data) { - redis_client.del(id); - err ? reject(err) : resolve(err); - }); - } - }); - }); -} - -function awsForceDelete(id) { - return new Promise((resolve, reject) => { - const params = { - Bucket: config.s3_bucket, - Key: id - }; - - s3.deleteObject(params, function(err, _data) { - redis_client.del(id); - err ? reject(err) : resolve(); - }); - }); -} - -function awsPing() { - return localPing().then(() => - s3.headBucket({ Bucket: config.s3_bucket }).promise() - ); -} diff --git a/server/storage/fs.js b/server/storage/fs.js new file mode 100644 index 000000000..8f0366a30 --- /dev/null +++ b/server/storage/fs.js @@ -0,0 +1,51 @@ +const fss = require('fs'); +const fs = fss.promises; +const path = require('path'); +const mkdirp = require('mkdirp'); + +class FSStorage { + constructor(config, log) { + this.log = log; + this.dir = config.file_dir; + mkdirp.sync(this.dir); + } + + async length(id) { + const result = await fs.stat(path.join(this.dir, id)); + return result.size; + } + + getStream(id) { + return fss.createReadStream(path.join(this.dir, id)); + } + + set(id, file) { + return new Promise((resolve, reject) => { + const filepath = path.join(this.dir, id); + const fstream = fss.createWriteStream(filepath); + file.pipe(fstream); + file.on('error', err => { + fstream.destroy(err); + }); + fstream.on('error', err => { + this.del(id); + reject(err); + }); + fstream.on('finish', resolve); + }); + } + + async del(id) { + try { + await fs.unlink(path.join(this.dir, id)); + } catch (e) { + // ignore local fs issues + } + } + + ping() { + return Promise.resolve(); + } +} + +module.exports = FSStorage; diff --git a/server/storage/gcs.js b/server/storage/gcs.js new file mode 100644 index 000000000..660585198 --- /dev/null +++ b/server/storage/gcs.js @@ -0,0 +1,42 @@ +const { Storage } = require('@google-cloud/storage'); +const storage = new Storage(); + +class GCSStorage { + constructor(config, log) { + this.bucket = storage.bucket(config.gcs_bucket); + this.log = log; + } + + async length(id) { + const data = await this.bucket.file(id).getMetadata(); + return data[0].size; + } + + getStream(id) { + return this.bucket.file(id).createReadStream({ validation: false }); + } + + set(id, file) { + return new Promise((resolve, reject) => { + file + .pipe( + this.bucket.file(id).createWriteStream({ + validation: false, + resumable: true + }) + ) + .on('error', reject) + .on('finish', resolve); + }); + } + + del(id) { + return this.bucket.file(id).delete(); + } + + ping() { + return this.bucket.exists(); + } +} + +module.exports = GCSStorage; diff --git a/server/storage/index.js b/server/storage/index.js new file mode 100644 index 000000000..2a0831e67 --- /dev/null +++ b/server/storage/index.js @@ -0,0 +1,113 @@ +const config = require('../config'); +const Metadata = require('../metadata'); +const mozlog = require('../log'); +const createRedisClient = require('./redis'); + +function getPrefix(seconds) { + return Math.max(Math.floor(seconds / 86400), 1); +} + +class DB { + constructor(config) { + let Storage = null; + if (config.s3_bucket) { + Storage = require('./s3'); + } else if (config.gcs_bucket) { + Storage = require('./gcs'); + } else { + Storage = require('./fs'); + } + this.log = mozlog('send.storage'); + + this.storage = new Storage(config, this.log); + + this.redis = createRedisClient(config); + this.redis.on('error', err => { + this.log.error('Redis:', err); + }); + } + + async ttl(id) { + const result = await this.redis.ttlAsync(id); + return Math.ceil(result) * 1000; + } + + async getPrefixedInfo(id) { + const [prefix, dead, flagged] = await this.redis.hmgetAsync( + id, + 'prefix', + 'dead', + 'flagged' + ); + return { + filePath: `${prefix}-${id}`, + flagged, + dead + }; + } + + async length(id) { + const { filePath } = await this.getPrefixedInfo(id); + return this.storage.length(filePath); + } + + async get(id) { + const info = await this.getPrefixedInfo(id); + if (info.dead || info.flagged) { + throw new Error(info.flagged ? 'flagged' : 'dead'); + } + const length = await this.storage.length(info.filePath); + return { length, stream: this.storage.getStream(info.filePath) }; + } + + async set(id, file, meta, expireSeconds = config.default_expire_seconds) { + const prefix = getPrefix(expireSeconds); + const filePath = `${prefix}-${id}`; + await this.storage.set(filePath, file); + if (meta) { + this.redis.hmset(id, { prefix, ...meta }); + } else { + this.redis.hset(id, 'prefix', prefix); + } + this.redis.expire(id, expireSeconds); + } + + setField(id, key, value) { + this.redis.hset(id, key, value); + } + + async incrementField(id, key, increment = 1) { + return await this.redis.hincrbyAsync(id, key, increment); + } + + async kill(id) { + const { filePath, dead } = await this.getPrefixedInfo(id); + if (!dead) { + this.redis.hset(id, 'dead', 1); + this.storage.del(filePath); + } + } + + async flag(id) { + await this.kill(id); + this.redis.hset(id, 'flagged', 1); + } + + async del(id) { + const { filePath } = await this.getPrefixedInfo(id); + this.redis.del(id); + this.storage.del(filePath); + } + + async ping() { + await this.redis.pingAsync(); + await this.storage.ping(); + } + + async metadata(id) { + const result = await this.redis.hgetallAsync(id); + return result && new Metadata({ id, ...result }, this); + } +} + +module.exports = new DB(config); diff --git a/server/storage/redis.js b/server/storage/redis.js new file mode 100644 index 000000000..4ab57c58e --- /dev/null +++ b/server/storage/redis.js @@ -0,0 +1,31 @@ +const promisify = require('util').promisify; + +module.exports = function(config) { + const redis_lib = + config.env === 'development' && config.redis_host === 'mock' + ? 'redis-mock' + : 'redis'; + + //eslint-disable-next-line security/detect-non-literal-require + const redis = require(redis_lib); + const client = redis.createClient({ + host: config.redis_host, + retry_strategy: options => { + if (options.total_retry_time > config.redis_retry_time) { + client.emit('error', 'Retry time exhausted'); + return new Error('Retry time exhausted'); + } + + return config.redis_retry_delay; + } + }); + + client.ttlAsync = promisify(client.ttl); + client.hgetallAsync = promisify(client.hgetall); + client.hgetAsync = promisify(client.hget); + client.hincrbyAsync = promisify(client.hincrby); + client.hmgetAsync = promisify(client.hmget); + client.pingAsync = promisify(client.ping); + client.existsAsync = promisify(client.exists); + return client; +}; diff --git a/server/storage/s3.js b/server/storage/s3.js new file mode 100644 index 000000000..b181e5486 --- /dev/null +++ b/server/storage/s3.js @@ -0,0 +1,46 @@ +const AWS = require('aws-sdk'); + +class S3Storage { + constructor(config, log) { + this.bucket = config.s3_bucket; + this.log = log; + const cfg = {}; + if (config.s3_endpoint != '') { + cfg['endpoint'] = config.s3_endpoint; + } + cfg['s3ForcePathStyle'] = config.s3_use_path_style_endpoint + AWS.config.update(cfg); + this.s3 = new AWS.S3(); + } + + async length(id) { + const result = await this.s3 + .headObject({ Bucket: this.bucket, Key: id }) + .promise(); + return Number(result.ContentLength); + } + + getStream(id) { + return this.s3.getObject({ Bucket: this.bucket, Key: id }).createReadStream(); + } + + set(id, file) { + const upload = this.s3.upload({ + Bucket: this.bucket, + Key: id, + Body: file + }); + file.on('error', () => upload.abort()); + return upload.promise(); + } + + del(id) { + return this.s3.deleteObject({ Bucket: this.bucket, Key: id }).promise(); + } + + ping() { + return this.s3.headBucket({ Bucket: this.bucket }).promise(); + } +} + +module.exports = S3Storage; diff --git a/tailwind.config.js b/tailwind.config.js new file mode 100644 index 000000000..b657c728b --- /dev/null +++ b/tailwind.config.js @@ -0,0 +1,449 @@ +const colors = { + transparent: 'transparent', + + black: '#000000', + 'grey-90': '#0c0c0d', + 'grey-80': '#2a2a2e', + 'grey-70': '#38383d', + 'grey-60': '#4a4a4f', + 'grey-50': '#737373', + grey: '#b1b1b3', + 'grey-40': '#b1b1b3', + 'grey-30': '#d7d7db', + 'grey-banner': '#f0f0f4', + 'grey-transparent': 'hsla(250, 13%, 9%, .2)', + 'grey-20': '#ededf0', + 'grey-10': '#f9f9fa', + white: '#ffffff', + + 'red-90': '#3e0200', + 'red-80': '#5a0002', + 'red-70': '#a4000f', + 'red-60': '#d70022', + red: '#d70022', + 'red-50': '#ff0039', + // unspec + 'red-40': '#ff3363', + 'red-30': '#ff99aa', + + 'orange-90': '#3e1300', + 'orange-80': '#712b00', + 'orange-70': '#a44900', + 'orange-60': '#d76e00', + 'orange-50': '#ff9400', + // unspec + 'orange-40': '#ffb24c', + 'orange-30': '#ffd399', + + 'yellow-90': '#3e2800', + 'yellow-80': '#715100', + 'yellow-70': '#a47f00', + 'yellow-60': '#d7b600', + yellow: '#d7b600', + 'yellow-50': '#ffe900', + 'yellow-40': '#ffed4c', + 'yellow-30': '#fff599', + + // 'green-darkest': '#003706', + // 'green-darker': '#006504', + // 'green-dark': '#058b00', + // green: '#12bc00', + // 'green-light': '#51d88a', + // 'green-lighter': '#a2f5bf', + // 'green-lightest': '#e3fcec', + + // 'teal-darkest': '#0d3331', + // 'teal-darker': '#20504f', + // 'teal-dark': '#38a89d', + // teal: '#4dc0b5', + // 'teal-light': '#64d5ca', + // 'teal-lighter': '#a0f0ed', + // 'teal-lightest': '#e8fffe', + + 'blue-90': '#000f40', + 'blue-80': '#002275', + 'blue-70': '#003eaa', + 'blue-60': '#0060df', + 'blue-50': '#0a84ff', + blue: '#0a84ff', + 'blue-40': '#45a1ff', + 'blue-30': '#99ccff', + 'blue-20': '#cce6ff', + + 'ink-90': '#0f1126', + 'ink-80': '#202340', + 'ink-70': '#363959', + + // 'indigo-darkest': '#191e38', + // 'indigo-darker': '#2f365f', + // 'indigo-dark': '#5661b3', + // indigo: '#6574cd', + // 'indigo-light': '#7886d7', + // 'indigo-lighter': '#b2b7ff', + // 'indigo-lightest': '#e6e8ff', + + 'purple-90': '#25003e', + 'purple-80': '#440071', + 'purple-70': '#6200a4', + 'purple-60': '#8000d7', + 'purple-50': '#9400ff', + 'purple-40': '#ad3bff', + 'purple-30': '#c069ff', + 'purple-20': '#d7a3ff', + + // 'pink-darkest': '#451225', + // 'pink-darker': '#6f213f', + // 'pink-dark': '#eb5286', + // pink: '#f66d9b', + // 'pink-light': '#fa7ea8', + // 'pink-lighter': '#ffbbca', + // 'pink-lightest': '#ffebef', + cloud: 'rgba(255, 255, 255, 0.8)', + violet: 'hsl(258, 57%, 35%)' +}; + +module.exports = { + theme: { + colors: colors, + screens: { + sm: '576px', + md: '768px', + lg: '992px', + xl: '1200px', + dark: { raw: '(prefers-color-scheme: dark)' } + }, + fontFamily: { + sans: [ + 'Inter', + 'system-ui', + 'BlinkMacSystemFont', + '-apple-system', + 'Segoe UI', + 'Roboto', + 'Oxygen', + 'Ubuntu', + 'Cantarell', + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + 'sans-serif' + ], + serif: [ + 'Constantia', + 'Lucida Bright', + 'Lucidabright', + 'Lucida Serif', + 'Lucida', + 'DejaVu Serif', + 'Bitstream Vera Serif', + 'Liberation Serif', + 'Georgia', + 'serif' + ], + mono: [ + 'Menlo', + 'Monaco', + 'Consolas', + 'Liberation Mono', + 'Courier New', + 'monospace' + ] + }, + fontSize: { + xs: '.75rem', // 12px + sm: '.875rem', // 14px + base: '1rem', // 16px + lg: '1.125rem', // 18px + xl: '1.25rem', // 20px + '2xl': '1.5rem', // 24px + '3xl': '2rem', // 32px + '4xl': '2.25rem', // 36px + '5xl': '3rem' // 48px + }, + fontWeight: { + hairline: 100, + thin: 200, + light: 300, + normal: 400, + medium: 500, + semibold: 600, + bold: 700, + extrabold: 800, + black: 900 + }, + lineHeight: { + none: 1, + tight: 1.25, + normal: 1.5, + loose: 1.75 + }, + letterSpacing: { + tight: '-0.05em', + normal: '0', + wide: '0.05em' + }, + textColor: colors, + backgroundColor: colors, + backgroundSize: { + auto: 'auto', + cover: 'cover', + contain: 'contain' + }, + borderWidth: { + default: '1px', + '0': '0', + '2': '2px', + '4': '4px', + '8': '8px' + }, + borderColor: global.Object.assign({ default: colors['grey-30'] }, colors), + borderRadius: { + none: '0', + sm: '.125rem', + default: '.25rem', + lg: '.5rem', + xl: '1rem', + full: '9999px' + }, + width: { + auto: 'auto', + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '24': '6rem', + '32': '8rem', + '48': '12rem', + '64': '16rem', + '128': '32rem', + '1/2': '50%', + '1/3': '33.33333%', + '2/3': '66.66667%', + '1/4': '25%', + '3/4': '75%', + '1/5': '20%', + '2/5': '40%', + '3/5': '60%', + '4/5': '80%', + '1/6': '16.66667%', + '5/6': '83.33333%', + full: '100%', + screen: '100vw' + }, + height: { + auto: 'auto', + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '24': '6rem', + '32': '8rem', + '48': '12rem', + '64': '16rem', + full: '100%', + screen: '100vh' + }, + flex: { + '1': '1 1 0%', + auto: '1 1 auto', + initial: '0 1 auto', + none: 'none', + half: '0 0 50%', + full: '0 0 100%' + }, + minWidth: { + '0': '0', + full: '100%' + }, + minHeight: { + '0': '0', + full: '100%', + screen: '100vh' + }, + maxWidth: { + xs: '20rem', + sm: '30rem', + md: '40rem', + lg: '50rem', + xl: '60rem', + '2xl': '70rem', + '3xl': '80rem', + '4xl': '90rem', + '5xl': '100rem', + full: '100%' + }, + maxHeight: { + full: '100%', + 'half-screen': '50vh', + screen: '100vh' + }, + padding: { + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '20': '5rem', + '24': '6rem', + '32': '8rem' + }, + margin: { + auto: 'auto', + px: '1px', + '0': '0', + '1': '0.25rem', + '2': '0.5rem', + '3': '0.75rem', + '4': '1rem', + '5': '1.25rem', + '6': '1.5rem', + '8': '2rem', + '10': '2.5rem', + '12': '3rem', + '16': '4rem', + '20': '5rem', + '24': '6rem', + '32': '8rem', + '-px': '-1px', + '-1': '-0.25rem', + '-2': '-0.5rem', + '-3': '-0.75rem', + '-4': '-1rem', + '-5': '-1.25rem', + '-6': '-1.5rem', + '-8': '-2rem', + '-10': '-2.5rem', + '-12': '-3rem', + '-16': '-4rem', + '-20': '-5rem', + '-24': '-6rem', + '-32': '-8rem' + }, + boxShadow: { + default: '0 2px 4px 0 rgba(0,0,0,0.10)', + md: '0 4px 8px 0 rgba(0,0,0,0.12), 0 2px 4px 0 rgba(0,0,0,0.08)', + lg: '0 15px 30px 0 rgba(0,0,0,0.11), 0 5px 15px 0 rgba(0,0,0,0.08)', + inner: 'inset 0 2px 4px 0 rgba(0,0,0,0.06)', + outline: '0 0 0 3px rgba(52,144,220,0.5)', + none: 'none', + cloud: '0 0 5rem 5rem white', + btn: + 'inset 0 -6px 12px 0 rgba(0,70,144,0.25), 0 4px 6px 0 rgba(34,0,51,0.04), 0 1px 10px 0 rgba(7,48,114,0.12), 0 2px 8px -1px rgba(14,13,26,0.08)' + }, + opacity: { + '0': '0', + '25': '.25', + '50': '.5', + '75': '.75', + '100': '1' + }, + fill: { + current: 'currentColor' + }, + stroke: { + current: 'currentColor' + }, + + zIndex: { + auto: 'auto', + '0': 0, + '10': 10, + '20': 20, + '30': 30, + '40': 40, + '50': 50 + } + }, + + variants: { + appearance: ['responsive'], + backgroundAttachment: ['responsive'], + backgroundColor: ['responsive', 'hover', 'focus'], + backgroundPosition: ['responsive'], + backgroundRepeat: ['responsive'], + backgroundSize: ['responsive'], + borderCollapse: [], + borderColor: ['responsive', 'hover', 'focus'], + borderRadius: ['responsive'], + borderStyle: ['responsive'], + borderWidth: ['responsive'], + cursor: ['responsive'], + display: ['responsive'], + flexDirection: ['responsive'], + flexWrap: ['responsive'], + alignItems: ['responsive'], + alignSelf: ['responsive'], + alignContent: ['responsive'], + justifyContent: ['responsive'], + flex: ['responsive'], + flexGrow: ['responsive'], + flexShrink: ['responsive'], + float: ['responsive'], + fontFamily: ['responsive'], + fontWeight: ['responsive', 'hover', 'focus'], + height: ['responsive'], + lineHeight: ['responsive'], + listStylePosition: ['responsive'], + listStyleType: ['responsive'], + margin: ['responsive'], + maxHeight: ['responsive'], + maxWidth: ['responsive'], + minHeight: ['responsive'], + minWidth: ['responsive'], + negativeMargin: ['responsive'], + opacity: ['responsive', 'hover'], + outline: ['focus'], + overflow: ['responsive'], + padding: ['responsive'], + pointerEvents: ['responsive'], + position: ['responsive'], + inset: ['responsive'], + resize: ['responsive'], + boxShadow: ['responsive', 'hover', 'focus'], + fill: [], + stroke: [], + tableLayout: ['responsive'], + textAlign: ['responsive'], + textColor: ['responsive', 'hover', 'focus'], + fontSize: ['responsive'], + fontStyle: ['responsive', 'hover', 'focus'], + fontSmoothing: ['responsive', 'hover', 'focus'], + textDecoration: ['responsive', 'hover', 'focus'], + textTransform: ['responsive', 'hover', 'focus'], + letterSpacing: ['responsive'], + userSelect: ['responsive'], + verticalAlign: ['responsive'], + visibility: ['responsive'], + whitespace: ['responsive'], + wordBreak: ['responsive'], + width: ['responsive'], + zIndex: ['responsive'] + }, + corePlugins: { + container: false + }, + plugins: [] +}; diff --git a/test/.eslintrc.yml b/test/.eslintrc.yml index dd9f4ba44..b1f66d587 100644 --- a/test/.eslintrc.yml +++ b/test/.eslintrc.yml @@ -19,5 +19,7 @@ rules: mocha/no-pending-tests: error mocha/no-return-and-callback: warn mocha/no-skipped-tests: error + mocha/no-setup-in-describe: off + mocha/no-hooks-for-single-case: off no-console: off # ¯\_(ツ)_/¯ diff --git a/test/backend/auth-tests.js b/test/backend/auth-tests.js new file mode 100644 index 000000000..cf424a8b7 --- /dev/null +++ b/test/backend/auth-tests.js @@ -0,0 +1,105 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + metadata: sinon.stub(), + setField: sinon.stub() +}; + +function request(id, auth) { + return { + params: { id }, + header: sinon.stub().returns(auth) + }; +} + +function response() { + return { + sendStatus: sinon.stub(), + set: sinon.stub() + }; +} + +const next = sinon.stub(); + +const storedMeta = { + auth: + 'r9uFxEs9GEVaQR9CJJ0uTKFGhFSOTRjOY2FCLFlCIZ0Cr-VGTVpMGlXDbNR8RMT55trMpSrzWtBVKq1LffOT2g', + nonce: 'FL4oxA7IE1PW8shwFN9qZw==' +}; + +const authMiddleware = proxyquire('../../server/middleware/auth', { + '../storage': storage +}).hmac; + +describe('Owner Middleware', function() { + afterEach(function() { + storage.metadata.reset(); + storage.setField.reset(); + next.reset(); + }); + + it('sends a 401 when no auth header is set', async function() { + const req = request('x'); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 401); + sinon.assert.notCalled(next); + }); + + it('sends a 404 when metadata is not found', async function() { + const req = request('x', 'y'); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 404); + sinon.assert.notCalled(next); + }); + + it('sends a 401 when the auth header is invalid base64', async function() { + storage.metadata.returns(Promise.resolve(storedMeta)); + const req = request('x', '1'); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 401); + sinon.assert.notCalled(next); + }); + + it('authenticates when the hashes match', async function() { + storage.metadata.returns(Promise.resolve(storedMeta)); + const req = request( + 'x', + 'send-v1 R7nZk14qJqZXtxpnAtw2uDIRQTRnO1qSO1Q0PiwcNA8' + ); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledOnce(next); + sinon.assert.calledWith(storage.setField, 'x', 'nonce', req.nonce); + sinon.assert.calledWith( + res.set, + 'WWW-Authenticate', + `send-v1 ${req.nonce}` + ); + sinon.assert.notCalled(res.sendStatus); + assert.equal(req.authorized, true); + assert.equal(req.meta, storedMeta); + assert.notEqual(req.nonce, storedMeta.nonce); + }); + + it('sends a 401 when the hashes do not match', async function() { + storage.metadata.returns(Promise.resolve(storedMeta)); + const req = request( + 'x', + 'send-v1 R8nZk14qJqZXtxpnAtw2uDIRQTRnO1qSO1Q0PiwcNA8' + ); + const res = response(); + await authMiddleware(req, res, next); + sinon.assert.calledWith(res.sendStatus, 401); + sinon.assert.calledWith( + res.set, + 'WWW-Authenticate', + `send-v1 ${storedMeta.nonce}` + ); + sinon.assert.notCalled(next); + }); +}); diff --git a/test/backend/delete-tests.js b/test/backend/delete-tests.js new file mode 100644 index 000000000..cd353d957 --- /dev/null +++ b/test/backend/delete-tests.js @@ -0,0 +1,44 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + kill: sinon.stub(), + ttl: sinon.stub() +}; + +function request(id) { + return { + params: { id } + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const delRoute = proxyquire('../../server/routes/delete', { + '../storage': storage +}); + +describe('/api/delete', function() { + afterEach(function() { + storage.kill.reset(); + }); + + it('calls storage.kill with the id parameter', async function() { + const req = request('x'); + const res = response(); + await delRoute(req, res); + sinon.assert.calledWith(storage.kill, 'x'); + sinon.assert.calledWith(res.sendStatus, 200); + }); + + it('sends a 404 on failure', async function() { + storage.kill.returns(Promise.reject(new Error())); + const res = response(); + await delRoute(request('x'), res); + sinon.assert.calledWith(res.sendStatus, 404); + }); +}); diff --git a/test/backend/info-tests.js b/test/backend/info-tests.js new file mode 100644 index 000000000..d0a562fac --- /dev/null +++ b/test/backend/info-tests.js @@ -0,0 +1,59 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + ttl: sinon.stub() +}; + +function request(id, meta) { + return { + params: { id }, + meta + }; +} + +function response() { + return { + sendStatus: sinon.stub(), + send: sinon.stub() + }; +} + +const infoRoute = proxyquire('../../server/routes/info', { + '../storage': storage +}); + +describe('/api/info', function() { + afterEach(function() { + storage.ttl.reset(); + }); + + it('calls storage.ttl with the id parameter', async function() { + const req = request('x'); + const res = response(); + await infoRoute(req, res); + sinon.assert.calledWith(storage.ttl, 'x'); + }); + + it('sends a 404 on failure', async function() { + storage.ttl.returns(Promise.reject(new Error())); + const res = response(); + await infoRoute(request('x'), res); + sinon.assert.calledWith(res.sendStatus, 404); + }); + + it('returns a json object', async function() { + storage.ttl.returns(Promise.resolve(123)); + const meta = { + dlimit: '1', + dl: '0' + }; + const res = response(); + await infoRoute(request('x', meta), res); + sinon.assert.calledWithMatch(res.send, { + dlimit: 1, + dtotal: 0, + ttl: 123 + }); + }); +}); diff --git a/test/backend/language-tests.js b/test/backend/language-tests.js new file mode 100644 index 000000000..1480d15fa --- /dev/null +++ b/test/backend/language-tests.js @@ -0,0 +1,67 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const config = { + l10n_dev: false // prod configuration +}; +const pkg = { + availableLanguages: ['en-US', 'fr', 'it', 'es-ES'] +}; + +function request(acceptLang) { + return { + headers: { + 'accept-language': acceptLang + } + }; +} + +const langMiddleware = proxyquire('../../server/middleware/language', { + '../config': config, + '../../package.json': pkg +}); + +describe('Language Middleware', function() { + it('defaults to en-US when no header is present', function() { + const req = request(); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'en-US'); + sinon.assert.calledOnce(next); + }); + + it('sets req.language to en-US when accept-language > 255 chars', function() { + const accept = Array(257).join('a'); + assert.equal(accept.length, 256); + const req = request(accept); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'en-US'); + sinon.assert.calledOnce(next); + }); + + it('defaults to en-US when no accept-language is available', function() { + const req = request('fa,cs,ja'); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'en-US'); + sinon.assert.calledOnce(next); + }); + + it('prefers higher q values', function() { + const req = request('fa;q=0.5, it;q=0.9'); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'it'); + sinon.assert.calledOnce(next); + }); + + it('uses likely subtags', function() { + const req = request('es-MX'); + const next = sinon.stub(); + langMiddleware(req, null, next); + assert.equal(req.language, 'es-ES'); + sinon.assert.calledOn(next); + }); +}); diff --git a/test/backend/metadata-tests.js b/test/backend/metadata-tests.js new file mode 100644 index 000000000..5fbf6f533 --- /dev/null +++ b/test/backend/metadata-tests.js @@ -0,0 +1,62 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + ttl: sinon.stub(), + length: sinon.stub() +}; + +function request(id, meta = {}) { + return { + params: { id }, + meta + }; +} + +function response() { + return { + sendStatus: sinon.stub(), + send: sinon.stub() + }; +} + +const metadataRoute = proxyquire('../../server/routes/metadata', { + '../storage': storage +}); + +describe('/api/metadata', function() { + afterEach(function() { + storage.ttl.reset(); + storage.length.reset(); + }); + + it('calls storage.ttl with the id parameter', async function() { + const req = request('x'); + const res = response(); + await metadataRoute(req, res); + sinon.assert.calledWith(storage.ttl, 'x'); + }); + + it('sends a 404 on failure', async function() { + storage.ttl.returns(Promise.reject(new Error())); + const res = response(); + await metadataRoute(request('x'), res); + sinon.assert.calledWith(res.sendStatus, 404); + }); + + it('returns a json object', async function() { + storage.ttl.returns(Promise.resolve(123)); + const meta = { + dlimit: 1, + dlToken: 0, + metadata: 'foo' + }; + const res = response(); + await metadataRoute(request('x', meta), res); + sinon.assert.calledWithMatch(res.send, { + metadata: 'foo', + finalDownload: true, + ttl: 123 + }); + }); +}); diff --git a/test/backend/owner-tests.js b/test/backend/owner-tests.js new file mode 100644 index 000000000..8e2ff9afc --- /dev/null +++ b/test/backend/owner-tests.js @@ -0,0 +1,81 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + metadata: sinon.stub() +}; + +function request(id, owner_token) { + return { + params: { id }, + body: { owner_token } + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const ownerMiddleware = proxyquire('../../server/middleware/auth', { + '../storage': storage +}).owner; + +describe('Owner Middleware', function() { + afterEach(function() { + storage.metadata.reset(); + }); + + it('sends a 404 when the id is not found', async function() { + const next = sinon.stub(); + storage.metadata.returns(Promise.resolve(null)); + const res = response(); + await ownerMiddleware(request('a', 'y'), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 404); + }); + + it('sends a 401 when the owner_token is missing', async function() { + const next = sinon.stub(); + const meta = { owner: 'y' }; + storage.metadata.returns(Promise.resolve(meta)); + const res = response(); + await ownerMiddleware(request('b', null), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 401); + }); + + it('sends a 401 when the owner_token does not match', async function() { + const next = sinon.stub(); + const meta = { owner: 'y' }; + storage.metadata.returns(Promise.resolve(meta)); + const res = response(); + await ownerMiddleware(request('c', 'z'), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 401); + }); + + it('sends a 401 if the metadata call fails', async function() { + const next = sinon.stub(); + storage.metadata.returns(Promise.reject(new Error())); + const res = response(); + await ownerMiddleware(request('d', 'y'), res, next); + sinon.assert.notCalled(next); + sinon.assert.calledWith(res.sendStatus, 401); + }); + + it('sets req.meta and req.authorized on successful auth', async function() { + const next = sinon.stub(); + const meta = { owner: 'y' }; + storage.metadata.returns(Promise.resolve(meta)); + const req = request('e', 'y'); + const res = response(); + await ownerMiddleware(req, res, next); + assert.equal(req.meta, meta); + assert.equal(req.authorized, true); + sinon.assert.notCalled(res.sendStatus); + sinon.assert.calledOnce(next); + }); +}); diff --git a/test/backend/params-tests.js b/test/backend/params-tests.js new file mode 100644 index 000000000..61dd14e05 --- /dev/null +++ b/test/backend/params-tests.js @@ -0,0 +1,57 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + setField: sinon.stub() +}; + +function request(id) { + return { + params: { id }, + meta: { fxa: false }, + body: {} + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const paramsRoute = proxyquire('../../server/routes/params', { + '../storage': storage +}); + +describe('/api/params', function() { + afterEach(function() { + storage.setField.reset(); + }); + + it('calls storage.setField with the correct parameter', function() { + const req = request('x'); + const dlimit = 2; + req.body.dlimit = dlimit; + const res = response(); + paramsRoute(req, res); + sinon.assert.calledWith(storage.setField, 'x', 'dlimit', dlimit); + sinon.assert.calledWith(res.sendStatus, 200); + }); + + it('sends a 400 if dlimit is too large', function() { + const req = request('x'); + const res = response(); + req.body.dlimit = 201; + paramsRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 400); + }); + + it('sends a 404 on failure', function() { + storage.setField.throws(new Error()); + const req = request('x'); + const res = response(); + req.body.dlimit = 2; + paramsRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 404); + }); +}); diff --git a/test/backend/password-tests.js b/test/backend/password-tests.js new file mode 100644 index 000000000..e52503b94 --- /dev/null +++ b/test/backend/password-tests.js @@ -0,0 +1,53 @@ +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +const storage = { + setField: sinon.stub() +}; + +function request(id, body) { + return { + params: { id }, + body + }; +} + +function response() { + return { + sendStatus: sinon.stub() + }; +} + +const passwordRoute = proxyquire('../../server/routes/password', { + '../storage': storage +}); + +describe('/api/password', function() { + afterEach(function() { + storage.setField.reset(); + }); + + it('calls storage.setField with the correct parameter', function() { + const req = request('x', { auth: 'z' }); + const res = response(); + passwordRoute(req, res); + sinon.assert.calledWith(storage.setField, 'x', 'auth', 'z'); + sinon.assert.calledWith(storage.setField, 'x', 'pwd', 1); + sinon.assert.calledWith(res.sendStatus, 200); + }); + + it('sends a 400 if auth is missing', function() { + const req = request('x', {}); + const res = response(); + passwordRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 400); + }); + + it('sends a 404 on failure', function() { + storage.setField.throws(new Error()); + const req = request('x', { auth: 'z' }); + const res = response(); + passwordRoute(req, res); + sinon.assert.calledWith(res.sendStatus, 404); + }); +}); diff --git a/test/backend/s3-tests.js b/test/backend/s3-tests.js new file mode 100644 index 000000000..9e6642fd0 --- /dev/null +++ b/test/backend/s3-tests.js @@ -0,0 +1,157 @@ +const assert = require('assert'); +const sinon = require('sinon'); +const proxyquire = require('proxyquire').noCallThru(); + +function resolvedPromise(val) { + return { + promise: () => Promise.resolve(val) + }; +} + +function rejectedPromise(err) { + return { + promise: () => Promise.reject(err) + }; +} + +const s3Stub = { + headObject: sinon.stub(), + getObject: sinon.stub(), + upload: sinon.stub(), + deleteObject: sinon.stub() +}; + +const awsStub = { + config: { + update: sinon.stub() + }, + S3: function() { + return s3Stub; + } +}; + +const S3Storage = proxyquire('../../server/storage/s3', { + 'aws-sdk': awsStub +}); + +describe('S3Storage', function() { + it('uses config.s3_bucket', function() { + const s = new S3Storage({ s3_bucket: 'foo' }); + assert.equal(s.bucket, 'foo'); + }); + + describe('length', function() { + it('returns the ContentLength', async function() { + s3Stub.headObject = sinon + .stub() + .returns(resolvedPromise({ ContentLength: 123 })); + const s = new S3Storage({ s3_bucket: 'foo' }); + const len = await s.length('x'); + assert.equal(len, 123); + sinon.assert.calledWithMatch(s3Stub.headObject, { + Bucket: 'foo', + Key: 'x' + }); + }); + + it('throws when id not found', async function() { + const err = new Error(); + s3Stub.headObject = sinon.stub().returns(rejectedPromise(err)); + const s = new S3Storage({ s3_bucket: 'foo' }); + try { + await s.length('x'); + assert.fail(); + } catch (e) { + assert.equal(e, err); + } + }); + }); + + describe('getStream', function() { + it('returns a Stream object', function() { + const stream = {}; + s3Stub.getObject = sinon + .stub() + .returns({ createReadStream: () => stream }); + const s = new S3Storage({ s3_bucket: 'foo' }); + const result = s.getStream('x'); + assert.equal(result, stream); + sinon.assert.calledWithMatch(s3Stub.getObject, { + Bucket: 'foo', + Key: 'x' + }); + }); + }); + + describe('set', function() { + it('calls s3.upload', async function() { + const file = { on: sinon.stub() }; + s3Stub.upload = sinon.stub().returns(resolvedPromise()); + const s = new S3Storage({ s3_bucket: 'foo' }); + await s.set('x', file); + sinon.assert.calledWithMatch(s3Stub.upload, { + Bucket: 'foo', + Key: 'x', + Body: file + }); + }); + + it('aborts upload if limit is hit', async function() { + const file = { + on: (ev, fn) => fn() + }; + const abort = sinon.stub(); + const err = new Error('limit'); + s3Stub.upload = sinon.stub().returns({ + promise: () => Promise.reject(err), + abort + }); + const s = new S3Storage({ s3_bucket: 'foo' }); + try { + await s.set('x', file); + assert.fail(); + } catch (e) { + assert.equal(e.message, 'limit'); + sinon.assert.calledOnce(abort); + } + }); + + it('throws when s3.upload fails', async function() { + const file = { + on: sinon.stub() + }; + const err = new Error(); + s3Stub.upload = sinon.stub().returns(rejectedPromise(err)); + const s = new S3Storage({ s3_bucket: 'foo' }); + try { + await s.set('x', file); + assert.fail(); + } catch (e) { + assert.equal(e, err); + } + }); + }); + + describe('del', function() { + it('calls s3.deleteObject', async function() { + s3Stub.deleteObject = sinon.stub().returns(resolvedPromise(true)); + const s = new S3Storage({ s3_bucket: 'foo' }); + const result = await s.del('x'); + assert.equal(result, true); + sinon.assert.calledWithMatch(s3Stub.deleteObject, { + Bucket: 'foo', + Key: 'x' + }); + }); + }); + + describe('ping', function() { + it('calls s3.headBucket', async function() { + s3Stub.headBucket = sinon.stub().returns(resolvedPromise(true)); + const s = new S3Storage({ s3_bucket: 'foo' }); + const result = await s.ping(); + assert.equal(result, true); + sinon.assert.calledWithMatch(s3Stub.headBucket, { Bucket: 'foo' }); + }); + }); +}); diff --git a/test/backend/storage-tests.js b/test/backend/storage-tests.js new file mode 100644 index 000000000..eee22cb4c --- /dev/null +++ b/test/backend/storage-tests.js @@ -0,0 +1,152 @@ +const assert = require('assert'); +const proxyquire = require('proxyquire').noCallThru(); + +const stream = {}; +class MockStorage { + length() { + return Promise.resolve(12); + } + getStream() { + return stream; + } + set() { + return Promise.resolve(); + } + del() { + return Promise.resolve(); + } + ping() { + return Promise.resolve(); + } +} + +const config = { + s3_bucket: 'foo', + default_expire_seconds: 20, + expire_times_seconds: [10, 20, 30], + env: 'development', + redis_host: 'mock' +}; + +const storage = proxyquire('../../server/storage', { + '../config': config, + '../log': () => {}, + './s3': MockStorage +}); + +describe('Storage', function() { + describe('ttl', function() { + it('returns milliseconds remaining', async function() { + const time = 40; + await storage.set('x', null, { foo: 'bar' }, time); + const ms = await storage.ttl('x'); + await storage.del('x'); + assert.equal(ms, time * 1000); + }); + }); + + describe('length', function() { + it('returns the file size', async function() { + const len = await storage.length('x'); + assert.equal(len, 12); + }); + }); + + describe('get', function() { + it('returns a stream', async function() { + const { stream: s } = await storage.get('x'); + assert.equal(s, stream); + }); + }); + + describe('set', function() { + it('sets expiration to expire time', async function() { + const seconds = 100; + await storage.set('x', null, { foo: 'bar' }, seconds); + const s = await storage.redis.ttlAsync('x'); + await storage.del('x'); + assert.equal(Math.ceil(s), seconds); + }); + + it('adds right prefix based on expire time', async function() { + await storage.set('x', null, { foo: 'bar' }, 300); + const { filePath: path_x } = await storage.getPrefixedInfo('x'); + assert.equal(path_x, '1-x'); + await storage.del('x'); + + await storage.set('y', null, { foo: 'bar' }, 86400); + const { filePath: path_y } = await storage.getPrefixedInfo('y'); + assert.equal(path_y, '1-y'); + await storage.del('y'); + + await storage.set('z', null, { foo: 'bar' }, 86400 * 7); + const { filePath: path_z } = await storage.getPrefixedInfo('z'); + assert.equal(path_z, '7-z'); + await storage.del('z'); + }); + + it('sets metadata', async function() { + const m = { foo: 'bar' }; + await storage.set('x', null, m); + const meta = await storage.redis.hgetallAsync('x'); + delete meta.prefix; + await storage.del('x'); + assert.deepEqual(meta, m); + }); + }); + + describe('setField', function() { + it('works', async function() { + await storage.set('x', null); + storage.setField('x', 'y', 'z'); + const z = await storage.redis.hgetAsync('x', 'y'); + assert.equal(z, 'z'); + await storage.del('x'); + }); + }); + + describe('del', function() { + it('works', async function() { + await storage.set('x', null, { foo: 'bar' }); + await storage.del('x'); + const meta = await storage.metadata('x'); + assert.equal(meta, null); + }); + }); + + describe('ping', function() { + it('works', async function() { + await storage.ping(); + }); + }); + + describe('metadata', function() { + it('returns all metadata fields', async function() { + const m = { + id: 'a1', + pwd: 0, + dl: 1, + dlimit: 1, + fxa: 1, + auth: 'foo', + metadata: 'bar', + nonce: 'baz', + owner: 'bmo' + }; + await storage.set('x', null, m); + const meta = await storage.metadata('x'); + assert.deepEqual( + { ...meta, storage: 'excluded' }, + { + ...m, + dead: false, + flagged: false, + dlToken: 0, + fxa: true, + pwd: false, + storage: 'excluded' + } + ); + }); + }); +}); diff --git a/test/frontend/.eslintrc.yml b/test/frontend/.eslintrc.yml index 07a266de9..c9dca39e5 100644 --- a/test/frontend/.eslintrc.yml +++ b/test/frontend/.eslintrc.yml @@ -1,2 +1,8 @@ env: - browser: true \ No newline at end of file + browser: true + +parserOptions: + sourceType: module + +rules: + node/no-unsupported-features: off \ No newline at end of file diff --git a/test/frontend/driver.js b/test/frontend/driver.js deleted file mode 100644 index 3e16d347c..000000000 --- a/test/frontend/driver.js +++ /dev/null @@ -1,22 +0,0 @@ -const webdriver = require('selenium-webdriver'); -const path = require('path'); -const until = webdriver.until; - -const driver = new webdriver.Builder().forBrowser('firefox').build(); - -driver.get(path.join('file:///', __dirname, '/frontend.test.html')); -driver.wait(until.titleIs('Mocha Tests')); -driver.wait(until.titleMatches(/^[0-9]$/)); - -driver.getTitle().then(title => { - driver.quit().then(() => { - if (title === '0') { - console.log('Frontend tests have passed.'); - } else { - throw new Error( - 'Frontend tests are failing. ' + - 'Please open the frontend.test.html file in a browser.' - ); - } - }); -}); diff --git a/test/frontend/frontend.bundle.js b/test/frontend/frontend.bundle.js deleted file mode 100644 index 2f0432459..000000000 --- a/test/frontend/frontend.bundle.js +++ /dev/null @@ -1,22 +0,0 @@ -class FakeFile extends Blob { - constructor(name, data, opt) { - super(data, opt); - this.name = name; - } -} - -window.Raven = { - captureException: function(err) { - console.error(err, err.stack); - } -}; - -window.FakeFile = FakeFile; -window.FileSender = require('../../app/fileSender'); -window.FileReceiver = require('../../app/fileReceiver'); -window.sinon = require('sinon'); -window.server = window.sinon.fakeServer.create(); -window.assert = require('assert'); -const utils = require('../../app/utils'); -window.b64ToArray = utils.b64ToArray; -window.arrayToB64 = utils.arrayToB64; diff --git a/test/frontend/frontend.test.html b/test/frontend/frontend.test.html deleted file mode 100644 index 757d8eb1d..000000000 --- a/test/frontend/frontend.test.html +++ /dev/null @@ -1,24 +0,0 @@ - - - - Mocha Tests - - - - - -
    - - - - - - - - \ No newline at end of file diff --git a/test/frontend/frontend.test.js b/test/frontend/frontend.test.js deleted file mode 100644 index b2241330a..000000000 --- a/test/frontend/frontend.test.js +++ /dev/null @@ -1,230 +0,0 @@ -const FileSender = window.FileSender; -const FileReceiver = window.FileReceiver; -const FakeFile = window.FakeFile; -const assert = window.assert; -const server = window.server; -const b64ToArray = window.b64ToArray; -const sinon = window.sinon; - -let file; -let encryptedIV; -let secretKey; -let originalBlob; - -describe('File Sender', function() { - before(function() { - server.respondImmediately = true; - server.respondWith('POST', '/upload', function(request) { - const reader = new FileReader(); - reader.readAsArrayBuffer(request.requestBody.get('data')); - - reader.onload = function(event) { - file = this.result; - }; - - const responseObj = JSON.parse(request.requestHeaders['X-File-Metadata']); - request.respond( - 200, - { 'Content-Type': 'application/json' }, - JSON.stringify({ - url: 'some url', - id: responseObj.id, - delete: responseObj.delete - }) - ); - }); - }); - - it('Should get a loading event emission', function() { - const file = new FakeFile('hello_world.txt', ['This is some data.']); - const fs = new FileSender(file); - let testLoading = true; - - fs.on('loading', isStillLoading => { - assert(!(!testLoading && isStillLoading)); - testLoading = isStillLoading; - }); - - return fs - .upload() - .then(info => { - assert(info); - assert(!testLoading); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); - - it('Should get a encrypting event emission', function() { - const file = new FakeFile('hello_world.txt', ['This is some data.']); - const fs = new FileSender(file); - let testEncrypting = true; - - fs.on('encrypting', isStillEncrypting => { - assert(!(!testEncrypting && isStillEncrypting)); - testEncrypting = isStillEncrypting; - }); - - return fs - .upload() - .then(info => { - assert(info); - assert(!testEncrypting); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); - - it('Should encrypt a file properly', function(done) { - const newFile = new FakeFile('hello_world.txt', ['This is some data.']); - const fs = new FileSender(newFile); - fs.upload().then(info => { - const key = info.secretKey; - secretKey = info.secretKey; - const IV = info.fileId; - encryptedIV = info.fileId; - - const readRaw = new FileReader(); - readRaw.onload = function(event) { - const rawArray = new Uint8Array(this.result); - originalBlob = rawArray; - window.crypto.subtle - .importKey( - 'jwk', - { - kty: 'oct', - k: key, - alg: 'A128GCM', - ext: true - }, - { - name: 'AES-GCM' - }, - true, - ['encrypt', 'decrypt'] - ) - .then(cryptoKey => { - window.crypto.subtle - .encrypt( - { - name: 'AES-GCM', - iv: b64ToArray(IV), - tagLength: 128 - }, - cryptoKey, - rawArray - ) - .then(encrypted => { - assert( - new Uint8Array(encrypted).toString() === - new Uint8Array(file).toString() - ); - done(); - }); - }); - }; - - readRaw.readAsArrayBuffer(newFile); - }); - }); -}); - -describe('File Receiver', function() { - class FakeXHR { - constructor() { - this.response = file; - this.status = 200; - } - - static setup() { - FakeXHR.prototype.open = sinon.spy(); - FakeXHR.prototype.send = function() { - this.onload(); - }; - - FakeXHR.prototype.originalXHR = window.XMLHttpRequest; - - FakeXHR.prototype.getResponseHeader = function() { - return JSON.stringify({ - filename: 'hello_world.txt', - id: encryptedIV - }); - }; - window.XMLHttpRequest = FakeXHR; - } - - static restore() { - // originalXHR is a sinon FakeXMLHttpRequest, since - // fakeServer.create() is called in frontend.bundle.js - window.XMLHttpRequest.prototype.originalXHR.restore(); - } - } - - const cb = function(done) { - if ( - file === undefined || - encryptedIV === undefined || - secretKey === undefined - ) { - assert.fail( - 'Please run file sending tests before trying to receive the files.' - ); - done(); - } - - FakeXHR.setup(); - done(); - }; - - before(cb); - - after(function() { - FakeXHR.restore(); - }); - - it('Should decrypt properly', function() { - const fr = new FileReceiver(); - location.hash = secretKey; - return fr - .download() - .then(([decrypted, name]) => { - assert(name); - assert( - new Uint8Array(decrypted).toString() === - new Uint8Array(originalBlob).toString() - ); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); - - it('Should emit decrypting events', function() { - const fr = new FileReceiver(); - location.hash = secretKey; - - let testDecrypting = true; - - fr.on('decrypting', isStillDecrypting => { - assert(!(!testDecrypting && isStillDecrypting)); - testDecrypting = isStillDecrypting; - }); - - return fr - .download() - .then(([decrypted, name]) => { - assert(decrypted); - assert(name); - assert(!testDecrypting); - }) - .catch(err => { - console.log(err, err.stack); - assert.fail(); - }); - }); -}); diff --git a/test/frontend/index.js b/test/frontend/index.js new file mode 100644 index 000000000..3e323ef22 --- /dev/null +++ b/test/frontend/index.js @@ -0,0 +1,18 @@ +const fs = require('fs'); +const path = require('path'); + +function kv(f) { + return `require('./tests/${f}')`; +} + +module.exports = function() { + const files = fs + .readdirSync(path.join(__dirname, 'tests')) + .filter(p => /\.js$/.test(p)); + const code = "require('fast-text-encoding');\n" + files.map(kv).join(';\n'); + return { + code, + dependencies: files.map(f => require.resolve('./tests/' + f)), + cacheable: true + }; +}; diff --git a/test/frontend/routes.js b/test/frontend/routes.js new file mode 100644 index 000000000..1f4a0a78a --- /dev/null +++ b/test/frontend/routes.js @@ -0,0 +1,49 @@ +const html = require('choo/html'); +const assets = require('../../common/assets'); +const initScript = require('../../server/initScript'); + +module.exports = function(app) { + app.get('/mocha.css', function(req, res) { + res.sendFile(require.resolve('mocha/mocha.css')); + }); + app.get('/mocha.js', function(req, res) { + res.sendFile(require.resolve('mocha/mocha.js')); + }); + app.get('/test', function(req, res) { + res.send( + html` + + + + + + + ${initScript({ + cspNonce: 'test', + locale: 'en-US' + })} + + + +
    + + + + `.toString() + ); + }); +}; diff --git a/test/frontend/runner.js b/test/frontend/runner.js new file mode 100644 index 000000000..07eff6f74 --- /dev/null +++ b/test/frontend/runner.js @@ -0,0 +1,70 @@ +/* eslint-disable no-undef, no-process-exit */ +const fs = require('fs'); +const path = require('path'); +const mkdirp = require('mkdirp'); +const puppeteer = require('puppeteer'); +const webpack = require('webpack'); +const config = require('../../webpack.config'); +const middleware = require('webpack-dev-middleware'); +const express = require('express'); +const devRoutes = require('../../server/bin/test'); +const app = express(); + +const wpm = middleware(webpack(config(null, { mode: 'development' })), { + logLevel: 'silent' +}); +app.use(wpm); +devRoutes(app, { middleware: wpm }); + +// eslint-disable-next-line no-unused-vars +function onConsole(msg) { + // uncomment to debug + // console.error(msg.text()); +} + +const server = app.listen(async function() { + let exitCode = -1; + const browser = await puppeteer.launch({ + args: [ + // puppeteer >= 1.10.0 crashes on Circle CI without this flag set + '--no-sandbox' + ] + }); + try { + const page = await browser.newPage(); + page.on('console', onConsole); + page.on('pageerror', console.log.bind(console)); + await page.goto(`http://127.0.0.1:${server.address().port}/test`); + await page.waitFor(() => typeof runner.testResults !== 'undefined', { + polling: 1000, + timeout: 15000 + }); + const results = await page.evaluate(() => runner.testResults); + const coverage = await page.evaluate(() => __coverage__); + if (coverage) { + const dir = path.resolve(__dirname, '../../.nyc_output'); + mkdirp.sync(dir); + fs.writeFileSync( + path.resolve(dir, 'frontend.json'), + JSON.stringify(coverage) + ); + } + const stats = results.stats; + exitCode = stats.failures; + console.log(`${stats.passes} passing (${stats.duration}ms)\n`); + if (stats.failures) { + console.log('Failures:\n'); + for (const f of results.failures) { + console.log(`${f.fullTitle}`); + console.log(` ${f.err.stack}\n`); + } + } + } catch (e) { + console.log(e); + } finally { + browser.close(); + server.close(() => { + process.exit(exitCode); + }); + } +}); diff --git a/test/frontend/tests/api-tests.js b/test/frontend/tests/api-tests.js new file mode 100644 index 000000000..0273778a1 --- /dev/null +++ b/test/frontend/tests/api-tests.js @@ -0,0 +1,62 @@ +/* global DEFAULTS */ +import assert from 'assert'; +import Archive from '../../../app/archive'; +import * as api from '../../../app/api'; +import Keychain from '../../../app/keychain'; + +const encoder = new TextEncoder(); +const plaintext = new Archive([new Blob([encoder.encode('hello world!')])]); +const metadata = { + name: 'test.txt', + type: 'text/plain' +}; + +describe('API', function() { + describe('websocket upload', function() { + it('returns file info on success', async function() { + const keychain = new Keychain(); + const enc = await keychain.encryptStream(plaintext.stream); + const meta = await keychain.encryptMetadata(metadata); + const verifierB64 = await keychain.authKeyB64(); + const p = function() {}; + const up = api.uploadWs( + enc, + meta, + verifierB64, + DEFAULTS.EXPIRE_SECONDS, + 1, + null, + p + ); + + const result = await up.result; + assert.ok(result.url); + assert.ok(result.id); + assert.ok(result.ownerToken); + }); + + it('can be cancelled', async function() { + const keychain = new Keychain(); + const enc = await keychain.encryptStream(plaintext.stream); + const meta = await keychain.encryptMetadata(metadata); + const verifierB64 = await keychain.authKeyB64(); + const p = function() {}; + const up = api.uploadWs( + enc, + meta, + verifierB64, + DEFAULTS.EXPIRE_SECONDS, + null, + p + ); + + up.cancel(); + try { + await up.result; + assert.fail('not cancelled'); + } catch (e) { + assert.equal(e.message, '0'); + } + }); + }); +}); diff --git a/test/frontend/tests/auth-tests.js b/test/frontend/tests/auth-tests.js new file mode 100644 index 000000000..2d0fef3d7 --- /dev/null +++ b/test/frontend/tests/auth-tests.js @@ -0,0 +1,45 @@ +import assert from 'assert'; +import storage from '../../../app/storage'; +import { decryptBundle, prepareScopedBundleKey } from '../../../app/fxa'; +import { b64ToArray } from '../../../app/utils'; + +const decoder = new TextDecoder(); + +describe('user auth', function() { + it('prepares ECDH keys for PKCE auth', async function() { + const empty = storage.get('scopedBundlePrivateKey'); + assert.equal(empty, undefined); + const publicKeyB64 = await prepareScopedBundleKey(storage); + const publicKey = JSON.parse(decoder.decode(b64ToArray(publicKeyB64))); + assert(!publicKey.d, 'not a public key'); + assert(publicKey.x); + assert(publicKey.y); + assert.equal(publicKey.kty, 'EC'); + assert.equal(publicKey.crv, 'P-256'); + + const privateKey = JSON.parse(storage.get('scopedBundlePrivateKey')); + storage.remove('scopedBundlePrivateKey'); + assert.equal(privateKey.kty, 'EC'); + assert.equal(privateKey.crv, 'P-256'); + assert(privateKey.d, 'not a private key'); + }); + + it('decrypts the PKCE auth bundle', async function() { + storage.set( + 'scopedBundlePrivateKey', + '{"kty":"EC","kid":"cV9_thVX9XRa-R2nVZF9rFdwrcR_eST4UZuUCx03ebI","crv":"P-256","x":"-0OOb6SPdYBz0CkQLWRu8ojDUhRe-VoKnwLEBi97KAk","y":"U3fXgj1LV7KhiO5O60niMjPpDqToh15-R6C22NnmNXY","d":"KfIQCxZrqSI6j69rAC6fEiGIYKwYv2buQG9NTcKOiGc"}' + ); + const jwks = await decryptBundle( + storage, + 'eyJlbmMiOiJBMjU2R0NNIiwiYWxnIjoiRUNESC1FUyIsImtpZCI6ImNWOV90aFZYOVhSYS1SMm5WWkY5ckZkd3JjUl9lU1Q0VVp1VUN4MDNlYkkiLCJlcGsiOnsia3R5IjoiRUMiLCJjcnYiOiJQLTI1NiIsIngiOiJqckcwajNFODNodDZJcDE1YmtuZWRUV3kwZmR1WnR0V3NtMkFybUNoQU5rIiwieSI6Ijl3SmNQUDRrQmQ5amtCbEJJcWRhclQ2NjVIQU00SndUX0FSSFc0aTN4QUUifX0..Dkf-FXtakCiPuXjW.-KfVQEntYjUe3f5OxslSQwjLFauc50RurLQHDV75sUixNTlsjTIldCZVb6WUKpQkpOdFHOUYFX9_Cvk2ENKdfcVm2eTuyomlKklHF3q5209KwJz8lDK3gOQuAlz79eDou0k_Z3JNGu-qZ8IiDhZZ9iNSgBrsq0BZwVXZ9ViSFEW-YzJBQlKmildscXhp_-Lf6-qiJJrPbZCXFD3PZmzcule3kyBOarg_fjjHLFlIpdjP1lI5wBETqdjk7iBKeO2isSQO7-8.q5EzqP6OPg9yb5BcJH2oFg' + ); + assert.deepEqual(jwks, { + 'https://identity.mozilla.com/apps/send': { + kty: 'oct', + scope: 'https://identity.mozilla.com/apps/send', + k: '5_jrbS76RzJ4EwlKSl527vqz3BDqf5DM4sNsoEK_hoA', + kid: '1414456160-n6yE-eL-ADvnsJo_huq3DA' + } + }); + }); +}); diff --git a/test/frontend/tests/crypto-tests.js b/test/frontend/tests/crypto-tests.js new file mode 100644 index 000000000..0b7f004ed --- /dev/null +++ b/test/frontend/tests/crypto-tests.js @@ -0,0 +1,122 @@ +import assert from 'assert'; +import { arrayToB64, b64ToArray } from '../../../app/utils'; + +describe('webcrypto', function() { + it('can do it', async function() { + const encoder = new TextEncoder(); + const x = b64ToArray('SPIfAlwbnncIFw3hEHYihw'); + const a = await crypto.subtle.importKey('raw', x, 'PBKDF2', false, [ + 'deriveKey' + ]); + + const ad = await crypto.subtle.deriveKey( + { + name: 'PBKDF2', + salt: encoder.encode('metadata'), + iterations: 100, + hash: 'SHA-256' + }, + a, + { + name: 'AES-GCM', + length: 128 + }, + false, + ['encrypt', 'decrypt'] + ); + + const ae = await crypto.subtle.encrypt( + { + name: 'AES-GCM', + iv: new Uint8Array(12), + tagLength: 128 + }, + ad, + encoder.encode('hello world!') + ); + + assert.equal( + arrayToB64(new Uint8Array(ae)), + 'UXQQ4yVf55TRk9AZtz5QCwFofRvh-HdWJyxSCQ' + ); + + const ah = await crypto.subtle.deriveKey( + { + name: 'PBKDF2', + salt: encoder.encode('authentication'), + iterations: 100, + hash: 'SHA-256' + }, + a, + { + name: 'HMAC', + hash: { name: 'SHA-256' } + }, + true, + ['sign'] + ); + const ahx = await crypto.subtle.exportKey('raw', ah); + assert.equal( + arrayToB64(new Uint8Array(ahx)), + 'wxXDmHgmMgrcDVD8zbDLRl2yNa8jSAQgsaeIBZ4vueygpxzaTK6ZE_6X-XHvllBly6pSuFNbSxcve0ZHhVdcEA' + ); + // const jwk = await crypto.subtle.exportKey('jwk', ah) + // console.error(jwk) + const as = await crypto.subtle.sign( + { + name: 'HMAC' + }, + ah, + encoder.encode('test') + ); + assert.equal( + arrayToB64(new Uint8Array(as)), + 'AOi4HcoCJxQ4nUYxlmHB1rlcxQBn-zVjrSHz-VW7S-I' + ); + + const b = await crypto.subtle.importKey('raw', x, 'HKDF', false, [ + 'deriveKey' + ]); + const bd = await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('encryption'), + hash: 'SHA-256' + }, + b, + { + name: 'AES-GCM', + length: 128 + }, + true, + ['encrypt', 'decrypt'] + ); + const bdx = await crypto.subtle.exportKey('raw', bd); + + assert.equal(arrayToB64(new Uint8Array(bdx)), 'g7okjWWO9yueDz16-owShQ'); + + const bh = await crypto.subtle.deriveKey( + { + name: 'HKDF', + salt: new Uint8Array(), + info: encoder.encode('authentication'), + hash: 'SHA-256' + }, + b, + { + name: 'HMAC', + hash: { name: 'SHA-256' } + }, + true, + ['sign'] + ); + + const bhx = await crypto.subtle.exportKey('raw', bh); + + assert.equal( + arrayToB64(new Uint8Array(bhx)), + 'TQOGtmQ8-ZfnWu6Iq-U1IAVBVREFuI17xqsW1shiC8eMCa-a5qeYTvoX3-5kCoCha8R59ycnPDnTz75clLBmbQ' + ); + }); +}); diff --git a/test/frontend/tests/fileSender-tests.js b/test/frontend/tests/fileSender-tests.js new file mode 100644 index 000000000..be43c8486 --- /dev/null +++ b/test/frontend/tests/fileSender-tests.js @@ -0,0 +1,19 @@ +import assert from 'assert'; +import FileSender from '../../../app/fileSender'; +import Archive from '../../../app/archive'; + +// FileSender uses a File in real life but a Blob works for testing +const blob = new Blob(['hello world!'], { type: 'text/plain' }); +blob.name = 'text.txt'; +const archive = new Archive([blob]); + +describe('FileSender', function() { + describe('upload', function() { + it('returns an OwnedFile on success', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + assert.ok(file.id); + assert.equal(file.name, archive.name); + }); + }); +}); diff --git a/test/frontend/tests/keychain-tests.js b/test/frontend/tests/keychain-tests.js new file mode 100644 index 000000000..53f896106 --- /dev/null +++ b/test/frontend/tests/keychain-tests.js @@ -0,0 +1,28 @@ +import assert from 'assert'; +import Keychain from '../../../app/keychain'; + +describe('Keychain', function() { + describe('setPassword', function() { + it('changes the authKey', async function() { + const k = new Keychain(); + const original = await k.authKeyB64(); + k.setPassword('foo', 'some://url'); + const pwd = await k.authKeyB64(); + assert.notEqual(pwd, original); + }); + }); + + describe('encrypt / decrypt metadata', function() { + it('can decrypt metadata it encrypts', async function() { + const k = new Keychain(); + const meta = { + name: 'foo', + type: 'bar/baz' + }; + const ciphertext = await k.encryptMetadata(meta); + const result = await k.decryptMetadata(ciphertext); + assert.equal(result.name, meta.name); + assert.equal(result.type, meta.type); + }); + }); +}); diff --git a/test/frontend/tests/streaming-tests.js b/test/frontend/tests/streaming-tests.js new file mode 100644 index 000000000..b2a88f451 --- /dev/null +++ b/test/frontend/tests/streaming-tests.js @@ -0,0 +1,109 @@ +const ece = require('http_ece'); + +import assert from 'assert'; +import Archive from '../../../app/archive'; +import { b64ToArray } from '../../../app/utils'; +import { blobStream, concatStream } from '../../../app/streams'; +import { decryptStream, encryptStream } from '../../../app/ece.js'; +import { encryptedSize, concat } from '../../../app/utils'; + +const rs = 36; + +const str = 'You are the dancing queen, young and sweet, only seventeen.'; +const testSalt = 'I1BsxtFttlv3u_Oo94xnmw'; +const keystr = 'yqdlZ-tYemfogSmv7Ws5PQ'; + +const buffer = Buffer.from(str); +const params = { + version: 'aes128gcm', + rs: rs, + salt: testSalt, + keyid: '', + key: keystr +}; + +const encrypted = ece.encrypt(buffer, params); +const decrypted = ece.decrypt(encrypted, params); + +describe('Streaming', function() { + describe('blobStream', function() { + it('reads the entire blob', async function() { + const len = 12345; + const chunkSize = 1024; + const blob = new Blob([new Uint8Array(len)]); + const stream = blobStream(blob, chunkSize); + const reader = stream.getReader(); + let bytes = 0; + let data = await reader.read(); + while (!data.done) { + bytes += data.value.byteLength; + assert.ok(data.value.byteLength <= chunkSize, 'chunk too big'); + data = await reader.read(); + } + assert.equal(bytes, len); + }); + }); + + describe('concatStream', function() { + it('reads all the streams', async function() { + const count = 5; + const len = 12345; + const streams = Array.from({ length: count }, () => + blobStream(new Blob([new Uint8Array(len)])) + ); + const concat = concatStream(streams); + const reader = concat.getReader(); + let bytes = 0; + let data = await reader.read(); + while (!data.done) { + bytes += data.value.byteLength; + data = await reader.read(); + } + assert.equal(bytes, len * count); + }); + }); + + //testing against http_ece's implementation + describe('ECE', function() { + const key = b64ToArray(keystr); + const salt = b64ToArray(testSalt).buffer; + + it('can encrypt', async function() { + const stream = new Archive([new Blob([str], { type: 'text/plain' })]) + .stream; + const encStream = encryptStream(stream, key, rs, salt); + const reader = encStream.getReader(); + + let result = new Uint8Array(0); + + let state = await reader.read(); + while (!state.done) { + result = concat(result, state.value); + state = await reader.read(); + } + + assert.deepEqual(result, new Uint8Array(encrypted)); + }); + + it('can decrypt', async function() { + const stream = new Archive([new Blob([encrypted])]).stream; + const decStream = decryptStream(stream, key, rs); + + const reader = decStream.getReader(); + let result = new Uint8Array(0); + + let state = await reader.read(); + while (!state.done) { + result = concat(result, state.value); + state = await reader.read(); + } + assert.deepEqual(result, new Uint8Array(decrypted)); + }); + }); + + describe('encryptedSize', function() { + it('matches the size of an encrypted buffer', function() { + assert.equal(encryptedSize(buffer.length, rs), encrypted.length); + }); + }); +}); diff --git a/test/frontend/tests/workflow-tests.js b/test/frontend/tests/workflow-tests.js new file mode 100644 index 000000000..5885c126d --- /dev/null +++ b/test/frontend/tests/workflow-tests.js @@ -0,0 +1,227 @@ +import assert from 'assert'; +import Archive from '../../../app/archive'; +import FileSender from '../../../app/fileSender'; +import FileReceiver from '../../../app/fileReceiver'; +import storage from '../../../app/storage'; + +const headless = /Headless/.test(navigator.userAgent); +// TODO: save on headless doesn't work as it used to since it now +// follows a link instead of fetch. Maybe there's a way to make it +// work? For now always set noSave. +const options = { noSave: true || !headless, stream: true, storage }; // only run the saveFile code if headless + +// FileSender uses a File in real life but a Blob works for testing +const blob = new Blob([new ArrayBuffer(1024 * 128)], { type: 'text/plain' }); +blob.name = 'test.txt'; +const archive = new Archive([blob]); +navigator.serviceWorker.register('/serviceWorker.js'); + +describe('Upload / Download flow', function() { + this.timeout(0); + it('can only download once by default', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + await fr.download(options); + + try { + await fr.download(options); + assert.fail('downloaded again'); + } catch (e) { + assert.equal(e.message, '404'); + } + }); + + it('downloads with the correct password', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + await file.setPassword('magic'); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + url: file.url, + nonce: file.keychain.nonce, + requiresPassword: true, + password: 'magic' + }); + await fr.getMetadata(); + await fr.download(options); + assert.equal(fr.state, 'complete'); + }); + + it('blocks invalid passwords from downloading', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + await file.setPassword('magic'); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + url: file.url, + nonce: file.keychain.nonce, + requiresPassword: true, + password: 'password' + }); + try { + await fr.getMetadata(); + assert.fail('got metadata with bad password'); + } catch (e) { + assert.equal(e.message, '401'); + } + try { + // We can't decrypt without IV from metadata + // but let's try to download anyway + await fr.download(options); + assert.fail('downloaded file with bad password'); + } catch (e) { + assert.equal(e.message, '401'); + } + }); + + it('retries a bad nonce', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: null, // oops + requiresPassword: false + }); + await fr.getMetadata(); + assert.equal(fr.fileInfo.name, archive.name); + }); + + it('can cancel the upload', async function() { + const fs = new FileSender(); + const up = fs.upload(archive); + fs.cancel(); // before encrypting + try { + await up; + assert.fail('not cancelled 1'); + } catch (e) { + assert.equal(e.message, '0'); + } + fs.reset(); + fs.once('encrypting', () => fs.cancel()); + try { + await fs.upload(archive); + assert.fail('not cancelled 2'); + } catch (e) { + assert.equal(e.message, '0'); + } + fs.reset(); + fs.once('progress', () => fs.cancel()); + try { + await fs.upload(archive); + assert.fail('not cancelled 3'); + } catch (e) { + assert.equal(e.message, '0'); + } + }); + + it('can cancel the download', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + fr.once('progress', () => fr.cancel()); + try { + await fr.download(options); + assert.fail('not cancelled'); + } catch (e) { + assert.equal(e.message, '0'); + } + }); + + it('can increase download count on download', async function() { + this.timeout(0); + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + await fr.download(options); + await file.updateDownloadCount(); + assert.equal(file.dtotal, 1); + }); + + it('does not increase download count when download cancelled', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + fr.once('progress', () => fr.cancel()); + + try { + await fr.download(options); + assert.fail('not cancelled'); + } catch (e) { + await file.updateDownloadCount(); + assert.equal(file.dtotal, 0); + } + }); + + it('can allow multiple downloads', async function() { + const fs = new FileSender(); + const a = new Archive([blob]); + a.dlimit = 2; + const file = await fs.upload(a); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await fr.getMetadata(); + await fr.download(options); + await file.updateDownloadCount(); + assert.equal(file.dtotal, 1); + + await fr.download(options); + await file.updateDownloadCount(); + assert.equal(file.dtotal, 2); + try { + await fr.download(options); + assert.fail('downloaded too many times'); + } catch (e) { + assert.equal(e.message, '404'); + } + }); + + it('can delete the file before download', async function() { + const fs = new FileSender(); + const file = await fs.upload(archive); + const fr = new FileReceiver({ + secretKey: file.toJSON().secretKey, + id: file.id, + nonce: file.keychain.nonce, + requiresPassword: false + }); + await file.del(); + try { + await fr.getMetadata(); + assert.fail('file still exists'); + } catch (e) { + assert.equal(e.message, '404'); + } + }); +}); diff --git a/test/integration/README.md b/test/integration/README.md new file mode 100644 index 000000000..b0aefda6f --- /dev/null +++ b/test/integration/README.md @@ -0,0 +1,66 @@ +# Integration Tests for [Firefox Send](https://send.firefox.com/). +## How to run the tests locally +### Clone the repository + +If you have cloned this project already then you can skip this, otherwise you'll +need to clone this repo using Git. If you do not know how to clone a GitHub +repository, check out this [help page][git-clone] from GitHub. + +If you think you would like to contribute to the tests by writing or maintaining +them in the future, it would be a good idea to create a fork of this repository +first, and then clone that. GitHub also has great instructions for +[forking a repository][git-fork]. + +### App Setup + +Please view the README at the root directory of the project. + +### Run the tests + +Included in the docker-compose file is an image containing Firefox Nightly. +[tox][Tox] is our test environment manager and [pytest][pytest] is the test runner. + +To run the tests, execute the commands below: +```sh +npm run build +npm run test-integration +``` + +### Adding a test + +The tests are written in Python using a POM, or Page Object Model. The plugin we use for this is called [pypom][pypom]. Please read the documentation there for good examples on how to use the Page Object Model when writing tests. + +The pytest plugin that we use for running tests has a number of advanced command line options available too. The full documentation for the plugin can be found [here][pytest-selenium]. + +### Watching a test run (within the docker container) + +The tests are run on a live version of Firefox, but they are run headless. To access the container where the tests are run to view them follow these steps: + +1. Make sure all of the containers are running: +```sh +docker-compose ps +``` +If not start them detached: +```sh +docker-compose up -d +``` + +2. Open your favorite VNC viewer and type in `localhost:5900`. +3. The password is ```secret```. +4. The viewer should open a window with a Ubuntu logo. If that happens you are connected to the ```selenium-firefox``` image and if you start the test, you should see a Firefox window open and the tests running. + +### Debugging a failure + +Whether a test passes or fails will result in a HTML report being created. This report will have detailed information of the test run and if a test does fail, it will provide geckodriver logs, terminal logs, as well as a screenshot of the browser when the test failed. We use a pytest plugin called [pytest-html][pytest-html] to create this report. The report can be found at ```coverage/send-test.html```. It should be viewed within a browser. + +[flake8]: http://flake8.pycqa.org/en/latest/ +[git-clone]: https://help.github.com/articles/cloning-a-repository/ +[git-fork]: https://help.github.com/articles/fork-a-repo/ +[geckodriver]: https://github.com/mozilla/geckodriver/releases/tag/v0.19.1 +[pypom]: http://pypom.readthedocs.io/en/latest/ +[pytest]: https://docs.pytest.org/en/latest/ +[pytest-html]: https://github.com/pytest-dev/pytest-html +[pytest-selenium]: http://pytest-selenium.readthedocs.org/ +[Selenium]: http://selenium-python.readthedocs.io/index.html +[selenium-api]: http://selenium-python.readthedocs.io/locating-elements.html +[Tox]: http://tox.readthedocs.io/ diff --git a/test/integration/download-tests.js b/test/integration/download-tests.js new file mode 100644 index 000000000..21005ecec --- /dev/null +++ b/test/integration/download-tests.js @@ -0,0 +1,110 @@ +/* global browser */ +const assert = require('assert'); +const fs = require('fs'); +const path = require('path'); + +const DownloadPage = require('./pages/desktop/download_page'); +const HomePage = require('./pages/desktop/home_page'); + +describe('Firefox Send', function() { + const homePage = new HomePage(); + const downloadDir = + browser.desiredCapabilities['moz:firefoxOptions']['prefs'][ + 'browser.download.dir' + ]; + const testFilesPath = path.join(__dirname, 'fixtures'); + const testFiles = fs.readdirSync(testFilesPath); + + beforeEach(function() { + homePage.open(); + }); + + testFiles.forEach(file => { + it(`should upload and download files, file: ${file}`, function() { + browser.chooseFile(homePage.uploadInput, `${testFilesPath}/${file}`); + browser.waitForExist(homePage.uploadButton); + browser.click(homePage.uploadButton); + browser.waitForExist(homePage.shareUrl); + const downloadPage = new DownloadPage( + browser.getValue(homePage.shareUrl) + ); + downloadPage.open(); + downloadPage.download(); + browser.waitForExist(downloadPage.downloadComplete); + assert.ok(fs.existsSync(path.join(downloadDir, file))); + }); + }); + + it('should update the download count on home page after 1 download', function() { + browser.chooseFile( + homePage.uploadInput, + `${testFilesPath}/${testFiles[0]}` + ); + browser.waitForExist(homePage.uploadButton); + browser.waitForExist(homePage.downloadCountSelect); + browser.selectByIndex(homePage.downloadCountSelect, 1); + browser.click(homePage.uploadButton); + browser.waitForExist(homePage.shareUrl); + const downloadPage = new DownloadPage(browser.getValue(homePage.shareUrl)); + downloadPage.open(); + downloadPage.download(); + browser.waitForExist(downloadPage.downloadComplete); + browser.back(); + browser.waitForExist('send-archive'); + assert( + browser + .getText('send-archive > div:first-of-type') + .includes('Expires after 1 download') + ); + }); + + it('should ensure that the downloaded file size matches the uploaded file size', function() { + browser.chooseFile( + homePage.uploadInput, + `${testFilesPath}/${testFiles[0]}` + ); + // get the file size for upload + const uploadSize = fs.statSync(`${testFilesPath}/${testFiles[0]}`).size; + + browser.waitForExist(homePage.uploadButton); + browser.click(homePage.uploadButton); + + browser.waitForExist(homePage.shareUrl); + const downloadPage = new DownloadPage(browser.getValue(homePage.shareUrl)); + downloadPage.open(); + downloadPage.download(); + browser.waitForExist(downloadPage.downloadComplete); + + // get the file size for download + const downloadFile = path.join(downloadDir, `${testFiles[0]}`); + const downloadSize = fs.statSync(downloadFile).size; + + // check if upload and download file sizes are equal + assert.equal(uploadSize, downloadSize); + }); + + it(`should upload and download file with added tracking parameter`, function() { + const trackingUrl = + '?fbclid=IaMFak3Tr4ck1ng1d_SDlP0shBk8SM2EN3cCLFKpHVl-k-Pvv0sf9Zy0tnTu9srqVY'; + const password = 'strongpassword'; + + browser.chooseFile( + homePage.uploadInput, + `${testFilesPath}/${testFiles[0]}` + ); + browser.waitForExist(homePage.addPassword); + browser.click(homePage.addPassword); + browser.waitForExist(homePage.passwordInput); + browser.setValue(homePage.passwordInput, password); + browser.click(homePage.uploadButton); + browser.waitForExist(homePage.shareUrl); + const shareUrl = browser.getValue(homePage.shareUrl); + const downloadPage = new DownloadPage( + shareUrl.replace('#', `${trackingUrl}#`) + ); + downloadPage.open(); + downloadPage.downloadUsingPassword(password); + browser.waitForExist(downloadPage.downloadComplete); + assert.ok(fs.existsSync(path.join(downloadDir, testFiles[0]))); + }); +}); diff --git a/test/integration/fixtures/txt-larger-testfile.txt b/test/integration/fixtures/txt-larger-testfile.txt new file mode 100644 index 000000000..2bf600de3 --- /dev/null +++ b/test/integration/fixtures/txt-larger-testfile.txt @@ -0,0 +1 @@ +THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST!THIS IS A TEST! diff --git a/test/integration/fixtures/txt-small-testfile.txt b/test/integration/fixtures/txt-small-testfile.txt new file mode 100644 index 000000000..1b9ac7bdf --- /dev/null +++ b/test/integration/fixtures/txt-small-testfile.txt @@ -0,0 +1 @@ +THIS IS A TEST! diff --git a/test/integration/homepage-tests.js b/test/integration/homepage-tests.js new file mode 100644 index 000000000..8019cb729 --- /dev/null +++ b/test/integration/homepage-tests.js @@ -0,0 +1,35 @@ +/* global browser */ +const assert = require('assert'); +const HomePage = require('./pages/desktop/home_page'); + +describe('Firefox Send homepage', function() { + this.retries(2); + const homePage = new HomePage(); + const baseUrl = browser.options['baseUrl']; + const footerLinks = ['mozilla', 'cookies', 'github']; + + beforeEach(function() { + homePage.open(); + if (process.env.ANDROID) { + this.skip(); + } + }); + + it('should have the right title', function() { + assert.equal(browser.getTitle(), 'Firefox Send'); + }); + + footerLinks.forEach((link, i) => { + it(`should navigate to the correct page: ${link}`, function() { + // Click links on bottom of page + const els = browser.elements(homePage.footerLinks); + browser.elementIdClick(els.value[i].ELEMENT); + // Wait for page to load + browser.waitUntil(() => { + const url = browser.getUrl(); + return url !== baseUrl; + }); + assert.ok(browser.getUrl().includes(link)); + }); + }); +}); diff --git a/test/integration/pages/desktop/download_page.js b/test/integration/pages/desktop/download_page.js new file mode 100644 index 000000000..8bbb84587 --- /dev/null +++ b/test/integration/pages/desktop/download_page.js @@ -0,0 +1,26 @@ +/* global browser */ +const Page = require('./page'); + +class DownloadPage extends Page { + constructor(path) { + super(path); + this.fileId = /download\/(\w+)\/\??.*#/.exec(path)[1]; + this.downloadButton = '#download-btn'; + this.downloadComplete = '#download-complete'; + this.passwordInput = '#password-input'; + this.passwordButton = '#password-btn'; + } + + downloadUsingPassword(password) { + browser.waitForExist(this.passwordInput); + browser.setValue(this.passwordInput, password); + browser.click(this.passwordButton); + return browser.click(this.downloadButton); + } + + download() { + browser.waitForExist(this.downloadButton); + return browser.click(this.downloadButton); + } +} +module.exports = DownloadPage; diff --git a/test/integration/pages/desktop/home_page.js b/test/integration/pages/desktop/home_page.js new file mode 100644 index 000000000..ff613a7eb --- /dev/null +++ b/test/integration/pages/desktop/home_page.js @@ -0,0 +1,31 @@ +/* global browser document */ +const Page = require('./page'); + +class HomePage extends Page { + constructor() { + super('/'); + this.footerLinks = 'footer a'; + this.uploadInput = '#file-upload'; + this.uploadButton = '#upload-btn'; + this.progress = 'progress'; + this.shareUrl = '#share-url'; + this.downloadCountSelect = '#expire-after-dl-count-select'; + this.addPassword = '#add-password'; + this.passwordInput = '#password-input'; + this.passwordButton = '#password-btn'; + } + + waitForPageToLoad() { + super.waitForPageToLoad(); + browser.waitForExist(this.uploadInput); + this.showUploadInput(); + return this; + } + + showUploadInput() { + browser.execute(() => { + document.getElementById('file-upload').style.display = 'block'; + }); + } +} +module.exports = HomePage; diff --git a/test/integration/pages/desktop/page.js b/test/integration/pages/desktop/page.js new file mode 100644 index 000000000..bc5856cf5 --- /dev/null +++ b/test/integration/pages/desktop/page.js @@ -0,0 +1,27 @@ +/* global browser window */ +class Page { + constructor(path) { + this.path = path; + } + + open() { + browser.url(this.path); + this.waitForPageToLoad(); + } + + /** + * @function waitForPageToLoad + * @returns {Object} An object representing the page. + * @throws ElementNotFound + */ + waitForPageToLoad() { + browser.waitUntil(function() { + return browser.execute(function() { + return typeof window.app !== 'undefined'; + }); + }, 3000); + browser.pause(100); + return this; + } +} +module.exports = Page; diff --git a/test/integration/progress-tests.js b/test/integration/progress-tests.js new file mode 100644 index 000000000..593cce8b5 --- /dev/null +++ b/test/integration/progress-tests.js @@ -0,0 +1,18 @@ +/* global browser */ +const assert = require('assert'); +const HomePage = require('./pages/desktop/home_page'); + +describe('Firefox Send progress page', function() { + const homePage = new HomePage(); + beforeEach(function() { + homePage.open(); + }); + + it('should show progress when a file is uploading', function() { + browser.chooseFile(homePage.uploadInput, __filename); + browser.waitForExist(homePage.uploadButton); + browser.click(homePage.uploadButton); + + assert.ok(browser.waitForExist(homePage.progress)); + }); +}); diff --git a/test/integration/send-test.html b/test/integration/send-test.html new file mode 100644 index 000000000..1b41d52d1 --- /dev/null +++ b/test/integration/send-test.html @@ -0,0 +1,464 @@ + + + + + Test Report + + + +

    send-test.html

    +

    Report generated on 14-Jun-2018 at 14:20:27 by pytest-html v1.19.0

    +

    Environment

    + + + + + + + + + + + + + + + + + + + + + +
    Base URLhttp://localhost:1443
    DriverFirefox
    JAVA_HOME/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
    Packages{'pytest': '3.6.1', 'py': '1.5.3', 'pluggy': '0.6.0'}
    PlatformDarwin-17.5.0-x86_64-i386-64bit
    Plugins{'xdist': '1.22.2', 'variables': '1.7.1', 'selenium': '1.13.0', 'metadata': '1.7.0', 'html': '1.19.0', 'forked': '0.2', 'base-url': '1.4.1'}
    Python3.6.5
    +

    Summary

    +

    3 tests ran in 20.54 seconds.

    + 3 passed, 0 skipped, 0 failed, 0 errors, 0 expected failures, 0 unexpected passes +

    Results

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ResultTestDurationLinks
    Passedtest_download.py::test_download0.00
    +
    No log output captured.
    Passedtest_progress.py::test_progress0.00
    +
    No log output captured.
    Passedtest_upload.py::test_upload0.01
    +
    No log output captured.
    \ No newline at end of file diff --git a/test/readme.md b/test/readme.md new file mode 100644 index 000000000..4c336689b --- /dev/null +++ b/test/readme.md @@ -0,0 +1,23 @@ +# Tests + +To run all the tests use `npm test`. This will run the tests and produce a code coverage report at [coverage/index.html](../coverage/index.html). The full test suite is run as a hook on each `git push`. [Mocha](https://mochajs.org) is our preferred test runner. + +## Frontend + +Unit tests reside in `test/frontend/tests`. + +Frontend tests can be ran in the browser by running `npm start` and then browsing to http://localhost:8080/test. Doing it this way will watch for changes and rerun the suite automatically. + +You can also run them in headless Chrome by using `npm run test:frontend`. The results will be printed to the console. + +## Backend + +Unit tests reside in `test/backend` + +Backend test can be run with `npm run test:backend`. [Sinon](http://sinonjs.org/) and [proxyquire](https://github.com/thlorenz/proxyquire) are used for mocking. + +## Integration + +Integration tests include UI tests that run with Selenium. + +The preferred way to run these locally is with `npm run test-integration` which requires docker. To watch the tests connect with VNC. On mac enter `vnc://localhost:5900` in Safari and use the password `secret` to connect. For info on debugging a test see the [wdio debug docs](http://webdriver.io/api/utility/debug.html). diff --git a/test/testServer.js b/test/testServer.js new file mode 100644 index 000000000..235cd427b --- /dev/null +++ b/test/testServer.js @@ -0,0 +1,32 @@ +let server = null; + +module.exports = { + onPrepare: function() { + return new Promise(function(resolve) { + const webpack = require('webpack'); + const middleware = require('webpack-dev-middleware'); + const express = require('express'); + const expressWs = require('@dannycoates/express-ws'); + const assets = require('../common/assets'); + const routes = require('../server/routes'); + const tests = require('./frontend/routes'); + const app = express(); + const config = require('../webpack.config'); + const wpm = middleware(webpack(config(null, { mode: 'development' })), { + logLevel: 'silent' + }); + app.use(wpm); + assets.setMiddleware(wpm); + expressWs(app, null, { perMessageDeflate: false }); + routes(app); + app.ws('/api/ws', require('../server/routes/ws')); + tests(app); + wpm.waitUntilValid(() => { + server = app.listen(8000, resolve); + }); + }); + }, + onComplete: function() { + server.close(); + } +}; diff --git a/test/test_upload.txt b/test/test_upload.txt deleted file mode 100644 index 273c1a9ff..000000000 --- a/test/test_upload.txt +++ /dev/null @@ -1 +0,0 @@ -This is a test. \ No newline at end of file diff --git a/test/unit/aws.storage.test.js b/test/unit/aws.storage.test.js deleted file mode 100644 index 1505a7e72..000000000 --- a/test/unit/aws.storage.test.js +++ /dev/null @@ -1,173 +0,0 @@ -const assert = require('assert'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); -const crypto = require('crypto'); - -const redisStub = {}; -const exists = sinon.stub(); -const hget = sinon.stub(); -const hmset = sinon.stub(); -const expire = sinon.spy(); -const del = sinon.stub(); - -redisStub.createClient = function() { - return { - on: sinon.spy(), - exists: exists, - hget: hget, - hmset: hmset, - expire: expire, - del: del - }; -}; - -const fsStub = {}; -fsStub.statSync = sinon.stub(); -fsStub.createReadStream = sinon.stub(); -fsStub.createWriteStream = sinon.stub(); -fsStub.unlinkSync = sinon.stub(); - -const logStub = {}; -logStub.info = sinon.stub(); -logStub.error = sinon.stub(); - -const s3Stub = {}; -s3Stub.headObject = sinon.stub(); -s3Stub.getObject = sinon.stub(); -s3Stub.upload = sinon.stub(); -s3Stub.deleteObject = sinon.stub(); - -const awsStub = { - S3: function() { - return s3Stub; - } -}; - -const storage = proxyquire('../../server/storage', { - redis: redisStub, - 'redis-mock': redisStub, - fs: fsStub, - './log': function() { - return logStub; - }, - 'aws-sdk': awsStub, - './config': { - s3_bucket: 'test' - } -}); - -describe('Testing Length using aws', function() { - it('Filesize returns properly if id exists', function() { - s3Stub.headObject.callsArgWith(1, null, { ContentLength: 1 }); - return storage - .length('123') - .then(reply => assert.equal(reply, 1)) - .catch(err => assert.fail()); - }); - - it('Filesize fails if the id does not exist', function() { - s3Stub.headObject.callsArgWith(1, new Error(), null); - return storage - .length('123') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Get using aws', function() { - it('Should not error out when the file exists', function() { - const spy = sinon.spy(); - s3Stub.getObject.returns({ - createReadStream: spy - }); - - storage.get('123'); - assert(spy.calledOnce); - }); - - it('Should error when the file does not exist', function() { - const err = function() { - throw new Error(); - }; - const spy = sinon.spy(err); - s3Stub.getObject.returns({ - createReadStream: spy - }); - - assert.equal(storage.get('123'), null); - assert(spy.threw()); - }); -}); - -describe('Testing Set using aws', function() { - beforeEach(function() { - expire.resetHistory(); - }); - - after(function() { - crypto.randomBytes.restore(); - }); - - it('Should pass when the file is successfully uploaded', function() { - const buf = Buffer.alloc(10); - sinon.stub(crypto, 'randomBytes').returns(buf); - s3Stub.upload.returns({ promise: () => Promise.resolve() }); - return storage - .set('123', { on: sinon.stub() }, 'Filename.moz', {}) - .then(() => { - assert(expire.calledOnce); - assert(expire.calledWith('123', 86400)); - }) - .catch(err => assert.fail()); - }); - - it('Should fail if there was an error during uploading', function() { - s3Stub.upload.returns({ promise: () => Promise.reject() }); - return storage - .set('123', { on: sinon.stub() }, 'Filename.moz', 'url.com') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Delete from aws', function() { - it('Returns successfully if the id is deleted off aws', function() { - hget.callsArgWith(2, null, 'delete_token'); - s3Stub.deleteObject.callsArgWith(1, null, {}); - return storage - .delete('file_id', 'delete_token') - .then(_reply => assert(1), err => assert.fail()); - }); - - it('Delete fails if id exists locally but does not in aws', function() { - hget.callsArgWith(2, null, 'delete_token'); - s3Stub.deleteObject.callsArgWith(1, new Error(), {}); - return storage - .delete('file_id', 'delete_token') - .then(_reply => assert.fail(), err => assert(1)); - }); - - it('Delete fails if the delete token does not match', function() { - hget.callsArgWith(2, null, {}); - return storage - .delete('Filename.moz', 'delete_token') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Forced Delete from aws', function() { - it('Deletes properly if id exists', function() { - s3Stub.deleteObject.callsArgWith(1, null, {}); - return storage - .forceDelete('file_id', 'delete_token') - .then(_reply => assert(1), err => assert.fail()); - }); - - it('Deletes fails if id does not exist', function() { - s3Stub.deleteObject.callsArgWith(1, new Error(), {}); - return storage - .forceDelete('file_id') - .then(_reply => assert.fail(), err => assert(1)); - }); -}); diff --git a/test/unit/local.storage.test.js b/test/unit/local.storage.test.js deleted file mode 100644 index 495c6e8ee..000000000 --- a/test/unit/local.storage.test.js +++ /dev/null @@ -1,163 +0,0 @@ -const assert = require('assert'); -const sinon = require('sinon'); -const proxyquire = require('proxyquire'); - -const redisStub = {}; -const exists = sinon.stub(); -const hget = sinon.stub(); -const hmset = sinon.stub(); -const expire = sinon.stub(); -const del = sinon.stub(); - -redisStub.createClient = function() { - return { - on: sinon.spy(), - exists: exists, - hget: hget, - hmset: hmset, - expire: expire, - del: del - }; -}; - -const fsStub = {}; -fsStub.statSync = sinon.stub(); -fsStub.createReadStream = sinon.stub(); -fsStub.createWriteStream = sinon.stub(); -fsStub.unlinkSync = sinon.stub(); - -const logStub = {}; -logStub.info = sinon.stub(); -logStub.error = sinon.stub(); - -const storage = proxyquire('../../server/storage', { - redis: redisStub, - 'redis-mock': redisStub, - fs: fsStub, - './log': function() { - return logStub; - } -}); - -describe('Testing Exists from local filesystem', function() { - it('Exists returns true when file exists', function() { - exists.callsArgWith(1, null, 1); - return storage - .exists('test') - .then(() => assert(1)) - .catch(err => assert.fail()); - }); - - it('Exists returns false when file does not exist', function() { - exists.callsArgWith(1, null, 0); - return storage - .exists('test') - .then(() => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Length from local filesystem', function() { - it('Filesize returns properly if id exists', function() { - fsStub.statSync.returns({ size: 10 }); - return storage - .length('Filename.moz') - .then(_reply => assert(1)) - .catch(err => assert.fail()); - }); - - it('Filesize fails if the id does not exist', function() { - fsStub.statSync.returns(null); - return storage - .length('Filename.moz') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Get from local filesystem', function() { - it('Get returns properly if id exists', function() { - fsStub.createReadStream.returns(1); - if (storage.get('Filename.moz')) { - assert(1); - } else { - assert.fail(); - } - }); - - it('Get fails if the id does not exist', function() { - fsStub.createReadStream.returns(null); - if (storage.get('Filename.moz')) { - assert.fail(); - } else { - assert(1); - } - }); -}); - -describe('Testing Set to local filesystem', function() { - it('Successfully writes the file to the local filesystem', function() { - const stub = sinon.stub(); - stub.withArgs('finish', sinon.match.any).callsArgWithAsync(1); - stub.withArgs('error', sinon.match.any).returns(1); - fsStub.createWriteStream.returns({ on: stub }); - - return storage - .set('test', { pipe: sinon.stub(), on: sinon.stub() }, 'Filename.moz', {}) - .then(() => { - assert(1); - }) - .catch(err => assert.fail()); - }); - - it('Fails when the file is not properly written to the local filesystem', function() { - const stub = sinon.stub(); - stub.withArgs('error', sinon.match.any).callsArgWithAsync(1); - stub.withArgs('close', sinon.match.any).returns(1); - fsStub.createWriteStream.returns({ on: stub }); - - return storage - .set('test', { pipe: sinon.stub() }, 'Filename.moz', 'moz.la') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Delete from local filesystem', function() { - it('Deletes properly if id exists', function() { - hget.callsArgWith(2, null, '123'); - fsStub.unlinkSync.returns(1); - return storage - .delete('Filename.moz', '123') - .then(reply => assert(reply)) - .catch(err => assert.fail()); - }); - - it('Delete fails if id does not exist', function() { - hget.callsArgWith(2, null, null); - return storage - .delete('Filename.moz', '123') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); - - it('Delete fails if the delete token does not match', function() { - hget.callsArgWith(2, null, null); - return storage - .delete('Filename.moz', '123') - .then(_reply => assert.fail()) - .catch(err => assert(1)); - }); -}); - -describe('Testing Forced Delete from local filesystem', function() { - it('Deletes properly if id exists', function() { - fsStub.unlinkSync.returns(1); - return storage.forceDelete('Filename.moz').then(reply => assert(reply)); - }); - - it('Deletes fails if id does not exist, but no reject is called', function() { - fsStub.unlinkSync.returns(0); - return storage.forceDelete('Filename.moz').then(reply => assert(!reply)); - }); -}); diff --git a/test/wdio.circleci.conf.js b/test/wdio.circleci.conf.js new file mode 100644 index 000000000..64f4f4b80 --- /dev/null +++ b/test/wdio.circleci.conf.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line node/no-extraneous-require +const ip = require('ip'); +const common = require('./wdio.common.conf'); + +/*/ + +Config for running selenium from a circleci docker container against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: `http://${ip.address()}:8000`, + maxInstances: 1, + bail: 1, + services: [require('./testServer'), 'selenium-standalone'] +}); diff --git a/test/wdio.common.conf.js b/test/wdio.common.conf.js new file mode 100644 index 000000000..4138bafa3 --- /dev/null +++ b/test/wdio.common.conf.js @@ -0,0 +1,48 @@ +const path = require('path'); +const mkdirp = require('mkdirp'); +const rimraf = require('rimraf'); +const dir = path.join(__dirname, 'integration', 'downloads'); + +mkdirp.sync(dir); +rimraf.sync(`${dir}${path.sep}*`); + +exports.config = { + specs: [path.join(__dirname, './integration/**/*-tests.js')], + exclude: [], + maxInstances: 10, + capabilities: [ + { + browserName: 'firefox', + 'moz:firefoxOptions': { + log: { level: 'trace' }, + prefs: { + 'browser.download.panel.shown': false, + 'browser.helperApps.neverAsk.openFile': 'text/plain', + 'browser.helperApps.neverAsk.saveToDisk': 'text/plain', + 'browser.download.folderList': 2, + 'browser.download.dir': dir + } + } + } + ], + pageLoadStrategy: 'normal', + watch: false, + async: true, + logLevel: 'error', + coloredLogs: true, + deprecationWarnings: true, + bail: 0, + screenshotOnReject: false, + baseUrl: 'http://localhost:8000', + waitforTimeout: 20000, + connectionRetryTimeout: 90000, + connectionRetryCount: 3, + services: ['firefox-profile'], + framework: 'mocha', + reporters: ['dot', 'spec'], + mochaOpts: { + ui: 'bdd', + timeout: 30000, + retries: 1 + } +}; diff --git a/test/wdio.docker.conf.js b/test/wdio.docker.conf.js new file mode 100644 index 000000000..a3282ab01 --- /dev/null +++ b/test/wdio.docker.conf.js @@ -0,0 +1,28 @@ +// eslint-disable-next-line node/no-extraneous-require +const ip = require('ip'); +const common = require('./wdio.common.conf'); +const dir = + common.config.capabilities[0]['moz:firefoxOptions'].prefs[ + 'browser.download.dir' + ]; + +/*/ + +Config for running selenium in a new docker container against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: `http://${ip.address()}:8000`, + maxInstances: 1, + services: ['docker', require('./testServer')], + dockerOptions: { + image: 'selenium/standalone-firefox-debug', + healthCheck: 'http://localhost:4444', + options: { + p: ['4444:4444', '5900:5900'], + mount: `type=bind,source=${dir},destination=${dir},consistency=delegated`, + shmSize: '2g' + } + } +}); diff --git a/test/wdio.local.conf.js b/test/wdio.local.conf.js new file mode 100644 index 000000000..7b39c7cba --- /dev/null +++ b/test/wdio.local.conf.js @@ -0,0 +1,16 @@ +// eslint-disable-next-line node/no-extraneous-require +const ip = require('ip'); +const common = require('./wdio.common.conf'); + +/*/ + +Config for running selenium against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: `http://${ip.address()}:8000`, + maxInstances: 1, + bail: 1, + services: [require('./testServer')] +}); diff --git a/test/wdio.remote.config.js b/test/wdio.remote.config.js new file mode 100644 index 000000000..74244d51c --- /dev/null +++ b/test/wdio.remote.config.js @@ -0,0 +1,29 @@ +const common = require('./wdio.common.conf'); +const path = require('path'); + +/*/ + +Config for running saucelabs against a hosted server + +/*/ + +exports.config = Object.assign({}, common.config, { + baseUrl: process.env.TEST_SERVER || 'https://send.dev.mozaws.net', + exclude: [ + // the /test endpoint only exists on localhost + path.join(__dirname, './integration/unit-tests.js'), + // we don't have access to the fs in this context + path.join(__dirname, './integration/download-tests.js') + ], + capabilities: [ + { browserName: 'firefox' }, + { browserName: 'chrome' }, + { browserName: 'MicrosoftEdge' }, + { + browserName: 'safari' + } + ], + services: ['sauce'], + user: process.env.SAUCE_USERNAME, + key: process.env.SAUCE_ACCESS_KEY +}); diff --git a/test/wdio.saucelabs.config.js b/test/wdio.saucelabs.config.js new file mode 100644 index 000000000..7d7cbf4ec --- /dev/null +++ b/test/wdio.saucelabs.config.js @@ -0,0 +1,30 @@ +const common = require('./wdio.common.conf'); +const path = require('path'); + +/*/ + +Config for running saucelabs against localhost + +/*/ + +exports.config = Object.assign({}, common.config, { + maxInstances: 2, + exclude: [path.join(__dirname, './integration/download-tests.js')], + capabilities: [ + { browserName: 'firefox' }, + { browserName: 'chrome' }, + { browserName: 'MicrosoftEdge' }, + { + browserName: 'safari' + } + ], + services: ['sauce', require('./testServer')], + sauceConnect: true, + sauceConnectOpts: { + // uncomment to debug + // logfile: __dirname + '/sc.log', + // verbose: true + }, + user: process.env.SAUCE_USERNAME, + key: process.env.SAUCE_ACCESS_KEY +}); diff --git a/webpack.config.js b/webpack.config.js index 6feb300ba..0c7d6c1a3 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -2,136 +2,183 @@ const path = require('path'); const webpack = require('webpack'); const CopyPlugin = require('copy-webpack-plugin'); const ManifestPlugin = require('webpack-manifest-plugin'); -const IS_DEV = process.env.NODE_ENV === 'development'; +const VersionPlugin = require('./build/version_plugin'); +const AndroidIndexPlugin = require('./build/android_index_plugin'); +const ExtractTextPlugin = require('extract-text-webpack-plugin'); -const regularJSOptions = { +const webJsOptions = { babelrc: false, - presets: [['env', { modules: false }], 'stage-2'], - plugins: ['yo-yoify'] + presets: [ + [ + '@babel/preset-env', + { + bugfixes: true, + useBuiltIns: 'entry', + corejs: 3 + } + ] + ], + plugins: [ + '@babel/plugin-syntax-dynamic-import', + 'module:nanohtml', + ['@babel/plugin-proposal-class-properties', { loose: false }] + ] }; -module.exports = { +const serviceWorker = { + target: 'webworker', entry: { - vendor: ['babel-polyfill', 'fluent'], - app: ['./app/main.js'] + serviceWorker: './app/serviceWorker.js' }, output: { - filename: '[name].[chunkhash:8].js', + filename: '[name].js', path: path.resolve(__dirname, 'dist'), publicPath: '/' }, - devtool: IS_DEV && 'inline-source-map', + devtool: 'source-map', module: { rules: [ { - test: /\.js$/, - oneOf: [ - { - include: require.resolve('./assets/cryptofill'), - use: [ - { - loader: 'file-loader', - options: { - name: '[name].[hash:8].[ext]' - } - } - ] - }, + test: /\.(png|jpg)$/, + loader: 'file-loader', + options: { + name: '[name].[contenthash:8].[ext]' + } + }, + { + test: /\.svg$/, + use: [ { - include: require.resolve('./app/templates/header'), - use: [ - { - loader: 'babel-loader', - options: regularJSOptions - }, - './build/version_loader' - ] + loader: 'file-loader', + options: { + name: '[name].[contenthash:8].[ext]' + } }, { - include: [path.dirname(require.resolve('fluent'))], - use: [ - { - loader: 'expose-loader', - options: 'fluent' - }, - { - loader: 'babel-loader', - options: { - presets: [['env', { modules: false }]] - } - } - ] - }, + loader: 'svgo-loader', + options: { + plugins: [ + { removeViewBox: false }, // true causes stretched images + { convertStyleToAttrs: true }, // for CSP, no unsafe-eval + { removeTitle: true } // for smallness + ] + } + } + ] + }, + { + // loads all assets from assets/ for use by common/assets.js + test: require.resolve('./common/generate_asset_map.js'), + use: ['babel-loader', 'val-loader'] + } + ] + }, + plugins: [new webpack.IgnorePlugin(/\.\.\/dist/)] +}; + +const web = { + target: 'web', + entry: { + app: ['./app/main.js'] + // android: ['./android/android.js'], + // ios: ['./ios/ios.js'] + }, + output: { + chunkFilename: '[name].[contenthash:8].js', + filename: '[name].[contenthash:8].js', + path: path.resolve(__dirname, 'dist') + }, + module: { + rules: [ + { + test: /\.js$/, + oneOf: [ { loader: 'babel-loader', include: [ path.resolve(__dirname, 'app'), path.resolve(__dirname, 'common'), - path.resolve(__dirname, 'node_modules/testpilot-ga/src'), - path.resolve(__dirname, 'node_modules/fluent-intl-polyfill'), + // some dependencies need to get re-babeled because we + // have different targets than their default configs + path.resolve( + __dirname, + 'node_modules/@dannycoates/webcrypto-liner' + ), + path.resolve(__dirname, 'node_modules/@fluent'), path.resolve(__dirname, 'node_modules/intl-pluralrules') ], - options: regularJSOptions + options: webJsOptions }, { + // Strip asserts from our deps, mainly choojs family include: [path.resolve(__dirname, 'node_modules')], + exclude: [ + path.resolve(__dirname, 'node_modules/crc'), + path.resolve(__dirname, 'node_modules/@fluent'), + path.resolve(__dirname, 'node_modules/@sentry'), + path.resolve(__dirname, 'node_modules/tslib'), + path.resolve(__dirname, 'node_modules/webcrypto-core') + ], loader: 'webpack-unassert-loader' } ] }, { - test: /\.(svg|png|jpg)$/, + test: /\.(png|jpg)$/, loader: 'file-loader', options: { - name: '[name].[hash:8].[ext]' + name: '[name].[contenthash:8].[ext]' } }, { - test: /\.css$/, + test: /\.svg$/, use: [ { loader: 'file-loader', options: { - name: '[name].[hash:8].[ext]' + name: '[name].[contenthash:8].[ext]' } }, - 'extract-loader', - { loader: 'css-loader', options: { importLoaders: 1 } }, - 'postcss-loader' - ] - }, - { - test: require.resolve('./package.json'), - use: [ { - loader: 'file-loader', + loader: 'svgo-loader', options: { - name: 'version.json' + plugins: [ + { cleanupIDs: false }, + { removeViewBox: false }, // true causes stretched images + { convertStyleToAttrs: true }, // for CSP, no unsafe-eval + { removeTitle: true } // for smallness + ] } - }, - 'extract-loader', - './build/package_json_loader' + } ] }, + { + // creates style.css with all styles + test: /\.css$/, + use: ExtractTextPlugin.extract({ + use: [ + { + loader: 'css-loader', + options: { + importLoaders: 1 + } + }, + 'postcss-loader' + ] + }) + }, { test: /\.ftl$/, - use: [ - { - loader: 'file-loader', - options: { - name: '[path][name].[hash:8].js' - } - }, - 'extract-loader', - './build/fluent_loader' - ] + use: 'raw-loader' }, { - test: require.resolve('./build/generate_asset_map.js'), + // creates test.js for /test + test: require.resolve('./test/frontend/index.js'), use: ['babel-loader', 'val-loader'] }, { - test: require.resolve('./build/generate_l10n_map.js'), + // loads all assets from assets/ for use by common/assets.js + test: require.resolve('./common/generate_asset_map.js'), use: ['babel-loader', 'val-loader'] } ] @@ -143,20 +190,41 @@ module.exports = { from: '*.*' } ]), - new webpack.IgnorePlugin(/dist/), - new webpack.IgnorePlugin(/require-from-string/), - new webpack.HashedModuleIdsPlugin(), - new webpack.optimize.CommonsChunkPlugin({ - name: 'vendor', - minChunks: ({ resource }) => /node_modules/.test(resource) - }), - new webpack.optimize.CommonsChunkPlugin({ - name: 'runtime' + new webpack.EnvironmentPlugin(['NODE_ENV']), + new webpack.IgnorePlugin(/\.\.\/dist/), // used in common/*.js + new ExtractTextPlugin({ + filename: '[name].[md5:contenthash:8].css' }), - new ManifestPlugin() + new VersionPlugin(), // used for the /__version__ route + new AndroidIndexPlugin(), + new ManifestPlugin() // used by server side to resolve hashed assets ], + devtool: 'source-map', devServer: { + before: + process.env.NODE_ENV === 'development' && require('./server/bin/dev'), compress: true, - before: IS_DEV ? require('./server/dev') : undefined + hot: false, + host: '0.0.0.0', + proxy: { + '/api/ws': { + target: 'ws://localhost:1338', + ws: true, + secure: false + } + } + } +}; + +module.exports = (env, argv) => { + const mode = argv.mode || 'production'; + // eslint-disable-next-line no-console + console.error(`mode: ${mode}`); + process.env.NODE_ENV = web.mode = serviceWorker.mode = mode; + if (mode === 'development') { + // istanbul instruments the source for code coverage + webJsOptions.plugins.push('istanbul'); + web.entry.tests = ['./test/frontend/index.js']; } + return [web, serviceWorker]; };